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:
-rw-r--r--CMakeLists.txt84
-rw-r--r--SConstruct53
-rw-r--r--build_files/buildbot/config/user-config-i686.py23
-rw-r--r--build_files/buildbot/config/user-config-player-i686.py9
-rw-r--r--build_files/buildbot/config/user-config-player-x86_64.py9
-rw-r--r--build_files/buildbot/config/user-config-x86_64.py23
-rw-r--r--build_files/cmake/Modules/FindOpenImageIO.cmake70
-rwxr-xr-xbuild_files/cmake/cmake_consistency_check.py9
-rwxr-xr-xbuild_files/cmake/cmake_netbeans_project.py7
-rw-r--r--build_files/cmake/config/blender_lite.cmake1
-rw-r--r--build_files/cmake/macros.cmake2
-rw-r--r--build_files/scons/config/darwin-config.py15
-rw-r--r--build_files/scons/config/linux-config.py44
-rw-r--r--build_files/scons/config/win32-mingw-config.py35
-rw-r--r--build_files/scons/config/win32-vc-config.py11
-rw-r--r--build_files/scons/config/win64-vc-config.py11
-rw-r--r--build_files/scons/tools/Blender.py45
-rw-r--r--build_files/scons/tools/btools.py22
-rw-r--r--build_files/scons/tools/mstoolkit.py488
-rw-r--r--intern/CMakeLists.txt5
-rw-r--r--intern/SConscript3
-rw-r--r--intern/audaspace/CMakeLists.txt1
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp2
-rw-r--r--intern/audaspace/intern/AUD_ConverterReader.cpp2
-rw-r--r--intern/boolop/intern/BOP_Face2Face.cpp100
-rw-r--r--intern/boolop/intern/BOP_Interface.cpp26
-rw-r--r--intern/boolop/intern/BOP_Mesh.cpp28
-rw-r--r--intern/bsp/intern/CSG_BooleanOps.cpp12
-rw-r--r--intern/container/CTR_UHeap.h4
-rw-r--r--intern/cycles/CMakeLists.txt84
-rw-r--r--intern/cycles/SConscript43
-rw-r--r--intern/cycles/app/CMakeLists.txt69
-rw-r--r--intern/cycles/app/cycles_server.cpp71
-rw-r--r--intern/cycles/app/cycles_test.cpp307
-rw-r--r--intern/cycles/app/cycles_xml.cpp942
-rw-r--r--intern/cycles/app/cycles_xml.h31
-rw-r--r--intern/cycles/blender/CMakeLists.txt47
-rw-r--r--intern/cycles/blender/addon/__init__.py90
-rw-r--r--intern/cycles/blender/addon/engine.py74
-rw-r--r--intern/cycles/blender/addon/enums.py59
-rw-r--r--intern/cycles/blender/addon/presets.py53
-rw-r--r--intern/cycles/blender/addon/properties.py201
-rw-r--r--intern/cycles/blender/addon/ui.py768
-rw-r--r--intern/cycles/blender/addon/xml.py99
-rw-r--r--intern/cycles/blender/blender_camera.cpp290
-rw-r--r--intern/cycles/blender/blender_mesh.cpp321
-rw-r--r--intern/cycles/blender/blender_object.cpp263
-rw-r--r--intern/cycles/blender/blender_python.cpp212
-rw-r--r--intern/cycles/blender/blender_session.cpp316
-rw-r--r--intern/cycles/blender/blender_session.h81
-rw-r--r--intern/cycles/blender/blender_shader.cpp702
-rw-r--r--intern/cycles/blender/blender_sync.cpp303
-rw-r--r--intern/cycles/blender/blender_sync.h119
-rw-r--r--intern/cycles/blender/blender_util.h332
-rw-r--r--intern/cycles/bvh/CMakeLists.txt28
-rw-r--r--intern/cycles/bvh/bvh.cpp701
-rw-r--r--intern/cycles/bvh/bvh.h155
-rw-r--r--intern/cycles/bvh/bvh_build.cpp549
-rw-r--r--intern/cycles/bvh/bvh_build.h152
-rw-r--r--intern/cycles/bvh/bvh_node.cpp101
-rw-r--r--intern/cycles/bvh/bvh_node.h112
-rw-r--r--intern/cycles/bvh/bvh_params.h86
-rw-r--r--intern/cycles/bvh/bvh_sort.cpp57
-rw-r--r--intern/cycles/bvh/bvh_sort.h28
-rw-r--r--intern/cycles/cmake/external_libs.cmake100
-rw-r--r--intern/cycles/device/CMakeLists.txt33
-rw-r--r--intern/cycles/device/device.cpp222
-rw-r--r--intern/cycles/device/device.h140
-rw-r--r--intern/cycles/device/device_cpu.cpp224
-rw-r--r--intern/cycles/device/device_cuda.cpp809
-rw-r--r--intern/cycles/device/device_intern.h35
-rw-r--r--intern/cycles/device/device_memory.h244
-rw-r--r--intern/cycles/device/device_multi.cpp336
-rw-r--r--intern/cycles/device/device_network.cpp391
-rw-r--r--intern/cycles/device/device_network.h308
-rw-r--r--intern/cycles/device/device_opencl.cpp648
-rw-r--r--intern/cycles/doc/CMakeLists.txt2
-rw-r--r--intern/cycles/doc/license/Apache_2.0.txt203
-rw-r--r--intern/cycles/doc/license/Blender.txt17
-rw-r--r--intern/cycles/doc/license/Boost.txt23
-rw-r--r--intern/cycles/doc/license/CMakeLists.txt13
-rw-r--r--intern/cycles/doc/license/GPL.txt342
-rw-r--r--intern/cycles/doc/license/ILM.txt29
-rw-r--r--intern/cycles/doc/license/NVidia.txt36
-rw-r--r--intern/cycles/doc/license/OSL.txt28
-rw-r--r--intern/cycles/doc/license/Sobol.txt29
-rw-r--r--intern/cycles/doc/license/readme.txt12
-rw-r--r--intern/cycles/kernel/CMakeLists.txt143
-rw-r--r--intern/cycles/kernel/kernel.cl94
-rw-r--r--intern/cycles/kernel/kernel.cpp227
-rw-r--r--intern/cycles/kernel/kernel.cu53
-rw-r--r--intern/cycles/kernel/kernel.h47
-rw-r--r--intern/cycles/kernel/kernel_bvh.h375
-rw-r--r--intern/cycles/kernel/kernel_camera.h144
-rw-r--r--intern/cycles/kernel/kernel_compat_cpu.h162
-rw-r--r--intern/cycles/kernel/kernel_compat_cuda.h64
-rw-r--r--intern/cycles/kernel/kernel_compat_opencl.h112
-rw-r--r--intern/cycles/kernel/kernel_differential.h90
-rw-r--r--intern/cycles/kernel/kernel_displace.h35
-rw-r--r--intern/cycles/kernel/kernel_emission.h139
-rw-r--r--intern/cycles/kernel/kernel_film.h64
-rw-r--r--intern/cycles/kernel/kernel_globals.h88
-rw-r--r--intern/cycles/kernel/kernel_light.h241
-rw-r--r--intern/cycles/kernel/kernel_math.h27
-rw-r--r--intern/cycles/kernel/kernel_mbvh.h394
-rw-r--r--intern/cycles/kernel/kernel_montecarlo.h209
-rw-r--r--intern/cycles/kernel/kernel_object.h68
-rw-r--r--intern/cycles/kernel/kernel_path.h421
-rw-r--r--intern/cycles/kernel/kernel_qbvh.h413
-rw-r--r--intern/cycles/kernel/kernel_random.h186
-rw-r--r--intern/cycles/kernel/kernel_shader.h608
-rw-r--r--intern/cycles/kernel/kernel_textures.h152
-rw-r--r--intern/cycles/kernel/kernel_triangle.h183
-rw-r--r--intern/cycles/kernel/kernel_types.h406
-rw-r--r--intern/cycles/kernel/osl/CMakeLists.txt43
-rw-r--r--intern/cycles/kernel/osl/background.cpp100
-rw-r--r--intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp175
-rw-r--r--intern/cycles/kernel/osl/bsdf_diffuse.cpp181
-rw-r--r--intern/cycles/kernel/osl/bsdf_microfacet.cpp533
-rw-r--r--intern/cycles/kernel/osl/bsdf_reflection.cpp108
-rw-r--r--intern/cycles/kernel/osl/bsdf_refraction.cpp120
-rw-r--r--intern/cycles/kernel/osl/bsdf_transparent.cpp97
-rw-r--r--intern/cycles/kernel/osl/bsdf_ward.cpp222
-rw-r--r--intern/cycles/kernel/osl/bsdf_westin.cpp239
-rw-r--r--intern/cycles/kernel/osl/bssrdf.cpp105
-rw-r--r--intern/cycles/kernel/osl/debug.cpp80
-rw-r--r--intern/cycles/kernel/osl/emissive.cpp107
-rw-r--r--intern/cycles/kernel/osl/nodes/CMakeLists.txt81
-rw-r--r--intern/cycles/kernel/osl/nodes/node_add_closure.osl28
-rw-r--r--intern/cycles/kernel/osl/nodes/node_attribute.osl43
-rw-r--r--intern/cycles/kernel/osl/nodes/node_background.osl28
-rw-r--r--intern/cycles/kernel/osl/nodes/node_blend_texture.osl78
-rw-r--r--intern/cycles/kernel/osl/nodes/node_blend_weight.osl42
-rw-r--r--intern/cycles/kernel/osl/nodes/node_bump.osl46
-rw-r--r--intern/cycles/kernel/osl/nodes/node_clouds_texture.osl42
-rw-r--r--intern/cycles/kernel/osl/nodes/node_color.h50
-rw-r--r--intern/cycles/kernel/osl/nodes/node_convert_from_color.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_convert_from_float.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_convert_from_normal.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_convert_from_point.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_convert_from_vector.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_diffuse_bsdf.osl28
-rw-r--r--intern/cycles/kernel/osl/nodes/node_distorted_noise_texture.osl46
-rw-r--r--intern/cycles/kernel/osl/nodes/node_emission.osl32
-rw-r--r--intern/cycles/kernel/osl/nodes/node_environment_texture.osl34
-rw-r--r--intern/cycles/kernel/osl/nodes/node_fresnel.h21
-rw-r--r--intern/cycles/kernel/osl/nodes/node_fresnel.osl31
-rw-r--r--intern/cycles/kernel/osl/nodes/node_geometry.osl50
-rw-r--r--intern/cycles/kernel/osl/nodes/node_glass_bsdf.osl41
-rw-r--r--intern/cycles/kernel/osl/nodes/node_glossy_bsdf.osl37
-rw-r--r--intern/cycles/kernel/osl/nodes/node_holdout.osl28
-rw-r--r--intern/cycles/kernel/osl/nodes/node_image_texture.osl34
-rw-r--r--intern/cycles/kernel/osl/nodes/node_light_path.osl38
-rw-r--r--intern/cycles/kernel/osl/nodes/node_magic_texture.osl103
-rw-r--r--intern/cycles/kernel/osl/nodes/node_mapping.osl28
-rw-r--r--intern/cycles/kernel/osl/nodes/node_marble_texture.osl58
-rw-r--r--intern/cycles/kernel/osl/nodes/node_math.osl84
-rw-r--r--intern/cycles/kernel/osl/nodes/node_mix.osl388
-rw-r--r--intern/cycles/kernel/osl/nodes/node_mix_closure.osl30
-rw-r--r--intern/cycles/kernel/osl/nodes/node_musgrave_texture.osl218
-rw-r--r--intern/cycles/kernel/osl/nodes/node_noise_texture.osl36
-rw-r--r--intern/cycles/kernel/osl/nodes/node_output_displacement.osl25
-rw-r--r--intern/cycles/kernel/osl/nodes/node_output_surface.osl25
-rw-r--r--intern/cycles/kernel/osl/nodes/node_output_volume.osl25
-rw-r--r--intern/cycles/kernel/osl/nodes/node_sky_texture.osl162
-rw-r--r--intern/cycles/kernel/osl/nodes/node_stucci_texture.osl49
-rw-r--r--intern/cycles/kernel/osl/nodes/node_texture.h251
-rw-r--r--intern/cycles/kernel/osl/nodes/node_texture_coordinate.osl66
-rw-r--r--intern/cycles/kernel/osl/nodes/node_translucent_bsdf.osl28
-rw-r--r--intern/cycles/kernel/osl/nodes/node_transparent_bsdf.osl28
-rw-r--r--intern/cycles/kernel/osl/nodes/node_value.osl33
-rw-r--r--intern/cycles/kernel/osl/nodes/node_vector_math.osl53
-rw-r--r--intern/cycles/kernel/osl/nodes/node_velvet_bsdf.osl32
-rw-r--r--intern/cycles/kernel/osl/nodes/node_voronoi_texture.osl82
-rw-r--r--intern/cycles/kernel/osl/nodes/node_ward_bsdf.osl30
-rw-r--r--intern/cycles/kernel/osl/nodes/node_wood_texture.osl63
-rw-r--r--intern/cycles/kernel/osl/nodes/stdosl.h471
-rw-r--r--intern/cycles/kernel/osl/osl_closures.cpp93
-rw-r--r--intern/cycles/kernel/osl/osl_closures.h114
-rw-r--r--intern/cycles/kernel/osl/osl_globals.h74
-rw-r--r--intern/cycles/kernel/osl/osl_services.cpp425
-rw-r--r--intern/cycles/kernel/osl/osl_services.h111
-rw-r--r--intern/cycles/kernel/osl/osl_shader.cpp477
-rw-r--r--intern/cycles/kernel/osl/osl_shader.h90
-rw-r--r--intern/cycles/kernel/osl/vol_subsurface.cpp135
-rw-r--r--intern/cycles/kernel/svm/bsdf.h135
-rw-r--r--intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h161
-rw-r--r--intern/cycles/kernel/svm/bsdf_diffuse.h156
-rw-r--r--intern/cycles/kernel/svm/bsdf_microfacet.h503
-rw-r--r--intern/cycles/kernel/svm/bsdf_reflection.h93
-rw-r--r--intern/cycles/kernel/svm/bsdf_refraction.h102
-rw-r--r--intern/cycles/kernel/svm/bsdf_transparent.h79
-rw-r--r--intern/cycles/kernel/svm/bsdf_ward.h200
-rw-r--r--intern/cycles/kernel/svm/bsdf_westin.h207
-rw-r--r--intern/cycles/kernel/svm/emissive.h60
-rw-r--r--intern/cycles/kernel/svm/svm.h312
-rw-r--r--intern/cycles/kernel/svm/svm_attribute.h154
-rw-r--r--intern/cycles/kernel/svm/svm_bsdf.h232
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h424
-rw-r--r--intern/cycles/kernel/svm/svm_convert.h48
-rw-r--r--intern/cycles/kernel/svm/svm_displace.h52
-rw-r--r--intern/cycles/kernel/svm/svm_fresnel.h70
-rw-r--r--intern/cycles/kernel/svm/svm_geometry.h78
-rw-r--r--intern/cycles/kernel/svm/svm_gradient.h80
-rw-r--r--intern/cycles/kernel/svm/svm_image.h196
-rw-r--r--intern/cycles/kernel/svm/svm_light_path.h42
-rw-r--r--intern/cycles/kernel/svm/svm_magic.h114
-rw-r--r--intern/cycles/kernel/svm/svm_mapping.h38
-rw-r--r--intern/cycles/kernel/svm/svm_math.h186
-rw-r--r--intern/cycles/kernel/svm/svm_mix.h395
-rw-r--r--intern/cycles/kernel/svm/svm_musgrave.h240
-rw-r--r--intern/cycles/kernel/svm/svm_noise.h213
-rw-r--r--intern/cycles/kernel/svm/svm_noisetex.h73
-rw-r--r--intern/cycles/kernel/svm/svm_sky.h92
-rw-r--r--intern/cycles/kernel/svm/svm_tex_coord.h170
-rw-r--r--intern/cycles/kernel/svm/svm_texture.h259
-rw-r--r--intern/cycles/kernel/svm/svm_types.h299
-rw-r--r--intern/cycles/kernel/svm/svm_value.h38
-rw-r--r--intern/cycles/kernel/svm/svm_voronoi.h66
-rw-r--r--intern/cycles/kernel/svm/svm_wave.h65
-rw-r--r--intern/cycles/kernel/svm/volume.h74
-rw-r--r--intern/cycles/render/CMakeLists.txt67
-rw-r--r--intern/cycles/render/attribute.cpp346
-rw-r--r--intern/cycles/render/attribute.h161
-rw-r--r--intern/cycles/render/background.cpp72
-rw-r--r--intern/cycles/render/background.h48
-rw-r--r--intern/cycles/render/buffers.cpp232
-rw-r--r--intern/cycles/render/buffers.h98
-rw-r--r--intern/cycles/render/camera.cpp199
-rw-r--r--intern/cycles/render/camera.h93
-rw-r--r--intern/cycles/render/film.cpp64
-rw-r--r--intern/cycles/render/film.h48
-rw-r--r--intern/cycles/render/filter.cpp140
-rw-r--r--intern/cycles/render/filter.h53
-rw-r--r--intern/cycles/render/graph.cpp468
-rw-r--r--intern/cycles/render/graph.h229
-rw-r--r--intern/cycles/render/image.cpp257
-rw-r--r--intern/cycles/render/image.h70
-rw-r--r--intern/cycles/render/integrator.cpp128
-rw-r--r--intern/cycles/render/integrator.h63
-rw-r--r--intern/cycles/render/light.cpp309
-rw-r--r--intern/cycles/render/light.h76
-rw-r--r--intern/cycles/render/mesh.cpp756
-rw-r--r--intern/cycles/render/mesh.h134
-rw-r--r--intern/cycles/render/mesh_displace.cpp153
-rw-r--r--intern/cycles/render/nodes.cpp1938
-rw-r--r--intern/cycles/render/nodes.h337
-rw-r--r--intern/cycles/render/object.cpp258
-rw-r--r--intern/cycles/render/object.h77
-rw-r--r--intern/cycles/render/osl.cpp504
-rw-r--r--intern/cycles/render/osl.h103
-rw-r--r--intern/cycles/render/scene.cpp188
-rw-r--r--intern/cycles/render/scene.h180
-rw-r--r--intern/cycles/render/session.cpp590
-rw-r--r--intern/cycles/render/session.h163
-rw-r--r--intern/cycles/render/shader.cpp259
-rw-r--r--intern/cycles/render/shader.h124
-rw-r--r--intern/cycles/render/sobol.cpp21304
-rw-r--r--intern/cycles/render/sobol.h32
-rw-r--r--intern/cycles/render/svm.cpp683
-rw-r--r--intern/cycles/render/svm.h143
-rw-r--r--intern/cycles/render/tile.cpp122
-rw-r--r--intern/cycles/render/tile.h74
-rw-r--r--intern/cycles/subd/CMakeLists.txt35
-rw-r--r--intern/cycles/subd/subd_build.cpp666
-rw-r--r--intern/cycles/subd/subd_build.h75
-rw-r--r--intern/cycles/subd/subd_dice.cpp461
-rw-r--r--intern/cycles/subd/subd_dice.h159
-rw-r--r--intern/cycles/subd/subd_edge.h70
-rw-r--r--intern/cycles/subd/subd_face.h109
-rw-r--r--intern/cycles/subd/subd_mesh.cpp309
-rw-r--r--intern/cycles/subd/subd_mesh.h90
-rw-r--r--intern/cycles/subd/subd_patch.cpp288
-rw-r--r--intern/cycles/subd/subd_patch.h108
-rw-r--r--intern/cycles/subd/subd_ring.cpp236
-rw-r--r--intern/cycles/subd/subd_ring.h75
-rw-r--r--intern/cycles/subd/subd_split.cpp325
-rw-r--r--intern/cycles/subd/subd_split.h71
-rw-r--r--intern/cycles/subd/subd_stencil.cpp103
-rw-r--r--intern/cycles/subd/subd_stencil.h65
-rw-r--r--intern/cycles/subd/subd_vert.h121
-rw-r--r--intern/cycles/util/CMakeLists.txt64
-rw-r--r--intern/cycles/util/util_algorithm.h35
-rw-r--r--intern/cycles/util/util_args.h34
-rw-r--r--intern/cycles/util/util_boundbox.h98
-rw-r--r--intern/cycles/util/util_cache.cpp93
-rw-r--r--intern/cycles/util/util_cache.h141
-rw-r--r--intern/cycles/util/util_color.h71
-rw-r--r--intern/cycles/util/util_cuda.cpp424
-rw-r--r--intern/cycles/util/util_cuda.h621
-rw-r--r--intern/cycles/util/util_debug.h25
-rw-r--r--intern/cycles/util/util_dynlib.cpp96
-rw-r--r--intern/cycles/util/util_dynlib.h33
-rw-r--r--intern/cycles/util/util_foreach.h28
-rw-r--r--intern/cycles/util/util_function.h33
-rw-r--r--intern/cycles/util/util_hash.h55
-rw-r--r--intern/cycles/util/util_image.h33
-rw-r--r--intern/cycles/util/util_list.h31
-rw-r--r--intern/cycles/util/util_map.h34
-rw-r--r--intern/cycles/util/util_math.h799
-rw-r--r--intern/cycles/util/util_md5.cpp375
-rw-r--r--intern/cycles/util/util_md5.h59
-rw-r--r--intern/cycles/util/util_memarena.cpp61
-rw-r--r--intern/cycles/util/util_memarena.h48
-rwxr-xr-xintern/cycles/util/util_opencl.c317
-rwxr-xr-xintern/cycles/util/util_opencl.h1320
-rw-r--r--intern/cycles/util/util_opengl.h33
-rw-r--r--intern/cycles/util/util_param.h36
-rw-r--r--intern/cycles/util/util_path.cpp166
-rw-r--r--intern/cycles/util/util_path.h52
-rw-r--r--intern/cycles/util/util_progress.h174
-rw-r--r--intern/cycles/util/util_set.h33
-rw-r--r--intern/cycles/util/util_string.cpp92
-rw-r--r--intern/cycles/util/util_string.h49
-rw-r--r--intern/cycles/util/util_system.cpp122
-rw-r--r--intern/cycles/util/util_system.h33
-rw-r--r--intern/cycles/util/util_thread.h212
-rw-r--r--intern/cycles/util/util_time.cpp72
-rw-r--r--intern/cycles/util/util_time.h35
-rw-r--r--intern/cycles/util/util_transform.cpp144
-rw-r--r--intern/cycles/util/util_transform.h251
-rw-r--r--intern/cycles/util/util_types.h285
-rw-r--r--intern/cycles/util/util_vector.h138
-rw-r--r--intern/cycles/util/util_view.cpp195
-rw-r--r--intern/cycles/util/util_view.h44
-rw-r--r--intern/cycles/util/util_xml.h33
-rw-r--r--intern/decimation/intern/LOD_QSDecimator.cpp4
-rw-r--r--intern/ghost/GHOST_ISystem.h2
-rw-r--r--intern/ghost/GHOST_ISystemPaths.h10
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp2
-rw-r--r--intern/ghost/intern/GHOST_System.h2
-rw-r--r--intern/ghost/intern/GHOST_SystemCocoa.mm37
-rw-r--r--intern/ghost/intern/GHOST_SystemPaths.h10
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsCocoa.h10
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsWin32.h20
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsX11.h10
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp7
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.h4
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.cpp6
-rw-r--r--intern/ghost/test/gears/GHOST_Test.cpp2
-rw-r--r--intern/memutil/MEM_CacheLimiter.h5
-rw-r--r--release/datafiles/fonts/droidsans.ttf.gzbin2263650 -> 2055389 bytes
-rw-r--r--release/plugins/sequence/dnr.c2
-rw-r--r--release/plugins/sequence/gamma.c8
-rw-r--r--release/scripts/presets/cycles/integrator/direct_light.py11
-rw-r--r--release/scripts/presets/cycles/integrator/full_global_illumination.py11
-rw-r--r--release/scripts/presets/cycles/integrator/limited_global_illumination.py11
-rw-r--r--release/scripts/startup/bl_operators/add_mesh_torus.py2
-rw-r--r--release/scripts/startup/bl_operators/presets.py5
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_follow_active.py11
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py6
-rw-r--r--release/scripts/startup/bl_ui/__init__.py1
-rw-r--r--release/scripts/startup/bl_ui/properties_data_armature.py4
-rw-r--r--release/scripts/startup/bl_ui/properties_data_camera.py6
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py3
-rw-r--r--release/scripts/startup/bl_ui/properties_data_speaker.py11
-rw-r--r--release/scripts/startup/bl_ui/properties_game.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_material.py4
-rw-r--r--release/scripts/startup/bl_ui/properties_object.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_object_constraint.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_cloth.py82
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_common.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py498
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_field.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fluid.py286
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_smoke.py85
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_softbody.py29
-rw-r--r--release/scripts/startup/bl_ui/properties_texture.py4
-rw-r--r--release/scripts/startup/bl_ui/space_clip.py4
-rw-r--r--release/scripts/startup/bl_ui/space_graph.py2
-rw-r--r--release/scripts/startup/bl_ui/space_image.py8
-rw-r--r--release/scripts/startup/bl_ui/space_nla.py2
-rw-r--r--release/scripts/startup/bl_ui/space_sequencer.py2
-rw-r--r--release/scripts/startup/bl_ui/space_time.py3
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py2
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py14
-rw-r--r--source/blender/CMakeLists.txt1
-rw-r--r--source/blender/SConscript3
-rw-r--r--source/blender/avi/intern/avi.c6
-rw-r--r--source/blender/blenfont/BLF_translation.h10
-rw-r--r--source/blender/blenfont/intern/blf_translation.c45
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h10
-rw-r--r--source/blender/blenkernel/BKE_anim.h3
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_bmfont.h14
-rw-r--r--source/blender/blenkernel/BKE_bvhutils.h5
-rw-r--r--source/blender/blenkernel/BKE_customdata.h2
-rw-r--r--source/blender/blenkernel/BKE_dynamicpaint.h89
-rw-r--r--source/blender/blenkernel/BKE_fluidsim.h2
-rw-r--r--source/blender/blenkernel/BKE_mesh.h4
-rw-r--r--source/blender/blenkernel/BKE_node.h35
-rw-r--r--source/blender/blenkernel/BKE_object.h16
-rw-r--r--source/blender/blenkernel/BKE_paint.h2
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h5
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h4
-rw-r--r--source/blender/blenkernel/CMakeLists.txt2
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c142
-rw-r--r--source/blender/blenkernel/intern/anim.c8
-rw-r--r--source/blender/blenkernel/intern/boids.c4
-rw-r--r--source/blender/blenkernel/intern/brush.c2
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c6
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c86
-rw-r--r--source/blender/blenkernel/intern/cloth.c16
-rw-r--r--source/blender/blenkernel/intern/collision.c22
-rw-r--r--source/blender/blenkernel/intern/curve.c4
-rw-r--r--source/blender/blenkernel/intern/customdata.c21
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c12
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c4908
-rw-r--r--source/blender/blenkernel/intern/implicit.c6
-rw-r--r--source/blender/blenkernel/intern/library.c4
-rw-r--r--source/blender/blenkernel/intern/mball.c2
-rw-r--r--source/blender/blenkernel/intern/movieclip.c39
-rw-r--r--source/blender/blenkernel/intern/multires.c8
-rw-r--r--source/blender/blenkernel/intern/nla.c2
-rw-r--r--source/blender/blenkernel/intern/node.c61
-rw-r--r--source/blender/blenkernel/intern/object.c65
-rw-r--r--source/blender/blenkernel/intern/particle.c11
-rw-r--r--source/blender/blenkernel/intern/particle_system.c2
-rw-r--r--source/blender/blenkernel/intern/pointcache.c177
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c6
-rw-r--r--source/blender/blenkernel/intern/sequencer.c31
-rw-r--r--source/blender/blenkernel/intern/softbody.c16
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c156
-rw-r--r--source/blender/blenkernel/intern/tracking.c17
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c4
-rw-r--r--source/blender/blenlib/BLI_fnmatch.h2
-rw-r--r--source/blender/blenlib/BLI_math_geom.h2
-rw-r--r--source/blender/blenlib/BLI_pbvh.h2
-rw-r--r--source/blender/blenlib/BLI_threads.h4
-rw-r--r--source/blender/blenlib/BLI_vfontdata.h6
-rw-r--r--source/blender/blenlib/intern/BLI_heap.c6
-rw-r--r--source/blender/blenlib/intern/edgehash.c2
-rw-r--r--source/blender/blenlib/intern/math_geom.c27
-rw-r--r--source/blender/blenlib/intern/math_matrix.c6
-rw-r--r--source/blender/blenlib/intern/math_rotation.c28
-rw-r--r--source/blender/blenlib/intern/pbvh.c12
-rw-r--r--source/blender/blenlib/intern/scanfill.c2
-rw-r--r--source/blender/blenlib/intern/threads.c14
-rw-r--r--source/blender/blenloader/intern/readfile.c165
-rw-r--r--source/blender/blenloader/intern/writefile.c26
-rw-r--r--source/blender/collada/ArmatureExporter.cpp2
-rw-r--r--source/blender/collada/ArmatureImporter.cpp26
-rw-r--r--source/blender/collada/ArmatureImporter.h2
-rw-r--r--source/blender/editors/armature/editarmature.c6
-rw-r--r--source/blender/editors/armature/editarmature_retarget.c28
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c10
-rw-r--r--source/blender/editors/armature/poseobject.c4
-rw-r--r--source/blender/editors/armature/reeb.c6
-rw-r--r--source/blender/editors/curve/curve_intern.h2
-rw-r--r--source/blender/editors/curve/editcurve.c4
-rw-r--r--source/blender/editors/datafiles/blender_icons.png.c13039
-rw-r--r--source/blender/editors/include/ED_image.h2
-rw-r--r--source/blender/editors/include/ED_mesh.h1
-rw-r--r--source/blender/editors/include/ED_sculpt.h2
-rw-r--r--source/blender/editors/include/ED_uvedit.h9
-rw-r--r--source/blender/editors/include/UI_icons.h4
-rw-r--r--source/blender/editors/include/UI_interface.h17
-rw-r--r--source/blender/editors/interface/interface.c72
-rw-r--r--source/blender/editors/interface/interface_draw.c14
-rw-r--r--source/blender/editors/interface/interface_handlers.c38
-rw-r--r--source/blender/editors/interface/interface_intern.h5
-rw-r--r--source/blender/editors/interface/interface_layout.c2
-rw-r--r--source/blender/editors/interface/interface_panel.c2
-rw-r--r--source/blender/editors/interface/interface_templates.c43
-rw-r--r--source/blender/editors/interface/resources.c47
-rw-r--r--source/blender/editors/mesh/editmesh_lib.c6
-rw-r--r--source/blender/editors/mesh/editmesh_loop.c14
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c2
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c6
-rw-r--r--source/blender/editors/mesh/mesh_data.c25
-rw-r--r--source/blender/editors/object/object_add.c18
-rw-r--r--source/blender/editors/object/object_constraint.c16
-rw-r--r--source/blender/editors/object/object_edit.c12
-rw-r--r--source/blender/editors/object/object_hook.c4
-rw-r--r--source/blender/editors/object/object_select.c4
-rw-r--r--source/blender/editors/object/object_vgroup.c4
-rw-r--r--source/blender/editors/physics/CMakeLists.txt1
-rw-r--r--source/blender/editors/physics/dynamicpaint_ops.c422
-rw-r--r--source/blender/editors/physics/physics_intern.h7
-rw-r--r--source/blender/editors/physics/physics_ops.c12
-rw-r--r--source/blender/editors/screen/screen_context.c28
-rw-r--r--source/blender/editors/screen/screen_edit.c7
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c82
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c26
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c37
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c12
-rw-r--r--source/blender/editors/space_action/action_select.c7
-rw-r--r--source/blender/editors/space_buttons/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c267
-rw-r--r--source/blender/editors/space_buttons/buttons_intern.h49
-rw-r--r--source/blender/editors/space_buttons/buttons_texture.c469
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c7
-rw-r--r--source/blender/editors/space_clip/clip_draw.c16
-rw-r--r--source/blender/editors/space_clip/clip_graph_ops.c2
-rw-r--r--source/blender/editors/space_clip/clip_ops.c6
-rw-r--r--source/blender/editors/space_clip/tracking_ops.c35
-rw-r--r--source/blender/editors/space_file/file_draw.c32
-rw-r--r--source/blender/editors/space_graph/graph_select.c5
-rw-r--r--source/blender/editors/space_image/image_ops.c4
-rw-r--r--source/blender/editors/space_image/space_image.c54
-rw-r--r--source/blender/editors/space_logic/logic_window.c6
-rw-r--r--source/blender/editors/space_nla/nla_select.c5
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_node/SConscript2
-rw-r--r--source/blender/editors/space_node/drawnode.c90
-rw-r--r--source/blender/editors/space_node/node_draw.c6
-rw-r--r--source/blender/editors/space_node/node_edit.c64
-rw-r--r--source/blender/editors/space_node/node_header.c2
-rw-r--r--source/blender/editors/space_node/node_templates.c13
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c16
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c2
-rw-r--r--source/blender/editors/space_text/text_intern.h2
-rw-r--r--source/blender/editors/space_time/space_time.c10
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c199
-rw-r--r--source/blender/editors/space_view3d/drawobject.c75
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c35
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c31
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h4
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c14
-rw-r--r--source/blender/editors/transform/transform.c10
-rw-r--r--source/blender/editors/transform/transform_conversions.c4
-rw-r--r--source/blender/editors/transform/transform_generics.c121
-rw-r--r--source/blender/editors/transform/transform_orientations.c2
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c103
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c4
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c28
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c2
-rw-r--r--source/blender/gpu/intern/gpu_draw.c59
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c2
-rw-r--r--source/blender/gpu/intern/gpu_material.c28
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl317
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c2641
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c24
-rw-r--r--source/blender/imbuf/IMB_imbuf.h12
-rw-r--r--source/blender/imbuf/intern/IMB_indexer.h34
-rw-r--r--source/blender/imbuf/intern/anim_movie.c50
-rw-r--r--source/blender/imbuf/intern/indexer.c54
-rw-r--r--source/blender/imbuf/intern/jpeg.c11
-rw-r--r--source/blender/imbuf/intern/png.c25
-rw-r--r--source/blender/imbuf/intern/scaling.c18
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c2
-rw-r--r--source/blender/makesdna/DNA_ID.h4
-rw-r--r--source/blender/makesdna/DNA_dynamicpaint_types.h208
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h13
-rw-r--r--source/blender/makesdna/DNA_node_types.h122
-rw-r--r--source/blender/makesdna/DNA_object_force.h8
-rw-r--r--source/blender/makesdna/DNA_sensor_types.h2
-rw-r--r--source/blender/makesdna/DNA_space_types.h3
-rw-r--r--source/blender/makesdna/intern/makesdna.c2
-rw-r--r--source/blender/makesrna/RNA_access.h6
-rw-r--r--source/blender/makesrna/RNA_enum_types.h2
-rw-r--r--source/blender/makesrna/RNA_types.h9
-rw-r--r--source/blender/makesrna/SConscript4
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt1
-rw-r--r--source/blender/makesrna/intern/makesrna.c1
-rw-r--r--source/blender/makesrna/intern/rna_access.c5
-rw-r--r--source/blender/makesrna/intern/rna_animviz.c5
-rw-r--r--source/blender/makesrna/intern/rna_curve.c11
-rw-r--r--source/blender/makesrna/intern/rna_define.c1
-rw-r--r--source/blender/makesrna/intern/rna_dynamicpaint.c911
-rw-r--r--source/blender/makesrna/intern/rna_internal.h1
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c2
-rw-r--r--source/blender/makesrna/intern/rna_linestyle.c4
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c11
-rw-r--r--source/blender/makesrna/intern/rna_meta.c11
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c30
-rw-r--r--source/blender/makesrna/intern/rna_movieclip.c28
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c250
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h34
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c6
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c16
-rw-r--r--source/blender/makesrna/intern/rna_render.c4
-rw-r--r--source/blender/makesrna/intern/rna_scene.c3
-rw-r--r--source/blender/makesrna/intern/rna_space.c19
-rw-r--r--source/blender/makesrna/intern/rna_tracking.c4
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c3
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c39
-rw-r--r--source/blender/modifiers/CMakeLists.txt1
-rw-r--r--source/blender/modifiers/MOD_modifiertypes.h1
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c6
-rw-r--r--source/blender/modifiers/intern/MOD_array.c12
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c2
-rw-r--r--source/blender/modifiers/intern/MOD_build.c2
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c4
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c8
-rw-r--r--source/blender/modifiers/intern/MOD_dynamicpaint.c180
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c17
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c2
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c4
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c2
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c4
-rw-r--r--source/blender/modifiers/intern/MOD_util.c22
-rw-r--r--source/blender/modifiers/intern/MOD_util.h1
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c2
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c2
-rw-r--r--source/blender/nodes/CMakeLists.txt33
-rw-r--r--source/blender/nodes/NOD_composite.h8
-rw-r--r--source/blender/nodes/NOD_shader.h35
-rw-r--r--source/blender/nodes/SConscript2
-rw-r--r--source/blender/nodes/composite/node_composite_tree.c24
-rw-r--r--source/blender/nodes/composite/node_composite_util.c10
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_bilateralblur.c15
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_blur.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_channelMatte.c12
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_chromaMatte.c40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorMatte.c6
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorbalance.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_curves.c6
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_defocus.c54
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_diffMatte.c8
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_directionalblur.c8
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_displace.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_gamma.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_glare.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_hueSatVal.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_huecorrect.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c66
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_invert.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_levels.c8
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mapUV.c24
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_math.c6
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_moviedistortion.c8
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_rotate.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c24
-rw-r--r--source/blender/nodes/shader/node_shader_tree.c23
-rw-r--r--source/blender/nodes/shader/node_shader_util.c44
-rw-r--r--source/blender/nodes/shader/node_shader_util.h5
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_add_shader.c66
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_attribute.c63
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_background.c61
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c67
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.c65
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c67
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c67
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.c65
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.c65
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.c66
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_emission.c66
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_fresnel.c65
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_geom.c8
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_geometry.c68
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_holdout.c60
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_layer_weight.c66
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_light_path.c66
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mapping.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_math.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mixRgb.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mix_shader.c67
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output_lamp.c55
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output_material.c68
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output_world.c56
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_rgb.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_coord.c72
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_environment.c89
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_gradient.c81
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_image.c89
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_magic.c86
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c87
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_noise.c83
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_sky.c83
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c82
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_tex_wave.c85
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_valToRgb.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_value.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_vectMath.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_volume_isotropic.c66
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_volume_transparent.c66
-rw-r--r--source/blender/nodes/texture/node_texture_tree.c20
-rw-r--r--source/blender/python/SConscript5
-rw-r--r--source/blender/python/generic/noise_py_api.c12
-rw-r--r--source/blender/python/intern/CMakeLists.txt5
-rw-r--r--source/blender/python/intern/bpy_interface.c5
-rw-r--r--source/blender/python/intern/bpy_rna.c2
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.c2
-rw-r--r--source/blender/python/mathutils/mathutils_geometry.c43
-rw-r--r--source/blender/quicktime/apple/qtkit_import.m10
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c9
-rw-r--r--source/blender/quicktime/apple/quicktime_import.c49
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h2
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h7
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h2
-rw-r--r--source/blender/render/intern/include/pointdensity.h1
-rw-r--r--source/blender/render/intern/include/texture.h4
-rw-r--r--source/blender/render/intern/include/voxeldata.h1
-rw-r--r--source/blender/render/intern/source/convertblender.c20
-rw-r--r--source/blender/render/intern/source/envmap.c10
-rw-r--r--source/blender/render/intern/source/imagetexture.c2
-rw-r--r--source/blender/render/intern/source/occlusion.c8
-rw-r--r--source/blender/render/intern/source/pipeline.c4
-rw-r--r--source/blender/render/intern/source/pixelshading.c14
-rw-r--r--source/blender/render/intern/source/pointdensity.c2
-rw-r--r--source/blender/render/intern/source/render_texture.c312
-rw-r--r--source/blender/render/intern/source/shadbuf.c4
-rw-r--r--source/blender/render/intern/source/shadeinput.c29
-rw-r--r--source/blender/render/intern/source/shadeoutput.c42
-rw-r--r--source/blender/render/intern/source/volume_precache.c35
-rw-r--r--source/blender/render/intern/source/volumetric.c10
-rw-r--r--source/blender/render/intern/source/voxeldata.c10
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c14
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c4
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c13
-rw-r--r--source/creator/CMakeLists.txt19
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.cpp5
-rw-r--r--source/gameengine/Expressions/IntValue.h4
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Canvas.cpp16
-rw-r--r--source/gameengine/Ketsji/BL_Action.cpp5
-rw-r--r--source/gameengine/Ketsji/BL_Shader.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_Dome.cpp24
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.h18
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.h2
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.h12
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp14
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp8
-rw-r--r--source/gameengine/VideoTexture/Texture.h2
718 files changed, 95187 insertions, 10298 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 43f52eff009..36ef022f3c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -213,6 +213,12 @@ if(UNIX AND NOT APPLE)
endif()
option(WITH_PYTHON_INSTALL "Copy system python into the blender install folder" ON)
+# Cycles
+option(WITH_CYCLES "Enable cycles Render Engine" ON)
+option(WITH_CYCLES_TEST "Build cycles test application" OFF)
+option(WITH_CYCLES_CUDA_BINARIES "Build cycles CUDA binaries" OFF)
+set(CYCLES_CUDA_BINARIES_ARCH sm_13 sm_20 sm_21 CACHE STRING "CUDA architectures to build binaries for")
+
# disable for now, but plan to support on all platforms eventually
option(WITH_MEM_JEMALLOC "Enable malloc replacement (http://www.canonware.com/jemalloc)" OFF)
mark_as_advanced(WITH_MEM_JEMALLOC)
@@ -284,6 +290,12 @@ if(WITH_PYTHON_MODULE)
set(WITH_HEADLESS ON)
endif()
+# auto enable openimageio and boost for cycles
+if(WITH_CYCLES)
+ set(WITH_OPENIMAGEIO ON)
+ set(WITH_BOOST ON)
+endif()
+
TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG)
# don't store paths to libs for portable distrobution
@@ -349,6 +361,19 @@ if(UNIX AND NOT APPLE)
set(CMAKE_LIBRARY_PATH "/usr/lib/x86_64-linux-gnu;${CMAKE_LIBRARY_PATH}")
endif()
+ # set lib directory if it exists
+ if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+ set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/linux64)
+ else()
+ set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/linux)
+ endif()
+
+ if(NOT EXISTS ${LIBDIR})
+ unset(LIBDIR)
+ endif()
+ endif()
+
find_package(JPEG REQUIRED)
find_package(PNG REQUIRED)
find_package(ZLIB REQUIRED)
@@ -423,10 +448,17 @@ if(UNIX AND NOT APPLE)
endif()
if(WITH_CODEC_FFMPEG)
- set(FFMPEG /usr CACHE PATH "FFMPEG Directory")
+ # use lib dir if available and nothing else specified
+ if(LIBDIR AND NOT FFMPEG)
+ set(FFMPEG ${LIBDIR}/ffmpeg CACHE PATH "FFMPEG Directory")
+ set(FFMPEG_LIBRARIES avformat avcodec avutil avdevice swscale dirac_encoder mp3lame ogg orc-0.4 schroedinger-1.0 theora theoraenc theoradec vorbis vorbisenc vpx x264 xvidcore faad asound CACHE STRING "FFMPEG Libraries")
+ else()
+ set(FFMPEG /usr CACHE PATH "FFMPEG Directory")
+ set(FFMPEG_LIBRARIES avformat avcodec avutil avdevice swscale CACHE STRING "FFMPEG Libraries")
+ endif()
+
mark_as_advanced(FFMPEG)
set(FFMPEG_INCLUDE_DIRS ${FFMPEG}/include)
- set(FFMPEG_LIBRARIES avformat avcodec avutil avdevice swscale CACHE STRING "FFMPEG Libraries")
mark_as_advanced(FFMPEG_LIBRARIES)
set(FFMPEG_LIBPATH ${FFMPEG}/lib)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STDC_CONSTANT_MACROS")
@@ -492,12 +524,17 @@ if(UNIX AND NOT APPLE)
endif()
if(WITH_BOOST)
- set(BOOST "/usr" CACHE PATH "Boost Directory")
-
+ # uses in build instructions to override include and library variables
if(NOT BOOST_CUSTOM)
- set(BOOST_ROOT ${BOOST})
- set(Boost_USE_MULTITHREADED ON)
- find_package(Boost 1.34 REQUIRED COMPONENTS filesystem regex system thread)
+ # use lib dir if available and nothing else specified
+ if(LIBDIR AND NOT BOOST_ROOT)
+ set(BOOST_ROOT ${LIBDIR}/boost)
+ set(Boost_USE_MULTITHREADED OFF)
+ else()
+ set(Boost_USE_MULTITHREADED ON)
+ endif()
+ find_package(Boost 1.34 COMPONENTS filesystem regex system thread)
+ mark_as_advanced(Boost_DIR) # why doesnt boost do this?
endif()
set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS})
@@ -507,10 +544,12 @@ if(UNIX AND NOT APPLE)
endif()
if(WITH_OPENIMAGEIO)
- set(OPENIMAGEIO "/usr" CACHE PATH "OpenImageIO Directory")
+ # use lib dir if available and nothing else specified
+ if(LIBDIR AND NOT OPENIMAGEIO_ROOT_DIR)
+ set(OPENIMAGEIO_ROOT_DIR ${LIBDIR}/oiio)
+ endif()
- set(OPENIMAGEIO_ROOT_DIR ${OPENIMAGEIO})
- find_package(OpenImageIO REQUIRED)
+ find_package(OpenImageIO)
set(OPENIMAGEIO_LIBRARIES ${OPENIMAGEIO_LIBRARIES} ${PNG_LIBRARIES} ${JPEG_LIBRARIES} ${TIFF_LIBRARY} ${OPENEXR_LIBRARIES} ${ZLIB_LIBRARIES} ${BOOST_LIBRARIES})
set(OPENIMAGEIO_LIBPATH) # TODO, remove and reference the absolute path everywhere
@@ -518,6 +557,8 @@ if(UNIX AND NOT APPLE)
if(NOT OPENIMAGEIO_FOUND)
set(WITH_OPENIMAGEIO OFF)
+ set(WITH_CYCLES OFF)
+ message(STATUS "OpenImageIO not found, disabling WITH_CYCLES")
endif()
endif()
@@ -843,7 +884,7 @@ elseif(WIN32)
else()
# keep GCC specific stuff here
if(CMAKE_COMPILER_IS_GNUCC)
- set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid -lwsock32")
+ set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid -lwsock32 -lpsapi")
set(PLATFORM_CFLAGS "-pipe -funsigned-char -fno-strict-aliasing")
add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE)
@@ -942,26 +983,26 @@ elseif(WIN32)
if(WITH_BOOST)
set(BOOST ${LIBDIR}/boost)
set(BOOST_INCLUDE_DIR ${BOOST}/include)
- set(BOOST_POSTFIX "vc90-mt-s-1_46_1")
- set(BOOST_DEBUG_POSTFIX "vc90-mt-sgd-1_46_1")
+ set(BOOST_POSTFIX "mgw45-mt-s-1_47")
+ set(BOOST_DEBUG_POSTFIX "mgw45-mt-sd-1_47")
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)
- set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
+ optimized boost_date_time-${BOOST_POSTFIX} boost_filesystem-${BOOST_POSTFIX}
+ boost_regex-${BOOST_POSTFIX} boost_system-${BOOST_POSTFIX} boost_thread-${BOOST_POSTFIX}
+ debug boost_date_time-${BOOST_DEBUG_POSTFIX} boost_filesystem-${BOOST_DEBUG_POSTFIX}
+ boost_regex-${BOOST_DEBUG_POSTFIX} boost_system-${BOOST_DEBUG_POSTFIX} boost_thread-${BOOST_DEBUG_POSTFIX})
+ set(BOOST_LIBPATH ${BOOST}/lib/gcc)
+ set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB -DBOOST_THREAD_USE_LIB ")
endif()
if(WITH_OPENIMAGEIO)
- set(OPENIMAGEIO ${LIBDIR}/openimageio)
+ set(OPENIMAGEIO ${LIBDIR}/gcc/openimageio)
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO}/include)
set(OPENIMAGEIO_LIBRARIES OpenImageIO)
set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
set(OPENIMAGEIO_DEFINITIONS)
endif()
- set(PLATFORM_LINKFLAGS "--stack,2097152")
+ set(PLATFORM_LINKFLAGS "-Xlinker --stack=2097152")
endif()
@@ -1480,6 +1521,7 @@ if(FIRST_RUN)
info_cfg_option(WITH_FFTW3)
info_cfg_option(WITH_INTERNATIONAL)
info_cfg_option(WITH_INPUT_NDOF)
+ info_cfg_option(WITH_CYCLES)
info_cfg_text("Compiler Options:")
info_cfg_option(WITH_BUILDINFO)
diff --git a/SConstruct b/SConstruct
index 16ce8ca4b32..161bbbc0378 100644
--- a/SConstruct
+++ b/SConstruct
@@ -162,7 +162,7 @@ if cxx:
if sys.platform=='win32':
if env['CC'] in ['cl', 'cl.exe']:
- platform = 'win64-vc' if bitness == 64 else 'win32-vc'
+ platform = 'win64-vc' if bitness == 64 else 'win32-vc'
elif env['CC'] in ['gcc']:
platform = 'win32-mingw'
@@ -435,12 +435,12 @@ B.init_lib_dict()
Export('env')
+BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
+SConscript(B.root_build_dir+'/source/SConscript')
BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
SConscript(B.root_build_dir+'/intern/SConscript')
BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
SConscript(B.root_build_dir+'/extern/SConscript')
-BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
-SConscript(B.root_build_dir+'/source/SConscript')
# now that we have read all SConscripts, we know what
# libraries will be built. Create list of
@@ -526,6 +526,50 @@ if env['OURPLATFORM']!='darwin':
if len(source)==0:
env.Execute(Mkdir(dir))
scriptinstall.append(env.Install(dir=dir,source=source))
+ if env['WITH_BF_CYCLES']:
+ # cycles python code
+ dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles')
+ source=os.listdir('intern/cycles/blender/addon')
+ if '.svn' in source: source.remove('.svn')
+ if '_svn' in source: source.remove('_svn')
+ if '__pycache__' in source: source.remove('__pycache__')
+ source=['intern/cycles/blender/addon/'+s for s in source]
+ scriptinstall.append(env.Install(dir=dir,source=source))
+
+ # cycles kernel code
+ dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles', 'kernel')
+ source=os.listdir('intern/cycles/kernel')
+ if '.svn' in source: source.remove('.svn')
+ if '_svn' in source: source.remove('_svn')
+ if '__pycache__' in source: source.remove('__pycache__')
+ source.remove('kernel.cpp')
+ source.remove('CMakeLists.txt')
+ source.remove('svm')
+ source.remove('osl')
+ source=['intern/cycles/kernel/'+s for s in source]
+ source.append('intern/cycles/util/util_color.h')
+ source.append('intern/cycles/util/util_math.h')
+ source.append('intern/cycles/util/util_transform.h')
+ source.append('intern/cycles/util/util_types.h')
+ scriptinstall.append(env.Install(dir=dir,source=source))
+ # svm
+ dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles', 'kernel', 'svm')
+ source=os.listdir('intern/cycles/kernel/svm')
+ if '.svn' in source: source.remove('.svn')
+ if '_svn' in source: source.remove('_svn')
+ if '__pycache__' in source: source.remove('__pycache__')
+ source=['intern/cycles/kernel/svm/'+s for s in source]
+ scriptinstall.append(env.Install(dir=dir,source=source))
+
+ # licenses
+ dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles', 'license')
+ source=os.listdir('intern/cycles/doc/license')
+ if '.svn' in source: source.remove('.svn')
+ if '_svn' in source: source.remove('_svn')
+ if '__pycache__' in source: source.remove('__pycache__')
+ source.remove('CMakeLists.txt')
+ source=['intern/cycles/doc/license/'+s for s in source]
+ scriptinstall.append(env.Install(dir=dir,source=source))
if env['WITH_BF_INTERNATIONAL']:
internationalpaths=['release' + os.sep + 'datafiles']
@@ -696,6 +740,9 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
dllsources.append('${LCGDIR}/thumbhandler/lib/BlendThumb.dll')
dllsources.append('${LCGDIR}/thumbhandler/lib/BlendThumb64.dll')
+ if env['WITH_BF_OIIO']:
+ dllsources.append('${LCGDIR}/openimageio/bin/OpenImageIO.dll')
+
dllsources.append('#source/icons/blender.exe.manifest')
windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
diff --git a/build_files/buildbot/config/user-config-i686.py b/build_files/buildbot/config/user-config-i686.py
index 080fd8d6123..eb3e321140f 100644
--- a/build_files/buildbot/config/user-config-i686.py
+++ b/build_files/buildbot/config/user-config-i686.py
@@ -34,7 +34,7 @@ BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH}/
# Don't depend on system's libstdc++
WITH_BF_STATICCXX = True
-BF_CXX_LIB_STATIC = '/usr/lib/gcc/i486-linux-gnu/4.3.2/libstdc++.a'
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/i486-linux-gnu/4.3.4/libstdc++.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = True
@@ -92,9 +92,24 @@ WITH_BF_STATICFFTW3 = True
# JACK
WITH_BF_JACK = True
+# Cycles
+WITH_BF_CYCLES = True
+
+WITH_BF_OIIO = True
+WITH_BF_STATICOIIO = True
+BF_OIIO = '/opt/oiio'
+BF_OIIO_INC = '${BF_OIIO}/include'
+BF_OIIO_LIB_STATIC = '${BF_OIIO_LIBPATH}/libOpenImageIO.a ${BF_OPENEXR}/lib/libIlmImf.a'
+BF_OIIO_LIBPATH = '${BF_OIIO}/lib'
+
+WITH_BF_BOOST = True
+WITH_BF_STATICBOOST = True
+BF_BOOST = '/opt/boost'
+BF_BOOST_INC = '${BF_BOOST}/include'
+BF_BOOST_LIB_STATIC = '${BF_BOOST_LIBPATH}/libboost_filesystem.a ${BF_BOOST_LIBPATH}/libboost_date_time.a ${BF_BOOST_LIBPATH}/libboost_regex.a ${BF_BOOST_LIBPATH}/libboost_system.a ${BF_BOOST_LIBPATH}/libboost_thread.a'
+BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
+
# Compilation and optimization
BF_DEBUG = False
-REL_CFLAGS = []
-REL_CXXFLAGS = []
-REL_CCFLAGS = ['-O2'] # C & C++
+REL_CCFLAGS = ['-O2', '-msse', '-msse2'] # C & C++
PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib32']
diff --git a/build_files/buildbot/config/user-config-player-i686.py b/build_files/buildbot/config/user-config-player-i686.py
index 204732376fa..fc875831223 100644
--- a/build_files/buildbot/config/user-config-player-i686.py
+++ b/build_files/buildbot/config/user-config-player-i686.py
@@ -28,7 +28,7 @@ BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH}/
# Don't depend on system's libstdc++
WITH_BF_STATICCXX = True
-BF_CXX_LIB_STATIC = '/usr/lib/gcc/i486-linux-gnu/4.3.2/libstdc++.a'
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/i486-linux-gnu/4.3.4/libstdc++.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = True
@@ -83,9 +83,10 @@ BF_3DMOUSE_LIBPATH = '${BF_3DMOUSE}/lib32'
# JACK
WITH_BF_JACK = True
+# Motion Tracking
+WITH_BF_LIBMV = False
+
# Compilation and optimization
BF_DEBUG = False
-REL_CFLAGS = []
-REL_CXXFLAGS = []
-REL_CCFLAGS = ['-O2'] # C & C++
+REL_CCFLAGS = ['-O2', '-msse', '-msse2'] # C & C++
PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib32']
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 cc0ba209a44..64dc93608d9 100644
--- a/build_files/buildbot/config/user-config-player-x86_64.py
+++ b/build_files/buildbot/config/user-config-player-x86_64.py
@@ -28,7 +28,7 @@ BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH}/
# Don't depend on system's libstdc++
WITH_BF_STATICCXX = True
-BF_CXX_LIB_STATIC = '/usr/lib/gcc/x86_64-linux-gnu/4.3.2/libstdc++.a'
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/x86_64-linux-gnu/4.3.4/libstdc++.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = True
@@ -83,9 +83,10 @@ BF_3DMOUSE_LIBPATH = '${BF_3DMOUSE}/lib64'
# JACK
WITH_BF_JACK = True
+# Motion Tracking
+WITH_BF_LIBMV = False
+
# Compilation and optimization
BF_DEBUG = False
-REL_CFLAGS = []
-REL_CXXFLAGS = []
-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 4698ffdce15..e7667b6c2ca 100644
--- a/build_files/buildbot/config/user-config-x86_64.py
+++ b/build_files/buildbot/config/user-config-x86_64.py
@@ -34,7 +34,7 @@ BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH}/
# Don't depend on system's libstdc++
WITH_BF_STATICCXX = True
-BF_CXX_LIB_STATIC = '/usr/lib/gcc/x86_64-linux-gnu/4.3.2/libstdc++.a'
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/x86_64-linux-gnu/4.3.4/libstdc++.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = True
@@ -92,9 +92,24 @@ WITH_BF_STATICFFTW3 = True
# JACK
WITH_BF_JACK = True
+# Cycles
+WITH_BF_CYCLES = True
+
+WITH_BF_OIIO = True
+WITH_BF_STATICOIIO = True
+BF_OIIO = '/opt/oiio'
+BF_OIIO_INC = '${BF_OIIO}/include'
+BF_OIIO_LIB_STATIC = '${BF_OIIO_LIBPATH}/libOpenImageIO.a ${BF_OPENEXR}/lib/libIlmImf.a'
+BF_OIIO_LIBPATH = '${BF_OIIO}/lib'
+
+WITH_BF_BOOST = True
+WITH_BF_STATICBOOST = True
+BF_BOOST = '/opt/boost'
+BF_BOOST_INC = '${BF_BOOST}/include'
+BF_BOOST_LIB_STATIC = '${BF_BOOST_LIBPATH}/libboost_filesystem.a ${BF_BOOST_LIBPATH}/libboost_date_time.a ${BF_BOOST_LIBPATH}/libboost_regex.a ${BF_BOOST_LIBPATH}/libboost_system.a ${BF_BOOST_LIBPATH}/libboost_thread.a'
+BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
+
# Compilation and optimization
BF_DEBUG = False
-REL_CFLAGS = []
-REL_CXXFLAGS = []
-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/Modules/FindOpenImageIO.cmake b/build_files/cmake/Modules/FindOpenImageIO.cmake
new file mode 100644
index 00000000000..7512b93e09e
--- /dev/null
+++ b/build_files/cmake/Modules/FindOpenImageIO.cmake
@@ -0,0 +1,70 @@
+# - Find OpenImageIO library
+# Find the native OpenImageIO includes and library
+# This module defines
+# OPENIMAGEIO_INCLUDE_DIRS, where to find openimageio.h, Set when
+# OPENIMAGEIO_INCLUDE_DIR is found.
+# OPENIMAGEIO_LIBRARIES, libraries to link against to use OpenImageIO.
+# OPENIMAGEIO_ROOT_DIR, The base directory to search for OpenImageIO.
+# This can also be an environment variable.
+# OPENIMAGEIO_FOUND, If false, do not try to use OpenImageIO.
+#
+# also defined, but not for general use are
+# OPENIMAGEIO_LIBRARY, where to find the OpenImageIO library.
+
+#=============================================================================
+# Copyright 2011 Blender Foundation.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+
+# If OPENIMAGEIO_ROOT_DIR was defined in the environment, use it.
+IF(NOT OPENIMAGEIO_ROOT_DIR AND NOT $ENV{OPENIMAGEIO_ROOT_DIR} STREQUAL "")
+ SET(OPENIMAGEIO_ROOT_DIR $ENV{OPENIMAGEIO_ROOT_DIR})
+ENDIF()
+
+SET(_openimageio_SEARCH_DIRS
+ ${OPENIMAGEIO_ROOT_DIR}
+ /usr/local
+ /sw # Fink
+ /opt/local # DarwinPorts
+ /opt/csw # Blastwave
+)
+
+FIND_PATH(OPENIMAGEIO_INCLUDE_DIR
+ NAMES
+ OpenImageIO/imageio.h
+ HINTS
+ ${_openimageio_SEARCH_DIRS}
+ PATH_SUFFIXES
+ include
+)
+
+FIND_LIBRARY(OPENIMAGEIO_LIBRARY
+ NAMES
+ OpenImageIO
+ HINTS
+ ${_openimageio_SEARCH_DIRS}
+ PATH_SUFFIXES
+ lib64 lib
+ )
+
+# handle the QUIETLY and REQUIRED arguments and set OPENIMAGEIO_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenImageIO DEFAULT_MSG
+ OPENIMAGEIO_LIBRARY OPENIMAGEIO_INCLUDE_DIR)
+
+IF(OPENIMAGEIO_FOUND)
+ SET(OPENIMAGEIO_LIBRARIES ${OPENIMAGEIO_LIBRARY})
+ SET(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO_INCLUDE_DIR})
+ENDIF(OPENIMAGEIO_FOUND)
+
+MARK_AS_ADVANCED(
+ OPENIMAGEIO_INCLUDE_DIR
+ OPENIMAGEIO_LIBRARY
+)
diff --git a/build_files/cmake/cmake_consistency_check.py b/build_files/cmake/cmake_consistency_check.py
index b1fc88bfe26..be68455a113 100755
--- a/build_files/cmake/cmake_consistency_check.py
+++ b/build_files/cmake/cmake_consistency_check.py
@@ -93,6 +93,9 @@ def cmake_get_src(f):
# print(f)
def is_definition(l, f, i, name):
+ if l.startswith("unset("):
+ return False
+
if ('set(%s' % name) in l or ('set(' in l and l.endswith(name)):
if len(l.split()) > 1:
raise Exception("strict formatting not kept 'set(%s*' %s:%d" % (name, f, i))
@@ -172,6 +175,12 @@ def cmake_get_src(f):
pass
elif new_file.endswith(".def"):
pass
+ elif new_file.endswith(".cl"): # opencl
+ pass
+ elif new_file.endswith(".cu"): # cuda
+ pass
+ elif new_file.endswith(".osl"): # open shading language
+ pass
else:
raise Exception("unknown file type - not c or h %s -> %s" % (f, new_file))
diff --git a/build_files/cmake/cmake_netbeans_project.py b/build_files/cmake/cmake_netbeans_project.py
index 769b4adb37b..45c19adff36 100755
--- a/build_files/cmake/cmake_netbeans_project.py
+++ b/build_files/cmake/cmake_netbeans_project.py
@@ -39,6 +39,7 @@ from project_info import (SIMPLE_PROJECTFILE,
# is_py,
cmake_advanced_info,
cmake_compiler_defines,
+ project_name_get,
)
@@ -59,7 +60,11 @@ def create_nb_project_main():
includes = list(set(includes) | set(dirname(f) for f in files if is_c_header(f)))
includes.sort()
- PROJECT_NAME = "Blender"
+ if 0:
+ PROJECT_NAME = "Blender"
+ else:
+ # be tricky, get the project name from SVN if we can!
+ PROJECT_NAME = project_name_get(SOURCE_DIR)
# --------------- NB spesific
defines = [("%s=%s" % cdef) if cdef[1] else cdef[0] for cdef in defines]
diff --git a/build_files/cmake/config/blender_lite.cmake b/build_files/cmake/config/blender_lite.cmake
index 0da28a943eb..4f04960d5e3 100644
--- a/build_files/cmake/config/blender_lite.cmake
+++ b/build_files/cmake/config/blender_lite.cmake
@@ -12,6 +12,7 @@ set(WITH_BUILTIN_GLEW OFF CACHE FORCE BOOL)
set(WITH_BULLET OFF CACHE FORCE BOOL)
set(WITH_CODEC_FFMPEG OFF CACHE FORCE BOOL)
set(WITH_CODEC_SNDFILE OFF CACHE FORCE BOOL)
+set(WITH_CYCLES OFF CACHE FORCE BOOL)
set(WITH_FFTW3 OFF CACHE FORCE BOOL)
set(WITH_LIBMV OFF CACHE FORCE BOOL)
set(WITH_GAMEENGINE OFF CACHE FORCE BOOL)
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index c9a04f87148..c6a834050d0 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -272,7 +272,7 @@ macro(setup_liblinks
target_link_libraries(${target} ${BOOST_LIBRARIES})
endif()
if(WITH_IMAGE_OPENEXR)
- if(WIN32 AND NOT UNIX)
+ if(WIN32 AND NOT UNIX AND NOT CMAKE_COMPILER_IS_GNUCC)
file_list_suffix(OPENEXR_LIBRARIES_DEBUG "${OPENEXR_LIBRARIES}" "_d")
target_link_libraries_debug(${target} "${OPENEXR_LIBRARIES_DEBUG}")
target_link_libraries_optimized(${target} "${OPENEXR_LIBRARIES}")
diff --git a/build_files/scons/config/darwin-config.py b/build_files/scons/config/darwin-config.py
index 38c8dca6cd2..02beb80b5b1 100644
--- a/build_files/scons/config/darwin-config.py
+++ b/build_files/scons/config/darwin-config.py
@@ -282,6 +282,21 @@ BF_PCRE_LIBPATH = '${BF_PCRE}/lib'
#BF_EXPAT_LIB = 'expat'
#BF_EXPAT_LIBPATH = '/usr/lib'
+#Cycles
+WITH_BF_CYCLES = True
+
+WITH_BF_OIIO = True
+BF_OIIO = LIBDIR + '/openimageio'
+BF_OIIO_INC = BF_OIIO + '/include'
+BF_OIIO_LIB = 'OpenImageIO'
+BF_OIIO_LIBPATH = BF_OIIO + '/lib'
+
+WITH_BF_BOOST = True
+BF_BOOST = LIBDIR + '/boost'
+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'
+
#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 91f86ae7e80..655054706f5 100644
--- a/build_files/scons/config/linux-config.py
+++ b/build_files/scons/config/linux-config.py
@@ -1,5 +1,12 @@
-LCGDIR = '../lib/linux'
-LIBDIR = "${LCGDIR}"
+# find library directory
+import platform
+import os
+bitness = platform.architecture()[0]
+if bitness == '64bit':
+ LCGDIR = '../lib/linux64'
+else:
+ LCGDIR = '../lib/linux'
+LIBDIR = "#${LCGDIR}"
BF_PYTHON_ABI_FLAGS = 'm' # Most common for linux distros
BF_PYTHON = '/usr'
@@ -113,7 +120,18 @@ WITH_BF_BINRELOC = True
# enable ffmpeg support
WITH_BF_FFMPEG = True # -DWITH_FFMPEG
-BF_FFMPEG = '/usr'
+BF_FFMPEG = LIBDIR + '/ffmpeg'
+if os.path.exists(LCGDIR + '/ffmpeg'):
+ WITH_BF_STATICFFMPEG = True
+ BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH}/libswscale.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libavcodec.a ${BF_FFMPEG_LIBPATH}/libavdevice.a ${BF_FFMPEG_LIBPATH}/libavutil.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libxvidcore.a ${BF_FFMPEG_LIBPATH}/libx264.a ${BF_FFMPEG_LIBPATH}/libmp3lame.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libvpx.a ${BF_FFMPEG_LIBPATH}/libvorbis.a ${BF_FFMPEG_LIBPATH}/libogg.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libvorbisenc.a ${BF_FFMPEG_LIBPATH}/libtheora.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libschroedinger-1.0.a ${BF_FFMPEG_LIBPATH}/liborc-0.4.a ${BF_FFMPEG_LIBPATH}/libdirac_encoder.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libfaad.a'
+else:
+ BF_FFMPEG = '/usr'
BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice'
BF_FFMPEG_INC = '${BF_FFMPEG}/include'
BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
@@ -178,6 +196,26 @@ BF_JEMALLOC_LIBPATH = '${BF_JEMALLOC}/lib'
BF_JEMALLOC_LIB = 'jemalloc'
BF_JEMALLOC_LIB_STATIC = '${BF_JEMALLOC_LIBPATH}/libjemalloc.a'
+WITH_BF_OIIO = True
+BF_OIIO = LIBDIR + '/oiio'
+if not os.path.exists(LCGDIR + '/oiio'):
+ WITH_BF_OIIO = False
+ BF_OIIO = '/usr'
+BF_OIIO_INC = BF_OIIO + '/include'
+BF_OIIO_LIB = 'OpenImageIO'
+BF_OIIO_LIBPATH = BF_OIIO + '/lib'
+
+WITH_BF_BOOST = True
+BF_BOOST = LIBDIR + '/boost'
+if not os.path.exists(LCGDIR + '/boost'):
+ WITH_BF_BOOST = False
+ BF_BOOST = '/usr'
+BF_BOOST_INC = BF_BOOST + '/include'
+BF_BOOST_LIB = 'boost_date_time boost_filesystem boost_regex boost_system boost_thread'
+BF_BOOST_LIBPATH = BF_BOOST + '/lib'
+
+WITH_BF_CYCLES = WITH_BF_OIIO and WITH_BF_BOOST
+
WITH_BF_OPENMP = True
#Ray trace optimization
diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py
index f210ab436b5..e224c08d354 100644
--- a/build_files/scons/config/win32-mingw-config.py
+++ b/build_files/scons/config/win32-mingw-config.py
@@ -17,7 +17,7 @@ BF_OPENAL_INC = '${BF_OPENAL}/include'
BF_OPENAL_LIB = 'wrap_oal'
BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib'
-WITH_BF_FFMPEG = False
+WITH_BF_FFMPEG = True
BF_FFMPEG_LIB = 'avformat-53 avcodec-53 avdevice-53 avutil-51 swscale-2'
BF_FFMPEG_LIBPATH = LIBDIR + '/ffmpeg/lib'
BF_FFMPEG_INC = LIBDIR + '/ffmpeg/include'
@@ -46,11 +46,11 @@ BF_PTHREADS_INC = '${BF_PTHREADS}/include'
BF_PTHREADS_LIB = 'pthreadGC2'
BF_PTHREADS_LIBPATH = '${BF_PTHREADS}/lib'
-WITH_BF_OPENEXR = False # TODO, gives linking problems for the moment.
+WITH_BF_OPENEXR = True
WITH_BF_STATICOPENEXR = False
BF_OPENEXR = LIBDIR + '/gcc/openexr'
BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR'
-BF_OPENEXR_LIB = ' Half IlmImf Iex IlmThread '
+BF_OPENEXR_LIB = 'Half IlmImf Imath IlmThread Iex'
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'
@@ -100,8 +100,8 @@ BF_FFTW3_INC = '${BF_FFTW3}/include'
BF_FFTW3_LIB = 'fftw3'
BF_FFTW3_LIBPATH = '${BF_FFTW3}/lib'
-WITH_BF_GAMEENGINE = False
-WITH_BF_PLAYER = False
+WITH_BF_GAMEENGINE = True
+WITH_BF_PLAYER = True
WITH_BF_BULLET = True
BF_BULLET = '#extern/bullet2/src'
@@ -140,7 +140,7 @@ BF_OPENGL_LIB_STATIC = [ '${BF_OPENGL}/lib/libGL.a', '${BF_OPENGL}/lib/libGLU.a'
'${BF_OPENGL}/lib/libXmu.a', '${BF_OPENGL}/lib/libXext.a',
'${BF_OPENGL}/lib/libX11.a', '${BF_OPENGL}/lib/libXi.a' ]
-WITH_BF_COLLADA = False # TODO, gives linking problems at the moment.
+WITH_BF_COLLADA = True
BF_COLLADA = '#source/blender/collada'
BF_COLLADA_INC = '${BF_COLLADA}'
BF_COLLADA_LIB = 'bf_collada'
@@ -150,8 +150,23 @@ BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}/include'
BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver expat pcre buffer ftoa'
BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib'
+#Cycles
+WITH_BF_CYCLES = True
+
+WITH_BF_OIIO = True
+BF_OIIO = LIBDIR + '/gcc/openimageio'
+BF_OIIO_INC = '#../lib/windows/gcc/openimageio/include'
+BF_OIIO_LIB = 'OpenImageIO'
+BF_OIIO_LIBPATH = '#../lib/windows/gcc/openimageio/lib'
+
+WITH_BF_BOOST = True
+BF_BOOST = LIBDIR + '/boost'
+BF_BOOST_INC = '#../lib/windows/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'
+
#Ray trace optimization
-WITH_BF_RAYOPTIMIZATION = False
+WITH_BF_RAYOPTIMIZATION = True
BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse']
##
@@ -161,7 +176,7 @@ CXX = 'g++'
CCFLAGS = [ '-pipe', '-funsigned-char', '-fno-strict-aliasing' ]
CXXFLAGS = []
-CPPFLAGS = ['-DWIN32', '-DFREE_WINDOWS', '-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE64_SOURCE']
+CPPFLAGS = ['-DWIN32', '-DFREE_WINDOWS', '-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE64_SOURCE', '-DBOOST_ALL_NO_LIB', '-DBOOST_THREAD_USE_LIB', '-DGLEW_STATIC']
REL_CFLAGS = []
REL_CXXFLAGS = []
REL_CCFLAGS = ['-DNDEBUG', '-O2']
@@ -170,9 +185,9 @@ C_WARN = ['-Wno-char-subscripts', '-Wdeclaration-after-statement', '-Wstrict-pro
CC_WARN = [ '-Wall' ]
-LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', '-lwsock32']
+LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', '-lwsock32', '-lpsapi']
-PLATFORM_LINKFLAGS = ['--stack,2097152']
+PLATFORM_LINKFLAGS = ['-Xlinker', '--stack=2097152']
BF_DEBUG = False
BF_DEBUG_CCFLAGS= ['-g', '-D_DEBUG']
diff --git a/build_files/scons/config/win32-vc-config.py b/build_files/scons/config/win32-vc-config.py
index 1e4821180d6..0440093b41a 100644
--- a/build_files/scons/config/win32-vc-config.py
+++ b/build_files/scons/config/win32-vc-config.py
@@ -149,19 +149,20 @@ WITH_BF_3DMOUSE = True
WITH_BF_OPENMP = True
-'''
+#Cycles
+WITH_BF_CYCLES = True
+
WITH_BF_OIIO = True
-BF_OIIO = LIBDIR + '/openimageio'
+BF_OIIO = '${LIBDIR}/openimageio'
BF_OIIO_INC = '${BF_OIIO}/include'
BF_OIIO_LIB = 'OpenImageIO'
BF_OIIO_LIBPATH = '${BF_OIIO}/lib'
WITH_BF_BOOST = True
-BF_BOOST = LIBDIR + '/boost'
+BF_BOOST = '${LIBDIR}/boost'
BF_BOOST_INC = '${BF_BOOST}/include'
-BF_BOOST_LIB = 'libboost_date_time-vc90-mt-s-1_46_1 libboost_filesystem-vc90-mt-s-1_46_1 libboost_regex-vc90-mt-s-1_46_1 libboost_system-vc90-mt-s-1_46_1 libboost_thread-vc90-mt-s-1_46_1'
+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'
-'''
#Ray trace optimization
WITH_BF_RAYOPTIMIZATION = True
diff --git a/build_files/scons/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py
index 0920d9375ae..8c2956666a9 100644
--- a/build_files/scons/config/win64-vc-config.py
+++ b/build_files/scons/config/win64-vc-config.py
@@ -153,19 +153,20 @@ WITH_BF_3DMOUSE = True
WITH_BF_OPENMP = True
-'''
+WITH_BF_CYCLES = True
+
WITH_BF_OIIO = True
-BF_OIIO = LIBDIR + '/openimageio'
+BF_OIIO = '${LIBDIR}/openimageio'
BF_OIIO_INC = '${BF_OIIO}/include'
BF_OIIO_LIB = 'OpenImageIO'
BF_OIIO_LIBPATH = '${BF_OIIO}/lib'
+BF_OIIO_LIBPATH = '${BF_OIIO}/lib'
WITH_BF_BOOST = True
-BF_BOOST = LIBDIR + '/boost'
+BF_BOOST = '${LIBDIR}/boost'
BF_BOOST_INC = '${BF_BOOST}/include'
-BF_BOOST_LIB = 'libboost_date_time-vc90-mt-s-1_45 libboost_filesystem-vc90-mt-s-1_45 libboost_regex-vc90-mt-s-1_45 libboost_system-vc90-mt-s-1_45 libboost_thread-vc90-mt-s-1_45'
+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'
-'''
#Ray trace optimization
WITH_BF_RAYOPTIMIZATION = True
diff --git a/build_files/scons/tools/Blender.py b/build_files/scons/tools/Blender.py
index ae2d5298298..9e967ac5a4d 100644
--- a/build_files/scons/tools/Blender.py
+++ b/build_files/scons/tools/Blender.py
@@ -195,8 +195,13 @@ def setup_staticlibs(lenv):
if lenv['WITH_BF_OIIO']:
libincs += Split(lenv['BF_OIIO_LIBPATH'])
+ if lenv['WITH_BF_STATICOIIO']:
+ statlibs += Split(lenv['BF_OIIO_LIB_STATIC'])
+
if lenv['WITH_BF_BOOST']:
libincs += Split(lenv['BF_BOOST_LIBPATH'])
+ if lenv['WITH_BF_STATICBOOST']:
+ statlibs += Split(lenv['BF_BOOST_LIB_STATIC'])
# setting this last so any overriding of manually libs could be handled
if lenv['OURPLATFORM'] not in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
@@ -216,11 +221,7 @@ def setup_staticlibs(lenv):
return statlibs, libincs
def setup_syslibs(lenv):
- syslibs = [
-
- lenv['BF_JPEG_LIB'],
- lenv['BF_PNG_LIB'],
- ]
+ syslibs = []
if not lenv['WITH_BF_FREETYPE_STATIC']:
syslibs += Split(lenv['BF_FREETYPE_LIB'])
@@ -241,6 +242,10 @@ def setup_syslibs(lenv):
syslibs += ['gomp']
if lenv['WITH_BF_ICONV']:
syslibs += Split(lenv['BF_ICONV_LIB'])
+ if lenv['WITH_BF_OIIO']:
+ if not lenv['WITH_BF_STATICOIIO']:
+ syslibs += Split(lenv['BF_OIIO_LIB'])
+
if lenv['WITH_BF_OPENEXR'] and not lenv['WITH_BF_STATICOPENEXR']:
syslibs += Split(lenv['BF_OPENEXR_LIB'])
if lenv['WITH_BF_TIFF'] and not lenv['WITH_BF_STATICTIFF']:
@@ -279,12 +284,13 @@ def setup_syslibs(lenv):
if lenv['WITH_BF_3DMOUSE']:
if not lenv['WITH_BF_STATIC3DMOUSE']:
syslibs += Split(lenv['BF_3DMOUSE_LIB'])
-
- if lenv['WITH_BF_OIIO']:
- syslibs += Split(lenv['BF_OIIO_LIB'])
- if lenv['WITH_BF_BOOST']:
+
+ if lenv['WITH_BF_BOOST'] and not lenv['WITH_BF_STATICBOOST']:
syslibs += Split(lenv['BF_BOOST_LIB'])
+ syslibs += Split(lenv['BF_JPEG_LIB'])
+ syslibs += Split(lenv['BF_PNG_LIB'])
+
syslibs += lenv['LLIBS']
return syslibs
@@ -550,10 +556,6 @@ def AppIt(target=None, source=None, env=None):
bldroot = env.Dir('.').abspath
binary = env['BINARYKIND']
- if b=='verse':
- print bc.OKBLUE+"no bundle for verse"+bc.ENDC
- return 0
-
sourcedir = bldroot + '/source/darwin/%s.app'%binary
sourceinfo = bldroot + "/source/darwin/%s.app/Contents/Info.plist"%binary
targetinfo = installdir +'/' + "%s.app/Contents/Info.plist"%binary
@@ -582,6 +584,23 @@ def AppIt(target=None, source=None, env=None):
cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/%s/'%(bldroot,installdir,binary,VERSION)
commands.getoutput(cmd)
+ if env['WITH_BF_CYCLES']:
+ croot = '%s/intern/cycles' % (bldroot)
+ cinstalldir = '%s/%s.app/Contents/MacOS/%s/scripts/addons/cycles' % (installdir,binary,VERSION)
+
+ cmd = 'mkdir %s' % (cinstalldir)
+ commands.getoutput(cmd)
+ cmd = 'mkdir %s/kernel' % (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)
+ commands.getoutput(cmd)
+ cmd = 'cp -R %s/kernel/*.h %s/kernel/*.cl %s/kernel/*.cu %s/kernel/' % (croot, croot, croot, cinstalldir)
+ 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)
+
if env['WITH_OSX_STATICPYTHON']:
cmd = 'mkdir %s/%s.app/Contents/MacOS/%s/python/'%(installdir,binary, VERSION)
commands.getoutput(cmd)
diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py
index 5c78dc646bb..417bbcc48ba 100644
--- a/build_files/scons/tools/btools.py
+++ b/build_files/scons/tools/btools.py
@@ -156,8 +156,9 @@ def validate_arguments(args, bc):
'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_OIIO', 'BF_OIIO', 'BF_OIIO_INC', 'BF_OIIO_LIB', 'BF_OIIO_LIBPATH',
- 'WITH_BF_BOOST', 'BF_BOOST', 'BF_BOOST_INC', 'BF_BOOST_LIB', 'BF_BOOST_LIBPATH'
+ 'WITH_BF_CYCLES', 'WITH_BF_CYCLES_BINARIES' 'BF_CYCLES_BINARIES_ARCH',
+ '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'
]
# Have options here that scons expects to be lists
@@ -239,6 +240,7 @@ def read_opts(env, cfg, args):
localopts = Variables.Variables(cfg, args)
localopts.AddVariables(
('LCGDIR', 'location of cvs lib dir'),
+ ('LIBDIR', 'root dir of libs'),
(BoolVariable('WITH_BF_PYTHON', 'Compile with python', True)),
(BoolVariable('WITH_BF_PYTHON_SAFETY', 'Internal API error checking to track invalid data to prevent crash on access (at the expense of some effeciency)', False)),
('BF_PYTHON', 'Base path for python', ''),
@@ -536,16 +538,26 @@ def read_opts(env, cfg, args):
(BoolVariable('WITH_BF_CXX_GUARDEDALLOC', 'Enable GuardedAlloc for C++ memory allocation tracking.', False)),
('BUILDBOT_BRANCH', 'Buildbot branch name', ''),
-
+ ) # end of opts.AddOptions()
+
+ localopts.AddVariables(
+ (BoolVariable('WITH_BF_CYCLES', 'Build with the Cycles engine', True)),
+
(BoolVariable('WITH_BF_OIIO', 'Build with OpenImageIO', False)),
+ (BoolVariable('WITH_BF_STATICOIIO', 'Staticly link to OpenImageIO', False)),
+ ('BF_OIIO', 'OIIO root path', ''),
('BF_OIIO_INC', 'OIIO include path', ''),
('BF_OIIO_LIB', 'OIIO library', ''),
('BF_OIIO_LIBPATH', 'OIIO library path', ''),
-
+ ('BF_OIIO_LIB_STATIC', 'OIIO static library', ''),
+
(BoolVariable('WITH_BF_BOOST', 'Build with Boost', False)),
+ (BoolVariable('WITH_BF_STATICBOOST', 'Staticly link to boost', False)),
+ ('BF_BOOST', 'Boost root path', ''),
('BF_BOOST_INC', 'Boost include path', ''),
('BF_BOOST_LIB', 'Boost library', ''),
- ('BF_BOOST_LIBPATH', 'Boost library path', '')
+ ('BF_BOOST_LIBPATH', 'Boost library path', ''),
+ ('BF_BOOST_LIB_STATIC', 'Boost static library', '')
) # end of opts.AddOptions()
return localopts
diff --git a/build_files/scons/tools/mstoolkit.py b/build_files/scons/tools/mstoolkit.py
index 4eeefa5ed9d..68e8c4b6475 100644
--- a/build_files/scons/tools/mstoolkit.py
+++ b/build_files/scons/tools/mstoolkit.py
@@ -49,198 +49,198 @@ CSuffixes = ['.c', '.C']
CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
def get_msvctoolkit_paths():
- """Return a 4-tuple of (INCLUDE, LIB, PATH, TOOLKIT) as the values of those
- three environment variables that should be set in order to execute
- the MSVC .NET tools properly, if the information wasn't available
- from the registry."""
-
- MSToolkitDir = None
- paths = {}
- exe_path = ''
- lib_path = ''
- include_path = ''
-
- # First, we get the shell folder for this user:
- if not SCons.Util.can_read_reg:
- raise SCons.Errors.InternalError, "No Windows registry module was found"
-
- # look for toolkit
- if os.environ.has_key('VCToolkitInstallDir'):
- MSToolkitDir = os.path.normpath(os.environ['VCToolkitInstallDir'])
- else:
- # last resort -- default install location
- MSToolkitDir = r'C:\Program Files\Microsoft Visual C++ Toolkit 2003'
-
- # look for platform sdk
- if os.environ.has_key('MSSdk'):
- PlatformSDKDir = os.path.normpath(os.environ['MSSdk'])
- else:
- try:
- PlatformSDKDir = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\MicrosoftSDK\Directories\Install Dir')[0]
- PlatformSDKDir = str(PlatformSDKDir)
- except SCons.Util.RegError:
- raise SCons.Errors.InternalError, "The Platform SDK directory was not found in the registry or in the `MSSdk` environment variable."
-
- # look for DX Sdk (expecting DX9)
- # dxsdk docs have a directory key, look for it, extract path
- #dxsdkdocs = ""
- DXsdkDir = ""
- #try:
- # dxsdkdocs = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\DirectX SDK\DX9SDK Doc Path')
- #except SCons.Util.RegError:
- # raise SCons.Errors.InternalError, "The DXSDK directory was not found in the registry."
- if os.environ.has_key('DXSDK_DIR'):
- DXsdkDir = os.path.normpath(os.environ['DXSDK_DIR'])
-
- #DXsdkDir = os.path.split(dxsdkdocs[0])[0]
- DXsdkDir = os.path.split(DXsdkDir)[0]
-
- include_path = r'%s\include;%s\include;%s\include' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
- lib_path = r'%s\lib;%s\lib;%s\lib' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
- exe_path = r'%s\bin;%s\bin\win95;%s\bin' % (MSToolkitDir, PlatformSDKDir, PlatformSDKDir)
- return (include_path, lib_path, exe_path, PlatformSDKDir)
+ """Return a 4-tuple of (INCLUDE, LIB, PATH, TOOLKIT) as the values of those
+ three environment variables that should be set in order to execute
+ the MSVC .NET tools properly, if the information wasn't available
+ from the registry."""
+
+ MSToolkitDir = None
+ paths = {}
+ exe_path = ''
+ lib_path = ''
+ include_path = ''
+
+ # First, we get the shell folder for this user:
+ if not SCons.Util.can_read_reg:
+ raise SCons.Errors.InternalError, "No Windows registry module was found"
+
+ # look for toolkit
+ if os.environ.has_key('VCToolkitInstallDir'):
+ MSToolkitDir = os.path.normpath(os.environ['VCToolkitInstallDir'])
+ else:
+ # last resort -- default install location
+ MSToolkitDir = r'C:\Program Files\Microsoft Visual C++ Toolkit 2003'
+
+ # look for platform sdk
+ if os.environ.has_key('MSSdk'):
+ PlatformSDKDir = os.path.normpath(os.environ['MSSdk'])
+ else:
+ try:
+ PlatformSDKDir = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\MicrosoftSDK\Directories\Install Dir')[0]
+ PlatformSDKDir = str(PlatformSDKDir)
+ except SCons.Util.RegError:
+ raise SCons.Errors.InternalError, "The Platform SDK directory was not found in the registry or in the `MSSdk` environment variable."
+
+ # look for DX Sdk (expecting DX9)
+ # dxsdk docs have a directory key, look for it, extract path
+ #dxsdkdocs = ""
+ DXsdkDir = ""
+ #try:
+ # dxsdkdocs = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\DirectX SDK\DX9SDK Doc Path')
+ #except SCons.Util.RegError:
+ # raise SCons.Errors.InternalError, "The DXSDK directory was not found in the registry."
+ if os.environ.has_key('DXSDK_DIR'):
+ DXsdkDir = os.path.normpath(os.environ['DXSDK_DIR'])
+
+ #DXsdkDir = os.path.split(dxsdkdocs[0])[0]
+ DXsdkDir = os.path.split(DXsdkDir)[0]
+
+ include_path = r'%s\include;%s\include;%s\include' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
+ lib_path = r'%s\lib;%s\lib;%s\lib' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
+ exe_path = r'%s\bin;%s\bin\win95;%s\bin' % (MSToolkitDir, PlatformSDKDir, PlatformSDKDir)
+ return (include_path, lib_path, exe_path, PlatformSDKDir)
def validate_vars(env):
- """Validate the PDB, PCH, and PCHSTOP construction variables."""
- if env.has_key('PCH') and env['PCH']:
- if not env.has_key('PCHSTOP'):
- raise SCons.Errors.UserError, "The PCHSTOP construction must be defined if PCH is defined."
- if not SCons.Util.is_String(env['PCHSTOP']):
- raise SCons.Errors.UserError, "The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP']
+ """Validate the PDB, PCH, and PCHSTOP construction variables."""
+ if env.has_key('PCH') and env['PCH']:
+ if not env.has_key('PCHSTOP'):
+ raise SCons.Errors.UserError, "The PCHSTOP construction must be defined if PCH is defined."
+ if not SCons.Util.is_String(env['PCHSTOP']):
+ raise SCons.Errors.UserError, "The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP']
def pch_emitter(target, source, env):
- """Sets up the PDB dependencies for a pch file, and adds the object
- file target."""
+ """Sets up the PDB dependencies for a pch file, and adds the object
+ file target."""
- validate_vars(env)
+ validate_vars(env)
- pch = None
- obj = None
+ pch = None
+ obj = None
- for t in target:
- if SCons.Util.splitext(str(t))[1] == '.pch':
- pch = t
- if SCons.Util.splitext(str(t))[1] == '.obj':
- obj = t
+ for t in target:
+ if SCons.Util.splitext(str(t))[1] == '.pch':
+ pch = t
+ if SCons.Util.splitext(str(t))[1] == '.obj':
+ obj = t
- if not obj:
- obj = SCons.Util.splitext(str(pch))[0]+'.obj'
+ if not obj:
+ obj = SCons.Util.splitext(str(pch))[0]+'.obj'
- target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
+ target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
- if env.has_key('PDB') and env['PDB']:
- env.SideEffect(env['PDB'], target)
- env.Precious(env['PDB'])
+ if env.has_key('PDB') and env['PDB']:
+ env.SideEffect(env['PDB'], target)
+ env.Precious(env['PDB'])
- return (target, source)
+ return (target, source)
def object_emitter(target, source, env, parent_emitter):
- """Sets up the PDB and PCH dependencies for an object file."""
+ """Sets up the PDB and PCH dependencies for an object file."""
- validate_vars(env)
+ validate_vars(env)
- parent_emitter(target, source, env)
+ parent_emitter(target, source, env)
- if env.has_key('PDB') and env['PDB']:
- env.SideEffect(env['PDB'], target)
- env.Precious(env['PDB'])
+ if env.has_key('PDB') and env['PDB']:
+ env.SideEffect(env['PDB'], target)
+ env.Precious(env['PDB'])
- if env.has_key('PCH') and env['PCH']:
- env.Depends(target, env['PCH'])
+ if env.has_key('PCH') and env['PCH']:
+ env.Depends(target, env['PCH'])
- return (target, source)
+ return (target, source)
def static_object_emitter(target, source, env):
- return object_emitter(target, source, env,
- SCons.Defaults.StaticObjectEmitter)
+ return object_emitter(target, source, env,
+ SCons.Defaults.StaticObjectEmitter)
def shared_object_emitter(target, source, env):
- return object_emitter(target, source, env,
- SCons.Defaults.SharedObjectEmitter)
+ return object_emitter(target, source, env,
+ SCons.Defaults.SharedObjectEmitter)
pch_builder = SCons.Builder.Builder(action='$PCHCOM', suffix='.pch', emitter=pch_emitter)
res_builder = SCons.Builder.Builder(action='$RCCOM', suffix='.res')
def pdbGenerator(env, target, source, for_signature):
- if target and env.has_key('PDB') and env['PDB']:
- return ['/PDB:%s'%target[0].File(env['PDB']).get_string(for_signature),
- '/DEBUG']
+ if target and env.has_key('PDB') and env['PDB']:
+ return ['/PDB:%s'%target[0].File(env['PDB']).get_string(for_signature),
+ '/DEBUG']
def win32ShlinkTargets(target, source, env, for_signature):
- listCmd = []
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
+ listCmd = []
+ dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
- implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
- if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
+ implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
+ if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
- return listCmd
+ return listCmd
def win32ShlinkSources(target, source, env, for_signature):
- listCmd = []
-
- deffile = env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX")
- for src in source:
- if src == deffile:
- # Treat this source as a .def file.
- listCmd.append("/def:%s" % src.get_string(for_signature))
- else:
- # Just treat it as a generic source file.
- listCmd.append(src)
- return listCmd
+ listCmd = []
+
+ deffile = env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX")
+ for src in source:
+ if src == deffile:
+ # Treat this source as a .def file.
+ listCmd.append("/def:%s" % src.get_string(for_signature))
+ else:
+ # Just treat it as a generic source file.
+ listCmd.append(src)
+ return listCmd
def win32LibEmitter(target, source, env):
- # SCons.Tool.msvc.validate_vars(env)
+ # SCons.Tool.msvc.validate_vars(env)
- dll = env.FindIxes(target, "SHLIBPREFIX", "SHLIBSUFFIX")
- no_import_lib = env.get('no_import_lib', 0)
+ dll = env.FindIxes(target, "SHLIBPREFIX", "SHLIBSUFFIX")
+ no_import_lib = env.get('no_import_lib', 0)
- if not dll:
- raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")
+ if not dll:
+ raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")
- if env.get("WIN32_INSERT_DEF", 0) and \
- not env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX"):
+ if env.get("WIN32_INSERT_DEF", 0) and \
+ not env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX"):
- # append a def file to the list of sources
- source.append(env.ReplaceIxes(dll,
- "SHLIBPREFIX", "SHLIBSUFFIX",
- "WIN32DEFPREFIX", "WIN32DEFSUFFIX"))
+ # append a def file to the list of sources
+ source.append(env.ReplaceIxes(dll,
+ "SHLIBPREFIX", "SHLIBSUFFIX",
+ "WIN32DEFPREFIX", "WIN32DEFSUFFIX"))
- if env.has_key('PDB') and env['PDB']:
- env.SideEffect(env['PDB'], target)
- env.Precious(env['PDB'])
+ if env.has_key('PDB') and env['PDB']:
+ env.SideEffect(env['PDB'], target)
+ env.Precious(env['PDB'])
- if not no_import_lib and \
- not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
- # Append an import library to the list of targets.
- target.append(env.ReplaceIxes(dll,
- "SHLIBPREFIX", "SHLIBSUFFIX",
- "LIBPREFIX", "LIBSUFFIX"))
- # and .exp file is created if there are exports from a DLL
- target.append(env.ReplaceIxes(dll,
- "SHLIBPREFIX", "SHLIBSUFFIX",
- "WIN32EXPPREFIX", "WIN32EXPSUFFIX"))
+ if not no_import_lib and \
+ not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
+ # Append an import library to the list of targets.
+ target.append(env.ReplaceIxes(dll,
+ "SHLIBPREFIX", "SHLIBSUFFIX",
+ "LIBPREFIX", "LIBSUFFIX"))
+ # and .exp file is created if there are exports from a DLL
+ target.append(env.ReplaceIxes(dll,
+ "SHLIBPREFIX", "SHLIBSUFFIX",
+ "WIN32EXPPREFIX", "WIN32EXPSUFFIX"))
- return (target, source)
+ return (target, source)
def prog_emitter(target, source, env):
- #SCons.Tool.msvc.validate_vars(env)
+ #SCons.Tool.msvc.validate_vars(env)
- if env.has_key('PDB') and env['PDB']:
- env.SideEffect(env['PDB'], target)
- env.Precious(env['PDB'])
+ if env.has_key('PDB') and env['PDB']:
+ env.SideEffect(env['PDB'], target)
+ env.Precious(env['PDB'])
- return (target,source)
+ return (target,source)
def RegServerFunc(target, source, env):
- if env.has_key('register') and env['register']:
- ret = regServerAction([target[0]], [source[0]], env)
- if ret:
- raise SCons.Errors.UserError, "Unable to register %s" % target[0]
- else:
- print "Registered %s sucessfully" % target[0]
- return ret
- return 0
+ if env.has_key('register') and env['register']:
+ ret = regServerAction([target[0]], [source[0]], env)
+ if ret:
+ raise SCons.Errors.UserError, "Unable to register %s" % target[0]
+ else:
+ print "Registered %s sucessfully" % target[0]
+ return ret
+ return 0
regServerAction = SCons.Action.Action("$REGSVRCOM")
regServerCheck = SCons.Action.Action(RegServerFunc, None)
@@ -248,106 +248,106 @@ shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK
compositeLinkAction = shlibLinkAction + regServerCheck
def generate(env):
- """Add Builders and construction variables for MSVC++ to an Environment."""
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in CSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.CAction)
- shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
-
- for suffix in CXXSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.CXXAction)
- shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
-
- SCons.Tool.createStaticLibBuilder(env)
- SCons.Tool.createSharedLibBuilder(env)
- SCons.Tool.createProgBuilder(env)
-
- env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Zi /Fd%s"%File(PDB)) or ""}'])
- env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'])
- env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET $CCPCHFLAGS $CCPDBFLAGS'
- env['CC'] = 'cl'
- env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
- env['CCCOM'] = '$CC $CCFLAGS $CCCOMFLAGS'
- env['SHCC'] = '$CC'
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
- env['SHCCCOM'] = '$SHCC $SHCCFLAGS $CCCOMFLAGS'
- env['CXX'] = '$CC'
- env['CXXFLAGS'] = SCons.Util.CLVar('$CCFLAGS $( /TP $)')
- env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS'
- env['SHCXX'] = '$CXX'
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
- env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
- env['CPPDEFPREFIX'] = '/D'
- env['CPPDEFSUFFIX'] = ''
- env['INCPREFIX'] = '/I'
- env['INCSUFFIX'] = ''
- env['OBJEMITTER'] = static_object_emitter
- env['SHOBJEMITTER'] = shared_object_emitter
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
-
- env['RC'] = 'rc'
- env['RCFLAGS'] = SCons.Util.CLVar('')
- env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
- CScan = env.get_scanner('.c')
- if CScan:
- CScan.add_skey('.rc')
- env['BUILDERS']['RES'] = res_builder
-
- include_path, lib_path, exe_path, sdk_path = get_msvctoolkit_paths()
- env.PrependENVPath('INCLUDE', include_path)
- env.PrependENVPath('LIB', lib_path)
- env.PrependENVPath('PATH', exe_path)
-
- env['ENV']['CPU'] = 'i386'
- env['ENV']['MSSDK'] = sdk_path
- env['ENV']['BkOffice'] = sdk_path
- env['ENV']['Basemake'] = sdk_path + "\\Include\\BKOffice.Mak"
- env['ENV']['INETSDK'] = sdk_path
- env['ENV']['MSSDK'] = sdk_path
- env['ENV']['MSTOOLS'] = sdk_path
- env['ENV']['TARGETOS'] = 'WINNT'
- env['ENV']['APPVER'] = '5.0'
-
- env['CFILESUFFIX'] = '.c'
- env['CXXFILESUFFIX'] = '.cc'
-
- env['PCHCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo${TARGETS[1]} /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS'
- env['BUILDERS']['PCH'] = pch_builder
-
- env['AR'] = 'lib.exe' #'"' +sdk_path + '\\bin\\Win64\\lib.exe"'
- env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
- env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}"
-
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
- env['_SHLINK_TARGETS'] = win32ShlinkTargets
- env['_SHLINK_SOURCES'] = win32ShlinkSources
- env['SHLINKCOM'] = compositeLinkAction
- env['SHLIBEMITTER']= win32LibEmitter
- env['LINK'] = 'link.exe' #'"' +sdk_path + '\\bin\\Win64\\' + 'link.exe"'
- env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
- env['_PDB'] = pdbGenerator
- env["TEMPFILE"] = SCons.Platform.win32.TempFileMunge
- env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET $( $_LIBDIRFLAGS $) $_LIBFLAGS $_PDB $SOURCES")}'
- env['PROGEMITTER'] = prog_emitter
- env['LIBDIRPREFIX']='/LIBPATH:'
- env['LIBDIRSUFFIX']=''
- env['LIBLINKPREFIX']=''
- env['LIBLINKSUFFIX']='$LIBSUFFIX'
-
- env['WIN32DEFPREFIX'] = ''
- env['WIN32DEFSUFFIX'] = '.def'
- env['WIN32_INSERT_DEF'] = 0
-
- env['WIN32EXPPREFIX'] = ''
- env['WIN32EXPSUFFIX'] = '.exp'
-
- env['REGSVRACTION'] = regServerCheck
- env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
- env['REGSVRFLAGS'] = '/s '
- env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS $TARGET'
+ """Add Builders and construction variables for MSVC++ to an Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in CSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.CAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
+
+ for suffix in CXXSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.CXXAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
+
+ SCons.Tool.createStaticLibBuilder(env)
+ SCons.Tool.createSharedLibBuilder(env)
+ SCons.Tool.createProgBuilder(env)
+
+ env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Zi /Fd%s"%File(PDB)) or ""}'])
+ env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'])
+ env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET $CCPCHFLAGS $CCPDBFLAGS'
+ env['CC'] = 'cl'
+ env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['CCCOM'] = '$CC $CCFLAGS $CCCOMFLAGS'
+ env['SHCC'] = '$CC'
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+ env['SHCCCOM'] = '$SHCC $SHCCFLAGS $CCCOMFLAGS'
+ env['CXX'] = '$CC'
+ env['CXXFLAGS'] = SCons.Util.CLVar('$CCFLAGS $( /TP $)')
+ env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS'
+ env['SHCXX'] = '$CXX'
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+ env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
+ env['CPPDEFPREFIX'] = '/D'
+ env['CPPDEFSUFFIX'] = ''
+ env['INCPREFIX'] = '/I'
+ env['INCSUFFIX'] = ''
+ env['OBJEMITTER'] = static_object_emitter
+ env['SHOBJEMITTER'] = shared_object_emitter
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+ env['RC'] = 'rc'
+ env['RCFLAGS'] = SCons.Util.CLVar('')
+ env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
+ CScan = env.get_scanner('.c')
+ if CScan:
+ CScan.add_skey('.rc')
+ env['BUILDERS']['RES'] = res_builder
+
+ include_path, lib_path, exe_path, sdk_path = get_msvctoolkit_paths()
+ env.PrependENVPath('INCLUDE', include_path)
+ env.PrependENVPath('LIB', lib_path)
+ env.PrependENVPath('PATH', exe_path)
+
+ env['ENV']['CPU'] = 'i386'
+ env['ENV']['MSSDK'] = sdk_path
+ env['ENV']['BkOffice'] = sdk_path
+ env['ENV']['Basemake'] = sdk_path + "\\Include\\BKOffice.Mak"
+ env['ENV']['INETSDK'] = sdk_path
+ env['ENV']['MSSDK'] = sdk_path
+ env['ENV']['MSTOOLS'] = sdk_path
+ env['ENV']['TARGETOS'] = 'WINNT'
+ env['ENV']['APPVER'] = '5.0'
+
+ env['CFILESUFFIX'] = '.c'
+ env['CXXFILESUFFIX'] = '.cc'
+
+ env['PCHCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo${TARGETS[1]} /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS'
+ env['BUILDERS']['PCH'] = pch_builder
+
+ env['AR'] = 'lib.exe' #'"' +sdk_path + '\\bin\\Win64\\lib.exe"'
+ env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}"
+
+ env['SHLINK'] = '$LINK'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
+ env['_SHLINK_TARGETS'] = win32ShlinkTargets
+ env['_SHLINK_SOURCES'] = win32ShlinkSources
+ env['SHLINKCOM'] = compositeLinkAction
+ env['SHLIBEMITTER']= win32LibEmitter
+ env['LINK'] = 'link.exe' #'"' +sdk_path + '\\bin\\Win64\\' + 'link.exe"'
+ env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['_PDB'] = pdbGenerator
+ env["TEMPFILE"] = SCons.Platform.win32.TempFileMunge
+ env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET $( $_LIBDIRFLAGS $) $_LIBFLAGS $_PDB $SOURCES")}'
+ env['PROGEMITTER'] = prog_emitter
+ env['LIBDIRPREFIX']='/LIBPATH:'
+ env['LIBDIRSUFFIX']=''
+ env['LIBLINKPREFIX']=''
+ env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+ env['WIN32DEFPREFIX'] = ''
+ env['WIN32DEFSUFFIX'] = '.def'
+ env['WIN32_INSERT_DEF'] = 0
+
+ env['WIN32EXPPREFIX'] = ''
+ env['WIN32EXPSUFFIX'] = '.exp'
+
+ env['REGSVRACTION'] = regServerCheck
+ env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
+ env['REGSVRFLAGS'] = '/s '
+ env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS $TARGET'
def exists(env):
- return env.Detect('cl')
+ return env.Detect('cl')
diff --git a/intern/CMakeLists.txt b/intern/CMakeLists.txt
index 7a663ec9335..0f7672595d7 100644
--- a/intern/CMakeLists.txt
+++ b/intern/CMakeLists.txt
@@ -57,3 +57,8 @@ endif()
if(WITH_IK_ITASC)
add_subdirectory(itasc)
endif()
+
+if(WITH_CYCLES)
+ add_subdirectory(cycles)
+endif()
+
diff --git a/intern/SConscript b/intern/SConscript
index da245c78776..c13714543cb 100644
--- a/intern/SConscript
+++ b/intern/SConscript
@@ -24,6 +24,9 @@ NEW_CSG='false'
if env['WITH_BF_FLUID']:
SConscript(['elbeem/SConscript'])
+
+if env['WITH_BF_CYCLES']:
+ SConscript(['cycles/SConscript'])
if NEW_CSG=='false':
SConscript(['bsp/SConscript'])
diff --git a/intern/audaspace/CMakeLists.txt b/intern/audaspace/CMakeLists.txt
index 0c4df1ce392..c3a4c130f88 100644
--- a/intern/audaspace/CMakeLists.txt
+++ b/intern/audaspace/CMakeLists.txt
@@ -98,7 +98,6 @@ set(SRC
intern/AUD_IWriter.h
intern/AUD_JOSResampleFactory.cpp
intern/AUD_JOSResampleFactory.h
- intern/AUD_JOSResampleReaderCoeff.cpp
intern/AUD_JOSResampleReader.cpp
intern/AUD_JOSResampleReader.h
intern/AUD_LinearResampleFactory.cpp
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
index 0c550ce3b60..6553073c54e 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
@@ -395,7 +395,7 @@ void AUD_FFMPEGReader::read(int& length, bool& eos, sample_t* buffer)
{
data_size = AUD_MIN(pkgbuf_pos, left * sample_size);
m_convert((data_t*) buf, (data_t*) m_pkgbuf.getBuffer(),
- data_size / AUD_FORMAT_SIZE(m_specs.format));
+ data_size / AUD_FORMAT_SIZE(m_specs.format));
buf += data_size / AUD_FORMAT_SIZE(m_specs.format);
left -= data_size/sample_size;
}
diff --git a/intern/audaspace/intern/AUD_ConverterReader.cpp b/intern/audaspace/intern/AUD_ConverterReader.cpp
index 14bb46f3b38..63178f316b2 100644
--- a/intern/audaspace/intern/AUD_ConverterReader.cpp
+++ b/intern/audaspace/intern/AUD_ConverterReader.cpp
@@ -73,5 +73,5 @@ void AUD_ConverterReader::read(int& length, bool& eos, sample_t* buffer)
m_reader->read(length, eos, m_buffer.getBuffer());
m_convert((data_t*)buffer, (data_t*)m_buffer.getBuffer(),
- length * specs.channels);
+ length * specs.channels);
}
diff --git a/intern/boolop/intern/BOP_Face2Face.cpp b/intern/boolop/intern/BOP_Face2Face.cpp
index 332b70550ed..de9fa7b8508 100644
--- a/intern/boolop/intern/BOP_Face2Face.cpp
+++ b/intern/boolop/intern/BOP_Face2Face.cpp
@@ -167,39 +167,41 @@ void BOP_Face2Face(BOP_Mesh *mesh, BOP_Faces *facesA, BOP_Faces *facesB)
MT_Point3 p2 = mesh->getVertex(faceA->getVertex(1))->getPoint();
MT_Point3 p3 = mesh->getVertex(faceA->getVertex(2))->getPoint();
- /* get (or create) bounding box for face A */
+ /* get (or create) bounding box for face A */
if( faceA->getBBox() == NULL )
- faceA->setBBox(p1,p2,p3);
+ faceA->setBBox(p1,p2,p3);
BOP_BBox *boxA = faceA->getBBox();
/* start checking B faces with the previously stored split index */
for(unsigned int idxFaceB=faceA->getSplit();
- idxFaceB<facesB->size() && (faceA->getTAG() != BROKEN) && (faceA->getTAG() != PHANTOM);) {
+ idxFaceB<facesB->size() && (faceA->getTAG() != BROKEN) && (faceA->getTAG() != PHANTOM);) {
BOP_Face *faceB = (*facesB)[idxFaceB];
faceA->setSplit(idxFaceB);
if ((faceB->getTAG() != BROKEN) && (faceB->getTAG() != PHANTOM)) {
- /* get (or create) bounding box for face B */
- if( faceB->getBBox() == NULL )
- faceB->setBBox(mesh->getVertex(faceB->getVertex(0))->getPoint(),
- mesh->getVertex(faceB->getVertex(1))->getPoint(),
- mesh->getVertex(faceB->getVertex(2))->getPoint());
- BOP_BBox *boxB = faceB->getBBox();
+ /* get (or create) bounding box for face B */
+ if( faceB->getBBox() == NULL ) {
+ faceB->setBBox(mesh->getVertex(faceB->getVertex(0))->getPoint(),
+ mesh->getVertex(faceB->getVertex(1))->getPoint(),
+ mesh->getVertex(faceB->getVertex(2))->getPoint());
+ }
+ BOP_BBox *boxB = faceB->getBBox();
- if (boxA->intersect(*boxB)) {
- MT_Plane3 planeB = faceB->getPlane();
- if (BOP_containsPoint(planeB,p1) &&
- BOP_containsPoint(planeB,p2) &&
- BOP_containsPoint(planeB,p3)) {
- if (BOP_orientation(planeB,planeA)>0) {
- BOP_intersectCoplanarFaces(mesh,facesB,faceA,faceB,false);
- }
- }
- else {
- BOP_intersectNonCoplanarFaces(mesh,facesA,facesB,faceA,faceB);
- }
- }
+ if (boxA->intersect(*boxB)) {
+ MT_Plane3 planeB = faceB->getPlane();
+ if (BOP_containsPoint(planeB,p1) &&
+ BOP_containsPoint(planeB,p2) &&
+ BOP_containsPoint(planeB,p3))
+ {
+ if (BOP_orientation(planeB,planeA)>0) {
+ BOP_intersectCoplanarFaces(mesh,facesB,faceA,faceB,false);
+ }
+ }
+ else {
+ BOP_intersectNonCoplanarFaces(mesh,facesA,facesB,faceA,faceB);
+ }
+ }
}
idxFaceB++;
}
@@ -656,16 +658,16 @@ void BOP_mergeSort(MT_Point3 *points, unsigned int *face, unsigned int &size, bo
* @param invert indicates if faceA has priority over faceB
* @param segmemts array of the output x-segments
*/
- void BOP_createXS(BOP_Mesh* mesh,
- BOP_Face* faceA,
- BOP_Face* faceB,
- BOP_Segment sA,
- BOP_Segment sB,
- bool invert,
- BOP_Segment* segments) {
- BOP_createXS(mesh, faceA, faceB, faceA->getPlane(), faceB->getPlane(),
- sA, sB, invert, segments);
- }
+void BOP_createXS(BOP_Mesh* mesh,
+ BOP_Face* faceA,
+ BOP_Face* faceB,
+ BOP_Segment sA,
+ BOP_Segment sB,
+ bool invert,
+ BOP_Segment* segments) {
+ BOP_createXS(mesh, faceA, faceB, faceA->getPlane(), faceB->getPlane(),
+ sA, sB, invert, segments);
+}
/**
* Computes the x-segment of two segments (the shared interval). The segments needs to have sA.m_cfg1 > 0 && sB.m_cfg1 > 0 .
@@ -1169,7 +1171,7 @@ BOP_Face *BOP_getOppositeFace(BOP_Mesh* mesh,
void BOP_removeOverlappedFaces(BOP_Mesh *mesh, BOP_Faces *facesA, BOP_Faces *facesB)
{
for(unsigned int i=0;i<facesA->size();i++) {
- BOP_Face *faceI = (*facesA)[i];
+ BOP_Face *faceI = (*facesA)[i];
if (faceI->getTAG()==BROKEN) continue;
bool overlapped = false;
MT_Point3 p1 = mesh->getVertex(faceI->getVertex(0))->getPoint();
@@ -1178,21 +1180,23 @@ void BOP_removeOverlappedFaces(BOP_Mesh *mesh, BOP_Faces *facesA, BOP_Faces *f
for(unsigned int j=0;j<facesB->size();) {
BOP_Face *faceJ = (*facesB)[j];
if (faceJ->getTAG()!=BROKEN) {
- MT_Plane3 planeJ = faceJ->getPlane();
- if (BOP_containsPoint(planeJ,p1) && BOP_containsPoint(planeJ,p2)
- && BOP_containsPoint(planeJ,p3)) {
- MT_Point3 q1 = mesh->getVertex(faceJ->getVertex(0))->getPoint();
- MT_Point3 q2 = mesh->getVertex(faceJ->getVertex(1))->getPoint();
- MT_Point3 q3 = mesh->getVertex(faceJ->getVertex(2))->getPoint();
- if (BOP_overlap(MT_Vector3(planeJ.x(),planeJ.y(),planeJ.z()),
- p1,p2,p3,q1,q2,q3)) {
- facesB->erase(facesB->begin()+j,facesB->begin()+(j+1));
- faceJ->setTAG(BROKEN);
- overlapped = true;
- }
- else j++;
- }
- else j++;
+ MT_Plane3 planeJ = faceJ->getPlane();
+ if (BOP_containsPoint(planeJ,p1) && BOP_containsPoint(planeJ,p2)
+ && BOP_containsPoint(planeJ,p3))
+ {
+ MT_Point3 q1 = mesh->getVertex(faceJ->getVertex(0))->getPoint();
+ MT_Point3 q2 = mesh->getVertex(faceJ->getVertex(1))->getPoint();
+ MT_Point3 q3 = mesh->getVertex(faceJ->getVertex(2))->getPoint();
+ if (BOP_overlap(MT_Vector3(planeJ.x(),planeJ.y(),planeJ.z()),
+ p1,p2,p3,q1,q2,q3))
+ {
+ facesB->erase(facesB->begin()+j,facesB->begin()+(j+1));
+ faceJ->setTAG(BROKEN);
+ overlapped = true;
+ }
+ else j++;
+ }
+ else j++;
}else j++;
}
if (overlapped) faceI->setTAG(OVERLAPPED);
diff --git a/intern/boolop/intern/BOP_Interface.cpp b/intern/boolop/intern/BOP_Interface.cpp
index 8b88c18f151..f11c4eaffae 100644
--- a/intern/boolop/intern/BOP_Interface.cpp
+++ b/intern/boolop/intern/BOP_Interface.cpp
@@ -46,23 +46,23 @@
#endif
BoolOpState BOP_intersectionBoolOp(BOP_Mesh* meshC,
- BOP_Faces* facesA,
- BOP_Faces* facesB,
- bool invertMeshA,
- bool invertMeshB);
+ BOP_Faces* facesA,
+ BOP_Faces* facesB,
+ bool invertMeshA,
+ bool invertMeshB);
BOP_Face3* BOP_createFace(BOP_Mesh* mesh,
- BOP_Index vertex1,
- BOP_Index vertex2,
- BOP_Index vertex3,
- BOP_Index origFace);
+ BOP_Index vertex1,
+ BOP_Index vertex2,
+ BOP_Index vertex3,
+ BOP_Index origFace);
void BOP_addMesh(BOP_Mesh* mesh,
- BOP_Faces* meshFacesId,
- CSG_FaceIteratorDescriptor& face_it,
- CSG_VertexIteratorDescriptor& vertex_it,
- bool invert);
+ BOP_Faces* meshFacesId,
+ CSG_FaceIteratorDescriptor& face_it,
+ CSG_VertexIteratorDescriptor& vertex_it,
+ bool invert);
BSP_CSGMesh* BOP_newEmptyMesh();
BSP_CSGMesh* BOP_exportMesh(BOP_Mesh* inputMesh,
- bool invert);
+ bool invert);
void BOP_meshFilter(BOP_Mesh* meshC, BOP_Faces* faces, BOP_BSPTree* bsp);
void BOP_simplifiedMeshFilter(BOP_Mesh* meshC, BOP_Faces* faces, BOP_BSPTree* bsp, bool inverted);
void BOP_meshClassify(BOP_Mesh* meshC, BOP_Faces* faces, BOP_BSPTree* bsp);
diff --git a/intern/boolop/intern/BOP_Mesh.cpp b/intern/boolop/intern/BOP_Mesh.cpp
index 5ea9872467d..e35b5437f68 100644
--- a/intern/boolop/intern/BOP_Mesh.cpp
+++ b/intern/boolop/intern/BOP_Mesh.cpp
@@ -788,20 +788,20 @@ BOP_Index BOP_Mesh::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
bool BOP_Mesh::isClosedMesh()
{
- for(unsigned int i=0; i<m_edges.size(); i++) {
- BOP_Edge *edge = m_edges[i];
- BOP_Indexs faces = edge->getFaces();
- unsigned int count = 0;
- const BOP_IT_Indexs facesEnd = faces.end();
- for(BOP_IT_Indexs it = faces.begin();it!=facesEnd;it++) {
- if (m_faces[*it]->getTAG()!=BROKEN)
- count++;
- }
-
- if ((count%2)!=0) return false;
- }
-
- return true;
+ for(unsigned int i=0; i<m_edges.size(); i++) {
+ BOP_Edge *edge = m_edges[i];
+ BOP_Indexs faces = edge->getFaces();
+ unsigned int count = 0;
+ const BOP_IT_Indexs facesEnd = faces.end();
+ for(BOP_IT_Indexs it = faces.begin();it!=facesEnd;it++) {
+ if (m_faces[*it]->getTAG()!=BROKEN)
+ count++;
+ }
+
+ if ((count%2)!=0) return false;
+ }
+
+ return true;
}
diff --git a/intern/bsp/intern/CSG_BooleanOps.cpp b/intern/bsp/intern/CSG_BooleanOps.cpp
index 91523bad483..df1374ef10b 100644
--- a/intern/bsp/intern/CSG_BooleanOps.cpp
+++ b/intern/bsp/intern/CSG_BooleanOps.cpp
@@ -91,14 +91,14 @@ CSG_PerformBooleanOperation(
switch( op_type ) {
case e_csg_union:
- boolType = BOP_UNION;
- break;
+ boolType = BOP_UNION;
+ break;
case e_csg_difference:
- boolType = BOP_DIFFERENCE;
- break;
+ boolType = BOP_DIFFERENCE;
+ break;
default:
- boolType = BOP_INTERSECTION;
- break;
+ boolType = BOP_INTERSECTION;
+ break;
}
BoolOpState boolOpResult;
diff --git a/intern/container/CTR_UHeap.h b/intern/container/CTR_UHeap.h
index e1cd2755263..11813c48331 100644
--- a/intern/container/CTR_UHeap.h
+++ b/intern/container/CTR_UHeap.h
@@ -229,13 +229,13 @@ private:
Parent(
unsigned int i
) {
- return (i-1) >> 1;
+ return (i-1) >> 1;
}
int
Left(
int i
) {
- return (i<<1)+1;
+ return (i<<1)+1;
}
int
diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
new file mode 100644
index 00000000000..d1ee5e0050d
--- /dev/null
+++ b/intern/cycles/CMakeLists.txt
@@ -0,0 +1,84 @@
+
+set(CYCLES_INSTALL_PATH "scripts/addons/cycles")
+set(WITH_CYCLES_BLENDER ON)
+
+# External Libraries
+
+include(cmake/external_libs.cmake)
+
+# Build Flags
+
+if(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
+ set(GCC_OPTIM_FLAGS "-ffast-math -msse -msse2 -msse3")
+endif()
+
+if(APPLE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_OPTIM_FLAGS}")
+ set(RTTI_DISABLE_FLAGS "-fno-rtti -DBOOST_NO_RTTI -DBOOST_NO_TYPEID")
+endif()
+
+if(WIN32)
+ if(MSVC)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Ox /Ot /arch:SSE2 -D_CRT_SECURE_NO_WARNINGS /EHsc /fp:fast")
+ set(RTTI_DISABLE_FLAGS "/GR- -DBOOST_NO_RTTI -DBOOST_NO_TYPEID")
+ elseif(CMAKE_COMPILER_IS_GNUCC)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_OPTIM_FLAGS}")
+ set(RTTI_DISABLE_FLAGS "-fno-rtti -DBOOST_NO_RTTI -DBOOST_NO_TYPEID")
+ endif()
+endif()
+
+if(UNIX AND NOT APPLE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_OPTIM_FLAGS}")
+ set(RTTI_DISABLE_FLAGS "-fno-rtti -DBOOST_NO_RTTI -DBOOST_NO_TYPEID")
+endif()
+
+# not needed yet, is for open shading language
+set(RTTI_DISABLE_FLAGS "")
+
+# Definitions and Includes
+
+add_definitions(${BOOST_DEFINITIONS} ${OPENIMAGEIO_DEFINITIONS})
+
+add_definitions(-DCCL_NAMESPACE_BEGIN=namespace\ ccl\ {)
+add_definitions(-DCCL_NAMESPACE_END=})
+
+if(WITH_CYCLES_NETWORK)
+ add_definitions(-DWITH_NETWORK)
+endif()
+
+if(WITH_CYCLES_OSL)
+ add_definitions(-DWITH_OSL)
+endif()
+
+if(WITH_CYCLES_PARTIO)
+ add_definitions(-DWITH_PARTIO)
+endif()
+
+if(WITH_CYCLES_CUDA_BINARIES)
+ add_definitions(-DWITH_CUDA_BINARIES)
+endif()
+
+add_definitions(-DWITH_OPENCL)
+add_definitions(-DWITH_CUDA)
+add_definitions(-DWITH_MULTI)
+
+include_directories(
+ ${BOOST_INCLUDE_DIR}
+ ${OPENIMAGEIO_INCLUDE_DIRS}
+ ${OPENIMAGEIO_INCLUDE_DIRS}/OpenImageIO)
+
+# Subdirectories
+
+if(WITH_CYCLES_BLENDER)
+ add_subdirectory(blender)
+endif(WITH_CYCLES_BLENDER)
+
+add_subdirectory(app)
+add_subdirectory(bvh)
+add_subdirectory(device)
+add_subdirectory(doc)
+add_subdirectory(kernel)
+add_subdirectory(render)
+add_subdirectory(subd)
+add_subdirectory(util)
+
diff --git a/intern/cycles/SConscript b/intern/cycles/SConscript
new file mode 100644
index 00000000000..e2c81edea37
--- /dev/null
+++ b/intern/cycles/SConscript
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+from os import path
+Import('env')
+
+cycles = env.Clone()
+
+cycles.Depends('../../source/blender/makesrna/intern/RNA_blender_cpp.h', 'makesrna')
+
+sources = cycles.Glob('bvh/*.cpp') + cycles.Glob('device/*.cpp') + cycles.Glob('kernel/*.cpp') + cycles.Glob('render/*.cpp') + cycles.Glob('subd/*.cpp') + cycles.Glob('util/*.cpp') + cycles.Glob('util/*.c') + cycles.Glob('blender/*.cpp')
+
+sources.remove(path.join('util', 'util_view.cpp'))
+sources.remove(path.join('render', 'film_response.cpp'))
+
+incs = []
+defs = []
+ccflags = []
+cxxflags = []
+
+defs.append('CCL_NAMESPACE_BEGIN=namespace ccl {')
+defs.append('CCL_NAMESPACE_END=}')
+
+defs.append('WITH_OPENCL')
+defs.append('WITH_MULTI')
+defs.append('WITH_CUDA')
+
+if env['OURPLATFORM'] in ('win32-mingw'):
+ if env['WITH_BF_RAYOPTIMIZATION']:
+ cxxflags.append('-ffast-math -msse -msse2 -msse3'.split())
+ ccflags.append('-ffast-math -msse -msse2 -msse3'.split())
+ # not needed yet, is for open shading language
+ # cxxflags.append('-fno-rtti'.split())
+ # defs.append('BOOST_NO_RTTI BOOST_NO_TYPEID'.split())
+
+incs.extend('. bvh render device kernel kernel/osl kernel/svm util subd'.split())
+incs.extend('#intern/guardedalloc #source/blender/makesrna #source/blender/makesdna'.split())
+incs.extend('#source/blender/blenloader ../../source/blender/makesrna/intern'.split())
+incs.extend('#extern/glew/include'.split())
+incs.append(cycles['BF_OIIO_INC'])
+incs.append(cycles['BF_BOOST_INC'])
+incs.append(cycles['BF_PYTHON_INC'])
+
+cycles.BlenderLib('bf_intern_cycles', sources, incs, defs, libtype=['intern'], priority=[0], compileflags=[None], cc_compileflags=ccflags, cxx_compileflags=cxxflags)
+
diff --git a/intern/cycles/app/CMakeLists.txt b/intern/cycles/app/CMakeLists.txt
new file mode 100644
index 00000000000..2e2897d0443
--- /dev/null
+++ b/intern/cycles/app/CMakeLists.txt
@@ -0,0 +1,69 @@
+
+set(INC
+ .
+ ../device
+ ../kernel
+ ../kernel/svm
+ ../bvh
+ ../util
+ ../render
+ ../subd
+)
+
+set(LIBRARIES
+ cycles_device
+ cycles_kernel
+ cycles_render
+ cycles_bvh
+ cycles_subd
+ cycles_util
+ ${BOOST_LIBRARIES}
+ ${OPENGL_LIBRARIES}
+ ${CYCLES_GLEW_LIBRARY}
+ ${OPENIMAGEIO_LIBRARIES}
+)
+
+link_directories(${OPENIMAGEIO_LIBPATH} ${BOOST_LIBPATH})
+
+if(WITH_CYCLES_TEST)
+ list(APPEND LIBRARIES ${GLUT_LIBRARIES})
+endif()
+
+if(WITH_CYCLES_OSL)
+ list(APPEND LIBRARIES cycles_kernel_osl ${OSL_LIBRARIES})
+endif()
+
+if(WITH_CYCLES_PARTIO)
+ list(APPEND LIBRARIES ${PARTIO_LIBRARIES})
+endif()
+
+include_directories(${INC})
+
+if(WITH_CYCLES_TEST)
+ set(SRC
+ cycles_test.cpp
+ cycles_xml.cpp
+ cycles_xml.h
+ )
+ add_executable(cycles_test ${SRC})
+ target_link_libraries(cycles_test ${LIBRARIES})
+
+ if(UNIX AND NOT APPLE)
+ set_target_properties(cycles_test PROPERTIES INSTALL_RPATH $ORIGIN/lib)
+ endif()
+ unset(SRC)
+endif()
+
+if(WITH_CYCLES_NETWORK)
+ set(SRC
+ cycles_server.cpp
+ )
+ add_executable(cycles_server ${SRC})
+ target_link_libraries(cycles_server ${LIBRARIES})
+
+ if(UNIX AND NOT APPLE)
+ set_target_properties(cycles_server PROPERTIES INSTALL_RPATH $ORIGIN/lib)
+ endif()
+ unset(SRC)
+endif()
+
diff --git a/intern/cycles/app/cycles_server.cpp b/intern/cycles/app/cycles_server.cpp
new file mode 100644
index 00000000000..bcf4d3ea769
--- /dev/null
+++ b/intern/cycles/app/cycles_server.cpp
@@ -0,0 +1,71 @@
+/*
+ * 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 <stdio.h>
+
+#include "device.h"
+
+#include "util_args.h"
+#include "util_foreach.h"
+#include "util_path.h"
+#include "util_string.h"
+
+using namespace ccl;
+
+int main(int argc, const char **argv)
+{
+ path_init();
+
+ /* device types */
+ string devices = "";
+ string devicename = "cpu";
+
+ vector<DeviceType> types = Device::available_types();
+
+ foreach(DeviceType type, types) {
+ if(devices != "")
+ devices += ", ";
+
+ devices += Device::string_from_type(type);
+ }
+
+ /* parse options */
+ ArgParse ap;
+
+ ap.options ("Usage: cycles_server [options]",
+ "--device %s", &devicename, ("Devices to use: " + devices).c_str(),
+ NULL);
+
+ if(ap.parse(argc, argv) < 0) {
+ fprintf(stderr, "%s\n", ap.error_message().c_str());
+ ap.usage();
+ exit(EXIT_FAILURE);
+ }
+
+ DeviceType dtype = Device::type_from_string(devicename.c_str());
+
+ while(1) {
+ Device *device = Device::create(dtype);
+ printf("Cycles Server with device: %s\n", device->description().c_str());
+ device->server_run();
+ delete device;
+ }
+
+ return 0;
+}
+
diff --git a/intern/cycles/app/cycles_test.cpp b/intern/cycles/app/cycles_test.cpp
new file mode 100644
index 00000000000..27e53ded6db
--- /dev/null
+++ b/intern/cycles/app/cycles_test.cpp
@@ -0,0 +1,307 @@
+/*
+ * 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 <stdio.h>
+
+#include "buffers.h"
+#include "camera.h"
+#include "device.h"
+#include "scene.h"
+#include "session.h"
+
+#include "util_args.h"
+#include "util_foreach.h"
+#include "util_function.h"
+#include "util_path.h"
+#include "util_progress.h"
+#include "util_string.h"
+#include "util_time.h"
+#include "util_view.h"
+
+#include "cycles_xml.h"
+
+CCL_NAMESPACE_BEGIN
+
+struct Options {
+ Session *session;
+ Scene *scene;
+ string filepath;
+ int width, height;
+ SceneParams scene_params;
+ SessionParams session_params;
+ bool quiet;
+} options;
+
+static void session_print(const string& str)
+{
+ /* print with carriage return to overwrite previous */
+ printf("\r%s", str.c_str());
+
+ /* add spaces to overwrite longer previous print */
+ static int maxlen = 0;
+ int len = str.size();
+ maxlen = max(len, maxlen);
+
+ for(int i = len; i < maxlen; i++)
+ printf(" ");
+
+ /* flush because we don't write an end of line */
+ fflush(stdout);
+}
+
+static void session_print_status()
+{
+ int sample;
+ double total_time, sample_time;
+ string status, substatus;
+
+ /* get status */
+ options.session->progress.get_sample(sample, total_time, sample_time);
+ options.session->progress.get_status(status, substatus);
+
+ if(substatus != "")
+ status += ": " + substatus;
+
+ /* print status */
+ status = string_printf("Sample %d %s", sample, status.c_str());
+ session_print(status);
+}
+
+static void session_init()
+{
+ options.session = new Session(options.session_params);
+ options.session->reset(options.width, options.height, options.session_params.samples);
+ options.session->scene = options.scene;
+
+ if(options.session_params.background && !options.quiet)
+ options.session->progress.set_update_callback(function_bind(&session_print_status));
+ else
+ options.session->progress.set_update_callback(function_bind(&view_redraw));
+
+ options.session->start();
+
+ options.scene = NULL;
+}
+
+static void scene_init()
+{
+ 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;
+}
+
+static void session_exit()
+{
+ if(options.session) {
+ delete options.session;
+ options.session = NULL;
+ }
+ if(options.scene) {
+ delete options.scene;
+ options.scene = NULL;
+ }
+
+ if(options.session_params.background && !options.quiet) {
+ session_print("Finished Rendering.");
+ printf("\n");
+ }
+}
+
+static void display_info(Progress& progress)
+{
+ static double latency = 0.0;
+ static double last = 0;
+ double elapsed = time_dt();
+ string str;
+
+ latency = (elapsed - last);
+ last = elapsed;
+
+ int sample;
+ double total_time, sample_time;
+ string status, substatus;
+
+ progress.get_sample(sample, total_time, sample_time);
+ progress.get_status(status, substatus);
+
+ if(substatus != "")
+ status += ": " + substatus;
+
+ str = string_printf("latency: %.4f sample: %d total: %.4f average: %.4f %s",
+ latency, sample, total_time, sample_time, status.c_str());
+
+ view_display_info(str.c_str());
+}
+
+static void display()
+{
+ options.session->draw(options.width, options.height);
+
+ display_info(options.session->progress);
+}
+
+static void resize(int width, int height)
+{
+ options.width= width;
+ options.height= height;
+
+ if(options.session)
+ options.session->reset(options.width, options.height, options.session_params.samples);
+}
+
+void keyboard(unsigned char key)
+{
+ if(key == 'r')
+ options.session->reset(options.width, options.height, options.session_params.samples);
+ else if(key == 27) // escape
+ options.session->progress.set_cancel("Cancelled");
+}
+
+static int files_parse(int argc, const char *argv[])
+{
+ if(argc > 0)
+ options.filepath = argv[0];
+
+ return 0;
+}
+
+static void options_parse(int argc, const char **argv)
+{
+ options.width= 1024;
+ options.height= 512;
+ options.filepath = "";
+ options.session = NULL;
+ options.quiet = false;
+
+ /* devices */
+ string devices = "";
+ string devicename = "cpu";
+
+ vector<DeviceType> types = Device::available_types();
+
+ foreach(DeviceType type, types) {
+ if(devices != "")
+ devices += ", ";
+
+ devices += Device::string_from_type(type);
+ }
+
+ /* shading system */
+ string ssname = "svm";
+ string shadingsystems = "Shading system to use: svm";
+
+#ifdef WITH_OSL
+ shadingsystems += ", osl";
+#endif
+
+ /* parse options */
+ ArgParse ap;
+ bool help = false;
+
+ ap.options ("Usage: cycles_test [options] file.xml",
+ "%*", files_parse, "",
+ "--device %s", &devicename, ("Devices to use: " + devices).c_str(),
+ "--shadingsys %s", &ssname, "Shading system to use: svm, osl",
+ "--background", &options.session_params.background, "Render in background, without user interface",
+ "--quiet", &options.quiet, "In background mode, don't print progress messages",
+ "--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",
+ "--help", &help, "Print help message",
+ NULL);
+
+ if(ap.parse(argc, argv) < 0) {
+ fprintf(stderr, "%s\n", ap.error_message().c_str());
+ ap.usage();
+ exit(EXIT_FAILURE);
+ }
+ else if(help || options.filepath == "") {
+ ap.usage();
+ exit(EXIT_SUCCESS);
+ }
+
+ options.session_params.device_type = Device::type_from_string(devicename.c_str());
+
+ if(ssname == "osl")
+ options.scene_params.shadingsystem = SceneParams::OSL;
+ else if(ssname == "svm")
+ options.scene_params.shadingsystem = SceneParams::SVM;
+
+ /* handle invalid configurations */
+ bool type_available = false;
+
+ foreach(DeviceType dtype, types)
+ if(options.session_params.device_type == dtype)
+ type_available = true;
+
+ if(options.session_params.device_type == DEVICE_NONE || !type_available) {
+ fprintf(stderr, "Unknown device: %s\n", devicename.c_str());
+ exit(EXIT_FAILURE);
+ }
+#ifdef WITH_OSL
+ else if(!(ssname == "osl" || ssname == "svm")) {
+#else
+ else if(!(ssname == "svm")) {
+#endif
+ fprintf(stderr, "Unknown shading system: %s\n", ssname.c_str());
+ exit(EXIT_FAILURE);
+ }
+ else if(options.scene_params.shadingsystem == SceneParams::OSL && options.session_params.device_type != DEVICE_CPU) {
+ fprintf(stderr, "OSL shading system only works with CPU device\n");
+ exit(EXIT_FAILURE);
+ }
+ else if(options.session_params.samples < 0) {
+ fprintf(stderr, "Invalid number of samples: %d\n", options.session_params.samples);
+ exit(EXIT_FAILURE);
+ }
+ else if(options.filepath == "") {
+ fprintf(stderr, "No file path specified\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* load scene */
+ scene_init();
+}
+
+CCL_NAMESPACE_END
+
+using namespace ccl;
+
+int main(int argc, const char **argv)
+{
+ path_init("../build/bin/2.59/scripts/addons/cycles/");
+
+ options_parse(argc, argv);
+
+ if(options.session_params.background) {
+ session_init();
+ options.session->wait();
+ session_exit();
+ }
+ else {
+ string title = "Cycles: " + path_filename(options.filepath);
+
+ /* init/exit are callback so they run while GL is initialized */
+ view_main_loop(title.c_str(), options.width, options.height,
+ session_init, session_exit, resize, display, keyboard);
+ }
+
+ return 0;
+}
+
diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp
new file mode 100644
index 00000000000..5f9e1d7a5ff
--- /dev/null
+++ b/intern/cycles/app/cycles_xml.cpp
@@ -0,0 +1,942 @@
+/*
+ * 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 <stdio.h>
+
+#include <sstream>
+#include <algorithm>
+#include <iterator>
+
+#include "camera.h"
+#include "film.h"
+#include "graph.h"
+#include "integrator.h"
+#include "light.h"
+#include "mesh.h"
+#include "nodes.h"
+#include "object.h"
+#include "shader.h"
+#include "scene.h"
+
+#include "subd_mesh.h"
+#include "subd_patch.h"
+#include "subd_split.h"
+
+#include "util_debug.h"
+#include "util_foreach.h"
+#include "util_path.h"
+#include "util_transform.h"
+#include "util_xml.h"
+
+#include "cycles_xml.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* XML reading state */
+
+struct XMLReadState {
+ Scene *scene; /* scene pointer */
+ Transform tfm; /* current transform state */
+ bool smooth; /* smooth normal state */
+ int shader; /* current shader */
+ string base; /* base path to current file*/
+ float dicing_rate; /* current dicing rate */
+ Mesh::DisplacementMethod displacement_method;
+};
+
+/* Attribute Reading */
+
+static bool xml_read_bool(bool *value, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ *value = (string_iequals(attr.value(), "true")) || (atoi(attr.value()) != 0);
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_int(int *value, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ *value = atoi(attr.value());
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_int_array(vector<int>& value, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ vector<string> tokens;
+ string_split(tokens, attr.value());
+
+ foreach(const string& token, tokens)
+ value.push_back(atoi(token.c_str()));
+
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_float(float *value, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ *value = atof(attr.value());
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_float_array(vector<float>& value, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ vector<string> tokens;
+ string_split(tokens, attr.value());
+
+ foreach(const string& token, tokens)
+ value.push_back(atof(token.c_str()));
+
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_float3(float3 *value, pugi::xml_node node, const char *name)
+{
+ vector<float> array;
+
+ if(xml_read_float_array(array, node, name) && array.size() == 3) {
+ *value = make_float3(array[0], array[1], array[2]);
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_float3_array(vector<float3>& value, pugi::xml_node node, const char *name)
+{
+ vector<float> array;
+
+ if(xml_read_float_array(array, node, name)) {
+ for(size_t i = 0; i < array.size(); i += 3)
+ value.push_back(make_float3(array[i+0], array[i+1], array[i+2]));
+
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_float4(float4 *value, pugi::xml_node node, const char *name)
+{
+ vector<float> array;
+
+ if(xml_read_float_array(array, node, name) && array.size() == 4) {
+ *value = make_float4(array[0], array[1], array[2], array[3]);
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_string(string *str, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ *str = attr.value();
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_read_ustring(ustring *str, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ *str = ustring(attr.value());
+ return true;
+ }
+
+ return false;
+}
+
+static bool xml_equal_string(pugi::xml_node node, const char *name, const char *value)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr)
+ return string_iequals(attr.value(), value);
+
+ return false;
+}
+
+static bool xml_read_enum(ustring *str, ShaderEnum& enm, pugi::xml_node node, const char *name)
+{
+ pugi::xml_attribute attr = node.attribute(name);
+
+ if(attr) {
+ ustring ustr(attr.value());
+
+ if(enm.exists(ustr)) {
+ *str = ustr;
+ return true;
+ }
+ else
+ fprintf(stderr, "Unknown value \"%s\" for attribute \"%s\".\n", ustr.c_str(), name);
+ }
+
+ return false;
+}
+
+/* Film */
+
+static void xml_read_film(const XMLReadState& state, pugi::xml_node node)
+{
+ Camera *cam = state.scene->camera;
+
+ xml_read_int(&cam->width, node, "width");
+ xml_read_int(&cam->height, node, "height");
+
+ float aspect = (float)cam->width/(float)cam->height;
+
+ if(cam->width >= cam->height) {
+ cam->left = -aspect;
+ cam->right = aspect;
+ cam->bottom = -1.0f;
+ cam->top = 1.0f;
+ }
+ else {
+ cam->left = -1.0f;
+ cam->right = 1.0f;
+ cam->bottom = -1.0f/aspect;
+ cam->top = 1.0f/aspect;
+ }
+
+ cam->need_update = true;
+ cam->update();
+}
+
+/* Integrator */
+
+static void xml_read_integrator(const XMLReadState& state, pugi::xml_node node)
+{
+ Integrator *integrator = state.scene->integrator;
+
+ xml_read_int(&integrator->min_bounce, node, "min_bounce");
+ xml_read_int(&integrator->max_bounce, node, "max_bounce");
+ xml_read_bool(&integrator->no_caustics, node, "no_caustics");
+ xml_read_float(&integrator->blur_caustics, node, "blur_caustics");
+}
+
+/* Camera */
+
+static void xml_read_camera(const XMLReadState& state, pugi::xml_node node)
+{
+ Camera *cam = state.scene->camera;
+
+ if(xml_read_float(&cam->fov, node, "fov"))
+ cam->fov *= M_PI/180.0f;
+
+ xml_read_float(&cam->nearclip, node, "nearclip");
+ xml_read_float(&cam->farclip, node, "farclip");
+ xml_read_float(&cam->aperturesize, node, "aperturesize"); // 0.5*focallength/fstop
+ xml_read_float(&cam->focaldistance, node, "focaldistance");
+ xml_read_float(&cam->shutteropen, node, "shutteropen");
+ xml_read_float(&cam->shutterclose, node, "shutterclose");
+
+ if(xml_equal_string(node, "type", "orthographic"))
+ cam->ortho = true;
+ else if(xml_equal_string(node, "type", "perspective"))
+ cam->ortho = false;
+
+ cam->matrix = state.tfm;
+
+ cam->need_update = true;
+ cam->update();
+}
+
+/* Shader */
+
+static string xml_socket_name(const char *name)
+{
+ string sname = name;
+ size_t i;
+
+ while((i = sname.find(" ")) != string::npos)
+ sname.replace(i, 1, "");
+
+ return sname;
+}
+
+static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pugi::xml_node graph_node)
+{
+ ShaderGraph *graph = new ShaderGraph();
+
+ map<string, ShaderNode*> nodemap;
+
+ nodemap["output"] = graph->output();
+
+ for(pugi::xml_node node = graph_node.first_child(); node; node = node.next_sibling()) {
+ ShaderNode *snode = NULL;
+
+ if(string_iequals(node.name(), "image_texture")) {
+ ImageTextureNode *img = new ImageTextureNode();
+
+ xml_read_string(&img->filename, node, "src");
+ img->filename = path_join(state.base, img->filename);
+
+ snode = img;
+ }
+ else if(string_iequals(node.name(), "environment_texture")) {
+ EnvironmentTextureNode *env = new EnvironmentTextureNode();
+
+ xml_read_string(&env->filename, node, "src");
+ env->filename = path_join(state.base, env->filename);
+
+ snode = env;
+ }
+ else if(string_iequals(node.name(), "sky_texture")) {
+ SkyTextureNode *sky = new SkyTextureNode();
+
+ xml_read_float3(&sky->sun_direction, node, "sun_direction");
+ xml_read_float(&sky->turbidity, node, "turbidity");
+
+ snode = sky;
+ }
+ 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");
+ 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");
+ 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");
+ snode = wood;
+ }
+ else if(string_iequals(node.name(), "mapping")) {
+ snode = new MappingNode();
+ }
+ else if(string_iequals(node.name(), "ward_bsdf")) {
+ snode = new WardBsdfNode();
+ }
+ else if(string_iequals(node.name(), "diffuse_bsdf")) {
+ snode = new DiffuseBsdfNode();
+ }
+ else if(string_iequals(node.name(), "translucent_bsdf")) {
+ snode = new TranslucentBsdfNode();
+ }
+ else if(string_iequals(node.name(), "transparent_bsdf")) {
+ snode = new TransparentBsdfNode();
+ }
+ else if(string_iequals(node.name(), "velvet_bsdf")) {
+ snode = new VelvetBsdfNode();
+ }
+ else if(string_iequals(node.name(), "glossy_bsdf")) {
+ GlossyBsdfNode *glossy = new GlossyBsdfNode();
+ xml_read_enum(&glossy->distribution, GlossyBsdfNode::distribution_enum, node, "distribution");
+ snode = glossy;
+ }
+ else if(string_iequals(node.name(), "glass_bsdf")) {
+ GlassBsdfNode *diel = new GlassBsdfNode();
+ xml_read_enum(&diel->distribution, GlassBsdfNode::distribution_enum, node, "distribution");
+ snode = diel;
+ }
+ else if(string_iequals(node.name(), "emission")) {
+ EmissionNode *emission = new EmissionNode();
+ xml_read_bool(&emission->total_power, node, "total_power");
+ snode = emission;
+ }
+ else if(string_iequals(node.name(), "background")) {
+ snode = new BackgroundNode();
+ }
+ else if(string_iequals(node.name(), "transparent_volume")) {
+ snode = new TransparentVolumeNode();
+ }
+ else if(string_iequals(node.name(), "isotropic_volume")) {
+ snode = new IsotropicVolumeNode();
+ }
+ else if(string_iequals(node.name(), "geometry")) {
+ snode = new GeometryNode();
+ }
+ else if(string_iequals(node.name(), "texture_coordinate")) {
+ snode = new TextureCoordinateNode();
+ }
+ else if(string_iequals(node.name(), "lightPath")) {
+ snode = new LightPathNode();
+ }
+ else if(string_iequals(node.name(), "value")) {
+ ValueNode *value = new ValueNode();
+ xml_read_float(&value->value, node, "value");
+ snode = value;
+ }
+ else if(string_iequals(node.name(), "color")) {
+ ColorNode *color = new ColorNode();
+ xml_read_float3(&color->value, node, "value");
+ snode = color;
+ }
+ else if(string_iequals(node.name(), "mix_closure")) {
+ snode = new MixClosureNode();
+ }
+ else if(string_iequals(node.name(), "add_closure")) {
+ snode = new AddClosureNode();
+ }
+ 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(), "attribute")) {
+ AttributeNode *attr = new AttributeNode();
+ xml_read_ustring(&attr->attribute, node, "attribute");
+ snode = attr;
+ }
+ else if(string_iequals(node.name(), "fresnel")) {
+ snode = new FresnelNode();
+ }
+ else if(string_iequals(node.name(), "math")) {
+ MathNode *math = new MathNode();
+ xml_read_enum(&math->type, MathNode::type_enum, node, "type");
+ snode = math;
+ }
+ else if(string_iequals(node.name(), "vector_math")) {
+ VectorMathNode *vmath = new VectorMathNode();
+ xml_read_enum(&vmath->type, VectorMathNode::type_enum, node, "type");
+ snode = vmath;
+ }
+ else if(string_iequals(node.name(), "connect")) {
+ /* connect nodes */
+ vector<string> from_tokens, to_tokens;
+
+ string_split(from_tokens, node.attribute("from").value());
+ string_split(to_tokens, node.attribute("to").value());
+
+ if(from_tokens.size() == 2 && to_tokens.size() == 2) {
+ /* find nodes and sockets */
+ ShaderOutput *output = NULL;
+ ShaderInput *input = NULL;
+
+ if(nodemap.find(from_tokens[0]) != nodemap.end()) {
+ ShaderNode *fromnode = nodemap[from_tokens[0]];
+
+ foreach(ShaderOutput *out, fromnode->outputs)
+ if(string_iequals(xml_socket_name(out->name), from_tokens[1]))
+ output = out;
+
+ if(!output)
+ fprintf(stderr, "Unknown output socket name \"%s\" on \"%s\".\n", from_tokens[1].c_str(), from_tokens[0].c_str());
+ }
+ else
+ fprintf(stderr, "Unknown shader node name \"%s\".\n", from_tokens[0].c_str());
+
+ if(nodemap.find(to_tokens[0]) != nodemap.end()) {
+ ShaderNode *tonode = nodemap[to_tokens[0]];
+
+ foreach(ShaderInput *in, tonode->inputs)
+ if(string_iequals(xml_socket_name(in->name), to_tokens[1]))
+ input = in;
+
+ if(!input)
+ fprintf(stderr, "Unknown input socket name \"%s\" on \"%s\".\n", to_tokens[1].c_str(), to_tokens[0].c_str());
+ }
+ else
+ fprintf(stderr, "Unknown shader node name \"%s\".\n", to_tokens[0].c_str());
+
+ /* connect */
+ if(output && input)
+ graph->connect(output, input);
+ }
+ else
+ fprintf(stderr, "Invalid from or to value for connect node.\n");
+ }
+ else
+ fprintf(stderr, "Unknown shader node \"%s\".\n", node.name());
+
+ if(snode) {
+ /* add to graph */
+ graph->add(snode);
+
+ /* add to map for name lookups */
+ string name = "";
+ xml_read_string(&name, node, "name");
+
+ nodemap[name] = snode;
+
+ /* read input values */
+ for(pugi::xml_attribute attr = node.first_attribute(); attr; attr = attr.next_attribute()) {
+ foreach(ShaderInput *in, snode->inputs) {
+ if(string_iequals(in->name, attr.name())) {
+ switch(in->type) {
+ case SHADER_SOCKET_FLOAT:
+ xml_read_float(&in->value.x, node, attr.name());
+ break;
+ case SHADER_SOCKET_COLOR:
+ case SHADER_SOCKET_VECTOR:
+ case SHADER_SOCKET_POINT:
+ case SHADER_SOCKET_NORMAL:
+ xml_read_float3(&in->value, node, attr.name());
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ shader->set_graph(graph);
+ shader->tag_update(state.scene);
+}
+
+static void xml_read_shader(const XMLReadState& state, pugi::xml_node node)
+{
+ Shader *shader = new Shader();
+ xml_read_string(&shader->name, node, "name");
+ xml_read_shader_graph(state, shader, node);
+ state.scene->shaders.push_back(shader);
+}
+
+/* Background */
+
+static void xml_read_background(const XMLReadState& state, pugi::xml_node node)
+{
+ Shader *shader = state.scene->shaders[state.scene->default_background];
+
+ xml_read_shader_graph(state, shader, node);
+}
+
+/* Mesh */
+
+static Mesh *xml_add_mesh(Scene *scene, const Transform& tfm)
+{
+ /* create mesh */
+ Mesh *mesh = new Mesh();
+ scene->meshes.push_back(mesh);
+
+ /* create object*/
+ Object *object = new Object();
+ object->mesh = mesh;
+ object->tfm = tfm;
+ scene->objects.push_back(object);
+
+ return mesh;
+}
+
+static void xml_read_mesh(const XMLReadState& state, pugi::xml_node node)
+{
+ /* add mesh */
+ Mesh *mesh = xml_add_mesh(state.scene, state.tfm);
+ mesh->used_shaders.push_back(state.shader);
+
+ /* read state */
+ int shader = state.shader;
+ bool smooth = state.smooth;
+
+ mesh->displacement_method = state.displacement_method;
+
+ /* read vertices and polygons, RIB style */
+ vector<float3> P;
+ vector<int> verts, nverts;
+
+ xml_read_float3_array(P, node, "P");
+ xml_read_int_array(verts, node, "verts");
+ xml_read_int_array(nverts, node, "nverts");
+
+ if(xml_equal_string(node, "subdivision", "catmull-clark")) {
+ /* create subd mesh */
+ SubdMesh sdmesh;
+
+ /* create subd vertices */
+ for(size_t i = 0; i < P.size(); i++)
+ sdmesh.add_vert(P[i]);
+
+ /* create subd faces */
+ int index_offset = 0;
+
+ for(size_t i = 0; i < nverts.size(); i++) {
+ if(nverts[i] == 4) {
+ int v0 = verts[index_offset + 0];
+ int v1 = verts[index_offset + 1];
+ int v2 = verts[index_offset + 2];
+ int v3 = verts[index_offset + 3];
+
+ sdmesh.add_face(v0, v1, v2, v3);
+ }
+ else {
+ for(int j = 0; j < nverts[i]-2; j++) {
+ int v0 = verts[index_offset];
+ int v1 = verts[index_offset + j + 1];
+ int v2 = verts[index_offset + j + 2];;
+
+ sdmesh.add_face(v0, v1, v2);
+ }
+ }
+
+ index_offset += nverts[i];
+ }
+
+ /* finalize subd mesh */
+ sdmesh.link_boundary();
+
+ /* subdivide */
+ DiagSplit dsplit;
+ //dsplit.camera = state.scene->camera;
+ //dsplit.dicing_rate = 5.0f;
+ dsplit.dicing_rate = state.dicing_rate;
+ xml_read_float(&dsplit.dicing_rate, node, "dicing_rate");
+ sdmesh.tesselate(&dsplit, false, mesh, shader, smooth);
+ }
+ else {
+ /* create vertices */
+ mesh->verts = P;
+
+ /* create triangles */
+ int index_offset = 0;
+
+ for(size_t i = 0; i < nverts.size(); i++) {
+ for(int j = 0; j < nverts[i]-2; j++) {
+ int v0 = verts[index_offset];
+ int v1 = verts[index_offset + j + 1];
+ int v2 = verts[index_offset + j + 2];
+
+ assert(v0 < (int)P.size());
+ assert(v1 < (int)P.size());
+ assert(v2 < (int)P.size());
+
+ mesh->add_triangle(v0, v1, v2, shader, smooth);
+ }
+
+ index_offset += nverts[i];
+ }
+ }
+
+ /* temporary for test compatibility */
+ mesh->attributes.remove(Attribute::STD_VERTEX_NORMAL);
+}
+
+/* Patch */
+
+static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
+{
+ /* read patch */
+ Patch *patch = NULL;
+
+ vector<float3> P;
+ xml_read_float3_array(P, node, "P");
+
+ if(xml_equal_string(node, "type", "bilinear")) {
+ /* bilinear patch */
+ if(P.size() == 4) {
+ LinearQuadPatch *bpatch = new LinearQuadPatch();
+
+ for(int i = 0; i < 4; i++)
+ P[i] = transform(&state.tfm, P[i]);
+ memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
+
+ patch = bpatch;
+ }
+ else
+ fprintf(stderr, "Invalid number of control points for bilinear patch.\n");
+ }
+ else if(xml_equal_string(node, "type", "bicubic")) {
+ /* bicubic patch */
+ if(P.size() == 16) {
+ BicubicPatch *bpatch = new BicubicPatch();
+
+ for(int i = 0; i < 16; i++)
+ P[i] = transform(&state.tfm, P[i]);
+ memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
+
+ patch = bpatch;
+ }
+ else
+ fprintf(stderr, "Invalid number of control points for bicubic patch.\n");
+ }
+ else
+ fprintf(stderr, "Unknown patch type.\n");
+
+ if(patch) {
+ /* add mesh */
+ Mesh *mesh = xml_add_mesh(state.scene, transform_identity());
+
+ mesh->used_shaders.push_back(state.shader);
+
+ /* split */
+ DiagSplit dsplit;
+ //dsplit.camera = state.scene->camera;
+ //dsplit.dicing_rate = 5.0f;
+ dsplit.dicing_rate = state.dicing_rate;
+ xml_read_float(&dsplit.dicing_rate, node, "dicing_rate");
+ dsplit.split_quad(mesh, patch, state.shader, state.smooth);
+
+ delete patch;
+
+ /* temporary for test compatibility */
+ mesh->attributes.remove(Attribute::STD_VERTEX_NORMAL);
+ }
+}
+
+/* Light */
+
+static void xml_read_light(const XMLReadState& state, pugi::xml_node node)
+{
+ Light *light = new Light();
+ light->shader = state.shader;
+ xml_read_float3(&light->co, node, "P");
+ light->co = transform(&state.tfm, light->co);
+
+ state.scene->lights.push_back(light);
+}
+
+/* Transform */
+
+static void xml_read_transform(pugi::xml_node node, Transform& tfm)
+{
+ if(node.attribute("matrix")) {
+ vector<float> matrix;
+ if(xml_read_float_array(matrix, node, "matrix") && matrix.size() == 16)
+ tfm = tfm * transform_transpose((*(Transform*)&matrix[0]));
+ }
+
+ if(node.attribute("translate")) {
+ float3 translate = make_float3(0.0f, 0.0f, 0.0f);
+ xml_read_float3(&translate, node, "translate");
+ tfm = tfm * transform_translate(translate);
+ }
+
+ if(node.attribute("rotate")) {
+ float4 rotate = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ xml_read_float4(&rotate, node, "rotate");
+ tfm = tfm * transform_rotate(rotate.x*M_PI/180.0f, make_float3(rotate.y, rotate.z, rotate.w));
+ }
+
+ if(node.attribute("scale")) {
+ float3 scale = make_float3(0.0f, 0.0f, 0.0f);
+ xml_read_float3(&scale, node, "scale");
+ tfm = tfm * transform_scale(scale);
+ }
+}
+
+/* State */
+
+static void xml_read_state(XMLReadState& state, pugi::xml_node node)
+{
+ /* read shader */
+ string shadername;
+
+ if(xml_read_string(&shadername, node, "shader")) {
+ int i = 0;
+ bool found = false;
+
+ foreach(Shader *shader, state.scene->shaders) {
+ if(shader->name == shadername) {
+ state.shader = i;
+ found = true;
+ break;
+ }
+
+ i++;
+ }
+
+ if(!found)
+ fprintf(stderr, "Unknown shader \"%s\".\n", shadername.c_str());
+ }
+
+ xml_read_float(&state.dicing_rate, node, "dicing_rate");
+
+ /* read smooth/flat */
+ if(xml_equal_string(node, "interpolation", "smooth"))
+ state.smooth = true;
+ else if(xml_equal_string(node, "interpolation", "flat"))
+ state.smooth = false;
+
+ /* read displacement method */
+ if(xml_equal_string(node, "displacement_method", "true"))
+ state.displacement_method = Mesh::DISPLACE_TRUE;
+ else if(xml_equal_string(node, "displacement_method", "bump"))
+ state.displacement_method = Mesh::DISPLACE_BUMP;
+ else if(xml_equal_string(node, "displacement_method", "both"))
+ state.displacement_method = Mesh::DISPLACE_BOTH;
+}
+
+/* Scene */
+
+static void xml_read_include(const XMLReadState& state, const string& src);
+
+static void xml_read_scene(const XMLReadState& state, pugi::xml_node scene_node)
+{
+ for(pugi::xml_node node = scene_node.first_child(); node; node = node.next_sibling()) {
+ if(string_iequals(node.name(), "film")) {
+ xml_read_film(state, node);
+ }
+ else if(string_iequals(node.name(), "integrator")) {
+ xml_read_integrator(state, node);
+ }
+ else if(string_iequals(node.name(), "camera")) {
+ xml_read_camera(state, node);
+ }
+ else if(string_iequals(node.name(), "shader")) {
+ xml_read_shader(state, node);
+ }
+ else if(string_iequals(node.name(), "background")) {
+ xml_read_background(state, node);
+ }
+ else if(string_iequals(node.name(), "mesh")) {
+ xml_read_mesh(state, node);
+ }
+ else if(string_iequals(node.name(), "patch")) {
+ xml_read_patch(state, node);
+ }
+ else if(string_iequals(node.name(), "light")) {
+ xml_read_light(state, node);
+ }
+ else if(string_iequals(node.name(), "transform")) {
+ XMLReadState substate = state;
+
+ xml_read_transform(node, substate.tfm);
+ xml_read_scene(substate, node);
+ }
+ else if(string_iequals(node.name(), "state")) {
+ XMLReadState substate = state;
+
+ xml_read_state(substate, node);
+ xml_read_scene(substate, node);
+ }
+ else if(string_iequals(node.name(), "include")) {
+ string src;
+
+ if(xml_read_string(&src, node, "src"))
+ xml_read_include(state, src);
+ }
+ else
+ fprintf(stderr, "Unknown node \"%s\".\n", node.name());
+ }
+}
+
+/* Include */
+
+static void xml_read_include(const XMLReadState& state, const string& src)
+{
+ /* open XML document */
+ pugi::xml_document doc;
+ pugi::xml_parse_result parse_result;
+
+ string path = path_join(state.base, src);
+ parse_result = doc.load_file(path.c_str());
+
+ if(parse_result) {
+ XMLReadState substate = state;
+ substate.base = path_dirname(path);
+
+ xml_read_scene(substate, doc);
+ }
+ else
+ fprintf(stderr, "%s read error: %s\n", src.c_str(), parse_result.description());
+}
+
+/* File */
+
+void xml_read_file(Scene *scene, const char *filepath)
+{
+ XMLReadState state;
+
+ state.scene = scene;
+ state.tfm = transform_identity();
+ state.shader = scene->default_surface;
+ state.smooth = false;
+ state.dicing_rate = 0.1f;
+ state.base = path_dirname(filepath);
+
+ xml_read_include(state, path_filename(filepath));
+
+ scene->params.bvh_type = SceneParams::BVH_STATIC;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/app/cycles_xml.h b/intern/cycles/app/cycles_xml.h
new file mode 100644
index 00000000000..90ec52922e1
--- /dev/null
+++ b/intern/cycles/app/cycles_xml.h
@@ -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.
+ */
+
+#ifndef __CYCLES_XML__
+#define __CYCLES_XML__
+
+CCL_NAMESPACE_BEGIN
+
+class Scene;
+
+void xml_read_file(Scene *scene, const char *filepath);
+
+CCL_NAMESPACE_END
+
+#endif /* __CYCLES_XML__ */
+
diff --git a/intern/cycles/blender/CMakeLists.txt b/intern/cycles/blender/CMakeLists.txt
new file mode 100644
index 00000000000..f3da1a30eb2
--- /dev/null
+++ b/intern/cycles/blender/CMakeLists.txt
@@ -0,0 +1,47 @@
+
+set(INC
+ ../render
+ ../device
+ ../kernel
+ ../kernel/svm
+ ../util
+ ../subd
+)
+
+set(INC_SYS
+ ${BLENDER_INCLUDE_DIRS}
+ ${PYTHON_INCLUDE_DIRS}
+ ${GLEW_INCLUDE_PATH}
+)
+
+
+set(SRC
+ blender_camera.cpp
+ blender_mesh.cpp
+ blender_object.cpp
+ blender_python.cpp
+ blender_session.cpp
+ blender_shader.cpp
+ blender_sync.cpp
+
+ blender_sync.h
+ blender_session.h
+ blender_util.h
+)
+
+set(ADDON_FILES
+ addon/__init__.py
+ addon/engine.py
+ addon/enums.py
+ addon/presets.py
+ addon/properties.py
+ addon/ui.py
+ addon/xml.py
+)
+
+blender_add_lib(bf_intern_cycles "${SRC}" "${INC}" "${INC_SYS}")
+
+add_dependencies(bf_intern_cycles bf_rna)
+
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${ADDON_FILES}" ${CYCLES_INSTALL_PATH})
+
diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py
new file mode 100644
index 00000000000..979e3e872d7
--- /dev/null
+++ b/intern/cycles/blender/addon/__init__.py
@@ -0,0 +1,90 @@
+#
+# 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.
+#
+
+bl_info = {
+ "name": "Cycles Render Engine",
+ "author": "",
+ "version": (0,0),
+ "blender": (2, 5, 6),
+ "api": 34462,
+ "location": "Info header, render engine menu",
+ "description": "Cycles Render Engine integration.",
+ "warning": "",
+ "wiki_url": "",
+ "tracker_url": "",
+ "category": "Render"}
+
+import bpy
+
+from cycles import ui
+from cycles import properties
+from cycles import xml
+from cycles import engine
+from cycles import presets
+
+class CyclesRender(bpy.types.RenderEngine):
+ bl_idname = 'CYCLES'
+ bl_label = "Cycles"
+ bl_use_shading_nodes = True
+
+ def __init__(self):
+ engine.init()
+ self.session = None
+
+ def __del__(self):
+ engine.free(self)
+
+ # final render
+ def update(self, data, scene):
+ engine.create(self, data, scene)
+ engine.update(self, data, scene)
+
+ def render(self, scene):
+ engine.render(self)
+
+ # preview render
+ # def preview_update(self, context, id):
+ # pass
+ #
+ # def preview_render(self):
+ # pass
+
+ # viewport render
+ def view_update(self, context):
+ if not self.session:
+ engine.create(self, context.blend_data, context.scene,
+ context.region, context.space_data, context.region_data)
+ engine.update(self, context.blend_data, context.scene)
+
+ def view_draw(self, context):
+ engine.draw(self, context.region, context.space_data, context.region_data)
+
+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()
+ bpy.utils.unregister_module(__name__)
+
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
new file mode 100644
index 00000000000..097909ca058
--- /dev/null
+++ b/intern/cycles/blender/addon/engine.py
@@ -0,0 +1,74 @@
+#
+# 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.
+#
+
+import bpy
+
+def init():
+ import bcycles
+ 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)
+
+def create(engine, data, scene, region = 0, v3d = 0, rv3d = 0):
+ import bcycles
+
+ data = data.as_pointer()
+ scene = scene.as_pointer()
+ if region:
+ region = region.as_pointer()
+ if v3d:
+ v3d = v3d.as_pointer()
+ if rv3d:
+ rv3d = rv3d.as_pointer()
+
+ engine.session = bcycles.create(engine.as_pointer(), data, scene, region, v3d, rv3d)
+
+def free(engine):
+ if "session" in dir(engine):
+ if engine.session:
+ import bcycles
+ bcycles.free(engine.session)
+ del engine.session
+
+def render(engine):
+ import bcycles
+ bcycles.render(engine.session)
+
+def update(engine, data, scene):
+ import bcycles
+ bcycles.sync(engine.session)
+
+def draw(engine, region, v3d, rv3d):
+ import bcycles
+ v3d = v3d.as_pointer()
+ rv3d = rv3d.as_pointer()
+
+ # draw render image
+ bcycles.draw(engine.session, v3d, rv3d)
+
+def available_devices():
+ import bcycles
+ return bcycles.available_devices()
+
+def with_osl():
+ import bcycles
+ return bcycles.with_osl()
+
diff --git a/intern/cycles/blender/addon/enums.py b/intern/cycles/blender/addon/enums.py
new file mode 100644
index 00000000000..4aef2553050
--- /dev/null
+++ b/intern/cycles/blender/addon/enums.py
@@ -0,0 +1,59 @@
+#
+# 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.
+#
+
+from cycles import engine
+
+def get_gpu_device():
+ available_devices = engine.available_devices()
+ cuda = 'cuda' in available_devices
+ opencl = 'opencl' in available_devices
+ if cuda and opencl:
+ gpu_string = "GPU"
+ elif cuda and not opencl:
+ gpu_string = "CUDA GPU"
+ else:
+ gpu_string = "OpenCL GPU"
+
+ return gpu_string
+
+devices = (
+("CPU", "CPU", "Processor"),
+("GPU", get_gpu_device(), "Graphics card"))
+
+gpu_type = (
+("CUDA", "CUDA", "NVidia only"),
+("OPENCL", "OpenCL (incomplete)", ""))
+
+shading_systems = (
+("GPU_COMPATIBLE", "GPU Compatible", "Restricted shading system compatible with GPU rendering"),
+("OSL", "Open Shading Language", "Open Shading Language shading system that only runs on the CPU"))
+
+displacement_methods = (
+("BUMP", "Bump", "Bump mapping to simulate the appearance of displacement"),
+("TRUE", "True", "Use true displacement only, requires fine subdivision"),
+("BOTH", "Both", "Combination of displacement and bump mapping"))
+
+bvh_types = (
+("DYNAMIC_BVH", "Dynamic BVH", "Objects can be individually updated, at the cost of slower render time"),
+("STATIC_BVH", "Static BVH", "Any object modification requires a complete BVH rebuild, but renders faster"))
+
+filter_types = (
+("BOX", "Box", "Box filter"),
+("GAUSSIAN", "Gaussian", "Gaussian filter"))
+
+
diff --git a/intern/cycles/blender/addon/presets.py b/intern/cycles/blender/addon/presets.py
new file mode 100644
index 00000000000..e5243b633be
--- /dev/null
+++ b/intern/cycles/blender/addon/presets.py
@@ -0,0 +1,53 @@
+#
+# 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.
+#
+
+from bl_operators.presets import AddPresetBase
+from bpy.types import Operator
+
+class AddPresetIntegrator(AddPresetBase, Operator):
+ '''Add an Integrator Preset'''
+ bl_idname = "render.cycles_integrator_preset_add"
+ bl_label = "Add Integrator Preset"
+ preset_menu = "CYCLES_MT_integrator_presets"
+
+ preset_defines = [
+ "cycles = bpy.context.scene.cycles"
+ ]
+
+ preset_values = [
+ "cycles.max_bounces",
+ "cycles.min_bounces",
+ "cycles.no_caustics",
+ "cycles.diffuse_bounces",
+ "cycles.glossy_bounces",
+ "cycles.transmission_bounces",
+ "cycles.transparent_min_bounces",
+ "cycles.transparent_max_bounces"
+ ]
+
+ preset_subdir = "cycles/integrator"
+
+def register():
+ pass
+
+def unregister():
+ pass
+
+if __name__ == "__main__":
+ register()
+
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
new file mode 100644
index 00000000000..5a56240865a
--- /dev/null
+++ b/intern/cycles/blender/addon/properties.py
@@ -0,0 +1,201 @@
+#
+# 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.
+#
+
+import bpy
+from bpy.props import *
+
+import math
+
+from cycles import enums
+
+class CyclesRenderSettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.Scene.cycles = PointerProperty(type=cls, name="Cycles Render Settings", description="Cycles render settings")
+
+ cls.device = EnumProperty(name="Device", description="Device to use for rendering",
+ items=enums.devices, default="CPU")
+
+ cls.gpu_type = EnumProperty(name="GPU Type", description="Processing system to use on the GPU",
+ items=enums.gpu_type, default="CUDA")
+
+ cls.shading_system = EnumProperty(name="Shading System", description="Shading system to use for rendering",
+ items=enums.shading_systems, default="GPU_COMPATIBLE")
+
+ cls.samples = IntProperty(name="Samples", description="Number of samples to render for each pixel",
+ default=10, min=1, max=2147483647)
+ cls.preview_samples = IntProperty(name="Preview Samples", description="Number of samples to render in the viewport, unlimited if 0",
+ default=10, min=0, max=2147483647)
+ cls.preview_pause = BoolProperty(name="Pause Preview", description="Pause all viewport preview renders",
+ default=False)
+
+ cls.no_caustics = BoolProperty(name="No Caustics", description="Leave out caustics, resulting in a darker image with less noise",
+ default=False)
+ cls.blur_caustics = FloatProperty(name="Blur Caustics", description="Blur caustics to reduce noise",
+ default=0.0, min=0.0, max=1.0)
+
+ cls.min_bounces = IntProperty(name="Min Bounces", description="Minimum number of bounces, setting this lower than the maximum enables probalistic path termination (faster but noisier)",
+ default=3, min=0, max=1024)
+ cls.max_bounces = IntProperty(name="Max Bounces", description="Total maximum number of bounces",
+ default=8, min=0, max=1024)
+
+ cls.diffuse_bounces = IntProperty(name="Diffuse Bounces", description="Maximum number of diffuse reflection bounces, bounded by total maximum",
+ default=128, min=0, max=1024)
+ cls.glossy_bounces = IntProperty(name="Glossy Bounces", description="Maximum number of glossy reflection bounces, bounded by total maximum",
+ default=128, min=0, max=1024)
+ cls.transmission_bounces = IntProperty(name="Transmission Bounces", description="Maximum number of transmission bounces, bounded by total maximum",
+ default=128, min=0, max=1024)
+
+ cls.transparent_min_bounces = IntProperty(name="Transparent Min Bounces", description="Minimum number of transparent bounces, setting this lower than the maximum enables probalistic path termination (faster but noisier)",
+ default=8, min=0, max=1024)
+ cls.transparent_max_bounces = IntProperty(name="Transparent Max Bounces", description="Maximum number of transparent bounces",
+ default=8, min=0, max=1024)
+ cls.use_transparent_shadows = BoolProperty(name="Transparent Shadows", description="Use transparency of surfaces for rendering shadows",
+ default=True)
+
+ cls.film_exposure = FloatProperty(name="Exposure", description="Image brightness scale",
+ default=1.0, min=0.0, max=10.0)
+ cls.film_transparent = BoolProperty(name="Transparent", description="World background is transparent",
+ default=False)
+
+ cls.filter_type = EnumProperty(name="Filter Type", description="Pixel filter type",
+ items=enums.filter_types, default="GAUSSIAN")
+ cls.filter_width = FloatProperty(name="Filter Width", description="Pixel filter width",
+ default=1.5, min=0.01, max=10.0)
+
+ cls.seed = IntProperty(name="Seed", description="Seed value for integrator to get different noise patterns",
+ default=0, min=0, max=2147483647)
+
+ cls.debug_tile_size = IntProperty(name="Tile Size", description="",
+ default=1024, min=1, max=4096)
+ cls.debug_min_size = IntProperty(name="Min Size", description="",
+ default=64, min=1, max=4096)
+ cls.debug_reset_timeout = FloatProperty(name="Reset timeout", description="",
+ default=0.1, min=0.01, max=10.0)
+ cls.debug_cancel_timeout = FloatProperty(name="Cancel timeout", description="",
+ default=0.1, min=0.01, max=10.0)
+ cls.debug_text_timeout = FloatProperty(name="Text timeout", description="",
+ default=1.0, min=0.01, max=10.0)
+
+ cls.debug_bvh_type = EnumProperty(name="Viewport BVH Type", description="Choose between faster updates, or faster render",
+ items=enums.bvh_types, default="DYNAMIC_BVH")
+ cls.debug_use_spatial_splits = BoolProperty(name="Use Spatial Splits", description="Use BVH spatial splits: longer builder time, faster render",
+ default=False)
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.Scene.cycles
+
+class CyclesCameraSettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.Camera.cycles = PointerProperty(type=cls, name="Cycles Camera Settings", description="Cycles camera settings")
+
+ cls.aperture_size = FloatProperty(name="Aperture Size", description="Radius of the aperture for depth of field",
+ default=0.0, min=0.0, max=10.0)
+ cls.aperture_blades = IntProperty(name="Aperture Blades", description="Number of blades in aperture for polygonal bokeh (need 3 or more)",
+ default=0, min=0, max=100)
+ cls.aperture_rotation = FloatProperty(name="Aperture Rotation", description="Rotation of blades in aperture",
+ default=0, soft_min=-math.pi, soft_max=math.pi, subtype='ANGLE')
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.Camera.cycles
+
+class CyclesMaterialSettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.Material.cycles = PointerProperty(type=cls, name="Cycles Material Settings", description="Cycles material settings")
+ cls.sample_as_light = BoolProperty(name="Sample as Light", description="Use direct light sampling, to reduce noise for small or strong emitting materials", default=True)
+ cls.homogeneous_volume = BoolProperty(name="Homogeneous Volume", description="When using volume rendering, assume volume has the same density everywhere, for faster rendering", default=False)
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.Material.cycles
+
+class CyclesLampSettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.Lamp.cycles = PointerProperty(type=cls, name="Cycles Lamp Settings", description="Cycles lamp settings")
+ cls.cast_shadow = BoolProperty(name="Cast Shadow", description="Lamp casts shadows", default=True)
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.Lamp.cycles
+
+class CyclesWorldSettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.World.cycles = PointerProperty(type=cls, name="Cycles World Settings", description="Cycles world settings")
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.World.cycles
+
+class CyclesVisibilitySettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.Object.cycles_visibility = PointerProperty(type=cls, name="Cycles Visibility Settings", description="Cycles visibility settings")
+
+ cls.camera = BoolProperty(name="Camera", description="Object visibility for camera rays", default=True)
+ cls.diffuse = BoolProperty(name="Diffuse", description="Object visibility for diffuse reflection rays", default=True)
+ cls.glossy = BoolProperty(name="Glossy", description="Object visibility for glossy reflection rays", default=True)
+ cls.transmission = BoolProperty(name="Transmission", description="Object visibility for transmission rays", default=True)
+ cls.shadow = BoolProperty(name="Shadow", description="Object visibility for shadow rays", default=True)
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.Object.cycles_visibility
+
+class CyclesMeshSettings(bpy.types.PropertyGroup):
+ @classmethod
+ def register(cls):
+ bpy.types.Mesh.cycles = PointerProperty(type=cls, name="Cycles Mesh Settings", description="Cycles mesh settings")
+ bpy.types.Curve.cycles = PointerProperty(type=cls, name="Cycles Mesh Settings", description="Cycles mesh settings")
+ bpy.types.MetaBall.cycles = PointerProperty(type=cls, name="Cycles Mesh Settings", description="Cycles mesh settings")
+
+ cls.displacement_method = EnumProperty(name="Displacement Method", description="Method to use for the displacement",
+ items=enums.displacement_methods, default="BUMP")
+ cls.use_subdivision = BoolProperty(name="Use Subdivision", description="Subdivide mesh for rendering",
+ default=False)
+ cls.dicing_rate = FloatProperty(name="Dicing Rate", description="", default=1.0, min=0.001, max=1000.0)
+
+ @classmethod
+ def unregister(cls):
+ del bpy.types.Mesh.cycles
+ del bpy.types.Curve.cycles
+ del bpy.types.MetaBall.cycles
+
+def register():
+ bpy.utils.register_class(CyclesRenderSettings)
+ bpy.utils.register_class(CyclesCameraSettings)
+ bpy.utils.register_class(CyclesMaterialSettings)
+ bpy.utils.register_class(CyclesLampSettings)
+ bpy.utils.register_class(CyclesWorldSettings)
+ bpy.utils.register_class(CyclesVisibilitySettings)
+ bpy.utils.register_class(CyclesMeshSettings)
+
+def unregister():
+ bpy.utils.unregister_class(CyclesRenderSettings)
+ bpy.utils.unregister_class(CyclesCameraSettings)
+ bpy.utils.unregister_class(CyclesMaterialSettings)
+ bpy.utils.unregister_class(CyclesLampSettings)
+ bpy.utils.unregister_class(CyclesWorldSettings)
+ bpy.utils.unregister_class(CyclesMeshSettings)
+ bpy.utils.unregister_class(CyclesVisibilitySettings)
+
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
new file mode 100644
index 00000000000..7c7d4c81b89
--- /dev/null
+++ b/intern/cycles/blender/addon/ui.py
@@ -0,0 +1,768 @@
+#
+# 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.
+#
+
+import bpy
+
+from bpy.types import Panel, Menu
+
+from cycles import enums
+from cycles import engine
+
+class CYCLES_MT_integrator_presets(Menu):
+ bl_label = "Integrator Presets"
+ preset_subdir = "cycles/integrator"
+ preset_operator = "script.execute_preset"
+ COMPAT_ENGINES = {'CYCLES'}
+ draw = Menu.draw_preset
+
+class CyclesButtonsPanel():
+ bl_space_type = "PROPERTIES"
+ bl_region_type = "WINDOW"
+ bl_context = "render"
+
+ @classmethod
+ def poll(cls, context):
+ rd = context.scene.render
+ return rd.engine == 'CYCLES'
+
+class CyclesRender_PT_integrator(CyclesButtonsPanel, Panel):
+ bl_label = "Integrator"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+ cscene = scene.cycles
+
+ row = layout.row(align=True)
+ row.menu("CYCLES_MT_integrator_presets", text=bpy.types.CYCLES_MT_integrator_presets.bl_label)
+ row.operator("render.cycles_integrator_preset_add", text="", icon="ZOOMIN")
+ row.operator("render.cycles_integrator_preset_add", text="", icon="ZOOMOUT").remove_active = True
+
+ split = layout.split()
+
+ col = split.column()
+ sub = col.column(align=True)
+ sub.label(text="Samples:")
+ sub.prop(cscene, "samples", text="Render")
+ sub.prop(cscene, "preview_samples", text="Preview")
+ sub.prop(cscene, "seed")
+
+ sub = col.column(align=True)
+ sub.label("Transparency:")
+ sub.prop(cscene, "transparent_max_bounces", text="Max")
+ sub.prop(cscene, "transparent_min_bounces", text="Min")
+ sub.prop(cscene, "use_transparent_shadows", text="Shadows")
+
+ col = split.column()
+
+ sub = col.column(align=True)
+ sub.label(text="Bounces:")
+ sub.prop(cscene, "max_bounces", text="Max")
+ sub.prop(cscene, "min_bounces", text="Min")
+
+ sub = col.column(align=True)
+ sub.label(text="Light Paths:")
+ sub.prop(cscene, "diffuse_bounces", text="Diffuse")
+ sub.prop(cscene, "glossy_bounces", text="Glossy")
+ sub.prop(cscene, "transmission_bounces", text="Transmission")
+ sub.prop(cscene, "no_caustics")
+
+ #row = col.row()
+ #row.prop(cscene, "blur_caustics")
+ #row.active = not cscene.no_caustics
+
+class CyclesRender_PT_film(CyclesButtonsPanel, Panel):
+ bl_label = "Film"
+
+ def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+ cscene = scene.cycles
+
+ split = layout.split()
+
+ col = split.column();
+ col.prop(cscene, "film_exposure")
+ col.prop(cscene, "film_transparent")
+
+ col = split.column()
+ sub = col.column(align=True)
+ sub.prop(cscene, "filter_type", text="")
+ if cscene.filter_type != 'BOX':
+ sub.prop(cscene, "filter_width", text="Width")
+
+class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
+ bl_label = "Performance"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+ rd = scene.render
+ cscene = scene.cycles
+
+ split = layout.split()
+
+ col = split.column(align=True)
+
+ col.label(text="Threads:")
+ col.row().prop(rd, "threads_mode", expand=True)
+ sub = col.column()
+ sub.enabled = rd.threads_mode == 'FIXED'
+ sub.prop(rd, "threads")
+
+ sub = col.column(align=True)
+ sub.label(text="Tiles:")
+ sub.prop(cscene, "debug_tile_size")
+ sub.prop(cscene, "debug_min_size")
+
+ col = split.column()
+
+ sub = col.column(align=True)
+ sub.label(text="Acceleration structure:")
+ sub.prop(cscene, "debug_bvh_type", text="")
+ sub.prop(cscene, "debug_use_spatial_splits")
+
+class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
+ bl_label = "Layers"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ scene = context.scene
+ rd = scene.render
+
+ # 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="")
+
+ row = layout.row()
+ # rl = rd.layers.active
+ rl = rd.layers[0]
+ row.prop(rl, "name")
+ #row.prop(rd, "use_single_layer", text="", icon_only=True)
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(scene, "layers", text="Scene")
+
+ col = split.column()
+ col.prop(rl, "layers", text="Layer")
+
+ layout.separator()
+
+ layout.prop(rl, "material_override", text="Material")
+
+class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
+ bl_label = "Post Processing"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ rd = context.scene.render
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(rd, "use_compositing")
+ col.prop(rd, "use_sequencer")
+
+ col = split.column()
+ col.prop(rd, "dither_intensity", text="Dither", slider=True)
+
+class CyclesCamera_PT_dof(CyclesButtonsPanel, Panel):
+ bl_label = "Depth of Field"
+ bl_context = "data"
+
+ @classmethod
+ def poll(cls, context):
+ return context.camera and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ cam = context.camera
+ ccam = cam.cycles
+
+ split = layout.split()
+
+ col = split.column()
+ col.label("Focus:")
+ col.prop(cam, "dof_object", text="")
+
+ sub = col.row()
+ sub.active = cam.dof_object is None
+ sub.prop(cam, "dof_distance", text="Distance")
+
+ col = split.column()
+
+ col.label("Aperture:")
+ col.prop(ccam, "aperture_size", text="Size")
+
+ sub = col.column(align=True)
+ sub.prop(ccam, "aperture_blades", text="Blades")
+ sub.prop(ccam, "aperture_rotation", text="Rotation")
+
+class Cycles_PT_context_material(CyclesButtonsPanel, Panel):
+ bl_label = "Surface"
+ bl_context = "material"
+ bl_options = {'HIDE_HEADER'}
+
+ @classmethod
+ def poll(cls, context):
+ return (context.material or context.object) and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material
+ ob = context.object
+ slot = context.material_slot
+ space = context.space_data
+
+ if ob:
+ row = layout.row()
+
+ row.template_list(ob, "material_slots", ob, "active_material_index", rows=2)
+
+ col = row.column(align=True)
+ col.operator("object.material_slot_add", icon='ZOOMIN', text="")
+ col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
+
+ col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="")
+
+ if ob.mode == 'EDIT':
+ row = layout.row(align=True)
+ row.operator("object.material_slot_assign", text="Assign")
+ row.operator("object.material_slot_select", text="Select")
+ row.operator("object.material_slot_deselect", text="Deselect")
+
+ split = layout.split(percentage=0.65)
+
+ if ob:
+ split.template_ID(ob, "active_material", new="material.new")
+ row = split.row()
+
+ if slot:
+ row.prop(slot, "link", text="")
+ else:
+ row.label()
+ elif mat:
+ split.template_ID(space, "pin_id")
+ split.separator()
+
+class Cycles_PT_mesh_displacement(CyclesButtonsPanel, Panel):
+ bl_label = "Displacement"
+ bl_context = "data"
+
+ @classmethod
+ def poll(cls, context):
+ return context.mesh or context.curve or context.meta_ball
+
+ def draw(self, context):
+ layout = self.layout
+
+ mesh = context.mesh
+ curve = context.curve
+ mball = context.meta_ball
+
+ if mesh:
+ cdata = mesh.cycles
+ elif curve:
+ cdata = curve.cycles
+ elif mball:
+ cdata = mball.cycles
+
+ layout.prop(cdata, "displacement_method", text="Method")
+ layout.prop(cdata, "use_subdivision");
+ layout.prop(cdata, "dicing_rate");
+
+class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
+ bl_label = "Ray Visibility"
+ bl_context = "object"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ ob = context.object
+ return CyclesButtonsPanel.poll(context) and ob and ob.type in ('MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 'META') # todo: 'LAMP'
+
+ def draw(self, context):
+ layout = self.layout
+
+ ob = context.object
+ visibility = ob.cycles_visibility
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(visibility, "camera")
+ col.prop(visibility, "diffuse")
+ col.prop(visibility, "glossy")
+
+ col = split.column()
+ col.prop(visibility, "transmission")
+ col.prop(visibility, "shadow")
+
+def find_node(material, nodetype):
+ if material and material.node_tree:
+ ntree = material.node_tree
+
+ for node in ntree.nodes:
+ if hasattr(node, 'type') and node.type == nodetype:
+ return node
+
+ return None
+
+def find_node_input(node, name):
+ for input in node.inputs:
+ if input.name == name:
+ return input
+
+ return None
+
+def panel_node_draw(layout, id, output_type, input_name):
+ if not id.node_tree:
+ layout.prop(id, "use_nodes", icon='NODETREE')
+ return False
+
+ ntree = id.node_tree
+
+ node = find_node(id, output_type)
+ if not node:
+ layout.label(text="No output node.")
+ else:
+ input = find_node_input(node, input_name)
+ layout.template_node_view(ntree, node, input);
+
+ return True
+
+class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
+ bl_label = "Lamp"
+ bl_context = "data"
+
+ @classmethod
+ def poll(cls, context):
+ return context.lamp and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ lamp = context.lamp
+ clamp = lamp.cycles
+
+ layout.prop(lamp, "type", expand=True)
+
+ split = layout.split()
+ col = split.column(align=True)
+
+ if lamp.type in ('POINT', 'SUN', 'SPOT'):
+ col.prop(lamp, "shadow_soft_size", text="Size")
+ elif lamp.type == 'AREA':
+ col.prop(lamp, "shape", text="")
+ sub = col.column(align=True)
+
+ if lamp.shape == 'SQUARE':
+ sub.prop(lamp, "size")
+ elif lamp.shape == 'RECTANGLE':
+ sub.prop(lamp, "size", text="Size X")
+ sub.prop(lamp, "size_y", text="Size Y")
+
+ col = split.column()
+ col.prop(clamp, "cast_shadow")
+
+ if lamp.type == 'SPOT':
+ layout.label(text="Not supported, interpreted as point lamp.")
+ elif lamp.type == 'HEMI':
+ layout.label(text="Not supported, interpreted as sun lamp.")
+
+class CyclesLamp_PT_nodes(CyclesButtonsPanel, Panel):
+ bl_label = "Nodes"
+ bl_context = "data"
+
+ @classmethod
+ def poll(cls, context):
+ return context.lamp and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ lamp = context.lamp
+ if not panel_node_draw(layout, lamp, 'OUTPUT_LAMP', 'Surface'):
+ layout.prop(lamp, "color")
+
+class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel):
+ bl_label = "Surface"
+ bl_context = "world"
+
+ @classmethod
+ def poll(cls, context):
+ return context.world and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ world = context.world
+ if not panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Surface'):
+ layout.prop(world, "horizon_color", text="Color")
+
+class CyclesWorld_PT_volume(CyclesButtonsPanel, Panel):
+ bl_label = "Volume"
+ bl_context = "world"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ world = context.world
+ return False # world and world.node_tree and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+ layout.active = False
+
+ world = context.world
+ panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Volume')
+
+class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel):
+ bl_label = "Surface"
+ bl_context = "material"
+
+ @classmethod
+ def poll(cls, context):
+ return context.material and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material
+ if not panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Surface'):
+ layout.prop(mat, "diffuse_color")
+
+class CyclesMaterial_PT_volume(CyclesButtonsPanel, Panel):
+ bl_label = "Volume"
+ bl_context = "material"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ return False #mat and mat.node_tree and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+ layout.active = False
+
+ mat = context.material
+ cmat = mat.cycles
+
+ panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Volume')
+
+ layout.prop(cmat, "homogeneous_volume")
+
+class CyclesMaterial_PT_displacement(CyclesButtonsPanel, Panel):
+ bl_label = "Displacement"
+ bl_context = "material"
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ return mat and mat.node_tree and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material
+ panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Displacement')
+
+class CyclesMaterial_PT_settings(CyclesButtonsPanel, Panel):
+ bl_label = "Settings"
+ bl_context = "material"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ return context.material and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material
+ cmat = mat.cycles
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(mat, "diffuse_color", text="Viewport Color")
+
+ col = split.column()
+ col.prop(cmat, "sample_as_light")
+
+class CyclesTexture_PT_context(CyclesButtonsPanel, Panel):
+ bl_label = ""
+ bl_context = "texture"
+ bl_options = {'HIDE_HEADER'}
+ COMPAT_ENGINES = {'CYCLES'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ tex = context.texture
+ space = context.space_data
+ pin_id = space.pin_id
+ use_pin_id = space.use_pin_id;
+ user = context.texture_user
+ node = context.texture_node
+
+ if not use_pin_id or not isinstance(pin_id, bpy.types.Texture):
+ pin_id = None
+
+ if not pin_id:
+ layout.template_texture_user()
+
+ if user:
+ layout.separator()
+
+ split = layout.split(percentage=0.65)
+ col = split.column()
+
+ if pin_id:
+ col.template_ID(space, "pin_id")
+ elif user:
+ col.template_ID(user, "texture", new="texture.new")
+
+ if tex:
+ row = split.row()
+ row.prop(tex, "use_nodes", icon="NODETREE", text="")
+ row.label()
+
+ if not tex.use_nodes:
+ split = layout.split(percentage=0.2)
+ split.label(text="Type:")
+ split.prop(tex, "type", text="")
+
+class CyclesTexture_PT_nodes(CyclesButtonsPanel, Panel):
+ bl_label = "Nodes"
+ bl_context = "texture"
+
+ @classmethod
+ def poll(cls, context):
+ tex = context.texture
+ return (tex and tex.use_nodes) and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ tex = context.texture
+ panel_node_draw(layout, tex, 'OUTPUT_TEXTURE', 'Color')
+
+class CyclesTexture_PT_node(CyclesButtonsPanel, Panel):
+ bl_label = "Node"
+ bl_context = "texture"
+
+ @classmethod
+ def poll(cls, context):
+ node = context.texture_node
+ return node and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ node = context.texture_node
+ ntree = node.id_data
+ layout.template_node_view(ntree, node, None)
+
+class CyclesTexture_PT_mapping(CyclesButtonsPanel, Panel):
+ bl_label = "Mapping"
+ bl_context = "texture"
+
+ @classmethod
+ def poll(cls, context):
+ tex = context.texture
+ node = context.texture_node
+ return (node or (tex and tex.use_nodes)) and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ tex = context.texture
+ node = context.texture_node
+
+ mapping = node.texture_mapping
+
+ row = layout.row()
+
+ row.column().prop(mapping, "location")
+ row.column().prop(mapping, "rotation")
+ row.column().prop(mapping, "scale")
+
+ layout.label(text="Projection:")
+
+ row = layout.row()
+ row.prop(mapping, "mapping_x", text="")
+ row.prop(mapping, "mapping_y", text="")
+ row.prop(mapping, "mapping_z", text="")
+
+class CyclesTexture_PT_colors(CyclesButtonsPanel, Panel):
+ bl_label = "Color"
+ bl_context = "texture"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ tex = context.texture
+ node = context.texture_node
+ return False
+ #return (node or (tex and tex.use_nodes)) and CyclesButtonsPanel.poll(context)
+
+ def draw(self, context):
+ layout = self.layout
+
+ tex = context.texture
+ node = context.texture_node
+
+ mapping = node.color_mapping
+
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Blend:")
+ col.prop(mapping, "blend_type", text="")
+ col.prop(mapping, "blend_factor", text="Factor")
+ col.prop(mapping, "blend_color", text="")
+
+ col = split.column()
+ col.label(text="Adjust:")
+ col.prop(mapping, "brightness")
+ col.prop(mapping, "contrast")
+ col.prop(mapping, "saturation")
+
+ layout.separator()
+
+ layout.prop(mapping, "use_color_ramp", text="Ramp")
+ if mapping.use_color_ramp:
+ layout.template_color_ramp(mapping, "color_ramp", expand=True)
+
+def draw_device(self, context):
+ scene = context.scene
+ layout = self.layout
+
+ if scene.render.engine == "CYCLES":
+ cscene = scene.cycles
+
+ available_devices = engine.available_devices()
+ available_cuda = 'cuda' in available_devices
+ available_opencl = '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():
+ layout.prop(cscene, "shading_system")
+
+def draw_pause(self, context):
+ layout = self.layout
+ scene = context.scene
+
+ if scene.render.engine == "CYCLES":
+ view = context.space_data
+
+ if view.viewport_shade == "RENDERED":
+ cscene = scene.cycles
+ layout.prop(cscene, "preview_pause", icon="PAUSE", text="")
+
+def get_panels():
+ return [
+ bpy.types.RENDER_PT_render,
+ bpy.types.RENDER_PT_output,
+ bpy.types.RENDER_PT_encoding,
+ bpy.types.RENDER_PT_dimensions,
+ bpy.types.RENDER_PT_stamp,
+ bpy.types.WORLD_PT_context_world,
+ bpy.types.DATA_PT_context_mesh,
+ bpy.types.DATA_PT_context_camera,
+ bpy.types.DATA_PT_context_lamp,
+ bpy.types.DATA_PT_texture_space,
+ bpy.types.DATA_PT_curve_texture_space,
+ bpy.types.DATA_PT_mball_texture_space,
+ bpy.types.DATA_PT_vertex_groups,
+ bpy.types.DATA_PT_shape_keys,
+ bpy.types.DATA_PT_uv_texture,
+ bpy.types.DATA_PT_vertex_colors,
+ bpy.types.DATA_PT_camera,
+ bpy.types.DATA_PT_camera_display,
+ bpy.types.DATA_PT_lens,
+ bpy.types.DATA_PT_custom_props_mesh,
+ bpy.types.DATA_PT_custom_props_camera,
+ bpy.types.DATA_PT_custom_props_lamp,
+ bpy.types.TEXTURE_PT_clouds,
+ bpy.types.TEXTURE_PT_wood,
+ bpy.types.TEXTURE_PT_marble,
+ bpy.types.TEXTURE_PT_magic,
+ bpy.types.TEXTURE_PT_blend,
+ bpy.types.TEXTURE_PT_stucci,
+ bpy.types.TEXTURE_PT_image,
+ bpy.types.TEXTURE_PT_image_sampling,
+ bpy.types.TEXTURE_PT_image_mapping,
+ bpy.types.TEXTURE_PT_musgrave,
+ bpy.types.TEXTURE_PT_voronoi,
+ bpy.types.TEXTURE_PT_distortednoise,
+ bpy.types.TEXTURE_PT_voxeldata,
+ bpy.types.TEXTURE_PT_pointdensity,
+ bpy.types.TEXTURE_PT_pointdensity_turbulence,
+ bpy.types.PARTICLE_PT_context_particles,
+ bpy.types.PARTICLE_PT_emission,
+ bpy.types.PARTICLE_PT_hair_dynamics,
+ bpy.types.PARTICLE_PT_cache,
+ bpy.types.PARTICLE_PT_velocity,
+ bpy.types.PARTICLE_PT_rotation,
+ bpy.types.PARTICLE_PT_physics,
+ bpy.types.PARTICLE_PT_boidbrain,
+ bpy.types.PARTICLE_PT_render,
+ bpy.types.PARTICLE_PT_draw,
+ bpy.types.PARTICLE_PT_children,
+ bpy.types.PARTICLE_PT_field_weights,
+ bpy.types.PARTICLE_PT_force_fields,
+ bpy.types.PARTICLE_PT_vertexgroups,
+ bpy.types.PARTICLE_PT_custom_props]
+
+def register():
+ bpy.types.RENDER_PT_render.append(draw_device)
+ bpy.types.VIEW3D_HT_header.append(draw_pause)
+
+ for panel in get_panels():
+ panel.COMPAT_ENGINES.add('CYCLES')
+
+def unregister():
+ bpy.types.RENDER_PT_render.remove(draw_device)
+ bpy.types.VIEW3D_HT_header.remove(draw_pause)
+
+ for panel in get_panels():
+ panel.COMPAT_ENGINES.remove('CYCLES')
+
diff --git a/intern/cycles/blender/addon/xml.py b/intern/cycles/blender/addon/xml.py
new file mode 100644
index 00000000000..3713da09235
--- /dev/null
+++ b/intern/cycles/blender/addon/xml.py
@@ -0,0 +1,99 @@
+#
+# 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.
+#
+
+# 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
+
+def strip(root):
+ root.text = None
+ root.tail = None
+
+ for elem in root:
+ strip(elem)
+
+def write(node, fname):
+ strip(node)
+
+ s = etree.tostring(node)
+ s = dom.parseString(s).toprettyxml()
+
+ f = open(fname, "w")
+ f.write(s)
+
+class ExportCyclesXML(bpy.types.Operator, ExportHelper):
+ ''''''
+ bl_idname = "export_mesh.cycles_xml"
+ bl_label = "Export Cycles XML"
+
+ filename_ext = ".xml"
+
+ @classmethod
+ def poll(cls, context):
+ return context.active_object != None
+
+ def execute(self, context):
+ filepath = bpy.path.ensure_ext(self.filepath, ".xml")
+
+ # get mesh
+ scene = context.scene
+ object = context.object
+
+ if not object:
+ raise Exception("No active object")
+
+ mesh = object.to_mesh(scene, True, 'PREVIEW')
+
+ if not mesh:
+ raise Exception("No mesh data in active object")
+
+ # generate mesh node
+ nverts = ""
+ verts = ""
+ P = ""
+
+ for v in mesh.vertices:
+ P += "%f %f %f " % (v.co[0], v.co[1], v.co[2])
+
+ for i, f in enumerate(mesh.faces):
+ nverts += str(len(f.vertices)) + " "
+
+ for v in f.vertices:
+ verts += str(v) + " "
+ verts += " "
+
+ node = etree.Element('mesh', attrib={'nverts': nverts, 'verts': verts, 'P': P})
+
+ # write to file
+ write(node, filepath)
+
+ return {'FINISHED'}
+
+def register():
+ pass
+
+def unregister():
+ pass
+
+if __name__ == "__main__":
+ register()
+
diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp
new file mode 100644
index 00000000000..2a2c2a7c643
--- /dev/null
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -0,0 +1,290 @@
+/*
+ * 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 "camera.h"
+#include "scene.h"
+
+#include "blender_sync.h"
+#include "blender_util.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Blender Camera Intermediate: we first convert both the offline and 3d view
+ * render camera to this, and from there convert to our native camera format. */
+
+struct BlenderCamera {
+ float nearclip;
+ float farclip;
+
+ bool ortho;
+ float ortho_scale;
+
+ float lens;
+
+ float aperturesize;
+ uint apertureblades;
+ float aperturerotation;
+ float focaldistance;
+
+ float2 shift;
+ float2 offset;
+ float zoom;
+
+ float2 pixelaspect;
+
+ enum { AUTO, HORIZONTAL, VERTICAL } sensor_fit;
+ float sensor_width;
+ float sensor_height;
+
+ Transform matrix;
+};
+
+static void blender_camera_init(BlenderCamera *bcam)
+{
+ memset(bcam, 0, sizeof(BlenderCamera));
+
+ bcam->zoom = 1.0f;
+ bcam->pixelaspect = make_float2(1.0f, 1.0f);
+ bcam->sensor_width = 32.0f;
+ bcam->sensor_height = 18.0f;
+ bcam->sensor_fit = BlenderCamera::AUTO;
+}
+
+static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
+{
+ BL::Object b_dof_object = b_camera.dof_object();
+
+ 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());
+ Transform dofmat = get_transform(b_dof_object.matrix_world());
+
+ 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);
+}
+
+static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob)
+{
+ BL::ID b_ob_data = b_ob.data();
+
+ if(b_ob_data.is_a(&RNA_Camera)) {
+ BL::Camera b_camera(b_ob_data);
+ PointerRNA ccamera = RNA_pointer_get(&b_camera.ptr, "cycles");
+
+ bcam->nearclip = b_camera.clip_start();
+ bcam->farclip = b_camera.clip_end();
+
+ bcam->ortho = (b_camera.type() == BL::Camera::type_ORTHO);
+ bcam->ortho_scale = b_camera.ortho_scale();
+
+ bcam->lens = b_camera.lens();
+ bcam->aperturesize = RNA_float_get(&ccamera, "aperture_size");
+ bcam->apertureblades = RNA_int_get(&ccamera, "aperture_blades");
+ bcam->aperturerotation = RNA_float_get(&ccamera, "aperture_rotation");
+ bcam->focaldistance = blender_camera_focal_distance(b_ob, b_camera);
+
+ bcam->shift.x = b_camera.shift_x();
+ bcam->shift.y = b_camera.shift_y();
+
+ bcam->sensor_width = b_camera.sensor_width();
+ bcam->sensor_height = b_camera.sensor_height();
+
+ if(b_camera.sensor_fit() == BL::Camera::sensor_fit_AUTO)
+ bcam->sensor_fit = BlenderCamera::AUTO;
+ else if(b_camera.sensor_fit() == BL::Camera::sensor_fit_HORIZONTAL)
+ bcam->sensor_fit = BlenderCamera::HORIZONTAL;
+ else
+ bcam->sensor_fit = BlenderCamera::VERTICAL;
+ }
+ else {
+ /* from lamp not implemented yet */
+ }
+}
+
+static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height)
+{
+ /* copy camera to compare later */
+ Camera prevcam = *cam;
+
+ /* dimensions */
+ float xratio = width*bcam->pixelaspect.x;
+ float yratio = height*bcam->pixelaspect.y;
+
+ /* compute x/y aspect and ratio */
+ float aspectratio, xaspect, yaspect;
+
+ /* sensor fitting */
+ bool horizontal_fit;
+ float sensor_size;
+
+ if(bcam->sensor_fit == BlenderCamera::AUTO) {
+ horizontal_fit = (xratio > yratio);
+ sensor_size = bcam->sensor_width;
+ }
+ else if(bcam->sensor_fit == BlenderCamera::HORIZONTAL) {
+ horizontal_fit = true;
+ sensor_size = bcam->sensor_width;
+ }
+ else {
+ horizontal_fit = false;
+ sensor_size = bcam->sensor_height;
+ }
+
+ if(horizontal_fit) {
+ aspectratio= xratio/yratio;
+ xaspect= aspectratio;
+ yaspect= 1.0f;
+ }
+ else {
+ aspectratio= yratio/xratio;
+ xaspect= 1.0f;
+ yaspect= aspectratio;
+ }
+
+ /* modify aspect for orthographic scale */
+ if(bcam->ortho) {
+ xaspect = xaspect*bcam->ortho_scale/(aspectratio*2.0f);
+ yaspect = yaspect*bcam->ortho_scale/(aspectratio*2.0f);
+ aspectratio = bcam->ortho_scale/2.0f;
+ }
+
+ /* set viewplane */
+ cam->left = -xaspect;
+ cam->right = xaspect;
+ cam->bottom = -yaspect;
+ cam->top = yaspect;
+
+ /* zoom for 3d camera view */
+ cam->left *= bcam->zoom;
+ cam->right *= bcam->zoom;
+ cam->bottom *= bcam->zoom;
+ cam->top *= bcam->zoom;
+
+ /* modify viewplane with camera shift and 3d camera view offset */
+ float dx = 2.0f*(aspectratio*bcam->shift.x + bcam->offset.x*xaspect*2.0f);
+ float dy = 2.0f*(aspectratio*bcam->shift.y + bcam->offset.y*yaspect*2.0f);
+
+ cam->left += dx;
+ cam->right += dx;
+ cam->bottom += dy;
+ cam->top += dy;
+
+ /* clipping distances */
+ cam->nearclip = bcam->nearclip;
+ cam->farclip = bcam->farclip;
+
+ /* orthographic */
+ cam->ortho = bcam->ortho;
+
+ /* perspective */
+ cam->fov = 2.0f*atan((0.5f*sensor_size)/bcam->lens/aspectratio);
+ cam->focaldistance = bcam->focaldistance;
+ cam->aperturesize = bcam->aperturesize;
+ cam->blades = bcam->apertureblades;
+ cam->bladesrotation = bcam->aperturerotation;
+
+ /* transform, note the blender camera points along the negative z-axis */
+ cam->matrix = bcam->matrix * transform_scale(1.0f, 1.0f, -1.0f);
+
+ /* set update flag */
+ if(cam->modified(prevcam))
+ cam->tag_update();
+}
+
+/* Sync Render Camera */
+
+void BlenderSync::sync_camera(int width, int height)
+{
+ BlenderCamera bcam;
+ blender_camera_init(&bcam);
+
+ /* pixel aspect */
+ BL::RenderSettings r = b_scene.render();
+
+ bcam.pixelaspect.x = r.pixel_aspect_x();
+ bcam.pixelaspect.y = r.pixel_aspect_y();
+
+ /* camera object */
+ BL::Object b_ob = b_scene.camera();
+
+ if(b_ob) {
+ blender_camera_from_object(&bcam, b_ob);
+ bcam.matrix = get_transform(b_ob.matrix_world());
+ }
+
+ /* sync */
+ Camera *cam = scene->camera;
+ blender_camera_sync(cam, &bcam, width, height);
+}
+
+/* Sync 3D View Camera */
+
+void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
+{
+ BlenderCamera bcam;
+ blender_camera_init(&bcam);
+
+ /* 3d view parameters */
+ bcam.nearclip = b_v3d.clip_start();
+ bcam.farclip = b_v3d.clip_end();
+ bcam.lens = b_v3d.lens();
+
+ if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_CAMERA) {
+ /* camera view */
+ BL::Object b_ob = b_scene.camera();
+
+ if(b_ob) {
+ blender_camera_from_object(&bcam, b_ob);
+
+ /* magic zoom formula */
+ bcam.zoom = (float)b_rv3d.view_camera_zoom();
+ bcam.zoom = (1.41421f + bcam.zoom/50.0f);
+ bcam.zoom *= bcam.zoom;
+ bcam.zoom = 2.0f/bcam.zoom;
+
+ /* offset */
+ bcam.offset = get_float2(b_rv3d.view_camera_offset());
+ }
+ }
+ else if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_ORTHO) {
+ /* orthographic view */
+ bcam.farclip *= 0.5;
+ bcam.nearclip = -bcam.farclip;
+
+ bcam.ortho = true;
+ bcam.ortho_scale = b_rv3d.view_distance();
+ }
+
+ bcam.zoom *= 2.0f;
+
+ /* 3d view transform */
+ bcam.matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
+
+ /* sync */
+ blender_camera_sync(scene->camera, &bcam, width, height);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
new file mode 100644
index 00000000000..56e8561d64b
--- /dev/null
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -0,0 +1,321 @@
+/*
+ * 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 "mesh.h"
+#include "object.h"
+#include "scene.h"
+
+#include "blender_sync.h"
+#include "blender_util.h"
+
+#include "subd_mesh.h"
+#include "subd_patch.h"
+#include "subd_split.h"
+
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Find/Add */
+
+static bool mesh_need_attribute(Scene *scene, Mesh *mesh, Attribute::Standard std)
+{
+ if(std == Attribute::STD_NONE)
+ return false;
+
+ foreach(uint shader, mesh->used_shaders)
+ if(scene->shaders[shader]->attributes.find(std))
+ return true;
+
+ return false;
+}
+
+static bool mesh_need_attribute(Scene *scene, Mesh *mesh, ustring name)
+{
+ if(name == ustring())
+ return false;
+
+ foreach(uint shader, mesh->used_shaders)
+ if(scene->shaders[shader]->attributes.find(name))
+ return true;
+
+ return false;
+}
+
+static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<uint>& used_shaders)
+{
+ /* create vertices */
+ BL::Mesh::vertices_iterator v;
+
+ for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
+ mesh->verts.push_back(get_float3(v->co()));
+
+ /* create vertex normals */
+ Attribute *attr_N = mesh->attributes.add(Attribute::STD_VERTEX_NORMAL);
+ float3 *N = attr_N->data_float3();
+
+ for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v, ++N)
+ *N= get_float3(v->normal());
+
+ /* create faces */
+ BL::Mesh::faces_iterator f;
+ vector<int> nverts;
+
+ 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()];
+ bool smooth = f->use_smooth();
+
+ mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth);
+
+ if(n == 4)
+ mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth);
+
+ nverts.push_back(n);
+ }
+
+ /* create generated coordinates. todo: we should actually get the orco
+ coordinates from modifiers, for now we use texspace loc/size which
+ is available in the api. */
+ if(mesh_need_attribute(scene, mesh, Attribute::STD_GENERATED)) {
+ Attribute *attr = mesh->attributes.add(Attribute::STD_GENERATED);
+ float3 loc = get_float3(b_mesh.texspace_location());
+ float3 size = get_float3(b_mesh.texspace_size());
+
+ if(size.x != 0.0f) size.x = 0.5f/size.x;
+ if(size.y != 0.0f) size.y = 0.5f/size.y;
+ if(size.z != 0.0f) size.z = 0.5f/size.z;
+
+ loc = loc*size - make_float3(0.5f, 0.5f, 0.5f);
+
+ float3 *fdata = attr->data_float3();
+ BL::Mesh::vertices_iterator v;
+ size_t i = 0;
+
+ for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
+ fdata[i++] = get_float3(v->co())*size - loc;
+ }
+
+ /* create vertex color attributes */
+ {
+ BL::Mesh::vertex_colors_iterator l;
+
+ for(b_mesh.vertex_colors.begin(l); l != b_mesh.vertex_colors.end(); ++l) {
+ if(!mesh_need_attribute(scene, mesh, ustring(l->name().c_str())))
+ continue;
+
+ Attribute *attr = mesh->attributes.add(
+ ustring(l->name().c_str()), TypeDesc::TypeColor, Attribute::CORNER);
+
+ BL::MeshColorLayer::data_iterator c;
+ float3 *fdata = attr->data_float3();
+ size_t i = 0;
+
+ for(l->data.begin(c); c != l->data.end(); ++c, ++i) {
+ fdata[0] = color_srgb_to_scene_linear(get_float3(c->color1()));
+ fdata[1] = color_srgb_to_scene_linear(get_float3(c->color2()));
+ fdata[2] = color_srgb_to_scene_linear(get_float3(c->color3()));
+
+ if(nverts[i] == 4) {
+ fdata[3] = fdata[0];
+ fdata[4] = fdata[2];
+ fdata[5] = color_srgb_to_scene_linear(get_float3(c->color4()));
+ fdata += 6;
+ }
+ else
+ fdata += 3;
+ }
+ }
+ }
+
+ /* create uv layer attributes */
+ {
+ BL::Mesh::uv_textures_iterator l;
+
+ for(b_mesh.uv_textures.begin(l); l != b_mesh.uv_textures.end(); ++l) {
+ Attribute::Standard std = (l->active_render())? Attribute::STD_UV: Attribute::STD_NONE;
+ ustring name = ustring(l->name().c_str());
+
+ if(!(mesh_need_attribute(scene, mesh, name) || mesh_need_attribute(scene, mesh, std)))
+ continue;
+
+ Attribute *attr;
+
+ if(l->active_render())
+ attr = mesh->attributes.add(std, name);
+ else
+ attr = mesh->attributes.add(name, TypeDesc::TypePoint, Attribute::CORNER);
+
+ BL::MeshTextureFaceLayer::data_iterator t;
+ float3 *fdata = attr->data_float3();
+ size_t i = 0;
+
+ for(l->data.begin(t); t != l->data.end(); ++t, ++i) {
+ fdata[0] = get_float3(t->uv1());
+ fdata[1] = get_float3(t->uv2());
+ fdata[2] = get_float3(t->uv3());
+ fdata += 3;
+
+ if(nverts[i] == 4) {
+ fdata[0] = get_float3(t->uv1());
+ fdata[1] = get_float3(t->uv3());
+ fdata[2] = get_float3(t->uv4());
+ fdata += 3;
+ }
+ }
+ }
+ }
+}
+
+static void create_subd_mesh(Mesh *mesh, BL::Mesh b_mesh, PointerRNA *cmesh, const vector<uint>& used_shaders)
+{
+ /* create subd mesh */
+ SubdMesh sdmesh;
+
+ /* create vertices */
+ BL::Mesh::vertices_iterator v;
+
+ for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
+ sdmesh.add_vert(get_float3(v->co()));
+
+ /* create faces */
+ BL::Mesh::faces_iterator f;
+
+ 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()];
+
+ if(n == 4)
+ sdmesh.add_face(vi[0], vi[1], vi[2], vi[3]);
+ /*else
+ sdmesh.add_face(vi[0], vi[1], vi[2]);*/
+ }
+
+ /* finalize subd mesh */
+ sdmesh.link_boundary();
+
+ /* subdivide */
+ DiagSplit dsplit;
+ dsplit.camera = NULL;
+ dsplit.dicing_rate = RNA_float_get(cmesh, "dicing_rate");
+
+ sdmesh.tesselate(&dsplit, false, mesh, used_shaders[0], true);
+}
+
+/* Sync */
+
+Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated)
+{
+ /* test if we can instance or if the object is modified */
+ BL::ID b_ob_data = b_ob.data();
+ BL::ID key = (object_is_modified(b_ob))? b_ob: b_ob_data;
+
+ /* find shader indices */
+ vector<uint> used_shaders;
+
+ 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);
+ else
+ find_shader(slot->material(), used_shaders);
+ }
+
+ if(used_shaders.size() == 0)
+ used_shaders.push_back(scene->default_surface);
+
+ /* test if we need to sync */
+ Mesh *mesh;
+
+ if(!mesh_map.sync(&mesh, key)) {
+ /* if transform was applied to mesh, need full update */
+ if(object_updated && mesh->transform_applied);
+ /* test if shaders changed, these can be object level so mesh
+ does not get tagged for recalc */
+ else if(mesh->used_shaders != used_shaders);
+ else {
+ /* even if not tagged for recalc, we may need to sync anyway
+ * because the shader needs different mesh attributes */
+ bool attribute_recalc = false;
+
+ foreach(uint shader, mesh->used_shaders)
+ if(scene->shaders[shader]->need_update_attributes)
+ attribute_recalc = true;
+
+ if(!attribute_recalc)
+ return mesh;
+ }
+ }
+
+ /* ensure we only sync instanced meshes once */
+ if(mesh_synced.find(mesh) != mesh_synced.end())
+ return mesh;
+
+ mesh_synced.insert(mesh);
+
+ /* create derived mesh */
+ BL::Mesh b_mesh = object_to_mesh(b_ob, b_scene, true, !preview);
+ PointerRNA cmesh = RNA_pointer_get(&b_ob_data.ptr, "cycles");
+
+ vector<Mesh::Triangle> oldtriangle = mesh->triangles;
+
+ mesh->clear();
+ mesh->used_shaders = used_shaders;
+ mesh->name = ustring(b_ob_data.name().c_str());
+
+ if(b_mesh) {
+ if(cmesh.data && RNA_boolean_get(&cmesh, "use_subdivision"))
+ create_subd_mesh(mesh, b_mesh, &cmesh, used_shaders);
+ else
+ create_mesh(scene, mesh, b_mesh, used_shaders);
+
+ /* free derived mesh */
+ object_remove_mesh(b_data, b_mesh);
+ }
+
+ /* displacement method */
+ if(cmesh.data) {
+ int method = RNA_enum_get(&cmesh, "displacement_method");
+
+ if(method == 0)
+ mesh->displacement_method = Mesh::DISPLACE_BUMP;
+ else if(method == 1)
+ mesh->displacement_method = Mesh::DISPLACE_TRUE;
+ else
+ mesh->displacement_method = Mesh::DISPLACE_BOTH;
+ }
+
+ /* tag update */
+ bool rebuild = false;
+
+ if(oldtriangle.size() != mesh->triangles.size())
+ rebuild = true;
+ else if(oldtriangle.size()) {
+ if(memcmp(&oldtriangle[0], &mesh->triangles[0], sizeof(Mesh::Triangle)*oldtriangle.size()) != 0)
+ rebuild = true;
+ }
+
+ mesh->tag_update(scene, rebuild);
+
+ return mesh;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
new file mode 100644
index 00000000000..abadee9328e
--- /dev/null
+++ b/intern/cycles/blender/blender_object.cpp
@@ -0,0 +1,263 @@
+/*
+ * 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 "light.h"
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+
+#include "blender_sync.h"
+#include "blender_util.h"
+
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Utilities */
+
+bool BlenderSync::object_is_modified(BL::Object b_ob)
+{
+ /* test if we can instance or if the object is modified */
+ if(ccl::object_is_modified(b_ob, b_scene, preview)) {
+ /* modifiers */
+ return true;
+ }
+ else {
+ /* object level material links */
+ BL::Object::material_slots_iterator slot;
+ for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot)
+ if(slot->link() == BL::MaterialSlot::link_OBJECT)
+ return true;
+ }
+
+ return false;
+}
+
+bool BlenderSync::object_is_mesh(BL::Object b_ob)
+{
+ BL::ID b_ob_data = b_ob.data();
+
+ return (b_ob_data && (b_ob_data.is_a(&RNA_Mesh) ||
+ b_ob_data.is_a(&RNA_Curve) || b_ob_data.is_a(&RNA_MetaBall)));
+}
+
+bool BlenderSync::object_is_light(BL::Object b_ob)
+{
+ BL::ID b_ob_data = b_ob.data();
+
+ return (b_ob_data && b_ob_data.is_a(&RNA_Lamp));
+}
+
+static uint object_ray_visibility(BL::Object b_ob)
+{
+ PointerRNA cvisibility = RNA_pointer_get(&b_ob.ptr, "cycles_visibility");
+ uint flag = 0;
+
+ flag |= get_boolean(cvisibility, "camera")? PATH_RAY_CAMERA: 0;
+ flag |= get_boolean(cvisibility, "diffuse")? PATH_RAY_DIFFUSE: 0;
+ flag |= get_boolean(cvisibility, "glossy")? PATH_RAY_GLOSSY: 0;
+ flag |= get_boolean(cvisibility, "transmission")? PATH_RAY_TRANSMIT: 0;
+ flag |= get_boolean(cvisibility, "shadow")? PATH_RAY_SHADOW: 0;
+
+ return flag;
+}
+
+/* Light */
+
+void BlenderSync::sync_light(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm)
+{
+ /* test if we need to sync */
+ Light *light;
+ ObjectKey key(b_parent, b_index, b_ob);
+
+ if(!light_map.sync(&light, b_ob, b_parent, key))
+ return;
+
+ BL::Lamp b_lamp(b_ob.data());
+
+ /* type */
+ switch(b_lamp.type()) {
+ case BL::Lamp::type_POINT: {
+ BL::PointLamp b_point_lamp(b_lamp);
+ light->size = b_point_lamp.shadow_soft_size();
+ light->type = LIGHT_POINT;
+ break;
+ }
+ case BL::Lamp::type_SPOT: {
+ BL::SpotLamp b_spot_lamp(b_lamp);
+ light->size = b_spot_lamp.shadow_soft_size();
+ light->type = LIGHT_POINT;
+ break;
+ }
+ case BL::Lamp::type_HEMI: {
+ light->type = LIGHT_DISTANT;
+ light->size = 0.0f;
+ break;
+ }
+ case BL::Lamp::type_SUN: {
+ BL::SunLamp b_sun_lamp(b_lamp);
+ light->size = b_sun_lamp.shadow_soft_size();
+ light->type = LIGHT_DISTANT;
+ break;
+ }
+ case BL::Lamp::type_AREA: {
+ BL::AreaLamp b_area_lamp(b_lamp);
+ light->size = 1.0f;
+ light->axisu = make_float3(tfm.x.x, tfm.y.x, tfm.z.x);
+ light->axisv = make_float3(tfm.x.y, tfm.y.y, tfm.z.y);
+ light->sizeu = b_area_lamp.size();
+ if(b_area_lamp.shape() == BL::AreaLamp::shape_RECTANGLE)
+ light->sizev = b_area_lamp.size_y();
+ else
+ light->sizev = light->sizeu;
+ light->type = LIGHT_AREA;
+ break;
+ }
+ }
+
+ /* location and (inverted!) direction */
+ light->co = make_float3(tfm.x.w, tfm.y.w, tfm.z.w);
+ light->dir = -make_float3(tfm.x.z, tfm.y.z, tfm.z.z);
+
+ /* shader */
+ vector<uint> used_shaders;
+
+ find_shader(b_lamp, used_shaders);
+
+ if(used_shaders.size() == 0)
+ used_shaders.push_back(scene->default_light);
+
+ light->shader = used_shaders[0];
+
+ /* shadow */
+ PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles");
+ light->cast_shadow = get_boolean(clamp, "cast_shadow");
+
+ /* tag */
+ light->tag_update(scene);
+}
+
+/* Object */
+
+void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint visibility)
+{
+ /* light is handled separately */
+ if(object_is_light(b_ob)) {
+ sync_light(b_parent, b_index, b_ob, tfm);
+ return;
+ }
+
+ /* only interested in object that we can create meshes from */
+ if(!object_is_mesh(b_ob))
+ return;
+
+ /* test if we need to sync */
+ ObjectKey key(b_parent, b_index, b_ob);
+ Object *object;
+ bool object_updated = false;
+
+ if(object_map.sync(&object, b_ob, b_parent, key))
+ object_updated = true;
+
+ /* mesh sync */
+ object->mesh = sync_mesh(b_ob, object_updated);
+
+ /* object sync */
+ 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;
+ if(b_parent.ptr.data != b_ob.ptr.data)
+ object->visibility &= object_ray_visibility(b_parent);
+
+ object->tag_update(scene);
+ }
+}
+
+/* Object Loop */
+
+void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
+{
+ /* layer data */
+ uint scene_layer = render_layer.scene_layer;
+ uint layer = render_layer.layer;
+
+ /* prepare for sync */
+ light_map.pre_sync();
+ mesh_map.pre_sync();
+ object_map.pre_sync();
+ mesh_synced.clear();
+
+ /* object loop */
+ BL::Scene::objects_iterator b_ob;
+
+ for(b_scene.objects.begin(b_ob); b_ob != b_scene.objects.end(); ++b_ob) {
+ bool hide = (b_v3d)? b_ob->hide(): b_ob->hide_render();
+ 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);
+
+ BL::Object::dupli_list_iterator b_dup;
+ int b_index = 0;
+
+ 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);
+ b_index++;
+ }
+
+ object_free_duplilist(*b_ob);
+
+ /* check if we should render duplicator */
+ hide = true;
+ BL::Object::particle_systems_iterator b_psys;
+
+ 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;
+ }
+
+ if(!hide) {
+ /* object itself */
+ Transform tfm = get_transform(b_ob->matrix_world());
+ sync_object(*b_ob, 0, *b_ob, tfm, visibility);
+ }
+ }
+ }
+
+ /* handle removed data and modified pointers */
+ if(light_map.post_sync())
+ scene->light_manager->tag_update(scene);
+ if(mesh_map.post_sync())
+ scene->mesh_manager->tag_update(scene);
+ if(object_map.post_sync())
+ scene->object_manager->tag_update(scene);
+ mesh_synced.clear();
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
new file mode 100644
index 00000000000..58049bb8cbe
--- /dev/null
+++ b/intern/cycles/blender/blender_python.cpp
@@ -0,0 +1,212 @@
+/*
+ * 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 <Python.h>
+
+#include "blender_sync.h"
+#include "blender_session.h"
+
+#include "util_opengl.h"
+#include "util_path.h"
+
+CCL_NAMESPACE_BEGIN
+
+static PyObject *init_func(PyObject *self, PyObject *args)
+{
+ const char *path, *user_path;
+
+ if(!PyArg_ParseTuple(args, "ss", &path, &user_path))
+ return NULL;
+
+ path_init(path, user_path);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *create_func(PyObject *self, PyObject *args)
+{
+ PyObject *pyengine, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d;
+
+ if(!PyArg_ParseTuple(args, "OOOOOO", &pyengine, &pydata, &pyscene, &pyregion, &pyv3d, &pyrv3d))
+ return NULL;
+
+ /* RNA */
+ PointerRNA engineptr;
+ RNA_pointer_create(NULL, &RNA_RenderEngine, (void*)PyLong_AsVoidPtr(pyengine), &engineptr);
+ BL::RenderEngine engine(engineptr);
+
+ PointerRNA dataptr;
+ RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pydata), &dataptr);
+ BL::BlendData data(dataptr);
+
+ PointerRNA sceneptr;
+ RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr);
+ BL::Scene scene(sceneptr);
+
+ PointerRNA regionptr;
+ RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyregion), &regionptr);
+ BL::Region region(regionptr);
+
+ PointerRNA v3dptr;
+ RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyv3d), &v3dptr);
+ BL::SpaceView3D v3d(v3dptr);
+
+ PointerRNA rv3dptr;
+ RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyrv3d), &rv3dptr);
+ BL::RegionView3D rv3d(rv3dptr);
+
+ /* create session */
+ BlenderSession *session;
+
+ if(rv3d) {
+ /* interactive session */
+ int width = region.width();
+ int height = region.height();
+
+ session = new BlenderSession(engine, data, scene, v3d, rv3d, width, height);
+ }
+ else {
+ /* offline session */
+ session = new BlenderSession(engine, data, scene);
+ }
+
+ return PyLong_FromVoidPtr(session);
+}
+
+static PyObject *free_func(PyObject *self, PyObject *args)
+{
+ PyObject *pysession;
+
+ if(!PyArg_ParseTuple(args, "O", &pysession))
+ return NULL;
+
+ delete (BlenderSession*)PyLong_AsVoidPtr(pysession);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *render_func(PyObject *self, PyObject *args)
+{
+ PyObject *pysession;
+
+ if(!PyArg_ParseTuple(args, "O", &pysession))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+
+ BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
+ session->render();
+
+ Py_END_ALLOW_THREADS
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *draw_func(PyObject *self, PyObject *args)
+{
+ PyObject *pysession, *pyv3d, *pyrv3d;
+
+ if(!PyArg_ParseTuple(args, "OOO", &pysession, &pyv3d, &pyrv3d))
+ return NULL;
+
+ BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
+
+ if(PyLong_AsVoidPtr(pyrv3d)) {
+ /* 3d view drawing */
+ int viewport[4];
+ glGetIntegerv(GL_VIEWPORT, viewport);
+
+ session->draw(viewport[2], viewport[3]);
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *sync_func(PyObject *self, PyObject *args)
+{
+ PyObject *pysession;
+
+ if(!PyArg_ParseTuple(args, "O", &pysession))
+ return NULL;
+
+ BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
+ session->synchronize();
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *available_devices_func(PyObject *self, PyObject *args)
+{
+ vector<DeviceType> types = Device::available_types();
+
+ PyObject *ret = PyTuple_New(types.size());
+
+ 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()));
+ }
+
+ 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, ""},
+ {"draw", draw_func, METH_VARARGS, ""},
+ {"sync", sync_func, METH_VARARGS, ""},
+ {"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",
+ "Blender cycles render integration",
+ -1,
+ methods,
+ NULL, NULL, NULL, NULL
+};
+
+CCL_NAMESPACE_END
+
+extern "C" PyObject *CYCLES_initPython();
+
+PyObject *CYCLES_initPython()
+{
+ return PyModule_Create(&ccl::module);
+}
+
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
new file mode 100644
index 00000000000..4433b1e24f9
--- /dev/null
+++ b/intern/cycles/blender/blender_session.cpp
@@ -0,0 +1,316 @@
+/*
+ * 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 "background.h"
+#include "buffers.h"
+#include "camera.h"
+#include "device.h"
+#include "integrator.h"
+#include "film.h"
+#include "light.h"
+#include "scene.h"
+#include "session.h"
+#include "shader.h"
+
+#include "util_color.h"
+#include "util_foreach.h"
+#include "util_function.h"
+#include "util_progress.h"
+#include "util_time.h"
+
+#include "blender_sync.h"
+#include "blender_session.h"
+#include "blender_util.h"
+
+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)
+{
+ /* offline render */
+ BL::RenderSettings r = b_scene.render();
+
+ width = (int)(r.resolution_x()*r.resolution_percentage()*0.01f);
+ height = (int)(r.resolution_y()*r.resolution_percentage()*0.01f);
+ background = true;
+ last_redraw_time = 0.0f;
+
+ create_session();
+}
+
+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_)
+{
+ /* 3d view render */
+ width = width_;
+ height = height_;
+ background = false;
+ last_redraw_time = 0.0f;
+
+ create_session();
+}
+
+BlenderSession::~BlenderSession()
+{
+ free_session();
+}
+
+void BlenderSession::create_session()
+{
+ SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
+ SessionParams session_params = BlenderSync::get_session_params(b_scene, background);
+
+ /* reset status/progress */
+ last_status= "";
+ last_progress= -1.0f;
+
+ /* create scene */
+ scene = new Scene(scene_params);
+
+ /* create sync */
+ sync = new BlenderSync(b_data, b_scene, scene, !background);
+ sync->sync_data(b_v3d);
+
+ if(b_rv3d)
+ sync->sync_view(b_v3d, b_rv3d, width, height);
+ else
+ sync->sync_camera(width, height);
+
+ /* create session */
+ session = new Session(session_params);
+ session->scene = scene;
+ session->progress.set_update_callback(function_bind(&BlenderSession::tag_redraw, this));
+ 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();
+}
+
+void BlenderSession::free_session()
+{
+ delete sync;
+ delete session;
+}
+
+void BlenderSession::render()
+{
+ session->wait();
+
+ if(session->progress.get_cancel())
+ return;
+
+ /* write result */
+ write_render_result();
+}
+
+void BlenderSession::write_render_result()
+{
+ /* get result */
+ 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);
+
+ 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);
+
+ delete [] pixels;
+}
+
+void BlenderSession::synchronize()
+{
+ /* on session/scene parameter changes, we recreate session entirely */
+ SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
+ SessionParams session_params = BlenderSync::get_session_params(b_scene, background);
+
+ if(session->params.modified(session_params) ||
+ scene->params.modified(scene_params)) {
+ free_session();
+ create_session();
+ return;
+ }
+
+ /* increase samples, but never decrease */
+ session->set_samples(session_params.samples);
+ session->set_pause(BlenderSync::get_session_pause(b_scene, background));
+
+ /* copy recalc flags, outside of mutex so we can decide to do the real
+ synchronization at a later time to not block on running updates */
+ sync->sync_recalc();
+
+ /* try to acquire mutex. if we don't want to or can't, come back later */
+ if(!session->ready_to_reset() || !session->scene->mutex.try_lock()) {
+ tag_update();
+ return;
+ }
+
+ /* data and camera synchronize */
+ sync->sync_data(b_v3d);
+
+ if(b_rv3d)
+ sync->sync_view(b_v3d, b_rv3d, width, height);
+ else
+ sync->sync_camera(width, height);
+
+ /* unlock */
+ session->scene->mutex.unlock();
+
+ /* reset if needed */
+ if(scene->need_reset())
+ session->reset(width, height, session_params.samples);
+}
+
+bool BlenderSession::draw(int w, int h)
+{
+ /* before drawing, we verify camera and viewport size changes, because
+ we do not get update callbacks for those, we must detect them here */
+ if(session->ready_to_reset()) {
+ bool reset = false;
+
+ /* try to acquire mutex. if we can't, come back later */
+ if(!session->scene->mutex.try_lock()) {
+ tag_update();
+ }
+ else {
+ /* update camera from 3d view */
+ bool need_update = scene->camera->need_update;
+
+ sync->sync_view(b_v3d, b_rv3d, w, h);
+
+ if(scene->camera->need_update && !need_update)
+ reset = true;
+
+ session->scene->mutex.unlock();
+ }
+
+ /* if dimensions changed, reset */
+ if(width != w || height != h) {
+ width = w;
+ height = h;
+ reset = true;
+ }
+
+ /* reset if requested */
+ if(reset) {
+ SessionParams session_params = BlenderSync::get_session_params(b_scene, background);
+ session->reset(width, height, session_params.samples);
+ }
+ }
+
+ /* update status and progress for 3d view draw */
+ update_status_progress();
+
+ /* draw */
+ return !session->draw(width, height);
+}
+
+void BlenderSession::get_status(string& status, string& substatus)
+{
+ session->progress.get_status(status, substatus);
+}
+
+void BlenderSession::get_progress(float& progress, double& total_time)
+{
+ double sample_time;
+ int sample;
+
+ session->progress.get_sample(sample, total_time, sample_time);
+ progress = ((float)sample/(float)session->params.samples);
+}
+
+void BlenderSession::update_status_progress()
+{
+ string status, substatus;
+ float progress;
+ double total_time;
+ char time_str[128];
+
+ get_status(status, substatus);
+ get_progress(progress, total_time);
+
+ if(!background) {
+ BLI_timestr(total_time, time_str);
+ status = "Time: " + string(time_str) + " | " + status;
+ }
+
+ if(substatus.size() > 0)
+ status += " | " + substatus;
+
+ if(status != last_status) {
+ RE_engine_update_stats((RenderEngine*)b_engine.ptr.data, "", status.c_str());
+ last_status = status;
+ }
+ if(progress != last_progress) {
+ RE_engine_update_progress((RenderEngine*)b_engine.ptr.data, progress);
+ last_progress = progress;
+ }
+}
+
+void BlenderSession::tag_update()
+{
+ /* tell blender that we want to get another update callback */
+ engine_tag_update((RenderEngine*)b_engine.ptr.data);
+}
+
+void BlenderSession::tag_redraw()
+{
+ if(background) {
+ /* update stats and progress, only for background here because
+ in 3d view we do it in draw for thread safety reasons */
+ update_status_progress();
+
+ /* offline render, redraw if timeout passed */
+ if(time_dt() - last_redraw_time > 1.0f) {
+ write_render_result();
+ engine_tag_redraw((RenderEngine*)b_engine.ptr.data);
+ last_redraw_time = time_dt();
+ }
+ }
+ else {
+ /* tell blender that we want to redraw */
+ engine_tag_redraw((RenderEngine*)b_engine.ptr.data);
+ }
+}
+
+void BlenderSession::test_cancel()
+{
+ /* test if we need to cancel rendering */
+ if(background)
+ if(RE_engine_test_break((RenderEngine*)b_engine.ptr.data))
+ session->progress.set_cancel("Cancelled");
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
new file mode 100644
index 00000000000..e30b60c3d63
--- /dev/null
+++ b/intern/cycles/blender/blender_session.h
@@ -0,0 +1,81 @@
+/*
+ * 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 __BLENDER_SESSION_H__
+#define __BLENDER_SESSION_H__
+
+#include "device.h"
+#include "scene.h"
+#include "session.h"
+
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Scene;
+class Session;
+
+class BlenderSession {
+public:
+ BlenderSession(BL::RenderEngine b_engine, BL::BlendData b_data, BL::Scene b_scene);
+ 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);
+
+ ~BlenderSession();
+
+ /* session */
+ void create_session();
+ void free_session();
+
+ /* offline render */
+ void render();
+ void write_render_result();
+
+ /* interactive updates */
+ void synchronize();
+
+ /* drawing */
+ bool draw(int w, int h);
+ void tag_redraw();
+ void tag_update();
+ void get_status(string& status, string& substatus);
+ void get_progress(float& progress, double& total_time);
+ void test_cancel();
+ void update_status_progress();
+
+ bool background;
+ Session *session;
+ Scene *scene;
+ BlenderSync *sync;
+ double last_redraw_time;
+
+ BL::RenderEngine b_engine;
+ BL::BlendData b_data;
+ BL::Scene b_scene;
+ BL::SpaceView3D b_v3d;
+ BL::RegionView3D b_rv3d;
+
+ string last_status;
+ float last_progress;
+
+ int width, height;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BLENDER_SESSION_H__ */
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
new file mode 100644
index 00000000000..6f78fe1f0d4
--- /dev/null
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -0,0 +1,702 @@
+/*
+ * 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 "background.h"
+#include "graph.h"
+#include "light.h"
+#include "nodes.h"
+#include "scene.h"
+#include "shader.h"
+
+#include "blender_sync.h"
+#include "blender_util.h"
+
+#include "util_debug.h"
+
+CCL_NAMESPACE_BEGIN
+
+typedef map<void*, ShaderNode*> PtrNodeMap;
+typedef pair<ShaderNode*, std::string> SocketPair;
+typedef map<void*, SocketPair> PtrSockMap;
+
+/* Find */
+
+void BlenderSync::find_shader(BL::ID id, vector<uint>& used_shaders)
+{
+ Shader *shader = shader_map.find(id);
+
+ for(size_t i = 0; i < scene->shaders.size(); i++) {
+ if(scene->shaders[i] == shader) {
+ used_shaders.push_back(i);
+ break;
+ }
+ }
+}
+
+/* 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;
+
+ for(b_node.outputs.begin(b_out); b_out != b_node.outputs.end(); ++b_out)
+ if(b_out->name() == name)
+ return *b_out;
+
+ assert(0);
+
+ return *b_out;
+}
+
+static float3 get_node_output_rgba(BL::Node b_node, const string& name)
+{
+ BL::NodeSocketRGBA sock(get_node_output(b_node, name));
+ return get_float3(sock.default_value());
+}
+
+static float get_node_output_value(BL::Node b_node, const string& name)
+{
+ BL::NodeSocketFloatNone sock(get_node_output(b_node, name));
+ return sock.default_value();
+}
+
+static void get_tex_mapping(TextureMapping *mapping, BL::TexMapping b_mapping)
+{
+ mapping->translation = get_float3(b_mapping.location());
+ mapping->rotation = get_float3(b_mapping.rotation())*(M_PI/180.0f); /* in degrees! */
+ mapping->scale = get_float3(b_mapping.scale());
+
+ mapping->x_mapping = (TextureMapping::Mapping)b_mapping.mapping_x();
+ mapping->y_mapping = (TextureMapping::Mapping)b_mapping.mapping_y();
+ mapping->z_mapping = (TextureMapping::Mapping)b_mapping.mapping_z();
+}
+
+static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *b_group_node, 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;
+ /* handled outside this function */
+ case BL::ShaderNode::type_GROUP: break;
+ /* existing blender nodes */
+ case BL::ShaderNode::type_RGB: {
+ ColorNode *color = new ColorNode();
+ color->value = get_node_output_rgba(b_node, "Color");
+ node = color;
+ break;
+ }
+ case BL::ShaderNode::type_VALUE: {
+ ValueNode *value = new ValueNode();
+ value->value = get_node_output_value(b_node, "Value");
+ node = value;
+ break;
+ }
+ case BL::ShaderNode::type_MIX_RGB: {
+ BL::ShaderNodeMixRGB b_mix_node(b_node);
+ MixNode *mix = new MixNode();
+ mix->type = MixNode::type_enum[b_mix_node.blend_type()];
+ node = mix;
+ break;
+ }
+ case BL::ShaderNode::type_RGBTOBW: {
+ node = new ConvertNode(SHADER_SOCKET_COLOR, SHADER_SOCKET_FLOAT);
+ break;
+ }
+ case BL::ShaderNode::type_MATH: {
+ BL::ShaderNodeMath b_math_node(b_node);
+ MathNode *math = new MathNode();
+ math->type = MathNode::type_enum[b_math_node.operation()];
+ node = math;
+ break;
+ }
+ case BL::ShaderNode::type_VECT_MATH: {
+ BL::ShaderNodeVectorMath b_vector_math_node(b_node);
+ VectorMathNode *vmath = new VectorMathNode();
+ vmath->type = VectorMathNode::type_enum[b_vector_math_node.operation()];
+ node = vmath;
+ break;
+ }
+ case BL::ShaderNode::type_MAPPING: {
+ BL::ShaderNodeMapping b_mapping_node(b_node);
+ MappingNode *mapping = new MappingNode();
+
+ get_tex_mapping(&mapping->tex_mapping, b_mapping_node.mapping());
+
+ node = mapping;
+ break;
+ }
+
+ /* new nodes */
+ case BL::ShaderNode::type_OUTPUT_MATERIAL:
+ case BL::ShaderNode::type_OUTPUT_WORLD:
+ case BL::ShaderNode::type_OUTPUT_LAMP: {
+ node = graph->output();
+ break;
+ }
+ case BL::ShaderNode::type_FRESNEL: {
+ node = new FresnelNode();
+ break;
+ }
+ case BL::ShaderNode::type_LAYER_WEIGHT: {
+ node = new LayerWeightNode();
+ break;
+ }
+ case BL::ShaderNode::type_ADD_SHADER: {
+ node = new AddClosureNode();
+ break;
+ }
+ case BL::ShaderNode::type_MIX_SHADER: {
+ node = new MixClosureNode();
+ break;
+ }
+ case BL::ShaderNode::type_ATTRIBUTE: {
+ BL::ShaderNodeAttribute b_attr_node(b_node);
+ AttributeNode *attr = new AttributeNode();
+ attr->attribute = b_attr_node.attribute_name();
+ node = attr;
+ break;
+ }
+ case BL::ShaderNode::type_BACKGROUND: {
+ node = new BackgroundNode();
+ break;
+ }
+ case BL::ShaderNode::type_HOLDOUT: {
+ node = new HoldoutNode();
+ break;
+ }
+ case BL::ShaderNode::type_BSDF_DIFFUSE: {
+ node = new DiffuseBsdfNode();
+ break;
+ }
+ case BL::ShaderNode::type_BSDF_GLOSSY: {
+ BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
+ GlossyBsdfNode *glossy = new GlossyBsdfNode();
+
+ switch(b_glossy_node.distribution()) {
+ case BL::ShaderNodeBsdfGlossy::distribution_SHARP:
+ glossy->distribution = ustring("Sharp");
+ break;
+ case BL::ShaderNodeBsdfGlossy::distribution_BECKMANN:
+ glossy->distribution = ustring("Beckmann");
+ break;
+ case BL::ShaderNodeBsdfGlossy::distribution_GGX:
+ glossy->distribution = ustring("GGX");
+ break;
+ }
+ node = glossy;
+ break;
+ }
+ case BL::ShaderNode::type_BSDF_GLASS: {
+ BL::ShaderNodeBsdfGlass b_glass_node(b_node);
+ GlassBsdfNode *glass = new GlassBsdfNode();
+ switch(b_glass_node.distribution()) {
+ case BL::ShaderNodeBsdfGlass::distribution_SHARP:
+ glass->distribution = ustring("Sharp");
+ break;
+ case BL::ShaderNodeBsdfGlass::distribution_BECKMANN:
+ glass->distribution = ustring("Beckmann");
+ break;
+ case BL::ShaderNodeBsdfGlass::distribution_GGX:
+ glass->distribution = ustring("GGX");
+ break;
+ }
+ node = glass;
+ break;
+ }
+ case BL::ShaderNode::type_BSDF_TRANSLUCENT: {
+ node = new TranslucentBsdfNode();
+ break;
+ }
+ case BL::ShaderNode::type_BSDF_TRANSPARENT: {
+ node = new TransparentBsdfNode();
+ break;
+ }
+ case BL::ShaderNode::type_BSDF_VELVET: {
+ node = new VelvetBsdfNode();
+ break;
+ }
+ case BL::ShaderNode::type_EMISSION: {
+ node = new EmissionNode();
+ break;
+ }
+ case BL::ShaderNode::type_VOLUME_ISOTROPIC: {
+ node = new IsotropicVolumeNode();
+ break;
+ }
+ case BL::ShaderNode::type_VOLUME_TRANSPARENT: {
+ node = new TransparentVolumeNode();
+ break;
+ }
+ case BL::ShaderNode::type_NEW_GEOMETRY: {
+ node = new GeometryNode();
+ break;
+ }
+ case BL::ShaderNode::type_LIGHT_PATH: {
+ node = new LightPathNode();
+ break;
+ }
+ case BL::ShaderNode::type_TEX_IMAGE: {
+ BL::ShaderNodeTexImage b_image_node(b_node);
+ BL::Image b_image(b_image_node.image());
+ ImageTextureNode *image = new ImageTextureNode();
+ /* todo: handle generated/builtin images */
+ if(b_image)
+ image->filename = blender_absolute_path(b_data, b_image, b_image.filepath());
+ image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
+ get_tex_mapping(&image->tex_mapping, b_image_node.texture_mapping());
+ node = image;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_ENVIRONMENT: {
+ BL::ShaderNodeTexEnvironment b_env_node(b_node);
+ BL::Image b_image(b_env_node.image());
+ EnvironmentTextureNode *env = new EnvironmentTextureNode();
+ if(b_image)
+ env->filename = blender_absolute_path(b_data, b_image, b_image.filepath());
+ env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];
+ get_tex_mapping(&env->tex_mapping, b_env_node.texture_mapping());
+ node = env;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_GRADIENT: {
+ BL::ShaderNodeTexGradient b_gradient_node(b_node);
+ GradientTextureNode *gradient = new GradientTextureNode();
+ gradient->type = GradientTextureNode::type_enum[(int)b_gradient_node.gradient_type()];
+ get_tex_mapping(&gradient->tex_mapping, b_gradient_node.texture_mapping());
+ node = gradient;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_VORONOI: {
+ BL::ShaderNodeTexVoronoi b_voronoi_node(b_node);
+ VoronoiTextureNode *voronoi = new VoronoiTextureNode();
+ voronoi->coloring = VoronoiTextureNode::coloring_enum[(int)b_voronoi_node.coloring()];
+ get_tex_mapping(&voronoi->tex_mapping, b_voronoi_node.texture_mapping());
+ node = voronoi;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_MAGIC: {
+ BL::ShaderNodeTexMagic b_magic_node(b_node);
+ MagicTextureNode *magic = new MagicTextureNode();
+ magic->depth = b_magic_node.turbulence_depth();
+ get_tex_mapping(&magic->tex_mapping, b_magic_node.texture_mapping());
+ node = magic;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_WAVE: {
+ BL::ShaderNodeTexWave b_wave_node(b_node);
+ WaveTextureNode *wave = new WaveTextureNode();
+ wave->type = WaveTextureNode::type_enum[(int)b_wave_node.wave_type()];
+ get_tex_mapping(&wave->tex_mapping, b_wave_node.texture_mapping());
+ node = wave;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_NOISE: {
+ BL::ShaderNodeTexNoise b_noise_node(b_node);
+ NoiseTextureNode *noise = new NoiseTextureNode();
+ get_tex_mapping(&noise->tex_mapping, b_noise_node.texture_mapping());
+ node = noise;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_MUSGRAVE: {
+ BL::ShaderNodeTexMusgrave b_musgrave_node(b_node);
+ MusgraveTextureNode *musgrave = new MusgraveTextureNode();
+ musgrave->type = MusgraveTextureNode::type_enum[(int)b_musgrave_node.musgrave_type()];
+ get_tex_mapping(&musgrave->tex_mapping, b_musgrave_node.texture_mapping());
+ node = musgrave;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_COORD: {
+ node = new TextureCoordinateNode();;
+ break;
+ }
+ case BL::ShaderNode::type_TEX_SKY: {
+ BL::ShaderNodeTexSky b_sky_node(b_node);
+ SkyTextureNode *sky = new SkyTextureNode();
+ sky->sun_direction = get_float3(b_sky_node.sun_direction());
+ sky->turbidity = b_sky_node.turbidity();
+ get_tex_mapping(&sky->tex_mapping, b_sky_node.texture_mapping());
+ node = sky;
+ break;
+ }
+ }
+
+ if(node && node != graph->output())
+ graph->add(node);
+
+ return node;
+}
+
+static SocketPair node_socket_map_pair(PtrNodeMap& node_map, BL::Node b_node, BL::NodeSocket b_socket)
+{
+ BL::Node::inputs_iterator b_input;
+ BL::Node::outputs_iterator b_output;
+ string name = b_socket.name();
+ bool found = false;
+ int counter = 0, total = 0;
+
+ /* find in inputs */
+ for(b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
+ if(b_input->name() == name) {
+ if(!found)
+ counter++;
+ total++;
+ }
+
+ if(b_input->ptr.data == b_socket.ptr.data)
+ found = true;
+ }
+
+ if(!found) {
+ /* find in outputs */
+ found = false;
+ counter = 0;
+ total = 0;
+
+ for(b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
+ if(b_output->name() == name) {
+ if(!found)
+ counter++;
+ total++;
+ }
+
+ if(b_output->ptr.data == b_socket.ptr.data)
+ found = true;
+ }
+ }
+
+ /* rename if needed */
+ if(name == "Shader")
+ name = "Closure";
+
+ if(total > 1)
+ name = string_printf("%s%d", name.c_str(), counter);
+
+ 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)
+{
+ /* add nodes */
+ BL::ShaderNodeTree::nodes_iterator b_node;
+ PtrNodeMap node_map;
+ map<void*, PtrSockMap> node_groups;
+
+ for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
+ if(b_node->is_a(&RNA_NodeGroup)) {
+ 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]);
+ }
+ else {
+ ShaderNode *node = add_node(b_data, graph, b_group_node, 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;
+ }
+ }
+ }
+ }
+ }
+
+ /* connect nodes */
+ BL::NodeTree::links_iterator b_link;
+
+ for(b_ntree.links.begin(b_link); b_link != b_ntree.links.end(); ++b_link) {
+ /* get blender link data */
+ BL::Node b_from_node = b_link->from_node();
+ BL::Node b_to_node = b_link->to_node();
+
+ 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;
+
+ /* 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);
+ }
+
+ /* 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);
+ }
+
+ /* 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 */
+ 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());
+
+ graph->connect(output, input);
+ }
+ }
+}
+
+/* Sync Materials */
+
+void BlenderSync::sync_materials()
+{
+ shader_map.set_default(scene->shaders[scene->default_surface]);
+
+ /* material loop */
+ BL::BlendData::materials_iterator b_mat;
+
+ for(b_data.materials.begin(b_mat); b_mat != b_data.materials.end(); ++b_mat) {
+ Shader *shader;
+
+ /* test if we need to sync */
+ if(shader_map.sync(&shader, *b_mat)) {
+ ShaderGraph *graph = new ShaderGraph();
+
+ shader->name = b_mat->name().c_str();
+
+ /* create nodes */
+ if(b_mat->use_nodes() && b_mat->node_tree()) {
+ PtrSockMap sock_to_node;
+ BL::ShaderNodeTree b_ntree(b_mat->node_tree());
+
+ add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
+ }
+ else {
+ ShaderNode *closure, *out;
+
+ closure = graph->add(new DiffuseBsdfNode());
+ closure->input("Color")->value = get_float3(b_mat->diffuse_color());
+ out = graph->output();
+
+ graph->connect(closure->output("BSDF"), out->input("Surface"));
+ }
+
+ /* settings */
+ PointerRNA cmat = RNA_pointer_get(&b_mat->ptr, "cycles");
+ shader->sample_as_light = get_boolean(cmat, "sample_as_light");
+ shader->homogeneous_volume = get_boolean(cmat, "homogeneous_volume");
+
+ shader->set_graph(graph);
+ shader->tag_update(scene);
+ }
+ }
+}
+
+/* Sync World */
+
+void BlenderSync::sync_world()
+{
+ Background *background = scene->background;
+ Background prevbackground = *background;
+
+ BL::World b_world = b_scene.world();
+
+ if(world_recalc || b_world.ptr.data != world_map) {
+ Shader *shader = scene->shaders[scene->default_background];
+ ShaderGraph *graph = new ShaderGraph();
+
+ /* create nodes */
+ if(b_world && b_world.use_nodes() && b_world.node_tree()) {
+ PtrSockMap sock_to_node;
+ BL::ShaderNodeTree b_ntree(b_world.node_tree());
+
+ add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
+ }
+ else if(b_world) {
+ ShaderNode *closure, *out;
+
+ closure = graph->add(new BackgroundNode());
+ closure->input("Color")->value = get_float3(b_world.horizon_color());
+ out = graph->output();
+
+ graph->connect(closure->output("Background"), out->input("Surface"));
+ }
+
+ shader->set_graph(graph);
+ shader->tag_update(scene);
+ }
+
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ background->transparent = get_boolean(cscene, "film_transparent");
+
+ if(background->modified(prevbackground))
+ background->tag_update(scene);
+
+ world_map = b_world.ptr.data;
+ world_recalc = false;
+}
+
+/* Sync Lamps */
+
+void BlenderSync::sync_lamps()
+{
+ shader_map.set_default(scene->shaders[scene->default_light]);
+
+ /* lamp loop */
+ BL::BlendData::lamps_iterator b_lamp;
+
+ for(b_data.lamps.begin(b_lamp); b_lamp != b_data.lamps.end(); ++b_lamp) {
+ Shader *shader;
+
+ /* test if we need to sync */
+ if(shader_map.sync(&shader, *b_lamp)) {
+ ShaderGraph *graph = new ShaderGraph();
+
+ /* create nodes */
+ if(b_lamp->use_nodes() && b_lamp->node_tree()) {
+ shader->name = b_lamp->name().c_str();
+
+ PtrSockMap sock_to_node;
+ BL::ShaderNodeTree b_ntree(b_lamp->node_tree());
+
+ add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
+ }
+ else {
+ ShaderNode *closure, *out;
+ float strength = 1.0f;
+
+ if(b_lamp->type() == BL::Lamp::type_POINT ||
+ b_lamp->type() == BL::Lamp::type_SPOT ||
+ b_lamp->type() == BL::Lamp::type_AREA)
+ strength = 100.0f;
+
+ closure = graph->add(new EmissionNode());
+ closure->input("Color")->value = get_float3(b_lamp->color());
+ closure->input("Strength")->value.x = strength;
+ out = graph->output();
+
+ graph->connect(closure->output("Emission"), out->input("Surface"));
+ }
+
+ shader->set_graph(graph);
+ shader->tag_update(scene);
+ }
+ }
+}
+
+void BlenderSync::sync_shaders()
+{
+ shader_map.pre_sync();
+
+ sync_world();
+ sync_lamps();
+ sync_materials();
+
+ /* false = don't delete unused shaders, not supported */
+ shader_map.post_sync(false);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
new file mode 100644
index 00000000000..36cf29de128
--- /dev/null
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -0,0 +1,303 @@
+/*
+ * 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 "background.h"
+#include "film.h"
+#include "../render/filter.h"
+#include "graph.h"
+#include "integrator.h"
+#include "light.h"
+#include "mesh.h"
+#include "nodes.h"
+#include "object.h"
+#include "scene.h"
+#include "shader.h"
+
+#include "device.h"
+
+#include "blender_sync.h"
+#include "blender_util.h"
+
+#include "util_debug.h"
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Constructor */
+
+BlenderSync::BlenderSync(BL::BlendData b_data_, BL::Scene b_scene_, Scene *scene_, bool preview_)
+: b_data(b_data_), b_scene(b_scene_),
+ shader_map(&scene_->shaders),
+ object_map(&scene_->objects),
+ mesh_map(&scene_->meshes),
+ light_map(&scene_->lights),
+ world_map(NULL),
+ world_recalc(false)
+{
+ scene = scene_;
+ preview = preview_;
+}
+
+BlenderSync::~BlenderSync()
+{
+}
+
+/* Sync */
+
+bool BlenderSync::sync_recalc()
+{
+ /* sync recalc flags from blender to cycles. actual update is done separate,
+ so we can do it later on if doing it immediate is not suitable */
+
+ 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())
+ 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())
+ shader_map.set_recalc(*b_lamp);
+
+ BL::BlendData::objects_iterator b_ob;
+
+ for(b_data.objects.begin(b_ob); b_ob != b_data.objects.end(); ++b_ob) {
+ if(b_ob->is_updated()) {
+ object_map.set_recalc(*b_ob);
+ light_map.set_recalc(*b_ob);
+ }
+
+ if(object_is_mesh(*b_ob)) {
+ if(b_ob->is_updated_data() || b_ob->data().is_updated()) {
+ BL::ID key = object_is_modified(*b_ob)? *b_ob: b_ob->data();
+ mesh_map.set_recalc(key);
+ }
+ }
+ else if(object_is_light(*b_ob)) {
+ if(b_ob->is_updated_data() || b_ob->data().is_updated())
+ light_map.set_recalc(*b_ob);
+ }
+ }
+
+ BL::BlendData::meshes_iterator b_mesh;
+
+ for(b_data.meshes.begin(b_mesh); b_mesh != b_data.meshes.end(); ++b_mesh)
+ if(b_mesh->is_updated())
+ mesh_map.set_recalc(*b_mesh);
+
+ 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())
+ world_recalc = true;
+
+ bool recalc =
+ shader_map.has_recalc() ||
+ object_map.has_recalc() ||
+ light_map.has_recalc() ||
+ mesh_map.has_recalc() ||
+ BlendDataObjects_is_updated_get(&b_data.ptr) ||
+ world_recalc;
+
+ return recalc;
+}
+
+void BlenderSync::sync_data(BL::SpaceView3D b_v3d)
+{
+ sync_integrator();
+ sync_film();
+ sync_render_layer(b_v3d);
+ sync_shaders();
+ sync_objects(b_v3d);
+}
+
+/* Integrator */
+
+void BlenderSync::sync_integrator()
+{
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+
+ Integrator *integrator = scene->integrator;
+ Integrator previntegrator = *integrator;
+
+ integrator->min_bounce = get_int(cscene, "min_bounces");
+ integrator->max_bounce = get_int(cscene, "max_bounces");
+
+ integrator->max_diffuse_bounce = get_int(cscene, "diffuse_bounces");
+ integrator->max_glossy_bounce = get_int(cscene, "glossy_bounces");
+ integrator->max_transmission_bounce = get_int(cscene, "transmission_bounces");
+
+ integrator->transparent_max_bounce = get_int(cscene, "transparent_max_bounces");
+ integrator->transparent_min_bounce = get_int(cscene, "transparent_min_bounces");
+ 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");
+
+ if(integrator->modified(previntegrator))
+ integrator->tag_update(scene);
+}
+
+/* Film */
+
+void BlenderSync::sync_film()
+{
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+
+ Film *film = scene->film;
+ Film prevfilm = *film;
+
+ film->exposure = get_float(cscene, "film_exposure");
+
+ if(film->modified(prevfilm))
+ film->tag_update(scene);
+
+ Filter *filter = scene->filter;
+ Filter prevfilter = *filter;
+
+ filter->filter_type = (FilterType)RNA_enum_get(&cscene, "filter_type");
+ filter->filter_width = (filter->filter_type == FILTER_BOX)? 1.0f: get_float(cscene, "filter_width");
+
+ if(filter->modified(prevfilter))
+ filter->tag_update(scene);
+}
+
+/* Render Layer */
+
+void BlenderSync::sync_render_layer(BL::SpaceView3D b_v3d)
+{
+ 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;
+ }
+ 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();
+
+ first = false;
+ }
+ }
+ }
+}
+
+/* Scene Parameters */
+
+SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background)
+{
+ SceneParams params;
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ int shadingsystem = RNA_enum_get(&cscene, "shading_system");
+
+ if(shadingsystem == 0)
+ params.shadingsystem = SceneParams::SVM;
+ else if(shadingsystem == 1)
+ params.shadingsystem = SceneParams::OSL;
+
+ if(background)
+ params.bvh_type = SceneParams::BVH_STATIC;
+ else
+ params.bvh_type = (SceneParams::BVHType)RNA_enum_get(&cscene, "debug_bvh_type");
+
+ params.use_bvh_spatial_split = RNA_boolean_get(&cscene, "debug_use_spatial_splits");
+
+ return params;
+}
+
+/* Session Parameters */
+
+bool BlenderSync::get_session_pause(BL::Scene b_scene, bool background)
+{
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ return (background)? false: get_boolean(cscene, "preview_pause");
+}
+
+static bool device_type_available(vector<DeviceType>& types, DeviceType dtype)
+{
+ foreach(DeviceType dt, types)
+ if(dt == dtype)
+ return true;
+
+ return false;
+}
+
+SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background)
+{
+ SessionParams params;
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+
+ /* 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;
+
+ if(device_type_available(types, dtype))
+ params.device_type = dtype;
+ else if(device_type_available(types, DEVICE_OPENCL))
+ params.device_type = DEVICE_OPENCL;
+ else if(device_type_available(types, DEVICE_CUDA))
+ params.device_type = DEVICE_CUDA;
+ }
+
+ /* Background */
+ params.background = background;
+
+ /* samples */
+ if(background) {
+ params.samples = get_int(cscene, "samples");
+ }
+ else {
+ params.samples = get_int(cscene, "preview_samples");
+ if(params.samples == 0)
+ params.samples = INT_MAX;
+ }
+
+ /* other parameters */
+ params.threads = b_scene.render().threads();
+ params.tile_size = get_int(cscene, "debug_tile_size");
+ params.min_size = get_int(cscene, "debug_min_size");
+ params.cancel_timeout = get_float(cscene, "debug_cancel_timeout");
+ params.reset_timeout = get_float(cscene, "debug_reset_timeout");
+ params.text_timeout = get_float(cscene, "debug_text_timeout");
+
+ if(background) {
+ params.progressive = true;
+ params.min_size = INT_MAX;
+ }
+ else
+ params.progressive = true;
+
+ return params;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
new file mode 100644
index 00000000000..2e7b8ed253d
--- /dev/null
+++ b/intern/cycles/blender/blender_sync.h
@@ -0,0 +1,119 @@
+/*
+ * 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 __BLENDER_SYNC_H__
+#define __BLENDER_SYNC_H__
+
+#include "MEM_guardedalloc.h"
+#include "RNA_types.h"
+#include "RNA_access.h"
+#include "RNA_blender_cpp.h"
+
+#include "blender_util.h"
+
+#include "scene.h"
+#include "session.h"
+
+#include "util_map.h"
+#include "util_set.h"
+#include "util_transform.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Background;
+class Camera;
+class Film;
+class Light;
+class Mesh;
+class Object;
+class Scene;
+class Shader;
+class ShaderGraph;
+class ShaderNode;
+
+class BlenderSync {
+public:
+ BlenderSync(BL::BlendData b_data, BL::Scene b_scene, Scene *scene_, bool preview_);
+ ~BlenderSync();
+
+ /* sync */
+ bool sync_recalc();
+ void sync_data(BL::SpaceView3D b_v3d);
+ void sync_camera(int width, int height);
+ void sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height);
+
+ /* get parameters */
+ 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);
+
+private:
+ /* sync */
+ void sync_lamps();
+ void sync_materials();
+ void sync_objects(BL::SpaceView3D b_v3d);
+ void sync_film();
+ void sync_integrator();
+ void sync_view();
+ void sync_world();
+ void sync_render_layer(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_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);
+ bool object_is_modified(BL::Object b_ob);
+ bool object_is_mesh(BL::Object b_ob);
+ bool object_is_light(BL::Object b_ob);
+
+ /* variables */
+ BL::BlendData b_data;
+ BL::Scene b_scene;
+
+ id_map<void*, Shader> shader_map;
+ id_map<ObjectKey, Object> object_map;
+ id_map<void*, Mesh> mesh_map;
+ id_map<ObjectKey, Light> light_map;
+ set<Mesh*> mesh_synced;
+ void *world_map;
+ bool world_recalc;
+
+ Scene *scene;
+ bool preview;
+
+ struct RenderLayerInfo {
+ RenderLayerInfo()
+ : scene_layer(0), layer(0),
+ material_override(PointerRNA_NULL)
+ {}
+
+ uint scene_layer;
+ uint layer;
+ BL::Material material_override;
+ } render_layer;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BLENDER_SYNC_H__ */
+
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
new file mode 100644
index 00000000000..c5cceff6242
--- /dev/null
+++ b/intern/cycles/blender/blender_util.h
@@ -0,0 +1,332 @@
+/*
+ * 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 __BLENDER_UTIL_H__
+#define __BLENDER_UTIL_H__
+
+#include "util_map.h"
+#include "util_path.h"
+#include "util_set.h"
+#include "util_transform.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+/* Hacks to hook into Blender API
+ todo: clean this up ... */
+
+extern "C" {
+
+struct RenderEngine;
+struct RenderResult;
+
+ID *rna_Object_to_mesh(void *_self, void *reports, void *scene, int apply_modifiers, int settings);
+void rna_Main_meshes_remove(void *bmain, void *reports, void *mesh);
+void rna_Object_create_duplilist(void *ob, void *reports, void *sce);
+void rna_Object_free_duplilist(void *ob, void *reports);
+void rna_RenderLayer_rect_set(PointerRNA *ptr, const float *values);
+void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values);
+struct RenderResult *RE_engine_begin_result(struct RenderEngine *engine, int x, int y, int w, int h);
+void RE_engine_update_result(struct RenderEngine *engine, struct RenderResult *result);
+void RE_engine_end_result(struct RenderEngine *engine, struct RenderResult *result);
+int RE_engine_test_break(struct RenderEngine *engine);
+void RE_engine_update_stats(struct RenderEngine *engine, const char *stats, const char *info);
+void RE_engine_update_progress(struct RenderEngine *engine, float progress);
+void engine_tag_redraw(void *engine);
+void engine_tag_update(void *engine);
+int rna_Object_is_modified(void *ob, void *scene, int settings);
+void BLI_timestr(double _time, char *str);
+
+}
+
+CCL_NAMESPACE_BEGIN
+
+static inline BL::Mesh object_to_mesh(BL::Object self, BL::Scene scene, bool apply_modifiers, bool render)
+{
+ ID *data = rna_Object_to_mesh(self.ptr.data, NULL, scene.ptr.data, apply_modifiers, (render)? 2: 1);
+ PointerRNA ptr;
+ RNA_id_pointer_create(data, &ptr);
+ return BL::Mesh(ptr);
+}
+
+static inline void object_remove_mesh(BL::BlendData data, BL::Mesh mesh)
+{
+ rna_Main_meshes_remove(data.ptr.data, NULL, mesh.ptr.data);
+}
+
+static inline void object_create_duplilist(BL::Object self, BL::Scene scene)
+{
+ rna_Object_create_duplilist(self.ptr.data, NULL, scene.ptr.data);
+}
+
+static inline void object_free_duplilist(BL::Object self)
+{
+ rna_Object_free_duplilist(self.ptr.data, NULL);
+}
+
+static inline bool object_is_modified(BL::Object self, BL::Scene scene, bool preview)
+{
+ return rna_Object_is_modified(self.ptr.data, scene.ptr.data, (preview)? (1<<0): (1<<1))? true: false;
+}
+
+/* Utilities */
+
+static inline Transform get_transform(BL::Array<float, 16> array)
+{
+ Transform tfm;
+
+ /* we assume both types to be just 16 floats, and transpose because blender
+ use column major matrix order while we use row major */
+ memcpy(&tfm, &array, sizeof(float)*16);
+ tfm = transform_transpose(tfm);
+
+ return tfm;
+}
+
+static inline float2 get_float2(BL::Array<float, 2> array)
+{
+ return make_float2(array[0], array[1]);
+}
+
+static inline float3 get_float3(BL::Array<float, 2> array)
+{
+ return make_float3(array[0], array[1], 0.0f);
+}
+
+static inline float3 get_float3(BL::Array<float, 3> array)
+{
+ return make_float3(array[0], array[1], array[2]);
+}
+
+static inline float3 get_float3(BL::Array<float, 4> array)
+{
+ return make_float3(array[0], array[1], array[2]);
+}
+
+static inline int4 get_int4(BL::Array<int, 4> array)
+{
+ return make_int4(array[0], array[1], array[2], array[3]);
+}
+
+static inline uint get_layer(BL::Array<int, 20> array)
+{
+ uint layer = 0;
+
+ for(uint i = 0; i < 20; i++)
+ if(array[i])
+ layer |= (1 << i);
+
+ return layer;
+}
+
+/*static inline float3 get_float3(PointerRNA& ptr, const char *name)
+{
+ float3 f;
+ RNA_float_get_array(&ptr, name, &f.x);
+ return f;
+}*/
+
+static inline bool get_boolean(PointerRNA& ptr, const char *name)
+{
+ return RNA_boolean_get(&ptr, name)? true: false;
+}
+
+static inline float get_float(PointerRNA& ptr, const char *name)
+{
+ return RNA_float_get(&ptr, name);
+}
+
+static inline int get_int(PointerRNA& ptr, const char *name)
+{
+ return RNA_int_get(&ptr, name);
+}
+
+static inline int get_enum(PointerRNA& ptr, const char *name)
+{
+ return RNA_enum_get(&ptr, name);
+}
+
+static inline string get_enum_identifier(PointerRNA& ptr, const char *name)
+{
+ PropertyRNA *prop = RNA_struct_find_property(&ptr, name);
+ const char *identifier = "";
+ int value = RNA_property_enum_get(&ptr, prop);
+
+ RNA_property_enum_identifier(NULL, &ptr, prop, value, &identifier);
+
+ return string(identifier);
+}
+
+/* Relative Paths */
+
+static inline string blender_absolute_path(BL::BlendData b_data, BL::ID b_id, const string& path)
+{
+ if(path.size() >= 2 && path[0] == '/' && path[1] == '/') {
+ string dirname = (b_id.library())? b_id.library().filepath(): b_data.filepath();
+ return path_join(path_dirname(dirname), path.substr(2));
+ }
+
+ return path;
+}
+
+/* ID Map
+ *
+ * Utility class to keep in sync with blender data.
+ * Used for objects, meshes, lights and shaders. */
+
+template<typename K, typename T>
+class id_map {
+public:
+ id_map(vector<T*> *scene_data_)
+ {
+ scene_data = scene_data_;
+ }
+
+ T *find(BL::ID id)
+ {
+ return find(id.ptr.id.data);
+ }
+
+ T *find(const K& key)
+ {
+ if(b_map.find(key) != b_map.end()) {
+ T *data = b_map[key];
+ return data;
+ }
+
+ return NULL;
+ }
+
+ void set_recalc(BL::ID id)
+ {
+ b_recalc.insert(id.ptr.data);
+ }
+
+ bool has_recalc()
+ {
+ return !(b_recalc.empty());
+ }
+
+ void pre_sync()
+ {
+ used_set.clear();
+ }
+
+ bool sync(T **r_data, BL::ID id)
+ {
+ return sync(r_data, id, id, id.ptr.id.data);
+ }
+
+ bool sync(T **r_data, BL::ID id, BL::ID parent, const K& key)
+ {
+ T *data = find(key);
+ bool recalc;
+
+ if(!data) {
+ /* add data if it didn't exist yet */
+ data = new T();
+ scene_data->push_back(data);
+ b_map[key] = data;
+ recalc = true;
+ }
+ else {
+ recalc = (b_recalc.find(id.ptr.data) != b_recalc.end());
+ if(parent.ptr.data)
+ recalc = recalc || (b_recalc.find(parent.ptr.data) != b_recalc.end());
+ }
+
+ used(data);
+
+ *r_data = data;
+ return recalc;
+ }
+
+ void used(T *data)
+ {
+ /* tag data as still in use */
+ used_set.insert(data);
+ }
+
+ void set_default(T *data)
+ {
+ b_map[NULL] = data;
+ }
+
+ bool post_sync(bool do_delete = true)
+ {
+ /* remove unused data */
+ vector<T*> new_scene_data;
+ typename vector<T*>::iterator it;
+ bool deleted = false;
+
+ for(it = scene_data->begin(); it != scene_data->end(); it++) {
+ T *data = *it;
+
+ if(do_delete && used_set.find(data) == used_set.end()) {
+ delete data;
+ deleted = true;
+ }
+ else
+ new_scene_data.push_back(data);
+ }
+
+ *scene_data = new_scene_data;
+
+ /* update mapping */
+ map<K, T*> new_map;
+ typedef pair<const K, T*> TMapPair;
+ typename map<K, T*>::iterator jt;
+
+ for(jt = b_map.begin(); jt != b_map.end(); jt++) {
+ TMapPair& pair = *jt;
+
+ if(used_set.find(pair.second) != used_set.end())
+ new_map[pair.first] = pair.second;
+ }
+
+ used_set.clear();
+ b_recalc.clear();
+ b_map = new_map;
+
+ return deleted;
+ }
+
+protected:
+ vector<T*> *scene_data;
+ map<K, T*> b_map;
+ set<T*> used_set;
+ set<void*> b_recalc;
+};
+
+/* Object Key */
+
+struct ObjectKey {
+ void *parent;
+ int index;
+ void *ob;
+
+ ObjectKey(void *parent_, int index_, void *ob_)
+ : parent(parent_), index(index_), ob(ob_) {}
+
+ bool operator<(const ObjectKey& k) const
+ { return (parent < k.parent || (parent == k.parent && (index < k.index || (index == k.index && ob < k.ob)))); }
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BLENDER_UTIL_H__ */
+
diff --git a/intern/cycles/bvh/CMakeLists.txt b/intern/cycles/bvh/CMakeLists.txt
new file mode 100644
index 00000000000..decc576fe51
--- /dev/null
+++ b/intern/cycles/bvh/CMakeLists.txt
@@ -0,0 +1,28 @@
+
+set(INC
+ .
+ ../kernel
+ ../kernel/svm
+ ../render
+ ../util
+ ../device
+)
+
+set(SRC
+ bvh.cpp
+ bvh_build.cpp
+ bvh_node.cpp
+ bvh_sort.cpp
+)
+
+set(SRC_HEADERS
+ bvh.h
+ bvh_build.h
+ bvh_node.h
+ bvh_params.h
+ bvh_sort.h
+)
+
+include_directories(${INC})
+
+add_library(cycles_bvh ${SRC} ${SRC_HEADERS})
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
new file mode 100644
index 00000000000..cd3ad709812
--- /dev/null
+++ b/intern/cycles/bvh/bvh.cpp
@@ -0,0 +1,701 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+
+#include "bvh.h"
+#include "bvh_build.h"
+#include "bvh_node.h"
+#include "bvh_params.h"
+
+#include "util_cache.h"
+#include "util_debug.h"
+#include "util_foreach.h"
+#include "util_map.h"
+#include "util_progress.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Pack Utility */
+
+struct BVHStackEntry
+{
+ const BVHNode *node;
+ int idx;
+
+ BVHStackEntry(const BVHNode* n = 0, int i = 0)
+ : node(n), idx(i)
+ {
+ }
+
+ int encodeIdx() const
+ {
+ return (node->is_leaf())? ~idx: idx;
+ }
+};
+
+/* BVH */
+
+BVH::BVH(const BVHParams& params_, const vector<Object*>& objects_)
+: params(params_), objects(objects_)
+{
+}
+
+BVH *BVH::create(const BVHParams& params, const vector<Object*>& objects)
+{
+ if(params.use_qbvh)
+ return new QBVH(params, objects);
+ else
+ return new RegularBVH(params, objects);
+}
+
+/* Cache */
+
+bool BVH::cache_read(CacheData& key)
+{
+ key.add(&params, sizeof(params));
+
+ foreach(Object *ob, objects) {
+ key.add(ob->mesh->verts);
+ key.add(ob->mesh->triangles);
+ }
+
+ CacheData value;
+
+ if(Cache::global.lookup(key, value)) {
+ value.read(pack.root_index);
+
+ value.read(pack.nodes);
+ value.read(pack.object_node);
+ value.read(pack.tri_woop);
+ value.read(pack.prim_visibility);
+ value.read(pack.prim_index);
+ value.read(pack.prim_object);
+ value.read(pack.is_leaf);
+
+ return true;
+ }
+
+ return false;
+}
+
+void BVH::cache_write(CacheData& key)
+{
+ CacheData value;
+
+ value.add(pack.root_index);
+
+ value.add(pack.nodes);
+ value.add(pack.object_node);
+ value.add(pack.tri_woop);
+ value.add(pack.prim_visibility);
+ value.add(pack.prim_index);
+ value.add(pack.prim_object);
+ value.add(pack.is_leaf);
+
+ Cache::global.insert(key, value);
+}
+
+/* Building */
+
+void BVH::build(Progress& progress)
+{
+ progress.set_substatus("Building BVH");
+
+ /* cache read */
+ CacheData key("bvh");
+
+ if(params.use_cache) {
+ progress.set_substatus("Looking in BVH cache");
+
+ if(cache_read(key))
+ return;
+ }
+
+ /* build nodes */
+ vector<int> prim_index;
+ vector<int> prim_object;
+
+ BVHBuild bvh_build(objects, prim_index, prim_object, params, progress);
+ BVHNode *root = bvh_build.run();
+
+ if(progress.get_cancel()) {
+ if(root) root->deleteSubtree();
+ return;
+ }
+
+ /* todo: get rid of this copy */
+ pack.prim_index = prim_index;
+ pack.prim_object = prim_object;
+
+ /* compute SAH */
+ if(!params.top_level)
+ pack.SAH = root->computeSubtreeSAHCost(params);
+
+ if(progress.get_cancel()) {
+ root->deleteSubtree();
+ return;
+ }
+
+ /* pack triangles */
+ progress.set_substatus("Packing BVH triangles");
+ pack_triangles();
+
+ if(progress.get_cancel()) {
+ root->deleteSubtree();
+ return;
+ }
+
+ /* pack nodes */
+ progress.set_substatus("Packing BVH nodes");
+ array<int> tmp_prim_object = pack.prim_object;
+ pack_nodes(tmp_prim_object, root);
+
+ /* free build nodes */
+ root->deleteSubtree();
+
+ if(progress.get_cancel()) return;
+
+ /* cache write */
+ if(params.use_cache) {
+ progress.set_substatus("Writing BVH cache");
+ cache_write(key);
+ }
+}
+
+/* Refitting */
+
+void BVH::refit(Progress& progress)
+{
+ progress.set_substatus("Packing BVH triangles");
+ pack_triangles();
+
+ if(progress.get_cancel()) return;
+
+ progress.set_substatus("Refitting BVH nodes");
+ refit_nodes();
+}
+
+/* Triangles */
+
+void BVH::pack_triangle(int idx, float4 woop[3])
+{
+ /* create Woop triangle */
+ int tob = pack.prim_object[idx];
+ const Mesh *mesh = objects[tob]->mesh;
+ int tidx = pack.prim_index[idx];
+ const int *vidx = mesh->triangles[tidx].v;
+ const float3* vpos = &mesh->verts[0];
+ float3 v0 = vpos[vidx[0]];
+ float3 v1 = vpos[vidx[1]];
+ float3 v2 = vpos[vidx[2]];
+
+ float3 r0 = v0 - v2;
+ float3 r1 = v1 - v2;
+ float3 r2 = cross(r0, r1);
+
+ if(dot(r0, r0) == 0.0f || dot(r1, r1) == 0.0f || dot(r2, r2) == 0.0f) {
+ /* degenerate */
+ woop[0] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ woop[1] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ woop[2] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ }
+ else {
+ Transform t = make_transform(
+ r0.x, r1.x, r2.x, v2.x,
+ r0.y, r1.y, r2.y, v2.y,
+ r0.z, r1.z, r2.z, v2.z,
+ 0.0f, 0.0f, 0.0f, 1.0f);
+
+ t = transform_inverse(t);
+
+ woop[0] = make_float4(t.z.x, t.z.y, t.z.z, -t.z.w);
+ woop[1] = make_float4(t.x.x, t.x.y, t.x.z, t.x.w);
+ woop[2] = make_float4(t.y.x, t.y.y, t.y.z, t.y.w);
+ }
+}
+
+void BVH::pack_triangles()
+{
+ int nsize = TRI_NODE_SIZE;
+ size_t tidx_size = pack.prim_index.size();
+
+ pack.tri_woop.clear();
+ pack.tri_woop.resize(tidx_size * nsize);
+ pack.prim_visibility.clear();
+ pack.prim_visibility.resize(tidx_size);
+
+ for(unsigned int i = 0; i < tidx_size; i++) {
+ if(pack.prim_index[i] != -1) {
+ float4 woop[3];
+
+ pack_triangle(i, woop);
+ memcpy(&pack.tri_woop[i * nsize], woop, sizeof(float4)*3);
+
+ int tob = pack.prim_object[i];
+ Object *ob = objects[tob];
+ pack.prim_visibility[i] = ob->visibility;
+ }
+ }
+}
+
+/* Pack Instances */
+
+void BVH::pack_instances(size_t nodes_size)
+{
+ /* The BVH's for instances are built separately, but for traversal all
+ BVH's are stored in global arrays. This function merges them into the
+ top level BVH, adjusting indexes and offsets where appropriate. */
+ bool use_qbvh = params.use_qbvh;
+ size_t nsize = (use_qbvh)? BVH_QNODE_SIZE: BVH_NODE_SIZE;
+
+ /* adjust primitive index to point to the triangle in the global array, for
+ meshes with transform applied and already in the top level BVH */
+ for(size_t i = 0; i < pack.prim_index.size(); i++)
+ if(pack.prim_index[i] != -1)
+ pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset;
+
+ /* track offsets of instanced BVH data in global array */
+ size_t tri_offset = pack.prim_index.size();
+ size_t nodes_offset = nodes_size;
+
+ /* clear array that gives the node indexes for instanced objects */
+ pack.object_node.clear();
+
+ /* reserve */
+ size_t prim_index_size = pack.prim_index.size();
+ size_t tri_woop_size = pack.tri_woop.size();
+
+ size_t pack_prim_index_offset = prim_index_size;
+ size_t pack_tri_woop_offset = tri_woop_size;
+ size_t pack_nodes_offset = nodes_size;
+ size_t object_offset = 0;
+
+ map<Mesh*, int> mesh_map;
+
+ foreach(Object *ob, objects) {
+ Mesh *mesh = ob->mesh;
+ BVH *bvh = mesh->bvh;
+
+ if(!mesh->transform_applied) {
+ if(mesh_map.find(mesh) == mesh_map.end()) {
+ prim_index_size += bvh->pack.prim_index.size();
+ tri_woop_size += bvh->pack.tri_woop.size();
+ nodes_size += bvh->pack.nodes.size()*nsize;
+
+ mesh_map[mesh] = 1;
+ }
+ }
+ }
+
+ mesh_map.clear();
+
+ pack.prim_index.resize(prim_index_size);
+ pack.prim_object.resize(prim_index_size);
+ pack.prim_visibility.resize(prim_index_size);
+ pack.tri_woop.resize(tri_woop_size);
+ pack.nodes.resize(nodes_size);
+ pack.object_node.resize(objects.size());
+
+ int *pack_prim_index = (pack.prim_index.size())? &pack.prim_index[0]: NULL;
+ int *pack_prim_object = (pack.prim_object.size())? &pack.prim_object[0]: NULL;
+ uint *pack_prim_visibility = (pack.prim_visibility.size())? &pack.prim_visibility[0]: NULL;
+ float4 *pack_tri_woop = (pack.tri_woop.size())? &pack.tri_woop[0]: NULL;
+ int4 *pack_nodes = (pack.nodes.size())? &pack.nodes[0]: NULL;
+
+ /* merge */
+ foreach(Object *ob, objects) {
+ Mesh *mesh = ob->mesh;
+
+ /* if mesh transform is applied, that means it's already in the top
+ level BVH, and we don't need to merge it in */
+ if(mesh->transform_applied) {
+ pack.object_node[object_offset++] = 0;
+ continue;
+ }
+
+ /* if mesh already added once, don't add it again, but used set
+ node offset for this object */
+ map<Mesh*, int>::iterator it = mesh_map.find(mesh);
+
+ if(mesh_map.find(mesh) != mesh_map.end()) {
+ int noffset = it->second;
+ pack.object_node[object_offset++] = noffset;
+ continue;
+ }
+
+ BVH *bvh = mesh->bvh;
+
+ int noffset = nodes_offset/nsize;
+ int mesh_tri_offset = mesh->tri_offset;
+
+ /* fill in node indexes for instances */
+ if(bvh->pack.is_leaf[0])
+ pack.object_node[object_offset++] = -noffset-1;
+ else
+ pack.object_node[object_offset++] = noffset;
+
+ mesh_map[mesh] = pack.object_node[object_offset-1];
+
+ /* merge primitive and object indexes */
+ if(bvh->pack.prim_index.size()) {
+ size_t bvh_prim_index_size = bvh->pack.prim_index.size();
+ int *bvh_prim_index = &bvh->pack.prim_index[0];
+ uint *bvh_prim_visibility = &bvh->pack.prim_visibility[0];
+
+ for(size_t i = 0; i < bvh_prim_index_size; i++) {
+ pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_tri_offset;
+ pack_prim_visibility[pack_prim_index_offset] = bvh_prim_visibility[i];
+ pack_prim_object[pack_prim_index_offset] = 0; // unused for instances
+ pack_prim_index_offset++;
+ }
+ }
+
+ /* merge triangle intersection data */
+ if(bvh->pack.tri_woop.size()) {
+ memcpy(pack_tri_woop+pack_tri_woop_offset, &bvh->pack.tri_woop[0],
+ bvh->pack.tri_woop.size()*sizeof(float4));
+ pack_tri_woop_offset += bvh->pack.tri_woop.size();
+ }
+
+ /* merge nodes */
+ if( bvh->pack.nodes.size()) {
+ size_t nsize_bbox = (use_qbvh)? nsize-2: nsize-1;
+ int4 *bvh_nodes = &bvh->pack.nodes[0];
+ size_t bvh_nodes_size = bvh->pack.nodes.size();
+ int *bvh_is_leaf = &bvh->pack.is_leaf[0];
+
+ for(size_t i = 0, j = 0; i < bvh_nodes_size; i+=nsize, j++) {
+ memcpy(pack_nodes + pack_nodes_offset, bvh_nodes + i, nsize_bbox*sizeof(int4));
+
+ /* modify offsets into arrays */
+ int4 data = bvh_nodes[i + nsize_bbox];
+
+ if(bvh_is_leaf[j]) {
+ data.x += tri_offset;
+ data.y += tri_offset;
+ }
+ else {
+ data.x += (data.x < 0)? -noffset: noffset;
+ data.y += (data.y < 0)? -noffset: noffset;
+
+ if(use_qbvh) {
+ data.z += (data.z < 0)? -noffset: noffset;
+ data.w += (data.w < 0)? -noffset: noffset;
+ }
+ }
+
+ pack_nodes[pack_nodes_offset + nsize_bbox] = data;
+
+ if(use_qbvh)
+ pack_nodes[pack_nodes_offset + nsize_bbox+1] = bvh_nodes[i + nsize_bbox+1];
+
+ pack_nodes_offset += nsize;
+ }
+ }
+
+ nodes_offset += bvh->pack.nodes.size();
+ tri_offset += bvh->pack.prim_index.size();
+ }
+}
+
+/* Regular BVH */
+
+RegularBVH::RegularBVH(const BVHParams& params_, const vector<Object*>& objects_)
+: BVH(params_, objects_)
+{
+}
+
+void RegularBVH::pack_leaf(const BVHStackEntry& e, const LeafNode *leaf)
+{
+ if(leaf->num_triangles() == 1 && pack.prim_index[leaf->m_lo] == -1)
+ /* object */
+ pack_node(e.idx, leaf->m_bounds, leaf->m_bounds, ~(leaf->m_lo), 0, leaf->m_visibility, leaf->m_visibility);
+ else
+ /* triangle */
+ pack_node(e.idx, leaf->m_bounds, leaf->m_bounds, leaf->m_lo, leaf->m_hi, leaf->m_visibility, leaf->m_visibility);
+}
+
+void RegularBVH::pack_inner(const BVHStackEntry& e, const BVHStackEntry& e0, const BVHStackEntry& e1)
+{
+ pack_node(e.idx, e0.node->m_bounds, e1.node->m_bounds, e0.encodeIdx(), e1.encodeIdx(), e0.node->m_visibility, e1.node->m_visibility);
+}
+
+void RegularBVH::pack_node(int idx, const BoundBox& b0, const BoundBox& b1, int c0, int c1, uint visibility0, uint visibility1)
+{
+ int4 data[BVH_NODE_SIZE] =
+ {
+ make_int4(__float_as_int(b0.min.x), __float_as_int(b0.max.x), __float_as_int(b0.min.y), __float_as_int(b0.max.y)),
+ make_int4(__float_as_int(b1.min.x), __float_as_int(b1.max.x), __float_as_int(b1.min.y), __float_as_int(b1.max.y)),
+ make_int4(__float_as_int(b0.min.z), __float_as_int(b0.max.z), __float_as_int(b1.min.z), __float_as_int(b1.max.z)),
+ make_int4(c0, c1, visibility0, visibility1)
+ };
+
+ memcpy(&pack.nodes[idx * BVH_NODE_SIZE], data, sizeof(int4)*BVH_NODE_SIZE);
+}
+
+void RegularBVH::pack_nodes(const array<int>& prims, const BVHNode *root)
+{
+ size_t node_size = root->getSubtreeSize(BVH_STAT_NODE_COUNT);
+
+ /* resize arrays */
+ pack.nodes.clear();
+ pack.is_leaf.clear();
+ pack.is_leaf.resize(node_size);
+
+ /* for top level BVH, first merge existing BVH's so we know the offsets */
+ if(params.top_level)
+ pack_instances(node_size*BVH_NODE_SIZE);
+ else
+ pack.nodes.resize(node_size*BVH_NODE_SIZE);
+
+ int nextNodeIdx = 0;
+
+ vector<BVHStackEntry> stack;
+ stack.push_back(BVHStackEntry(root, nextNodeIdx++));
+
+ while(stack.size()) {
+ BVHStackEntry e = stack.back();
+ stack.pop_back();
+
+ pack.is_leaf[e.idx] = e.node->is_leaf();
+
+ if(e.node->is_leaf()) {
+ /* leaf node */
+ const LeafNode* leaf = reinterpret_cast<const LeafNode*>(e.node);
+ pack_leaf(e, leaf);
+ }
+ else {
+ /* innner node */
+ stack.push_back(BVHStackEntry(e.node->get_child(0), nextNodeIdx++));
+ stack.push_back(BVHStackEntry(e.node->get_child(1), nextNodeIdx++));
+
+ pack_inner(e, stack[stack.size()-2], stack[stack.size()-1]);
+ }
+ }
+
+ /* root index to start traversal at, to handle case of single leaf node */
+ pack.root_index = (pack.is_leaf[0])? -1: 0;
+}
+
+void RegularBVH::refit_nodes()
+{
+ assert(!params.top_level);
+
+ BoundBox bbox;
+ uint visibility = 0;
+ refit_node(0, (pack.is_leaf[0])? true: false, bbox, visibility);
+}
+
+void RegularBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
+{
+ int4 *data = &pack.nodes[idx*4];
+
+ int c0 = data[3].x;
+ int c1 = data[3].y;
+
+ if(leaf) {
+ /* refit leaf node */
+ for(int tri = c0; tri < c1; tri++) {
+ int tidx = pack.prim_index[tri];
+ int tob = pack.prim_object[tri];
+ Object *ob = objects[tob];
+
+ if(tidx == -1) {
+ /* object instance */
+ bbox.grow(ob->bounds);
+ }
+ else {
+ /* triangles */
+ const Mesh *mesh = ob->mesh;
+ int tri_offset = (params.top_level)? mesh->tri_offset: 0;
+ const int *vidx = mesh->triangles[tidx - tri_offset].v;
+ const float3 *vpos = &mesh->verts[0];
+
+ bbox.grow(vpos[vidx[0]]);
+ bbox.grow(vpos[vidx[1]]);
+ bbox.grow(vpos[vidx[2]]);
+ }
+
+ visibility |= ob->visibility;
+ }
+
+ pack_node(idx, bbox, bbox, c0, c1, visibility, visibility);
+ }
+ else {
+ /* refit inner node, set bbox from children */
+ BoundBox bbox0, bbox1;
+ uint visibility0 = 0, visibility1 = 0;
+
+ refit_node((c0 < 0)? -c0-1: c0, (c0 < 0), bbox0, visibility0);
+ refit_node((c1 < 0)? -c1-1: c1, (c1 < 0), bbox1, visibility1);
+
+ pack_node(idx, bbox0, bbox1, c0, c1, visibility0, visibility1);
+
+ bbox.grow(bbox0);
+ bbox.grow(bbox1);
+ visibility = visibility0|visibility1;
+ }
+}
+
+/* QBVH */
+
+QBVH::QBVH(const BVHParams& params_, const vector<Object*>& objects_)
+: BVH(params_, objects_)
+{
+ params.use_qbvh = true;
+
+ /* todo: use visibility */
+}
+
+void QBVH::pack_leaf(const BVHStackEntry& e, const LeafNode *leaf)
+{
+ float4 data[BVH_QNODE_SIZE];
+
+ memset(data, 0, sizeof(data));
+
+ if(leaf->num_triangles() == 1 && pack.prim_index[leaf->m_lo] == -1) {
+ /* object */
+ data[6].x = __int_as_float(~(leaf->m_lo));
+ data[6].y = __int_as_float(0);
+ }
+ else {
+ /* triangle */
+ data[6].x = __int_as_float(leaf->m_lo);
+ data[6].y = __int_as_float(leaf->m_hi);
+ }
+
+ memcpy(&pack.nodes[e.idx * BVH_QNODE_SIZE], data, sizeof(float4)*BVH_QNODE_SIZE);
+}
+
+void QBVH::pack_inner(const BVHStackEntry& e, const BVHStackEntry *en, int num)
+{
+ float4 data[BVH_QNODE_SIZE];
+
+ for(int i = 0; i < num; i++) {
+ float3 bb_min = en[i].node->m_bounds.min;
+ float3 bb_max = en[i].node->m_bounds.max;
+
+ data[0][i] = bb_min.x;
+ data[1][i] = bb_max.x;
+ data[2][i] = bb_min.y;
+ data[3][i] = bb_max.y;
+ data[4][i] = bb_min.z;
+ data[5][i] = bb_max.z;
+
+ data[6][i] = __int_as_float(en[i].encodeIdx());
+ data[7][i] = 0.0f;
+ }
+
+ for(int i = num; i < 4; i++) {
+ data[0][i] = 0.0f;
+ data[1][i] = 0.0f;
+ data[2][i] = 0.0f;
+
+ data[3][i] = 0.0f;
+ data[4][i] = 0.0f;
+ data[5][i] = 0.0f;
+
+ data[6][i] = __int_as_float(0);
+ data[7][i] = 0.0f;
+ }
+
+ memcpy(&pack.nodes[e.idx * BVH_QNODE_SIZE], data, sizeof(float4)*BVH_QNODE_SIZE);
+}
+
+/* Quad SIMD Nodes */
+
+void QBVH::pack_nodes(const array<int>& prims, const BVHNode *root)
+{
+ size_t node_size = root->getSubtreeSize(BVH_STAT_NODE_COUNT);
+
+ /* resize arrays */
+ pack.nodes.clear();
+ pack.is_leaf.clear();
+ pack.is_leaf.resize(node_size);
+
+ /* for top level BVH, first merge existing BVH's so we know the offsets */
+ if(params.top_level)
+ pack_instances(node_size*BVH_QNODE_SIZE);
+ else
+ pack.nodes.resize(node_size*BVH_QNODE_SIZE);
+
+ int nextNodeIdx = 0;
+
+ vector<BVHStackEntry> stack;
+ stack.push_back(BVHStackEntry(root, nextNodeIdx++));
+
+ while(stack.size()) {
+ BVHStackEntry e = stack.back();
+ stack.pop_back();
+
+ pack.is_leaf[e.idx] = e.node->is_leaf();
+
+ if(e.node->is_leaf()) {
+ /* leaf node */
+ const LeafNode* leaf = reinterpret_cast<const LeafNode*>(e.node);
+ pack_leaf(e, leaf);
+ }
+ else {
+ /* inner node */
+ const BVHNode *node = e.node;
+ const BVHNode *node0 = node->get_child(0);
+ const BVHNode *node1 = node->get_child(1);
+
+ /* collect nodes */
+ const BVHNode *nodes[4];
+ int numnodes = 0;
+
+ if(node0->is_leaf()) {
+ nodes[numnodes++] = node0;
+ }
+ else {
+ nodes[numnodes++] = node0->get_child(0);
+ nodes[numnodes++] = node0->get_child(1);
+ }
+
+ if(node1->is_leaf()) {
+ nodes[numnodes++] = node1;
+ }
+ else {
+ nodes[numnodes++] = node1->get_child(0);
+ nodes[numnodes++] = node1->get_child(1);
+ }
+
+ /* push entries on the stack */
+ for(int i = 0; i < numnodes; i++)
+ stack.push_back(BVHStackEntry(nodes[i], nextNodeIdx++));
+
+ /* set node */
+ pack_inner(e, &stack[stack.size()-numnodes], numnodes);
+ }
+ }
+
+ /* root index to start traversal at, to handle case of single leaf node */
+ pack.root_index = (pack.is_leaf[0])? -1: 0;
+}
+
+void QBVH::refit_nodes()
+{
+ assert(0); /* todo */
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h
new file mode 100644
index 00000000000..e502af72335
--- /dev/null
+++ b/intern/cycles/bvh/bvh.h
@@ -0,0 +1,155 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BVH_H__
+#define __BVH_H__
+
+#include "bvh_params.h"
+
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class BVHNode;
+struct BVHStackEntry;
+class BVHParams;
+class BoundBox;
+class CacheData;
+class LeafNode;
+class Object;
+class Progress;
+
+#define BVH_NODE_SIZE 4
+#define BVH_QNODE_SIZE 8
+#define BVH_ALIGN 4096
+#define TRI_NODE_SIZE 3
+
+/* Packed BVH
+ *
+ * BVH stored as it will be used for traversal on the rendering device. */
+
+struct PackedBVH {
+ /* BVH nodes storage, one node is 4x int4, and contains two bounding boxes,
+ and child, triangle or object indexes dependening on the node type */
+ array<int4> nodes;
+ /* object index to BVH node index mapping for instances */
+ array<int> object_node;
+ /* precomputed triangle intersection data, one triangle is 4x float4 */
+ array<float4> tri_woop;
+ /* visibility visibilitys for primitives */
+ array<uint> prim_visibility;
+ /* mapping from BVH primitive index to true primitive index, as primitives
+ may be duplicated due to spatial splits. -1 for instances. */
+ array<int> prim_index;
+ /* mapping from BVH primitive index, to the object id of that primitive. */
+ array<int> prim_object;
+ /* quick array to lookup if a node is a leaf, not used for traversal, only
+ for instance BVH merging */
+ array<int> is_leaf;
+
+ /* index of the root node. */
+ int root_index;
+
+ /* surface area heuristic, for building top level BVH */
+ float SAH;
+
+ PackedBVH()
+ {
+ root_index = 0;
+ SAH = 0.0f;
+ }
+};
+
+/* BVH */
+
+class BVH
+{
+public:
+ PackedBVH pack;
+ BVHParams params;
+ vector<Object*> objects;
+
+ static BVH *create(const BVHParams& params, const vector<Object*>& objects);
+ virtual ~BVH() {}
+
+ void build(Progress& progress);
+ void refit(Progress& progress);
+
+protected:
+ BVH(const BVHParams& params, const vector<Object*>& objects);
+
+ /* cache */
+ bool cache_read(CacheData& key);
+ void cache_write(CacheData& key);
+
+ /* triangles */
+ void pack_triangles();
+ void pack_triangle(int idx, float4 woop[3]);
+
+ /* merge instance BVH's */
+ void pack_instances(size_t nodes_size);
+
+ /* for subclasses to implement */
+ virtual void pack_nodes(const array<int>& prims, const BVHNode *root) = 0;
+ virtual void refit_nodes() = 0;
+};
+
+/* Regular BVH
+ *
+ * Typical BVH with each node having two children. */
+
+class RegularBVH : public BVH {
+protected:
+ /* constructor */
+ friend class BVH;
+ RegularBVH(const BVHParams& params, const vector<Object*>& objects);
+
+ /* pack */
+ void pack_nodes(const array<int>& prims, const BVHNode *root);
+ void pack_leaf(const BVHStackEntry& e, const LeafNode *leaf);
+ void pack_inner(const BVHStackEntry& e, const BVHStackEntry& e0, const BVHStackEntry& e1);
+ void pack_node(int idx, const BoundBox& b0, const BoundBox& b1, int c0, int c1, uint visibility0, uint visibility1);
+
+ /* refit */
+ void refit_nodes();
+ void refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility);
+};
+
+/* QBVH
+ *
+ * Quad BVH, with each node having four children, to use with SIMD instructions. */
+
+class QBVH : public BVH {
+protected:
+ /* constructor */
+ friend class BVH;
+ QBVH(const BVHParams& params, const vector<Object*>& objects);
+
+ /* pack */
+ void pack_nodes(const array<int>& prims, const BVHNode *root);
+ void pack_leaf(const BVHStackEntry& e, const LeafNode *leaf);
+ void pack_inner(const BVHStackEntry& e, const BVHStackEntry *en, int num);
+
+ /* refit */
+ void refit_nodes();
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BVH_H__ */
+
diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
new file mode 100644
index 00000000000..67cff3f5873
--- /dev/null
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -0,0 +1,549 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "bvh_build.h"
+#include "bvh_node.h"
+#include "bvh_params.h"
+#include "bvh_sort.h"
+
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+
+#include "util_algorithm.h"
+#include "util_foreach.h"
+#include "util_progress.h"
+#include "util_time.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Constructor / Destructor */
+
+BVHBuild::BVHBuild(const vector<Object*>& objects_,
+ vector<int>& prim_index_, vector<int>& prim_object_,
+ const BVHParams& params_, Progress& progress_)
+: objects(objects_),
+ prim_index(prim_index_),
+ prim_object(prim_object_),
+ params(params_),
+ progress(progress_),
+ progress_start_time(0.0)
+{
+ spatial_min_overlap = 0.0f;
+ progress_num_duplicates = 0;
+}
+
+BVHBuild::~BVHBuild()
+{
+}
+
+/* Adding References */
+
+void BVHBuild::add_reference_mesh(NodeSpec& root, Mesh *mesh, int i)
+{
+ for(uint j = 0; j < mesh->triangles.size(); j++) {
+ 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);
+ }
+}
+
+void BVHBuild::add_reference_object(NodeSpec& root, Object *ob, int i)
+{
+ Reference ref;
+
+ ref.prim_index = -1;
+ ref.prim_object = i;
+ ref.bounds = ob->bounds;
+
+ references.push_back(ref);
+ root.bounds.grow(ref.bounds);
+}
+
+void BVHBuild::add_references(NodeSpec& root)
+{
+ /* init root spec */
+ root.num = 0;
+ root.bounds = BoundBox();
+
+ /* add objects */
+ int i = 0;
+
+ foreach(Object *ob, objects) {
+ if(params.top_level) {
+ if(ob->mesh->transform_applied)
+ add_reference_mesh(root, ob->mesh, i);
+ else
+ add_reference_object(root, ob, i);
+ }
+ else
+ add_reference_mesh(root, ob->mesh, i);
+
+ i++;
+
+ if(progress.get_cancel()) return;
+ }
+
+ /* happens mostly on empty meshes */
+ if(!root.bounds.valid())
+ root.bounds.grow(make_float3(0.0f, 0.0f, 0.0f));
+
+ root.num = references.size();
+}
+
+/* Build */
+
+BVHNode* BVHBuild::run()
+{
+ NodeSpec root;
+
+ /* add references */
+ add_references(root);
+
+ if(progress.get_cancel()) return NULL;
+
+ /* init spatial splits */
+ if(params.top_level) /* todo: get rid of this */
+ params.use_spatial_split = false;
+
+ spatial_min_overlap = root.bounds.area() * params.spatial_split_alpha;
+ spatial_right_bounds.clear();
+ spatial_right_bounds.resize(max(root.num, (int)BVHParams::NUM_SPATIAL_BINS) - 1);
+
+ /* init progress updates */
+ progress_num_duplicates = 0;
+ progress_start_time = time_dt();
+
+ /* build recursively */
+ return build_node(root, 0, 0.0f, 1.0f);
+}
+
+void BVHBuild::progress_update(float progress_start, float progress_end)
+{
+ if(time_dt() - progress_start_time < 0.25f)
+ return;
+
+ float duplicates = (float)progress_num_duplicates/(float)references.size();
+ string msg = string_printf("Building BVH %.0f%%, duplicates %.0f%%",
+ progress_start*100.0f, duplicates*100.0f);
+
+ progress.set_substatus(msg);
+ progress_start_time = time_dt();
+}
+
+BVHNode* BVHBuild::build_node(const NodeSpec& spec, int level, float progress_start, float progress_end)
+{
+ /* progress update */
+ progress_update(progress_start, progress_end);
+ if(progress.get_cancel()) return NULL;
+
+ /* small enough or too deep => create leaf. */
+ if(spec.num <= params.min_leaf_size || level >= BVHParams::MAX_DEPTH)
+ return create_leaf_node(spec);
+
+ /* find split candidates. */
+ float area = spec.bounds.area();
+ float leafSAH = area * params.triangle_cost(spec.num);
+ float nodeSAH = area * params.node_cost(2);
+ ObjectSplit object = find_object_split(spec, nodeSAH);
+ SpatialSplit spatial;
+
+ if(params.use_spatial_split && level < BVHParams::MAX_SPATIAL_DEPTH) {
+ BoundBox overlap = object.left_bounds;
+ overlap.intersect(object.right_bounds);
+
+ if(overlap.area() >= spatial_min_overlap)
+ spatial = find_spatial_split(spec, nodeSAH);
+ }
+
+ /* leaf SAH is the lowest => create leaf. */
+ float minSAH = min(min(leafSAH, object.sah), spatial.sah);
+
+ if(minSAH == leafSAH && spec.num <= params.max_leaf_size)
+ return create_leaf_node(spec);
+
+ /* perform split. */
+ NodeSpec left, right;
+
+ if(params.use_spatial_split && minSAH == spatial.sah)
+ do_spatial_split(left, right, spec, spatial);
+ if(!left.num || !right.num)
+ do_object_split(left, right, spec, object);
+
+ /* create inner node. */
+ progress_num_duplicates += left.num + right.num - spec.num;
+
+ float progress_mid = lerp(progress_start, progress_end, (float)right.num / (float)(left.num + right.num));
+
+ BVHNode* rightNode = build_node(right, level + 1, progress_start, progress_mid);
+ if(progress.get_cancel()) {
+ if(rightNode) rightNode->deleteSubtree();
+ return NULL;
+ }
+
+ BVHNode* leftNode = build_node(left, level + 1, progress_mid, progress_end);
+ if(progress.get_cancel()) {
+ if(leftNode) leftNode->deleteSubtree();
+ return NULL;
+ }
+
+ return new InnerNode(spec.bounds, leftNode, rightNode);
+}
+
+BVHNode *BVHBuild::create_object_leaf_nodes(const Reference *ref, int num)
+{
+ if(num == 0) {
+ BoundBox bounds;
+ return new LeafNode(bounds, 0, 0, 0);
+ }
+ else if(num == 1) {
+ prim_index.push_back(ref[0].prim_index);
+ prim_object.push_back(ref[0].prim_object);
+ uint visibility = objects[ref[0].prim_object]->visibility;
+ return new LeafNode(ref[0].bounds, visibility, prim_index.size()-1, prim_index.size());
+ }
+ else {
+ int mid = num/2;
+ BVHNode *leaf0 = create_object_leaf_nodes(ref, mid);
+ BVHNode *leaf1 = create_object_leaf_nodes(ref+mid, num-mid);
+
+ BoundBox bounds;
+ bounds.grow(leaf0->m_bounds);
+ bounds.grow(leaf1->m_bounds);
+
+ return new InnerNode(bounds, leaf0, leaf1);
+ }
+}
+
+BVHNode* BVHBuild::create_leaf_node(const NodeSpec& spec)
+{
+ vector<int>& p_index = prim_index;
+ vector<int>& p_object = prim_object;
+ BoundBox bounds;
+ int num = 0;
+ uint visibility = 0;
+
+ for(int i = 0; i < spec.num; i++) {
+ if(references.back().prim_index != -1) {
+ p_index.push_back(references.back().prim_index);
+ p_object.push_back(references.back().prim_object);
+ bounds.grow(references.back().bounds);
+ visibility |= objects[references.back().prim_object]->visibility;
+ references.pop_back();
+ num++;
+ }
+ }
+
+ BVHNode *leaf = NULL;
+
+ if(num > 0) {
+ leaf = new LeafNode(bounds, visibility, p_index.size() - num, p_index.size());
+
+ if(num == spec.num)
+ return leaf;
+ }
+
+ /* while there may be multiple triangles in a leaf, for object primitives
+ * we want them to be the only one, so we */
+ int ob_num = spec.num - num;
+ const Reference *ref = (ob_num)? &references.back() - (ob_num - 1): NULL;
+ BVHNode *oleaf = create_object_leaf_nodes(ref, ob_num);
+ for(int i = 0; i < ob_num; i++)
+ references.pop_back();
+
+ if(leaf)
+ return new InnerNode(spec.bounds, leaf, oleaf);
+ else
+ return oleaf;
+}
+
+/* Object Split */
+
+BVHBuild::ObjectSplit BVHBuild::find_object_split(const NodeSpec& spec, float nodeSAH)
+{
+ ObjectSplit split;
+ const Reference *ref_ptr = &references[references.size() - spec.num];
+
+ for(int dim = 0; dim < 3; dim++) {
+ /* sort references */
+ bvh_reference_sort(references.size() - spec.num, references.size(), &references[0], dim);
+
+ /* sweep right to left and determine bounds. */
+ BoundBox right_bounds;
+
+ for(int i = spec.num - 1; i > 0; i--) {
+ right_bounds.grow(ref_ptr[i].bounds);
+ spatial_right_bounds[i - 1] = right_bounds;
+ }
+
+ /* sweep left to right and select lowest SAH. */
+ BoundBox left_bounds;
+
+ for(int i = 1; i < spec.num; i++) {
+ left_bounds.grow(ref_ptr[i - 1].bounds);
+ right_bounds = spatial_right_bounds[i - 1];
+
+ float sah = nodeSAH +
+ left_bounds.area() * params.triangle_cost(i) +
+ right_bounds.area() * params.triangle_cost(spec.num - i);
+
+ if(sah < split.sah) {
+ split.sah = sah;
+ split.dim = dim;
+ split.num_left = i;
+ split.left_bounds = left_bounds;
+ split.right_bounds = right_bounds;
+ }
+ }
+ }
+
+ return split;
+}
+
+void BVHBuild::do_object_split(NodeSpec& left, NodeSpec& right, const NodeSpec& spec, const ObjectSplit& split)
+{
+ /* sort references according to split */
+ int start = references.size() - spec.num;
+ int end = references.size(); /* todo: is this right? */
+
+ bvh_reference_sort(start, end, &references[0], split.dim);
+
+ /* split node specs */
+ left.num = split.num_left;
+ left.bounds = split.left_bounds;
+ right.num = spec.num - split.num_left;
+ right.bounds = split.right_bounds;
+}
+
+/* Spatial Split */
+
+BVHBuild::SpatialSplit BVHBuild::find_spatial_split(const NodeSpec& spec, float nodeSAH)
+{
+ /* initialize bins. */
+ float3 origin = spec.bounds.min;
+ float3 binSize = (spec.bounds.max - origin) * (1.0f / (float)BVHParams::NUM_SPATIAL_BINS);
+ float3 invBinSize = 1.0f / binSize;
+
+ for(int dim = 0; dim < 3; dim++) {
+ for(int i = 0; i < BVHParams::NUM_SPATIAL_BINS; i++) {
+ SpatialBin& bin = spatial_bins[dim][i];
+
+ bin.bounds = BoundBox();
+ bin.enter = 0;
+ bin.exit = 0;
+ }
+ }
+
+ /* chop references into bins. */
+ for(unsigned int refIdx = references.size() - spec.num; refIdx < references.size(); refIdx++) {
+ const Reference& ref = references[refIdx];
+ float3 firstBinf = (ref.bounds.min - origin) * invBinSize;
+ float3 lastBinf = (ref.bounds.max - origin) * invBinSize;
+ int3 firstBin = make_int3((int)firstBinf.x, (int)firstBinf.y, (int)firstBinf.z);
+ int3 lastBin = make_int3((int)lastBinf.x, (int)lastBinf.y, (int)lastBinf.z);
+
+ firstBin = clamp(firstBin, 0, BVHParams::NUM_SPATIAL_BINS - 1);
+ lastBin = clamp(lastBin, firstBin, BVHParams::NUM_SPATIAL_BINS - 1);
+
+ for(int dim = 0; dim < 3; dim++) {
+ Reference currRef = ref;
+
+ for(int i = firstBin[dim]; i < lastBin[dim]; i++) {
+ Reference leftRef, rightRef;
+
+ split_reference(leftRef, rightRef, currRef, dim, origin[dim] + binSize[dim] * (float)(i + 1));
+ spatial_bins[dim][i].bounds.grow(leftRef.bounds);
+ currRef = rightRef;
+ }
+
+ spatial_bins[dim][lastBin[dim]].bounds.grow(currRef.bounds);
+ spatial_bins[dim][firstBin[dim]].enter++;
+ spatial_bins[dim][lastBin[dim]].exit++;
+ }
+ }
+
+ /* select best split plane. */
+ SpatialSplit split;
+
+ for(int dim = 0; dim < 3; dim++) {
+ /* sweep right to left and determine bounds. */
+ BoundBox right_bounds;
+
+ for(int i = BVHParams::NUM_SPATIAL_BINS - 1; i > 0; i--) {
+ right_bounds.grow(spatial_bins[dim][i].bounds);
+ spatial_right_bounds[i - 1] = right_bounds;
+ }
+
+ /* sweep left to right and select lowest SAH. */
+ BoundBox left_bounds;
+ int leftNum = 0;
+ int rightNum = spec.num;
+
+ for(int i = 1; i < BVHParams::NUM_SPATIAL_BINS; i++) {
+ left_bounds.grow(spatial_bins[dim][i - 1].bounds);
+ leftNum += spatial_bins[dim][i - 1].enter;
+ rightNum -= spatial_bins[dim][i - 1].exit;
+
+ float sah = nodeSAH +
+ left_bounds.area() * params.triangle_cost(leftNum) +
+ spatial_right_bounds[i - 1].area() * params.triangle_cost(rightNum);
+
+ if(sah < split.sah) {
+ split.sah = sah;
+ split.dim = dim;
+ split.pos = origin[dim] + binSize[dim] * (float)i;
+ }
+ }
+ }
+
+ return split;
+}
+
+void BVHBuild::do_spatial_split(NodeSpec& left, NodeSpec& right, const NodeSpec& spec, const SpatialSplit& split)
+{
+ /* Categorize references and compute bounds.
+ *
+ * Left-hand side: [left_start, left_end[
+ * Uncategorized/split: [left_end, right_start[
+ * Right-hand side: [right_start, refs.size()[ */
+
+ vector<Reference>& refs = references;
+ int left_start = refs.size() - spec.num;
+ int left_end = left_start;
+ int right_start = refs.size();
+
+ left.bounds = right.bounds = BoundBox();
+
+ for(int i = left_end; i < right_start; i++) {
+ if(refs[i].bounds.max[split.dim] <= split.pos) {
+ /* entirely on the left-hand side */
+ left.bounds.grow(refs[i].bounds);
+ swap(refs[i], refs[left_end++]);
+ }
+ else if(refs[i].bounds.min[split.dim] >= split.pos) {
+ /* entirely on the right-hand side */
+ right.bounds.grow(refs[i].bounds);
+ swap(refs[i--], refs[--right_start]);
+ }
+ }
+
+ /* duplicate or unsplit references intersecting both sides. */
+ while(left_end < right_start) {
+ /* split reference. */
+ Reference lref, rref;
+
+ split_reference(lref, rref, refs[left_end], split.dim, split.pos);
+
+ /* compute SAH for duplicate/unsplit candidates. */
+ BoundBox lub = left.bounds; // Unsplit to left: new left-hand bounds.
+ BoundBox rub = right.bounds; // Unsplit to right: new right-hand bounds.
+ BoundBox ldb = left.bounds; // Duplicate: new left-hand bounds.
+ BoundBox rdb = right.bounds; // Duplicate: new right-hand bounds.
+
+ lub.grow(refs[left_end].bounds);
+ rub.grow(refs[left_end].bounds);
+ ldb.grow(lref.bounds);
+ rdb.grow(rref.bounds);
+
+ float lac = params.triangle_cost(left_end - left_start);
+ float rac = params.triangle_cost(refs.size() - right_start);
+ float lbc = params.triangle_cost(left_end - left_start + 1);
+ float rbc = params.triangle_cost(refs.size() - right_start + 1);
+
+ float unsplitLeftSAH = lub.area() * lbc + right.bounds.area() * rac;
+ float unsplitRightSAH = left.bounds.area() * lac + rub.area() * rbc;
+ float duplicateSAH = ldb.area() * lbc + rdb.area() * rbc;
+ float minSAH = min(min(unsplitLeftSAH, unsplitRightSAH), duplicateSAH);
+
+ if(minSAH == unsplitLeftSAH) {
+ /* unsplit to left */
+ left.bounds = lub;
+ left_end++;
+ }
+ else if(minSAH == unsplitRightSAH) {
+ /* unsplit to right */
+ right.bounds = rub;
+ swap(refs[left_end], refs[--right_start]);
+ }
+ else {
+ /* duplicate */
+ left.bounds = ldb;
+ right.bounds = rdb;
+ refs[left_end++] = lref;
+ refs.push_back(rref);
+ }
+ }
+
+ left.num = left_end - left_start;
+ right.num = refs.size() - right_start;
+}
+
+void BVHBuild::split_reference(Reference& left, Reference& right, const Reference& ref, int dim, float pos)
+{
+ /* initialize references. */
+ left.prim_index = right.prim_index = ref.prim_index;
+ left.prim_object = right.prim_object = ref.prim_object;
+ left.bounds = right.bounds = BoundBox();
+
+ /* loop over vertices/edges. */
+ Object *ob = objects[ref.prim_object];
+ const Mesh *mesh = ob->mesh;
+ const int *inds = mesh->triangles[ref.prim_index].v;
+ const float3 *verts = &mesh->verts[0];
+ const float3* v1 = &verts[inds[2]];
+
+ for(int i = 0; i < 3; i++) {
+ const float3* v0 = v1;
+ int vindex = inds[i];
+ v1 = &verts[vindex];
+ float v0p = (*v0)[dim];
+ float v1p = (*v1)[dim];
+
+ /* insert vertex to the boxes it belongs to. */
+ if(v0p <= pos)
+ left.bounds.grow(*v0);
+
+ if(v0p >= pos)
+ right.bounds.grow(*v0);
+
+ /* edge intersects the plane => insert intersection to both boxes. */
+ if((v0p < pos && v1p > pos) || (v0p > pos && v1p < pos)) {
+ float3 t = lerp(*v0, *v1, clamp((pos - v0p) / (v1p - v0p), 0.0f, 1.0f));
+ left.bounds.grow(t);
+ right.bounds.grow(t);
+ }
+ }
+
+ /* intersect with original bounds. */
+ left.bounds.max[dim] = pos;
+ right.bounds.min[dim] = pos;
+ left.bounds.intersect(ref.bounds);
+ right.bounds.intersect(ref.bounds);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/bvh/bvh_build.h b/intern/cycles/bvh/bvh_build.h
new file mode 100644
index 00000000000..1fa1951d7f2
--- /dev/null
+++ b/intern/cycles/bvh/bvh_build.h
@@ -0,0 +1,152 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BVH_BUILD_H__
+#define __BVH_BUILD_H__
+
+#include <float.h>
+
+#include "bvh.h"
+
+#include "util_boundbox.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class BVHParams;
+class Mesh;
+class Object;
+class Progress;
+
+/* BVH Builder */
+
+class BVHBuild
+{
+public:
+ struct Reference
+ {
+ int prim_index;
+ int prim_object;
+ BoundBox bounds;
+
+ Reference()
+ {
+ }
+ };
+
+ struct NodeSpec
+ {
+ int num;
+ BoundBox bounds;
+
+ NodeSpec()
+ {
+ num = 0;
+ }
+ };
+
+ BVHBuild(
+ const vector<Object*>& objects,
+ vector<int>& prim_index,
+ vector<int>& prim_object,
+ const BVHParams& params,
+ Progress& progress);
+ ~BVHBuild();
+
+ BVHNode *run();
+
+protected:
+ /* adding references */
+ void add_reference_mesh(NodeSpec& root, Mesh *mesh, int i);
+ void add_reference_object(NodeSpec& root, Object *ob, int i);
+ void add_references(NodeSpec& root);
+
+ /* building */
+ BVHNode *build_node(const NodeSpec& spec, int level, float progress_start, float progress_end);
+ BVHNode *create_leaf_node(const NodeSpec& spec);
+ BVHNode *create_object_leaf_nodes(const Reference *ref, int num);
+
+ void progress_update(float progress_start, float progress_end);
+
+ /* object splits */
+ struct ObjectSplit
+ {
+ float sah;
+ int dim;
+ int num_left;
+ BoundBox left_bounds;
+ BoundBox right_bounds;
+
+ ObjectSplit()
+ : sah(FLT_MAX), dim(0), num_left(0)
+ {
+ }
+ };
+
+ ObjectSplit find_object_split(const NodeSpec& spec, float nodeSAH);
+ void do_object_split(NodeSpec& left, NodeSpec& right, const NodeSpec& spec, const ObjectSplit& split);
+
+ /* spatial splits */
+ struct SpatialSplit
+ {
+ float sah;
+ int dim;
+ float pos;
+
+ SpatialSplit()
+ : sah(FLT_MAX), dim(0), pos(0.0f)
+ {
+ }
+ };
+
+ struct SpatialBin
+ {
+ BoundBox bounds;
+ int enter;
+ int exit;
+ };
+
+ SpatialSplit find_spatial_split(const NodeSpec& spec, float nodeSAH);
+ void do_spatial_split(NodeSpec& left, NodeSpec& right, const NodeSpec& spec, const SpatialSplit& split);
+ void split_reference(Reference& left, Reference& right, const Reference& ref, int dim, float pos);
+
+ /* objects and primitive references */
+ vector<Object*> objects;
+ vector<Reference> references;
+
+ /* output primitive indexes and objects */
+ vector<int>& prim_index;
+ vector<int>& prim_object;
+
+ /* build parameters */
+ BVHParams params;
+
+ /* progress reporting */
+ Progress& progress;
+ double progress_start_time;
+ int progress_num_duplicates;
+
+ /* spatial splitting */
+ float spatial_min_overlap;
+ vector<BoundBox> spatial_right_bounds;
+ SpatialBin spatial_bins[3][BVHParams::NUM_SPATIAL_BINS];
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BVH_BUILD_H__ */
+
diff --git a/intern/cycles/bvh/bvh_node.cpp b/intern/cycles/bvh/bvh_node.cpp
new file mode 100644
index 00000000000..63683bae4a3
--- /dev/null
+++ b/intern/cycles/bvh/bvh_node.cpp
@@ -0,0 +1,101 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "bvh.h"
+#include "bvh_build.h"
+#include "bvh_node.h"
+
+#include "util_debug.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+int BVHNode::getSubtreeSize(BVH_STAT stat) const
+{
+ int cnt = 0;
+
+ switch(stat)
+ {
+ case BVH_STAT_NODE_COUNT:
+ cnt = 1;
+ break;
+ case BVH_STAT_LEAF_COUNT:
+ cnt = is_leaf() ? 1 : 0;
+ break;
+ case BVH_STAT_INNER_COUNT:
+ cnt = is_leaf() ? 0 : 1;
+ break;
+ case BVH_STAT_TRIANGLE_COUNT:
+ cnt = is_leaf() ? reinterpret_cast<const LeafNode*>(this)->num_triangles() : 0;
+ break;
+ case BVH_STAT_CHILDNODE_COUNT:
+ cnt = num_children();
+ break;
+ default:
+ assert(0); /* unknown mode */
+ }
+
+ if(!is_leaf())
+ for(int i=0;i<num_children();i++)
+ cnt += get_child(i)->getSubtreeSize(stat);
+
+ return cnt;
+}
+
+void BVHNode::deleteSubtree()
+{
+ for(int i=0;i<num_children();i++)
+ get_child(i)->deleteSubtree();
+
+ delete this;
+}
+
+float BVHNode::computeSubtreeSAHCost(const BVHParams& p, float probability) const
+{
+ float SAH = probability * p.cost(num_children(), num_triangles());
+
+ for(int i=0;i<num_children();i++) {
+ BVHNode *child = get_child(i);
+ SAH += child->computeSubtreeSAHCost(p, probability * child->m_bounds.area()/m_bounds.area());
+ }
+
+ return SAH;
+}
+
+void InnerNode::print(int depth) const
+{
+ for(int i = 0; i < depth; i++)
+ printf(" ");
+
+ printf("inner node %p\n", (void*)this);
+
+ if(children[0])
+ children[0]->print(depth+1);
+ if(children[1])
+ children[1]->print(depth+1);
+}
+
+void LeafNode::print(int depth) const
+{
+ for(int i = 0; i < depth; i++)
+ printf(" ");
+
+ printf("leaf node %d to %d\n", m_lo, m_hi);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/bvh/bvh_node.h b/intern/cycles/bvh/bvh_node.h
new file mode 100644
index 00000000000..5e0a17a1193
--- /dev/null
+++ b/intern/cycles/bvh/bvh_node.h
@@ -0,0 +1,112 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BVH_NODE_H__
+#define __BVH_NODE_H__
+
+#include "util_boundbox.h"
+#include "util_debug.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+enum BVH_STAT
+{
+ BVH_STAT_NODE_COUNT,
+ BVH_STAT_INNER_COUNT,
+ BVH_STAT_LEAF_COUNT,
+ BVH_STAT_TRIANGLE_COUNT,
+ BVH_STAT_CHILDNODE_COUNT
+};
+
+class BVHParams;
+
+class BVHNode
+{
+public:
+ BVHNode()
+ {
+ }
+
+ virtual ~BVHNode() {}
+ virtual bool is_leaf() const = 0;
+ virtual int num_children() const = 0;
+ virtual BVHNode *get_child(int i) const = 0;
+ virtual int num_triangles() const { return 0; }
+ virtual void print(int depth = 0) const = 0;
+
+ float getArea() const { return m_bounds.area(); }
+
+ BoundBox m_bounds;
+ uint m_visibility;
+
+ // Subtree functions
+ int getSubtreeSize(BVH_STAT stat=BVH_STAT_NODE_COUNT) const;
+ float computeSubtreeSAHCost(const BVHParams& p, float probability = 1.0f) const;
+ void deleteSubtree();
+};
+
+class InnerNode : public BVHNode
+{
+public:
+ InnerNode(const BoundBox& bounds, BVHNode* child0, BVHNode* child1)
+ {
+ m_bounds = bounds;
+ m_visibility = child0->m_visibility|child1->m_visibility;
+ children[0] = child0;
+ children[1] = child1;
+ }
+
+ bool is_leaf() const { return false; }
+ int num_children() const { return 2; }
+ BVHNode *get_child(int i) const{ assert(i>=0 && i<2); return children[i]; }
+ void print(int depth) const;
+
+ BVHNode *children[2];
+};
+
+class LeafNode : public BVHNode
+{
+public:
+ LeafNode(const BoundBox& bounds, uint visibility, int lo, int hi)
+ {
+ m_bounds = bounds;
+ m_visibility = visibility;
+ m_lo = lo;
+ m_hi = hi;
+ }
+
+ LeafNode(const LeafNode& s)
+ : BVHNode()
+ {
+ *this = s;
+ }
+
+ bool is_leaf() const { return true; }
+ int num_children() const { return 0; }
+ BVHNode *get_child(int) const { return NULL; }
+ int num_triangles() const { return m_hi - m_lo; }
+ void print(int depth) const;
+
+ int m_lo;
+ int m_hi;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BVH_NODE_H__ */
+
diff --git a/intern/cycles/bvh/bvh_params.h b/intern/cycles/bvh/bvh_params.h
new file mode 100644
index 00000000000..b38e40cfbda
--- /dev/null
+++ b/intern/cycles/bvh/bvh_params.h
@@ -0,0 +1,86 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BVH_PARAMS_H__
+#define __BVH_PARAMS_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* BVH Parameters */
+
+class BVHParams
+{
+public:
+ /* spatial split area threshold */
+ bool use_spatial_split;
+ float spatial_split_alpha;
+
+ /* SAH costs */
+ float sah_node_cost;
+ float sah_triangle_cost;
+
+ /* number of triangles in leaf */
+ int min_leaf_size;
+ int max_leaf_size;
+
+ /* object or mesh level bvh */
+ bool top_level;
+
+ /* disk cache */
+ bool use_cache;
+
+ /* QBVH */
+ bool use_qbvh;
+
+ /* fixed parameters */
+ enum {
+ MAX_DEPTH = 64,
+ MAX_SPATIAL_DEPTH = 48,
+ NUM_SPATIAL_BINS = 32
+ };
+
+ BVHParams()
+ {
+ use_spatial_split = true;
+ spatial_split_alpha = 1e-5f;
+
+ sah_node_cost = 1.0f;
+ sah_triangle_cost = 1.0f;
+
+ min_leaf_size = 1;
+ max_leaf_size = 0x7FFFFFF;
+
+ top_level = false;
+ use_cache = false;
+ use_qbvh = false;
+ }
+
+ /* SAH costs */
+ float cost(int num_nodes, int num_tris) const
+ { return node_cost(num_nodes) + triangle_cost(num_tris); }
+
+ float triangle_cost(int n) const
+ { return n*sah_triangle_cost; }
+
+ float node_cost(int n) const
+ { return n*sah_node_cost; }
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BVH_PARAMS_H__ */
+
diff --git a/intern/cycles/bvh/bvh_sort.cpp b/intern/cycles/bvh/bvh_sort.cpp
new file mode 100644
index 00000000000..ee4531a4843
--- /dev/null
+++ b/intern/cycles/bvh/bvh_sort.cpp
@@ -0,0 +1,57 @@
+/*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "bvh_build.h"
+#include "bvh_sort.h"
+
+#include "util_algorithm.h"
+#include "util_debug.h"
+
+CCL_NAMESPACE_BEGIN
+
+struct BVHReferenceCompare {
+public:
+ int dim;
+
+ BVHReferenceCompare(int dim_)
+ {
+ dim = dim_;
+ }
+
+ bool operator()(const BVHBuild::Reference& ra, const BVHBuild::Reference& rb)
+ {
+ float ca = ra.bounds.min[dim] + ra.bounds.max[dim];
+ float cb = rb.bounds.min[dim] + rb.bounds.max[dim];
+
+ if(ca < cb) return true;
+ else if(ca > cb) return false;
+ else if(ra.prim_object < rb.prim_object) return true;
+ else if(ra.prim_object > rb.prim_object) return false;
+ else if(ra.prim_index < rb.prim_index) return true;
+ else if(ra.prim_index > rb.prim_index) return false;
+
+ return false;
+ }
+};
+
+void bvh_reference_sort(int start, int end, BVHBuild::Reference *data, int dim)
+{
+ sort(data+start, data+end, BVHReferenceCompare(dim));
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/bvh/bvh_sort.h b/intern/cycles/bvh/bvh_sort.h
new file mode 100644
index 00000000000..f0676948146
--- /dev/null
+++ b/intern/cycles/bvh/bvh_sort.h
@@ -0,0 +1,28 @@
+ /*
+ * Adapted from code copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BVH_SORT_H__
+#define __BVH_SORT_H__
+
+CCL_NAMESPACE_BEGIN
+
+void bvh_reference_sort(int start, int end, BVHBuild::Reference *data, int dim);
+
+CCL_NAMESPACE_END
+
+#endif /* __BVH_SORT_H__ */
+
diff --git a/intern/cycles/cmake/external_libs.cmake b/intern/cycles/cmake/external_libs.cmake
new file mode 100644
index 00000000000..9037362f1ab
--- /dev/null
+++ b/intern/cycles/cmake/external_libs.cmake
@@ -0,0 +1,100 @@
+
+###########################################################################
+# GLUT
+
+if(WITH_CYCLES_TEST)
+ set(GLUT_ROOT_PATH ${CYCLES_GLUT})
+
+ find_package(GLUT)
+ message(STATUS "GLUT_FOUND=${GLUT_FOUND}")
+
+ include_directories(${GLUT_INCLUDE_DIR})
+endif()
+
+if(WITH_BUILTIN_GLEW)
+ set(CYCLES_GLEW_LIBRARY extern_glew)
+else()
+ set(CYCLES_GLEW_LIBRARY ${GLEW_LIBRARY})
+endif()
+
+###########################################################################
+# OpenShadingLanguage
+
+if(WITH_CYCLES_OSL)
+
+ set(CYCLES_OSL "" CACHE PATH "Path to OpenShadingLanguage installation")
+
+ message(STATUS "CYCLES_OSL = ${CYCLES_OSL}")
+
+ find_library(OSL_LIBRARIES NAMES oslexec oslcomp oslquery PATHS ${CYCLES_OSL}/lib ${CYCLES_OSL}/dist)
+ find_path(OSL_INCLUDES OSL/oslclosure.h PATHS ${CYCLES_OSL}/include ${CYCLES_OSL}/dist)
+ find_program(OSL_COMPILER NAMES oslc PATHS ${CYCLES_OSL}/bin ${CYCLES_OSL}/dist)
+
+ if(OSL_INCLUDES AND OSL_LIBRARIES AND OSL_COMPILER)
+ set(OSL_FOUND TRUE)
+ message(STATUS "OSL includes = ${OSL_INCLUDES}")
+ message(STATUS "OSL library = ${OSL_LIBRARIES}")
+ message(STATUS "OSL compiler = ${OSL_COMPILER}")
+ else()
+ message(STATUS "OSL not found")
+ endif()
+
+ include_directories(${OSL_INCLUDES} ${OSL_INCLUDES}/OSL ${OSL_INCLUDES}/../../../src/liboslexec)
+
+endif()
+
+###########################################################################
+# Partio
+
+if(WITH_CYCLES_PARTIO)
+
+ set(CYCLES_PARTIO "" CACHE PATH "Path to Partio installation")
+
+ message(STATUS "CYCLES_PARTIO = ${CYCLES_PARTIO}")
+
+ find_library(PARTIO_LIBRARIES NAMES partio PATHS ${CYCLES_PARTIO}/lib)
+ find_path(PARTIO_INCLUDES Partio.h ${CYCLES_PARTIO}/include)
+
+ find_package(ZLIB)
+
+ if(PARTIO_INCLUDES AND PARTIO_LIBRARIES AND ZLIB_LIBRARIES)
+ list(APPEND PARTIO_LIBRARIES ${ZLIB_LIBRARIES})
+ set(PARTIO_FOUND TRUE)
+ message(STATUS "PARTIO includes = ${PARTIO_INCLUDES}")
+ message(STATUS "PARTIO library = ${PARTIO_LIBRARIES}")
+ else()
+ message(STATUS "PARTIO not found")
+ endif()
+
+ include_directories(${PARTIO_INCLUDES})
+
+endif()
+
+###########################################################################
+# Blender
+
+if(WITH_CYCLES_BLENDER)
+
+ set(BLENDER_INCLUDE_DIRS
+ ${CMAKE_SOURCE_DIR}/intern/guardedalloc
+ ${CMAKE_SOURCE_DIR}/source/blender/makesdna
+ ${CMAKE_SOURCE_DIR}/source/blender/makesrna
+ ${CMAKE_SOURCE_DIR}/source/blender/blenloader
+ ${CMAKE_BINARY_DIR}/source/blender/makesrna/intern)
+
+ add_definitions(-DBLENDER_PLUGIN)
+endif()
+
+###########################################################################
+# CUDA
+
+if(WITH_CYCLES_CUDA_BINARIES)
+ find_package(CUDA) # Try to auto locate CUDA toolkit
+ if(CUDA_FOUND)
+ message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}")
+ else()
+ message(STATUS "CUDA compiler not found, disabling WITH_CYCLES_CUDA_BINARIES")
+ set(WITH_CYCLES_CUDA_BINARIES OFF)
+ endif()
+endif()
+
diff --git a/intern/cycles/device/CMakeLists.txt b/intern/cycles/device/CMakeLists.txt
new file mode 100644
index 00000000000..17072d230bb
--- /dev/null
+++ b/intern/cycles/device/CMakeLists.txt
@@ -0,0 +1,33 @@
+
+set(INC
+ .
+ ../kernel
+ ../kernel/svm
+ ../kernel/osl
+ ../util
+ ../render
+ ${OPENGL_INCLUDE_DIR}
+ ${GLEW_INCLUDE_PATH}
+)
+
+set(SRC
+ device.cpp
+ device_cpu.cpp
+ device_cuda.cpp
+ device_multi.cpp
+ device_network.cpp
+ device_opencl.cpp
+)
+
+set(SRC_HEADERS
+ device.h
+ device_memory.h
+ device_intern.h
+ device_network.h
+)
+
+add_definitions(-DGLEW_STATIC)
+
+include_directories(${INC})
+
+add_library(cycles_device ${SRC} ${SRC_HEADERS})
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
new file mode 100644
index 00000000000..f43ccffe461
--- /dev/null
+++ b/intern/cycles/device/device.cpp
@@ -0,0 +1,222 @@
+/*
+ * 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 <stdlib.h>
+#include <string.h>
+
+#include "device.h"
+#include "device_intern.h"
+
+#include "util_cuda.h"
+#include "util_debug.h"
+#include "util_math.h"
+#include "util_opencl.h"
+#include "util_opengl.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Device Task */
+
+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)
+{
+}
+
+void DeviceTask::split(ThreadQueue<DeviceTask>& tasks, int num)
+{
+ if(type == DISPLACE) {
+ num = min(displace_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;
+
+ DeviceTask task = *this;
+
+ task.displace_x = tx;
+ task.displace_w = tw;
+
+ tasks.push(task);
+ }
+ }
+ else {
+ num = min(h, num);
+
+ for(int i = 0; i < num; i++) {
+ int ty = y + (h/num)*i;
+ int th = (i == num-1)? h - i*(h/num): h/num;
+
+ DeviceTask task = *this;
+
+ task.y = ty;
+ task.h = th;
+
+ tasks.push(task);
+ }
+ }
+}
+
+/* Device */
+
+void Device::pixels_alloc(device_memory& mem)
+{
+ mem_alloc(mem, MEM_READ_WRITE);
+}
+
+void Device::pixels_copy_from(device_memory& mem, int y, int w, int h)
+{
+ mem_copy_from(mem, sizeof(uint8_t)*4*y*w, sizeof(uint8_t)*4*w*h);
+}
+
+void Device::pixels_free(device_memory& mem)
+{
+ mem_free(mem);
+}
+
+void Device::draw_pixels(device_memory& rgba, int y, int w, int h, int width, int height, bool transparent)
+{
+ pixels_copy_from(rgba, y, w, h);
+
+ if(transparent) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ glPixelZoom((float)width/(float)w, (float)height/(float)h);
+ glRasterPos2f(0, y);
+
+ uint8_t *pixels = (uint8_t*)rgba.data_pointer;
+
+ /* for multi devices, this assumes the ineffecient method that we allocate
+ all pixels on the device even though we only render to a subset */
+ pixels += 4*y*w;
+
+ glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
+ glRasterPos2f(0.0f, 0.0f);
+ glPixelZoom(1.0f, 1.0f);
+
+ if(transparent)
+ glDisable(GL_BLEND);
+}
+
+Device *Device::create(DeviceType type, bool background, int threads)
+{
+ Device *device;
+
+ switch(type) {
+ case DEVICE_CPU:
+ device = device_cpu_create(threads);
+ break;
+#ifdef WITH_CUDA
+ case DEVICE_CUDA:
+ if(cuLibraryInit())
+ device = device_cuda_create(background);
+ else
+ device = NULL;
+ break;
+#endif
+#ifdef WITH_MULTI
+ case DEVICE_MULTI:
+ device = device_multi_create(background);
+ break;
+#endif
+#ifdef WITH_NETWORK
+ case DEVICE_NETWORK:
+ device = device_network_create("127.0.0.1");
+ break;
+#endif
+#ifdef WITH_OPENCL
+ case DEVICE_OPENCL:
+ if(clLibraryInit())
+ device = device_opencl_create(background);
+ else
+ device = NULL;
+ break;
+#endif
+ default:
+ return NULL;
+ }
+
+ return device;
+}
+
+DeviceType Device::type_from_string(const char *name)
+{
+ if(strcmp(name, "cpu") == 0)
+ return DEVICE_CPU;
+ else if(strcmp(name, "cuda") == 0)
+ return DEVICE_CUDA;
+ else if(strcmp(name, "opencl") == 0)
+ return DEVICE_OPENCL;
+ else if(strcmp(name, "network") == 0)
+ return DEVICE_NETWORK;
+ else if(strcmp(name, "multi") == 0)
+ return DEVICE_MULTI;
+
+ return DEVICE_NONE;
+}
+
+string Device::string_from_type(DeviceType type)
+{
+ if(type == DEVICE_CPU)
+ return "cpu";
+ else if(type == DEVICE_CUDA)
+ return "cuda";
+ else if(type == DEVICE_OPENCL)
+ return "opencl";
+ else if(type == DEVICE_NETWORK)
+ return "network";
+ else if(type == DEVICE_MULTI)
+ return "multi";
+
+ return "";
+}
+
+vector<DeviceType> Device::available_types()
+{
+ vector<DeviceType> types;
+
+ types.push_back(DEVICE_CPU);
+
+#ifdef WITH_CUDA
+ if(cuLibraryInit())
+ types.push_back(DEVICE_CUDA);
+#endif
+
+#ifdef WITH_OPENCL
+ if(clLibraryInit())
+ types.push_back(DEVICE_OPENCL);
+#endif
+
+#ifdef WITH_NETWORK
+ types.push_back(DEVICE_NETWORK);
+#endif
+#ifdef WITH_MULTI
+ types.push_back(DEVICE_MULTI);
+#endif
+
+ return types;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
new file mode 100644
index 00000000000..5d6ac10dc40
--- /dev/null
+++ b/intern/cycles/device/device.h
@@ -0,0 +1,140 @@
+/*
+ * 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 __DEVICE_H__
+#define __DEVICE_H__
+
+#include <stdlib.h>
+
+#include "device_memory.h"
+
+#include "util_string.h"
+#include "util_thread.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Progress;
+
+enum DeviceType {
+ DEVICE_NONE,
+ DEVICE_CPU,
+ DEVICE_OPENCL,
+ DEVICE_CUDA,
+ DEVICE_NETWORK,
+ DEVICE_MULTI
+};
+
+enum MemoryType {
+ MEM_READ_ONLY,
+ MEM_WRITE_ONLY,
+ MEM_READ_WRITE
+};
+
+/* Device Task */
+
+class DeviceTask {
+public:
+ typedef enum { PATH_TRACE, TONEMAP, DISPLACE } Type;
+ Type type;
+
+ int x, y, w, h;
+ device_ptr rng_state;
+ device_ptr rgba;
+ device_ptr buffer;
+ int sample;
+ int resolution;
+
+ device_ptr displace_input;
+ device_ptr displace_offset;
+ int displace_x, displace_w;
+
+ DeviceTask(Type type = PATH_TRACE);
+ void split(ThreadQueue<DeviceTask>& tasks, int num);
+};
+
+/* Device */
+
+class Device {
+protected:
+ Device() {}
+
+ bool background;
+
+public:
+ virtual ~Device() {}
+
+ virtual bool support_full_kernel() = 0;
+
+ /* info */
+ virtual string description() = 0;
+
+ /* regular memory */
+ virtual void mem_alloc(device_memory& mem, MemoryType type) = 0;
+ virtual void mem_copy_to(device_memory& mem) = 0;
+ virtual void mem_copy_from(device_memory& mem,
+ size_t offset, size_t size) = 0;
+ virtual void mem_zero(device_memory& mem) = 0;
+ virtual void mem_free(device_memory& mem) = 0;
+
+ /* constant memory */
+ virtual void const_copy_to(const char *name, void *host, size_t size) = 0;
+
+ /* texture memory */
+ virtual void tex_alloc(const char *name, device_memory& mem,
+ bool interpolation = false, bool periodic = false) {};
+ virtual void tex_free(device_memory& mem) {};
+
+ /* pixel memory */
+ virtual void pixels_alloc(device_memory& mem);
+ virtual void pixels_copy_from(device_memory& mem, int y, int w, int h);
+ virtual void pixels_free(device_memory& mem);
+
+ /* open shading language, only for CPU device */
+ virtual void *osl_memory() { return NULL; }
+
+ /* load/compile kernels, must be called before adding tasks */
+ virtual bool load_kernels() { return true; }
+
+ /* tasks */
+ virtual void task_add(DeviceTask& task) = 0;
+ virtual void task_wait() = 0;
+ virtual void task_cancel() = 0;
+
+ /* opengl drawing */
+ virtual void draw_pixels(device_memory& mem, int y, int w, int h,
+ int width, int height, bool transparent);
+
+#ifdef WITH_NETWORK
+ /* networking */
+ void server_run();
+#endif
+
+ /* static */
+ static Device *create(DeviceType type, bool background = true, int threads = 0);
+
+ static DeviceType type_from_string(const char *name);
+ static string string_from_type(DeviceType type);
+ static vector<DeviceType> available_types();
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __DEVICE_H__ */
+
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
new file mode 100644
index 00000000000..d6e1c200996
--- /dev/null
+++ b/intern/cycles/device/device_cpu.cpp
@@ -0,0 +1,224 @@
+/*
+ * 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 <stdlib.h>
+#include <string.h>
+
+#include "device.h"
+#include "device_intern.h"
+
+#include "kernel.h"
+#include "kernel_types.h"
+
+#include "osl_shader.h"
+
+#include "util_debug.h"
+#include "util_foreach.h"
+#include "util_function.h"
+#include "util_opengl.h"
+#include "util_progress.h"
+#include "util_system.h"
+#include "util_thread.h"
+
+CCL_NAMESPACE_BEGIN
+
+class CPUDevice : public Device
+{
+public:
+ vector<thread*> threads;
+ ThreadQueue<DeviceTask> tasks;
+ KernelGlobals *kg;
+
+ CPUDevice(int threads_num)
+ {
+ kg = kernel_globals_create();
+
+ if(threads_num == 0)
+ threads_num = system_cpu_thread_count();
+
+ threads.resize(threads_num);
+
+ for(size_t i = 0; i < threads.size(); i++)
+ threads[i] = new thread(function_bind(&CPUDevice::thread_run, this, i));
+ }
+
+ ~CPUDevice()
+ {
+ tasks.stop();
+
+ foreach(thread *t, threads) {
+ t->join();
+ delete t;
+ }
+
+ kernel_globals_free(kg);
+ }
+
+ bool support_full_kernel()
+ {
+ return true;
+ }
+
+ string description()
+ {
+ return system_cpu_brand_string();
+ }
+
+ void mem_alloc(device_memory& mem, MemoryType type)
+ {
+ mem.device_pointer = mem.data_pointer;
+ }
+
+ void mem_copy_to(device_memory& mem)
+ {
+ /* no-op */
+ }
+
+ void mem_copy_from(device_memory& mem, size_t offset, size_t size)
+ {
+ /* no-op */
+ }
+
+ void mem_zero(device_memory& mem)
+ {
+ memset((void*)mem.device_pointer, 0, mem.memory_size());
+ }
+
+ void mem_free(device_memory& mem)
+ {
+ mem.device_pointer = 0;
+ }
+
+ void const_copy_to(const char *name, void *host, size_t size)
+ {
+ kernel_const_copy(kg, name, host, size);
+ }
+
+ void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic)
+ {
+ kernel_tex_copy(kg, name, mem.data_pointer, mem.data_width, mem.data_height);
+ mem.device_pointer = mem.data_pointer;
+ }
+
+ void tex_free(device_memory& mem)
+ {
+ mem.device_pointer = 0;
+ }
+
+ void *osl_memory()
+ {
+#ifdef WITH_OSL
+ return kernel_osl_memory(kg);
+#else
+ return NULL;
+#endif
+ }
+
+ void thread_run(int t)
+ {
+ DeviceTask task;
+
+ while(tasks.worker_wait_pop(task)) {
+ if(task.type == DeviceTask::PATH_TRACE)
+ thread_path_trace(task);
+ else if(task.type == DeviceTask::TONEMAP)
+ thread_tonemap(task);
+ else if(task.type == DeviceTask::DISPLACE)
+ thread_displace(task);
+
+ tasks.worker_done();
+ }
+ }
+
+ void thread_path_trace(DeviceTask& task)
+ {
+ if(tasks.worker_cancel())
+ return;
+
+#ifdef WITH_OSL
+ if(kernel_osl_use(kg))
+ OSLShader::thread_init(kg);
+#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_path_trace(kg, (float4*)task.buffer, (unsigned int*)task.rng_state, task.sample, x, y);
+
+ if(tasks.worker_cancel())
+ break;
+ }
+
+#ifdef WITH_OSL
+ if(kernel_osl_use(kg))
+ OSLShader::thread_free(kg);
+#endif
+ }
+
+ void thread_tonemap(DeviceTask& task)
+ {
+ 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);
+ }
+ }
+
+ void thread_displace(DeviceTask& task)
+ {
+#ifdef WITH_OSL
+ if(kernel_osl_use(kg))
+ OSLShader::thread_init(kg);
+#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);
+
+ if(tasks.worker_cancel())
+ break;
+ }
+
+#ifdef WITH_OSL
+ if(kernel_osl_use(kg))
+ OSLShader::thread_free(kg);
+#endif
+ }
+
+ void task_add(DeviceTask& task)
+ {
+ /* split task into smaller ones, more than number of threads for uneven
+ workloads where some parts of the image render slower than others */
+ task.split(tasks, threads.size()*10);
+ }
+
+ void task_wait()
+ {
+ tasks.wait_done();
+ }
+
+ void task_cancel()
+ {
+ tasks.cancel();
+ }
+};
+
+Device *device_cpu_create(int threads)
+{
+ return new CPUDevice(threads);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
new file mode 100644
index 00000000000..1158cc6c77c
--- /dev/null
+++ b/intern/cycles/device/device_cuda.cpp
@@ -0,0 +1,809 @@
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "device.h"
+#include "device_intern.h"
+
+#include "util_cuda.h"
+#include "util_debug.h"
+#include "util_map.h"
+#include "util_opengl.h"
+#include "util_path.h"
+#include "util_system.h"
+#include "util_types.h"
+#include "util_time.h"
+
+CCL_NAMESPACE_BEGIN
+
+class CUDADevice : public Device
+{
+public:
+ CUdevice cuDevice;
+ CUcontext cuContext;
+ CUmodule cuModule;
+ map<device_ptr, bool> tex_interp_map;
+ int cuDevId;
+
+ struct PixelMem {
+ GLuint cuPBO;
+ CUgraphicsResource cuPBOresource;
+ GLuint cuTexId;
+ int w, h;
+ };
+
+ map<device_ptr, PixelMem> pixel_mem_map;
+
+ CUdeviceptr cuda_device_ptr(device_ptr mem)
+ {
+ return (CUdeviceptr)mem;
+ }
+
+ const char *cuda_error_string(CUresult result)
+ {
+ switch(result) {
+ case CUDA_SUCCESS: return "No errors";
+ case CUDA_ERROR_INVALID_VALUE: return "Invalid value";
+ case CUDA_ERROR_OUT_OF_MEMORY: return "Out of memory";
+ case CUDA_ERROR_NOT_INITIALIZED: return "Driver not initialized";
+ case CUDA_ERROR_DEINITIALIZED: return "Driver deinitialized";
+
+ case CUDA_ERROR_NO_DEVICE: return "No CUDA-capable device available";
+ case CUDA_ERROR_INVALID_DEVICE: return "Invalid device";
+
+ case CUDA_ERROR_INVALID_IMAGE: return "Invalid kernel image";
+ case CUDA_ERROR_INVALID_CONTEXT: return "Invalid context";
+ case CUDA_ERROR_CONTEXT_ALREADY_CURRENT: return "Context already current";
+ case CUDA_ERROR_MAP_FAILED: return "Map failed";
+ case CUDA_ERROR_UNMAP_FAILED: return "Unmap failed";
+ case CUDA_ERROR_ARRAY_IS_MAPPED: return "Array is mapped";
+ case CUDA_ERROR_ALREADY_MAPPED: return "Already mapped";
+ case CUDA_ERROR_NO_BINARY_FOR_GPU: return "No binary for GPU";
+ case CUDA_ERROR_ALREADY_ACQUIRED: return "Already acquired";
+ case CUDA_ERROR_NOT_MAPPED: return "Not mapped";
+ case CUDA_ERROR_NOT_MAPPED_AS_ARRAY: return "Mapped resource not available for access as an array";
+ case CUDA_ERROR_NOT_MAPPED_AS_POINTER: return "Mapped resource not available for access as a pointer";
+ case CUDA_ERROR_ECC_UNCORRECTABLE: return "Uncorrectable ECC error detected";
+ case CUDA_ERROR_UNSUPPORTED_LIMIT: return "CUlimit not supported by device";
+
+ case CUDA_ERROR_INVALID_SOURCE: return "Invalid source";
+ case CUDA_ERROR_FILE_NOT_FOUND: return "File not found";
+ case CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND: return "Link to a shared object failed to resolve";
+ case CUDA_ERROR_SHARED_OBJECT_INIT_FAILED: return "Shared object initialization failed";
+
+ case CUDA_ERROR_INVALID_HANDLE: return "Invalid handle";
+
+ case CUDA_ERROR_NOT_FOUND: return "Not found";
+
+ case CUDA_ERROR_NOT_READY: return "CUDA not ready";
+
+ case CUDA_ERROR_LAUNCH_FAILED: return "Launch failed";
+ case CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES: return "Launch exceeded resources";
+ case CUDA_ERROR_LAUNCH_TIMEOUT: return "Launch exceeded timeout";
+ case CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING: return "Launch with incompatible texturing";
+
+ case CUDA_ERROR_UNKNOWN: return "Unknown error";
+
+ default: return "Unknown CUDA error value";
+ }
+ }
+
+ static int cuda_align_up(int& offset, int alignment)
+ {
+ return (offset + alignment - 1) & ~(alignment - 1);
+ }
+
+#ifdef NDEBUG
+#define cuda_abort()
+#else
+#define cuda_abort() abort()
+#endif
+
+#define cuda_assert(stmt) \
+ { \
+ CUresult result = stmt; \
+ \
+ if(result != CUDA_SUCCESS) { \
+ fprintf(stderr, "CUDA error: %s in %s\n", cuda_error_string(result), #stmt); \
+ cuda_abort(); \
+ } \
+ }
+
+ bool cuda_error(CUresult result)
+ {
+ if(result == CUDA_SUCCESS)
+ return false;
+
+ fprintf(stderr, "CUDA error: %s\n", cuda_error_string(result));
+ return true;
+ }
+
+ void cuda_push_context()
+ {
+ cuda_assert(cuCtxSetCurrent(cuContext))
+ }
+
+ void cuda_pop_context()
+ {
+ cuda_assert(cuCtxSetCurrent(NULL));
+ }
+
+ CUDADevice(bool background_)
+ {
+ background = background_;
+
+ cuDevId = 0;
+ cuDevice = 0;
+ cuContext = 0;
+
+ /* intialize */
+ if(cuda_error(cuInit(0)))
+ return;
+
+ /* setup device and context */
+ if(cuda_error(cuDeviceGet(&cuDevice, cuDevId)))
+ return;
+
+ CUresult result;
+
+ if(background)
+ result = cuCtxCreate(&cuContext, 0, cuDevice);
+ else
+ result = cuGLCtxCreate(&cuContext, 0, cuDevice);
+
+ if(cuda_error(result))
+ return;
+
+ cuda_pop_context();
+ }
+
+ ~CUDADevice()
+ {
+ cuda_push_context();
+ cuda_assert(cuCtxDetach(cuContext))
+ }
+
+ bool support_full_kernel()
+ {
+ int major, minor;
+ cuDeviceComputeCapability(&major, &minor, cuDevId);
+
+ return (major >= 2);
+ }
+
+ string description()
+ {
+ /* print device information */
+ char deviceName[100];
+
+ cuda_push_context();
+ cuDeviceGetName(deviceName, 256, cuDevId);
+ cuda_pop_context();
+
+ return string("CUDA ") + deviceName;
+ }
+
+ string compile_kernel()
+ {
+ /* compute cubin name */
+ int major, minor;
+ cuDeviceComputeCapability(&major, &minor, cuDevId);
+
+ /* attempt to use kernel provided with blender */
+ string cubin = path_get(string_printf("lib/kernel_sm_%d%d.cubin", major, minor));
+ if(path_exists(cubin))
+ return cubin;
+
+ /* not found, try to use locally compiled kernel */
+ string kernel_path = path_get("kernel");
+ string md5 = path_files_md5_hash(kernel_path);
+
+ cubin = string_printf("cycles_kernel_sm%d%d_%s.cubin", major, minor, md5.c_str());;
+ cubin = path_user_get(path_join("cache", cubin));
+
+ /* if exists already, use it */
+ if(path_exists(cubin))
+ return cubin;
+
+#ifdef WITH_CUDA_BINARIES
+ fprintf(stderr, "CUDA binary kernel for this graphics card not found.\n");
+ return "";
+#else
+ /* if not, find CUDA compiler */
+ string nvcc = cuCompilerPath();
+
+ if(nvcc == "") {
+ fprintf(stderr, "CUDA nvcc compiler not found. Install CUDA toolkit in default location.\n");
+ return "";
+ }
+
+ /* compile */
+ string kernel = path_join(kernel_path, "kernel.cu");
+ string include = kernel_path;
+ const int machine = system_cpu_bits();
+ const int maxreg = 24;
+
+ double starttime = time_dt();
+ printf("Compiling CUDA kernel ...\n");
+
+ path_create_directories(cubin);
+
+ string command = string_printf("\"%s\" -arch=sm_%d%d -m%d --cubin \"%s\" --use_fast_math "
+ "-o \"%s\" --ptxas-options=\"-v\" --maxrregcount=%d --opencc-options -OPT:Olimit=0 -I\"%s\" -DNVCC",
+ nvcc.c_str(), major, minor, machine, kernel.c_str(), cubin.c_str(), maxreg, include.c_str());
+
+ if(system(command.c_str()) == -1) {
+ fprintf(stderr, "Failed to execute compilation command.\n");
+ return "";
+ }
+
+ /* verify if compilation succeeded */
+ if(!path_exists(cubin)) {
+ fprintf(stderr, "CUDA kernel compilation failed.\n");
+ return "";
+ }
+
+ printf("Kernel compilation finished in %.2lfs.\n", time_dt() - starttime);
+
+ return cubin;
+#endif
+ }
+
+ bool load_kernels()
+ {
+ /* check if cuda init succeeded */
+ if(cuContext == 0)
+ return false;
+
+ /* get kernel */
+ string cubin = compile_kernel();
+
+ if(cubin == "")
+ return false;
+
+ /* open module */
+ cuda_push_context();
+
+ CUresult result = cuModuleLoad(&cuModule, cubin.c_str());
+ if(cuda_error(result))
+ fprintf(stderr, "Failed loading CUDA kernel %s.\n", cubin.c_str());
+
+ cuda_pop_context();
+
+ return (result == CUDA_SUCCESS);
+ }
+
+ void mem_alloc(device_memory& mem, MemoryType type)
+ {
+ cuda_push_context();
+ CUdeviceptr device_pointer;
+ cuda_assert(cuMemAlloc(&device_pointer, mem.memory_size()))
+ mem.device_pointer = (device_ptr)device_pointer;
+ cuda_pop_context();
+ }
+
+ void mem_copy_to(device_memory& mem)
+ {
+ cuda_push_context();
+ cuda_assert(cuMemcpyHtoD(cuda_device_ptr(mem.device_pointer), (void*)mem.data_pointer, mem.memory_size()))
+ cuda_pop_context();
+ }
+
+ void mem_copy_from(device_memory& mem, size_t offset, size_t size)
+ {
+ /* todo: offset is ignored */
+ cuda_push_context();
+ cuda_assert(cuMemcpyDtoH((uchar*)mem.data_pointer + offset,
+ (CUdeviceptr)((uchar*)mem.device_pointer + offset), size))
+ cuda_pop_context();
+ }
+
+ void mem_zero(device_memory& mem)
+ {
+ memset((void*)mem.data_pointer, 0, mem.memory_size());
+
+ cuda_push_context();
+ cuda_assert(cuMemsetD8(cuda_device_ptr(mem.device_pointer), 0, mem.memory_size()))
+ cuda_pop_context();
+ }
+
+ void mem_free(device_memory& mem)
+ {
+ if(mem.device_pointer) {
+ cuda_push_context();
+ cuda_assert(cuMemFree(cuda_device_ptr(mem.device_pointer)))
+ cuda_pop_context();
+
+ mem.device_pointer = 0;
+ }
+ }
+
+ void const_copy_to(const char *name, void *host, size_t size)
+ {
+ CUdeviceptr mem;
+ size_t bytes;
+
+ cuda_push_context();
+ cuda_assert(cuModuleGetGlobal(&mem, &bytes, cuModule, name))
+ //assert(bytes == size);
+ cuda_assert(cuMemcpyHtoD(mem, host, size))
+ cuda_pop_context();
+ }
+
+ void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic)
+ {
+ /* determine format */
+ CUarray_format_enum format;
+ size_t dsize = datatype_size(mem.data_type);
+ size_t size = mem.memory_size();
+
+ switch(mem.data_type) {
+ case TYPE_UCHAR: format = CU_AD_FORMAT_UNSIGNED_INT8; break;
+ case TYPE_UINT: format = CU_AD_FORMAT_UNSIGNED_INT32; break;
+ case TYPE_INT: format = CU_AD_FORMAT_SIGNED_INT32; break;
+ case TYPE_FLOAT: format = CU_AD_FORMAT_FLOAT; break;
+ default: assert(0); return;
+ }
+
+ CUtexref texref;
+
+ cuda_push_context();
+ cuda_assert(cuModuleGetTexRef(&texref, cuModule, name))
+
+ if(interpolation) {
+ CUarray handle;
+ CUDA_ARRAY_DESCRIPTOR desc;
+
+ desc.Width = mem.data_width;
+ desc.Height = mem.data_height;
+ desc.Format = format;
+ desc.NumChannels = mem.data_elements;
+
+ cuda_assert(cuArrayCreate(&handle, &desc))
+
+ if(mem.data_height > 1) {
+ CUDA_MEMCPY2D param;
+ memset(&param, 0, sizeof(param));
+ param.dstMemoryType = CU_MEMORYTYPE_ARRAY;
+ param.dstArray = handle;
+ param.srcMemoryType = CU_MEMORYTYPE_HOST;
+ param.srcHost = (void*)mem.data_pointer;
+ param.srcPitch = mem.data_width*dsize*mem.data_elements;
+ param.WidthInBytes = param.srcPitch;
+ param.Height = mem.data_height;
+
+ cuda_assert(cuMemcpy2D(&param))
+ }
+ else
+ cuda_assert(cuMemcpyHtoA(handle, 0, (void*)mem.data_pointer, size))
+
+ cuda_assert(cuTexRefSetArray(texref, handle, CU_TRSA_OVERRIDE_FORMAT))
+
+ cuda_assert(cuTexRefSetFilterMode(texref, CU_TR_FILTER_MODE_LINEAR))
+ cuda_assert(cuTexRefSetFlags(texref, CU_TRSF_NORMALIZED_COORDINATES))
+
+ mem.device_pointer = (device_ptr)handle;
+ }
+ else {
+ cuda_pop_context();
+
+ mem_alloc(mem, MEM_READ_ONLY);
+ mem_copy_to(mem);
+
+ cuda_push_context();
+
+ cuda_assert(cuTexRefSetAddress(NULL, texref, cuda_device_ptr(mem.device_pointer), size))
+ cuda_assert(cuTexRefSetFilterMode(texref, CU_TR_FILTER_MODE_POINT))
+ cuda_assert(cuTexRefSetFlags(texref, CU_TRSF_READ_AS_INTEGER))
+ }
+
+ if(periodic) {
+ cuda_assert(cuTexRefSetAddressMode(texref, 0, CU_TR_ADDRESS_MODE_WRAP))
+ cuda_assert(cuTexRefSetAddressMode(texref, 1, CU_TR_ADDRESS_MODE_WRAP))
+ }
+ else {
+ cuda_assert(cuTexRefSetAddressMode(texref, 0, CU_TR_ADDRESS_MODE_CLAMP))
+ cuda_assert(cuTexRefSetAddressMode(texref, 1, CU_TR_ADDRESS_MODE_CLAMP))
+ }
+ cuda_assert(cuTexRefSetFormat(texref, format, mem.data_elements))
+
+ cuda_pop_context();
+
+ tex_interp_map[mem.device_pointer] = interpolation;
+ }
+
+ void tex_free(device_memory& mem)
+ {
+ if(mem.device_pointer) {
+ if(tex_interp_map[mem.device_pointer]) {
+ cuda_push_context();
+ cuArrayDestroy((CUarray)mem.device_pointer);
+ cuda_pop_context();
+
+ tex_interp_map.erase(tex_interp_map.find(mem.device_pointer));
+ mem.device_pointer = 0;
+ }
+ else {
+ tex_interp_map.erase(tex_interp_map.find(mem.device_pointer));
+ mem_free(mem);
+ }
+ }
+ }
+
+ void path_trace(DeviceTask& task)
+ {
+ cuda_push_context();
+
+ CUfunction cuPathTrace;
+ CUdeviceptr d_buffer = cuda_device_ptr(task.buffer);
+ CUdeviceptr d_rng_state = cuda_device_ptr(task.rng_state);
+
+ /* get kernel function */
+ cuda_assert(cuModuleGetFunction(&cuPathTrace, cuModule, "kernel_cuda_path_trace"))
+
+ /* pass in parameters */
+ int offset = 0;
+
+ cuda_assert(cuParamSetv(cuPathTrace, offset, &d_buffer, sizeof(d_buffer)))
+ offset += sizeof(d_buffer);
+
+ cuda_assert(cuParamSetv(cuPathTrace, offset, &d_rng_state, sizeof(d_rng_state)))
+ offset += sizeof(d_rng_state);
+
+ int sample = task.sample;
+ offset = cuda_align_up(offset, __alignof(sample));
+
+ cuda_assert(cuParamSeti(cuPathTrace, offset, task.sample))
+ offset += sizeof(task.sample);
+
+ cuda_assert(cuParamSeti(cuPathTrace, offset, task.x))
+ offset += sizeof(task.x);
+
+ cuda_assert(cuParamSeti(cuPathTrace, offset, task.y))
+ offset += sizeof(task.y);
+
+ cuda_assert(cuParamSeti(cuPathTrace, offset, task.w))
+ offset += sizeof(task.w);
+
+ cuda_assert(cuParamSeti(cuPathTrace, offset, task.h))
+ offset += sizeof(task.h);
+
+ cuda_assert(cuParamSetSize(cuPathTrace, offset))
+
+ /* launch kernel: todo find optimal size, cache config for fermi */
+#ifndef __APPLE__
+ int xthreads = 16;
+ int ythreads = 16;
+#else
+ int xthreads = 8;
+ int ythreads = 8;
+#endif
+ int xblocks = (task.w + xthreads - 1)/xthreads;
+ int yblocks = (task.h + ythreads - 1)/ythreads;
+
+ cuda_assert(cuFuncSetCacheConfig(cuPathTrace, CU_FUNC_CACHE_PREFER_L1))
+ cuda_assert(cuFuncSetBlockShape(cuPathTrace, xthreads, ythreads, 1))
+ cuda_assert(cuLaunchGrid(cuPathTrace, xblocks, yblocks))
+
+ cuda_pop_context();
+ }
+
+ void tonemap(DeviceTask& task)
+ {
+ cuda_push_context();
+
+ CUfunction cuFilmConvert;
+ CUdeviceptr d_rgba = map_pixels(task.rgba);
+ CUdeviceptr d_buffer = cuda_device_ptr(task.buffer);
+
+ /* get kernel function */
+ cuda_assert(cuModuleGetFunction(&cuFilmConvert, cuModule, "kernel_cuda_tonemap"))
+
+ /* pass in parameters */
+ int offset = 0;
+
+ cuda_assert(cuParamSetv(cuFilmConvert, offset, &d_rgba, sizeof(d_rgba)))
+ offset += sizeof(d_rgba);
+
+ cuda_assert(cuParamSetv(cuFilmConvert, offset, &d_buffer, sizeof(d_buffer)))
+ offset += sizeof(d_buffer);
+
+ int sample = task.sample;
+ offset = cuda_align_up(offset, __alignof(sample));
+
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.sample))
+ offset += sizeof(task.sample);
+
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.resolution))
+ offset += sizeof(task.resolution);
+
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.x))
+ offset += sizeof(task.x);
+
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.y))
+ offset += sizeof(task.y);
+
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.w))
+ offset += sizeof(task.w);
+
+ cuda_assert(cuParamSeti(cuFilmConvert, offset, task.h))
+ offset += sizeof(task.h);
+
+ cuda_assert(cuParamSetSize(cuFilmConvert, offset))
+
+ /* launch kernel: todo find optimal size, cache config for fermi */
+#ifndef __APPLE__
+ int xthreads = 16;
+ int ythreads = 16;
+#else
+ int xthreads = 8;
+ int ythreads = 8;
+#endif
+ int xblocks = (task.w + xthreads - 1)/xthreads;
+ int yblocks = (task.h + ythreads - 1)/ythreads;
+
+ cuda_assert(cuFuncSetCacheConfig(cuFilmConvert, CU_FUNC_CACHE_PREFER_L1))
+ cuda_assert(cuFuncSetBlockShape(cuFilmConvert, xthreads, ythreads, 1))
+ cuda_assert(cuLaunchGrid(cuFilmConvert, xblocks, yblocks))
+
+ unmap_pixels(task.rgba);
+
+ cuda_pop_context();
+ }
+
+ void displace(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);
+
+ /* get kernel function */
+ cuda_assert(cuModuleGetFunction(&cuDisplace, cuModule, "kernel_cuda_displace"))
+
+ /* pass in parameters */
+ int offset = 0;
+
+ cuda_assert(cuParamSetv(cuDisplace, offset, &d_input, sizeof(d_input)))
+ offset += sizeof(d_input);
+
+ 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));
+
+ cuda_assert(cuParamSeti(cuDisplace, offset, task.displace_x))
+ offset += sizeof(task.displace_x);
+
+ cuda_assert(cuParamSetSize(cuDisplace, offset))
+
+ /* launch kernel: todo find optimal size, cache config for fermi */
+#ifndef __APPLE__
+ int xthreads = 16;
+#else
+ int xthreads = 8;
+#endif
+ int xblocks = (task.displace_w + xthreads - 1)/xthreads;
+
+ cuda_assert(cuFuncSetCacheConfig(cuDisplace, CU_FUNC_CACHE_PREFER_L1))
+ cuda_assert(cuFuncSetBlockShape(cuDisplace, xthreads, 1, 1))
+ cuda_assert(cuLaunchGrid(cuDisplace, xblocks, 1))
+
+ cuda_pop_context();
+ }
+
+ CUdeviceptr map_pixels(device_ptr mem)
+ {
+ if(!background) {
+ PixelMem pmem = pixel_mem_map[mem];
+ CUdeviceptr buffer;
+
+ size_t bytes;
+ cuda_assert(cuGraphicsMapResources(1, &pmem.cuPBOresource, 0))
+ cuda_assert(cuGraphicsResourceGetMappedPointer(&buffer, &bytes, pmem.cuPBOresource))
+
+ return buffer;
+ }
+
+ return cuda_device_ptr(mem);
+ }
+
+ void unmap_pixels(device_ptr mem)
+ {
+ if(!background) {
+ PixelMem pmem = pixel_mem_map[mem];
+
+ cuda_assert(cuGraphicsUnmapResources(1, &pmem.cuPBOresource, 0))
+ }
+ }
+
+ void pixels_alloc(device_memory& mem)
+ {
+ if(!background) {
+ PixelMem pmem;
+
+ pmem.w = mem.data_width;
+ pmem.h = mem.data_height;
+
+ cuda_push_context();
+
+ glGenBuffers(1, &pmem.cuPBO);
+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pmem.cuPBO);
+ glBufferData(GL_PIXEL_UNPACK_BUFFER, pmem.w*pmem.h*sizeof(GLfloat)*3, NULL, GL_DYNAMIC_DRAW);
+
+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+
+ glGenTextures(1, &pmem.cuTexId);
+ glBindTexture(GL_TEXTURE_2D, pmem.cuTexId);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pmem.w, pmem.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ cuda_assert(cuGraphicsGLRegisterBuffer(&pmem.cuPBOresource, pmem.cuPBO, CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE))
+
+ cuda_pop_context();
+
+ mem.device_pointer = pmem.cuTexId;
+ pixel_mem_map[mem.device_pointer] = pmem;
+
+ return;
+ }
+
+ Device::pixels_alloc(mem);
+ }
+
+ void pixels_copy_from(device_memory& mem, int y, int w, int h)
+ {
+ if(!background) {
+ PixelMem pmem = pixel_mem_map[mem.device_pointer];
+
+ cuda_push_context();
+
+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pmem.cuPBO);
+ uchar *pixels = (uchar*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_READ_ONLY);
+ size_t offset = sizeof(uchar)*4*y*w;
+ memcpy((uchar*)mem.data_pointer + offset, pixels + offset, sizeof(uchar)*4*w*h);
+ glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+
+ cuda_pop_context();
+
+ return;
+ }
+
+ Device::pixels_copy_from(mem, y, w, h);
+ }
+
+ void pixels_free(device_memory& mem)
+ {
+ if(mem.device_pointer) {
+ if(!background) {
+ PixelMem pmem = pixel_mem_map[mem.device_pointer];
+
+ cuda_push_context();
+
+ cuda_assert(cuGraphicsUnregisterResource(pmem.cuPBOresource))
+ glDeleteBuffers(1, &pmem.cuPBO);
+ glDeleteTextures(1, &pmem.cuTexId);
+
+ cuda_pop_context();
+
+ pixel_mem_map.erase(pixel_mem_map.find(mem.device_pointer));
+ mem.device_pointer = 0;
+
+ return;
+ }
+
+ Device::pixels_free(mem);
+ }
+ }
+
+ void draw_pixels(device_memory& mem, int y, int w, int h, int width, int height, bool transparent)
+ {
+ if(!background) {
+ PixelMem pmem = pixel_mem_map[mem.device_pointer];
+
+ cuda_push_context();
+
+ /* for multi devices, this assumes the ineffecient method that we allocate
+ all pixels on the device even though we only render to a subset */
+ size_t offset = sizeof(uint8_t)*4*y*w;
+
+ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pmem.cuPBO);
+ glBindTexture(GL_TEXTURE_2D, pmem.cuTexId);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)offset);
+ glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
+
+ glEnable(GL_TEXTURE_2D);
+
+ if(transparent) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ glColor3f(1.0f, 1.0f, 1.0f);
+
+ glPushMatrix();
+ glTranslatef(0.0f, (float)y, 0.0f);
+
+ glBegin(GL_QUADS);
+
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex2f(0.0f, 0.0f);
+ glTexCoord2f((float)w/(float)pmem.w, 0.0f);
+ glVertex2f((float)width, 0.0f);
+ glTexCoord2f((float)w/(float)pmem.w, (float)h/(float)pmem.h);
+ glVertex2f((float)width, (float)height);
+ glTexCoord2f(0.0f, (float)h/(float)pmem.h);
+ glVertex2f(0.0f, (float)height);
+
+ glEnd();
+
+ glPopMatrix();
+
+ if(transparent)
+ glDisable(GL_BLEND);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ cuda_pop_context();
+
+ return;
+ }
+
+ Device::draw_pixels(mem, y, w, h, width, height, transparent);
+ }
+
+ void task_add(DeviceTask& task)
+ {
+ if(task.type == DeviceTask::TONEMAP)
+ tonemap(task);
+ else if(task.type == DeviceTask::PATH_TRACE)
+ path_trace(task);
+ else if(task.type == DeviceTask::DISPLACE)
+ displace(task);
+ }
+
+ void task_wait()
+ {
+ cuda_push_context();
+
+ cuda_assert(cuCtxSynchronize())
+
+ cuda_pop_context();
+ }
+
+ void task_cancel()
+ {
+ }
+};
+
+Device *device_cuda_create(bool background)
+{
+ return new CUDADevice(background);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/device/device_intern.h b/intern/cycles/device/device_intern.h
new file mode 100644
index 00000000000..e098ac1f0e3
--- /dev/null
+++ b/intern/cycles/device/device_intern.h
@@ -0,0 +1,35 @@
+/*
+ * 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 __DEVICE_INTERN_H__
+#define __DEVICE_INTERN_H__
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+
+Device *device_cpu_create(int threads);
+Device *device_opencl_create(bool background);
+Device *device_cuda_create(bool background);
+Device *device_network_create(const char *address);
+Device *device_multi_create(bool background);
+
+CCL_NAMESPACE_END
+
+#endif /* __DEVICE_INTERN_H__ */
+
diff --git a/intern/cycles/device/device_memory.h b/intern/cycles/device/device_memory.h
new file mode 100644
index 00000000000..516a6bd0739
--- /dev/null
+++ b/intern/cycles/device/device_memory.h
@@ -0,0 +1,244 @@
+/*
+ * 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 __DEVICE_MEMORY_H__
+#define __DEVICE_MEMORY_H__
+
+/* Device Memory
+ *
+ * This file defines data types that can be used in device memory arrays, and
+ * a device_vector<T> type to store such arrays.
+ *
+ * device_vector<T> contains an STL vector, metadata about the data type,
+ * dimensions, elements, and a device pointer. For the CPU device this is just
+ * a pointer to the STL vector data, as no copying needs to take place. For
+ * other devices this is a pointer to device memory, where we will copy memory
+ * to and from. */
+
+#include "util_debug.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Supported Data Types */
+
+enum DataType {
+ TYPE_UCHAR,
+ TYPE_UINT,
+ TYPE_INT,
+ TYPE_FLOAT
+};
+
+static inline size_t datatype_size(DataType datatype)
+{
+ switch(datatype) {
+ case TYPE_UCHAR: return sizeof(uchar);
+ case TYPE_FLOAT: return sizeof(float);
+ case TYPE_UINT: return sizeof(uint);
+ case TYPE_INT: return sizeof(int);
+ default: return 0;
+ }
+}
+
+/* Traits for data types */
+
+template<typename T> struct device_type_traits {
+ static const DataType data_type = TYPE_UCHAR;
+ static const int num_elements = 0;
+};
+
+template<> struct device_type_traits<uchar> {
+ static const DataType data_type = TYPE_UCHAR;
+ static const int num_elements = 1;
+};
+
+template<> struct device_type_traits<uchar2> {
+ static const DataType data_type = TYPE_UCHAR;
+ static const int num_elements = 2;
+};
+
+template<> struct device_type_traits<uchar3> {
+ static const DataType data_type = TYPE_UCHAR;
+ static const int num_elements = 3;
+};
+
+template<> struct device_type_traits<uchar4> {
+ static const DataType data_type = TYPE_UCHAR;
+ static const int num_elements = 4;
+};
+
+template<> struct device_type_traits<uint> {
+ static const DataType data_type = TYPE_UINT;
+ static const int num_elements = 1;
+};
+
+template<> struct device_type_traits<uint2> {
+ static const DataType data_type = TYPE_UINT;
+ static const int num_elements = 2;
+};
+
+template<> struct device_type_traits<uint3> {
+ static const DataType data_type = TYPE_UINT;
+ static const int num_elements = 3;
+};
+
+template<> struct device_type_traits<uint4> {
+ static const DataType data_type = TYPE_UINT;
+ static const int num_elements = 4;
+};
+
+template<> struct device_type_traits<int> {
+ static const DataType data_type = TYPE_INT;
+ static const int num_elements = 1;
+};
+
+template<> struct device_type_traits<int2> {
+ static const DataType data_type = TYPE_INT;
+ static const int num_elements = 2;
+};
+
+template<> struct device_type_traits<int3> {
+ static const DataType data_type = TYPE_INT;
+ static const int num_elements = 3;
+};
+
+template<> struct device_type_traits<int4> {
+ static const DataType data_type = TYPE_INT;
+ static const int num_elements = 4;
+};
+
+template<> struct device_type_traits<float> {
+ static const DataType data_type = TYPE_FLOAT;
+ static const int num_elements = 1;
+};
+
+template<> struct device_type_traits<float2> {
+ static const DataType data_type = TYPE_FLOAT;
+ static const int num_elements = 2;
+};
+
+template<> struct device_type_traits<float3> {
+ static const DataType data_type = TYPE_FLOAT;
+ static const int num_elements = 3;
+};
+
+template<> struct device_type_traits<float4> {
+ static const DataType data_type = TYPE_FLOAT;
+ static const int num_elements = 4;
+};
+
+/* Device Memory */
+
+class device_memory
+{
+public:
+ size_t memory_size() { return data_size*data_elements*datatype_size(data_type); }
+
+ /* data information */
+ DataType data_type;
+ int data_elements;
+ device_ptr data_pointer;
+ size_t data_size;
+ size_t data_width;
+ size_t data_height;
+
+ /* device pointer */
+ device_ptr device_pointer;
+
+protected:
+ device_memory() {}
+ virtual ~device_memory() { assert(!device_pointer); }
+
+ /* no copying */
+ device_memory(const device_memory&);
+ device_memory& operator = (const device_memory&);
+};
+
+/* Device Vector */
+
+template<typename T> class device_vector : public device_memory
+{
+public:
+ device_vector()
+ {
+ data_type = device_type_traits<T>::data_type;
+ data_elements = device_type_traits<T>::num_elements;
+ data_pointer = 0;
+ data_size = 0;
+ data_width = 0;
+ data_height = 0;
+
+ assert(data_elements > 0);
+
+ device_pointer = 0;
+ }
+
+ virtual ~device_vector() {}
+
+ /* vector functions */
+ T *resize(size_t width, size_t height = 0)
+ {
+ data_size = (height == 0)? width: width*height;
+ data.resize(data_size);
+ data_pointer = (device_ptr)&data[0];
+ data_width = width;
+ data_height = height;
+
+ return &data[0];
+ }
+
+ T *copy(T *ptr, size_t width, size_t height = 0)
+ {
+ T *mem = resize(width, height);
+ memcpy(mem, ptr, memory_size());
+ return mem;
+ }
+
+ void reference(T *ptr, size_t width, size_t height = 0)
+ {
+ data.clear();
+ data_size = (height == 0)? width: width*height;
+ data_pointer = (device_ptr)ptr;
+ data_width = width;
+ data_height = height;
+ }
+
+ void clear()
+ {
+ data.clear();
+ data_pointer = 0;
+ data_width = 0;
+ data_height = 0;
+ data_size = 0;
+ }
+
+ size_t size()
+ {
+ return data.size();
+ }
+
+private:
+ array<T> data;
+ bool referenced;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __DEVICE_MEMORY_H__ */
+
diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp
new file mode 100644
index 00000000000..128c80ac396
--- /dev/null
+++ b/intern/cycles/device/device_multi.cpp
@@ -0,0 +1,336 @@
+/*
+ * 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 <stdlib.h>
+#include <sstream>
+
+#include "device.h"
+#include "device_intern.h"
+#include "device_network.h"
+
+#include "util_foreach.h"
+#include "util_list.h"
+#include "util_map.h"
+#include "util_time.h"
+
+CCL_NAMESPACE_BEGIN
+
+class MultiDevice : public Device
+{
+public:
+ struct SubDevice {
+ SubDevice(Device *device_)
+ : device(device_) {}
+
+ Device *device;
+ map<device_ptr, device_ptr> ptr_map;
+ };
+
+ list<SubDevice> devices;
+ device_ptr unique_ptr;
+
+ MultiDevice(bool background_)
+ : unique_ptr(1)
+ {
+ Device *device;
+
+ /* add CPU device */
+ device = Device::create(DEVICE_CPU, background);
+ devices.push_back(SubDevice(device));
+
+#ifdef WITH_CUDA
+ /* try to add GPU device */
+ device = Device::create(DEVICE_CUDA, background);
+ if(device) {
+ devices.push_back(SubDevice(device));
+ }
+ else
+#endif
+ {
+#ifdef WITH_OPENCL
+ device = Device::create(DEVICE_OPENCL, background);
+ if(device)
+ devices.push_back(SubDevice(device));
+#endif
+ }
+
+#ifdef WITH_NETWORK
+ /* try to add network devices */
+ ServerDiscovery discovery(true);
+ time_sleep(1.0);
+
+ list<string> servers = discovery.get_server_list();
+
+ foreach(string& server, servers) {
+ device = device_network_create(server.c_str());
+ if(device)
+ devices.push_back(SubDevice(device));
+ }
+#endif
+ }
+
+ ~MultiDevice()
+ {
+ foreach(SubDevice& sub, devices)
+ delete sub.device;
+ }
+
+ bool support_full_kernel()
+ {
+ foreach(SubDevice& sub, devices) {
+ if(!sub.device->support_full_kernel())
+ return false;
+ }
+
+ return true;
+ }
+
+ string description()
+ {
+ /* create map to find duplicate descriptions */
+ map<string, int> dupli_map;
+ map<string, int>::iterator dt;
+
+ foreach(SubDevice& sub, devices) {
+ string key = sub.device->description();
+
+ if(dupli_map.find(key) == dupli_map.end())
+ dupli_map[key] = 1;
+ else
+ dupli_map[key]++;
+ }
+
+ /* generate string */
+ stringstream desc;
+ bool first = true;
+
+ for(dt = dupli_map.begin(); dt != dupli_map.end(); dt++) {
+ if(!first) desc << ", ";
+ first = false;
+
+ if(dt->second > 1)
+ desc << dt->second << "x " << dt->first;
+ else
+ desc << dt->first;
+ }
+
+ return desc.str();
+ }
+
+ bool load_kernels()
+ {
+ foreach(SubDevice& sub, devices)
+ if(!sub.device->load_kernels())
+ return false;
+
+ return true;
+ }
+
+ void mem_alloc(device_memory& mem, MemoryType type)
+ {
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = 0;
+ sub.device->mem_alloc(mem, type);
+ sub.ptr_map[unique_ptr] = mem.device_pointer;
+ }
+
+ mem.device_pointer = unique_ptr++;
+ }
+
+ void mem_copy_to(device_memory& mem)
+ {
+ device_ptr tmp = mem.device_pointer;
+
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = sub.ptr_map[tmp];
+ sub.device->mem_copy_to(mem);
+ }
+
+ mem.device_pointer = tmp;
+ }
+
+ void mem_copy_from(device_memory& mem, size_t offset, size_t size)
+ {
+ device_ptr tmp = mem.device_pointer;
+
+ /* todo: how does this work? */
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = sub.ptr_map[tmp];
+ sub.device->mem_copy_from(mem, offset, size);
+ break;
+ }
+
+ mem.device_pointer = tmp;
+ }
+
+ void mem_zero(device_memory& mem)
+ {
+ device_ptr tmp = mem.device_pointer;
+
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = sub.ptr_map[tmp];
+ sub.device->mem_zero(mem);
+ }
+
+ mem.device_pointer = tmp;
+ }
+
+ void mem_free(device_memory& mem)
+ {
+ device_ptr tmp = mem.device_pointer;
+
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = sub.ptr_map[tmp];
+ sub.device->mem_free(mem);
+ sub.ptr_map.erase(sub.ptr_map.find(tmp));
+ }
+
+ mem.device_pointer = 0;
+ }
+
+ void const_copy_to(const char *name, void *host, size_t size)
+ {
+ foreach(SubDevice& sub, devices)
+ sub.device->const_copy_to(name, host, size);
+ }
+
+ void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic)
+ {
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = 0;
+ sub.device->tex_alloc(name, mem, interpolation, periodic);
+ sub.ptr_map[unique_ptr] = mem.device_pointer;
+ }
+
+ mem.device_pointer = unique_ptr++;
+ }
+
+ void tex_free(device_memory& mem)
+ {
+ device_ptr tmp = mem.device_pointer;
+
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = sub.ptr_map[tmp];
+ sub.device->tex_free(mem);
+ sub.ptr_map.erase(sub.ptr_map.find(tmp));
+ }
+
+ mem.device_pointer = 0;
+ }
+
+ void pixels_alloc(device_memory& mem)
+ {
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = 0;
+ sub.device->pixels_alloc(mem);
+ sub.ptr_map[unique_ptr] = mem.device_pointer;
+ }
+
+ mem.device_pointer = unique_ptr++;
+ }
+
+ void pixels_free(device_memory& mem)
+ {
+ device_ptr tmp = mem.device_pointer;
+
+ foreach(SubDevice& sub, devices) {
+ mem.device_pointer = sub.ptr_map[tmp];
+ sub.device->pixels_free(mem);
+ sub.ptr_map.erase(sub.ptr_map.find(tmp));
+ }
+
+ mem.device_pointer = 0;
+ }
+
+ void pixels_copy_from(device_memory& mem, int y, int w, int h)
+ {
+ device_ptr tmp = mem.device_pointer;
+ int i = 0, sub_h = h/devices.size();
+
+ foreach(SubDevice& sub, devices) {
+ int sy = y + i*sub_h;
+ int sh = (i == (int)devices.size() - 1)? h - sub_h*i: sub_h;
+
+ mem.device_pointer = sub.ptr_map[tmp];
+ sub.device->pixels_copy_from(mem, sy, w, sh);
+ i++;
+ }
+
+ mem.device_pointer = tmp;
+ }
+
+ void draw_pixels(device_memory& rgba, int y, int w, int h, int width, int height, bool transparent)
+ {
+ device_ptr tmp = rgba.device_pointer;
+ int i = 0, sub_h = h/devices.size();
+ int sub_height = height/devices.size();
+
+ foreach(SubDevice& sub, devices) {
+ int sy = y + i*sub_h;
+ int sh = (i == (int)devices.size() - 1)? h - sub_h*i: sub_h;
+ int sheight = (i == (int)devices.size() - 1)? height - sub_height*i: sub_height;
+ /* adjust math for w/width */
+
+ rgba.device_pointer = sub.ptr_map[tmp];
+ sub.device->draw_pixels(rgba, sy, w, sh, width, sheight, transparent);
+ i++;
+ }
+
+ rgba.device_pointer = tmp;
+ }
+
+ void task_add(DeviceTask& task)
+ {
+ ThreadQueue<DeviceTask> tasks;
+ task.split(tasks, devices.size());
+
+ foreach(SubDevice& sub, devices) {
+ DeviceTask subtask;
+
+ if(tasks.worker_wait_pop(subtask)) {
+ 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];
+
+ sub.device->task_add(subtask);
+ }
+ }
+ }
+
+ void task_wait()
+ {
+ foreach(SubDevice& sub, devices)
+ sub.device->task_wait();
+ }
+
+ void task_cancel()
+ {
+ foreach(SubDevice& sub, devices)
+ sub.device->task_cancel();
+ }
+};
+
+Device *device_multi_create(bool background)
+{
+ return new MultiDevice(background);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/device/device_network.cpp b/intern/cycles/device/device_network.cpp
new file mode 100644
index 00000000000..a5ad84831fc
--- /dev/null
+++ b/intern/cycles/device/device_network.cpp
@@ -0,0 +1,391 @@
+/*
+ * 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 "device.h"
+#include "device_intern.h"
+#include "device_network.h"
+
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+#ifdef WITH_NETWORK
+
+class NetworkDevice : public Device
+{
+public:
+ boost::asio::io_service io_service;
+ tcp::socket socket;
+
+ NetworkDevice(const char *address)
+ : socket(io_service)
+ {
+ stringstream portstr;
+ portstr << SERVER_PORT;
+
+ tcp::resolver resolver(io_service);
+ tcp::resolver::query query(address, portstr.str());
+ tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
+ tcp::resolver::iterator end;
+
+ boost::system::error_code error = boost::asio::error::host_not_found;
+ while(error && endpoint_iterator != end)
+ {
+ socket.close();
+ socket.connect(*endpoint_iterator++, error);
+ }
+ if(error)
+ throw boost::system::system_error(error);
+ }
+
+ ~NetworkDevice()
+ {
+ }
+
+ bool support_full_kernel()
+ {
+ return false;
+ }
+
+ string description()
+ {
+ RPCSend snd(socket, "description");
+ snd.write();
+
+ RPCReceive rcv(socket);
+ string desc_string;
+
+ *rcv.archive & desc_string;
+
+ return desc_string + " (remote)";
+ }
+
+ void mem_alloc(device_memory& mem, MemoryType type)
+ {
+#if 0
+ RPCSend snd(socket, "mem_alloc");
+
+ snd.archive & size & type;
+ snd.write();
+
+ RPCReceive rcv(socket);
+
+ device_ptr mem;
+ *rcv.archive & mem;
+
+ return mem;
+#endif
+ }
+
+ void mem_copy_to(device_memory& mem)
+ {
+#if 0
+ RPCSend snd(socket, "mem_copy_to");
+
+ snd.archive & mem & size;
+ snd.write();
+ snd.write_buffer(host, size);
+#endif
+ }
+
+ void mem_copy_from(device_memory& mem, size_t offset, size_t size)
+ {
+#if 0
+ RPCSend snd(socket, "mem_copy_from");
+
+ snd.archive & mem & offset & size;
+ snd.write();
+
+ RPCReceive rcv(socket);
+ rcv.read_buffer(host, size);
+#endif
+ }
+
+ void mem_zero(device_memory& mem)
+ {
+#if 0
+ RPCSend snd(socket, "mem_zero");
+
+ snd.archive & mem & size;
+ snd.write();
+#endif
+ }
+
+ void mem_free(device_memory& mem)
+ {
+#if 0
+ if(mem) {
+ RPCSend snd(socket, "mem_free");
+
+ snd.archive & mem;
+ snd.write();
+ }
+#endif
+ }
+
+ void const_copy_to(const char *name, void *host, size_t size)
+ {
+ RPCSend snd(socket, "const_copy_to");
+
+ string name_string(name);
+
+ snd.archive & name_string & size;
+ snd.write();
+ snd.write_buffer(host, size);
+ }
+
+ void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic)
+ {
+#if 0
+ RPCSend snd(socket, "tex_alloc");
+
+ string name_string(name);
+
+ snd.archive & name_string & width & height & datatype & components & interpolation;
+ snd.write();
+
+ size_t size = width*height*components*datatype_size(datatype);
+ snd.write_buffer(host, size);
+
+ RPCReceive rcv(socket);
+
+ device_ptr mem;
+ *rcv.archive & mem;
+
+ return mem;
+#endif
+ }
+
+ void tex_free(device_memory& mem)
+ {
+#if 0
+ if(mem) {
+ RPCSend snd(socket, "tex_free");
+
+ snd.archive & mem;
+ snd.write();
+ }
+#endif
+ }
+
+ void path_trace(int x, int y, int w, int h, device_ptr buffer, device_ptr rng_state, int sample)
+ {
+#if 0
+ RPCSend snd(socket, "path_trace");
+
+ snd.archive & x & y & w & h & buffer & rng_state & sample;
+ snd.write();
+#endif
+ }
+
+ void tonemap(int x, int y, int w, int h, device_ptr rgba, device_ptr buffer, int sample, int resolution)
+ {
+#if 0
+ RPCSend snd(socket, "tonemap");
+
+ snd.archive & x & y & w & h & rgba & buffer & sample & resolution;
+ snd.write();
+#endif
+ }
+
+ void task_add(DeviceTask& task)
+ {
+ if(task.type == DeviceTask::TONEMAP)
+ tonemap(task.x, task.y, task.w, task.h, task.rgba, task.buffer, task.sample, task.resolution);
+ else if(task.type == DeviceTask::PATH_TRACE)
+ path_trace(task.x, task.y, task.w, task.h, task.buffer, task.rng_state, task.sample);
+ }
+
+ void task_wait()
+ {
+ }
+
+ void task_cancel()
+ {
+ }
+};
+
+Device *device_network_create(const char *address)
+{
+ return new NetworkDevice(address);
+}
+
+
+void Device::server_run()
+{
+ try
+ {
+ /* starts thread that responds to discovery requests */
+ ServerDiscovery discovery;
+
+ for(;;)
+ {
+
+ /* accept connection */
+ boost::asio::io_service io_service;
+ tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), SERVER_PORT));
+
+ tcp::socket socket(io_service);
+ acceptor.accept(socket);
+
+ /* receive remote function calls */
+ for(;;) {
+ RPCReceive rcv(socket);
+
+ if(rcv.name == "description") {
+ string desc = description();
+
+ RPCSend snd(socket);
+ snd.archive & desc;
+ snd.write();
+ }
+ else if(rcv.name == "mem_alloc") {
+#if 0
+ MemoryType type;
+ size_t size;
+ device_ptr mem;
+
+ *rcv.archive & size & type;
+ mem = mem_alloc(size, type);
+
+ RPCSend snd(socket);
+ snd.archive & mem;
+ snd.write();
+#endif
+ }
+ else if(rcv.name == "mem_copy_to") {
+#if 0
+ device_ptr mem;
+ size_t size;
+
+ *rcv.archive & mem & size;
+
+ vector<char> host_vector(size);
+ rcv.read_buffer(&host_vector[0], size);
+
+ mem_copy_to(mem, &host_vector[0], size);
+#endif
+ }
+ else if(rcv.name == "mem_copy_from") {
+#if 0
+ device_ptr mem;
+ size_t offset, size;
+
+ *rcv.archive & mem & offset & size;
+
+ vector<char> host_vector(size);
+
+ mem_copy_from(&host_vector[0], mem, offset, size);
+
+ RPCSend snd(socket);
+ snd.write();
+ snd.write_buffer(&host_vector[0], size);
+#endif
+ }
+ else if(rcv.name == "mem_zero") {
+#if 0
+ device_ptr mem;
+ size_t size;
+
+ *rcv.archive & mem & size;
+ mem_zero(mem, size);
+#endif
+ }
+ else if(rcv.name == "mem_free") {
+#if 0
+ device_ptr mem;
+
+ *rcv.archive & mem;
+ mem_free(mem);
+#endif
+ }
+ else if(rcv.name == "const_copy_to") {
+ string name_string;
+ size_t size;
+
+ *rcv.archive & name_string & size;
+
+ vector<char> host_vector(size);
+ rcv.read_buffer(&host_vector[0], size);
+
+ const_copy_to(name_string.c_str(), &host_vector[0], size);
+ }
+ else if(rcv.name == "tex_alloc") {
+#if 0
+ string name_string;
+ DataType datatype;
+ device_ptr mem;
+ size_t width, height;
+ int components;
+ bool interpolation;
+
+ *rcv.archive & name_string & width & height & datatype & components & interpolation;
+
+ size_t size = width*height*components*datatype_size(datatype);
+
+ vector<char> host_vector(size);
+ rcv.read_buffer(&host_vector[0], size);
+
+ mem = tex_alloc(name_string.c_str(), &host_vector[0], width, height, datatype, components, interpolation);
+
+ RPCSend snd(socket);
+ snd.archive & mem;
+ snd.write();
+#endif
+ }
+ else if(rcv.name == "tex_free") {
+#if 0
+ device_ptr mem;
+
+ *rcv.archive & mem;
+ tex_free(mem);
+#endif
+ }
+ else if(rcv.name == "path_trace") {
+#if 0
+ device_ptr buffer, rng_state;
+ int x, y, w, h;
+ int sample;
+
+ *rcv.archive & x & y & w & h & buffer & rng_state & sample;
+ path_trace(x, y, w, h, buffer, rng_state, sample);
+#endif
+ }
+ else if(rcv.name == "tonemap") {
+#if 0
+ device_ptr rgba, buffer;
+ int x, y, w, h;
+ int sample, resolution;
+
+ *rcv.archive & x & y & w & h & rgba & buffer & sample & resolution;
+ tonemap(x, y, w, h, rgba, buffer, sample, resolution);
+#endif
+ }
+ }
+ }
+ }
+ catch(exception& e)
+ {
+ cerr << "Network server exception: " << e.what() << endl;
+ }
+}
+
+#endif
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/device/device_network.h b/intern/cycles/device/device_network.h
new file mode 100644
index 00000000000..3cdb70bb4df
--- /dev/null
+++ b/intern/cycles/device/device_network.h
@@ -0,0 +1,308 @@
+/*
+ * 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 __DEVICE_NETWORK_H__
+#define __DEVICE_NETWORK_H__
+
+#ifdef WITH_NETWORK
+
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/array.hpp>
+#include <boost/asio.hpp>
+#include <boost/bind.hpp>
+#include <boost/serialization/vector.hpp>
+#include <boost/thread.hpp>
+
+#include <iostream>
+
+#include "util_foreach.h"
+#include "util_list.h"
+#include "util_string.h"
+
+CCL_NAMESPACE_BEGIN
+
+using std::cout;
+using std::cerr;
+using std::endl;
+using std::hex;
+using std::setw;
+using std::exception;
+
+using boost::asio::ip::tcp;
+
+static const int SERVER_PORT = 5120;
+static const int DISCOVER_PORT = 5121;
+static const string DISCOVER_REQUEST_MSG = "REQUEST_RENDER_SERVER_IP";
+static const string DISCOVER_REPLY_MSG = "REPLY_RENDER_SERVER_IP";
+
+typedef struct RPCSend {
+ RPCSend(tcp::socket& socket_, const string& name_ = "")
+ : name(name_), socket(socket_), archive(archive_stream)
+ {
+ archive & name_;
+ }
+
+ void write()
+ {
+ boost::system::error_code error;
+
+ /* get string from stream */
+ string archive_str = archive_stream.str();
+
+ /* first send fixed size header with size of following data */
+ ostringstream header_stream;
+ header_stream << setw(8) << hex << archive_str.size();
+ string header_str = header_stream.str();
+
+ boost::asio::write(socket,
+ boost::asio::buffer(header_str),
+ boost::asio::transfer_all(), error);
+
+ if(error.value())
+ cout << "Network send error: " << error.message() << "\n";
+
+ /* then send actual data */
+ boost::asio::write(socket,
+ boost::asio::buffer(archive_str),
+ boost::asio::transfer_all(), error);
+
+ if(error.value())
+ cout << "Network send error: " << error.message() << "\n";
+ }
+
+ void write_buffer(void *buffer, size_t size)
+ {
+ boost::system::error_code error;
+
+ boost::asio::write(socket,
+ boost::asio::buffer(buffer, size),
+ boost::asio::transfer_all(), error);
+
+ if(error.value())
+ cout << "Network send error: " << error.message() << "\n";
+ }
+
+ string name;
+ tcp::socket& socket;
+ ostringstream archive_stream;
+ boost::archive::text_oarchive archive;
+} RPCSend;
+
+typedef struct RPCReceive {
+ RPCReceive(tcp::socket& socket_)
+ : socket(socket_), archive_stream(NULL), archive(NULL)
+ {
+ /* read head with fixed size */
+ vector<char> header(8);
+ size_t len = boost::asio::read(socket, boost::asio::buffer(header));
+
+ /* verify if we got something */
+ if(len == header.size()) {
+ /* decode header */
+ string header_str(&header[0], header.size());
+ istringstream header_stream(header_str);
+
+ size_t data_size;
+
+ if((header_stream >> hex >> data_size)) {
+ vector<char> data(data_size);
+ size_t len = boost::asio::read(socket, boost::asio::buffer(data));
+
+ if(len == data_size) {
+ archive_str = (data.size())? string(&data[0], data.size()): string("");
+ /*istringstream archive_stream(archive_str);
+ boost::archive::text_iarchive archive(archive_stream);*/
+ archive_stream = new istringstream(archive_str);
+ archive = new boost::archive::text_iarchive(*archive_stream);
+
+ *archive & name;
+ }
+ else
+ cout << "Network receive error: data size doens't match header\n";
+ }
+ else
+ cout << "Network receive error: can't decode data size from header\n";
+ }
+ else
+ cout << "Network receive error: invalid header size\n";
+ }
+
+ ~RPCReceive()
+ {
+ delete archive;
+ delete archive_stream;
+ }
+
+ void read_buffer(void *buffer, size_t size)
+ {
+ size_t len = boost::asio::read(socket, boost::asio::buffer(buffer, size));
+
+ if(len != size)
+ cout << "Network receive error: buffer size doesn't match expected size\n";
+ }
+
+ string name;
+ tcp::socket& socket;
+ string archive_str;
+ istringstream *archive_stream;
+ boost::archive::text_iarchive *archive;
+} RPCReceive;
+
+class ServerDiscovery {
+public:
+ ServerDiscovery(bool discover = false)
+ : listen_socket(io_service), collect_servers(false)
+ {
+ /* setup listen socket */
+ listen_endpoint.address(boost::asio::ip::address_v4::any());
+ listen_endpoint.port(DISCOVER_PORT);
+
+ listen_socket.open(listen_endpoint.protocol());
+
+ boost::asio::socket_base::reuse_address option(true);
+ listen_socket.set_option(option);
+
+ listen_socket.bind(listen_endpoint);
+
+ /* setup receive callback */
+ async_receive();
+
+ /* start server discovery */
+ if(discover) {
+ collect_servers = true;
+ servers.clear();
+
+ broadcast_message(DISCOVER_REQUEST_MSG);
+ }
+
+ /* start thread */
+ work = new boost::asio::io_service::work(io_service);
+ thread = new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service));
+ }
+
+ ~ServerDiscovery()
+ {
+ io_service.stop();
+ thread->join();
+ delete thread;
+ delete work;
+ }
+
+ list<string> get_server_list()
+ {
+ list<string> result;
+
+ mutex.lock();
+ result = servers;
+ mutex.unlock();
+
+ return result;
+ }
+
+private:
+ void handle_receive_from(const boost::system::error_code& error, size_t size)
+ {
+ if(error) {
+ cout << "Server discovery receive error: " << error.message() << "\n";
+ return;
+ }
+
+ if(size > 0) {
+ string msg = string(receive_buffer, size);
+
+ /* handle incoming message */
+ if(collect_servers) {
+ if(msg == DISCOVER_REPLY_MSG) {
+ string address = receive_endpoint.address().to_string();
+
+ mutex.lock();
+
+ /* add address if it's not already in the list */
+ bool found = false;
+
+ foreach(string& server, servers)
+ if(server == address)
+ found = true;
+
+ if(!found)
+ servers.push_back(address);
+
+ mutex.unlock();
+ }
+ }
+ else {
+ /* reply to request */
+ if(msg == DISCOVER_REQUEST_MSG)
+ broadcast_message(DISCOVER_REPLY_MSG);
+ }
+ }
+
+ async_receive();
+ }
+
+ void async_receive()
+ {
+ listen_socket.async_receive_from(
+ boost::asio::buffer(receive_buffer), receive_endpoint,
+ boost::bind(&ServerDiscovery::handle_receive_from, this,
+ boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
+ }
+
+ void broadcast_message(const string& msg)
+ {
+ /* setup broadcast socket */
+ boost::asio::ip::udp::socket socket(io_service);
+
+ socket.open(boost::asio::ip::udp::v4());
+
+ boost::asio::socket_base::broadcast option(true);
+ socket.set_option(option);
+
+ boost::asio::ip::udp::endpoint broadcast_endpoint(
+ boost::asio::ip::address::from_string("255.255.255.255"), DISCOVER_PORT);
+
+ /* broadcast message */
+ socket.send_to(boost::asio::buffer(msg), broadcast_endpoint);
+ }
+
+ /* network service and socket */
+ boost::asio::io_service io_service;
+ boost::asio::ip::udp::endpoint listen_endpoint;
+ boost::asio::ip::udp::socket listen_socket;
+
+ /* threading */
+ boost::thread *thread;
+ boost::asio::io_service::work *work;
+ boost::mutex mutex;
+
+ /* buffer and endpoint for receiving messages */
+ char receive_buffer[256];
+ boost::asio::ip::udp::endpoint receive_endpoint;
+
+ /* collection of server addresses in list */
+ bool collect_servers;
+ list<string> servers;
+};
+
+CCL_NAMESPACE_END
+
+#endif
+
+#endif /* __DEVICE_NETWORK_H__ */
+
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
new file mode 100644
index 00000000000..d8df8025a08
--- /dev/null
+++ b/intern/cycles/device/device_opencl.cpp
@@ -0,0 +1,648 @@
+/*
+ * 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.
+ */
+
+#ifdef WITH_OPENCL
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "device.h"
+#include "device_intern.h"
+
+#include "util_map.h"
+#include "util_math.h"
+#include "util_md5.h"
+#include "util_opencl.h"
+#include "util_opengl.h"
+#include "util_path.h"
+#include "util_time.h"
+
+CCL_NAMESPACE_BEGIN
+
+#define CL_MEM_PTR(p) ((cl_mem)(unsigned long)(p))
+
+class OpenCLDevice : public Device
+{
+public:
+ cl_context cxContext;
+ cl_command_queue cqCommandQueue;
+ cl_platform_id cpPlatform;
+ cl_device_id cdDevice;
+ cl_program cpProgram;
+ cl_kernel ckPathTraceKernel;
+ cl_kernel ckFilmConvertKernel;
+ cl_int ciErr;
+ map<string, device_vector<uchar>*> const_mem_map;
+ map<string, device_memory*> mem_map;
+ device_ptr null_mem;
+ bool device_initialized;
+
+ const char *opencl_error_string(cl_int err)
+ {
+ switch (err) {
+ case CL_SUCCESS: return "Success!";
+ case CL_DEVICE_NOT_FOUND: return "Device not found.";
+ case CL_DEVICE_NOT_AVAILABLE: return "Device not available";
+ case CL_COMPILER_NOT_AVAILABLE: return "Compiler not available";
+ case CL_MEM_OBJECT_ALLOCATION_FAILURE: return "Memory object allocation failure";
+ case CL_OUT_OF_RESOURCES: return "Out of resources";
+ case CL_OUT_OF_HOST_MEMORY: return "Out of host memory";
+ case CL_PROFILING_INFO_NOT_AVAILABLE: return "Profiling information not available";
+ case CL_MEM_COPY_OVERLAP: return "Memory copy overlap";
+ case CL_IMAGE_FORMAT_MISMATCH: return "Image format mismatch";
+ case CL_IMAGE_FORMAT_NOT_SUPPORTED: return "Image format not supported";
+ case CL_BUILD_PROGRAM_FAILURE: return "Program build failure";
+ case CL_MAP_FAILURE: return "Map failure";
+ case CL_INVALID_VALUE: return "Invalid value";
+ case CL_INVALID_DEVICE_TYPE: return "Invalid device type";
+ case CL_INVALID_PLATFORM: return "Invalid platform";
+ case CL_INVALID_DEVICE: return "Invalid device";
+ case CL_INVALID_CONTEXT: return "Invalid context";
+ case CL_INVALID_QUEUE_PROPERTIES: return "Invalid queue properties";
+ case CL_INVALID_COMMAND_QUEUE: return "Invalid command queue";
+ case CL_INVALID_HOST_PTR: return "Invalid host pointer";
+ case CL_INVALID_MEM_OBJECT: return "Invalid memory object";
+ case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: return "Invalid image format descriptor";
+ case CL_INVALID_IMAGE_SIZE: return "Invalid image size";
+ case CL_INVALID_SAMPLER: return "Invalid sampler";
+ case CL_INVALID_BINARY: return "Invalid binary";
+ case CL_INVALID_BUILD_OPTIONS: return "Invalid build options";
+ case CL_INVALID_PROGRAM: return "Invalid program";
+ case CL_INVALID_PROGRAM_EXECUTABLE: return "Invalid program executable";
+ case CL_INVALID_KERNEL_NAME: return "Invalid kernel name";
+ case CL_INVALID_KERNEL_DEFINITION: return "Invalid kernel definition";
+ case CL_INVALID_KERNEL: return "Invalid kernel";
+ case CL_INVALID_ARG_INDEX: return "Invalid argument index";
+ case CL_INVALID_ARG_VALUE: return "Invalid argument value";
+ case CL_INVALID_ARG_SIZE: return "Invalid argument size";
+ case CL_INVALID_KERNEL_ARGS: return "Invalid kernel arguments";
+ case CL_INVALID_WORK_DIMENSION: return "Invalid work dimension";
+ case CL_INVALID_WORK_GROUP_SIZE: return "Invalid work group size";
+ case CL_INVALID_WORK_ITEM_SIZE: return "Invalid work item size";
+ case CL_INVALID_GLOBAL_OFFSET: return "Invalid global offset";
+ case CL_INVALID_EVENT_WAIT_LIST: return "Invalid event wait list";
+ case CL_INVALID_EVENT: return "Invalid event";
+ case CL_INVALID_OPERATION: return "Invalid operation";
+ case CL_INVALID_GL_OBJECT: return "Invalid OpenGL object";
+ case CL_INVALID_BUFFER_SIZE: return "Invalid buffer size";
+ case CL_INVALID_MIP_LEVEL: return "Invalid mip-map level";
+ default: return "Unknown";
+ }
+ }
+
+ bool opencl_error(cl_int err)
+ {
+ if(err != CL_SUCCESS) {
+ fprintf(stderr, "OpenCL error (%d): %s\n", err, opencl_error_string(err));
+ return true;
+ }
+
+ return false;
+ }
+
+ void opencl_assert(cl_int err)
+ {
+ if(err != CL_SUCCESS) {
+ fprintf(stderr, "OpenCL error (%d): %s\n", err, opencl_error_string(err));
+#ifndef NDEBUG
+ abort();
+#endif
+ }
+ }
+
+ OpenCLDevice(bool background_)
+ {
+ background = background_;
+ cpPlatform = NULL;
+ cxContext = NULL;
+ cqCommandQueue = NULL;
+ cpProgram = NULL;
+ ckPathTraceKernel = NULL;
+ ckFilmConvertKernel = NULL;
+ null_mem = 0;
+ device_initialized = false;
+
+ vector<cl_platform_id> platform_ids;
+ cl_uint num_platforms;
+
+ /* setup device */
+ ciErr = clGetPlatformIDs(0, NULL, &num_platforms);
+ if(opencl_error(ciErr))
+ return;
+
+ if(num_platforms == 0) {
+ fprintf(stderr, "OpenCL: no platforms found.\n");
+ return;
+ }
+
+ platform_ids.resize(num_platforms);
+ ciErr = clGetPlatformIDs(num_platforms, &platform_ids[0], NULL);
+ if(opencl_error(ciErr))
+ return;
+
+ cpPlatform = platform_ids[0]; /* todo: pick specified platform && device */
+
+ ciErr = clGetDeviceIDs(cpPlatform, CL_DEVICE_TYPE_GPU|CL_DEVICE_TYPE_ACCELERATOR, 1, &cdDevice, NULL);
+ if(opencl_error(ciErr))
+ return;
+
+ cxContext = clCreateContext(0, 1, &cdDevice, NULL, NULL, &ciErr);
+ if(opencl_error(ciErr))
+ return;
+
+ cqCommandQueue = clCreateCommandQueue(cxContext, cdDevice, 0, &ciErr);
+ if(opencl_error(ciErr))
+ return;
+
+ null_mem = (device_ptr)clCreateBuffer(cxContext, CL_MEM_READ_ONLY, 1, NULL, &ciErr);
+ device_initialized = true;
+ }
+
+ bool opencl_version_check()
+ {
+ char version[256];
+ int major, minor, req_major = 1, req_minor = 1;
+
+ clGetPlatformInfo(cpPlatform, CL_PLATFORM_VERSION, sizeof(version), &version, NULL);
+
+ if(sscanf(version, "OpenCL %d.%d", &major, &minor) < 2) {
+ fprintf(stderr, "OpenCL: failed to parse platform version string (%s).", version);
+ return false;
+ }
+
+ if(!((major == req_major && minor >= req_minor) || (major > req_major))) {
+ fprintf(stderr, "OpenCL: platform version 1.1 or later required, found %d.%d\n", major, minor);
+ return false;
+ }
+
+ clGetDeviceInfo(cdDevice, CL_DEVICE_OPENCL_C_VERSION, sizeof(version), &version, NULL);
+
+ if(sscanf(version, "OpenCL C %d.%d", &major, &minor) < 2) {
+ fprintf(stderr, "OpenCL: failed to parse OpenCL C version string (%s).", version);
+ return false;
+ }
+
+ if(!((major == req_major && minor >= req_minor) || (major > req_major))) {
+ fprintf(stderr, "OpenCL: C version 1.1 or later required, found %d.%d\n", major, minor);
+ return false;
+ }
+
+ /* we don't check CL_DEVICE_VERSION since for e.g. nvidia sm 1.3 cards this is
+ 1.0 even if the language features are there, just limited shared memory */
+
+ return true;
+ }
+
+ bool load_binary(const string& kernel_path, const string& clbin)
+ {
+ /* read binary into memory */
+ vector<uint8_t> binary;
+
+ if(!path_read_binary(clbin, binary)) {
+ fprintf(stderr, "OpenCL failed to read cached binary %s.\n", clbin.c_str());
+ return false;
+ }
+
+ /* create program */
+ cl_int status;
+ size_t size = binary.size();
+ const uint8_t *bytes = &binary[0];
+
+ cpProgram = clCreateProgramWithBinary(cxContext, 1, &cdDevice,
+ &size, &bytes, &status, &ciErr);
+
+ if(opencl_error(status) || opencl_error(ciErr)) {
+ fprintf(stderr, "OpenCL failed create program from cached binary %s.\n", clbin.c_str());
+ return false;
+ }
+
+ if(!build_kernel(kernel_path))
+ return false;
+
+ return true;
+ }
+
+ bool save_binary(const string& clbin)
+ {
+ size_t size = 0;
+ clGetProgramInfo(cpProgram, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &size, NULL);
+
+ if(!size)
+ return false;
+
+ vector<uint8_t> binary(size);
+ uint8_t *bytes = &binary[0];
+
+ clGetProgramInfo(cpProgram, CL_PROGRAM_BINARIES, sizeof(uint8_t*), &bytes, NULL);
+
+ if(!path_write_binary(clbin, binary)) {
+ fprintf(stderr, "OpenCL failed to write cached binary %s.\n", clbin.c_str());
+ return false;
+ }
+
+ return true;
+ }
+
+ bool build_kernel(const string& kernel_path)
+ {
+ string build_options = "";
+
+ build_options += "-I " + kernel_path + ""; /* todo: escape path */
+ build_options += " -cl-fast-relaxed-math ";
+
+ ciErr = clBuildProgram(cpProgram, 0, NULL, build_options.c_str(), NULL, NULL);
+
+ if(ciErr != CL_SUCCESS) {
+ /* show build errors */
+ char *build_log;
+ size_t ret_val_size;
+
+ clGetProgramBuildInfo(cpProgram, cdDevice, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
+
+ build_log = new char[ret_val_size+1];
+ clGetProgramBuildInfo(cpProgram, cdDevice, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
+
+ build_log[ret_val_size] = '\0';
+ fprintf(stderr, "OpenCL build failed:\n %s\n", build_log);
+
+ delete[] build_log;
+
+ return false;
+ }
+
+ return true;
+ }
+
+ bool compile_kernel(const string& kernel_path, const string& kernel_md5)
+ {
+ /* we compile kernels consisting of many files. unfortunately opencl
+ kernel caches do not seem to recognize changes in included files.
+ so we force recompile on changes by adding the md5 hash of all files */
+ string source = "#include \"kernel.cl\" // " + kernel_md5 + "\n";
+ size_t source_len = source.size();
+ const char *source_str = source.c_str();
+
+ cpProgram = clCreateProgramWithSource(cxContext, 1, &source_str, &source_len, &ciErr);
+
+ if(opencl_error(ciErr))
+ return false;
+
+ double starttime = time_dt();
+ printf("Compiling OpenCL kernel ...\n");
+
+ if(!build_kernel(kernel_path))
+ return false;
+
+ printf("Kernel compilation finished in %.2lfs.\n", time_dt() - starttime);
+
+ return true;
+ }
+
+ string device_md5_hash()
+ {
+ MD5Hash md5;
+ char version[256], driver[256], name[256], vendor[256];
+
+ clGetPlatformInfo(cpPlatform, CL_PLATFORM_VENDOR, sizeof(vendor), &vendor, NULL);
+ clGetDeviceInfo(cdDevice, CL_DEVICE_VERSION, sizeof(version), &version, NULL);
+ clGetDeviceInfo(cdDevice, CL_DEVICE_NAME, sizeof(name), &name, NULL);
+ clGetDeviceInfo(cdDevice, CL_DRIVER_VERSION, sizeof(driver), &driver, NULL);
+
+ md5.append((uint8_t*)vendor, strlen(vendor));
+ md5.append((uint8_t*)version, strlen(version));
+ md5.append((uint8_t*)name, strlen(name));
+ md5.append((uint8_t*)driver, strlen(driver));
+
+ return md5.get_hex();
+ }
+
+ bool load_kernels()
+ {
+ /* verify if device was initialized */
+ if(!device_initialized) {
+ fprintf(stderr, "OpenCL: failed to initialize device.\n");
+ return false;
+ }
+
+ /* verify we have right opencl version */
+ if(!opencl_version_check())
+ return false;
+
+ /* md5 hash to detect changes */
+ string kernel_path = path_get("kernel");
+ string kernel_md5 = path_files_md5_hash(kernel_path);
+ string device_md5 = device_md5_hash();
+
+ /* try to use cache binary */
+ string clbin = string_printf("cycles_kernel_%s_%s.clbin", device_md5.c_str(), kernel_md5.c_str());;
+ clbin = path_user_get(path_join("cache", clbin));
+
+ if(path_exists(clbin)) {
+ /* if exists already, try use it */
+ if(!load_binary(kernel_path, clbin))
+ return false;
+ }
+ else {
+ /* compile kernel */
+ if(!compile_kernel(kernel_path, kernel_md5))
+ return false;
+
+ /* save binary for reuse */
+ save_binary(clbin);
+ }
+
+ /* find kernels */
+ ckPathTraceKernel = clCreateKernel(cpProgram, "kernel_ocl_path_trace", &ciErr);
+ if(opencl_error(ciErr))
+ return false;
+
+ ckFilmConvertKernel = clCreateKernel(cpProgram, "kernel_ocl_tonemap", &ciErr);
+ if(opencl_error(ciErr))
+ return false;
+
+ return true;
+ }
+
+ ~OpenCLDevice()
+ {
+ if(null_mem)
+ clReleaseMemObject(CL_MEM_PTR(null_mem));
+
+ map<string, device_vector<uchar>*>::iterator mt;
+ for(mt = const_mem_map.begin(); mt != const_mem_map.end(); mt++) {
+ mem_free(*(mt->second));
+ delete mt->second;
+ }
+
+ if(ckPathTraceKernel)
+ clReleaseKernel(ckPathTraceKernel);
+ if(ckFilmConvertKernel)
+ clReleaseKernel(ckFilmConvertKernel);
+ if(cpProgram)
+ clReleaseProgram(cpProgram);
+ if(cqCommandQueue)
+ clReleaseCommandQueue(cqCommandQueue);
+ if(cxContext)
+ clReleaseContext(cxContext);
+ }
+
+ bool support_full_kernel()
+ {
+ return false;
+ }
+
+ string description()
+ {
+ char name[1024];
+
+ clGetDeviceInfo(cdDevice, CL_DEVICE_NAME, sizeof(name), &name, NULL);
+
+ return string("OpenCL ") + name;
+ }
+
+ void mem_alloc(device_memory& mem, MemoryType type)
+ {
+ size_t size = mem.memory_size();
+
+ if(type == MEM_READ_ONLY)
+ mem.device_pointer = (device_ptr)clCreateBuffer(cxContext, CL_MEM_READ_ONLY, size, NULL, &ciErr);
+ else if(type == MEM_WRITE_ONLY)
+ mem.device_pointer = (device_ptr)clCreateBuffer(cxContext, CL_MEM_WRITE_ONLY, size, NULL, &ciErr);
+ else
+ mem.device_pointer = (device_ptr)clCreateBuffer(cxContext, CL_MEM_READ_WRITE, size, NULL, &ciErr);
+
+ opencl_assert(ciErr);
+ }
+
+ void mem_copy_to(device_memory& mem)
+ {
+ /* this is blocking */
+ size_t size = mem.memory_size();
+ ciErr = clEnqueueWriteBuffer(cqCommandQueue, CL_MEM_PTR(mem.device_pointer), CL_TRUE, 0, size, (void*)mem.data_pointer, 0, NULL, NULL);
+ opencl_assert(ciErr);
+ }
+
+ void mem_copy_from(device_memory& mem, size_t offset, size_t size)
+ {
+ ciErr = clEnqueueReadBuffer(cqCommandQueue, CL_MEM_PTR(mem.device_pointer), CL_TRUE, offset, size, (uchar*)mem.data_pointer + offset, 0, NULL, NULL);
+ opencl_assert(ciErr);
+ }
+
+ void mem_zero(device_memory& mem)
+ {
+ if(mem.device_pointer) {
+ memset((void*)mem.data_pointer, 0, mem.memory_size());
+ mem_copy_to(mem);
+ }
+ }
+
+ void mem_free(device_memory& mem)
+ {
+ if(mem.device_pointer) {
+ ciErr = clReleaseMemObject(CL_MEM_PTR(mem.device_pointer));
+ mem.device_pointer = 0;
+ opencl_assert(ciErr);
+ }
+ }
+
+ void const_copy_to(const char *name, void *host, size_t size)
+ {
+ if(const_mem_map.find(name) == const_mem_map.end()) {
+ device_vector<uchar> *data = new device_vector<uchar>();
+ data->copy((uchar*)host, size);
+
+ mem_alloc(*data, MEM_READ_ONLY);
+ const_mem_map[name] = data;
+ }
+ else {
+ device_vector<uchar> *data = const_mem_map[name];
+ data->copy((uchar*)host, size);
+ }
+
+ mem_copy_to(*const_mem_map[name]);
+ }
+
+ void tex_alloc(const char *name, device_memory& mem, bool interpolation, bool periodic)
+ {
+ mem_alloc(mem, MEM_READ_ONLY);
+ mem_copy_to(mem);
+ mem_map[name] = &mem;
+ }
+
+ void tex_free(device_memory& mem)
+ {
+ if(mem.data_pointer)
+ mem_free(mem);
+ }
+
+ size_t global_size_round_up(int group_size, int global_size)
+ {
+ int r = global_size % group_size;
+ return global_size + ((r == 0)? 0: group_size - r);
+ }
+
+ void path_trace(DeviceTask& task)
+ {
+ /* cast arguments to cl types */
+ cl_mem d_data = CL_MEM_PTR(const_mem_map["__data"]->device_pointer);
+ cl_mem d_buffer = CL_MEM_PTR(task.buffer);
+ cl_mem d_rng_state = CL_MEM_PTR(task.rng_state);
+ cl_int d_x = task.x;
+ cl_int d_y = task.y;
+ cl_int d_w = task.w;
+ cl_int d_h = task.h;
+ cl_int d_sample = task.sample;
+
+ /* sample arguments */
+ int narg = 0;
+ ciErr = 0;
+
+ ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_data), (void*)&d_data);
+ ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_buffer), (void*)&d_buffer);
+ ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_rng_state), (void*)&d_rng_state);
+
+#define KERNEL_TEX(type, ttype, name) \
+ ciErr |= set_kernel_arg_mem(ckPathTraceKernel, &narg, #name);
+#include "kernel_textures.h"
+
+ ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_sample), (void*)&d_sample);
+ ciErr |= clSetKernelArg(ckPathTraceKernel, narg++, sizeof(d_x), (void*)&d_x);
+ 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);
+
+ opencl_assert(ciErr);
+
+ size_t workgroup_size;
+
+ clGetKernelWorkGroupInfo(ckPathTraceKernel, cdDevice,
+ CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &workgroup_size, NULL);
+
+ workgroup_size = max(sqrt((double)workgroup_size), 1.0);
+
+ size_t local_size[2] = {workgroup_size, workgroup_size};
+ size_t global_size[2] = {global_size_round_up(local_size[0], d_w), global_size_round_up(local_size[1], d_h)};
+
+ /* run kernel */
+ ciErr = clEnqueueNDRangeKernel(cqCommandQueue, ckPathTraceKernel, 2, NULL, global_size, local_size, 0, NULL, NULL);
+ opencl_assert(ciErr);
+ opencl_assert(clFinish(cqCommandQueue));
+ }
+
+ cl_int set_kernel_arg_mem(cl_kernel kernel, int *narg, const char *name)
+ {
+ cl_mem ptr;
+ cl_int size, err = 0;
+
+ if(mem_map.find(name) != mem_map.end()) {
+ device_memory *mem = mem_map[name];
+
+ ptr = CL_MEM_PTR(mem->device_pointer);
+ size = mem->data_width;
+ }
+ else {
+ /* work around NULL not working, even though the spec says otherwise */
+ ptr = CL_MEM_PTR(null_mem);
+ size = 1;
+ }
+
+ err |= clSetKernelArg(kernel, (*narg)++, sizeof(ptr), (void*)&ptr);
+ opencl_assert(err);
+ err |= clSetKernelArg(kernel, (*narg)++, sizeof(size), (void*)&size);
+ opencl_assert(err);
+
+ return err;
+ }
+
+ void tonemap(DeviceTask& task)
+ {
+ /* cast arguments to cl types */
+ cl_mem d_data = CL_MEM_PTR(const_mem_map["__data"]->device_pointer);
+ cl_mem d_rgba = CL_MEM_PTR(task.rgba);
+ cl_mem d_buffer = CL_MEM_PTR(task.buffer);
+ cl_int d_x = task.x;
+ cl_int d_y = task.y;
+ cl_int d_w = task.w;
+ cl_int d_h = task.h;
+ cl_int d_sample = task.sample;
+ cl_int d_resolution = task.resolution;
+
+ /* sample arguments */
+ int narg = 0;
+ ciErr = 0;
+
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_data), (void*)&d_data);
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_rgba), (void*)&d_rgba);
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_buffer), (void*)&d_buffer);
+
+#define KERNEL_TEX(type, ttype, name) \
+ ciErr |= set_kernel_arg_mem(ckFilmConvertKernel, &narg, #name);
+#include "kernel_textures.h"
+
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_sample), (void*)&d_sample);
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_resolution), (void*)&d_resolution);
+ ciErr |= clSetKernelArg(ckFilmConvertKernel, narg++, sizeof(d_x), (void*)&d_x);
+ 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);
+
+ opencl_assert(ciErr);
+
+ size_t workgroup_size;
+
+ clGetKernelWorkGroupInfo(ckFilmConvertKernel, cdDevice,
+ CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &workgroup_size, NULL);
+
+ workgroup_size = max(sqrt((double)workgroup_size), 1.0);
+
+ size_t local_size[2] = {workgroup_size, workgroup_size};
+ size_t global_size[2] = {global_size_round_up(local_size[0], d_w), global_size_round_up(local_size[1], d_h)};
+
+ /* run kernel */
+ ciErr = clEnqueueNDRangeKernel(cqCommandQueue, ckFilmConvertKernel, 2, NULL, global_size, local_size, 0, NULL, NULL);
+ opencl_assert(ciErr);
+ opencl_assert(clFinish(cqCommandQueue));
+ }
+
+ void task_add(DeviceTask& task)
+ {
+ if(task.type == DeviceTask::TONEMAP)
+ tonemap(task);
+ else if(task.type == DeviceTask::PATH_TRACE)
+ path_trace(task);
+ }
+
+ void task_wait()
+ {
+ }
+
+ void task_cancel()
+ {
+ }
+};
+
+Device *device_opencl_create(bool background)
+{
+ return new OpenCLDevice(background);
+}
+
+CCL_NAMESPACE_END
+
+#endif /* WITH_OPENCL */
+
diff --git a/intern/cycles/doc/CMakeLists.txt b/intern/cycles/doc/CMakeLists.txt
new file mode 100644
index 00000000000..a8d1b53b47e
--- /dev/null
+++ b/intern/cycles/doc/CMakeLists.txt
@@ -0,0 +1,2 @@
+
+add_subdirectory(license)
diff --git a/intern/cycles/doc/license/Apache_2.0.txt b/intern/cycles/doc/license/Apache_2.0.txt
new file mode 100644
index 00000000000..6b0b1270ff0
--- /dev/null
+++ b/intern/cycles/doc/license/Apache_2.0.txt
@@ -0,0 +1,203 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/intern/cycles/doc/license/Blender.txt b/intern/cycles/doc/license/Blender.txt
new file mode 100644
index 00000000000..35aa258f229
--- /dev/null
+++ b/intern/cycles/doc/license/Blender.txt
@@ -0,0 +1,17 @@
+
+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): Alfredo de Greef, Blender Foundation
+
diff --git a/intern/cycles/doc/license/Boost.txt b/intern/cycles/doc/license/Boost.txt
new file mode 100644
index 00000000000..36b7cd93cdf
--- /dev/null
+++ b/intern/cycles/doc/license/Boost.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/intern/cycles/doc/license/CMakeLists.txt b/intern/cycles/doc/license/CMakeLists.txt
new file mode 100644
index 00000000000..bc11a9eb35b
--- /dev/null
+++ b/intern/cycles/doc/license/CMakeLists.txt
@@ -0,0 +1,13 @@
+
+set(LICENSES
+ Apache_2.0.txt
+ Blender.txt
+ GPL.txt
+ ILM.txt
+ NVidia.txt
+ OSL.txt
+ Sobol.txt
+ readme.txt
+)
+
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${LICENSES}" ${CYCLES_INSTALL_PATH}/license)
diff --git a/intern/cycles/doc/license/GPL.txt b/intern/cycles/doc/license/GPL.txt
new file mode 100644
index 00000000000..00e618b783e
--- /dev/null
+++ b/intern/cycles/doc/license/GPL.txt
@@ -0,0 +1,342 @@
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
diff --git a/intern/cycles/doc/license/ILM.txt b/intern/cycles/doc/license/ILM.txt
new file mode 100644
index 00000000000..0e24aa56203
--- /dev/null
+++ b/intern/cycles/doc/license/ILM.txt
@@ -0,0 +1,29 @@
+
+Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
+Digital Ltd. LLC. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+* Neither the name of Industrial Light & Magic nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/intern/cycles/doc/license/NVidia.txt b/intern/cycles/doc/license/NVidia.txt
new file mode 100644
index 00000000000..4fa55d3d2bc
--- /dev/null
+++ b/intern/cycles/doc/license/NVidia.txt
@@ -0,0 +1,36 @@
+
+Copyright 2006, NVIDIA Corporation Ignacio Castano <icastano@nvidia.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+Copyright 2009-2010 NVIDIA Corporation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
diff --git a/intern/cycles/doc/license/OSL.txt b/intern/cycles/doc/license/OSL.txt
new file mode 100644
index 00000000000..1ffeb58291e
--- /dev/null
+++ b/intern/cycles/doc/license/OSL.txt
@@ -0,0 +1,28 @@
+
+Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+* Neither the name of Sony Pictures Imageworks nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/intern/cycles/doc/license/Sobol.txt b/intern/cycles/doc/license/Sobol.txt
new file mode 100644
index 00000000000..4ad42d22fb1
--- /dev/null
+++ b/intern/cycles/doc/license/Sobol.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2008, Frances Y. Kuo and Stephen Joe
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the copyright holders nor the names of the
+ University of New South Wales and the University of Waikato
+ and its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/intern/cycles/doc/license/readme.txt b/intern/cycles/doc/license/readme.txt
new file mode 100644
index 00000000000..51494700f25
--- /dev/null
+++ b/intern/cycles/doc/license/readme.txt
@@ -0,0 +1,12 @@
+
+This program uses code from various sources. These are the licenses:
+
+* New code is licensed under the GPL license v2 or later.
+* BVH building and traversal code is licensed under Apache License v2.
+* Approximate Catmull Clark subdivision code is licensed under the MIT license.
+* Open Shading Language code on GPU is licensed under the Modified BSD license.
+* Sobol direction vectors are licensed under the Modified BSD license.
+* Matrix code adapted from OpenEXR under the Modified BSD license.
+* Procedural texture functions from Blender are licensed under GPL v2 or later.
+* Boost and OpenCL dynamic loading under Boost License.
+
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
new file mode 100644
index 00000000000..614391bd3f2
--- /dev/null
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -0,0 +1,143 @@
+
+set(INC
+ .
+ ../util
+ osl
+ svm
+)
+
+set(SRC
+ kernel.cpp
+ kernel.cl
+ kernel.cu
+)
+
+set(SRC_HEADERS
+ kernel.h
+ kernel_bvh.h
+ kernel_camera.h
+ kernel_compat_cpu.h
+ kernel_compat_cuda.h
+ kernel_compat_opencl.h
+ kernel_differential.h
+ kernel_displace.h
+ kernel_emission.h
+ kernel_film.h
+ kernel_globals.h
+ kernel_light.h
+ kernel_math.h
+ kernel_mbvh.h
+ kernel_montecarlo.h
+ kernel_object.h
+ kernel_path.h
+ kernel_qbvh.h
+ kernel_random.h
+ kernel_shader.h
+ kernel_textures.h
+ kernel_triangle.h
+ kernel_types.h
+)
+
+set(SRC_SVM_HEADERS
+ svm/bsdf.h
+ svm/bsdf_ashikhmin_velvet.h
+ svm/bsdf_diffuse.h
+ svm/bsdf_microfacet.h
+ svm/bsdf_reflection.h
+ svm/bsdf_refraction.h
+ svm/bsdf_transparent.h
+ svm/bsdf_ward.h
+ svm/bsdf_westin.h
+ svm/emissive.h
+ svm/svm.h
+ svm/svm_attribute.h
+ svm/svm_bsdf.h
+ svm/svm_closure.h
+ svm/svm_convert.h
+ svm/svm_displace.h
+ svm/svm_fresnel.h
+ svm/svm_geometry.h
+ svm/svm_gradient.h
+ svm/svm_image.h
+ svm/svm_light_path.h
+ svm/svm_magic.h
+ svm/svm_mapping.h
+ svm/svm_math.h
+ svm/svm_mix.h
+ svm/svm_musgrave.h
+ svm/svm_noise.h
+ svm/svm_noisetex.h
+ svm/svm_sky.h
+ svm/svm_tex_coord.h
+ svm/svm_texture.h
+ svm/svm_types.h
+ svm/svm_value.h
+ svm/svm_voronoi.h
+ svm/svm_wave.h
+ svm/volume.h
+)
+
+set(SRC_UTIL_HEADERS
+ ../util/util_color.h
+ ../util/util_math.h
+ ../util/util_transform.h
+ ../util/util_types.h
+)
+# CUDA module
+
+if(WITH_CYCLES_CUDA_BINARIES)
+ if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
+ set(CUDA_BITS 64)
+ else()
+ set(CUDA_BITS 32)
+ endif()
+
+ set(cuda_sources kernel.cu ${headers} ${svm_headers})
+ set(cuda_cubins)
+
+ foreach(arch ${CYCLES_CUDA_BINARIES_ARCH})
+ set(cuda_cubin kernel_${arch}.cubin)
+
+ add_custom_command(
+ OUTPUT ${cuda_cubin}
+ COMMAND ${CUDA_NVCC_EXECUTABLE} -arch=${arch} -m${CUDA_BITS} --cubin ${CMAKE_CURRENT_SOURCE_DIR}/kernel.cu --use_fast_math -o ${CMAKE_CURRENT_BINARY_DIR}/${cuda_cubin} --ptxas-options="-v" --maxrregcount=24 --opencc-options -OPT:Olimit=0 -I${CMAKE_CURRENT_SOURCE_DIR}/../util -I${CMAKE_CURRENT_SOURCE_DIR}/svm -DCCL_NAMESPACE_BEGIN= -DCCL_NAMESPACE_END= -DNVCC
+ DEPENDS ${cuda_sources})
+
+ delayed_install("${CMAKE_CURRENT_BINARY_DIR}" "${cuda_cubin}" ${CYCLES_INSTALL_PATH}/lib)
+ list(APPEND cuda_cubins ${cuda_cubin})
+ endforeach()
+
+ add_custom_target(cycles_kernel_cuda ALL DEPENDS ${cuda_cubins})
+endif()
+
+# OSL module
+
+if(WITH_CYCLES_OSL)
+ add_subdirectory(osl)
+endif()
+
+# CPU module
+
+include_directories(${INC})
+
+add_library(cycles_kernel ${SRC} ${SRC_HEADERS} ${SRC_SVM_HEADERS})
+
+if(WITH_CYCLES_CUDA)
+ add_dependencies(cycles_kernel cycles_kernel_cuda)
+endif()
+
+# OPENCL kernel
+
+#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}
+# 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)
+
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernel.cl" ${CYCLES_INSTALL_PATH}/kernel)
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "kernel.cu" ${CYCLES_INSTALL_PATH}/kernel)
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_HEADERS}" ${CYCLES_INSTALL_PATH}/kernel)
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_SVM_HEADERS}" ${CYCLES_INSTALL_PATH}/kernel/svm)
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_UTIL_HEADERS}" ${CYCLES_INSTALL_PATH}/kernel)
diff --git a/intern/cycles/kernel/kernel.cl b/intern/cycles/kernel/kernel.cl
new file mode 100644
index 00000000000..48bee8eef97
--- /dev/null
+++ b/intern/cycles/kernel/kernel.cl
@@ -0,0 +1,94 @@
+/*
+ * 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.
+ */
+
+/* OpenCL kernel entry points - unfinished */
+
+#include "kernel_compat_opencl.h"
+#include "kernel_math.h"
+#include "kernel_types.h"
+#include "kernel_globals.h"
+
+#include "kernel_film.h"
+#include "kernel_path.h"
+//#include "kernel_displace.h"
+
+__kernel void kernel_ocl_path_trace(
+ __constant KernelData *data,
+ __global float4 *buffer,
+ __global uint *rng_state,
+
+#define KERNEL_TEX(type, ttype, name) \
+ __global type *name, \
+ int name##_width,
+#include "kernel_textures.h"
+
+ int sample,
+ int sx, int sy, int sw, int sh)
+{
+ KernelGlobals kglobals, *kg = &kglobals;
+
+ kg->data = data;
+
+#define KERNEL_TEX(type, ttype, name) \
+ kg->name = name; \
+ kg->name##_width = name##_width;
+#include "kernel_textures.h"
+
+ int x = sx + get_global_id(0);
+ 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 void kernel_ocl_tonemap(
+ __constant KernelData *data,
+ __global uchar4 *rgba,
+ __global float4 *buffer,
+
+#define KERNEL_TEX(type, ttype, name) \
+ __global type *name, \
+ int name##_width,
+#include "kernel_textures.h"
+
+ int sample, int resolution,
+ int sx, int sy, int sw, int sh)
+{
+ KernelGlobals kglobals, *kg = &kglobals;
+
+ kg->data = data;
+
+#define KERNEL_TEX(type, ttype, name) \
+ kg->name = name; \
+ kg->name##_width = name##_width;
+#include "kernel_textures.h"
+
+ int x = sx + get_global_id(0);
+ 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 void kernel_ocl_displace(__global uint4 *input, __global float3 *offset, int sx)
+{
+ int x = sx + get_global_id(0);
+
+ kernel_displace(input, offset, x);
+}*/
+
diff --git a/intern/cycles/kernel/kernel.cpp b/intern/cycles/kernel/kernel.cpp
new file mode 100644
index 00000000000..52a3852aa01
--- /dev/null
+++ b/intern/cycles/kernel/kernel.cpp
@@ -0,0 +1,227 @@
+/*
+ * 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.
+ */
+
+/* CPU kernel entry points */
+
+#include "kernel.h"
+#include "kernel_compat_cpu.h"
+#include "kernel_math.h"
+#include "kernel_types.h"
+#include "kernel_globals.h"
+#include "kernel_film.h"
+#include "kernel_path.h"
+#include "kernel_displace.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Globals */
+
+KernelGlobals *kernel_globals_create()
+{
+ KernelGlobals *kg = new KernelGlobals();
+#ifdef WITH_OSL
+ kg->osl.use = false;
+#endif
+ return kg;
+}
+
+void kernel_globals_free(KernelGlobals *kg)
+{
+ delete kg;
+}
+
+/* OSL */
+
+#ifdef WITH_OSL
+
+void *kernel_osl_memory(KernelGlobals *kg)
+{
+ return (void*)&kg->osl;
+}
+
+bool kernel_osl_use(KernelGlobals *kg)
+{
+ return kg->osl.use;
+}
+
+#endif
+
+/* Memory Copy */
+
+void kernel_const_copy(KernelGlobals *kg, const char *name, void *host, size_t size)
+{
+ if(strcmp(name, "__data") == 0)
+ memcpy(&kg->__data, host, size);
+ else
+ assert(0);
+}
+
+void kernel_tex_copy(KernelGlobals *kg, const char *name, device_ptr mem, size_t width, size_t height)
+{
+ if(0) {
+ }
+
+#define KERNEL_TEX(type, ttype, tname) \
+ else if(strcmp(name, #tname) == 0) { \
+ kg->tname.data = (type*)mem; \
+ kg->tname.width = width; \
+ }
+#define KERNEL_IMAGE_TEX(type, ttype, tname)
+#include "kernel_textures.h"
+
+ else if(strstr(name, "__tex_image")) {
+ texture_image_uchar4 *tex = NULL;
+ int id = atoi(name + strlen("__tex_image_"));
+
+ switch(id) {
+ case 0: tex = &kg->__tex_image_000; break;
+ case 1: tex = &kg->__tex_image_001; break;
+ case 2: tex = &kg->__tex_image_002; break;
+ case 3: tex = &kg->__tex_image_003; break;
+ case 4: tex = &kg->__tex_image_004; break;
+ case 5: tex = &kg->__tex_image_005; break;
+ case 6: tex = &kg->__tex_image_006; break;
+ case 7: tex = &kg->__tex_image_007; break;
+ case 8: tex = &kg->__tex_image_008; break;
+ case 9: tex = &kg->__tex_image_009; break;
+ case 10: tex = &kg->__tex_image_010; break;
+ case 11: tex = &kg->__tex_image_011; break;
+ case 12: tex = &kg->__tex_image_012; break;
+ case 13: tex = &kg->__tex_image_013; break;
+ case 14: tex = &kg->__tex_image_014; break;
+ case 15: tex = &kg->__tex_image_015; break;
+ case 16: tex = &kg->__tex_image_016; break;
+ case 17: tex = &kg->__tex_image_017; break;
+ case 18: tex = &kg->__tex_image_018; break;
+ case 19: tex = &kg->__tex_image_019; break;
+ case 20: tex = &kg->__tex_image_020; break;
+ case 21: tex = &kg->__tex_image_021; break;
+ case 22: tex = &kg->__tex_image_022; break;
+ case 23: tex = &kg->__tex_image_023; break;
+ case 24: tex = &kg->__tex_image_024; break;
+ case 25: tex = &kg->__tex_image_025; break;
+ case 26: tex = &kg->__tex_image_026; break;
+ case 27: tex = &kg->__tex_image_027; break;
+ case 28: tex = &kg->__tex_image_028; break;
+ case 29: tex = &kg->__tex_image_029; break;
+ case 30: tex = &kg->__tex_image_030; break;
+ case 31: tex = &kg->__tex_image_031; break;
+ case 32: tex = &kg->__tex_image_032; break;
+ case 33: tex = &kg->__tex_image_033; break;
+ case 34: tex = &kg->__tex_image_034; break;
+ case 35: tex = &kg->__tex_image_035; break;
+ case 36: tex = &kg->__tex_image_036; break;
+ case 37: tex = &kg->__tex_image_037; break;
+ case 38: tex = &kg->__tex_image_038; break;
+ case 39: tex = &kg->__tex_image_039; break;
+ case 40: tex = &kg->__tex_image_040; break;
+ case 41: tex = &kg->__tex_image_041; break;
+ case 42: tex = &kg->__tex_image_042; break;
+ case 43: tex = &kg->__tex_image_043; break;
+ case 44: tex = &kg->__tex_image_044; break;
+ case 45: tex = &kg->__tex_image_045; break;
+ case 46: tex = &kg->__tex_image_046; break;
+ case 47: tex = &kg->__tex_image_047; break;
+ case 48: tex = &kg->__tex_image_048; break;
+ case 49: tex = &kg->__tex_image_049; break;
+ case 50: tex = &kg->__tex_image_050; break;
+ case 51: tex = &kg->__tex_image_051; break;
+ case 52: tex = &kg->__tex_image_052; break;
+ case 53: tex = &kg->__tex_image_053; break;
+ case 54: tex = &kg->__tex_image_054; break;
+ case 55: tex = &kg->__tex_image_055; break;
+ case 56: tex = &kg->__tex_image_056; break;
+ case 57: tex = &kg->__tex_image_057; break;
+ case 58: tex = &kg->__tex_image_058; break;
+ case 59: tex = &kg->__tex_image_059; break;
+ case 60: tex = &kg->__tex_image_060; break;
+ case 61: tex = &kg->__tex_image_061; break;
+ case 62: tex = &kg->__tex_image_062; break;
+ case 63: tex = &kg->__tex_image_063; break;
+ case 64: tex = &kg->__tex_image_064; break;
+ case 65: tex = &kg->__tex_image_065; break;
+ case 66: tex = &kg->__tex_image_066; break;
+ case 67: tex = &kg->__tex_image_067; break;
+ case 68: tex = &kg->__tex_image_068; break;
+ case 69: tex = &kg->__tex_image_069; break;
+ case 70: tex = &kg->__tex_image_070; break;
+ case 71: tex = &kg->__tex_image_071; break;
+ case 72: tex = &kg->__tex_image_072; break;
+ case 73: tex = &kg->__tex_image_073; break;
+ case 74: tex = &kg->__tex_image_074; break;
+ case 75: tex = &kg->__tex_image_075; break;
+ case 76: tex = &kg->__tex_image_076; break;
+ case 77: tex = &kg->__tex_image_077; break;
+ case 78: tex = &kg->__tex_image_078; break;
+ case 79: tex = &kg->__tex_image_079; break;
+ case 80: tex = &kg->__tex_image_080; break;
+ case 81: tex = &kg->__tex_image_081; break;
+ case 82: tex = &kg->__tex_image_082; break;
+ case 83: tex = &kg->__tex_image_083; break;
+ case 84: tex = &kg->__tex_image_084; break;
+ case 85: tex = &kg->__tex_image_085; break;
+ case 86: tex = &kg->__tex_image_086; break;
+ case 87: tex = &kg->__tex_image_087; break;
+ case 88: tex = &kg->__tex_image_088; break;
+ case 89: tex = &kg->__tex_image_089; break;
+ case 90: tex = &kg->__tex_image_090; break;
+ case 91: tex = &kg->__tex_image_091; break;
+ case 92: tex = &kg->__tex_image_092; break;
+ case 93: tex = &kg->__tex_image_093; break;
+ case 94: tex = &kg->__tex_image_094; break;
+ case 95: tex = &kg->__tex_image_095; break;
+ case 96: tex = &kg->__tex_image_096; break;
+ case 97: tex = &kg->__tex_image_097; break;
+ case 98: tex = &kg->__tex_image_098; break;
+ case 99: tex = &kg->__tex_image_099; break;
+ default: break;
+ }
+
+ if(tex) {
+ tex->data = (uchar4*)mem;
+ tex->width = width;
+ tex->height = height;
+ }
+ }
+ else
+ assert(0);
+}
+
+/* Path Tracing */
+
+void kernel_cpu_path_trace(KernelGlobals *kg, float4 *buffer, unsigned int *rng_state, int sample, int x, int y)
+{
+ kernel_path_trace(kg, buffer, rng_state, sample, x, y);
+}
+
+/* Tonemapping */
+
+void kernel_cpu_tonemap(KernelGlobals *kg, uchar4 *rgba, float4 *buffer, int sample, int resolution, int x, int y)
+{
+ kernel_film_tonemap(kg, rgba, buffer, sample, resolution, x, y);
+}
+
+/* Displacement */
+
+void kernel_cpu_displace(KernelGlobals *kg, uint4 *input, float3 *offset, int i)
+{
+ kernel_displace(kg, input, offset, i);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel.cu b/intern/cycles/kernel/kernel.cu
new file mode 100644
index 00000000000..75415a00b00
--- /dev/null
+++ b/intern/cycles/kernel/kernel.cu
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ */
+
+/* CUDA kernel entry points */
+
+#include "kernel_compat_cuda.h"
+#include "kernel_math.h"
+#include "kernel_types.h"
+#include "kernel_globals.h"
+#include "kernel_film.h"
+#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)
+{
+ 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);
+}
+
+extern "C" __global__ void kernel_cuda_tonemap(uchar4 *rgba, float4 *buffer, int sample, int resolution, int sx, int sy, int sw, int sh)
+{
+ 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);
+}
+
+extern "C" __global__ void kernel_cuda_displace(uint4 *input, float3 *offset, int sx)
+{
+ int x = sx + blockDim.x*blockIdx.x + threadIdx.x;
+
+ kernel_displace(NULL, input, offset, x);
+}
+
diff --git a/intern/cycles/kernel/kernel.h b/intern/cycles/kernel/kernel.h
new file mode 100644
index 00000000000..7f60730e8bf
--- /dev/null
+++ b/intern/cycles/kernel/kernel.h
@@ -0,0 +1,47 @@
+/*
+ * 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 __KERNEL_H__
+#define __KERNEL_H__
+
+/* CPU Kernel Interfae */
+
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+struct KernelGlobals;
+
+KernelGlobals *kernel_globals_create();
+void kernel_globals_free(KernelGlobals *kg);
+
+void *kernel_osl_memory(KernelGlobals *kg);
+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);
+
+CCL_NAMESPACE_END
+
+#endif /* __KERNEL_H__ */
+
diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h
new file mode 100644
index 00000000000..b5f59b94516
--- /dev/null
+++ b/intern/cycles/kernel/kernel_bvh.h
@@ -0,0 +1,375 @@
+/*
+ * Adapted from code Copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+/*
+ * "Persistent while-while kernel" used in:
+ *
+ * "Understanding the Efficiency of Ray Traversal on GPUs",
+ * Timo Aila and Samuli Laine,
+ * Proc. High-Performance Graphics 2009
+ */
+
+/* bottom-most stack entry, indicating the end of traversal */
+
+#define ENTRYPOINT_SENTINEL 0x76543210
+/* 64 object BVH + 64 mesh BVH + 64 object node splitting */
+#define BVH_STACK_SIZE 192
+#define BVH_NODE_SIZE 4
+#define TRI_NODE_SIZE 3
+
+__device_inline float3 bvh_inverse_direction(float3 dir)
+{
+ /* avoid divide by zero (ooeps = exp2f(-80.0f)) */
+ float ooeps = 0.00000000000000000000000082718061255302767487140869206996285356581211090087890625f;
+ float3 idir;
+
+ idir.x = 1.0f/((fabsf(dir.x) > ooeps)? dir.x: copysignf(ooeps, dir.x));
+ idir.y = 1.0f/((fabsf(dir.y) > ooeps)? dir.y: copysignf(ooeps, dir.y));
+ idir.z = 1.0f/((fabsf(dir.z) > ooeps)? dir.z: copysignf(ooeps, dir.z));
+
+ return idir;
+}
+
+__device_inline void bvh_instance_push(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, const float tmax)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
+
+ *P = transform(&tfm, ray->P);
+
+ float3 dir = transform_direction(&tfm, ray->D);
+
+ float len;
+ dir = normalize_len(dir, &len);
+
+ *idir = bvh_inverse_direction(dir);
+
+ if(*t != FLT_MAX)
+ *t *= len;
+}
+
+__device_inline void bvh_instance_pop(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, const float tmax)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+
+ if(*t != FLT_MAX)
+ *t *= len(transform_direction(&tfm, 1.0f/(*idir)));
+
+ *P = ray->P;
+ *idir = bvh_inverse_direction(ray->D);
+}
+
+/* intersect two bounding boxes */
+__device_inline void bvh_node_intersect(KernelGlobals *kg,
+ bool *traverseChild0, bool *traverseChild1,
+ bool *closestChild1, int *nodeAddr0, int *nodeAddr1,
+ float3 P, float3 idir, float t, uint visibility, int nodeAddr)
+{
+ /* fetch node data */
+ float4 n0xy = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+0);
+ float4 n1xy = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+1);
+ float4 nz = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+2);
+ float4 cnodes = kernel_tex_fetch(__bvh_nodes, nodeAddr*BVH_NODE_SIZE+3);
+
+ /* intersect ray against child nodes */
+ float3 ood = P * idir;
+ float c0lox = n0xy.x * idir.x - ood.x;
+ float c0hix = n0xy.y * idir.x - ood.x;
+ float c0loy = n0xy.z * idir.y - ood.y;
+ 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 c1loz = nz.z * idir.z - ood.z;
+ float c1hiz = nz.w * idir.z - ood.z;
+
+ float c0min_x = min(c0lox, c0hix);
+ float c0min_y = min(c0loy, c0hiy);
+ float c0min_z = min(c0loz, c0hiz);
+
+ float c0min = max4(c0min_x, c0min_y, c0min_z, 0.0f);
+ float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t);
+ float c1lox = n1xy.x * idir.x - ood.x;
+ 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);
+
+ /* decide which nodes to traverse next */
+#ifdef __VISIBILITY_FLAG__
+ /* this visibility test gives a 5% performance hit, how to solve? */
+ *traverseChild0 = (c0max >= c0min) && (__float_as_int(cnodes.z) & visibility);
+ *traverseChild1 = (c1max >= c1min) && (__float_as_int(cnodes.w) & visibility);
+#else
+ *traverseChild0 = (c0max >= c0min);
+ *traverseChild1 = (c1max >= c1min);
+#endif
+
+ *nodeAddr0 = __float_as_int(cnodes.x);
+ *nodeAddr1 = __float_as_int(cnodes.y);
+
+ *closestChild1 = (c1min < c0min);
+}
+
+/* Sven Woop's algorithm */
+__device_inline void bvh_triangle_intersect(KernelGlobals *kg, Intersection *isect,
+ float3 P, float3 idir, uint visibility, int object, int triAddr)
+{
+ /* compute and check intersection t-value */
+ float4 v00 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0);
+ float4 v11 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+1);
+ float3 dir = 1.0f/idir;
+
+ float Oz = v00.w - P.x*v00.x - P.y*v00.y - P.z*v00.z;
+ float invDz = 1.0f/(dir.x*v00.x + dir.y*v00.y + dir.z*v00.z);
+ float t = Oz * invDz;
+
+ if(t > 0.0f && t < isect->t) {
+ /* compute and check barycentric u */
+ float Ox = v11.w + P.x*v11.x + P.y*v11.y + P.z*v11.z;
+ float Dx = dir.x*v11.x + dir.y*v11.y + dir.z*v11.z;
+ float u = Ox + t*Dx;
+
+ if(u >= 0.0f) {
+ /* compute and check barycentric v */
+ float4 v22 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+2);
+ float Oy = v22.w + P.x*v22.x + P.y*v22.y + P.z*v22.z;
+ float Dy = dir.x*v22.x + dir.y*v22.y + dir.z*v22.z;
+ float v = Oy + t*Dy;
+
+ if(v >= 0.0f && u + v <= 1.0f) {
+#ifdef __VISIBILITY_FLAG__
+ /* visibility flag test. we do it here under the assumption
+ that most triangles are culled by node flags */
+ if(kernel_tex_fetch(__prim_visibility, triAddr) & visibility)
+#endif
+ {
+ /* record intersection */
+ isect->prim = triAddr;
+ isect->object = object;
+ isect->u = u;
+ isect->v = v;
+ isect->t = t;
+ }
+ }
+ }
+ }
+}
+
+__device_inline bool scene_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect)
+{
+ /* traversal stack in CUDA thread-local memory */
+ int traversalStack[BVH_STACK_SIZE];
+ traversalStack[0] = ENTRYPOINT_SENTINEL;
+
+ /* traversal variables in registers */
+ int stackPtr = 0;
+ int nodeAddr = kernel_data.bvh.root;
+
+ /* ray parameters in registers */
+ const float tmax = ray->t;
+ float3 P = ray->P;
+ float3 idir = bvh_inverse_direction(ray->D);
+ int object = ~0;
+
+ isect->t = tmax;
+ isect->object = ~0;
+ isect->prim = ~0;
+ isect->u = 0.0f;
+ isect->v = 0.0f;
+
+ /* traversal loop */
+ do {
+ do
+ {
+ /* traverse internal nodes */
+ while(nodeAddr >= 0 && nodeAddr != ENTRYPOINT_SENTINEL)
+ {
+ bool traverseChild0, traverseChild1, closestChild1;
+ int nodeAddrChild1;
+
+ bvh_node_intersect(kg, &traverseChild0, &traverseChild1,
+ &closestChild1, &nodeAddr, &nodeAddrChild1,
+ P, idir, isect->t, visibility, nodeAddr);
+
+ if(traverseChild0 != traverseChild1) {
+ /* one child was intersected */
+ if(traverseChild1) {
+ nodeAddr = nodeAddrChild1;
+ }
+ }
+ else {
+ if(!traverseChild0) {
+ /* neither child was intersected */
+ nodeAddr = traversalStack[stackPtr];
+ --stackPtr;
+ }
+ else {
+ /* both children were intersected, push the farther one */
+ if(closestChild1) {
+ int tmp = nodeAddr;
+ nodeAddr = nodeAddrChild1;
+ nodeAddrChild1 = tmp;
+ }
+
+ ++stackPtr;
+ traversalStack[stackPtr] = nodeAddrChild1;
+ }
+ }
+ }
+
+ /* if node is leaf, fetch triangle list */
+ if(nodeAddr < 0) {
+ float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*BVH_NODE_SIZE+(BVH_NODE_SIZE-1));
+ int primAddr = __float_as_int(leaf.x);
+
+#ifdef __INSTANCING__
+ if(primAddr >= 0) {
+#endif
+ int primAddr2 = __float_as_int(leaf.y);
+
+ /* pop */
+ nodeAddr = traversalStack[stackPtr];
+ --stackPtr;
+
+ /* triangle intersection */
+ while(primAddr < primAddr2) {
+ /* intersect ray against triangle */
+ bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr);
+
+ /* shadow ray early termination */
+ if(visibility == PATH_RAY_SHADOW_OPAQUE && isect->prim != ~0)
+ return true;
+
+ primAddr++;
+ }
+#ifdef __INSTANCING__
+ }
+ else {
+ /* instance push */
+ object = kernel_tex_fetch(__prim_object, -primAddr-1);
+
+ bvh_instance_push(kg, object, ray, &P, &idir, &isect->t, tmax);
+
+ ++stackPtr;
+ traversalStack[stackPtr] = ENTRYPOINT_SENTINEL;
+
+ nodeAddr = kernel_tex_fetch(__object_node, object);
+ }
+#endif
+ }
+ } while(nodeAddr != ENTRYPOINT_SENTINEL);
+
+#ifdef __INSTANCING__
+ if(stackPtr >= 0) {
+ kernel_assert(object != ~0);
+
+ /* instance pop */
+ bvh_instance_pop(kg, object, ray, &P, &idir, &isect->t, tmax);
+ object = ~0;
+ nodeAddr = traversalStack[stackPtr];
+ --stackPtr;
+ }
+#endif
+ } while(nodeAddr != ENTRYPOINT_SENTINEL);
+
+ return (isect->prim != ~0);
+}
+
+__device_inline float3 ray_offset(float3 P, float3 Ng)
+{
+#ifdef __INTERSECTION_REFINE__
+ const float epsilon_f = 1e-5f;
+ const int epsilon_i = 32;
+
+ float3 res;
+
+ /* x component */
+ if(fabsf(P.x) < epsilon_f) {
+ res.x = P.x + Ng.x*epsilon_f;
+ }
+ else {
+ uint ix = __float_as_uint(P.x);
+ ix += ((ix ^ __float_as_uint(Ng.x)) >> 31)? -epsilon_i: epsilon_i;
+ res.x = __uint_as_float(ix);
+ }
+
+ /* y component */
+ if(fabsf(P.y) < epsilon_f) {
+ res.y = P.y + Ng.y*epsilon_f;
+ }
+ else {
+ uint iy = __float_as_uint(P.y);
+ iy += ((iy ^ __float_as_uint(Ng.y)) >> 31)? -epsilon_i: epsilon_i;
+ res.y = __uint_as_float(iy);
+ }
+
+ /* z component */
+ if(fabsf(P.z) < epsilon_f) {
+ res.z = P.z + Ng.z*epsilon_f;
+ }
+ else {
+ uint iz = __float_as_uint(P.z);
+ iz += ((iz ^ __float_as_uint(Ng.z)) >> 31)? -epsilon_i: epsilon_i;
+ res.z = __uint_as_float(iz);
+ }
+
+ return res;
+#else
+ const float epsilon_f = 1e-4f;
+ return P + epsilon_f*Ng;
+#endif
+}
+
+__device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection *isect, const Ray *ray)
+{
+ float3 P = ray->P;
+ float3 D = ray->D;
+ float t = isect->t;
+
+#ifdef __INTERSECTION_REFINE__
+ if(isect->object != ~0) {
+ Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
+
+ P = transform(&tfm, P);
+ D = transform_direction(&tfm, D*t);
+ D = normalize_len(D, &t);
+ }
+
+ P = P + D*t;
+
+ float4 v00 = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+0);
+ float Oz = v00.w - P.x*v00.x - P.y*v00.y - P.z*v00.z;
+ float invDz = 1.0f/(D.x*v00.x + D.y*v00.y + D.z*v00.z);
+ float rt = Oz * invDz;
+
+ P = P + D*rt;
+
+ if(isect->object != ~0) {
+ Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
+ P = transform(&tfm, P);
+ }
+
+ return P;
+#else
+ return P + D*t;
+#endif
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h
new file mode 100644
index 00000000000..c2828c20eee
--- /dev/null
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -0,0 +1,144 @@
+/*
+ * 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
+
+/* Perspective Camera */
+
+__device float2 camera_sample_aperture(KernelGlobals *kg, float u, float v)
+{
+ float blades = kernel_data.cam.blades;
+
+ if(blades == 0.0f) {
+ /* sample disk */
+ return concentric_sample_disk(u, v);
+ }
+ else {
+ /* sample polygon */
+ float rotation = kernel_data.cam.bladesrotation;
+ return regular_polygon_sample(blades, rotation, u, v);
+ }
+}
+
+__device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float raster_y, float lens_u, float lens_v, Ray *ray)
+{
+ /* create ray form raster position */
+ Transform rastertocamera = kernel_data.cam.rastertocamera;
+ float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
+
+ ray->P = make_float3(0.0f, 0.0f, 0.0f);
+ ray->D = Pcamera;
+
+ /* modify ray for depth of field */
+ float aperturesize = kernel_data.cam.aperturesize;
+
+ if(aperturesize > 0.0f) {
+ /* sample point on aperture */
+ float2 lensuv = camera_sample_aperture(kg, lens_u, lens_v)*aperturesize;
+
+ /* compute point on plane of focus */
+ float ft = kernel_data.cam.focaldistance/ray->D.z;
+ float3 Pfocus = ray->P + ray->D*ft;
+
+ /* update ray for effect of lens */
+ ray->P = make_float3(lensuv.x, lensuv.y, 0.0f);
+ ray->D = normalize(Pfocus - ray->P);
+ }
+
+ /* transform ray from camera to world */
+ Transform cameratoworld = kernel_data.cam.cameratoworld;
+
+ ray->P = transform(&cameratoworld, ray->P);
+ ray->D = transform_direction(&cameratoworld, ray->D);
+ ray->D = normalize(ray->D);
+
+#ifdef __RAY_DIFFERENTIALS__
+ /* ray differential */
+ float3 Ddiff = transform_direction(&cameratoworld, Pcamera);
+
+ 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);
+#endif
+
+#ifdef __CAMERA_CLIPPING__
+ /* clipping */
+ ray->P += kernel_data.cam.nearclip*ray->D;
+ ray->t = kernel_data.cam.cliplength;
+#else
+ ray->t = FLT_MAX;
+#endif
+}
+
+/* Orthographic Camera */
+
+__device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, float raster_y, Ray *ray)
+{
+ /* create ray form raster position */
+ Transform rastertocamera = kernel_data.cam.rastertocamera;
+ float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
+
+ ray->P = Pcamera;
+ ray->D = make_float3(0.0f, 0.0f, 1.0f);
+
+ /* transform ray from camera to world */
+ Transform cameratoworld = kernel_data.cam.cameratoworld;
+
+ ray->P = transform(&cameratoworld, ray->P);
+ ray->D = transform_direction(&cameratoworld, ray->D);
+ ray->D = normalize(ray->D);
+
+#ifdef __RAY_DIFFERENTIALS__
+ /* ray differential */
+ ray->dP.dx = kernel_data.cam.dx;
+ ray->dP.dy = 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);
+#endif
+
+#ifdef __CAMERA_CLIPPING__
+ /* clipping */
+ ray->t = kernel_data.cam.cliplength;
+#else
+ ray->t = FLT_MAX;
+#endif
+}
+
+/* Common */
+
+__device void camera_sample(KernelGlobals *kg, int x, int y, float filter_u, float filter_v, float lens_u, float lens_v, Ray *ray)
+{
+ /* pixel filter */
+ float raster_x = x + kernel_tex_interp(__filter_table, filter_u);
+ float raster_y = y + kernel_tex_interp(__filter_table, filter_v);
+
+ /* motion blur */
+ //ray->time = lerp(time_t, kernel_data.cam.shutter_open, kernel_data.cam.shutter_close);
+
+ /* sample */
+ if(kernel_data.cam.ortho)
+ camera_sample_orthographic(kg, raster_x, raster_y, ray);
+ else
+ camera_sample_perspective(kg, raster_x, raster_y, lens_u, lens_v, ray);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_compat_cpu.h b/intern/cycles/kernel/kernel_compat_cpu.h
new file mode 100644
index 00000000000..fd96148968f
--- /dev/null
+++ b/intern/cycles/kernel/kernel_compat_cpu.h
@@ -0,0 +1,162 @@
+/*
+ * 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 __KERNEL_COMPAT_CPU_H__
+#define __KERNEL_COMPAT_CPU_H__
+
+#define __KERNEL_CPU__
+
+#include "util_debug.h"
+#include "util_math.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Assertions inside the kernel only work for the CPU device, so we wrap it in
+ a macro which is empty for other devices */
+
+#define kernel_assert(cond) assert(cond)
+
+/* Texture types to be compatible with CUDA textures. These are really just
+ simple arrays and after inlining fetch hopefully revert to being a simple
+ pointer lookup. */
+
+template<typename T> struct texture {
+ T fetch(int index)
+ {
+ kernel_assert(index >= 0 && index < width);
+ return data[index];
+ }
+
+ /*__m128 fetch_m128(int index)
+ {
+ kernel_assert(index >= 0 && index < width);
+ return ((__m128*)data)[index];
+ }
+
+ __m128i fetch_m128i(int index)
+ {
+ kernel_assert(index >= 0 && index < width);
+ return ((__m128i*)data)[index];
+ }*/
+
+ float interp(float x)
+ {
+ x = clamp(x, 0.0f, 1.0f)*width;
+
+ int index = min((int)x, width-1);
+ int nindex = min(index+1, width-1);
+ float t = x - index;
+
+ return (1.0f - t)*data[index] + t*data[nindex];
+ }
+
+ T *data;
+ int width;
+};
+
+template<typename T> struct texture_image {
+ float4 read(float4 r)
+ {
+ return r;
+ }
+
+ float4 read(uchar4 r)
+ {
+ float f = 1.0f/255.0f;
+ return make_float4(r.x*f, r.y*f, r.z*f, r.w*f);
+ }
+
+ int wrap_periodic(int x, int width)
+ {
+ x %= width;
+ if(x < 0)
+ x += width;
+ return x;
+ }
+
+ int wrap_clamp(int x, int width)
+ {
+ return clamp(x, 0, width-1);
+ }
+
+ float frac(float x, int *ix)
+ {
+ int i = (int)x - ((x < 0.0f)? 1: 0);
+ *ix = i;
+ return x - (float)i;
+ }
+
+ float4 interp(float x, float y, bool periodic = true)
+ {
+ if(!data)
+ return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+
+ int ix, iy, nix, niy;
+ float tx = frac(x*width, &ix);
+ float ty = frac(y*height, &iy);
+
+ if(periodic) {
+ ix = wrap_periodic(ix, width);
+ iy = wrap_periodic(iy, height);
+
+ nix = wrap_periodic(ix+1, width);
+ niy = wrap_periodic(iy+1, height);
+ }
+ else {
+ ix = wrap_clamp(ix, width);
+ iy = wrap_clamp(iy, height);
+
+ nix = wrap_clamp(ix+1, width);
+ niy = wrap_clamp(iy+1, height);
+ }
+
+ float4 r = (1.0f - ty)*(1.0f - tx)*read(data[ix + iy*width]);
+ r += (1.0f - ty)*tx*read(data[nix + iy*width]);
+ r += ty*(1.0f - tx)*read(data[ix + niy*width]);
+ r += ty*tx*read(data[nix + niy*width]);
+
+ return r;
+ }
+
+ T *data;
+ int width, height;
+};
+
+typedef texture<float4> texture_float4;
+typedef texture<float> texture_float;
+typedef texture<uint> texture_uint;
+typedef texture<int> texture_int;
+typedef texture<uint4> texture_uint4;
+typedef texture_image<float4> texture_image_float4;
+typedef texture_image<uchar4> texture_image_uchar4;
+
+/* Macros to handle different memory storage on different devices */
+
+#define kernel_tex_fetch(tex, index) (kg->tex.fetch(index))
+#define kernel_tex_fetch_m128(tex, index) (kg->tex.fetch_m128(index))
+#define kernel_tex_fetch_m128i(tex, index) (kg->tex.fetch_m128i(index))
+#define kernel_tex_interp(tex, t) (kg->tex.interp(t))
+#define kernel_tex_image_interp(tex, x, y) (kg->tex.interp(x, y))
+
+#define kernel_data (kg->__data)
+
+CCL_NAMESPACE_END
+
+#endif /* __KERNEL_COMPAT_CPU_H__ */
+
diff --git a/intern/cycles/kernel/kernel_compat_cuda.h b/intern/cycles/kernel/kernel_compat_cuda.h
new file mode 100644
index 00000000000..72aef463cab
--- /dev/null
+++ b/intern/cycles/kernel/kernel_compat_cuda.h
@@ -0,0 +1,64 @@
+/*
+ * 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 __KERNEL_COMPAT_CUDA_H__
+#define __KERNEL_COMPAT_CUDA_H__
+
+#define __KERNEL_GPU__
+#define __KERNEL_CUDA__
+#define CCL_NAMESPACE_BEGIN
+#define CCL_NAMESPACE_END
+
+#include <cuda.h>
+#include <float.h>
+
+#include "util_types.h"
+
+/* Qualifier wrappers for different names on different devices */
+
+#define __device __device__ __inline__
+#define __device_inline __device__ __inline__
+#define __device_noinline __device__ __noinline__
+#define __global
+#define __shared __shared__
+#define __constant
+
+/* No assert supported for CUDA */
+
+#define kernel_assert(cond)
+
+/* Textures */
+
+typedef texture<float4, 1> texture_float4;
+typedef texture<float, 1> texture_float;
+typedef texture<uint, 1> texture_uint;
+typedef texture<int, 1> texture_int;
+typedef texture<uint4, 1> texture_uint4;
+typedef texture<float4, 2> texture_image_float4;
+typedef texture<uchar4, 2, cudaReadModeNormalizedFloat> texture_image_uchar4;
+
+/* Macros to handle different memory storage on different devices */
+
+#define kernel_tex_fetch(t, index) tex1Dfetch(t, index)
+#define kernel_tex_interp(t, x) tex1D(t, x)
+#define kernel_tex_image_interp(t, x, y) tex2D(t, x, y)
+
+#define kernel_data __data
+
+#endif /* __KERNEL_COMPAT_CUDA_H__ */
+
diff --git a/intern/cycles/kernel/kernel_compat_opencl.h b/intern/cycles/kernel/kernel_compat_opencl.h
new file mode 100644
index 00000000000..287bf320881
--- /dev/null
+++ b/intern/cycles/kernel/kernel_compat_opencl.h
@@ -0,0 +1,112 @@
+/*
+ * 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 __KERNEL_COMPAT_OPENCL_H__
+#define __KERNEL_COMPAT_OPENCL_H__
+
+#define __KERNEL_GPU__
+#define __KERNEL_OPENCL__
+
+/* no namespaces in opencl */
+#define CCL_NAMESPACE_BEGIN
+#define CCL_NAMESPACE_END
+#define WITH_OPENCL
+
+/* in opencl all functions are device functions, so leave this empty */
+#define __device
+#define __device_inline
+#define __device_noinline
+
+/* no assert in opencl */
+#define kernel_assert(cond)
+
+/* manual implementation of interpolated 1D lookup */
+__device float kernel_tex_interp_(__global float *data, int width, float x)
+{
+ x = clamp(x, 0.0f, 1.0f)*width;
+
+ int index = min((int)x, width-1);
+ int nindex = min(index+1, width-1);
+ float t = x - index;
+
+ return (1.0f - t)*data[index] + t*data[nindex];
+}
+
+/* make_type definitions with opencl style element initializers */
+#ifdef make_float2
+#undef make_float2
+#endif
+#ifdef make_float3
+#undef make_float3
+#endif
+#ifdef make_float4
+#undef make_float4
+#endif
+#ifdef make_int2
+#undef make_int2
+#endif
+#ifdef make_int3
+#undef make_int3
+#endif
+#ifdef make_int4
+#undef make_int4
+#endif
+
+#define make_float2(x, y) ((float2)(x, y))
+#define make_float3(x, y, z) ((float3)(x, y, z))
+#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))
+#define make_int4(x, y, z, w) ((int4)(x, y, z, w))
+
+/* math functions */
+#define __uint_as_float(x) as_float(x)
+#define __float_as_uint(x) as_uint(x)
+#define __int_as_float(x) as_float(x)
+#define __float_as_int(x) as_int(x)
+#define sqrtf(x) sqrt(((float)x))
+#define cosf(x) cos(((float)x))
+#define sinf(x) sin(((float)x))
+#define powf(x, y) pow(((float)x), ((float)y))
+#define fabsf(x) fabs(((float)x))
+#define copysignf(x, y) copysign(((float)x), ((float)y))
+#define cosf(x) cos(((float)x))
+#define asinf(x) asin(((float)x))
+#define acosf(x) acos(((float)x))
+#define atanf(x) atan(((float)x))
+#define tanf(x) tan(((float)x))
+#define logf(x) log(((float)x))
+#define floorf(x) floor(((float)x))
+#define expf(x) exp(((float)x))
+#define hypotf(x, y) hypot(((float)x), ((float)y))
+#define atan2f(x, y) atan2(((float)x), ((float)y))
+#define fmaxf(x, y) fmax(((float)x), ((float)y))
+#define fminf(x, y) fmin(((float)x), ((float)y))
+
+/* data lookup defines */
+#define kernel_data (*kg->data)
+#define kernel_tex_interp(t, x) kernel_tex_interp_(kg->t, kg->t##_width, x)
+#define kernel_tex_fetch(t, index) kg->t[index]
+
+/* define NULL */
+#define NULL 0
+
+#include "util_types.h"
+
+#endif /* __KERNEL_COMPAT_OPENCL_H__ */
+
diff --git a/intern/cycles/kernel/kernel_differential.h b/intern/cycles/kernel/kernel_differential.h
new file mode 100644
index 00000000000..4e2b1ea7d13
--- /dev/null
+++ b/intern/cycles/kernel/kernel_differential.h
@@ -0,0 +1,90 @@
+/*
+ * 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
+
+/* See "Tracing Ray Differentials", Homan Igehy, 1999. */
+
+__device void differential_transfer(differential3 *dP_, const differential3 dP, float3 D, const differential3 dD, float3 Ng, float t)
+{
+ /* ray differential transfer through homogenous medium, to
+ * compute dPdx/dy at a shading point from the incoming ray */
+
+ float3 tmp = D/dot(D, Ng);
+ float3 tmpx = dP.dx + t*dD.dx;
+ float3 tmpy = dP.dy + t*dD.dy;
+
+ dP_->dx = tmpx - dot(tmpx, Ng)*tmp;
+ dP_->dy = tmpy - dot(tmpy, Ng)*tmp;
+}
+
+__device void differential_incoming(differential3 *dI, const differential3 dD)
+{
+ /* compute dIdx/dy at a shading point, we just need to negate the
+ * differential of the ray direction */
+
+ dI->dx = -dD.dx;
+ dI->dy = -dD.dy;
+}
+
+__device void differential_dudv(differential *du, differential *dv, float3 dPdu, float3 dPdv, differential3 dP, float3 Ng)
+{
+ /* now we have dPdx/dy from the ray differential transfer, and dPdu/dv
+ * from the primitive, we can compute dudx/dy and dvdx/dy. these are
+ * mainly used for differentials of arbitrary mesh attributes. */
+
+ /* find most stable axis to project to 2D */
+ float xn= fabsf(Ng.x);
+ float yn= fabsf(Ng.y);
+ float zn= fabsf(Ng.z);
+
+ if(zn < xn || zn < yn) {
+ if(yn < xn || yn < zn) {
+ dPdu.x = dPdu.y;
+ dPdv.x = dPdv.y;
+ dP.dx.x = dP.dx.y;
+ dP.dy.x = dP.dy.y;
+ }
+
+ dPdu.y = dPdu.z;
+ dPdv.y = dPdv.z;
+ dP.dx.y = dP.dx.z;
+ dP.dy.y = dP.dy.z;
+ }
+
+ /* using Cramer's rule, we solve for dudx and dvdx in a 2x2 linear system,
+ * and the same for dudy and dvdy. the denominator is the same for both
+ * solutions, so we compute it only once.
+ *
+ * dP.dx = dPdu * dudx + dPdv * dvdx;
+ * dP.dy = dPdu * dudy + dPdv * dvdy; */
+
+ float det = (dPdu.x*dPdv.y - dPdv.x*dPdu.y);
+
+ if(det != 0.0f)
+ det = 1.0f/det;
+
+ du->dx = (dP.dx.x*dPdv.y - dP.dx.y*dPdv.x)*det;
+ dv->dx = (dP.dx.y*dPdu.x - dP.dx.x*dPdu.y)*det;
+
+ du->dy = (dP.dy.x*dPdv.y - dP.dy.y*dPdv.x)*det;
+ dv->dy = (dP.dy.y*dPdu.x - dP.dy.x*dPdu.y)*det;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_displace.h b/intern/cycles/kernel/kernel_displace.h
new file mode 100644
index 00000000000..ef6c3810a75
--- /dev/null
+++ b/intern/cycles/kernel/kernel_displace.h
@@ -0,0 +1,35 @@
+/*
+ * 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 kernel_displace(KernelGlobals *kg, uint4 *input, float3 *offset, 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));
+
+ /* evaluate */
+ float3 P = sd.P;
+ shader_eval_displacement(kg, &sd);
+ offset[i] = sd.P - P;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
new file mode 100644
index 00000000000..b81db721eb3
--- /dev/null
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -0,0 +1,139 @@
+/*
+ * 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
+
+/* Direction Emission */
+
+__device float3 direct_emissive_eval(KernelGlobals *kg, float rando,
+ LightSample *ls, float u, float v, float3 I)
+{
+ /* setup shading at emitter */
+ ShaderData sd;
+
+ shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v);
+ ls->Ng = sd.Ng;
+
+ /* no path flag, we're evaluating this for all closures. that's weak but
+ we'd have to do multiple evaluations otherwise */
+ shader_eval_surface(kg, &sd, rando, 0);
+
+ float3 eval;
+
+ /* evaluate emissive closure */
+ if(sd.flag & SD_EMISSION)
+ eval = shader_emissive_eval(kg, &sd);
+ else
+ eval = make_float3(0.0f, 0.0f, 0.0f);
+
+ shader_release(kg, &sd);
+
+ return eval;
+}
+
+__device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
+ float randt, float rando, float randu, float randv, Ray *ray, float3 *eval)
+{
+ LightSample ls;
+
+#ifdef __MULTI_LIGHT__
+ if(lindex != -1) {
+ /* sample position on a specified light */
+ light_select(kg, lindex, randu, randv, sd->P, &ls);
+ }
+ else
+#endif
+ {
+ /* sample a light and position on int */
+ light_sample(kg, randt, randu, randv, sd->P, &ls);
+ }
+
+ /* compute pdf */
+ float pdf = light_sample_pdf(kg, &ls, -ls.D, ls.t);
+
+ /* evaluate closure */
+ *eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D);
+
+ if(is_zero(*eval) || pdf == 0.0f)
+ return false;
+
+ /* todo: use visbility flag to skip lights */
+
+ /* evaluate BSDF at shading point */
+ float bsdf_pdf;
+ float3 bsdf_eval = shader_bsdf_eval(kg, sd, ls.D, &bsdf_pdf);
+
+ *eval *= bsdf_eval/pdf;
+
+ if(is_zero(*eval))
+ return false;
+
+ if(ls.prim != ~0) {
+ /* multiple importance sampling */
+ float mis_weight = power_heuristic(pdf, bsdf_pdf);
+ *eval *= mis_weight;
+ }
+ /* todo: clean up these weights */
+ else if(ls.shader & SHADER_AREA_LIGHT)
+ *eval *= 0.25f; /* area lamp */
+ else if(ls.t != FLT_MAX)
+ *eval *= 0.25f*M_1_PI_F; /* point lamp */
+
+ if(ls.shader & SHADER_CAST_SHADOW) {
+ /* setup ray */
+ ray->P = ray_offset(sd->P, sd->Ng);
+
+ if(ls.t == FLT_MAX) {
+ /* distant light */
+ ray->D = ls.D;
+ ray->t = ls.t;
+ }
+ else {
+ /* other lights, avoid self-intersection */
+ ray->D = ray_offset(ls.P, ls.Ng) - ray->P;
+ ray->D = normalize_len(ray->D, &ray->t);
+ }
+ }
+ else {
+ /* signal to not cast shadow ray */
+ ray->t = 0.0f;
+ }
+
+ return true;
+}
+
+/* Indirect Emission */
+
+__device float3 indirect_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf)
+{
+ /* evaluate emissive closure */
+ float3 L = shader_emissive_eval(kg, sd);
+
+ if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_SAMPLE_AS_LIGHT)) {
+ /* multiple importance sampling */
+ float pdf = triangle_light_pdf(kg, sd->Ng, sd->I, t);
+ float mis_weight = power_heuristic(bsdf_pdf, pdf);
+
+ return L*mis_weight;
+ }
+
+ return L;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_film.h b/intern/cycles/kernel/kernel_film.h
new file mode 100644
index 00000000000..4373701452e
--- /dev/null
+++ b/intern/cycles/kernel/kernel_film.h
@@ -0,0 +1,64 @@
+/*
+ * 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 float4 film_map(KernelGlobals *kg, float4 irradiance, int sample)
+{
+ float scale = 1.0f/(float)(sample+1);
+ float exposure = kernel_data.film.exposure;
+ float4 result = irradiance*scale;
+
+ /* conversion to srgb */
+ result.x = color_scene_linear_to_srgb(result.x*exposure);
+ result.y = color_scene_linear_to_srgb(result.y*exposure);
+ result.z = color_scene_linear_to_srgb(result.z*exposure);
+
+ /* clamp since alpha might be > 1.0 due to russian roulette */
+ result.w = clamp(result.w, 0.0f, 1.0f);
+
+ return result;
+}
+
+__device uchar4 film_float_to_byte(float4 color)
+{
+ uchar4 result;
+
+ /* simple float to byte conversion */
+ result.x = (uchar)clamp(color.x*255.0f, 0.0f, 255.0f);
+ result.y = (uchar)clamp(color.y*255.0f, 0.0f, 255.0f);
+ result.z = (uchar)clamp(color.z*255.0f, 0.0f, 255.0f);
+ result.w = (uchar)clamp(color.w*255.0f, 0.0f, 255.0f);
+
+ return result;
+}
+
+__device void kernel_film_tonemap(KernelGlobals *kg, __global uchar4 *rgba, __global float4 *buffer, int sample, int resolution, int x, int y)
+{
+ int w = kernel_data.cam.width;
+ int index = x + y*w;
+ float4 irradiance = buffer[index];
+
+ float4 float_result = film_map(kg, irradiance, sample);
+ uchar4 byte_result = film_float_to_byte(float_result);
+
+ rgba[index] = byte_result;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
new file mode 100644
index 00000000000..a1b23128b38
--- /dev/null
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ */
+
+/* Constant Globals */
+
+#ifdef __KERNEL_CPU__
+
+#ifdef __OSL__
+#include "osl_globals.h"
+#endif
+
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+/* On the CPU, we pass along the struct KernelGlobals to nearly everywhere in
+ the kernel, to access constant data. These are all stored as "textures", but
+ these are really just standard arrays. We can't use actually globals because
+ multiple renders may be running inside the same process. */
+
+#ifdef __KERNEL_CPU__
+
+typedef struct KernelGlobals {
+
+#define KERNEL_TEX(type, ttype, name) ttype name;
+#define KERNEL_IMAGE_TEX(type, ttype, name) ttype name;
+#include "kernel_textures.h"
+
+ KernelData __data;
+
+#ifdef __OSL__
+ /* On the CPU, we also have the OSL globals here. Most data structures are shared
+ with SVM, the difference is in the shaders and object/mesh attributes. */
+ OSLGlobals osl;
+#endif
+
+} KernelGLobals;
+
+#endif
+
+/* For CUDA, constant memory textures must be globals, so we can't put them
+ into a struct. As a result we don't actually use this struct and use actual
+ globals and simply pass along a NULL pointer everywhere, which we hope gets
+ optimized out. */
+
+#ifdef __KERNEL_CUDA__
+
+__constant__ KernelData __data;
+typedef struct KernelGlobals {} KernelGlobals;
+
+#define KERNEL_TEX(type, ttype, name) ttype name;
+#define KERNEL_IMAGE_TEX(type, ttype, name) ttype name;
+#include "kernel_textures.h"
+
+#endif
+
+/* OpenCL */
+
+#ifdef __KERNEL_OPENCL__
+
+typedef struct KernelGlobals {
+ __constant KernelData *data;
+
+#define KERNEL_TEX(type, ttype, name) \
+ __global type *name; \
+ int name##_width;
+#include "kernel_textures.h"
+} KernelGlobals;
+
+#endif
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h
new file mode 100644
index 00000000000..d5d47b28d59
--- /dev/null
+++ b/intern/cycles/kernel/kernel_light.h
@@ -0,0 +1,241 @@
+/*
+ * 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
+
+typedef struct LightSample {
+ float3 P;
+ float3 D;
+ float3 Ng;
+ float t;
+ int object;
+ int prim;
+ int shader;
+} LightSample;
+
+/* Regular Light */
+
+__device float3 disk_light_sample(float3 v, float randu, float randv)
+{
+ float3 ru, rv;
+
+ make_orthonormals(v, &ru, &rv);
+ to_unit_disk(&randu, &randv);
+
+ return ru*randu + rv*randv;
+}
+
+__device float3 distant_light_sample(float3 D, float size, float randu, float randv)
+{
+ return normalize(D + disk_light_sample(D, randu, randv)*size);
+}
+
+__device float3 sphere_light_sample(float3 P, float3 center, float size, float randu, float randv)
+{
+ return disk_light_sample(normalize(P - center), randu, randv)*size;
+}
+
+__device float3 area_light_sample(float3 axisu, float3 axisv, float randu, float randv)
+{
+ randu = randu - 0.5f;
+ randv = randv - 0.5f;
+
+ return axisu*randu + axisv*randv;
+}
+
+__device void regular_light_sample(KernelGlobals *kg, int point,
+ float randu, float randv, float3 P, LightSample *ls)
+{
+ float4 data0 = kernel_tex_fetch(__light_data, point*LIGHT_SIZE + 0);
+ float4 data1 = kernel_tex_fetch(__light_data, point*LIGHT_SIZE + 1);
+
+ LightType type = (LightType)__float_as_int(data0.x);
+
+ if(type == LIGHT_DISTANT) {
+ /* distant light */
+ float3 D = make_float3(data0.y, data0.z, data0.w);
+ float size = data1.y;
+
+ if(size > 0.0f)
+ D = distant_light_sample(D, size, randu, randv);
+
+ ls->P = D;
+ ls->Ng = D;
+ ls->D = -D;
+ ls->t = FLT_MAX;
+ }
+ else {
+ ls->P = make_float3(data0.y, data0.z, data0.w);
+
+ if(type == LIGHT_POINT) {
+ float size = data1.y;
+
+ /* sphere light */
+ if(size > 0.0f)
+ ls->P += sphere_light_sample(P, ls->P, size, randu, randv);
+
+ ls->Ng = normalize(P - ls->P);
+ }
+ else {
+ /* area light */
+ float4 data2 = kernel_tex_fetch(__light_data, point*LIGHT_SIZE + 2);
+ float4 data3 = kernel_tex_fetch(__light_data, point*LIGHT_SIZE + 3);
+
+ float3 axisu = make_float3(data1.y, data1.z, data2.w);
+ float3 axisv = make_float3(data2.y, data2.z, data2.w);
+ float3 D = make_float3(data3.y, data3.z, data3.w);
+
+ ls->P += area_light_sample(axisu, axisv, randu, randv);
+ ls->Ng = D;
+ }
+
+ ls->t = 0.0f;
+ }
+
+ ls->shader = __float_as_int(data1.x);
+ ls->object = ~0;
+ ls->prim = ~0;
+}
+
+__device float regular_light_pdf(KernelGlobals *kg,
+ const float3 Ng, const float3 I, float t)
+{
+ float pdf = kernel_data.integrator.pdf_lights;
+
+ if(t == FLT_MAX)
+ return pdf;
+
+ float cos_pi = dot(Ng, I);
+
+ if(cos_pi <= 0.0f)
+ return 0.0f;
+
+ return t*t*pdf/cos_pi;
+}
+
+/* Triangle Light */
+
+__device void triangle_light_sample(KernelGlobals *kg, int prim, int object,
+ float randu, float randv, LightSample *ls)
+{
+ /* triangle, so get position, normal, shader */
+ ls->P = triangle_sample_MT(kg, prim, randu, randv);
+ ls->Ng = triangle_normal_MT(kg, prim, &ls->shader);
+ ls->object = object;
+ ls->prim = prim;
+ ls->t = 0.0f;
+
+#ifdef __INSTANCING__
+ /* instance transform */
+ if(ls->object >= 0) {
+ object_position_transform(kg, ls->object, &ls->P);
+ object_normal_transform(kg, ls->object, &ls->Ng);
+ }
+#endif
+}
+
+__device float triangle_light_pdf(KernelGlobals *kg,
+ const float3 Ng, const float3 I, float t)
+{
+ float cos_pi = fabsf(dot(Ng, I));
+
+ if(cos_pi == 0.0f)
+ return 0.0f;
+
+ return (t*t*kernel_data.integrator.pdf_triangles)/cos_pi;
+}
+
+/* Light Distribution */
+
+__device int light_distribution_sample(KernelGlobals *kg, float randt)
+{
+ /* this is basically std::upper_bound as used by pbrt, to find a point light or
+ triangle to emit from, proportional to area. a good improvement would be to
+ also sample proportional to power, though it's not so well defined with
+ OSL shaders. */
+ int first = 0;
+ int len = kernel_data.integrator.num_distribution + 1;
+
+ while(len > 0) {
+ int half_len = len >> 1;
+ int middle = first + half_len;
+
+ if(randt < kernel_tex_fetch(__light_distribution, middle).x) {
+ len = half_len;
+ }
+ else {
+ first = middle + 1;
+ len = len - half_len - 1;
+ }
+ }
+
+ first = max(0, first-1);
+ kernel_assert(first >= 0 && first < kernel_data.integrator.num_distribution);
+
+ return first;
+}
+
+/* Generic Light */
+
+__device void light_sample(KernelGlobals *kg, float randt, float randu, float randv, float3 P, LightSample *ls)
+{
+ /* sample index */
+ int index = light_distribution_sample(kg, randt);
+
+ /* fetch light data */
+ float4 l = kernel_tex_fetch(__light_distribution, index);
+ int prim = __float_as_int(l.y);
+
+ if(prim >= 0) {
+ int object = __float_as_int(l.w);
+ triangle_light_sample(kg, prim, object, randu, randv, ls);
+ }
+ else {
+ int point = -prim-1;
+ regular_light_sample(kg, point, randu, randv, P, ls);
+ }
+
+ /* compute incoming direction and distance */
+ if(ls->t != FLT_MAX)
+ ls->D = normalize_len(ls->P - P, &ls->t);
+}
+
+__device float light_sample_pdf(KernelGlobals *kg, LightSample *ls, float3 I, float t)
+{
+ float pdf;
+
+ if(ls->prim != ~0)
+ pdf = triangle_light_pdf(kg, ls->Ng, I, t);
+ else
+ pdf = regular_light_pdf(kg, ls->Ng, I, t);
+
+ return pdf;
+}
+
+__device void light_select(KernelGlobals *kg, int index, float randu, float randv, float3 P, LightSample *ls)
+{
+ regular_light_sample(kg, index, randu, randv, P, ls);
+}
+
+__device float light_select_pdf(KernelGlobals *kg, LightSample *ls, float3 I, float t)
+{
+ return regular_light_pdf(kg, ls->Ng, I, t);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_math.h b/intern/cycles/kernel/kernel_math.h
new file mode 100644
index 00000000000..165535077da
--- /dev/null
+++ b/intern/cycles/kernel/kernel_math.h
@@ -0,0 +1,27 @@
+/*
+ * 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 __KERNEL_MATH_H__
+#define __KERNEL_MATH_H__
+
+#include "util_color.h"
+#include "util_math.h"
+#include "util_transform.h"
+
+#endif /* __KERNEL_MATH_H__ */
+
diff --git a/intern/cycles/kernel/kernel_mbvh.h b/intern/cycles/kernel/kernel_mbvh.h
new file mode 100644
index 00000000000..3995e782abd
--- /dev/null
+++ b/intern/cycles/kernel/kernel_mbvh.h
@@ -0,0 +1,394 @@
+/*
+ * 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
+
+#define MBVH_OBJECT_SENTINEL 0x76543210
+#define MBVH_NODE_SIZE 8
+#define MBVH_STACK_SIZE 1024
+#define MBVH_RAY_STACK_SIZE 10000
+
+typedef struct MBVHTask {
+ int node;
+ int index;
+ int num;
+ int object;
+} MBVHTask;
+
+typedef struct MVBHRay {
+ float3 P;
+ float u;
+ float3 idir;
+ float v;
+ float t;
+ int index;
+ int object;
+
+ float3 origP;
+ float3 origD;
+ float tmax;
+} MBVHRay;
+
+__device float3 mbvh_inverse_direction(float3 dir)
+{
+ // Avoid divide by zero (ooeps = exp2f(-80.0f))
+ float ooeps = 0.00000000000000000000000082718061255302767487140869206996285356581211090087890625f;
+ float3 idir;
+
+ idir.x = 1.0f / (fabsf(dir.x) > ooeps ? dir.x : copysignf(ooeps, dir.x));
+ idir.y = 1.0f / (fabsf(dir.y) > ooeps ? dir.y : copysignf(ooeps, dir.y));
+ idir.z = 1.0f / (fabsf(dir.z) > ooeps ? dir.z : copysignf(ooeps, dir.z));
+
+ return idir;
+}
+
+__device void mbvh_instance_push(KernelGlobals *kg, int object, MBVHRay *ray)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
+
+ ray->P = transform(&tfm, ray->origP);
+
+ float3 dir = ray->origD;
+
+ if(ray->t != ray->tmax) dir *= ray->t;
+
+ dir = transform_direction(&tfm, dir);
+ ray->idir = mbvh_inverse_direction(normalize(dir));
+
+ if(ray->t != ray->tmax) ray->t = len(dir);
+}
+
+__device void mbvh_instance_pop(KernelGlobals *kg, int object, MBVHRay *ray)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+
+ if(ray->t != ray->tmax)
+ ray->t = len(transform_direction(&tfm, (1.0f/(ray->idir)) * (ray->t)));
+
+ ray->P = ray->origP;
+ ray->idir = mbvh_inverse_direction(ray->origD);
+}
+
+/* Sven Woop's algorithm */
+__device void mbvh_triangle_intersect(KernelGlobals *kg, MBVHRay *ray, int object, int triAddr)
+{
+ float3 P = ray->P;
+ float3 idir = ray->idir;
+
+ /* compute and check intersection t-value */
+ float4 v00 = kernel_tex_fetch(__tri_woop, triAddr*MBVH_NODE_SIZE+0);
+ float4 v11 = kernel_tex_fetch(__tri_woop, triAddr*MBVH_NODE_SIZE+1);
+ float3 dir = 1.0f/idir;
+
+ float Oz = v00.w - P.x*v00.x - P.y*v00.y - P.z*v00.z;
+ float invDz = 1.0f/(dir.x*v00.x + dir.y*v00.y + dir.z*v00.z);
+ float t = Oz * invDz;
+
+ if(t > 0.0f && t < ray->t) {
+ /* compute and check barycentric u */
+ float Ox = v11.w + P.x*v11.x + P.y*v11.y + P.z*v11.z;
+ float Dx = dir.x*v11.x + dir.y*v11.y + dir.z*v11.z;
+ float u = Ox + t*Dx;
+
+ if(u >= 0.0f) {
+ /* compute and check barycentric v */
+ float4 v22 = kernel_tex_fetch(__tri_woop, triAddr*MBVH_NODE_SIZE+2);
+ float Oy = v22.w + P.x*v22.x + P.y*v22.y + P.z*v22.z;
+ float Dy = dir.x*v22.x + dir.y*v22.y + dir.z*v22.z;
+ float v = Oy + t*Dy;
+
+ if(v >= 0.0f && u + v <= 1.0f) {
+ /* record intersection */
+ ray->index = triAddr;
+ ray->object = object;
+ ray->u = u;
+ ray->v = v;
+ ray->t = t;
+ }
+ }
+ }
+}
+
+__device void mbvh_node_intersect(KernelGlobals *kg, __m128 *traverseChild,
+ __m128 *tHit, float3 P, float3 idir, float t, int nodeAddr)
+{
+ /* X axis */
+ const __m128 bminx = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*MBVH_NODE_SIZE+0);
+ const __m128 t0x = _mm_mul_ps(_mm_sub_ps(bminx, _mm_set_ps1(P.x)), _mm_set_ps1(idir.x));
+ const __m128 bmaxx = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*MBVH_NODE_SIZE+1);
+ const __m128 t1x = _mm_mul_ps(_mm_sub_ps(bmaxx, _mm_set_ps1(P.x)), _mm_set_ps1(idir.x));
+
+ __m128 tmin = _mm_max_ps(_mm_min_ps(t0x, t1x), _mm_setzero_ps());
+ __m128 tmax = _mm_min_ps(_mm_max_ps(t0x, t1x), _mm_set_ps1(t));
+
+ /* Y axis */
+ const __m128 bminy = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*MBVH_NODE_SIZE+2);
+ const __m128 t0y = _mm_mul_ps(_mm_sub_ps(bminy, _mm_set_ps1(P.y)), _mm_set_ps1(idir.y));
+ const __m128 bmaxy = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*MBVH_NODE_SIZE+3);
+ const __m128 t1y = _mm_mul_ps(_mm_sub_ps(bmaxy, _mm_set_ps1(P.y)), _mm_set_ps1(idir.y));
+
+ tmin = _mm_max_ps(_mm_min_ps(t0y, t1y), tmin);
+ tmax = _mm_min_ps(_mm_max_ps(t0y, t1y), tmax);
+
+ /* Z axis */
+ const __m128 bminz = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*MBVH_NODE_SIZE+4);
+ const __m128 t0z = _mm_mul_ps(_mm_sub_ps(bminz, _mm_set_ps1(P.z)), _mm_set_ps1(idir.z));
+ const __m128 bmaxz = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*MBVH_NODE_SIZE+5);
+ const __m128 t1z = _mm_mul_ps(_mm_sub_ps(bmaxz, _mm_set_ps1(P.z)), _mm_set_ps1(idir.z));
+
+ tmin = _mm_max_ps(_mm_min_ps(t0z, t1z), tmin);
+ tmax = _mm_min_ps(_mm_max_ps(t0z, t1z), tmax);
+
+ /* compare and get mask */
+ *traverseChild = _mm_cmple_ps(tmin, tmax);
+
+ /* get distance XXX probably wrong */
+ *tHit = tmin;
+}
+
+static void mbvh_sort_by_length(int id[4], float len[4])
+{
+ for(int i = 1; i < 4; i++) {
+ int j = i - 1;
+
+ while(j >= 0 && len[j] > len[j+1]) {
+ swap(len[j], len[j+1]);
+ swap(id[j], id[j+1]);
+ j--;
+ }
+ }
+}
+
+__device void scene_intersect(KernelGlobals *kg, MBVHRay *rays, int numrays)
+{
+ /* traversal stacks */
+ MBVHTask task_stack[MBVH_STACK_SIZE];
+ int active_ray_stacks[4][MBVH_RAY_STACK_SIZE];
+ int num_task, num_active[4] = {0, 0, 0, 0};
+ __m128i one_mm = _mm_set1_epi32(1);
+
+ /* push root node task on stack */
+ task_stack[0].node = kernel_data.bvh.root;
+ task_stack[0].index = 0;
+ task_stack[0].num = numrays;
+ task_stack[0].object = ~0;
+ num_task = 1;
+
+ /* push all rays in first SIMD lane */
+ for(int i = 0; i < numrays; i++)
+ active_ray_stacks[0][i] = i;
+ num_active[0] = numrays;
+
+ while(num_task >= 1) {
+ /* pop task */
+ MBVHTask task = task_stack[--num_task];
+
+ if(task.node == MBVH_OBJECT_SENTINEL) {
+ /* instance pop */
+
+ /* pop rays from stack */
+ num_active[task.index] -= task.num;
+ int ray_offset = num_active[task.index];
+
+ /* transform rays */
+ for(int i = 0; i < task.num; i++) {
+ MBVHRay *ray = &rays[active_ray_stacks[task.index][ray_offset + i]];
+ mbvh_instance_pop(kg, task.object, ray);
+ }
+ }
+ else if(task.node >= 0) {
+ /* inner node? */
+
+ /* pop rays from stack*/
+ num_active[task.index] -= task.num;
+ int ray_offset = num_active[task.index];
+
+ /* initialze simd values */
+ __m128i num_active_mm = _mm_load_si128((__m128i*)num_active);
+ __m128 len_mm = _mm_set_ps1(0.0f);
+
+ for(int i = 0; i < task.num; i++) {
+ int rayid = active_ray_stacks[task.index][ray_offset + i];
+ MVBHRay *ray = rays + rayid;
+
+ /* intersect 4 QBVH node children */
+ __m128 result;
+ __m128 thit;
+
+ mbvh_node_intersect(kg, &result, &thit, ray->P, ray->idir, ray->t, task.node);
+
+ /* update length for sorting */
+ len_mm = _mm_add_ps(len_mm, _mm_and_ps(thit, result));
+
+ /* push rays on stack */
+ for(int j = 0; j < 4; j++)
+ active_ray_stacks[j][num_active[j]] = rayid;
+
+ /* update num active */
+ __m128i resulti = _mm_and_si128(*((__m128i*)&result), one_mm);
+ num_active_mm = _mm_add_epi32(resulti, num_active_mm);
+ _mm_store_si128((__m128i*)num_active, num_active_mm);
+ }
+
+ if(num_active[0] || num_active[1] || num_active[2] || num_active[3]) {
+ /* load child node addresses */
+ float4 cnodes = kernel_tex_fetch(__bvh_nodes, task.node);
+ int child[4] = {
+ __float_as_int(cnodes.x),
+ __float_as_int(cnodes.y),
+ __float_as_int(cnodes.z),
+ __float_as_int(cnodes.w)};
+
+ /* sort nodes by average intersection distance */
+ int ids[4] = {0, 1, 2, 3};
+ float len[4];
+
+ _mm_store_ps(len, len_mm);
+ mbvh_sort_by_length(ids, len);
+
+ /* push new tasks on stack */
+ for(int j = 0; j < 4; j++) {
+ if(num_active[j]) {
+ int id = ids[j];
+
+ task_stack[num_task].node = child[id];
+ task_stack[num_task].index = id;
+ task_stack[num_task].num = num_active[id];
+ task_stack[num_task].object = task.object;
+ num_task++;
+ }
+ }
+ }
+ }
+ else {
+ /* fetch leaf node data */
+ float4 leaf = kernel_tex_fetch(__bvh_nodes, (-task.node-1)*MBVH_NODE_SIZE+(MBVH_NODE_SIZE-2));
+ int triAddr = __float_as_int(leaf.x);
+ int triAddr2 = __float_as_int(leaf.y);
+
+ /* pop rays from stack*/
+ num_active[task.index] -= task.num;
+ int ray_offset = num_active[task.index];
+
+ /* triangles */
+ if(triAddr >= 0) {
+ int i, numq = (task.num >> 2) << 2;
+
+ /* SIMD ray leaf intersection */
+ for(i = 0; i < numq; i += 4) {
+ MBVHRay *ray4[4] = {
+ &rays[active_ray_stacks[task.index][ray_offset + i + 0]],
+ &rays[active_ray_stacks[task.index][ray_offset + i + 1]],
+ &rays[active_ray_stacks[task.index][ray_offset + i + 2]],
+ &rays[active_ray_stacks[task.index][ray_offset + i + 3]]};
+
+ /* load SoA */
+
+ while(triAddr < triAddr2) {
+ mbvh_triangle_intersect(ray4[0], task.object, task.node);
+ mbvh_triangle_intersect(ray4[1], task.object, task.node);
+ mbvh_triangle_intersect(ray4[2], task.object, task.node);
+ mbvh_triangle_intersect(ray4[3], task.object, task.node);
+ triAddr++;
+
+ /* some shadow ray optim could be done by setting t=0 */
+ }
+
+ /* store AoS */
+ }
+
+ /* mono ray leaf intersection */
+ for(; i < task.num; i++) {
+ MBVHRay *ray = &rays[active_ray_stacks[task.index][ray_offset + i]];
+
+ while(triAddr < triAddr2) {
+ mbvh_triangle_intersect(kg, ray, task.object, task.node);
+ triAddr++;
+ }
+ }
+ }
+ else {
+ /* instance push */
+ int object = -triAddr-1;
+ int node = triAddr;
+
+ /* push instance pop task */
+ task_stack[num_task].node = MBVH_OBJECT_SENTINEL;
+ task_stack[num_task].index = task.index;
+ task_stack[num_task].num = task.num;
+ task_stack[num_task].object = object;
+ num_task++;
+
+ num_active[task.index] += task.num;
+
+ /* push node task */
+ task_stack[num_task].node = node;
+ task_stack[num_task].index = task.index;
+ task_stack[num_task].num = task.num;
+ task_stack[num_task].object = object;
+ num_task++;
+
+ for(int i = 0; i < task.num; i++) {
+ int rayid = active_ray_stacks[task.index][ray_offset + i];
+
+ /* push on stack for last task */
+ active_ray_stacks[task.index][num_active[task.index]] = rayid;
+ num_active[task.index]++;
+
+ /* transform ray */
+ MBVHRay *ray = &rays[rayid];
+ mbvh_instance_push(kg, object, ray);
+ }
+ }
+ }
+ }
+}
+
+__device void mbvh_set_ray(MBVHRay *rays, int i, Ray *ray, float tmax)
+{
+ MBVHRay *mray = &rays[i];
+
+ /* ray parameters in registers */
+ mray->P = ray->P;
+ mray->idir = mbvh_inverse_direction(ray->D);
+ mray->t = tmax;
+}
+
+__device bool mbvh_get_intersection(MVBHRay *rays, int i, Intersection *isect, float tmax)
+{
+ MBVHRay *mray = &rays[i];
+
+ if(mray->t == tmax)
+ return false;
+
+ isect->t = mray->t;
+ isect->u = mray->u;
+ isect->v = mray->v;
+ isect->index = mray->index;
+ isect->object = mray->object;
+
+ return true;
+}
+
+__device bool mbvh_get_shadow(MBVHRay *rays, int i, float tmax)
+{
+ return (rays[i].t == tmax);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_montecarlo.h b/intern/cycles/kernel/kernel_montecarlo.h
new file mode 100644
index 00000000000..df291b66b23
--- /dev/null
+++ b/intern/cycles/kernel/kernel_montecarlo.h
@@ -0,0 +1,209 @@
+/*
+ * Parts adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __KERNEL_MONTECARLO_CL__
+#define __KERNEL_MONTECARLO_CL__
+
+CCL_NAMESPACE_BEGIN
+
+/// Given values x and y on [0,1], convert them in place to values on
+/// [-1,1] uniformly distributed over a unit sphere. This code is
+/// derived from Peter Shirley, "Realistic Ray Tracing", p. 103.
+__device void to_unit_disk(float *x, float *y)
+{
+ float r, phi;
+ float a = 2.0f * (*x) - 1.0f;
+ float b = 2.0f * (*y) - 1.0f;
+ if(a > -b) {
+ if(a > b) {
+ r = a;
+ phi = M_PI_4_F *(b/a);
+ } else {
+ r = b;
+ phi = M_PI_4_F *(2.0f - a/b);
+ }
+ } else {
+ if(a < b) {
+ r = -a;
+ phi = M_PI_4_F *(4.0f + b/a);
+ } else {
+ r = -b;
+ if(b != 0.0f)
+ phi = M_PI_4_F *(6.0f - a/b);
+ else
+ phi = 0.0f;
+ }
+ }
+ *x = r * cosf(phi);
+ *y = r * sinf(phi);
+}
+
+__device void make_orthonormals_tangent(const float3 N, const float3 T, float3 *a, float3 *b)
+{
+ *b = cross(N, T);
+ *a = cross(*b, N);
+}
+
+__device_inline void sample_cos_hemisphere(const float3 N,
+ float randu, float randv, float3 *omega_in, float *pdf)
+{
+ // Default closure BSDF implementation: uniformly sample
+ // cosine-weighted hemisphere above the point.
+ to_unit_disk(&randu, &randv);
+ float costheta = sqrtf(max(1.0f - randu * randu - randv * randv, 0.0f));
+ float3 T, B;
+ make_orthonormals(N, &T, &B);
+ *omega_in = randu * T + randv * B + costheta * N;
+ *pdf = costheta *M_1_PI_F;
+}
+
+__device_inline void sample_uniform_hemisphere(const float3 N,
+ float randu, float randv,
+ float3 *omega_in, float *pdf)
+{
+ float z = randu;
+ float r = sqrtf(max(0.f, 1.f - z*z));
+ float phi = 2.f * M_PI_F * randv;
+ float x = r * cosf(phi);
+ float y = r * sinf(phi);
+
+ float3 T, B;
+ make_orthonormals (N, &T, &B);
+ *omega_in = x * T + y * B + z * N;
+ *pdf = 0.5f * M_1_PI_F;
+}
+
+__device float3 sample_uniform_sphere(float u1, float u2)
+{
+ float z = 1.0f - 2.0f*u1;
+ float r = sqrtf(fmaxf(0.0f, 1.0f - z*z));
+ float phi = 2.0f*M_PI_F*u2;
+ float x = r*cosf(phi);
+ float y = r*sinf(phi);
+
+ return make_float3(x, y, z);
+}
+
+__device float power_heuristic(float a, float b)
+{
+ return (a*a)/(a*a + b*b);
+}
+
+__device float2 concentric_sample_disk(float u1, float u2)
+{
+ float r, theta;
+ // Map uniform random numbers to $[-1,1]^2$
+ float sx = 2 * u1 - 1;
+ float sy = 2 * u2 - 1;
+
+ // Map square to $(r,\theta)$
+
+ // Handle degeneracy at the origin
+ if(sx == 0.0f && sy == 0.0f) {
+ return make_float2(0.0f, 0.0f);
+ }
+ if(sx >= -sy) {
+ if(sx > sy) {
+ // Handle first region of disk
+ r = sx;
+ if(sy > 0.0f) theta = sy/r;
+ else theta = 8.0f + sy/r;
+ }
+ else {
+ // Handle second region of disk
+ r = sy;
+ theta = 2.0f - sx/r;
+ }
+ }
+ else {
+ if(sx <= sy) {
+ // Handle third region of disk
+ r = -sx;
+ theta = 4.0f - sy/r;
+ }
+ else {
+ // Handle fourth region of disk
+ r = -sy;
+ theta = 6.0f + sx/r;
+ }
+ }
+
+ theta *= M_PI_4_F;
+ return make_float2(r * cosf(theta), r * sinf(theta));
+}
+
+__device float2 regular_polygon_sample(float corners, float rotation, float u, float v)
+{
+ /* sample corner number and reuse u */
+ float corner = floorf(u*corners);
+ u = u*corners - corner;
+
+ /* uniform sampled triangle weights */
+ u = sqrtf(u);
+ v = v*u;
+ u = 1.0f - u;
+
+ /* point in triangle */
+ float angle = M_PI_F/corners;
+ float2 p = make_float2((u + v)*cosf(angle), (u - v)*sinf(angle));
+
+ /* rotate */
+ rotation += corner*2.0f*angle;
+
+ float cr = cosf(rotation);
+ float sr = sinf(rotation);
+
+ return make_float2(cr*p.x - sr*p.y, sr*p.x + cr*p.y);
+}
+
+/* Spherical coordinates <-> Cartesion direction */
+
+__device float2 direction_to_spherical(float3 dir)
+{
+ float theta = acosf(dir.z);
+ float phi = atan2f(dir.x, dir.y);
+
+ return make_float2(theta, phi);
+}
+
+__device float3 spherical_to_direction(float theta, float phi)
+{
+ return make_float3(
+ sinf(theta)*cosf(phi),
+ sinf(theta)*sinf(phi),
+ cosf(theta));
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __KERNEL_MONTECARLO_CL__ */
+
diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h
new file mode 100644
index 00000000000..b4c42d3bacc
--- /dev/null
+++ b/intern/cycles/kernel/kernel_object.h
@@ -0,0 +1,68 @@
+/*
+ * 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
+
+enum ObjectTransform {
+ OBJECT_TRANSFORM = 0,
+ OBJECT_INVERSE_TRANSFORM = 4,
+ OBJECT_NORMAL_TRANSFORM = 8,
+ OBJECT_PROPERTIES = 12
+};
+
+__device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type)
+{
+ Transform tfm;
+
+ int offset = object*OBJECT_SIZE + (int)type;
+
+ tfm.x = kernel_tex_fetch(__objects, offset + 0);
+ tfm.y = kernel_tex_fetch(__objects, offset + 1);
+ tfm.z = kernel_tex_fetch(__objects, offset + 2);
+ tfm.w = kernel_tex_fetch(__objects, offset + 3);
+
+ return tfm;
+}
+
+__device_inline void object_position_transform(KernelGlobals *kg, int object, float3 *P)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+ *P = transform(&tfm, *P);
+}
+
+__device_inline void object_normal_transform(KernelGlobals *kg, int object, float3 *N)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_NORMAL_TRANSFORM);
+ *N = normalize(transform_direction(&tfm, *N));
+}
+
+__device_inline void object_dir_transform(KernelGlobals *kg, int object, float3 *D)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+ *D = transform_direction(&tfm, *D);
+}
+
+__device_inline float object_surface_area(KernelGlobals *kg, int object)
+{
+ int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES;
+ float4 f = kernel_tex_fetch(__objects, offset);
+ return f.x;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
new file mode 100644
index 00000000000..c609f6f13fe
--- /dev/null
+++ b/intern/cycles/kernel/kernel_path.h
@@ -0,0 +1,421 @@
+/*
+ * 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 "kernel_differential.h"
+#include "kernel_montecarlo.h"
+#include "kernel_triangle.h"
+#include "kernel_object.h"
+#ifdef __QBVH__
+#include "kernel_qbvh.h"
+#else
+#include "kernel_bvh.h"
+#endif
+#include "kernel_camera.h"
+#include "kernel_shader.h"
+#include "kernel_light.h"
+#include "kernel_emission.h"
+#include "kernel_random.h"
+
+CCL_NAMESPACE_BEGIN
+
+#ifdef __MODIFY_TP__
+__device float3 path_terminate_modified_throughput(KernelGlobals *kg, __global float3 *buffer, int x, int y, int sample)
+{
+ /* modify throughput to influence path termination probability, to avoid
+ darker regions receiving fewer samples than lighter regions. also RGB
+ are weighted differently. proper validation still remains to be done. */
+ const float3 weights = make_float3(1.0f, 1.33f, 0.66f);
+ const float3 one = make_float3(1.0f, 1.0f, 1.0f);
+ const int minsample = 5;
+ const float minL = 0.1f;
+
+ if(sample >= minsample) {
+ float3 L = buffer[x + y*kernel_data.cam.width];
+ float3 Lmin = make_float3(minL, minL, minL);
+ float correct = (float)(sample+1)/(float)sample;
+
+ L = film_map(L*correct, sample);
+
+ return weights/clamp(L, Lmin, one);
+ }
+
+ return weights;
+}
+#endif
+
+typedef struct PathState {
+ uint flag;
+ int bounce;
+
+ int diffuse_bounce;
+ int glossy_bounce;
+ int transmission_bounce;
+ int transparent_bounce;
+} PathState;
+
+__device_inline void path_state_init(PathState *state)
+{
+ state->flag = PATH_RAY_CAMERA|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP;
+ state->bounce = 0;
+ state->diffuse_bounce = 0;
+ state->glossy_bounce = 0;
+ state->transmission_bounce = 0;
+ state->transparent_bounce = 0;
+}
+
+__device_inline void path_state_next(KernelGlobals *kg, PathState *state, int label)
+{
+ /* ray through transparent keeps same flags from previous ray and is
+ not counted as a regular bounce, transparent has separate max */
+ if(label & LABEL_TRANSPARENT) {
+ state->flag |= PATH_RAY_TRANSPARENT;
+ state->transparent_bounce++;
+
+ if(!kernel_data.integrator.transparent_shadows)
+ state->flag |= PATH_RAY_MIS_SKIP;
+
+ return;
+ }
+
+ state->bounce++;
+
+ /* reflection/transmission */
+ if(label & LABEL_REFLECT) {
+ state->flag |= PATH_RAY_REFLECT;
+ state->flag &= ~(PATH_RAY_TRANSMIT|PATH_RAY_CAMERA|PATH_RAY_TRANSPARENT);
+
+ if(label & LABEL_DIFFUSE)
+ state->diffuse_bounce++;
+ else
+ state->glossy_bounce++;
+ }
+ else {
+ kernel_assert(label & LABEL_TRANSMIT);
+
+ state->flag |= PATH_RAY_TRANSMIT;
+ state->flag &= ~(PATH_RAY_REFLECT|PATH_RAY_CAMERA|PATH_RAY_TRANSPARENT);
+
+ state->transmission_bounce++;
+ }
+
+ /* diffuse/glossy/singular */
+ if(label & LABEL_DIFFUSE) {
+ state->flag |= PATH_RAY_DIFFUSE;
+ state->flag &= ~(PATH_RAY_GLOSSY|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP);
+ }
+ else if(label & LABEL_GLOSSY) {
+ state->flag |= PATH_RAY_GLOSSY;
+ state->flag &= ~(PATH_RAY_DIFFUSE|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP);
+ }
+ else {
+ kernel_assert(label & LABEL_SINGULAR);
+
+ state->flag |= PATH_RAY_GLOSSY|PATH_RAY_SINGULAR|PATH_RAY_MIS_SKIP;
+ state->flag &= ~PATH_RAY_DIFFUSE;
+ }
+}
+
+__device_inline uint path_state_ray_visibility(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);
+
+ return flag;
+}
+
+__device_inline float path_state_terminate_probability(KernelGlobals *kg, PathState *state, const float3 throughput)
+{
+ if(state->flag & PATH_RAY_TRANSPARENT) {
+ /* transparent rays treated separately */
+ if(state->transparent_bounce >= kernel_data.integrator.transparent_max_bounce)
+ return 0.0f;
+ else if(state->transparent_bounce <= kernel_data.integrator.transparent_min_bounce)
+ return 1.0f;
+ }
+ else {
+ /* other rays */
+ if((state->bounce >= kernel_data.integrator.max_bounce) ||
+ (state->diffuse_bounce >= kernel_data.integrator.max_diffuse_bounce) ||
+ (state->glossy_bounce >= kernel_data.integrator.max_glossy_bounce) ||
+ (state->transmission_bounce >= kernel_data.integrator.max_transmission_bounce))
+ return 0.0f;
+ else if(state->bounce <= kernel_data.integrator.min_bounce)
+ return 1.0f;
+ }
+
+ /* probalistic termination */
+ return average(throughput);
+}
+
+__device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ray, Intersection *isect, float3 *light_L)
+{
+ if(ray->t == 0.0f)
+ return false;
+
+ bool result = scene_intersect(kg, ray, PATH_RAY_SHADOW_OPAQUE, isect);
+
+#ifdef __TRANSPARENT_SHADOWS__
+ if(result && kernel_data.integrator.transparent_shadows) {
+ /* transparent shadows work in such a way to try to minimize overhead
+ in cases where we don't need them. after a regular shadow ray is
+ cast we check if the hit primitive was potentially transparent, and
+ only in that case start marching. this gives on extra ray cast for
+ the cases were we do want transparency.
+
+ also note that for this to work correct, multi close sampling must
+ be used, since we don't pass a random number to shader_eval_surface */
+ if(shader_transparent_shadow(kg, isect)) {
+ float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
+ float3 Pend = ray->P + ray->D*ray->t;
+ int bounce = state->transparent_bounce;
+
+ for(;;) {
+ if(bounce >= kernel_data.integrator.transparent_max_bounce) {
+ return true;
+ }
+ else if(bounce >= kernel_data.integrator.transparent_min_bounce) {
+ /* todo: get random number somewhere for probabilistic terminate */
+#if 0
+ float probability = average(throughput);
+ float terminate = 0.0f;
+
+ if(terminate >= probability)
+ return true;
+
+ throughput /= probability;
+#endif
+ }
+
+ if(!scene_intersect(kg, ray, PATH_RAY_SHADOW_TRANSPARENT, isect)) {
+ *light_L *= throughput;
+ return false;
+ }
+
+ if(!shader_transparent_shadow(kg, isect))
+ return true;
+
+ ShaderData sd;
+ shader_setup_from_ray(kg, &sd, isect, ray);
+ shader_eval_surface(kg, &sd, 0.0f, PATH_RAY_SHADOW);
+
+ throughput *= shader_bsdf_transparency(kg, &sd);
+
+ ray->P = ray_offset(sd.P, -sd.Ng);
+ if(ray->t != FLT_MAX)
+ ray->D = normalize_len(Pend - ray->P, &ray->t);
+
+ bounce++;
+ }
+ }
+ }
+#endif
+
+ return result;
+}
+
+__device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample, Ray ray, float3 throughput)
+{
+ /* initialize */
+ float3 L = make_float3(0.0f, 0.0f, 0.0f);
+ float Ltransparent = 0.0f;
+
+#ifdef __EMISSION__
+ float ray_pdf = 0.0f;
+#endif
+ PathState state;
+ int rng_offset = PRNG_BASE_NUM;
+
+ path_state_init(&state);
+
+ /* path iteration */
+ for(;; rng_offset += PRNG_BOUNCE_NUM) {
+ /* intersect scene */
+ Intersection isect;
+ uint visibility = path_state_ray_visibility(&state);
+
+ if(!scene_intersect(kg, &ray, visibility, &isect)) {
+ /* eval background shader if nothing hit */
+ if(kernel_data.background.transparent && (state.flag & PATH_RAY_CAMERA)) {
+ Ltransparent += average(throughput);
+ }
+ else {
+#ifdef __BACKGROUND__
+ ShaderData sd;
+ shader_setup_from_background(kg, &sd, &ray);
+ L += throughput*shader_eval_background(kg, &sd, state.flag);
+ shader_release(kg, &sd);
+#else
+ L += throughput*make_float3(0.8f, 0.8f, 0.8f);
+#endif
+ }
+
+ break;
+ }
+
+ /* setup shading */
+ ShaderData sd;
+ shader_setup_from_ray(kg, &sd, &isect, &ray);
+ float rbsdf = path_rng(kg, rng, sample, rng_offset + PRNG_BSDF);
+ shader_eval_surface(kg, &sd, rbsdf, state.flag);
+
+#ifdef __HOLDOUT__
+ if((sd.flag & SD_HOLDOUT) && (state.flag & PATH_RAY_CAMERA)) {
+ float3 holdout_weight = shader_holdout_eval(kg, &sd);
+
+ if(kernel_data.background.transparent)
+ Ltransparent += average(holdout_weight*throughput);
+ }
+#endif
+
+#ifdef __EMISSION__
+ /* emission */
+ if(sd.flag & SD_EMISSION)
+ L += throughput*indirect_emission(kg, &sd, isect.t, state.flag, ray_pdf);
+#endif
+
+ /* path termination. this is a strange place to put the termination, it's
+ mainly due to the mixed in MIS that we use. gives too many unneeded
+ shader evaluations, only need emission if we are going to terminate */
+ float probability = path_state_terminate_probability(kg, &state, throughput);
+ float terminate = path_rng(kg, rng, sample, rng_offset + PRNG_TERMINATE);
+
+ if(terminate >= probability)
+ break;
+
+ throughput /= probability;
+
+#ifdef __EMISSION__
+ if(kernel_data.integrator.use_direct_light) {
+ /* sample illumination from lights to find path contribution */
+ if(sd.flag & SD_BSDF_HAS_EVAL) {
+ float light_t = path_rng(kg, rng, sample, rng_offset + PRNG_LIGHT);
+ float light_o = path_rng(kg, rng, sample, rng_offset + PRNG_LIGHT_F);
+ float light_u = path_rng(kg, rng, sample, rng_offset + PRNG_LIGHT_U);
+ float light_v = path_rng(kg, rng, sample, rng_offset + PRNG_LIGHT_V);
+
+ Ray light_ray;
+ float3 light_L;
+
+#ifdef __MULTI_LIGHT__
+ /* index -1 means randomly sample from distribution */
+ int i = (kernel_data.integrator.num_distribution)? -1: 0;
+
+ for(; i < kernel_data.integrator.num_all_lights; i++) {
+#else
+ const int i = -1;
+#endif
+ if(direct_emission(kg, &sd, i, light_t, light_o, light_u, light_v, &light_ray, &light_L)) {
+ /* trace shadow ray */
+ if(!shadow_blocked(kg, &state, &light_ray, &isect, &light_L))
+ L += throughput*light_L;
+ }
+#ifdef __MULTI_LIGHT__
+ }
+#endif
+ }
+ }
+#endif
+
+ /* no BSDF? we can stop here */
+ if(!(sd.flag & SD_BSDF))
+ break;
+
+ /* sample BSDF */
+ float bsdf_pdf;
+ float3 bsdf_eval;
+ float3 bsdf_omega_in;
+ differential3 bsdf_domega_in;
+ float bsdf_u = path_rng(kg, rng, sample, rng_offset + PRNG_BSDF_U);
+ float bsdf_v = path_rng(kg, rng, sample, rng_offset + PRNG_BSDF_V);
+ int label;
+
+ label = shader_bsdf_sample(kg, &sd, bsdf_u, bsdf_v, &bsdf_eval,
+ &bsdf_omega_in, &bsdf_domega_in, &bsdf_pdf);
+
+ shader_release(kg, &sd);
+
+ if(bsdf_pdf == 0.0f || is_zero(bsdf_eval))
+ break;
+
+ /* modify throughput */
+ throughput *= bsdf_eval/bsdf_pdf;
+
+ /* set labels */
+#ifdef __EMISSION__
+ ray_pdf = bsdf_pdf;
+#endif
+
+ /* update path state */
+ path_state_next(kg, &state, label);
+
+ /* setup ray */
+ ray.P = ray_offset(sd.P, (label & LABEL_TRANSMIT)? -sd.Ng: sd.Ng);
+ ray.D = bsdf_omega_in;
+ ray.t = FLT_MAX;
+#ifdef __RAY_DIFFERENTIALS__
+ ray.dP = sd.dP;
+ ray.dD = bsdf_domega_in;
+#endif
+ }
+
+ 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)
+{
+ /* initialize random numbers */
+ RNG rng;
+
+ float filter_u;
+ float filter_v;
+
+ path_rng_init(kg, rng_state, sample, &rng, x, y, &filter_u, &filter_v);
+
+ /* sample camera ray */
+ Ray ray;
+
+ float lens_u = path_rng(kg, &rng, sample, PRNG_LENS_U);
+ float lens_v = path_rng(kg, &rng, sample, PRNG_LENS_V);
+
+ camera_sample(kg, x, y, filter_u, filter_v, lens_u, lens_v, &ray);
+
+ /* integrate */
+#ifdef __MODIFY_TP__
+ float3 throughput = path_terminate_modified_throughput(kg, buffer, x, y, sample);
+ float4 L = kernel_path_integrate(kg, &rng, sample, ray, throughput)/throughput;
+#else
+ float3 throughput = make_float3(1.0f, 1.0f, 1.0f);
+ float4 L = kernel_path_integrate(kg, &rng, sample, ray, throughput);
+#endif
+
+ /* accumulate result in output buffer */
+ int index = x + y*kernel_data.cam.width;
+
+ if(sample == 0)
+ buffer[index] = L;
+ else
+ buffer[index] += L;
+
+ path_rng_end(kg, rng_state, rng, x, y);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_qbvh.h b/intern/cycles/kernel/kernel_qbvh.h
new file mode 100644
index 00000000000..96e68d797dd
--- /dev/null
+++ b/intern/cycles/kernel/kernel_qbvh.h
@@ -0,0 +1,413 @@
+/*
+ * Adapted from code Copyright 2009-2010 NVIDIA Corporation
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+CCL_NAMESPACE_BEGIN
+
+/*
+ * "Persistent while-while kernel" used in:
+ *
+ * "Understanding the Efficiency of Ray Traversal on GPUs",
+ * Timo Aila and Samuli Laine,
+ * Proc. High-Performance Graphics 2009
+ */
+
+/* bottom-most stack entry, indicating the end of traversal */
+
+#define ENTRYPOINT_SENTINEL 0x76543210
+/* 64 object BVH + 64 mesh BVH + 64 object node splitting */
+#define QBVH_STACK_SIZE 192
+#define QBVH_NODE_SIZE 8
+#define TRI_NODE_SIZE 3
+
+__device_inline float3 qbvh_inverse_direction(float3 dir)
+{
+ // Avoid divide by zero (ooeps = exp2f(-80.0f))
+ float ooeps = 0.00000000000000000000000082718061255302767487140869206996285356581211090087890625f;
+ float3 idir;
+
+ idir.x = 1.0f/((fabsf(dir.x) > ooeps)? dir.x: copysignf(ooeps, dir.x));
+ idir.y = 1.0f/((fabsf(dir.y) > ooeps)? dir.y: copysignf(ooeps, dir.y));
+ idir.z = 1.0f/((fabsf(dir.z) > ooeps)? dir.z: copysignf(ooeps, dir.z));
+
+ return idir;
+}
+
+__device_inline void qbvh_instance_push(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, const float tmax)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
+
+ *P = transform(&tfm, ray->P);
+
+ float3 dir = transform_direction(&tfm, ray->D);
+
+ float len;
+ dir = normalize_len(dir, &len);
+
+ *idir = qbvh_inverse_direction(dir);
+
+ if(*t != FLT_MAX)
+ *t *= len;
+}
+
+__device_inline void qbvh_instance_pop(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, const float tmax)
+{
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+
+ if(*t != FLT_MAX)
+ *t *= len(transform_direction(&tfm, 1.0f/(*idir)));
+
+ *P = ray->P;
+ *idir = qbvh_inverse_direction(ray->D);
+}
+
+#ifdef __KERNEL_CPU__
+
+__device_inline void qbvh_node_intersect(KernelGlobals *kg, int *traverseChild,
+ int nodeAddrChild[4], float3 P, float3 idir, float t, int nodeAddr)
+{
+ /* X axis */
+ const __m128 bminx = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+0);
+ const __m128 t0x = _mm_mul_ps(_mm_sub_ps(bminx, _mm_set_ps1(P.x)), _mm_set_ps1(idir.x));
+ const __m128 bmaxx = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+1);
+ const __m128 t1x = _mm_mul_ps(_mm_sub_ps(bmaxx, _mm_set_ps1(P.x)), _mm_set_ps1(idir.x));
+
+ __m128 tmin = _mm_max_ps(_mm_min_ps(t0x, t1x), _mm_setzero_ps());
+ __m128 tmax = _mm_min_ps(_mm_max_ps(t0x, t1x), _mm_set_ps1(t));
+
+ /* Y axis */
+ const __m128 bminy = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+2);
+ const __m128 t0y = _mm_mul_ps(_mm_sub_ps(bminy, _mm_set_ps1(P.y)), _mm_set_ps1(idir.y));
+ const __m128 bmaxy = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+3);
+ const __m128 t1y = _mm_mul_ps(_mm_sub_ps(bmaxy, _mm_set_ps1(P.y)), _mm_set_ps1(idir.y));
+
+ tmin = _mm_max_ps(_mm_min_ps(t0y, t1y), tmin);
+ tmax = _mm_min_ps(_mm_max_ps(t0y, t1y), tmax);
+
+ /* Z axis */
+ const __m128 bminz = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+4);
+ const __m128 t0z = _mm_mul_ps(_mm_sub_ps(bminz, _mm_set_ps1(P.z)), _mm_set_ps1(idir.z));
+ const __m128 bmaxz = kernel_tex_fetch_m128(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+5);
+ const __m128 t1z = _mm_mul_ps(_mm_sub_ps(bmaxz, _mm_set_ps1(P.z)), _mm_set_ps1(idir.z));
+
+ tmin = _mm_max_ps(_mm_min_ps(t0z, t1z), tmin);
+ tmax = _mm_min_ps(_mm_max_ps(t0z, t1z), tmax);
+
+ /* compare and get mask */
+ *traverseChild = _mm_movemask_ps(_mm_cmple_ps(tmin, tmax));
+
+ /* get node addresses */
+ float4 cnodes = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+6);
+
+ nodeAddrChild[0] = __float_as_int(cnodes.x);
+ nodeAddrChild[1] = __float_as_int(cnodes.y);
+ nodeAddrChild[2] = __float_as_int(cnodes.z);
+ nodeAddrChild[3] = __float_as_int(cnodes.w);
+}
+
+#else
+
+__device_inline bool qbvh_bb_intersect(float3 bmin, float3 bmax, float3 P, float3 idir, float t)
+{
+ float t0x = (bmin.x - P.x)*idir.x;
+ float t1x = (bmax.x - P.x)*idir.x;
+ float t0y = (bmin.y - P.y)*idir.y;
+ float t1y = (bmax.y - P.y)*idir.y;
+ float t0z = (bmin.z - P.z)*idir.z;
+ float t1z = (bmax.z - P.z)*idir.z;
+
+ float minx = min(t0x, t1x);
+ float maxx = max(t0x, t1x);
+ float miny = min(t0y, t1y);
+ float maxy = max(t0y, t1y);
+ float minz = min(t0z, t1z);
+ float maxz = max(t0z, t1z);
+
+ float tmin = max4(0.0f, minx, miny, minz);
+ float tmax = min4(t, maxx, maxy, maxz);
+
+ return (tmin <= tmax);
+}
+
+/* intersect four bounding boxes */
+__device_inline void qbvh_node_intersect(KernelGlobals *kg, int *traverseChild,
+ int nodeAddrChild[4], float3 P, float3 idir, float t, int nodeAddr)
+{
+ /* fetch node data */
+ float4 minx = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+0);
+ float4 miny = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+2);
+ float4 minz = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+4);
+ float4 maxx = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+1);
+ float4 maxy = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+3);
+ float4 maxz = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+5);
+
+ /* intersect bounding boxes */
+ bool traverseChild0 = qbvh_bb_intersect(make_float3(minx.x, miny.x, minz.x), make_float3(maxx.x, maxy.x, maxz.x), P, idir, t);
+ bool traverseChild1 = qbvh_bb_intersect(make_float3(minx.y, miny.y, minz.y), make_float3(maxx.y, maxy.y, maxz.y), P, idir, t);
+ bool traverseChild2 = qbvh_bb_intersect(make_float3(minx.z, miny.z, minz.z), make_float3(maxx.z, maxy.z, maxz.z), P, idir, t);
+ bool traverseChild3 = qbvh_bb_intersect(make_float3(minx.w, miny.w, minz.w), make_float3(maxx.w, maxy.w, maxz.w), P, idir, t);
+
+ *traverseChild = 0;
+ if(traverseChild0) *traverseChild |= 1;
+ if(traverseChild1) *traverseChild |= 2;
+ if(traverseChild2) *traverseChild |= 4;
+ if(traverseChild3) *traverseChild |= 8;
+
+ /* get node addresses */
+ float4 cnodes = kernel_tex_fetch(__bvh_nodes, nodeAddr*QBVH_NODE_SIZE+6);
+
+ nodeAddrChild[0] = __float_as_int(cnodes.x);
+ nodeAddrChild[1] = __float_as_int(cnodes.y);
+ nodeAddrChild[2] = __float_as_int(cnodes.z);
+ nodeAddrChild[3] = __float_as_int(cnodes.w);
+}
+
+#endif
+
+/* Sven Woop's algorithm */
+__device_inline void qbvh_triangle_intersect(KernelGlobals *kg, Intersection *isect, float3 P, float3 idir, int object, int triAddr)
+{
+ /* compute and check intersection t-value */
+ float4 v00 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0);
+ float4 v11 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+1);
+ float3 dir = 1.0f/idir;
+
+ float Oz = v00.w - P.x*v00.x - P.y*v00.y - P.z*v00.z;
+ float invDz = 1.0f/(dir.x*v00.x + dir.y*v00.y + dir.z*v00.z);
+ float t = Oz * invDz;
+
+ if(t > 0.0f && t < isect->t) {
+ /* compute and check barycentric u */
+ float Ox = v11.w + P.x*v11.x + P.y*v11.y + P.z*v11.z;
+ float Dx = dir.x*v11.x + dir.y*v11.y + dir.z*v11.z;
+ float u = Ox + t*Dx;
+
+ if(u >= 0.0f) {
+ /* compute and check barycentric v */
+ float4 v22 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+2);
+ float Oy = v22.w + P.x*v22.x + P.y*v22.y + P.z*v22.z;
+ float Dy = dir.x*v22.x + dir.y*v22.y + dir.z*v22.z;
+ float v = Oy + t*Dy;
+
+ if(v >= 0.0f && u + v <= 1.0f) {
+ /* record intersection */
+ isect->prim = triAddr;
+ isect->object = object;
+ isect->u = u;
+ isect->v = v;
+ isect->t = t;
+ }
+ }
+ }
+}
+
+__device_inline bool scene_intersect(KernelGlobals *kg, const Ray *ray, const bool isshadowray, Intersection *isect)
+{
+ /* traversal stack in CUDA thread-local memory */
+ int traversalStack[QBVH_STACK_SIZE];
+ traversalStack[0] = ENTRYPOINT_SENTINEL;
+
+ /* traversal variables in registers */
+ int stackPtr = 0;
+ int nodeAddr = kernel_data.bvh.root;
+
+ /* ray parameters in registers */
+ const float tmax = ray->t;
+ float3 P = ray->P;
+ float3 idir = qbvh_inverse_direction(ray->D);
+ int object = ~0;
+
+ isect->t = tmax;
+ isect->object = ~0;
+ isect->prim = ~0;
+ isect->u = 0.0f;
+ isect->v = 0.0f;
+
+ /* traversal loop */
+ do {
+ do
+ {
+ /* traverse internal nodes */
+ while(nodeAddr >= 0 && nodeAddr != ENTRYPOINT_SENTINEL)
+ {
+ int traverseChild, nodeAddrChild[4];
+
+ qbvh_node_intersect(kg, &traverseChild, nodeAddrChild,
+ P, idir, isect->t, nodeAddr);
+
+ if(traverseChild & 1) {
+ ++stackPtr;
+ traversalStack[stackPtr] = nodeAddrChild[0];
+ }
+
+ if(traverseChild & 2) {
+ ++stackPtr;
+ traversalStack[stackPtr] = nodeAddrChild[1];
+ }
+ if(traverseChild & 4) {
+ ++stackPtr;
+ traversalStack[stackPtr] = nodeAddrChild[2];
+ }
+
+ if(traverseChild & 8) {
+ ++stackPtr;
+ traversalStack[stackPtr] = nodeAddrChild[3];
+ }
+
+ nodeAddr = traversalStack[stackPtr];
+ --stackPtr;
+ }
+
+ /* if node is leaf, fetch triangle list */
+ if(nodeAddr < 0) {
+ float4 leaf = kernel_tex_fetch(__bvh_nodes, (-nodeAddr-1)*QBVH_NODE_SIZE+(QBVH_NODE_SIZE-2));
+ int primAddr = __float_as_int(leaf.x);
+
+#ifdef __INSTANCING__
+ if(primAddr >= 0) {
+#endif
+ int primAddr2 = __float_as_int(leaf.y);
+
+ /* pop */
+ nodeAddr = traversalStack[stackPtr];
+ --stackPtr;
+
+ /* triangle intersection */
+ while(primAddr < primAddr2) {
+ /* intersect ray against triangle */
+ qbvh_triangle_intersect(kg, isect, P, idir, object, primAddr);
+
+ /* shadow ray early termination */
+ if(isshadowray && isect->prim != ~0)
+ return true;
+
+ primAddr++;
+ }
+#ifdef __INSTANCING__
+ }
+ else {
+ /* instance push */
+ object = kernel_tex_fetch(__prim_object, -primAddr-1);
+
+ qbvh_instance_push(kg, object, ray, &P, &idir, &isect->t, tmax);
+
+ ++stackPtr;
+ traversalStack[stackPtr] = ENTRYPOINT_SENTINEL;
+
+ nodeAddr = kernel_tex_fetch(__object_node, object);
+ }
+#endif
+ }
+ } while(nodeAddr != ENTRYPOINT_SENTINEL);
+
+#ifdef __INSTANCING__
+ if(stackPtr >= 0) {
+ kernel_assert(object != ~0);
+
+ /* instance pop */
+ qbvh_instance_pop(kg, object, ray, &P, &idir, &isect->t, tmax);
+ object = ~0;
+ nodeAddr = traversalStack[stackPtr];
+ --stackPtr;
+ }
+#endif
+ } while(nodeAddr != ENTRYPOINT_SENTINEL);
+
+ return (isect->prim != ~0);
+}
+
+__device_inline float3 ray_offset(float3 P, float3 Ng)
+{
+#ifdef __INTERSECTION_REFINE__
+ const float epsilon_f = 1e-5f;
+ const int epsilon_i = 32;
+
+ float3 res;
+
+ /* x component */
+ if(fabsf(P.x) < epsilon_f) {
+ res.x = P.x + Ng.x*epsilon_f;
+ }
+ else {
+ uint ix = __float_as_uint(P.x);
+ ix += ((ix ^ __float_as_uint(Ng.x)) >> 31)? -epsilon_i: epsilon_i;
+ res.x = __uint_as_float(ix);
+ }
+
+ /* y component */
+ if(fabsf(P.y) < epsilon_f) {
+ res.y = P.y + Ng.y*epsilon_f;
+ }
+ else {
+ uint iy = __float_as_uint(P.y);
+ iy += ((iy ^ __float_as_uint(Ng.y)) >> 31)? -epsilon_i: epsilon_i;
+ res.y = __uint_as_float(iy);
+ }
+
+ /* z component */
+ if(fabsf(P.z) < epsilon_f) {
+ res.z = P.z + Ng.z*epsilon_f;
+ }
+ else {
+ uint iz = __float_as_uint(P.z);
+ iz += ((iz ^ __float_as_uint(Ng.z)) >> 31)? -epsilon_i: epsilon_i;
+ res.z = __uint_as_float(iz);
+ }
+
+ return res;
+#else
+ const float epsilon_f = 1e-4f;
+ return P + epsilon_f*Ng;
+#endif
+}
+
+__device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection *isect, const Ray *ray)
+{
+ float3 P = ray->P;
+ float3 D = ray->D;
+ float t = isect->t;
+
+#ifdef __INTERSECTION_REFINE__
+ if(isect->object != ~0) {
+ Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
+
+ P = transform(&tfm, P);
+ D = transform_direction(&tfm, D*t);
+ D = normalize_len(D, &t);
+ }
+
+ P = P + D*t;
+
+ float4 v00 = kernel_tex_fetch(__tri_woop, isect->prim*TRI_NODE_SIZE+0);
+ float Oz = v00.w - P.x*v00.x - P.y*v00.y - P.z*v00.z;
+ float invDz = 1.0f/(D.x*v00.x + D.y*v00.y + D.z*v00.z);
+ float rt = Oz * invDz;
+
+ P = P + D*rt;
+
+ if(isect->object != ~0) {
+ Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
+ P = transform(&tfm, P);
+ }
+
+ return P;
+#else
+ return P + D*t;
+#endif
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_random.h b/intern/cycles/kernel/kernel_random.h
new file mode 100644
index 00000000000..ba97ab3e3b6
--- /dev/null
+++ b/intern/cycles/kernel/kernel_random.h
@@ -0,0 +1,186 @@
+/*
+ * 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
+
+typedef uint RNG;
+
+#ifdef __SOBOL__
+
+/* skip initial numbers that are not as well distributed, especially the
+ first sequence is just 0 everywhere, which can be problematic for e.g.
+ path termination */
+#define SOBOL_SKIP 64
+
+/* High Dimensional Sobol */
+
+/* van der corput radical inverse */
+__device uint van_der_corput(uint bits)
+{
+ bits = (bits << 16) | (bits >> 16);
+ bits = ((bits & 0x00ff00ff) << 8) | ((bits & 0xff00ff00) >> 8);
+ bits = ((bits & 0x0f0f0f0f) << 4) | ((bits & 0xf0f0f0f0) >> 4);
+ bits = ((bits & 0x33333333) << 2) | ((bits & 0xcccccccc) >> 2);
+ bits = ((bits & 0x55555555) << 1) | ((bits & 0xaaaaaaaa) >> 1);
+ return bits;
+}
+
+/* sobol radical inverse */
+__device uint sobol(uint i)
+{
+ uint r = 0;
+
+ for(uint v = 1U << 31; i; i >>= 1, v ^= v >> 1)
+ if(i & 1)
+ r ^= v;
+
+ return r;
+}
+
+/* inverse of sobol radical inverse */
+__device uint sobol_inverse(uint i)
+{
+ const uint msb = 1U << 31;
+ uint r = 0;
+
+ for(uint v = 1; i; i <<= 1, v ^= v << 1)
+ if(i & msb)
+ r ^= v;
+
+ return r;
+}
+
+/* multidimensional sobol with generator matrices
+ dimension 0 and 1 are equal to van_der_corput() and sobol() respectively */
+__device uint sobol_dimension(KernelGlobals *kg, int index, int dimension)
+{
+ uint result = 0;
+ uint i = index;
+
+ for(uint j = 0; i; i >>= 1, j++)
+ if(i & 1)
+ result ^= kernel_tex_fetch(__sobol_directions, 32*dimension + j);
+
+ return result;
+}
+
+/* lookup index and x/y coordinate, assumes m is a power of two */
+__device uint sobol_lookup(const uint m, const uint frame, const uint ex, const uint ey, uint *x, uint *y)
+{
+ /* shift is constant per frame */
+ const uint shift = frame << (m << 1);
+ const uint sobol_shift = sobol(shift);
+ /* van der Corput is its own inverse */
+ const uint lower = van_der_corput(ex << (32 - m));
+ /* need to compensate for ey difference and shift */
+ const uint sobol_lower = sobol(lower);
+ const uint mask = ~-(1 << m) << (32 - m); /* only m upper bits */
+ const uint delta = ((ey << (32 - m)) ^ sobol_lower ^ sobol_shift) & mask;
+ /* only use m upper bits for the index (m is a power of two) */
+ const uint sobol_result = delta | (delta >> m);
+ const uint upper = sobol_inverse(sobol_result);
+ const uint index = shift | upper | lower;
+ *x = van_der_corput(index);
+ *y = sobol_shift ^ sobol_result ^ sobol_lower;
+ return index;
+}
+
+__device_inline float path_rng(KernelGlobals *kg, RNG *rng, int sample, int dimension)
+{
+#ifdef __SOBOL_FULL_SCREEN__
+ uint result = sobol_dimension(kg, *rng, dimension);
+ float r = (float)result * (1.0f/(float)0xFFFFFFFF);
+ return r;
+#else
+ /* compute sobol sequence value using direction vectors */
+ uint result = sobol_dimension(kg, sample + SOBOL_SKIP, dimension);
+ float r = (float)result * (1.0f/(float)0xFFFFFFFF);
+
+ /* Cranly-Patterson rotation using rng seed */
+ float shift;
+
+ if(dimension & 1)
+ shift = (*rng >> 16)/((float)0xFFFF);
+ else
+ shift = (*rng & 0xFFFF)/((float)0xFFFF);
+
+ return r + shift - floor(r + shift);
+#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)
+{
+#ifdef __SOBOL_FULL_SCREEN__
+ uint px, py;
+ uint bits = 16; /* limits us to 65536x65536 and 65536 samples */
+ uint size = 1 << bits;
+ uint frame = sample;
+
+ *rng = sobol_lookup(bits, frame, x, y, &px, &py);
+
+ *rng ^= kernel_data.integrator.seed;
+
+ *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 ^= kernel_data.integrator.seed;
+
+ *fx = path_rng(kg, rng, sample, PRNG_FILTER_U);
+ *fy = path_rng(kg, rng, sample, PRNG_FILTER_V);
+#endif
+}
+
+__device void path_rng_end(KernelGlobals *kg, __global uint *rng_state, RNG rng, int x, int y)
+{
+ /* nothing to do */
+}
+
+#else
+
+/* Linear Congruential Generator */
+
+__device float path_rng(KernelGlobals *kg, RNG *rng, int sample, int dimension)
+{
+ /* implicit mod 2^32 */
+ *rng = (1103515245*(*rng) + 12345);
+ 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)
+{
+ /* load state */
+ *rng = rng_state[x + y*kernel_data.cam.width];
+
+ *rng ^= kernel_data.integrator.seed;
+
+ *fx = path_rng(kg, rng, sample, PRNG_FILTER_U);
+ *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)
+{
+ /* store state for next sample */
+ rng_state[x + y*kernel_data.cam.width] = rng;
+}
+
+#endif
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
new file mode 100644
index 00000000000..ac0df71c38f
--- /dev/null
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -0,0 +1,608 @@
+/*
+ * 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.
+ */
+
+/*
+ * ShaderData, used in four steps:
+ *
+ * Setup from incoming ray, sampled position and background.
+ * Execute for surface, volume or displacement.
+ * Evaluate one or more closures.
+ * Release.
+ *
+ */
+
+
+#ifdef __OSL__
+
+#include "osl_shader.h"
+
+#else
+
+#include "svm/bsdf.h"
+#include "svm/emissive.h"
+#include "svm/volume.h"
+#include "svm/svm_bsdf.h"
+#include "svm/svm.h"
+
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+/* ShaderData setup from incoming ray */
+
+__device_inline void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
+ const Intersection *isect, const Ray *ray)
+{
+ /* fetch triangle data */
+ int prim = kernel_tex_fetch(__prim_index, isect->prim);
+ float4 Ns = kernel_tex_fetch(__tri_normal, prim);
+ float3 Ng = make_float3(Ns.x, Ns.y, Ns.z);
+ int shader = __float_as_int(Ns.w);
+
+ /* vectors */
+ sd->P = bvh_triangle_refine(kg, isect, ray);
+ sd->Ng = Ng;
+ sd->N = Ng;
+ sd->I = -ray->D;
+ sd->shader = shader;
+
+ /* triangle */
+#ifdef __INSTANCING__
+ sd->object = isect->object;
+#endif
+ sd->prim = prim;
+#ifdef __UV__
+ sd->u = isect->u;
+ sd->v = isect->v;
+#endif
+
+ /* smooth normal */
+ if(sd->shader & SHADER_SMOOTH_NORMAL)
+ sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
+
+ sd->flag = kernel_tex_fetch(__shader_flag, sd->shader & SHADER_MASK);
+
+#ifdef __DPDU__
+ /* dPdu/dPdv */
+ triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
+#endif
+
+#ifdef __INSTANCING__
+ if(sd->object != ~0) {
+ /* instance transform */
+ object_normal_transform(kg, sd->object, &sd->N);
+ object_normal_transform(kg, sd->object, &sd->Ng);
+#ifdef __DPDU__
+ object_dir_transform(kg, sd->object, &sd->dPdu);
+ object_dir_transform(kg, sd->object, &sd->dPdv);
+#endif
+ }
+ else {
+ /* non-instanced object index */
+ sd->object = kernel_tex_fetch(__prim_object, isect->prim);
+ }
+#endif
+
+ /* backfacing test */
+ bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
+
+ if(backfacing) {
+ sd->flag |= SD_BACKFACING;
+ sd->Ng = -sd->Ng;
+ sd->N = -sd->N;
+#ifdef __DPDU__
+ sd->dPdu = -sd->dPdu;
+ sd->dPdv = -sd->dPdv;
+#endif
+ }
+
+#ifdef __RAY_DIFFERENTIALS__
+ /* differentials */
+ differential_transfer(&sd->dP, ray->dP, ray->D, ray->dD, sd->Ng, isect->t);
+ differential_incoming(&sd->dI, ray->dD);
+ differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
+#endif
+}
+
+/* ShaderData setup from position sampled on mesh */
+
+__device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
+ const float3 P, const float3 Ng, const float3 I,
+ int shader, int object, int prim, float u, float v)
+{
+ /* vectors */
+ sd->P = P;
+ sd->N = Ng;
+ sd->Ng = Ng;
+ sd->I = I;
+ sd->shader = shader;
+
+ /* primitive */
+#ifdef __INSTANCING__
+ sd->object = object;
+#endif
+ sd->prim = prim;
+#ifdef __UV__
+ sd->u = u;
+ sd->v = v;
+#endif
+
+ /* detect instancing, for non-instanced the object index is -object-1 */
+#ifdef __INSTANCING__
+ bool instanced = false;
+
+ if(sd->prim != ~0) {
+ if(sd->object >= 0)
+ instanced = true;
+ else
+#endif
+ sd->object = -sd->object-1;
+#ifdef __INSTANCING__
+ }
+#endif
+
+ /* smooth normal */
+ if(sd->shader & SHADER_SMOOTH_NORMAL) {
+ sd->N = triangle_smooth_normal(kg, sd->prim, sd->u, sd->v);
+
+#ifdef __INSTANCING__
+ if(instanced)
+ object_normal_transform(kg, sd->object, &sd->N);
+#endif
+ }
+
+ sd->flag = kernel_tex_fetch(__shader_flag, sd->shader & SHADER_MASK);
+
+#ifdef __DPDU__
+ /* dPdu/dPdv */
+ if(sd->prim == ~0) {
+ sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
+ sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
+ }
+ else {
+ triangle_dPdudv(kg, &sd->dPdu, &sd->dPdv, sd->prim);
+
+#ifdef __INSTANCING__
+ if(instanced) {
+ object_dir_transform(kg, sd->object, &sd->dPdu);
+ object_dir_transform(kg, sd->object, &sd->dPdv);
+ }
+#endif
+ }
+#endif
+
+ /* backfacing test */
+ if(sd->prim != ~0) {
+ bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
+
+ if(backfacing) {
+ sd->flag |= SD_BACKFACING;
+ sd->Ng = -sd->Ng;
+ sd->N = -sd->N;
+#ifdef __DPDU__
+ sd->dPdu = -sd->dPdu;
+ sd->dPdv = -sd->dPdv;
+#endif
+ }
+ }
+
+#ifdef __RAY_DIFFERENTIALS__
+ /* no ray differentials here yet */
+ sd->dP.dx = make_float3(0.0f, 0.0f, 0.0f);
+ sd->dP.dy = make_float3(0.0f, 0.0f, 0.0f);
+ sd->dI.dx = make_float3(0.0f, 0.0f, 0.0f);
+ sd->dI.dy = make_float3(0.0f, 0.0f, 0.0f);
+ sd->du.dx = 0.0f;
+ sd->du.dy = 0.0f;
+ sd->dv.dx = 0.0f;
+ sd->dv.dy = 0.0f;
+#endif
+}
+
+/* ShaderData setup for displacement */
+
+__device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd,
+ int object, int prim, float u, float v)
+{
+ float3 P, Ng, I = make_float3(0.0f, 0.0f, 0.0f);
+ int shader;
+
+ P = triangle_point_MT(kg, prim, u, v);
+ Ng = triangle_normal_MT(kg, prim, &shader);
+
+ /* force smooth shading for displacement */
+ if(shader >= 0)
+ shader = -shader;
+
+ /* watch out: no instance transform currently */
+
+ shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v);
+}
+
+/* ShaderData setup from ray into background */
+
+__device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray)
+{
+ /* vectors */
+ sd->P = ray->D;
+ sd->N = -sd->P;
+ sd->Ng = -sd->P;
+ sd->I = -sd->P;
+ sd->shader = kernel_data.background.shader;
+ sd->flag = kernel_tex_fetch(__shader_flag, sd->shader & SHADER_MASK);
+
+#ifdef __INSTANCING__
+ sd->object = ~0;
+#endif
+ sd->prim = ~0;
+#ifdef __UV__
+ sd->u = 0.0f;
+ sd->v = 0.0f;
+#endif
+
+#ifdef __DPDU__
+ /* dPdu/dPdv */
+ sd->dPdu = make_float3(0.0f, 0.0f, 0.0f);
+ sd->dPdv = make_float3(0.0f, 0.0f, 0.0f);
+#endif
+
+#ifdef __RAY_DIFFERENTIALS__
+ /* differentials */
+ sd->dP = ray->dD;
+ differential_incoming(&sd->dI, sd->dP);
+ sd->du.dx = 0.0f;
+ sd->du.dy = 0.0f;
+ sd->dv.dx = 0.0f;
+ sd->dv.dy = 0.0f;
+#endif
+}
+
+/* BSDF */
+
+#ifdef __MULTI_CLOSURE__
+
+__device_inline float3 _shader_bsdf_multi_eval(const ShaderData *sd, const float3 omega_in, float *pdf,
+ int skip_bsdf, float3 sum_eval, float sum_pdf, float sum_sample_weight)
+{
+ for(int i = 0; i< sd->num_closure; i++) {
+ if(i == skip_bsdf)
+ continue;
+
+ const ShaderClosure *sc = &sd->closure[i];
+
+ if(CLOSURE_IS_BSDF(sc->type)) {
+ float bsdf_pdf = 0.0f;
+#ifdef __OSL__
+ float3 eval = OSLShader::bsdf_eval(sd, sc, omega_in, bsdf_pdf);
+#else
+ float3 eval = svm_bsdf_eval(sd, sc, omega_in, &bsdf_pdf);
+#endif
+
+ if(bsdf_pdf != 0.0f) {
+ sum_eval += eval*sc->weight;
+ sum_pdf += bsdf_pdf*sc->sample_weight;
+ }
+
+ sum_sample_weight += sc->sample_weight;
+ }
+ }
+
+ *pdf = sum_pdf/sum_sample_weight;
+ return sum_eval;
+}
+
+#endif
+
+__device float3 shader_bsdf_eval(KernelGlobals *kg, const ShaderData *sd,
+ const float3 omega_in, float *pdf)
+{
+#ifdef __MULTI_CLOSURE__
+ return _shader_bsdf_multi_eval(sd, omega_in, pdf, -1, make_float3(0.0f, 0.0f, 0.0f), 0.0f, 0.0f);
+#else
+ const ShaderClosure *sc = &sd->closure;
+ *pdf = 0.0f;
+ return svm_bsdf_eval(sd, sc, omega_in, pdf)*sc->weight;
+#endif
+}
+
+__device int shader_bsdf_sample(KernelGlobals *kg, const ShaderData *sd,
+ float randu, float randv, float3 *eval,
+ float3 *omega_in, differential3 *domega_in, float *pdf)
+{
+#ifdef __MULTI_CLOSURE__
+ int sampled = 0;
+
+ if(sd->num_closure > 1) {
+ /* pick a BSDF closure based on sample weights */
+ float sum = 0.0f;
+
+ for(sampled = 0; sampled < sd->num_closure; sampled++) {
+ const ShaderClosure *sc = &sd->closure[sampled];
+
+ if(CLOSURE_IS_BSDF(sc->type))
+ sum += sc->sample_weight;
+ }
+
+ float r = sd->randb_closure*sum;
+ sum = 0.0f;
+
+ for(sampled = 0; sampled < sd->num_closure; sampled++) {
+ const ShaderClosure *sc = &sd->closure[sampled];
+
+ if(CLOSURE_IS_BSDF(sc->type)) {
+ sum += sd->closure[sampled].sample_weight;
+
+ if(r <= sum)
+ break;
+ }
+ }
+
+ if(sampled == sd->num_closure) {
+ *pdf = 0.0f;
+ return LABEL_NONE;
+ }
+ }
+
+ const ShaderClosure *sc = &sd->closure[sampled];
+ int label;
+
+ *pdf = 0.0f;
+#ifdef __OSL__
+ label = OSLShader::bsdf_sample(sd, sc, randu, randv, *eval, *omega_in, *domega_in, *pdf);
+#else
+ label = svm_bsdf_sample(sd, sc, randu, randv, eval, omega_in, domega_in, pdf);
+#endif
+
+ *eval *= sc->weight;
+
+ if(sd->num_closure > 1 && *pdf != 0.0f) {
+ float sweight = sc->sample_weight;
+ *eval = _shader_bsdf_multi_eval(sd, *omega_in, pdf, sampled, *eval, *pdf*sweight, sweight);
+ }
+
+ return label;
+#else
+ /* sample the single closure that we picked */
+ *pdf = 0.0f;
+ int label = svm_bsdf_sample(sd, &sd->closure, randu, randv, eval, omega_in, domega_in, pdf);
+ *eval *= sd->closure.weight;
+ return label;
+#endif
+}
+
+__device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughness)
+{
+#ifndef __OSL__
+#ifdef __MULTI_CLOSURE__
+ for(int i = 0; i< sd->num_closure; i++) {
+ ShaderClosure *sc = &sd->closure[i];
+
+ if(CLOSURE_IS_BSDF(sc->type))
+ svm_bsdf_blur(sc, roughness);
+ }
+#else
+ svm_bsdf_blur(&sd->closure, roughness);
+#endif
+#endif
+}
+
+__device float3 shader_bsdf_transparency(KernelGlobals *kg, ShaderData *sd)
+{
+#ifdef __MULTI_CLOSURE__
+ float3 eval = make_float3(0.0f, 0.0f, 0.0f);
+
+ for(int i = 0; i< sd->num_closure; i++) {
+ ShaderClosure *sc = &sd->closure[i];
+
+ if(sc->type == CLOSURE_BSDF_TRANSPARENT_ID) // todo: make this work for osl
+ eval += sc->weight;
+ }
+
+ return eval;
+#else
+ if(sd->closure.type == CLOSURE_BSDF_TRANSPARENT_ID)
+ return sd->closure.weight;
+ else
+ return make_float3(0.0f, 0.0f, 0.0f);
+#endif
+}
+
+
+/* Emission */
+
+__device float3 shader_emissive_eval(KernelGlobals *kg, ShaderData *sd)
+{
+ float3 eval;
+#ifdef __MULTI_CLOSURE__
+ eval = make_float3(0.0f, 0.0f, 0.0f);
+
+ for(int i = 0; i < sd->num_closure; i++) {
+ ShaderClosure *sc = &sd->closure[i];
+
+ if(CLOSURE_IS_EMISSION(sc->type)) {
+#ifdef __OSL__
+ eval += OSLShader::emissive_eval(sd)*sc->weight;
+#else
+ eval += svm_emissive_eval(sd, sc)*sc->weight;
+#endif
+ }
+ }
+#else
+ eval = svm_emissive_eval(sd, &sd->closure)*sd->closure.weight;
+#endif
+
+ return eval;
+}
+
+/* Holdout */
+
+__device float3 shader_holdout_eval(KernelGlobals *kg, ShaderData *sd)
+{
+#ifdef __MULTI_CLOSURE__
+ float3 weight = make_float3(0.0f, 0.0f, 0.0f);
+
+ for(int i = 0; i < sd->num_closure; i++) {
+ ShaderClosure *sc = &sd->closure[i];
+
+ if(CLOSURE_IS_HOLDOUT(sc->type))
+ weight += sc->weight;
+ }
+
+ return weight;
+#else
+ if(sd->closure.type == CLOSURE_HOLDOUT_ID)
+ return make_float3(1.0f, 1.0f, 1.0f);
+
+ return make_float3(0.0f, 0.0f, 0.0f);
+#endif
+}
+
+/* Surface Evaluation */
+
+__device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd,
+ float randb, int path_flag)
+{
+#ifdef __OSL__
+ OSLShader::eval_surface(kg, sd, randb, path_flag);
+#else
+
+#ifdef __SVM__
+ svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, randb, path_flag);
+#else
+ bsdf_diffuse_setup(sd, &sd->closure);
+ sd->closure.weight = make_float3(0.8f, 0.8f, 0.8f);
+#endif
+
+#endif
+}
+
+/* Background Evaluation */
+
+__device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag)
+{
+#ifdef __OSL__
+ return OSLShader::eval_background(kg, sd, path_flag);
+#else
+
+#ifdef __SVM__
+ svm_eval_nodes(kg, sd, SHADER_TYPE_SURFACE, 0.0f, path_flag);
+
+#ifdef __MULTI_CLOSURE__
+ float3 eval = make_float3(0.0f, 0.0f, 0.0f);
+
+ for(int i = 0; i< sd->num_closure; i++) {
+ const ShaderClosure *sc = &sd->closure[i];
+
+ if(CLOSURE_IS_BACKGROUND(sc->type))
+ eval += sc->weight;
+ }
+
+ return eval;
+#else
+ if(sd->closure.type == CLOSURE_BACKGROUND_ID)
+ return sd->closure.weight;
+ else
+ return make_float3(0.0f, 0.0f, 0.0f);
+#endif
+
+#else
+ return make_float3(0.8f, 0.8f, 0.8f);
+#endif
+
+#endif
+}
+
+/* Volume */
+
+__device float3 shader_volume_eval_phase(KernelGlobals *kg, ShaderData *sd,
+ float3 omega_in, float3 omega_out)
+{
+#ifdef __MULTI_CLOSURE__
+ float3 eval = make_float3(0.0f, 0.0f, 0.0f);
+
+ for(int i = 0; i< sd->num_closure; i++) {
+ const ShaderClosure *sc = &sd->closure[i];
+
+ if(CLOSURE_IS_VOLUME(sc->type)) {
+#ifdef __OSL__
+ eval += OSLShader::volume_eval_phase(sd, omega_in, omega_out);
+#else
+ eval += volume_eval_phase(sd, sc, omega_in, omega_out);
+#endif
+ }
+ }
+
+ return eval;
+#else
+ return volume_eval_phase(sd, &sd->closure, omega_in, omega_out);
+#endif
+}
+
+/* Volume Evaluation */
+
+__device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd,
+ float randb, int path_flag)
+{
+#ifdef __SVM__
+#ifdef __OSL__
+ OSLShader::eval_volume(kg, sd, randb, path_flag);
+#else
+ svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag);
+#endif
+#endif
+}
+
+/* Displacement Evaluation */
+
+__device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd)
+{
+ /* this will modify sd->P */
+#ifdef __SVM__
+#ifdef __OSL__
+ OSLShader::eval_displacement(kg, sd);
+#else
+ svm_eval_nodes(kg, sd, SHADER_TYPE_DISPLACEMENT, 0.0f, 0);
+#endif
+#endif
+}
+
+/* Transparent Shadows */
+
+#ifdef __TRANSPARENT_SHADOWS__
+__device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect)
+{
+ int prim = kernel_tex_fetch(__prim_index, isect->prim);
+ float4 Ns = kernel_tex_fetch(__tri_normal, prim);
+ int shader = __float_as_int(Ns.w);
+ int flag = kernel_tex_fetch(__shader_flag, shader & SHADER_MASK);
+
+ return (flag & SD_HAS_SURFACE_TRANSPARENT) != 0;
+}
+#endif
+
+/* Free ShaderData */
+
+__device void shader_release(KernelGlobals *kg, ShaderData *sd)
+{
+#ifdef __OSL__
+ OSLShader::release(kg, sd);
+#endif
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h
new file mode 100644
index 00000000000..2bfb1b3b88e
--- /dev/null
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -0,0 +1,152 @@
+
+#ifndef KERNEL_TEX
+#define KERNEL_TEX(type, ttype, name)
+#endif
+
+#ifndef KERNEL_IMAGE_TEX
+#define KERNEL_IMAGE_TEX(type, ttype, name)
+#endif
+
+
+/* bvh */
+KERNEL_TEX(float4, texture_float4, __bvh_nodes)
+KERNEL_TEX(float4, texture_float4, __tri_woop)
+KERNEL_TEX(uint, texture_uint, __prim_visibility)
+KERNEL_TEX(uint, texture_uint, __prim_index)
+KERNEL_TEX(uint, texture_uint, __prim_object)
+KERNEL_TEX(uint, texture_uint, __object_node)
+
+/* objects */
+KERNEL_TEX(float4, texture_float4, __objects)
+
+/* triangles */
+KERNEL_TEX(float4, texture_float4, __tri_normal)
+KERNEL_TEX(float4, texture_float4, __tri_vnormal)
+KERNEL_TEX(float4, texture_float4, __tri_vindex)
+KERNEL_TEX(float4, texture_float4, __tri_verts)
+
+/* attributes */
+KERNEL_TEX(uint4, texture_uint4, __attributes_map)
+KERNEL_TEX(float, texture_float, __attributes_float)
+KERNEL_TEX(float4, texture_float4, __attributes_float3)
+
+/* lights */
+KERNEL_TEX(float4, texture_float4, __light_distribution)
+KERNEL_TEX(float4, texture_float4, __light_data)
+
+/* shaders */
+KERNEL_TEX(uint4, texture_uint4, __svm_nodes)
+KERNEL_TEX(uint, texture_uint, __shader_flag)
+
+/* camera/film */
+KERNEL_TEX(float, texture_float, __filter_table)
+
+/* sobol */
+KERNEL_TEX(uint, texture_uint, __sobol_directions)
+
+/* image */
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_000)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_001)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_002)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_003)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_004)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_005)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_006)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_007)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_008)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_009)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_010)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_011)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_012)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_013)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_014)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_015)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_016)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_017)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_018)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_019)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_020)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_021)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_022)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_023)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_024)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_025)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_026)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_027)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_028)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_029)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_030)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_031)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_032)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_033)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_034)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_035)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_036)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_037)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_038)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_039)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_040)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_041)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_042)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_043)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_044)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_045)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_046)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_047)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_048)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_049)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_050)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_051)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_052)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_053)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_054)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_055)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_056)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_057)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_058)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_059)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_060)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_061)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_062)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_063)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_064)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_065)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_066)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_067)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_068)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_069)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_070)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_071)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_072)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_073)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_074)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_075)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_076)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_077)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_078)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_079)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_080)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_081)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_082)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_083)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_084)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_085)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_086)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_087)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_088)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_089)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_090)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_091)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_092)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_093)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_094)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_095)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_096)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_097)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_098)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_099)
+
+#undef KERNEL_TEX
+#undef KERNEL_IMAGE_TEX
+
+
diff --git a/intern/cycles/kernel/kernel_triangle.h b/intern/cycles/kernel/kernel_triangle.h
new file mode 100644
index 00000000000..7eaf54d14bf
--- /dev/null
+++ b/intern/cycles/kernel/kernel_triangle.h
@@ -0,0 +1,183 @@
+/*
+ * 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
+
+/* Point on triangle for Moller-Trumbore triangles */
+__device_inline float3 triangle_point_MT(KernelGlobals *kg, int tri_index, float u, float v)
+{
+ /* load triangle vertices */
+ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, tri_index));
+
+ float3 v0 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)));
+ float3 v1 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)));
+ float3 v2 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)));
+
+ /* compute point */
+ float t = 1.0f - u - v;
+ return (u*v0 + v*v1 + t*v2);
+}
+
+/* Sample point on triangle */
+__device_inline float3 triangle_sample_MT(KernelGlobals *kg, int tri_index, float randu, float randv)
+{
+ /* compute point */
+ randu = sqrtf(randu);
+
+ float u = 1.0f - randu;
+ float v = randv*randu;
+
+ return triangle_point_MT(kg, tri_index, u, v);
+}
+
+/* Normal for Moller-Trumbore triangles */
+__device_inline float3 triangle_normal_MT(KernelGlobals *kg, int tri_index, int *shader)
+{
+#if 0
+ /* load triangle vertices */
+ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, tri_index));
+
+ float3 v0 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)));
+ float3 v1 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)));
+ float3 v2 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)));
+
+ /* compute normal */
+ return normalize(cross(v2 - v0, v1 - v0));
+#else
+ float4 Nm = kernel_tex_fetch(__tri_normal, tri_index);
+ *shader = __float_as_int(Nm.w);
+ return make_float3(Nm.x, Nm.y, Nm.z);
+#endif
+}
+
+__device_inline float3 triangle_smooth_normal(KernelGlobals *kg, int tri_index, float u, float v)
+{
+ /* load triangle vertices */
+ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, tri_index));
+
+ float3 n0 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, __float_as_int(tri_vindex.x)));
+ float3 n1 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, __float_as_int(tri_vindex.y)));
+ float3 n2 = float4_to_float3(kernel_tex_fetch(__tri_vnormal, __float_as_int(tri_vindex.z)));
+
+ return normalize((1.0f - u - v)*n2 + u*n0 + v*n1);
+}
+
+__device_inline void triangle_dPdudv(KernelGlobals *kg, float3 *dPdu, float3 *dPdv, int tri)
+{
+ /* fetch triangle vertex coordinates */
+ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, tri));
+
+ float3 p0 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)));
+ float3 p1 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)));
+ float3 p2 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)));
+
+ /* compute derivatives of P w.r.t. uv */
+ *dPdu = (p0 - p2);
+ *dPdv = (p1 - p2);
+}
+
+/* attributes */
+
+__device float triangle_attribute_float(KernelGlobals *kg, const ShaderData *sd, AttributeElement elem, int offset, float *dx, float *dy)
+{
+ if(elem == ATTR_ELEMENT_FACE) {
+ if(dx) *dx = 0.0f;
+ if(dy) *dy = 0.0f;
+
+ return kernel_tex_fetch(__attributes_float, offset + sd->prim);
+ }
+ else if(elem == ATTR_ELEMENT_VERTEX) {
+ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim));
+
+ float f0 = kernel_tex_fetch(__attributes_float, offset + __float_as_int(tri_vindex.x));
+ float f1 = kernel_tex_fetch(__attributes_float, offset + __float_as_int(tri_vindex.y));
+ float f2 = kernel_tex_fetch(__attributes_float, offset + __float_as_int(tri_vindex.z));
+
+#ifdef __RAY_DIFFERENTIALS__
+ if(dx) *dx = sd->du.dx*f0 + sd->dv.dx*f1 - (sd->du.dx + sd->dv.dx)*f2;
+ if(dy) *dy = sd->du.dy*f0 + sd->dv.dy*f1 - (sd->du.dy + sd->dv.dy)*f2;
+#endif
+
+ return sd->u*f0 + sd->v*f1 + (1.0f - sd->u - sd->v)*f2;
+ }
+ else if(elem == ATTR_ELEMENT_CORNER) {
+ int tri = offset + sd->prim*3;
+ float f0 = kernel_tex_fetch(__attributes_float, tri + 0);
+ float f1 = kernel_tex_fetch(__attributes_float, tri + 1);
+ float f2 = kernel_tex_fetch(__attributes_float, tri + 2);
+
+#ifdef __RAY_DIFFERENTIALS__
+ if(dx) *dx = sd->du.dx*f0 + sd->dv.dx*f1 - (sd->du.dx + sd->dv.dx)*f2;
+ if(dy) *dy = sd->du.dy*f0 + sd->dv.dy*f1 - (sd->du.dy + sd->dv.dy)*f2;
+#endif
+
+ return sd->u*f0 + sd->v*f1 + (1.0f - sd->u - sd->v)*f2;
+ }
+ else {
+ if(dx) *dx = 0.0f;
+ if(dy) *dy = 0.0f;
+
+ return 0.0f;
+ }
+}
+
+__device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData *sd, AttributeElement elem, int offset, float3 *dx, float3 *dy)
+{
+ if(elem == ATTR_ELEMENT_FACE) {
+ if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f);
+ if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
+
+ return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + sd->prim));
+ }
+ else if(elem == ATTR_ELEMENT_VERTEX) {
+ float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim));
+
+ float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + __float_as_int(tri_vindex.x)));
+ float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + __float_as_int(tri_vindex.y)));
+ float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + __float_as_int(tri_vindex.z)));
+
+#ifdef __RAY_DIFFERENTIALS__
+ if(dx) *dx = sd->du.dx*f0 + sd->dv.dx*f1 - (sd->du.dx + sd->dv.dx)*f2;
+ if(dy) *dy = sd->du.dy*f0 + sd->dv.dy*f1 - (sd->du.dy + sd->dv.dy)*f2;
+#endif
+
+ return sd->u*f0 + sd->v*f1 + (1.0f - sd->u - sd->v)*f2;
+ }
+ else if(elem == ATTR_ELEMENT_CORNER) {
+ int tri = offset + sd->prim*3;
+ float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, tri + 0));
+ float3 f1 = float4_to_float3(kernel_tex_fetch(__attributes_float3, tri + 1));
+ float3 f2 = float4_to_float3(kernel_tex_fetch(__attributes_float3, tri + 2));
+
+#ifdef __RAY_DIFFERENTIALS__
+ if(dx) *dx = sd->du.dx*f0 + sd->dv.dx*f1 - (sd->du.dx + sd->dv.dx)*f2;
+ if(dy) *dy = sd->du.dy*f0 + sd->dv.dy*f1 - (sd->du.dy + sd->dv.dy)*f2;
+#endif
+
+ return sd->u*f0 + sd->v*f1 + (1.0f - sd->u - sd->v)*f2;
+ }
+ else {
+ if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f);
+ if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
+
+ return make_float3(0.0f, 0.0f, 0.0f);
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
new file mode 100644
index 00000000000..46cdcd1151e
--- /dev/null
+++ b/intern/cycles/kernel/kernel_types.h
@@ -0,0 +1,406 @@
+/*
+ * 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 __KERNEL_TYPES_H__
+#define __KERNEL_TYPES_H__
+
+#include "kernel_math.h"
+
+#include "svm/svm_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+#define OBJECT_SIZE 16
+#define LIGHT_SIZE 4
+
+#define __SOBOL__
+#define __INSTANCING__
+#define __DPDU__
+#define __UV__
+#define __BACKGROUND__
+#define __CAUSTICS_TRICKS__
+#define __VISIBILITY_FLAG__
+#define __RAY_DIFFERENTIALS__
+#define __CAMERA_CLIPPING__
+#define __INTERSECTION_REFINE__
+
+#ifndef __KERNEL_OPENCL__
+#define __SVM__
+#define __EMISSION__
+#define __TEXTURES__
+#define __HOLDOUT__
+//#define __MULTI_LIGHT__
+#endif
+
+#ifdef __KERNEL_CPU__
+#define __MULTI_CLOSURE__
+#define __TRANSPARENT_SHADOWS__
+//#define __OSL__
+#endif
+
+#ifdef __KERNEL_CUDA__
+#if __CUDA_ARCH__ >= 200
+#define __MULTI_CLOSURE__
+#define __TRANSPARENT_SHADOWS__
+#endif
+#endif
+
+//#define __SOBOL_FULL_SCREEN__
+//#define __MODIFY_TP__
+//#define __QBVH__
+
+/* Path Tracing */
+
+enum PathTraceDimension {
+ PRNG_FILTER_U = 0,
+ PRNG_FILTER_V = 1,
+ PRNG_LENS_U = 2,
+ PRNG_LENS_V = 3,
+ PRNG_BASE_NUM = 4,
+
+ PRNG_BSDF_U = 0,
+ PRNG_BSDF_V = 1,
+ PRNG_BSDF = 2,
+ PRNG_LIGHT = 3,
+ PRNG_LIGHT_U = 4,
+ PRNG_LIGHT_V = 5,
+ PRNG_LIGHT_F = 6,
+ PRNG_TERMINATE = 7,
+ PRNG_BOUNCE_NUM = 8
+};
+
+/* 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 */
+
+enum PathRayFlag {
+ PATH_RAY_CAMERA = 1,
+ PATH_RAY_REFLECT = 2,
+ PATH_RAY_TRANSMIT = 4,
+ PATH_RAY_DIFFUSE = 8,
+ PATH_RAY_GLOSSY = 16,
+ PATH_RAY_SINGULAR = 32,
+ PATH_RAY_TRANSPARENT = 64,
+
+ PATH_RAY_SHADOW_OPAQUE = 128,
+ PATH_RAY_SHADOW_TRANSPARENT = 256,
+ PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE|PATH_RAY_SHADOW_TRANSPARENT),
+
+ PATH_RAY_MIS_SKIP = 512,
+
+ PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512)
+};
+
+/* Closure Label */
+
+typedef enum ClosureLabel {
+ LABEL_NONE = 0,
+ LABEL_CAMERA = 1,
+ LABEL_LIGHT = 2,
+ LABEL_BACKGROUND = 4,
+ LABEL_TRANSMIT = 8,
+ LABEL_REFLECT = 16,
+ LABEL_VOLUME = 32,
+ LABEL_OBJECT = 64,
+ LABEL_DIFFUSE = 128,
+ LABEL_GLOSSY = 256,
+ LABEL_SINGULAR = 512,
+ LABEL_TRANSPARENT = 1024,
+ LABEL_STOP = 2048
+} ClosureLabel;
+
+/* Shader Flag */
+
+typedef enum ShaderFlag {
+ SHADER_SMOOTH_NORMAL = (1 << 31),
+ SHADER_CAST_SHADOW = (1 << 30),
+ SHADER_AREA_LIGHT = (1 << 29),
+
+ SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT)
+} ShaderFlag;
+
+/* Light Type */
+
+typedef enum LightType {
+ LIGHT_POINT,
+ LIGHT_DISTANT,
+ LIGHT_AREA
+} LightType;
+
+/* Differential */
+
+typedef struct differential3 {
+ float3 dx;
+ float3 dy;
+} differential3;
+
+typedef struct differential {
+ float dx;
+ float dy;
+} differential;
+
+/* Ray */
+
+typedef struct Ray {
+ float3 P;
+ float3 D;
+ float t;
+
+#ifdef __RAY_DIFFERENTIALS__
+ differential3 dP;
+ differential3 dD;
+#endif
+} Ray;
+
+/* Intersection */
+
+typedef struct Intersection {
+ float t, u, v;
+ int prim;
+ int object;
+} Intersection;
+
+/* Attributes */
+
+typedef enum AttributeElement {
+ ATTR_ELEMENT_FACE,
+ ATTR_ELEMENT_VERTEX,
+ ATTR_ELEMENT_CORNER,
+ ATTR_ELEMENT_VALUE,
+ ATTR_ELEMENT_NONE
+} AttributeElement;
+
+/* Closure data */
+
+#define MAX_CLOSURE 8
+
+typedef struct ShaderClosure {
+ ClosureType type;
+ float3 weight;
+
+#ifdef __MULTI_CLOSURE__
+ float sample_weight;
+#endif
+
+#ifdef __OSL__
+ void *prim;
+#else
+ float data0;
+ float data1;
+#endif
+
+} ShaderClosure;
+
+/* Shader Data
+ *
+ * Main shader state at a point on the surface or in a volume. All coordinates
+ * are in world space. */
+
+enum ShaderDataFlag {
+ /* runtime flags */
+ SD_BACKFACING = 1, /* backside of surface? */
+ SD_EMISSION = 2, /* have emissive closure? */
+ SD_BSDF = 4, /* have bsdf closure? */
+ SD_BSDF_HAS_EVAL = 8, /* have non-singular bsdf closure? */
+ SD_BSDF_GLOSSY = 16, /* have glossy bsdf */
+ SD_HOLDOUT = 32, /* have holdout closure? */
+ SD_VOLUME = 64, /* have volume closure? */
+
+ /* shader flags */
+ SD_SAMPLE_AS_LIGHT = 128, /* direct light sample */
+ SD_HAS_SURFACE_TRANSPARENT = 256, /* has surface transparency */
+ SD_HAS_VOLUME = 512, /* has volume shader */
+ SD_HOMOGENEOUS_VOLUME = 1024 /* has homogeneous volume */
+};
+
+typedef struct ShaderData {
+ /* position */
+ float3 P;
+ /* smooth normal for shading */
+ float3 N;
+ /* true geometric normal */
+ float3 Ng;
+ /* view/incoming direction */
+ float3 I;
+ /* shader id */
+ int shader;
+ /* booleans describing shader, see ShaderDataFlag */
+ int flag;
+
+ /* primitive id if there is one, ~0 otherwise */
+ int prim;
+ /* parametric coordinates
+ * - barycentric weights for triangles */
+ float u, v;
+ /* object id if there is one, ~0 otherwise */
+ int object;
+
+#ifdef __RAY_DIFFERENTIALS__
+ /* differential of P. these are orthogonal to Ng, not N */
+ differential3 dP;
+ /* differential of I */
+ differential3 dI;
+ /* differential of u, v */
+ differential du;
+ differential dv;
+#endif
+#ifdef __DPDU__
+ /* differential of P w.r.t. parametric coordinates. note that dPdu is
+ * not readily suitable as a tangent for shading on triangles. */
+ float3 dPdu, dPdv;
+#endif
+
+#ifdef __MULTI_CLOSURE__
+ /* Closure data, we store a fixed array of closures */
+ ShaderClosure closure[MAX_CLOSURE];
+ int num_closure;
+ float randb_closure;
+#else
+ /* Closure data, with a single sampled closure for low memory usage */
+ ShaderClosure closure;
+#endif
+
+#ifdef __OSL__
+ /* OSL context */
+ void *osl_ctx;
+#endif
+} ShaderData;
+
+/* Constrant Kernel Data */
+
+typedef struct KernelCamera {
+ /* type */
+ int ortho;
+ int pad;
+
+ /* size */
+ int width, height;
+
+ /* matrices */
+ Transform cameratoworld;
+ Transform rastertocamera;
+
+ /* differentials */
+ float3 dx;
+#ifndef WITH_OPENCL
+ float pad1;
+#endif
+ float3 dy;
+#ifndef WITH_OPENCL
+ float pad2;
+#endif
+
+ /* depth of field */
+ float aperturesize;
+ float blades;
+ float bladesrotation;
+ float focaldistance;
+
+ /* motion blur */
+ float shutteropen;
+ float shutterclose;
+
+ /* clipping */
+ float nearclip;
+ float cliplength;
+
+ /* more matrices */
+ Transform screentoworld;
+ Transform rastertoworld;
+ Transform ndctoworld;
+ Transform worldtoscreen;
+ Transform worldtoraster;
+ Transform worldtondc;
+ Transform worldtocamera;
+} KernelCamera;
+
+typedef struct KernelFilm {
+ float exposure;
+ int pad1, pad2, pad3;
+} KernelFilm;
+
+typedef struct KernelBackground {
+ /* only shader index */
+ int shader;
+ int transparent;
+ int pad1, pad2;
+} 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;
+ float perez_Y[5], perez_x[5], perez_y[5];
+ float pad5;
+} KernelSunSky;
+
+typedef struct KernelIntegrator {
+ /* emission */
+ int use_direct_light;
+ int num_distribution;
+ int num_all_lights;
+ float pdf_triangles;
+ float pdf_lights;
+
+ /* bounces */
+ int min_bounce;
+ int max_bounce;
+
+ int max_diffuse_bounce;
+ int max_glossy_bounce;
+ int max_transmission_bounce;
+
+ /* transparent */
+ int transparent_min_bounce;
+ int transparent_max_bounce;
+ int transparent_shadows;
+
+ /* caustics */
+ int no_caustics;
+ float blur_caustics;
+
+ /* seed */
+ int seed;
+} KernelIntegrator;
+
+typedef struct KernelBVH {
+ /* root node */
+ int root;
+ int attributes_map_stride;
+ int pad1, pad2;
+} KernelBVH;
+
+typedef struct KernelData {
+ KernelCamera cam;
+ KernelFilm film;
+ KernelBackground background;
+ KernelSunSky sunsky;
+ KernelIntegrator integrator;
+ KernelBVH bvh;
+} KernelData;
+
+CCL_NAMESPACE_END
+
+#endif /* __KERNEL_TYPES_H__ */
+
diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt
new file mode 100644
index 00000000000..ae88008cf71
--- /dev/null
+++ b/intern/cycles/kernel/osl/CMakeLists.txt
@@ -0,0 +1,43 @@
+
+set(INC
+ .
+ ..
+ ../svm
+ ../../render
+ ../../util
+ ../../device
+)
+
+set(SRC
+ background.cpp
+ bsdf_ashikhmin_velvet.cpp
+ bsdf_diffuse.cpp
+ bsdf_microfacet.cpp
+ bsdf_reflection.cpp
+ bsdf_refraction.cpp
+ bsdf_transparent.cpp
+ bsdf_ward.cpp
+ bsdf_westin.cpp
+ bssrdf.cpp
+ debug.cpp
+ emissive.cpp
+ osl_closures.cpp
+ osl_services.cpp
+ osl_shader.cpp
+ vol_subsurface.cpp
+)
+
+set(HEADER_SRC
+ osl_closures.h
+ osl_globals.h
+ osl_services.h
+ osl_shader.h
+)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${RTTI_DISABLE_FLAGS}")
+
+include_directories(${INC})
+
+add_library(cycles_kernel_osl ${SRC} ${HEADER_SRC})
+
+add_subdirectory(nodes)
diff --git a/intern/cycles/kernel/osl/background.cpp b/intern/cycles/kernel/osl/background.cpp
new file mode 100644
index 00000000000..c35119ae9cf
--- /dev/null
+++ b/intern/cycles/kernel/osl/background.cpp
@@ -0,0 +1,100 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+/// Generic background closure
+///
+/// We only have a background closure for the shaders
+/// to return a color in background shaders. No methods,
+/// only the weight is taking into account
+///
+class GenericBackgroundClosure : public BackgroundClosure {
+public:
+ GenericBackgroundClosure() { }
+
+ void setup() {};
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "background"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " ()";
+ }
+
+};
+
+
+/// Holdout closure
+///
+/// This will be used by the shader to mark the
+/// amount of holdout for the current shading
+/// point. No parameters, only the weight will be
+/// used
+///
+class HoldoutClosure : ClosurePrimitive {
+public:
+ HoldoutClosure () : ClosurePrimitive (Holdout) { }
+
+ void setup() {};
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "holdout"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " ()";
+ }
+};
+
+ClosureParam closure_background_params[] = {
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(GenericBackgroundClosure) };
+
+CLOSURE_PREPARE(closure_background_prepare, GenericBackgroundClosure)
+
+ClosureParam closure_holdout_params[] = {
+ CLOSURE_FINISH_PARAM(HoldoutClosure) };
+
+CLOSURE_PREPARE(closure_holdout_prepare, HoldoutClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp b/intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp
new file mode 100644
index 00000000000..a38c5b55cf5
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp
@@ -0,0 +1,175 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+class AshikhminVelvetClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+ float m_sigma;
+ float m_invsigma2;
+
+ AshikhminVelvetClosure() : BSDFClosure(Labels::DIFFUSE) { }
+
+ void setup()
+ {
+ m_sigma = std::max(m_sigma, 0.01f);
+ m_invsigma2 = 1.0f/(m_sigma * m_sigma);
+ }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const AshikhminVelvetClosure *comp = (const AshikhminVelvetClosure *)other;
+ return m_N == comp->m_N && m_sigma == comp->m_sigma &&
+ BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "ashikhmin_velvet"; }
+
+ void print_on (std::ostream &out) const
+ {
+ out << name() << " (";
+ out << "(" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "), ";
+ out << m_sigma;
+ out << ")";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNO > 0 && cosNI > 0) {
+ Vec3 H = omega_in + omega_out;
+ H.normalize();
+
+ float cosNH = m_N.dot(H);
+ float cosHO = fabsf(omega_out.dot(H));
+
+ float cosNHdivHO = cosNH / cosHO;
+ cosNHdivHO = std::max(cosNHdivHO, 0.00001f);
+
+ float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
+ float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
+
+ float sinNH2 = 1 - cosNH * cosNH;
+ float sinNH4 = sinNH2 * sinNH2;
+ float cotangent2 = (cosNH * cosNH) / sinNH2;
+
+ float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * float(M_1_PI) / sinNH4;
+ float G = std::min(1.0f, std::min(fac1, fac2)); // TODO: derive G from D analytically
+
+ float out = 0.25f * (D * G) / cosNO;
+
+ pdf = 0.5f * (float) M_1_PI;
+ return Color3 (out, out, out);
+ }
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ // we are viewing the surface from above - send a ray out with uniform
+ // distribution over the hemisphere
+ sample_uniform_hemisphere (m_N, omega_out, randu, randv, omega_in, pdf);
+ if (Ng.dot(omega_in) > 0) {
+ Vec3 H = omega_in + omega_out;
+ H.normalize();
+
+ float cosNI = m_N.dot(omega_in);
+ float cosNO = m_N.dot(omega_out);
+ float cosNH = m_N.dot(H);
+ float cosHO = fabsf(omega_out.dot(H));
+
+ float cosNHdivHO = cosNH / cosHO;
+ cosNHdivHO = std::max(cosNHdivHO, 0.00001f);
+
+ float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
+ float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
+
+ float sinNH2 = 1 - cosNH * cosNH;
+ float sinNH4 = sinNH2 * sinNH2;
+ float cotangent2 = (cosNH * cosNH) / sinNH2;
+
+ float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * float(M_1_PI) / sinNH4;
+ float G = std::min(1.0f, std::min(fac1, fac2)); // TODO: derive G from D analytically
+
+ float power = 0.25f * (D * G) / cosNO;
+
+ eval.setValue(power, power, power);
+
+ // TODO: find a better approximation for the retroreflective bounce
+ domega_in_dx = (2 * m_N.dot(domega_out_dx)) * m_N - domega_out_dx;
+ domega_in_dy = (2 * m_N.dot(domega_out_dy)) * m_N - domega_out_dy;
+ domega_in_dx *= 125;
+ domega_in_dy *= 125;
+ } else
+ pdf = 0;
+ return Labels::REFLECT;
+ }
+
+};
+
+
+
+ClosureParam bsdf_ashikhmin_velvet_params[] = {
+ CLOSURE_VECTOR_PARAM(AshikhminVelvetClosure, m_N),
+ CLOSURE_FLOAT_PARAM (AshikhminVelvetClosure, m_sigma),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(AshikhminVelvetClosure) };
+
+CLOSURE_PREPARE(bsdf_ashikhmin_velvet_prepare, AshikhminVelvetClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_diffuse.cpp b/intern/cycles/kernel/osl/bsdf_diffuse.cpp
new file mode 100644
index 00000000000..0d4b3fa471f
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_diffuse.cpp
@@ -0,0 +1,181 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+class DiffuseClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+
+ DiffuseClosure() : BSDFClosure(Labels::DIFFUSE) { }
+
+ void setup() {};
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const DiffuseClosure *comp = (const DiffuseClosure *)other;
+ return m_N == comp->m_N && BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "diffuse"; }
+
+ void print_on (std::ostream &out) const
+ {
+ out << name() << " ((" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "))";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ float cos_pi = std::max(m_N.dot(omega_in),0.0f) * (float) M_1_PI;
+ pdf = cos_pi;
+ return Color3 (cos_pi, cos_pi, cos_pi);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ // we are viewing the surface from the right side - send a ray out with cosine
+ // distribution over the hemisphere
+ sample_cos_hemisphere (m_N, omega_out, randu, randv, omega_in, pdf);
+ if (Ng.dot(omega_in) > 0) {
+ eval.setValue(pdf, pdf, pdf);
+ // TODO: find a better approximation for the diffuse bounce
+ domega_in_dx = (2 * m_N.dot(domega_out_dx)) * m_N - domega_out_dx;
+ domega_in_dy = (2 * m_N.dot(domega_out_dy)) * m_N - domega_out_dy;
+ domega_in_dx *= 125;
+ domega_in_dy *= 125;
+ } else
+ pdf = 0;
+ return Labels::REFLECT;
+ }
+};
+
+
+
+class TranslucentClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+
+ TranslucentClosure() : BSDFClosure(Labels::DIFFUSE, Back) { }
+
+ void setup() {};
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const TranslucentClosure *comp = (const TranslucentClosure *)other;
+ return m_N == comp->m_N && BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "translucent"; }
+
+ void print_on (std::ostream &out) const
+ {
+ out << name() << " ((" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "))";
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ float cos_pi = std::max(-m_N.dot(omega_in), 0.0f) * (float) M_1_PI;
+ pdf = cos_pi;
+ return Color3 (cos_pi, cos_pi, cos_pi);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ // we are viewing the surface from the right side - send a ray out with cosine
+ // distribution over the hemisphere
+ sample_cos_hemisphere (-m_N, omega_out, randu, randv, omega_in, pdf);
+ if (Ng.dot(omega_in) < 0) {
+ eval.setValue(pdf, pdf, pdf);
+ // TODO: find a better approximation for the diffuse bounce
+ domega_in_dx = (2 * m_N.dot(domega_out_dx)) * m_N - domega_out_dx;
+ domega_in_dy = (2 * m_N.dot(domega_out_dy)) * m_N - domega_out_dy;
+ domega_in_dx *= -125;
+ domega_in_dy *= -125;
+ } else
+ pdf = 0;
+ return Labels::TRANSMIT;
+ }
+};
+
+ClosureParam bsdf_diffuse_params[] = {
+ CLOSURE_VECTOR_PARAM (DiffuseClosure, m_N),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM (DiffuseClosure) };
+
+ClosureParam bsdf_translucent_params[] = {
+ CLOSURE_VECTOR_PARAM (TranslucentClosure, m_N),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM (TranslucentClosure) };
+
+CLOSURE_PREPARE(bsdf_diffuse_prepare, DiffuseClosure)
+CLOSURE_PREPARE(bsdf_translucent_prepare, TranslucentClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_microfacet.cpp b/intern/cycles/kernel/osl/bsdf_microfacet.cpp
new file mode 100644
index 00000000000..d87268da81e
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_microfacet.cpp
@@ -0,0 +1,533 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+#include "util_math.h"
+
+using namespace OSL;
+
+CCL_NAMESPACE_BEGIN
+
+// TODO: fresnel_dielectric is only used for derivatives, could be optimized
+
+// TODO: refactor these two classes so they share everything by the microfacet
+// distribution terms
+
+// microfacet model with GGX facet distribution
+// see http://www.graphics.cornell.edu/~bjw/microfacetbsdf.pdf
+template <int Refractive = 0>
+class MicrofacetGGXClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+ float m_ag; // width parameter (roughness)
+ float m_eta; // index of refraction (for fresnel term)
+ MicrofacetGGXClosure() : BSDFClosure(Labels::GLOSSY, Refractive ? Back : Front) { m_eta = 1.0f; }
+
+ void setup()
+ {
+ m_ag = clamp(m_ag, 1e-5f, 1.0f);
+ }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const MicrofacetGGXClosure *comp = (const MicrofacetGGXClosure *)other;
+ return m_N == comp->m_N && m_ag == comp->m_ag &&
+ m_eta == comp->m_eta && BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const {
+ return Refractive ? "microfacet_ggx_refraction" : "microfacet_ggx";
+ }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " (";
+ out << "(" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "), ";
+ out << m_ag << ", ";
+ out << m_eta;
+ out << ")";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ if (Refractive == 1) return Color3 (0, 0, 0);
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNI > 0 && cosNO > 0) {
+ // get half vector
+ Vec3 Hr = omega_in + omega_out;
+ Hr.normalize();
+ // eq. 20: (F*G*D)/(4*in*on)
+ // eq. 33: first we calculate D(m) with m=Hr:
+ float alpha2 = m_ag * m_ag;
+ float cosThetaM = m_N.dot(Hr);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / ((float) M_PI * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ float out = (G * D) * 0.25f / cosNO;
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ pdf = pm * 0.25f / Hr.dot(omega_out);
+ return Color3 (out, out, out);
+ }
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ if (Refractive == 0) return Color3 (0, 0, 0);
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNO <= 0 || cosNI >= 0)
+ return Color3 (0, 0, 0); // vectors on same side -- not possible
+ // compute half-vector of the refraction (eq. 16)
+ Vec3 ht = -(m_eta * omega_in + omega_out);
+ Vec3 Ht = ht; Ht.normalize();
+ float cosHO = Ht.dot(omega_out);
+
+ float cosHI = Ht.dot(omega_in);
+ // eq. 33: first we calculate D(m) with m=Ht:
+ float alpha2 = m_ag * m_ag;
+ float cosThetaM = m_N.dot(Ht);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / ((float) M_PI * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ // probability
+ float invHt2 = 1 / ht.dot(ht);
+ pdf = D * fabsf(cosThetaM) * (fabsf(cosHI) * (m_eta * m_eta)) * invHt2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D) * invHt2) / cosNO;
+ return Color3 (out, out, out);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ float cosNO = m_N.dot(omega_out);
+ if (cosNO > 0) {
+ Vec3 X, Y, Z = m_N;
+ make_orthonormals(Z, X, Y);
+ // generate a random microfacet normal m
+ // eq. 35,36:
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ // and sin(atan(x)) == x/sqrt(1+x^2)
+ float alpha2 = m_ag * m_ag;
+ float tanThetaM2 = alpha2 * randu / (1 - randu);
+ float cosThetaM = 1 / sqrtf(1 + tanThetaM2);
+ float sinThetaM = cosThetaM * sqrtf(tanThetaM2);
+ float phiM = 2 * float(M_PI) * randv;
+ Vec3 m = (cosf(phiM) * sinThetaM) * X +
+ (sinf(phiM) * sinThetaM) * Y +
+ cosThetaM * Z;
+ if (Refractive == 0) {
+ float cosMO = m.dot(omega_out);
+ if (cosMO > 0) {
+ // eq. 39 - compute actual reflected direction
+ omega_in = 2 * cosMO * m - omega_out;
+ if (Ng.dot(omega_in) > 0) {
+ // microfacet normal is visible to this ray
+ // eq. 33
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / (float(M_PI) * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ pdf = pm * 0.25f / cosMO;
+ // eval BRDF*cosNI
+ float cosNI = m_N.dot(omega_in);
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ // eq. 20: (F*G*D)/(4*in*on)
+ float out = (G * D) * 0.25f / cosNO;
+ eval.setValue(out, out, out);
+ domega_in_dx = (2 * m.dot(domega_out_dx)) * m - domega_out_dx;
+ domega_in_dy = (2 * m.dot(domega_out_dy)) * m - domega_out_dy;
+
+ /* disabled for now - gives texture filtering problems */
+#if 0
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ domega_in_dx *= 10;
+ domega_in_dy *= 10;
+#endif
+ }
+ }
+ } else {
+ // CAUTION: the i and o variables are inverted relative to the paper
+ // eq. 39 - compute actual refractive direction
+ Vec3 R, dRdx, dRdy;
+ Vec3 T, dTdx, dTdy;
+ bool inside;
+ fresnel_dielectric(m_eta, m, omega_out, domega_out_dx, domega_out_dy,
+ R, dRdx, dRdy,
+ T, dTdx, dTdy,
+ inside);
+
+ if (!inside) {
+ omega_in = T;
+ domega_in_dx = dTdx;
+ domega_in_dy = dTdy;
+ // eq. 33
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / (float(M_PI) * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 24
+ float pm = D * cosThetaM;
+ // eval BRDF*cosNI
+ float cosNI = m_N.dot(omega_in);
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ // eq. 21
+ float cosHI = m.dot(omega_in);
+ float cosHO = m.dot(omega_out);
+ float Ht2 = m_eta * cosHI + cosHO;
+ Ht2 *= Ht2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D)) / (cosNO * Ht2);
+ // eq. 38 and eq. 17
+ pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2;
+ eval.setValue(out, out, out);
+
+ /* disabled for now - gives texture filtering problems */
+#if 0
+ // Since there is some blur to this refraction, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ domega_in_dx *= 10;
+ domega_in_dy *= 10;
+#endif
+ }
+ }
+ }
+ return Refractive ? Labels::TRANSMIT : Labels::REFLECT;
+ }
+};
+
+// microfacet model with Beckmann facet distribution
+// see http://www.graphics.cornell.edu/~bjw/microfacetbsdf.pdf
+template <int Refractive = 0>
+class MicrofacetBeckmannClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+ float m_ab; // width parameter (roughness)
+ float m_eta; // index of refraction (for fresnel term)
+ MicrofacetBeckmannClosure() : BSDFClosure(Labels::GLOSSY, Refractive ? Back : Front) { }
+
+ void setup()
+ {
+ m_ab = clamp(m_ab, 1e-5f, 1.0f);
+ }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const MicrofacetBeckmannClosure *comp = (const MicrofacetBeckmannClosure *)other;
+ return m_N == comp->m_N && m_ab == comp->m_ab &&
+ m_eta == comp->m_eta && BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char * name () const {
+ return Refractive ? "microfacet_beckmann_refraction"
+ : "microfacet_beckmann";
+ }
+
+ void print_on (std::ostream &out) const
+ {
+ out << name() << " (";
+ out << "(" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "), ";
+ out << m_ab << ", ";
+ out << m_eta;
+ out << ")";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ if (Refractive == 1) return Color3 (0, 0, 0);
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNO > 0 && cosNI > 0) {
+ // get half vector
+ Vec3 Hr = omega_in + omega_out;
+ Hr.normalize();
+ // eq. 20: (F*G*D)/(4*in*on)
+ // eq. 25: first we calculate D(m) with m=Hr:
+ float alpha2 = m_ab * m_ab;
+ float cosThetaM = m_N.dot(Hr);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (float(M_PI) * alpha2 * cosThetaM4);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ float out = (G * D) * 0.25f / cosNO;
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ pdf = pm * 0.25f / Hr.dot(omega_out);
+ return Color3 (out, out, out);
+ }
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ if (Refractive == 0) return Color3 (0, 0, 0);
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNO <= 0 || cosNI >= 0)
+ return Color3 (0, 0, 0);
+ // compute half-vector of the refraction (eq. 16)
+ Vec3 ht = -(m_eta * omega_in + omega_out);
+ Vec3 Ht = ht; Ht.normalize();
+ float cosHO = Ht.dot(omega_out);
+
+ float cosHI = Ht.dot(omega_in);
+ // eq. 33: first we calculate D(m) with m=Ht:
+ float alpha2 = m_ab * m_ab;
+ float cosThetaM = m_N.dot(Ht);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (float(M_PI) * alpha2 * cosThetaM4);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ // probability
+ float invHt2 = 1 / ht.dot(ht);
+ pdf = D * fabsf(cosThetaM) * (fabsf(cosHI) * (m_eta * m_eta)) * invHt2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D) * invHt2) / cosNO;
+ return Color3 (out, out, out);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ float cosNO = m_N.dot(omega_out);
+ if (cosNO > 0) {
+ Vec3 X, Y, Z = m_N;
+ make_orthonormals(Z, X, Y);
+ // generate a random microfacet normal m
+ // eq. 35,36:
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ // and sin(atan(x)) == x/sqrt(1+x^2)
+ float alpha2 = m_ab * m_ab;
+ float tanThetaM = sqrtf(-alpha2 * logf(1 - randu));
+ float cosThetaM = 1 / sqrtf(1 + tanThetaM * tanThetaM);
+ float sinThetaM = cosThetaM * tanThetaM;
+ float phiM = 2 * float(M_PI) * randv;
+ Vec3 m = (cosf(phiM) * sinThetaM) * X +
+ (sinf(phiM) * sinThetaM) * Y +
+ cosThetaM * Z;
+ if (Refractive == 0) {
+ float cosMO = m.dot(omega_out);
+ if (cosMO > 0) {
+ // eq. 39 - compute actual reflected direction
+ omega_in = 2 * cosMO * m - omega_out;
+ if (Ng.dot(omega_in) > 0) {
+ // microfacet normal is visible to this ray
+ // eq. 25
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = tanThetaM * tanThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (float(M_PI) * alpha2 * cosThetaM4);
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ pdf = pm * 0.25f / cosMO;
+ // Eval BRDF*cosNI
+ float cosNI = m_N.dot(omega_in);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ // eq. 20: (F*G*D)/(4*in*on)
+ float out = (G * D) * 0.25f / cosNO;
+ eval.setValue(out, out, out);
+ domega_in_dx = (2 * m.dot(domega_out_dx)) * m - domega_out_dx;
+ domega_in_dy = (2 * m.dot(domega_out_dy)) * m - domega_out_dy;
+
+ /* disabled for now - gives texture filtering problems */
+#if 0
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ domega_in_dx *= 10;
+ domega_in_dy *= 10;
+#endif
+ }
+ }
+ } else {
+ // CAUTION: the i and o variables are inverted relative to the paper
+ // eq. 39 - compute actual refractive direction
+ Vec3 R, dRdx, dRdy;
+ Vec3 T, dTdx, dTdy;
+ bool inside;
+ fresnel_dielectric(m_eta, m, omega_out, domega_out_dx, domega_out_dy,
+ R, dRdx, dRdy,
+ T, dTdx, dTdy,
+ inside);
+ if (!inside) {
+ omega_in = T;
+ domega_in_dx = dTdx;
+ domega_in_dy = dTdy;
+ // eq. 33
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = tanThetaM * tanThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (float(M_PI) * alpha2 * cosThetaM4);
+ // eq. 24
+ float pm = D * cosThetaM;
+ // eval BRDF*cosNI
+ float cosNI = m_N.dot(omega_in);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ // eq. 21
+ float cosHI = m.dot(omega_in);
+ float cosHO = m.dot(omega_out);
+ float Ht2 = m_eta * cosHI + cosHO;
+ Ht2 *= Ht2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D)) / (cosNO * Ht2);
+ // eq. 38 and eq. 17
+ pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2;
+ eval.setValue(out, out, out);
+
+ /* disabled for now - gives texture filtering problems */
+#if 0
+ // Since there is some blur to this refraction, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ domega_in_dx *= 10;
+ domega_in_dy *= 10;
+#endif
+ }
+ }
+ }
+ return Refractive ? Labels::TRANSMIT : Labels::REFLECT;
+ }
+};
+
+
+
+ClosureParam bsdf_microfacet_ggx_params[] = {
+ CLOSURE_VECTOR_PARAM(MicrofacetGGXClosure<0>, m_N),
+ CLOSURE_FLOAT_PARAM (MicrofacetGGXClosure<0>, m_ag),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(MicrofacetGGXClosure<0>) };
+
+ClosureParam bsdf_microfacet_ggx_refraction_params[] = {
+ CLOSURE_VECTOR_PARAM(MicrofacetGGXClosure<1>, m_N),
+ CLOSURE_FLOAT_PARAM (MicrofacetGGXClosure<1>, m_ag),
+ CLOSURE_FLOAT_PARAM (MicrofacetGGXClosure<1>, m_eta),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(MicrofacetGGXClosure<1>) };
+
+ClosureParam bsdf_microfacet_beckmann_params[] = {
+ CLOSURE_VECTOR_PARAM(MicrofacetBeckmannClosure<0>, m_N),
+ CLOSURE_FLOAT_PARAM (MicrofacetBeckmannClosure<0>, m_ab),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(MicrofacetBeckmannClosure<0>) };
+
+ClosureParam bsdf_microfacet_beckmann_refraction_params[] = {
+ CLOSURE_VECTOR_PARAM(MicrofacetBeckmannClosure<1>, m_N),
+ CLOSURE_FLOAT_PARAM (MicrofacetBeckmannClosure<1>, m_ab),
+ CLOSURE_FLOAT_PARAM (MicrofacetBeckmannClosure<1>, m_eta),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(MicrofacetBeckmannClosure<1>) };
+
+CLOSURE_PREPARE(bsdf_microfacet_ggx_prepare, MicrofacetGGXClosure<0>)
+CLOSURE_PREPARE(bsdf_microfacet_ggx_refraction_prepare, MicrofacetGGXClosure<1>)
+CLOSURE_PREPARE(bsdf_microfacet_beckmann_prepare, MicrofacetBeckmannClosure<0>)
+CLOSURE_PREPARE(bsdf_microfacet_beckmann_refraction_prepare, MicrofacetBeckmannClosure<1>)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_reflection.cpp b/intern/cycles/kernel/osl/bsdf_reflection.cpp
new file mode 100644
index 00000000000..b0caff6df44
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_reflection.cpp
@@ -0,0 +1,108 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+class ReflectionClosure : public BSDFClosure {
+public:
+ Vec3 m_N; // shading normal
+ ReflectionClosure() : BSDFClosure(Labels::SINGULAR) { }
+
+ void setup() {};
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const ReflectionClosure *comp = (const ReflectionClosure *)other;
+ return m_N == comp->m_N && BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "reflection"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " (";
+ out << "(" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "))";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ // only one direction is possible
+ float cosNO = m_N.dot(omega_out);
+ if (cosNO > 0) {
+ omega_in = (2 * cosNO) * m_N - omega_out;
+ if (Ng.dot(omega_in) > 0) {
+ domega_in_dx = 2 * m_N.dot(domega_out_dx) * m_N - domega_out_dx;
+ domega_in_dy = 2 * m_N.dot(domega_out_dy) * m_N - domega_out_dy;
+ pdf = 1;
+ eval.setValue(1, 1, 1);
+ }
+ }
+ return Labels::REFLECT;
+ }
+};
+
+ClosureParam bsdf_reflection_params[] = {
+ CLOSURE_VECTOR_PARAM(ReflectionClosure, m_N),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(ReflectionClosure) };
+
+CLOSURE_PREPARE(bsdf_reflection_prepare, ReflectionClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_refraction.cpp b/intern/cycles/kernel/osl/bsdf_refraction.cpp
new file mode 100644
index 00000000000..3ae7a3811b4
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_refraction.cpp
@@ -0,0 +1,120 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+class RefractionClosure : public BSDFClosure {
+public:
+ Vec3 m_N; // shading normal
+ float m_eta; // ratio of indices of refraction (inside / outside)
+ RefractionClosure() : BSDFClosure(Labels::SINGULAR, Back) { }
+
+ void setup() {}
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const RefractionClosure *comp = (const RefractionClosure *)other;
+ return m_N == comp->m_N && m_eta == comp->m_eta &&
+ BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "refraction"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " (";
+ out << "(" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "), ";
+ out << m_eta;
+ out << ")";
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ Vec3 R, dRdx, dRdy;
+ Vec3 T, dTdx, dTdy;
+ bool inside;
+
+ fresnel_dielectric(m_eta, m_N,
+ omega_out, domega_out_dx, domega_out_dy,
+ R, dRdx, dRdy,
+ T, dTdx, dTdy,
+ inside);
+
+ if (!inside) {
+ pdf = 1;
+ eval.setValue(1.0f, 1.0f, 1.0f);
+ omega_in = T;
+ domega_in_dx = dTdx;
+ domega_in_dy = dTdy;
+ }
+
+ return Labels::TRANSMIT;
+ }
+};
+
+ClosureParam bsdf_refraction_params[] = {
+ CLOSURE_VECTOR_PARAM(RefractionClosure, m_N),
+ CLOSURE_FLOAT_PARAM (RefractionClosure, m_eta),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(RefractionClosure) };
+
+CLOSURE_PREPARE(bsdf_refraction_prepare, RefractionClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_transparent.cpp b/intern/cycles/kernel/osl/bsdf_transparent.cpp
new file mode 100644
index 00000000000..941abd6a483
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_transparent.cpp
@@ -0,0 +1,97 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+class TransparentClosure : public BSDFClosure {
+public:
+ TransparentClosure() : BSDFClosure(Labels::STRAIGHT, Back) { }
+
+ void setup() {}
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "transparent"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " ()";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ // only one direction is possible
+ omega_in = -omega_out;
+ domega_in_dx = -domega_out_dx;
+ domega_in_dy = -domega_out_dy;
+ pdf = 1;
+ eval.setValue(1, 1, 1);
+ return Labels::TRANSMIT;
+ }
+};
+
+
+
+ClosureParam bsdf_transparent_params[] = {
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(TransparentClosure) };
+
+CLOSURE_PREPARE(bsdf_transparent_prepare, TransparentClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_ward.cpp b/intern/cycles/kernel/osl/bsdf_ward.cpp
new file mode 100644
index 00000000000..a7742a04d13
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_ward.cpp
@@ -0,0 +1,222 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+#include "util_math.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+// anisotropic ward - leaks energy at grazing angles
+// see http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+class WardClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+ Vec3 m_T;
+ float m_ax, m_ay;
+ WardClosure() : BSDFClosure(Labels::GLOSSY) { }
+
+ void setup()
+ {
+ m_ax = clamp(m_ax, 1e-5f, 1.0f);
+ m_ay = clamp(m_ay, 1e-5f, 1.0f);
+ }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const WardClosure *comp = (const WardClosure *)other;
+ return m_N == comp->m_N && m_T == comp->m_T &&
+ m_ax == comp->m_ax && m_ay == comp->m_ay &&
+ BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "ward"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " ((";
+ out << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "), (";
+ out << m_T[0] << ", " << m_T[1] << ", " << m_T[2] << "), ";
+ out << m_ax << ", " << m_ay << ")";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNI > 0 && cosNO > 0) {
+ // get half vector and get x,y basis on the surface for anisotropy
+ Vec3 H = omega_in + omega_out;
+ H.normalize(); // normalize needed for pdf
+ Vec3 X, Y;
+ make_orthonormals(m_N, m_T, X, Y);
+ // eq. 4
+ float dotx = H.dot(X) / m_ax;
+ float doty = H.dot(Y) / m_ay;
+ float dotn = H.dot(m_N);
+ float exp_arg = (dotx * dotx + doty * doty) / (dotn * dotn);
+ float denom = (4 * (float) M_PI * m_ax * m_ay * sqrtf(cosNO * cosNI));
+ float exp_val = expf(-exp_arg);
+ float out = cosNI * exp_val / denom;
+ float oh = H.dot(omega_out);
+ denom = 4 * (float) M_PI * m_ax * m_ay * oh * dotn * dotn * dotn;
+ pdf = exp_val / denom;
+ return Color3 (out, out, out);
+ }
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ float cosNO = m_N.dot(omega_out);
+ if (cosNO > 0) {
+ // get x,y basis on the surface for anisotropy
+ Vec3 X, Y;
+ make_orthonormals(m_N, m_T, X, Y);
+ // generate random angles for the half vector
+ // eq. 7 (taking care around discontinuities to keep
+ // output angle in the right quadrant)
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ // and sin(atan(x)) == x/sqrt(1+x^2)
+ float alphaRatio = m_ay / m_ax;
+ float cosPhi, sinPhi;
+ if (randu < 0.25f) {
+ float val = 4 * randu;
+ float tanPhi = alphaRatio * tanf((float) M_PI_2 * val);
+ cosPhi = 1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = tanPhi * cosPhi;
+ } else if (randu < 0.5) {
+ float val = 1 - 4 * (0.5f - randu);
+ float tanPhi = alphaRatio * tanf((float) M_PI_2 * val);
+ // phi = (float) M_PI - phi;
+ cosPhi = -1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = -tanPhi * cosPhi;
+ } else if (randu < 0.75f) {
+ float val = 4 * (randu - 0.5f);
+ float tanPhi = alphaRatio * tanf((float) M_PI_2 * val);
+ //phi = (float) M_PI + phi;
+ cosPhi = -1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = tanPhi * cosPhi;
+ } else {
+ float val = 1 - 4 * (1 - randu);
+ float tanPhi = alphaRatio * tanf((float) M_PI_2 * val);
+ // phi = 2 * (float) M_PI - phi;
+ cosPhi = 1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = -tanPhi * cosPhi;
+ }
+ // eq. 6
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ // and sin(atan(x)) == x/sqrt(1+x^2)
+ float thetaDenom = (cosPhi * cosPhi) / (m_ax * m_ax) + (sinPhi * sinPhi) / (m_ay * m_ay);
+ float tanTheta2 = -logf(1 - randv) / thetaDenom;
+ float cosTheta = 1 / sqrtf(1 + tanTheta2);
+ float sinTheta = cosTheta * sqrtf(tanTheta2);
+
+ Vec3 h; // already normalized becaused expressed from spherical coordinates
+ h.x = sinTheta * cosPhi;
+ h.y = sinTheta * sinPhi;
+ h.z = cosTheta;
+ // compute terms that are easier in local space
+ float dotx = h.x / m_ax;
+ float doty = h.y / m_ay;
+ float dotn = h.z;
+ // transform to world space
+ h = h.x * X + h.y * Y + h.z * m_N;
+ // generate the final sample
+ float oh = h.dot(omega_out);
+ omega_in.x = 2 * oh * h.x - omega_out.x;
+ omega_in.y = 2 * oh * h.y - omega_out.y;
+ omega_in.z = 2 * oh * h.z - omega_out.z;
+ if (Ng.dot(omega_in) > 0) {
+ float cosNI = m_N.dot(omega_in);
+ if (cosNI > 0) {
+ // eq. 9
+ float exp_arg = (dotx * dotx + doty * doty) / (dotn * dotn);
+ float denom = 4 * (float) M_PI * m_ax * m_ay * oh * dotn * dotn * dotn;
+ pdf = expf(-exp_arg) / denom;
+ // compiler will reuse expressions already computed
+ denom = (4 * (float) M_PI * m_ax * m_ay * sqrtf(cosNO * cosNI));
+ float power = cosNI * expf(-exp_arg) / denom;
+ eval.setValue(power, power, power);
+ domega_in_dx = (2 * m_N.dot(domega_out_dx)) * m_N - domega_out_dx;
+ domega_in_dy = (2 * m_N.dot(domega_out_dy)) * m_N - domega_out_dy;
+
+ /* disabled for now - gives texture filtering problems */
+#if 0
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ domega_in_dx *= 10;
+ domega_in_dy *= 10;
+#endif
+ }
+ }
+ }
+ return Labels::REFLECT;
+ }
+};
+
+
+
+ClosureParam bsdf_ward_params[] = {
+ CLOSURE_VECTOR_PARAM(WardClosure, m_N),
+ CLOSURE_VECTOR_PARAM(WardClosure, m_T),
+ CLOSURE_FLOAT_PARAM (WardClosure, m_ax),
+ CLOSURE_FLOAT_PARAM (WardClosure, m_ay),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(WardClosure) };
+
+CLOSURE_PREPARE(bsdf_ward_prepare, WardClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bsdf_westin.cpp b/intern/cycles/kernel/osl/bsdf_westin.cpp
new file mode 100644
index 00000000000..d322f6a7f7e
--- /dev/null
+++ b/intern/cycles/kernel/osl/bsdf_westin.cpp
@@ -0,0 +1,239 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+#include "util_math.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+class WestinBackscatterClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+ float m_roughness;
+ float m_invroughness;
+ WestinBackscatterClosure() : BSDFClosure(Labels::GLOSSY) { }
+
+ void setup()
+ {
+ m_roughness = clamp(m_roughness, 1e-5f, 1.0f);
+ m_invroughness = m_roughness > 0 ? 1 / m_roughness : 0;
+ }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const WestinBackscatterClosure *comp = (const WestinBackscatterClosure *)other;
+ return m_N == comp->m_N && m_roughness == comp->m_roughness &&
+ BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "westin_backscatter"; }
+
+ void print_on (std::ostream &out) const
+ {
+ out << name() << " (";
+ out << "(" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "), ";
+ out << m_roughness;
+ out << ")";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float &pdf) const
+ {
+ // pdf is implicitly 0 (no indirect sampling)
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNO > 0 && cosNI > 0) {
+ float cosine = omega_out.dot(omega_in);
+ pdf = cosine > 0 ? (m_invroughness + 1) * powf(cosine, m_invroughness) : 0;
+ pdf *= 0.5f * float(M_1_PI);
+ return Color3 (pdf, pdf, pdf);
+ }
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float &pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ float cosNO = m_N.dot(omega_out);
+ if (cosNO > 0) {
+ domega_in_dx = domega_out_dx;
+ domega_in_dy = domega_out_dy;
+ Vec3 T, B;
+ make_orthonormals (omega_out, T, B);
+ float phi = 2 * (float) M_PI * randu;
+ float cosTheta = powf(randv, 1 / (m_invroughness + 1));
+ float sinTheta2 = 1 - cosTheta * cosTheta;
+ float sinTheta = sinTheta2 > 0 ? sqrtf(sinTheta2) : 0;
+ omega_in = (cosf(phi) * sinTheta) * T +
+ (sinf(phi) * sinTheta) * B +
+ ( cosTheta) * omega_out;
+ if (Ng.dot(omega_in) > 0)
+ {
+ // common terms for pdf and eval
+ float cosNI = m_N.dot(omega_in);
+ // make sure the direction we chose is still in the right hemisphere
+ if (cosNI > 0)
+ {
+ pdf = 0.5f * (float) M_1_PI * powf(cosTheta, m_invroughness);
+ pdf = (m_invroughness + 1) * pdf;
+ eval.setValue(pdf, pdf, pdf);
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // exponent but the exact relationship is complex and
+ // requires more ops than are practical.
+ domega_in_dx *= 10;
+ domega_in_dy *= 10;
+ }
+ }
+ }
+ return Labels::REFLECT;
+ }
+
+};
+
+
+class WestinSheenClosure : public BSDFClosure {
+public:
+ Vec3 m_N;
+ float m_edginess;
+// float m_normalization;
+ WestinSheenClosure() : BSDFClosure(Labels::DIFFUSE) { }
+
+ void setup() {};
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const WestinSheenClosure *comp = (const WestinSheenClosure *)other;
+ return m_N == comp->m_N && m_edginess == comp->m_edginess &&
+ BSDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "westin_sheen"; }
+
+ void print_on (std::ostream &out) const
+ {
+ out << name() << " (";
+ out << "(" << m_N[0] << ", " << m_N[1] << ", " << m_N[2] << "), ";
+ out << m_edginess;
+ out << ")";
+ }
+
+ float albedo (const Vec3 &omega_out) const
+ {
+ return 1.0f;
+ }
+
+ Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float &pdf) const
+ {
+ // pdf is implicitly 0 (no indirect sampling)
+ float cosNO = m_N.dot(omega_out);
+ float cosNI = m_N.dot(omega_in);
+ if (cosNO > 0 && cosNI > 0) {
+ float sinNO2 = 1 - cosNO * cosNO;
+ pdf = cosNI * float(M_1_PI);
+ float westin = sinNO2 > 0 ? powf(sinNO2, 0.5f * m_edginess) * pdf : 0;
+ return Color3 (westin, westin, westin);
+ }
+ return Color3 (0, 0, 0);
+ }
+
+ Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float &pdf) const
+ {
+ return Color3 (0, 0, 0);
+ }
+
+ ustring sample (const Vec3 &Ng,
+ const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
+ float randu, float randv,
+ Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
+ float &pdf, Color3 &eval) const
+ {
+ // we are viewing the surface from the right side - send a ray out with cosine
+ // distribution over the hemisphere
+ sample_cos_hemisphere (m_N, omega_out, randu, randv, omega_in, pdf);
+ if (Ng.dot(omega_in) > 0) {
+ // TODO: account for sheen when sampling
+ float cosNO = m_N.dot(omega_out);
+ float sinNO2 = 1 - cosNO * cosNO;
+ float westin = sinNO2 > 0 ? powf(sinNO2, 0.5f * m_edginess) * pdf : 0;
+ eval.setValue(westin, westin, westin);
+ // TODO: find a better approximation for the diffuse bounce
+ domega_in_dx = (2 * m_N.dot(domega_out_dx)) * m_N - domega_out_dx;
+ domega_in_dy = (2 * m_N.dot(domega_out_dy)) * m_N - domega_out_dy;
+ domega_in_dx *= 125;
+ domega_in_dy *= 125;
+ } else
+ pdf = 0;
+ return Labels::REFLECT;
+ }
+};
+
+
+
+ClosureParam bsdf_westin_backscatter_params[] = {
+ CLOSURE_VECTOR_PARAM(WestinBackscatterClosure, m_N),
+ CLOSURE_FLOAT_PARAM (WestinBackscatterClosure, m_roughness),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(WestinBackscatterClosure) };
+
+ClosureParam bsdf_westin_sheen_params[] = {
+ CLOSURE_VECTOR_PARAM(WestinSheenClosure, m_N),
+ CLOSURE_FLOAT_PARAM (WestinSheenClosure, m_edginess),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(WestinSheenClosure) };
+
+CLOSURE_PREPARE(bsdf_westin_backscatter_prepare, WestinBackscatterClosure)
+CLOSURE_PREPARE(bsdf_westin_sheen_prepare, WestinSheenClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/bssrdf.cpp b/intern/cycles/kernel/osl/bssrdf.cpp
new file mode 100644
index 00000000000..66d7818e677
--- /dev/null
+++ b/intern/cycles/kernel/osl/bssrdf.cpp
@@ -0,0 +1,105 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+class BSSRDFCubicClosure : public BSSRDFClosure {
+public:
+ Color3 m_radius;
+ Color3 m_scale;
+ float m_max_radius;
+
+ template <typename T>
+ static inline T pow3 (const T &x) { return x * x * x; }
+
+ template <typename T>
+ static inline T pow5 (const T &x) { T x2 = x * x; return x2 * x2 * x; }
+
+ BSSRDFCubicClosure() { }
+
+ void setup()
+ {
+ // pre-compute some terms
+ m_max_radius = 0;
+ for (int i = 0; i < 3; i++) {
+ m_scale[i] = m_radius[i] > 0 ? 4 / pow5 (m_radius[i]) : 0;
+ m_max_radius = std::max (m_max_radius, m_radius[i]);
+ }
+ }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const BSSRDFCubicClosure *comp = (const BSSRDFCubicClosure *)other;
+ return m_radius == comp->m_radius && BSSRDFClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "bssrdf_cubic"; }
+
+ void print_on (std::ostream &out) const
+ {
+ out << name() << " ((" << m_radius[0] << ", " << m_radius[1] << ", " << m_radius[2] << "), ("
+ << m_scale[0] << ", " << m_scale[1] << ", " << m_scale[2] << "))";
+ }
+
+ Color3 eval (float r) const
+ {
+ return Color3 ((r < m_radius.x) ? pow3 (m_radius.x - r) * m_scale.x : 0,
+ (r < m_radius.y) ? pow3 (m_radius.y - r) * m_scale.y : 0,
+ (r < m_radius.z) ? pow3 (m_radius.z - r) * m_scale.z : 0);
+ }
+
+ float max_radius() const
+ {
+ return m_max_radius;
+ }
+};
+
+
+
+ClosureParam closure_bssrdf_cubic_params[] = {
+ CLOSURE_COLOR_PARAM (BSSRDFCubicClosure, m_radius),
+ CLOSURE_STRING_KEYPARAM ("label"),
+ CLOSURE_FINISH_PARAM(BSSRDFCubicClosure) };
+
+CLOSURE_PREPARE(closure_bssrdf_cubic_prepare, BSSRDFCubicClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/debug.cpp b/intern/cycles/kernel/osl/debug.cpp
new file mode 100644
index 00000000000..8c3f8b2b323
--- /dev/null
+++ b/intern/cycles/kernel/osl/debug.cpp
@@ -0,0 +1,80 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+/// Debug closure
+///
+/// This is going to be used for mask AOV's and similar
+/// purposes. A tag (string) is always associated with
+/// this closure, that "selects: the channel where the
+/// weight should be sent.
+
+class DebugClosure : public ClosurePrimitive {
+public:
+ ustring m_tag;
+
+ DebugClosure () : ClosurePrimitive (Debug) { }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const DebugClosure *comp = (const DebugClosure *)other;
+ return m_tag == comp->m_tag &&
+ ClosurePrimitive::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "debug"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " (\"" << m_tag.c_str() << "\")";
+ }
+
+};
+
+ClosureParam closure_debug_params[] = {
+ CLOSURE_STRING_PARAM(DebugClosure, m_tag),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(DebugClosure) };
+
+CLOSURE_PREPARE(closure_debug_prepare, DebugClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/emissive.cpp b/intern/cycles/kernel/osl/emissive.cpp
new file mode 100644
index 00000000000..2d2d6e1fdde
--- /dev/null
+++ b/intern/cycles/kernel/osl/emissive.cpp
@@ -0,0 +1,107 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+/// Variable cone emissive closure
+///
+/// This primitive emits in a cone having a configurable
+/// penumbra area where the light decays to 0 reaching the
+/// outer_angle limit. It can also behave as a lambertian emitter
+/// if the provided angles are PI/2, which is the default
+///
+class GenericEmissiveClosure : public EmissiveClosure {
+public:
+ GenericEmissiveClosure() { }
+
+ void setup() { }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "emission"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << "()";
+ }
+
+ Color3 eval (const Vec3 &Ng, const Vec3 &omega_out) const
+ {
+ float cosNO = fabsf(Ng.dot(omega_out));
+ float res = cosNO > 0 ? 1.0f: 0.0f;
+ return Color3(res, res, res);
+ }
+
+ void sample (const Vec3 &Ng, float randu, float randv,
+ Vec3 &omega_out, float &pdf) const
+ {
+ // We don't do anything sophisticated here for the step
+ // We just sample the whole cone uniformly to the cosine
+ Vec3 T, B;
+ make_orthonormals(Ng, T, B);
+ float phi = 2 * (float) M_PI * randu;
+ float cosTheta = sqrtf(1.0f - 1.0f * randv);
+ float sinTheta = sqrtf(1.0f - cosTheta * cosTheta);
+ omega_out = (cosf(phi) * sinTheta) * T +
+ (sinf(phi) * sinTheta) * B +
+ cosTheta * Ng;
+ pdf = 1.0f / float(M_PI);
+ }
+
+ /// Return the probability distribution function in the direction omega_out,
+ /// given the parameters and the light's surface normal. This MUST match
+ /// the PDF computed by sample().
+ float pdf (const Vec3 &Ng,
+ const Vec3 &omega_out) const
+ {
+ float cosNO = Ng.dot(omega_out);
+ return cosNO > 0 ? 1.0f: 0.0f;
+ }
+};
+
+
+
+ClosureParam closure_emission_params[] = {
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(GenericEmissiveClosure) };
+
+CLOSURE_PREPARE(closure_emission_prepare, GenericEmissiveClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/nodes/CMakeLists.txt b/intern/cycles/kernel/osl/nodes/CMakeLists.txt
new file mode 100644
index 00000000000..1b8b81eb6f6
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/CMakeLists.txt
@@ -0,0 +1,81 @@
+
+# OSL node shaders
+
+set(SRC_OSL
+ node_add_closure.osl
+ node_attribute.osl
+ node_background.osl
+ node_blend_texture.osl
+ node_bump.osl
+ node_clouds_texture.osl
+ node_convert_from_color.osl
+ node_convert_from_float.osl
+ node_convert_from_normal.osl
+ node_convert_from_point.osl
+ node_convert_from_vector.osl
+ node_diffuse_bsdf.osl
+ node_distorted_noise_texture.osl
+ node_emission.osl
+ node_environment_texture.osl
+ node_fresnel.osl
+ node_geometry.osl
+ node_glass_bsdf.osl
+ node_glossy_bsdf.osl
+ node_image_texture.osl
+ node_light_path.osl
+ node_magic_texture.osl
+ node_mapping.osl
+ node_marble_texture.osl
+ node_math.osl
+ node_mix.osl
+ node_mix_closure.osl
+ node_musgrave_texture.osl
+ node_blend_weight_texture.osl
+ node_noise_texture.osl
+ node_output_displacement.osl
+ node_output_surface.osl
+ node_output_volume.osl
+ node_sky_texture.osl
+ node_stucci_texture.osl
+ node_texture_coordinate.osl
+ node_translucent_bsdf.osl
+ node_transparent_bsdf.osl
+ node_value.osl
+ node_vector_math.osl
+ node_velvet_bsdf.osl
+ node_voronoi_texture.osl
+ node_ward_bsdf.osl
+ node_wood_texture.osl
+)
+
+set(SRC_OSL_HEADERS
+ node_texture.h
+ node_color.h
+ node_fresnel.h
+ stdosl.h
+)
+
+set(SRC_OSO
+
+)
+
+# TODO, add a module to compile OSL
+foreach(_file ${SRC_OSL})
+ set(_OSL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${_file})
+ string(REPLACE ".osl" ".oso" _OSO_FILE ${_OSL_FILE}) # TODO, replace extension only
+ string(REPLACE ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} _OSO_FILE ${_OSO_FILE})
+ add_custom_command(
+ OUTPUT ${_OSO_FILE}
+ COMMAND ${OSL_COMPILER} -O2 ${_OSL_FILE}
+ DEPENDS ${_OSL_FILE} ${SRC_OSL_HEADERS})
+ list(APPEND SRC_OSO
+ ${_OSO_FILE}
+ )
+
+ unset(_OSL_FILE)
+ unset(_OSO_FILE)
+endforeach()
+
+add_custom_target(shader ALL DEPENDS ${SRC_OSO} ${SRC_OSL_HEADERS})
+
+delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_OSO}" ${CYCLES_INSTALL_PATH}/shader)
diff --git a/intern/cycles/kernel/osl/nodes/node_add_closure.osl b/intern/cycles/kernel/osl/nodes/node_add_closure.osl
new file mode 100644
index 00000000000..ecf6bf5912e
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_add_closure.osl
@@ -0,0 +1,28 @@
+/*
+ * 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_add_closure(
+ closure color Closure1 = background(),
+ closure color Closure2 = background(),
+ output closure color Closure = background())
+{
+ Closure = Closure1 + Closure2;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_attribute.osl b/intern/cycles/kernel/osl/nodes/node_attribute.osl
new file mode 100644
index 00000000000..d273d0c68d7
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_attribute.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"
+
+shader node_attribute(
+ string bump_offset = "center",
+ string name = "",
+ output point Vector = point(0.0, 0.0, 0.0),
+ output color Color = color(0.0, 0.0, 0.0),
+ output float Fac = 0.0)
+{
+ getattribute(name, Color);
+ Vector = point(Color);
+ getattribute(name, Fac);
+
+ if(bump_offset == "dx") {
+ Color += Dx(Color);
+ Vector += Dx(Vector);
+ Fac += Dx(Fac);
+ }
+ else if(bump_offset == "dy") {
+ Color += Dy(Color);
+ Vector += Dy(Vector);
+ Fac += Dy(Fac);
+ }
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_background.osl b/intern/cycles/kernel/osl/nodes/node_background.osl
new file mode 100644
index 00000000000..69f8d85a82e
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_background.osl
@@ -0,0 +1,28 @@
+/*
+ * 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_background(
+ color Color = color(0.8, 0.8, 0.8),
+ float Strength = 1.0,
+ output closure color Background = background())
+{
+ Background = Color*Strength*background();
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_blend_texture.osl b/intern/cycles/kernel/osl/nodes/node_blend_texture.osl
new file mode 100644
index 00000000000..de1bdaca90b
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_blend_texture.osl
@@ -0,0 +1,78 @@
+/*
+ * 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_texture.h"
+
+/* Blend */
+
+float blend(point p, string progression, string axis)
+{
+ float x, y;
+
+ if(axis == "Vertical") {
+ x= p[1];
+ y= p[0];
+ }
+ else {
+ x= p[0];
+ y= p[1];
+ }
+
+ float result = 0.0;
+
+ if(progression == "Linear") {
+ result = (1.0 + x)/2.0;
+ }
+ else if(progression == "Quadratic") {
+ float r = max((1.0 + x)/2.0, 0.0);
+ result = r*r;
+ }
+ else if(progression == "Easing") {
+ float r = min(max((1.0 + x)/2.0, 0.0), 1.0);
+ float t = r*r;
+
+ result = (3.0*t - 2.0*t*r);
+ }
+ else if(progression == "Diagonal") {
+ result = (2.0 + x + y)/4.0;
+ }
+ else if(progression == "Radial") {
+ result = atan2(y, x)/(2*M_PI) + 0.5;
+ }
+ else {
+ float r = max(1.0 - sqrt(x*x + y*y + p[2]*p[2]), 0.0);
+
+ if(progression == "Quadratic Sphere")
+ result = r*r;
+ else if(progression == "Spherical")
+ result = r;
+ }
+
+ return result;
+}
+
+shader node_blend_texture(
+ string Progression = "Linear",
+ string Axis = "Horizontal",
+ point Vector = P,
+ output float Fac = 0.0)
+{
+ Fac = blend(Vector, Progression, Axis);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_blend_weight.osl b/intern/cycles/kernel/osl/nodes/node_blend_weight.osl
new file mode 100644
index 00000000000..d834819ef3a
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_blend_weight.osl
@@ -0,0 +1,42 @@
+/*
+ * 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_fresnel.h"
+
+shader node_blend_weight(
+ float Blend = 0.3,
+ normal Normal = N,
+ output float Fresnel = 0.0,
+ output float Facing = 0.0)
+{
+ float f = max(1.0 - Blend, 1e-5);
+ Fresnel = fresnel_dielectric(I, Normal, backfacing()? f: 1.0/f);
+
+ Facing = abs(dot(I, Normal));
+
+ if(Blend != 0.5) {
+ Blend = clamp(Blend, 0.0, 1.0);
+ Blend = (Blend < 0.5)? 2.0*Blend: 0.5/(1.0 - Blend);
+
+ Facing = powf(Facing, Blend);
+ }
+
+ Facing = 1.0 - Facing;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_bump.osl b/intern/cycles/kernel/osl/nodes/node_bump.osl
new file mode 100644
index 00000000000..a3849e70f98
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_bump.osl
@@ -0,0 +1,46 @@
+/*
+ * 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"
+
+/* "Bump Mapping Unparametrized Surfaces on the GPU"
+ * Morten S. Mikkelsen, 2010 */
+
+surface node_bump(
+ float SampleCenter = 0.0,
+ float SampleX = 0.0,
+ float SampleY = 0.0,
+ output normal Normal = N)
+{
+ float dx = SampleX - SampleCenter;
+ float dy = SampleY - SampleCenter;
+
+ vector dPdx = Dx(P);
+ vector dPdy = Dy(P);
+
+ vector Rx = cross(dPdy, N);
+ vector Ry = cross(N, dPdx);
+
+ float det = dot(dPdx, Rx);
+ vector surfgrad = dx*Rx + dy*Ry;
+
+ surfgrad *= 0.1; /* todo: remove this factor */
+
+ Normal = normalize(abs(det)*N - sign(det)*surfgrad);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_clouds_texture.osl b/intern/cycles/kernel/osl/nodes/node_clouds_texture.osl
new file mode 100644
index 00000000000..6d244d81e27
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_clouds_texture.osl
@@ -0,0 +1,42 @@
+/*
+ * 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_texture.h"
+
+/* Turbulence */
+
+shader node_clouds_texture(
+ string Basis = "Perlin",
+ int Hard = 0,
+ int Depth = 2,
+ float Size = 0.25,
+ point Vector = P,
+ output float Fac = 0.0,
+ output color Color = color(0.0, 0.0, 0.0))
+{
+ float size = nonzero(Size, 1e-5);
+ point p = Vector/size;
+
+ Fac = noise_turbulence(p, Basis, Depth, Hard);
+
+ Color[0] = Fac;
+ Color[1] = noise_turbulence(point(p[1], p[0], p[2]), Basis, Depth, Hard);
+ Color[2] = noise_turbulence(point(p[1], p[2], p[0]), Basis, Depth, Hard);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_color.h b/intern/cycles/kernel/osl/nodes/node_color.h
new file mode 100644
index 00000000000..b92973d1dfe
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_color.h
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+/* Color Management */
+
+float color_srgb_to_scene_linear(float c)
+{
+ if(c < 0.04045)
+ return (c < 0.0)? 0.0: c * (1.0/12.92);
+ else
+ return pow((c + 0.055)*(1.0/1.055), 2.4);
+}
+
+float color_scene_linear_to_srgb(float c)
+{
+ if(c < 0.0031308)
+ return (c < 0.0)? 0.0: c * 12.92;
+ else
+ return 1.055 * pow(c, 1.0/2.4) - 0.055;
+}
+
+color color_srgb_to_scene_linear(color c)
+{
+ return color(
+ color_srgb_to_scene_linear(c[0]),
+ color_srgb_to_scene_linear(c[1]),
+ color_srgb_to_scene_linear(c[2]));
+}
+
+color color_scene_linear_to_srgb(color c)
+{
+ return color(
+ color_scene_linear_to_srgb(c[0]),
+ color_scene_linear_to_srgb(c[1]),
+ color_scene_linear_to_srgb(c[2]));
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_convert_from_color.osl b/intern/cycles/kernel/osl/nodes/node_convert_from_color.osl
new file mode 100644
index 00000000000..97356139c48
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_convert_from_color.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_convert_from_color(
+ color Color = color(0.0, 0.0, 0.0),
+ output float Val = 0.0,
+ output vector Vector = vector(0.0, 0.0, 0.0),
+ output point Point = point(0.0, 0.0, 0.0),
+ output normal Normal = normal(0.0, 0.0, 0.0))
+{
+ Val = Color[0]*0.2126 + Color[1]*0.7152 + Color[2]*0.0722;
+ Vector = vector(Color[0], Color[1], Color[2]);
+ Point = point(Color[0], Color[1], Color[2]);
+ Normal = normal(Color[0], Color[1], Color[2]);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_convert_from_float.osl b/intern/cycles/kernel/osl/nodes/node_convert_from_float.osl
new file mode 100644
index 00000000000..00e78f3bab4
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_convert_from_float.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_convert_from_float(
+ float Val = 0.0,
+ output color Color = color(0.0, 0.0, 0.0),
+ output vector Vector = vector(0.0, 0.0, 0.0),
+ output point Point = point(0.0, 0.0, 0.0),
+ output normal Normal = normal(0.0, 0.0, 0.0))
+{
+ Color = color(Val, Val, Val);
+ Vector = vector(Val, Val, Val);
+ Point = point(Val, Val, Val);
+ Normal = normal(Val, Val, Val);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_convert_from_normal.osl b/intern/cycles/kernel/osl/nodes/node_convert_from_normal.osl
new file mode 100644
index 00000000000..0bb9092591d
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_convert_from_normal.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_convert_from_normal(
+ normal Normal = normal(0.0, 0.0, 0.0),
+ output float Val = 0.0,
+ output vector Vector = vector(0.0, 0.0, 0.0),
+ output color Color = color(0.0, 0.0, 0.0),
+ output point Point = point(0.0, 0.0, 0.0))
+{
+ Val = (Normal[0] + Normal[1] + Normal[2])*(1.0/3.0);
+ Vector = vector(Normal[0], Normal[1], Normal[2]);
+ Color = color(Normal[0], Normal[1], Normal[2]);
+ Point = point(Normal[0], Normal[1], Normal[2]);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_convert_from_point.osl b/intern/cycles/kernel/osl/nodes/node_convert_from_point.osl
new file mode 100644
index 00000000000..e66d6a864d6
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_convert_from_point.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_convert_from_point(
+ point Point = point(0.0, 0.0, 0.0),
+ output float Val = 0.0,
+ output vector Vector = vector(0.0, 0.0, 0.0),
+ output color Color = color(0.0, 0.0, 0.0),
+ output normal Normal = normal(0.0, 0.0, 0.0))
+{
+ Val = (Point[0] + Point[1] + Point[2])*(1.0/3.0);
+ Vector = vector(Point[0], Point[1], Point[2]);
+ Color = color(Point[0], Point[1], Point[2]);
+ Normal = normal(Point[0], Point[1], Point[2]);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_convert_from_vector.osl b/intern/cycles/kernel/osl/nodes/node_convert_from_vector.osl
new file mode 100644
index 00000000000..37ba9582cad
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_convert_from_vector.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_convert_from_vector(
+ vector Vector = vector(0.0, 0.0, 0.0),
+ output float Val = 0.0,
+ output color Color = color(0.0, 0.0, 0.0),
+ output point Point = point(0.0, 0.0, 0.0),
+ output normal Normal = normal(0.0, 0.0, 0.0))
+{
+ Val = (Vector[0] + Vector[1] + Vector[2])*(1.0/3.0);
+ Color = color(Vector[0], Vector[1], Vector[2]);
+ Point = point(Vector[0], Vector[1], Vector[2]);
+ Normal = normal(Vector[0], Vector[1], Vector[2]);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_diffuse_bsdf.osl b/intern/cycles/kernel/osl/nodes/node_diffuse_bsdf.osl
new file mode 100644
index 00000000000..8cf161c17cc
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_diffuse_bsdf.osl
@@ -0,0 +1,28 @@
+/*
+ * 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_diffuse_bsdf(
+ color Color = color(0.8, 0.8, 0.8),
+ normal Normal = N,
+ output closure color BSDF = diffuse(Normal))
+{
+ BSDF = Color*diffuse(Normal);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_distorted_noise_texture.osl b/intern/cycles/kernel/osl/nodes/node_distorted_noise_texture.osl
new file mode 100644
index 00000000000..bb338c4ef0f
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_distorted_noise_texture.osl
@@ -0,0 +1,46 @@
+/*
+ * 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_texture.h"
+
+/* Distorted Noise (variable lacunarity noise) */
+
+float noise_distorted(point p, string basis, string distortion_basis, float distortion)
+{
+ point r;
+
+ r[0] = noise_basis(p + point(13.5), basis) * distortion;
+ r[1] = noise_basis(p, basis) * distortion;
+ r[2] = noise_basis(p - point(13.5), basis) * distortion;
+
+ return noise_basis(p + r, distortion_basis); /* distorted-domain noise */
+}
+
+shader node_distorted_noise_texture(
+ string Basis = "Perlin",
+ string DistortionBasis = "Perlin",
+ float Distortion = 1.0,
+ float Size = 0.25,
+ point Vector = P,
+ output float Fac = 0.0)
+{
+ float size = nonzero(Size, 1e-5);
+ Fac = noise_distorted(Vector/size, Basis, DistortionBasis, Distortion);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_emission.osl b/intern/cycles/kernel/osl/nodes/node_emission.osl
new file mode 100644
index 00000000000..8bfd1af173a
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_emission.osl
@@ -0,0 +1,32 @@
+/*
+ * 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_emission(
+ int TotalPower = 0,
+ color Color = color(0.8, 0.8, 0.8),
+ float Strength = 1.0,
+ output closure color Emission = emission())
+{
+ if(TotalPower)
+ Emission = ((Strength/surfacearea())*Color)*emission();
+ else
+ Emission = (Strength*Color)*emission();
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_environment_texture.osl b/intern/cycles/kernel/osl/nodes/node_environment_texture.osl
new file mode 100644
index 00000000000..3ad806781eb
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_environment_texture.osl
@@ -0,0 +1,34 @@
+/*
+ * 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_environment_texture(
+ vector Vector = P,
+ string filename = "",
+ string color_space = "sRGB",
+ output color Color = color(0.0, 0.0, 0.0),
+ output float Alpha = 1.0)
+{
+ Color = (color)environment(filename, Vector, "alpha", Alpha);
+
+ if(color_space == "sRGB")
+ Color = color_srgb_to_scene_linear(Color);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_fresnel.h b/intern/cycles/kernel/osl/nodes/node_fresnel.h
new file mode 100644
index 00000000000..0c8a5276ede
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_fresnel.h
@@ -0,0 +1,21 @@
+
+float fresnel_dielectric(vector Incoming, normal Normal, float eta)
+{
+ /* compute fresnel reflectance without explicitly computing
+ the refracted direction */
+ float c = fabs(dot(Incoming, Normal));
+ float g = eta * eta - 1 + c * c;
+ float result;
+
+ if(g > 0) {
+ g = sqrt(g);
+ float A =(g - c)/(g + c);
+ float B =(c *(g + c)- 1)/(c *(g - c)+ 1);
+ result = 0.5 * A * A *(1 + B * B);
+ }
+ else
+ result = 1.0; /* TIR (no refracted component) */
+
+ return result;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_fresnel.osl b/intern/cycles/kernel/osl/nodes/node_fresnel.osl
new file mode 100644
index 00000000000..3af4448b43f
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_fresnel.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"
+#include "node_fresnel.h"
+
+shader node_fresnel(
+ float IOR = 1.45,
+ normal Normal = N,
+ output float Fac = 0.0)
+{
+ float f = max(IOR, 1.0 + 1e-5);
+ float eta = backfacing()? 1.0/f: f;
+ Fac = fresnel_dielectric(I, Normal, eta);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_geometry.osl b/intern/cycles/kernel/osl/nodes/node_geometry.osl
new file mode 100644
index 00000000000..9efc2a75c64
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_geometry.osl
@@ -0,0 +1,50 @@
+/*
+ * 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_geometry(
+ normal NormalIn = N,
+ string bump_offset = "center",
+
+ output point Position = point(0.0, 0.0, 0.0),
+ output normal Normal = normal(0.0, 0.0, 0.0),
+ output normal Tangent = normal(0.0, 0.0, 0.0),
+ output normal TrueNormal = normal(0.0, 0.0, 0.0),
+ output vector Incoming = vector(0.0, 0.0, 0.0),
+ output point Parametric = point(0.0, 0.0, 0.0),
+ output float Backfacing = 0.0)
+{
+ Position = P;
+ Normal = NormalIn;
+ Tangent = normalize(dPdu);
+ TrueNormal = Ng;
+ Incoming = I;
+ Parametric = point(u, v, 0.0);
+ Backfacing = backfacing();
+
+ if(bump_offset == "dx") {
+ Position += Dx(Position);
+ Parametric += Dx(Parametric);
+ }
+ else if(bump_offset == "dy") {
+ Position += Dy(Position);
+ Parametric += Dy(Parametric);
+ }
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_glass_bsdf.osl b/intern/cycles/kernel/osl/nodes/node_glass_bsdf.osl
new file mode 100644
index 00000000000..cc2104af56f
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_glass_bsdf.osl
@@ -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.
+ */
+
+#include "stdosl.h"
+#include "node_fresnel.h"
+
+shader node_glass_bsdf(
+ color Color = color(0.8, 0.8, 0.8),
+ string distribution = "Sharp",
+ float Roughness = 0.2,
+ float IOR = 1.45,
+ normal Normal = N,
+ output closure color BSDF = diffuse(Normal))
+{
+ float f = max(IOR, 1.0 + 1e-5);
+ float eta = backfacing()? 1.0/f: f;
+ float Fr = fresnel_dielectric(I, Normal, eta);
+
+ if(distribution == "Sharp")
+ BSDF = Color*(Fr*reflection(Normal) + (1.0-Fr)*refraction(Normal, eta));
+ else if(distribution == "Beckmann")
+ BSDF = Color*(Fr*microfacet_beckmann(Normal, Roughness) + (1.0-Fr)*microfacet_beckmann_refraction(Normal, Roughness, eta));
+ else if(distribution == "GGX")
+ BSDF = Color*(Fr*microfacet_ggx(Normal, Roughness) + (1.0-Fr)*microfacet_ggx_refraction(Normal, Roughness, eta));
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_glossy_bsdf.osl b/intern/cycles/kernel/osl/nodes/node_glossy_bsdf.osl
new file mode 100644
index 00000000000..aa446b66cfb
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_glossy_bsdf.osl
@@ -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.
+ */
+
+#include "stdosl.h"
+#include "node_fresnel.h"
+
+shader node_glossy_bsdf(
+ color Color = color(0.8, 0.8, 0.8),
+ string distribution = "Beckmann",
+ float Roughness = 0.2,
+ normal Normal = N,
+ output closure color BSDF = diffuse(Normal))
+{
+ if(distribution == "Sharp")
+ BSDF = Color*reflection(Normal);
+ else if(distribution == "Beckmann")
+ BSDF = Color*microfacet_beckmann(Normal, Roughness);
+ else if(distribution == "GGX")
+ BSDF = Color*microfacet_ggx(Normal, Roughness);
+
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_holdout.osl b/intern/cycles/kernel/osl/nodes/node_holdout.osl
new file mode 100644
index 00000000000..69f8d85a82e
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_holdout.osl
@@ -0,0 +1,28 @@
+/*
+ * 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_background(
+ color Color = color(0.8, 0.8, 0.8),
+ float Strength = 1.0,
+ output closure color Background = background())
+{
+ Background = Color*Strength*background();
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_image_texture.osl b/intern/cycles/kernel/osl/nodes/node_image_texture.osl
new file mode 100644
index 00000000000..38126401d76
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_image_texture.osl
@@ -0,0 +1,34 @@
+/*
+ * 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_image_texture(
+ point Vector = P,
+ string filename = "",
+ string color_space = "sRGB",
+ output color Color = color(0.0, 0.0, 0.0),
+ output float Alpha = 1.0)
+{
+ Color = (color)texture(filename, Vector[0], 1.0-Vector[1], "wrap", "periodic", "alpha", Alpha);
+
+ if(color_space == "sRGB")
+ Color = color_srgb_to_scene_linear(Color);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_light_path.osl b/intern/cycles/kernel/osl/nodes/node_light_path.osl
new file mode 100644
index 00000000000..0ead20bf2bb
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_light_path.osl
@@ -0,0 +1,38 @@
+/*
+ * 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_light_path(
+ output float IsCameraRay = 0.0,
+ output float IsShadowRay = 0.0,
+ output float IsDiffuseRay = 0.0,
+ output float IsGlossyRay = 0.0,
+ output float IsSingularRay = 0.0,
+ output float IsReflectionRay = 0.0,
+ output float IsTransmissionRay = 0.0)
+{
+ IsCameraRay = raytype("camera");
+ IsShadowRay = raytype("shadow");
+ IsDiffuseRay = raytype("diffuse");
+ IsGlossyRay = raytype("glossy");
+ IsSingularRay = raytype("singular");
+ IsReflectionRay = raytype("reflection");
+ IsTransmissionRay = raytype("refraction");
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_magic_texture.osl b/intern/cycles/kernel/osl/nodes/node_magic_texture.osl
new file mode 100644
index 00000000000..0b6e980debc
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_magic_texture.osl
@@ -0,0 +1,103 @@
+/*
+ * 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_texture.h"
+
+/* Magic */
+
+color magic(point p, int n, float turbulence)
+{
+ float turb = turbulence/5.0;
+
+ float x = sin((p[0] + p[1] + p[2])*5.0);
+ float y = cos((-p[0] + p[1] - p[2])*5.0);
+ float z = -cos((-p[0] - p[1] + p[2])*5.0);
+
+ if(n > 0) {
+ x *= turb;
+ y *= turb;
+ z *= turb;
+ y = -cos(x-y+z);
+ y *= turb;
+
+ if(n > 1) {
+ x= cos(x-y-z);
+ x *= turb;
+
+ if(n > 2) {
+ z= sin(-x-y-z);
+ z *= turb;
+
+ if(n > 3) {
+ x= -cos(-x+y-z);
+ x *= turb;
+
+ if(n > 4) {
+ y= -sin(-x+y+z);
+ y *= turb;
+
+ if(n > 5) {
+ y= -cos(-x+y+z);
+ y *= turb;
+
+ if(n > 6) {
+ x= cos(x+y+z);
+ x *= turb;
+
+ if(n > 7) {
+ z= sin(x+y-z);
+ z *= turb;
+
+ if(n > 8) {
+ x= -cos(-x-y+z);
+ x *= turb;
+
+ if(n > 9) {
+ y= -sin(x-y+z);
+ y *= turb;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(turb != 0.0) {
+ turb *= 2.0;
+ x /= turb;
+ y /= turb;
+ z /= turb;
+ }
+
+ return color(0.5 - x, 0.5 - y, 0.5 - z);
+}
+
+shader node_magic_texture(
+ int Depth = 2,
+ float Turbulence = 5.0,
+ point Vector = P,
+ output color Color = color(0.0, 0.0, 0.0))
+{
+ Color = magic(Vector, Depth, Turbulence);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_mapping.osl b/intern/cycles/kernel/osl/nodes/node_mapping.osl
new file mode 100644
index 00000000000..f342837d3c9
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_mapping.osl
@@ -0,0 +1,28 @@
+/*
+ * 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_mapping(
+ matrix Matrix = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
+ point Vector = point(0.0, 0.0, 0.0),
+ output point Vector_ = point(0.0, 0.0, 0.0))
+{
+ Vector_ = transform(Matrix, Vector);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_marble_texture.osl b/intern/cycles/kernel/osl/nodes/node_marble_texture.osl
new file mode 100644
index 00000000000..9e18dee3235
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_marble_texture.osl
@@ -0,0 +1,58 @@
+/*
+ * 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_texture.h"
+
+/* Marble */
+
+float marble(point p, float size, string type, string wave, string basis, int hard, float turb, int depth)
+{
+ float x = p[0];
+ float y = p[1];
+ float z = p[2];
+
+ float n = 5.0 * (x + y + z);
+
+ float mi = n + turb * noise_turbulence(p/size, basis, depth, hard);
+
+ mi = noise_wave(wave, mi);
+
+ if(type == "Sharp")
+ mi = sqrt(mi);
+ else if(type == "Sharper")
+ mi = sqrt(sqrt(mi));
+
+ return mi;
+}
+
+shader node_marble_texture(
+ string Type = "Soft",
+ string Wave = "Sine",
+ string Basis = "Perlin",
+ int Hard = 0,
+ float Size = 0.25,
+ float Turbulence = 5.0,
+ int Depth = 2,
+ point Vector = P,
+ output float Fac = 0.0)
+{
+ float size = nonzero(Size, 1e-5);
+ Fac = marble(Vector, size, Type, Wave, Basis, Hard, Turbulence, Depth);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_math.osl b/intern/cycles/kernel/osl/nodes/node_math.osl
new file mode 100644
index 00000000000..be9bb71d511
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_math.osl
@@ -0,0 +1,84 @@
+/*
+ * 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"
+
+float safe_divide(float a, float b)
+{
+ float result;
+
+ if(b == 0.0)
+ result = 0.0;
+ else
+ result = a/b;
+
+ return result;
+}
+
+float safe_log(float a, float b)
+{
+ if(a < 0.0 || b < 0.0)
+ return 0.0;
+
+ return log(a)/log(b);
+}
+
+shader node_math(
+ string type = "Add",
+ float Value1 = 0.0,
+ float Value2 = 0.0,
+ output float Value = 0.0)
+{
+ /* OSL asin, acos, pow check for values that could give rise to nan */
+
+ if(type == "Add")
+ Value = Value1 + Value2;
+ if(type == "Subtract")
+ Value = Value1 - Value2;
+ if(type == "Multiply")
+ Value = Value1*Value2;
+ if(type == "Divide")
+ Value = safe_divide(Value1, Value2);
+ if(type == "Sine")
+ Value = sin(Value1);
+ if(type == "Cosine")
+ Value = cos(Value1);
+ if(type == "Tangent")
+ Value = tan(Value1);
+ if(type == "Arcsine")
+ Value = asin(Value1);
+ if(type == "Arccosine")
+ Value = acos(Value1);
+ if(type == "Arctangent")
+ Value = atan(Value1);
+ if(type == "Power")
+ Value = pow(Value1, Value2);
+ if(type == "Logarithm")
+ Value = safe_log(Value1, Value2);
+ if(type == "Minimum")
+ Value = min(Value1, Value2);
+ if(type == "Maximum")
+ Value = max(Value1, Value2);
+ if(type == "Round")
+ Value = floor(Value1 + 0.5);
+ if(type == "Less Than")
+ Value = Value1 < Value2;
+ if(type == "Greater Than")
+ Value = Value1 > Value2;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_mix.osl b/intern/cycles/kernel/osl/nodes/node_mix.osl
new file mode 100644
index 00000000000..582aa7b3c60
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_mix.osl
@@ -0,0 +1,388 @@
+/*
+ * 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"
+
+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;
+}
+
+color node_mix_blend(float t, color col1, color col2)
+{
+ return mix(col1, col2, t);
+}
+
+color node_mix_add(float t, color col1, color col2)
+{
+ return mix(col1, col1 + col2, t);
+}
+
+color node_mix_mul(float t, color col1, color col2)
+{
+ return mix(col1, col1 * col2, t);
+}
+
+color node_mix_screen(float t, color col1, color col2)
+{
+ float tm = 1.0 - t;
+
+ return color(1.0) - (color(tm) + t*(color(1.0) - col2))*(color(1.0) - col1);
+}
+
+color node_mix_overlay(float t, color col1, color col2)
+{
+ float tm = 1.0 - t;
+
+ color outcol = col1;
+
+ if(outcol[0] < 0.5)
+ outcol[0] *= tm + 2.0*t*col2[0];
+ else
+ outcol[0] = 1.0 - (tm + 2.0*t*(1.0 - col2[0]))*(1.0 - outcol[0]);
+
+ if(outcol[1] < 0.5)
+ outcol[1] *= tm + 2.0*t*col2[1];
+ else
+ outcol[1] = 1.0 - (tm + 2.0*t*(1.0 - col2[1]))*(1.0 - outcol[1]);
+
+ if(outcol[2] < 0.5)
+ outcol[2] *= tm + 2.0*t*col2[2];
+ else
+ outcol[2] = 1.0 - (tm + 2.0*t*(1.0 - col2[2]))*(1.0 - outcol[2]);
+
+ return outcol;
+}
+
+color node_mix_sub(float t, color col1, color col2)
+{
+ return mix(col1, col1 - col2, t);
+}
+
+color node_mix_div(float t, color col1, color col2)
+{
+ float tm = 1.0 - t;
+
+ color outcol = col1;
+
+ if(col2[0] != 0.0) outcol[0] = tm*outcol[0] + t*outcol[0]/col2[0];
+ if(col2[1] != 0.0) outcol[1] = tm*outcol[1] + t*outcol[1]/col2[1];
+ if(col2[2] != 0.0) outcol[2] = tm*outcol[2] + t*outcol[2]/col2[2];
+
+ return outcol;
+}
+
+color node_mix_diff(float t, color col1, color col2)
+{
+ return mix(col1, abs(col1 - col2), t);
+}
+
+color node_mix_dark(float t, color col1, color col2)
+{
+ return min(col1, col2*t);
+}
+
+color node_mix_light(float t, color col1, color col2)
+{
+ return max(col1, col2*t);
+}
+
+color node_mix_dodge(float t, color col1, color col2)
+{
+ color outcol = col1;
+
+ if(outcol[0] != 0.0) {
+ float tmp = 1.0 - t*col2[0];
+ if(tmp <= 0.0)
+ outcol[0] = 1.0;
+ else if((tmp = outcol[0]/tmp) > 1.0)
+ outcol[0] = 1.0;
+ else
+ outcol[0] = tmp;
+ }
+ if(outcol[1] != 0.0) {
+ float tmp = 1.0 - t*col2[1];
+ if(tmp <= 0.0)
+ outcol[1] = 1.0;
+ else if((tmp = outcol[1]/tmp) > 1.0)
+ outcol[1] = 1.0;
+ else
+ outcol[1] = tmp;
+ }
+ if(outcol[2] != 0.0) {
+ float tmp = 1.0 - t*col2[2];
+ if(tmp <= 0.0)
+ outcol[2] = 1.0;
+ else if((tmp = outcol[2]/tmp) > 1.0)
+ outcol[2] = 1.0;
+ else
+ outcol[2] = tmp;
+ }
+
+ return outcol;
+}
+
+color node_mix_burn(float t, color col1, color col2)
+{
+ float tmp, tm = 1.0 - t;
+
+ color outcol = col1;
+
+ tmp = tm + t*col2[0];
+ if(tmp <= 0.0)
+ outcol[0] = 0.0;
+ else if((tmp = (1.0 - (1.0 - outcol[0])/tmp)) < 0.0)
+ outcol[0] = 0.0;
+ else if(tmp > 1.0)
+ outcol[0] = 1.0;
+ else
+ outcol[0] = tmp;
+
+ tmp = tm + t*col2[1];
+ if(tmp <= 0.0)
+ outcol[1] = 0.0;
+ else if((tmp = (1.0 - (1.0 - outcol[1])/tmp)) < 0.0)
+ outcol[1] = 0.0;
+ else if(tmp > 1.0)
+ outcol[1] = 1.0;
+ else
+ outcol[1] = tmp;
+
+ tmp = tm + t*col2[2];
+ if(tmp <= 0.0)
+ outcol[2] = 0.0;
+ else if((tmp = (1.0 - (1.0 - outcol[2])/tmp)) < 0.0)
+ outcol[2] = 0.0;
+ else if(tmp > 1.0)
+ outcol[2] = 1.0;
+ else
+ outcol[2] = tmp;
+
+ return outcol;
+}
+
+color node_mix_hue(float t, color col1, color col2)
+{
+ color outcol = col1;
+ color hsv2 = rgb_to_hsv(col2);
+
+ if(hsv2[1] != 0.0) {
+ color hsv = rgb_to_hsv(outcol);
+ hsv[0] = hsv2[0];
+ color tmp = hsv_to_rgb(hsv);
+
+ outcol = mix(outcol, tmp, t);
+ }
+
+ return outcol;
+}
+
+color node_mix_sat(float t, color col1, color col2)
+{
+ float tm = 1.0 - t;
+
+ color outcol = col1;
+
+ color hsv = rgb_to_hsv(outcol);
+
+ if(hsv[1] != 0.0) {
+ color hsv2 = rgb_to_hsv(col2);
+
+ hsv[1] = tm*hsv[1] + t*hsv2[1];
+ outcol = hsv_to_rgb(hsv);
+ }
+
+ return outcol;
+}
+
+color node_mix_val(float t, color col1, color col2)
+{
+ float tm = 1.0 - t;
+
+ color hsv = rgb_to_hsv(col1);
+ color hsv2 = rgb_to_hsv(col2);
+
+ hsv[2] = tm*hsv[2] + t*hsv2[2];
+
+ return hsv_to_rgb(hsv);
+}
+
+color node_mix_color(float t, color col1, color col2)
+{
+ color outcol = col1;
+ color hsv2 = rgb_to_hsv(col2);
+
+ if(hsv2[1] != 0.0) {
+ color hsv = rgb_to_hsv(outcol);
+ hsv[0] = hsv2[0];
+ hsv[1] = hsv2[1];
+ color tmp = hsv_to_rgb(hsv);
+
+ outcol = mix(outcol, tmp, t);
+ }
+
+ return outcol;
+}
+
+color node_mix_soft(float t, color col1, color col2)
+{
+ float tm = 1.0 - t;
+
+ color one= color(1.0);
+ color scr= one - (one - col2)*(one - col1);
+
+ return tm*col1 + t*((one - col1)*col2*col1 + col1*scr);
+}
+
+color node_mix_linear(float t, color col1, color col2)
+{
+ color outcol = col1;
+
+ if(col2[0] > 0.5)
+ outcol[0]= col1[0] + t*(2.0*(col2[0] - 0.5));
+ else
+ outcol[0]= col1[0] + t*(2.0*(col2[0]) - 1.0);
+
+ if(col2[1] > 0.5)
+ outcol[1]= col1[1] + t*(2.0*(col2[1] - 0.5));
+ else
+ outcol[1]= col1[1] + t*(2.0*(col2[1]) - 1.0);
+
+ if(col2[2] > 0.5)
+ outcol[2]= col1[2] + t*(2.0*(col2[2] - 0.5));
+ else
+ outcol[2]= col1[2] + t*(2.0*(col2[2]) - 1.0);
+
+ return outcol;
+}
+
+shader node_mix(
+ string type = "Mix",
+ float Fac = 0.5,
+ color Color1 = color(0.0, 0.0, 0.0),
+ color Color2 = color(0.0, 0.0, 0.0),
+ output color Color = color(0.0, 0.0, 0.0))
+{
+ float t = clamp(Fac, 0.0, 1.0);
+
+ if(type == "Mix")
+ Color = node_mix_blend(t, Color1, Color2);
+ if(type == "Add")
+ Color = node_mix_add(t, Color1, Color2);
+ if(type == "Multiply")
+ Color = node_mix_mul(t, Color1, Color2);
+ if(type == "Screen")
+ Color = node_mix_screen(t, Color1, Color2);
+ if(type == "Overlay")
+ Color = node_mix_overlay(t, Color1, Color2);
+ if(type == "Subtract")
+ Color = node_mix_sub(t, Color1, Color2);
+ if(type == "Divide")
+ Color = node_mix_div(t, Color1, Color2);
+ if(type == "Difference")
+ Color = node_mix_diff(t, Color1, Color2);
+ if(type == "Darken")
+ Color = node_mix_dark(t, Color1, Color2);
+ if(type == "Lighten")
+ Color = node_mix_light(t, Color1, Color2);
+ if(type == "Dodge")
+ Color = node_mix_dodge(t, Color1, Color2);
+ if(type == "Burn")
+ Color = node_mix_burn(t, Color1, Color2);
+ if(type == "Hue")
+ Color = node_mix_hue(t, Color1, Color2);
+ if(type == "Saturation")
+ Color = node_mix_sat(t, Color1, Color2);
+ if(type == "Value")
+ Color = node_mix_val (t, Color1, Color2);
+ if(type == "Color")
+ Color = node_mix_color(t, Color1, Color2);
+ if(type == "Soft Light")
+ Color = node_mix_soft(t, Color1, Color2);
+ if(type == "Linear Light")
+ Color = node_mix_linear(t, Color1, Color2);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_mix_closure.osl b/intern/cycles/kernel/osl/nodes/node_mix_closure.osl
new file mode 100644
index 00000000000..1a377abd381
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_mix_closure.osl
@@ -0,0 +1,30 @@
+/*
+ * 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_mix_closure(
+ float Fac = 0.5,
+ closure color Closure1 = background(),
+ closure color Closure2 = background(),
+ output closure color Closure = background())
+{
+ float t = clamp(Fac, 0.0, 1.0);
+ Closure = (1.0 - t)*Closure1 + t*Closure2;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_musgrave_texture.osl b/intern/cycles/kernel/osl/nodes/node_musgrave_texture.osl
new file mode 100644
index 00000000000..fbd0ce5c3bd
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_musgrave_texture.osl
@@ -0,0 +1,218 @@
+/*
+ * 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_texture.h"
+
+/* Musgrave fBm
+ *
+ * H: fractal increment parameter
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ *
+ * from "Texturing and Modelling: A procedural approach"
+ */
+
+float noise_musgrave_fBm(point p, string basis, float H, float lacunarity, float octaves)
+{
+ float rmd;
+ float value = 0.0;
+ float pwr = 1.0;
+ float pwHL = pow(lacunarity, -H);
+ int i;
+
+ for(i = 0; i < (int)octaves; i++) {
+ value += noise_basis(p, basis) * pwr;
+ pwr *= pwHL;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0)
+ value += rmd * noise_basis(p, basis) * pwr;
+
+ return value;
+}
+
+/* Musgrave Multifractal
+ *
+ * H: highest fractal dimension
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ */
+
+float noise_musgrave_multi_fractal(point p, string basis, float H, float lacunarity, float octaves)
+{
+ float rmd;
+ float value = 1.0;
+ float pwr = 1.0;
+ float pwHL = pow(lacunarity, -H);
+ int i;
+
+ for(i = 0; i < (int)octaves; i++) {
+ value *= (pwr * noise_basis(p, basis) + 1.0);
+ pwr *= pwHL;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0)
+ value *= (rmd * pwr * noise_basis(p, basis) + 1.0); /* correct? */
+
+ return value;
+}
+
+/* Musgrave Heterogeneous Terrain
+ *
+ * H: fractal dimension of the roughest area
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ * offset: raises the terrain from `sea level'
+ */
+
+float noise_musgrave_hetero_terrain(point p, string basis, float H, float lacunarity, float octaves, float offset)
+{
+ float value, increment, rmd;
+ float pwHL = pow(lacunarity, -H);
+ float pwr = pwHL;
+ int i;
+
+ /* first unscaled octave of function; later octaves are scaled */
+ value = offset + noise_basis(p, basis);
+ p *= lacunarity;
+
+ for(i = 1; i < (int)octaves; i++) {
+ increment = (noise_basis(p, basis) + offset) * pwr * value;
+ value += increment;
+ pwr *= pwHL;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0) {
+ increment = (noise_basis(p, basis) + offset) * pwr * value;
+ value += rmd * increment;
+ }
+
+ return value;
+}
+
+/* Hybrid Additive/Multiplicative Multifractal Terrain
+ *
+ * H: fractal dimension of the roughest area
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ * offset: raises the terrain from `sea level'
+ */
+
+float noise_musgrave_hybrid_multi_fractal(point p, string basis, float H, float lacunarity, float octaves, float offset, float gain)
+{
+ float result, signal, weight, rmd;
+ float pwHL = pow(lacunarity, -H);
+ float pwr = pwHL;
+ int i;
+
+ result = noise_basis(p, basis) + offset;
+ weight = gain * result;
+ p *= lacunarity;
+
+ for(i = 1; (weight > 0.001) && (i < (int)octaves); i++) {
+ if(weight > 1.0)
+ weight = 1.0;
+
+ signal = (noise_basis(p, basis) + offset) * pwr;
+ pwr *= pwHL;
+ result += weight * signal;
+ weight *= gain * signal;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0)
+ result += rmd * ((noise_basis(p, basis) + offset) * pwr);
+
+ return result;
+}
+
+/* Ridged Multifractal Terrain
+ *
+ * H: fractal dimension of the roughest area
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ * offset: raises the terrain from `sea level'
+ */
+
+float noise_musgrave_ridged_multi_fractal(point p, string basis, float H, float lacunarity, float octaves, float offset, float gain)
+{
+ float result, signal, weight;
+ float pwHL = pow(lacunarity, -H);
+ float pwr = pwHL;
+ int i;
+
+ signal = offset - fabs(noise_basis(p, basis));
+ signal *= signal;
+ result = signal;
+ weight = 1.0;
+
+ for(i = 1; i < (int)octaves; i++) {
+ p *= lacunarity;
+ weight = clamp(signal * gain, 0.0, 1.0);
+ signal = offset - fabs(noise_basis(p, basis));
+ signal *= signal;
+ signal *= weight;
+ result += signal * pwr;
+ pwr *= pwHL;
+ }
+
+ return result;
+}
+
+/* Shader */
+
+shader node_musgrave_texture(
+ string Type = "fBM",
+ string Basis = "Perlin",
+ float Dimension = 2.0,
+ float Lacunarity = 1.0,
+ float Octaves = 2.0,
+ float Offset = 0.0,
+ float Intensity = 1.0,
+ float Gain = 1.0,
+ float Size = 0.25,
+ point Vector = P,
+ output float Fac = 0.0)
+{
+ float dimension = max(Dimension, 0.0);
+ float octaves = max(Octaves, 0.0);
+ float lacunarity = max(Lacunarity, 1e-5);
+ float size = nonzero(Size, 1e-5);
+
+ point p = Vector/size;
+
+ if(Type == "Multifractal")
+ Fac = Intensity*noise_musgrave_multi_fractal(p, Basis, dimension, lacunarity, octaves);
+ else if(Type == "fBM")
+ Fac = Intensity*noise_musgrave_fBm(p, Basis, dimension, lacunarity, octaves);
+ else if(Type == "Hybrid Multifractal")
+ Fac = Intensity*noise_musgrave_hybrid_multi_fractal(p, Basis, dimension, lacunarity, octaves, Offset, Gain);
+ else if(Type == "Ridged Multifractal")
+ Fac = Intensity*noise_musgrave_ridged_multi_fractal(p, Basis, dimension, lacunarity, octaves, Offset, Gain);
+ else if(Type == "Hetero Terrain")
+ Fac = Intensity*noise_musgrave_hetero_terrain(p, Basis, dimension, lacunarity, octaves, Offset);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_noise_texture.osl b/intern/cycles/kernel/osl/nodes/node_noise_texture.osl
new file mode 100644
index 00000000000..193ed67d16e
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_noise_texture.osl
@@ -0,0 +1,36 @@
+/*
+ * 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_texture.h"
+
+shader node_noise_texture(
+ point Vector = P,
+ output color Color = color(0.0, 0.0, 0.0),
+ output float Fac = 0.0)
+{
+ point p = Vector*1e8;
+
+ float r = cellnoise(p);
+ float g = cellnoise(point(p[1], p[0], p[2]));
+ float b = cellnoise(point(p[1], p[2], p[0]));
+
+ Fac = r;
+ Color = color(r, g, b);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_output_displacement.osl b/intern/cycles/kernel/osl/nodes/node_output_displacement.osl
new file mode 100644
index 00000000000..a6b452c532a
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_output_displacement.osl
@@ -0,0 +1,25 @@
+/*
+ * 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"
+
+displacement node_output_displacement(float Displacement = 0.0)
+{
+ P += N*Displacement*0.1; /* todo: get rid of this factor */
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_output_surface.osl b/intern/cycles/kernel/osl/nodes/node_output_surface.osl
new file mode 100644
index 00000000000..6efaf91121b
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_output_surface.osl
@@ -0,0 +1,25 @@
+/*
+ * 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"
+
+surface node_output_surface(closure color Surface = background())
+{
+ Ci = Surface;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_output_volume.osl b/intern/cycles/kernel/osl/nodes/node_output_volume.osl
new file mode 100644
index 00000000000..18094242dc7
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_output_volume.osl
@@ -0,0 +1,25 @@
+/*
+ * 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"
+
+volume node_output_volume(closure color Volume = background())
+{
+ Ci = Volume;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_sky_texture.osl b/intern/cycles/kernel/osl/nodes/node_sky_texture.osl
new file mode 100644
index 00000000000..fdb9b1d9708
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_sky_texture.osl
@@ -0,0 +1,162 @@
+/*
+ * 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"
+
+struct KernelSunSky {
+ /* sun direction in spherical and cartesian */
+ float theta, phi;
+ vector dir;
+
+ /* perez function parameters */
+ float zenith_Y, zenith_x, zenith_y;
+ float perez_Y[5], perez_x[5], perez_y[5];
+};
+
+color xyY_to_xyz(float x, float y, float Y)
+{
+ float X, Z;
+
+ if(y != 0.0) X = (x / y) * Y;
+ else X = 0.0;
+
+ if(y != 0.0 && Y != 0.0) Z = ((1.0 - x - y) / y) * Y;
+ else Z = 0.0;
+
+ return color(X, Y, Z);
+}
+
+color xyz_to_rgb(float x, float y, float z)
+{
+ return color(3.240479 * x + -1.537150 * y + -0.498535 * z,
+ -0.969256 * x + 1.875991 * y + 0.041556 * z,
+ 0.055648 * x + -0.204043 * y + 1.057311 * z);
+}
+
+float sky_angle_between(float thetav, float phiv, float theta, float phi)
+{
+ float cospsi = sin(thetav)*sin(theta)*cos(phi - phiv) + cos(thetav)*cos(theta);
+
+ if(cospsi > 1.0)
+ return 0.0;
+ if(cospsi < -1.0)
+ return M_PI;
+
+ return acos(cospsi);
+}
+
+vector sky_spherical_coordinates(vector dir)
+{
+ return vector(acos(dir[2]), atan2(dir[0], dir[1]), 0);
+}
+
+float sky_perez_function(float lam[5], float theta, float gamma)
+{
+ float ctheta = cos(theta);
+ float cgamma = cos(gamma);
+
+ return (1.0 + lam[0]*exp(lam[1] / ctheta)) * (1.0 + lam[2]*exp(lam[3]*gamma) + lam[4]*cgamma*cgamma);
+}
+
+color sky_xyz_radiance(KernelSunSky sunsky, vector dir)
+{
+ /* convert vector to spherical coordinates */
+ vector spherical = sky_spherical_coordinates(dir);
+ float theta = spherical[0];
+ float phi = spherical[1];
+
+ /* angle between sun direction and dir */
+ float gamma = sky_angle_between(theta, phi, sunsky.theta, sunsky.phi);
+
+ /* clamp theta to horizon */
+ theta = min(theta, M_PI_2 - 0.001);
+
+ /* compute xyY color space values */
+ float x = sunsky.zenith_x * sky_perez_function(sunsky.perez_x, theta, gamma);
+ float y = sunsky.zenith_y * sky_perez_function(sunsky.perez_y, theta, gamma);
+ float Y = sunsky.zenith_Y * sky_perez_function(sunsky.perez_Y, theta, gamma);
+
+ /* convert to RGB */
+ color xyz = xyY_to_xyz(x, y, Y);
+ return xyz_to_rgb(xyz[0], xyz[1], xyz[2]);
+}
+
+void precompute_sunsky(vector dir, float turbidity, output KernelSunSky sunsky)
+{
+ vector spherical = sky_spherical_coordinates(dir);
+ float theta = spherical[0];
+ float phi = spherical[1];
+
+ sunsky.theta = theta;
+ sunsky.phi = phi;
+ sunsky.dir = dir;
+
+ float theta2 = theta*theta;
+ float theta3 = theta*theta*theta;
+ float T = turbidity;
+ float T2 = T*T;
+
+ float chi = (4.0/ 9.0- T / 120.0) * (M_PI - 2.0* theta);
+ sunsky.zenith_Y = (4.0453*T - 4.9710) * tan(chi) - 0.2155*T + 2.4192;
+ sunsky.zenith_Y *= 0.06;
+
+ sunsky.zenith_x =
+ (0.00166* theta3 - 0.00375* theta2 + 0.00209* theta)*T2 +
+ (-0.02903* theta3 + 0.06377* theta2 - 0.03202* theta + 0.00394)*T +
+ (0.11693* theta3 - 0.21196* theta2 + 0.06052* theta + 0.25886);
+
+ sunsky.zenith_y =
+ (0.00275* theta3 - 0.00610* theta2 + 0.00317* theta)*T2 +
+ (-0.04214* theta3 + 0.08970* theta2 - 0.04153* theta + 0.00516)*T +
+ (0.15346* theta3 - 0.26756* theta2 + 0.06670* theta + 0.26688);
+
+ sunsky.perez_Y[0] = (0.1787*T - 1.4630);
+ sunsky.perez_Y[1] = (-0.3554*T + 0.4275);
+ sunsky.perez_Y[2] = (-0.0227*T + 5.3251);
+ sunsky.perez_Y[3] = (0.1206*T - 2.5771);
+ sunsky.perez_Y[4] = (-0.0670*T + 0.3703);
+
+ sunsky.perez_x[0] = (-0.0193*T - 0.2592);
+ sunsky.perez_x[1] = (-0.0665*T + 0.0008);
+ sunsky.perez_x[2] = (-0.0004*T + 0.2125);
+ sunsky.perez_x[3] = (-0.0641*T - 0.8989);
+ sunsky.perez_x[4] = (-0.0033*T + 0.0452);
+
+ sunsky.perez_y[0] = (-0.0167*T - 0.2608);
+ sunsky.perez_y[1] = (-0.0950*T + 0.0092);
+ sunsky.perez_y[2] = (-0.0079*T + 0.2102);
+ sunsky.perez_y[3] = (-0.0441*T - 1.6537);
+ sunsky.perez_y[4] = (-0.0109*T + 0.0529);
+
+ sunsky.zenith_Y /= sky_perez_function(sunsky.perez_Y, 0, theta);
+ sunsky.zenith_x /= sky_perez_function(sunsky.perez_x, 0, theta);
+ sunsky.zenith_y /= sky_perez_function(sunsky.perez_y, 0, theta);
+}
+
+shader node_sky_texture(
+ vector Vector = P,
+ vector sun_direction = vector(0, 0, 1),
+ float turbidity = 2.2,
+ output color Color = color(0.0, 0.0, 0.0))
+{
+ KernelSunSky sunsky;
+
+ precompute_sunsky(sun_direction, turbidity, sunsky);
+ Color = sky_xyz_radiance(sunsky, Vector);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_stucci_texture.osl b/intern/cycles/kernel/osl/nodes/node_stucci_texture.osl
new file mode 100644
index 00000000000..f03e03d9a98
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_stucci_texture.osl
@@ -0,0 +1,49 @@
+/*
+ * 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_texture.h"
+
+/* Stucci */
+
+shader node_stucci_texture(
+ string Type = "Plastic",
+ string Basis = "Perlin",
+ int Hard = 0,
+ float Turbulence = 1.0,
+ float Size = 0.25,
+ point Vector = P,
+ output float Fac = 0.0)
+{
+ float size = nonzero(Size, 1e-5);
+ point p = Vector/size;
+
+ float b2 = noise_basis_hard(p, Basis, Hard);
+ float ofs = Turbulence/200.0;
+
+ if(Type != "Plastic")
+ ofs *= b2*b2;
+
+ Fac = noise_basis_hard(point(p[0], p[1], p[2]+ofs), Basis, Hard);
+
+ if(Type == "Wall Out")
+ Fac = 1.0 - Fac;
+
+ Fac = max(Fac, 0.0);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_texture.h b/intern/cycles/kernel/osl/nodes/node_texture.h
new file mode 100644
index 00000000000..8adb0e8aeb5
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_texture.h
@@ -0,0 +1,251 @@
+/*
+ * 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.
+ */
+
+/* Voronoi Distances */
+
+float voronoi_distance(string distance_metric, vector d, float e)
+{
+ float result = 0.0;
+
+ if(distance_metric == "Distance Squared")
+ result = dot(d, d);
+ if(distance_metric == "Actual Distance")
+ result = length(d);
+ if(distance_metric == "Manhattan")
+ result = fabs(d[0]) + fabs(d[1]) + fabs(d[2]);
+ if(distance_metric == "Chebychev")
+ result = max(fabs(d[0]), max(fabs(d[1]), fabs(d[2])));
+ if(distance_metric == "Minkovsky 1/2")
+ result = sqrt(fabs(d[0])) + sqrt(fabs(d[1])) + sqrt(fabs(d[1]));
+ if(distance_metric == "Minkovsky 4")
+ result = sqrt(sqrt(dot(d*d, d*d)));
+ if(distance_metric == "Minkovsky")
+ result = pow(pow(fabs(d[0]), e) + pow(fabs(d[1]), e) + pow(fabs(d[2]), e), 1.0/e);
+
+ return result;
+}
+
+/* Voronoi / Worley like */
+
+color cellnoise_color(point p)
+{
+ float r = cellnoise(p);
+ float g = cellnoise(point(p[1], p[0], p[2]));
+ float b = cellnoise(point(p[1], p[2], p[0]));
+
+ return color(r, g, b);
+}
+
+void voronoi(point p, string distance_metric, float e, float da[4], point pa[4])
+{
+ /* returns distances in da and point coords in pa */
+ int xx, yy, zz, xi, yi, zi;
+
+ xi = (int)floor(p[0]);
+ yi = (int)floor(p[1]);
+ zi = (int)floor(p[2]);
+
+ da[0] = 1e10;
+ da[1] = 1e10;
+ da[2] = 1e10;
+ da[3] = 1e10;
+
+ for(xx = xi-1; xx <= xi+1; xx++) {
+ for(yy = yi-1; yy <= yi+1; yy++) {
+ for(zz = zi-1; zz <= zi+1; zz++) {
+ point ip = point(xx, yy, zz);
+ point vp = (point)cellnoise_color(ip);
+ point pd = p - (vp + ip);
+ float d = voronoi_distance(distance_metric, pd, e);
+
+ vp += point(xx, yy, zz);
+
+ if(d < da[0]) {
+ da[3] = da[2];
+ da[2] = da[1];
+ da[1] = da[0];
+ da[0] = d;
+
+ pa[3] = pa[2];
+ pa[2] = pa[1];
+ pa[1] = pa[0];
+ pa[0] = vp;
+ }
+ else if(d < da[1]) {
+ da[3] = da[2];
+ da[2] = da[1];
+ da[1] = d;
+
+ pa[3] = pa[2];
+ pa[2] = pa[1];
+ pa[1] = vp;
+ }
+ else if(d < da[2]) {
+ da[3] = da[2];
+ da[2] = d;
+
+ pa[3] = pa[2];
+ pa[2] = vp;
+ }
+ else if(d < da[3]) {
+ da[3] = d;
+ pa[3] = vp;
+ }
+ }
+ }
+ }
+}
+
+float voronoi_Fn(point p, int n)
+{
+ float da[4];
+ point pa[4];
+
+ voronoi(p, "Distance Squared", 0, da, pa);
+
+ return da[n];
+}
+
+float voronoi_FnFn(point p, int n1, int n2)
+{
+ float da[4];
+ point pa[4];
+
+ voronoi(p, "Distance Squared", 0, da, pa);
+
+ return da[n2] - da[n1];
+}
+
+float voronoi_F1(point p) { return voronoi_Fn(p, 0); }
+float voronoi_F2(point p) { return voronoi_Fn(p, 1); }
+float voronoi_F3(point p) { return voronoi_Fn(p, 2); }
+float voronoi_F4(point p) { return voronoi_Fn(p, 3); }
+float voronoi_F1F2(point p) { return voronoi_FnFn(p, 0, 1); }
+
+float voronoi_Cr(point p)
+{
+ /* crackle type pattern, just a scale/clamp of F2-F1 */
+ float t = 10.0*voronoi_F1F2(p);
+ return (t > 1.0)? 1.0: t;
+}
+
+float voronoi_F1S(point p) { return 2.0*voronoi_F1(p) - 1.0; }
+float voronoi_F2S(point p) { return 2.0*voronoi_F2(p) - 1.0; }
+float voronoi_F3S(point p) { return 2.0*voronoi_F3(p) - 1.0; }
+float voronoi_F4S(point p) { return 2.0*voronoi_F4(p) - 1.0; }
+float voronoi_F1F2S(point p) { return 2.0*voronoi_F1F2(p) - 1.0; }
+float voronoi_CrS(point p) { return 2.0*voronoi_Cr(p) - 1.0; }
+
+/* Noise Bases */
+
+float noise_basis(point p, string basis)
+{
+ float result = 0.0;
+
+ if(basis == "Perlin")
+ result = noise(p);
+ if(basis == "Voronoi F1")
+ result = voronoi_F1S(p);
+ if(basis == "Voronoi F2")
+ result = voronoi_F2S(p);
+ if(basis == "Voronoi F3")
+ result = voronoi_F3S(p);
+ if(basis == "Voronoi F4")
+ result = voronoi_F4S(p);
+ if(basis == "Voronoi F2-F1")
+ result = voronoi_F1F2S(p);
+ if(basis == "Voronoi Crackle")
+ result = voronoi_CrS(p);
+ if(basis == "Cell Noise")
+ result = cellnoise(p);
+
+ return result;
+}
+
+/* Soft/Hard Noise */
+
+float noise_basis_hard(point p, string basis, int hard)
+{
+ float t = noise_basis(p, basis);
+ return (hard)? fabs(2.0*t - 1.0): t;
+}
+
+/* Waves */
+
+float noise_wave(string wave, float a)
+{
+ float result = 0.0;
+
+ if(wave == "Sine") {
+ result = 0.5 + 0.5*sin(a);
+ }
+ else if(wave == "Saw") {
+ float b = 2*M_PI;
+ int n = (int)(a / b);
+ a -= n*b;
+ if(a < 0) a += b;
+
+ result = a / b;
+ }
+ else if(wave == "Tri") {
+ float b = 2*M_PI;
+ float rmax = 1.0;
+
+ result = rmax - 2.0*fabs(floor((a*(1.0/b))+0.5) - (a*(1.0/b)));
+ }
+
+ return result;
+}
+
+/* Turbulence */
+
+float noise_turbulence(point p, string basis, int octaves, int hard)
+{
+ float fscale = 1.0;
+ float amp = 1.0;
+ float sum = 0.0;
+ int i;
+
+ for(i = 0; i <= octaves; i++) {
+ float t = noise_basis(fscale*p, basis);
+
+ if(hard)
+ t = fabs(2.0*t - 1.0);
+
+ sum += t*amp;
+ amp *= 0.5;
+ fscale *= 2.0;
+ }
+
+ sum *= ((float)(1 << octaves)/(float)((1 << (octaves+1)) - 1));
+
+ return sum;
+}
+
+/* Utility */
+
+float nonzero(float f, float eps)
+{
+ float r;
+
+ if(abs(f) < eps)
+ r = sign(f)*eps;
+ else
+ r = f;
+
+ return r;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_texture_coordinate.osl b/intern/cycles/kernel/osl/nodes/node_texture_coordinate.osl
new file mode 100644
index 00000000000..2acf72aef54
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_texture_coordinate.osl
@@ -0,0 +1,66 @@
+/*
+ * 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_texture_coordinate(
+ normal Normal = N,
+ int is_background = 0,
+ string bump_offset = "center",
+
+ output point Generated = point(0.0, 0.0, 0.0),
+ output point UV = point(0.0, 0.0, 0.0),
+ output point Object = point(0.0, 0.0, 0.0),
+ output point Camera = point(0.0, 0.0, 0.0),
+ output point Window = point(0.0, 0.0, 0.0),
+ output point Reflection = point(0.0, 0.0, 0.0))
+{
+ if(is_background) {
+ Generated = P;
+ UV = point(0.0, 0.0, 0.0);
+ Object = P;
+ point Pcam = transform("camera", "world", point(0, 0, 0));
+ Camera = transform("camera", P + Pcam);
+ Window = transform("NDC", P + Pcam);
+ Reflection = I;
+ }
+ else {
+ getattribute("std::generated", Generated);
+ getattribute("std::uv", UV);
+ Object = transform("object", P);
+ Camera = transform("camera", P);
+ Window = transform("NDC", P);
+ Reflection = reflect(I, Normal);
+ }
+
+ if(bump_offset == "dx") {
+ Generated += Dx(Generated);
+ UV += Dx(UV);
+ Object += Dx(Object);
+ Camera += Dx(Camera);
+ Window += Dx(Window);
+ }
+ else if(bump_offset == "dy") {
+ Generated += Dy(Generated);
+ UV += Dy(UV);
+ Object += Dy(Object);
+ Camera += Dy(Camera);
+ Window += Dy(Window);
+ }
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_translucent_bsdf.osl b/intern/cycles/kernel/osl/nodes/node_translucent_bsdf.osl
new file mode 100644
index 00000000000..9acd46756d2
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_translucent_bsdf.osl
@@ -0,0 +1,28 @@
+/*
+ * 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_translucent_bsdf(
+ color Color = color(0.8, 0.8, 0.8),
+ normal Normal = N,
+ output closure color BSDF = diffuse(Normal))
+{
+ BSDF = Color*translucent(Normal);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_transparent_bsdf.osl b/intern/cycles/kernel/osl/nodes/node_transparent_bsdf.osl
new file mode 100644
index 00000000000..b347bfb116b
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_transparent_bsdf.osl
@@ -0,0 +1,28 @@
+/*
+ * 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_transparent_bsdf(
+ color Color = color(0.8, 0.8, 0.8),
+ normal Normal = N,
+ output closure color BSDF = diffuse(Normal))
+{
+ BSDF = Color*transparent();
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_value.osl b/intern/cycles/kernel/osl/nodes/node_value.osl
new file mode 100644
index 00000000000..bee6f39f2bc
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_value.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_value(
+ float value_value = 0.0,
+ vector vector_value = vector(0.0, 0.0, 0.0),
+ color color_value = color(0.0, 0.0, 0.0),
+ output float Value = 0.0,
+ output vector Vector = vector(0.0, 0.0, 0.0),
+ output color Color = color(0.0, 0.0, 0.0))
+{
+ Value = value_value;
+ Vector = vector_value;
+ Color = color_value;
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_vector_math.osl b/intern/cycles/kernel/osl/nodes/node_vector_math.osl
new file mode 100644
index 00000000000..9e0f0b60522
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_vector_math.osl
@@ -0,0 +1,53 @@
+/*
+ * 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_vector_math(
+ string type = "Add",
+ vector Vector1 = vector(0.0, 0.0, 0.0),
+ vector Vector2 = vector(0.0, 0.0, 0.0),
+ output float Value = 0.0,
+ output vector Vector = vector(0.0, 0.0, 0.0))
+{
+ if(type == "Add") {
+ Vector = Vector1 + Vector2;
+ Value = (abs(Vector[0]) + abs(Vector[1]) + abs(Vector[2]))/3.0;
+ }
+ if(type == "Subtract") {
+ Vector = Vector1 - Vector2;
+ Value = (abs(Vector[0]) + abs(Vector[1]) + abs(Vector[2]))/3.0;
+ }
+ if(type == "Average") {
+ Value = length(Vector1 + Vector2);
+ Vector = normalize(Vector1 + Vector2);
+ }
+ if(type == "Dot Product") {
+ Value = dot(Vector1, Vector2);
+ }
+ if(type == "Cross Product") {
+ vector c = cross(Vector1, Vector2);
+ Value = length(c);
+ Vector = normalize(c);
+ }
+ if(type == "Normalize") {
+ Value = length(Vector1);
+ Vector = normalize(Vector1);
+ }
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_velvet_bsdf.osl b/intern/cycles/kernel/osl/nodes/node_velvet_bsdf.osl
new file mode 100644
index 00000000000..7a336c148db
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_velvet_bsdf.osl
@@ -0,0 +1,32 @@
+/*
+ * 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_fresnel.h"
+
+shader node_velvet_bsdf(
+ color Color = color(0.8, 0.8, 0.8),
+ float Sigma = 0.0,
+ normal Normal = N,
+ output closure color BSDF = diffuse(Normal))
+{
+ float sigma = clamp(Sigma, 0.0, 1.0);
+
+ BSDF = Color*ashikhmin_velvet(Normal, sigma);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_voronoi_texture.osl b/intern/cycles/kernel/osl/nodes/node_voronoi_texture.osl
new file mode 100644
index 00000000000..140ba6a6ba1
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_voronoi_texture.osl
@@ -0,0 +1,82 @@
+/*
+ * 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_texture.h"
+
+/* Voronoi */
+
+shader node_voronoi_texture(
+ string DistanceMetric = "Actual Distance",
+ string Coloring = "Intensity",
+ float Weight1 = 1.0,
+ float Weight2 = 0.0,
+ float Weight3 = 0.0,
+ float Weight4 = 0.0,
+ float Exponent = 2.5,
+ float Intensity = 1.0,
+ float Size = 0.25,
+ point Vector = P,
+ output float Fac = 0.0,
+ output color Color = color(0.0, 0.0, 0.0))
+{
+ float exponent = max(Exponent, 1e-5);
+ float size = nonzero(Size, 1e-5);
+
+ float aw1 = fabs(Weight1);
+ float aw2 = fabs(Weight2);
+ float aw3 = fabs(Weight3);
+ float aw4 = fabs(Weight4);
+ float sc = (aw1 + aw2 + aw3 + aw4);
+
+ if(sc != 0.0)
+ sc = Intensity/sc;
+
+ /* compute distance and point coordinate of 4 nearest neighbours */
+ float da[4];
+ point pa[4];
+
+ voronoi(Vector/size, DistanceMetric, exponent, da, pa);
+
+ /* Scalar output */
+ Fac = sc * fabs(Weight1*da[0] + Weight2*da[1] + Weight3*da[2] + Weight4*da[3]);
+
+ /* Colored output */
+ if(Coloring == "Intensity") {
+ Color = color(Fac, Fac, Fac);
+ }
+ else {
+ Color = aw1*cellnoise_color(pa[0]);
+ Color += aw2*cellnoise_color(pa[1]);
+ Color += aw3*cellnoise_color(pa[2]);
+ Color += aw4*cellnoise_color(pa[3]);
+
+ if(Coloring != "Position") {
+ float t1 = min((da[1] - da[0])*10.0, 1.0);
+
+ if(Coloring == "Position, Outline, and Intensity")
+ Color *= t1*Fac;
+ else if(Coloring == "Position and Outline")
+ Color *= t1*sc;
+ }
+ else {
+ Color *= sc;
+ }
+ }
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_ward_bsdf.osl b/intern/cycles/kernel/osl/nodes/node_ward_bsdf.osl
new file mode 100644
index 00000000000..68db07109ed
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_ward_bsdf.osl
@@ -0,0 +1,30 @@
+/*
+ * 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_ward_bsdf(
+ color Color = color(0.8, 0.8, 0.8),
+ float RoughnessU = 0.0,
+ float RoughnessV = 0.0,
+ normal Normal = N,
+ output closure color BSDF = diffuse(Normal))
+{
+ BSDF = Color*ward(Normal, normalize(dPdu), RoughnessU, RoughnessV);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/node_wood_texture.osl b/intern/cycles/kernel/osl/nodes/node_wood_texture.osl
new file mode 100644
index 00000000000..f1d2e278597
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/node_wood_texture.osl
@@ -0,0 +1,63 @@
+/*
+ * 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_texture.h"
+
+/* Wood */
+
+float wood(point p, float size, string type, string wave, string basis, int hard, float turb)
+{
+ float x = p[0];
+ float y = p[1];
+ float z = p[2];
+
+ float result = 0.0;
+
+ if(type == "Bands") {
+ result = noise_wave(wave, (x + y + z)*10.0);
+ }
+ else if(type == "Rings") {
+ result = noise_wave(wave, sqrt(x*x + y*y + z*z)*20.0);
+ }
+ else if (type == "Band Noise") {
+ float wi = turb*noise_basis_hard(p/size, basis, hard);
+ result = noise_wave(wave, (x + y + z)*10.0 + wi);
+ }
+ else if (type == "Ring Noise") {
+ float wi = turb*noise_basis_hard(p/size, basis, hard);
+ result = noise_wave(wave, sqrt(x*x + y*y + z*z)*20.0 + wi);
+ }
+
+ return result;
+}
+
+shader node_wood_texture(
+ string Type = "Bands",
+ string Wave = "Sine",
+ string Basis = "Perlin",
+ int Hard = 0,
+ float Size = 0.25,
+ float Turbulence = 5.0,
+ point Vector = P,
+ output float Fac = 0.0)
+{
+ float size = nonzero(Size, 1e-5);
+ Fac = wood(Vector, size, Type, Wave, Basis, Hard, Turbulence);
+}
+
diff --git a/intern/cycles/kernel/osl/nodes/stdosl.h b/intern/cycles/kernel/osl/nodes/stdosl.h
new file mode 100644
index 00000000000..6fe4f52df4a
--- /dev/null
+++ b/intern/cycles/kernel/osl/nodes/stdosl.h
@@ -0,0 +1,471 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of Sony Pictures Imageworks nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/////////////////////////////////////////////////////////////////////////////
+
+
+#ifndef CCL_STDOSL_H
+#define CCL_STDOSL_H
+
+
+#ifndef M_PI
+#define M_PI 3.1415926535897932 /* pi */
+#define M_PI_2 1.5707963267948966 /* pi/2 */
+#define M_PI_4 0.7853981633974483 /* pi/4 */
+#define M_2_PI 0.6366197723675813 /* 2/pi */
+#define M_2_SQRTPI 1.1283791670955126 /* 2/sqrt(pi) */
+#define M_E 2.7182818284590452 /* e (Euler's number) */
+#define M_LN2 0.6931471805599453 /* ln(2) */
+#define M_LN10 2.3025850929940457 /* ln(10) */
+#define M_LOG2E 1.4426950408889634 /* log_2(e) */
+#define M_LOG10E 0.4342944819032518 /* log_10(e) */
+#define M_SQRT2 1.4142135623730950 /* sqrt(2) */
+#define M_SQRT1_2 0.7071067811865475 /* 1/sqrt(2) */
+#endif
+
+
+
+// Declaration of built-in functions and closures
+#define BUILTIN [[ int builtin = 1 ]]
+#define BUILTIN_DERIV [[ int builtin = 1, int deriv = 1 ]]
+
+#define PERCOMP1(name) \
+ normal name (normal x) BUILTIN; \
+ vector name (vector x) BUILTIN; \
+ point name (point x) BUILTIN; \
+ color name (color x) BUILTIN; \
+ float name (float x) BUILTIN;
+
+#define PERCOMP2(name) \
+ normal name (normal x, normal y) BUILTIN; \
+ vector name (vector x, vector y) BUILTIN; \
+ point name (point x, point y) BUILTIN; \
+ color name (color x, color y) BUILTIN; \
+ float name (float x, float y) BUILTIN;
+
+#define PERCOMP2F(name) \
+ normal name (normal x, float y) BUILTIN; \
+ vector name (vector x, float y) BUILTIN; \
+ point name (point x, float y) BUILTIN; \
+ color name (color x, float y) BUILTIN; \
+ float name (float x, float y) BUILTIN;
+
+
+// Basic math
+normal degrees (normal x) { return x*(180.0/M_PI); }
+vector degrees (vector x) { return x*(180.0/M_PI); }
+point degrees (point x) { return x*(180.0/M_PI); }
+color degrees (color x) { return x*(180.0/M_PI); }
+float degrees (float x) { return x*(180.0/M_PI); }
+normal radians (normal x) { return x*(M_PI/180.0); }
+vector radians (vector x) { return x*(M_PI/180.0); }
+point radians (point x) { return x*(M_PI/180.0); }
+color radians (color x) { return x*(M_PI/180.0); }
+float radians (float x) { return x*(M_PI/180.0); }
+PERCOMP1 (cos)
+PERCOMP1 (sin)
+PERCOMP1 (tan)
+PERCOMP1 (acos)
+PERCOMP1 (asin)
+PERCOMP1 (atan)
+PERCOMP2 (atan2)
+PERCOMP1 (cosh)
+PERCOMP1 (sinh)
+PERCOMP1 (tanh)
+PERCOMP2F (pow)
+PERCOMP1 (exp)
+PERCOMP1 (exp2)
+PERCOMP1 (expm1)
+PERCOMP1 (log)
+point log (point a, float b) { return log(a)/log(b); }
+vector log (vector a, float b) { return log(a)/log(b); }
+color log (color a, float b) { return log(a)/log(b); }
+float log (float a, float b) { return log(a)/log(b); }
+PERCOMP1 (log2)
+PERCOMP1 (log10)
+PERCOMP1 (logb)
+PERCOMP1 (sqrt)
+PERCOMP1 (inversesqrt)
+float hypot (float a, float b) { return sqrt (a*a + b*b); }
+float hypot (float a, float b, float c) { return sqrt (a*a + b*b + c*c); }
+PERCOMP1 (abs)
+int abs (int x) BUILTIN;
+PERCOMP1 (fabs)
+int fabs (int x) BUILTIN;
+PERCOMP1 (sign)
+PERCOMP1 (floor)
+PERCOMP1 (ceil)
+PERCOMP1 (round)
+PERCOMP1 (trunc)
+PERCOMP2 (fmod)
+PERCOMP2F (fmod)
+PERCOMP2 (mod)
+PERCOMP2F (mod)
+int mod (int x, int y) BUILTIN;
+PERCOMP2 (min)
+PERCOMP2 (max)
+normal clamp (normal x, normal minval, normal maxval) { return max(min(x,maxval),minval); }
+vector clamp (vector x, vector minval, vector maxval) { return max(min(x,maxval),minval); }
+point clamp (point x, point minval, point maxval) { return max(min(x,maxval),minval); }
+color clamp (color x, color minval, color maxval) { return max(min(x,maxval),minval); }
+float clamp (float x, float minval, float maxval) { return max(min(x,maxval),minval); }
+//normal clamp (normal x, normal minval, normal maxval) BUILTIN;
+//vector clamp (vector x, vector minval, vector maxval) BUILTIN;
+//point clamp (point x, point minval, point maxval) BUILTIN;
+//color clamp (color x, color minval, color maxval) BUILTIN;
+//float clamp (float x, float minval, float maxval) BUILTIN;
+normal mix (normal x, normal y, normal a) { return x*(1-a) + y*a; }
+normal mix (normal x, normal y, float a) { return x*(1-a) + y*a; }
+vector mix (vector x, vector y, vector a) { return x*(1-a) + y*a; }
+vector mix (vector x, vector y, float a) { return x*(1-a) + y*a; }
+point mix (point x, point y, point a) { return x*(1-a) + y*a; }
+point mix (point x, point y, float a) { return x*(1-a) + y*a; }
+color mix (color x, color y, color a) { return x*(1-a) + y*a; }
+color mix (color x, color y, float a) { return x*(1-a) + y*a; }
+float mix (float x, float y, float a) { return x*(1-a) + y*a; }
+int isnan (float x) BUILTIN;
+int isinf (float x) BUILTIN;
+int isfinite (float x) BUILTIN;
+float erf (float x) BUILTIN;
+float erfc (float x) BUILTIN;
+
+// Vector functions
+
+vector cross (vector a, vector b) BUILTIN;
+float dot (vector a, vector b) BUILTIN;
+float length (vector v) BUILTIN;
+float distance (point a, point b) BUILTIN;
+float distance (point a, point b, point q) BUILTIN;
+normal normalize (normal v) BUILTIN;
+vector normalize (vector v) BUILTIN;
+vector faceforward (vector N, vector I, vector Nref) BUILTIN;
+vector faceforward (vector N, vector I) BUILTIN;
+vector reflect (vector I, vector N) { return I - 2*dot(N,I)*N; }
+vector refract (vector I, vector N, float eta) {
+ float IdotN = dot (I, N);
+ float k = 1 - eta*eta * (1 - IdotN*IdotN);
+ return (k < 0) ? vector(0,0,0) : (eta*I - N * (eta*IdotN + sqrt(k)));
+}
+void fresnel (vector I, normal N, float eta,
+ output float Kr, output float Kt,
+ output vector R, output vector T)
+{
+ float sqr(float x) { return x*x; }
+ float c = dot(I, N);
+ if (c < 0)
+ c = -c;
+ R = reflect(I, N);
+ float g = 1.0 / sqr(eta) - 1.0 + c * c;
+ if (g >= 0.0) {
+ g = sqrt (g);
+ float beta = g - c;
+ float F = (c * (g+c) - 1.0) / (c * beta + 1.0);
+ F = 0.5 * (1.0 + sqr(F));
+ F *= sqr (beta / (g+c));
+ Kr = F;
+ Kt = (1.0 - Kr) * eta*eta;
+ // OPT: the following recomputes some of the above values, but it
+ // gives us the same result as if the shader-writer called refract()
+ T = refract(I, N, eta);
+ } else {
+ // total internal reflection
+ Kr = 1.0;
+ Kt = 0.0;
+ T = vector (0,0,0);
+ }
+#undef sqr
+}
+
+void fresnel (vector I, normal N, float eta,
+ output float Kr, output float Kt)
+{
+ vector R, T;
+ fresnel(I, N, eta, Kr, Kt, R, T);
+}
+
+point rotate (point q, float angle, point a, point b) BUILTIN;
+
+normal transform (matrix Mto, normal p) BUILTIN;
+vector transform (matrix Mto, vector p) BUILTIN;
+point transform (matrix Mto, point p) BUILTIN;
+
+// Implementation of transform-with-named-space in terms of matrices:
+
+point transform (string tospace, point x)
+{
+ return transform (matrix ("common", tospace), x);
+}
+
+point transform (string fromspace, string tospace, point x)
+{
+ return transform (matrix (fromspace, tospace), x);
+}
+
+
+vector transform (string tospace, vector x)
+{
+ return transform (matrix ("common", tospace), x);
+}
+
+vector transform (string fromspace, string tospace, vector x)
+{
+ return transform (matrix (fromspace, tospace), x);
+}
+
+
+normal transform (string tospace, normal x)
+{
+ return transform (matrix ("common", tospace), x);
+}
+
+normal transform (string fromspace, string tospace, normal x)
+{
+ return transform (matrix (fromspace, tospace), x);
+}
+
+float transformu (string tounits, float x) BUILTIN;
+float transformu (string fromunits, string tounits, float x) BUILTIN;
+
+
+// Color functions
+
+float luminance (color c) {
+ return dot ((vector)c, vector(0.2126, 0.7152, 0.0722));
+}
+
+
+
+color transformc (string to, color x)
+{
+ color rgb_to_hsv (color rgb) { // See Foley & van Dam
+ float r = rgb[0], g = rgb[1], b = rgb[2];
+ float mincomp = min (r, min (g, b));
+ float maxcomp = max (r, max (g, b));
+ float delta = maxcomp - mincomp; // chroma
+ float h, s, v;
+ v = maxcomp;
+ if (maxcomp > 0)
+ s = delta / maxcomp;
+ else s = 0;
+ if (s <= 0)
+ h = 0;
+ else {
+ if (r >= maxcomp) h = (g-b) / delta;
+ else if (g >= maxcomp) h = 2 + (b-r) / delta;
+ else h = 4 + (r-g) / delta;
+ h /= 6;
+ if (h < 0)
+ h += 1;
+ }
+ return color (h, s, v);
+ }
+
+ color rgb_to_hsl (color rgb) { // See Foley & van Dam
+ // First convert rgb to hsv, then to hsl
+ float minval = min (rgb[0], min (rgb[1], rgb[2]));
+ color hsv = rgb_to_hsv (rgb);
+ float maxval = hsv[2]; // v == maxval
+ float h = hsv[0], s, l = (minval+maxval) / 2;
+ if (minval == maxval)
+ s = 0; // special 'achromatic' case, hue is 0
+ else if (l <= 0.5)
+ s = (maxval - minval) / (maxval + minval);
+ else
+ s = (maxval - minval) / (2 - maxval - minval);
+ return color (h, s, l);
+ }
+
+ color r;
+ if (to == "rgb" || to == "RGB")
+ r = x;
+ else if (to == "hsv")
+ r = rgb_to_hsv (x);
+ else if (to == "hsl")
+ r = rgb_to_hsl (x);
+ else if (to == "YIQ")
+ r = color (dot (vector(0.299, 0.587, 0.114), (vector)x),
+ dot (vector(0.596, -0.275, -0.321), (vector)x),
+ dot (vector(0.212, -0.523, 0.311), (vector)x));
+ else if (to == "xyz")
+ r = color (dot (vector(0.412453, 0.357580, 0.180423), (vector)x),
+ dot (vector(0.212671, 0.715160, 0.072169), (vector)x),
+ dot (vector(0.019334, 0.119193, 0.950227), (vector)x));
+ else {
+ error ("Unknown color space \"%s\"", to);
+ r = x;
+ }
+ return r;
+}
+
+
+color transformc (string from, string to, color x)
+{
+ color hsv_to_rgb (color c) { // Reference: Foley & van Dam
+ float h = c[0], s = c[1], v = c[2];
+ color r;
+ if (s < 0.0001) {
+ r = v;
+ } else {
+ h = 6 * (h - floor(h)); // expand to [0..6)
+ int hi = (int)h;
+ float f = h - hi;
+ float p = v * (1-s);
+ float q = v * (1-s*f);
+ float t = v * (1-s*(1-f));
+ if (hi == 0) r = color (v, t, p);
+ else if (hi == 1) r = color (q, v, p);
+ else if (hi == 2) r = color (p, v, t);
+ else if (hi == 3) r = color (p, q, v);
+ else if (hi == 4) r = color (t, p, v);
+ else r = color (v, p, q);
+ }
+ return r;
+ }
+
+ color hsl_to_rgb (color c) {
+ float h = c[0], s = c[1], l = c[2];
+ // Easiest to convert hsl -> hsv, then hsv -> RGB (per Foley & van Dam)
+ float v = (l <= 0.5) ? (l * (1 + s)) : (l * (1 - s) + s);
+ color r;
+ if (v <= 0) {
+ r = 0;
+ } else {
+ float min = 2 * l - v;
+ s = (v - min) / v;
+ r = hsv_to_rgb (color (h, s, v));
+ }
+ return r;
+ }
+
+ color r;
+ if (from == "rgb" || from == "RGB")
+ r = x;
+ else if (from == "hsv")
+ r = hsv_to_rgb (x);
+ else if (from == "hsl")
+ r = hsl_to_rgb (x);
+ else if (from == "YIQ")
+ r = color (dot (vector(1, 0.9557, 0.6199), (vector)x),
+ dot (vector(1, -0.2716, -0.6469), (vector)x),
+ dot (vector(1, -1.1082, 1.7051), (vector)x));
+ else if (from == "xyz")
+ r = color (dot (vector( 3.240479, -1.537150, -0.498535), (vector)x),
+ dot (vector(-0.969256, 1.875991, 0.041556), (vector)x),
+ dot (vector( 0.055648, -0.204043, 1.057311), (vector)x));
+ else {
+ error ("Unknown color space \"%s\"", to);
+ r = x;
+ }
+ return transformc (to, r);
+}
+
+
+
+// Matrix functions
+
+float determinant (matrix m) BUILTIN;
+matrix transpose (matrix m) BUILTIN;
+
+
+
+// Pattern generation
+
+float step (float edge, float x) BUILTIN;
+color step (color edge, color x) BUILTIN;
+point step (point edge, point x) BUILTIN;
+vector step (vector edge, vector x) BUILTIN;
+normal step (normal edge, normal x) BUILTIN;
+float smoothstep (float edge0, float edge1, float x) BUILTIN;
+
+
+// Derivatives and area operators
+
+
+// Displacement functions
+
+
+// String functions
+
+int strlen (string s) BUILTIN;
+int startswith (string s, string prefix) BUILTIN;
+int endswith (string s, string suffix) BUILTIN;
+string substr (string s, int start, int len) BUILTIN;
+string substr (string s, int start) { return substr (s, start, strlen(s)); }
+
+// Define concat in terms of shorter concat
+string concat (string a, string b, string c) {
+ return concat(concat(a,b), c);
+}
+string concat (string a, string b, string c, string d) {
+ return concat(concat(a,b,c), d);
+}
+string concat (string a, string b, string c, string d, string e) {
+ return concat(concat(a,b,c,d), e);
+}
+string concat (string a, string b, string c, string d, string e, string f) {
+ return concat(concat(a,b,c,d,e), f);
+}
+
+
+// Texture
+
+
+// Closures
+
+closure color diffuse(normal N) BUILTIN;
+closure color translucent(normal N) BUILTIN;
+closure color reflection(normal N, float eta) BUILTIN;
+closure color reflection(normal N) { return reflection (N, 0.0); }
+closure color refraction(normal N, float eta) BUILTIN;
+closure color dielectric(normal N, float eta) BUILTIN;
+closure color transparent() BUILTIN;
+closure color microfacet_ggx(normal N, float ag) BUILTIN;
+closure color microfacet_ggx_refraction(normal N, float ag, float eta) BUILTIN;
+closure color microfacet_beckmann(normal N, float ab) BUILTIN;
+closure color microfacet_beckmann_refraction(normal N, float ab, float eta) BUILTIN;
+closure color ward(normal N, vector T,float ax, float ay) BUILTIN;
+closure color ashikhmin_velvet(normal N, float sigma) BUILTIN;
+closure color westin_backscatter(normal N, float roughness) BUILTIN;
+closure color westin_sheen(normal N, float edginess) BUILTIN;
+closure color bssrdf_cubic(color radius) BUILTIN;
+closure color emission(float inner_angle, float outer_angle) BUILTIN;
+closure color emission(float outer_angle) BUILTIN;
+closure color emission() BUILTIN;
+closure color debug(string tag) BUILTIN;
+closure color background() BUILTIN;
+closure color holdout() BUILTIN;
+closure color subsurface(float eta, float g, float mfp, float albedo) BUILTIN;
+
+// Renderer state
+int raytype (string typename) BUILTIN;
+
+#undef BUILTIN
+#undef BUILTIN_DERIV
+#undef PERCOMP1
+#undef PERCOMP2
+#undef PERCOMP2F
+
+#endif /* CCL_STDOSL_H */
+
diff --git a/intern/cycles/kernel/osl/osl_closures.cpp b/intern/cycles/kernel/osl/osl_closures.cpp
new file mode 100644
index 00000000000..4c2261942fd
--- /dev/null
+++ b/intern/cycles/kernel/osl/osl_closures.cpp
@@ -0,0 +1,93 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., closure_et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OSL/genclosure.h>
+#include <OSL/oslclosure.h>
+
+#include "osl_closures.h"
+#include "osl_shader.h"
+
+#include "util_debug.h"
+#include "util_param.h"
+
+CCL_NAMESPACE_BEGIN
+
+static void generic_closure_setup(OSL::RendererServices *, int id, void *data)
+{
+ assert(data);
+ OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive *)data;
+ prim->setup();
+}
+
+static bool generic_closure_mergeable(int id, const void *dataA, const void *dataB)
+{
+ assert(dataA && dataB);
+
+ OSL::ClosurePrimitive *primA = (OSL::ClosurePrimitive *)dataA;
+ OSL::ClosurePrimitive *primB = (OSL::ClosurePrimitive *)dataB;
+ return primA->mergeable(primB);
+}
+
+static void register_closure(OSL::ShadingSystem *ss, const char *name, int id, OSL::ClosureParam *params, OSL::PrepareClosureFunc prepare)
+{
+ int j;
+ for(j = 0; params[j].type != TypeDesc(); ++j) {}
+ int size = params[j].offset;
+
+ ss->register_closure(name, id, params, size, prepare, generic_closure_setup, generic_closure_mergeable);
+}
+
+void OSLShader::register_closures(OSL::ShadingSystem *ss)
+{
+ register_closure(ss, "diffuse", OSL_CLOSURE_BSDF_DIFFUSE_ID, bsdf_diffuse_params, bsdf_diffuse_prepare);
+ register_closure(ss, "translucent", OSL_CLOSURE_BSDF_TRANSLUCENT_ID, bsdf_translucent_params, bsdf_translucent_prepare);
+ register_closure(ss, "reflection", OSL_CLOSURE_BSDF_REFLECTION_ID, bsdf_reflection_params, bsdf_reflection_prepare);
+ register_closure(ss, "refraction", OSL_CLOSURE_BSDF_REFRACTION_ID, bsdf_refraction_params, bsdf_refraction_prepare);
+ register_closure(ss, "transparent", OSL_CLOSURE_BSDF_TRANSPARENT_ID, bsdf_transparent_params, bsdf_transparent_prepare);
+ register_closure(ss, "microfacet_ggx", OSL_CLOSURE_BSDF_MICROFACET_GGX_ID, bsdf_microfacet_ggx_params, bsdf_microfacet_ggx_prepare);
+ register_closure(ss, "microfacet_ggx_refraction", OSL_CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID, bsdf_microfacet_ggx_refraction_params, bsdf_microfacet_ggx_refraction_prepare);
+ register_closure(ss, "microfacet_beckmann", OSL_CLOSURE_BSDF_MICROFACET_BECKMANN_ID, bsdf_microfacet_beckmann_params, bsdf_microfacet_beckmann_prepare);
+ register_closure(ss, "microfacet_beckmann_refraction", OSL_CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID, bsdf_microfacet_beckmann_refraction_params, bsdf_microfacet_beckmann_refraction_prepare);
+ register_closure(ss, "ward", OSL_CLOSURE_BSDF_WARD_ID, bsdf_ward_params, bsdf_ward_prepare);
+ register_closure(ss, "ashikhmin_velvet", OSL_CLOSURE_BSDF_ASHIKHMIN_VELVET_ID, bsdf_ashikhmin_velvet_params, bsdf_ashikhmin_velvet_prepare);
+ register_closure(ss, "westin_backscatter", OSL_CLOSURE_BSDF_WESTIN_BACKSCATTER_ID, bsdf_westin_backscatter_params, bsdf_westin_backscatter_prepare);
+ register_closure(ss, "westin_sheen", OSL_CLOSURE_BSDF_WESTIN_SHEEN_ID, bsdf_westin_sheen_params, bsdf_westin_sheen_prepare);
+ register_closure(ss, "bssrdf_cubic", OSL_CLOSURE_BSSRDF_CUBIC_ID, closure_bssrdf_cubic_params, closure_bssrdf_cubic_prepare);
+ register_closure(ss, "emission", OSL_CLOSURE_EMISSION_ID, closure_emission_params, closure_emission_prepare);
+ register_closure(ss, "debug", OSL_CLOSURE_DEBUG_ID, closure_debug_params, closure_debug_prepare);
+ register_closure(ss, "background", OSL_CLOSURE_BACKGROUND_ID, closure_background_params, closure_background_prepare);
+ register_closure(ss, "holdout", OSL_CLOSURE_HOLDOUT_ID, closure_holdout_params, closure_holdout_prepare);
+ register_closure(ss, "subsurface", OSL_CLOSURE_SUBSURFACE_ID, closure_subsurface_params, closure_subsurface_prepare);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/osl_closures.h b/intern/cycles/kernel/osl/osl_closures.h
new file mode 100644
index 00000000000..20a759586b0
--- /dev/null
+++ b/intern/cycles/kernel/osl/osl_closures.h
@@ -0,0 +1,114 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __OSL_CLOSURES_H__
+#define __OSL_CLOSURES_H__
+
+#include <OSL/oslclosure.h>
+#include <OSL/oslexec.h>
+#include <OSL/genclosure.h>
+
+CCL_NAMESPACE_BEGIN
+
+enum {
+ OSL_CLOSURE_BSDF_DIFFUSE_ID,
+ OSL_CLOSURE_BSDF_TRANSLUCENT_ID,
+ OSL_CLOSURE_BSDF_REFLECTION_ID,
+ OSL_CLOSURE_BSDF_REFRACTION_ID,
+ OSL_CLOSURE_BSDF_TRANSPARENT_ID,
+ OSL_CLOSURE_BSDF_MICROFACET_GGX_ID,
+ OSL_CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID,
+ OSL_CLOSURE_BSDF_MICROFACET_BECKMANN_ID,
+ OSL_CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID,
+ OSL_CLOSURE_BSDF_WARD_ID,
+ OSL_CLOSURE_BSDF_ASHIKHMIN_VELVET_ID,
+ OSL_CLOSURE_BSDF_WESTIN_BACKSCATTER_ID,
+ OSL_CLOSURE_BSDF_WESTIN_SHEEN_ID,
+ OSL_CLOSURE_BSSRDF_CUBIC_ID,
+ OSL_CLOSURE_EMISSION_ID,
+ OSL_CLOSURE_DEBUG_ID,
+ OSL_CLOSURE_BACKGROUND_ID,
+ OSL_CLOSURE_HOLDOUT_ID,
+ OSL_CLOSURE_SUBSURFACE_ID
+};
+
+extern OSL::ClosureParam bsdf_diffuse_params[];
+extern OSL::ClosureParam bsdf_translucent_params[];
+extern OSL::ClosureParam bsdf_reflection_params[];
+extern OSL::ClosureParam bsdf_refraction_params[];
+extern OSL::ClosureParam bsdf_transparent_params[];
+extern OSL::ClosureParam bsdf_microfacet_ggx_params[];
+extern OSL::ClosureParam bsdf_microfacet_ggx_refraction_params[];
+extern OSL::ClosureParam bsdf_microfacet_beckmann_params[];
+extern OSL::ClosureParam bsdf_microfacet_beckmann_refraction_params[];
+extern OSL::ClosureParam bsdf_ward_params[];
+extern OSL::ClosureParam bsdf_ashikhmin_velvet_params[];
+extern OSL::ClosureParam bsdf_westin_backscatter_params[];
+extern OSL::ClosureParam bsdf_westin_sheen_params[];
+extern OSL::ClosureParam closure_bssrdf_cubic_params[];
+extern OSL::ClosureParam closure_emission_params[];
+extern OSL::ClosureParam closure_debug_params[];
+extern OSL::ClosureParam closure_background_params[];
+extern OSL::ClosureParam closure_holdout_params[];
+extern OSL::ClosureParam closure_subsurface_params[];
+
+void bsdf_diffuse_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_translucent_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_reflection_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_refraction_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_transparent_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_microfacet_ggx_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_microfacet_ggx_refraction_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_microfacet_beckmann_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_microfacet_beckmann_refraction_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_ward_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_ashikhmin_velvet_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_westin_backscatter_prepare(OSL::RendererServices *, int id, void *data);
+void bsdf_westin_sheen_prepare(OSL::RendererServices *, int id, void *data);
+void closure_bssrdf_cubic_prepare(OSL::RendererServices *, int id, void *data);
+void closure_emission_prepare(OSL::RendererServices *, int id, void *data);
+void closure_debug_prepare(OSL::RendererServices *, int id, void *data);
+void closure_background_prepare(OSL::RendererServices *, int id, void *data);
+void closure_holdout_prepare(OSL::RendererServices *, int id, void *data);
+void closure_subsurface_prepare(OSL::RendererServices *, int id, void *data);
+
+#define CLOSURE_PREPARE(name, classname) \
+void name(RendererServices *, int id, void *data) \
+{ \
+ memset(data, 0, sizeof(classname)); \
+ new (data) classname(); \
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __OSL_CLOSURES_H__ */
+
diff --git a/intern/cycles/kernel/osl/osl_globals.h b/intern/cycles/kernel/osl/osl_globals.h
new file mode 100644
index 00000000000..90746c385c7
--- /dev/null
+++ b/intern/cycles/kernel/osl/osl_globals.h
@@ -0,0 +1,74 @@
+/*
+ * 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 __OSL_GLOBALS_H__
+#define __OSL_GLOBALS_H__
+
+#ifdef WITH_OSL
+
+#include <OSL/oslexec.h>
+
+#include "util_map.h"
+#include "util_param.h"
+#include "util_thread.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+struct OSLGlobals {
+ /* use */
+ bool use;
+
+ /* shading system */
+ OSL::ShadingSystem *ss;
+
+ /* shader states */
+ vector<OSL::ShadingAttribStateRef> surface_state;
+ vector<OSL::ShadingAttribStateRef> volume_state;
+ vector<OSL::ShadingAttribStateRef> displacement_state;
+ OSL::ShadingAttribStateRef background_state;
+
+ /* attributes */
+ struct Attribute {
+ TypeDesc type;
+ AttributeElement elem;
+ int offset;
+ ParamValue value;
+ };
+
+ typedef unordered_map<ustring, Attribute, ustringHash> AttributeMap;
+ typedef unordered_map<ustring, int, ustringHash> ObjectNameMap;
+
+ vector<AttributeMap> attribute_map;
+ ObjectNameMap object_name_map;
+
+ /* thread key for thread specific data lookup */
+ struct ThreadData {
+ OSL::ShaderGlobals globals;
+ void *thread_info;
+ };
+
+ static tls_ptr(ThreadData, thread_data);
+};
+
+CCL_NAMESPACE_END
+
+#endif
+
+#endif /* __OSL_GLOBALS_H__ */
+
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
new file mode 100644
index 00000000000..1b52a3e489b
--- /dev/null
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -0,0 +1,425 @@
+/*
+ * 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 <string.h>
+
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+
+#include "osl_services.h"
+#include "osl_shader.h"
+
+#include "util_foreach.h"
+#include "util_string.h"
+
+#include "kernel_compat_cpu.h"
+#include "kernel_globals.h"
+#include "kernel_object.h"
+#include "kernel_triangle.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* RenderServices implementation */
+
+#define TO_MATRIX44(m) (*(OSL::Matrix44*)&(m))
+
+/* static ustrings */
+ustring OSLRenderServices::u_distance("distance");
+ustring OSLRenderServices::u_index("index");
+ustring OSLRenderServices::u_camera("camera");
+ustring OSLRenderServices::u_screen("screen");
+ustring OSLRenderServices::u_raster("raster");
+ustring OSLRenderServices::u_ndc("NDC");
+ustring OSLRenderServices::u_empty;
+
+OSLRenderServices::OSLRenderServices()
+{
+ kernel_globals = NULL;
+}
+
+OSLRenderServices::~OSLRenderServices()
+{
+}
+
+void OSLRenderServices::thread_init(KernelGlobals *kernel_globals_)
+{
+ kernel_globals = kernel_globals_;
+}
+
+bool OSLRenderServices::get_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform, float time)
+{
+ /* this is only used for shader and object space, we don't really have
+ a concept of shader space, so we just use object space for both. */
+ if(xform) {
+ KernelGlobals *kg = kernel_globals;
+ const ShaderData *sd = (const ShaderData*)xform;
+ int object = sd->object;
+
+ if(object != ~0) {
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+ tfm = transform_transpose(tfm);
+ result = TO_MATRIX44(tfm);
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform, float time)
+{
+ /* this is only used for shader and object space, we don't really have
+ a concept of shader space, so we just use object space for both. */
+ if(xform) {
+ KernelGlobals *kg = kernel_globals;
+ const ShaderData *sd = (const ShaderData*)xform;
+ int object = sd->object;
+
+ if(object != ~0) {
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
+ tfm = transform_transpose(tfm);
+ result = TO_MATRIX44(tfm);
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool OSLRenderServices::get_matrix(OSL::Matrix44 &result, ustring from, float time)
+{
+ KernelGlobals *kg = kernel_globals;
+
+ if(from == u_ndc) {
+ Transform tfm = transform_transpose(kernel_data.cam.ndctoworld);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+ else if(from == u_raster) {
+ Transform tfm = transform_transpose(kernel_data.cam.rastertoworld);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+ else if(from == u_screen) {
+ Transform tfm = transform_transpose(kernel_data.cam.screentoworld);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+ else if(from == u_camera) {
+ Transform tfm = transform_transpose(kernel_data.cam.cameratoworld);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+
+ return false;
+}
+
+bool OSLRenderServices::get_inverse_matrix(OSL::Matrix44 &result, ustring to, float time)
+{
+ KernelGlobals *kg = kernel_globals;
+
+ if(to == u_ndc) {
+ Transform tfm = transform_transpose(kernel_data.cam.worldtondc);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+ else if(to == u_raster) {
+ Transform tfm = transform_transpose(kernel_data.cam.worldtoraster);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+ else if(to == u_screen) {
+ Transform tfm = transform_transpose(kernel_data.cam.worldtoscreen);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+ else if(to == u_camera) {
+ Transform tfm = transform_transpose(kernel_data.cam.worldtocamera);
+ result = TO_MATRIX44(tfm);
+ return true;
+ }
+
+ return false;
+}
+
+bool OSLRenderServices::get_array_attribute(void *renderstate, bool derivatives,
+ ustring object, TypeDesc type, ustring name,
+ int index, void *val)
+{
+ return false;
+}
+
+static bool get_mesh_attribute(KernelGlobals *kg, const ShaderData *sd,
+ const OSLGlobals::Attribute& attr, bool derivatives, void *val)
+{
+ if(attr.type == TypeDesc::TypeFloat) {
+ float *fval = (float*)val;
+ fval[0] = triangle_attribute_float(kg, sd, attr.elem, attr.offset,
+ (derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL);
+ }
+ else {
+ /* todo: this won't work when float3 has w component */
+ float3 *fval = (float3*)val;
+ fval[0] = triangle_attribute_float3(kg, sd, attr.elem, attr.offset,
+ (derivatives)? &fval[1]: NULL, (derivatives)? &fval[2]: NULL);
+ }
+
+ return true;
+}
+
+static bool get_mesh_attribute_convert(KernelGlobals *kg, const ShaderData *sd,
+ const OSLGlobals::Attribute& attr, const TypeDesc& type, bool derivatives, void *val)
+{
+ if(attr.type == TypeDesc::TypeFloat) {
+ float tmp[3];
+ float3 *fval = (float3*)val;
+
+ get_mesh_attribute(kg, sd, attr, derivatives, tmp);
+
+ fval[0] = make_float3(tmp[0], tmp[0], tmp[0]);
+ if(derivatives) {
+ fval[1] = make_float3(tmp[1], tmp[1], tmp[1]);
+ fval[2] = make_float3(tmp[2], tmp[2], tmp[2]);
+ }
+
+ return true;
+ }
+ else if(attr.type == TypeDesc::TypePoint || attr.type == TypeDesc::TypeVector ||
+ attr.type == TypeDesc::TypeNormal || attr.type == TypeDesc::TypeColor) {
+ float3 tmp[3];
+ float *fval = (float*)val;
+
+ get_mesh_attribute(kg, sd, attr, derivatives, tmp);
+
+ fval[0] = average(tmp[0]);
+ if(derivatives) {
+ fval[1] = average(tmp[1]);
+ fval[2] = average(tmp[2]);
+ }
+
+ return true;
+ }
+ else
+ return false;
+}
+
+static void get_object_attribute(const OSLGlobals::Attribute& attr, bool derivatives, void *val)
+{
+ size_t datasize = attr.value.datasize();
+
+ memcpy(val, attr.value.data(), datasize);
+ if(derivatives)
+ memset((char*)val + datasize, 0, datasize*2);
+}
+
+bool OSLRenderServices::get_attribute(void *renderstate, bool derivatives, ustring object_name,
+ TypeDesc type, ustring name, void *val)
+{
+ KernelGlobals *kg = kernel_globals;
+ const ShaderData *sd = (const ShaderData*)renderstate;
+ int object = sd->object;
+ int tri = sd->prim;
+
+ /* lookup of attribute on another object */
+ if(object_name != u_empty) {
+ OSLGlobals::ObjectNameMap::iterator it = kg->osl.object_name_map.find(object_name);
+
+ if(it == kg->osl.object_name_map.end())
+ return false;
+
+ object = it->second;
+ tri = ~0;
+ }
+ else if(object == ~0) {
+ /* no background attributes supported */
+ return false;
+ }
+
+ /* find attribute on object */
+ OSLGlobals::AttributeMap& attribute_map = kg->osl.attribute_map[object];
+ OSLGlobals::AttributeMap::iterator it = attribute_map.find(name);
+
+ if(it == attribute_map.end())
+ return false;
+
+ /* type mistmatch? */
+ const OSLGlobals::Attribute& attr = it->second;
+
+ if(attr.elem != ATTR_ELEMENT_VALUE) {
+ /* triangle and vertex attributes */
+ if(tri != ~0) {
+ if(attr.type == type || (attr.type == TypeDesc::TypeColor &&
+ (type == TypeDesc::TypePoint || type == TypeDesc::TypeVector || type == TypeDesc::TypeNormal)))
+ return get_mesh_attribute(kg, sd, attr, derivatives, val);
+ else
+ return get_mesh_attribute_convert(kg, sd, attr, type, derivatives, val);
+ }
+ }
+ else {
+ /* object attribute */
+ get_object_attribute(attr, derivatives, val);
+ return true;
+ }
+
+ return false;
+}
+
+bool OSLRenderServices::get_userdata(bool derivatives, ustring name, TypeDesc type,
+ void *renderstate, void *val)
+{
+ return false; /* disabled by lockgeom */
+}
+
+bool OSLRenderServices::has_userdata(ustring name, TypeDesc type, void *renderstate)
+{
+ return false; /* never called by OSL */
+}
+
+void *OSLRenderServices::get_pointcloud_attr_query(ustring *attr_names,
+ TypeDesc *attr_types, int nattrs)
+{
+#ifdef WITH_PARTIO
+ m_attr_queries.push_back(AttrQuery());
+ AttrQuery &query = m_attr_queries.back();
+
+ /* make space for what we need. the only reason to use
+ std::vector is to skip the delete */
+ query.attr_names.resize(nattrs);
+ query.attr_partio_types.resize(nattrs);
+ /* capacity will keep the length of the smallest array passed
+ to the query. Just to prevent buffer overruns */
+ query.capacity = -1;
+
+ for(int i = 0; i < nattrs; ++i)
+ {
+ query.attr_names[i] = attr_names[i];
+
+ TypeDesc element_type = attr_types[i].elementtype ();
+
+ if(query.capacity < 0)
+ query.capacity = attr_types[i].numelements();
+ else
+ query.capacity = min(query.capacity, (int)attr_types[i].numelements());
+
+ /* convert the OSL (OIIO) type to the equivalent Partio type so
+ we can do a fast check at query time. */
+ if(element_type == TypeDesc::TypeFloat)
+ query.attr_partio_types[i] = Partio::FLOAT;
+ else if(element_type == TypeDesc::TypeInt)
+ query.attr_partio_types[i] = Partio::INT;
+ else if(element_type == TypeDesc::TypeColor || element_type == TypeDesc::TypePoint ||
+ element_type == TypeDesc::TypeVector || element_type == TypeDesc::TypeNormal)
+ query.attr_partio_types[i] = Partio::VECTOR;
+ else
+ return NULL; /* report some error of unknown type */
+ }
+
+ /* this is valid until the end of RenderServices */
+ return &query;
+#else
+ return NULL;
+#endif
+}
+
+#ifdef WITH_PARTIO
+Partio::ParticlesData *OSLRenderServices::get_pointcloud(ustring filename)
+{
+ return Partio::readCached(filename.c_str(), true);
+}
+
+#endif
+
+int OSLRenderServices::pointcloud(ustring filename, const OSL::Vec3 &center, float radius,
+ int max_points, void *_attr_query, void **attr_outdata)
+{
+ /* todo: this code has never been tested, and most likely does not
+ work. it's based on the example code in OSL */
+
+#ifdef WITH_PARTIO
+ /* query Partio for this pointcloud lookup using cached attr_query */
+ if(!_attr_query)
+ return 0;
+
+ AttrQuery *attr_query = (AttrQuery *)_attr_query;
+ if(attr_query->capacity < max_points)
+ return 0;
+
+ /* get the pointcloud entry for the given filename */
+ Partio::ParticlesData *cloud = get_pointcloud(filename);
+
+ /* now we have to look up all the attributes in the file. we can't do this
+ before hand cause we never know what we are going to load. */
+ int nattrs = attr_query->attr_names.size();
+ Partio::ParticleAttribute *attr = (Partio::ParticleAttribute *)alloca(sizeof(Partio::ParticleAttribute) * nattrs);
+
+ for(int i = 0; i < nattrs; ++i) {
+ /* special case attributes */
+ if(attr_query->attr_names[i] == u_distance || attr_query->attr_names[i] == u_index)
+ continue;
+
+ /* lookup the attribute by name*/
+ if(!cloud->attributeInfo(attr_query->attr_names[i].c_str(), attr[i])) {
+ /* issue an error here and return, types don't match */
+ Partio::endCachedAccess(cloud);
+ cloud->release();
+ return 0;
+ }
+ }
+
+ std::vector<Partio::ParticleIndex> indices;
+ std::vector<float> dist2;
+
+ Partio::beginCachedAccess(cloud);
+
+ /* finally, do the lookup */
+ cloud->findNPoints((const float *)&center, max_points, radius, indices, dist2);
+ int count = indices.size();
+
+ /* retrieve the attributes directly to user space */
+ for(int j = 0; j < nattrs; ++j) {
+ /* special cases */
+ if(attr_query->attr_names[j] == u_distance) {
+ for(int i = 0; i < count; ++i)
+ ((float *)attr_outdata[j])[i] = sqrtf(dist2[i]);
+ }
+ else if(attr_query->attr_names[j] == u_index) {
+ for(int i = 0; i < count; ++i)
+ ((int *)attr_outdata[j])[i] = indices[i];
+ }
+ else {
+ /* note we make a single call per attribute, we don't loop over the
+ points. Partio does it, so it is there that we have to care about
+ performance */
+ cloud->data(attr[j], count, &indices[0], true, attr_outdata[j]);
+ }
+ }
+
+ Partio::endCachedAccess(cloud);
+ cloud->release();
+
+ return count;
+#else
+ return 0;
+#endif
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h
new file mode 100644
index 00000000000..e5003074822
--- /dev/null
+++ b/intern/cycles/kernel/osl/osl_services.h
@@ -0,0 +1,111 @@
+/*
+ * 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 __OSL_SERVICES_H__
+#define __OSL_SERVICES_H__
+
+/* OSL Render Services
+ *
+ * Implementation of OSL render services, to retriever matrices, attributes,
+ * textures and point clouds. In principle this should only be accessing
+ * kernel data, but currently we also reach back into the Scene to retrieve
+ * attributes.
+ */
+
+#include <OSL/oslexec.h>
+#include <OSL/oslclosure.h>
+
+#ifdef WITH_PARTIO
+#include <Partio.h>
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+class Object;
+class Scene;
+class Shader;
+class ShaderData;
+class float3;
+class KernelGlobals;
+
+class OSLRenderServices : public OSL::RendererServices
+{
+public:
+ OSLRenderServices();
+ ~OSLRenderServices();
+
+ void thread_init(KernelGlobals *kernel_globals);
+
+ bool get_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform, float time);
+ bool get_inverse_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform, float time);
+ bool get_matrix(OSL::Matrix44 &result, ustring from, float time);
+ bool get_inverse_matrix(OSL::Matrix44 &result, ustring to, float time);
+
+ bool get_array_attribute(void *renderstate, bool derivatives,
+ ustring object, TypeDesc type, ustring name,
+ int index, void *val);
+ bool get_attribute(void *renderstate, bool derivatives, ustring object,
+ TypeDesc type, ustring name, void *val);
+
+ bool get_userdata(bool derivatives, ustring name, TypeDesc type,
+ void *renderstate, void *val);
+ bool has_userdata(ustring name, TypeDesc type, void *renderstate);
+
+ void *get_pointcloud_attr_query(ustring *attr_names,
+ TypeDesc *attr_types, int nattrs);
+ int pointcloud(ustring filename, const OSL::Vec3 &center, float radius,
+ int max_points, void *attr_query, void **attr_outdata);
+
+private:
+ KernelGlobals *kernel_globals;
+
+#ifdef WITH_PARTIO
+ /* OSL gets pointers to this but its definition is private.
+ right now it only caches the types already converted to
+ Partio constants. this is what get_pointcloud_attr_query
+ returns */
+ struct AttrQuery
+ {
+ /* names of the attributes to query */
+ std::vector<ustring> attr_names;
+ /* types as (enum Partio::ParticleAttributeType) of the
+ attributes in the query */
+ std::vector<int> attr_partio_types;
+ /* for sanity checks, capacity of the output arrays */
+ int capacity;
+ };
+
+ Partio::ParticlesData *get_pointcloud(ustring filename);
+
+ /* keep a list so adding elements doesn't invalidate pointers */
+ std::list<AttrQuery> m_attr_queries;
+#endif
+
+ static ustring u_distance;
+ static ustring u_index;
+ static ustring u_camera;
+ static ustring u_screen;
+ static ustring u_raster;
+ static ustring u_ndc;
+ static ustring u_empty;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __OSL_SERVICES_H__ */
+
diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp
new file mode 100644
index 00000000000..18a8e974492
--- /dev/null
+++ b/intern/cycles/kernel/osl/osl_shader.cpp
@@ -0,0 +1,477 @@
+/*
+ * 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 "kernel_compat_cpu.h"
+#include "kernel_types.h"
+#include "kernel_globals.h"
+#include "kernel_object.h"
+
+#include "osl_services.h"
+#include "osl_shader.h"
+
+#include "util_foreach.h"
+
+#include <OSL/oslexec.h>
+#include <oslexec_pvt.h>
+
+CCL_NAMESPACE_BEGIN
+
+tls_ptr(OSLGlobals::ThreadData, OSLGlobals::thread_data);
+
+/* Threads */
+
+void OSLShader::thread_init(KernelGlobals *kg)
+{
+ OSL::pvt::ShadingSystemImpl *ssi = (OSL::pvt::ShadingSystemImpl*)kg->osl.ss;
+
+ OSLGlobals::ThreadData *tdata = new OSLGlobals::ThreadData();
+
+ memset(&tdata->globals, 0, sizeof(OSL::ShaderGlobals));
+ tdata->thread_info = ssi->create_thread_info();
+
+ tls_set(kg->osl.thread_data, tdata);
+
+ ((OSLRenderServices*)ssi->renderer())->thread_init(kg);
+}
+
+void OSLShader::thread_free(KernelGlobals *kg)
+{
+ OSL::pvt::ShadingSystemImpl *ssi = (OSL::pvt::ShadingSystemImpl*)kg->osl.ss;
+
+ OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
+
+ ssi->destroy_thread_info(tdata->thread_info);
+
+ delete tdata;
+}
+
+/* Globals */
+
+#define TO_VEC3(v) (*(OSL::Vec3*)&(v))
+#define TO_COLOR3(v) (*(OSL::Color3*)&(v))
+#define TO_FLOAT3(v) make_float3(v[0], v[1], v[2])
+
+static void shaderdata_to_shaderglobals(KernelGlobals *kg, ShaderData *sd,
+ int path_flag, OSL::ShaderGlobals *globals)
+{
+ /* copy from shader data to shader globals */
+ globals->P = TO_VEC3(sd->P);
+ globals->dPdx = TO_VEC3(sd->dP.dx);
+ globals->dPdy = TO_VEC3(sd->dP.dy);
+ globals->I = TO_VEC3(sd->I);
+ globals->dIdx = TO_VEC3(sd->dI.dx);
+ globals->dIdy = TO_VEC3(sd->dI.dy);
+ globals->N = TO_VEC3(sd->N);
+ globals->Ng = TO_VEC3(sd->Ng);
+ globals->u = sd->u;
+ globals->dudx = sd->du.dx;
+ globals->dudy = sd->du.dy;
+ globals->v = sd->v;
+ globals->dvdx = sd->dv.dx;
+ globals->dvdy = sd->dv.dy;
+ globals->dPdu = TO_VEC3(sd->dPdu);
+ globals->dPdv = TO_VEC3(sd->dPdv);
+ globals->surfacearea = (sd->object == ~0)? 1.0f: object_surface_area(kg, sd->object);
+
+ /* booleans */
+ globals->raytype = path_flag; /* todo: add our own ray types */
+ globals->backfacing = (sd->flag & SD_BACKFACING);
+
+ /* don't know yet if we need this */
+ globals->flipHandedness = false;
+
+ /* shader data to be used in services callbacks */
+ globals->renderstate = sd;
+
+ /* hacky, we leave it to services to fetch actual object matrix */
+ globals->shader2common = sd;
+ globals->object2common = sd;
+
+ /* must be set to NULL before execute */
+ globals->Ci = NULL;
+}
+
+/* Surface */
+
+static void flatten_surface_closure_tree(ShaderData *sd, bool no_glossy,
+ const OSL::ClosureColor *closure, float3 weight = make_float3(1.0f, 1.0f, 1.0f))
+{
+ /* OSL gives use a closure tree, we flatten it into arrays per
+ * closure type, for evaluation, sampling, etc later on. */
+
+ if(closure->type == OSL::ClosureColor::COMPONENT) {
+ OSL::ClosureComponent *comp = (OSL::ClosureComponent*)closure;
+ OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive*)comp->data();
+
+ if(prim) {
+ ShaderClosure sc;
+ sc.prim = prim;
+ sc.weight = weight;
+
+ switch(prim->category()) {
+ case ClosurePrimitive::BSDF: {
+ if(sd->num_closure == MAX_CLOSURE)
+ return;
+
+ OSL::BSDFClosure *bsdf = (OSL::BSDFClosure*)prim;
+ ustring scattering = bsdf->scattering();
+
+ /* no caustics option */
+ if(no_glossy && scattering == OSL::Labels::GLOSSY)
+ return;
+
+ /* sample weight */
+ float albedo = bsdf->albedo(TO_VEC3(sd->I));
+ float sample_weight = fabsf(average(weight))*albedo;
+ float sample_sum = sd->osl_closure.bsdf_sample_sum + sample_weight;
+
+ sc.sample_weight = sample_weight;
+ sc.type = CLOSURE_BSDF_ID;
+ sd->osl_closure.bsdf_sample_sum = sample_sum;
+
+ /* scattering flags */
+ if(scattering == OSL::Labels::DIFFUSE)
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL;
+ else if(scattering == OSL::Labels::GLOSSY)
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
+ else
+ sd->flag |= SD_BSDF;
+
+ /* add */
+ sd->closure[sd->num_closure++] = sc;
+ break;
+ }
+ case ClosurePrimitive::Emissive: {
+ if(sd->num_closure == MAX_CLOSURE)
+ return;
+
+ /* sample weight */
+ float sample_weight = fabsf(average(weight));
+ float sample_sum = sd->osl_closure.emissive_sample_sum + sample_weight;
+
+ sc.sample_weight = sample_weight;
+ sc.type = CLOSURE_EMISSION_ID;
+ sd->osl_closure.emissive_sample_sum = sample_sum;
+
+ /* flag */
+ sd->flag |= SD_EMISSION;
+
+ sd->closure[sd->num_closure++] = sc;
+ break;
+ }
+ case ClosurePrimitive::Holdout:
+ if(sd->num_closure == MAX_CLOSURE)
+ return;
+
+ sc.sample_weight = 0.0f;
+ sc.type = CLOSURE_HOLDOUT_ID;
+ sd->flag |= SD_HOLDOUT;
+ sd->closure[sd->num_closure++] = sc;
+ break;
+ case ClosurePrimitive::BSSRDF:
+ case ClosurePrimitive::Debug:
+ break; /* not implemented */
+ case ClosurePrimitive::Background:
+ case ClosurePrimitive::Volume:
+ break; /* not relevant */
+ }
+ }
+ }
+ else if(closure->type == OSL::ClosureColor::MUL) {
+ OSL::ClosureMul *mul = (OSL::ClosureMul*)closure;
+ flatten_surface_closure_tree(sd, no_glossy, mul->closure, TO_FLOAT3(mul->weight) * weight);
+ }
+ else if(closure->type == OSL::ClosureColor::ADD) {
+ OSL::ClosureAdd *add = (OSL::ClosureAdd*)closure;
+ flatten_surface_closure_tree(sd, no_glossy, add->closureA, weight);
+ flatten_surface_closure_tree(sd, no_glossy, add->closureB, weight);
+ }
+}
+
+void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, float randb, int path_flag)
+{
+ /* gather pointers */
+ OSL::pvt::ShadingSystemImpl *ssi = (OSL::pvt::ShadingSystemImpl*)kg->osl.ss;
+ OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
+ OSL::ShaderGlobals *globals = &tdata->globals;
+ OSL::pvt::ShadingContext *ctx = ssi->get_context(tdata->thread_info);
+
+ /* setup shader globals from shader data */
+ sd->osl_ctx = ctx;
+ shaderdata_to_shaderglobals(kg, sd, path_flag, globals);
+
+ /* execute shader for this point */
+ int shader = sd->shader & SHADER_MASK;
+
+ if(kg->osl.surface_state[shader])
+ ctx->execute(OSL::pvt::ShadUseSurface, *(kg->osl.surface_state[shader]), *globals);
+
+ /* flatten closure tree */
+ sd->num_closure = 0;
+ sd->randb_closure = randb;
+
+ if(globals->Ci) {
+ bool no_glossy = (path_flag & PATH_RAY_DIFFUSE) && kernel_data.integrator.no_caustics;
+ flatten_surface_closure_tree(sd, no_glossy, globals->Ci);
+ }
+}
+
+/* Background */
+
+static float3 flatten_background_closure_tree(const OSL::ClosureColor *closure)
+{
+ /* OSL gives use a closure tree, if we are shading for background there
+ * is only one supported closure type at the moment, which has no evaluation
+ * functions, so we just sum the weights */
+
+ if(closure->type == OSL::ClosureColor::COMPONENT) {
+ OSL::ClosureComponent *comp = (OSL::ClosureComponent*)closure;
+ OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive*)comp->data();
+
+ if(prim && prim->category() == OSL::ClosurePrimitive::Background)
+ return make_float3(1.0f, 1.0f, 1.0f);
+ }
+ else if(closure->type == OSL::ClosureColor::MUL) {
+ OSL::ClosureMul *mul = (OSL::ClosureMul*)closure;
+
+ return TO_FLOAT3(mul->weight) * flatten_background_closure_tree(mul->closure);
+ }
+ else if(closure->type == OSL::ClosureColor::ADD) {
+ OSL::ClosureAdd *add = (OSL::ClosureAdd*)closure;
+
+ return flatten_background_closure_tree(add->closureA) +
+ flatten_background_closure_tree(add->closureB);
+ }
+
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+float3 OSLShader::eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag)
+{
+ /* gather pointers */
+ OSL::pvt::ShadingSystemImpl *ssi = (OSL::pvt::ShadingSystemImpl*)kg->osl.ss;
+ OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
+ OSL::ShaderGlobals *globals = &tdata->globals;
+ OSL::pvt::ShadingContext *ctx = ssi->get_context(tdata->thread_info);
+
+ /* setup shader globals from shader data */
+ sd->osl_ctx = ctx;
+ shaderdata_to_shaderglobals(kg, sd, path_flag, globals);
+
+ /* execute shader for this point */
+ if(kg->osl.background_state)
+ ctx->execute(OSL::pvt::ShadUseSurface, *kg->osl.background_state, *globals);
+
+ /* return background color immediately */
+ if(globals->Ci)
+ return flatten_background_closure_tree(globals->Ci);
+
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+/* Volume */
+
+static void flatten_volume_closure_tree(ShaderData *sd,
+ const OSL::ClosureColor *closure, float3 weight = make_float3(1.0f, 1.0f, 1.0f))
+{
+ /* OSL gives use a closure tree, we flatten it into arrays per
+ * closure type, for evaluation, sampling, etc later on. */
+
+ if(closure->type == OSL::ClosureColor::COMPONENT) {
+ OSL::ClosureComponent *comp = (OSL::ClosureComponent*)closure;
+ OSL::ClosurePrimitive *prim = (OSL::ClosurePrimitive*)comp->data();
+
+ if(prim) {
+ ShaderClosure sc;
+ sc.prim = prim;
+ sc.weight = weight;
+
+ switch(prim->category()) {
+ case ClosurePrimitive::Volume: {
+ if(sd->num_closure == MAX_CLOSURE)
+ return;
+
+ /* sample weight */
+ float sample_weight = fabsf(average(weight));
+ float sample_sum = sd->osl_closure.volume_sample_sum + sample_weight;
+
+ sc.sample_weight = sample_weight;
+ sc.type = CLOSURE_VOLUME_ID;
+ sd->osl_closure.volume_sample_sum = sample_sum;
+
+ /* add */
+ sd->closure[sd->num_closure++] = sc;
+ break;
+ }
+ case ClosurePrimitive::Holdout:
+ case ClosurePrimitive::Debug:
+ break; /* not implemented */
+ case ClosurePrimitive::Background:
+ case ClosurePrimitive::BSDF:
+ case ClosurePrimitive::Emissive:
+ case ClosurePrimitive::BSSRDF:
+ break; /* not relevant */
+ }
+ }
+ }
+ else if(closure->type == OSL::ClosureColor::MUL) {
+ OSL::ClosureMul *mul = (OSL::ClosureMul*)closure;
+ flatten_volume_closure_tree(sd, mul->closure, TO_FLOAT3(mul->weight) * weight);
+ }
+ else if(closure->type == OSL::ClosureColor::ADD) {
+ OSL::ClosureAdd *add = (OSL::ClosureAdd*)closure;
+ flatten_volume_closure_tree(sd, add->closureA, weight);
+ flatten_volume_closure_tree(sd, add->closureB, weight);
+ }
+}
+
+void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int path_flag)
+{
+ /* gather pointers */
+ OSL::pvt::ShadingSystemImpl *ssi = (OSL::pvt::ShadingSystemImpl*)kg->osl.ss;
+ OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
+ OSL::ShaderGlobals *globals = &tdata->globals;
+ OSL::pvt::ShadingContext *ctx = ssi->get_context(tdata->thread_info);
+
+ /* setup shader globals from shader data */
+ sd->osl_ctx = ctx;
+ shaderdata_to_shaderglobals(kg, sd, path_flag, globals);
+
+ /* execute shader */
+ int shader = sd->shader & SHADER_MASK;
+
+ if(kg->osl.volume_state[shader])
+ ctx->execute(OSL::pvt::ShadUseSurface, *(kg->osl.volume_state[shader]), *globals);
+
+ /* retrieve resulting closures */
+ sd->osl_closure.volume_sample_sum = 0.0f;
+ sd->osl_closure.num_volume = 0;
+ sd->osl_closure.randb = randb;
+
+ if(globals->Ci)
+ flatten_volume_closure_tree(sd, globals->Ci);
+}
+
+/* Displacement */
+
+void OSLShader::eval_displacement(KernelGlobals *kg, ShaderData *sd)
+{
+ /* gather pointers */
+ OSL::pvt::ShadingSystemImpl *ssi = (OSL::pvt::ShadingSystemImpl*)kg->osl.ss;
+ OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
+ OSL::ShaderGlobals *globals = &tdata->globals;
+ OSL::pvt::ShadingContext *ctx = ssi->get_context(tdata->thread_info);
+
+ /* setup shader globals from shader data */
+ sd->osl_ctx = ctx;
+ shaderdata_to_shaderglobals(kg, sd, 0, globals);
+
+ /* execute shader */
+ int shader = sd->shader & SHADER_MASK;
+
+ if(kg->osl.displacement_state[shader])
+ ctx->execute(OSL::pvt::ShadUseSurface, *(kg->osl.displacement_state[shader]), *globals);
+
+ /* get back position */
+ sd->P = TO_FLOAT3(globals->P);
+}
+
+void OSLShader::release(KernelGlobals *kg, const ShaderData *sd)
+{
+ OSL::pvt::ShadingSystemImpl *ssi = (OSL::pvt::ShadingSystemImpl*)kg->osl.ss;
+ OSLGlobals::ThreadData *tdata = tls_get(OSLGlobals::ThreadData, kg->osl.thread_data);
+
+ ssi->release_context((OSL::pvt::ShadingContext*)sd->osl_ctx, tdata->thread_info);
+}
+
+/* BSDF Closure */
+
+int OSLShader::bsdf_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3& eval, float3& omega_in, differential3& domega_in, float& pdf)
+{
+ OSL::BSDFClosure *sample_bsdf = (OSL::BSDFClosure*)sc->prim;
+ int label = LABEL_NONE;
+
+ pdf = 0.0f;
+
+ /* sample BSDF closure */
+ ustring ulabel;
+
+ ulabel = sample_bsdf->sample(TO_VEC3(sd->Ng),
+ TO_VEC3(sd->I), TO_VEC3(sd->dI.dx), TO_VEC3(sd->dI.dy),
+ randu, randv,
+ TO_VEC3(omega_in), TO_VEC3(domega_in.dx), TO_VEC3(domega_in.dy),
+ pdf, TO_COLOR3(eval));
+
+ /* convert OSL label */
+ if(ulabel == OSL::Labels::REFLECT)
+ label = LABEL_REFLECT;
+ else if(ulabel == OSL::Labels::TRANSMIT)
+ label = LABEL_TRANSMIT;
+ else
+ return LABEL_NONE; /* sampling failed */
+
+ /* convert scattering to our bitflag label */
+ ustring uscattering = sample_bsdf->scattering();
+
+ if(uscattering == OSL::Labels::DIFFUSE)
+ label |= LABEL_DIFFUSE;
+ else if(uscattering == OSL::Labels::GLOSSY)
+ label |= LABEL_GLOSSY;
+ else if(uscattering == OSL::Labels::SINGULAR)
+ label |= LABEL_SINGULAR;
+ else
+ label |= LABEL_TRANSPARENT;
+
+ return label;
+}
+
+float3 OSLShader::bsdf_eval(const ShaderData *sd, const ShaderClosure *sc, const float3& omega_in, float& pdf)
+{
+ OSL::BSDFClosure *bsdf = (OSL::BSDFClosure*)sc->prim;
+ OSL::Color3 bsdf_eval;
+
+ if(dot(sd->Ng, omega_in) >= 0.0f)
+ bsdf_eval = bsdf->eval_reflect(TO_VEC3(sd->I), TO_VEC3(omega_in), pdf);
+ else
+ bsdf_eval = bsdf->eval_transmit(TO_VEC3(sd->I), TO_VEC3(omega_in), pdf);
+
+ return TO_FLOAT3(bsdf_eval);
+}
+
+/* Emissive Closure */
+
+float3 OSLShader::emissive_eval(const ShaderData *sd, const ShaderClosure *sc)
+{
+ OSL::EmissiveClosure *emissive = (OSL::EmissiveClosure*)sc->prim;
+ OSL::Color3 emissive_eval = emissive->eval(TO_VEC3(sd->Ng), TO_VEC3(sd->I));
+ eval += TO_FLOAT3(emissive_eval);
+
+ return eval;
+}
+
+/* Volume Closure */
+
+float3 OSLShader::volume_eval_phase(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, const float3 omega_out)
+{
+ OSL::VolumeClosure *volume = (OSL::VolumeClosure*)sc->prim;
+ OSL::Color3 volume_eval = volume->eval_phase(TO_VEC3(omega_in), TO_VEC3(omega_out));
+ return TO_FLOAT3(volume_eval)*sc->weight;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/osl/osl_shader.h b/intern/cycles/kernel/osl/osl_shader.h
new file mode 100644
index 00000000000..6b1d402989b
--- /dev/null
+++ b/intern/cycles/kernel/osl/osl_shader.h
@@ -0,0 +1,90 @@
+/*
+ * 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 __OSL_SHADER_H__
+#define __OSL_SHADER_H__
+
+#ifdef WITH_OSL
+
+/* OSL Shader Engine
+ *
+ * Holds all variables to execute and use OSL shaders from the kernel. These
+ * are initialized externally by OSLShaderManager before rendering starts.
+ *
+ * Before/after a thread starts rendering, thread_init/thread_free must be
+ * called, which will store any per thread OSL state in thread local storage.
+ * This means no thread state must be passed along in the kernel itself.
+ */
+
+#include <OSL/oslexec.h>
+#include <OSL/oslclosure.h>
+
+#include "kernel_types.h"
+
+#include "util_map.h"
+#include "util_param.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+namespace OSL = ::OSL;
+
+class OSLRenderServices;
+class Scene;
+class ShaderClosure;
+class ShaderData;
+class differential3;
+class KernelGlobals;
+
+class OSLShader {
+public:
+ /* init */
+ static void register_closures(OSL::ShadingSystem *ss);
+
+ /* per thread data */
+ static void thread_init(KernelGlobals *kg);
+ static void thread_free(KernelGlobals *kg);
+
+ /* eval */
+ static void eval_surface(KernelGlobals *kg, ShaderData *sd, float randb, int path_flag);
+ static float3 eval_background(KernelGlobals *kg, ShaderData *sd, int path_flag);
+ static void eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int path_flag);
+ static void eval_displacement(KernelGlobals *kg, ShaderData *sd);
+
+ /* sample & eval */
+ static int bsdf_sample(const ShaderData *sd, const ShaderClosure *sc,
+ float randu, float randv,
+ float3& eval, float3& omega_in, differential3& domega_in, float& pdf);
+ static float3 bsdf_eval(const ShaderData *sd, const ShaderClosure *sc,
+ const float3& omega_in, float& pdf);
+
+ static float3 emissive_eval(const ShaderData *sd, const ShaderClosure *sc);
+
+ static float3 volume_eval_phase(const ShaderData *sd, const ShaderClosure *sc,
+ const float3 omega_in, const float3 omega_out);
+
+ /* release */
+ static void release(KernelGlobals *kg, const ShaderData *sd);
+};
+
+CCL_NAMESPACE_END
+
+#endif
+
+#endif /* __OSL_SHADER_H__ */
+
diff --git a/intern/cycles/kernel/osl/vol_subsurface.cpp b/intern/cycles/kernel/osl/vol_subsurface.cpp
new file mode 100644
index 00000000000..0cd3060051b
--- /dev/null
+++ b/intern/cycles/kernel/osl/vol_subsurface.cpp
@@ -0,0 +1,135 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <OpenImageIO/fmath.h>
+
+#include <OSL/genclosure.h>
+
+#include "osl_closures.h"
+
+CCL_NAMESPACE_BEGIN
+
+using namespace OSL;
+
+// Computes scattering properties based on Jensen's reparameterization
+// described in:
+// http://graphics.ucsd.edu/~henrik/papers/fast_bssrdf/
+
+class SubsurfaceClosure : public VolumeClosure {
+public:
+ float m_g;
+ float m_eta;
+ Color3 m_mfp, m_albedo;
+ static float root_find_Rd(const float Rd0, const float A) {
+ // quick exit for trivial cases
+ if (Rd0 <= 0) return 0;
+ const float A43 = A * 4.0f / 3.0f;
+ // Find alpha such that f(alpha) = Rd (see eq.15). A simple bisection
+ // method can be used because this function is monotonicaly increasing.
+ float lo = 0, hi = 1;
+ for (int i = 0; i < 20; i++) { // 2^20 divisions should be sufficient
+ // eval function at midpoint
+ float alpha = 0.5f * (lo + hi);
+ float a1 = sqrtf(3 * (1 - alpha));
+ float e1 = expf(-a1);
+ float e2 = expf(-A43 * a1);
+ float Rd = 0.5f * alpha * (1 + e2) * e1 - Rd0;
+ if (fabsf(Rd) < 1e-6f)
+ return alpha; // close enough
+ else if (Rd > 0)
+ hi = alpha; // root is on left side
+ else
+ lo = alpha; // root is on right side
+ }
+ // didn't quite converge, pick result in the middle of remaining interval
+ return 0.5f * (lo + hi);
+ }
+ SubsurfaceClosure() { }
+
+ void setup()
+ {
+ ior(m_eta);
+
+ if (m_g >= 0.99f) m_g = 0.99f;
+ if (m_g <= -0.99f) m_g = -0.99f;
+
+ // eq.10
+ float inv_eta = 1 / m_eta;
+ float Fdr = -1.440f * inv_eta * inv_eta + 0.710 * inv_eta + 0.668f + 0.0636 * m_eta;
+ float A = (1 + Fdr) / (1 - Fdr);
+ // compute sigma_s, sigma_a (eq.16)
+ Color3 alpha_prime = Color3 (root_find_Rd(m_albedo[0], A),
+ root_find_Rd(m_albedo[1], A),
+ root_find_Rd(m_albedo[2], A));
+ Color3 sigma_t_prime = Color3 (m_mfp.x > 0 ? 1.0f / (m_mfp[0] * sqrtf(3 * (1 - alpha_prime[0]))) : 0.0f,
+ m_mfp.y > 0 ? 1.0f / (m_mfp[1] * sqrtf(3 * (1 - alpha_prime[1]))) : 0.0f,
+ m_mfp.z > 0 ? 1.0f / (m_mfp[2] * sqrtf(3 * (1 - alpha_prime[2]))) : 0.0f);
+ Color3 sigma_s_prime = alpha_prime * sigma_t_prime;
+
+ sigma_s((1.0f / (1 - m_g)) * sigma_s_prime);
+ sigma_a(sigma_t_prime - sigma_s_prime);
+ }
+
+ bool mergeable (const ClosurePrimitive *other) const {
+ const SubsurfaceClosure *comp = (const SubsurfaceClosure *)other;
+ return m_g == comp->m_g && VolumeClosure::mergeable(other);
+ }
+
+ size_t memsize () const { return sizeof(*this); }
+
+ const char *name () const { return "subsurface"; }
+
+ void print_on (std::ostream &out) const {
+ out << name() << " ()";
+ }
+
+ virtual Color3 eval_phase(const Vec3 &omega_in, const Vec3 &omega_out) const {
+ float costheta = omega_in.dot(omega_out);
+ float ph = 0.25f * float(M_1_PI) * ((1 - m_g * m_g) / powf(1 + m_g * m_g - 2.0f * m_g * costheta, 1.5f));
+ return Color3 (ph, ph, ph);
+ }
+};
+
+
+
+ClosureParam closure_subsurface_params[] = {
+ CLOSURE_FLOAT_PARAM (SubsurfaceClosure, m_eta),
+ CLOSURE_FLOAT_PARAM (SubsurfaceClosure, m_g),
+ CLOSURE_COLOR_PARAM (SubsurfaceClosure, m_mfp),
+ CLOSURE_COLOR_PARAM (SubsurfaceClosure, m_albedo),
+ CLOSURE_STRING_KEYPARAM("label"),
+ CLOSURE_FINISH_PARAM(SubsurfaceClosure) };
+
+CLOSURE_PREPARE(closure_subsurface_prepare, SubsurfaceClosure)
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/bsdf.h b/intern/cycles/kernel/svm/bsdf.h
new file mode 100644
index 00000000000..18c1da73fbd
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf.h
@@ -0,0 +1,135 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __OSL_BSDF_H__
+#define __OSL_BSDF_H__
+
+CCL_NAMESPACE_BEGIN
+
+__device float fresnel_dielectric(float eta, const float3 N,
+ const float3 I, float3 *R, float3 *T,
+#ifdef __RAY_DIFFERENTIALS__
+ const float3 dIdx, const float3 dIdy,
+ float3 *dRdx, float3 *dRdy,
+ float3 *dTdx, float3 *dTdy,
+#endif
+ bool *is_inside)
+{
+ float cos = dot(N, I), neta;
+ float3 Nn;
+ // compute reflection
+ *R =(2 * cos)* N - I;
+#ifdef __RAY_DIFFERENTIALS__
+ *dRdx = (2 * dot(N, dIdx)) * N - dIdx;
+ *dRdy = (2 * dot(N, dIdy)) * N - dIdy;
+#endif
+ // check which side of the surface we are on
+ if(cos > 0) {
+ // we are on the outside of the surface, going in
+ neta = 1 / eta;
+ Nn = N;
+ *is_inside = false;
+ } else {
+ // we are inside the surface,
+ cos = -cos;
+ neta = eta;
+ Nn = -N;
+ *is_inside = true;
+ }
+ *R =(2 * cos)* Nn - I;
+ float arg = 1 -(neta * neta *(1 -(cos * cos)));
+ if(arg < 0) {
+ *T= make_float3(0.0f, 0.0f, 0.0f);
+#ifdef __RAY_DIFFERENTIALS__
+ *dTdx= make_float3(0.0f, 0.0f, 0.0f);
+ *dTdy= make_float3(0.0f, 0.0f, 0.0f);
+#endif
+ return 1; // total internal reflection
+ } else {
+ float dnp = sqrtf(arg);
+ float nK =(neta * cos)- dnp;
+ *T = -(neta * I)+(nK * Nn);
+#ifdef __RAY_DIFFERENTIALS__
+ *dTdx = -(neta * dIdx) + ((neta - neta * neta * cos / dnp) * dot(dIdx, Nn)) * Nn;
+ *dTdy = -(neta * dIdy) + ((neta - neta * neta * cos / dnp) * dot(dIdy, Nn)) * Nn;
+#endif
+ // compute Fresnel terms
+ float cosTheta1 = cos; // N.R
+ float cosTheta2 = -dot(Nn, *T);
+ float pPara =(cosTheta1 - eta * cosTheta2)/(cosTheta1 + eta * cosTheta2);
+ float pPerp =(eta * cosTheta1 - cosTheta2)/(eta * cosTheta1 + cosTheta2);
+ return 0.5f * (pPara * pPara + pPerp * pPerp);
+ }
+}
+
+__device float fresnel_dielectric_cos(float cosi, float eta)
+{
+ // compute fresnel reflectance without explicitly computing
+ // the refracted direction
+ float c = fabsf(cosi);
+ float g = eta * eta - 1 + c * c;
+ if(g > 0) {
+ g = sqrtf(g);
+ float A =(g - c)/(g + c);
+ float B =(c *(g + c)- 1)/(c *(g - c)+ 1);
+ return 0.5f * A * A *(1 + B * B);
+ }
+ return 1.0f; // TIR(no refracted component)
+}
+
+__device float fresnel_conductor(float cosi, float eta, float k)
+{
+ float tmp_f = eta * eta + k * k;
+ float tmp = tmp_f * cosi * cosi;
+ float Rparl2 =(tmp -(2.0f * eta * cosi)+ 1)/
+ (tmp +(2.0f * eta * cosi)+ 1);
+ float Rperp2 =(tmp_f -(2.0f * eta * cosi)+ cosi * cosi)/
+ (tmp_f +(2.0f * eta * cosi)+ cosi * cosi);
+ return(Rparl2 + Rperp2) * 0.5f;
+}
+
+__device float smooth_step(float edge0, float edge1, float x)
+{
+ float result;
+ if(x < edge0) result = 0.0f;
+ else if(x >= edge1) result = 1.0f;
+ else {
+ float t = (x - edge0)/(edge1 - edge0);
+ result = (3.0f-2.0f*t)*(t*t);
+ }
+ return result;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __OSL_BSDF_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h b/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h
new file mode 100644
index 00000000000..2e9343647b8
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h
@@ -0,0 +1,161 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_ASHIKHMIN_VELVET_H__
+#define __BSDF_ASHIKHMIN_VELVET_H__
+
+CCL_NAMESPACE_BEGIN
+
+typedef struct BsdfAshikhminVelvetClosure {
+ //float3 m_N;
+ float m_invsigma2;
+} BsdfAshikhminVelvetClosure;
+
+__device void bsdf_ashikhmin_velvet_setup(ShaderData *sd, ShaderClosure *sc, float sigma)
+{
+ sigma = fmaxf(sigma, 0.01f);
+
+ float m_invsigma2 = 1.0f/(sigma * sigma);
+
+ sc->type = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID;
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL;
+ sc->data0 = m_invsigma2;
+}
+
+__device void bsdf_ashikhmin_velvet_blur(ShaderClosure *sc, float roughness)
+{
+}
+
+__device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_invsigma2 = sc->data0;
+ float3 m_N = sd->N;
+
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+ if(cosNO > 0 && cosNI > 0) {
+ float3 H = normalize(omega_in + I);
+
+ float cosNH = dot(m_N, H);
+ float cosHO = fabsf(dot(I, H));
+
+ if(!(fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f))
+ return make_float3(0, 0, 0);
+
+ float cosNHdivHO = cosNH / cosHO;
+ cosNHdivHO = fmaxf(cosNHdivHO, 1e-5f);
+
+ float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
+ float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
+
+ float sinNH2 = 1 - cosNH * cosNH;
+ float sinNH4 = sinNH2 * sinNH2;
+ float cotangent2 = (cosNH * cosNH) / sinNH2;
+
+ float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * M_1_PI_F / sinNH4;
+ float G = min(1.0f, min(fac1, fac2)); // TODO: derive G from D analytically
+
+ float out = 0.25f * (D * G) / cosNO;
+
+ *pdf = 0.5f * M_1_PI_F;
+ return make_float3(out, out, out);
+ }
+
+ return make_float3(0, 0, 0);
+}
+
+__device float3 bsdf_ashikhmin_velvet_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_ashikhmin_velvet_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_ashikhmin_velvet_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float m_invsigma2 = sc->data0;
+ float3 m_N = sd->N;
+
+ // we are viewing the surface from above - send a ray out with uniform
+ // distribution over the hemisphere
+ sample_uniform_hemisphere(m_N, randu, randv, omega_in, pdf);
+
+ if(dot(sd->Ng, *omega_in) > 0) {
+ float3 H = normalize(*omega_in + sd->I);
+
+ float cosNI = dot(m_N, *omega_in);
+ float cosNO = dot(m_N, sd->I);
+ float cosNH = dot(m_N, H);
+ float cosHO = fabsf(dot(sd->I, H));
+
+ if(fabsf(cosNO) > 1e-5f && fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f) {
+ float cosNHdivHO = cosNH / cosHO;
+ cosNHdivHO = fmaxf(cosNHdivHO, 1e-5f);
+
+ float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
+ float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
+
+ float sinNH2 = 1 - cosNH * cosNH;
+ float sinNH4 = sinNH2 * sinNH2;
+ float cotangent2 = (cosNH * cosNH) / sinNH2;
+
+ float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * M_1_PI_F / sinNH4;
+ float G = min(1.0f, min(fac1, fac2)); // TODO: derive G from D analytically
+
+ float power = 0.25f * (D * G) / cosNO;
+
+ *eval = make_float3(power, power, power);
+
+#ifdef __RAY_DIFFERENTIALS__
+ // TODO: find a better approximation for the retroreflective bounce
+ *domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
+ *domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+ *domega_in_dx *= 125.0f;
+ *domega_in_dy *= 125.0f;
+#endif
+ }
+ else
+ *pdf = 0.0f;
+ }
+ else
+ *pdf = 0.0f;
+
+ return LABEL_REFLECT|LABEL_DIFFUSE;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_ASHIKHMIN_VELVET_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_diffuse.h b/intern/cycles/kernel/svm/bsdf_diffuse.h
new file mode 100644
index 00000000000..e8a002cb84c
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_diffuse.h
@@ -0,0 +1,156 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_DIFFUSE_H__
+#define __BSDF_DIFFUSE_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* DIFFUSE */
+
+typedef struct BsdfDiffuseClosure {
+ //float3 m_N;
+} BsdfDiffuseClosure;
+
+__device void bsdf_diffuse_setup(ShaderData *sd, ShaderClosure *sc)
+{
+ sc->type = CLOSURE_BSDF_DIFFUSE_ID;
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL;
+}
+
+__device void bsdf_diffuse_blur(ShaderClosure *sc, float roughness)
+{
+}
+
+__device float3 bsdf_diffuse_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float3 m_N = sd->N;
+
+ float cos_pi = fmaxf(dot(m_N, omega_in), 0.0f) * M_1_PI_F;
+ *pdf = cos_pi;
+ return make_float3(cos_pi, cos_pi, cos_pi);
+}
+
+__device float3 bsdf_diffuse_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_diffuse_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_diffuse_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float3 m_N = sd->N;
+
+ // distribution over the hemisphere
+ sample_cos_hemisphere(m_N, randu, randv, omega_in, pdf);
+
+ if(dot(sd->Ng, *omega_in) > 0.0f) {
+ *eval = make_float3(*pdf, *pdf, *pdf);
+#ifdef __RAY_DIFFERENTIALS__
+ // TODO: find a better approximation for the diffuse bounce
+ *domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
+ *domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+ *domega_in_dx *= 125.0f;
+ *domega_in_dy *= 125.0f;
+#endif
+ }
+ else
+ *pdf = 0.0f;
+
+ return LABEL_REFLECT|LABEL_DIFFUSE;
+}
+
+/* TRANSLUCENT */
+
+typedef struct BsdfTranslucentClosure {
+ //float3 m_N;
+} BsdfTranslucentClosure;
+
+__device void bsdf_translucent_setup(ShaderData *sd, ShaderClosure *sc)
+{
+ sc->type = CLOSURE_BSDF_TRANSLUCENT_ID;
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL;
+}
+
+__device void bsdf_translucent_blur(ShaderClosure *sc, float roughness)
+{
+}
+
+__device float3 bsdf_translucent_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float3 bsdf_translucent_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float3 m_N = sd->N;
+
+ float cos_pi = fmaxf(-dot(m_N, omega_in), 0.0f) * M_1_PI_F;
+ *pdf = cos_pi;
+ return make_float3 (cos_pi, cos_pi, cos_pi);
+}
+
+__device float bsdf_translucent_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_translucent_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float3 m_N = sd->N;
+
+ // we are viewing the surface from the right side - send a ray out with cosine
+ // distribution over the hemisphere
+ sample_cos_hemisphere (-m_N, randu, randv, omega_in, pdf);
+ if(dot(sd->Ng, *omega_in) < 0) {
+ *eval = make_float3(*pdf, *pdf, *pdf);
+#ifdef __RAY_DIFFERENTIALS__
+ // TODO: find a better approximation for the diffuse bounce
+ *domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
+ *domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+ *domega_in_dx *= -125.0f;
+ *domega_in_dy *= -125.0f;
+#endif
+ } else
+ *pdf = 0;
+
+ return LABEL_TRANSMIT|LABEL_DIFFUSE;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_DIFFUSE_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_microfacet.h b/intern/cycles/kernel/svm/bsdf_microfacet.h
new file mode 100644
index 00000000000..3acd3ba4c85
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_microfacet.h
@@ -0,0 +1,503 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_MICROFACET_H__
+#define __BSDF_MICROFACET_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* GGX */
+
+typedef struct BsdfMicrofacetGGXClosure {
+ //float3 m_N;
+ float m_ag;
+ float m_eta;
+} BsdfMicrofacetGGXClosure;
+
+__device void bsdf_microfacet_ggx_setup(ShaderData *sd, ShaderClosure *sc, float ag, float eta, bool refractive)
+{
+ float m_ag = clamp(ag, 1e-5f, 1.0f);
+ float m_eta = eta;
+
+ sc->data0 = m_ag;
+ sc->data1 = m_eta;
+
+ if(refractive)
+ sc->type = CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+ else
+ sc->type = CLOSURE_BSDF_MICROFACET_GGX_ID;
+
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
+}
+
+__device void bsdf_microfacet_ggx_blur(ShaderClosure *sc, float roughness)
+{
+ float m_ag = sc->data0;
+ m_ag = fmaxf(roughness, m_ag);
+ sc->data0 = m_ag;
+}
+
+__device float3 bsdf_microfacet_ggx_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_ag = sc->data0;
+ //float m_eta = sc->data1;
+ int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+ float3 m_N = sd->N;
+
+ if(m_refractive) return make_float3 (0, 0, 0);
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+ if(cosNI > 0 && cosNO > 0) {
+ // get half vector
+ float3 Hr = normalize(omega_in + I);
+ // eq. 20: (F*G*D)/(4*in*on)
+ // eq. 33: first we calculate D(m) with m=Hr:
+ float alpha2 = m_ag * m_ag;
+ float cosThetaM = dot(m_N, Hr);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ float out = (G * D) * 0.25f / cosNO;
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ *pdf = pm * 0.25f / dot(Hr, I);
+ return make_float3 (out, out, out);
+ }
+ return make_float3 (0, 0, 0);
+}
+
+__device float3 bsdf_microfacet_ggx_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_ag = sc->data0;
+ float m_eta = sc->data1;
+ int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+ float3 m_N = sd->N;
+
+ if(!m_refractive) return make_float3 (0, 0, 0);
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+ if(cosNO <= 0 || cosNI >= 0)
+ return make_float3 (0, 0, 0); // vectors on same side -- not possible
+ // compute half-vector of the refraction (eq. 16)
+ float3 ht = -(m_eta * omega_in + I);
+ float3 Ht = normalize(ht);
+ float cosHO = dot(Ht, I);
+
+ float cosHI = dot(Ht, omega_in);
+ // eq. 33: first we calculate D(m) with m=Ht:
+ float alpha2 = m_ag * m_ag;
+ float cosThetaM = dot(m_N, Ht);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ // probability
+ float invHt2 = 1 / dot(ht, ht);
+ *pdf = D * fabsf(cosThetaM) * (fabsf(cosHI) * (m_eta * m_eta)) * invHt2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D) * invHt2) / cosNO;
+ return make_float3 (out, out, out);
+}
+
+__device float bsdf_microfacet_ggx_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_microfacet_ggx_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float m_ag = sc->data0;
+ float m_eta = sc->data1;
+ int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
+ float3 m_N = sd->N;
+
+ float cosNO = dot(m_N, sd->I);
+ if(cosNO > 0) {
+ float3 X, Y, Z = m_N;
+ make_orthonormals(Z, &X, &Y);
+ // generate a random microfacet normal m
+ // eq. 35,36:
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ //tttt and sin(atan(x)) == x/sqrt(1+x^2)
+ float alpha2 = m_ag * m_ag;
+ float tanThetaM2 = alpha2 * randu / (1 - randu);
+ float cosThetaM = 1 / sqrtf(1 + tanThetaM2);
+ float sinThetaM = cosThetaM * sqrtf(tanThetaM2);
+ float phiM = 2 * M_PI_F * randv;
+ float3 m = (cosf(phiM) * sinThetaM) * X +
+ (sinf(phiM) * sinThetaM) * Y +
+ cosThetaM * Z;
+ if(!m_refractive) {
+ float cosMO = dot(m, sd->I);
+ if(cosMO > 0) {
+ // eq. 39 - compute actual reflected direction
+ *omega_in = 2 * cosMO * m - sd->I;
+ if(dot(sd->Ng, *omega_in) > 0) {
+ // microfacet normal is visible to this ray
+ // eq. 33
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ *pdf = pm * 0.25f / cosMO;
+ // eval BRDF*cosNI
+ float cosNI = dot(m_N, *omega_in);
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ // eq. 20: (F*G*D)/(4*in*on)
+ float out = (G * D) * 0.25f / cosNO;
+ *eval = make_float3(out, out, out);
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = (2 * dot(m, sd->dI.dx)) * m - sd->dI.dx;
+ *domega_in_dy = (2 * dot(m, sd->dI.dy)) * m - sd->dI.dy;
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ *domega_in_dx *= 10.0f;
+ *domega_in_dy *= 10.0f;
+#endif
+ }
+ }
+ } else {
+ // CAUTION: the i and o variables are inverted relative to the paper
+ // eq. 39 - compute actual refractive direction
+ float3 R, T;
+#ifdef __RAY_DIFFERENTIALS__
+ float3 dRdx, dRdy, dTdx, dTdy;
+#endif
+ bool inside;
+ fresnel_dielectric(m_eta, m, sd->I, &R, &T,
+#ifdef __RAY_DIFFERENTIALS__
+ sd->dI.dx, sd->dI.dy, &dRdx, &dRdy, &dTdx, &dTdy,
+#endif
+ &inside);
+
+ if(!inside) {
+ *omega_in = T;
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = dTdx;
+ *domega_in_dy = dTdy;
+#endif
+ // eq. 33
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = alpha2 / (M_PI_F * cosThetaM4 * (alpha2 + tanThetaM2) * (alpha2 + tanThetaM2));
+ // eq. 24
+ float pm = D * cosThetaM;
+ // eval BRDF*cosNI
+ float cosNI = dot(m_N, *omega_in);
+ // eq. 34: now calculate G1(i,m) and G1(o,m)
+ float G1o = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float G1i = 2 / (1 + sqrtf(1 + alpha2 * (1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G = G1o * G1i;
+ // eq. 21
+ float cosHI = dot(m, *omega_in);
+ float cosHO = dot(m, sd->I);
+ float Ht2 = m_eta * cosHI + cosHO;
+ Ht2 *= Ht2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D)) / (cosNO * Ht2);
+ // eq. 38 and eq. 17
+ *pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2;
+ *eval = make_float3(out, out, out);
+#ifdef __RAY_DIFFERENTIALS__
+ // Since there is some blur to this refraction, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ *domega_in_dx *= 10.0f;
+ *domega_in_dy *= 10.0f;
+#endif
+ }
+ }
+ }
+ return (m_refractive) ? LABEL_TRANSMIT|LABEL_GLOSSY : LABEL_REFLECT|LABEL_GLOSSY;
+}
+
+/* BECKMANN */
+
+typedef struct BsdfMicrofacetBeckmannClosure {
+ //float3 m_N;
+ float m_ab;
+ float m_eta;
+} BsdfMicrofacetBeckmannClosure;
+
+__device void bsdf_microfacet_beckmann_setup(ShaderData *sd, ShaderClosure *sc, float ab, float eta, bool refractive)
+{
+ float m_ab = clamp(ab, 1e-5f, 1.0f);
+ float m_eta = eta;
+
+ sc->data0 = m_ab;
+ sc->data1 = m_eta;
+
+ if(refractive)
+ sc->type = CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
+ else
+ sc->type = CLOSURE_BSDF_MICROFACET_BECKMANN_ID;
+
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
+}
+
+__device void bsdf_microfacet_beckmann_blur(ShaderClosure *sc, float roughness)
+{
+ float m_ab = sc->data0;
+ m_ab = fmaxf(roughness, m_ab);
+ sc->data0 = m_ab;
+}
+
+__device float3 bsdf_microfacet_beckmann_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_ab = sc->data0;
+ //float m_eta = sc->data1;
+ int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
+ float3 m_N = sd->N;
+
+ if(m_refractive) return make_float3 (0, 0, 0);
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+ if(cosNO > 0 && cosNI > 0) {
+ // get half vector
+ float3 Hr = normalize(omega_in + I);
+ // eq. 20: (F*G*D)/(4*in*on)
+ // eq. 25: first we calculate D(m) with m=Hr:
+ float alpha2 = m_ab * m_ab;
+ float cosThetaM = dot(m_N, Hr);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ float out = (G * D) * 0.25f / cosNO;
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ *pdf = pm * 0.25f / dot(Hr, I);
+ return make_float3 (out, out, out);
+ }
+ return make_float3 (0, 0, 0);
+}
+
+__device float3 bsdf_microfacet_beckmann_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_ab = sc->data0;
+ float m_eta = sc->data1;
+ int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
+ float3 m_N = sd->N;
+
+ if(!m_refractive) return make_float3 (0, 0, 0);
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+ if(cosNO <= 0 || cosNI >= 0)
+ return make_float3 (0, 0, 0);
+ // compute half-vector of the refraction (eq. 16)
+ float3 ht = -(m_eta * omega_in + I);
+ float3 Ht = normalize(ht);
+ float cosHO = dot(Ht, I);
+
+ float cosHI = dot(Ht, omega_in);
+ // eq. 33: first we calculate D(m) with m=Ht:
+ float alpha2 = m_ab * m_ab;
+ float cosThetaM = dot(m_N, Ht);
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = (1 - cosThetaM2) / cosThetaM2;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ // probability
+ float invHt2 = 1 / dot(ht, ht);
+ *pdf = D * fabsf(cosThetaM) * (fabsf(cosHI) * (m_eta * m_eta)) * invHt2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D) * invHt2) / cosNO;
+ return make_float3 (out, out, out);
+}
+
+__device float bsdf_microfacet_beckmann_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_microfacet_beckmann_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float m_ab = sc->data0;
+ float m_eta = sc->data1;
+ int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
+ float3 m_N = sd->N;
+
+ float cosNO = dot(m_N, sd->I);
+ if(cosNO > 0) {
+ float3 X, Y, Z = m_N;
+ make_orthonormals(Z, &X, &Y);
+ // generate a random microfacet normal m
+ // eq. 35,36:
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ //tttt and sin(atan(x)) == x/sqrt(1+x^2)
+ float alpha2 = m_ab * m_ab;
+ float tanThetaM = sqrtf(-alpha2 * logf(1 - randu));
+ float cosThetaM = 1 / sqrtf(1 + tanThetaM * tanThetaM);
+ float sinThetaM = cosThetaM * tanThetaM;
+ float phiM = 2 * M_PI_F * randv;
+ float3 m = (cosf(phiM) * sinThetaM) * X +
+ (sinf(phiM) * sinThetaM) * Y +
+ cosThetaM * Z;
+
+ if(!m_refractive) {
+ float cosMO = dot(m, sd->I);
+ if(cosMO > 0) {
+ // eq. 39 - compute actual reflected direction
+ *omega_in = 2 * cosMO * m - sd->I;
+ if(dot(sd->Ng, *omega_in) > 0) {
+ // microfacet normal is visible to this ray
+ // eq. 25
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = tanThetaM * tanThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
+ // eq. 24
+ float pm = D * cosThetaM;
+ // convert into pdf of the sampled direction
+ // eq. 38 - but see also:
+ // eq. 17 in http://www.graphics.cornell.edu/~bjw/wardnotes.pdf
+ *pdf = pm * 0.25f / cosMO;
+ // Eval BRDF*cosNI
+ float cosNI = dot(m_N, *omega_in);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ // eq. 20: (F*G*D)/(4*in*on)
+ float out = (G * D) * 0.25f / cosNO;
+ *eval = make_float3(out, out, out);
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = (2 * dot(m, sd->dI.dx)) * m - sd->dI.dx;
+ *domega_in_dy = (2 * dot(m, sd->dI.dy)) * m - sd->dI.dy;
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ *domega_in_dx *= 10.0f;
+ *domega_in_dy *= 10.0f;
+#endif
+ }
+ }
+ } else {
+ // CAUTION: the i and o variables are inverted relative to the paper
+ // eq. 39 - compute actual refractive direction
+ float3 R, T;
+#ifdef __RAY_DIFFERENTIALS__
+ float3 dRdx, dRdy, dTdx, dTdy;
+#endif
+ bool inside;
+ fresnel_dielectric(m_eta, m, sd->I, &R, &T,
+#ifdef __RAY_DIFFERENTIALS__
+ sd->dI.dx, sd->dI.dy, &dRdx, &dRdy, &dTdx, &dTdy,
+#endif
+ &inside);
+
+ if(!inside) {
+ *omega_in = T;
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = dTdx;
+ *domega_in_dy = dTdy;
+#endif
+
+ // eq. 33
+ float cosThetaM2 = cosThetaM * cosThetaM;
+ float tanThetaM2 = tanThetaM * tanThetaM;
+ float cosThetaM4 = cosThetaM2 * cosThetaM2;
+ float D = expf(-tanThetaM2 / alpha2) / (M_PI_F * alpha2 * cosThetaM4);
+ // eq. 24
+ float pm = D * cosThetaM;
+ // eval BRDF*cosNI
+ float cosNI = dot(m_N, *omega_in);
+ // eq. 26, 27: now calculate G1(i,m) and G1(o,m)
+ float ao = 1 / (m_ab * sqrtf((1 - cosNO * cosNO) / (cosNO * cosNO)));
+ float ai = 1 / (m_ab * sqrtf((1 - cosNI * cosNI) / (cosNI * cosNI)));
+ float G1o = ao < 1.6f ? (3.535f * ao + 2.181f * ao * ao) / (1 + 2.276f * ao + 2.577f * ao * ao) : 1.0f;
+ float G1i = ai < 1.6f ? (3.535f * ai + 2.181f * ai * ai) / (1 + 2.276f * ai + 2.577f * ai * ai) : 1.0f;
+ float G = G1o * G1i;
+ // eq. 21
+ float cosHI = dot(m, *omega_in);
+ float cosHO = dot(m, sd->I);
+ float Ht2 = m_eta * cosHI + cosHO;
+ Ht2 *= Ht2;
+ float out = (fabsf(cosHI * cosHO) * (m_eta * m_eta) * (G * D)) / (cosNO * Ht2);
+ // eq. 38 and eq. 17
+ *pdf = pm * (m_eta * m_eta) * fabsf(cosHI) / Ht2;
+ *eval = make_float3(out, out, out);
+#ifdef __RAY_DIFFERENTIALS__
+ // Since there is some blur to this refraction, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ *domega_in_dx *= 10.0f;
+ *domega_in_dy *= 10.0f;
+#endif
+ }
+ }
+ }
+ return (m_refractive) ? LABEL_TRANSMIT|LABEL_GLOSSY : LABEL_REFLECT|LABEL_GLOSSY;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_MICROFACET_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_reflection.h b/intern/cycles/kernel/svm/bsdf_reflection.h
new file mode 100644
index 00000000000..f00b72c4869
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_reflection.h
@@ -0,0 +1,93 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_REFLECTION_H__
+#define __BSDF_REFLECTION_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* REFLECTION */
+
+typedef struct BsdfReflectionClosure {
+ //float3 m_N;
+} BsdfReflectionClosure;
+
+__device void bsdf_reflection_setup(ShaderData *sd, ShaderClosure *sc)
+{
+ sc->type = CLOSURE_BSDF_REFLECTION_ID;
+ sd->flag |= SD_BSDF;
+}
+
+__device void bsdf_reflection_blur(ShaderClosure *sc, float roughness)
+{
+}
+
+__device float3 bsdf_reflection_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float3 bsdf_reflection_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_reflection_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_reflection_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ //const BsdfReflectionClosure *self = (const BsdfReflectionClosure*)sc->data;
+ float3 m_N = sd->N;
+
+ // only one direction is possible
+ float cosNO = dot(m_N, sd->I);
+ if(cosNO > 0) {
+ *omega_in = (2 * cosNO) * m_N - sd->I;
+ if(dot(sd->Ng, *omega_in) > 0) {
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = 2 * dot(m_N, sd->dI.dx) * m_N - sd->dI.dx;
+ *domega_in_dy = 2 * dot(m_N, sd->dI.dy) * m_N - sd->dI.dy;
+#endif
+ *pdf = 1;
+ *eval = make_float3(1, 1, 1);
+ }
+ }
+ return LABEL_REFLECT|LABEL_SINGULAR;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_REFLECTION_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_refraction.h b/intern/cycles/kernel/svm/bsdf_refraction.h
new file mode 100644
index 00000000000..07ef8633e0d
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_refraction.h
@@ -0,0 +1,102 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_REFRACTION_H__
+#define __BSDF_REFRACTION_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* REFRACTION */
+
+typedef struct BsdfRefractionClosure {
+ float m_eta;
+} BsdfRefractionClosure;
+
+__device void bsdf_refraction_setup(ShaderData *sd, ShaderClosure *sc, float eta)
+{
+ sc->data0 = eta;
+
+ sc->type = CLOSURE_BSDF_REFRACTION_ID;
+ sd->flag |= SD_BSDF;
+}
+
+__device void bsdf_refraction_blur(ShaderClosure *sc, float roughness)
+{
+}
+
+__device float3 bsdf_refraction_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float3 bsdf_refraction_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_refraction_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_refraction_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float m_eta = sc->data0;
+ float3 m_N = sd->N;
+
+ float3 R, T;
+#ifdef __RAY_DIFFERENTIALS__
+ float3 dRdx, dRdy, dTdx, dTdy;
+#endif
+ bool inside;
+ fresnel_dielectric(m_eta, m_N, sd->I, &R, &T,
+#ifdef __RAY_DIFFERENTIALS__
+ sd->dI.dx, sd->dI.dy, &dRdx, &dRdy, &dTdx, &dTdy,
+#endif
+ &inside);
+
+ if(!inside) {
+ *pdf = 1;
+ *eval = make_float3(1.0f, 1.0f, 1.0f);
+ *omega_in = T;
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = dTdx;
+ *domega_in_dy = dTdy;
+#endif
+ }
+ return LABEL_TRANSMIT|LABEL_SINGULAR;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_REFRACTION_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_transparent.h b/intern/cycles/kernel/svm/bsdf_transparent.h
new file mode 100644
index 00000000000..4425c4bf104
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_transparent.h
@@ -0,0 +1,79 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_TRANSPARENT_H__
+#define __BSDF_TRANSPARENT_H__
+
+CCL_NAMESPACE_BEGIN
+
+__device void bsdf_transparent_setup(ShaderData *sd, ShaderClosure *sc)
+{
+ sc->type = CLOSURE_BSDF_TRANSPARENT_ID;
+ sd->flag |= SD_BSDF;
+}
+
+__device void bsdf_transparent_blur(ShaderClosure *sc, float roughness)
+{
+}
+
+__device float3 bsdf_transparent_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float3 bsdf_transparent_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_transparent_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_transparent_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ // only one direction is possible
+ *omega_in = -sd->I;
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = -sd->dI.dx;
+ *domega_in_dy = -sd->dI.dy;
+#endif
+ *pdf = 1;
+ *eval = make_float3(1, 1, 1);
+ return LABEL_TRANSMIT|LABEL_TRANSPARENT;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_TRANSPARENT_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_ward.h b/intern/cycles/kernel/svm/bsdf_ward.h
new file mode 100644
index 00000000000..d46baf099a6
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_ward.h
@@ -0,0 +1,200 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_WARD_H__
+#define __BSDF_WARD_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* WARD */
+
+typedef struct BsdfWardClosure {
+ //float3 m_N;
+ //float3 m_T;
+ float m_ax;
+ float m_ay;
+} BsdfWardClosure;
+
+__device void bsdf_ward_setup(ShaderData *sd, ShaderClosure *sc, float3 T, float ax, float ay)
+{
+ float m_ax = clamp(ax, 1e-5f, 1.0f);
+ float m_ay = clamp(ay, 1e-5f, 1.0f);
+
+ sc->data0 = m_ax;
+ sc->data1 = m_ay;
+
+ sc->type = CLOSURE_BSDF_WARD_ID;
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
+}
+
+__device void bsdf_ward_blur(ShaderClosure *sc, float roughness)
+{
+ sc->data0 = fmaxf(roughness, sc->data0);
+ sc->data1 = fmaxf(roughness, sc->data1);
+}
+
+__device float3 bsdf_ward_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_ax = sc->data0;
+ float m_ay = sc->data1;
+ float3 m_N = sd->N;
+ float3 m_T = normalize(sd->dPdu);
+
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+
+ if(cosNI > 0 && cosNO > 0) {
+ // get half vector and get x,y basis on the surface for anisotropy
+ float3 H = normalize(omega_in + I); // normalize needed for pdf
+ float3 X, Y;
+ make_orthonormals_tangent(m_N, m_T, &X, &Y);
+ // eq. 4
+ float dotx = dot(H, X) / m_ax;
+ float doty = dot(H, Y) / m_ay;
+ float dotn = dot(H, m_N);
+ float exp_arg = (dotx * dotx + doty * doty) / (dotn * dotn);
+ float denom = (4 * M_PI_F * m_ax * m_ay * sqrtf(cosNO * cosNI));
+ float exp_val = expf(-exp_arg);
+ float out = cosNI * exp_val / denom;
+ float oh = dot(H, I);
+ denom = 4 * M_PI_F * m_ax * m_ay * oh * dotn * dotn * dotn;
+ *pdf = exp_val / denom;
+ return make_float3 (out, out, out);
+ }
+ return make_float3 (0, 0, 0);
+}
+
+__device float3 bsdf_ward_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_ward_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_ward_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float m_ax = sc->data0;
+ float m_ay = sc->data1;
+ float3 m_N = sd->N;
+ float3 m_T = normalize(sd->dPdu);
+
+ float cosNO = dot(m_N, sd->I);
+ if(cosNO > 0) {
+ // get x,y basis on the surface for anisotropy
+ float3 X, Y;
+ make_orthonormals_tangent(m_N, m_T, &X, &Y);
+ // generate random angles for the half vector
+ // eq. 7 (taking care around discontinuities to keep
+ //ttoutput angle in the right quadrant)
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ //tttt and sin(atan(x)) == x/sqrt(1+x^2)
+ float alphaRatio = m_ay / m_ax;
+ float cosPhi, sinPhi;
+ if(randu < 0.25f) {
+ float val = 4 * randu;
+ float tanPhi = alphaRatio * tanf(M_PI_2_F * val);
+ cosPhi = 1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = tanPhi * cosPhi;
+ } else if(randu < 0.5f) {
+ float val = 1 - 4 * (0.5f - randu);
+ float tanPhi = alphaRatio * tanf(M_PI_2_F * val);
+ // phi = M_PI_F - phi;
+ cosPhi = -1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = -tanPhi * cosPhi;
+ } else if(randu < 0.75f) {
+ float val = 4 * (randu - 0.5f);
+ float tanPhi = alphaRatio * tanf(M_PI_2_F * val);
+ //phi = M_PI_F + phi;
+ cosPhi = -1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = tanPhi * cosPhi;
+ } else {
+ float val = 1 - 4 * (1 - randu);
+ float tanPhi = alphaRatio * tanf(M_PI_2_F * val);
+ // phi = 2 * M_PI_F - phi;
+ cosPhi = 1 / sqrtf(1 + tanPhi * tanPhi);
+ sinPhi = -tanPhi * cosPhi;
+ }
+ // eq. 6
+ // we take advantage of cos(atan(x)) == 1/sqrt(1+x^2)
+ //tttt and sin(atan(x)) == x/sqrt(1+x^2)
+ float thetaDenom = (cosPhi * cosPhi) / (m_ax * m_ax) + (sinPhi * sinPhi) / (m_ay * m_ay);
+ float tanTheta2 = -logf(1 - randv) / thetaDenom;
+ float cosTheta = 1 / sqrtf(1 + tanTheta2);
+ float sinTheta = cosTheta * sqrtf(tanTheta2);
+
+ float3 h; // already normalized becaused expressed from spherical coordinates
+ h.x = sinTheta * cosPhi;
+ h.y = sinTheta * sinPhi;
+ h.z = cosTheta;
+ // compute terms that are easier in local space
+ float dotx = h.x / m_ax;
+ float doty = h.y / m_ay;
+ float dotn = h.z;
+ // transform to world space
+ h = h.x * X + h.y * Y + h.z * m_N;
+ // generate the final sample
+ float oh = dot(h, sd->I);
+ *omega_in = 2.0f * oh * h - sd->I;
+ if(dot(sd->Ng, *omega_in) > 0) {
+ float cosNI = dot(m_N, *omega_in);
+ if(cosNI > 0) {
+ // eq. 9
+ float exp_arg = (dotx * dotx + doty * doty) / (dotn * dotn);
+ float denom = 4 * M_PI_F * m_ax * m_ay * oh * dotn * dotn * dotn;
+ *pdf = expf(-exp_arg) / denom;
+ // compiler will reuse expressions already computed
+ denom = (4 * M_PI_F * m_ax * m_ay * sqrtf(cosNO * cosNI));
+ float power = cosNI * expf(-exp_arg) / denom;
+ *eval = make_float3(power, power, power);
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
+ *domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // roughness but the exact relationship is complex and
+ // requires more ops than are practical.
+ *domega_in_dx *= 10.0f;
+ *domega_in_dy *= 10.0f;
+#endif
+ }
+ }
+ }
+ return LABEL_REFLECT|LABEL_GLOSSY;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_WARD_H__ */
+
diff --git a/intern/cycles/kernel/svm/bsdf_westin.h b/intern/cycles/kernel/svm/bsdf_westin.h
new file mode 100644
index 00000000000..21e5018c489
--- /dev/null
+++ b/intern/cycles/kernel/svm/bsdf_westin.h
@@ -0,0 +1,207 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __BSDF_WESTIN_H__
+#define __BSDF_WESTIN_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* WESTIN BACKSCATTER */
+
+typedef struct BsdfWestinBackscatterClosure {
+ //float3 m_N;
+ float m_invroughness;
+} BsdfWestinBackscatterClosure;
+
+__device void bsdf_westin_backscatter_setup(ShaderData *sd, ShaderClosure *sc, float roughness)
+{
+ roughness = clamp(roughness, 1e-5f, 1.0f);
+ float m_invroughness = 1.0f/roughness;
+
+ sc->type = CLOSURE_BSDF_WESTIN_BACKSCATTER_ID;
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
+ sc->data0 = m_invroughness;
+}
+
+__device void bsdf_westin_backscatter_blur(ShaderClosure *sc, float roughness)
+{
+ float m_invroughness = sc->data0;
+ m_invroughness = min(1.0f/roughness, m_invroughness);
+ sc->data0 = m_invroughness;
+}
+
+__device float3 bsdf_westin_backscatter_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_invroughness = sc->data0;
+ float3 m_N = sd->N;
+
+ // pdf is implicitly 0 (no indirect sampling)
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+ if(cosNO > 0 && cosNI > 0) {
+ float cosine = dot(I, omega_in);
+ *pdf = cosine > 0 ? (m_invroughness + 1) * powf(cosine, m_invroughness) : 0;
+ *pdf *= 0.5f * M_1_PI_F;
+ return make_float3 (*pdf, *pdf, *pdf);
+ }
+ return make_float3 (0, 0, 0);
+}
+
+__device float3 bsdf_westin_backscatter_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_westin_backscatter_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_westin_backscatter_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float m_invroughness = sc->data0;
+ float3 m_N = sd->N;
+
+ float cosNO = dot(m_N, sd->I);
+ if(cosNO > 0) {
+#ifdef __RAY_DIFFERENTIALS__
+ *domega_in_dx = sd->dI.dx;
+ *domega_in_dy = sd->dI.dy;
+#endif
+ float3 T, B;
+ make_orthonormals (sd->I, &T, &B);
+ float phi = 2 * M_PI_F * randu;
+ float cosTheta = powf(randv, 1 / (m_invroughness + 1));
+ float sinTheta2 = 1 - cosTheta * cosTheta;
+ float sinTheta = sinTheta2 > 0 ? sqrtf(sinTheta2) : 0;
+ *omega_in = (cosf(phi) * sinTheta) * T +
+ (sinf(phi) * sinTheta) * B +
+ (cosTheta) * sd->I;
+ if(dot(sd->Ng, *omega_in) > 0)
+ {
+ // common terms for pdf and eval
+ float cosNI = dot(m_N, *omega_in);
+ // make sure the direction we chose is still in the right hemisphere
+ if(cosNI > 0)
+ {
+ *pdf = 0.5f * M_1_PI_F * powf(cosTheta, m_invroughness);
+ *pdf = (m_invroughness + 1) * (*pdf);
+ *eval = make_float3(*pdf, *pdf, *pdf);
+#ifdef __RAY_DIFFERENTIALS__
+ // Since there is some blur to this reflection, make the
+ // derivatives a bit bigger. In theory this varies with the
+ // exponent but the exact relationship is complex and
+ // requires more ops than are practical.
+ *domega_in_dx *= 10.0f;
+ *domega_in_dy *= 10.0f;
+#endif
+ }
+ }
+ }
+ return LABEL_REFLECT|LABEL_GLOSSY;
+}
+
+/* WESTIN SHEEN */
+
+typedef struct BsdfWestinSheenClosure {
+ //float3 m_N;
+ float m_edginess;
+} BsdfWestinSheenClosure;
+
+__device void bsdf_westin_sheen_setup(ShaderData *sd, ShaderClosure *sc, float edginess)
+{
+ sc->type = CLOSURE_BSDF_WESTIN_SHEEN_ID;
+ sd->flag |= SD_BSDF|SD_BSDF_HAS_EVAL|SD_BSDF_GLOSSY;
+ sc->data0 = edginess;
+}
+
+__device void bsdf_westin_sheen_blur(ShaderClosure *sc, float roughness)
+{
+}
+
+__device float3 bsdf_westin_sheen_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ float m_edginess = sc->data0;
+ float3 m_N = sd->N;
+
+ // pdf is implicitly 0 (no indirect sampling)
+ float cosNO = dot(m_N, I);
+ float cosNI = dot(m_N, omega_in);
+ if(cosNO > 0 && cosNI > 0) {
+ float sinNO2 = 1 - cosNO * cosNO;
+ *pdf = cosNI * M_1_PI_F;
+ float westin = sinNO2 > 0 ? powf(sinNO2, 0.5f * m_edginess) * (*pdf) : 0;
+ return make_float3 (westin, westin, westin);
+ }
+ return make_float3 (0, 0, 0);
+}
+
+__device float3 bsdf_westin_sheen_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
+{
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+__device float bsdf_westin_sheen_albedo(const ShaderData *sd, const ShaderClosure *sc, const float3 I)
+{
+ return 1.0f;
+}
+
+__device int bsdf_westin_sheen_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+{
+ float m_edginess = sc->data0;
+ float3 m_N = sd->N;
+
+ // we are viewing the surface from the right side - send a ray out with cosine
+ // distribution over the hemisphere
+ sample_cos_hemisphere(m_N, randu, randv, omega_in, pdf);
+ if(dot(sd->Ng, *omega_in) > 0) {
+ // TODO: account for sheen when sampling
+ float cosNO = dot(m_N, sd->I);
+ float sinNO2 = 1 - cosNO * cosNO;
+ float westin = sinNO2 > 0 ? powf(sinNO2, 0.5f * m_edginess) * (*pdf) : 0;
+ *eval = make_float3(westin, westin, westin);
+#ifdef __RAY_DIFFERENTIALS__
+ // TODO: find a better approximation for the diffuse bounce
+ *domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
+ *domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+ *domega_in_dx *= 125.0f;
+ *domega_in_dy *= 125.0f;
+#endif
+ } else
+ pdf = 0;
+ return LABEL_REFLECT|LABEL_DIFFUSE;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __BSDF_WESTIN_H__ */
+
diff --git a/intern/cycles/kernel/svm/emissive.h b/intern/cycles/kernel/svm/emissive.h
new file mode 100644
index 00000000000..e3f99e9b729
--- /dev/null
+++ b/intern/cycles/kernel/svm/emissive.h
@@ -0,0 +1,60 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+CCL_NAMESPACE_BEGIN
+
+/* EMISSION CLOSURE */
+
+__device float3 emissive_eval(const float3 Ng, const float3 I)
+{
+ float cosNO = fabsf(dot(Ng, I));
+ float res = (cosNO > 0.0f)? 1.0f: 0.0f;
+
+ return make_float3(res, res, res);
+}
+
+/// Return the probability distribution function in the direction I,
+/// given the parameters and the light's surface normal. This MUST match
+/// the PDF computed by sample().
+__device float emissive_pdf(const float3 Ng, const float3 I)
+{
+ float cosNO = fabsf(dot(Ng, I));
+ return (cosNO > 0.0f)? 1.0f: 0.0f;
+}
+
+__device float3 svm_emissive_eval(ShaderData *sd, ShaderClosure *sc)
+{
+ return emissive_eval(sd->Ng, sd->I);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
new file mode 100644
index 00000000000..2615272691c
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm.h
@@ -0,0 +1,312 @@
+/*
+ * 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_H__
+#define __SVM_H__
+
+/* Shader Virtual Machine
+ *
+ * A shader is a list of nodes to be executed. These are simply read one after
+ * the other and executed, using an node counter. Each node and it's associated
+ * data is encoded as one or more uint4's in a 1D texture. If the data is larger
+ * than an uint4, the node can increase the node counter to compensate for this.
+ * Floats are encoded as int and then converted to float again.
+ *
+ * Nodes write their output into a stack. All stack data in the stack is
+ * floats, since it's all factors, colors and vectors. The stack will be stored
+ * in local memory on the GPU, as it would take too many register and indexes in
+ * ways not known at compile time. This seems the only solution even though it
+ * may be slow, with two positive factors. If the same shader is being executed,
+ * memory access will be coalesced, and on fermi cards, memory will actually be
+ * cached.
+ *
+ * The result of shader execution will be a single closure. This means the
+ * closure type, associated label, data and weight. Sampling from multiple
+ * closures is supported through the mix closure node, the logic for that is
+ * mostly taken care of in the SVM compiler.
+ */
+
+#include "svm_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Stack */
+
+__device_inline float3 stack_load_float3(float *stack, uint a)
+{
+ kernel_assert(a+2 < SVM_STACK_SIZE);
+
+ return make_float3(stack[a+0], stack[a+1], stack[a+2]);
+}
+
+__device_inline void stack_store_float3(float *stack, uint a, float3 f)
+{
+ kernel_assert(a+2 < SVM_STACK_SIZE);
+
+ stack[a+0] = f.x;
+ stack[a+1] = f.y;
+ stack[a+2] = f.z;
+}
+
+__device_inline float stack_load_float(float *stack, uint a)
+{
+ kernel_assert(a < SVM_STACK_SIZE);
+
+ return stack[a];
+}
+
+__device_inline float stack_load_float_default(float *stack, uint a, uint value)
+{
+ return (a == (uint)SVM_STACK_INVALID)? __int_as_float(value): stack_load_float(stack, a);
+}
+
+__device_inline void stack_store_float(float *stack, uint a, float f)
+{
+ kernel_assert(a < SVM_STACK_SIZE);
+
+ stack[a] = f;
+}
+
+__device_inline bool stack_valid(uint a)
+{
+ return a != (uint)SVM_STACK_INVALID;
+}
+
+/* Reading Nodes */
+
+__device_inline uint4 read_node(KernelGlobals *kg, int *offset)
+{
+ uint4 node = kernel_tex_fetch(__svm_nodes, *offset);
+ (*offset)++;
+ return node;
+}
+
+__device_inline float4 read_node_float(KernelGlobals *kg, int *offset)
+{
+ uint4 node = kernel_tex_fetch(__svm_nodes, *offset);
+ float4 f = make_float4(__int_as_float(node.x), __int_as_float(node.y), __int_as_float(node.z), __int_as_float(node.w));
+ (*offset)++;
+ return f;
+}
+
+__device_inline void decode_node_uchar4(uint i, uint *x, uint *y, uint *z, uint *w)
+{
+ if(x) *x = (i & 0xFF);
+ if(y) *y = ((i >> 8) & 0xFF);
+ if(z) *z = ((i >> 16) & 0xFF);
+ if(w) *w = ((i >> 24) & 0xFF);
+}
+
+CCL_NAMESPACE_END
+
+/* Nodes */
+
+#include "svm_noise.h"
+#include "svm_texture.h"
+
+#include "svm_attribute.h"
+#include "svm_gradient.h"
+#include "svm_closure.h"
+#include "svm_noisetex.h"
+#include "svm_convert.h"
+#include "svm_displace.h"
+#include "svm_fresnel.h"
+#include "svm_geometry.h"
+#include "svm_image.h"
+#include "svm_light_path.h"
+#include "svm_magic.h"
+#include "svm_mapping.h"
+#include "svm_wave.h"
+#include "svm_math.h"
+#include "svm_mix.h"
+#include "svm_musgrave.h"
+#include "svm_sky.h"
+#include "svm_tex_coord.h"
+#include "svm_value.h"
+#include "svm_voronoi.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Main Interpreter Loop */
+
+__device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderType type, float randb, int path_flag)
+{
+ float stack[SVM_STACK_SIZE];
+ float closure_weight = 1.0f;
+ int offset = sd->shader & SHADER_MASK;
+
+#ifdef __MULTI_CLOSURE__
+ sd->num_closure = 0;
+ sd->randb_closure = randb;
+#else
+ sd->closure.type = NBUILTIN_CLOSURES;
+#endif
+
+ while(1) {
+ uint4 node = read_node(kg, &offset);
+
+ switch(node.x) {
+ case NODE_SHADER_JUMP: {
+ if(type == SHADER_TYPE_SURFACE) offset = node.y;
+ else if(type == SHADER_TYPE_VOLUME) offset = node.z;
+ else if(type == SHADER_TYPE_DISPLACEMENT) offset = node.w;
+ else return;
+ break;
+ }
+ case NODE_CLOSURE_BSDF:
+ svm_node_closure_bsdf(kg, sd, stack, node, randb, path_flag);
+ break;
+ case NODE_CLOSURE_EMISSION:
+ svm_node_closure_emission(sd, stack, node);
+ break;
+ case NODE_CLOSURE_BACKGROUND:
+ svm_node_closure_background(sd, stack, node);
+ break;
+ case NODE_CLOSURE_HOLDOUT:
+ svm_node_closure_holdout(sd, stack, node);
+ break;
+ case NODE_CLOSURE_VOLUME:
+ svm_node_closure_volume(kg, sd, stack, node, path_flag);
+ break;
+ case NODE_CLOSURE_SET_WEIGHT:
+ svm_node_closure_set_weight(sd, node.y, node.z, node.w);
+ break;
+ case NODE_CLOSURE_WEIGHT:
+ svm_node_closure_weight(sd, stack, node.y);
+ break;
+ case NODE_EMISSION_WEIGHT:
+ svm_node_emission_weight(kg, sd, stack, node);
+ break;
+ case NODE_MIX_CLOSURE:
+ svm_node_mix_closure(sd, stack, node, &offset, &randb);
+ break;
+ case NODE_ADD_CLOSURE:
+ svm_node_add_closure(sd, stack, node.y, node.z, &offset, &randb, &closure_weight);
+ break;
+ case NODE_JUMP:
+ offset = node.y;
+ break;
+#ifdef __TEXTURES__
+ case NODE_TEX_IMAGE:
+ svm_node_tex_image(kg, sd, stack, node);
+ break;
+ case NODE_TEX_ENVIRONMENT:
+ svm_node_tex_environment(kg, sd, stack, node);
+ break;
+ case NODE_TEX_SKY:
+ svm_node_tex_sky(kg, sd, stack, node.y, node.z);
+ break;
+ case NODE_TEX_GRADIENT:
+ svm_node_tex_gradient(sd, stack, node);
+ break;
+ case NODE_TEX_NOISE:
+ svm_node_tex_noise(kg, sd, stack, node, &offset);
+ break;
+ case NODE_TEX_VORONOI:
+ svm_node_tex_voronoi(kg, sd, stack, node, &offset);
+ break;
+ case NODE_TEX_MUSGRAVE:
+ svm_node_tex_musgrave(kg, sd, stack, node, &offset);
+ break;
+ case NODE_TEX_WAVE:
+ svm_node_tex_wave(kg, sd, stack, node, &offset);
+ break;
+ case NODE_TEX_MAGIC:
+ svm_node_tex_magic(kg, sd, stack, node, &offset);
+ break;
+#endif
+ case NODE_GEOMETRY:
+ svm_node_geometry(sd, stack, node.y, node.z);
+ break;
+ case NODE_GEOMETRY_BUMP_DX:
+ svm_node_geometry_bump_dx(sd, stack, node.y, node.z);
+ break;
+ case NODE_GEOMETRY_BUMP_DY:
+ svm_node_geometry_bump_dy(sd, stack, node.y, node.z);
+ break;
+ case NODE_LIGHT_PATH:
+ svm_node_light_path(sd, stack, node.y, node.z, path_flag);
+ break;
+ case NODE_CONVERT:
+ svm_node_convert(sd, stack, node.y, node.z, node.w);
+ break;
+ case NODE_VALUE_F:
+ svm_node_value_f(kg, sd, stack, node.y, node.z);
+ break;
+ case NODE_VALUE_V:
+ svm_node_value_v(kg, sd, stack, node.y, &offset);
+ break;
+ case NODE_MIX:
+ svm_node_mix(kg, sd, stack, node.y, node.z, node.w, &offset);
+ break;
+ case NODE_ATTR:
+ svm_node_attr(kg, sd, stack, node);
+ break;
+ case NODE_ATTR_BUMP_DX:
+ svm_node_attr_bump_dx(kg, sd, stack, node);
+ break;
+ case NODE_ATTR_BUMP_DY:
+ svm_node_attr_bump_dy(kg, sd, stack, node);
+ break;
+ case NODE_FRESNEL:
+ svm_node_fresnel(sd, stack, node.y, node.z, node.w);
+ break;
+ case NODE_LAYER_WEIGHT:
+ svm_node_layer_weight(sd, stack, node);
+ break;
+ case NODE_SET_DISPLACEMENT:
+ svm_node_set_displacement(sd, stack, node.y);
+ break;
+ case NODE_SET_BUMP:
+ svm_node_set_bump(sd, stack, node.y, node.z, node.w);
+ break;
+ case NODE_MATH:
+ svm_node_math(kg, sd, stack, node.y, node.z, node.w, &offset);
+ break;
+ case NODE_VECTOR_MATH:
+ svm_node_vector_math(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;
+ case NODE_TEX_COORD:
+ svm_node_tex_coord(kg, sd, stack, node.y, node.z);
+ break;
+ case NODE_TEX_COORD_BUMP_DX:
+ svm_node_tex_coord_bump_dx(kg, sd, stack, node.y, node.z);
+ break;
+ case NODE_TEX_COORD_BUMP_DY:
+ svm_node_tex_coord_bump_dy(kg, sd, stack, node.y, node.z);
+ break;
+ case NODE_EMISSION_SET_WEIGHT_TOTAL:
+ svm_node_emission_set_weight_total(kg, sd, node.y, node.z, node.w);
+ break;
+ case NODE_END:
+ default:
+#ifndef __MULTI_CLOSURE__
+ sd->closure.weight *= closure_weight;
+#endif
+ return;
+ }
+ }
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __SVM_H__ */
+
diff --git a/intern/cycles/kernel/svm/svm_attribute.h b/intern/cycles/kernel/svm/svm_attribute.h
new file mode 100644
index 00000000000..3a94f08d42f
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_attribute.h
@@ -0,0 +1,154 @@
+/*
+ * 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
+
+/* Attribute Node */
+
+__device void svm_node_attr_init(KernelGlobals *kg, ShaderData *sd,
+ uint4 node, NodeAttributeType *type,
+ NodeAttributeType *mesh_type, AttributeElement *elem, uint *offset, uint *out_offset)
+{
+ if(sd->object != ~0) {
+ /* find attribute by unique id */
+ uint id = node.y;
+ uint attr_offset = sd->object*kernel_data.bvh.attributes_map_stride;
+ uint4 attr_map = kernel_tex_fetch(__attributes_map, attr_offset);
+
+ while(attr_map.x != id)
+ attr_map = kernel_tex_fetch(__attributes_map, ++attr_offset);
+
+ /* return result */
+ *elem = (AttributeElement)attr_map.y;
+ *offset = attr_map.z;
+ *mesh_type = (NodeAttributeType)attr_map.w;
+ }
+ else {
+ /* background */
+ *elem = ATTR_ELEMENT_NONE;
+ *offset = 0;
+ *mesh_type = (NodeAttributeType)node.w;
+ }
+
+ *out_offset = node.z;
+ *type = (NodeAttributeType)node.w;
+}
+
+__device void svm_node_attr(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+{
+ NodeAttributeType type, mesh_type;
+ AttributeElement elem;
+ uint offset, out_offset;
+
+ svm_node_attr_init(kg, sd, node, &type, &mesh_type, &elem, &offset, &out_offset);
+
+ /* fetch and store attribute */
+ if(type == NODE_ATTR_FLOAT) {
+ if(mesh_type == NODE_ATTR_FLOAT) {
+ float f = triangle_attribute_float(kg, sd, elem, offset, NULL, NULL);
+ stack_store_float(stack, out_offset, f);
+ }
+ else {
+ float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, NULL);
+ stack_store_float(stack, out_offset, average(f));
+ }
+ }
+ else {
+ if(mesh_type == NODE_ATTR_FLOAT3) {
+ float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, NULL);
+ stack_store_float3(stack, out_offset, f);
+ }
+ else {
+ float f = triangle_attribute_float(kg, sd, elem, offset, NULL, NULL);
+ stack_store_float3(stack, out_offset, make_float3(f, f, f));
+ }
+ }
+}
+
+__device void svm_node_attr_bump_dx(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+{
+ NodeAttributeType type, mesh_type;
+ AttributeElement elem;
+ uint offset, out_offset;
+
+ svm_node_attr_init(kg, sd, node, &type, &mesh_type, &elem, &offset, &out_offset);
+
+ /* fetch and store attribute */
+ if(type == NODE_ATTR_FLOAT) {
+ if(mesh_type == NODE_ATTR_FLOAT) {
+ float dx;
+ float f = triangle_attribute_float(kg, sd, elem, offset, &dx, NULL);
+ stack_store_float(stack, out_offset, f+dx);
+ }
+ else {
+ float3 dx;
+ float3 f = triangle_attribute_float3(kg, sd, elem, offset, &dx, NULL);
+ stack_store_float(stack, out_offset, average(f+dx));
+ }
+ }
+ else {
+ if(mesh_type == NODE_ATTR_FLOAT3) {
+ float3 dx;
+ float3 f = triangle_attribute_float3(kg, sd, elem, offset, &dx, NULL);
+ stack_store_float3(stack, out_offset, f+dx);
+ }
+ else {
+ float dx;
+ float f = triangle_attribute_float(kg, sd, elem, offset, &dx, NULL);
+ stack_store_float3(stack, out_offset, make_float3(f+dx, f+dx, f+dx));
+ }
+ }
+}
+
+__device void svm_node_attr_bump_dy(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+{
+ NodeAttributeType type, mesh_type;
+ AttributeElement elem;
+ uint offset, out_offset;
+
+ svm_node_attr_init(kg, sd, node, &type, &mesh_type, &elem, &offset, &out_offset);
+
+ /* fetch and store attribute */
+ if(type == NODE_ATTR_FLOAT) {
+ if(mesh_type == NODE_ATTR_FLOAT) {
+ float dy;
+ float f = triangle_attribute_float(kg, sd, elem, offset, NULL, &dy);
+ stack_store_float(stack, out_offset, f+dy);
+ }
+ else {
+ float3 dy;
+ float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, &dy);
+ stack_store_float(stack, out_offset, average(f+dy));
+ }
+ }
+ else {
+ if(mesh_type == NODE_ATTR_FLOAT3) {
+ float3 dy;
+ float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, &dy);
+ stack_store_float3(stack, out_offset, f+dy);
+ }
+ else {
+ float dy;
+ float f = triangle_attribute_float(kg, sd, elem, offset, NULL, &dy);
+ stack_store_float3(stack, out_offset, make_float3(f+dy, f+dy, f+dy));
+ }
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_bsdf.h b/intern/cycles/kernel/svm/svm_bsdf.h
new file mode 100644
index 00000000000..411efc8be8f
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_bsdf.h
@@ -0,0 +1,232 @@
+/*
+ * 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 "bsdf_ashikhmin_velvet.h"
+#include "bsdf_diffuse.h"
+#include "bsdf_microfacet.h"
+#include "bsdf_reflection.h"
+#include "bsdf_refraction.h"
+#include "bsdf_transparent.h"
+#ifdef __DPDU__
+#include "bsdf_ward.h"
+#endif
+#include "bsdf_westin.h"
+
+CCL_NAMESPACE_BEGIN
+
+__device int svm_bsdf_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, differential3 *domega_in, float *pdf)
+{
+ int label;
+
+ switch(sc->type) {
+ case CLOSURE_BSDF_DIFFUSE_ID:
+ label = bsdf_diffuse_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+#ifdef __SVM__
+ case CLOSURE_BSDF_TRANSLUCENT_ID:
+ label = bsdf_translucent_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_REFLECTION_ID:
+ label = bsdf_reflection_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_REFRACTION_ID:
+ label = bsdf_refraction_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_TRANSPARENT_ID:
+ label = bsdf_transparent_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_MICROFACET_GGX_ID:
+ case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+ label = bsdf_microfacet_ggx_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
+ label = bsdf_microfacet_beckmann_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+#ifdef __DPDU__
+ case CLOSURE_BSDF_WARD_ID:
+ label = bsdf_ward_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+#endif
+ case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
+ label = bsdf_ashikhmin_velvet_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
+ label = bsdf_westin_backscatter_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+ case CLOSURE_BSDF_WESTIN_SHEEN_ID:
+ label = bsdf_westin_sheen_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+ break;
+#endif
+ default:
+ label = LABEL_NONE;
+ break;
+ }
+
+ return label;
+}
+
+__device float3 svm_bsdf_eval(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, float *pdf)
+{
+ float3 eval;
+
+ if(dot(sd->Ng, omega_in) >= 0.0f) {
+ switch(sc->type) {
+ case CLOSURE_BSDF_DIFFUSE_ID:
+ eval = bsdf_diffuse_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+#ifdef __SVM__
+ case CLOSURE_BSDF_TRANSLUCENT_ID:
+ eval = bsdf_translucent_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_REFLECTION_ID:
+ eval = bsdf_reflection_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_REFRACTION_ID:
+ eval = bsdf_refraction_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_TRANSPARENT_ID:
+ eval = bsdf_transparent_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_MICROFACET_GGX_ID:
+ case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+ eval = bsdf_microfacet_ggx_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
+ eval = bsdf_microfacet_beckmann_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+#ifdef __DPDU__
+ case CLOSURE_BSDF_WARD_ID:
+ eval = bsdf_ward_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+#endif
+ case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
+ eval = bsdf_ashikhmin_velvet_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
+ eval = bsdf_westin_backscatter_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_WESTIN_SHEEN_ID:
+ eval = bsdf_westin_sheen_eval_reflect(sd, sc, sd->I, omega_in, pdf);
+ break;
+#endif
+ default:
+ eval = make_float3(0.0f, 0.0f, 0.0f);
+ break;
+ }
+ }
+ else {
+ switch(sc->type) {
+ case CLOSURE_BSDF_DIFFUSE_ID:
+ eval = bsdf_diffuse_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+#ifdef __SVM__
+ case CLOSURE_BSDF_TRANSLUCENT_ID:
+ eval = bsdf_translucent_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_REFLECTION_ID:
+ eval = bsdf_reflection_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_REFRACTION_ID:
+ eval = bsdf_refraction_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_TRANSPARENT_ID:
+ eval = bsdf_transparent_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_MICROFACET_GGX_ID:
+ case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+ eval = bsdf_microfacet_ggx_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
+ eval = bsdf_microfacet_beckmann_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+#ifdef __DPDU__
+ case CLOSURE_BSDF_WARD_ID:
+ eval = bsdf_ward_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+#endif
+ case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
+ eval = bsdf_ashikhmin_velvet_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
+ eval = bsdf_westin_backscatter_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+ case CLOSURE_BSDF_WESTIN_SHEEN_ID:
+ eval = bsdf_westin_sheen_eval_transmit(sd, sc, sd->I, omega_in, pdf);
+ break;
+#endif
+ default:
+ eval = make_float3(0.0f, 0.0f, 0.0f);
+ break;
+ }
+ }
+
+ return eval;
+}
+
+__device void svm_bsdf_blur(ShaderClosure *sc, float roughness)
+{
+ switch(sc->type) {
+ case CLOSURE_BSDF_DIFFUSE_ID:
+ bsdf_diffuse_blur(sc, roughness);
+ break;
+#ifdef __SVM__
+ case CLOSURE_BSDF_TRANSLUCENT_ID:
+ bsdf_translucent_blur(sc, roughness);
+ break;
+ case CLOSURE_BSDF_REFLECTION_ID:
+ bsdf_reflection_blur(sc, roughness);
+ break;
+ case CLOSURE_BSDF_REFRACTION_ID:
+ bsdf_refraction_blur(sc, roughness);
+ break;
+ case CLOSURE_BSDF_TRANSPARENT_ID:
+ bsdf_transparent_blur(sc, roughness);
+ break;
+ case CLOSURE_BSDF_MICROFACET_GGX_ID:
+ case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+ bsdf_microfacet_ggx_blur(sc, roughness);
+ break;
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_ID:
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID:
+ bsdf_microfacet_beckmann_blur(sc, roughness);
+ break;
+#ifdef __DPDU__
+ case CLOSURE_BSDF_WARD_ID:
+ bsdf_ward_blur(sc, roughness);
+ break;
+#endif
+ case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID:
+ bsdf_ashikhmin_velvet_blur(sc, roughness);
+ break;
+ case CLOSURE_BSDF_WESTIN_BACKSCATTER_ID:
+ bsdf_westin_backscatter_blur(sc, roughness);
+ break;
+ case CLOSURE_BSDF_WESTIN_SHEEN_ID:
+ bsdf_westin_sheen_blur(sc, roughness);
+ break;
+#endif
+ default:
+ break;
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
new file mode 100644
index 00000000000..fcda7ac6fe1
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -0,0 +1,424 @@
+/*
+ * 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
+
+/* Closure Nodes */
+
+__device void svm_node_glossy_setup(ShaderData *sd, ShaderClosure *sc, int type, float eta, float roughness, bool refract)
+{
+ if(type == CLOSURE_BSDF_REFRACTION_ID) {
+ if(refract)
+ bsdf_refraction_setup(sd, sc, eta);
+ else
+ bsdf_reflection_setup(sd, sc);
+ }
+ else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID) {
+ bsdf_microfacet_beckmann_setup(sd, sc, roughness, eta, refract);
+ }
+ else
+ bsdf_microfacet_ggx_setup(sd, sc, roughness, eta, refract);
+}
+
+__device_inline ShaderClosure *svm_node_closure_get(ShaderData *sd)
+{
+#ifdef __MULTI_CLOSURE__
+ ShaderClosure *sc = &sd->closure[sd->num_closure];
+
+ if(sd->num_closure < MAX_CLOSURE)
+ sd->num_closure++;
+
+ return sc;
+#else
+ return &sd->closure;
+#endif
+}
+
+__device_inline void svm_node_closure_set_mix_weight(ShaderClosure *sc, float mix_weight)
+{
+#ifdef __MULTI_CLOSURE__
+ sc->weight *= mix_weight;
+ sc->sample_weight = fabsf(average(sc->weight));
+#endif
+}
+
+__device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, float randb, int path_flag)
+{
+ uint type, param1_offset, param2_offset;
+
+#ifdef __MULTI_CLOSURE__
+ uint mix_weight_offset;
+ decode_node_uchar4(node.y, &type, &param1_offset, &param2_offset, &mix_weight_offset);
+ float mix_weight = (stack_valid(mix_weight_offset)? stack_load_float(stack, mix_weight_offset): 1.0f);
+
+ if(mix_weight == 0.0f)
+ return;
+#else
+ decode_node_uchar4(node.y, &type, &param1_offset, &param2_offset, NULL);
+ float mix_weight = 1.0f;
+#endif
+
+ float param1 = (stack_valid(param1_offset))? stack_load_float(stack, param1_offset): __int_as_float(node.z);
+ float param2 = (stack_valid(param2_offset))? stack_load_float(stack, param2_offset): __int_as_float(node.w);
+
+ switch(type) {
+ case CLOSURE_BSDF_DIFFUSE_ID: {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+ bsdf_diffuse_setup(sd, sc);
+ break;
+ }
+ case CLOSURE_BSDF_TRANSLUCENT_ID: {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+ bsdf_translucent_setup(sd, sc);
+ break;
+ }
+ case CLOSURE_BSDF_TRANSPARENT_ID: {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+ bsdf_transparent_setup(sd, sc);
+ break;
+ }
+ case CLOSURE_BSDF_REFLECTION_ID:
+ case CLOSURE_BSDF_MICROFACET_GGX_ID:
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_ID: {
+#ifdef __CAUSTICS_TRICKS__
+ if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
+ break;
+#endif
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+
+ float roughness = param1;
+
+ /* setup bsdf */
+ if(type == CLOSURE_BSDF_REFLECTION_ID)
+ bsdf_reflection_setup(sd, sc);
+ else if(type == CLOSURE_BSDF_MICROFACET_BECKMANN_ID)
+ bsdf_microfacet_beckmann_setup(sd, sc, roughness, 1.0f, false);
+ else
+ bsdf_microfacet_ggx_setup(sd, sc, roughness, 1.0f, false);
+
+ break;
+ }
+ case CLOSURE_BSDF_REFRACTION_ID:
+ case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID:
+ case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID: {
+#ifdef __CAUSTICS_TRICKS__
+ if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
+ break;
+#endif
+ /* index of refraction */
+ float eta = fmaxf(param2, 1.0f + 1e-5f);
+ eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
+
+ /* fresnel */
+ float cosNO = dot(sd->N, sd->I);
+ float fresnel = fresnel_dielectric_cos(cosNO, eta);
+ float roughness = param1;
+
+#ifdef __MULTI_CLOSURE__
+ /* reflection */
+ ShaderClosure *sc = svm_node_closure_get(sd);
+
+ float3 weight = sc->weight;
+ float sample_weight = sc->sample_weight;
+
+ svm_node_closure_set_mix_weight(sc, mix_weight*fresnel);
+ svm_node_glossy_setup(sd, sc, type, eta, roughness, false);
+
+ /* refraction */
+ sc = svm_node_closure_get(sd);
+
+ sc->weight = weight;
+ sc->sample_weight = sample_weight;
+
+ svm_node_closure_set_mix_weight(sc, mix_weight*(1.0f - fresnel));
+ svm_node_glossy_setup(sd, sc, type, eta, roughness, true);
+#else
+ ShaderClosure *sc = svm_node_closure_get(sd);
+
+ bool refract = (randb > fresnel);
+
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+ svm_node_glossy_setup(sd, sc, type, eta, roughness, refract);
+#endif
+
+ break;
+ }
+#ifdef __DPDU__
+ case CLOSURE_BSDF_WARD_ID: {
+#ifdef __CAUSTICS_TRICKS__
+ if(kernel_data.integrator.no_caustics && (path_flag & PATH_RAY_DIFFUSE))
+ break;
+#endif
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+
+ float roughness_u = param1;
+ float roughness_v = param2;
+
+ bsdf_ward_setup(sd, sc, normalize(sd->dPdu), roughness_u, roughness_v);
+ break;
+ }
+#endif
+ case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+
+ /* sigma */
+ float sigma = clamp(param1, 0.0f, 1.0f);
+ bsdf_ashikhmin_velvet_setup(sd, sc, sigma);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+__device void svm_node_closure_volume(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int path_flag)
+{
+ uint type, param1_offset, param2_offset;
+
+#ifdef __MULTI_CLOSURE__
+ uint mix_weight_offset;
+ decode_node_uchar4(node.y, &type, &param1_offset, &param2_offset, &mix_weight_offset);
+ float mix_weight = (stack_valid(mix_weight_offset)? stack_load_float(stack, mix_weight_offset): 1.0f);
+
+ if(mix_weight == 0.0f)
+ return;
+#else
+ decode_node_uchar4(node.y, &type, &param1_offset, &param2_offset, NULL);
+ float mix_weight = 1.0f;
+#endif
+
+ float param1 = (stack_valid(param1_offset))? stack_load_float(stack, param1_offset): __int_as_float(node.z);
+ //float param2 = (stack_valid(param2_offset))? stack_load_float(stack, param2_offset): __int_as_float(node.w);
+
+ switch(type) {
+ case CLOSURE_VOLUME_TRANSPARENT_ID: {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+
+ float density = param1;
+ volume_transparent_setup(sd, sc, density);
+ break;
+ }
+ case CLOSURE_VOLUME_ISOTROPIC_ID: {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ svm_node_closure_set_mix_weight(sc, mix_weight);
+
+ float density = param1;
+ volume_isotropic_setup(sd, sc, density);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+__device void svm_node_closure_emission(ShaderData *sd, float *stack, uint4 node)
+{
+#ifdef __MULTI_CLOSURE__
+ uint mix_weight_offset = node.y;
+
+ if(stack_valid(mix_weight_offset)) {
+ float mix_weight = stack_load_float(stack, mix_weight_offset);
+
+ if(mix_weight == 0.0f)
+ return;
+
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ sc->weight *= mix_weight;
+ sc->type = CLOSURE_EMISSION_ID;
+ }
+ else {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ sc->type = CLOSURE_EMISSION_ID;
+ }
+
+#else
+ ShaderClosure *sc = &sd->closure;
+ sc->type = CLOSURE_EMISSION_ID;
+#endif
+
+ sd->flag |= SD_EMISSION;
+}
+
+__device void svm_node_closure_background(ShaderData *sd, float *stack, uint4 node)
+{
+#ifdef __MULTI_CLOSURE__
+ uint mix_weight_offset = node.y;
+
+ if(stack_valid(mix_weight_offset)) {
+ float mix_weight = stack_load_float(stack, mix_weight_offset);
+
+ if(mix_weight == 0.0f)
+ return;
+
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ sc->weight *= mix_weight;
+ sc->type = CLOSURE_BACKGROUND_ID;
+ }
+ else {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ sc->type = CLOSURE_BACKGROUND_ID;
+ }
+
+#else
+ ShaderClosure *sc = &sd->closure;
+ sc->type = CLOSURE_BACKGROUND_ID;
+#endif
+}
+
+__device void svm_node_closure_holdout(ShaderData *sd, float *stack, uint4 node)
+{
+#ifdef __MULTI_CLOSURE__
+ uint mix_weight_offset = node.y;
+
+ if(stack_valid(mix_weight_offset)) {
+ float mix_weight = stack_load_float(stack, mix_weight_offset);
+
+ if(mix_weight == 0.0f)
+ return;
+
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ sc->weight = make_float3(mix_weight, mix_weight, mix_weight);
+ sc->type = CLOSURE_HOLDOUT_ID;
+ }
+ else {
+ ShaderClosure *sc = svm_node_closure_get(sd);
+ sc->weight = make_float3(1.0f, 1.0f, 1.0f);
+ sc->type = CLOSURE_HOLDOUT_ID;
+ }
+#else
+ ShaderClosure *sc = &sd->closure;
+ sc->type = CLOSURE_HOLDOUT_ID;
+#endif
+
+ sd->flag |= SD_HOLDOUT;
+}
+
+/* Closure Nodes */
+
+__device_inline void svm_node_closure_store_weight(ShaderData *sd, float3 weight)
+{
+#ifdef __MULTI_CLOSURE__
+ sd->closure[sd->num_closure].weight = weight;
+#else
+ sd->closure.weight = weight;
+#endif
+}
+
+__device void svm_node_closure_set_weight(ShaderData *sd, uint r, uint g, uint b)
+{
+ float3 weight = make_float3(__int_as_float(r), __int_as_float(g), __int_as_float(b));
+ svm_node_closure_store_weight(sd, weight);
+}
+
+__device void svm_node_emission_set_weight_total(KernelGlobals *kg, ShaderData *sd, uint r, uint g, uint b)
+{
+ float3 weight = make_float3(__int_as_float(r), __int_as_float(g), __int_as_float(b));
+
+ if(sd->object != ~0)
+ weight /= object_surface_area(kg, sd->object);
+
+ svm_node_closure_store_weight(sd, weight);
+}
+
+__device void svm_node_closure_weight(ShaderData *sd, float *stack, uint weight_offset)
+{
+ float3 weight = stack_load_float3(stack, weight_offset);
+
+ svm_node_closure_store_weight(sd, weight);
+}
+
+__device void svm_node_emission_weight(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+{
+ uint color_offset = node.y;
+ uint strength_offset = node.z;
+ uint total_power = node.w;
+
+ float strength = stack_load_float(stack, strength_offset);
+ float3 weight = stack_load_float3(stack, color_offset)*strength;
+
+ if(total_power && sd->object != ~0)
+ weight /= object_surface_area(kg, sd->object);
+
+ svm_node_closure_store_weight(sd, weight);
+}
+
+__device void svm_node_mix_closure(ShaderData *sd, float *stack,
+ uint4 node, int *offset, float *randb)
+{
+#ifdef __MULTI_CLOSURE__
+ /* fetch weight from blend input, previous mix closures,
+ and write to stack to be used by closure nodes later */
+ uint weight_offset, in_weight_offset, weight1_offset, weight2_offset;
+ decode_node_uchar4(node.y, &weight_offset, &in_weight_offset, &weight1_offset, &weight2_offset);
+
+ float weight = stack_load_float(stack, weight_offset);
+ float in_weight = (stack_valid(in_weight_offset))? stack_load_float(stack, in_weight_offset): 1.0f;
+
+ if(stack_valid(weight1_offset))
+ stack_store_float(stack, weight1_offset, in_weight*(1.0f - weight));
+ if(stack_valid(weight2_offset))
+ stack_store_float(stack, weight2_offset, in_weight*weight);
+#else
+ /* pick a closure and make the random number uniform over 0..1 again.
+ closure 1 starts on the next node, for closure 2 the start is at an
+ offset from the current node, so we jump */
+ uint weight_offset = node.y;
+ uint node_jump = node.z;
+ float weight = stack_load_float(stack, weight_offset);
+ weight = clamp(weight, 0.0f, 1.0f);
+
+ if(*randb < weight) {
+ *offset += node_jump;
+ *randb = *randb/weight;
+ }
+ else
+ *randb = (*randb - weight)/(1.0f - weight);
+#endif
+}
+
+__device void svm_node_add_closure(ShaderData *sd, float *stack, uint unused,
+ uint node_jump, int *offset, float *randb, float *closure_weight)
+{
+#ifdef __MULTI_CLOSURE__
+ /* nothing to do, handled in compiler */
+#else
+ /* pick one of the two closures with probability 0.5. sampling quality
+ is not going to be great, for that we'd need to evaluate the weights
+ of the two closures being added */
+ float weight = 0.5f;
+
+ if(*randb < weight) {
+ *offset += node_jump;
+ *randb = *randb/weight;
+ }
+ else
+ *randb = (*randb - weight)/(1.0f - weight);
+
+ *closure_weight *= 2.0f;
+#endif
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_convert.h b/intern/cycles/kernel/svm/svm_convert.h
new file mode 100644
index 00000000000..188b0489d9e
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_convert.h
@@ -0,0 +1,48 @@
+/*
+ * 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
+
+/* Conversion Nodes */
+
+__device void svm_node_convert(ShaderData *sd, float *stack, uint type, uint from, uint to)
+{
+ switch(type) {
+ case NODE_CONVERT_FV: {
+ float f = stack_load_float(stack, from);
+ stack_store_float3(stack, to, make_float3(f, f, f));
+ break;
+ }
+ case NODE_CONVERT_CF: {
+ float3 f = stack_load_float3(stack, from);
+ float g = linear_rgb_to_gray(f);
+ stack_store_float(stack, to, g);
+ break;
+ }
+ case NODE_CONVERT_VF: {
+ float3 f = stack_load_float3(stack, from);
+ float g = (f.x + f.y + f.z)*(1.0f/3.0f);
+ stack_store_float(stack, to, g);
+ break;
+ }
+
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_displace.h b/intern/cycles/kernel/svm/svm_displace.h
new file mode 100644
index 00000000000..b1677f67eca
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_displace.h
@@ -0,0 +1,52 @@
+/*
+ * 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
+
+/* Bump Node */
+
+__device void svm_node_set_bump(ShaderData *sd, float *stack, uint c_offset, uint x_offset, uint y_offset)
+{
+#ifdef __RAY_DIFFERENTIALS__
+ float h_c = stack_load_float(stack, c_offset);
+ float h_x = stack_load_float(stack, x_offset);
+ float h_y = stack_load_float(stack, y_offset);
+
+ float3 Rx = cross(sd->dP.dy, sd->N);
+ float3 Ry = cross(sd->N, sd->dP.dx);
+
+ float det = dot(sd->dP.dx, Rx);
+ float3 surfgrad = (h_x - h_c)*Rx + (h_y - h_c)*Ry;
+
+ surfgrad *= 0.1f; /* todo: remove this factor */
+
+ float absdet = fabsf(det);
+ sd->N = normalize(absdet*sd->N - signf(det)*surfgrad);
+#endif
+}
+
+/* Displacement Node */
+
+__device void svm_node_set_displacement(ShaderData *sd, float *stack, uint fac_offset)
+{
+ float d = stack_load_float(stack, fac_offset);
+ sd->P += sd->N*d*0.1f; /* todo: get rid of this factor */
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_fresnel.h b/intern/cycles/kernel/svm/svm_fresnel.h
new file mode 100644
index 00000000000..7684eabeecb
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_fresnel.h
@@ -0,0 +1,70 @@
+/*
+ * 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
+
+/* Fresnel Node */
+
+__device void svm_node_fresnel(ShaderData *sd, float *stack, uint ior_offset, uint ior_value, uint out_offset)
+{
+ float eta = (stack_valid(ior_offset))? stack_load_float(stack, ior_offset): __int_as_float(ior_value);
+ eta = fmaxf(eta, 1.0f + 1e-5f);
+ eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
+
+ float f = fresnel_dielectric_cos(dot(sd->I, sd->N), eta);
+
+ stack_store_float(stack, out_offset, f);
+}
+
+/* Blend Weight Node */
+
+__device void svm_node_layer_weight(ShaderData *sd, float *stack, uint4 node)
+{
+ uint blend_offset = node.y;
+ uint blend_value = node.z;
+ float blend = (stack_valid(blend_offset))? stack_load_float(stack, blend_offset): __int_as_float(blend_value);
+
+ uint type, out_offset;
+ decode_node_uchar4(node.w, &type, &out_offset, NULL, NULL);
+
+ float f;
+
+ if(type == NODE_LAYER_WEIGHT_FRESNEL) {
+ float eta = fmaxf(1.0f - blend, 1e-5f);
+ eta = (sd->flag & SD_BACKFACING)? eta: 1.0f/eta;
+
+ f = fresnel_dielectric_cos(dot(sd->I, sd->N), eta);
+ }
+ else {
+ f = fabsf(dot(sd->I, sd->N));
+
+ if(blend != 0.5f) {
+ blend = clamp(blend, 0.0f, 1.0f);
+ blend = (blend < 0.5f)? 2.0f*blend: 0.5f/(1.0f - blend);
+
+ f = powf(f, blend);
+ }
+
+ f = 1.0f - f;
+ }
+
+ stack_store_float(stack, out_offset, f);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_geometry.h b/intern/cycles/kernel/svm/svm_geometry.h
new file mode 100644
index 00000000000..77fe26c809e
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_geometry.h
@@ -0,0 +1,78 @@
+/*
+ * 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
+
+/* Geometry Node */
+
+__device void svm_node_geometry(ShaderData *sd, float *stack, uint type, uint out_offset)
+{
+ float3 data;
+
+ switch(type) {
+ case NODE_GEOM_P: data = sd->P; break;
+ case NODE_GEOM_N: data = sd->N; break;
+#ifdef __DPDU__
+ case NODE_GEOM_T: data = normalize(sd->dPdu); break;
+#endif
+ case NODE_GEOM_I: data = sd->I; break;
+ case NODE_GEOM_Ng: data = sd->Ng; break;
+#ifdef __UV__
+ case NODE_GEOM_uv: data = make_float3(sd->u, sd->v, 0.0f); break;
+#endif
+ }
+
+ stack_store_float3(stack, out_offset, data);
+}
+
+__device void svm_node_geometry_bump_dx(ShaderData *sd, float *stack, uint type, uint out_offset)
+{
+#ifdef __RAY_DIFFERENTIALS__
+ float3 data;
+
+ switch(type) {
+ case NODE_GEOM_P: data = sd->P + sd->dP.dx; break;
+ case NODE_GEOM_uv: data = make_float3(sd->u + sd->du.dx, sd->v + sd->dv.dx, 0.0f); break;
+ default: svm_node_geometry(sd, stack, type, out_offset); return;
+ }
+
+ stack_store_float3(stack, out_offset, data);
+#else
+ svm_node_geometry(sd, stack, type, out_offset);
+#endif
+}
+
+__device void svm_node_geometry_bump_dy(ShaderData *sd, float *stack, uint type, uint out_offset)
+{
+#ifdef __RAY_DIFFERENTIALS__
+ float3 data;
+
+ switch(type) {
+ case NODE_GEOM_P: data = sd->P + sd->dP.dy; break;
+ case NODE_GEOM_uv: data = make_float3(sd->u + sd->du.dy, sd->v + sd->dv.dy, 0.0f); break;
+ default: svm_node_geometry(sd, stack, type, out_offset); return;
+ }
+
+ stack_store_float3(stack, out_offset, data);
+#else
+ svm_node_geometry(sd, stack, type, out_offset);
+#endif
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_gradient.h b/intern/cycles/kernel/svm/svm_gradient.h
new file mode 100644
index 00000000000..c7013800d6b
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_gradient.h
@@ -0,0 +1,80 @@
+/*
+ * 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
+
+/* Gradient */
+
+__device float svm_gradient(float3 p, NodeBlendType type)
+{
+ float x, y, z;
+
+ x= p.x;
+ y= p.y;
+ z= p.z;
+
+ if(type == NODE_BLEND_LINEAR) {
+ return x;
+ }
+ else if(type == NODE_BLEND_QUADRATIC) {
+ float r = fmaxf(x, 0.0f);
+ return r*r;
+ }
+ else if(type == NODE_BLEND_EASING) {
+ float r = fminf(fmaxf(x, 0.0f), 1.0f);
+ float t = r*r;
+
+ return (3.0f*t - 2.0f*t*r);
+ }
+ else if(type == NODE_BLEND_DIAGONAL) {
+ return (x + y)/2.0f;
+ }
+ else if(type == NODE_BLEND_RADIAL) {
+ return atan2(y, x)/(2.0f*M_PI_F) + 0.5f;
+ }
+ else {
+ float r = fmaxf(1.0f - sqrtf(x*x + y*y + z*z), 0.0f);
+
+ if(type == NODE_BLEND_QUADRATIC_SPHERE)
+ return r*r;
+ else if(type == NODE_BLEND_SPHERICAL)
+ return r;
+ }
+
+ return 0.0f;
+}
+
+__device void svm_node_tex_gradient(ShaderData *sd, float *stack, uint4 node)
+{
+ uint type, co_offset, color_offset, fac_offset;
+
+ decode_node_uchar4(node.y, &type, &co_offset, &fac_offset, &color_offset);
+
+ float3 co = stack_load_float3(stack, co_offset);
+
+ float f = svm_gradient(co, (NodeBlendType)type);
+ f = clamp(f, 0.0f, 1.0f);
+
+ if(stack_valid(fac_offset))
+ stack_store_float(stack, fac_offset, f);
+ if(stack_valid(color_offset))
+ stack_store_float3(stack, color_offset, make_float3(f, f, f));
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
new file mode 100644
index 00000000000..62e24166970
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -0,0 +1,196 @@
+/*
+ * 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 float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y)
+{
+ float4 r;
+
+ /* not particularly proud of this massive switch, what are the
+ alternatives?
+ - use a single big 1D texture, and do our own lookup/filtering
+ - group by size and use a 3d texture, performance impact
+ - group into larger texture with some padding for correct lerp
+
+ also note that cuda has 128 textures limit, we use 100 now, since
+ we still need some for other storage */
+
+#ifdef __KERNEL_OPENCL__
+ r = make_float4(0.0f, 0.0f, 0.0f, 0.0f); /* todo */
+#else
+ switch(id) {
+ case 0: r = kernel_tex_image_interp(__tex_image_000, x, y); break;
+ case 1: r = kernel_tex_image_interp(__tex_image_001, x, y); break;
+ case 2: r = kernel_tex_image_interp(__tex_image_002, x, y); break;
+ case 3: r = kernel_tex_image_interp(__tex_image_003, x, y); break;
+ case 4: r = kernel_tex_image_interp(__tex_image_004, x, y); break;
+ case 5: r = kernel_tex_image_interp(__tex_image_005, x, y); break;
+ case 6: r = kernel_tex_image_interp(__tex_image_006, x, y); break;
+ case 7: r = kernel_tex_image_interp(__tex_image_007, x, y); break;
+ case 8: r = kernel_tex_image_interp(__tex_image_008, x, y); break;
+ case 9: r = kernel_tex_image_interp(__tex_image_009, x, y); break;
+ case 10: r = kernel_tex_image_interp(__tex_image_010, x, y); break;
+ case 11: r = kernel_tex_image_interp(__tex_image_011, x, y); break;
+ case 12: r = kernel_tex_image_interp(__tex_image_012, x, y); break;
+ case 13: r = kernel_tex_image_interp(__tex_image_013, x, y); break;
+ case 14: r = kernel_tex_image_interp(__tex_image_014, x, y); break;
+ case 15: r = kernel_tex_image_interp(__tex_image_015, x, y); break;
+ case 16: r = kernel_tex_image_interp(__tex_image_016, x, y); break;
+ case 17: r = kernel_tex_image_interp(__tex_image_017, x, y); break;
+ case 18: r = kernel_tex_image_interp(__tex_image_018, x, y); break;
+ case 19: r = kernel_tex_image_interp(__tex_image_019, x, y); break;
+ case 20: r = kernel_tex_image_interp(__tex_image_020, x, y); break;
+ case 21: r = kernel_tex_image_interp(__tex_image_021, x, y); break;
+ case 22: r = kernel_tex_image_interp(__tex_image_022, x, y); break;
+ case 23: r = kernel_tex_image_interp(__tex_image_023, x, y); break;
+ case 24: r = kernel_tex_image_interp(__tex_image_024, x, y); break;
+ case 25: r = kernel_tex_image_interp(__tex_image_025, x, y); break;
+ case 26: r = kernel_tex_image_interp(__tex_image_026, x, y); break;
+ case 27: r = kernel_tex_image_interp(__tex_image_027, x, y); break;
+ case 28: r = kernel_tex_image_interp(__tex_image_028, x, y); break;
+ case 29: r = kernel_tex_image_interp(__tex_image_029, x, y); break;
+ case 30: r = kernel_tex_image_interp(__tex_image_030, x, y); break;
+ case 31: r = kernel_tex_image_interp(__tex_image_031, x, y); break;
+ case 32: r = kernel_tex_image_interp(__tex_image_032, x, y); break;
+ case 33: r = kernel_tex_image_interp(__tex_image_033, x, y); break;
+ case 34: r = kernel_tex_image_interp(__tex_image_034, x, y); break;
+ case 35: r = kernel_tex_image_interp(__tex_image_035, x, y); break;
+ case 36: r = kernel_tex_image_interp(__tex_image_036, x, y); break;
+ case 37: r = kernel_tex_image_interp(__tex_image_037, x, y); break;
+ case 38: r = kernel_tex_image_interp(__tex_image_038, x, y); break;
+ case 39: r = kernel_tex_image_interp(__tex_image_039, x, y); break;
+ case 40: r = kernel_tex_image_interp(__tex_image_040, x, y); break;
+ case 41: r = kernel_tex_image_interp(__tex_image_041, x, y); break;
+ case 42: r = kernel_tex_image_interp(__tex_image_042, x, y); break;
+ case 43: r = kernel_tex_image_interp(__tex_image_043, x, y); break;
+ case 44: r = kernel_tex_image_interp(__tex_image_044, x, y); break;
+ case 45: r = kernel_tex_image_interp(__tex_image_045, x, y); break;
+ case 46: r = kernel_tex_image_interp(__tex_image_046, x, y); break;
+ case 47: r = kernel_tex_image_interp(__tex_image_047, x, y); break;
+ case 48: r = kernel_tex_image_interp(__tex_image_048, x, y); break;
+ case 49: r = kernel_tex_image_interp(__tex_image_049, x, y); break;
+ case 50: r = kernel_tex_image_interp(__tex_image_050, x, y); break;
+ case 51: r = kernel_tex_image_interp(__tex_image_051, x, y); break;
+ case 52: r = kernel_tex_image_interp(__tex_image_052, x, y); break;
+ case 53: r = kernel_tex_image_interp(__tex_image_053, x, y); break;
+ case 54: r = kernel_tex_image_interp(__tex_image_054, x, y); break;
+ case 55: r = kernel_tex_image_interp(__tex_image_055, x, y); break;
+ case 56: r = kernel_tex_image_interp(__tex_image_056, x, y); break;
+ case 57: r = kernel_tex_image_interp(__tex_image_057, x, y); break;
+ case 58: r = kernel_tex_image_interp(__tex_image_058, x, y); break;
+ case 59: r = kernel_tex_image_interp(__tex_image_059, x, y); break;
+ case 60: r = kernel_tex_image_interp(__tex_image_060, x, y); break;
+ case 61: r = kernel_tex_image_interp(__tex_image_061, x, y); break;
+ case 62: r = kernel_tex_image_interp(__tex_image_062, x, y); break;
+ case 63: r = kernel_tex_image_interp(__tex_image_063, x, y); break;
+ case 64: r = kernel_tex_image_interp(__tex_image_064, x, y); break;
+ case 65: r = kernel_tex_image_interp(__tex_image_065, x, y); break;
+ case 66: r = kernel_tex_image_interp(__tex_image_066, x, y); break;
+ case 67: r = kernel_tex_image_interp(__tex_image_067, x, y); break;
+ case 68: r = kernel_tex_image_interp(__tex_image_068, x, y); break;
+ case 69: r = kernel_tex_image_interp(__tex_image_069, x, y); break;
+ case 70: r = kernel_tex_image_interp(__tex_image_070, x, y); break;
+ case 71: r = kernel_tex_image_interp(__tex_image_071, x, y); break;
+ case 72: r = kernel_tex_image_interp(__tex_image_072, x, y); break;
+ case 73: r = kernel_tex_image_interp(__tex_image_073, x, y); break;
+ case 74: r = kernel_tex_image_interp(__tex_image_074, x, y); break;
+ case 75: r = kernel_tex_image_interp(__tex_image_075, x, y); break;
+ case 76: r = kernel_tex_image_interp(__tex_image_076, x, y); break;
+ case 77: r = kernel_tex_image_interp(__tex_image_077, x, y); break;
+ case 78: r = kernel_tex_image_interp(__tex_image_078, x, y); break;
+ case 79: r = kernel_tex_image_interp(__tex_image_079, x, y); break;
+ case 80: r = kernel_tex_image_interp(__tex_image_080, x, y); break;
+ case 81: r = kernel_tex_image_interp(__tex_image_081, x, y); break;
+ case 82: r = kernel_tex_image_interp(__tex_image_082, x, y); break;
+ case 83: r = kernel_tex_image_interp(__tex_image_083, x, y); break;
+ case 84: r = kernel_tex_image_interp(__tex_image_084, x, y); break;
+ case 85: r = kernel_tex_image_interp(__tex_image_085, x, y); break;
+ case 86: r = kernel_tex_image_interp(__tex_image_086, x, y); break;
+ case 87: r = kernel_tex_image_interp(__tex_image_087, x, y); break;
+ case 88: r = kernel_tex_image_interp(__tex_image_088, x, y); break;
+ case 89: r = kernel_tex_image_interp(__tex_image_089, x, y); break;
+ case 90: r = kernel_tex_image_interp(__tex_image_090, x, y); break;
+ case 91: r = kernel_tex_image_interp(__tex_image_091, x, y); break;
+ case 92: r = kernel_tex_image_interp(__tex_image_092, x, y); break;
+ case 93: r = kernel_tex_image_interp(__tex_image_093, x, y); break;
+ case 94: r = kernel_tex_image_interp(__tex_image_094, x, y); break;
+ case 95: r = kernel_tex_image_interp(__tex_image_095, x, y); break;
+ case 96: r = kernel_tex_image_interp(__tex_image_096, x, y); break;
+ case 97: r = kernel_tex_image_interp(__tex_image_097, x, y); break;
+ case 98: r = kernel_tex_image_interp(__tex_image_098, x, y); break;
+ case 99: r = kernel_tex_image_interp(__tex_image_099, x, y); break;
+ default:
+ kernel_assert(0);
+ return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ }
+#endif
+
+ return r;
+}
+
+__device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+{
+ uint id = node.y;
+ uint co_offset, out_offset, alpha_offset, srgb;
+
+ decode_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset, &srgb);
+
+ float3 co = stack_load_float3(stack, co_offset);
+ float4 f = svm_image_texture(kg, id, co.x, co.y);
+ float3 r = make_float3(f.x, f.y, f.z);
+
+ if(srgb) {
+ r.x = color_srgb_to_scene_linear(r.x);
+ r.y = color_srgb_to_scene_linear(r.y);
+ r.z = color_srgb_to_scene_linear(r.z);
+ }
+
+ if(stack_valid(out_offset))
+ stack_store_float3(stack, out_offset, r);
+ if(stack_valid(alpha_offset))
+ stack_store_float(stack, alpha_offset, f.w);
+}
+
+__device void svm_node_tex_environment(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+{
+ uint id = node.y;
+ uint co_offset, out_offset, alpha_offset, srgb;
+
+ decode_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset, &srgb);
+
+ float3 co = stack_load_float3(stack, co_offset);
+ float u = (atan2f(co.y, co.x) + M_PI_F)/(2*M_PI_F);
+ float v = atan2f(co.z, hypotf(co.x, co.y))/M_PI_F + 0.5f;
+ float4 f = svm_image_texture(kg, id, u, v);
+ float3 r = make_float3(f.x, f.y, f.z);
+
+ if(srgb) {
+ r.x = color_srgb_to_scene_linear(r.x);
+ r.y = color_srgb_to_scene_linear(r.y);
+ r.z = color_srgb_to_scene_linear(r.z);
+ }
+
+ if(stack_valid(out_offset))
+ stack_store_float3(stack, out_offset, r);
+ if(stack_valid(alpha_offset))
+ stack_store_float(stack, alpha_offset, f.w);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_light_path.h b/intern/cycles/kernel/svm/svm_light_path.h
new file mode 100644
index 00000000000..1b13fd93a0f
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_light_path.h
@@ -0,0 +1,42 @@
+/*
+ * 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
+
+/* Light Path Node */
+
+__device void svm_node_light_path(ShaderData *sd, float *stack, uint type, uint out_offset, int path_flag)
+{
+ float info = 0.0f;
+
+ switch(type) {
+ case NODE_LP_camera: info = (path_flag & PATH_RAY_CAMERA)? 1.0f: 0.0f; break;
+ case NODE_LP_shadow: info = (path_flag & PATH_RAY_SHADOW)? 1.0f: 0.0f; break;
+ case NODE_LP_diffuse: info = (path_flag & PATH_RAY_DIFFUSE)? 1.0f: 0.0f; break;
+ case NODE_LP_glossy: info = (path_flag & PATH_RAY_GLOSSY)? 1.0f: 0.0f; break;
+ case NODE_LP_singular: info = (path_flag & PATH_RAY_SINGULAR)? 1.0f: 0.0f; break;
+ case NODE_LP_reflection: info = (path_flag & PATH_RAY_REFLECT)? 1.0f: 0.0f; break;
+ case NODE_LP_transmission: info = (path_flag & PATH_RAY_TRANSMIT)? 1.0f: 0.0f; break;
+ case NODE_LP_backfacing: info = (sd->flag & SD_BACKFACING)? 1.0f: 0.0f; break;
+ }
+
+ stack_store_float(stack, out_offset, info);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_magic.h b/intern/cycles/kernel/svm/svm_magic.h
new file mode 100644
index 00000000000..65d37937e1e
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_magic.h
@@ -0,0 +1,114 @@
+/*
+ * 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
+
+/* Magic */
+
+__device_noinline float3 svm_magic(float3 p, int n, float distortion)
+{
+ float x = sinf((p.x + p.y + p.z)*5.0f);
+ float y = cosf((-p.x + p.y - p.z)*5.0f);
+ float z = -cosf((-p.x - p.y + p.z)*5.0f);
+
+ if(n > 0) {
+ x *= distortion;
+ y *= distortion;
+ z *= distortion;
+ y = -cosf(x-y+z);
+ y *= distortion;
+
+ if(n > 1) {
+ x= cosf(x-y-z);
+ x *= distortion;
+
+ if(n > 2) {
+ z= sinf(-x-y-z);
+ z *= distortion;
+
+ if(n > 3) {
+ x= -cosf(-x+y-z);
+ x *= distortion;
+
+ if(n > 4) {
+ y= -sinf(-x+y+z);
+ y *= distortion;
+
+ if(n > 5) {
+ y= -cosf(-x+y+z);
+ y *= distortion;
+
+ if(n > 6) {
+ x= cosf(x+y+z);
+ x *= distortion;
+
+ if(n > 7) {
+ z= sinf(x+y-z);
+ z *= distortion;
+
+ if(n > 8) {
+ x= -cosf(-x-y+z);
+ x *= distortion;
+
+ if(n > 9) {
+ y= -sinf(x-y+z);
+ y *= distortion;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(distortion != 0.0f) {
+ distortion *= 2.0f;
+ x /= distortion;
+ y /= distortion;
+ z /= distortion;
+ }
+
+ return make_float3(0.5f - x, 0.5f - y, 0.5f - z);
+}
+
+__device void svm_node_tex_magic(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
+{
+ uint depth;
+ uint scale_offset, distortion_offset, co_offset, fac_offset, color_offset;
+
+ decode_node_uchar4(node.y, &depth, &color_offset, &fac_offset, NULL);
+ decode_node_uchar4(node.z, &co_offset, &scale_offset, &distortion_offset, NULL);
+
+ uint4 node2 = read_node(kg, offset);
+ float3 co = stack_load_float3(stack, co_offset);
+ float scale = stack_load_float_default(stack, scale_offset, node2.x);
+ float distortion = stack_load_float_default(stack, distortion_offset, node2.y);
+
+ float3 color = svm_magic(co*scale, depth, distortion);
+
+ if(stack_valid(fac_offset))
+ stack_store_float(stack, fac_offset, average(color));
+ if(stack_valid(color_offset))
+ stack_store_float3(stack, color_offset, color);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_mapping.h b/intern/cycles/kernel/svm/svm_mapping.h
new file mode 100644
index 00000000000..7633c3e783b
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_mapping.h
@@ -0,0 +1,38 @@
+/*
+ * 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
+
+/* Mapping Node */
+
+__device void svm_node_mapping(KernelGlobals *kg, ShaderData *sd, float *stack, uint vec_offset, uint out_offset, int *offset)
+{
+ float3 v = stack_load_float3(stack, vec_offset);
+
+ Transform tfm;
+ tfm.x = read_node_float(kg, offset);
+ tfm.y = read_node_float(kg, offset);
+ tfm.z = read_node_float(kg, offset);
+ tfm.w = read_node_float(kg, offset);
+
+ float3 r = transform(&tfm, v);
+ stack_store_float3(stack, out_offset, r);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_math.h b/intern/cycles/kernel/svm/svm_math.h
new file mode 100644
index 00000000000..bc2f774097e
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_math.h
@@ -0,0 +1,186 @@
+/*
+ * 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 safe_asinf(float a)
+{
+ if(a <= -1.0f)
+ return -M_PI_2_F;
+ else if(a >= 1.0f)
+ return M_PI_2_F;
+
+ return asinf(a);
+}
+
+__device float safe_acosf(float a)
+{
+ if(a <= -1.0f)
+ return M_PI_F;
+ else if(a >= 1.0f)
+ return 0.0f;
+
+ return acosf(a);
+}
+
+__device float safe_powf(float a, float b)
+{
+ if(b == 0.0f)
+ return 1.0f;
+ if(a == 0.0f)
+ return 0.0f;
+ if(a < 0.0f && b != (int)b)
+ return 0.0f;
+
+ return powf(a, b);
+}
+
+__device float safe_logf(float a, float b)
+{
+ if(a < 0.0f || b < 0.0f)
+ return 0.0f;
+
+ return logf(a)/logf(b);
+}
+
+__device float safe_divide(float a, float b)
+{
+ float result;
+
+ if(b == 0.0f)
+ result = 0.0f;
+ else
+ result = a/b;
+
+ return result;
+}
+
+__device float svm_math(NodeMath type, float Fac1, float Fac2)
+{
+ float Fac;
+
+ if(type == NODE_MATH_ADD)
+ Fac = Fac1 + Fac2;
+ else if(type == NODE_MATH_SUBTRACT)
+ Fac = Fac1 - Fac2;
+ else if(type == NODE_MATH_MULTIPLY)
+ Fac = Fac1*Fac2;
+ else if(type == NODE_MATH_DIVIDE)
+ Fac = safe_divide(Fac1, Fac2);
+ else if(type == NODE_MATH_SINE)
+ Fac = sinf(Fac1);
+ else if(type == NODE_MATH_COSINE)
+ Fac = cosf(Fac1);
+ else if(type == NODE_MATH_TANGENT)
+ Fac = tanf(Fac1);
+ else if(type == NODE_MATH_ARCSINE)
+ Fac = safe_asinf(Fac1);
+ else if(type == NODE_MATH_ARCCOSINE)
+ Fac = safe_acosf(Fac1);
+ else if(type == NODE_MATH_ARCTANGENT)
+ Fac = atanf(Fac1);
+ else if(type == NODE_MATH_POWER)
+ Fac = safe_powf(Fac1, Fac2);
+ else if(type == NODE_MATH_LOGARITHM)
+ Fac = safe_logf(Fac1, Fac2);
+ else if(type == NODE_MATH_MINIMUM)
+ Fac = fminf(Fac1, Fac2);
+ else if(type == NODE_MATH_MAXIMUM)
+ Fac = fmaxf(Fac1, Fac2);
+ else if(type == NODE_MATH_ROUND)
+ Fac = floorf(Fac1 + 0.5f);
+ else if(type == NODE_MATH_LESS_THAN)
+ Fac = Fac1 < Fac2;
+ else if(type == NODE_MATH_GREATER_THAN)
+ Fac = Fac1 > Fac2;
+ else
+ Fac = 0.0f;
+
+ return Fac;
+}
+
+__device float average_fac(float3 v)
+{
+ return (fabsf(v.x) + fabsf(v.y) + fabsf(v.z))/3.0f;
+}
+
+__device void svm_vector_math(float *Fac, float3 *Vector, NodeVectorMath type, float3 Vector1, float3 Vector2)
+{
+ if(type == NODE_VECTOR_MATH_ADD) {
+ *Vector = Vector1 + Vector2;
+ *Fac = average_fac(*Vector);
+ }
+ else if(type == NODE_VECTOR_MATH_SUBTRACT) {
+ *Vector = Vector1 - Vector2;
+ *Fac = average_fac(*Vector);
+ }
+ else if(type == NODE_VECTOR_MATH_AVERAGE) {
+ *Fac = len(Vector1 + Vector2);
+ *Vector = normalize(Vector1 + Vector2);
+ }
+ else if(type == NODE_VECTOR_MATH_DOT_PRODUCT) {
+ *Fac = dot(Vector1, Vector2);
+ *Vector = make_float3(0.0f, 0.0f, 0.0f);
+ }
+ else if(type == NODE_VECTOR_MATH_CROSS_PRODUCT) {
+ float3 c = cross(Vector1, Vector2);
+ *Fac = len(c);
+ *Vector = normalize(c);
+ }
+ else if(type == NODE_VECTOR_MATH_NORMALIZE) {
+ *Fac = len(Vector1);
+ *Vector = normalize(Vector1);
+ }
+ else {
+ *Fac = 0.0f;
+ *Vector = make_float3(0.0f, 0.0f, 0.0f);
+ }
+}
+
+/* Nodes */
+
+__device void svm_node_math(KernelGlobals *kg, ShaderData *sd, float *stack, uint itype, uint f1_offset, uint f2_offset, int *offset)
+{
+ NodeMath type = (NodeMath)itype;
+ float f1 = stack_load_float(stack, f1_offset);
+ float f2 = stack_load_float(stack, f2_offset);
+ float f = svm_math(type, f1, f2);
+
+ uint4 node1 = read_node(kg, offset);
+
+ stack_store_float(stack, node1.y, f);
+}
+
+__device void svm_node_vector_math(KernelGlobals *kg, ShaderData *sd, float *stack, uint itype, uint v1_offset, uint v2_offset, int *offset)
+{
+ NodeVectorMath type = (NodeVectorMath)itype;
+ float3 v1 = stack_load_float3(stack, v1_offset);
+ float3 v2 = stack_load_float3(stack, v2_offset);
+ float f;
+ float3 v;
+
+ svm_vector_math(&f, &v, type, v1, v2);
+
+ uint4 node1 = read_node(kg, offset);
+
+ if(stack_valid(node1.y)) stack_store_float(stack, node1.y, f);
+ if(stack_valid(node1.z)) stack_store_float3(stack, node1.z, v);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_mix.h b/intern/cycles/kernel/svm/svm_mix.h
new file mode 100644
index 00000000000..c9e6cdf43b9
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_mix.h
@@ -0,0 +1,395 @@
+/*
+ * 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 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 float3 svm_lerp(const float3 a, const float3 b, float t)
+{
+ return (a * (1.0f - t) + b * t);
+}
+
+__device float3 svm_mix_blend(float t, float3 col1, float3 col2)
+{
+ return svm_lerp(col1, col2, t);
+}
+
+__device float3 svm_mix_add(float t, float3 col1, float3 col2)
+{
+ return svm_lerp(col1, col1 + col2, t);
+}
+
+__device float3 svm_mix_mul(float t, float3 col1, float3 col2)
+{
+ return svm_lerp(col1, col1 * col2, t);
+}
+
+__device float3 svm_mix_screen(float t, float3 col1, float3 col2)
+{
+ float tm = 1.0f - t;
+ float3 one = make_float3(1.0f, 1.0f, 1.0f);
+ float3 tm3 = make_float3(tm, tm, tm);
+
+ return one - (tm3 + t*(one - col2))*(one - col1);
+}
+
+__device float3 svm_mix_overlay(float t, float3 col1, float3 col2)
+{
+ float tm = 1.0f - t;
+
+ float3 outcol = col1;
+
+ if(outcol.x < 0.5f)
+ outcol.x *= tm + 2.0f*t*col2.x;
+ else
+ outcol.x = 1.0f - (tm + 2.0f*t*(1.0f - col2.x))*(1.0f - outcol.x);
+
+ if(outcol.y < 0.5f)
+ outcol.y *= tm + 2.0f*t*col2.y;
+ else
+ outcol.y = 1.0f - (tm + 2.0f*t*(1.0f - col2.y))*(1.0f - outcol.y);
+
+ if(outcol.z < 0.5f)
+ outcol.z *= tm + 2.0f*t*col2.z;
+ else
+ outcol.z = 1.0f - (tm + 2.0f*t*(1.0f - col2.z))*(1.0f - outcol.z);
+
+ return outcol;
+}
+
+__device float3 svm_mix_sub(float t, float3 col1, float3 col2)
+{
+ return svm_lerp(col1, col1 - col2, t);
+}
+
+__device float3 svm_mix_div(float t, float3 col1, float3 col2)
+{
+ float tm = 1.0f - t;
+
+ float3 outcol = col1;
+
+ if(col2.x != 0.0f) outcol.x = tm*outcol.x + t*outcol.x/col2.x;
+ if(col2.y != 0.0f) outcol.y = tm*outcol.y + t*outcol.y/col2.y;
+ if(col2.z != 0.0f) outcol.z = tm*outcol.z + t*outcol.z/col2.z;
+
+ return outcol;
+}
+
+__device float3 svm_mix_diff(float t, float3 col1, float3 col2)
+{
+ return svm_lerp(col1, fabs(col1 - col2), t);
+}
+
+__device float3 svm_mix_dark(float t, float3 col1, float3 col2)
+{
+ return min(col1, col2*t);
+}
+
+__device float3 svm_mix_light(float t, float3 col1, float3 col2)
+{
+ return max(col1, col2*t);
+}
+
+__device float3 svm_mix_dodge(float t, float3 col1, float3 col2)
+{
+ float3 outcol = col1;
+
+ if(outcol.x != 0.0f) {
+ float tmp = 1.0f - t*col2.x;
+ if(tmp <= 0.0f)
+ outcol.x = 1.0f;
+ else if((tmp = outcol.x/tmp) > 1.0f)
+ outcol.x = 1.0f;
+ else
+ outcol.x = tmp;
+ }
+ if(outcol.y != 0.0f) {
+ float tmp = 1.0f - t*col2.y;
+ if(tmp <= 0.0f)
+ outcol.y = 1.0f;
+ else if((tmp = outcol.y/tmp) > 1.0f)
+ outcol.y = 1.0f;
+ else
+ outcol.y = tmp;
+ }
+ if(outcol.z != 0.0f) {
+ float tmp = 1.0f - t*col2.z;
+ if(tmp <= 0.0f)
+ outcol.z = 1.0f;
+ else if((tmp = outcol.z/tmp) > 1.0f)
+ outcol.z = 1.0f;
+ else
+ outcol.z = tmp;
+ }
+
+ return outcol;
+}
+
+__device float3 svm_mix_burn(float t, float3 col1, float3 col2)
+{
+ float tmp, tm = 1.0f - t;
+
+ float3 outcol = col1;
+
+ tmp = tm + t*col2.x;
+ if(tmp <= 0.0f)
+ outcol.x = 0.0f;
+ else if((tmp = (1.0f - (1.0f - outcol.x)/tmp)) < 0.0f)
+ outcol.x = 0.0f;
+ else if(tmp > 1.0f)
+ outcol.x = 1.0f;
+ else
+ outcol.x = tmp;
+
+ tmp = tm + t*col2.y;
+ if(tmp <= 0.0f)
+ outcol.y = 0.0f;
+ else if((tmp = (1.0f - (1.0f - outcol.y)/tmp)) < 0.0f)
+ outcol.y = 0.0f;
+ else if(tmp > 1.0f)
+ outcol.y = 1.0f;
+ else
+ outcol.y = tmp;
+
+ tmp = tm + t*col2.z;
+ if(tmp <= 0.0f)
+ outcol.z = 0.0f;
+ else if((tmp = (1.0f - (1.0f - outcol.z)/tmp)) < 0.0f)
+ outcol.z = 0.0f;
+ else if(tmp > 1.0f)
+ outcol.z = 1.0f;
+ else
+ outcol.z = tmp;
+
+ return outcol;
+}
+
+__device float3 svm_mix_hue(float t, float3 col1, float3 col2)
+{
+ float3 outcol = col1;
+
+ float3 hsv2 = rgb_to_hsv(col2);
+
+ if(hsv2.y != 0.0f) {
+ float3 hsv = rgb_to_hsv(outcol);
+ hsv.x = hsv2.x;
+ float3 tmp = hsv_to_rgb(hsv);
+
+ outcol = svm_lerp(outcol, tmp, t);
+ }
+
+ return outcol;
+}
+
+__device float3 svm_mix_sat(float t, float3 col1, float3 col2)
+{
+ float tm = 1.0f - t;
+
+ float3 outcol = col1;
+
+ float3 hsv = rgb_to_hsv(outcol);
+
+ if(hsv.y != 0.0f) {
+ float3 hsv2 = rgb_to_hsv(col2);
+
+ hsv.y = tm*hsv.y + t*hsv2.y;
+ outcol = hsv_to_rgb(hsv);
+ }
+
+ return outcol;
+}
+
+__device float3 svm_mix_val(float t, float3 col1, float3 col2)
+{
+ float tm = 1.0f - t;
+
+ float3 hsv = rgb_to_hsv(col1);
+ float3 hsv2 = rgb_to_hsv(col2);
+
+ hsv.z = tm*hsv.z + t*hsv2.z;
+
+ return hsv_to_rgb(hsv);
+}
+
+__device float3 svm_mix_color(float t, float3 col1, float3 col2)
+{
+ float3 outcol = col1;
+ float3 hsv2 = rgb_to_hsv(col2);
+
+ if(hsv2.y != 0.0f) {
+ float3 hsv = rgb_to_hsv(outcol);
+ hsv.x = hsv2.x;
+ hsv.y = hsv2.y;
+ float3 tmp = hsv_to_rgb(hsv);
+
+ outcol = svm_lerp(outcol, tmp, t);
+ }
+
+ return outcol;
+}
+
+__device float3 svm_mix_soft(float t, float3 col1, float3 col2)
+{
+ float tm = 1.0f - t;
+
+ float3 one= make_float3(1.0f, 1.0f, 1.0f);
+ float3 scr= one - (one - col2)*(one - col1);
+
+ return tm*col1 + t*((one - col1)*col2*col1 + col1*scr);
+}
+
+__device float3 svm_mix_linear(float t, float3 col1, float3 col2)
+{
+ float3 outcol = col1;
+
+ if(col2.x > 0.5f)
+ outcol.x= col1.x + t*(2.0f*(col2.x - 0.5f));
+ else
+ outcol.x= col1.x + t*(2.0f*(col2.x) - 1.0f);
+
+ if(col2.y > 0.5f)
+ outcol.y= col1.y + t*(2.0f*(col2.y - 0.5f));
+ else
+ outcol.y= col1.y + t*(2.0f*(col2.y) - 1.0f);
+
+ if(col2.z > 0.5f)
+ outcol.z= col1.z + t*(2.0f*(col2.z - 0.5f));
+ else
+ outcol.z= col1.z + t*(2.0f*(col2.z) - 1.0f);
+
+ return outcol;
+}
+
+__device float3 svm_mix(NodeMix type, float fac, float3 c1, float3 c2)
+{
+ float t = clamp(fac, 0.0f, 1.0f);
+
+ switch(type) {
+ case NODE_MIX_BLEND: return svm_mix_blend(t, c1, c2);
+ case NODE_MIX_ADD: return svm_mix_add(t, c1, c2);
+ case NODE_MIX_MUL: return svm_mix_mul(t, c1, c2);
+ case NODE_MIX_SCREEN: return svm_mix_screen(t, c1, c2);
+ case NODE_MIX_OVERLAY: return svm_mix_overlay(t, c1, c2);
+ case NODE_MIX_SUB: return svm_mix_sub(t, c1, c2);
+ case NODE_MIX_DIV: return svm_mix_div(t, c1, c2);
+ case NODE_MIX_DIFF: return svm_mix_diff(t, c1, c2);
+ case NODE_MIX_DARK: return svm_mix_dark(t, c1, c2);
+ case NODE_MIX_LIGHT: return svm_mix_light(t, c1, c2);
+ case NODE_MIX_DODGE: return svm_mix_dodge(t, c1, c2);
+ case NODE_MIX_BURN: return svm_mix_burn(t, c1, c2);
+ case NODE_MIX_HUE: return svm_mix_hue(t, c1, c2);
+ case NODE_MIX_SAT: return svm_mix_sat(t, c1, c2);
+ case NODE_MIX_VAL: return svm_mix_val (t, c1, c2);
+ case NODE_MIX_COLOR: return svm_mix_color(t, c1, c2);
+ case NODE_MIX_SOFT: return svm_mix_soft(t, c1, c2);
+ case NODE_MIX_LINEAR: return svm_mix_linear(t, c1, c2);
+ }
+
+ return make_float3(0.0f, 0.0f, 0.0f);
+}
+
+/* Node */
+
+__device void svm_node_mix(KernelGlobals *kg, ShaderData *sd, float *stack, uint fac_offset, uint c1_offset, uint c2_offset, int *offset)
+{
+ /* read extra data */
+ uint4 node1 = read_node(kg, offset);
+
+ float fac = stack_load_float(stack, fac_offset);
+ float3 c1 = stack_load_float3(stack, c1_offset);
+ float3 c2 = stack_load_float3(stack, c2_offset);
+ float3 result = svm_mix((NodeMix)node1.y, fac, c1, c2);
+
+ stack_store_float3(stack, node1.z, result);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_musgrave.h b/intern/cycles/kernel/svm/svm_musgrave.h
new file mode 100644
index 00000000000..34cf7868f07
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_musgrave.h
@@ -0,0 +1,240 @@
+/*
+ * 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
+
+/* Musgrave fBm
+ *
+ * H: fractal increment parameter
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ *
+ * from "Texturing and Modelling: A procedural approach"
+ */
+
+__device_noinline float noise_musgrave_fBm(float3 p, NodeNoiseBasis basis, float H, float lacunarity, float octaves)
+{
+ float rmd;
+ float value = 0.0f;
+ float pwr = 1.0f;
+ float pwHL = pow(lacunarity, -H);
+ int i;
+
+ for(i = 0; i < (int)octaves; i++) {
+ value += snoise(p) * pwr;
+ pwr *= pwHL;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0f)
+ value += rmd * snoise(p) * pwr;
+
+ return value;
+}
+
+/* Musgrave Multifractal
+ *
+ * H: highest fractal dimension
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ */
+
+__device_noinline float noise_musgrave_multi_fractal(float3 p, NodeNoiseBasis basis, float H, float lacunarity, float octaves)
+{
+ float rmd;
+ float value = 1.0f;
+ float pwr = 1.0f;
+ float pwHL = pow(lacunarity, -H);
+ int i;
+
+ for(i = 0; i < (int)octaves; i++) {
+ value *= (pwr * snoise(p) + 1.0f);
+ pwr *= pwHL;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0f)
+ value *= (rmd * pwr * snoise(p) + 1.0f); /* correct? */
+
+ return value;
+}
+
+/* Musgrave Heterogeneous Terrain
+ *
+ * H: fractal dimension of the roughest area
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ * offset: raises the terrain from `sea level'
+ */
+
+__device_noinline float noise_musgrave_hetero_terrain(float3 p, NodeNoiseBasis basis, float H, float lacunarity, float octaves, float offset)
+{
+ float value, increment, rmd;
+ float pwHL = pow(lacunarity, -H);
+ float pwr = pwHL;
+ int i;
+
+ /* first unscaled octave of function; later octaves are scaled */
+ value = offset + snoise(p);
+ p *= lacunarity;
+
+ for(i = 1; i < (int)octaves; i++) {
+ increment = (snoise(p) + offset) * pwr * value;
+ value += increment;
+ pwr *= pwHL;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0f) {
+ increment = (snoise(p) + offset) * pwr * value;
+ value += rmd * increment;
+ }
+
+ return value;
+}
+
+/* Hybrid Additive/Multiplicative Multifractal Terrain
+ *
+ * H: fractal dimension of the roughest area
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ * offset: raises the terrain from `sea level'
+ */
+
+__device_noinline float noise_musgrave_hybrid_multi_fractal(float3 p, NodeNoiseBasis basis, float H, float lacunarity, float octaves, float offset, float gain)
+{
+ float result, signal, weight, rmd;
+ float pwHL = pow(lacunarity, -H);
+ float pwr = pwHL;
+ int i;
+
+ result = snoise(p) + offset;
+ weight = gain * result;
+ p *= lacunarity;
+
+ for(i = 1; (weight > 0.001f) && (i < (int)octaves); i++) {
+ if(weight > 1.0f)
+ weight = 1.0f;
+
+ signal = (snoise(p) + offset) * pwr;
+ pwr *= pwHL;
+ result += weight * signal;
+ weight *= gain * signal;
+ p *= lacunarity;
+ }
+
+ rmd = octaves - floor(octaves);
+ if(rmd != 0.0f)
+ result += rmd * ((snoise(p) + offset) * pwr);
+
+ return result;
+}
+
+/* Ridged Multifractal Terrain
+ *
+ * H: fractal dimension of the roughest area
+ * lacunarity: gap between successive frequencies
+ * octaves: number of frequencies in the fBm
+ * offset: raises the terrain from `sea level'
+ */
+
+__device_noinline float noise_musgrave_ridged_multi_fractal(float3 p, NodeNoiseBasis basis, float H, float lacunarity, float octaves, float offset, float gain)
+{
+ float result, signal, weight;
+ float pwHL = pow(lacunarity, -H);
+ float pwr = pwHL;
+ int i;
+
+ signal = offset - fabsf(snoise(p));
+ signal *= signal;
+ result = signal;
+ weight = 1.0f;
+
+ for(i = 1; i < (int)octaves; i++) {
+ p *= lacunarity;
+ weight = clamp(signal * gain, 0.0f, 1.0f);
+ signal = offset - fabsf(snoise(p));
+ signal *= signal;
+ signal *= weight;
+ result += signal * pwr;
+ pwr *= pwHL;
+ }
+
+ return result;
+}
+
+/* Shader */
+
+__device float svm_musgrave(NodeMusgraveType type, float dimension, float lacunarity, float octaves, float offset, float intensity, float gain, float scale, float3 p)
+{
+ NodeNoiseBasis basis = NODE_NOISE_PERLIN;
+ p *= scale;
+
+ if(type == NODE_MUSGRAVE_MULTIFRACTAL)
+ return intensity*noise_musgrave_multi_fractal(p, basis, dimension, lacunarity, octaves);
+ else if(type == NODE_MUSGRAVE_FBM)
+ return intensity*noise_musgrave_fBm(p, basis, dimension, lacunarity, octaves);
+ else if(type == NODE_MUSGRAVE_HYBRID_MULTIFRACTAL)
+ return intensity*noise_musgrave_hybrid_multi_fractal(p, basis, dimension, lacunarity, octaves, offset, gain);
+ else if(type == NODE_MUSGRAVE_RIDGED_MULTIFRACTAL)
+ return intensity*noise_musgrave_ridged_multi_fractal(p, basis, dimension, lacunarity, octaves, offset, gain);
+ else if(type == NODE_MUSGRAVE_HETERO_TERRAIN)
+ return intensity*noise_musgrave_hetero_terrain(p, basis, dimension, lacunarity, octaves, offset);
+
+ return 0.0f;
+}
+
+__device void svm_node_tex_musgrave(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
+{
+ uint4 node2 = read_node(kg, offset);
+ uint4 node3 = read_node(kg, offset);
+
+ uint type, co_offset, color_offset, fac_offset;
+ uint dimension_offset, lacunarity_offset, detail_offset, offset_offset;
+ uint gain_offset, scale_offset;
+
+ decode_node_uchar4(node.y, &type, &co_offset, &color_offset, &fac_offset);
+ decode_node_uchar4(node.z, &dimension_offset, &lacunarity_offset, &detail_offset, &offset_offset);
+ decode_node_uchar4(node.z, &gain_offset, &scale_offset, NULL, NULL);
+
+ float3 co = stack_load_float3(stack, co_offset);
+ float dimension = stack_load_float_default(stack, dimension_offset, node2.x);
+ float lacunarity = stack_load_float_default(stack, lacunarity_offset, node2.y);
+ float detail = stack_load_float_default(stack, detail_offset, node2.z);
+ float foffset = stack_load_float_default(stack, offset_offset, node2.w);
+ float gain = stack_load_float_default(stack, gain_offset, node3.x);
+ float scale = stack_load_float_default(stack, scale_offset, node3.y);
+
+ dimension = fmaxf(dimension, 1e-5f);
+ detail = clamp(detail, 0.0f, 16.0f);
+ lacunarity = fmaxf(lacunarity, 1e-5f);
+
+ float f = svm_musgrave((NodeMusgraveType)type,
+ dimension, lacunarity, detail, foffset, 1.0f, gain, scale, co);
+
+ if(stack_valid(fac_offset))
+ stack_store_float(stack, fac_offset, f);
+ if(stack_valid(color_offset))
+ stack_store_float3(stack, color_offset, make_float3(f, f, f));
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_noise.h b/intern/cycles/kernel/svm/svm_noise.h
new file mode 100644
index 00000000000..28ad028ad0e
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_noise.h
@@ -0,0 +1,213 @@
+/*
+ * Adapted from Open Shading Language with this license:
+ *
+ * Copyright (c) 2009-2010 Sony Pictures Imageworks Inc., et al.
+ * All Rights Reserved.
+ *
+ * Modifications Copyright 2011, Blender Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Sony Pictures Imageworks nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+CCL_NAMESPACE_BEGIN
+
+__device int quick_floor(float x)
+{
+ return (int)x - ((x < 0) ? 1 : 0);
+}
+
+__device float bits_to_01(uint bits)
+{
+ return bits * (1.0f/(float)0xFFFFFFFF);
+}
+
+__device uint hash(uint kx, uint ky, uint kz)
+{
+ // define some handy macros
+#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
+#define final(a,b,c) \
+{ \
+ c ^= b; c -= rot(b,14); \
+ a ^= c; a -= rot(c,11); \
+ b ^= a; b -= rot(a,25); \
+ c ^= b; c -= rot(b,16); \
+ a ^= c; a -= rot(c,4); \
+ b ^= a; b -= rot(a,14); \
+ c ^= b; c -= rot(b,24); \
+}
+ // now hash the data!
+ uint a, b, c, len = 3;
+ a = b = c = 0xdeadbeef + (len << 2) + 13;
+
+ c += kz;
+ b += ky;
+ a += kx;
+ final(a, b, c);
+
+ return c;
+ // macros not needed anymore
+#undef rot
+#undef final
+}
+
+__device int imod(int a, int b)
+{
+ a %= b;
+ return a < 0 ? a + b : a;
+}
+
+__device uint phash(int kx, int ky, int kz, int3 p)
+{
+ return hash(imod(kx, p.x), imod(ky, p.y), imod(kz, p.z));
+}
+
+__device float floorfrac(float x, int* i)
+{
+ *i = quick_floor(x);
+ return x - *i;
+}
+
+__device float fade(float t)
+{
+ return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
+}
+
+__device float nerp(float t, float a, float b)
+{
+ return (1.0f - t) * a + t * b;
+}
+
+__device float grad(int hash, float x, float y, float z)
+{
+ // use vectors pointing to the edges of the cube
+ int h = hash & 15;
+ float u = h<8 ? x : y;
+ float v = h<4 ? y : h==12||h==14 ? x : z;
+ return ((h&1) ? -u : u) + ((h&2) ? -v : v);
+}
+
+__device float scale3(float result)
+{
+ return 0.9820f * result;
+}
+
+__device_noinline float perlin(float x, float y, float z)
+{
+ int X; float fx = floorfrac(x, &X);
+ int Y; float fy = floorfrac(y, &Y);
+ int Z; float fz = floorfrac(z, &Z);
+
+ float u = fade(fx);
+ float v = fade(fy);
+ float w = fade(fz);
+
+ float result;
+
+ result = nerp (w, nerp (v, nerp (u, grad (hash (X , Y , Z ), fx , fy , fz ),
+ grad (hash (X+1, Y , Z ), fx-1.0f, fy , fz )),
+ nerp (u, grad (hash (X , Y+1, Z ), fx , fy-1.0f, fz ),
+ grad (hash (X+1, Y+1, Z ), fx-1.0f, fy-1.0f, fz ))),
+ nerp (v, nerp (u, grad (hash (X , Y , Z+1), fx , fy , fz-1.0f ),
+ grad (hash (X+1, Y , Z+1), fx-1.0f, fy , fz-1.0f )),
+ nerp (u, grad (hash (X , Y+1, Z+1), fx , fy-1.0f, fz-1.0f ),
+ grad (hash (X+1, Y+1, Z+1), fx-1.0f, fy-1.0f, fz-1.0f ))));
+ return scale3(result);
+}
+
+__device_noinline float perlin_periodic(float x, float y, float z, float3 pperiod)
+{
+ int X; float fx = floorfrac(x, &X);
+ int Y; float fy = floorfrac(y, &Y);
+ int Z; float fz = floorfrac(z, &Z);
+
+ int3 p;
+
+ p.x = max(quick_floor(pperiod.x), 1);
+ p.y = max(quick_floor(pperiod.y), 1);
+ p.z = max(quick_floor(pperiod.z), 1);
+
+ float u = fade(fx);
+ float v = fade(fy);
+ float w = fade(fz);
+
+ float result;
+
+ result = nerp (w, nerp (v, nerp (u, grad (phash (X , Y , Z , p), fx , fy , fz ),
+ grad (phash (X+1, Y , Z , p), fx-1.0f, fy , fz )),
+ nerp (u, grad (phash (X , Y+1, Z , p), fx , fy-1.0f, fz ),
+ grad (phash (X+1, Y+1, Z , p), fx-1.0f, fy-1.0f, fz ))),
+ nerp (v, nerp (u, grad (phash (X , Y , Z+1, p), fx , fy , fz-1.0f ),
+ grad (phash (X+1, Y , Z+1, p), fx-1.0f, fy , fz-1.0f )),
+ nerp (u, grad (phash (X , Y+1, Z+1, p), fx , fy-1.0f, fz-1.0f ),
+ grad (phash (X+1, Y+1, Z+1, p), fx-1.0f, fy-1.0f, fz-1.0f ))));
+ return scale3(result);
+}
+
+/* perlin noise in range 0..1 */
+__device float noise(float3 p)
+{
+ float r = perlin(p.x, p.y, p.z);
+ return 0.5f*r + 0.5f;
+}
+
+/* perlin noise in range -1..1 */
+__device float snoise(float3 p)
+{
+ return perlin(p.x, p.y, p.z);
+}
+
+/* cell noise */
+__device_noinline float cellnoise(float3 p)
+{
+ uint ix = quick_floor(p.x);
+ uint iy = quick_floor(p.y);
+ uint iz = quick_floor(p.z);
+
+ return bits_to_01(hash(ix, iy, iz));
+}
+
+__device float3 cellnoise_color(float3 p)
+{
+ float r = cellnoise(p);
+ float g = cellnoise(make_float3(p.y, p.x, p.z));
+ float b = cellnoise(make_float3(p.y, p.z, p.x));
+
+ return make_float3(r, g, b);
+}
+
+/* periodic perlin noise in range 0..1 */
+__device float pnoise(float3 p, float3 pperiod)
+{
+ float r = perlin_periodic(p.x, p.y, p.z, pperiod);
+ return 0.5f*r + 0.5f;
+}
+
+/* periodic perlin noise in range -1..1 */
+__device float psnoise(float3 p, float3 pperiod)
+{
+ return perlin_periodic(p.x, p.y, p.z, pperiod);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_noisetex.h b/intern/cycles/kernel/svm/svm_noisetex.h
new file mode 100644
index 00000000000..7421597040e
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_noisetex.h
@@ -0,0 +1,73 @@
+/*
+ * 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
+
+/* Clouds */
+
+__device_inline void svm_noise(float3 p, float scale, float detail, float distortion, float *fac, float3 *color)
+{
+ NodeNoiseBasis basis = NODE_NOISE_PERLIN;
+ int hard = 0;
+
+ p *= scale;
+
+ if(distortion != 0.0f) {
+ float3 r, offset = make_float3(13.5f, 13.5f, 13.5f);
+
+ r.x = noise_basis(p + offset, basis) * distortion;
+ r.y = noise_basis(p, basis) * distortion;
+ r.z = noise_basis(p - offset, basis) * distortion;
+
+ p += r;
+ }
+
+ *fac = noise_turbulence(p, basis, detail, hard);
+ *color = make_float3(*fac,
+ noise_turbulence(make_float3(p.y, p.x, p.z), basis, detail, hard),
+ noise_turbulence(make_float3(p.y, p.z, p.x), basis, detail, hard));
+}
+
+__device void svm_node_tex_noise(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
+{
+ uint co_offset, scale_offset, detail_offset, distortion_offset, fac_offset, color_offset;
+
+ decode_node_uchar4(node.y, &co_offset, &scale_offset, &detail_offset, &distortion_offset);
+
+ uint4 node2 = read_node(kg, offset);
+
+ float scale = stack_load_float_default(stack, scale_offset, node2.x);
+ float detail = stack_load_float_default(stack, detail_offset, node2.y);
+ float distortion = stack_load_float_default(stack, distortion_offset, node2.z);
+ float3 co = stack_load_float3(stack, co_offset);
+
+ float3 color;
+ float f;
+
+ svm_noise(co, scale, detail, distortion, &f, &color);
+
+ decode_node_uchar4(node.z, &color_offset, &fac_offset, NULL, NULL);
+
+ if(stack_valid(fac_offset))
+ stack_store_float(stack, fac_offset, f);
+ if(stack_valid(color_offset))
+ stack_store_float3(stack, color_offset, color);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_sky.h b/intern/cycles/kernel/svm/svm_sky.h
new file mode 100644
index 00000000000..eaba4d18365
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_sky.h
@@ -0,0 +1,92 @@
+/*
+ * 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 float3 xyY_to_xyz(float x, float y, float Y)
+{
+ float X, Z;
+
+ if(y != 0.0f) X = (x / y) * Y;
+ else X = 0.0f;
+
+ if(y != 0.0f && Y != 0.0f) Z = (1.0f - x - y) / y * Y;
+ else Z = 0.0f;
+
+ return make_float3(X, Y, Z);
+}
+
+__device float3 xyz_to_rgb(float x, float y, float z)
+{
+ return make_float3(3.240479f * x + -1.537150f * y + -0.498535f * z,
+ -0.969256f * x + 1.875991f * y + 0.041556f * z,
+ 0.055648f * x + -0.204043f * y + 1.057311f * z);
+}
+
+/*
+ * "A Practical Analytic Model for Daylight"
+ * A. J. Preetham, Peter Shirley, Brian Smits
+ */
+
+__device float sky_angle_between(float thetav, float phiv, float theta, float phi)
+{
+ float cospsi = sinf(thetav)*sinf(theta)*cosf(phi - phiv) + cosf(thetav)*cosf(theta);
+ return safe_acosf(cospsi);
+}
+
+__device float sky_perez_function(__constant float *lam, float theta, float gamma)
+{
+ float ctheta = cosf(theta);
+ float cgamma = cosf(gamma);
+
+ return (1.0f + lam[0]*expf(lam[1]/ctheta)) * (1.0f + lam[2]*expf(lam[3]*gamma) + lam[4]*cgamma*cgamma);
+}
+
+__device float3 sky_radiance(KernelGlobals *kg, float3 dir)
+{
+ /* convert vector to spherical coordinates */
+ float2 spherical = direction_to_spherical(dir);
+ float theta = spherical.x;
+ float phi = spherical.y;
+
+ /* angle between sun direction and dir */
+ float gamma = sky_angle_between(theta, phi, kernel_data.sunsky.theta, kernel_data.sunsky.phi);
+
+ /* clamp theta to horizon */
+ theta = min(theta, M_PI_2_F - 0.001f);
+
+ /* compute xyY color space values */
+ float x = kernel_data.sunsky.zenith_x * sky_perez_function(kernel_data.sunsky.perez_x, theta, gamma);
+ float y = kernel_data.sunsky.zenith_y * sky_perez_function(kernel_data.sunsky.perez_y, theta, gamma);
+ float Y = kernel_data.sunsky.zenith_Y * sky_perez_function(kernel_data.sunsky.perez_Y, theta, gamma);
+
+ /* convert to RGB */
+ float3 xyz = xyY_to_xyz(x, y, Y);
+ return xyz_to_rgb(xyz.x, xyz.y, xyz.z);
+}
+
+__device void svm_node_tex_sky(KernelGlobals *kg, ShaderData *sd, float *stack, uint dir_offset, uint out_offset)
+{
+ float3 dir = stack_load_float3(stack, dir_offset);
+ float3 f = sky_radiance(kg, dir);
+
+ stack_store_float3(stack, out_offset, f);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h
new file mode 100644
index 00000000000..bcf3716ae57
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_tex_coord.h
@@ -0,0 +1,170 @@
+/*
+ * 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
+
+/* Texture Coordinate Node */
+
+__device float3 svm_background_offset(KernelGlobals *kg)
+{
+ Transform cameratoworld = kernel_data.cam.cameratoworld;
+ return make_float3(cameratoworld.x.w, cameratoworld.y.w, cameratoworld.z.w);
+}
+
+__device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
+{
+ float3 data;
+
+ switch(type) {
+ case NODE_TEXCO_OBJECT: {
+ if(sd->object != ~0) {
+ Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
+ data = transform(&tfm, sd->P);
+ }
+ else
+ data = sd->P;
+ break;
+ }
+ case NODE_TEXCO_CAMERA: {
+ Transform tfm = kernel_data.cam.worldtocamera;
+
+ if(sd->object != ~0)
+ data = transform(&tfm, sd->P);
+ else
+ data = transform(&tfm, sd->P + svm_background_offset(kg));
+ break;
+ }
+ case NODE_TEXCO_WINDOW: {
+ Transform tfm = kernel_data.cam.worldtondc;
+
+ if(sd->object != ~0)
+ data = transform(&tfm, sd->P);
+ else
+ data = transform(&tfm, sd->P + svm_background_offset(kg));
+ break;
+ }
+ case NODE_TEXCO_REFLECTION: {
+ if(sd->object != ~0)
+ data = sd->I - 2.0f*dot(sd->N, sd->I)*sd->N;
+ else
+ data = sd->I;
+ break;
+ }
+ }
+
+ stack_store_float3(stack, out_offset, data);
+}
+
+__device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
+{
+#ifdef __RAY_DIFFERENTIALS__
+ float3 data;
+
+ switch(type) {
+ case NODE_TEXCO_OBJECT: {
+ if(sd->object != ~0) {
+ Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
+ data = transform(&tfm, sd->P + sd->dP.dx);
+ }
+ else
+ data = sd->P + sd->dP.dx;
+ break;
+ }
+ case NODE_TEXCO_CAMERA: {
+ Transform tfm = kernel_data.cam.worldtocamera;
+
+ if(sd->object != ~0)
+ data = transform(&tfm, sd->P + sd->dP.dx);
+ else
+ data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
+ break;
+ }
+ case NODE_TEXCO_WINDOW: {
+ Transform tfm = kernel_data.cam.worldtondc;
+
+ if(sd->object != ~0)
+ data = transform(&tfm, sd->P + sd->dP.dx);
+ else
+ data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
+ break;
+ }
+ case NODE_TEXCO_REFLECTION: {
+ if(sd->object != ~0)
+ data = sd->I - 2.0f*dot(sd->N, sd->I)*sd->N;
+ else
+ data = sd->I;
+ break;
+ }
+ }
+
+ stack_store_float3(stack, out_offset, data);
+#else
+ svm_node_tex_coord(kg, sd, stack, type, out_offset);
+#endif
+}
+
+__device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
+{
+#ifdef __RAY_DIFFERENTIALS__
+ float3 data;
+
+ switch(type) {
+ case NODE_TEXCO_OBJECT: {
+ if(sd->object != ~0) {
+ Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
+ data = transform(&tfm, sd->P + sd->dP.dy);
+ }
+ else
+ data = sd->P + sd->dP.dy;
+ break;
+ }
+ case NODE_TEXCO_CAMERA: {
+ Transform tfm = kernel_data.cam.worldtocamera;
+
+ if(sd->object != ~0)
+ data = transform(&tfm, sd->P + sd->dP.dy);
+ else
+ data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
+ break;
+ }
+ case NODE_TEXCO_WINDOW: {
+ Transform tfm = kernel_data.cam.worldtondc;
+
+ if(sd->object != ~0)
+ data = transform(&tfm, sd->P + sd->dP.dy);
+ else
+ data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
+ break;
+ }
+ case NODE_TEXCO_REFLECTION: {
+ if(sd->object != ~0)
+ data = sd->I - 2.0f*dot(sd->N, sd->I)*sd->N;
+ else
+ data = sd->I;
+ break;
+ }
+ }
+
+ stack_store_float3(stack, out_offset, data);
+#else
+ svm_node_tex_coord(kg, sd, stack, type, out_offset);
+#endif
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_texture.h b/intern/cycles/kernel/svm/svm_texture.h
new file mode 100644
index 00000000000..82797018d74
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_texture.h
@@ -0,0 +1,259 @@
+/*
+ * 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
+
+/* Voronoi Distances */
+
+__device float voronoi_distance(NodeDistanceMetric distance_metric, float3 d, float e)
+{
+ if(distance_metric == NODE_VORONOI_DISTANCE_SQUARED)
+ return dot(d, d);
+ if(distance_metric == NODE_VORONOI_ACTUAL_DISTANCE)
+ return len(d);
+ if(distance_metric == NODE_VORONOI_MANHATTAN)
+ return fabsf(d.x) + fabsf(d.y) + fabsf(d.z);
+ if(distance_metric == NODE_VORONOI_CHEBYCHEV)
+ return fmaxf(fabsf(d.x), fmaxf(fabsf(d.y), fabsf(d.z)));
+ if(distance_metric == NODE_VORONOI_MINKOVSKY_H)
+ return sqrtf(fabsf(d.x)) + sqrtf(fabsf(d.y)) + sqrtf(fabsf(d.y));
+ if(distance_metric == NODE_VORONOI_MINKOVSKY_4)
+ return sqrtf(sqrtf(dot(d*d, d*d)));
+ if(distance_metric == NODE_VORONOI_MINKOVSKY)
+ return powf(powf(fabsf(d.x), e) + powf(fabsf(d.y), e) + powf(fabsf(d.z), e), 1.0f/e);
+
+ return 0.0f;
+}
+
+/* Voronoi / Worley like */
+
+__device_noinline void voronoi(float3 p, NodeDistanceMetric distance_metric, float e, float da[4], float3 pa[4])
+{
+ /* returns distances in da and point coords in pa */
+ int xx, yy, zz, xi, yi, zi;
+
+ xi = (int)floorf(p.x);
+ yi = (int)floorf(p.y);
+ zi = (int)floorf(p.z);
+
+ da[0] = 1e10f;
+ da[1] = 1e10f;
+ da[2] = 1e10f;
+ da[3] = 1e10f;
+
+ pa[0] = make_float3(0.0f, 0.0f, 0.0f);
+ pa[1] = make_float3(0.0f, 0.0f, 0.0f);
+ pa[2] = make_float3(0.0f, 0.0f, 0.0f);
+ pa[3] = make_float3(0.0f, 0.0f, 0.0f);
+
+ for(xx = xi-1; xx <= xi+1; xx++) {
+ for(yy = yi-1; yy <= yi+1; yy++) {
+ for(zz = zi-1; zz <= zi+1; zz++) {
+ float3 ip = make_float3((float)xx, (float)yy, (float)zz);
+ float3 vp = cellnoise_color(ip);
+ float3 pd = p - (vp + ip);
+ float d = voronoi_distance(distance_metric, pd, e);
+
+ vp += ip;
+
+ if(d < da[0]) {
+ da[3] = da[2];
+ da[2] = da[1];
+ da[1] = da[0];
+ da[0] = d;
+
+ pa[3] = pa[2];
+ pa[2] = pa[1];
+ pa[1] = pa[0];
+ pa[0] = vp;
+ }
+ else if(d < da[1]) {
+ da[3] = da[2];
+ da[2] = da[1];
+ da[1] = d;
+
+ pa[3] = pa[2];
+ pa[2] = pa[1];
+ pa[1] = vp;
+ }
+ else if(d < da[2]) {
+ da[3] = da[2];
+ da[2] = d;
+
+ pa[3] = pa[2];
+ pa[2] = vp;
+ }
+ else if(d < da[3]) {
+ da[3] = d;
+ pa[3] = vp;
+ }
+ }
+ }
+ }
+}
+
+__device float voronoi_Fn(float3 p, int n)
+{
+ float da[4];
+ float3 pa[4];
+
+ voronoi(p, NODE_VORONOI_DISTANCE_SQUARED, 0, da, pa);
+
+ return da[n];
+}
+
+__device float voronoi_FnFn(float3 p, int n1, int n2)
+{
+ float da[4];
+ float3 pa[4];
+
+ voronoi(p, NODE_VORONOI_DISTANCE_SQUARED, 0, da, pa);
+
+ return da[n2] - da[n1];
+}
+
+__device float voronoi_F1(float3 p) { return voronoi_Fn(p, 0); }
+__device float voronoi_F2(float3 p) { return voronoi_Fn(p, 1); }
+__device float voronoi_F3(float3 p) { return voronoi_Fn(p, 2); }
+__device float voronoi_F4(float3 p) { return voronoi_Fn(p, 3); }
+__device float voronoi_F1F2(float3 p) { return voronoi_FnFn(p, 0, 1); }
+
+__device float voronoi_Cr(float3 p)
+{
+ /* crackle type pattern, just a scale/clamp of F2-F1 */
+ float t = 10.0f*voronoi_F1F2(p);
+ return (t > 1.0f)? 1.0f: t;
+}
+
+__device float voronoi_F1S(float3 p) { return 2.0f*voronoi_F1(p) - 1.0f; }
+__device float voronoi_F2S(float3 p) { return 2.0f*voronoi_F2(p) - 1.0f; }
+__device float voronoi_F3S(float3 p) { return 2.0f*voronoi_F3(p) - 1.0f; }
+__device float voronoi_F4S(float3 p) { return 2.0f*voronoi_F4(p) - 1.0f; }
+__device float voronoi_F1F2S(float3 p) { return 2.0f*voronoi_F1F2(p) - 1.0f; }
+__device float voronoi_CrS(float3 p) { return 2.0f*voronoi_Cr(p) - 1.0f; }
+
+/* Noise Bases */
+
+__device float noise_basis(float3 p, NodeNoiseBasis basis)
+{
+ /* Only Perlin enabled for now, others break CUDA compile by making kernel
+ too big, with compile using > 4GB, due to everything being inlined. */
+
+#if 0
+ if(basis == NODE_NOISE_PERLIN)
+#endif
+ return noise(p);
+#if 0
+ if(basis == NODE_NOISE_VORONOI_F1)
+ return voronoi_F1S(p);
+ if(basis == NODE_NOISE_VORONOI_F2)
+ return voronoi_F2S(p);
+ if(basis == NODE_NOISE_VORONOI_F3)
+ return voronoi_F3S(p);
+ if(basis == NODE_NOISE_VORONOI_F4)
+ return voronoi_F4S(p);
+ if(basis == NODE_NOISE_VORONOI_F2_F1)
+ return voronoi_F1F2S(p);
+ if(basis == NODE_NOISE_VORONOI_CRACKLE)
+ return voronoi_CrS(p);
+ if(basis == NODE_NOISE_CELL_NOISE)
+ return cellnoise(p);
+
+ return 0.0f;
+#endif
+}
+
+/* Soft/Hard Noise */
+
+__device float noise_basis_hard(float3 p, NodeNoiseBasis basis, int hard)
+{
+ float t = noise_basis(p, basis);
+ return (hard)? fabsf(2.0f*t - 1.0f): t;
+}
+
+/* Waves */
+
+__device float noise_wave(NodeWaveType wave, float a)
+{
+ if(wave == NODE_WAVE_SINE) {
+ return 0.5f + 0.5f*sin(a);
+ }
+ else if(wave == NODE_WAVE_SAW) {
+ float b = 2.0f*M_PI_F;
+ int n = (int)(a / b);
+ a -= n*b;
+ if(a < 0.0f) a += b;
+
+ return a / b;
+ }
+ else if(wave == NODE_WAVE_TRI) {
+ float b = 2.0f*M_PI_F;
+ float rmax = 1.0f;
+
+ return rmax - 2.0f*fabsf(floorf((a*(1.0f/b))+0.5f) - (a*(1.0f/b)));
+ }
+
+ return 0.0f;
+}
+
+/* Turbulence */
+
+__device_noinline float noise_turbulence(float3 p, NodeNoiseBasis basis, float octaves, int hard)
+{
+ float fscale = 1.0f;
+ float amp = 1.0f;
+ float sum = 0.0f;
+ int i, n;
+
+ octaves = clamp(octaves, 0.0f, 16.0f);
+ n= (int)octaves;
+
+ for(i = 0; i <= n; i++) {
+ float t = noise_basis(fscale*p, basis);
+
+ if(hard)
+ t = fabsf(2.0f*t - 1.0f);
+
+ sum += t*amp;
+ amp *= 0.5f;
+ fscale *= 2.0f;
+ }
+
+ float rmd = octaves - floor(octaves);
+
+ if(rmd != 0.0f) {
+ float t = noise_basis(fscale*p, basis);
+
+ if(hard)
+ t = fabsf(2.0f*t - 1.0f);
+
+ float sum2 = sum + t*amp;
+
+ sum *= ((float)(1 << n)/(float)((1 << (n+1)) - 1));
+ sum2 *= ((float)(1 << (n+1))/(float)((1 << (n+2)) - 1));
+
+ return (1.0f - rmd)*sum + rmd*sum2;
+ }
+ else {
+ sum *= ((float)(1 << n)/(float)((1 << (n+1)) - 1));
+ return sum;
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
new file mode 100644
index 00000000000..89fc413c539
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -0,0 +1,299 @@
+/*
+ * 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_TYPES_H__
+#define __SVM_TYPES_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* Stack */
+
+/* SVM stack has a fixed size */
+#define SVM_STACK_SIZE 64
+/* SVM stack offsets with this value indicate that it's not on the stack */
+#define SVM_STACK_INVALID 255
+
+/* Nodes */
+
+/* note that we do not simply use 0, 1, 2, .. as values for these. this works
+ * around an obscure CUDA bug that happens when compiling for fermi. why it
+ * happens i have no idea, but consecutive values are problematic, maybe it
+ * generates an incorrect jump table. */
+
+typedef enum NodeType {
+ NODE_END = 0,
+ NODE_CLOSURE_BSDF = 100,
+ NODE_CLOSURE_EMISSION = 200,
+ NODE_CLOSURE_BACKGROUND = 300,
+ NODE_CLOSURE_SET_WEIGHT = 400,
+ NODE_CLOSURE_WEIGHT = 500,
+ NODE_MIX_CLOSURE = 600,
+ NODE_JUMP = 700,
+ NODE_TEX_IMAGE = 1000,
+ NODE_TEX_SKY = 1100,
+ NODE_GEOMETRY = 1200,
+ NODE_LIGHT_PATH = 1300,
+ NODE_VALUE_F = 1400,
+ NODE_VALUE_V = 1500,
+ NODE_MIX = 1600,
+ NODE_ATTR = 1700,
+ NODE_CONVERT = 1900,
+ NODE_FRESNEL = 2000,
+ NODE_EMISSION_WEIGHT = 2100,
+ NODE_TEX_GRADIENT = 2200,
+ NODE_TEX_VORONOI = 2300,
+ NODE_TEX_MUSGRAVE = 2400,
+ NODE_TEX_WAVE = 2500,
+ NODE_TEX_MAGIC = 2600,
+ NODE_TEX_NOISE = 3000,
+ NODE_SHADER_JUMP = 3100,
+ NODE_SET_DISPLACEMENT = 3200,
+ NODE_GEOMETRY_BUMP_DX = 3300,
+ NODE_GEOMETRY_BUMP_DY = 3400,
+ NODE_SET_BUMP = 3500,
+ NODE_MATH = 3600,
+ NODE_VECTOR_MATH = 3700,
+ NODE_MAPPING = 3800,
+ NODE_TEX_COORD = 3900,
+ NODE_TEX_COORD_BUMP_DX = 4000,
+ NODE_TEX_COORD_BUMP_DY = 4100,
+ NODE_ADD_CLOSURE = 4200,
+ NODE_EMISSION_SET_WEIGHT_TOTAL = 4300,
+ NODE_ATTR_BUMP_DX = 4400,
+ NODE_ATTR_BUMP_DY = 4500,
+ NODE_TEX_ENVIRONMENT = 4600,
+ NODE_CLOSURE_HOLDOUT = 4700,
+ NODE_LAYER_WEIGHT = 4800,
+ NODE_CLOSURE_VOLUME = 4900
+} NodeType;
+
+typedef enum NodeAttributeType {
+ NODE_ATTR_FLOAT = 0,
+ NODE_ATTR_FLOAT3
+} NodeAttributeType;
+
+typedef enum NodeGeometry {
+ NODE_GEOM_P = 0,
+ NODE_GEOM_N,
+ NODE_GEOM_T,
+ NODE_GEOM_I,
+ NODE_GEOM_Ng,
+ NODE_GEOM_uv
+} NodeGeometry;
+
+typedef enum NodeLightPath {
+ NODE_LP_camera = 0,
+ NODE_LP_shadow,
+ NODE_LP_diffuse,
+ NODE_LP_glossy,
+ NODE_LP_singular,
+ NODE_LP_reflection,
+ NODE_LP_transmission,
+ NODE_LP_backfacing
+} NodeLightPath;
+
+typedef enum NodeTexCoord {
+ NODE_TEXCO_OBJECT,
+ NODE_TEXCO_CAMERA,
+ NODE_TEXCO_WINDOW,
+ NODE_TEXCO_REFLECTION
+} NodeTexCoord;
+
+typedef enum NodeMix {
+ NODE_MIX_BLEND = 0,
+ NODE_MIX_ADD,
+ NODE_MIX_MUL,
+ NODE_MIX_SUB,
+ NODE_MIX_SCREEN,
+ NODE_MIX_DIV,
+ NODE_MIX_DIFF,
+ NODE_MIX_DARK,
+ NODE_MIX_LIGHT,
+ NODE_MIX_OVERLAY,
+ NODE_MIX_DODGE,
+ NODE_MIX_BURN,
+ NODE_MIX_HUE,
+ NODE_MIX_SAT,
+ NODE_MIX_VAL,
+ NODE_MIX_COLOR,
+ NODE_MIX_SOFT,
+ NODE_MIX_LINEAR
+} NodeMix;
+
+typedef enum NodeMath {
+ NODE_MATH_ADD,
+ NODE_MATH_SUBTRACT,
+ NODE_MATH_MULTIPLY,
+ NODE_MATH_DIVIDE,
+ NODE_MATH_SINE,
+ NODE_MATH_COSINE,
+ NODE_MATH_TANGENT,
+ NODE_MATH_ARCSINE,
+ NODE_MATH_ARCCOSINE,
+ NODE_MATH_ARCTANGENT,
+ NODE_MATH_POWER,
+ NODE_MATH_LOGARITHM,
+ NODE_MATH_MINIMUM,
+ NODE_MATH_MAXIMUM,
+ NODE_MATH_ROUND,
+ NODE_MATH_LESS_THAN,
+ NODE_MATH_GREATER_THAN
+} NodeMath;
+
+typedef enum NodeVectorMath {
+ NODE_VECTOR_MATH_ADD,
+ NODE_VECTOR_MATH_SUBTRACT,
+ NODE_VECTOR_MATH_AVERAGE,
+ NODE_VECTOR_MATH_DOT_PRODUCT,
+ NODE_VECTOR_MATH_CROSS_PRODUCT,
+ NODE_VECTOR_MATH_NORMALIZE
+} NodeVectorMath;
+
+typedef enum NodeConvert {
+ NODE_CONVERT_FV,
+ NODE_CONVERT_CF,
+ NODE_CONVERT_VF
+} NodeConvert;
+
+typedef enum NodeDistanceMetric {
+ NODE_VORONOI_DISTANCE_SQUARED,
+ NODE_VORONOI_ACTUAL_DISTANCE,
+ NODE_VORONOI_MANHATTAN,
+ NODE_VORONOI_CHEBYCHEV,
+ NODE_VORONOI_MINKOVSKY_H,
+ NODE_VORONOI_MINKOVSKY_4,
+ NODE_VORONOI_MINKOVSKY
+} NodeDistanceMetric;
+
+typedef enum NodeNoiseBasis {
+ NODE_NOISE_PERLIN,
+ NODE_NOISE_VORONOI_F1,
+ NODE_NOISE_VORONOI_F2,
+ NODE_NOISE_VORONOI_F3,
+ NODE_NOISE_VORONOI_F4,
+ NODE_NOISE_VORONOI_F2_F1,
+ NODE_NOISE_VORONOI_CRACKLE,
+ NODE_NOISE_CELL_NOISE
+} NodeNoiseBasis;
+
+typedef enum NodeWaveType {
+ NODE_WAVE_SINE,
+ NODE_WAVE_SAW,
+ NODE_WAVE_TRI
+} NodeWaveType;
+
+typedef enum NodeMusgraveType {
+ NODE_MUSGRAVE_MULTIFRACTAL,
+ NODE_MUSGRAVE_FBM,
+ NODE_MUSGRAVE_HYBRID_MULTIFRACTAL,
+ NODE_MUSGRAVE_RIDGED_MULTIFRACTAL,
+ NODE_MUSGRAVE_HETERO_TERRAIN
+} NodeMusgraveType;
+
+typedef enum NodeWoodType {
+ NODE_WAVE_BANDS,
+ NODE_WAVE_RINGS
+} NodeWoodType;
+
+typedef enum NodeBlendType {
+ NODE_BLEND_LINEAR,
+ NODE_BLEND_QUADRATIC,
+ NODE_BLEND_EASING,
+ NODE_BLEND_DIAGONAL,
+ NODE_BLEND_RADIAL,
+ NODE_BLEND_QUADRATIC_SPHERE,
+ NODE_BLEND_SPHERICAL
+} NodeBlendType;
+
+typedef enum NodeBlendAxis {
+ NODE_BLEND_HORIZONTAL,
+ NODE_BLEND_VERTICAL
+} NodeBlendAxis;
+
+typedef enum NodeMarbleType {
+ NODE_MARBLE_SOFT,
+ NODE_MARBLE_SHARP,
+ NODE_MARBLE_SHARPER
+} NodeMarbleType;
+
+typedef enum NodeStucciType {
+ NODE_STUCCI_PLASTIC,
+ NODE_STUCCI_WALL_IN,
+ NODE_STUCCI_WALL_OUT
+} NodeStucciType;
+
+typedef enum NodeVoronoiColoring {
+ NODE_VORONOI_INTENSITY,
+ NODE_VORONOI_CELLS
+} NodeVoronoiColoring;
+
+typedef enum NodeBlendWeightType {
+ NODE_LAYER_WEIGHT_FRESNEL,
+ NODE_LAYER_WEIGHT_FACING
+} NodeBlendWeightType;
+
+typedef enum ShaderType {
+ SHADER_TYPE_SURFACE,
+ SHADER_TYPE_VOLUME,
+ SHADER_TYPE_DISPLACEMENT
+} ShaderType;
+
+/* Closure */
+
+typedef enum ClosureType {
+ CLOSURE_BSDF_ID,
+ CLOSURE_BSDF_DIFFUSE_ID,
+ CLOSURE_BSDF_TRANSLUCENT_ID,
+ CLOSURE_BSDF_REFLECTION_ID,
+ CLOSURE_BSDF_REFRACTION_ID,
+ CLOSURE_BSDF_GLASS_ID,
+ CLOSURE_BSDF_TRANSPARENT_ID,
+ CLOSURE_BSDF_MICROFACET_GGX_ID,
+ CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID,
+ CLOSURE_BSDF_MICROFACET_BECKMANN_ID,
+ CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID,
+ CLOSURE_BSDF_WARD_ID,
+ CLOSURE_BSDF_ASHIKHMIN_VELVET_ID,
+ CLOSURE_BSDF_WESTIN_BACKSCATTER_ID,
+ CLOSURE_BSDF_WESTIN_SHEEN_ID,
+
+ CLOSURE_BSSRDF_CUBIC_ID,
+ CLOSURE_EMISSION_ID,
+ CLOSURE_DEBUG_ID,
+ CLOSURE_BACKGROUND_ID,
+ CLOSURE_HOLDOUT_ID,
+ CLOSURE_SUBSURFACE_ID,
+
+ CLOSURE_VOLUME_ID,
+ CLOSURE_VOLUME_TRANSPARENT_ID,
+ CLOSURE_VOLUME_ISOTROPIC_ID,
+
+ NBUILTIN_CLOSURES
+} ClosureType;
+
+/* watch this, being lazy with memory usage */
+#define CLOSURE_IS_BSDF(type) (type <= CLOSURE_BSDF_WESTIN_SHEEN_ID)
+#define CLOSURE_IS_VOLUME(type) (type >= CLOSURE_VOLUME_ID && type <= CLOSURE_VOLUME_ISOTROPIC_ID)
+#define CLOSURE_IS_EMISSION(type) (type == CLOSURE_EMISSION_ID)
+#define CLOSURE_IS_HOLDOUT(type) (type == CLOSURE_HOLDOUT_ID)
+#define CLOSURE_IS_BACKGROUND(type) (type == CLOSURE_BACKGROUND_ID)
+
+CCL_NAMESPACE_END
+
+#endif /* __SVM_TYPES_H__ */
+
diff --git a/intern/cycles/kernel/svm/svm_value.h b/intern/cycles/kernel/svm/svm_value.h
new file mode 100644
index 00000000000..80cb285f80c
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_value.h
@@ -0,0 +1,38 @@
+/*
+ * 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
+
+/* Value Nodes */
+
+__device void svm_node_value_f(KernelGlobals *kg, ShaderData *sd, float *stack, uint ivalue, uint out_offset)
+{
+ stack_store_float(stack, out_offset, __int_as_float(ivalue));
+}
+
+__device void svm_node_value_v(KernelGlobals *kg, ShaderData *sd, float *stack, uint out_offset, int *offset)
+{
+ /* read extra data */
+ uint4 node1 = read_node(kg, offset);
+ float3 p = make_float3(__int_as_float(node1.y), __int_as_float(node1.z), __int_as_float(node1.w));
+
+ stack_store_float3(stack, out_offset, p);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_voronoi.h b/intern/cycles/kernel/svm/svm_voronoi.h
new file mode 100644
index 00000000000..f5ee7851a51
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_voronoi.h
@@ -0,0 +1,66 @@
+/*
+ * 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
+
+/* Voronoi */
+
+__device_noinline float4 svm_voronoi(NodeVoronoiColoring coloring, float scale, float3 p)
+{
+ /* compute distance and point coordinate of 4 nearest neighbours */
+ float da[4];
+ float3 pa[4];
+
+ voronoi(p*scale, NODE_VORONOI_DISTANCE_SQUARED, 1.0f, da, pa);
+
+ /* output */
+ float fac;
+ float3 color;
+
+ if(coloring == NODE_VORONOI_INTENSITY) {
+ fac = fabsf(da[0]);
+ color = make_float3(fac, fac, fac);
+ }
+ else {
+ color = cellnoise_color(pa[0]);
+ fac= average(color);
+ }
+
+ return make_float4(color.x, color.y, color.z, fac);
+}
+
+__device void svm_node_tex_voronoi(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
+{
+ uint coloring = node.y;
+ uint scale_offset, co_offset, fac_offset, color_offset;
+
+ decode_node_uchar4(node.z, &scale_offset, &co_offset, &fac_offset, &color_offset);
+
+ float3 co = stack_load_float3(stack, co_offset);
+ float scale = stack_load_float_default(stack, scale_offset, node.w);
+
+ float4 result = svm_voronoi((NodeVoronoiColoring)coloring, scale, co);
+ float3 color = make_float3(result.x, result.y, result.z);
+ float f = result.w;
+
+ if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, f);
+ if(stack_valid(color_offset)) stack_store_float3(stack, color_offset, color);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/svm_wave.h b/intern/cycles/kernel/svm/svm_wave.h
new file mode 100644
index 00000000000..8f2131156c4
--- /dev/null
+++ b/intern/cycles/kernel/svm/svm_wave.h
@@ -0,0 +1,65 @@
+/*
+ * 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
+
+/* Marble */
+
+__device_noinline float svm_wave(NodeWoodType type, float3 p, float scale, float detail, float distortion, float dscale)
+{
+ float w, n;
+
+ p *= scale;
+
+ if(type == NODE_WAVE_BANDS)
+ n= (p.x + p.x + p.z)*10.0f;
+ else /* if(type == NODE_WAVE_RINGS) */
+ n= len(p)*20.0f;
+
+ if(distortion != 0.0f)
+ n += distortion * noise_turbulence(p*dscale, NODE_NOISE_PERLIN, detail, 0);
+
+ w = noise_wave(NODE_WAVE_SINE, n);
+
+ return w;
+}
+
+__device void svm_node_tex_wave(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
+{
+ uint4 node2 = read_node(kg, offset);
+
+ uint type;
+ uint co_offset, scale_offset, detail_offset, dscale_offset, distortion_offset, color_offset, fac_offset;
+
+ decode_node_uchar4(node.y, &type, &color_offset, &fac_offset, &dscale_offset);
+ decode_node_uchar4(node.z, &co_offset, &scale_offset, &detail_offset, &distortion_offset);
+
+ float3 co = stack_load_float3(stack, co_offset);
+ float scale = stack_load_float_default(stack, scale_offset, node2.x);
+ float detail = stack_load_float_default(stack, detail_offset, node2.y);
+ float distortion = stack_load_float_default(stack, distortion_offset, node2.z);
+ float dscale = stack_load_float_default(stack, dscale_offset, node2.w);
+
+ float f = svm_wave((NodeWoodType)type, co, scale, detail, distortion, dscale);
+
+ if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, f);
+ if(stack_valid(color_offset)) stack_store_float3(stack, color_offset, make_float3(f, f, f));
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/kernel/svm/volume.h b/intern/cycles/kernel/svm/volume.h
new file mode 100644
index 00000000000..86cb2dcc24e
--- /dev/null
+++ b/intern/cycles/kernel/svm/volume.h
@@ -0,0 +1,74 @@
+/*
+ * 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
+
+/* note: the interfaces here are just as an example, need to figure
+ out the right functions and parameters to use */
+
+/* ISOTROPIC VOLUME CLOSURE */
+
+__device void volume_isotropic_setup(ShaderData *sd, ShaderClosure *sc, float density)
+{
+ sc->type = CLOSURE_VOLUME_ISOTROPIC_ID;
+ sd->flag |= SD_VOLUME;
+ sc->data0 = density;
+}
+
+__device float3 volume_isotropic_eval_phase(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, const float3 omega_out)
+{
+ return make_float3(1.0f, 1.0f, 1.0f);
+}
+
+/* TRANSPARENT VOLUME CLOSURE */
+
+__device void volume_transparent_setup(ShaderData *sd, ShaderClosure *sc, float density)
+{
+ sc->type = CLOSURE_VOLUME_TRANSPARENT_ID;
+ sd->flag |= SD_VOLUME;
+ sc->data0 = density;
+}
+
+__device float3 volume_transparent_eval_phase(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, const float3 omega_out)
+{
+ return make_float3(1.0f, 1.0f, 1.0f);
+}
+
+/* VOLUME CLOSURE */
+
+__device float3 volume_eval_phase(const ShaderData *sd, const ShaderClosure *sc, const float3 omega_in, const float3 omega_out)
+{
+ float3 eval;
+
+ switch(sc->type) {
+ case CLOSURE_VOLUME_ISOTROPIC_ID:
+ eval = volume_isotropic_eval_phase(sd, sc, omega_in, omega_out);
+ break;
+ case CLOSURE_VOLUME_TRANSPARENT_ID:
+ eval = volume_transparent_eval_phase(sd, sc, omega_in, omega_out);
+ break;
+ default:
+ eval = make_float3(0.0f, 0.0f, 0.0f);
+ break;
+ }
+
+ return eval;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
new file mode 100644
index 00000000000..85552508bb9
--- /dev/null
+++ b/intern/cycles/render/CMakeLists.txt
@@ -0,0 +1,67 @@
+
+set(INC
+ .
+ ../device
+ ../kernel
+ ../kernel/svm
+ ../kernel/osl
+ ../bvh
+ ../util
+ ${GLEW_INCLUDE_PATH}
+)
+
+set(SRC
+ attribute.cpp
+ background.cpp
+ buffers.cpp
+ camera.cpp
+ film.cpp
+ # film_response.cpp # XXX, why isnt this in?
+ filter.cpp
+ graph.cpp
+ image.cpp
+ integrator.cpp
+ light.cpp
+ mesh.cpp
+ mesh_displace.cpp
+ nodes.cpp
+ object.cpp
+ osl.cpp
+ scene.cpp
+ session.cpp
+ shader.cpp
+ sobol.cpp
+ svm.cpp
+ tile.cpp
+)
+
+set(SRC_HEADERS
+ attribute.h
+ background.h
+ buffers.h
+ camera.h
+ film.h
+ # film_response.h # XXX, why isnt this in?
+ filter.h
+ graph.h
+ image.h
+ integrator.h
+ light.h
+ mesh.h
+ nodes.h
+ object.h
+ osl.h
+ scene.h
+ session.h
+ shader.h
+ sobol.h
+ svm.h
+ tile.h
+)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${RTTI_DISABLE_FLAGS}")
+
+include_directories(${INC})
+
+add_library(cycles_render ${SRC} ${SRC_HEADERS})
+
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
new file mode 100644
index 00000000000..aa18ca7d7cb
--- /dev/null
+++ b/intern/cycles/render/attribute.cpp
@@ -0,0 +1,346 @@
+/*
+ * 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 "mesh.h"
+#include "attribute.h"
+
+#include "util_debug.h"
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Attribute */
+
+void Attribute::set(ustring name_, TypeDesc type_, Element element_)
+{
+ name = name_;
+ type = type_;
+ element = element_;
+ std = STD_NONE;
+
+ /* string and matrix not supported! */
+ assert(type == TypeDesc::TypeFloat || type == TypeDesc::TypeColor ||
+ type == TypeDesc::TypePoint || type == TypeDesc::TypeVector ||
+ type == TypeDesc::TypeNormal);
+}
+
+void Attribute::reserve(int numverts, int numtris)
+{
+ buffer.resize(buffer_size(numverts, numtris), 0);
+}
+
+size_t Attribute::data_sizeof()
+{
+ if(type == TypeDesc::TypeFloat)
+ return sizeof(float);
+ else
+ return sizeof(float3);
+}
+
+size_t Attribute::element_size(int numverts, int numtris)
+{
+ if(element == VERTEX)
+ return numverts;
+ else if(element == FACE)
+ return numtris;
+ else
+ return numtris*3;
+}
+
+size_t Attribute::buffer_size(int numverts, int numtris)
+{
+ return element_size(numverts, numtris)*data_sizeof();
+}
+
+bool Attribute::same_storage(TypeDesc a, TypeDesc b)
+{
+ if(a == b)
+ return true;
+
+ if(a == TypeDesc::TypeColor || a == TypeDesc::TypePoint ||
+ a == TypeDesc::TypeVector || a == TypeDesc::TypeNormal)
+ if(b == TypeDesc::TypeColor || b == TypeDesc::TypePoint ||
+ b == TypeDesc::TypeVector || b == TypeDesc::TypeNormal)
+ return true;
+
+ return false;
+}
+
+ustring Attribute::standard_name(Attribute::Standard std)
+{
+ if(std == Attribute::STD_VERTEX_NORMAL)
+ return ustring("N");
+ else if(std == Attribute::STD_FACE_NORMAL)
+ return ustring("Ng");
+ else if(std == Attribute::STD_UV)
+ return ustring("uv");
+ else if(std == Attribute::STD_GENERATED)
+ return ustring("generated");
+ else if(std == Attribute::STD_POSITION_UNDEFORMED)
+ return ustring("undeformed");
+ else if(std == Attribute::STD_POSITION_UNDISPLACED)
+ return ustring("undisplaced");
+
+ return ustring();
+}
+
+/* Attribute Set */
+
+AttributeSet::AttributeSet(Mesh *mesh_)
+{
+ mesh = mesh_;
+}
+
+AttributeSet::~AttributeSet()
+{
+}
+
+Attribute *AttributeSet::add(ustring name, TypeDesc type, Attribute::Element element)
+{
+ Attribute *attr = find(name);
+
+ if(attr) {
+ /* return if same already exists */
+ if(attr->type == type && attr->element == element)
+ return attr;
+
+ /* overwrite attribute with same name but different type/element */
+ remove(name);
+ }
+
+ attributes.push_back(Attribute());
+ attr = &attributes.back();
+
+ if(element == Attribute::VERTEX)
+ attr->set(name, type, element);
+ else if(element == Attribute::FACE)
+ attr->set(name, type, element);
+ else if(element == Attribute::CORNER)
+ attr->set(name, type, element);
+
+ attr->reserve(mesh->verts.size(), mesh->triangles.size());
+
+ return attr;
+}
+
+Attribute *AttributeSet::find(ustring name)
+{
+ foreach(Attribute& attr, attributes)
+ if(attr.name == name)
+ return &attr;
+
+ return NULL;
+}
+
+void AttributeSet::remove(ustring name)
+{
+ Attribute *attr = find(name);
+
+ if(attr) {
+ list<Attribute>::iterator it;
+
+ for(it = attributes.begin(); it != attributes.end(); it++) {
+ if(&*it == attr) {
+ attributes.erase(it);
+ return;
+ }
+ }
+ }
+}
+
+Attribute *AttributeSet::add(Attribute::Standard std, ustring name)
+{
+ Attribute *attr = NULL;
+
+ if(name == ustring())
+ name = Attribute::standard_name(std);
+
+ if(std == Attribute::STD_VERTEX_NORMAL)
+ attr = add(name, TypeDesc::TypeNormal, Attribute::VERTEX);
+ else if(std == Attribute::STD_FACE_NORMAL)
+ attr = add(name, TypeDesc::TypeNormal, Attribute::FACE);
+ else if(std == Attribute::STD_UV)
+ attr = add(name, TypeDesc::TypePoint, Attribute::CORNER);
+ else if(std == Attribute::STD_GENERATED)
+ attr = add(name, TypeDesc::TypePoint, Attribute::VERTEX);
+ else if(std == Attribute::STD_POSITION_UNDEFORMED)
+ attr = add(name, TypeDesc::TypePoint, Attribute::VERTEX);
+ else if(std == Attribute::STD_POSITION_UNDISPLACED)
+ attr = add(name, TypeDesc::TypePoint, Attribute::VERTEX);
+ else
+ assert(0);
+
+ attr->std = std;
+
+ return attr;
+}
+
+Attribute *AttributeSet::find(Attribute::Standard std)
+{
+ foreach(Attribute& attr, attributes)
+ if(attr.std == std)
+ return &attr;
+
+ return NULL;
+}
+
+void AttributeSet::remove(Attribute::Standard std)
+{
+ Attribute *attr = find(std);
+
+ if(attr) {
+ list<Attribute>::iterator it;
+
+ for(it = attributes.begin(); it != attributes.end(); it++) {
+ if(&*it == attr) {
+ attributes.erase(it);
+ return;
+ }
+ }
+ }
+}
+
+Attribute *AttributeSet::find(AttributeRequest& req)
+{
+ if(req.std == Attribute::STD_NONE)
+ return find(req.name);
+ else
+ return find(req.std);
+}
+
+void AttributeSet::reserve(int numverts, int numtris)
+{
+ foreach(Attribute& attr, attributes)
+ attr.reserve(numverts, numtris);
+}
+
+void AttributeSet::clear()
+{
+ attributes.clear();
+}
+
+/* AttributeRequest */
+
+AttributeRequest::AttributeRequest(ustring name_)
+{
+ name = name_;
+ std = Attribute::STD_NONE;
+
+ type = TypeDesc::TypeFloat;
+ element = ATTR_ELEMENT_NONE;
+ offset = 0;
+}
+
+AttributeRequest::AttributeRequest(Attribute::Standard std_)
+{
+ name = ustring();
+ std = std_;
+
+ type = TypeDesc::TypeFloat;
+ element = ATTR_ELEMENT_NONE;
+ offset = 0;
+}
+
+/* AttributeRequestSet */
+
+AttributeRequestSet::AttributeRequestSet()
+{
+}
+
+AttributeRequestSet::~AttributeRequestSet()
+{
+}
+
+bool AttributeRequestSet::modified(const AttributeRequestSet& other)
+{
+ if(requests.size() != other.requests.size())
+ return true;
+
+ for(size_t i = 0; i < requests.size(); i++) {
+ bool found = false;
+
+ for(size_t j = 0; j < requests.size() && !found; j++)
+ if(requests[i].name == other.requests[j].name &&
+ requests[i].std == other.requests[j].std)
+ found = true;
+
+ if(!found)
+ return true;
+ }
+
+ return false;
+}
+
+void AttributeRequestSet::add(ustring name)
+{
+ foreach(AttributeRequest& req, requests)
+ if(req.name == name)
+ return;
+
+ requests.push_back(AttributeRequest(name));
+}
+
+void AttributeRequestSet::add(Attribute::Standard std)
+{
+ foreach(AttributeRequest& req, requests)
+ if(req.std == std)
+ return;
+
+ requests.push_back(AttributeRequest(std));
+}
+
+void AttributeRequestSet::add(AttributeRequestSet& reqs)
+{
+ foreach(AttributeRequest& req, reqs.requests) {
+ if(req.std == Attribute::STD_NONE)
+ add(req.name);
+ else
+ add(req.std);
+ }
+}
+
+bool AttributeRequestSet::find(ustring name)
+{
+ foreach(AttributeRequest& req, requests)
+ if(req.name == name)
+ return true;
+
+ return false;
+}
+
+bool AttributeRequestSet::find(Attribute::Standard std)
+{
+ foreach(AttributeRequest& req, requests)
+ if(req.std == std)
+ return true;
+
+ return false;
+}
+
+size_t AttributeRequestSet::size()
+{
+ return requests.size();
+}
+
+void AttributeRequestSet::clear()
+{
+ requests.clear();
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h
new file mode 100644
index 00000000000..aef215d6c0c
--- /dev/null
+++ b/intern/cycles/render/attribute.h
@@ -0,0 +1,161 @@
+/*
+ * 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 __ATTRIBUTE_H__
+#define __ATTRIBUTE_H__
+
+#include "kernel_types.h"
+
+#include "util_list.h"
+#include "util_param.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Attribute;
+class AttributeSet;
+class AttributeRequest;
+class AttributeRequestSet;
+class Mesh;
+
+/* Attribute
+ *
+ * Arbitrary data layers on meshes.
+ * Supported types: Float, Color, Vector, Normal, Point */
+
+class Attribute {
+public:
+ enum Element {
+ VERTEX,
+ FACE,
+ CORNER
+ };
+
+ enum Standard {
+ STD_NONE = 0,
+ STD_VERTEX_NORMAL,
+ STD_FACE_NORMAL,
+ STD_UV,
+ STD_GENERATED,
+ STD_POSITION_UNDEFORMED,
+ STD_POSITION_UNDISPLACED,
+ STD_NUM
+ };
+
+ ustring name;
+ Standard std;
+
+ TypeDesc type;
+ vector<char> buffer;
+ Element element;
+
+ Attribute() {}
+ void set(ustring name, TypeDesc type, Element element);
+ void reserve(int numverts, int numfaces);
+
+ size_t data_sizeof();
+ size_t element_size(int numverts, int numfaces);
+ size_t buffer_size(int numverts, int numfaces);
+
+ char *data() { return (buffer.size())? &buffer[0]: NULL; };
+ float3 *data_float3() { return (float3*)data(); }
+ float *data_float() { return (float*)data(); }
+
+ const char *data() const { return (buffer.size())? &buffer[0]: NULL; }
+ const float3 *data_float3() const { return (float3*)data(); }
+ const float *data_float() const { return (float*)data(); }
+
+ static bool same_storage(TypeDesc a, TypeDesc b);
+ static ustring standard_name(Attribute::Standard std);
+};
+
+/* Attribute Set
+ *
+ * Set of attributes on a mesh. */
+
+class AttributeSet {
+public:
+ Mesh *mesh;
+ list<Attribute> attributes;
+
+ AttributeSet(Mesh *mesh);
+ ~AttributeSet();
+
+ Attribute *add(ustring name, TypeDesc type, Attribute::Element element);
+ Attribute *find(ustring name);
+ void remove(ustring name);
+
+ Attribute *add(Attribute::Standard std, ustring name = ustring());
+ Attribute *find(Attribute::Standard std);
+ void remove(Attribute::Standard std);
+
+ Attribute *find(AttributeRequest& req);
+
+ void reserve(int numverts, int numfaces);
+ void clear();
+};
+
+/* AttributeRequest
+ *
+ * Request from a shader to use a certain attribute, so we can figure out
+ * which ones we need to export from the host app end store for the kernel.
+ * The attribute is found either by name or by standard. */
+
+class AttributeRequest {
+public:
+ ustring name;
+ Attribute::Standard std;
+
+ /* temporary variables used by MeshManager */
+ TypeDesc type;
+ AttributeElement element;
+ int offset;
+
+ AttributeRequest(ustring name_);
+ AttributeRequest(Attribute::Standard std);
+};
+
+/* AttributeRequestSet
+ *
+ * Set of attributes requested by a shader. */
+
+class AttributeRequestSet {
+public:
+ vector<AttributeRequest> requests;
+
+ AttributeRequestSet();
+ ~AttributeRequestSet();
+
+ void add(ustring name);
+ void add(Attribute::Standard std);
+ void add(AttributeRequestSet& reqs);
+
+ bool find(ustring name);
+ bool find(Attribute::Standard std);
+
+ size_t size();
+ void clear();
+
+ bool modified(const AttributeRequestSet& other);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __ATTRIBUTE_H__ */
+
diff --git a/intern/cycles/render/background.cpp b/intern/cycles/render/background.cpp
new file mode 100644
index 00000000000..bf4131b6d38
--- /dev/null
+++ b/intern/cycles/render/background.cpp
@@ -0,0 +1,72 @@
+/*
+ * 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 "background.h"
+#include "device.h"
+#include "graph.h"
+#include "nodes.h"
+#include "scene.h"
+#include "shader.h"
+
+#include "util_foreach.h"
+#include "util_math.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+Background::Background()
+{
+ transparent = false;
+ need_update = true;
+}
+
+Background::~Background()
+{
+}
+
+void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene)
+{
+ if(!need_update)
+ return;
+
+ device_free(device, dscene);
+
+ /* set shader index and transparent option */
+ KernelBackground *kbackground = &dscene->data.background;
+ kbackground->transparent = transparent;
+ kbackground->shader = scene->shader_manager->get_shader_id(scene->default_background);
+
+ need_update = false;
+}
+
+void Background::device_free(Device *device, DeviceScene *dscene)
+{
+}
+
+bool Background::modified(const Background& background)
+{
+ return !(transparent == background.transparent);
+}
+
+void Background::tag_update(Scene *scene)
+{
+ need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/background.h b/intern/cycles/render/background.h
new file mode 100644
index 00000000000..16d2ccb6caa
--- /dev/null
+++ b/intern/cycles/render/background.h
@@ -0,0 +1,48 @@
+/*
+ * 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 __BACKGROUND_H__
+#define __BACKGROUND_H__
+
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class Scene;
+
+class Background {
+public:
+ bool transparent;
+ bool need_update;
+
+ Background();
+ ~Background();
+
+ void device_update(Device *device, DeviceScene *dscene, Scene *scene);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ bool modified(const Background& background);
+ void tag_update(Scene *scene);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BACKGROUND_H__ */
+
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
new file mode 100644
index 00000000000..acdddb475d0
--- /dev/null
+++ b/intern/cycles/render/buffers.cpp
@@ -0,0 +1,232 @@
+/*
+ * 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 <stdlib.h>
+
+#include "buffers.h"
+#include "device.h"
+
+#include "util_debug.h"
+#include "util_hash.h"
+#include "util_image.h"
+#include "util_math.h"
+#include "util_opengl.h"
+#include "util_time.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Render Buffers */
+
+RenderBuffers::RenderBuffers(Device *device_)
+{
+ device = device_;
+ width = 0;
+ height = 0;
+}
+
+RenderBuffers::~RenderBuffers()
+{
+ device_free();
+}
+
+void RenderBuffers::device_free()
+{
+ if(buffer.device_pointer) {
+ device->mem_free(buffer);
+ buffer.clear();
+ }
+
+ if(rng_state.device_pointer) {
+ device->mem_free(rng_state);
+ rng_state.clear();
+ }
+}
+
+void RenderBuffers::reset(Device *device, int width_, int height_)
+{
+ width = width_;
+ height = height_;
+
+ /* free existing buffers */
+ device_free();
+
+ /* allocate buffer */
+ buffer.resize(width, height);
+ device->mem_alloc(buffer, MEM_READ_WRITE);
+ device->mem_zero(buffer);
+
+ /* allocate rng state */
+ rng_state.resize(width, height);
+
+ uint *init_state = rng_state.resize(width, height);
+ int x, y;
+
+ for(x=0; x<width; x++)
+ for(y=0; y<height; y++)
+ init_state[x + y*width] = hash_int_2d(x, y);
+
+ device->mem_alloc(rng_state, MEM_READ_WRITE);
+ device->mem_copy_to(rng_state);
+}
+
+float4 *RenderBuffers::copy_from_device(float exposure, int sample)
+{
+ if(!buffer.device_pointer)
+ return NULL;
+
+ device->mem_copy_from(buffer, 0, buffer.memory_size());
+
+ float4 *out = new float4[width*height];
+ float4 *in = (float4*)buffer.data_pointer;
+ float scale = 1.0f/(float)sample;
+
+ for(int i = width*height - 1; i >= 0; i--) {
+ float4 rgba = in[i]*scale;
+
+ rgba.x = rgba.x*exposure;
+ rgba.y = rgba.y*exposure;
+ rgba.z = rgba.z*exposure;
+
+ /* clamp since alpha might be > 1.0 due to russian roulette */
+ rgba.w = clamp(rgba.w, 0.0f, 1.0f);
+
+ out[i] = rgba;
+ }
+
+ return out;
+}
+
+/* Display Buffer */
+
+DisplayBuffer::DisplayBuffer(Device *device_)
+{
+ device = device_;
+ width = 0;
+ height = 0;
+ draw_width = 0;
+ draw_height = 0;
+ transparent = true; /* todo: determine from background */
+}
+
+DisplayBuffer::~DisplayBuffer()
+{
+ device_free();
+}
+
+void DisplayBuffer::device_free()
+{
+ if(rgba.device_pointer) {
+ device->pixels_free(rgba);
+ rgba.clear();
+ }
+}
+
+void DisplayBuffer::reset(Device *device, int width_, int height_)
+{
+ draw_width = 0;
+ draw_height = 0;
+
+ width = width_;
+ height = height_;
+
+ /* free existing buffers */
+ device_free();
+
+ /* allocate display pixels */
+ rgba.resize(width, height);
+ device->pixels_alloc(rgba);
+}
+
+void DisplayBuffer::draw_set(int width_, int height_)
+{
+ assert(width_ <= width && height_ <= height);
+
+ draw_width = width_;
+ draw_height = height_;
+}
+
+void DisplayBuffer::draw_transparency_grid()
+{
+ GLubyte checker_stipple_sml[32*32/8] = {
+ 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \
+ 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \
+ 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \
+ 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \
+ 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \
+ 255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0, \
+ 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \
+ 0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255, \
+ };
+
+ glColor4ub(50, 50, 50, 255);
+ glRectf(0, 0, width, height);
+ glEnable(GL_POLYGON_STIPPLE);
+ glColor4ub(55, 55, 55, 255);
+ glPolygonStipple(checker_stipple_sml);
+ glRectf(0, 0, width, height);
+ glDisable(GL_POLYGON_STIPPLE);
+}
+
+void DisplayBuffer::draw(Device *device)
+{
+ if(draw_width != 0 && draw_height != 0) {
+ if(transparent)
+ draw_transparency_grid();
+
+ device->draw_pixels(rgba, 0, draw_width, draw_height, width, height, transparent);
+ }
+}
+
+bool DisplayBuffer::draw_ready()
+{
+ return (draw_width != 0 && draw_height != 0);
+}
+
+void DisplayBuffer::write(Device *device, const string& filename)
+{
+ int w = draw_width;
+ int h = draw_height;
+
+ if(w == 0 || h == 0)
+ return;
+
+ /* read buffer from device */
+ device->pixels_copy_from(rgba, 0, w, h);
+
+ /* write image */
+ ImageOutput *out = ImageOutput::create(filename);
+ ImageSpec spec(w, h, 4, TypeDesc::UINT8);
+ int scanlinesize = w*4*sizeof(uchar);
+
+ out->open(filename, spec);
+
+ /* conversion for different top/bottom convention */
+ out->write_image(TypeDesc::UINT8,
+ (uchar*)rgba.data_pointer + (h-1)*scanlinesize,
+ AutoStride,
+ -scanlinesize,
+ AutoStride);
+
+ out->close();
+
+ delete out;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
new file mode 100644
index 00000000000..d5eb8d7fa2f
--- /dev/null
+++ b/intern/cycles/render/buffers.h
@@ -0,0 +1,98 @@
+/*
+ * 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 __BUFFERS_H__
+#define __BUFFERS_H__
+
+#include "device_memory.h"
+
+#include "util_string.h"
+#include "util_thread.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+struct float4;
+
+/* Render Buffers */
+
+class RenderBuffers {
+public:
+ /* buffer dimensions */
+ int width, height;
+ /* float buffer */
+ device_vector<float4> buffer;
+ /* random number generator state */
+ device_vector<uint> rng_state;
+ /* mutex, must be locked manually by callers */
+ thread_mutex mutex;
+
+ RenderBuffers(Device *device);
+ ~RenderBuffers();
+
+ void reset(Device *device, int width, int height);
+ float4 *copy_from_device(float exposure, int sample);
+
+protected:
+ void device_free();
+
+ Device *device;
+};
+
+/* Display Buffer
+ *
+ * The buffer used for drawing during render, filled by tonemapping the render
+ * buffers and converting to uchar4 storage. */
+
+class DisplayBuffer {
+public:
+ /* buffer dimensions */
+ int width, height;
+ /* 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 */
+ int draw_width, draw_height;
+ /* draw alpha channel? */
+ bool transparent;
+ /* byte buffer for tonemapped result */
+ device_vector<uchar4> rgba;
+ /* mutex, must be locked manually by callers */
+ thread_mutex mutex;
+
+ DisplayBuffer(Device *device);
+ ~DisplayBuffer();
+
+ void reset(Device *device, int width, int height);
+ void write(Device *device, const string& filename);
+
+ void draw_set(int width, int height);
+ void draw(Device *device);
+ bool draw_ready();
+
+protected:
+ void draw_transparency_grid();
+ void device_free();
+
+ Device *device;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __BUFFERS_H__ */
+
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
new file mode 100644
index 00000000000..e88c0a388bc
--- /dev/null
+++ b/intern/cycles/render/camera.cpp
@@ -0,0 +1,199 @@
+/*
+ * 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 "camera.h"
+#include "scene.h"
+
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+Camera::Camera()
+{
+ shutteropen = 0.0f;
+ shutterclose = 1.0f;
+
+ aperturesize = 0.0f;
+ focaldistance = 10.0f;
+ blades = 0;
+ bladesrotation = 0.0f;
+
+ matrix = transform_identity();
+
+ ortho = false;
+ fov = M_PI_F/4.0f;
+
+ nearclip = 1e-5f;
+ farclip = 1e5f;
+
+ width = 1024;
+ height = 512;
+
+ left = -((float)width/(float)height);
+ right = (float)width/(float)height;
+ bottom = -1.0f;
+ top = 1.0f;
+
+ screentoworld = transform_identity();
+ rastertoworld = transform_identity();
+ ndctoworld = transform_identity();
+ rastertocamera = transform_identity();
+ cameratoworld = transform_identity();
+ worldtoraster = transform_identity();
+
+ dx = make_float3(0.0f, 0.0f, 0.0f);
+ dy = make_float3(0.0f, 0.0f, 0.0f);
+
+ need_update = true;
+ need_device_update = true;
+}
+
+Camera::~Camera()
+{
+}
+
+void Camera::update()
+{
+ if(!need_update)
+ return;
+
+ Transform screentocamera;
+ Transform ndctoraster = transform_scale((float)width, (float)height, 1.0f);
+
+ /* raster to screen */
+ Transform screentoraster = ndctoraster *
+ transform_scale(1.0f/(right - left), 1.0f/(top - bottom), 1.0f) *
+ transform_translate(-left, -bottom, 0.0f);
+
+ Transform rastertoscreen = transform_inverse(screentoraster);
+
+ /* screen to camera */
+ if(ortho)
+ screentocamera = transform_inverse(transform_orthographic(nearclip, farclip));
+ else
+ screentocamera = transform_inverse(transform_perspective(fov, nearclip, farclip));
+
+ rastertocamera = screentocamera * rastertoscreen;
+
+ cameratoworld = matrix;
+ screentoworld = cameratoworld * screentocamera;
+ rastertoworld = cameratoworld * rastertocamera;
+ ndctoworld = rastertoworld * ndctoraster;
+ worldtoraster = transform_inverse(rastertoworld);
+
+ /* differentials */
+ if(ortho) {
+ dx = transform_direction(&rastertocamera, make_float3(1, 0, 0));
+ dy = transform_direction(&rastertocamera, make_float3(0, 1, 0));
+ }
+ else {
+ dx = transform(&rastertocamera, make_float3(1, 0, 0)) -
+ transform(&rastertocamera, make_float3(0, 0, 0));
+ dy = transform(&rastertocamera, make_float3(0, 1, 0)) -
+ transform(&rastertocamera, make_float3(0, 0, 0));
+ }
+
+ dx = transform_direction(&cameratoworld, dx);
+ dy = transform_direction(&cameratoworld, dy);
+
+ need_update = false;
+ need_device_update = true;
+}
+
+void Camera::device_update(Device *device, DeviceScene *dscene)
+{
+ update();
+
+ if(!need_device_update)
+ return;
+
+ KernelCamera *kcam = &dscene->data.cam;
+
+ /* store matrices */
+ kcam->screentoworld = screentoworld;
+ kcam->rastertoworld = rastertoworld;
+ kcam->ndctoworld = ndctoworld;
+ kcam->rastertocamera = rastertocamera;
+ kcam->cameratoworld = cameratoworld;
+ kcam->worldtoscreen = transform_inverse(screentoworld);
+ kcam->worldtoraster = transform_inverse(rastertoworld);
+ kcam->worldtondc = transform_inverse(ndctoworld);
+ kcam->worldtocamera = transform_inverse(cameratoworld);
+
+ /* depth of field */
+ kcam->aperturesize = aperturesize;
+ kcam->focaldistance = focaldistance;
+ kcam->blades = (blades < 3)? 0.0f: blades;
+ kcam->bladesrotation = bladesrotation;
+
+ /* motion blur */
+ kcam->shutteropen = shutteropen;
+ kcam->shutterclose = shutterclose;
+
+ /* type */
+ kcam->ortho = ortho;
+
+ /* size */
+ kcam->width = width;
+ kcam->height = height;
+
+ /* store differentials */
+ kcam->dx = dx;
+ kcam->dy = dy;
+
+ /* clipping */
+ kcam->nearclip = nearclip;
+ kcam->cliplength = (farclip == FLT_MAX)? FLT_MAX: farclip - nearclip;
+
+ need_device_update = false;
+}
+
+void Camera::device_free(Device *device, DeviceScene *dscene)
+{
+ /* nothing to free, only writing to constant memory */
+}
+
+bool Camera::modified(const Camera& cam)
+{
+ return !((shutteropen == cam.shutteropen) &&
+ (shutterclose == cam.shutterclose) &&
+ (aperturesize == cam.aperturesize) &&
+ (blades == cam.blades) &&
+ (bladesrotation == cam.bladesrotation) &&
+ (focaldistance == cam.focaldistance) &&
+ (ortho == cam.ortho) &&
+ (fov == cam.fov) &&
+ (nearclip == cam.nearclip) &&
+ (farclip == cam.farclip) &&
+ // modified for progressive render
+ // (width == cam.width) &&
+ // (height == cam.height) &&
+ (left == cam.left) &&
+ (right == cam.right) &&
+ (bottom == cam.bottom) &&
+ (top == cam.top) &&
+ (matrix == cam.matrix));
+}
+
+void Camera::tag_update()
+{
+ need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/camera.h b/intern/cycles/render/camera.h
new file mode 100644
index 00000000000..43537ce8c3c
--- /dev/null
+++ b/intern/cycles/render/camera.h
@@ -0,0 +1,93 @@
+/*
+ * 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 __CAMERA_H__
+#define __CAMERA_H__
+
+#include "util_transform.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+
+/* Camera
+ *
+ * The camera parameters are quite standard, tested to be both compatible with
+ * Renderman, and Blender after remapping. */
+
+class Camera {
+public:
+ /* motion blur */
+ float shutteropen;
+ float shutterclose;
+
+ /* depth of field */
+ float focaldistance;
+ float aperturesize;
+ uint blades;
+ float bladesrotation;
+
+ /* orthographic/perspective */
+ bool ortho;
+ float fov;
+
+ /* clipping */
+ float nearclip;
+ float farclip;
+
+ /* screen */
+ int width, height;
+ float left, right, bottom, top;
+
+ /* transformation */
+ Transform matrix;
+
+ /* computed camera parameters */
+ Transform screentoworld;
+ Transform rastertoworld;
+ Transform ndctoworld;
+ Transform rastertocamera;
+ Transform cameratoworld;
+ Transform worldtoraster;
+
+ float3 dx;
+ float3 dy;
+
+ /* update */
+ bool need_update;
+ bool need_device_update;
+
+ /* functions */
+ Camera();
+ ~Camera();
+
+ void update();
+
+ void device_update(Device *device, DeviceScene *dscene);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ bool modified(const Camera& cam);
+ void tag_update();
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __CAMERA_H__ */
+
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
new file mode 100644
index 00000000000..0ae2866f182
--- /dev/null
+++ b/intern/cycles/render/film.cpp
@@ -0,0 +1,64 @@
+/*
+ * 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 "camera.h"
+#include "device.h"
+#include "film.h"
+#include "scene.h"
+
+CCL_NAMESPACE_BEGIN
+
+Film::Film()
+{
+ exposure = 0.8f;
+ need_update = true;
+}
+
+Film::~Film()
+{
+}
+
+void Film::device_update(Device *device, DeviceScene *dscene)
+{
+ if(!need_update)
+ return;
+
+ KernelFilm *kfilm = &dscene->data.film;
+
+ /* update __data */
+ kfilm->exposure = exposure;
+
+ need_update = false;
+}
+
+void Film::device_free(Device *device, DeviceScene *dscene)
+{
+}
+
+bool Film::modified(const Film& film)
+{
+ return !(exposure == film.exposure);
+}
+
+void Film::tag_update(Scene *scene)
+{
+ need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/film.h b/intern/cycles/render/film.h
new file mode 100644
index 00000000000..df24fad3725
--- /dev/null
+++ b/intern/cycles/render/film.h
@@ -0,0 +1,48 @@
+/*
+ * 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 __FILM_H__
+#define __FILM_H__
+
+#include "util_string.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class Scene;
+
+class Film {
+public:
+ float exposure;
+ bool need_update;
+
+ Film();
+ ~Film();
+
+ void device_update(Device *device, DeviceScene *dscene);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ bool modified(const Film& film);
+ void tag_update(Scene *scene);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __FILM_H__ */
+
diff --git a/intern/cycles/render/filter.cpp b/intern/cycles/render/filter.cpp
new file mode 100644
index 00000000000..4925521e4a5
--- /dev/null
+++ b/intern/cycles/render/filter.cpp
@@ -0,0 +1,140 @@
+/*
+ * 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 "camera.h"
+#include "device.h"
+#include "filter.h"
+#include "scene.h"
+
+#include "util_algorithm.h"
+#include "util_debug.h"
+#include "util_math.h"
+
+CCL_NAMESPACE_BEGIN
+
+Filter::Filter()
+{
+ filter_type = FILTER_BOX;
+ filter_width = 1.0f;
+ need_update = true;
+}
+
+Filter::~Filter()
+{
+}
+
+static float filter_func_box(float v, float width)
+{
+ return (float)1;
+}
+
+static float filter_func_gaussian(float v, float width)
+{
+ v *= (float)2/width;
+ return (float)expf((float)-2*v*v);
+}
+
+static vector<float> filter_table(FilterType type, float width)
+{
+ const int filter_table_size = 256;
+ vector<float> filter_table_cdf(filter_table_size+1);
+ vector<float> filter_table(filter_table_size+1);
+ float (*filter_func)(float, float) = NULL;
+ int i, half_size = filter_table_size/2;
+
+ switch(type) {
+ case FILTER_BOX:
+ filter_func = filter_func_box;
+ break;
+ case FILTER_GAUSSIAN:
+ filter_func = filter_func_gaussian;
+ break;
+ default:
+ assert(0);
+ }
+
+ /* compute cumulative distribution function */
+ filter_table_cdf[0] = 0.0f;
+
+ for(i=0; i<filter_table_size; i++) {
+ float x = i*width*0.5f/(filter_table_size-1);
+ float y = filter_func(x, width);
+ filter_table_cdf[i+1] += filter_table_cdf[i] + fabsf(y);
+ }
+
+ for(i=0; i<=filter_table_size; i++)
+ filter_table_cdf[i] /= filter_table_cdf[filter_table_size];
+
+ /* create importance sampling table */
+ for(i=0; i<=half_size; i++) {
+ float x = i/(float)half_size;
+ int index = upper_bound(filter_table_cdf.begin(), filter_table_cdf.end(), x) - filter_table_cdf.begin();
+ float t;
+
+ if(index < filter_table_size+1) {
+ t = (x - filter_table_cdf[index])/(filter_table_cdf[index+1] - filter_table_cdf[index]);
+ }
+ else {
+ t = 0.0f;
+ index = filter_table_size;
+ }
+
+ float y = ((index + t)/(filter_table_size))*width;
+
+ filter_table[half_size+i] = 0.5f*(1.0f + y);
+ filter_table[half_size-i] = 0.5f*(1.0f - y);
+ }
+
+ return filter_table;
+}
+
+void Filter::device_update(Device *device, DeviceScene *dscene)
+{
+ if(!need_update)
+ return;
+
+ device_free(device, dscene);
+
+ /* update __filter_table */
+ vector<float> table = filter_table(filter_type, filter_width);
+
+ dscene->filter_table.copy(&table[0], table.size());
+ device->tex_alloc("__filter_table", dscene->filter_table, true);
+
+ need_update = false;
+}
+
+void Filter::device_free(Device *device, DeviceScene *dscene)
+{
+ device->tex_free(dscene->filter_table);
+ dscene->filter_table.clear();
+}
+
+bool Filter::modified(const Filter& filter)
+{
+ return !(filter_type == filter.filter_type &&
+ filter_width == filter.filter_width);
+}
+
+void Filter::tag_update(Scene *scene)
+{
+ need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/filter.h b/intern/cycles/render/filter.h
new file mode 100644
index 00000000000..5df7bb8fd14
--- /dev/null
+++ b/intern/cycles/render/filter.h
@@ -0,0 +1,53 @@
+/*
+ * 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 __FILTER_H__
+#define __FILTER_H__
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class Scene;
+
+typedef enum FilterType {
+ FILTER_BOX,
+ FILTER_GAUSSIAN
+} FilterType;
+
+class Filter {
+public:
+ /* pixel filter */
+ FilterType filter_type;
+ float filter_width;
+ bool need_update;
+
+ Filter();
+ ~Filter();
+
+ void device_update(Device *device, DeviceScene *dscene);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ bool modified(const Filter& filter);
+ void tag_update(Scene *scene);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __FILTER_H__ */
+
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
new file mode 100644
index 00000000000..cdded403cbe
--- /dev/null
+++ b/intern/cycles/render/graph.cpp
@@ -0,0 +1,468 @@
+/*
+ * 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 "attribute.h"
+#include "graph.h"
+#include "nodes.h"
+
+#include "util_algorithm.h"
+#include "util_debug.h"
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Input and Output */
+
+ShaderInput::ShaderInput(ShaderNode *parent_, const char *name_, ShaderSocketType type_)
+{
+ parent = parent_;
+ name = name_;
+ type = type_;
+ link = NULL;
+ value = make_float3(0, 0, 0);
+ stack_offset = SVM_STACK_INVALID;
+ default_value = NONE;
+ osl_only = false;
+}
+
+ShaderOutput::ShaderOutput(ShaderNode *parent_, const char *name_, ShaderSocketType type_)
+{
+ parent = parent_;
+ name = name_;
+ type = type_;
+ stack_offset = SVM_STACK_INVALID;
+}
+
+/* Node */
+
+ShaderNode::ShaderNode(const char *name_)
+{
+ name = name_;
+ id = -1;
+ bump = SHADER_BUMP_NONE;
+}
+
+ShaderNode::~ShaderNode()
+{
+ foreach(ShaderInput *socket, inputs)
+ delete socket;
+
+ foreach(ShaderOutput *socket, outputs)
+ delete socket;
+}
+
+ShaderInput *ShaderNode::input(const char *name)
+{
+ foreach(ShaderInput *socket, inputs)
+ if(strcmp(socket->name, name) == 0)
+ return socket;
+
+ return NULL;
+}
+
+ShaderOutput *ShaderNode::output(const char *name)
+{
+ foreach(ShaderOutput *socket, outputs)
+ if(strcmp(socket->name, name) == 0)
+ return socket;
+
+ return NULL;
+}
+
+ShaderInput *ShaderNode::add_input(const char *name, ShaderSocketType type, float value)
+{
+ ShaderInput *input = new ShaderInput(this, name, type);
+ input->value.x = value;
+ inputs.push_back(input);
+ return input;
+}
+
+ShaderInput *ShaderNode::add_input(const char *name, ShaderSocketType type, float3 value)
+{
+ ShaderInput *input = new ShaderInput(this, name, type);
+ input->value = value;
+ inputs.push_back(input);
+ return input;
+}
+
+ShaderInput *ShaderNode::add_input(const char *name, ShaderSocketType type, ShaderInput::DefaultValue value, bool osl_only)
+{
+ ShaderInput *input = add_input(name, type);
+ input->default_value = value;
+ input->osl_only = osl_only;
+ return input;
+}
+
+ShaderOutput *ShaderNode::add_output(const char *name, ShaderSocketType type)
+{
+ ShaderOutput *output = new ShaderOutput(this, name, type);
+ outputs.push_back(output);
+ return output;
+}
+
+void ShaderNode::attributes(AttributeRequestSet *attributes)
+{
+ foreach(ShaderInput *input, inputs) {
+ if(!input->link) {
+ if(input->default_value == ShaderInput::TEXTURE_GENERATED)
+ attributes->add(Attribute::STD_GENERATED);
+ else if(input->default_value == ShaderInput::TEXTURE_UV)
+ attributes->add(Attribute::STD_UV);
+ }
+ }
+}
+
+/* Graph */
+
+ShaderGraph::ShaderGraph()
+{
+ finalized = false;
+ add(new OutputNode());
+}
+
+ShaderGraph::~ShaderGraph()
+{
+ foreach(ShaderNode *node, nodes)
+ delete node;
+}
+
+ShaderNode *ShaderGraph::add(ShaderNode *node)
+{
+ assert(!finalized);
+ node->id = nodes.size();
+ nodes.push_back(node);
+ return node;
+}
+
+ShaderNode *ShaderGraph::output()
+{
+ return nodes.front();
+}
+
+ShaderGraph *ShaderGraph::copy()
+{
+ ShaderGraph *newgraph = new ShaderGraph();
+
+ /* copy nodes */
+ set<ShaderNode*> nodes_all;
+ foreach(ShaderNode *node, nodes)
+ nodes_all.insert(node);
+
+ map<ShaderNode*, ShaderNode*> nodes_copy;
+ copy_nodes(nodes_all, nodes_copy);
+
+ /* add nodes (in same order, so output is still first) */
+ newgraph->nodes.clear();
+ foreach(ShaderNode *node, nodes)
+ newgraph->add(nodes_copy[node]);
+
+ return newgraph;
+}
+
+void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to)
+{
+ assert(!finalized);
+ assert(from && to);
+
+ if(to->link) {
+ fprintf(stderr, "ShaderGraph connect: input already connected.\n");
+ return;
+ }
+
+ if(from->type != to->type) {
+ /* for closures we can't do automatic conversion */
+ if(from->type == SHADER_SOCKET_CLOSURE || to->type == SHADER_SOCKET_CLOSURE) {
+ fprintf(stderr, "ShaderGraph connect: can only connect closure to closure.\n");
+ return;
+ }
+
+ /* add automatic conversion node in case of type mismatch */
+ ShaderNode *convert = add(new ConvertNode(from->type, to->type));
+
+ connect(from, convert->inputs[0]);
+ connect(convert->outputs[0], to);
+ }
+ else {
+ /* types match, just connect */
+ to->link = from;
+ from->links.push_back(to);
+ }
+}
+
+void ShaderGraph::disconnect(ShaderInput *to)
+{
+ assert(!finalized);
+ assert(to->link);
+
+ ShaderOutput *from = to->link;
+
+ to->link = NULL;
+ from->links.erase(remove(from->links.begin(), from->links.end(), to), from->links.end());
+}
+
+void ShaderGraph::finalize(bool do_bump, bool do_osl)
+{
+ /* before compiling, the shader graph may undergo a number of modifications.
+ * currently we set default geometry shader inputs, and create automatic bump
+ * from displacement. a graph can be finalized only once, and should not be
+ * modified afterwards. */
+
+ if(!finalized) {
+ clean();
+ default_inputs(do_osl);
+ if(do_bump)
+ bump_from_displacement();
+
+ finalized = true;
+ }
+}
+
+void ShaderGraph::find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input)
+{
+ /* find all nodes that this input dependes on directly and indirectly */
+ ShaderNode *node = (input->link)? input->link->parent: NULL;
+
+ if(node) {
+ foreach(ShaderInput *in, node->inputs)
+ find_dependencies(dependencies, in);
+
+ dependencies.insert(node);
+ }
+}
+
+void ShaderGraph::copy_nodes(set<ShaderNode*>& nodes, map<ShaderNode*, ShaderNode*>& nnodemap)
+{
+ /* copy a set of nodes, and the links between them. the assumption is
+ * made that all nodes that inputs are linked to are in the set too. */
+
+ /* copy nodes */
+ foreach(ShaderNode *node, nodes) {
+ ShaderNode *nnode = node->clone();
+ nnodemap[node] = nnode;
+
+ nnode->inputs.clear();
+ nnode->outputs.clear();
+
+ foreach(ShaderInput *input, node->inputs) {
+ ShaderInput *ninput = new ShaderInput(*input);
+ nnode->inputs.push_back(ninput);
+
+ ninput->parent = nnode;
+ ninput->link = NULL;
+ }
+
+ foreach(ShaderOutput *output, node->outputs) {
+ ShaderOutput *noutput = new ShaderOutput(*output);
+ nnode->outputs.push_back(noutput);
+
+ noutput->parent = nnode;
+ noutput->links.clear();
+ }
+ }
+
+ /* recreate links */
+ foreach(ShaderNode *node, nodes) {
+ foreach(ShaderInput *input, node->inputs) {
+ if(input->link) {
+ /* find new input and output */
+ ShaderNode *nfrom = nnodemap[input->link->parent];
+ ShaderNode *nto = nnodemap[input->parent];
+ ShaderOutput *noutput = nfrom->output(input->link->name);
+ ShaderInput *ninput = nto->input(input->name);
+
+ /* connect */
+ connect(noutput, ninput);
+ }
+ }
+ }
+}
+
+void ShaderGraph::break_cycles(ShaderNode *node, vector<bool>& visited, vector<bool>& on_stack)
+{
+ visited[node->id] = true;
+ on_stack[node->id] = true;
+
+ foreach(ShaderInput *input, node->inputs) {
+ if(input->link) {
+ ShaderNode *depnode = input->link->parent;
+
+ if(on_stack[depnode->id]) {
+ /* break cycle */
+ disconnect(input);
+ fprintf(stderr, "ShaderGraph: detected cycle in graph, connection removed.\n");
+ }
+ else if(!visited[depnode->id]) {
+ /* visit dependencies */
+ break_cycles(depnode, visited, on_stack);
+ }
+ }
+ }
+
+ on_stack[node->id] = false;
+}
+
+void ShaderGraph::clean()
+{
+ /* we do two things here: find cycles and break them, and remove unused
+ 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> visited(nodes.size(), false);
+ vector<bool> on_stack(nodes.size(), false);
+
+ /* 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);
+ else
+ delete node;
+ }
+
+ nodes = newnodes;
+}
+
+void ShaderGraph::default_inputs(bool do_osl)
+{
+ /* nodes can specify default texture coordinates, for now we give
+ * everything the position by default, except for the sky texture */
+
+ ShaderNode *geom = NULL;
+ ShaderNode *texco = NULL;
+
+ foreach(ShaderNode *node, nodes) {
+ foreach(ShaderInput *input, node->inputs) {
+ if(!input->link && !(input->osl_only && !do_osl)) {
+ if(input->default_value == ShaderInput::TEXTURE_GENERATED) {
+ if(!texco)
+ texco = new TextureCoordinateNode();
+
+ connect(texco->output("Generated"), input);
+ }
+ else if(input->default_value == ShaderInput::TEXTURE_UV) {
+ if(!texco)
+ texco = new TextureCoordinateNode();
+
+ connect(texco->output("UV"), input);
+ }
+ else if(input->default_value == ShaderInput::INCOMING) {
+ if(!geom)
+ geom = new GeometryNode();
+
+ connect(geom->output("Incoming"), input);
+ }
+ else if(input->default_value == ShaderInput::NORMAL) {
+ if(!geom)
+ geom = new GeometryNode();
+
+ connect(geom->output("Normal"), input);
+ }
+ else if(input->default_value == ShaderInput::POSITION) {
+ if(!geom)
+ geom = new GeometryNode();
+
+ connect(geom->output("Position"), input);
+ }
+ }
+ }
+ }
+
+ if(geom)
+ add(geom);
+ if(texco)
+ add(texco);
+}
+
+void ShaderGraph::bump_from_displacement()
+{
+ /* generate bump mapping automatically from displacement. bump mapping is
+ * done using a 3-tap filter, computing the displacement at the center,
+ * and two other positions shifted by ray differentials.
+ *
+ * since the input to displacement is a node graph, we need to ensure that
+ * all texture coordinates use are shift by the ray differentials. for this
+ * reason we make 3 copies of the node subgraph defining the displacement,
+ * with each different geometry and texture coordinate nodes that generate
+ * different shifted coordinates.
+ *
+ * these 3 displacement values are then fed into the bump node, which will
+ * modify the normal. */
+
+ ShaderInput *displacement_in = output()->input("Displacement");
+
+ if(!displacement_in->link)
+ return;
+
+ /* find dependencies for the given input */
+ set<ShaderNode*> nodes_displace;
+ find_dependencies(nodes_displace, displacement_in);
+
+ /* copy nodes for 3 bump samples */
+ map<ShaderNode*, ShaderNode*> nodes_center;
+ map<ShaderNode*, ShaderNode*> nodes_dx;
+ map<ShaderNode*, ShaderNode*> nodes_dy;
+
+ copy_nodes(nodes_displace, nodes_center);
+ copy_nodes(nodes_displace, nodes_dx);
+ copy_nodes(nodes_displace, nodes_dy);
+
+ /* mark nodes to indicate they are use for bump computation, so
+ that any texture coordinates are shifted by dx/dy when sampling */
+ foreach(NodePair& pair, nodes_center)
+ pair.second->bump = SHADER_BUMP_CENTER;
+ foreach(NodePair& pair, nodes_dx)
+ pair.second->bump = SHADER_BUMP_DX;
+ foreach(NodePair& pair, nodes_dy)
+ pair.second->bump = SHADER_BUMP_DY;
+
+ /* add bump node and connect copied graphs to it */
+ ShaderNode *bump = add(new BumpNode());
+
+ ShaderOutput *out = displacement_in->link;
+ ShaderOutput *out_center = nodes_center[out->parent]->output(out->name);
+ ShaderOutput *out_dx = nodes_dx[out->parent]->output(out->name);
+ ShaderOutput *out_dy = nodes_dy[out->parent]->output(out->name);
+
+ connect(out_center, bump->input("SampleCenter"));
+ connect(out_dx, bump->input("SampleX"));
+ connect(out_dy, bump->input("SampleY"));
+
+ /* connect bump output to normal input nodes that aren't set yet. actually
+ this will only set the normal input to the geometry node that we created
+ and connected to all other normal inputs already. */
+ foreach(ShaderNode *node, nodes)
+ foreach(ShaderInput *input, node->inputs)
+ if(!input->link && input->default_value == ShaderInput::NORMAL)
+ connect(bump->output("Normal"), input);
+
+ /* finally, add the copied nodes to the graph. we can't do this earlier
+ because we would create dependency cycles in the above loop */
+ foreach(NodePair& pair, nodes_center)
+ add(pair.second);
+ foreach(NodePair& pair, nodes_dx)
+ add(pair.second);
+ foreach(NodePair& pair, nodes_dy)
+ add(pair.second);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h
new file mode 100644
index 00000000000..2a2df5e1377
--- /dev/null
+++ b/intern/cycles/render/graph.h
@@ -0,0 +1,229 @@
+/*
+ * 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 __GRAPH_H__
+#define __GRAPH_H__
+
+#include "kernel_types.h"
+
+#include "util_list.h"
+#include "util_map.h"
+#include "util_param.h"
+#include "util_set.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class AttributeRequestSet;
+class ShaderInput;
+class ShaderOutput;
+class ShaderNode;
+class ShaderGraph;
+class SVMCompiler;
+class OSLCompiler;
+
+/* Socket Type
+ *
+ * Data type for inputs and outputs */
+
+enum ShaderSocketType {
+ SHADER_SOCKET_FLOAT,
+ SHADER_SOCKET_COLOR,
+ SHADER_SOCKET_VECTOR,
+ SHADER_SOCKET_POINT,
+ SHADER_SOCKET_NORMAL,
+ SHADER_SOCKET_CLOSURE
+};
+
+/* Bump
+ *
+ * For bump mapping, a node may be evaluated multiple times, using different
+ * samples to reconstruct the normal, this indicates the sample position */
+
+enum ShaderBump {
+ SHADER_BUMP_NONE,
+ SHADER_BUMP_CENTER,
+ SHADER_BUMP_DX,
+ SHADER_BUMP_DY
+};
+
+/* Enum
+ *
+ * Utility class for enum values. */
+
+class ShaderEnum {
+public:
+ bool empty() const { return left.empty(); }
+ void insert(const char *x, int y) {
+ left[ustring(x)] = y;
+ right[y] = ustring(x);
+ }
+
+ bool exists(ustring x) { return left.find(x) != left.end(); }
+ bool exists(int y) { return right.find(y) != right.end(); }
+
+ int operator[](const char *x) { return left[ustring(x)]; }
+ int operator[](ustring x) { return left[x]; }
+ ustring operator[](int y) { return right[y]; }
+
+protected:
+ map<ustring, int> left;
+ map<int, ustring> right;
+};
+
+/* Input
+ *
+ * Input socket for a shader node. May be linked to an output or not. If not
+ * linked, it will either get a fixed default value, or e.g. a texture
+ * coordinate. */
+
+class ShaderInput {
+public:
+ enum DefaultValue {
+ TEXTURE_GENERATED,
+ TEXTURE_UV,
+ INCOMING,
+ NORMAL,
+ POSITION,
+ NONE
+ };
+
+ ShaderInput(ShaderNode *parent, const char *name, ShaderSocketType type);
+ void set(const float3& v) { value = v; }
+ void set(float f) { value = make_float3(f, 0, 0); }
+
+ const char *name;
+ ShaderSocketType type;
+
+ ShaderNode *parent;
+ ShaderOutput *link;
+
+ DefaultValue default_value;
+ float3 value;
+
+ int stack_offset; /* for SVM compiler */
+ bool osl_only;
+};
+
+/* Output
+ *
+ * Output socket for a shader node. */
+
+class ShaderOutput {
+public:
+ ShaderOutput(ShaderNode *parent, const char *name, ShaderSocketType type);
+
+ const char *name;
+ ShaderNode *parent;
+ ShaderSocketType type;
+
+ vector<ShaderInput*> links;
+
+ int stack_offset; /* for SVM compiler */
+};
+
+/* Node
+ *
+ * Shader node in graph, with input and output sockets. This is the virtual
+ * base class for all node types. */
+
+class ShaderNode {
+public:
+ ShaderNode(const char *name);
+ virtual ~ShaderNode();
+
+ ShaderInput *input(const char *name);
+ ShaderOutput *output(const char *name);
+
+ ShaderInput *add_input(const char *name, ShaderSocketType type, float value=0.0f);
+ ShaderInput *add_input(const char *name, ShaderSocketType type, float3 value);
+ ShaderInput *add_input(const char *name, ShaderSocketType type, ShaderInput::DefaultValue value, bool osl_only=false);
+ ShaderOutput *add_output(const char *name, ShaderSocketType type);
+
+ virtual ShaderNode *clone() const = 0;
+ virtual void attributes(AttributeRequestSet *attributes);
+ virtual void compile(SVMCompiler& compiler) = 0;
+ virtual void compile(OSLCompiler& compiler) = 0;
+
+ vector<ShaderInput*> inputs;
+ vector<ShaderOutput*> outputs;
+
+ ustring name; /* name, not required to be unique */
+ int id; /* index in graph node array */
+ ShaderBump bump; /* for bump mapping utility */
+};
+
+
+/* Node definition utility macros */
+
+#define SHADER_NODE_CLASS(type) \
+ type(); \
+ virtual ShaderNode *clone() const { return new type(*this); } \
+ virtual void compile(SVMCompiler& compiler); \
+ virtual void compile(OSLCompiler& compiler); \
+
+#define SHADER_NODE_NO_CLONE_CLASS(type) \
+ type(); \
+ virtual void compile(SVMCompiler& compiler); \
+ virtual void compile(OSLCompiler& compiler); \
+
+#define SHADER_NODE_BASE_CLASS(type) \
+ virtual ShaderNode *clone() const { return new type(*this); } \
+ virtual void compile(SVMCompiler& compiler); \
+ virtual void compile(OSLCompiler& compiler); \
+
+/* Graph
+ *
+ * Shader graph of nodes. Also does graph manipulations for default inputs,
+ * bump mapping from displacement, and possibly other things in the future. */
+
+class ShaderGraph {
+public:
+ list<ShaderNode*> nodes;
+ bool finalized;
+
+ ShaderGraph();
+ ~ShaderGraph();
+
+ ShaderGraph *copy();
+
+ ShaderNode *add(ShaderNode *node);
+ ShaderNode *output();
+
+ void connect(ShaderOutput *from, ShaderInput *to);
+ void disconnect(ShaderInput *to);
+
+ void finalize(bool do_bump = false, bool do_osl = false);
+
+protected:
+ typedef pair<ShaderNode* const, ShaderNode*> NodePair;
+
+ void find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input);
+ void copy_nodes(set<ShaderNode*>& nodes, map<ShaderNode*, ShaderNode*>& nnodemap);
+
+ void break_cycles(ShaderNode *node, vector<bool>& visited, vector<bool>& on_stack);
+ void clean();
+ void bump_from_displacement();
+ void default_inputs(bool do_osl);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __GRAPH_H__ */
+
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
new file mode 100644
index 00000000000..de3ab8edf48
--- /dev/null
+++ b/intern/cycles/render/image.cpp
@@ -0,0 +1,257 @@
+/*
+ * 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 "device.h"
+#include "image.h"
+#include "scene.h"
+
+#include "util_foreach.h"
+#include "util_image.h"
+#include "util_path.h"
+#include "util_progress.h"
+
+#ifdef WITH_OSL
+#include <OSL/oslexec.h>
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+ImageManager::ImageManager()
+{
+ need_update = true;
+ osl_texture_system = NULL;
+}
+
+ImageManager::~ImageManager()
+{
+ for(size_t slot = 0; slot < images.size(); slot++) {
+ assert(!images[slot]);
+ }
+}
+
+void ImageManager::set_osl_texture_system(void *texture_system)
+{
+ osl_texture_system = texture_system;
+}
+
+int ImageManager::add_image(const string& filename)
+{
+ Image *img;
+ size_t slot;
+
+ /* find existing image */
+ for(slot = 0; slot < images.size(); slot++) {
+ if(images[slot] && images[slot]->filename == filename) {
+ images[slot]->users++;
+ return slot;
+ }
+ }
+
+ /* find free slot */
+ for(slot = 0; slot < images.size(); slot++)
+ if(!images[slot])
+ break;
+
+ if(slot == images.size()) {
+ /* max images limit reached */
+ if(images.size() == TEX_IMAGE_MAX)
+ return -1;
+
+ images.resize(images.size() + 1);
+ }
+
+ /* add new image */
+ img = new Image();
+ img->filename = filename;
+ img->need_load = true;
+ img->users = 1;
+
+ images[slot] = img;
+ need_update = true;
+
+ return slot;
+}
+
+void ImageManager::remove_image(const string& filename)
+{
+ size_t slot;
+
+ for(slot = 0; slot < images.size(); slot++)
+ if(images[slot] && images[slot]->filename == filename)
+ break;
+
+ if(slot == images.size())
+ return;
+
+ assert(images[slot]);
+
+ /* decrement user count */
+ images[slot]->users--;
+ assert(images[slot]->users >= 0);
+
+ /* don't remove immediately, rather do it all together later on. one of
+ the reasons for this is that on shader changes we add and remove nodes
+ that use them, but we do not want to reload the image all the time. */
+ if(images[slot]->users == 0)
+ need_update = true;
+}
+
+bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
+{
+ if(img->filename == "")
+ return false;
+
+ /* load image from file through OIIO */
+ ImageInput *in = ImageInput::create(img->filename);
+
+ if(!in)
+ return false;
+
+ ImageSpec spec;
+
+ if(!in->open(img->filename, spec)) {
+ delete in;
+ return false;
+ }
+
+ /* we only handle certain number of components */
+ int width = spec.width;
+ int height = spec.height;
+ int components = spec.nchannels;
+
+ if(!(components == 1 || components == 3 || components == 4)) {
+ in->close();
+ delete in;
+ return false;
+ }
+
+ /* read RGBA pixels */
+ uchar *pixels = (uchar*)tex_img.resize(width, height);
+ int scanlinesize = width*components*sizeof(uchar);
+
+ in->read_image(TypeDesc::UINT8,
+ (uchar*)pixels + (height-1)*scanlinesize,
+ AutoStride,
+ -scanlinesize,
+ AutoStride);
+
+ in->close();
+ delete in;
+
+ if(components == 3) {
+ for(int i = width*height-1; i >= 0; i--) {
+ pixels[i*4+3] = 255;
+ pixels[i*4+2] = pixels[i*3+2];
+ pixels[i*4+1] = pixels[i*3+1];
+ pixels[i*4+0] = pixels[i*3+0];
+ }
+ }
+ else if(components == 1) {
+ for(int i = width*height-1; i >= 0; i--) {
+ pixels[i*4+3] = 255;
+ pixels[i*4+2] = pixels[i];
+ pixels[i*4+1] = pixels[i];
+ pixels[i*4+0] = pixels[i];
+ }
+ }
+
+ return true;
+}
+
+void ImageManager::device_load_image(Device *device, DeviceScene *dscene, int slot)
+{
+ if(osl_texture_system)
+ return;
+
+ Image *img = images[slot];
+ device_vector<uchar4>& tex_img = dscene->tex_image[slot];
+
+ if(tex_img.device_pointer)
+ device->tex_free(tex_img);
+
+ if(!file_load_image(img, tex_img)) {
+ /* on failure to load, we set a 1x1 pixels black image */
+ uchar *pixels = (uchar*)tex_img.resize(1, 1);
+
+ pixels[0] = 0;
+ pixels[1] = 0;
+ pixels[2] = 0;
+ pixels[3] = 0;
+ }
+
+ string name;
+
+ if(slot >= 10) name = string_printf("__tex_image_0%d", slot);
+ else name = string_printf("__tex_image_00%d", slot);
+
+ device->tex_alloc(name.c_str(), tex_img, true, true);
+}
+
+void ImageManager::device_free_image(Device *device, DeviceScene *dscene, int slot)
+{
+ if(images[slot]) {
+ if(osl_texture_system) {
+#ifdef WITH_OSL
+ ustring filename(images[slot]->filename);
+ ((OSL::TextureSystem*)osl_texture_system)->invalidate(filename);
+#endif
+ }
+ else {
+ device->tex_free(dscene->tex_image[slot]);
+ dscene->tex_image[slot].clear();
+ }
+
+ delete images[slot];
+ images[slot] = NULL;
+ }
+}
+
+void ImageManager::device_update(Device *device, DeviceScene *dscene, Progress& progress)
+{
+ if(!need_update)
+ return;
+
+ for(size_t slot = 0; slot < images.size(); slot++) {
+ if(images[slot]) {
+ if(images[slot]->users == 0) {
+ device_free_image(device, dscene, slot);
+ }
+ else if(images[slot]->need_load) {
+ string name = path_filename(images[slot]->filename);
+ progress.set_status("Updating Images", "Loading " + name);
+ device_load_image(device, dscene, slot);
+ images[slot]->need_load = false;
+ }
+
+ if(progress.get_cancel()) return;
+ }
+ }
+
+ need_update = false;
+}
+
+void ImageManager::device_free(Device *device, DeviceScene *dscene)
+{
+ for(size_t slot = 0; slot < images.size(); slot++)
+ device_free_image(device, dscene, slot);
+
+ images.clear();
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
new file mode 100644
index 00000000000..0d49a1e6b67
--- /dev/null
+++ b/intern/cycles/render/image.h
@@ -0,0 +1,70 @@
+/*
+ * 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 __IMAGE_H__
+#define __IMAGE_H__
+
+#include "device_memory.h"
+
+#include "util_string.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+#define TEX_IMAGE_MAX 100
+
+class Device;
+class DeviceScene;
+class Progress;
+
+class ImageManager {
+public:
+ ImageManager();
+ ~ImageManager();
+
+ int add_image(const string& filename);
+ void remove_image(const string& filename);
+
+ void device_update(Device *device, DeviceScene *dscene, Progress& progress);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ void set_osl_texture_system(void *texture_system);
+
+ bool need_update;
+
+private:
+ struct Image {
+ string filename;
+
+ bool need_load;
+ int users;
+ };
+
+ vector<Image*> images;
+ void *osl_texture_system;
+
+ bool file_load_image(Image *img, device_vector<uchar4>& tex_img);
+
+ void device_load_image(Device *device, DeviceScene *dscene, int slot);
+ void device_free_image(Device *device, DeviceScene *dscene, int slot);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __IMAGE_H__ */
+
diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp
new file mode 100644
index 00000000000..9d129d8e8db
--- /dev/null
+++ b/intern/cycles/render/integrator.cpp
@@ -0,0 +1,128 @@
+/*
+ * 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 "device.h"
+#include "integrator.h"
+#include "scene.h"
+#include "sobol.h"
+
+#include "util_hash.h"
+
+CCL_NAMESPACE_BEGIN
+
+Integrator::Integrator()
+{
+ min_bounce = 2;
+ max_bounce = 7;
+
+ max_diffuse_bounce = max_bounce;
+ max_glossy_bounce = max_bounce;
+ max_transmission_bounce = max_bounce;
+ probalistic_termination = true;
+
+ transparent_min_bounce = min_bounce;
+ transparent_max_bounce = max_bounce;
+ transparent_probalistic = true;
+ transparent_shadows = false;
+
+ no_caustics = false;
+ blur_caustics = 0.0f;
+
+ seed = 0;
+
+ need_update = true;
+}
+
+Integrator::~Integrator()
+{
+}
+
+void Integrator::device_update(Device *device, DeviceScene *dscene)
+{
+ if(!need_update)
+ return;
+
+ device_free(device, dscene);
+
+ KernelIntegrator *kintegrator = &dscene->data.integrator;
+
+ /* integrator parameters */
+ kintegrator->max_bounce = max_bounce + 1;
+ if(probalistic_termination)
+ kintegrator->min_bounce = min_bounce + 1;
+ else
+ kintegrator->min_bounce = kintegrator->max_bounce;
+
+ kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1;
+ kintegrator->max_glossy_bounce = max_glossy_bounce + 1;
+ kintegrator->max_transmission_bounce = max_transmission_bounce + 1;
+
+ kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
+ if(transparent_probalistic)
+ kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
+ else
+ kintegrator->transparent_min_bounce = kintegrator->transparent_max_bounce;
+
+ kintegrator->transparent_shadows = transparent_shadows;
+
+ kintegrator->no_caustics = no_caustics;
+ kintegrator->blur_caustics = blur_caustics;
+
+ kintegrator->seed = hash_int(seed);
+
+ /* sobol directions table */
+ int dimensions = PRNG_BASE_NUM + (max_bounce + transparent_max_bounce + 2)*PRNG_BOUNCE_NUM;
+ uint *directions = dscene->sobol_directions.resize(SOBOL_BITS*dimensions);
+
+ sobol_generate_direction_vectors((uint(*)[SOBOL_BITS])directions, dimensions);
+
+ device->tex_alloc("__sobol_directions", dscene->sobol_directions);
+
+ need_update = false;
+}
+
+void Integrator::device_free(Device *device, DeviceScene *dscene)
+{
+ device->tex_free(dscene->sobol_directions);
+ dscene->sobol_directions.clear();
+}
+
+bool Integrator::modified(const Integrator& integrator)
+{
+ return !(min_bounce == integrator.min_bounce &&
+ max_bounce == integrator.max_bounce &&
+ max_diffuse_bounce == integrator.max_diffuse_bounce &&
+ max_glossy_bounce == integrator.max_glossy_bounce &&
+ max_transmission_bounce == integrator.max_transmission_bounce &&
+ probalistic_termination == integrator.probalistic_termination &&
+ transparent_min_bounce == integrator.transparent_min_bounce &&
+ transparent_max_bounce == integrator.transparent_max_bounce &&
+ transparent_probalistic == integrator.transparent_probalistic &&
+ transparent_shadows == integrator.transparent_shadows &&
+ no_caustics == integrator.no_caustics &&
+ blur_caustics == integrator.blur_caustics &&
+ seed == integrator.seed);
+}
+
+void Integrator::tag_update(Scene *scene)
+{
+ need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/integrator.h b/intern/cycles/render/integrator.h
new file mode 100644
index 00000000000..52032fa1a26
--- /dev/null
+++ b/intern/cycles/render/integrator.h
@@ -0,0 +1,63 @@
+/*
+ * 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 __INTEGRATOR_H__
+#define __INTEGRATOR_H__
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class Scene;
+
+class Integrator {
+public:
+ int min_bounce;
+ int max_bounce;
+
+ int max_diffuse_bounce;
+ int max_glossy_bounce;
+ int max_transmission_bounce;
+ bool probalistic_termination;
+
+ int transparent_min_bounce;
+ int transparent_max_bounce;
+ bool transparent_probalistic;
+ bool transparent_shadows;
+
+ bool no_caustics;
+ float blur_caustics;
+
+ int seed;
+
+ bool need_update;
+
+ Integrator();
+ ~Integrator();
+
+ void device_update(Device *device, DeviceScene *dscene);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ bool modified(const Integrator& integrator);
+ void tag_update(Scene *scene);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __INTEGRATOR_H__ */
+
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
new file mode 100644
index 00000000000..74943fd0ff7
--- /dev/null
+++ b/intern/cycles/render/light.cpp
@@ -0,0 +1,309 @@
+/*
+ * 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 "device.h"
+#include "light.h"
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+#include "shader.h"
+
+#include "util_foreach.h"
+#include "util_progress.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Light */
+
+Light::Light()
+{
+ type = LIGHT_POINT;
+
+ co = make_float3(0.0f, 0.0f, 0.0f);
+
+ dir = make_float3(0.0f, 0.0f, 0.0f);
+ size = 0.0f;
+
+ axisu = make_float3(0.0f, 0.0f, 0.0f);
+ sizeu = 1.0f;
+ axisv = make_float3(0.0f, 0.0f, 0.0f);
+ sizev = 1.0f;
+
+ cast_shadow = true;
+ shader = 0;
+}
+
+void Light::tag_update(Scene *scene)
+{
+ scene->light_manager->need_update = true;
+}
+
+/* Light Manager */
+
+LightManager::LightManager()
+{
+ need_update = true;
+}
+
+LightManager::~LightManager()
+{
+}
+
+void LightManager::device_update_distribution(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ /* option to always sample all point lights */
+ bool multi_light = false;
+
+ /* count */
+ size_t num_lights = scene->lights.size();
+ size_t num_triangles = 0;
+
+ foreach(Object *object, scene->objects) {
+ Mesh *mesh = object->mesh;
+ bool have_emission = false;
+
+ /* skip if we have no emission shaders */
+ foreach(uint sindex, mesh->used_shaders) {
+ Shader *shader = scene->shaders[sindex];
+
+ if(shader->sample_as_light && shader->has_surface_emission) {
+ have_emission = true;
+ break;
+ }
+ }
+
+ /* count triangles */
+ if(have_emission) {
+ for(size_t i = 0; i < mesh->triangles.size(); i++) {
+ Shader *shader = scene->shaders[mesh->shader[i]];
+
+ if(shader->sample_as_light && shader->has_surface_emission)
+ num_triangles++;
+ }
+ }
+ }
+
+ size_t num_distribution = num_triangles;
+
+ if(!multi_light)
+ num_distribution += num_lights;
+
+ /* emission area */
+ float4 *distribution = dscene->light_distribution.resize(num_distribution + 1);
+ float totarea = 0.0f;
+
+ /* triangles */
+ size_t offset = 0;
+ size_t j = 0;
+
+ foreach(Object *object, scene->objects) {
+ Mesh *mesh = object->mesh;
+ bool have_emission = false;
+
+ /* skip if we have no emission shaders */
+ foreach(uint sindex, mesh->used_shaders) {
+ Shader *shader = scene->shaders[sindex];
+
+ if(shader->sample_as_light && shader->has_surface_emission) {
+ have_emission = true;
+ break;
+ }
+ }
+
+ /* sum area */
+ if(have_emission) {
+ Transform tfm = object->tfm;
+ int object_id = (mesh->transform_applied)? -j-1: j;
+
+ for(size_t i = 0; i < mesh->triangles.size(); i++) {
+ Shader *shader = scene->shaders[mesh->shader[i]];
+
+ if(shader->sample_as_light && shader->has_surface_emission) {
+ distribution[offset].x = totarea;
+ distribution[offset].y = __int_as_float(i + mesh->tri_offset);
+ distribution[offset].z = 1.0f;
+ distribution[offset].w = __int_as_float(object_id);
+ offset++;
+
+ Mesh::Triangle t = mesh->triangles[i];
+ float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
+ float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
+ float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
+
+ totarea += triangle_area(p1, p2, p3);
+ }
+ }
+ }
+
+ if(progress.get_cancel()) return;
+
+ j++;
+ }
+
+ float trianglearea = totarea;
+
+ /* point lights */
+ if(!multi_light) {
+ float lightarea = (totarea > 0.0f)? totarea/scene->lights.size(): 1.0f;
+
+ for(size_t i = 0; i < scene->lights.size(); i++, offset++) {
+ distribution[offset].x = totarea;
+ distribution[offset].y = __int_as_float(-i-1);
+ distribution[offset].z = 1.0f;
+ distribution[offset].w = scene->lights[i]->size;
+ totarea += lightarea;
+ }
+ }
+
+ /* normalize cumulative distribution functions */
+ distribution[num_distribution].x = totarea;
+ distribution[num_distribution].y = 0.0f;
+ distribution[num_distribution].z = 0.0f;
+ distribution[num_distribution].w = 0.0f;
+
+ if(totarea > 0.0f) {
+ for(size_t i = 0; i < num_distribution; i++)
+ distribution[i].x /= totarea;
+ distribution[num_distribution].x = 1.0f;
+ }
+
+ if(progress.get_cancel()) return;
+
+ /* update device */
+ KernelIntegrator *kintegrator = &dscene->data.integrator;
+ kintegrator->use_direct_light = (totarea > 0.0f) || (multi_light && num_lights);
+
+ if(kintegrator->use_direct_light) {
+ /* number of emissives */
+ kintegrator->num_distribution = (totarea > 0.0f)? num_distribution: 0;
+
+ /* precompute pdfs */
+ kintegrator->pdf_triangles = 0.0f;
+ kintegrator->pdf_lights = 0.0f;
+
+ if(multi_light) {
+ /* sample one of all triangles and all lights */
+ kintegrator->num_all_lights = num_lights;
+
+ if(trianglearea > 0.0f)
+ kintegrator->pdf_triangles = 1.0f/trianglearea;
+ if(num_lights)
+ kintegrator->pdf_lights = 1.0f;
+ }
+ else {
+ /* sample one, with 0.5 probability of light or triangle */
+ kintegrator->num_all_lights = 0;
+
+ if(trianglearea > 0.0f) {
+ kintegrator->pdf_triangles = 1.0f/trianglearea;
+ if(num_lights)
+ kintegrator->pdf_triangles *= 0.5f;
+ }
+
+ if(num_lights) {
+ kintegrator->pdf_lights = 1.0f/num_lights;
+ if(trianglearea > 0.0f)
+ kintegrator->pdf_lights *= 0.5f;
+ }
+ }
+
+ /* CDF */
+ device->tex_alloc("__light_distribution", dscene->light_distribution);
+ }
+ else
+ dscene->light_distribution.clear();
+}
+
+void LightManager::device_update_points(Device *device, DeviceScene *dscene, Scene *scene)
+{
+ if(scene->lights.size() == 0)
+ return;
+
+ float4 *light_data = dscene->light_data.resize(scene->lights.size()*LIGHT_SIZE);
+
+ for(size_t i = 0; i < scene->lights.size(); i++) {
+ Light *light = scene->lights[i];
+ float3 co = light->co;
+ float3 dir = normalize(light->dir);
+ int shader_id = scene->shader_manager->get_shader_id(scene->lights[i]->shader);
+
+ if(!light->cast_shadow)
+ shader_id &= ~SHADER_CAST_SHADOW;
+
+ if(light->type == LIGHT_POINT) {
+ shader_id &= ~SHADER_AREA_LIGHT;
+
+ light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), co.x, co.y, co.z);
+ light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), light->size, 0.0f, 0.0f);
+ light_data[i*LIGHT_SIZE + 2] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ light_data[i*LIGHT_SIZE + 3] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ }
+ else if(light->type == LIGHT_DISTANT) {
+ shader_id &= ~SHADER_AREA_LIGHT;
+
+ light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), dir.x, dir.y, dir.z);
+ light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), light->size, 0.0f, 0.0f);
+ light_data[i*LIGHT_SIZE + 2] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ light_data[i*LIGHT_SIZE + 3] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ }
+ else if(light->type == LIGHT_AREA) {
+ float3 axisu = light->axisu*(light->sizeu*light->size);
+ float3 axisv = light->axisv*(light->sizev*light->size);
+
+ light_data[i*LIGHT_SIZE + 0] = make_float4(__int_as_float(light->type), co.x, co.y, co.z);
+ light_data[i*LIGHT_SIZE + 1] = make_float4(__int_as_float(shader_id), axisu.x, axisu.y, axisu.z);
+ light_data[i*LIGHT_SIZE + 2] = make_float4(0.0f, axisv.x, axisv.y, axisv.z);
+ light_data[i*LIGHT_SIZE + 3] = make_float4(0.0f, dir.x, dir.y, dir.z);
+ }
+ }
+
+ device->tex_alloc("__light_data", dscene->light_data);
+}
+
+void LightManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ if(!need_update)
+ return;
+
+ device_free(device, dscene);
+
+ device_update_points(device, dscene, scene);
+ if(progress.get_cancel()) return;
+
+ device_update_distribution(device, dscene, scene, progress);
+ if(progress.get_cancel()) return;
+
+ need_update = false;
+}
+
+void LightManager::device_free(Device *device, DeviceScene *dscene)
+{
+ device->tex_free(dscene->light_distribution);
+ device->tex_free(dscene->light_data);
+
+ dscene->light_distribution.clear();
+ dscene->light_data.clear();
+}
+
+void LightManager::tag_update(Scene *scene)
+{
+ need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h
new file mode 100644
index 00000000000..19cbcb55386
--- /dev/null
+++ b/intern/cycles/render/light.h
@@ -0,0 +1,76 @@
+/*
+ * 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 __LIGHT_H__
+#define __LIGHT_H__
+
+#include "kernel_types.h"
+
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class Progress;
+class Scene;
+
+class Light {
+public:
+ Light();
+
+ LightType type;
+ float3 co;
+
+ float3 dir;
+ float size;
+
+ float3 axisu;
+ float sizeu;
+ float3 axisv;
+ float sizev;
+
+ bool cast_shadow;
+
+ int shader;
+
+ void tag_update(Scene *scene);
+};
+
+class LightManager {
+public:
+ bool need_update;
+
+ LightManager();
+ ~LightManager();
+
+ void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ void tag_update(Scene *scene);
+
+protected:
+ void device_update_points(Device *device, DeviceScene *dscene, Scene *scene);
+ void device_update_distribution(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __LIGHT_H__ */
+
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
new file mode 100644
index 00000000000..19992771c1d
--- /dev/null
+++ b/intern/cycles/render/mesh.cpp
@@ -0,0 +1,756 @@
+/*
+ * 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 "bvh.h"
+#include "bvh_build.h"
+
+#include "device.h"
+#include "shader.h"
+#include "light.h"
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+
+#include "osl_globals.h"
+
+#include "util_cache.h"
+#include "util_foreach.h"
+#include "util_progress.h"
+#include "util_set.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Mesh */
+
+Mesh::Mesh()
+: attributes(this)
+{
+ need_update = true;
+ transform_applied = false;
+ transform_negative_scaled = false;
+ displacement_method = DISPLACE_BUMP;
+
+ bvh = NULL;
+
+ tri_offset = 0;
+ vert_offset = 0;
+}
+
+Mesh::~Mesh()
+{
+ delete bvh;
+}
+
+void Mesh::reserve(int numverts, int numtris)
+{
+ /* reserve space to add verts and triangles later */
+ verts.resize(numverts);
+ triangles.resize(numtris);
+ shader.resize(numtris);
+ smooth.resize(numtris);
+ attributes.reserve(numverts, numtris);
+}
+
+void Mesh::clear()
+{
+ /* clear all verts and triangles */
+ verts.clear();
+ triangles.clear();
+ shader.clear();
+ smooth.clear();
+
+ attributes.clear();
+ used_shaders.clear();
+
+ transform_applied = false;
+ transform_negative_scaled = false;
+}
+
+void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_)
+{
+ Triangle t;
+ t.v[0] = v0;
+ t.v[1] = v1;
+ t.v[2] = v2;
+
+ triangles.push_back(t);
+ shader.push_back(shader_);
+ smooth.push_back(smooth_);
+}
+
+void Mesh::compute_bounds()
+{
+ BoundBox bnds;
+ size_t verts_size = verts.size();
+
+ for(size_t i = 0; i < verts_size; i++)
+ bnds.grow(verts[i]);
+
+ /* happens mostly on empty meshes */
+ if(!bnds.valid())
+ bnds.grow(make_float3(0.0f, 0.0f, 0.0f));
+
+ bounds = bnds;
+}
+
+void Mesh::add_face_normals()
+{
+ /* don't compute if already there */
+ if(attributes.find(Attribute::STD_FACE_NORMAL))
+ return;
+
+ /* get attributes */
+ Attribute *attr_fN = attributes.add(Attribute::STD_FACE_NORMAL);
+ float3 *fN = attr_fN->data_float3();
+
+ /* compute face normals */
+ size_t triangles_size = triangles.size();
+ bool flip = transform_negative_scaled;
+
+ if(triangles_size) {
+ float3 *verts_ptr = &verts[0];
+ Triangle *triangles_ptr = &triangles[0];
+
+ for(size_t i = 0; i < triangles_size; i++) {
+ Triangle t = triangles_ptr[i];
+ float3 v0 = verts_ptr[t.v[0]];
+ float3 v1 = verts_ptr[t.v[1]];
+ float3 v2 = verts_ptr[t.v[2]];
+
+ fN[i] = normalize(cross(v1 - v0, v2 - v0));
+
+ if(flip)
+ fN[i] = -fN[i];
+ }
+ }
+}
+
+void Mesh::add_vertex_normals()
+{
+ /* don't compute if already there */
+ if(attributes.find(Attribute::STD_VERTEX_NORMAL))
+ return;
+
+ /* get attributes */
+ Attribute *attr_fN = attributes.find(Attribute::STD_FACE_NORMAL);
+ Attribute *attr_vN = attributes.add(Attribute::STD_VERTEX_NORMAL);
+
+ float3 *fN = attr_fN->data_float3();
+ float3 *vN = attr_vN->data_float3();
+
+ /* compute vertex normals */
+ memset(vN, 0, verts.size()*sizeof(float3));
+
+ size_t verts_size = verts.size();
+ size_t triangles_size = triangles.size();
+ bool flip = transform_negative_scaled;
+
+ if(triangles_size) {
+ Triangle *triangles_ptr = &triangles[0];
+
+ for(size_t i = 0; i < triangles_size; i++)
+ for(size_t j = 0; j < 3; j++)
+ vN[triangles_ptr[i].v[j]] += fN[i];
+ }
+
+ for(size_t i = 0; i < verts_size; i++) {
+ vN[i] = normalize(vN[i]);
+ if(flip)
+ vN[i] = -vN[i];
+ }
+}
+
+void Mesh::pack_normals(Scene *scene, float4 *normal, float4 *vnormal)
+{
+ Attribute *attr_fN = attributes.find(Attribute::STD_FACE_NORMAL);
+ Attribute *attr_vN = attributes.find(Attribute::STD_VERTEX_NORMAL);
+
+ float3 *fN = attr_fN->data_float3();
+ float3 *vN = attr_vN->data_float3();
+ int shader_id = 0;
+ uint last_shader = -1;
+ bool last_smooth = false;
+
+ size_t triangles_size = triangles.size();
+ uint *shader_ptr = (shader.size())? &shader[0]: NULL;
+
+ for(size_t i = 0; i < triangles_size; i++) {
+ normal[i].x = fN[i].x;
+ normal[i].y = fN[i].y;
+ normal[i].z = fN[i].z;
+
+ /* stuff shader id in here too */
+ if(shader_ptr[i] != last_shader || last_smooth != smooth[i]) {
+ last_shader = shader_ptr[i];
+ last_smooth = smooth[i];
+ shader_id = scene->shader_manager->get_shader_id(last_shader, this, last_smooth);
+ }
+
+ normal[i].w = __int_as_float(shader_id);
+ }
+
+ size_t verts_size = verts.size();
+
+ for(size_t i = 0; i < verts_size; i++)
+ vnormal[i] = make_float4(vN[i].x, vN[i].y, vN[i].z, 0.0f);
+}
+
+void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset)
+{
+ size_t verts_size = verts.size();
+
+ if(verts_size) {
+ float3 *verts_ptr = &verts[0];
+
+ for(size_t i = 0; i < verts_size; i++) {
+ float3 p = verts_ptr[i];
+ tri_verts[i] = make_float4(p.x, p.y, p.z, 0.0f);
+ }
+ }
+
+ size_t triangles_size = triangles.size();
+
+ if(triangles_size) {
+ Triangle *triangles_ptr = &triangles[0];
+
+ for(size_t i = 0; i < triangles_size; i++) {
+ Triangle t = triangles_ptr[i];
+
+ tri_vindex[i] = make_float4(
+ __int_as_float(t.v[0] + vert_offset),
+ __int_as_float(t.v[1] + vert_offset),
+ __int_as_float(t.v[2] + vert_offset),
+ 0);
+ }
+ }
+}
+
+void Mesh::compute_bvh(SceneParams *params, Progress& progress)
+{
+ Object object;
+ object.mesh = this;
+
+ vector<Object*> objects;
+ objects.push_back(&object);
+
+ if(bvh && !need_update_rebuild) {
+ progress.set_substatus("Refitting BVH");
+ bvh->objects = objects;
+ bvh->refit(progress);
+ }
+ else {
+ progress.set_substatus("Building BVH");
+
+ BVHParams bparams;
+ bparams.use_cache = params->use_bvh_cache;
+ bparams.use_spatial_split = params->use_bvh_spatial_split;
+ bparams.use_qbvh = params->use_qbvh;
+
+ delete bvh;
+ bvh = BVH::create(bparams, objects);
+ bvh->build(progress);
+ }
+}
+
+void Mesh::tag_update(Scene *scene, bool rebuild)
+{
+ need_update = true;
+ if(rebuild)
+ need_update_rebuild = 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 */
+
+MeshManager::MeshManager()
+{
+ bvh = NULL;
+ need_update = true;
+}
+
+MeshManager::~MeshManager()
+{
+ delete bvh;
+}
+
+void MeshManager::update_osl_attributes(Device *device, Scene *scene, vector<AttributeRequestSet>& mesh_attributes)
+{
+#ifdef WITH_OSL
+ /* for OSL, a hash map is used to lookup the attribute by name. */
+ OSLGlobals *og = (OSLGlobals*)device->osl_memory();
+
+ og->object_name_map.clear();
+ og->attribute_map.clear();
+
+ og->attribute_map.resize(scene->objects.size());
+
+ for(size_t i = 0; i < scene->objects.size(); i++) {
+ /* set object name to object index map */
+ Object *object = scene->objects[i];
+ og->object_name_map[object->name] = i;
+
+ /* set object attributes */
+ foreach(ParamValue& attr, object->attributes) {
+ OSLGlobals::Attribute osl_attr;
+
+ osl_attr.type = attr.type();
+ osl_attr.elem = ATTR_ELEMENT_VALUE;
+ osl_attr.value = attr;
+
+ og->attribute_map[i][attr.name()] = osl_attr;
+ }
+
+ /* find mesh attributes */
+ size_t j;
+
+ for(j = 0; j < scene->meshes.size(); j++)
+ if(scene->meshes[j] == object->mesh)
+ break;
+
+ AttributeRequestSet& attributes = mesh_attributes[j];
+
+ /* set object attributes */
+ foreach(AttributeRequest& req, attributes.requests) {
+ OSLGlobals::Attribute osl_attr;
+
+ osl_attr.elem = req.element;
+ osl_attr.offset = req.offset;
+
+ if(req.type == TypeDesc::TypeFloat)
+ osl_attr.type = TypeDesc::TypeFloat;
+ else
+ osl_attr.type = TypeDesc::TypeColor;
+
+ if(req.std != Attribute::STD_NONE) {
+ /* if standard attribute, add lookup by std:: name convention */
+ ustring stdname = ustring(string("std::") + Attribute::standard_name(req.std).c_str());
+ og->attribute_map[i][stdname] = osl_attr;
+ }
+ else if(req.name != ustring()) {
+ /* add lookup by mesh attribute name */
+ og->attribute_map[i][req.name] = osl_attr;
+ }
+ }
+ }
+#endif
+}
+
+void MeshManager::update_svm_attributes(Device *device, DeviceScene *dscene, Scene *scene, vector<AttributeRequestSet>& mesh_attributes)
+{
+ /* for SVM, the attributes_map table is used to lookup the offset of an
+ * attribute, based on a unique shader attribute id. */
+
+ /* compute array stride */
+ int attr_map_stride = 0;
+
+ for(size_t i = 0; i < scene->meshes.size(); i++)
+ attr_map_stride = max(attr_map_stride, mesh_attributes[i].size());
+
+ if(attr_map_stride == 0)
+ return;
+
+ /* create attribute map */
+ uint4 *attr_map = dscene->attributes_map.resize(attr_map_stride*scene->objects.size());
+ memset(attr_map, 0, dscene->attributes_map.size()*sizeof(uint));
+
+ for(size_t i = 0; i < scene->objects.size(); i++) {
+ Object *object = scene->objects[i];
+
+ /* find mesh attributes */
+ size_t j;
+
+ for(j = 0; j < scene->meshes.size(); j++)
+ if(scene->meshes[j] == object->mesh)
+ break;
+
+ AttributeRequestSet& attributes = mesh_attributes[j];
+
+ /* set object attributes */
+ j = 0;
+
+ foreach(AttributeRequest& req, attributes.requests) {
+ int index = i*attr_map_stride + j;
+ uint id;
+
+ if(req.std == Attribute::STD_NONE)
+ id = scene->shader_manager->get_attribute_id(req.name);
+ else
+ id = scene->shader_manager->get_attribute_id(req.std);
+
+ attr_map[index].x = id;
+ attr_map[index].y = req.element;
+ attr_map[index].z = req.offset;
+
+ if(req.type == TypeDesc::TypeFloat)
+ attr_map[index].w = NODE_ATTR_FLOAT;
+ else
+ attr_map[index].w = NODE_ATTR_FLOAT3;
+
+ j++;
+ }
+ }
+
+ /* copy to device */
+ dscene->data.bvh.attributes_map_stride = attr_map_stride;
+ device->tex_alloc("__attributes_map", dscene->attributes_map);
+}
+
+void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ progress.set_status("Updating Mesh", "Computing attributes");
+
+ /* gather per mesh requested attributes. as meshes may have multiple
+ * shaders assigned, this merges the requested attributes that have
+ * been set per shader by the shader manager */
+ vector<AttributeRequestSet> mesh_attributes(scene->meshes.size());
+
+ for(size_t i = 0; i < scene->meshes.size(); i++) {
+ Mesh *mesh = scene->meshes[i];
+
+ foreach(uint sindex, mesh->used_shaders) {
+ Shader *shader = scene->shaders[sindex];
+ mesh_attributes[i].add(shader->attributes);
+ }
+ }
+
+ /* mesh attribute are stored in a single array per data type. here we fill
+ * those arrays, and set the offset and element type to create attribute
+ * maps next */
+ vector<float> attr_float;
+ vector<float4> attr_float3;
+
+ for(size_t i = 0; i < scene->meshes.size(); i++) {
+ Mesh *mesh = scene->meshes[i];
+ AttributeRequestSet& attributes = mesh_attributes[i];
+
+ /* todo: we now store std and name attributes from requests even if
+ they actually refer to the same mesh attributes, optimize */
+ foreach(AttributeRequest& req, attributes.requests) {
+ Attribute *mattr = mesh->attributes.find(req);
+
+ /* todo: get rid of this exception */
+ if(!mattr && req.std == Attribute::STD_GENERATED) {
+ mattr = mesh->attributes.add(Attribute::STD_GENERATED);
+ if(mesh->verts.size())
+ memcpy(mattr->data_float3(), &mesh->verts[0], sizeof(float3)*mesh->verts.size());
+ }
+
+ /* attribute not found */
+ if(!mattr) {
+ req.element = ATTR_ELEMENT_NONE;
+ req.offset = 0;
+ continue;
+ }
+
+ /* we abuse AttributeRequest to pass on info like element and
+ offset, it doesn't really make sense but is convenient */
+
+ /* store element and type */
+ if(mattr->element == Attribute::VERTEX)
+ req.element = ATTR_ELEMENT_VERTEX;
+ else if(mattr->element == Attribute::FACE)
+ req.element = ATTR_ELEMENT_FACE;
+ else if(mattr->element == Attribute::CORNER)
+ req.element = ATTR_ELEMENT_CORNER;
+
+ req.type = mattr->type;
+
+ /* store attribute data in arrays */
+ size_t size = mattr->element_size(mesh->verts.size(), mesh->triangles.size());
+
+ if(mattr->type == TypeDesc::TypeFloat) {
+ float *data = mattr->data_float();
+ req.offset = attr_float.size();
+
+ for(size_t k = 0; k < size; k++)
+ attr_float.push_back(data[k]);
+ }
+ else {
+ float3 *data = mattr->data_float3();
+ req.offset = attr_float3.size();
+
+ for(size_t k = 0; k < size; k++) {
+ float3 f3 = data[k];
+ float4 f4 = make_float4(f3.x, f3.y, f3.z, 0.0f);
+
+ attr_float3.push_back(f4);
+ }
+ }
+
+ /* mesh vertex/triangle index is global, not per object, so we sneak
+ a correction for that in here */
+ if(req.element == ATTR_ELEMENT_VERTEX)
+ req.offset -= mesh->vert_offset;
+ else if(mattr->element == Attribute::FACE)
+ req.offset -= mesh->tri_offset;
+ else if(mattr->element == Attribute::CORNER)
+ req.offset -= 3*mesh->tri_offset;
+
+ if(progress.get_cancel()) return;
+ }
+ }
+
+ /* create attribute lookup maps */
+ if(scene->params.shadingsystem == SceneParams::OSL)
+ update_osl_attributes(device, scene, mesh_attributes);
+ else
+ update_svm_attributes(device, dscene, scene, mesh_attributes);
+
+ if(progress.get_cancel()) return;
+
+ /* copy to device */
+ progress.set_status("Updating Mesh", "Copying Attributes to device");
+
+ if(attr_float.size()) {
+ dscene->attributes_float.copy(&attr_float[0], attr_float.size());
+ device->tex_alloc("__attributes_float", dscene->attributes_float);
+ }
+ if(attr_float3.size()) {
+ dscene->attributes_float3.copy(&attr_float3[0], attr_float3.size());
+ device->tex_alloc("__attributes_float3", dscene->attributes_float3);
+ }
+}
+
+void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ /* count and update offsets */
+ size_t vert_size = 0;
+ size_t tri_size = 0;
+
+ foreach(Mesh *mesh, scene->meshes) {
+ mesh->vert_offset = vert_size;
+ mesh->tri_offset = tri_size;
+
+ vert_size += mesh->verts.size();
+ tri_size += mesh->triangles.size();
+ }
+
+ if(tri_size == 0)
+ return;
+
+ /* normals */
+ progress.set_status("Updating Mesh", "Computing normals");
+
+ float4 *normal = dscene->tri_normal.resize(tri_size);
+ float4 *vnormal = dscene->tri_vnormal.resize(vert_size);
+ float4 *tri_verts = dscene->tri_verts.resize(vert_size);
+ float4 *tri_vindex = dscene->tri_vindex.resize(tri_size);
+
+ foreach(Mesh *mesh, scene->meshes) {
+ mesh->pack_normals(scene, &normal[mesh->tri_offset], &vnormal[mesh->vert_offset]);
+ mesh->pack_verts(&tri_verts[mesh->vert_offset], &tri_vindex[mesh->tri_offset], mesh->vert_offset);
+
+ if(progress.get_cancel()) return;
+ }
+
+ /* vertex coordinates */
+ progress.set_status("Updating Mesh", "Copying Mesh to device");
+
+ device->tex_alloc("__tri_normal", dscene->tri_normal);
+ device->tex_alloc("__tri_vnormal", dscene->tri_vnormal);
+ device->tex_alloc("__tri_verts", dscene->tri_verts);
+ device->tex_alloc("__tri_vindex", dscene->tri_vindex);
+}
+
+void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ /* bvh build */
+ progress.set_status("Updating Scene BVH", "Building");
+
+ BVHParams bparams;
+ bparams.top_level = true;
+ bparams.use_qbvh = scene->params.use_qbvh;
+ bparams.use_spatial_split = scene->params.use_bvh_spatial_split;
+
+ delete bvh;
+ bvh = BVH::create(bparams, scene->objects);
+ bvh->build(progress);
+
+ if(progress.get_cancel()) return;
+
+ /* copy to device */
+ progress.set_status("Updating Scene BVH", "Copying BVH to device");
+
+ PackedBVH& pack = bvh->pack;
+
+ if(pack.nodes.size()) {
+ dscene->bvh_nodes.reference((float4*)&pack.nodes[0], pack.nodes.size());
+ device->tex_alloc("__bvh_nodes", dscene->bvh_nodes);
+ }
+ if(pack.object_node.size()) {
+ dscene->object_node.reference((uint*)&pack.object_node[0], pack.object_node.size());
+ device->tex_alloc("__object_node", dscene->object_node);
+ }
+ if(pack.tri_woop.size()) {
+ dscene->tri_woop.reference(&pack.tri_woop[0], pack.tri_woop.size());
+ device->tex_alloc("__tri_woop", dscene->tri_woop);
+ }
+ if(pack.prim_visibility.size()) {
+ dscene->prim_visibility.reference((uint*)&pack.prim_visibility[0], pack.prim_visibility.size());
+ device->tex_alloc("__prim_visibility", dscene->prim_visibility);
+ }
+ if(pack.prim_index.size()) {
+ dscene->prim_index.reference((uint*)&pack.prim_index[0], pack.prim_index.size());
+ device->tex_alloc("__prim_index", dscene->prim_index);
+ }
+ if(pack.prim_object.size()) {
+ dscene->prim_object.reference((uint*)&pack.prim_object[0], pack.prim_object.size());
+ device->tex_alloc("__prim_object", dscene->prim_object);
+ }
+
+ dscene->data.bvh.root = pack.root_index;
+}
+
+void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ if(!need_update)
+ return;
+
+ /* update normals */
+ foreach(Mesh *mesh, scene->meshes) {
+ foreach(uint shader, mesh->used_shaders)
+ if(scene->shaders[shader]->need_update_attributes)
+ mesh->need_update = true;
+
+ if(mesh->need_update) {
+ mesh->add_face_normals();
+ mesh->add_vertex_normals();
+
+ if(progress.get_cancel()) return;
+ }
+ }
+
+ /* device update */
+ device_free(device, dscene);
+
+ device_update_mesh(device, dscene, scene, progress);
+ if(progress.get_cancel()) return;
+
+ device_update_attributes(device, dscene, scene, progress);
+ if(progress.get_cancel()) return;
+
+ /* update displacement */
+ bool displacement_done = false;
+
+ foreach(Mesh *mesh, scene->meshes)
+ if(mesh->need_update && displace(device, scene, mesh, progress))
+ displacement_done = true;
+
+ /* todo: properly handle cancel halfway displacement */
+ if(progress.get_cancel()) return;
+
+ /* device re-update after displacement */
+ if(displacement_done) {
+ device_free(device, dscene);
+
+ device_update_mesh(device, dscene, scene, progress);
+ if(progress.get_cancel()) return;
+
+ device_update_attributes(device, dscene, scene, progress);
+ if(progress.get_cancel()) return;
+ }
+
+ /* update bvh */
+ size_t i = 0, num_instance_bvh = 0;
+
+ foreach(Mesh *mesh, scene->meshes)
+ if(mesh->need_update && !mesh->transform_applied)
+ num_instance_bvh++;
+
+ foreach(Mesh *mesh, scene->meshes) {
+ if(mesh->need_update) {
+ mesh->compute_bounds();
+
+ if(!mesh->transform_applied) {
+ string msg = "Updating Mesh BVH ";
+ if(mesh->name == "")
+ msg += string_printf("%ld/%ld", i+1, num_instance_bvh);
+ else
+ msg += string_printf("%s %ld/%ld", mesh->name.c_str(), i+1, num_instance_bvh);
+ progress.set_status(msg, "Building BVH");
+
+ mesh->compute_bvh(&scene->params, progress);
+ }
+
+ if(progress.get_cancel()) return;
+
+ mesh->need_update = false;
+ mesh->need_update_rebuild = false;
+ }
+
+ i++;
+ }
+
+ foreach(Shader *shader, scene->shaders)
+ shader->need_update_attributes = false;
+
+ foreach(Object *object, scene->objects)
+ object->compute_bounds();
+
+ if(progress.get_cancel()) return;
+
+ device_update_bvh(device, dscene, scene, progress);
+
+ need_update = false;
+}
+
+void MeshManager::device_free(Device *device, DeviceScene *dscene)
+{
+ device->tex_free(dscene->bvh_nodes);
+ device->tex_free(dscene->object_node);
+ device->tex_free(dscene->tri_woop);
+ device->tex_free(dscene->prim_visibility);
+ device->tex_free(dscene->prim_index);
+ device->tex_free(dscene->prim_object);
+ device->tex_free(dscene->tri_normal);
+ device->tex_free(dscene->tri_vnormal);
+ device->tex_free(dscene->tri_vindex);
+ device->tex_free(dscene->tri_verts);
+ device->tex_free(dscene->attributes_map);
+ device->tex_free(dscene->attributes_float);
+ device->tex_free(dscene->attributes_float3);
+
+ dscene->bvh_nodes.clear();
+ dscene->object_node.clear();
+ dscene->tri_woop.clear();
+ dscene->prim_visibility.clear();
+ dscene->prim_index.clear();
+ dscene->prim_object.clear();
+ dscene->tri_normal.clear();
+ dscene->tri_vnormal.clear();
+ dscene->tri_vindex.clear();
+ dscene->tri_verts.clear();
+ dscene->attributes_map.clear();
+ dscene->attributes_float.clear();
+ dscene->attributes_float3.clear();
+}
+
+void MeshManager::tag_update(Scene *scene)
+{
+ need_update = true;
+ scene->object_manager->need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
new file mode 100644
index 00000000000..585203484c7
--- /dev/null
+++ b/intern/cycles/render/mesh.h
@@ -0,0 +1,134 @@
+/*
+ * 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 __MESH_H__
+#define __MESH_H__
+
+#include "attribute.h"
+#include "shader.h"
+
+#include "util_boundbox.h"
+#include "util_list.h"
+#include "util_map.h"
+#include "util_param.h"
+#include "util_transform.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class BVH;
+class Device;
+class DeviceScene;
+class Mesh;
+class Progress;
+class Scene;
+class SceneParams;
+class AttributeRequest;
+
+/* Mesh */
+
+class Mesh {
+public:
+ /* Mesh Triangle */
+ struct Triangle {
+ int v[3];
+ };
+
+ /* Displacement */
+ enum DisplacementMethod {
+ DISPLACE_BUMP,
+ DISPLACE_TRUE,
+ DISPLACE_BOTH
+ };
+
+ ustring name;
+
+ /* Mesh Data */
+ vector<float3> verts;
+ vector<Triangle> triangles;
+ vector<uint> shader;
+ vector<bool> smooth;
+
+ vector<uint> used_shaders;
+ AttributeSet attributes;
+
+ BoundBox bounds;
+ bool transform_applied;
+ bool transform_negative_scaled;
+ DisplacementMethod displacement_method;
+
+ /* Update Flags */
+ bool need_update;
+ bool need_update_rebuild;
+
+ /* BVH */
+ BVH *bvh;
+ size_t tri_offset;
+ size_t vert_offset;
+
+ /* Functions */
+ Mesh();
+ ~Mesh();
+
+ void reserve(int numverts, int numfaces);
+ void clear();
+ void add_triangle(int v0, int v1, int v2, int shader, bool smooth);
+
+ void compute_bounds();
+ void add_face_normals();
+ void add_vertex_normals();
+
+ void pack_normals(Scene *scene, float4 *normal, float4 *vnormal);
+ void pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset);
+ void compute_bvh(SceneParams *params, Progress& progress);
+
+ void tag_update(Scene *scene, bool rebuild);
+};
+
+/* Mesh Manager */
+
+class MeshManager {
+public:
+ BVH *bvh;
+
+ bool need_update;
+
+ MeshManager();
+ ~MeshManager();
+
+ bool displace(Device *device, Scene *scene, Mesh *mesh, Progress& progress);
+
+ /* attributes */
+ void update_osl_attributes(Device *device, Scene *scene, vector<AttributeRequestSet>& mesh_attributes);
+ void update_svm_attributes(Device *device, DeviceScene *dscene, Scene *scene, vector<AttributeRequestSet>& mesh_attributes);
+
+ void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_update_object(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_update_mesh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_update_attributes(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_update_bvh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ void tag_update(Scene *scene);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __MESH_H__ */
+
diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp
new file mode 100644
index 00000000000..e86bea59ec1
--- /dev/null
+++ b/intern/cycles/render/mesh_displace.cpp
@@ -0,0 +1,153 @@
+/*
+ * 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 "device.h"
+
+#include "mesh.h"
+#include "scene.h"
+#include "shader.h"
+
+#include "util_foreach.h"
+#include "util_progress.h"
+
+CCL_NAMESPACE_BEGIN
+
+bool MeshManager::displace(Device *device, Scene *scene, Mesh *mesh, Progress& progress)
+{
+ /* verify if we have a displacement shader */
+ bool has_displacement = false;
+
+ if(mesh->displacement_method != Mesh::DISPLACE_BUMP) {
+ foreach(uint sindex, mesh->used_shaders)
+ if(scene->shaders[sindex]->has_displacement)
+ has_displacement = true;
+ }
+
+ if(!has_displacement)
+ return false;
+
+ /* setup input for device task */
+ vector<bool> done(mesh->verts.size(), false);
+ device_vector<uint4> d_input;
+ uint4 *d_input_data = d_input.resize(mesh->verts.size());
+ size_t d_input_offset = 0;
+
+ for(size_t i = 0; i < mesh->triangles.size(); i++) {
+ Mesh::Triangle t = mesh->triangles[i];
+ Shader *shader = scene->shaders[mesh->shader[i]];
+
+ if(!shader->has_displacement)
+ continue;
+
+ for(int j = 0; j < 3; j++) {
+ if(done[t.v[j]])
+ continue;
+
+ done[t.v[j]] = true;
+
+ /* set up object, primitive and barycentric coordinates */
+ /* when used, non-instanced convention: object = -object-1; */
+ int object = ~0; /* todo */
+ int prim = mesh->tri_offset + i;
+ float u, v;
+
+ if(j == 0) {
+ u = 1.0f;
+ v = 0.0f;
+ }
+ else if(j == 1) {
+ u = 0.0f;
+ v = 1.0f;
+ }
+ else {
+ u = 0.0f;
+ v = 0.0f;
+ }
+
+ /* back */
+ uint4 in = make_uint4(object, prim, __float_as_int(u), __float_as_int(v));
+ d_input_data[d_input_offset++] = in;
+ }
+ }
+
+ if(d_input_offset == 0)
+ return false;
+
+ /* run device task */
+ device_vector<float3> d_offset;
+ d_offset.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);
+
+ 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();
+
+ device->task_add(task);
+ device->task_wait();
+
+ device->mem_copy_from(d_offset, 0, sizeof(float3)*d_offset.size());
+ device->mem_free(d_input);
+ device->mem_free(d_offset);
+
+ if(progress.get_cancel())
+ return false;
+
+ /* read result */
+ done.clear();
+ done.resize(mesh->verts.size(), false);
+ int k = 0;
+
+ float3 *offset = (float3*)d_offset.data_pointer;
+
+ for(size_t i = 0; i < mesh->triangles.size(); i++) {
+ Mesh::Triangle t = mesh->triangles[i];
+ Shader *shader = scene->shaders[mesh->shader[i]];
+
+ if(!shader->has_displacement)
+ continue;
+
+ for(int j = 0; j < 3; j++) {
+ if(!done[t.v[j]]) {
+ done[t.v[j]] = true;
+ mesh->verts[t.v[j]] += offset[k++];
+ }
+ }
+ }
+
+ /* for displacement method both, we only need to recompute the face
+ * normals, as bump mapping in the shader will already alter the
+ * vertex normal, so we start from the non-displaced vertex normals
+ * to avoid applying the perturbation twice. */
+ mesh->attributes.remove(Attribute::STD_FACE_NORMAL);
+ mesh->add_face_normals();
+
+ if(mesh->displacement_method == Mesh::DISPLACE_TRUE) {
+ mesh->attributes.remove(Attribute::STD_VERTEX_NORMAL);
+ mesh->add_vertex_normals();
+ }
+
+ return true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
new file mode 100644
index 00000000000..f934b703103
--- /dev/null
+++ b/intern/cycles/render/nodes.cpp
@@ -0,0 +1,1938 @@
+/*
+ * 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 "image.h"
+#include "nodes.h"
+#include "svm.h"
+#include "osl.h"
+
+#include "util_transform.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Texture Mapping */
+
+TextureMapping::TextureMapping()
+{
+ translation = make_float3(0.0f, 0.0f, 0.0f);
+ rotation = make_float3(0.0f, 0.0f, 0.0f);
+ scale = make_float3(1.0f, 1.0f, 1.0f);
+
+ x_mapping = X;
+ y_mapping = Y;
+ z_mapping = Z;
+
+ projection = FLAT;
+}
+
+Transform TextureMapping::compute_transform()
+{
+ Transform mmat = transform_scale(make_float3(0.0f, 0.0f, 0.0f));
+
+ if(x_mapping != NONE)
+ mmat[0][x_mapping-1] = 1.0f;
+ if(y_mapping != NONE)
+ mmat[1][y_mapping-1] = 1.0f;
+ if(z_mapping != NONE)
+ mmat[2][z_mapping-1] = 1.0f;
+
+ Transform smat = transform_scale(scale);
+ Transform rmat = transform_euler(rotation);
+ Transform tmat = transform_translate(translation);
+
+ return tmat*rmat*smat*mmat;
+}
+
+bool TextureMapping::skip()
+{
+ if(translation != make_float3(0.0f, 0.0f, 0.0f))
+ return false;
+ if(rotation != make_float3(0.0f, 0.0f, 0.0f))
+ return false;
+ if(scale != make_float3(1.0f, 1.0f, 1.0f))
+ return false;
+
+ if(x_mapping != X || y_mapping != Y || z_mapping != Z)
+ return false;
+
+ return true;
+}
+
+void TextureMapping::compile(SVMCompiler& compiler, int offset_in, int offset_out)
+{
+ if(offset_in == SVM_STACK_INVALID || offset_out == SVM_STACK_INVALID)
+ return;
+
+ compiler.add_node(NODE_MAPPING, offset_in, offset_out);
+
+ Transform tfm = compute_transform();
+ compiler.add_node(tfm.x);
+ compiler.add_node(tfm.y);
+ compiler.add_node(tfm.z);
+ compiler.add_node(tfm.w);
+}
+
+/* Image Texture */
+
+static ShaderEnum color_space_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Linear", 0);
+ enm.insert("sRGB", 1);
+
+ return enm;
+}
+
+ShaderEnum ImageTextureNode::color_space_enum = color_space_init();
+
+ImageTextureNode::ImageTextureNode()
+: TextureNode("image_texture")
+{
+ image_manager = NULL;
+ slot = -1;
+ filename = "";
+ color_space = ustring("sRGB");
+
+ add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_UV);
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Alpha", SHADER_SOCKET_FLOAT);
+}
+
+ImageTextureNode::~ImageTextureNode()
+{
+ if(image_manager)
+ image_manager->remove_image(filename);
+}
+
+ShaderNode *ImageTextureNode::clone() const
+{
+ ImageTextureNode *node = new ImageTextureNode(*this);
+ node->image_manager = NULL;
+ node->slot = -1;
+ return node;
+}
+
+void ImageTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *alpha_out = output("Alpha");
+
+ image_manager = compiler.image_manager;
+ if(slot == -1)
+ slot = image_manager->add_image(filename);
+
+ if(!color_out->links.empty())
+ compiler.stack_assign(color_out);
+ if(!alpha_out->links.empty())
+ compiler.stack_assign(alpha_out);
+
+ if(slot != -1) {
+ compiler.stack_assign(vector_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ compiler.add_node(NODE_TEX_IMAGE,
+ slot,
+ compiler.encode_uchar4(
+ vector_in->stack_offset,
+ color_out->stack_offset,
+ alpha_out->stack_offset,
+ color_space_enum[color_space]));
+ }
+ else {
+ /* image not found */
+ if(!color_out->links.empty()) {
+ compiler.add_node(NODE_VALUE_V, color_out->stack_offset);
+ compiler.add_node(NODE_VALUE_V, make_float3(0, 0, 0));
+ }
+ if(!alpha_out->links.empty())
+ compiler.add_node(NODE_VALUE_F, __float_as_int(0.0f), alpha_out->stack_offset);
+ }
+}
+
+void ImageTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("filename", filename.c_str());
+ compiler.parameter("color_space", color_space.c_str());
+ compiler.add(this, "node_image_texture");
+}
+
+/* Environment Texture */
+
+ShaderEnum EnvironmentTextureNode::color_space_enum = color_space_init();
+
+EnvironmentTextureNode::EnvironmentTextureNode()
+: TextureNode("environment_texture")
+{
+ image_manager = NULL;
+ slot = -1;
+ filename = "";
+ color_space = ustring("sRGB");
+
+ add_input("Vector", SHADER_SOCKET_VECTOR, ShaderInput::POSITION);
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Alpha", SHADER_SOCKET_FLOAT);
+}
+
+EnvironmentTextureNode::~EnvironmentTextureNode()
+{
+ if(image_manager)
+ image_manager->remove_image(filename);
+}
+
+ShaderNode *EnvironmentTextureNode::clone() const
+{
+ EnvironmentTextureNode *node = new EnvironmentTextureNode(*this);
+ node->image_manager = NULL;
+ node->slot = -1;
+ return node;
+}
+
+void EnvironmentTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *alpha_out = output("Alpha");
+
+ image_manager = compiler.image_manager;
+ if(slot == -1)
+ slot = image_manager->add_image(filename);
+
+ if(!color_out->links.empty())
+ compiler.stack_assign(color_out);
+ if(!alpha_out->links.empty())
+ compiler.stack_assign(alpha_out);
+
+ if(slot != -1) {
+ compiler.stack_assign(vector_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ compiler.add_node(NODE_TEX_ENVIRONMENT,
+ slot,
+ compiler.encode_uchar4(
+ vector_in->stack_offset,
+ color_out->stack_offset,
+ alpha_out->stack_offset,
+ color_space_enum[color_space]));
+ }
+ else {
+ /* image not found */
+ if(!color_out->links.empty()) {
+ compiler.add_node(NODE_VALUE_V, color_out->stack_offset);
+ compiler.add_node(NODE_VALUE_V, make_float3(0, 0, 0));
+ }
+ if(!alpha_out->links.empty())
+ compiler.add_node(NODE_VALUE_F, __float_as_int(0.0f), alpha_out->stack_offset);
+ }
+}
+
+void EnvironmentTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("filename", filename.c_str());
+ compiler.parameter("color_space", color_space.c_str());
+ compiler.add(this, "node_environment_texture");
+}
+
+/* Sky Texture */
+
+static float2 sky_spherical_coordinates(float3 dir)
+{
+ return make_float2(acosf(dir.z), atan2f(dir.x, dir.y));
+}
+
+static float sky_perez_function(float lam[6], float theta, float gamma)
+{
+ return (1.f + lam[0]*expf(lam[1]/cosf(theta))) * (1.f + lam[2]*expf(lam[3]*gamma) + lam[4]*cosf(gamma)*cosf(gamma));
+}
+
+static void sky_texture_precompute(KernelSunSky *ksunsky, float3 dir, float turbidity)
+{
+ float2 spherical = sky_spherical_coordinates(dir);
+ float theta = spherical.x;
+ float phi = spherical.y;
+
+ ksunsky->theta = theta;
+ ksunsky->phi = phi;
+ ksunsky->dir = dir;
+
+ float theta2 = theta*theta;
+ float theta3 = theta*theta*theta;
+ float T = turbidity;
+ float T2 = T * T;
+
+ float chi = (4.0f / 9.0f - T / 120.0f) * (M_PI_F - 2.0f * theta);
+ ksunsky->zenith_Y = (4.0453f * T - 4.9710f) * tan(chi) - 0.2155f * T + 2.4192f;
+ ksunsky->zenith_Y *= 0.06f;
+
+ ksunsky->zenith_x =
+ (0.00166f * theta3 - 0.00375f * theta2 + 0.00209f * theta) * T2 +
+ (-0.02903f * theta3 + 0.06377f * theta2 - 0.03202f * theta + 0.00394f) * T +
+ (0.11693f * theta3 - 0.21196f * theta2 + 0.06052f * theta + 0.25886f);
+
+ ksunsky->zenith_y =
+ (0.00275f * theta3 - 0.00610f * theta2 + 0.00317f * theta) * T2 +
+ (-0.04214f * theta3 + 0.08970f * theta2 - 0.04153f * theta + 0.00516f) * T +
+ (0.15346f * theta3 - 0.26756f * theta2 + 0.06670f * theta + 0.26688f);
+
+ ksunsky->perez_Y[0] = (0.1787f * T - 1.4630f);
+ ksunsky->perez_Y[1] = (-0.3554f * T + 0.4275f);
+ ksunsky->perez_Y[2] = (-0.0227f * T + 5.3251f);
+ ksunsky->perez_Y[3] = (0.1206f * T - 2.5771f);
+ ksunsky->perez_Y[4] = (-0.0670f * T + 0.3703f);
+
+ ksunsky->perez_x[0] = (-0.0193f * T - 0.2592f);
+ ksunsky->perez_x[1] = (-0.0665f * T + 0.0008f);
+ ksunsky->perez_x[2] = (-0.0004f * T + 0.2125f);
+ ksunsky->perez_x[3] = (-0.0641f * T - 0.8989f);
+ ksunsky->perez_x[4] = (-0.0033f * T + 0.0452f);
+
+ ksunsky->perez_y[0] = (-0.0167f * T - 0.2608f);
+ ksunsky->perez_y[1] = (-0.0950f * T + 0.0092f);
+ ksunsky->perez_y[2] = (-0.0079f * T + 0.2102f);
+ ksunsky->perez_y[3] = (-0.0441f * T - 1.6537f);
+ ksunsky->perez_y[4] = (-0.0109f * T + 0.0529f);
+
+ ksunsky->zenith_Y /= sky_perez_function(ksunsky->perez_Y, 0, theta);
+ ksunsky->zenith_x /= sky_perez_function(ksunsky->perez_x, 0, theta);
+ ksunsky->zenith_y /= sky_perez_function(ksunsky->perez_y, 0, theta);
+}
+
+SkyTextureNode::SkyTextureNode()
+: TextureNode("sky_texture")
+{
+ sun_direction = make_float3(0.0f, 0.0f, 1.0f);
+ turbidity = 2.2f;
+
+ add_input("Vector", SHADER_SOCKET_VECTOR, ShaderInput::POSITION);
+ add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void SkyTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *color_out = output("Color");
+
+ if(compiler.sunsky) {
+ sky_texture_precompute(compiler.sunsky, sun_direction, turbidity);
+ compiler.sunsky = NULL;
+ }
+
+ if(vector_in->link)
+ compiler.stack_assign(vector_in);
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ compiler.stack_assign(color_out);
+ compiler.add_node(NODE_TEX_SKY, vector_in->stack_offset, color_out->stack_offset);
+}
+
+void SkyTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter_vector("sun_direction", sun_direction);
+ compiler.parameter("turbidity", turbidity);
+ compiler.add(this, "node_sky_texture");
+}
+
+/* Gradient Texture */
+
+static ShaderEnum gradient_type_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Linear", NODE_BLEND_LINEAR);
+ enm.insert("Quadratic", NODE_BLEND_QUADRATIC);
+ enm.insert("Easing", NODE_BLEND_EASING);
+ enm.insert("Diagonal", NODE_BLEND_DIAGONAL);
+ enm.insert("Radial", NODE_BLEND_RADIAL);
+ enm.insert("Quadratic Sphere", NODE_BLEND_QUADRATIC_SPHERE);
+ enm.insert("Spherical", NODE_BLEND_SPHERICAL);
+
+ return enm;
+}
+
+ShaderEnum GradientTextureNode::type_enum = gradient_type_init();
+
+GradientTextureNode::GradientTextureNode()
+: TextureNode("gradient_texture")
+{
+ type = ustring("Linear");
+
+ add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_GENERATED);
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+}
+
+void GradientTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *fac_out = output("Fac");
+
+ if(vector_in->link) compiler.stack_assign(vector_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ if(!fac_out->links.empty())
+ compiler.stack_assign(fac_out);
+ if(!color_out->links.empty())
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_TEX_GRADIENT,
+ compiler.encode_uchar4(type_enum[type], vector_in->stack_offset, fac_out->stack_offset, color_out->stack_offset));
+}
+
+void GradientTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("Type", type);
+ compiler.add(this, "node_gradient_texture");
+}
+
+/* Noise Texture */
+
+NoiseTextureNode::NoiseTextureNode()
+: TextureNode("noise_texture")
+{
+ add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_GENERATED);
+ add_input("Scale", SHADER_SOCKET_FLOAT, 1.0f);
+ add_input("Detail", SHADER_SOCKET_FLOAT, 2.0f);
+ add_input("Distortion", SHADER_SOCKET_FLOAT, 0.0f);
+
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+}
+
+void NoiseTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *distortion_in = input("Distortion");
+ ShaderInput *detail_in = input("Detail");
+ ShaderInput *scale_in = input("Scale");
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *fac_out = output("Fac");
+
+ if(vector_in->link) compiler.stack_assign(vector_in);
+ if(scale_in->link) compiler.stack_assign(scale_in);
+ if(detail_in->link) compiler.stack_assign(detail_in);
+ if(distortion_in->link) compiler.stack_assign(distortion_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ if(!fac_out->links.empty())
+ compiler.stack_assign(fac_out);
+ if(!color_out->links.empty())
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_TEX_NOISE,
+ compiler.encode_uchar4(vector_in->stack_offset, scale_in->stack_offset, detail_in->stack_offset, distortion_in->stack_offset),
+ compiler.encode_uchar4(color_out->stack_offset, fac_out->stack_offset));
+ compiler.add_node(
+ __float_as_int(scale_in->value.x),
+ __float_as_int(detail_in->value.x),
+ __float_as_int(distortion_in->value.x));
+}
+
+void NoiseTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_noise_texture");
+}
+
+/* Voronoi Texture */
+
+static ShaderEnum voronoi_coloring_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Intensity", NODE_VORONOI_INTENSITY);
+ enm.insert("Cells", NODE_VORONOI_CELLS);
+
+ return enm;
+}
+
+ShaderEnum VoronoiTextureNode::coloring_enum = voronoi_coloring_init();
+
+VoronoiTextureNode::VoronoiTextureNode()
+: TextureNode("voronoi_texture")
+{
+ coloring = ustring("Intensity");
+
+ add_input("Scale", SHADER_SOCKET_FLOAT, 1.0f);
+ add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_GENERATED);
+
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+}
+
+void VoronoiTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *scale_in = input("Scale");
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *fac_out = output("Fac");
+
+ if(vector_in->link) compiler.stack_assign(vector_in);
+ if(scale_in->link) compiler.stack_assign(scale_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ compiler.stack_assign(color_out);
+ compiler.stack_assign(fac_out);
+
+ compiler.add_node(NODE_TEX_VORONOI,
+ coloring_enum[coloring],
+ compiler.encode_uchar4(scale_in->stack_offset, vector_in->stack_offset, fac_out->stack_offset, color_out->stack_offset),
+ __float_as_int(scale_in->value.x));
+}
+
+void VoronoiTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("Coloring", coloring);
+ compiler.add(this, "node_voronoi_texture");
+}
+
+/* Musgrave Texture */
+
+static ShaderEnum musgrave_type_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Multifractal", NODE_MUSGRAVE_MULTIFRACTAL);
+ enm.insert("fBM", NODE_MUSGRAVE_FBM);
+ enm.insert("Hybrid Multifractal", NODE_MUSGRAVE_HYBRID_MULTIFRACTAL);
+ enm.insert("Ridged Multifractal", NODE_MUSGRAVE_RIDGED_MULTIFRACTAL);
+ enm.insert("Hetero Terrain", NODE_MUSGRAVE_HETERO_TERRAIN);
+
+ return enm;
+}
+
+ShaderEnum MusgraveTextureNode::type_enum = musgrave_type_init();
+
+MusgraveTextureNode::MusgraveTextureNode()
+: TextureNode("musgrave_texture")
+{
+ type = ustring("fBM");
+
+ add_input("Scale", SHADER_SOCKET_FLOAT, 1.0f);
+ add_input("Detail", SHADER_SOCKET_FLOAT, 2.0f);
+ add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_GENERATED);
+ add_input("Dimension", SHADER_SOCKET_FLOAT, 2.0f);
+ add_input("Lacunarity", SHADER_SOCKET_FLOAT, 1.0f);
+ add_input("Offset", SHADER_SOCKET_FLOAT, 0.0f);
+ add_input("Gain", SHADER_SOCKET_FLOAT, 1.0f);
+
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+ add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void MusgraveTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector_in = input("Vector");
+ ShaderInput *scale_in = input("Scale");
+ ShaderInput *dimension_in = input("Dimension");
+ ShaderInput *lacunarity_in = input("Lacunarity");
+ ShaderInput *detail_in = input("Detail");
+ ShaderInput *offset_in = input("Offset");
+ ShaderInput *gain_in = input("Gain");
+ ShaderOutput *fac_out = output("Fac");
+ ShaderOutput *color_out = output("Color");
+
+ if(vector_in->link) compiler.stack_assign(vector_in);
+ if(dimension_in->link) compiler.stack_assign(dimension_in);
+ if(lacunarity_in->link) compiler.stack_assign(lacunarity_in);
+ if(detail_in->link) compiler.stack_assign(detail_in);
+ if(offset_in->link) compiler.stack_assign(offset_in);
+ if(gain_in->link) compiler.stack_assign(gain_in);
+ if(scale_in->link) compiler.stack_assign(scale_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ if(!fac_out->links.empty())
+ compiler.stack_assign(fac_out);
+ if(!color_out->links.empty())
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_TEX_MUSGRAVE,
+ compiler.encode_uchar4(type_enum[type], vector_in->stack_offset, color_out->stack_offset, fac_out->stack_offset),
+ compiler.encode_uchar4(dimension_in->stack_offset, lacunarity_in->stack_offset, detail_in->stack_offset, offset_in->stack_offset),
+ compiler.encode_uchar4(gain_in->stack_offset, scale_in->stack_offset));
+ compiler.add_node(__float_as_int(dimension_in->value.x),
+ __float_as_int(lacunarity_in->value.x),
+ __float_as_int(detail_in->value.x),
+ __float_as_int(offset_in->value.x));
+ compiler.add_node(__float_as_int(gain_in->value.x),
+ __float_as_int(scale_in->value.x));
+}
+
+void MusgraveTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("Type", type);
+
+ compiler.add(this, "node_musgrave_texture");
+}
+
+/* Wave Texture */
+
+static ShaderEnum wave_type_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Bands", NODE_WAVE_BANDS);
+ enm.insert("Rings", NODE_WAVE_RINGS);
+
+ return enm;
+}
+
+ShaderEnum WaveTextureNode::type_enum = wave_type_init();
+
+WaveTextureNode::WaveTextureNode()
+: TextureNode("marble_texture")
+{
+ type = ustring("Bands");
+
+ add_input("Scale", SHADER_SOCKET_FLOAT, 1.0f);
+ add_input("Distortion", SHADER_SOCKET_FLOAT, 0.0f);
+ add_input("Detail", SHADER_SOCKET_FLOAT, 2.0f);
+ add_input("Detail Scale", SHADER_SOCKET_FLOAT, 1.0f);
+ add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_GENERATED);
+
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+}
+
+void WaveTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *scale_in = input("Scale");
+ ShaderInput *distortion_in = input("Distortion");
+ ShaderInput *dscale_in = input("Detail Scale");
+ ShaderInput *detail_in = input("Detail");
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *fac_out = output("Fac");
+ ShaderOutput *color_out = output("Color");
+
+ if(scale_in->link) compiler.stack_assign(scale_in);
+ if(detail_in->link) compiler.stack_assign(detail_in);
+ if(distortion_in->link) compiler.stack_assign(distortion_in);
+ if(dscale_in->link) compiler.stack_assign(dscale_in);
+ if(vector_in->link) compiler.stack_assign(vector_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ if(!fac_out->links.empty())
+ compiler.stack_assign(fac_out);
+ if(!color_out->links.empty())
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_TEX_WAVE,
+ compiler.encode_uchar4(type_enum[type], color_out->stack_offset, fac_out->stack_offset, dscale_in->stack_offset),
+ compiler.encode_uchar4(vector_in->stack_offset, scale_in->stack_offset, detail_in->stack_offset, distortion_in->stack_offset));
+
+ compiler.add_node(
+ __float_as_int(scale_in->value.x),
+ __float_as_int(detail_in->value.x),
+ __float_as_int(distortion_in->value.x),
+ __float_as_int(dscale_in->value.x));
+}
+
+void WaveTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("Type", type);
+
+ compiler.add(this, "node_marble_texture");
+}
+
+/* Magic Texture */
+
+MagicTextureNode::MagicTextureNode()
+: TextureNode("magic_texture")
+{
+ depth = 2;
+
+ add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_GENERATED);
+ add_input("Scale", SHADER_SOCKET_FLOAT, 5.0f);
+ add_input("Distortion", SHADER_SOCKET_FLOAT, 1.0f);
+
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+}
+
+void MagicTextureNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector_in = input("Vector");
+ ShaderInput *scale_in = input("Scale");
+ ShaderInput *distortion_in = input("Distortion");
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *fac_out = output("Fac");
+
+ if(vector_in->link) compiler.stack_assign(vector_in);
+ if(distortion_in->link) compiler.stack_assign(distortion_in);
+ if(scale_in->link) compiler.stack_assign(scale_in);
+
+ if(!tex_mapping.skip())
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ if(!fac_out->links.empty())
+ compiler.stack_assign(fac_out);
+ if(!color_out->links.empty())
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_TEX_MAGIC,
+ compiler.encode_uchar4(depth, color_out->stack_offset, fac_out->stack_offset),
+ compiler.encode_uchar4(vector_in->stack_offset, scale_in->stack_offset, distortion_in->stack_offset));
+ compiler.add_node(
+ __float_as_int(scale_in->value.x),
+ __float_as_int(distortion_in->value.x));
+}
+
+void MagicTextureNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("Depth", depth);
+ compiler.add(this, "node_magic_texture");
+}
+
+/* Mapping */
+
+MappingNode::MappingNode()
+: ShaderNode("mapping")
+{
+ add_input("Vector", SHADER_SOCKET_POINT);
+ add_output("Vector", SHADER_SOCKET_POINT);
+}
+
+void MappingNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector_in = input("Vector");
+ ShaderOutput *vector_out = output("Vector");
+
+ compiler.stack_assign(vector_in);
+ compiler.stack_assign(vector_out);
+
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_out->stack_offset);
+}
+
+void MappingNode::compile(OSLCompiler& compiler)
+{
+ Transform tfm = transform_transpose(tex_mapping.compute_transform());
+ compiler.parameter("Matrix", tfm);
+
+ compiler.add(this, "node_mapping");
+}
+
+/* Convert */
+
+ConvertNode::ConvertNode(ShaderSocketType from_, ShaderSocketType to_)
+: ShaderNode("convert")
+{
+ from = from_;
+ to = to_;
+
+ assert(from != to);
+
+ if(from == SHADER_SOCKET_FLOAT)
+ add_input("Val", SHADER_SOCKET_FLOAT);
+ else if(from == SHADER_SOCKET_COLOR)
+ add_input("Color", SHADER_SOCKET_COLOR);
+ else if(from == SHADER_SOCKET_VECTOR)
+ add_input("Vector", SHADER_SOCKET_VECTOR);
+ else if(from == SHADER_SOCKET_POINT)
+ add_input("Point", SHADER_SOCKET_POINT);
+ else if(from == SHADER_SOCKET_NORMAL)
+ add_input("Normal", SHADER_SOCKET_NORMAL);
+ else
+ assert(0);
+
+ if(to == SHADER_SOCKET_FLOAT)
+ add_output("Val", SHADER_SOCKET_FLOAT);
+ else if(to == SHADER_SOCKET_COLOR)
+ add_output("Color", SHADER_SOCKET_COLOR);
+ else if(to == SHADER_SOCKET_VECTOR)
+ add_output("Vector", SHADER_SOCKET_VECTOR);
+ else if(to == SHADER_SOCKET_POINT)
+ add_output("Point", SHADER_SOCKET_POINT);
+ else if(to == SHADER_SOCKET_NORMAL)
+ add_output("Normal", SHADER_SOCKET_NORMAL);
+ else
+ assert(0);
+}
+
+void ConvertNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *in = inputs[0];
+ ShaderOutput *out = outputs[0];
+
+ if(to == SHADER_SOCKET_FLOAT) {
+ compiler.stack_assign(in);
+ compiler.stack_assign(out);
+
+ if(from == SHADER_SOCKET_COLOR)
+ /* color to float */
+ compiler.add_node(NODE_CONVERT, NODE_CONVERT_CF, in->stack_offset, out->stack_offset);
+ else
+ /* vector/point/normal to float */
+ compiler.add_node(NODE_CONVERT, NODE_CONVERT_VF, in->stack_offset, out->stack_offset);
+ }
+ else if(from == SHADER_SOCKET_FLOAT) {
+ compiler.stack_assign(in);
+ compiler.stack_assign(out);
+
+ /* float to float3 */
+ compiler.add_node(NODE_CONVERT, NODE_CONVERT_FV, in->stack_offset, out->stack_offset);
+ }
+ else {
+ /* float3 to float3 */
+ if(in->link) {
+ /* no op in SVM */
+ compiler.stack_link(in, out);
+ }
+ else {
+ /* set 0,0,0 value */
+ compiler.stack_assign(in);
+ compiler.stack_assign(out);
+
+ compiler.add_node(NODE_VALUE_V, in->stack_offset);
+ compiler.add_node(NODE_VALUE_V, in->value);
+ }
+ }
+}
+
+void ConvertNode::compile(OSLCompiler& compiler)
+{
+ if(from == SHADER_SOCKET_FLOAT)
+ compiler.add(this, "node_convert_from_float");
+ else if(from == SHADER_SOCKET_COLOR)
+ compiler.add(this, "node_convert_from_color");
+ else if(from == SHADER_SOCKET_VECTOR)
+ compiler.add(this, "node_convert_from_vector");
+ else if(from == SHADER_SOCKET_POINT)
+ compiler.add(this, "node_convert_from_point");
+ else if(from == SHADER_SOCKET_NORMAL)
+ compiler.add(this, "node_convert_from_normal");
+ else
+ assert(0);
+}
+
+/* BSDF Closure */
+
+BsdfNode::BsdfNode()
+: ShaderNode("bsdf")
+{
+ closure = ccl::CLOSURE_BSDF_DIFFUSE_ID;
+
+ add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
+ add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
+
+ add_output("BSDF", SHADER_SOCKET_CLOSURE);
+}
+
+void BsdfNode::compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2)
+{
+ ShaderInput *color_in = input("Color");
+
+ if(color_in->link) {
+ compiler.stack_assign(color_in);
+ compiler.add_node(NODE_CLOSURE_WEIGHT, color_in->stack_offset);
+ }
+ else
+ compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color_in->value);
+
+ if(param1)
+ compiler.stack_assign(param1);
+ if(param2)
+ compiler.stack_assign(param2);
+
+ compiler.add_node(NODE_CLOSURE_BSDF,
+ compiler.encode_uchar4(closure,
+ (param1)? param1->stack_offset: SVM_STACK_INVALID,
+ (param2)? param2->stack_offset: SVM_STACK_INVALID,
+ compiler.closure_mix_weight_offset()),
+ __float_as_int((param1)? param1->value.x: 0.0f),
+ __float_as_int((param2)? param2->value.x: 0.0f));
+}
+
+void BsdfNode::compile(SVMCompiler& compiler)
+{
+ compile(compiler, NULL, NULL);
+}
+
+void BsdfNode::compile(OSLCompiler& compiler)
+{
+ assert(0);
+}
+
+/* Ward BSDF Closure */
+
+WardBsdfNode::WardBsdfNode()
+{
+ closure = CLOSURE_BSDF_WARD_ID;
+
+ add_input("Roughness U", SHADER_SOCKET_FLOAT, 0.2f);
+ add_input("Roughness V", SHADER_SOCKET_FLOAT, 0.2f);
+}
+
+void WardBsdfNode::compile(SVMCompiler& compiler)
+{
+ BsdfNode::compile(compiler, input("Roughness U"), input("Roughness V"));
+}
+
+void WardBsdfNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_ward_bsdf");
+}
+
+/* Glossy BSDF Closure */
+
+static ShaderEnum glossy_distribution_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Sharp", CLOSURE_BSDF_REFLECTION_ID);
+ enm.insert("Beckmann", CLOSURE_BSDF_MICROFACET_BECKMANN_ID);
+ enm.insert("GGX", CLOSURE_BSDF_MICROFACET_GGX_ID);
+
+ return enm;
+}
+
+ShaderEnum GlossyBsdfNode::distribution_enum = glossy_distribution_init();
+
+GlossyBsdfNode::GlossyBsdfNode()
+{
+ distribution = ustring("Beckmann");
+
+ add_input("Roughness", SHADER_SOCKET_FLOAT, 0.2f);
+}
+
+void GlossyBsdfNode::compile(SVMCompiler& compiler)
+{
+ closure = (ClosureType)distribution_enum[distribution];
+
+ if(closure == CLOSURE_BSDF_REFLECTION_ID)
+ BsdfNode::compile(compiler, NULL, NULL);
+ else
+ BsdfNode::compile(compiler, input("Roughness"), NULL);
+}
+
+void GlossyBsdfNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("distribution", distribution);
+ compiler.add(this, "node_glossy_bsdf");
+}
+
+/* Glass BSDF Closure */
+
+static ShaderEnum glass_distribution_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Sharp", CLOSURE_BSDF_REFRACTION_ID);
+ enm.insert("Beckmann", CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID);
+ enm.insert("GGX", CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID);
+
+ return enm;
+}
+
+ShaderEnum GlassBsdfNode::distribution_enum = glass_distribution_init();
+
+GlassBsdfNode::GlassBsdfNode()
+{
+ distribution = ustring("Sharp");
+
+ add_input("Roughness", SHADER_SOCKET_FLOAT, 0.0f);
+ add_input("IOR", SHADER_SOCKET_FLOAT, 0.3f);
+}
+
+void GlassBsdfNode::compile(SVMCompiler& compiler)
+{
+ closure = (ClosureType)distribution_enum[distribution];
+
+ if(closure == CLOSURE_BSDF_REFRACTION_ID)
+ BsdfNode::compile(compiler, NULL, input("IOR"));
+ else
+ BsdfNode::compile(compiler, input("Roughness"), input("IOR"));
+}
+
+void GlassBsdfNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("distribution", distribution);
+ compiler.add(this, "node_glass_bsdf");
+}
+
+/* Velvet BSDF Closure */
+
+VelvetBsdfNode::VelvetBsdfNode()
+{
+ closure = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID;
+
+ add_input("Sigma", SHADER_SOCKET_FLOAT, 1.0f);
+}
+
+void VelvetBsdfNode::compile(SVMCompiler& compiler)
+{
+ BsdfNode::compile(compiler, input("Sigma"), NULL);
+}
+
+void VelvetBsdfNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_velvet_bsdf");
+}
+
+/* Diffuse BSDF Closure */
+
+DiffuseBsdfNode::DiffuseBsdfNode()
+{
+ closure = CLOSURE_BSDF_DIFFUSE_ID;
+}
+
+void DiffuseBsdfNode::compile(SVMCompiler& compiler)
+{
+ BsdfNode::compile(compiler, NULL, NULL);
+}
+
+void DiffuseBsdfNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_diffuse_bsdf");
+}
+
+/* Translucent BSDF Closure */
+
+TranslucentBsdfNode::TranslucentBsdfNode()
+{
+ closure = CLOSURE_BSDF_TRANSLUCENT_ID;
+}
+
+void TranslucentBsdfNode::compile(SVMCompiler& compiler)
+{
+ BsdfNode::compile(compiler, NULL, NULL);
+}
+
+void TranslucentBsdfNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_translucent_bsdf");
+}
+
+/* Transparent BSDF Closure */
+
+TransparentBsdfNode::TransparentBsdfNode()
+{
+ name = "transparent";
+ closure = CLOSURE_BSDF_TRANSPARENT_ID;
+}
+
+void TransparentBsdfNode::compile(SVMCompiler& compiler)
+{
+ BsdfNode::compile(compiler, NULL, NULL);
+}
+
+void TransparentBsdfNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_transparent_bsdf");
+}
+
+/* Emissive Closure */
+
+EmissionNode::EmissionNode()
+: ShaderNode("emission")
+{
+ total_power = false;
+
+ add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
+ add_input("Strength", SHADER_SOCKET_FLOAT, 10.0f);
+ add_output("Emission", SHADER_SOCKET_CLOSURE);
+}
+
+void EmissionNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *color_in = input("Color");
+ ShaderInput *strength_in = input("Strength");
+
+ if(color_in->link || strength_in->link) {
+ compiler.stack_assign(color_in);
+ compiler.stack_assign(strength_in);
+ compiler.add_node(NODE_EMISSION_WEIGHT, color_in->stack_offset, strength_in->stack_offset, total_power? 1: 0);
+ }
+ else if(total_power)
+ compiler.add_node(NODE_EMISSION_SET_WEIGHT_TOTAL, color_in->value * strength_in->value.x);
+ else
+ compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color_in->value * strength_in->value.x);
+
+ compiler.add_node(NODE_CLOSURE_EMISSION, compiler.closure_mix_weight_offset());
+}
+
+void EmissionNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("TotalPower", (total_power)? 1: 0);
+ compiler.add(this, "node_emission");
+}
+
+/* Background Closure */
+
+BackgroundNode::BackgroundNode()
+: ShaderNode("background")
+{
+ add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
+ add_input("Strength", SHADER_SOCKET_FLOAT, 1.0f);
+ add_output("Background", SHADER_SOCKET_CLOSURE);
+}
+
+void BackgroundNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *color_in = input("Color");
+ ShaderInput *strength_in = input("Strength");
+
+ if(color_in->link || strength_in->link) {
+ compiler.stack_assign(color_in);
+ compiler.stack_assign(strength_in);
+ compiler.add_node(NODE_EMISSION_WEIGHT, color_in->stack_offset, strength_in->stack_offset);
+ }
+ else
+ compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color_in->value*strength_in->value.x);
+
+ compiler.add_node(NODE_CLOSURE_BACKGROUND, compiler.closure_mix_weight_offset());
+}
+
+void BackgroundNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_background");
+}
+
+/* Holdout Closure */
+
+HoldoutNode::HoldoutNode()
+: ShaderNode("holdout")
+{
+ add_output("Holdout", SHADER_SOCKET_CLOSURE);
+}
+
+void HoldoutNode::compile(SVMCompiler& compiler)
+{
+ compiler.add_node(NODE_CLOSURE_HOLDOUT, compiler.closure_mix_weight_offset());
+}
+
+void HoldoutNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_holdout");
+}
+
+/* Volume Closure */
+
+VolumeNode::VolumeNode()
+: ShaderNode("volume")
+{
+ closure = ccl::CLOSURE_VOLUME_ISOTROPIC_ID;
+
+ add_input("Color", SHADER_SOCKET_COLOR, make_float3(0.8f, 0.8f, 0.8f));
+ add_input("Density", SHADER_SOCKET_FLOAT, 1.0f);
+
+ add_output("Volume", SHADER_SOCKET_CLOSURE);
+}
+
+void VolumeNode::compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2)
+{
+ ShaderInput *color_in = input("Color");
+
+ if(color_in->link) {
+ compiler.stack_assign(color_in);
+ compiler.add_node(NODE_CLOSURE_WEIGHT, color_in->stack_offset);
+ }
+ else
+ compiler.add_node(NODE_CLOSURE_SET_WEIGHT, color_in->value);
+
+ if(param1)
+ compiler.stack_assign(param1);
+ if(param2)
+ compiler.stack_assign(param2);
+
+ compiler.add_node(NODE_CLOSURE_VOLUME,
+ compiler.encode_uchar4(closure,
+ (param1)? param1->stack_offset: SVM_STACK_INVALID,
+ (param2)? param2->stack_offset: SVM_STACK_INVALID,
+ compiler.closure_mix_weight_offset()),
+ __float_as_int((param1)? param1->value.x: 0.0f),
+ __float_as_int((param2)? param2->value.x: 0.0f));
+}
+
+void VolumeNode::compile(SVMCompiler& compiler)
+{
+ compile(compiler, NULL, NULL);
+}
+
+void VolumeNode::compile(OSLCompiler& compiler)
+{
+ assert(0);
+}
+
+/* Transparent Volume Closure */
+
+TransparentVolumeNode::TransparentVolumeNode()
+{
+ closure = CLOSURE_VOLUME_TRANSPARENT_ID;
+}
+
+void TransparentVolumeNode::compile(SVMCompiler& compiler)
+{
+ VolumeNode::compile(compiler, input("Density"), NULL);
+}
+
+void TransparentVolumeNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_isotropic_volume");
+}
+
+/* Isotropic Volume Closure */
+
+IsotropicVolumeNode::IsotropicVolumeNode()
+{
+ closure = CLOSURE_VOLUME_ISOTROPIC_ID;
+}
+
+void IsotropicVolumeNode::compile(SVMCompiler& compiler)
+{
+ VolumeNode::compile(compiler, input("Density"), NULL);
+}
+
+void IsotropicVolumeNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_isotropic_volume");
+}
+
+/* Geometry */
+
+GeometryNode::GeometryNode()
+: ShaderNode("geometry")
+{
+ add_input("NormalIn", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
+ add_output("Position", SHADER_SOCKET_POINT);
+ add_output("Normal", SHADER_SOCKET_NORMAL);
+ add_output("Tangent", SHADER_SOCKET_NORMAL);
+ add_output("True Normal", SHADER_SOCKET_NORMAL);
+ add_output("Incoming", SHADER_SOCKET_VECTOR);
+ add_output("Parametric", SHADER_SOCKET_POINT);
+ add_output("Backfacing", SHADER_SOCKET_FLOAT);
+}
+
+void GeometryNode::compile(SVMCompiler& compiler)
+{
+ ShaderOutput *out;
+ NodeType geom_node = NODE_GEOMETRY;
+
+ if(bump == SHADER_BUMP_DX)
+ geom_node = NODE_GEOMETRY_BUMP_DX;
+ else if(bump == SHADER_BUMP_DY)
+ geom_node = NODE_GEOMETRY_BUMP_DY;
+
+ out = output("Position");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_P, out->stack_offset);
+ }
+
+ out = output("Normal");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_N, out->stack_offset);
+ }
+
+ out = output("Tangent");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_T, out->stack_offset);
+ }
+
+ out = output("True Normal");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_Ng, out->stack_offset);
+ }
+
+ out = output("Incoming");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_I, out->stack_offset);
+ }
+
+ out = output("Parametric");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_uv, out->stack_offset);
+ }
+
+ out = output("Backfacing");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_backfacing, out->stack_offset);
+ }
+}
+
+void GeometryNode::compile(OSLCompiler& compiler)
+{
+ if(bump == SHADER_BUMP_DX)
+ compiler.parameter("bump_offset", "dx");
+ else if(bump == SHADER_BUMP_DY)
+ compiler.parameter("bump_offset", "dy");
+ else
+ compiler.parameter("bump_offset", "center");
+
+ compiler.add(this, "node_geometry");
+}
+
+/* TextureCoordinate */
+
+TextureCoordinateNode::TextureCoordinateNode()
+: ShaderNode("texture_coordinate")
+{
+ add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
+ add_output("Generated", SHADER_SOCKET_POINT);
+ add_output("UV", SHADER_SOCKET_POINT);
+ add_output("Object", SHADER_SOCKET_POINT);
+ add_output("Camera", SHADER_SOCKET_POINT);
+ add_output("Window", SHADER_SOCKET_POINT);
+ add_output("Reflection", SHADER_SOCKET_NORMAL);
+}
+
+void TextureCoordinateNode::attributes(AttributeRequestSet *attributes)
+{
+ if(!output("Generated")->links.empty())
+ attributes->add(Attribute::STD_GENERATED);
+ if(!output("UV")->links.empty())
+ attributes->add(Attribute::STD_UV);
+
+ ShaderNode::attributes(attributes);
+}
+
+void TextureCoordinateNode::compile(SVMCompiler& compiler)
+{
+ ShaderOutput *out;
+ NodeType texco_node = NODE_TEX_COORD;
+ NodeType attr_node = NODE_ATTR;
+ NodeType geom_node = NODE_GEOMETRY;
+
+ if(bump == SHADER_BUMP_DX) {
+ texco_node = NODE_TEX_COORD_BUMP_DX;
+ attr_node = NODE_ATTR_BUMP_DX;
+ geom_node = NODE_GEOMETRY_BUMP_DX;
+ }
+ else if(bump == SHADER_BUMP_DY) {
+ texco_node = NODE_TEX_COORD_BUMP_DY;
+ attr_node = NODE_ATTR_BUMP_DY;
+ geom_node = NODE_GEOMETRY_BUMP_DY;
+ }
+
+ out = output("Generated");
+ if(!out->links.empty()) {
+ if(compiler.background) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_P, out->stack_offset);
+ }
+ else {
+ int attr = compiler.attribute(Attribute::STD_GENERATED);
+ compiler.stack_assign(out);
+ compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+ }
+ }
+
+ out = output("UV");
+ if(!out->links.empty()) {
+ int attr = compiler.attribute(Attribute::STD_UV);
+ compiler.stack_assign(out);
+ compiler.add_node(attr_node, attr, out->stack_offset, NODE_ATTR_FLOAT3);
+ }
+
+ out = output("Object");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(texco_node, NODE_TEXCO_OBJECT, out->stack_offset);
+ }
+
+ out = output("Camera");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(texco_node, NODE_TEXCO_CAMERA, out->stack_offset);
+ }
+
+ out = output("Window");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(texco_node, NODE_TEXCO_WINDOW, out->stack_offset);
+ }
+
+ out = output("Reflection");
+ if(!out->links.empty()) {
+ if(compiler.background) {
+ compiler.stack_assign(out);
+ compiler.add_node(geom_node, NODE_GEOM_I, out->stack_offset);
+ }
+ else {
+ compiler.stack_assign(out);
+ compiler.add_node(texco_node, NODE_TEXCO_REFLECTION, out->stack_offset);
+ }
+ }
+}
+
+void TextureCoordinateNode::compile(OSLCompiler& compiler)
+{
+ if(bump == SHADER_BUMP_DX)
+ compiler.parameter("bump_offset", "dx");
+ else if(bump == SHADER_BUMP_DY)
+ compiler.parameter("bump_offset", "dy");
+ else
+ compiler.parameter("bump_offset", "center");
+
+ if(compiler.background)
+ compiler.parameter("is_background", true);
+
+ compiler.add(this, "node_texture_coordinate");
+}
+
+/* Light Path */
+
+LightPathNode::LightPathNode()
+: ShaderNode("light_path")
+{
+ add_output("Is Camera Ray", SHADER_SOCKET_FLOAT);
+ add_output("Is Shadow Ray", SHADER_SOCKET_FLOAT);
+ add_output("Is Diffuse Ray", SHADER_SOCKET_FLOAT);
+ add_output("Is Glossy Ray", SHADER_SOCKET_FLOAT);
+ add_output("Is Singular Ray", SHADER_SOCKET_FLOAT);
+ add_output("Is Reflection Ray", SHADER_SOCKET_FLOAT);
+ add_output("Is Transmission Ray", SHADER_SOCKET_FLOAT);
+}
+
+void LightPathNode::compile(SVMCompiler& compiler)
+{
+ ShaderOutput *out;
+
+ out = output("Is Camera Ray");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_camera, out->stack_offset);
+ }
+
+ out = output("Is Shadow Ray");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_shadow, out->stack_offset);
+ }
+
+ out = output("Is Diffuse Ray");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_diffuse, out->stack_offset);
+ }
+
+ out = output("Is Glossy Ray");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_glossy, out->stack_offset);
+ }
+
+ out = output("Is Singular Ray");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_singular, out->stack_offset);
+ }
+
+ out = output("Is Reflection Ray");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_reflection, out->stack_offset);
+ }
+
+
+ out = output("Is Transmission Ray");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_transmission, out->stack_offset);
+ }
+}
+
+void LightPathNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_light_path");
+}
+
+/* Value */
+
+ValueNode::ValueNode()
+: ShaderNode("value")
+{
+ value = 0.0f;
+
+ add_output("Value", SHADER_SOCKET_FLOAT);
+}
+
+void ValueNode::compile(SVMCompiler& compiler)
+{
+ ShaderOutput *val_out = output("Value");
+
+ compiler.stack_assign(val_out);
+ compiler.add_node(NODE_VALUE_F, __float_as_int(value), val_out->stack_offset);
+}
+
+void ValueNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("value_value", value);
+ compiler.add(this, "node_value");
+}
+
+/* Color */
+
+ColorNode::ColorNode()
+: ShaderNode("color")
+{
+ value = make_float3(0.0f, 0.0f, 0.0f);
+
+ add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+void ColorNode::compile(SVMCompiler& compiler)
+{
+ ShaderOutput *color_out = output("Color");
+
+ if(color_out && !color_out->links.empty()) {
+ compiler.stack_assign(color_out);
+ compiler.add_node(NODE_VALUE_V, color_out->stack_offset);
+ compiler.add_node(NODE_VALUE_V, value);
+ }
+}
+
+void ColorNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter_color("color_value", value);
+
+ compiler.add(this, "node_value");
+}
+
+/* Add Closure */
+
+AddClosureNode::AddClosureNode()
+: ShaderNode("add_closure")
+{
+ add_input("Closure1", SHADER_SOCKET_CLOSURE);
+ add_input("Closure2", SHADER_SOCKET_CLOSURE);
+ add_output("Closure", SHADER_SOCKET_CLOSURE);
+}
+
+void AddClosureNode::compile(SVMCompiler& compiler)
+{
+ /* handled in the SVM compiler */
+}
+
+void AddClosureNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_add_closure");
+}
+
+/* Mix Closure */
+
+MixClosureNode::MixClosureNode()
+: ShaderNode("mix_closure")
+{
+ add_input("Fac", SHADER_SOCKET_FLOAT, 0.5f);
+ add_input("Closure1", SHADER_SOCKET_CLOSURE);
+ add_input("Closure2", SHADER_SOCKET_CLOSURE);
+ add_output("Closure", SHADER_SOCKET_CLOSURE);
+}
+
+void MixClosureNode::compile(SVMCompiler& compiler)
+{
+ /* handled in the SVM compiler */
+}
+
+void MixClosureNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_mix_closure");
+}
+
+/* Mix */
+
+MixNode::MixNode()
+: ShaderNode("mix")
+{
+ type = ustring("Mix");
+
+ add_input("Fac", SHADER_SOCKET_FLOAT, 0.5f);
+ add_input("Color1", SHADER_SOCKET_COLOR);
+ add_input("Color2", SHADER_SOCKET_COLOR);
+ add_output("Color", SHADER_SOCKET_COLOR);
+}
+
+static ShaderEnum mix_type_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Mix", NODE_MIX_BLEND);
+ enm.insert("Add", NODE_MIX_ADD);
+ enm.insert("Multiply", NODE_MIX_MUL);
+ enm.insert("Screen", NODE_MIX_SCREEN);
+ enm.insert("Overlay", NODE_MIX_OVERLAY);
+ enm.insert("Subtract", NODE_MIX_SUB);
+ enm.insert("Divide", NODE_MIX_DIV);
+ enm.insert("Difference", NODE_MIX_DIFF);
+ enm.insert("Darken", NODE_MIX_DARK);
+ enm.insert("Lighten", NODE_MIX_LIGHT);
+ enm.insert("Dodge", NODE_MIX_DODGE);
+ enm.insert("Burn", NODE_MIX_BURN);
+ enm.insert("Hue", NODE_MIX_HUE);
+ enm.insert("Saturation", NODE_MIX_SAT);
+ enm.insert("Value", NODE_MIX_VAL );
+ enm.insert("Color", NODE_MIX_COLOR);
+ enm.insert("Soft Light", NODE_MIX_SOFT);
+ enm.insert("Linear Light", NODE_MIX_LINEAR);
+
+ return enm;
+}
+
+ShaderEnum MixNode::type_enum = mix_type_init();
+
+void MixNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *fac_in = input("Fac");
+ ShaderInput *color1_in = input("Color1");
+ ShaderInput *color2_in = input("Color2");
+ ShaderOutput *color_out = output("Color");
+
+ compiler.stack_assign(fac_in);
+ compiler.stack_assign(color1_in);
+ compiler.stack_assign(color2_in);
+ compiler.stack_assign(color_out);
+
+ compiler.add_node(NODE_MIX, fac_in->stack_offset, color1_in->stack_offset, color2_in->stack_offset);
+ compiler.add_node(NODE_MIX, type_enum[type], color_out->stack_offset);
+}
+
+void MixNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("type", type);
+ compiler.add(this, "node_mix");
+}
+
+/* Attribute */
+
+AttributeNode::AttributeNode()
+: ShaderNode("attribute")
+{
+ attribute = "";
+
+ add_output("Color", SHADER_SOCKET_COLOR);
+ add_output("Vector", SHADER_SOCKET_VECTOR);
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+}
+
+void AttributeNode::attributes(AttributeRequestSet *attributes)
+{
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *vector_out = output("Vector");
+ ShaderOutput *fac_out = output("Fac");
+
+ if(!color_out->links.empty() || !vector_out->links.empty() || !fac_out->links.empty())
+ attributes->add(attribute);
+
+ ShaderNode::attributes(attributes);
+}
+
+void AttributeNode::compile(SVMCompiler& compiler)
+{
+ ShaderOutput *color_out = output("Color");
+ ShaderOutput *vector_out = output("Vector");
+ ShaderOutput *fac_out = output("Fac");
+ NodeType attr_node = NODE_ATTR;
+
+ if(bump == SHADER_BUMP_DX)
+ attr_node = NODE_ATTR_BUMP_DX;
+ else if(bump == SHADER_BUMP_DY)
+ attr_node = NODE_ATTR_BUMP_DY;
+
+ if(!color_out->links.empty() || !vector_out->links.empty()) {
+ int attr = compiler.attribute(attribute);
+
+ if(!color_out->links.empty()) {
+ compiler.stack_assign(color_out);
+ compiler.add_node(attr_node, attr, color_out->stack_offset, NODE_ATTR_FLOAT3);
+ }
+ if(!vector_out->links.empty()) {
+ compiler.stack_assign(vector_out);
+ compiler.add_node(attr_node, attr, vector_out->stack_offset, NODE_ATTR_FLOAT3);
+ }
+ }
+
+ if(!fac_out->links.empty()) {
+ int attr = compiler.attribute(attribute);
+
+ compiler.stack_assign(fac_out);
+ compiler.add_node(attr_node, attr, fac_out->stack_offset, NODE_ATTR_FLOAT);
+ }
+}
+
+void AttributeNode::compile(OSLCompiler& compiler)
+{
+ if(bump == SHADER_BUMP_DX)
+ compiler.parameter("bump_offset", "dx");
+ else if(bump == SHADER_BUMP_DY)
+ compiler.parameter("bump_offset", "dy");
+ else
+ compiler.parameter("bump_offset", "center");
+
+ compiler.parameter("name", attribute.c_str());
+ compiler.add(this, "node_attribute");
+}
+
+/* Fresnel */
+
+FresnelNode::FresnelNode()
+: ShaderNode("Fresnel")
+{
+ add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
+ add_input("IOR", SHADER_SOCKET_FLOAT, 1.45f);
+ add_output("Fac", SHADER_SOCKET_FLOAT);
+}
+
+void FresnelNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *ior_in = input("IOR");
+ ShaderOutput *fac_out = output("Fac");
+
+ compiler.stack_assign(ior_in);
+ compiler.stack_assign(fac_out);
+ compiler.add_node(NODE_FRESNEL, ior_in->stack_offset, __float_as_int(ior_in->value.x), fac_out->stack_offset);
+}
+
+void FresnelNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_fresnel");
+}
+
+/* Blend Weight */
+
+LayerWeightNode::LayerWeightNode()
+: ShaderNode("LayerWeight")
+{
+ add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true);
+ add_input("Blend", SHADER_SOCKET_FLOAT, 0.5f);
+
+ add_output("Fresnel", SHADER_SOCKET_FLOAT);
+ add_output("Facing", SHADER_SOCKET_FLOAT);
+}
+
+void LayerWeightNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *blend_in = input("Blend");
+
+ if(blend_in->link)
+ compiler.stack_assign(blend_in);
+
+ ShaderOutput *fresnel_out = output("Fresnel");
+ if(!fresnel_out->links.empty()) {
+ compiler.stack_assign(fresnel_out);
+ compiler.add_node(NODE_LAYER_WEIGHT, blend_in->stack_offset, __float_as_int(blend_in->value.x),
+ compiler.encode_uchar4(NODE_LAYER_WEIGHT_FRESNEL, fresnel_out->stack_offset));
+ }
+
+ ShaderOutput *facing_out = output("Facing");
+ if(!facing_out->links.empty()) {
+ compiler.stack_assign(facing_out);
+ compiler.add_node(NODE_LAYER_WEIGHT, blend_in->stack_offset, __float_as_int(blend_in->value.x),
+ compiler.encode_uchar4(NODE_LAYER_WEIGHT_FACING, facing_out->stack_offset));
+ }
+}
+
+void LayerWeightNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_layer_height");
+}
+
+/* Output */
+
+OutputNode::OutputNode()
+: ShaderNode("output")
+{
+ add_input("Surface", SHADER_SOCKET_CLOSURE);
+ add_input("Volume", SHADER_SOCKET_CLOSURE);
+ add_input("Displacement", SHADER_SOCKET_FLOAT);
+}
+
+void OutputNode::compile(SVMCompiler& compiler)
+{
+ if(compiler.output_type() == SHADER_TYPE_DISPLACEMENT) {
+ ShaderInput *displacement_in = input("Displacement");
+
+ if(displacement_in->link) {
+ compiler.stack_assign(displacement_in);
+ compiler.add_node(NODE_SET_DISPLACEMENT, displacement_in->stack_offset);
+ }
+ }
+}
+
+void OutputNode::compile(OSLCompiler& compiler)
+{
+ if(compiler.output_type() == SHADER_TYPE_SURFACE)
+ compiler.add(this, "node_output_surface");
+ else if(compiler.output_type() == SHADER_TYPE_VOLUME)
+ compiler.add(this, "node_output_volume");
+ else if(compiler.output_type() == SHADER_TYPE_DISPLACEMENT)
+ compiler.add(this, "node_output_displacement");
+}
+
+/* Math */
+
+MathNode::MathNode()
+: ShaderNode("math")
+{
+ type = ustring("Add");
+
+ add_input("Value1", SHADER_SOCKET_FLOAT);
+ add_input("Value2", SHADER_SOCKET_FLOAT);
+ add_output("Value", SHADER_SOCKET_FLOAT);
+}
+
+static ShaderEnum math_type_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Add", NODE_MATH_ADD);
+ enm.insert("Subtract", NODE_MATH_SUBTRACT);
+ enm.insert("Multiply", NODE_MATH_MULTIPLY);
+ enm.insert("Divide", NODE_MATH_DIVIDE);
+ enm.insert("Sine", NODE_MATH_SINE);
+ enm.insert("Cosine", NODE_MATH_COSINE);
+ enm.insert("Tangent", NODE_MATH_TANGENT);
+ enm.insert("Arcsine", NODE_MATH_ARCSINE);
+ enm.insert("Arccosine", NODE_MATH_ARCCOSINE);
+ enm.insert("Arctangent", NODE_MATH_ARCTANGENT);
+ enm.insert("Power", NODE_MATH_POWER);
+ enm.insert("Logarithm", NODE_MATH_LOGARITHM);
+ enm.insert("Minimum", NODE_MATH_MINIMUM);
+ enm.insert("Maximum", NODE_MATH_MAXIMUM);
+ enm.insert("Round", NODE_MATH_ROUND);
+ enm.insert("Less Than", NODE_MATH_LESS_THAN);
+ enm.insert("Greater Than", NODE_MATH_GREATER_THAN);
+
+ return enm;
+}
+
+ShaderEnum MathNode::type_enum = math_type_init();
+
+void MathNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *value1_in = input("Value1");
+ ShaderInput *value2_in = input("Value2");
+ ShaderOutput *value_out = output("Value");
+
+ compiler.stack_assign(value1_in);
+ compiler.stack_assign(value2_in);
+ compiler.stack_assign(value_out);
+
+ compiler.add_node(NODE_MATH, type_enum[type], value1_in->stack_offset, value2_in->stack_offset);
+ compiler.add_node(NODE_MATH, value_out->stack_offset);
+}
+
+void MathNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("type", type);
+ compiler.add(this, "node_math");
+}
+
+/* VectorMath */
+
+VectorMathNode::VectorMathNode()
+: ShaderNode("vector_math")
+{
+ type = ustring("Add");
+
+ add_input("Vector1", SHADER_SOCKET_VECTOR);
+ add_input("Vector2", SHADER_SOCKET_VECTOR);
+ add_output("Value", SHADER_SOCKET_FLOAT);
+ add_output("Vector", SHADER_SOCKET_VECTOR);
+}
+
+static ShaderEnum vector_math_type_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Add", NODE_VECTOR_MATH_ADD);
+ enm.insert("Subtract", NODE_VECTOR_MATH_SUBTRACT);
+ enm.insert("Average", NODE_VECTOR_MATH_AVERAGE);
+ enm.insert("Dot Product", NODE_VECTOR_MATH_DOT_PRODUCT);
+ enm.insert("Cross Product", NODE_VECTOR_MATH_CROSS_PRODUCT);
+ enm.insert("Normalize", NODE_VECTOR_MATH_NORMALIZE);
+
+ return enm;
+}
+
+ShaderEnum VectorMathNode::type_enum = vector_math_type_init();
+
+void VectorMathNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *vector1_in = input("Vector1");
+ ShaderInput *vector2_in = input("Vector2");
+ ShaderOutput *value_out = output("Value");
+ ShaderOutput *vector_out = output("Vector");
+
+ compiler.stack_assign(vector1_in);
+ compiler.stack_assign(vector2_in);
+ compiler.stack_assign(value_out);
+ compiler.stack_assign(vector_out);
+
+ compiler.add_node(NODE_VECTOR_MATH, type_enum[type], vector1_in->stack_offset, vector2_in->stack_offset);
+ compiler.add_node(NODE_VECTOR_MATH, value_out->stack_offset, vector_out->stack_offset);
+}
+
+void VectorMathNode::compile(OSLCompiler& compiler)
+{
+ compiler.parameter("type", type);
+ compiler.add(this, "node_vector_math");
+}
+
+/* BumpNode */
+
+BumpNode::BumpNode()
+: ShaderNode("bump")
+{
+ add_input("SampleCenter", SHADER_SOCKET_FLOAT);
+ add_input("SampleX", SHADER_SOCKET_FLOAT);
+ add_input("SampleY", SHADER_SOCKET_FLOAT);
+
+ add_output("Normal", SHADER_SOCKET_NORMAL);
+}
+
+void BumpNode::compile(SVMCompiler& compiler)
+{
+ ShaderInput *center_in = input("SampleCenter");
+ ShaderInput *dx_in = input("SampleX");
+ ShaderInput *dy_in = input("SampleY");
+
+ compiler.stack_assign(center_in);
+ compiler.stack_assign(dx_in);
+ compiler.stack_assign(dy_in);
+
+ compiler.add_node(NODE_SET_BUMP, center_in->stack_offset, dx_in->stack_offset, dy_in->stack_offset);
+}
+
+void BumpNode::compile(OSLCompiler& compiler)
+{
+ compiler.add(this, "node_bump");
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
new file mode 100644
index 00000000000..d9cbd7ff589
--- /dev/null
+++ b/intern/cycles/render/nodes.h
@@ -0,0 +1,337 @@
+/*
+ * 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 __NODES_H__
+#define __NODES_H__
+
+#include "graph.h"
+
+#include "util_string.h"
+
+CCL_NAMESPACE_BEGIN
+
+class ImageManager;
+class Shadr;
+
+/* Texture Mapping */
+
+class TextureMapping {
+public:
+ TextureMapping();
+ Transform compute_transform();
+ bool skip();
+ void compile(SVMCompiler& compiler, int offset_in, int offset_out);
+
+ float3 translation;
+ float3 rotation;
+ float3 scale;
+
+ enum Mapping { NONE=0, X=1, Y=2, Z=3 };
+ Mapping x_mapping, y_mapping, z_mapping;
+
+ enum Projection { FLAT, CUBE, TUBE, SPHERE };
+ Projection projection;
+};
+
+/* Nodes */
+
+class TextureNode : public ShaderNode {
+public:
+ TextureNode(const char *name) : ShaderNode(name) {}
+ TextureMapping tex_mapping;
+};
+
+class ImageTextureNode : public TextureNode {
+public:
+ SHADER_NODE_NO_CLONE_CLASS(ImageTextureNode)
+ ~ImageTextureNode();
+ ShaderNode *clone() const;
+
+ ImageManager *image_manager;
+ int slot;
+ string filename;
+ ustring color_space;
+
+ static ShaderEnum color_space_enum;
+};
+
+class EnvironmentTextureNode : public TextureNode {
+public:
+ SHADER_NODE_NO_CLONE_CLASS(EnvironmentTextureNode)
+ ~EnvironmentTextureNode();
+ ShaderNode *clone() const;
+
+ ImageManager *image_manager;
+ int slot;
+ string filename;
+ ustring color_space;
+
+ static ShaderEnum color_space_enum;
+};
+
+class SkyTextureNode : public TextureNode {
+public:
+ SHADER_NODE_CLASS(SkyTextureNode)
+
+ float3 sun_direction;
+ float turbidity;
+};
+
+class OutputNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(OutputNode)
+};
+
+class GradientTextureNode : public TextureNode {
+public:
+ SHADER_NODE_CLASS(GradientTextureNode)
+
+ ustring type;
+ static ShaderEnum type_enum;
+};
+
+class NoiseTextureNode : public TextureNode {
+public:
+ SHADER_NODE_CLASS(NoiseTextureNode)
+};
+
+class VoronoiTextureNode : public TextureNode {
+public:
+ SHADER_NODE_CLASS(VoronoiTextureNode)
+
+ ustring coloring;
+
+ static ShaderEnum coloring_enum;
+};
+
+class MusgraveTextureNode : public TextureNode {
+public:
+ SHADER_NODE_CLASS(MusgraveTextureNode)
+
+ ustring type;
+
+ static ShaderEnum type_enum;
+};
+
+class WaveTextureNode : public TextureNode {
+public:
+ SHADER_NODE_CLASS(WaveTextureNode)
+
+ ustring type;
+ static ShaderEnum type_enum;
+};
+
+class MagicTextureNode : public TextureNode {
+public:
+ SHADER_NODE_CLASS(MagicTextureNode)
+
+ int depth;
+};
+
+class MappingNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(MappingNode)
+
+ TextureMapping tex_mapping;
+};
+
+class ConvertNode : public ShaderNode {
+public:
+ ConvertNode(ShaderSocketType from, ShaderSocketType to);
+ SHADER_NODE_BASE_CLASS(ConvertNode)
+
+ ShaderSocketType from, to;
+};
+
+class BsdfNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(BsdfNode)
+
+ void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2);
+
+ ClosureType closure;
+};
+
+class WardBsdfNode : public BsdfNode {
+public:
+ SHADER_NODE_CLASS(WardBsdfNode)
+};
+
+class DiffuseBsdfNode : public BsdfNode {
+public:
+ SHADER_NODE_CLASS(DiffuseBsdfNode)
+};
+
+class TranslucentBsdfNode : public BsdfNode {
+public:
+ SHADER_NODE_CLASS(TranslucentBsdfNode)
+};
+
+class TransparentBsdfNode : public BsdfNode {
+public:
+ SHADER_NODE_CLASS(TransparentBsdfNode)
+};
+
+class VelvetBsdfNode : public BsdfNode {
+public:
+ SHADER_NODE_CLASS(VelvetBsdfNode)
+};
+
+class GlossyBsdfNode : public BsdfNode {
+public:
+ SHADER_NODE_CLASS(GlossyBsdfNode)
+
+ ustring distribution;
+ static ShaderEnum distribution_enum;
+};
+
+class GlassBsdfNode : public BsdfNode {
+public:
+ SHADER_NODE_CLASS(GlassBsdfNode)
+
+ ustring distribution;
+ static ShaderEnum distribution_enum;
+};
+
+class EmissionNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(EmissionNode)
+
+ bool total_power;
+};
+
+class BackgroundNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(BackgroundNode)
+};
+
+class HoldoutNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(HoldoutNode)
+};
+
+class VolumeNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(VolumeNode)
+
+ void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2);
+
+ ClosureType closure;
+};
+
+class TransparentVolumeNode : public VolumeNode {
+public:
+ SHADER_NODE_CLASS(TransparentVolumeNode)
+};
+
+class IsotropicVolumeNode : public VolumeNode {
+public:
+ SHADER_NODE_CLASS(IsotropicVolumeNode)
+};
+
+class GeometryNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(GeometryNode)
+};
+
+class TextureCoordinateNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(TextureCoordinateNode)
+ void attributes(AttributeRequestSet *attributes);
+};
+
+class LightPathNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(LightPathNode)
+};
+
+class ValueNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(ValueNode)
+
+ float value;
+};
+
+class ColorNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(ColorNode)
+
+ float3 value;
+};
+
+class AddClosureNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(AddClosureNode)
+};
+
+class MixClosureNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(MixClosureNode)
+};
+
+class MixNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(MixNode)
+
+ ustring type;
+ static ShaderEnum type_enum;
+};
+
+class AttributeNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(AttributeNode)
+ void attributes(AttributeRequestSet *attributes);
+
+ ustring attribute;
+};
+
+class FresnelNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(FresnelNode)
+};
+
+class LayerWeightNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(LayerWeightNode)
+};
+
+class MathNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(MathNode)
+
+ ustring type;
+ static ShaderEnum type_enum;
+};
+
+class VectorMathNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(VectorMathNode)
+
+ ustring type;
+ static ShaderEnum type_enum;
+};
+
+class BumpNode : public ShaderNode {
+public:
+ SHADER_NODE_CLASS(BumpNode)
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __NODES_H__ */
+
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
new file mode 100644
index 00000000000..3a9f0add735
--- /dev/null
+++ b/intern/cycles/render/object.cpp
@@ -0,0 +1,258 @@
+/*
+ * 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 "device.h"
+#include "light.h"
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+
+#include "util_foreach.h"
+#include "util_map.h"
+#include "util_progress.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Object */
+
+Object::Object()
+{
+ name = "";
+ mesh = NULL;
+ tfm = transform_identity();
+ visibility = ~0;
+}
+
+Object::~Object()
+{
+}
+
+void Object::compute_bounds()
+{
+ bounds = mesh->bounds.transformed(&tfm);
+}
+
+void Object::apply_transform()
+{
+ if(!mesh || tfm == transform_identity())
+ return;
+
+ for(size_t i = 0; i < mesh->verts.size(); i++)
+ mesh->verts[i] = transform(&tfm, mesh->verts[i]);
+
+ Attribute *attr_fN = mesh->attributes.find(Attribute::STD_FACE_NORMAL);
+ Attribute *attr_vN = mesh->attributes.find(Attribute::STD_VERTEX_NORMAL);
+
+ Transform ntfm = transform_transpose(transform_inverse(tfm));
+
+ /* we keep normals pointing in same direction on negative scale, notify
+ mesh about this in it (re)calculates normals */
+ if(transform_negative_scale(tfm))
+ mesh->transform_negative_scaled = true;
+
+ if(attr_fN) {
+ float3 *fN = attr_fN->data_float3();
+
+ for(size_t i = 0; i < mesh->triangles.size(); i++)
+ fN[i] = transform_direction(&ntfm, fN[i]);
+ }
+
+ if(attr_vN) {
+ float3 *vN = attr_vN->data_float3();
+
+ for(size_t i = 0; i < mesh->verts.size(); i++)
+ vN[i] = transform_direction(&ntfm, vN[i]);
+ }
+
+ if(bounds.valid()) {
+ mesh->compute_bounds();
+ compute_bounds();
+ }
+
+ tfm = transform_identity();
+}
+
+void Object::tag_update(Scene *scene)
+{
+ if(mesh) {
+ if(mesh->transform_applied)
+ mesh->need_update = true;
+
+ foreach(uint sindex, mesh->used_shaders) {
+ Shader *shader = scene->shaders[sindex];
+
+ if(shader->sample_as_light && shader->has_surface_emission)
+ scene->light_manager->need_update = true;
+ }
+ }
+
+ scene->mesh_manager->need_update = true;
+ scene->object_manager->need_update = true;
+}
+
+/* Object Manager */
+
+ObjectManager::ObjectManager()
+{
+ need_update = true;
+}
+
+ObjectManager::~ObjectManager()
+{
+}
+
+void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ float4 *objects = dscene->objects.resize(OBJECT_SIZE*scene->objects.size());
+ int i = 0;
+ map<Mesh*, float> surface_area_map;
+
+ foreach(Object *ob, scene->objects) {
+ Mesh *mesh = ob->mesh;
+
+ /* compute transformations */
+ Transform tfm = ob->tfm;
+ Transform itfm = transform_inverse(tfm);
+ Transform ntfm = transform_transpose(itfm);
+
+ /* compute surface area. for uniform scale we can do avoid the many
+ transform calls and share computation for instances */
+ /* todo: correct for displacement, and move to a better place */
+ float uniform_scale;
+ float surface_area = 0.0f;
+
+ if(transform_uniform_scale(tfm, uniform_scale)) {
+ map<Mesh*, float>::iterator it = surface_area_map.find(mesh);
+
+ if(it == surface_area_map.end()) {
+ foreach(Mesh::Triangle& t, mesh->triangles) {
+ float3 p1 = mesh->verts[t.v[0]];
+ float3 p2 = mesh->verts[t.v[1]];
+ float3 p3 = mesh->verts[t.v[2]];
+
+ surface_area += triangle_area(p1, p2, p3);
+ }
+
+ surface_area_map[mesh] = surface_area;
+ }
+ else
+ surface_area = it->second;
+
+ surface_area *= uniform_scale;
+ }
+ else {
+ foreach(Mesh::Triangle& t, mesh->triangles) {
+ float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
+ float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
+ float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
+
+ surface_area += triangle_area(p1, p2, p3);
+ }
+ }
+
+ /* pack in texture */
+ int offset = i*OBJECT_SIZE;
+
+ memcpy(&objects[offset], &tfm, sizeof(float4)*4);
+ memcpy(&objects[offset+4], &itfm, sizeof(float4)*4);
+ memcpy(&objects[offset+8], &ntfm, sizeof(float4)*4);
+ objects[offset+12] = make_float4(surface_area, 0.0f, 0.0f, 0.0f);
+
+ i++;
+
+ if(progress.get_cancel()) return;
+ }
+
+ device->tex_alloc("__objects", dscene->objects);
+}
+
+void ObjectManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ if(!need_update)
+ return;
+
+ device_free(device, dscene);
+
+ if(scene->objects.size() == 0)
+ return;
+
+ /* set object transform matrices, before applying static transforms */
+ progress.set_status("Updating Objects", "Copying Transformations to device");
+ device_update_transforms(device, dscene, scene, progress);
+
+ if(progress.get_cancel()) return;
+
+ /* prepare for static BVH building */
+ /* todo: do before to support getting object level coords? */
+ if(scene->params.bvh_type == SceneParams::BVH_STATIC) {
+ progress.set_status("Updating Objects", "Applying Static Transformations");
+ apply_static_transforms(scene, progress);
+ }
+
+ if(progress.get_cancel()) return;
+
+ need_update = false;
+}
+
+void ObjectManager::device_free(Device *device, DeviceScene *dscene)
+{
+ device->tex_free(dscene->objects);
+ dscene->objects.clear();
+}
+
+void ObjectManager::apply_static_transforms(Scene *scene, Progress& progress)
+{
+ /* todo: normals and displacement should be done before applying transform! */
+ /* todo: create objects/meshes in right order! */
+
+ /* counter mesh users */
+ map<Mesh*, int> mesh_users;
+
+ foreach(Object *object, scene->objects) {
+ map<Mesh*, int>::iterator it = mesh_users.find(object->mesh);
+
+ if(it == mesh_users.end())
+ mesh_users[object->mesh] = 1;
+ else
+ it->second++;
+ }
+
+ if(progress.get_cancel()) return;
+
+ /* apply transforms for objects with single user meshes */
+ foreach(Object *object, scene->objects) {
+ if(mesh_users[object->mesh] == 1) {
+ if(!object->mesh->transform_applied) {
+ object->apply_transform();
+ object->mesh->transform_applied = true;
+ }
+
+ if(progress.get_cancel()) return;
+ }
+ }
+}
+
+void ObjectManager::tag_update(Scene *scene)
+{
+ need_update = true;
+ scene->mesh_manager->need_update = true;
+ scene->light_manager->need_update = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
new file mode 100644
index 00000000000..7fe83cf7d91
--- /dev/null
+++ b/intern/cycles/render/object.h
@@ -0,0 +1,77 @@
+/*
+ * 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 __OBJECT_H__
+#define __OBJECT_H__
+
+#include "util_boundbox.h"
+#include "util_param.h"
+#include "util_transform.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class Mesh;
+class Progress;
+class Scene;
+struct Transform;
+
+/* Object */
+
+class Object {
+public:
+ Mesh *mesh;
+ Transform tfm;
+ BoundBox bounds;
+ ustring name;
+ vector<ParamValue> attributes;
+ uint visibility;
+
+ Object();
+ ~Object();
+
+ void tag_update(Scene *scene);
+
+ void compute_bounds();
+ void apply_transform();
+};
+
+/* Object Manager */
+
+class ObjectManager {
+public:
+ bool need_update;
+
+ ObjectManager();
+ ~ObjectManager();
+
+ void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_free(Device *device, DeviceScene *dscene);
+
+ void tag_update(Scene *scene);
+
+ void apply_static_transforms(Scene *scene, Progress& progress);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __OBJECT_H__ */
+
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
new file mode 100644
index 00000000000..b0173334c76
--- /dev/null
+++ b/intern/cycles/render/osl.cpp
@@ -0,0 +1,504 @@
+/*
+ * 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 "device.h"
+
+#include "graph.h"
+#include "light.h"
+#include "osl.h"
+#include "scene.h"
+#include "shader.h"
+
+#ifdef WITH_OSL
+
+#include "osl_globals.h"
+#include "osl_services.h"
+#include "osl_shader.h"
+
+#include "util_foreach.h"
+#include "util_path.h"
+#include "util_progress.h"
+
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+#ifdef WITH_OSL
+
+/* Shader Manager */
+
+OSLShaderManager::OSLShaderManager()
+{
+ services = new OSLRenderServices();
+
+ /* if we let OSL create it, it leaks */
+ ts = TextureSystem::create(true);
+ ts->attribute("automip", 1);
+ ts->attribute("autotile", 64);
+
+ ss = OSL::ShadingSystem::create(services, ts, &errhandler);
+ ss->attribute("lockgeom", 1);
+ ss->attribute("commonspace", "world");
+ ss->attribute("optimize", 2);
+ //ss->attribute("debug", 1);
+ //ss->attribute("statistics:level", 1);
+ ss->attribute("searchpath:shader", path_get("shader").c_str());
+
+ OSLShader::register_closures(ss);
+}
+
+OSLShaderManager::~OSLShaderManager()
+{
+ OSL::ShadingSystem::destroy(ss);
+ OSL::TextureSystem::destroy(ts);
+ delete services;
+}
+
+void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ /* test if we need to update */
+ bool need_update = false;
+
+ foreach(Shader *shader, scene->shaders)
+ if(shader->need_update)
+ need_update = true;
+
+ if(!need_update)
+ return;
+
+ device_free(device, dscene);
+
+ /* create shaders */
+ OSLGlobals *og = (OSLGlobals*)device->osl_memory();
+
+ foreach(Shader *shader, scene->shaders) {
+ assert(shader->graph);
+
+ if(progress.get_cancel()) return;
+
+ if(shader->sample_as_light && shader->has_surface_emission)
+ scene->light_manager->need_update = true;
+
+ OSLCompiler compiler((void*)ss);
+ compiler.background = (shader == scene->shaders[scene->default_background]);
+ compiler.compile(og, shader);
+ }
+
+ /* setup shader engine */
+ og->ss = ss;
+ int background_id = scene->shader_manager->get_shader_id(scene->default_background);
+ og->background_state = og->surface_state[background_id];
+ og->use = true;
+
+ tls_create(OSLGlobals::ThreadData, og->thread_data);
+
+ foreach(Shader *shader, scene->shaders)
+ shader->need_update = false;
+
+ /* set texture system */
+ scene->image_manager->set_osl_texture_system((void*)ts);
+
+ device_update_common(device, dscene, scene, progress);
+}
+
+void OSLShaderManager::device_free(Device *device, DeviceScene *dscene)
+{
+ OSLGlobals *og = (OSLGlobals*)device->osl_memory();
+
+ device_free_common(device, dscene);
+
+ /* clear shader engine */
+ og->use = false;
+ og->ss = NULL;
+
+ tls_delete(OSLGlobals::ThreadData, og->thread_data);
+
+ og->surface_state.clear();
+ og->volume_state.clear();
+ og->displacement_state.clear();
+ og->background_state.reset();
+}
+
+/* Graph Compiler */
+
+OSLCompiler::OSLCompiler(void *shadingsys_)
+{
+ shadingsys = shadingsys_;
+ current_type = SHADER_TYPE_SURFACE;
+ current_shader = NULL;
+ background = false;
+}
+
+string OSLCompiler::id(ShaderNode *node)
+{
+ /* assign layer unique name based on pointer address + bump mode */
+ stringstream stream;
+ stream << "node_" << node->name << "_" << node;
+
+ return stream.str();
+}
+
+string OSLCompiler::compatible_name(const char *name)
+{
+ string sname = name;
+ size_t i;
+
+ while((i = sname.find(" ")) != string::npos)
+ sname.replace(i, 1, "");
+
+ return sname;
+}
+
+bool OSLCompiler::node_skip_input(ShaderNode *node, ShaderInput *input)
+{
+ /* exception for output node, only one input is actually used
+ depending on the current shader type */
+
+ if(node->name == ustring("output")) {
+ if(strcmp(input->name, "Surface") == 0 && current_type != SHADER_TYPE_SURFACE)
+ return true;
+ if(strcmp(input->name, "Volume") == 0 && current_type != SHADER_TYPE_VOLUME)
+ return true;
+ if(strcmp(input->name, "Displacement") == 0 && current_type != SHADER_TYPE_DISPLACEMENT)
+ return true;
+ }
+ else if(current_type == SHADER_TYPE_DISPLACEMENT && input->link && input->link->parent->name == ustring("bump"))
+ return true;
+
+ return false;
+}
+
+void OSLCompiler::add(ShaderNode *node, const char *name)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+
+ /* pass in fixed parameter values */
+ foreach(ShaderInput *input, node->inputs) {
+ if(!input->link) {
+ /* checks to untangle graphs */
+ if(node_skip_input(node, input))
+ continue;
+ /* already has default value assigned */
+ else if(input->default_value != ShaderInput::NONE)
+ continue;
+
+ switch(input->type) {
+ case SHADER_SOCKET_COLOR:
+ parameter_color(input->name, input->value);
+ break;
+ case SHADER_SOCKET_POINT:
+ parameter_point(input->name, input->value);
+ break;
+ case SHADER_SOCKET_VECTOR:
+ parameter_vector(input->name, input->value);
+ break;
+ case SHADER_SOCKET_NORMAL:
+ parameter_normal(input->name, input->value);
+ break;
+ case SHADER_SOCKET_FLOAT:
+ parameter(input->name, input->value.x);
+ break;
+ case SHADER_SOCKET_CLOSURE:
+ break;
+ }
+ }
+ }
+
+ /* create shader of the appropriate type. we pass "surface" to all shaders,
+ * because "volume" and "displacement" don't work yet in OSL. the shaders
+ * work fine, but presumably these values would be used for more strict
+ * checking, so when that is fixed, we should update the code here too. */
+ if(current_type == SHADER_TYPE_SURFACE)
+ ss->Shader("surface", name, id(node).c_str());
+ else if(current_type == SHADER_TYPE_VOLUME)
+ ss->Shader("surface", name, id(node).c_str());
+ else if(current_type == SHADER_TYPE_DISPLACEMENT)
+ ss->Shader("surface", name, id(node).c_str());
+ else
+ assert(0);
+
+ /* link inputs to other nodes */
+ foreach(ShaderInput *input, node->inputs) {
+ if(input->link) {
+ if(node_skip_input(node, input))
+ continue;
+
+ /* connect shaders */
+ string id_from = id(input->link->parent);
+ string id_to = id(node);
+ string param_from = compatible_name(input->link->name);
+ string param_to = compatible_name(input->name);
+
+ /* avoid name conflict with same input/output socket name */
+ if(input->link->parent->input(input->link->name))
+ param_from += "_";
+
+ ss->ConnectShaders(id_from.c_str(), param_from.c_str(), id_to.c_str(), param_to.c_str());
+ }
+ }
+}
+
+void OSLCompiler::parameter(const char *name, float f)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypeFloat, &f);
+}
+
+void OSLCompiler::parameter_color(const char *name, float3 f)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypeColor, &f);
+}
+
+void OSLCompiler::parameter_point(const char *name, float3 f)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypePoint, &f);
+}
+
+void OSLCompiler::parameter_normal(const char *name, float3 f)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypeNormal, &f);
+}
+
+void OSLCompiler::parameter_vector(const char *name, float3 f)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypeVector, &f);
+}
+
+void OSLCompiler::parameter(const char *name, int f)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypeInt, &f);
+}
+
+void OSLCompiler::parameter(const char *name, const char *s)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypeString, &s);
+}
+
+void OSLCompiler::parameter(const char *name, ustring s)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ const char *str = s.c_str();
+ ss->Parameter(name, TypeDesc::TypeString, &str);
+}
+
+void OSLCompiler::parameter(const char *name, const Transform& tfm)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ss->Parameter(name, TypeDesc::TypeMatrix, (float*)&tfm);
+}
+
+void OSLCompiler::find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input)
+{
+ ShaderNode *node = (input->link)? input->link->parent: NULL;
+
+ if(node) {
+ foreach(ShaderInput *in, node->inputs)
+ if(!node_skip_input(node, in))
+ find_dependencies(dependencies, in);
+
+ dependencies.insert(node);
+ }
+}
+
+void OSLCompiler::generate_nodes(const set<ShaderNode*>& nodes)
+{
+ set<ShaderNode*> done;
+ bool nodes_done;
+
+ do {
+ nodes_done = true;
+
+ foreach(ShaderNode *node, nodes) {
+ if(done.find(node) == done.end()) {
+ bool inputs_done = true;
+
+ foreach(ShaderInput *input, node->inputs)
+ if(!node_skip_input(node, input))
+ if(input->link && done.find(input->link->parent) == done.end())
+ inputs_done = false;
+
+ if(inputs_done) {
+ node->compile(*this);
+ done.insert(node);
+
+ if(node->name == ustring("emission"))
+ current_shader->has_surface_emission = true;
+ if(node->name == ustring("transparent"))
+ current_shader->has_surface_transparent = true;
+ }
+ else
+ nodes_done = false;
+ }
+ }
+ } while(!nodes_done);
+}
+
+void OSLCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType type)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+
+ current_type = type;
+
+ ss->ShaderGroupBegin();
+
+ ShaderNode *output = graph->output();
+ set<ShaderNode*> dependencies;
+
+ if(type == SHADER_TYPE_SURFACE) {
+ /* generate surface shader */
+ find_dependencies(dependencies, output->input("Surface"));
+ generate_nodes(dependencies);
+ output->compile(*this);
+ }
+ else if(type == SHADER_TYPE_VOLUME) {
+ /* generate volume shader */
+ find_dependencies(dependencies, output->input("Volume"));
+ generate_nodes(dependencies);
+ output->compile(*this);
+ }
+ else if(type == SHADER_TYPE_DISPLACEMENT) {
+ /* generate displacement shader */
+ find_dependencies(dependencies, output->input("Displacement"));
+ generate_nodes(dependencies);
+ output->compile(*this);
+ }
+ else
+ assert(0);
+
+ ss->ShaderGroupEnd();
+}
+
+void OSLCompiler::compile(OSLGlobals *og, Shader *shader)
+{
+ OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
+ ShaderGraph *graph = shader->graph;
+ ShaderNode *output = (graph)? graph->output(): NULL;
+
+ /* copy graph for shader with bump mapping */
+ if(output->input("Surface")->link && output->input("Displacement")->link)
+ if(!shader->graph_bump)
+ shader->graph_bump = shader->graph->copy();
+
+ /* finalize */
+ shader->graph->finalize(false, true);
+ if(shader->graph_bump)
+ shader->graph_bump->finalize(true, true);
+
+ current_shader = shader;
+
+ shader->has_surface = false;
+ shader->has_surface_emission = false;
+ shader->has_surface_transparent = false;
+ shader->has_volume = false;
+ shader->has_displacement = false;
+
+ /* generate surface shader */
+ if(graph && output->input("Surface")->link) {
+ compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
+ og->surface_state.push_back(ss->state());
+
+ if(shader->graph_bump) {
+ ss->clear_state();
+ compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
+ og->surface_state.push_back(ss->state());
+ }
+ else
+ og->surface_state.push_back(ss->state());
+
+ ss->clear_state();
+
+ shader->has_surface = true;
+ }
+ else {
+ og->surface_state.push_back(OSL::ShadingAttribStateRef());
+ og->surface_state.push_back(OSL::ShadingAttribStateRef());
+ }
+
+ /* generate volume shader */
+ if(graph && output->input("Volume")->link) {
+ compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
+ shader->has_volume = true;
+
+ og->volume_state.push_back(ss->state());
+ og->volume_state.push_back(ss->state());
+ ss->clear_state();
+ }
+ else {
+ og->volume_state.push_back(OSL::ShadingAttribStateRef());
+ og->volume_state.push_back(OSL::ShadingAttribStateRef());
+ }
+
+ /* generate displacement shader */
+ if(graph && output->input("Displacement")->link) {
+ compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
+ shader->has_displacement = true;
+
+ og->displacement_state.push_back(ss->state());
+ og->displacement_state.push_back(ss->state());
+ ss->clear_state();
+ }
+ else {
+ og->displacement_state.push_back(OSL::ShadingAttribStateRef());
+ og->displacement_state.push_back(OSL::ShadingAttribStateRef());
+ }
+}
+
+#else
+
+void OSLCompiler::add(ShaderNode *node, const char *name)
+{
+}
+
+void OSLCompiler::parameter(const char *name, float f)
+{
+}
+
+void OSLCompiler::parameter_color(const char *name, float3 f)
+{
+}
+
+void OSLCompiler::parameter_vector(const char *name, float3 f)
+{
+}
+
+void OSLCompiler::parameter(const char *name, int f)
+{
+}
+
+void OSLCompiler::parameter(const char *name, const char *s)
+{
+}
+
+void OSLCompiler::parameter(const char *name, ustring s)
+{
+}
+
+void OSLCompiler::parameter(const char *name, const Transform& tfm)
+{
+}
+
+#endif /* WITH_OSL */
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/osl.h b/intern/cycles/render/osl.h
new file mode 100644
index 00000000000..329cf9a4828
--- /dev/null
+++ b/intern/cycles/render/osl.h
@@ -0,0 +1,103 @@
+/*
+ * 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 __OSL_H__
+#define __OSL_H__
+
+#include "util_set.h"
+
+#include "shader.h"
+
+#ifdef WITH_OSL
+#include <OSL/oslexec.h>
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class ImageManager;
+class OSLRenderServices;
+class OSLGlobals;
+class Scene;
+class ShaderGraph;
+class ShaderNode;
+class ShaderOutput;
+
+#ifdef WITH_OSL
+
+/* Shader Manage */
+
+class OSLShaderManager : public ShaderManager {
+public:
+ OSLShaderManager();
+ ~OSLShaderManager();
+
+ void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_free(Device *device, DeviceScene *dscene);
+
+private:
+ OSL::ShadingSystem *ss;
+ OSL::TextureSystem *ts;
+ OSLRenderServices *services;
+ OSL::ErrorHandler errhandler;
+};
+
+#endif
+
+/* Graph Compiler */
+
+class OSLCompiler {
+public:
+ OSLCompiler(void *shadingsys);
+ void compile(OSLGlobals *og, Shader *shader);
+
+ void add(ShaderNode *node, const char *name);
+
+ void parameter(const char *name, float f);
+ void parameter_color(const char *name, float3 f);
+ void parameter_vector(const char *name, float3 f);
+ void parameter_normal(const char *name, float3 f);
+ void parameter_point(const char *name, float3 f);
+ void parameter(const char *name, int f);
+ void parameter(const char *name, const char *s);
+ void parameter(const char *name, ustring str);
+ void parameter(const char *name, const Transform& tfm);
+
+ ShaderType output_type() { return current_type; }
+
+ bool background;
+
+private:
+ string id(ShaderNode *node);
+ void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
+ bool node_skip_input(ShaderNode *node, ShaderInput *input);
+ string compatible_name(const char *name);
+
+ void find_dependencies(set<ShaderNode*>& dependencies, ShaderInput *input);
+ void generate_nodes(const set<ShaderNode*>& nodes);
+
+ void *shadingsys;
+ ShaderType current_type;
+ Shader *current_shader;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __OSL_H__ */
+
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
new file mode 100644
index 00000000000..0b2e2b8a9b6
--- /dev/null
+++ b/intern/cycles/render/scene.cpp
@@ -0,0 +1,188 @@
+/*
+ * 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 <stdlib.h>
+
+#include "background.h"
+#include "camera.h"
+#include "device.h"
+#include "film.h"
+#include "filter.h"
+#include "integrator.h"
+#include "light.h"
+#include "shader.h"
+#include "mesh.h"
+#include "object.h"
+#include "scene.h"
+#include "svm.h"
+#include "osl.h"
+
+#include "util_foreach.h"
+#include "util_progress.h"
+
+CCL_NAMESPACE_BEGIN
+
+Scene::Scene(const SceneParams& params_)
+: params(params_)
+{
+ device = NULL;
+ memset(&dscene.data, 0, sizeof(dscene.data));
+
+ camera = new Camera();
+ filter = new Filter();
+ film = new Film();
+ background = new Background();
+ light_manager = new LightManager();
+ mesh_manager = new MeshManager();
+ object_manager = new ObjectManager();
+ integrator = new Integrator();
+ image_manager = new ImageManager();
+ shader_manager = ShaderManager::create(this);
+}
+
+Scene::~Scene()
+{
+ if(device) camera->device_free(device, &dscene);
+ delete camera;
+
+ if(device) filter->device_free(device, &dscene);
+ delete filter;
+
+ if(device) film->device_free(device, &dscene);
+ delete film;
+
+ if(device) background->device_free(device, &dscene);
+ delete background;
+
+ if(device) mesh_manager->device_free(device, &dscene);
+ delete mesh_manager;
+
+ if(device) object_manager->device_free(device, &dscene);
+ delete object_manager;
+
+ if(device) integrator->device_free(device, &dscene);
+ delete integrator;
+
+ if(device) shader_manager->device_free(device, &dscene);
+ delete shader_manager;
+
+ if(device) light_manager->device_free(device, &dscene);
+ delete light_manager;
+
+ foreach(Shader *s, shaders)
+ delete s;
+ foreach(Mesh *m, meshes)
+ delete m;
+ foreach(Object *o, objects)
+ delete o;
+ foreach(Light *l, lights)
+ delete l;
+
+ if(device) image_manager->device_free(device, &dscene);
+ delete image_manager;
+}
+
+void Scene::device_update(Device *device_, Progress& progress)
+{
+ if(!device)
+ device = device_;
+
+ /* The order of updates is important, because there's dependencies between
+ * the different managers, using data computed by previous managers.
+ *
+ * - Background generates shader graph compiled by shader manager.
+ * - Image manager uploads images used by shaders.
+ * - Camera may be used for adapative subdivison.
+ * - Displacement shader must have all shader data available.
+ * - Light manager needs final mesh data to compute emission CDF.
+ */
+
+ progress.set_status("Updating Background");
+ background->device_update(device, &dscene, this);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Shaders");
+ shader_manager->device_update(device, &dscene, this, progress);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Images");
+ image_manager->device_update(device, &dscene, progress);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Camera");
+ camera->device_update(device, &dscene);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Objects");
+ object_manager->device_update(device, &dscene, this, progress);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Meshes");
+ mesh_manager->device_update(device, &dscene, this, progress);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Lights");
+ light_manager->device_update(device, &dscene, this, progress);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Filter");
+ filter->device_update(device, &dscene);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Integrator");
+ integrator->device_update(device, &dscene);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Film");
+ film->device_update(device, &dscene);
+
+ if(progress.get_cancel()) return;
+
+ progress.set_status("Updating Device", "Writing constant memory");
+ device->const_copy_to("__data", &dscene.data, sizeof(dscene.data));
+}
+
+bool Scene::need_update()
+{
+ return (need_reset() || film->need_update);
+}
+
+bool Scene::need_reset()
+{
+ return (background->need_update
+ || image_manager->need_update
+ || camera->need_update
+ || object_manager->need_update
+ || mesh_manager->need_update
+ || light_manager->need_update
+ || filter->need_update
+ || integrator->need_update
+ || shader_manager->need_update);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
new file mode 100644
index 00000000000..17bd7e20129
--- /dev/null
+++ b/intern/cycles/render/scene.h
@@ -0,0 +1,180 @@
+/*
+ * 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 __SCENE_H__
+#define __SCENE_H__
+
+#include "image.h"
+
+#include "device_memory.h"
+
+#include "kernel_types.h"
+
+#include "util_param.h"
+#include "util_string.h"
+#include "util_thread.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Background;
+class Camera;
+class Device;
+class Film;
+class Filter;
+class Integrator;
+class Light;
+class LightManager;
+class Mesh;
+class MeshManager;
+class Object;
+class ObjectManager;
+class Shader;
+class ShaderManager;
+class Progress;
+
+/* Scene Device Data */
+
+class DeviceScene {
+public:
+ /* BVH */
+ device_vector<float4> bvh_nodes;
+ device_vector<uint> object_node;
+ device_vector<float4> tri_woop;
+ device_vector<uint> prim_visibility;
+ device_vector<uint> prim_index;
+ device_vector<uint> prim_object;
+
+ /* mesh */
+ device_vector<float4> tri_normal;
+ device_vector<float4> tri_vnormal;
+ device_vector<float4> tri_vindex;
+ device_vector<float4> tri_verts;
+
+ /* objects */
+ device_vector<float4> objects;
+
+ /* attributes */
+ device_vector<uint4> attributes_map;
+ device_vector<float> attributes_float;
+ device_vector<float4> attributes_float3;
+
+ /* lights */
+ device_vector<float4> light_distribution;
+ device_vector<float4> light_data;
+
+ /* shaders */
+ device_vector<uint4> svm_nodes;
+ device_vector<uint> shader_flag;
+
+ /* filter */
+ device_vector<float> filter_table;
+
+ /* integrator */
+ device_vector<uint> sobol_directions;
+
+ /* images */
+ device_vector<uchar4> tex_image[TEX_IMAGE_MAX];
+
+ KernelData data;
+};
+
+/* Scene Parameters */
+
+class SceneParams {
+public:
+ enum { OSL, SVM } shadingsystem;
+ enum BVHType { BVH_DYNAMIC, BVH_STATIC } bvh_type;
+ bool use_bvh_cache;
+ bool use_bvh_spatial_split;
+ bool use_qbvh;
+
+ SceneParams()
+ {
+ shadingsystem = SVM;
+ bvh_type = BVH_DYNAMIC;
+ use_bvh_cache = false;
+ use_bvh_spatial_split = false;
+#ifdef __QBVH__
+ use_qbvh = true;
+#else
+ use_qbvh = false;
+#endif
+ }
+
+ bool modified(const SceneParams& params)
+ { return !(shadingsystem == params.shadingsystem
+ && bvh_type == params.bvh_type
+ && use_bvh_cache == params.use_bvh_cache
+ && use_bvh_spatial_split == params.use_bvh_spatial_split
+ && use_qbvh == params.use_qbvh); }
+};
+
+/* Scene */
+
+class Scene {
+public:
+ /* data */
+ Camera *camera;
+ Filter *filter;
+ Film *film;
+ Background *background;
+ Integrator *integrator;
+
+ /* data lists */
+ vector<Object*> objects;
+ vector<Mesh*> meshes;
+ vector<Shader*> shaders;
+ vector<Light*> lights;
+
+ /* data managers */
+ ImageManager *image_manager;
+ LightManager *light_manager;
+ ShaderManager *shader_manager;
+ MeshManager *mesh_manager;
+ ObjectManager *object_manager;
+
+ /* default shaders */
+ int default_surface;
+ int default_light;
+ int default_background;
+
+ /* device */
+ Device *device;
+ DeviceScene dscene;
+
+ /* parameters */
+ SceneParams params;
+
+ /* mutex must be locked manually by callers */
+ thread_mutex mutex;
+
+ Scene(const SceneParams& params);
+ ~Scene();
+
+ void device_update(Device *device, Progress& progress);
+
+ bool need_update();
+ bool need_reset();
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SCENE_H__ */
+
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
new file mode 100644
index 00000000000..2deb83674cc
--- /dev/null
+++ b/intern/cycles/render/session.cpp
@@ -0,0 +1,590 @@
+/*
+ * 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 <string.h>
+#include <limits.h>
+
+#include "buffers.h"
+#include "camera.h"
+#include "device.h"
+#include "scene.h"
+#include "session.h"
+
+#include "util_foreach.h"
+#include "util_function.h"
+#include "util_time.h"
+
+CCL_NAMESPACE_BEGIN
+
+Session::Session(const SessionParams& params_)
+: params(params_),
+ tile_manager(params.progressive, params.samples, params.tile_size, params.min_size)
+{
+ device_use_gl = ((params.device_type != DEVICE_CPU) && !params.background);
+
+ device = Device::create(params.device_type, params.background, params.threads);
+ buffers = new RenderBuffers(device);
+ display = new DisplayBuffer(device);
+
+ session_thread = NULL;
+ scene = NULL;
+
+ start_time = 0.0;
+ reset_time = 0.0;
+ preview_time = 0.0;
+ paused_time = 0.0;
+ sample = 0;
+
+ delayed_reset.do_reset = false;
+ delayed_reset.w = 0;
+ delayed_reset.h = 0;
+ delayed_reset.samples = 0;
+
+ display_outdated = false;
+ gpu_draw_ready = false;
+ gpu_need_tonemap = false;
+ pause = false;
+}
+
+Session::~Session()
+{
+ if(session_thread) {
+ progress.set_cancel("Exiting");
+
+ gpu_need_tonemap = false;
+ gpu_need_tonemap_cond.notify_all();
+
+ {
+ thread_scoped_lock pause_lock(pause_mutex);
+ pause = false;
+ }
+ pause_cond.notify_all();
+
+ wait();
+ }
+
+ if(params.output_path != "") {
+ tonemap();
+
+ progress.set_status("Writing Image", params.output_path);
+ display->write(device, params.output_path);
+ }
+
+ delete buffers;
+ delete display;
+ delete scene;
+ delete device;
+}
+
+void Session::start()
+{
+ session_thread = new thread(function_bind(&Session::run, this));
+}
+
+bool Session::ready_to_reset()
+{
+ double dt = time_dt() - reset_time;
+
+ if(!display_outdated)
+ return (dt > params.reset_timeout);
+ else
+ return (dt > params.cancel_timeout);
+}
+
+/* GPU Session */
+
+void Session::reset_gpu(int w, int h, 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
+ that only works in the main thread */
+ thread_scoped_lock display_lock(display->mutex);
+ thread_scoped_lock buffers_lock(buffers->mutex);
+
+ display_outdated = true;
+ reset_time = time_dt();
+
+ reset_(w, h, samples);
+
+ gpu_need_tonemap = false;
+ gpu_need_tonemap_cond.notify_all();
+
+ pause_cond.notify_all();
+}
+
+bool Session::draw_gpu(int w, int h)
+{
+ /* block for buffer access */
+ thread_scoped_lock display_lock(display->mutex);
+
+ /* first check we already rendered something */
+ 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) {
+ /* for CUDA we need to do tonemapping still, since we can
+ only access GL buffers from the main thread */
+ if(gpu_need_tonemap) {
+ thread_scoped_lock buffers_lock(buffers->mutex);
+ tonemap();
+ gpu_need_tonemap = false;
+ gpu_need_tonemap_cond.notify_all();
+ }
+
+ display->draw(device);
+
+ if(display_outdated && (time_dt() - reset_time) > params.text_timeout)
+ return false;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Session::run_gpu()
+{
+ start_time = time_dt();
+ reset_time = time_dt();
+ paused_time = 0.0;
+
+ while(!progress.get_cancel()) {
+ /* advance to next tile */
+ bool no_tiles = !tile_manager.next();
+
+ if(params.background) {
+ /* if no work left and in background mode, we can stop immediately */
+ if(no_tiles) {
+ progress.set_status("Finished");
+ break;
+ }
+ }
+ else {
+ /* if in interactive mode, and we are either paused or done for now,
+ wait for pause condition notify to wake up again */
+ thread_scoped_lock pause_lock(pause_mutex);
+
+ if(pause || no_tiles) {
+ update_status_time(pause, no_tiles);
+
+ while(1) {
+ double pause_start = time_dt();
+ pause_cond.wait(pause_lock);
+ paused_time += time_dt() - pause_start;
+
+ update_status_time(pause, no_tiles);
+ progress.set_update();
+
+ if(!pause)
+ break;
+ }
+ }
+
+ if(progress.get_cancel())
+ break;
+ }
+
+ if(!no_tiles) {
+ /* update scene */
+ update_scene();
+ if(progress.get_cancel())
+ break;
+ }
+
+ if(!no_tiles) {
+ /* buffers mutex is locked entirely while rendering each
+ sample, and released/reacquired on each iteration to allow
+ reset and draw in between */
+ thread_scoped_lock buffers_lock(buffers->mutex);
+
+ /* update status and timing */
+ update_status_time();
+
+ /* path trace */
+ foreach(Tile& tile, tile_manager.state.tiles) {
+ path_trace(tile);
+
+ device->task_wait();
+
+ if(progress.get_cancel())
+ break;
+ }
+
+ /* update status and timing */
+ update_status_time();
+
+ gpu_need_tonemap = true;
+ gpu_draw_ready = true;
+ progress.set_update();
+
+ /* wait for tonemap */
+ if(!params.background) {
+ while(gpu_need_tonemap) {
+ if(progress.get_cancel())
+ break;
+
+ gpu_need_tonemap_cond.wait(buffers_lock);
+ }
+ }
+
+ if(progress.get_cancel())
+ break;
+ }
+ }
+}
+
+/* CPU Session */
+
+void Session::reset_cpu(int w, int h, 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.samples = samples;
+ delayed_reset.do_reset = true;
+ device->task_cancel();
+
+ pause_cond.notify_all();
+}
+
+bool Session::draw_cpu(int w, int h)
+{
+ thread_scoped_lock display_lock(display->mutex);
+
+ /* first check we already rendered something */
+ 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) {
+ display->draw(device);
+
+ if(display_outdated && (time_dt() - reset_time) > params.text_timeout)
+ return false;
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Session::run_cpu()
+{
+ {
+ /* reset once to start */
+ thread_scoped_lock reset_lock(delayed_reset.mutex);
+ thread_scoped_lock buffers_lock(buffers->mutex);
+ thread_scoped_lock display_lock(display->mutex);
+
+ reset_(delayed_reset.w, delayed_reset.h, delayed_reset.samples);
+ delayed_reset.do_reset = false;
+ }
+
+ while(!progress.get_cancel()) {
+ /* advance to next tile */
+ bool no_tiles = !tile_manager.next();
+ bool need_tonemap = false;
+
+ if(params.background) {
+ /* if no work left and in background mode, we can stop immediately */
+ if(no_tiles) {
+ progress.set_status("Finished");
+ break;
+ }
+ }
+ else {
+ /* if in interactive mode, and we are either paused or done for now,
+ wait for pause condition notify to wake up again */
+ thread_scoped_lock pause_lock(pause_mutex);
+
+ if(pause || no_tiles) {
+ update_status_time(pause, no_tiles);
+
+ while(1) {
+ double pause_start = time_dt();
+ pause_cond.wait(pause_lock);
+ paused_time += time_dt() - pause_start;
+
+ update_status_time(pause, no_tiles);
+ progress.set_update();
+
+ if(!pause)
+ break;
+ }
+ }
+
+ if(progress.get_cancel())
+ break;
+ }
+
+ if(!no_tiles) {
+ /* buffers mutex is locked entirely while rendering each
+ sample, and released/reacquired on each iteration to allow
+ reset and draw in between */
+ thread_scoped_lock buffers_lock(buffers->mutex);
+
+ /* update scene */
+ update_scene();
+ if(progress.get_cancel())
+ break;
+
+ /* update status and timing */
+ update_status_time();
+
+ /* path trace */
+ foreach(Tile& tile, tile_manager.state.tiles)
+ path_trace(tile);
+
+ /* update status and timing */
+ update_status_time();
+
+ if(!params.background)
+ need_tonemap = true;
+ }
+
+ device->task_wait();
+
+ {
+ thread_scoped_lock reset_lock(delayed_reset.mutex);
+ thread_scoped_lock buffers_lock(buffers->mutex);
+ thread_scoped_lock display_lock(display->mutex);
+
+ 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);
+ }
+ else if(need_tonemap) {
+ /* tonemap only if we do not reset, we don't we don't
+ want to show the result of an incomplete sample*/
+ tonemap();
+ }
+ }
+
+ progress.set_update();
+ }
+}
+
+void Session::run()
+{
+ /* load kernels */
+ progress.set_status("Loading render kernels (may take a few minutes the first time)");
+
+ if(!device->load_kernels()) {
+ progress.set_status("Failed loading render kernel, see console for errors");
+ progress.set_update();
+ return;
+ }
+
+ /* session thread loop */
+ progress.set_status("Waiting for render to start");
+
+ /* run */
+ if(!progress.get_cancel()) {
+ if(device_use_gl)
+ run_gpu();
+ else
+ run_cpu();
+ }
+
+ /* progress update */
+ if(progress.get_cancel())
+ progress.set_status(progress.get_cancel_message());
+ else
+ progress.set_update();
+}
+
+bool Session::draw(int w, int h)
+{
+ if(device_use_gl)
+ return draw_gpu(w, h);
+ else
+ return draw_cpu(w, h);
+}
+
+void Session::reset_(int w, int h, int samples)
+{
+ if(w != buffers->width || h != buffers->height) {
+ gpu_draw_ready = false;
+ buffers->reset(device, w, h);
+ display->reset(device, w, h);
+ }
+
+ tile_manager.reset(w, h, samples);
+
+ start_time = time_dt();
+ preview_time = 0.0;
+ paused_time = 0.0;
+ sample = 0;
+}
+
+void Session::reset(int w, int h, int samples)
+{
+ if(device_use_gl)
+ reset_gpu(w, h, samples);
+ else
+ reset_cpu(w, h, samples);
+}
+
+void Session::set_samples(int samples)
+{
+ if(samples != params.samples) {
+ params.samples = samples;
+ tile_manager.set_samples(samples);
+
+ {
+ thread_scoped_lock pause_lock(pause_mutex);
+ }
+ pause_cond.notify_all();
+ }
+}
+
+void Session::set_pause(bool pause_)
+{
+ bool notify = false;
+
+ {
+ thread_scoped_lock pause_lock(pause_mutex);
+
+ if(pause != pause_) {
+ pause = pause_;
+ notify = true;
+ }
+ }
+
+ if(notify)
+ pause_cond.notify_all();
+}
+
+void Session::wait()
+{
+ session_thread->join();
+ delete session_thread;
+
+ session_thread = NULL;
+}
+
+void Session::update_scene()
+{
+ thread_scoped_lock scene_lock(scene->mutex);
+
+ progress.set_status("Updating Scene");
+
+ /* update camera if dimensions changed for progressive render */
+ Camera *cam = scene->camera;
+ int w = tile_manager.state.width;
+ int h = tile_manager.state.height;
+
+ if(cam->width != w || cam->height != h) {
+ cam->width = w;
+ cam->height = h;
+ cam->tag_update();
+ }
+
+ /* update scene */
+ if(scene->need_update())
+ scene->device_update(device, progress);
+}
+
+void Session::update_status_time(bool show_pause, bool show_done)
+{
+ int sample = tile_manager.state.sample;
+ int resolution = tile_manager.state.resolution;
+
+ /* update status */
+ string status, substatus;
+
+ if(!params.progressive)
+ substatus = "Path Tracing";
+ else if(params.samples == INT_MAX)
+ substatus = string_printf("Path Tracing Sample %d", sample+1);
+ else
+ substatus = string_printf("Path Tracing Sample %d/%d", sample+1, params.samples);
+
+ if(show_pause)
+ status = "Paused";
+ else if(show_done)
+ status = "Done";
+ else
+ status = "Rendering";
+
+ progress.set_status(status, substatus);
+
+ /* update timing */
+ if(preview_time == 0.0 && resolution == 1)
+ preview_time = time_dt();
+
+ double total_time = time_dt() - start_time - paused_time;
+ double sample_time = (sample == 0)? 0.0: (time_dt() - preview_time - paused_time)/(sample);
+
+ /* negative can happen when we pause a bit before rendering, can discard that */
+ if(total_time < 0.0) total_time = 0.0;
+ if(preview_time < 0.0) preview_time = 0.0;
+
+ progress.set_sample(sample + 1, total_time, sample_time);
+}
+
+void Session::path_trace(Tile& tile)
+{
+ /* add path trace task */
+ DeviceTask task(DeviceTask::PATH_TRACE);
+
+ task.x = tile.x;
+ task.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;
+
+ device->task_add(task);
+}
+
+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.rgba = display->rgba.device_pointer;
+ task.buffer = buffers->buffer.device_pointer;
+ task.sample = tile_manager.state.sample;
+ task.resolution = tile_manager.state.resolution;
+
+ if(task.w > 0 && task.h > 0) {
+ device->task_add(task);
+ device->task_wait();
+
+ /* set display to new size */
+ display->draw_set(task.w, task.h);
+ }
+
+ display_outdated = false;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
new file mode 100644
index 00000000000..82c14227d03
--- /dev/null
+++ b/intern/cycles/render/session.h
@@ -0,0 +1,163 @@
+/*
+ * 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 __SESSION_H__
+#define __SESSION_H__
+
+#include "device.h"
+#include "tile.h"
+
+#include "util_progress.h"
+#include "util_thread.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class DisplayBuffer;
+class Progress;
+class RenderBuffers;
+class Scene;
+
+/* Session Parameters */
+
+class SessionParams {
+public:
+ DeviceType device_type;
+ bool background;
+ string output_path;
+
+ bool progressive;
+ int samples;
+ int tile_size;
+ int min_size;
+ int threads;
+
+ double cancel_timeout;
+ double reset_timeout;
+ double text_timeout;
+
+ SessionParams()
+ {
+ device_type = DEVICE_CPU;
+ background = false;
+ output_path = "";
+
+ progressive = false;
+ samples = INT_MAX;
+ tile_size = 64;
+ min_size = 64;
+ threads = 0;
+
+ cancel_timeout = 0.1;
+ reset_timeout = 0.1;
+ text_timeout = 1.0;
+ }
+
+ bool modified(const SessionParams& params)
+ { return !(device_type == params.device_type
+ && background == params.background
+ && output_path == params.output_path
+ /* && samples == params.samples */
+ && progressive == params.progressive
+ && tile_size == params.tile_size
+ && min_size == params.min_size
+ && threads == params.threads
+ && cancel_timeout == params.cancel_timeout
+ && reset_timeout == params.reset_timeout
+ && text_timeout == params.text_timeout); }
+
+};
+
+/* Session
+ *
+ * This is the class that contains the session thread, running the render
+ * control loop and dispatching tasks. */
+
+class Session {
+public:
+ Device *device;
+ Scene *scene;
+ RenderBuffers *buffers;
+ DisplayBuffer *display;
+ Progress progress;
+ SessionParams params;
+ int sample;
+
+ Session(const SessionParams& params);
+ ~Session();
+
+ void start();
+ bool draw(int w, int h);
+ void wait();
+
+ bool ready_to_reset();
+ void reset(int w, int h, int samples);
+ void set_samples(int samples);
+ void set_pause(bool pause);
+
+protected:
+ struct DelayedReset {
+ thread_mutex mutex;
+ bool do_reset;
+ int w, h;
+ int samples;
+ } delayed_reset;
+
+ void run();
+
+ void update_scene();
+ void update_status_time(bool show_pause = false, bool show_done = false);
+
+ void tonemap();
+ void path_trace(Tile& tile);
+ void reset_(int w, int h, int samples);
+
+ void run_cpu();
+ bool draw_cpu(int w, int h);
+ void reset_cpu(int w, int h, int samples);
+
+ void run_gpu();
+ bool draw_gpu(int w, int h);
+ void reset_gpu(int w, int h, int samples);
+
+ TileManager tile_manager;
+ bool device_use_gl;
+
+ thread *session_thread;
+
+ volatile bool display_outdated;
+
+ volatile bool gpu_draw_ready;
+ volatile bool gpu_need_tonemap;
+ thread_condition_variable gpu_need_tonemap_cond;
+
+ bool pause;
+ thread_condition_variable pause_cond;
+ thread_mutex pause_mutex;
+
+ double start_time;
+ double reset_time;
+ double preview_time;
+ double paused_time;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SESSION_H__ */
+
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
new file mode 100644
index 00000000000..6e827ec94bb
--- /dev/null
+++ b/intern/cycles/render/shader.cpp
@@ -0,0 +1,259 @@
+/*
+ * 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 "device.h"
+#include "graph.h"
+#include "light.h"
+#include "mesh.h"
+#include "nodes.h"
+#include "osl.h"
+#include "scene.h"
+#include "shader.h"
+#include "svm.h"
+
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Shader */
+
+Shader::Shader()
+{
+ name = "";
+
+ graph = NULL;
+ graph_bump = NULL;
+
+ sample_as_light = true;
+ homogeneous_volume = false;
+
+ has_surface = false;
+ has_surface_transparent = false;
+ has_surface_emission = false;
+ has_volume = false;
+ has_displacement = false;
+
+ need_update = true;
+ need_update_attributes = true;
+}
+
+Shader::~Shader()
+{
+ delete graph;
+ delete graph_bump;
+}
+
+void Shader::set_graph(ShaderGraph *graph_)
+{
+ /* assign graph */
+ delete graph;
+ delete graph_bump;
+ graph = graph_;
+ graph_bump = NULL;
+}
+
+void Shader::tag_update(Scene *scene)
+{
+ /* update tag */
+ need_update = true;
+ scene->shader_manager->need_update = true;
+
+ /* if the shader previously was emissive, update light distribution,
+ * if the new shader is emissive, a light manager update tag will be
+ * done in the shader manager device update. */
+ if(sample_as_light && has_surface_emission)
+ scene->light_manager->need_update = true;
+
+ /* get requested attributes. this could be optimized by pruning unused
+ nodes here already, but that's the job of the shader manager currently,
+ and may not be so great for interactive rendering where you temporarily
+ disconnect a node */
+ AttributeRequestSet prev_attributes = attributes;
+
+ attributes.clear();
+ foreach(ShaderNode *node, graph->nodes)
+ node->attributes(&attributes);
+
+ /* compare if the attributes changed, mesh manager will check
+ need_update_attributes, update the relevant meshes and clear it. */
+ if(attributes.modified(prev_attributes)) {
+ need_update_attributes = true;
+ scene->mesh_manager->need_update = true;
+ }
+}
+
+/* Shader Manager */
+
+ShaderManager::ShaderManager()
+{
+ need_update = true;
+}
+
+ShaderManager::~ShaderManager()
+{
+}
+
+ShaderManager *ShaderManager::create(Scene *scene)
+{
+ ShaderManager *manager;
+
+#ifdef WITH_OSL
+ if(scene->params.shadingsystem == SceneParams::OSL)
+ manager = new OSLShaderManager();
+ else
+#endif
+ manager = new SVMShaderManager();
+
+ add_default(scene);
+
+ return manager;
+}
+
+uint ShaderManager::get_attribute_id(ustring name)
+{
+ /* get a unique id for each name, for SVM attribute lookup */
+ AttributeIDMap::iterator it = unique_attribute_id.find(name);
+
+ if(it != unique_attribute_id.end())
+ return it->second;
+
+ uint id = (uint)Attribute::STD_NUM + unique_attribute_id.size();
+ unique_attribute_id[name] = id;
+ return id;
+}
+
+uint ShaderManager::get_attribute_id(Attribute::Standard std)
+{
+ return (uint)std;
+}
+
+int ShaderManager::get_shader_id(uint shader, Mesh *mesh, bool smooth)
+{
+ /* get a shader id to pass to the kernel */
+ int id = shader*2;
+
+ /* index depends bump since this setting is not in the shader */
+ if(mesh && mesh->displacement_method != Mesh::DISPLACE_TRUE)
+ id += 1;
+ /* smooth flag */
+ if(smooth)
+ id |= SHADER_SMOOTH_NORMAL;
+
+ /* default flags */
+ id |= SHADER_CAST_SHADOW|SHADER_AREA_LIGHT;
+
+ return id;
+}
+
+void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ device_free_common(device, dscene);
+
+ if(scene->shaders.size() == 0)
+ return;
+
+ uint shader_flag_size = scene->shaders.size()*2;
+ uint *shader_flag = dscene->shader_flag.resize(shader_flag_size);
+ uint i = 0;
+
+ foreach(Shader *shader, scene->shaders) {
+ uint flag = 0;
+
+ if(shader->sample_as_light)
+ flag |= SD_SAMPLE_AS_LIGHT;
+ if(shader->has_surface_transparent)
+ flag |= SD_HAS_SURFACE_TRANSPARENT;
+ if(shader->has_volume)
+ flag |= SD_HAS_VOLUME;
+ if(shader->homogeneous_volume)
+ flag |= SD_HOMOGENEOUS_VOLUME;
+
+ shader_flag[i++] = flag;
+ shader_flag[i++] = flag;
+ }
+
+ device->tex_alloc("__shader_flag", dscene->shader_flag);
+}
+
+void ShaderManager::device_free_common(Device *device, DeviceScene *dscene)
+{
+ device->tex_free(dscene->shader_flag);
+ dscene->shader_flag.clear();
+}
+
+void ShaderManager::add_default(Scene *scene)
+{
+ Shader *shader;
+ ShaderGraph *graph;
+ ShaderNode *closure, *out;
+
+ /* default surface */
+ {
+ graph = new ShaderGraph();
+
+ closure = graph->add(new DiffuseBsdfNode());
+ closure->input("Color")->value = make_float3(0.8f, 0.8f, 0.8f);
+ out = graph->output();
+
+ graph->connect(closure->output("BSDF"), out->input("Surface"));
+
+ shader = new Shader();
+ shader->name = "default_surface";
+ shader->graph = graph;
+ scene->shaders.push_back(shader);
+ scene->default_surface = scene->shaders.size() - 1;
+ }
+
+ /* default light */
+ {
+ graph = new ShaderGraph();
+
+ closure = graph->add(new EmissionNode());
+ closure->input("Color")->value = make_float3(0.8f, 0.8f, 0.8f);
+ closure->input("Strength")->value.x = 0.0f;
+ out = graph->output();
+
+ graph->connect(closure->output("Emission"), out->input("Surface"));
+
+ shader = new Shader();
+ shader->name = "default_light";
+ shader->graph = graph;
+ scene->shaders.push_back(shader);
+ scene->default_light = scene->shaders.size() - 1;
+ }
+
+ /* default background */
+ {
+ graph = new ShaderGraph();
+
+ closure = graph->add(new BackgroundNode());
+ closure->input("Color")->value = make_float3(0.8f, 0.8f, 0.8f);
+ out = graph->output();
+
+ graph->connect(closure->output("Background"), out->input("Surface"));
+
+ shader = new Shader();
+ shader->name = "default_background";
+ shader->graph = graph;
+ scene->shaders.push_back(shader);
+ scene->default_background = scene->shaders.size() - 1;
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
new file mode 100644
index 00000000000..45efa123ef6
--- /dev/null
+++ b/intern/cycles/render/shader.h
@@ -0,0 +1,124 @@
+/*
+ * 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 __SHADER_H__
+#define __SHADER_H__
+
+#include "attribute.h"
+#include "kernel_types.h"
+
+#include "util_map.h"
+#include "util_param.h"
+#include "util_string.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class Mesh;
+class Progress;
+class Scene;
+class ShaderGraph;
+struct float3;
+
+/* Shader describing the appearance of a Mesh, Light or Background.
+ *
+ * While there is only a single shader graph, it has three outputs: surface,
+ * volume and displacement, that the shader manager will compile and execute
+ * separately. */
+
+class Shader {
+public:
+ /* name */
+ string name;
+
+ /* shader graph */
+ ShaderGraph *graph;
+
+ /* shader graph with auto bump mapping included, we compile two shaders,
+ with and without bump, because the displacement method is a mesh
+ level setting, so we need to handle both */
+ ShaderGraph *graph_bump;
+
+ /* sampling */
+ bool sample_as_light;
+ bool homogeneous_volume;
+
+ /* synchronization */
+ bool need_update;
+ bool need_update_attributes;
+
+ /* information about shader after compiling */
+ bool has_surface;
+ bool has_surface_emission;
+ bool has_surface_transparent;
+ bool has_volume;
+ bool has_displacement;
+
+ /* requested mesh attributes */
+ AttributeRequestSet attributes;
+
+ Shader();
+ ~Shader();
+
+ void set_graph(ShaderGraph *graph);
+ void tag_update(Scene *scene);
+};
+
+/* Shader Manager virtual base class
+ *
+ * From this the SVM and OSL shader managers are derived, that do the actual
+ * shader compiling and device updating. */
+
+class ShaderManager {
+public:
+ bool need_update;
+
+ static ShaderManager *create(Scene *scene);
+ virtual ~ShaderManager();
+
+ /* device update */
+ virtual void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) = 0;
+ virtual void device_free(Device *device, DeviceScene *dscene) = 0;
+
+ void device_update_common(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_free_common(Device *device, DeviceScene *dscene);
+
+ /* get globally unique id for a type of attribute */
+ uint get_attribute_id(ustring name);
+ uint get_attribute_id(Attribute::Standard std);
+
+ /* get shader id for mesh faces */
+ int get_shader_id(uint shader, Mesh *mesh = NULL, bool smooth = false);
+
+ /* add default shaders to scene, to use as default for things that don't
+ have any shader assigned explicitly */
+ static void add_default(Scene *scene);
+
+protected:
+ ShaderManager();
+
+ typedef unordered_map<ustring, uint, ustringHash> AttributeIDMap;
+ AttributeIDMap unique_attribute_id;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SHADER_H__ */
+
diff --git a/intern/cycles/render/sobol.cpp b/intern/cycles/render/sobol.cpp
new file mode 100644
index 00000000000..be8939174b4
--- /dev/null
+++ b/intern/cycles/render/sobol.cpp
@@ -0,0 +1,21304 @@
+/*
+ * Sobol sequence direction vectors.
+ *
+ * This file contains code to create direction vectors for generating sobol
+ * sequences in high dimensions. It is adapted from code on this webpage:
+ *
+ * http://web.maths.unsw.edu.au/~fkuo/sobol/
+ *
+ * From these papers:
+ *
+ * S. Joe and F. Y. Kuo, Remark on Algorithm 659: Implementing Sobol's quasirandom
+ * sequence generator, ACM Trans. Math. Softw. 29, 49-57 (2003)
+ *
+ * S. Joe and F. Y. Kuo, Constructing Sobol sequences with better two-dimensional
+ * projections, SIAM J. Sci. Comput. 30, 2635-2654 (2008)
+ *
+ */
+
+/* Copyright (c) 2008, Frances Y. Kuo and Stephen Joe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the names of the copyright holders nor the names of the
+ * University of New South Wales and the University of Waikato
+ * and its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "util_debug.h"
+
+#include "sobol.h"
+
+CCL_NAMESPACE_BEGIN
+
+#define SOBOL_MAX_NUMBER 32
+
+typedef struct SobolDirectionNumbers {
+ unsigned int d, s, a;
+ unsigned int m[SOBOL_MAX_NUMBER];
+} SobolDirectionNumbers;
+
+static SobolDirectionNumbers SOBOL_NUMBERS[SOBOL_MAX_DIMENSIONS-1] = {
+{2, 1, 0, {1}},
+{3, 2, 1, {1, 3}},
+{4, 3, 1, {1, 3, 1}},
+{5, 3, 2, {1, 1, 1}},
+{6, 4, 1, {1, 1, 3, 3}},
+{7, 4, 4, {1, 3, 5, 13}},
+{8, 5, 2, {1, 1, 5, 5, 17}},
+{9, 5, 4, {1, 1, 5, 5, 5}},
+{10, 5, 7, {1, 1, 7, 11, 19}},
+{11, 5, 11, {1, 1, 5, 1, 1}},
+{12, 5, 13, {1, 1, 1, 3, 11}},
+{13, 5, 14, {1, 3, 5, 5, 31}},
+{14, 6, 1, {1, 3, 3, 9, 7, 49}},
+{15, 6, 13, {1, 1, 1, 15, 21, 21}},
+{16, 6, 16, {1, 3, 1, 13, 27, 49}},
+{17, 6, 19, {1, 1, 1, 15, 7, 5}},
+{18, 6, 22, {1, 3, 1, 15, 13, 25}},
+{19, 6, 25, {1, 1, 5, 5, 19, 61}},
+{20, 7, 1, {1, 3, 7, 11, 23, 15, 103}},
+{21, 7, 4, {1, 3, 7, 13, 13, 15, 69}},
+{22, 7, 7, {1, 1, 3, 13, 7, 35, 63}},
+{23, 7, 8, {1, 3, 5, 9, 1, 25, 53}},
+{24, 7, 14, {1, 3, 1, 13, 9, 35, 107}},
+{25, 7, 19, {1, 3, 1, 5, 27, 61, 31}},
+{26, 7, 21, {1, 1, 5, 11, 19, 41, 61}},
+{27, 7, 28, {1, 3, 5, 3, 3, 13, 69}},
+{28, 7, 31, {1, 1, 7, 13, 1, 19, 1}},
+{29, 7, 32, {1, 3, 7, 5, 13, 19, 59}},
+{30, 7, 37, {1, 1, 3, 9, 25, 29, 41}},
+{31, 7, 41, {1, 3, 5, 13, 23, 1, 55}},
+{32, 7, 42, {1, 3, 7, 3, 13, 59, 17}},
+{33, 7, 50, {1, 3, 1, 3, 5, 53, 69}},
+{34, 7, 55, {1, 1, 5, 5, 23, 33, 13}},
+{35, 7, 56, {1, 1, 7, 7, 1, 61, 123}},
+{36, 7, 59, {1, 1, 7, 9, 13, 61, 49}},
+{37, 7, 62, {1, 3, 3, 5, 3, 55, 33}},
+{38, 8, 14, {1, 3, 1, 15, 31, 13, 49, 245}},
+{39, 8, 21, {1, 3, 5, 15, 31, 59, 63, 97}},
+{40, 8, 22, {1, 3, 1, 11, 11, 11, 77, 249}},
+{41, 8, 38, {1, 3, 1, 11, 27, 43, 71, 9}},
+{42, 8, 47, {1, 1, 7, 15, 21, 11, 81, 45}},
+{43, 8, 49, {1, 3, 7, 3, 25, 31, 65, 79}},
+{44, 8, 50, {1, 3, 1, 1, 19, 11, 3, 205}},
+{45, 8, 52, {1, 1, 5, 9, 19, 21, 29, 157}},
+{46, 8, 56, {1, 3, 7, 11, 1, 33, 89, 185}},
+{47, 8, 67, {1, 3, 3, 3, 15, 9, 79, 71}},
+{48, 8, 70, {1, 3, 7, 11, 15, 39, 119, 27}},
+{49, 8, 84, {1, 1, 3, 1, 11, 31, 97, 225}},
+{50, 8, 97, {1, 1, 1, 3, 23, 43, 57, 177}},
+{51, 8, 103, {1, 3, 7, 7, 17, 17, 37, 71}},
+{52, 8, 115, {1, 3, 1, 5, 27, 63, 123, 213}},
+{53, 8, 122, {1, 1, 3, 5, 11, 43, 53, 133}},
+{54, 9, 8, {1, 3, 5, 5, 29, 17, 47, 173, 479}},
+{55, 9, 13, {1, 3, 3, 11, 3, 1, 109, 9, 69}},
+{56, 9, 16, {1, 1, 1, 5, 17, 39, 23, 5, 343}},
+{57, 9, 22, {1, 3, 1, 5, 25, 15, 31, 103, 499}},
+{58, 9, 25, {1, 1, 1, 11, 11, 17, 63, 105, 183}},
+{59, 9, 44, {1, 1, 5, 11, 9, 29, 97, 231, 363}},
+{60, 9, 47, {1, 1, 5, 15, 19, 45, 41, 7, 383}},
+{61, 9, 52, {1, 3, 7, 7, 31, 19, 83, 137, 221}},
+{62, 9, 55, {1, 1, 1, 3, 23, 15, 111, 223, 83}},
+{63, 9, 59, {1, 1, 5, 13, 31, 15, 55, 25, 161}},
+{64, 9, 62, {1, 1, 3, 13, 25, 47, 39, 87, 257}},
+{65, 9, 67, {1, 1, 1, 11, 21, 53, 125, 249, 293}},
+{66, 9, 74, {1, 1, 7, 11, 11, 7, 57, 79, 323}},
+{67, 9, 81, {1, 1, 5, 5, 17, 13, 81, 3, 131}},
+{68, 9, 82, {1, 1, 7, 13, 23, 7, 65, 251, 475}},
+{69, 9, 87, {1, 3, 5, 1, 9, 43, 3, 149, 11}},
+{70, 9, 91, {1, 1, 3, 13, 31, 13, 13, 255, 487}},
+{71, 9, 94, {1, 3, 3, 1, 5, 63, 89, 91, 127}},
+{72, 9, 103, {1, 1, 3, 3, 1, 19, 123, 127, 237}},
+{73, 9, 104, {1, 1, 5, 7, 23, 31, 37, 243, 289}},
+{74, 9, 109, {1, 1, 5, 11, 17, 53, 117, 183, 491}},
+{75, 9, 122, {1, 1, 1, 5, 1, 13, 13, 209, 345}},
+{76, 9, 124, {1, 1, 3, 15, 1, 57, 115, 7, 33}},
+{77, 9, 137, {1, 3, 1, 11, 7, 43, 81, 207, 175}},
+{78, 9, 138, {1, 3, 1, 1, 15, 27, 63, 255, 49}},
+{79, 9, 143, {1, 3, 5, 3, 27, 61, 105, 171, 305}},
+{80, 9, 145, {1, 1, 5, 3, 1, 3, 57, 249, 149}},
+{81, 9, 152, {1, 1, 3, 5, 5, 57, 15, 13, 159}},
+{82, 9, 157, {1, 1, 1, 11, 7, 11, 105, 141, 225}},
+{83, 9, 167, {1, 3, 3, 5, 27, 59, 121, 101, 271}},
+{84, 9, 173, {1, 3, 5, 9, 11, 49, 51, 59, 115}},
+{85, 9, 176, {1, 1, 7, 1, 23, 45, 125, 71, 419}},
+{86, 9, 181, {1, 1, 3, 5, 23, 5, 105, 109, 75}},
+{87, 9, 182, {1, 1, 7, 15, 7, 11, 67, 121, 453}},
+{88, 9, 185, {1, 3, 7, 3, 9, 13, 31, 27, 449}},
+{89, 9, 191, {1, 3, 1, 15, 19, 39, 39, 89, 15}},
+{90, 9, 194, {1, 1, 1, 1, 1, 33, 73, 145, 379}},
+{91, 9, 199, {1, 3, 1, 15, 15, 43, 29, 13, 483}},
+{92, 9, 218, {1, 1, 7, 3, 19, 27, 85, 131, 431}},
+{93, 9, 220, {1, 3, 3, 3, 5, 35, 23, 195, 349}},
+{94, 9, 227, {1, 3, 3, 7, 9, 27, 39, 59, 297}},
+{95, 9, 229, {1, 1, 3, 9, 11, 17, 13, 241, 157}},
+{96, 9, 230, {1, 3, 7, 15, 25, 57, 33, 189, 213}},
+{97, 9, 234, {1, 1, 7, 1, 9, 55, 73, 83, 217}},
+{98, 9, 236, {1, 3, 3, 13, 19, 27, 23, 113, 249}},
+{99, 9, 241, {1, 3, 5, 3, 23, 43, 3, 253, 479}},
+{100, 9, 244, {1, 1, 5, 5, 11, 5, 45, 117, 217}},
+{101, 9, 253, {1, 3, 3, 7, 29, 37, 33, 123, 147}},
+{102, 10, 4, {1, 3, 1, 15, 5, 5, 37, 227, 223, 459}},
+{103, 10, 13, {1, 1, 7, 5, 5, 39, 63, 255, 135, 487}},
+{104, 10, 19, {1, 3, 1, 7, 9, 7, 87, 249, 217, 599}},
+{105, 10, 22, {1, 1, 3, 13, 9, 47, 7, 225, 363, 247}},
+{106, 10, 50, {1, 3, 7, 13, 19, 13, 9, 67, 9, 737}},
+{107, 10, 55, {1, 3, 5, 5, 19, 59, 7, 41, 319, 677}},
+{108, 10, 64, {1, 1, 5, 3, 31, 63, 15, 43, 207, 789}},
+{109, 10, 69, {1, 1, 7, 9, 13, 39, 3, 47, 497, 169}},
+{110, 10, 98, {1, 3, 1, 7, 21, 17, 97, 19, 415, 905}},
+{111, 10, 107, {1, 3, 7, 1, 3, 31, 71, 111, 165, 127}},
+{112, 10, 115, {1, 1, 5, 11, 1, 61, 83, 119, 203, 847}},
+{113, 10, 121, {1, 3, 3, 13, 9, 61, 19, 97, 47, 35}},
+{114, 10, 127, {1, 1, 7, 7, 15, 29, 63, 95, 417, 469}},
+{115, 10, 134, {1, 3, 1, 9, 25, 9, 71, 57, 213, 385}},
+{116, 10, 140, {1, 3, 5, 13, 31, 47, 101, 57, 39, 341}},
+{117, 10, 145, {1, 1, 3, 3, 31, 57, 125, 173, 365, 551}},
+{118, 10, 152, {1, 3, 7, 1, 13, 57, 67, 157, 451, 707}},
+{119, 10, 158, {1, 1, 1, 7, 21, 13, 105, 89, 429, 965}},
+{120, 10, 161, {1, 1, 5, 9, 17, 51, 45, 119, 157, 141}},
+{121, 10, 171, {1, 3, 7, 7, 13, 45, 91, 9, 129, 741}},
+{122, 10, 181, {1, 3, 7, 1, 23, 57, 67, 141, 151, 571}},
+{123, 10, 194, {1, 1, 3, 11, 17, 47, 93, 107, 375, 157}},
+{124, 10, 199, {1, 3, 3, 5, 11, 21, 43, 51, 169, 915}},
+{125, 10, 203, {1, 1, 5, 3, 15, 55, 101, 67, 455, 625}},
+{126, 10, 208, {1, 3, 5, 9, 1, 23, 29, 47, 345, 595}},
+{127, 10, 227, {1, 3, 7, 7, 5, 49, 29, 155, 323, 589}},
+{128, 10, 242, {1, 3, 3, 7, 5, 41, 127, 61, 261, 717}},
+{129, 10, 251, {1, 3, 7, 7, 17, 23, 117, 67, 129, 1009}},
+{130, 10, 253, {1, 1, 3, 13, 11, 39, 21, 207, 123, 305}},
+{131, 10, 265, {1, 1, 3, 9, 29, 3, 95, 47, 231, 73}},
+{132, 10, 266, {1, 3, 1, 9, 1, 29, 117, 21, 441, 259}},
+{133, 10, 274, {1, 3, 1, 13, 21, 39, 125, 211, 439, 723}},
+{134, 10, 283, {1, 1, 7, 3, 17, 63, 115, 89, 49, 773}},
+{135, 10, 289, {1, 3, 7, 13, 11, 33, 101, 107, 63, 73}},
+{136, 10, 295, {1, 1, 5, 5, 13, 57, 63, 135, 437, 177}},
+{137, 10, 301, {1, 1, 3, 7, 27, 63, 93, 47, 417, 483}},
+{138, 10, 316, {1, 1, 3, 1, 23, 29, 1, 191, 49, 23}},
+{139, 10, 319, {1, 1, 3, 15, 25, 55, 9, 101, 219, 607}},
+{140, 10, 324, {1, 3, 1, 7, 7, 19, 51, 251, 393, 307}},
+{141, 10, 346, {1, 3, 3, 3, 25, 55, 17, 75, 337, 3}},
+{142, 10, 352, {1, 1, 1, 13, 25, 17, 65, 45, 479, 413}},
+{143, 10, 361, {1, 1, 7, 7, 27, 49, 99, 161, 213, 727}},
+{144, 10, 367, {1, 3, 5, 1, 23, 5, 43, 41, 251, 857}},
+{145, 10, 382, {1, 3, 3, 7, 11, 61, 39, 87, 383, 835}},
+{146, 10, 395, {1, 1, 3, 15, 13, 7, 29, 7, 505, 923}},
+{147, 10, 398, {1, 3, 7, 1, 5, 31, 47, 157, 445, 501}},
+{148, 10, 400, {1, 1, 3, 7, 1, 43, 9, 147, 115, 605}},
+{149, 10, 412, {1, 3, 3, 13, 5, 1, 119, 211, 455, 1001}},
+{150, 10, 419, {1, 1, 3, 5, 13, 19, 3, 243, 75, 843}},
+{151, 10, 422, {1, 3, 7, 7, 1, 19, 91, 249, 357, 589}},
+{152, 10, 426, {1, 1, 1, 9, 1, 25, 109, 197, 279, 411}},
+{153, 10, 428, {1, 3, 1, 15, 23, 57, 59, 135, 191, 75}},
+{154, 10, 433, {1, 1, 5, 15, 29, 21, 39, 253, 383, 349}},
+{155, 10, 446, {1, 3, 3, 5, 19, 45, 61, 151, 199, 981}},
+{156, 10, 454, {1, 3, 5, 13, 9, 61, 107, 141, 141, 1}},
+{157, 10, 457, {1, 3, 1, 11, 27, 25, 85, 105, 309, 979}},
+{158, 10, 472, {1, 3, 3, 11, 19, 7, 115, 223, 349, 43}},
+{159, 10, 493, {1, 1, 7, 9, 21, 39, 123, 21, 275, 927}},
+{160, 10, 505, {1, 1, 7, 13, 15, 41, 47, 243, 303, 437}},
+{161, 10, 508, {1, 1, 1, 7, 7, 3, 15, 99, 409, 719}},
+{162, 11, 2, {1, 3, 3, 15, 27, 49, 113, 123, 113, 67, 469}},
+{163, 11, 11, {1, 3, 7, 11, 3, 23, 87, 169, 119, 483, 199}},
+{164, 11, 21, {1, 1, 5, 15, 7, 17, 109, 229, 179, 213, 741}},
+{165, 11, 22, {1, 1, 5, 13, 11, 17, 25, 135, 403, 557, 1433}},
+{166, 11, 35, {1, 3, 1, 1, 1, 61, 67, 215, 189, 945, 1243}},
+{167, 11, 49, {1, 1, 7, 13, 17, 33, 9, 221, 429, 217, 1679}},
+{168, 11, 50, {1, 1, 3, 11, 27, 3, 15, 93, 93, 865, 1049}},
+{169, 11, 56, {1, 3, 7, 7, 25, 41, 121, 35, 373, 379, 1547}},
+{170, 11, 61, {1, 3, 3, 9, 11, 35, 45, 205, 241, 9, 59}},
+{171, 11, 70, {1, 3, 1, 7, 3, 51, 7, 177, 53, 975, 89}},
+{172, 11, 74, {1, 1, 3, 5, 27, 1, 113, 231, 299, 759, 861}},
+{173, 11, 79, {1, 3, 3, 15, 25, 29, 5, 255, 139, 891, 2031}},
+{174, 11, 84, {1, 3, 1, 1, 13, 9, 109, 193, 419, 95, 17}},
+{175, 11, 88, {1, 1, 7, 9, 3, 7, 29, 41, 135, 839, 867}},
+{176, 11, 103, {1, 1, 7, 9, 25, 49, 123, 217, 113, 909, 215}},
+{177, 11, 104, {1, 1, 7, 3, 23, 15, 43, 133, 217, 327, 901}},
+{178, 11, 112, {1, 1, 3, 3, 13, 53, 63, 123, 477, 711, 1387}},
+{179, 11, 115, {1, 1, 3, 15, 7, 29, 75, 119, 181, 957, 247}},
+{180, 11, 117, {1, 1, 1, 11, 27, 25, 109, 151, 267, 99, 1461}},
+{181, 11, 122, {1, 3, 7, 15, 5, 5, 53, 145, 11, 725, 1501}},
+{182, 11, 134, {1, 3, 7, 1, 9, 43, 71, 229, 157, 607, 1835}},
+{183, 11, 137, {1, 3, 3, 13, 25, 1, 5, 27, 471, 349, 127}},
+{184, 11, 146, {1, 1, 1, 1, 23, 37, 9, 221, 269, 897, 1685}},
+{185, 11, 148, {1, 1, 3, 3, 31, 29, 51, 19, 311, 553, 1969}},
+{186, 11, 157, {1, 3, 7, 5, 5, 55, 17, 39, 475, 671, 1529}},
+{187, 11, 158, {1, 1, 7, 1, 1, 35, 47, 27, 437, 395, 1635}},
+{188, 11, 162, {1, 1, 7, 3, 13, 23, 43, 135, 327, 139, 389}},
+{189, 11, 164, {1, 3, 7, 3, 9, 25, 91, 25, 429, 219, 513}},
+{190, 11, 168, {1, 1, 3, 5, 13, 29, 119, 201, 277, 157, 2043}},
+{191, 11, 173, {1, 3, 5, 3, 29, 57, 13, 17, 167, 739, 1031}},
+{192, 11, 185, {1, 3, 3, 5, 29, 21, 95, 27, 255, 679, 1531}},
+{193, 11, 186, {1, 3, 7, 15, 9, 5, 21, 71, 61, 961, 1201}},
+{194, 11, 191, {1, 3, 5, 13, 15, 57, 33, 93, 459, 867, 223}},
+{195, 11, 193, {1, 1, 1, 15, 17, 43, 127, 191, 67, 177, 1073}},
+{196, 11, 199, {1, 1, 1, 15, 23, 7, 21, 199, 75, 293, 1611}},
+{197, 11, 213, {1, 3, 7, 13, 15, 39, 21, 149, 65, 741, 319}},
+{198, 11, 214, {1, 3, 7, 11, 23, 13, 101, 89, 277, 519, 711}},
+{199, 11, 220, {1, 3, 7, 15, 19, 27, 85, 203, 441, 97, 1895}},
+{200, 11, 227, {1, 3, 1, 3, 29, 25, 21, 155, 11, 191, 197}},
+{201, 11, 236, {1, 1, 7, 5, 27, 11, 81, 101, 457, 675, 1687}},
+{202, 11, 242, {1, 3, 1, 5, 25, 5, 65, 193, 41, 567, 781}},
+{203, 11, 251, {1, 3, 1, 5, 11, 15, 113, 77, 411, 695, 1111}},
+{204, 11, 256, {1, 1, 3, 9, 11, 53, 119, 171, 55, 297, 509}},
+{205, 11, 259, {1, 1, 1, 1, 11, 39, 113, 139, 165, 347, 595}},
+{206, 11, 265, {1, 3, 7, 11, 9, 17, 101, 13, 81, 325, 1733}},
+{207, 11, 266, {1, 3, 1, 1, 21, 43, 115, 9, 113, 907, 645}},
+{208, 11, 276, {1, 1, 7, 3, 9, 25, 117, 197, 159, 471, 475}},
+{209, 11, 292, {1, 3, 1, 9, 11, 21, 57, 207, 485, 613, 1661}},
+{210, 11, 304, {1, 1, 7, 7, 27, 55, 49, 223, 89, 85, 1523}},
+{211, 11, 310, {1, 1, 5, 3, 19, 41, 45, 51, 447, 299, 1355}},
+{212, 11, 316, {1, 3, 1, 13, 1, 33, 117, 143, 313, 187, 1073}},
+{213, 11, 319, {1, 1, 7, 7, 5, 11, 65, 97, 377, 377, 1501}},
+{214, 11, 322, {1, 3, 1, 1, 21, 35, 95, 65, 99, 23, 1239}},
+{215, 11, 328, {1, 1, 5, 9, 3, 37, 95, 167, 115, 425, 867}},
+{216, 11, 334, {1, 3, 3, 13, 1, 37, 27, 189, 81, 679, 773}},
+{217, 11, 339, {1, 1, 3, 11, 1, 61, 99, 233, 429, 969, 49}},
+{218, 11, 341, {1, 1, 1, 7, 25, 63, 99, 165, 245, 793, 1143}},
+{219, 11, 345, {1, 1, 5, 11, 11, 43, 55, 65, 71, 283, 273}},
+{220, 11, 346, {1, 1, 5, 5, 9, 3, 101, 251, 355, 379, 1611}},
+{221, 11, 362, {1, 1, 1, 15, 21, 63, 85, 99, 49, 749, 1335}},
+{222, 11, 367, {1, 1, 5, 13, 27, 9, 121, 43, 255, 715, 289}},
+{223, 11, 372, {1, 3, 1, 5, 27, 19, 17, 223, 77, 571, 1415}},
+{224, 11, 375, {1, 1, 5, 3, 13, 59, 125, 251, 195, 551, 1737}},
+{225, 11, 376, {1, 3, 3, 15, 13, 27, 49, 105, 389, 971, 755}},
+{226, 11, 381, {1, 3, 5, 15, 23, 43, 35, 107, 447, 763, 253}},
+{227, 11, 385, {1, 3, 5, 11, 21, 3, 17, 39, 497, 407, 611}},
+{228, 11, 388, {1, 1, 7, 13, 15, 31, 113, 17, 23, 507, 1995}},
+{229, 11, 392, {1, 1, 7, 15, 3, 15, 31, 153, 423, 79, 503}},
+{230, 11, 409, {1, 1, 7, 9, 19, 25, 23, 171, 505, 923, 1989}},
+{231, 11, 415, {1, 1, 5, 9, 21, 27, 121, 223, 133, 87, 697}},
+{232, 11, 416, {1, 1, 5, 5, 9, 19, 107, 99, 319, 765, 1461}},
+{233, 11, 421, {1, 1, 3, 3, 19, 25, 3, 101, 171, 729, 187}},
+{234, 11, 428, {1, 1, 3, 1, 13, 23, 85, 93, 291, 209, 37}},
+{235, 11, 431, {1, 1, 1, 15, 25, 25, 77, 253, 333, 947, 1073}},
+{236, 11, 434, {1, 1, 3, 9, 17, 29, 55, 47, 255, 305, 2037}},
+{237, 11, 439, {1, 3, 3, 9, 29, 63, 9, 103, 489, 939, 1523}},
+{238, 11, 446, {1, 3, 7, 15, 7, 31, 89, 175, 369, 339, 595}},
+{239, 11, 451, {1, 3, 7, 13, 25, 5, 71, 207, 251, 367, 665}},
+{240, 11, 453, {1, 3, 3, 3, 21, 25, 75, 35, 31, 321, 1603}},
+{241, 11, 457, {1, 1, 1, 9, 11, 1, 65, 5, 11, 329, 535}},
+{242, 11, 458, {1, 1, 5, 3, 19, 13, 17, 43, 379, 485, 383}},
+{243, 11, 471, {1, 3, 5, 13, 13, 9, 85, 147, 489, 787, 1133}},
+{244, 11, 475, {1, 3, 1, 1, 5, 51, 37, 129, 195, 297, 1783}},
+{245, 11, 478, {1, 1, 3, 15, 19, 57, 59, 181, 455, 697, 2033}},
+{246, 11, 484, {1, 3, 7, 1, 27, 9, 65, 145, 325, 189, 201}},
+{247, 11, 493, {1, 3, 1, 15, 31, 23, 19, 5, 485, 581, 539}},
+{248, 11, 494, {1, 1, 7, 13, 11, 15, 65, 83, 185, 847, 831}},
+{249, 11, 499, {1, 3, 5, 7, 7, 55, 73, 15, 303, 511, 1905}},
+{250, 11, 502, {1, 3, 5, 9, 7, 21, 45, 15, 397, 385, 597}},
+{251, 11, 517, {1, 3, 7, 3, 23, 13, 73, 221, 511, 883, 1265}},
+{252, 11, 518, {1, 1, 3, 11, 1, 51, 73, 185, 33, 975, 1441}},
+{253, 11, 524, {1, 3, 3, 9, 19, 59, 21, 39, 339, 37, 143}},
+{254, 11, 527, {1, 1, 7, 1, 31, 33, 19, 167, 117, 635, 639}},
+{255, 11, 555, {1, 1, 1, 3, 5, 13, 59, 83, 355, 349, 1967}},
+{256, 11, 560, {1, 1, 1, 5, 19, 3, 53, 133, 97, 863, 983}},
+{257, 11, 565, {1, 3, 1, 13, 9, 41, 91, 105, 173, 97, 625}},
+{258, 11, 569, {1, 1, 5, 3, 7, 49, 115, 133, 71, 231, 1063}},
+{259, 11, 578, {1, 1, 7, 5, 17, 43, 47, 45, 497, 547, 757}},
+{260, 11, 580, {1, 3, 5, 15, 21, 61, 123, 191, 249, 31, 631}},
+{261, 11, 587, {1, 3, 7, 9, 17, 7, 11, 185, 127, 169, 1951}},
+{262, 11, 589, {1, 1, 5, 13, 11, 11, 9, 49, 29, 125, 791}},
+{263, 11, 590, {1, 1, 1, 15, 31, 41, 13, 167, 273, 429, 57}},
+{264, 11, 601, {1, 3, 5, 3, 27, 7, 35, 209, 65, 265, 1393}},
+{265, 11, 607, {1, 3, 1, 13, 31, 19, 53, 143, 135, 9, 1021}},
+{266, 11, 611, {1, 1, 7, 13, 31, 5, 115, 153, 143, 957, 623}},
+{267, 11, 614, {1, 1, 5, 11, 25, 19, 29, 31, 297, 943, 443}},
+{268, 11, 617, {1, 3, 3, 5, 21, 11, 127, 81, 479, 25, 699}},
+{269, 11, 618, {1, 1, 3, 11, 25, 31, 97, 19, 195, 781, 705}},
+{270, 11, 625, {1, 1, 5, 5, 31, 11, 75, 207, 197, 885, 2037}},
+{271, 11, 628, {1, 1, 1, 11, 9, 23, 29, 231, 307, 17, 1497}},
+{272, 11, 635, {1, 1, 5, 11, 11, 43, 111, 233, 307, 523, 1259}},
+{273, 11, 641, {1, 1, 7, 5, 1, 21, 107, 229, 343, 933, 217}},
+{274, 11, 647, {1, 1, 1, 11, 3, 21, 125, 131, 405, 599, 1469}},
+{275, 11, 654, {1, 3, 5, 5, 9, 39, 33, 81, 389, 151, 811}},
+{276, 11, 659, {1, 1, 7, 7, 7, 1, 59, 223, 265, 529, 2021}},
+{277, 11, 662, {1, 3, 1, 3, 9, 23, 85, 181, 47, 265, 49}},
+{278, 11, 672, {1, 3, 5, 11, 19, 23, 9, 7, 157, 299, 1983}},
+{279, 11, 675, {1, 3, 1, 5, 15, 5, 21, 105, 29, 339, 1041}},
+{280, 11, 682, {1, 1, 1, 1, 5, 33, 65, 85, 111, 705, 479}},
+{281, 11, 684, {1, 1, 1, 7, 9, 35, 77, 87, 151, 321, 101}},
+{282, 11, 689, {1, 1, 5, 7, 17, 1, 51, 197, 175, 811, 1229}},
+{283, 11, 695, {1, 3, 3, 15, 23, 37, 85, 185, 239, 543, 731}},
+{284, 11, 696, {1, 3, 1, 7, 7, 55, 111, 109, 289, 439, 243}},
+{285, 11, 713, {1, 1, 7, 11, 17, 53, 35, 217, 259, 853, 1667}},
+{286, 11, 719, {1, 3, 1, 9, 1, 63, 87, 17, 73, 565, 1091}},
+{287, 11, 724, {1, 1, 3, 3, 11, 41, 1, 57, 295, 263, 1029}},
+{288, 11, 733, {1, 1, 5, 1, 27, 45, 109, 161, 411, 421, 1395}},
+{289, 11, 734, {1, 3, 5, 11, 25, 35, 47, 191, 339, 417, 1727}},
+{290, 11, 740, {1, 1, 5, 15, 21, 1, 93, 251, 351, 217, 1767}},
+{291, 11, 747, {1, 3, 3, 11, 3, 7, 75, 155, 313, 211, 491}},
+{292, 11, 749, {1, 3, 3, 5, 11, 9, 101, 161, 453, 913, 1067}},
+{293, 11, 752, {1, 1, 3, 1, 15, 45, 127, 141, 163, 727, 1597}},
+{294, 11, 755, {1, 3, 3, 7, 1, 33, 63, 73, 73, 341, 1691}},
+{295, 11, 762, {1, 3, 5, 13, 15, 39, 53, 235, 77, 99, 949}},
+{296, 11, 770, {1, 1, 5, 13, 31, 17, 97, 13, 215, 301, 1927}},
+{297, 11, 782, {1, 1, 7, 1, 1, 37, 91, 93, 441, 251, 1131}},
+{298, 11, 784, {1, 3, 7, 9, 25, 5, 105, 69, 81, 943, 1459}},
+{299, 11, 787, {1, 3, 7, 11, 31, 43, 13, 209, 27, 1017, 501}},
+{300, 11, 789, {1, 1, 7, 15, 1, 33, 31, 233, 161, 507, 387}},
+{301, 11, 793, {1, 3, 3, 5, 5, 53, 33, 177, 503, 627, 1927}},
+{302, 11, 796, {1, 1, 7, 11, 7, 61, 119, 31, 457, 229, 1875}},
+{303, 11, 803, {1, 1, 5, 15, 19, 5, 53, 201, 157, 885, 1057}},
+{304, 11, 805, {1, 3, 7, 9, 1, 35, 51, 113, 249, 425, 1009}},
+{305, 11, 810, {1, 3, 5, 7, 21, 53, 37, 155, 119, 345, 631}},
+{306, 11, 815, {1, 3, 5, 7, 15, 31, 109, 69, 503, 595, 1879}},
+{307, 11, 824, {1, 3, 3, 1, 25, 35, 65, 131, 403, 705, 503}},
+{308, 11, 829, {1, 3, 7, 7, 19, 33, 11, 153, 45, 633, 499}},
+{309, 11, 830, {1, 3, 3, 5, 11, 3, 29, 93, 487, 33, 703}},
+{310, 11, 832, {1, 1, 3, 15, 21, 53, 107, 179, 387, 927, 1757}},
+{311, 11, 841, {1, 1, 3, 7, 21, 45, 51, 147, 175, 317, 361}},
+{312, 11, 847, {1, 1, 1, 7, 7, 13, 15, 243, 269, 795, 1965}},
+{313, 11, 849, {1, 1, 3, 5, 19, 33, 57, 115, 443, 537, 627}},
+{314, 11, 861, {1, 3, 3, 9, 3, 39, 25, 61, 185, 717, 1049}},
+{315, 11, 871, {1, 3, 7, 3, 7, 37, 107, 153, 7, 269, 1581}},
+{316, 11, 878, {1, 1, 7, 3, 7, 41, 91, 41, 145, 489, 1245}},
+{317, 11, 889, {1, 1, 5, 9, 7, 7, 105, 81, 403, 407, 283}},
+{318, 11, 892, {1, 1, 7, 9, 27, 55, 29, 77, 193, 963, 949}},
+{319, 11, 901, {1, 1, 5, 3, 25, 51, 107, 63, 403, 917, 815}},
+{320, 11, 908, {1, 1, 7, 3, 7, 61, 19, 51, 457, 599, 535}},
+{321, 11, 920, {1, 3, 7, 1, 23, 51, 105, 153, 239, 215, 1847}},
+{322, 11, 923, {1, 1, 3, 5, 27, 23, 79, 49, 495, 45, 1935}},
+{323, 11, 942, {1, 1, 1, 11, 11, 47, 55, 133, 495, 999, 1461}},
+{324, 11, 949, {1, 1, 3, 15, 27, 51, 93, 17, 355, 763, 1675}},
+{325, 11, 950, {1, 3, 1, 3, 1, 3, 79, 119, 499, 17, 995}},
+{326, 11, 954, {1, 1, 1, 1, 15, 43, 45, 17, 167, 973, 799}},
+{327, 11, 961, {1, 1, 1, 3, 27, 49, 89, 29, 483, 913, 2023}},
+{328, 11, 968, {1, 1, 3, 3, 5, 11, 75, 7, 41, 851, 611}},
+{329, 11, 971, {1, 3, 1, 3, 7, 57, 39, 123, 257, 283, 507}},
+{330, 11, 973, {1, 3, 3, 11, 27, 23, 113, 229, 187, 299, 133}},
+{331, 11, 979, {1, 1, 3, 13, 9, 63, 101, 77, 451, 169, 337}},
+{332, 11, 982, {1, 3, 7, 3, 3, 59, 45, 195, 229, 415, 409}},
+{333, 11, 986, {1, 3, 5, 3, 11, 19, 71, 93, 43, 857, 369}},
+{334, 11, 998, {1, 3, 7, 9, 19, 33, 115, 19, 241, 703, 247}},
+{335, 11, 1001, {1, 3, 5, 11, 5, 35, 21, 155, 463, 1005, 1073}},
+{336, 11, 1010, {1, 3, 7, 3, 25, 15, 109, 83, 93, 69, 1189}},
+{337, 11, 1012, {1, 3, 5, 7, 5, 21, 93, 133, 135, 167, 903}},
+{338, 12, 41, {1, 1, 7, 7, 3, 59, 121, 161, 285, 815, 1769, 3705}},
+{339, 12, 52, {1, 3, 1, 1, 3, 47, 103, 171, 381, 609, 185, 373}},
+{340, 12, 61, {1, 3, 3, 15, 23, 33, 107, 131, 441, 445, 689, 2059}},
+{341, 12, 62, {1, 3, 3, 11, 7, 53, 101, 167, 435, 803, 1255, 3781}},
+{342, 12, 76, {1, 1, 5, 11, 15, 59, 41, 19, 135, 835, 1263, 505}},
+{343, 12, 104, {1, 1, 7, 11, 21, 49, 23, 219, 127, 961, 1065, 385}},
+{344, 12, 117, {1, 3, 5, 15, 7, 47, 117, 217, 45, 731, 1639, 733}},
+{345, 12, 131, {1, 1, 7, 11, 27, 57, 91, 87, 81, 35, 1269, 1007}},
+{346, 12, 143, {1, 1, 3, 11, 15, 37, 53, 219, 193, 937, 1899, 3733}},
+{347, 12, 145, {1, 3, 5, 3, 13, 11, 27, 19, 199, 393, 965, 2195}},
+{348, 12, 157, {1, 3, 1, 3, 5, 1, 37, 173, 413, 1023, 553, 409}},
+{349, 12, 167, {1, 3, 1, 7, 15, 29, 123, 95, 255, 373, 1799, 3841}},
+{350, 12, 171, {1, 3, 5, 13, 21, 57, 51, 17, 511, 195, 1157, 1831}},
+{351, 12, 176, {1, 1, 1, 15, 29, 19, 7, 73, 295, 519, 587, 3523}},
+{352, 12, 181, {1, 1, 5, 13, 13, 35, 115, 191, 123, 535, 717, 1661}},
+{353, 12, 194, {1, 3, 3, 5, 23, 21, 47, 251, 379, 921, 1119, 297}},
+{354, 12, 217, {1, 3, 3, 9, 29, 53, 121, 201, 135, 193, 523, 2943}},
+{355, 12, 236, {1, 1, 1, 7, 29, 45, 125, 9, 99, 867, 425, 601}},
+{356, 12, 239, {1, 3, 1, 9, 13, 15, 67, 181, 109, 293, 1305, 3079}},
+{357, 12, 262, {1, 3, 3, 9, 5, 35, 15, 209, 305, 87, 767, 2795}},
+{358, 12, 283, {1, 3, 3, 11, 27, 57, 113, 123, 179, 643, 149, 523}},
+{359, 12, 286, {1, 1, 3, 15, 11, 17, 67, 223, 63, 657, 335, 3309}},
+{360, 12, 307, {1, 1, 1, 9, 25, 29, 109, 159, 39, 513, 571, 1761}},
+{361, 12, 313, {1, 1, 3, 1, 5, 63, 75, 19, 455, 601, 123, 691}},
+{362, 12, 319, {1, 1, 1, 3, 21, 5, 45, 169, 377, 513, 1951, 2565}},
+{363, 12, 348, {1, 1, 3, 11, 3, 33, 119, 69, 253, 907, 805, 1449}},
+{364, 12, 352, {1, 1, 5, 13, 31, 15, 17, 7, 499, 61, 687, 1867}},
+{365, 12, 357, {1, 3, 7, 11, 17, 33, 73, 77, 299, 243, 641, 2345}},
+{366, 12, 391, {1, 1, 7, 11, 9, 35, 31, 235, 359, 647, 379, 1161}},
+{367, 12, 398, {1, 3, 3, 15, 31, 25, 5, 67, 33, 45, 437, 4067}},
+{368, 12, 400, {1, 1, 3, 11, 7, 17, 37, 87, 333, 253, 1517, 2921}},
+{369, 12, 412, {1, 1, 7, 15, 7, 15, 107, 189, 153, 769, 1521, 3427}},
+{370, 12, 415, {1, 3, 5, 13, 5, 61, 113, 37, 293, 393, 113, 43}},
+{371, 12, 422, {1, 1, 1, 15, 29, 43, 107, 31, 167, 147, 301, 1021}},
+{372, 12, 440, {1, 1, 1, 13, 3, 1, 35, 93, 195, 181, 2027, 1491}},
+{373, 12, 460, {1, 3, 3, 3, 13, 33, 77, 199, 153, 221, 1699, 3671}},
+{374, 12, 465, {1, 3, 5, 13, 7, 49, 123, 155, 495, 681, 819, 809}},
+{375, 12, 468, {1, 3, 5, 15, 27, 61, 117, 189, 183, 887, 617, 4053}},
+{376, 12, 515, {1, 1, 1, 7, 31, 59, 125, 235, 389, 369, 447, 1039}},
+{377, 12, 536, {1, 3, 5, 1, 5, 39, 115, 89, 249, 377, 431, 3747}},
+{378, 12, 539, {1, 1, 1, 5, 7, 47, 59, 157, 77, 445, 699, 3439}},
+{379, 12, 551, {1, 1, 3, 5, 11, 21, 19, 75, 11, 599, 1575, 735}},
+{380, 12, 558, {1, 3, 5, 3, 19, 13, 41, 69, 199, 143, 1761, 3215}},
+{381, 12, 563, {1, 3, 5, 7, 19, 43, 25, 41, 41, 11, 1647, 2783}},
+{382, 12, 570, {1, 3, 1, 9, 19, 45, 111, 97, 405, 399, 457, 3219}},
+{383, 12, 595, {1, 1, 3, 1, 23, 15, 65, 121, 59, 985, 829, 2259}},
+{384, 12, 598, {1, 1, 3, 7, 17, 13, 107, 229, 75, 551, 1299, 2363}},
+{385, 12, 617, {1, 1, 5, 5, 21, 57, 23, 199, 509, 139, 2007, 3875}},
+{386, 12, 647, {1, 3, 1, 11, 19, 53, 15, 229, 215, 741, 695, 823}},
+{387, 12, 654, {1, 3, 7, 1, 29, 3, 17, 163, 417, 559, 549, 319}},
+{388, 12, 678, {1, 3, 1, 13, 17, 9, 47, 133, 365, 7, 1937, 1071}},
+{389, 12, 713, {1, 3, 5, 7, 19, 37, 55, 163, 301, 249, 689, 2327}},
+{390, 12, 738, {1, 3, 5, 13, 11, 23, 61, 205, 257, 377, 615, 1457}},
+{391, 12, 747, {1, 3, 5, 1, 23, 37, 13, 75, 331, 495, 579, 3367}},
+{392, 12, 750, {1, 1, 1, 9, 1, 23, 49, 129, 475, 543, 883, 2531}},
+{393, 12, 757, {1, 3, 1, 5, 23, 59, 51, 35, 343, 695, 219, 369}},
+{394, 12, 772, {1, 3, 3, 1, 27, 17, 63, 97, 71, 507, 1929, 613}},
+{395, 12, 803, {1, 1, 5, 1, 21, 31, 11, 109, 247, 409, 1817, 2173}},
+{396, 12, 810, {1, 1, 3, 15, 23, 9, 7, 209, 301, 23, 147, 1691}},
+{397, 12, 812, {1, 1, 7, 5, 5, 19, 37, 229, 249, 277, 1115, 2309}},
+{398, 12, 850, {1, 1, 1, 5, 5, 63, 5, 249, 285, 431, 343, 2467}},
+{399, 12, 862, {1, 1, 1, 11, 7, 45, 35, 75, 505, 537, 29, 2919}},
+{400, 12, 906, {1, 3, 5, 15, 11, 39, 15, 63, 263, 9, 199, 445}},
+{401, 12, 908, {1, 3, 3, 3, 27, 63, 53, 171, 227, 63, 1049, 827}},
+{402, 12, 929, {1, 1, 3, 13, 7, 11, 115, 183, 179, 937, 1785, 381}},
+{403, 12, 930, {1, 3, 1, 11, 13, 15, 107, 81, 53, 295, 1785, 3757}},
+{404, 12, 954, {1, 3, 3, 13, 11, 5, 109, 243, 3, 505, 323, 1373}},
+{405, 12, 964, {1, 3, 3, 11, 21, 51, 17, 177, 381, 937, 1263, 3889}},
+{406, 12, 982, {1, 3, 5, 9, 27, 25, 85, 193, 143, 573, 1189, 2995}},
+{407, 12, 985, {1, 3, 5, 11, 13, 9, 81, 21, 159, 953, 91, 1751}},
+{408, 12, 991, {1, 1, 3, 3, 27, 61, 11, 253, 391, 333, 1105, 635}},
+{409, 12, 992, {1, 3, 3, 15, 9, 57, 95, 81, 419, 735, 251, 1141}},
+{410, 12, 1067, {1, 1, 5, 9, 31, 39, 59, 13, 319, 807, 1241, 2433}},
+{411, 12, 1070, {1, 3, 3, 5, 27, 13, 107, 141, 423, 937, 2027, 3233}},
+{412, 12, 1096, {1, 3, 3, 9, 9, 25, 125, 23, 443, 835, 1245, 847}},
+{413, 12, 1099, {1, 1, 7, 15, 17, 17, 83, 107, 411, 285, 847, 1571}},
+{414, 12, 1116, {1, 1, 3, 13, 29, 61, 37, 81, 349, 727, 1453, 1957}},
+{415, 12, 1143, {1, 3, 7, 11, 31, 13, 59, 77, 273, 591, 1265, 1533}},
+{416, 12, 1165, {1, 1, 7, 7, 13, 17, 25, 25, 187, 329, 347, 1473}},
+{417, 12, 1178, {1, 3, 7, 7, 5, 51, 37, 99, 221, 153, 503, 2583}},
+{418, 12, 1184, {1, 3, 1, 13, 19, 27, 11, 69, 181, 479, 1183, 3229}},
+{419, 12, 1202, {1, 3, 3, 13, 23, 21, 103, 147, 323, 909, 947, 315}},
+{420, 12, 1213, {1, 3, 1, 3, 23, 1, 31, 59, 93, 513, 45, 2271}},
+{421, 12, 1221, {1, 3, 5, 1, 7, 43, 109, 59, 231, 41, 1515, 2385}},
+{422, 12, 1240, {1, 3, 1, 5, 31, 57, 49, 223, 283, 1013, 11, 701}},
+{423, 12, 1246, {1, 1, 5, 1, 19, 53, 55, 31, 31, 299, 495, 693}},
+{424, 12, 1252, {1, 3, 3, 9, 5, 33, 77, 253, 427, 791, 731, 1019}},
+{425, 12, 1255, {1, 3, 7, 11, 1, 9, 119, 203, 53, 877, 1707, 3499}},
+{426, 12, 1267, {1, 1, 3, 7, 13, 39, 55, 159, 423, 113, 1653, 3455}},
+{427, 12, 1293, {1, 1, 3, 5, 21, 47, 51, 59, 55, 411, 931, 251}},
+{428, 12, 1301, {1, 3, 7, 3, 31, 25, 81, 115, 405, 239, 741, 455}},
+{429, 12, 1305, {1, 1, 5, 1, 31, 3, 101, 83, 479, 491, 1779, 2225}},
+{430, 12, 1332, {1, 3, 3, 3, 9, 37, 107, 161, 203, 503, 767, 3435}},
+{431, 12, 1349, {1, 3, 7, 9, 1, 27, 61, 119, 233, 39, 1375, 4089}},
+{432, 12, 1384, {1, 1, 5, 9, 1, 31, 45, 51, 369, 587, 383, 2813}},
+{433, 12, 1392, {1, 3, 7, 5, 31, 7, 49, 119, 487, 591, 1627, 53}},
+{434, 12, 1402, {1, 1, 7, 1, 9, 47, 1, 223, 369, 711, 1603, 1917}},
+{435, 12, 1413, {1, 3, 5, 3, 21, 37, 111, 17, 483, 739, 1193, 2775}},
+{436, 12, 1417, {1, 3, 3, 7, 17, 11, 51, 117, 455, 191, 1493, 3821}},
+{437, 12, 1423, {1, 1, 5, 9, 23, 39, 99, 181, 343, 485, 99, 1931}},
+{438, 12, 1451, {1, 3, 1, 7, 29, 49, 31, 71, 489, 527, 1763, 2909}},
+{439, 12, 1480, {1, 1, 5, 11, 5, 5, 73, 189, 321, 57, 1191, 3685}},
+{440, 12, 1491, {1, 1, 5, 15, 13, 45, 125, 207, 371, 415, 315, 983}},
+{441, 12, 1503, {1, 3, 3, 5, 25, 59, 33, 31, 239, 919, 1859, 2709}},
+{442, 12, 1504, {1, 3, 5, 13, 27, 61, 23, 115, 61, 413, 1275, 3559}},
+{443, 12, 1513, {1, 3, 7, 15, 5, 59, 101, 81, 47, 967, 809, 3189}},
+{444, 12, 1538, {1, 1, 5, 11, 31, 15, 39, 25, 173, 505, 809, 2677}},
+{445, 12, 1544, {1, 1, 5, 9, 19, 13, 95, 89, 511, 127, 1395, 2935}},
+{446, 12, 1547, {1, 1, 5, 5, 31, 45, 9, 57, 91, 303, 1295, 3215}},
+{447, 12, 1555, {1, 3, 3, 3, 19, 15, 113, 187, 217, 489, 1285, 1803}},
+{448, 12, 1574, {1, 1, 3, 1, 13, 29, 57, 139, 255, 197, 537, 2183}},
+{449, 12, 1603, {1, 3, 1, 15, 11, 7, 53, 255, 467, 9, 757, 3167}},
+{450, 12, 1615, {1, 3, 3, 15, 21, 13, 9, 189, 359, 323, 49, 333}},
+{451, 12, 1618, {1, 3, 7, 11, 7, 37, 21, 119, 401, 157, 1659, 1069}},
+{452, 12, 1629, {1, 1, 5, 7, 17, 33, 115, 229, 149, 151, 2027, 279}},
+{453, 12, 1634, {1, 1, 5, 15, 5, 49, 77, 155, 383, 385, 1985, 945}},
+{454, 12, 1636, {1, 3, 7, 3, 7, 55, 85, 41, 357, 527, 1715, 1619}},
+{455, 12, 1639, {1, 1, 3, 1, 21, 45, 115, 21, 199, 967, 1581, 3807}},
+{456, 12, 1657, {1, 1, 3, 7, 21, 39, 117, 191, 169, 73, 413, 3417}},
+{457, 12, 1667, {1, 1, 1, 13, 1, 31, 57, 195, 231, 321, 367, 1027}},
+{458, 12, 1681, {1, 3, 7, 3, 11, 29, 47, 161, 71, 419, 1721, 437}},
+{459, 12, 1697, {1, 1, 7, 3, 11, 9, 43, 65, 157, 1, 1851, 823}},
+{460, 12, 1704, {1, 1, 1, 5, 21, 15, 31, 101, 293, 299, 127, 1321}},
+{461, 12, 1709, {1, 1, 7, 1, 27, 1, 11, 229, 241, 705, 43, 1475}},
+{462, 12, 1722, {1, 3, 7, 1, 5, 15, 73, 183, 193, 55, 1345, 49}},
+{463, 12, 1730, {1, 3, 3, 3, 19, 3, 55, 21, 169, 663, 1675, 137}},
+{464, 12, 1732, {1, 1, 1, 13, 7, 21, 69, 67, 373, 965, 1273, 2279}},
+{465, 12, 1802, {1, 1, 7, 7, 21, 23, 17, 43, 341, 845, 465, 3355}},
+{466, 12, 1804, {1, 3, 5, 5, 25, 5, 81, 101, 233, 139, 359, 2057}},
+{467, 12, 1815, {1, 1, 3, 11, 15, 39, 55, 3, 471, 765, 1143, 3941}},
+{468, 12, 1826, {1, 1, 7, 15, 9, 57, 81, 79, 215, 433, 333, 3855}},
+{469, 12, 1832, {1, 1, 5, 5, 19, 45, 83, 31, 209, 363, 701, 1303}},
+{470, 12, 1843, {1, 3, 7, 5, 1, 13, 55, 163, 435, 807, 287, 2031}},
+{471, 12, 1849, {1, 3, 3, 7, 3, 3, 17, 197, 39, 169, 489, 1769}},
+{472, 12, 1863, {1, 1, 3, 5, 29, 43, 87, 161, 289, 339, 1233, 2353}},
+{473, 12, 1905, {1, 3, 3, 9, 21, 9, 77, 1, 453, 167, 1643, 2227}},
+{474, 12, 1928, {1, 1, 7, 1, 15, 7, 67, 33, 193, 241, 1031, 2339}},
+{475, 12, 1933, {1, 3, 1, 11, 1, 63, 45, 65, 265, 661, 849, 1979}},
+{476, 12, 1939, {1, 3, 1, 13, 19, 49, 3, 11, 159, 213, 659, 2839}},
+{477, 12, 1976, {1, 3, 5, 11, 9, 29, 27, 227, 253, 449, 1403, 3427}},
+{478, 12, 1996, {1, 1, 3, 1, 7, 3, 77, 143, 277, 779, 1499, 475}},
+{479, 12, 2013, {1, 1, 1, 5, 11, 23, 87, 131, 393, 849, 193, 3189}},
+{480, 12, 2014, {1, 3, 5, 11, 3, 3, 89, 9, 449, 243, 1501, 1739}},
+{481, 12, 2020, {1, 3, 1, 9, 29, 29, 113, 15, 65, 611, 135, 3687}},
+{482, 13, 13, {1, 1, 1, 9, 21, 19, 39, 151, 395, 501, 1339, 959, 2725}},
+{483, 13, 19, {1, 3, 7, 1, 7, 35, 45, 33, 119, 225, 1631, 1695, 1459}},
+{484, 13, 26, {1, 1, 1, 3, 25, 55, 37, 79, 167, 907, 1075, 271, 4059}},
+{485, 13, 41, {1, 3, 5, 13, 5, 13, 53, 165, 437, 67, 1705, 3177, 8095}},
+{486, 13, 50, {1, 3, 3, 13, 27, 57, 95, 55, 443, 245, 1945, 1725, 1929}},
+{487, 13, 55, {1, 3, 1, 9, 5, 33, 109, 35, 99, 827, 341, 2401, 2411}},
+{488, 13, 69, {1, 1, 5, 9, 7, 33, 43, 39, 87, 799, 635, 3481, 7159}},
+{489, 13, 70, {1, 3, 1, 1, 31, 15, 45, 27, 337, 113, 987, 2065, 2529}},
+{490, 13, 79, {1, 1, 5, 9, 5, 15, 105, 123, 479, 289, 1609, 2177, 4629}},
+{491, 13, 82, {1, 3, 5, 11, 31, 47, 97, 87, 385, 195, 1041, 651, 3271}},
+{492, 13, 87, {1, 1, 3, 7, 17, 3, 101, 55, 87, 629, 1687, 1387, 2745}},
+{493, 13, 93, {1, 3, 5, 5, 7, 21, 9, 237, 313, 549, 1107, 117, 6183}},
+{494, 13, 94, {1, 1, 3, 9, 9, 5, 55, 201, 487, 851, 1103, 2993, 4055}},
+{495, 13, 97, {1, 1, 5, 9, 31, 19, 59, 7, 363, 381, 1167, 2057, 5715}},
+{496, 13, 100, {1, 3, 3, 15, 23, 63, 19, 227, 387, 827, 487, 1049, 7471}},
+{497, 13, 112, {1, 3, 1, 5, 23, 25, 61, 245, 363, 863, 963, 3583, 6475}},
+{498, 13, 121, {1, 1, 5, 1, 5, 27, 81, 85, 275, 49, 235, 3291, 1195}},
+{499, 13, 134, {1, 1, 5, 7, 23, 53, 85, 107, 511, 779, 1265, 1093, 7859}},
+{500, 13, 138, {1, 3, 3, 1, 9, 21, 75, 219, 59, 485, 1739, 3845, 1109}},
+{501, 13, 148, {1, 3, 5, 1, 13, 41, 19, 143, 293, 391, 2023, 1791, 4399}},
+{502, 13, 151, {1, 3, 7, 15, 21, 13, 21, 195, 215, 413, 523, 2099, 2341}},
+{503, 13, 157, {1, 1, 1, 3, 29, 51, 47, 57, 135, 575, 943, 1673, 541}},
+{504, 13, 161, {1, 3, 5, 1, 9, 13, 113, 175, 447, 115, 657, 4077, 5973}},
+{505, 13, 179, {1, 1, 1, 11, 17, 41, 37, 95, 297, 579, 911, 2207, 2387}},
+{506, 13, 181, {1, 3, 5, 3, 23, 11, 23, 231, 93, 667, 711, 1563, 7961}},
+{507, 13, 188, {1, 1, 7, 3, 17, 59, 13, 181, 141, 991, 1817, 457, 1711}},
+{508, 13, 196, {1, 3, 3, 5, 31, 59, 81, 205, 245, 537, 1049, 997, 1815}},
+{509, 13, 203, {1, 3, 7, 5, 17, 13, 9, 79, 17, 185, 5, 2211, 6263}},
+{510, 13, 206, {1, 3, 7, 13, 7, 53, 61, 145, 13, 285, 1203, 947, 2933}},
+{511, 13, 223, {1, 1, 7, 3, 31, 19, 69, 217, 47, 441, 1893, 673, 4451}},
+{512, 13, 224, {1, 1, 1, 1, 25, 9, 23, 225, 385, 629, 603, 3747, 4241}},
+{513, 13, 227, {1, 3, 1, 9, 5, 37, 31, 237, 431, 79, 1521, 459, 2523}},
+{514, 13, 230, {1, 3, 7, 3, 9, 43, 105, 179, 5, 225, 799, 1777, 4893}},
+{515, 13, 239, {1, 1, 3, 1, 29, 45, 29, 159, 267, 247, 455, 847, 3909}},
+{516, 13, 241, {1, 1, 3, 7, 25, 21, 121, 57, 467, 275, 719, 1521, 7319}},
+{517, 13, 248, {1, 3, 1, 3, 11, 35, 119, 123, 81, 979, 1187, 3623, 4293}},
+{518, 13, 253, {1, 1, 1, 7, 15, 25, 121, 235, 25, 487, 873, 1787, 1977}},
+{519, 13, 268, {1, 1, 1, 11, 3, 7, 17, 135, 345, 353, 383, 4011, 2573}},
+{520, 13, 274, {1, 3, 7, 15, 27, 13, 97, 123, 65, 675, 951, 1285, 6559}},
+{521, 13, 283, {1, 3, 7, 3, 7, 1, 71, 19, 325, 765, 337, 1197, 2697}},
+{522, 13, 286, {1, 3, 5, 1, 31, 37, 11, 71, 169, 283, 83, 3801, 7083}},
+{523, 13, 289, {1, 1, 3, 15, 17, 29, 83, 65, 275, 679, 1749, 4007, 7749}},
+{524, 13, 301, {1, 1, 3, 1, 21, 11, 41, 95, 237, 361, 1819, 2783, 2383}},
+{525, 13, 302, {1, 3, 7, 11, 29, 57, 111, 187, 465, 145, 605, 1987, 8109}},
+{526, 13, 316, {1, 1, 3, 3, 19, 15, 55, 83, 357, 1001, 643, 1517, 6529}},
+{527, 13, 319, {1, 3, 1, 5, 29, 35, 73, 23, 77, 619, 1523, 1725, 8145}},
+{528, 13, 324, {1, 1, 5, 5, 19, 23, 7, 197, 449, 337, 717, 2921, 315}},
+{529, 13, 331, {1, 3, 5, 9, 7, 63, 117, 97, 97, 813, 1925, 2817, 1579}},
+{530, 13, 333, {1, 1, 1, 11, 31, 7, 25, 235, 231, 133, 1007, 1371, 1553}},
+{531, 13, 345, {1, 1, 7, 5, 19, 7, 47, 171, 267, 243, 1331, 567, 6033}},
+{532, 13, 351, {1, 1, 5, 1, 7, 49, 55, 89, 109, 735, 1455, 3193, 6239}},
+{533, 13, 358, {1, 1, 1, 7, 1, 61, 9, 103, 3, 929, 1481, 2927, 2957}},
+{534, 13, 375, {1, 1, 5, 13, 17, 21, 75, 49, 255, 1019, 1161, 2133, 1177}},
+{535, 13, 379, {1, 3, 1, 3, 13, 15, 41, 247, 211, 409, 1163, 523, 2635}},
+{536, 13, 381, {1, 3, 7, 7, 21, 59, 91, 149, 479, 391, 681, 2311, 6249}},
+{537, 13, 386, {1, 1, 5, 11, 27, 53, 21, 211, 197, 815, 719, 1605, 255}},
+{538, 13, 403, {1, 1, 3, 3, 9, 33, 59, 3, 323, 1, 101, 1135, 8105}},
+{539, 13, 405, {1, 3, 3, 1, 29, 5, 17, 141, 51, 991, 841, 327, 3859}},
+{540, 13, 419, {1, 3, 1, 5, 11, 19, 23, 89, 175, 173, 165, 2881, 1881}},
+{541, 13, 426, {1, 1, 1, 15, 13, 51, 87, 39, 495, 611, 1341, 1531, 7029}},
+{542, 13, 428, {1, 1, 3, 11, 13, 55, 75, 185, 57, 61, 1917, 2051, 5965}},
+{543, 13, 439, {1, 1, 5, 5, 7, 53, 11, 217, 213, 933, 921, 3607, 5175}},
+{544, 13, 440, {1, 3, 3, 5, 17, 53, 103, 251, 369, 781, 1319, 3717, 4439}},
+{545, 13, 446, {1, 3, 5, 13, 1, 39, 25, 235, 321, 773, 251, 3111, 6397}},
+{546, 13, 451, {1, 1, 7, 3, 31, 5, 25, 29, 325, 385, 1313, 127, 4705}},
+{547, 13, 454, {1, 1, 5, 15, 15, 27, 15, 85, 239, 243, 1633, 3473, 2621}},
+{548, 13, 458, {1, 3, 3, 3, 9, 19, 113, 13, 137, 165, 25, 2957, 7549}},
+{549, 13, 465, {1, 3, 1, 3, 11, 21, 3, 97, 417, 183, 1205, 1437, 247}},
+{550, 13, 468, {1, 1, 7, 3, 17, 21, 125, 55, 67, 387, 385, 2323, 887}},
+{551, 13, 472, {1, 3, 5, 5, 29, 11, 103, 223, 233, 641, 133, 415, 1297}},
+{552, 13, 475, {1, 3, 3, 11, 1, 9, 5, 189, 235, 1007, 1363, 3985, 889}},
+{553, 13, 477, {1, 3, 7, 9, 23, 19, 19, 183, 269, 403, 1643, 3559, 5189}},
+{554, 13, 496, {1, 3, 7, 3, 29, 45, 17, 69, 475, 149, 1291, 2689, 7625}},
+{555, 13, 502, {1, 3, 7, 3, 27, 37, 41, 73, 253, 1001, 431, 1111, 7887}},
+{556, 13, 508, {1, 1, 7, 5, 3, 7, 87, 143, 289, 495, 631, 3011, 6151}},
+{557, 13, 517, {1, 1, 1, 13, 5, 45, 17, 167, 23, 975, 801, 1975, 6833}},
+{558, 13, 521, {1, 3, 1, 11, 7, 21, 39, 23, 213, 429, 1301, 2059, 197}},
+{559, 13, 527, {1, 3, 3, 15, 3, 57, 121, 133, 29, 711, 1961, 2497, 189}},
+{560, 13, 530, {1, 1, 3, 5, 11, 55, 115, 137, 233, 673, 985, 2849, 5911}},
+{561, 13, 532, {1, 1, 7, 15, 29, 45, 1, 241, 329, 323, 925, 2821, 3331}},
+{562, 13, 542, {1, 1, 5, 7, 13, 31, 81, 105, 199, 145, 195, 1365, 5119}},
+{563, 13, 552, {1, 3, 7, 11, 3, 55, 11, 31, 117, 343, 1265, 1837, 2451}},
+{564, 13, 555, {1, 1, 3, 7, 29, 57, 61, 179, 429, 591, 177, 1945, 2159}},
+{565, 13, 560, {1, 3, 5, 11, 23, 49, 101, 137, 339, 323, 1035, 1749, 7737}},
+{566, 13, 566, {1, 3, 1, 13, 21, 35, 55, 79, 19, 269, 1055, 2651, 7083}},
+{567, 13, 575, {1, 3, 3, 11, 9, 9, 95, 167, 437, 361, 1185, 4083, 603}},
+{568, 13, 577, {1, 1, 1, 7, 31, 61, 77, 65, 489, 657, 691, 2423, 4147}},
+{569, 13, 589, {1, 3, 5, 7, 21, 37, 87, 191, 311, 453, 2013, 829, 2619}},
+{570, 13, 590, {1, 1, 5, 9, 17, 47, 35, 101, 5, 813, 1157, 1279, 7365}},
+{571, 13, 602, {1, 1, 5, 3, 11, 35, 113, 199, 369, 721, 901, 1471, 7801}},
+{572, 13, 607, {1, 3, 1, 5, 9, 61, 83, 157, 391, 739, 1957, 2123, 4341}},
+{573, 13, 608, {1, 3, 5, 11, 19, 19, 111, 225, 383, 219, 997, 717, 7505}},
+{574, 13, 611, {1, 3, 1, 11, 13, 63, 35, 127, 209, 831, 501, 3017, 3507}},
+{575, 13, 613, {1, 3, 7, 9, 29, 7, 11, 163, 81, 563, 1445, 3215, 6377}},
+{576, 13, 625, {1, 3, 7, 11, 25, 3, 39, 195, 491, 45, 839, 4021, 4899}},
+{577, 13, 644, {1, 3, 7, 15, 13, 5, 67, 143, 117, 505, 1281, 3679, 5695}},
+{578, 13, 651, {1, 3, 7, 9, 9, 19, 21, 221, 147, 763, 683, 2211, 589}},
+{579, 13, 654, {1, 1, 3, 5, 21, 47, 53, 109, 299, 807, 1153, 1209, 7961}},
+{580, 13, 656, {1, 3, 7, 11, 9, 31, 45, 43, 505, 647, 1127, 2681, 4917}},
+{581, 13, 662, {1, 1, 5, 15, 31, 41, 63, 113, 399, 727, 673, 2587, 5259}},
+{582, 13, 668, {1, 1, 1, 13, 17, 53, 35, 99, 57, 243, 1447, 1919, 2831}},
+{583, 13, 681, {1, 3, 7, 11, 23, 51, 13, 9, 49, 449, 997, 3073, 4407}},
+{584, 13, 682, {1, 3, 5, 7, 23, 33, 89, 41, 415, 53, 697, 1113, 1489}},
+{585, 13, 689, {1, 1, 3, 7, 1, 13, 29, 13, 255, 749, 77, 3463, 1761}},
+{586, 13, 696, {1, 3, 3, 7, 13, 15, 93, 191, 309, 869, 739, 1041, 3053}},
+{587, 13, 699, {1, 3, 5, 13, 5, 19, 109, 211, 347, 839, 893, 2947, 7735}},
+{588, 13, 707, {1, 3, 1, 13, 27, 3, 119, 157, 485, 99, 1703, 3895, 573}},
+{589, 13, 709, {1, 3, 7, 11, 1, 23, 123, 105, 31, 359, 275, 1775, 3685}},
+{590, 13, 714, {1, 3, 3, 5, 27, 11, 125, 3, 413, 199, 2043, 2895, 2945}},
+{591, 13, 716, {1, 3, 3, 3, 15, 49, 121, 159, 233, 543, 193, 4007, 321}},
+{592, 13, 719, {1, 1, 3, 5, 9, 47, 87, 1, 51, 1011, 1595, 2239, 6467}},
+{593, 13, 727, {1, 3, 7, 9, 1, 33, 87, 137, 469, 749, 1413, 805, 6817}},
+{594, 13, 734, {1, 3, 1, 13, 19, 45, 95, 227, 29, 677, 1275, 3395, 4451}},
+{595, 13, 738, {1, 1, 7, 5, 7, 63, 33, 71, 443, 561, 1311, 3069, 6943}},
+{596, 13, 743, {1, 1, 1, 13, 9, 37, 23, 69, 13, 415, 1479, 1197, 861}},
+{597, 13, 747, {1, 3, 3, 13, 27, 21, 13, 233, 105, 777, 345, 2443, 1105}},
+{598, 13, 757, {1, 1, 7, 11, 23, 13, 21, 147, 221, 549, 73, 2729, 6279}},
+{599, 13, 769, {1, 1, 7, 7, 25, 27, 15, 45, 227, 39, 75, 1191, 3563}},
+{600, 13, 770, {1, 1, 5, 7, 13, 49, 99, 167, 227, 13, 353, 1047, 8075}},
+{601, 13, 776, {1, 1, 3, 13, 31, 9, 27, 7, 461, 737, 1559, 3243, 53}},
+{602, 13, 790, {1, 3, 1, 1, 21, 41, 97, 165, 171, 821, 587, 2137, 2293}},
+{603, 13, 799, {1, 3, 1, 11, 17, 41, 29, 187, 87, 599, 1467, 1395, 5931}},
+{604, 13, 805, {1, 1, 1, 9, 9, 49, 89, 205, 409, 453, 61, 1923, 1257}},
+{605, 13, 809, {1, 3, 7, 3, 9, 43, 89, 143, 431, 83, 1243, 1795, 3599}},
+{606, 13, 812, {1, 3, 5, 13, 3, 25, 59, 219, 43, 223, 797, 2651, 6015}},
+{607, 13, 820, {1, 1, 5, 15, 7, 55, 65, 207, 213, 311, 1287, 1269, 6467}},
+{608, 13, 827, {1, 3, 7, 11, 21, 57, 31, 183, 351, 857, 911, 1683, 7155}},
+{609, 13, 829, {1, 3, 5, 11, 27, 1, 21, 47, 387, 383, 1593, 115, 3805}},
+{610, 13, 835, {1, 3, 1, 1, 13, 23, 87, 173, 181, 619, 1653, 3931, 6073}},
+{611, 13, 841, {1, 1, 7, 5, 17, 43, 37, 61, 307, 621, 1785, 55, 115}},
+{612, 13, 844, {1, 3, 7, 15, 25, 61, 123, 15, 237, 671, 1473, 467, 1907}},
+{613, 13, 856, {1, 1, 7, 5, 29, 57, 75, 237, 85, 699, 159, 3577, 4771}},
+{614, 13, 859, {1, 1, 1, 11, 25, 19, 51, 1, 147, 31, 895, 2617, 625}},
+{615, 13, 862, {1, 3, 7, 5, 29, 15, 115, 175, 395, 391, 1141, 1827, 1181}},
+{616, 13, 865, {1, 3, 5, 7, 17, 7, 11, 193, 89, 243, 561, 3787, 4551}},
+{617, 13, 885, {1, 3, 1, 11, 7, 57, 7, 125, 403, 947, 1261, 409, 8083}},
+{618, 13, 890, {1, 1, 5, 13, 21, 63, 115, 233, 231, 921, 1747, 3635, 2519}},
+{619, 13, 905, {1, 1, 5, 11, 3, 27, 15, 91, 505, 591, 1451, 3881, 2997}},
+{620, 13, 916, {1, 1, 3, 11, 21, 9, 109, 153, 317, 533, 593, 3967, 2797}},
+{621, 13, 925, {1, 3, 3, 13, 9, 57, 121, 245, 219, 867, 967, 791, 7095}},
+{622, 13, 935, {1, 1, 1, 9, 29, 21, 99, 35, 375, 959, 329, 4087, 7171}},
+{623, 13, 939, {1, 1, 1, 9, 11, 17, 17, 97, 89, 135, 631, 3809, 3253}},
+{624, 13, 942, {1, 1, 1, 15, 21, 51, 91, 249, 459, 801, 757, 2353, 2033}},
+{625, 13, 949, {1, 3, 5, 9, 23, 29, 77, 53, 399, 767, 1817, 2171, 1629}},
+{626, 13, 953, {1, 1, 3, 5, 29, 5, 43, 121, 17, 859, 1479, 3785, 6641}},
+{627, 13, 956, {1, 1, 3, 7, 7, 61, 45, 109, 371, 833, 91, 153, 4553}},
+{628, 13, 961, {1, 1, 3, 11, 7, 55, 81, 123, 389, 139, 1933, 891, 1789}},
+{629, 13, 968, {1, 3, 7, 15, 25, 17, 93, 165, 503, 717, 1553, 1475, 1627}},
+{630, 13, 976, {1, 1, 1, 13, 13, 63, 13, 225, 357, 571, 33, 4073, 3795}},
+{631, 13, 988, {1, 1, 3, 11, 1, 31, 107, 145, 407, 961, 501, 2987, 103}},
+{632, 13, 995, {1, 1, 7, 1, 23, 63, 49, 193, 173, 281, 25, 2465, 5927}},
+{633, 13, 997, {1, 1, 7, 1, 1, 1, 85, 77, 273, 693, 349, 1239, 4503}},
+{634, 13, 1007, {1, 1, 5, 11, 7, 61, 9, 121, 25, 357, 1443, 405, 7827}},
+{635, 13, 1015, {1, 1, 7, 13, 11, 53, 11, 207, 145, 211, 1703, 1081, 2117}},
+{636, 13, 1016, {1, 1, 3, 11, 27, 23, 19, 9, 297, 279, 1481, 2273, 6387}},
+{637, 13, 1027, {1, 3, 3, 5, 15, 45, 3, 41, 305, 87, 1815, 3461, 5349}},
+{638, 13, 1036, {1, 3, 3, 13, 9, 37, 79, 125, 259, 561, 1087, 4091, 793}},
+{639, 13, 1039, {1, 3, 5, 7, 31, 55, 7, 145, 347, 929, 589, 2783, 5905}},
+{640, 13, 1041, {1, 1, 7, 15, 3, 25, 1, 181, 13, 243, 653, 2235, 7445}},
+{641, 13, 1048, {1, 3, 5, 5, 17, 53, 65, 7, 33, 583, 1363, 1313, 2319}},
+{642, 13, 1053, {1, 3, 3, 7, 27, 47, 97, 201, 187, 321, 63, 1515, 7917}},
+{643, 13, 1054, {1, 1, 3, 5, 23, 9, 3, 165, 61, 19, 1789, 3783, 3037}},
+{644, 13, 1058, {1, 3, 1, 13, 15, 43, 125, 191, 67, 273, 1551, 2227, 5253}},
+{645, 13, 1075, {1, 1, 1, 13, 25, 53, 107, 33, 299, 249, 1475, 2233, 907}},
+{646, 13, 1082, {1, 3, 5, 1, 23, 37, 85, 17, 207, 643, 665, 2933, 5199}},
+{647, 13, 1090, {1, 1, 7, 7, 25, 57, 59, 41, 15, 751, 751, 1749, 7053}},
+{648, 13, 1109, {1, 3, 3, 1, 13, 25, 127, 93, 281, 613, 875, 2223, 6345}},
+{649, 13, 1110, {1, 1, 5, 3, 29, 55, 79, 249, 43, 317, 533, 995, 1991}},
+{650, 13, 1119, {1, 3, 3, 15, 17, 49, 79, 31, 193, 233, 1437, 2615, 819}},
+{651, 13, 1126, {1, 1, 5, 15, 25, 3, 123, 145, 377, 9, 455, 1191, 3953}},
+{652, 13, 1130, {1, 3, 5, 3, 15, 19, 41, 231, 81, 393, 3, 19, 2409}},
+{653, 13, 1135, {1, 1, 3, 1, 27, 43, 113, 179, 7, 853, 947, 2731, 297}},
+{654, 13, 1137, {1, 1, 1, 11, 29, 39, 53, 191, 443, 689, 529, 3329, 7431}},
+{655, 13, 1140, {1, 3, 7, 5, 3, 29, 19, 67, 441, 113, 949, 2769, 4169}},
+{656, 13, 1149, {1, 3, 5, 11, 11, 55, 85, 169, 215, 815, 803, 2345, 3967}},
+{657, 13, 1156, {1, 1, 7, 9, 5, 45, 111, 5, 419, 375, 303, 1725, 4489}},
+{658, 13, 1159, {1, 3, 5, 15, 29, 43, 79, 19, 23, 417, 381, 541, 4923}},
+{659, 13, 1160, {1, 1, 3, 15, 3, 31, 117, 39, 117, 305, 1227, 1223, 143}},
+{660, 13, 1165, {1, 1, 5, 9, 5, 47, 87, 239, 181, 353, 1561, 3313, 1921}},
+{661, 13, 1173, {1, 3, 3, 1, 3, 15, 53, 221, 441, 987, 1997, 2529, 8059}},
+{662, 13, 1178, {1, 1, 7, 11, 15, 57, 111, 139, 137, 883, 1881, 2823, 5661}},
+{663, 13, 1183, {1, 3, 5, 5, 21, 11, 5, 13, 27, 973, 587, 1331, 1373}},
+{664, 13, 1184, {1, 1, 7, 11, 29, 51, 93, 29, 217, 221, 55, 2477, 1979}},
+{665, 13, 1189, {1, 3, 3, 13, 3, 11, 49, 75, 379, 371, 1441, 793, 7633}},
+{666, 13, 1194, {1, 1, 1, 13, 19, 45, 89, 249, 91, 649, 1695, 915, 5619}},
+{667, 13, 1211, {1, 3, 1, 7, 7, 29, 1, 77, 313, 895, 519, 771, 295}},
+{668, 13, 1214, {1, 3, 1, 15, 5, 3, 1, 57, 331, 109, 485, 2853, 6831}},
+{669, 13, 1216, {1, 1, 1, 15, 17, 3, 35, 99, 245, 971, 839, 2509, 2803}},
+{670, 13, 1225, {1, 3, 3, 3, 9, 37, 57, 251, 325, 317, 529, 1313, 6379}},
+{671, 13, 1231, {1, 1, 1, 15, 25, 59, 1, 119, 95, 15, 795, 2375, 6463}},
+{672, 13, 1239, {1, 3, 1, 5, 1, 49, 117, 21, 47, 179, 863, 85, 1669}},
+{673, 13, 1243, {1, 3, 7, 3, 9, 37, 19, 221, 455, 973, 571, 1427, 817}},
+{674, 13, 1246, {1, 1, 1, 15, 17, 9, 67, 213, 127, 887, 1299, 2913, 7451}},
+{675, 13, 1249, {1, 3, 1, 13, 27, 27, 41, 43, 171, 623, 691, 391, 4885}},
+{676, 13, 1259, {1, 3, 1, 13, 17, 17, 123, 239, 143, 227, 1151, 519, 6543}},
+{677, 13, 1273, {1, 3, 7, 5, 7, 63, 97, 39, 101, 555, 1057, 381, 7891}},
+{678, 13, 1274, {1, 3, 5, 1, 3, 27, 85, 129, 161, 875, 1945, 3541, 695}},
+{679, 13, 1281, {1, 3, 3, 5, 21, 59, 25, 183, 35, 25, 987, 1459, 181}},
+{680, 13, 1287, {1, 3, 5, 13, 1, 15, 127, 237, 349, 337, 1491, 2383, 7811}},
+{681, 13, 1294, {1, 3, 5, 5, 31, 5, 109, 51, 409, 733, 1395, 3207, 6049}},
+{682, 13, 1296, {1, 1, 5, 7, 13, 35, 113, 25, 263, 389, 299, 2521, 1783}},
+{683, 13, 1305, {1, 3, 7, 11, 15, 47, 97, 73, 55, 75, 113, 2695, 1023}},
+{684, 13, 1306, {1, 3, 1, 1, 3, 13, 69, 211, 289, 483, 1335, 787, 677}},
+{685, 13, 1318, {1, 1, 3, 3, 17, 7, 37, 77, 505, 137, 1113, 345, 2975}},
+{686, 13, 1332, {1, 1, 1, 13, 3, 11, 95, 199, 453, 109, 479, 3725, 239}},
+{687, 13, 1335, {1, 1, 7, 15, 19, 53, 3, 145, 359, 863, 347, 3833, 3043}},
+{688, 13, 1336, {1, 1, 7, 15, 25, 63, 127, 129, 125, 195, 155, 2211, 8153}},
+{689, 13, 1341, {1, 1, 7, 13, 9, 49, 121, 115, 73, 119, 1851, 727, 47}},
+{690, 13, 1342, {1, 3, 3, 13, 13, 11, 71, 7, 45, 591, 133, 2407, 5563}},
+{691, 13, 1362, {1, 1, 1, 13, 23, 29, 87, 89, 501, 71, 1759, 1119, 687}},
+{692, 13, 1364, {1, 1, 7, 7, 13, 7, 13, 183, 53, 951, 1877, 3991, 6771}},
+{693, 13, 1368, {1, 3, 7, 11, 7, 1, 27, 47, 61, 21, 919, 961, 1091}},
+{694, 13, 1378, {1, 3, 5, 5, 1, 27, 1, 5, 63, 157, 1297, 1049, 5893}},
+{695, 13, 1387, {1, 3, 7, 9, 19, 33, 17, 133, 425, 797, 1721, 153, 119}},
+{696, 13, 1389, {1, 3, 3, 7, 13, 37, 1, 215, 509, 1003, 61, 2353, 7511}},
+{697, 13, 1397, {1, 1, 7, 1, 29, 19, 31, 79, 199, 555, 1209, 1603, 6089}},
+{698, 13, 1401, {1, 3, 1, 1, 5, 31, 111, 127, 333, 429, 1863, 3925, 5411}},
+{699, 13, 1408, {1, 1, 7, 5, 5, 5, 123, 191, 47, 993, 269, 4051, 2111}},
+{700, 13, 1418, {1, 1, 5, 15, 1, 9, 87, 5, 47, 463, 865, 1813, 7357}},
+{701, 13, 1425, {1, 3, 1, 3, 23, 63, 123, 83, 511, 777, 63, 1285, 4537}},
+{702, 13, 1426, {1, 3, 3, 7, 27, 25, 31, 65, 441, 529, 1815, 1893, 323}},
+{703, 13, 1431, {1, 3, 7, 5, 11, 19, 7, 5, 397, 811, 755, 2883, 4217}},
+{704, 13, 1435, {1, 3, 1, 13, 9, 21, 13, 7, 271, 539, 1769, 3243, 5325}},
+{705, 13, 1441, {1, 1, 7, 1, 31, 13, 47, 131, 181, 457, 1559, 2663, 6653}},
+{706, 13, 1444, {1, 3, 3, 7, 29, 55, 25, 203, 419, 91, 437, 1159, 5691}},
+{707, 13, 1462, {1, 1, 3, 13, 29, 19, 71, 217, 337, 329, 501, 939, 2205}},
+{708, 13, 1471, {1, 1, 3, 1, 1, 27, 17, 201, 97, 285, 1269, 4043, 2207}},
+{709, 13, 1474, {1, 1, 1, 1, 3, 41, 13, 199, 141, 129, 1515, 3129, 5969}},
+{710, 13, 1483, {1, 3, 3, 9, 3, 17, 119, 41, 271, 933, 877, 701, 2197}},
+{711, 13, 1485, {1, 1, 1, 7, 15, 47, 3, 195, 115, 821, 725, 843, 6071}},
+{712, 13, 1494, {1, 3, 5, 15, 17, 33, 85, 65, 297, 571, 1123, 2743, 5727}},
+{713, 13, 1497, {1, 1, 5, 11, 27, 15, 37, 235, 415, 293, 1439, 2739, 4171}},
+{714, 13, 1516, {1, 3, 7, 7, 1, 55, 71, 35, 307, 11, 401, 1881, 933}},
+{715, 13, 1522, {1, 3, 1, 11, 21, 37, 3, 177, 119, 339, 559, 3991, 3437}},
+{716, 13, 1534, {1, 3, 3, 9, 17, 17, 97, 119, 301, 169, 157, 3267, 2261}},
+{717, 13, 1543, {1, 3, 3, 9, 29, 3, 111, 101, 355, 869, 375, 2609, 7377}},
+{718, 13, 1552, {1, 3, 5, 9, 7, 21, 123, 99, 343, 693, 1927, 1605, 4923}},
+{719, 13, 1557, {1, 1, 3, 5, 13, 31, 99, 17, 75, 385, 1539, 1553, 7077}},
+{720, 13, 1558, {1, 3, 3, 5, 31, 35, 107, 11, 407, 1019, 1317, 3593, 7203}},
+{721, 13, 1567, {1, 3, 3, 13, 17, 33, 99, 245, 401, 957, 157, 1949, 1571}},
+{722, 13, 1568, {1, 3, 1, 11, 27, 15, 11, 109, 429, 307, 1911, 2701, 861}},
+{723, 13, 1574, {1, 1, 5, 13, 13, 35, 55, 255, 311, 957, 1803, 2673, 5195}},
+{724, 13, 1592, {1, 1, 1, 11, 19, 3, 89, 37, 211, 783, 1355, 3567, 7135}},
+{725, 13, 1605, {1, 1, 5, 5, 21, 49, 79, 17, 509, 331, 183, 3831, 855}},
+{726, 13, 1606, {1, 3, 7, 5, 29, 19, 85, 109, 105, 523, 845, 3385, 7477}},
+{727, 13, 1610, {1, 1, 1, 7, 25, 17, 125, 131, 53, 757, 253, 2989, 2939}},
+{728, 13, 1617, {1, 3, 3, 9, 19, 23, 105, 39, 351, 677, 211, 401, 8103}},
+{729, 13, 1623, {1, 3, 5, 1, 5, 11, 17, 3, 405, 469, 1569, 2865, 3133}},
+{730, 13, 1630, {1, 1, 3, 13, 15, 5, 117, 179, 139, 145, 477, 1137, 2537}},
+{731, 13, 1634, {1, 1, 7, 9, 5, 21, 9, 93, 211, 963, 1207, 3343, 4911}},
+{732, 13, 1640, {1, 1, 1, 9, 13, 43, 17, 53, 81, 793, 1571, 2523, 3683}},
+{733, 13, 1643, {1, 3, 3, 13, 25, 21, 5, 59, 489, 987, 1941, 171, 6009}},
+{734, 13, 1648, {1, 3, 3, 7, 1, 39, 89, 171, 403, 467, 1767, 3423, 2791}},
+{735, 13, 1651, {1, 1, 3, 9, 19, 49, 91, 125, 163, 1013, 89, 2849, 6785}},
+{736, 13, 1653, {1, 1, 5, 9, 9, 11, 15, 241, 43, 297, 1719, 1541, 1821}},
+{737, 13, 1670, {1, 3, 7, 15, 29, 23, 103, 239, 191, 33, 1043, 3649, 6579}},
+{738, 13, 1676, {1, 3, 3, 9, 21, 51, 123, 55, 223, 645, 1463, 4021, 5891}},
+{739, 13, 1684, {1, 1, 5, 7, 3, 41, 27, 235, 391, 303, 2021, 3187, 7607}},
+{740, 13, 1687, {1, 1, 1, 9, 5, 49, 49, 29, 377, 251, 1887, 1017, 1301}},
+{741, 13, 1691, {1, 1, 3, 3, 13, 41, 27, 47, 223, 23, 517, 3227, 6731}},
+{742, 13, 1693, {1, 1, 7, 1, 31, 25, 47, 9, 511, 623, 2047, 1263, 1511}},
+{743, 13, 1698, {1, 1, 3, 15, 15, 23, 53, 1, 261, 595, 85, 241, 7047}},
+{744, 13, 1709, {1, 3, 3, 11, 17, 5, 81, 73, 149, 781, 2035, 3163, 4247}},
+{745, 13, 1715, {1, 3, 7, 7, 29, 59, 49, 79, 397, 901, 1105, 2191, 6277}},
+{746, 13, 1722, {1, 3, 3, 11, 13, 27, 25, 173, 107, 73, 1265, 585, 5251}},
+{747, 13, 1732, {1, 1, 7, 15, 29, 23, 73, 229, 235, 887, 1469, 4073, 2591}},
+{748, 13, 1735, {1, 1, 3, 9, 17, 15, 83, 173, 207, 879, 1701, 1509, 11}},
+{749, 13, 1747, {1, 1, 3, 5, 5, 37, 65, 161, 39, 421, 1153, 2007, 5355}},
+{750, 13, 1749, {1, 1, 7, 11, 23, 37, 5, 11, 9, 499, 17, 157, 5747}},
+{751, 13, 1754, {1, 3, 7, 13, 25, 9, 49, 7, 39, 945, 1349, 1759, 1441}},
+{752, 13, 1777, {1, 1, 5, 3, 21, 15, 113, 81, 265, 837, 333, 3625, 6133}},
+{753, 13, 1784, {1, 3, 1, 11, 13, 27, 73, 109, 297, 327, 299, 3253, 6957}},
+{754, 13, 1790, {1, 1, 3, 13, 19, 39, 123, 73, 65, 5, 1061, 2187, 5055}},
+{755, 13, 1795, {1, 1, 3, 1, 11, 31, 21, 115, 453, 857, 711, 495, 549}},
+{756, 13, 1801, {1, 3, 7, 7, 15, 29, 79, 103, 47, 713, 1735, 3121, 6321}},
+{757, 13, 1802, {1, 1, 5, 5, 29, 9, 97, 33, 471, 705, 329, 1501, 1349}},
+{758, 13, 1812, {1, 3, 3, 1, 21, 9, 111, 209, 71, 47, 491, 2143, 1797}},
+{759, 13, 1828, {1, 3, 3, 3, 11, 39, 21, 135, 445, 259, 607, 3811, 5449}},
+{760, 13, 1831, {1, 1, 7, 9, 11, 25, 113, 251, 395, 317, 317, 91, 1979}},
+{761, 13, 1837, {1, 3, 1, 9, 3, 21, 103, 133, 389, 943, 1235, 1749, 7063}},
+{762, 13, 1838, {1, 1, 3, 7, 1, 11, 5, 15, 497, 477, 479, 3079, 6969}},
+{763, 13, 1840, {1, 1, 3, 3, 15, 39, 105, 131, 475, 465, 181, 865, 3813}},
+{764, 13, 1845, {1, 1, 7, 9, 19, 63, 123, 131, 415, 525, 457, 2471, 3135}},
+{765, 13, 1863, {1, 3, 7, 15, 25, 35, 123, 45, 341, 805, 485, 4049, 7065}},
+{766, 13, 1864, {1, 1, 1, 5, 29, 9, 47, 227, 51, 867, 1873, 1593, 2271}},
+{767, 13, 1867, {1, 1, 7, 15, 31, 9, 71, 117, 285, 711, 837, 1435, 6275}},
+{768, 13, 1870, {1, 3, 1, 1, 5, 19, 79, 25, 301, 415, 1871, 645, 3251}},
+{769, 13, 1877, {1, 3, 1, 3, 17, 51, 99, 185, 447, 43, 523, 219, 429}},
+{770, 13, 1881, {1, 3, 1, 13, 29, 13, 51, 93, 7, 995, 757, 3017, 6865}},
+{771, 13, 1884, {1, 1, 3, 15, 7, 25, 75, 17, 155, 981, 1231, 1229, 1995}},
+{772, 13, 1903, {1, 3, 5, 3, 27, 45, 71, 73, 225, 763, 377, 1139, 2863}},
+{773, 13, 1917, {1, 1, 3, 1, 1, 39, 69, 113, 29, 371, 1051, 793, 3749}},
+{774, 13, 1918, {1, 1, 3, 13, 23, 61, 27, 183, 307, 431, 1345, 2757, 4031}},
+{775, 13, 1922, {1, 3, 7, 5, 5, 59, 117, 197, 303, 721, 877, 723, 1601}},
+{776, 13, 1924, {1, 3, 5, 1, 27, 33, 99, 237, 485, 711, 665, 3077, 5105}},
+{777, 13, 1928, {1, 1, 3, 1, 13, 9, 103, 201, 23, 951, 2029, 165, 2093}},
+{778, 13, 1931, {1, 3, 5, 13, 5, 29, 55, 85, 221, 677, 611, 3613, 4567}},
+{779, 13, 1951, {1, 1, 1, 1, 7, 61, 9, 233, 261, 561, 953, 4023, 2443}},
+{780, 13, 1952, {1, 3, 3, 13, 1, 17, 103, 71, 223, 213, 833, 1747, 6999}},
+{781, 13, 1957, {1, 3, 5, 15, 25, 53, 57, 187, 25, 695, 1207, 4089, 2877}},
+{782, 13, 1958, {1, 1, 7, 1, 7, 31, 87, 129, 493, 519, 1555, 1155, 4637}},
+{783, 13, 1964, {1, 1, 1, 15, 21, 17, 23, 29, 19, 255, 927, 1791, 3093}},
+{784, 13, 1967, {1, 1, 3, 9, 17, 33, 95, 129, 175, 461, 287, 2633, 2325}},
+{785, 13, 1970, {1, 3, 5, 7, 23, 19, 63, 209, 249, 583, 1373, 2039, 2225}},
+{786, 13, 1972, {1, 3, 3, 5, 5, 19, 79, 241, 459, 355, 1455, 3313, 3639}},
+{787, 13, 1994, {1, 1, 7, 9, 21, 41, 97, 119, 129, 769, 1541, 3495, 7741}},
+{788, 13, 2002, {1, 1, 7, 11, 9, 29, 35, 255, 141, 937, 1763, 41, 1393}},
+{789, 13, 2007, {1, 3, 7, 1, 13, 51, 61, 157, 177, 847, 1829, 3539, 285}},
+{790, 13, 2008, {1, 1, 1, 15, 21, 13, 9, 55, 397, 19, 1495, 1255, 7235}},
+{791, 13, 2023, {1, 1, 7, 7, 25, 37, 53, 237, 319, 197, 269, 1205, 1485}},
+{792, 13, 2030, {1, 1, 5, 15, 23, 17, 35, 247, 323, 807, 233, 3681, 4407}},
+{793, 13, 2035, {1, 1, 3, 7, 9, 59, 85, 105, 493, 763, 1639, 391, 1451}},
+{794, 13, 2038, {1, 3, 3, 9, 15, 33, 5, 253, 129, 625, 1527, 2793, 6057}},
+{795, 13, 2042, {1, 3, 1, 1, 7, 47, 21, 161, 235, 83, 397, 3563, 5953}},
+{796, 13, 2047, {1, 3, 7, 11, 3, 41, 25, 117, 375, 779, 1297, 3715, 8117}},
+{797, 13, 2051, {1, 1, 3, 7, 31, 19, 103, 173, 475, 189, 2035, 2921, 1107}},
+{798, 13, 2058, {1, 1, 7, 3, 25, 7, 93, 255, 307, 113, 1893, 2233, 6919}},
+{799, 13, 2060, {1, 3, 5, 15, 9, 57, 79, 143, 165, 5, 1389, 193, 693}},
+{800, 13, 2071, {1, 3, 5, 1, 29, 45, 91, 49, 189, 461, 439, 1283, 7835}},
+{801, 13, 2084, {1, 1, 3, 13, 11, 61, 41, 231, 373, 695, 395, 915, 5393}},
+{802, 13, 2087, {1, 3, 7, 11, 5, 51, 67, 53, 483, 95, 1943, 247, 5653}},
+{803, 13, 2099, {1, 3, 7, 5, 5, 57, 45, 235, 137, 793, 1069, 1661, 1557}},
+{804, 13, 2108, {1, 3, 5, 3, 25, 55, 103, 177, 81, 861, 1151, 143, 7655}},
+{805, 13, 2111, {1, 1, 3, 1, 21, 41, 67, 131, 253, 431, 1269, 3181, 3429}},
+{806, 13, 2120, {1, 3, 1, 1, 21, 7, 77, 221, 257, 663, 71, 2949, 2481}},
+{807, 13, 2128, {1, 3, 5, 3, 3, 23, 45, 107, 299, 739, 1013, 3, 3165}},
+{808, 13, 2138, {1, 1, 5, 1, 3, 37, 109, 37, 243, 983, 1221, 1691, 3869}},
+{809, 13, 2143, {1, 1, 5, 5, 31, 7, 5, 193, 397, 867, 1495, 3435, 7441}},
+{810, 13, 2144, {1, 1, 1, 1, 17, 59, 97, 233, 389, 597, 1013, 1631, 483}},
+{811, 13, 2153, {1, 1, 1, 11, 7, 41, 107, 53, 111, 125, 1513, 1921, 7647}},
+{812, 13, 2156, {1, 3, 3, 3, 31, 29, 117, 3, 365, 971, 1139, 2123, 5913}},
+{813, 13, 2162, {1, 1, 1, 13, 23, 3, 1, 167, 475, 639, 1811, 3841, 3081}},
+{814, 13, 2167, {1, 1, 5, 3, 5, 47, 65, 123, 275, 783, 95, 119, 7591}},
+{815, 13, 2178, {1, 3, 1, 15, 13, 33, 93, 237, 467, 431, 705, 4013, 4035}},
+{816, 13, 2183, {1, 3, 5, 1, 19, 7, 101, 231, 155, 737, 1381, 3343, 2051}},
+{817, 13, 2202, {1, 1, 5, 9, 15, 49, 45, 163, 433, 765, 2031, 201, 2589}},
+{818, 13, 2211, {1, 3, 7, 9, 19, 41, 31, 89, 93, 623, 105, 745, 4409}},
+{819, 13, 2214, {1, 1, 5, 1, 11, 45, 127, 85, 389, 439, 829, 477, 7965}},
+{820, 13, 2223, {1, 3, 3, 15, 13, 41, 1, 207, 435, 585, 311, 1725, 2737}},
+{821, 13, 2225, {1, 3, 3, 3, 13, 49, 21, 31, 197, 799, 1411, 2959, 7133}},
+{822, 13, 2232, {1, 3, 1, 3, 7, 43, 9, 141, 133, 579, 1059, 93, 957}},
+{823, 13, 2237, {1, 3, 7, 1, 15, 51, 23, 213, 381, 851, 699, 2261, 3419}},
+{824, 13, 2257, {1, 3, 5, 9, 25, 35, 67, 141, 35, 409, 1423, 365, 1645}},
+{825, 13, 2260, {1, 3, 3, 11, 15, 33, 27, 181, 93, 87, 1761, 3511, 1353}},
+{826, 13, 2267, {1, 3, 5, 3, 25, 63, 111, 137, 321, 819, 705, 1547, 7271}},
+{827, 13, 2274, {1, 3, 1, 1, 5, 57, 99, 59, 411, 757, 1371, 3953, 3695}},
+{828, 13, 2276, {1, 3, 5, 11, 11, 21, 25, 147, 239, 455, 709, 953, 7175}},
+{829, 13, 2285, {1, 3, 3, 15, 5, 53, 91, 205, 341, 63, 723, 1565, 7135}},
+{830, 13, 2288, {1, 1, 7, 15, 11, 21, 99, 79, 63, 593, 2007, 3629, 5271}},
+{831, 13, 2293, {1, 3, 3, 1, 9, 21, 45, 175, 453, 435, 1855, 2649, 6959}},
+{832, 13, 2294, {1, 1, 3, 15, 15, 33, 121, 121, 251, 431, 1127, 3305, 4199}},
+{833, 13, 2297, {1, 1, 1, 9, 31, 15, 71, 29, 345, 391, 1159, 2809, 345}},
+{834, 13, 2303, {1, 3, 7, 1, 23, 29, 95, 151, 327, 727, 647, 1623, 2971}},
+{835, 13, 2308, {1, 1, 7, 7, 9, 29, 79, 91, 127, 909, 1293, 1315, 5315}},
+{836, 13, 2311, {1, 1, 5, 11, 13, 37, 89, 73, 149, 477, 1909, 3343, 525}},
+{837, 13, 2318, {1, 3, 5, 7, 5, 59, 55, 255, 223, 459, 2027, 237, 4205}},
+{838, 13, 2323, {1, 1, 1, 7, 27, 11, 95, 65, 325, 835, 907, 3801, 3787}},
+{839, 13, 2332, {1, 1, 1, 11, 27, 33, 99, 175, 51, 913, 331, 1851, 4133}},
+{840, 13, 2341, {1, 3, 5, 5, 13, 37, 31, 99, 273, 409, 1827, 3845, 5491}},
+{841, 13, 2345, {1, 1, 3, 7, 23, 19, 107, 85, 283, 523, 509, 451, 421}},
+{842, 13, 2348, {1, 3, 5, 7, 13, 9, 51, 81, 87, 619, 61, 2803, 5271}},
+{843, 13, 2354, {1, 1, 1, 15, 9, 45, 35, 219, 401, 271, 953, 649, 6847}},
+{844, 13, 2368, {1, 1, 7, 11, 9, 45, 17, 219, 169, 837, 1483, 1605, 2901}},
+{845, 13, 2377, {1, 1, 7, 7, 21, 43, 37, 33, 291, 359, 71, 2899, 7037}},
+{846, 13, 2380, {1, 3, 3, 13, 31, 53, 37, 15, 149, 949, 551, 3445, 5455}},
+{847, 13, 2383, {1, 3, 1, 5, 19, 45, 81, 223, 193, 439, 2047, 3879, 789}},
+{848, 13, 2388, {1, 1, 7, 3, 11, 63, 35, 61, 255, 563, 459, 2991, 3359}},
+{849, 13, 2395, {1, 1, 5, 9, 13, 49, 47, 185, 239, 221, 1533, 3635, 2045}},
+{850, 13, 2397, {1, 3, 7, 3, 25, 37, 127, 223, 51, 357, 483, 3837, 6873}},
+{851, 13, 2401, {1, 1, 7, 9, 31, 37, 113, 31, 387, 833, 1243, 1543, 5535}},
+{852, 13, 2411, {1, 3, 1, 9, 23, 59, 119, 221, 73, 185, 2007, 2885, 2563}},
+{853, 13, 2413, {1, 1, 1, 13, 7, 33, 53, 179, 67, 185, 1541, 1807, 4659}},
+{854, 13, 2419, {1, 3, 1, 11, 31, 37, 23, 215, 269, 357, 207, 645, 4219}},
+{855, 13, 2435, {1, 3, 3, 13, 19, 27, 107, 55, 91, 71, 1695, 1815, 89}},
+{856, 13, 2442, {1, 1, 3, 15, 3, 19, 35, 247, 49, 529, 1523, 3317, 6151}},
+{857, 13, 2455, {1, 1, 7, 7, 23, 25, 107, 139, 483, 503, 1277, 243, 7879}},
+{858, 13, 2472, {1, 3, 3, 13, 3, 15, 11, 197, 135, 839, 985, 275, 5527}},
+{859, 13, 2478, {1, 3, 5, 3, 25, 47, 95, 21, 113, 307, 1001, 3065, 295}},
+{860, 13, 2490, {1, 1, 3, 9, 19, 19, 99, 213, 363, 449, 735, 2851, 2521}},
+{861, 13, 2507, {1, 1, 3, 9, 5, 49, 63, 61, 157, 857, 497, 2801, 6987}},
+{862, 13, 2509, {1, 1, 1, 9, 1, 41, 109, 119, 499, 939, 867, 3675, 8023}},
+{863, 13, 2517, {1, 3, 1, 1, 13, 33, 109, 123, 289, 3, 1271, 2773, 4265}},
+{864, 13, 2524, {1, 3, 1, 11, 9, 57, 83, 221, 95, 43, 1189, 457, 7133}},
+{865, 13, 2528, {1, 1, 7, 3, 11, 49, 33, 219, 229, 289, 685, 3359, 4495}},
+{866, 13, 2531, {1, 3, 1, 3, 19, 43, 67, 193, 41, 771, 407, 81, 3891}},
+{867, 13, 2538, {1, 1, 7, 11, 5, 29, 51, 175, 297, 539, 1, 2245, 6439}},
+{868, 13, 2545, {1, 3, 7, 15, 21, 33, 117, 183, 511, 489, 1283, 3281, 5979}},
+{869, 13, 2546, {1, 3, 7, 5, 9, 3, 125, 147, 359, 549, 369, 3049, 2405}},
+{870, 13, 2555, {1, 3, 5, 7, 19, 5, 65, 97, 483, 377, 1523, 1457, 2995}},
+{871, 13, 2557, {1, 1, 5, 1, 11, 21, 41, 113, 277, 131, 1475, 1043, 2367}},
+{872, 13, 2564, {1, 3, 3, 1, 15, 17, 101, 69, 443, 865, 817, 1421, 5231}},
+{873, 13, 2573, {1, 1, 3, 3, 3, 55, 95, 99, 75, 195, 1929, 3931, 5855}},
+{874, 13, 2579, {1, 3, 1, 3, 19, 23, 93, 213, 241, 551, 1307, 585, 7729}},
+{875, 13, 2592, {1, 3, 1, 11, 23, 15, 53, 249, 467, 519, 95, 741, 409}},
+{876, 13, 2598, {1, 1, 1, 15, 29, 37, 43, 203, 233, 877, 77, 1933, 2729}},
+{877, 13, 2607, {1, 3, 7, 11, 27, 39, 43, 161, 255, 15, 1463, 833, 495}},
+{878, 13, 2612, {1, 1, 7, 11, 3, 53, 81, 67, 375, 823, 1903, 3061, 395}},
+{879, 13, 2619, {1, 1, 1, 1, 15, 37, 93, 233, 247, 501, 1321, 3275, 5409}},
+{880, 13, 2621, {1, 3, 3, 7, 7, 11, 5, 105, 139, 983, 1239, 531, 3881}},
+{881, 13, 2627, {1, 1, 5, 3, 19, 49, 107, 227, 361, 101, 355, 2649, 7383}},
+{882, 13, 2633, {1, 1, 7, 5, 25, 41, 101, 121, 209, 293, 1937, 2259, 5557}},
+{883, 13, 2636, {1, 1, 3, 7, 7, 1, 9, 13, 463, 1019, 995, 3159, 107}},
+{884, 13, 2642, {1, 3, 5, 11, 5, 35, 127, 97, 261, 789, 807, 807, 6257}},
+{885, 13, 2654, {1, 1, 7, 5, 11, 13, 45, 91, 417, 101, 1973, 3645, 2107}},
+{886, 13, 2660, {1, 1, 3, 7, 5, 63, 57, 49, 203, 157, 115, 1393, 8117}},
+{887, 13, 2669, {1, 3, 5, 5, 3, 43, 15, 155, 127, 489, 1165, 3701, 4867}},
+{888, 13, 2675, {1, 1, 7, 7, 29, 29, 69, 215, 415, 367, 371, 1901, 6075}},
+{889, 13, 2684, {1, 1, 1, 3, 11, 33, 89, 149, 433, 705, 1437, 1597, 505}},
+{890, 13, 2694, {1, 3, 5, 1, 13, 37, 19, 119, 5, 581, 2037, 1633, 2099}},
+{891, 13, 2703, {1, 3, 7, 13, 5, 49, 103, 245, 215, 515, 133, 2007, 1933}},
+{892, 13, 2706, {1, 3, 1, 9, 1, 3, 25, 197, 253, 387, 1683, 2267, 221}},
+{893, 13, 2712, {1, 3, 5, 15, 21, 9, 73, 201, 405, 999, 437, 3877, 6045}},
+{894, 13, 2715, {1, 1, 3, 1, 31, 55, 25, 83, 421, 395, 1807, 2129, 7797}},
+{895, 13, 2722, {1, 1, 3, 1, 23, 21, 121, 183, 125, 347, 143, 3685, 4317}},
+{896, 13, 2727, {1, 3, 3, 3, 17, 45, 17, 223, 267, 795, 1815, 1309, 155}},
+{897, 13, 2734, {1, 1, 1, 15, 17, 59, 5, 133, 15, 715, 1503, 153, 2887}},
+{898, 13, 2742, {1, 1, 1, 1, 27, 13, 119, 77, 243, 995, 1851, 3719, 4695}},
+{899, 13, 2745, {1, 3, 1, 5, 31, 49, 43, 165, 49, 609, 1265, 1141, 505}},
+{900, 13, 2751, {1, 1, 7, 13, 11, 63, 21, 253, 229, 585, 1543, 3719, 4141}},
+{901, 13, 2766, {1, 3, 7, 11, 23, 27, 17, 131, 295, 895, 1493, 1411, 3247}},
+{902, 13, 2768, {1, 1, 5, 9, 29, 7, 97, 15, 113, 445, 859, 1483, 1121}},
+{903, 13, 2780, {1, 3, 1, 9, 13, 49, 99, 107, 323, 201, 681, 3071, 5281}},
+{904, 13, 2790, {1, 1, 1, 15, 9, 19, 61, 161, 7, 87, 587, 2199, 2811}},
+{905, 13, 2794, {1, 3, 3, 15, 15, 19, 95, 45, 299, 829, 981, 3479, 487}},
+{906, 13, 2796, {1, 1, 1, 9, 3, 37, 7, 19, 227, 13, 397, 513, 1257}},
+{907, 13, 2801, {1, 1, 5, 15, 15, 13, 17, 111, 135, 929, 1145, 811, 1801}},
+{908, 13, 2804, {1, 3, 1, 3, 27, 57, 31, 19, 279, 103, 693, 631, 3409}},
+{909, 13, 2807, {1, 1, 1, 1, 15, 13, 67, 83, 23, 799, 1735, 2063, 3363}},
+{910, 13, 2816, {1, 3, 3, 7, 3, 1, 61, 31, 41, 533, 2025, 4067, 6963}},
+{911, 13, 2821, {1, 1, 5, 7, 17, 27, 81, 79, 107, 205, 29, 97, 4883}},
+{912, 13, 2831, {1, 1, 1, 5, 19, 49, 91, 201, 283, 949, 651, 3819, 5073}},
+{913, 13, 2834, {1, 1, 7, 9, 11, 13, 73, 197, 37, 219, 1931, 3369, 6017}},
+{914, 13, 2839, {1, 1, 7, 15, 11, 7, 75, 205, 7, 819, 399, 661, 6487}},
+{915, 13, 2845, {1, 3, 3, 3, 27, 37, 95, 41, 307, 165, 1077, 3485, 563}},
+{916, 13, 2852, {1, 3, 5, 3, 21, 49, 57, 179, 109, 627, 1789, 431, 2941}},
+{917, 13, 2856, {1, 1, 7, 5, 11, 19, 43, 137, 149, 679, 1543, 245, 1381}},
+{918, 13, 2861, {1, 3, 5, 5, 15, 3, 69, 81, 135, 159, 1363, 3401, 6355}},
+{919, 13, 2873, {1, 3, 5, 1, 9, 61, 49, 53, 319, 25, 1647, 1297, 615}},
+{920, 13, 2874, {1, 3, 5, 11, 31, 43, 9, 101, 71, 919, 335, 3147, 5823}},
+{921, 13, 2888, {1, 3, 1, 1, 15, 5, 29, 109, 511, 945, 867, 3677, 6915}},
+{922, 13, 2893, {1, 3, 3, 15, 17, 49, 91, 111, 215, 29, 1879, 97, 2505}},
+{923, 13, 2894, {1, 3, 1, 13, 19, 61, 11, 111, 163, 777, 533, 1113, 5339}},
+{924, 13, 2902, {1, 1, 7, 9, 17, 55, 117, 91, 455, 289, 557, 913, 4455}},
+{925, 13, 2917, {1, 3, 1, 7, 25, 19, 123, 37, 1, 277, 717, 2965, 4469}},
+{926, 13, 2921, {1, 3, 7, 3, 19, 23, 87, 235, 209, 457, 2041, 2893, 1805}},
+{927, 13, 2922, {1, 3, 3, 5, 5, 43, 23, 61, 351, 791, 59, 2009, 2909}},
+{928, 13, 2929, {1, 1, 3, 7, 5, 1, 27, 231, 385, 257, 1261, 2701, 1807}},
+{929, 13, 2935, {1, 3, 1, 1, 27, 19, 87, 253, 131, 685, 1743, 3983, 2651}},
+{930, 13, 2946, {1, 3, 7, 11, 21, 17, 11, 81, 191, 641, 1821, 3005, 7251}},
+{931, 13, 2951, {1, 3, 3, 5, 15, 31, 41, 213, 55, 931, 1953, 49, 6037}},
+{932, 13, 2957, {1, 1, 7, 15, 7, 27, 65, 223, 113, 79, 1875, 911, 5445}},
+{933, 13, 2960, {1, 3, 7, 7, 23, 55, 51, 167, 495, 25, 1585, 3447, 799}},
+{934, 13, 2966, {1, 1, 3, 7, 27, 15, 95, 193, 337, 415, 975, 3085, 967}},
+{935, 13, 2972, {1, 1, 7, 15, 19, 7, 93, 41, 433, 551, 401, 3169, 3971}},
+{936, 13, 2976, {1, 1, 7, 11, 13, 15, 53, 69, 433, 59, 1117, 3359, 6231}},
+{937, 13, 2979, {1, 1, 7, 3, 23, 5, 115, 201, 225, 109, 1903, 3897, 6265}},
+{938, 13, 2985, {1, 1, 1, 11, 17, 1, 39, 143, 361, 659, 1105, 23, 4923}},
+{939, 13, 3000, {1, 1, 1, 9, 27, 57, 85, 227, 261, 119, 1881, 3965, 6999}},
+{940, 13, 3003, {1, 3, 7, 7, 15, 7, 107, 17, 315, 49, 1591, 905, 7789}},
+{941, 13, 3013, {1, 3, 1, 7, 29, 3, 47, 237, 157, 769, 839, 3199, 3195}},
+{942, 13, 3018, {1, 1, 3, 15, 25, 39, 63, 15, 111, 857, 881, 1505, 7671}},
+{943, 13, 3020, {1, 1, 7, 1, 3, 35, 41, 215, 99, 895, 1025, 1483, 4707}},
+{944, 13, 3025, {1, 3, 5, 1, 1, 31, 25, 247, 113, 841, 397, 1825, 6969}},
+{945, 13, 3042, {1, 1, 3, 5, 19, 41, 49, 243, 225, 973, 241, 175, 1041}},
+{946, 13, 3047, {1, 1, 1, 7, 15, 15, 105, 141, 83, 75, 1675, 3523, 5219}},
+{947, 13, 3048, {1, 1, 7, 5, 13, 27, 47, 199, 445, 841, 959, 1157, 2209}},
+{948, 13, 3051, {1, 3, 5, 15, 23, 31, 31, 81, 85, 33, 785, 2639, 7799}},
+{949, 13, 3054, {1, 1, 5, 13, 21, 3, 47, 99, 235, 943, 1731, 2467, 7891}},
+{950, 13, 3056, {1, 1, 1, 3, 17, 53, 85, 219, 73, 131, 1339, 875, 1191}},
+{951, 13, 3065, {1, 1, 5, 7, 17, 63, 113, 7, 185, 557, 749, 3563, 4973}},
+{952, 13, 3073, {1, 3, 3, 15, 15, 21, 43, 111, 155, 689, 345, 423, 3597}},
+{953, 13, 3074, {1, 1, 5, 1, 15, 29, 93, 5, 361, 713, 695, 3937, 425}},
+{954, 13, 3083, {1, 3, 7, 7, 13, 41, 115, 175, 315, 937, 123, 2841, 4457}},
+{955, 13, 3086, {1, 1, 3, 11, 25, 5, 103, 53, 423, 811, 657, 399, 7257}},
+{956, 13, 3091, {1, 1, 1, 1, 1, 13, 101, 211, 383, 325, 97, 1703, 4429}},
+{957, 13, 3097, {1, 3, 7, 9, 31, 45, 83, 157, 509, 701, 841, 1105, 3643}},
+{958, 13, 3109, {1, 1, 1, 7, 1, 9, 69, 17, 129, 281, 1161, 2945, 7693}},
+{959, 13, 3116, {1, 3, 7, 1, 11, 29, 51, 143, 77, 433, 1723, 2317, 5641}},
+{960, 13, 3124, {1, 1, 1, 1, 21, 43, 13, 67, 177, 505, 1629, 1267, 4885}},
+{961, 13, 3128, {1, 1, 3, 11, 27, 63, 111, 47, 233, 781, 453, 1679, 3209}},
+{962, 13, 3153, {1, 1, 3, 13, 29, 27, 119, 141, 493, 971, 461, 1159, 633}},
+{963, 13, 3160, {1, 1, 3, 15, 23, 5, 79, 215, 163, 149, 1805, 2399, 61}},
+{964, 13, 3165, {1, 3, 5, 13, 19, 5, 1, 39, 409, 561, 709, 829, 1357}},
+{965, 13, 3172, {1, 3, 3, 13, 19, 43, 9, 177, 449, 447, 73, 2107, 5669}},
+{966, 13, 3175, {1, 3, 5, 1, 23, 13, 63, 109, 203, 593, 829, 4017, 6881}},
+{967, 13, 3184, {1, 1, 5, 7, 3, 9, 53, 175, 391, 169, 1283, 3793, 4451}},
+{968, 13, 3193, {1, 1, 5, 7, 29, 43, 9, 5, 209, 77, 927, 2941, 8145}},
+{969, 13, 3196, {1, 3, 5, 15, 17, 49, 5, 143, 131, 771, 1685, 925, 2175}},
+{970, 13, 3200, {1, 1, 3, 11, 27, 27, 27, 159, 161, 1015, 1587, 4049, 1983}},
+{971, 13, 3203, {1, 3, 1, 3, 23, 57, 119, 67, 481, 577, 389, 3319, 5325}},
+{972, 13, 3205, {1, 3, 5, 1, 19, 39, 87, 61, 329, 657, 1773, 31, 1707}},
+{973, 13, 3209, {1, 1, 3, 1, 5, 25, 15, 241, 131, 815, 1751, 3029, 8039}},
+{974, 13, 3224, {1, 3, 3, 13, 27, 13, 77, 87, 437, 57, 621, 1031, 7891}},
+{975, 13, 3239, {1, 3, 1, 13, 23, 51, 117, 37, 331, 745, 605, 3179, 4713}},
+{976, 13, 3251, {1, 1, 5, 5, 19, 17, 99, 167, 87, 721, 737, 789, 2165}},
+{977, 13, 3254, {1, 3, 5, 13, 1, 51, 119, 211, 165, 299, 1327, 3053, 3343}},
+{978, 13, 3265, {1, 1, 5, 15, 29, 45, 17, 129, 67, 345, 1553, 2705, 7369}},
+{979, 13, 3266, {1, 1, 1, 9, 23, 7, 13, 209, 7, 407, 317, 3077, 7287}},
+{980, 13, 3275, {1, 1, 1, 5, 9, 59, 89, 3, 487, 451, 505, 2499, 7563}},
+{981, 13, 3280, {1, 3, 1, 7, 21, 1, 21, 203, 101, 417, 1389, 2751, 1397}},
+{982, 13, 3283, {1, 3, 7, 13, 7, 31, 3, 247, 349, 485, 1259, 549, 6321}},
+{983, 13, 3286, {1, 1, 7, 7, 27, 33, 107, 197, 293, 729, 1753, 2571, 103}},
+{984, 13, 3301, {1, 3, 5, 9, 25, 35, 5, 253, 137, 213, 2041, 3387, 1809}},
+{985, 13, 3302, {1, 1, 7, 13, 15, 35, 67, 83, 295, 175, 839, 2831, 839}},
+{986, 13, 3305, {1, 3, 3, 11, 3, 17, 55, 141, 247, 991, 117, 3799, 1221}},
+{987, 13, 3319, {1, 1, 5, 1, 11, 37, 87, 233, 457, 653, 899, 2933, 3105}},
+{988, 13, 3323, {1, 1, 3, 15, 3, 31, 67, 167, 437, 9, 651, 1109, 1139}},
+{989, 13, 3326, {1, 1, 3, 1, 7, 63, 67, 17, 11, 883, 1855, 1941, 4751}},
+{990, 13, 3331, {1, 3, 7, 9, 19, 33, 113, 117, 495, 39, 1795, 2561, 5519}},
+{991, 13, 3348, {1, 1, 7, 5, 1, 3, 103, 37, 201, 223, 1101, 877, 6483}},
+{992, 13, 3351, {1, 1, 5, 9, 29, 49, 51, 33, 439, 917, 861, 1321, 2135}},
+{993, 13, 3358, {1, 1, 3, 3, 1, 5, 17, 93, 217, 619, 613, 1357, 6095}},
+{994, 13, 3368, {1, 3, 1, 11, 3, 21, 5, 41, 15, 175, 843, 2937, 6849}},
+{995, 13, 3374, {1, 3, 3, 7, 9, 57, 55, 127, 79, 287, 445, 2205, 7989}},
+{996, 13, 3376, {1, 1, 7, 13, 23, 17, 93, 129, 157, 135, 1747, 1813, 4183}},
+{997, 13, 3379, {1, 1, 1, 5, 31, 59, 99, 33, 425, 329, 887, 367, 1761}},
+{998, 13, 3385, {1, 1, 7, 9, 17, 53, 77, 139, 435, 387, 49, 3649, 1773}},
+{999, 13, 3386, {1, 3, 3, 15, 21, 57, 45, 161, 331, 719, 273, 3479, 4173}},
+{1000, 13, 3396, {1, 1, 3, 9, 3, 3, 105, 201, 373, 877, 919, 1263, 6649}},
+{1001, 13, 3420, {1, 3, 1, 15, 13, 43, 13, 99, 73, 163, 353, 3569, 5601}},
+{1002, 13, 3423, {1, 3, 7, 3, 5, 9, 69, 177, 449, 47, 781, 1125, 4245}},
+{1003, 13, 3430, {1, 1, 1, 5, 3, 45, 1, 123, 409, 903, 205, 2057, 7637}},
+{1004, 13, 3433, {1, 3, 5, 9, 19, 47, 87, 135, 481, 799, 101, 3409, 2241}},
+{1005, 13, 3434, {1, 3, 1, 13, 3, 25, 15, 27, 181, 967, 669, 2577, 7249}},
+{1006, 13, 3439, {1, 1, 7, 3, 31, 5, 103, 53, 1, 911, 1209, 3697, 6685}},
+{1007, 13, 3442, {1, 1, 3, 1, 5, 5, 49, 135, 281, 747, 761, 2973, 7963}},
+{1008, 13, 3444, {1, 3, 3, 5, 19, 61, 125, 199, 299, 515, 1365, 369, 7027}},
+{1009, 13, 3453, {1, 3, 1, 7, 5, 41, 63, 229, 283, 571, 147, 447, 657}},
+{1010, 13, 3464, {1, 3, 1, 11, 5, 15, 55, 7, 259, 61, 27, 1429, 5631}},
+{1011, 13, 3477, {1, 1, 5, 1, 3, 53, 51, 253, 155, 553, 1293, 3735, 6567}},
+{1012, 13, 3478, {1, 3, 5, 9, 5, 41, 21, 159, 101, 785, 1981, 3799, 7693}},
+{1013, 13, 3482, {1, 3, 7, 7, 9, 3, 95, 105, 129, 213, 1215, 1027, 5699}},
+{1014, 13, 3487, {1, 1, 3, 3, 29, 13, 9, 253, 449, 321, 341, 2879, 171}},
+{1015, 13, 3497, {1, 3, 7, 11, 21, 11, 75, 35, 43, 965, 675, 2217, 7175}},
+{1016, 13, 3500, {1, 1, 5, 15, 31, 5, 29, 137, 311, 751, 47, 1367, 5921}},
+{1017, 13, 3505, {1, 1, 3, 15, 17, 1, 45, 69, 55, 649, 835, 569, 7615}},
+{1018, 13, 3506, {1, 3, 1, 13, 31, 7, 23, 15, 391, 145, 1845, 1825, 1403}},
+{1019, 13, 3511, {1, 1, 3, 15, 5, 9, 79, 77, 105, 399, 1933, 2503, 4781}},
+{1020, 13, 3512, {1, 3, 1, 3, 17, 47, 19, 13, 107, 475, 759, 2933, 3761}},
+{1021, 13, 3515, {1, 1, 7, 11, 3, 7, 121, 209, 397, 877, 293, 847, 7039}},
+{1022, 13, 3525, {1, 1, 1, 15, 29, 45, 5, 109, 335, 461, 143, 931, 4045}},
+{1023, 13, 3532, {1, 3, 1, 7, 11, 57, 73, 89, 201, 173, 803, 3953, 5205}},
+{1024, 13, 3538, {1, 1, 5, 11, 11, 33, 37, 29, 263, 1019, 657, 1453, 7807}},
+{1025, 13, 3540, {1, 3, 3, 13, 31, 25, 37, 47, 261, 607, 1703, 2603, 417}},
+{1026, 13, 3547, {1, 1, 1, 1, 31, 61, 45, 115, 275, 239, 1989, 1897, 4329}},
+{1027, 13, 3549, {1, 3, 5, 3, 31, 3, 11, 173, 335, 579, 1193, 2219, 7875}},
+{1028, 13, 3560, {1, 1, 7, 9, 29, 45, 13, 67, 399, 177, 1293, 3865, 2225}},
+{1029, 13, 3571, {1, 1, 7, 11, 11, 51, 121, 227, 469, 905, 929, 2635, 4165}},
+{1030, 13, 3577, {1, 3, 7, 9, 13, 39, 55, 167, 23, 147, 1603, 2083, 4645}},
+{1031, 13, 3583, {1, 1, 3, 15, 27, 53, 11, 155, 157, 629, 259, 3009, 4605}},
+{1032, 13, 3590, {1, 3, 1, 7, 15, 47, 51, 1, 259, 603, 887, 2833, 6581}},
+{1033, 13, 3593, {1, 3, 5, 3, 1, 47, 91, 43, 361, 571, 29, 1453, 4269}},
+{1034, 13, 3594, {1, 1, 3, 9, 11, 51, 55, 23, 415, 277, 1423, 3475, 1527}},
+{1035, 13, 3599, {1, 1, 3, 11, 29, 49, 101, 75, 299, 709, 805, 4037, 4389}},
+{1036, 13, 3601, {1, 1, 7, 3, 23, 1, 37, 51, 379, 771, 1301, 3717, 6673}},
+{1037, 13, 3602, {1, 1, 5, 3, 23, 11, 125, 177, 375, 665, 951, 1577, 2603}},
+{1038, 13, 3613, {1, 1, 1, 1, 1, 5, 71, 255, 21, 459, 467, 2083, 5415}},
+{1039, 13, 3623, {1, 1, 5, 13, 23, 29, 109, 157, 363, 971, 549, 647, 1177}},
+{1040, 13, 3630, {1, 1, 3, 9, 7, 15, 101, 3, 365, 213, 745, 1155, 6099}},
+{1041, 13, 3638, {1, 3, 5, 15, 15, 19, 47, 179, 303, 521, 1279, 219, 2415}},
+{1042, 13, 3649, {1, 3, 3, 13, 27, 11, 83, 165, 369, 989, 261, 3933, 4809}},
+{1043, 13, 3655, {1, 1, 3, 11, 31, 59, 1, 185, 53, 703, 1471, 2935, 1107}},
+{1044, 13, 3662, {1, 3, 3, 7, 25, 3, 81, 27, 93, 521, 433, 2859, 5861}},
+{1045, 13, 3667, {1, 3, 3, 11, 29, 15, 49, 167, 315, 927, 543, 3473, 4307}},
+{1046, 13, 3669, {1, 3, 1, 3, 29, 33, 53, 15, 183, 691, 703, 1311, 3393}},
+{1047, 13, 3676, {1, 3, 5, 13, 23, 49, 3, 11, 1, 357, 1407, 415, 7211}},
+{1048, 13, 3683, {1, 3, 7, 15, 1, 25, 91, 113, 323, 371, 189, 925, 1181}},
+{1049, 13, 3700, {1, 3, 3, 3, 17, 59, 119, 199, 115, 223, 877, 2193, 193}},
+{1050, 13, 3709, {1, 1, 1, 5, 5, 35, 31, 59, 437, 411, 37, 2405, 3797}},
+{1051, 13, 3710, {1, 3, 1, 13, 9, 37, 1, 241, 59, 157, 1785, 1223, 563}},
+{1052, 13, 3713, {1, 3, 5, 13, 3, 21, 25, 95, 15, 745, 85, 701, 5361}},
+{1053, 13, 3723, {1, 3, 7, 1, 31, 33, 111, 195, 35, 913, 2013, 2951, 6611}},
+{1054, 13, 3725, {1, 3, 5, 1, 19, 3, 75, 119, 111, 409, 951, 1457, 4957}},
+{1055, 13, 3728, {1, 3, 1, 15, 19, 59, 3, 155, 237, 657, 1967, 3323, 6235}},
+{1056, 13, 3734, {1, 1, 5, 1, 3, 19, 45, 105, 377, 881, 167, 2255, 4483}},
+{1057, 13, 3737, {1, 1, 7, 7, 13, 13, 99, 89, 201, 279, 161, 2483, 6001}},
+{1058, 13, 3738, {1, 1, 7, 3, 13, 17, 97, 129, 137, 377, 1519, 183, 3725}},
+{1059, 13, 3744, {1, 1, 7, 9, 9, 5, 45, 135, 115, 181, 1685, 3505, 4387}},
+{1060, 13, 3750, {1, 1, 1, 1, 19, 35, 69, 113, 305, 419, 949, 2969, 247}},
+{1061, 13, 3762, {1, 1, 5, 13, 23, 61, 13, 139, 501, 811, 67, 1501, 6493}},
+{1062, 13, 3764, {1, 1, 3, 13, 15, 41, 27, 217, 293, 13, 145, 2631, 6991}},
+{1063, 13, 3774, {1, 3, 3, 13, 15, 37, 71, 123, 285, 49, 627, 1283, 5993}},
+{1064, 13, 3776, {1, 3, 3, 11, 9, 25, 11, 1, 203, 353, 1347, 1999, 2799}},
+{1065, 13, 3786, {1, 3, 5, 1, 7, 49, 101, 231, 499, 63, 1977, 2207, 7829}},
+{1066, 13, 3800, {1, 1, 7, 1, 17, 15, 115, 139, 381, 943, 623, 4037, 2971}},
+{1067, 13, 3803, {1, 1, 3, 5, 13, 55, 23, 87, 139, 795, 1669, 1375, 1185}},
+{1068, 13, 3809, {1, 3, 3, 5, 5, 45, 97, 253, 241, 333, 645, 555, 7867}},
+{1069, 13, 3816, {1, 3, 5, 1, 1, 1, 89, 27, 407, 509, 1433, 609, 2355}},
+{1070, 13, 3821, {1, 3, 7, 1, 27, 29, 5, 157, 495, 811, 1293, 1143, 827}},
+{1071, 13, 3827, {1, 1, 3, 3, 25, 49, 127, 111, 191, 3, 845, 1383, 2521}},
+{1072, 13, 3829, {1, 1, 5, 7, 5, 51, 101, 155, 237, 461, 831, 3091, 3851}},
+{1073, 13, 3836, {1, 3, 7, 1, 29, 35, 105, 91, 285, 705, 131, 395, 6011}},
+{1074, 13, 3842, {1, 3, 5, 3, 13, 21, 83, 173, 221, 827, 1775, 1931, 6727}},
+{1075, 13, 3844, {1, 1, 3, 5, 3, 25, 95, 115, 205, 569, 1447, 933, 6425}},
+{1076, 13, 3847, {1, 1, 7, 9, 31, 3, 17, 175, 145, 447, 1321, 1069, 6527}},
+{1077, 13, 3853, {1, 1, 3, 3, 23, 1, 79, 51, 421, 419, 873, 3939, 1801}},
+{1078, 13, 3861, {1, 1, 5, 1, 3, 39, 15, 85, 169, 669, 919, 397, 5579}},
+{1079, 13, 3871, {1, 3, 5, 1, 21, 61, 87, 217, 251, 619, 1091, 4009, 229}},
+{1080, 13, 3872, {1, 1, 1, 11, 23, 55, 85, 121, 363, 867, 315, 447, 3373}},
+{1081, 13, 3881, {1, 3, 3, 13, 29, 19, 89, 85, 137, 469, 1873, 2765, 3975}},
+{1082, 13, 3890, {1, 3, 7, 13, 19, 63, 61, 77, 67, 361, 11, 1787, 4703}},
+{1083, 13, 3892, {1, 1, 3, 11, 7, 15, 127, 105, 179, 857, 1671, 3647, 3389}},
+{1084, 13, 3909, {1, 1, 1, 7, 19, 21, 99, 161, 499, 519, 1287, 2973, 479}},
+{1085, 13, 3921, {1, 1, 3, 13, 29, 51, 95, 251, 55, 519, 1955, 2881, 5951}},
+{1086, 13, 3934, {1, 1, 3, 11, 23, 63, 121, 237, 175, 311, 701, 1539, 2383}},
+{1087, 13, 3938, {1, 1, 7, 5, 5, 45, 73, 97, 5, 153, 715, 2037, 3353}},
+{1088, 13, 3947, {1, 1, 1, 3, 13, 7, 67, 173, 425, 843, 1497, 2729, 5193}},
+{1089, 13, 3950, {1, 1, 7, 1, 23, 3, 119, 11, 77, 141, 1905, 2269, 4269}},
+{1090, 13, 3952, {1, 1, 7, 15, 1, 23, 79, 251, 439, 603, 405, 2449, 6383}},
+{1091, 13, 3964, {1, 3, 7, 11, 29, 27, 47, 255, 47, 661, 1967, 1007, 3689}},
+{1092, 13, 3974, {1, 3, 7, 5, 19, 39, 35, 115, 417, 373, 291, 329, 603}},
+{1093, 13, 3980, {1, 3, 1, 9, 11, 33, 27, 193, 207, 423, 1311, 1369, 7307}},
+{1094, 13, 3983, {1, 1, 3, 11, 9, 29, 83, 17, 497, 493, 329, 3141, 5935}},
+{1095, 13, 3986, {1, 3, 1, 5, 31, 51, 29, 171, 51, 493, 1621, 3501, 4091}},
+{1096, 13, 3995, {1, 1, 5, 9, 21, 43, 105, 207, 245, 363, 1191, 699, 1139}},
+{1097, 13, 3998, {1, 1, 3, 11, 19, 5, 81, 119, 247, 169, 1337, 45, 6565}},
+{1098, 13, 4001, {1, 3, 1, 11, 3, 51, 3, 101, 159, 11, 253, 299, 5043}},
+{1099, 13, 4002, {1, 3, 1, 5, 11, 53, 85, 39, 57, 645, 2007, 1039, 3627}},
+{1100, 13, 4004, {1, 3, 5, 3, 17, 61, 97, 165, 415, 357, 283, 601, 5505}},
+{1101, 13, 4008, {1, 3, 7, 3, 9, 51, 49, 85, 3, 227, 137, 309, 243}},
+{1102, 13, 4011, {1, 1, 5, 3, 11, 59, 11, 131, 409, 703, 455, 123, 6727}},
+{1103, 13, 4016, {1, 3, 7, 9, 25, 49, 21, 171, 287, 379, 667, 313, 713}},
+{1104, 13, 4033, {1, 1, 3, 9, 7, 35, 47, 3, 367, 581, 1627, 1665, 3905}},
+{1105, 13, 4036, {1, 3, 1, 1, 29, 57, 35, 55, 255, 653, 823, 2197, 6179}},
+{1106, 13, 4040, {1, 3, 7, 15, 17, 15, 117, 83, 359, 163, 115, 2999, 5373}},
+{1107, 13, 4053, {1, 1, 5, 3, 21, 61, 35, 97, 71, 687, 207, 2917, 1049}},
+{1108, 13, 4058, {1, 1, 1, 15, 13, 15, 125, 81, 263, 661, 417, 3243, 1669}},
+{1109, 13, 4081, {1, 1, 7, 3, 3, 19, 111, 193, 443, 339, 659, 1211, 1557}},
+{1110, 13, 4091, {1, 3, 1, 3, 27, 3, 3, 173, 391, 213, 803, 3281, 3207}},
+{1111, 13, 4094, {1, 1, 5, 15, 19, 1, 7, 211, 157, 603, 403, 1387, 1583}},
+{1112, 14, 21, {1, 3, 5, 13, 17, 53, 125, 13, 339, 723, 521, 413, 5801, 10451}},
+{1113, 14, 28, {1, 1, 3, 13, 29, 9, 99, 77, 141, 609, 1533, 983, 2039, 51}},
+{1114, 14, 41, {1, 1, 3, 11, 21, 55, 5, 51, 423, 309, 525, 3715, 3025, 15055}},
+{1115, 14, 47, {1, 1, 3, 7, 9, 21, 77, 171, 239, 341, 1653, 1093, 2273, 10723}},
+{1116, 14, 61, {1, 1, 1, 15, 31, 15, 23, 35, 317, 869, 1917, 1415, 4313, 3687}},
+{1117, 14, 84, {1, 1, 1, 5, 21, 25, 99, 167, 439, 453, 473, 431, 6665, 4989}},
+{1118, 14, 87, {1, 1, 7, 9, 31, 47, 81, 83, 345, 43, 1363, 1885, 3155, 3185}},
+{1119, 14, 93, {1, 3, 7, 1, 31, 17, 61, 185, 341, 129, 547, 717, 2071, 9991}},
+{1120, 14, 94, {1, 3, 1, 13, 23, 61, 77, 217, 455, 77, 1263, 1601, 3501, 14953}},
+{1121, 14, 103, {1, 1, 7, 7, 19, 19, 1, 229, 431, 943, 1069, 1949, 1289, 15729}},
+{1122, 14, 117, {1, 1, 3, 5, 1, 35, 97, 251, 487, 459, 1265, 1739, 165, 10365}},
+{1123, 14, 121, {1, 3, 5, 3, 11, 25, 79, 175, 383, 545, 187, 197, 4329, 3363}},
+{1124, 14, 134, {1, 1, 3, 3, 29, 9, 63, 55, 175, 277, 431, 2549, 2629, 6409}},
+{1125, 14, 137, {1, 1, 3, 15, 17, 21, 79, 139, 99, 135, 1763, 1805, 3471, 5439}},
+{1126, 14, 157, {1, 1, 3, 9, 9, 15, 35, 119, 289, 835, 769, 3843, 4119, 4421}},
+{1127, 14, 161, {1, 1, 1, 5, 19, 19, 67, 199, 307, 815, 1367, 1231, 3927, 6593}},
+{1128, 14, 205, {1, 1, 3, 1, 29, 51, 121, 209, 431, 47, 1115, 907, 2535, 9755}},
+{1129, 14, 206, {1, 1, 3, 5, 17, 1, 5, 119, 121, 223, 1719, 1291, 3947, 15891}},
+{1130, 14, 211, {1, 3, 1, 15, 29, 25, 3, 131, 373, 307, 645, 3513, 1289, 1987}},
+{1131, 14, 214, {1, 3, 3, 11, 29, 45, 105, 179, 331, 465, 891, 1315, 403, 3057}},
+{1132, 14, 218, {1, 1, 5, 13, 17, 59, 77, 127, 485, 855, 1147, 3093, 891, 9869}},
+{1133, 14, 234, {1, 1, 1, 7, 23, 27, 31, 203, 285, 463, 827, 685, 1349, 15051}},
+{1134, 14, 236, {1, 1, 1, 5, 29, 5, 107, 195, 31, 425, 19, 2865, 3869, 11153}},
+{1135, 14, 248, {1, 1, 7, 5, 7, 47, 1, 73, 307, 347, 393, 2205, 7709, 15121}},
+{1136, 14, 262, {1, 1, 1, 13, 15, 61, 25, 131, 113, 369, 1995, 2527, 4475, 1745}},
+{1137, 14, 299, {1, 1, 1, 1, 31, 63, 21, 253, 307, 281, 859, 3319, 6721, 2891}},
+{1138, 14, 304, {1, 1, 3, 11, 1, 17, 5, 183, 301, 979, 651, 1685, 6343, 10067}},
+{1139, 14, 319, {1, 1, 5, 15, 23, 45, 99, 145, 263, 507, 1381, 3425, 2215, 1815}},
+{1140, 14, 322, {1, 3, 1, 5, 11, 63, 85, 203, 411, 881, 1369, 1237, 4657, 6541}},
+{1141, 14, 334, {1, 3, 3, 13, 17, 53, 121, 201, 269, 983, 215, 3187, 7121, 6111}},
+{1142, 14, 355, {1, 3, 5, 15, 15, 5, 13, 143, 3, 313, 1677, 1093, 3295, 3387}},
+{1143, 14, 357, {1, 1, 3, 13, 3, 23, 73, 17, 257, 965, 239, 1271, 2803, 7327}},
+{1144, 14, 358, {1, 3, 5, 13, 9, 57, 115, 37, 41, 467, 135, 1403, 3811, 4741}},
+{1145, 14, 369, {1, 3, 7, 15, 9, 33, 39, 203, 351, 367, 1355, 1403, 3685, 4757}},
+{1146, 14, 372, {1, 3, 5, 11, 31, 3, 113, 123, 203, 421, 1821, 3151, 2375, 4419}},
+{1147, 14, 375, {1, 1, 1, 7, 21, 63, 99, 23, 133, 79, 991, 1755, 4989, 4709}},
+{1148, 14, 388, {1, 3, 5, 1, 25, 63, 113, 239, 49, 443, 173, 1261, 3201, 10599}},
+{1149, 14, 400, {1, 3, 3, 13, 3, 25, 101, 169, 23, 585, 327, 1327, 111, 10059}},
+{1150, 14, 415, {1, 3, 3, 5, 19, 1, 33, 89, 437, 213, 1933, 1741, 2603, 5625}},
+{1151, 14, 446, {1, 3, 1, 3, 15, 15, 25, 139, 73, 335, 237, 2461, 3101, 14951}},
+{1152, 14, 451, {1, 3, 5, 1, 31, 15, 31, 187, 177, 659, 1339, 3767, 4975, 7123}},
+{1153, 14, 458, {1, 3, 1, 3, 25, 19, 47, 89, 107, 107, 649, 683, 3123, 11085}},
+{1154, 14, 471, {1, 3, 7, 9, 15, 21, 101, 25, 11, 625, 1555, 675, 3893, 5805}},
+{1155, 14, 484, {1, 1, 1, 5, 7, 49, 123, 21, 439, 369, 207, 535, 4619, 14665}},
+{1156, 14, 501, {1, 1, 5, 7, 1, 25, 103, 185, 99, 239, 1093, 1561, 6177, 4039}},
+{1157, 14, 502, {1, 3, 7, 5, 29, 21, 43, 103, 343, 973, 1561, 2975, 7467, 7947}},
+{1158, 14, 517, {1, 1, 7, 9, 19, 3, 13, 23, 461, 813, 1191, 985, 559, 3317}},
+{1159, 14, 545, {1, 3, 5, 5, 27, 31, 79, 15, 365, 901, 1949, 117, 3619, 13311}},
+{1160, 14, 569, {1, 3, 5, 7, 5, 33, 67, 199, 425, 189, 1691, 3099, 815, 1677}},
+{1161, 14, 617, {1, 1, 7, 11, 13, 29, 73, 137, 265, 601, 445, 3893, 2511, 8047}},
+{1162, 14, 618, {1, 1, 3, 1, 13, 5, 57, 101, 357, 391, 335, 601, 1359, 1065}},
+{1163, 14, 623, {1, 1, 1, 1, 25, 57, 27, 115, 31, 873, 611, 2125, 447, 13585}},
+{1164, 14, 625, {1, 3, 3, 13, 27, 17, 73, 11, 359, 33, 1153, 271, 4537, 15141}},
+{1165, 14, 637, {1, 3, 7, 3, 11, 63, 103, 61, 59, 629, 1629, 3279, 3919, 3177}},
+{1166, 14, 661, {1, 1, 5, 15, 3, 63, 85, 193, 381, 165, 175, 3247, 2501, 4209}},
+{1167, 14, 668, {1, 1, 5, 15, 1, 33, 59, 219, 487, 193, 1557, 703, 2907, 7953}},
+{1168, 14, 684, {1, 1, 7, 3, 9, 3, 105, 95, 389, 991, 21, 3841, 6983, 285}},
+{1169, 14, 695, {1, 1, 1, 1, 1, 31, 25, 137, 117, 67, 1283, 1963, 6591, 15541}},
+{1170, 14, 716, {1, 3, 5, 11, 7, 15, 127, 89, 453, 777, 1827, 2311, 7661, 11833}},
+{1171, 14, 719, {1, 1, 7, 13, 19, 29, 79, 165, 223, 453, 2039, 3961, 6467, 5481}},
+{1172, 14, 722, {1, 3, 3, 7, 17, 41, 43, 157, 323, 3, 1001, 2109, 4513, 12127}},
+{1173, 14, 731, {1, 1, 5, 9, 31, 57, 3, 217, 113, 271, 1663, 1367, 6949, 8165}},
+{1174, 14, 738, {1, 1, 7, 15, 27, 35, 81, 235, 61, 205, 525, 311, 6357, 2527}},
+{1175, 14, 747, {1, 3, 1, 9, 19, 29, 71, 207, 321, 1011, 1615, 1333, 3459, 6681}},
+{1176, 14, 755, {1, 3, 7, 7, 3, 57, 41, 19, 25, 397, 565, 1837, 7625, 11813}},
+{1177, 14, 761, {1, 3, 3, 1, 27, 47, 31, 79, 441, 961, 1255, 423, 2405, 913}},
+{1178, 14, 767, {1, 3, 3, 13, 3, 29, 69, 227, 85, 201, 395, 3199, 3869, 13099}},
+{1179, 14, 775, {1, 3, 3, 7, 29, 61, 99, 7, 27, 227, 945, 873, 475, 4363}},
+{1180, 14, 782, {1, 3, 5, 13, 19, 21, 57, 149, 217, 443, 565, 453, 5487, 10981}},
+{1181, 14, 787, {1, 3, 3, 1, 9, 27, 47, 191, 35, 395, 1429, 4079, 6871, 8013}},
+{1182, 14, 794, {1, 3, 5, 15, 5, 43, 9, 79, 279, 563, 1125, 985, 8117, 4099}},
+{1183, 14, 803, {1, 3, 5, 1, 13, 41, 21, 117, 287, 667, 701, 1483, 8167, 13283}},
+{1184, 14, 812, {1, 3, 1, 3, 15, 15, 59, 5, 383, 509, 1657, 3977, 7697, 10941}},
+{1185, 14, 817, {1, 3, 1, 1, 17, 29, 19, 23, 377, 45, 981, 1631, 3557, 6749}},
+{1186, 14, 824, {1, 3, 3, 9, 9, 51, 9, 193, 345, 361, 1679, 3333, 713, 5387}},
+{1187, 14, 829, {1, 3, 5, 5, 17, 45, 97, 17, 385, 349, 105, 2245, 7295, 14393}},
+{1188, 14, 850, {1, 3, 7, 3, 19, 51, 35, 99, 79, 301, 1563, 399, 5879, 14675}},
+{1189, 14, 866, {1, 1, 7, 15, 13, 53, 55, 203, 417, 161, 2033, 1845, 6763, 3585}},
+{1190, 14, 871, {1, 1, 3, 3, 7, 23, 11, 43, 241, 309, 1453, 3147, 2619, 3163}},
+{1191, 14, 877, {1, 1, 1, 11, 17, 1, 17, 137, 443, 465, 993, 3217, 7879, 14607}},
+{1192, 14, 920, {1, 1, 7, 13, 29, 49, 71, 217, 291, 793, 135, 21, 2503, 11091}},
+{1193, 14, 935, {1, 3, 1, 11, 31, 51, 121, 227, 377, 157, 1457, 1317, 5625, 6217}},
+{1194, 14, 959, {1, 1, 3, 7, 23, 61, 47, 93, 79, 617, 1805, 2403, 5513, 16335}},
+{1195, 14, 979, {1, 3, 5, 11, 23, 25, 41, 11, 495, 587, 1223, 3107, 1469, 15223}},
+{1196, 14, 992, {1, 3, 7, 7, 9, 1, 1, 49, 23, 723, 1761, 3717, 7375, 10875}},
+{1197, 14, 1010, {1, 3, 3, 11, 25, 37, 57, 63, 309, 603, 183, 285, 1663, 5627}},
+{1198, 14, 1012, {1, 3, 7, 11, 19, 25, 25, 201, 391, 257, 529, 1645, 1, 15111}},
+{1199, 14, 1015, {1, 3, 3, 9, 11, 43, 91, 65, 5, 959, 301, 1015, 6343, 3453}},
+{1200, 14, 1033, {1, 3, 3, 11, 17, 17, 103, 37, 77, 973, 575, 439, 49, 3639}},
+{1201, 14, 1036, {1, 1, 5, 7, 1, 15, 107, 237, 231, 967, 923, 1101, 6715, 1713}},
+{1202, 14, 1053, {1, 3, 1, 15, 9, 33, 29, 211, 245, 601, 1783, 887, 1209, 11785}},
+{1203, 14, 1057, {1, 3, 3, 7, 21, 43, 27, 89, 27, 141, 865, 367, 1379, 4063}},
+{1204, 14, 1069, {1, 3, 7, 7, 15, 17, 15, 15, 131, 649, 1955, 3289, 3983, 10689}},
+{1205, 14, 1072, {1, 3, 1, 5, 17, 7, 125, 69, 359, 981, 1345, 933, 5281, 7113}},
+{1206, 14, 1075, {1, 1, 5, 9, 17, 7, 41, 207, 497, 1015, 493, 891, 3563, 3541}},
+{1207, 14, 1087, {1, 3, 5, 11, 27, 3, 47, 31, 303, 1007, 2047, 2203, 6257, 8369}},
+{1208, 14, 1089, {1, 1, 1, 15, 25, 15, 89, 51, 217, 357, 1133, 1917, 213, 3365}},
+{1209, 14, 1137, {1, 1, 5, 13, 29, 23, 123, 207, 429, 805, 819, 2357, 6313, 11019}},
+{1210, 14, 1166, {1, 1, 3, 7, 19, 15, 41, 73, 279, 11, 1089, 3107, 7737, 15953}},
+{1211, 14, 1174, {1, 3, 5, 7, 7, 15, 41, 73, 493, 457, 1731, 1139, 2513, 12373}},
+{1212, 14, 1180, {1, 3, 5, 9, 17, 5, 55, 155, 173, 1005, 529, 3175, 7667, 4747}},
+{1213, 14, 1204, {1, 1, 7, 7, 5, 21, 105, 31, 205, 847, 1033, 3167, 2347, 8499}},
+{1214, 14, 1211, {1, 3, 5, 3, 11, 17, 59, 189, 179, 1007, 33, 3287, 4813, 8177}},
+{1215, 14, 1219, {1, 3, 3, 13, 27, 47, 47, 171, 413, 875, 1081, 1259, 7139, 8645}},
+{1216, 14, 1236, {1, 3, 5, 7, 25, 21, 51, 29, 361, 293, 51, 1119, 1453, 5283}},
+{1217, 14, 1255, {1, 3, 7, 7, 29, 55, 103, 199, 511, 341, 1957, 3987, 2855, 1279}},
+{1218, 14, 1264, {1, 1, 1, 9, 23, 51, 61, 63, 391, 37, 55, 3771, 6517, 15913}},
+{1219, 14, 1306, {1, 1, 1, 9, 3, 19, 13, 147, 453, 855, 1321, 189, 5043, 11215}},
+{1220, 14, 1330, {1, 3, 3, 13, 23, 3, 87, 155, 401, 981, 607, 3413, 995, 6473}},
+{1221, 14, 1341, {1, 3, 1, 9, 29, 47, 95, 123, 421, 353, 1867, 2609, 2569, 14083}},
+{1222, 14, 1344, {1, 1, 5, 13, 25, 39, 29, 111, 125, 545, 1493, 2371, 6361, 6307}},
+{1223, 14, 1347, {1, 3, 3, 11, 13, 31, 87, 75, 27, 393, 921, 3655, 3343, 16349}},
+{1224, 14, 1349, {1, 1, 5, 9, 19, 19, 7, 129, 223, 715, 433, 1627, 4463, 2951}},
+{1225, 14, 1361, {1, 1, 7, 1, 31, 13, 49, 33, 89, 43, 1529, 725, 3809, 3427}},
+{1226, 14, 1380, {1, 1, 7, 3, 1, 27, 45, 9, 309, 875, 659, 2661, 553, 7069}},
+{1227, 14, 1390, {1, 1, 7, 15, 13, 37, 61, 19, 125, 683, 1227, 2255, 1455, 9339}},
+{1228, 14, 1404, {1, 3, 5, 7, 19, 7, 71, 21, 465, 645, 1885, 873, 7405, 1913}},
+{1229, 14, 1435, {1, 3, 1, 11, 11, 35, 79, 61, 79, 57, 1603, 3719, 6323, 16371}},
+{1230, 14, 1444, {1, 1, 7, 1, 29, 57, 85, 21, 205, 37, 2045, 683, 4901, 8223}},
+{1231, 14, 1453, {1, 1, 5, 13, 31, 31, 65, 131, 259, 535, 967, 3943, 2605, 2089}},
+{1232, 14, 1461, {1, 1, 7, 9, 27, 61, 39, 243, 207, 41, 1909, 3279, 1331, 4635}},
+{1233, 14, 1462, {1, 3, 3, 5, 11, 63, 105, 19, 169, 95, 773, 3175, 1869, 1797}},
+{1234, 14, 1465, {1, 3, 3, 15, 13, 33, 107, 197, 153, 795, 1477, 105, 4965, 991}},
+{1235, 14, 1468, {1, 3, 7, 11, 11, 37, 23, 149, 197, 3, 1035, 3857, 553, 1059}},
+{1236, 14, 1474, {1, 3, 1, 3, 17, 29, 89, 189, 193, 59, 1477, 3517, 2565, 7739}},
+{1237, 14, 1483, {1, 1, 1, 9, 23, 3, 25, 163, 469, 305, 1791, 3393, 6141, 8119}},
+{1238, 14, 1488, {1, 3, 5, 7, 7, 41, 19, 101, 179, 487, 1071, 2761, 8043, 5103}},
+{1239, 14, 1493, {1, 1, 7, 9, 1, 21, 101, 103, 349, 85, 1841, 1033, 4473, 3563}},
+{1240, 14, 1500, {1, 1, 3, 13, 23, 61, 39, 27, 479, 13, 45, 1371, 7897, 10637}},
+{1241, 14, 1509, {1, 1, 5, 9, 17, 61, 71, 55, 355, 99, 1695, 3053, 839, 959}},
+{1242, 14, 1510, {1, 1, 3, 1, 7, 27, 87, 221, 327, 241, 461, 3177, 5933, 8299}},
+{1243, 14, 1514, {1, 3, 7, 9, 5, 41, 111, 245, 447, 263, 1363, 1767, 6331, 3355}},
+{1244, 14, 1519, {1, 3, 3, 13, 15, 11, 15, 169, 429, 149, 1965, 2477, 7733, 2499}},
+{1245, 14, 1528, {1, 1, 5, 15, 15, 47, 25, 33, 469, 701, 773, 2747, 1533, 14633}},
+{1246, 14, 1533, {1, 3, 1, 5, 19, 57, 37, 75, 423, 11, 685, 2487, 1779, 8797}},
+{1247, 14, 1540, {1, 3, 1, 5, 19, 41, 67, 99, 333, 991, 953, 3221, 939, 4197}},
+{1248, 14, 1550, {1, 3, 1, 15, 11, 39, 25, 1, 159, 679, 465, 1611, 5799, 2537}},
+{1249, 14, 1567, {1, 1, 5, 11, 5, 37, 37, 7, 101, 703, 235, 23, 2209, 12799}},
+{1250, 14, 1571, {1, 1, 7, 3, 11, 23, 71, 215, 45, 269, 1539, 3625, 5773, 6889}},
+{1251, 14, 1573, {1, 3, 5, 15, 27, 33, 105, 109, 205, 653, 821, 435, 1087, 2495}},
+{1252, 14, 1578, {1, 1, 3, 5, 11, 39, 53, 213, 41, 385, 1425, 25, 5553, 12523}},
+{1253, 14, 1598, {1, 3, 5, 15, 29, 49, 13, 253, 505, 407, 985, 2569, 6727, 4761}},
+{1254, 14, 1606, {1, 1, 1, 3, 29, 17, 69, 47, 25, 819, 1145, 2479, 1183, 3343}},
+{1255, 14, 1618, {1, 3, 1, 15, 25, 61, 43, 55, 279, 579, 361, 355, 6101, 3143}},
+{1256, 14, 1630, {1, 3, 5, 11, 3, 59, 125, 101, 451, 495, 1711, 3443, 3625, 15579}},
+{1257, 14, 1634, {1, 3, 1, 11, 25, 61, 49, 219, 23, 795, 481, 3609, 3691, 15419}},
+{1258, 14, 1640, {1, 3, 7, 5, 9, 59, 49, 233, 345, 143, 181, 3587, 3041, 1219}},
+{1259, 14, 1643, {1, 3, 7, 13, 9, 31, 39, 137, 261, 919, 1367, 3145, 4659, 5875}},
+{1260, 14, 1654, {1, 1, 3, 3, 27, 43, 95, 65, 301, 915, 31, 451, 7743, 7277}},
+{1261, 14, 1679, {1, 3, 1, 5, 23, 37, 53, 31, 203, 453, 71, 1585, 6011, 16369}},
+{1262, 14, 1688, {1, 1, 5, 1, 15, 47, 91, 227, 297, 45, 1415, 3647, 7811, 14015}},
+{1263, 14, 1698, {1, 1, 1, 1, 29, 27, 93, 121, 169, 69, 1361, 2907, 1867, 7017}},
+{1264, 14, 1703, {1, 3, 1, 7, 23, 53, 77, 41, 25, 873, 1333, 3889, 3239, 1771}},
+{1265, 14, 1704, {1, 1, 1, 7, 31, 27, 87, 81, 167, 343, 1981, 2499, 7749, 15747}},
+{1266, 14, 1722, {1, 3, 5, 13, 1, 17, 97, 37, 81, 645, 1167, 3547, 7769, 10731}},
+{1267, 14, 1735, {1, 1, 7, 5, 9, 17, 31, 55, 151, 463, 1041, 2303, 4015, 3737}},
+{1268, 14, 1750, {1, 1, 3, 11, 31, 9, 81, 213, 95, 215, 2031, 2129, 4299, 3021}},
+{1269, 14, 1753, {1, 1, 1, 3, 25, 25, 115, 229, 101, 441, 783, 1729, 7905, 2375}},
+{1270, 14, 1760, {1, 1, 5, 9, 3, 19, 73, 35, 379, 493, 1333, 1647, 13, 197}},
+{1271, 14, 1789, {1, 1, 7, 9, 3, 55, 99, 43, 281, 9, 73, 2477, 8183, 11055}},
+{1272, 14, 1792, {1, 3, 7, 13, 25, 19, 27, 195, 469, 175, 355, 1861, 7255, 15377}},
+{1273, 14, 1802, {1, 1, 3, 11, 15, 19, 115, 31, 413, 835, 697, 879, 6515, 13465}},
+{1274, 14, 1819, {1, 3, 3, 15, 3, 61, 105, 201, 151, 739, 49, 3963, 2573, 3303}},
+{1275, 14, 1825, {1, 3, 5, 7, 23, 5, 11, 215, 19, 591, 509, 2887, 1631, 4391}},
+{1276, 14, 1828, {1, 3, 3, 3, 25, 1, 109, 5, 363, 545, 1745, 503, 827, 4677}},
+{1277, 14, 1832, {1, 1, 3, 15, 1, 45, 121, 141, 497, 745, 1825, 2041, 2561, 8153}},
+{1278, 14, 1845, {1, 3, 1, 11, 29, 7, 71, 241, 7, 39, 1379, 2479, 7483, 7195}},
+{1279, 14, 1846, {1, 1, 7, 11, 3, 27, 39, 97, 339, 217, 1409, 1569, 4761, 1567}},
+{1280, 14, 1857, {1, 1, 5, 15, 11, 53, 87, 213, 297, 923, 393, 717, 3297, 16123}},
+{1281, 14, 1869, {1, 1, 1, 11, 27, 41, 121, 49, 225, 379, 1305, 319, 2461, 5445}},
+{1282, 14, 1897, {1, 1, 5, 5, 25, 3, 121, 23, 47, 843, 1679, 1427, 6393, 4199}},
+{1283, 14, 1906, {1, 1, 5, 13, 17, 3, 17, 25, 161, 487, 121, 361, 1375, 10745}},
+{1284, 14, 1908, {1, 1, 7, 3, 3, 37, 7, 245, 107, 107, 745, 2415, 2131, 11419}},
+{1285, 14, 1911, {1, 1, 5, 3, 3, 23, 67, 91, 281, 387, 465, 905, 883, 9775}},
+{1286, 14, 1934, {1, 3, 7, 15, 25, 55, 123, 49, 23, 983, 1903, 2589, 2073, 7823}},
+{1287, 14, 1962, {1, 1, 5, 11, 25, 17, 63, 229, 267, 175, 1759, 1947, 479, 11089}},
+{1288, 14, 1967, {1, 3, 7, 3, 11, 37, 83, 95, 415, 1003, 1175, 2361, 2117, 9809}},
+{1289, 14, 1972, {1, 3, 1, 9, 5, 39, 51, 129, 249, 161, 1981, 2755, 8057, 13641}},
+{1290, 14, 1975, {1, 1, 7, 1, 15, 47, 9, 197, 199, 549, 1091, 2853, 2331, 4535}},
+{1291, 14, 1999, {1, 3, 3, 13, 15, 21, 23, 111, 463, 719, 1667, 377, 5039, 10723}},
+{1292, 14, 2004, {1, 1, 3, 7, 23, 47, 39, 47, 307, 949, 1651, 2525, 5835, 1425}},
+{1293, 14, 2011, {1, 3, 3, 9, 23, 47, 111, 39, 251, 1001, 179, 3985, 535, 15435}},
+{1294, 14, 2013, {1, 1, 3, 13, 5, 45, 51, 123, 205, 651, 1583, 1691, 1631, 11975}},
+{1295, 14, 2037, {1, 1, 7, 9, 1, 29, 59, 27, 389, 497, 1459, 1633, 521, 14037}},
+{1296, 14, 2051, {1, 1, 3, 3, 3, 23, 35, 247, 371, 729, 931, 681, 1777, 8353}},
+{1297, 14, 2063, {1, 3, 3, 1, 19, 15, 17, 191, 495, 643, 319, 37, 5691, 7049}},
+{1298, 14, 2066, {1, 3, 5, 11, 5, 31, 123, 243, 335, 573, 113, 209, 4825, 7783}},
+{1299, 14, 2094, {1, 3, 7, 7, 29, 19, 25, 191, 89, 515, 55, 3013, 4523, 12913}},
+{1300, 14, 2128, {1, 1, 3, 3, 15, 3, 35, 37, 339, 7, 697, 359, 4553, 1431}},
+{1301, 14, 2154, {1, 3, 1, 1, 9, 15, 33, 77, 161, 13, 255, 1187, 6587, 11715}},
+{1302, 14, 2164, {1, 3, 7, 7, 25, 57, 61, 171, 231, 43, 1219, 903, 5623, 4781}},
+{1303, 14, 2198, {1, 1, 5, 15, 29, 47, 117, 23, 213, 907, 1423, 369, 4529, 9651}},
+{1304, 14, 2217, {1, 1, 5, 7, 15, 55, 105, 249, 401, 37, 1885, 3779, 3441, 9057}},
+{1305, 14, 2220, {1, 1, 5, 3, 3, 27, 49, 89, 335, 561, 1235, 3251, 2731, 12711}},
+{1306, 14, 2223, {1, 1, 1, 15, 29, 49, 37, 173, 25, 743, 1321, 821, 5899, 9213}},
+{1307, 14, 2238, {1, 1, 7, 3, 1, 41, 61, 209, 275, 925, 521, 3029, 1569, 9277}},
+{1308, 14, 2245, {1, 3, 5, 13, 17, 1, 11, 171, 441, 119, 1589, 299, 157, 11439}},
+{1309, 14, 2252, {1, 1, 5, 9, 13, 33, 27, 77, 363, 939, 1103, 2135, 1759, 5429}},
+{1310, 14, 2258, {1, 3, 7, 1, 17, 39, 49, 201, 49, 803, 2003, 1193, 7415, 13847}},
+{1311, 14, 2264, {1, 1, 5, 5, 17, 49, 39, 19, 311, 801, 1441, 3263, 7973, 14181}},
+{1312, 14, 2280, {1, 1, 3, 9, 9, 27, 59, 89, 81, 473, 1369, 3121, 7929, 10905}},
+{1313, 14, 2285, {1, 3, 3, 5, 17, 35, 35, 239, 379, 431, 501, 3561, 2059, 9679}},
+{1314, 14, 2293, {1, 3, 5, 15, 25, 29, 113, 179, 269, 891, 301, 2017, 7513, 9379}},
+{1315, 14, 2294, {1, 3, 1, 11, 17, 35, 49, 149, 135, 661, 1691, 3169, 3765, 9003}},
+{1316, 14, 2298, {1, 3, 7, 15, 5, 21, 53, 241, 475, 271, 683, 2351, 2181, 6333}},
+{1317, 14, 2303, {1, 1, 7, 13, 25, 33, 71, 153, 221, 507, 2017, 2401, 7545, 8489}},
+{1318, 14, 2306, {1, 1, 7, 5, 1, 49, 87, 1, 179, 331, 1597, 3713, 809, 11109}},
+{1319, 14, 2311, {1, 3, 1, 5, 5, 61, 93, 39, 479, 977, 1099, 1291, 7049, 2797}},
+{1320, 14, 2326, {1, 3, 1, 13, 19, 41, 57, 77, 5, 117, 125, 115, 3969, 1345}},
+{1321, 14, 2354, {1, 1, 1, 9, 15, 9, 57, 7, 219, 41, 767, 23, 5771, 14175}},
+{1322, 14, 2373, {1, 3, 7, 9, 17, 61, 1, 59, 227, 349, 63, 189, 3871, 7919}},
+{1323, 14, 2380, {1, 3, 5, 5, 9, 29, 33, 203, 413, 701, 1129, 2103, 1889, 8377}},
+{1324, 14, 2385, {1, 1, 3, 1, 9, 17, 69, 115, 123, 1001, 1, 2893, 3957, 8593}},
+{1325, 14, 2392, {1, 1, 3, 1, 31, 41, 83, 91, 113, 195, 1121, 2665, 6815, 1189}},
+{1326, 14, 2401, {1, 1, 1, 13, 3, 59, 13, 123, 95, 103, 1689, 2809, 5049, 4055}},
+{1327, 14, 2402, {1, 1, 1, 15, 21, 41, 11, 167, 375, 589, 207, 1631, 1597, 8091}},
+{1328, 14, 2408, {1, 3, 5, 5, 1, 33, 57, 89, 157, 921, 1353, 2777, 461, 14567}},
+{1329, 14, 2419, {1, 1, 5, 1, 25, 5, 51, 247, 1, 577, 463, 3741, 303, 16059}},
+{1330, 14, 2450, {1, 1, 7, 5, 13, 7, 17, 87, 51, 987, 835, 93, 5203, 3973}},
+{1331, 14, 2452, {1, 1, 7, 7, 3, 27, 7, 1, 135, 171, 231, 3349, 4459, 2925}},
+{1332, 14, 2477, {1, 1, 5, 5, 9, 51, 71, 153, 115, 315, 265, 2207, 4127, 12631}},
+{1333, 14, 2509, {1, 1, 3, 15, 23, 59, 35, 121, 425, 921, 1255, 2123, 5811, 15937}},
+{1334, 14, 2510, {1, 3, 7, 7, 11, 21, 45, 57, 269, 395, 555, 783, 6677, 2889}},
+{1335, 14, 2515, {1, 3, 5, 7, 31, 19, 73, 35, 465, 349, 1429, 863, 4707, 6121}},
+{1336, 14, 2524, {1, 3, 3, 9, 25, 27, 119, 159, 195, 949, 19, 73, 4511, 15711}},
+{1337, 14, 2527, {1, 3, 3, 7, 9, 59, 47, 57, 91, 749, 1579, 1297, 2445, 5167}},
+{1338, 14, 2531, {1, 3, 3, 3, 31, 57, 19, 203, 61, 927, 1477, 2863, 1305, 11673}},
+{1339, 14, 2552, {1, 3, 7, 11, 29, 13, 3, 111, 351, 79, 1863, 2213, 3273, 7049}},
+{1340, 14, 2561, {1, 3, 3, 9, 7, 23, 47, 237, 121, 877, 441, 119, 2723, 3989}},
+{1341, 14, 2567, {1, 3, 3, 11, 17, 23, 63, 177, 231, 363, 1451, 33, 2169, 7251}},
+{1342, 14, 2571, {1, 1, 5, 11, 31, 41, 93, 229, 39, 1009, 1061, 433, 2393, 15401}},
+{1343, 14, 2586, {1, 1, 5, 15, 31, 37, 25, 135, 135, 897, 33, 3713, 7663, 8079}},
+{1344, 14, 2588, {1, 1, 5, 7, 17, 49, 43, 89, 411, 731, 1431, 3893, 1635, 7063}},
+{1345, 14, 2595, {1, 1, 1, 13, 29, 27, 5, 77, 283, 913, 789, 817, 3309, 475}},
+{1346, 14, 2607, {1, 1, 3, 1, 19, 21, 67, 77, 423, 551, 5, 1057, 5469, 7859}},
+{1347, 14, 2621, {1, 1, 5, 1, 1, 21, 99, 237, 215, 759, 1505, 1983, 1517, 8923}},
+{1348, 14, 2630, {1, 3, 5, 7, 19, 61, 73, 215, 165, 127, 205, 259, 7755, 15395}},
+{1349, 14, 2639, {1, 1, 5, 9, 15, 23, 17, 111, 471, 751, 1923, 775, 6901, 13095}},
+{1350, 14, 2653, {1, 1, 7, 1, 25, 5, 63, 141, 461, 687, 1589, 1559, 7719, 11349}},
+{1351, 14, 2670, {1, 1, 1, 3, 11, 63, 11, 27, 253, 439, 297, 1315, 829, 3765}},
+{1352, 14, 2672, {1, 3, 1, 1, 9, 47, 127, 179, 173, 809, 241, 35, 7355, 5049}},
+{1353, 14, 2700, {1, 3, 1, 11, 19, 63, 93, 1, 205, 977, 303, 3409, 6529, 10927}},
+{1354, 14, 2711, {1, 3, 7, 9, 31, 63, 41, 79, 477, 91, 1801, 3487, 6885, 13341}},
+{1355, 14, 2715, {1, 1, 3, 7, 15, 59, 9, 101, 459, 247, 549, 2855, 5765, 7785}},
+{1356, 14, 2748, {1, 1, 7, 3, 13, 59, 71, 123, 93, 517, 1453, 2389, 4429, 5053}},
+{1357, 14, 2751, {1, 1, 5, 3, 19, 21, 77, 53, 81, 879, 1653, 1637, 3667, 2623}},
+{1358, 14, 2753, {1, 1, 1, 15, 17, 57, 65, 53, 407, 765, 417, 497, 5009, 2175}},
+{1359, 14, 2754, {1, 3, 3, 7, 31, 13, 5, 203, 263, 17, 119, 1607, 6773, 11195}},
+{1360, 14, 2760, {1, 3, 3, 13, 19, 13, 13, 147, 93, 735, 689, 781, 655, 6853}},
+{1361, 14, 2774, {1, 1, 1, 1, 1, 25, 63, 159, 493, 987, 71, 1249, 5859, 11717}},
+{1362, 14, 2784, {1, 1, 1, 15, 13, 23, 61, 61, 5, 947, 1853, 3331, 467, 8081}},
+{1363, 14, 2793, {1, 1, 3, 9, 19, 61, 65, 189, 95, 309, 283, 1725, 5683, 15463}},
+{1364, 14, 2804, {1, 1, 7, 5, 9, 33, 35, 75, 475, 831, 1445, 1485, 5047, 9631}},
+{1365, 14, 2811, {1, 1, 3, 15, 11, 23, 59, 87, 433, 221, 685, 3113, 4095, 13819}},
+{1366, 14, 2822, {1, 1, 7, 15, 25, 29, 67, 17, 349, 353, 1321, 563, 57, 533}},
+{1367, 14, 2826, {1, 3, 3, 3, 5, 43, 109, 217, 15, 185, 1895, 1015, 1831, 10623}},
+{1368, 14, 2836, {1, 1, 7, 1, 1, 47, 81, 185, 59, 691, 191, 3709, 1535, 13347}},
+{1369, 14, 2839, {1, 1, 5, 1, 23, 57, 83, 217, 457, 771, 1877, 2789, 8143, 4797}},
+{1370, 14, 2840, {1, 1, 3, 7, 23, 35, 79, 49, 227, 205, 1523, 3873, 4843, 10505}},
+{1371, 14, 2893, {1, 1, 1, 1, 17, 43, 121, 95, 205, 35, 189, 2061, 1693, 13273}},
+{1372, 14, 2901, {1, 1, 1, 15, 31, 49, 83, 249, 433, 497, 1949, 1845, 5215, 5971}},
+{1373, 14, 2902, {1, 3, 1, 1, 21, 53, 73, 211, 265, 929, 923, 279, 3621, 9469}},
+{1374, 14, 2905, {1, 3, 7, 7, 1, 57, 13, 45, 467, 705, 371, 1345, 1647, 3411}},
+{1375, 14, 2912, {1, 3, 1, 11, 27, 29, 117, 163, 143, 669, 489, 3913, 7891, 9031}},
+{1376, 14, 2915, {1, 3, 7, 15, 27, 15, 77, 217, 107, 839, 1517, 1543, 357, 10365}},
+{1377, 14, 2918, {1, 1, 1, 5, 31, 17, 107, 245, 345, 939, 1453, 3645, 6865, 16173}},
+{1378, 14, 2939, {1, 3, 5, 5, 9, 61, 43, 97, 453, 917, 945, 2143, 5473, 5611}},
+{1379, 14, 2965, {1, 1, 5, 11, 3, 33, 71, 97, 137, 549, 1605, 3839, 4883, 2677}},
+{1380, 14, 2966, {1, 3, 1, 11, 29, 23, 85, 47, 225, 633, 1613, 1297, 1415, 15813}},
+{1381, 14, 2975, {1, 1, 3, 3, 9, 19, 57, 107, 79, 449, 1951, 753, 6317, 10377}},
+{1382, 14, 2988, {1, 1, 1, 5, 21, 3, 39, 187, 299, 517, 1313, 741, 7259, 4197}},
+{1383, 14, 2993, {1, 1, 5, 13, 1, 39, 39, 41, 381, 123, 1257, 3185, 493, 3723}},
+{1384, 14, 3006, {1, 3, 7, 7, 3, 37, 15, 161, 129, 169, 555, 3605, 4287, 15831}},
+{1385, 14, 3017, {1, 3, 7, 15, 15, 23, 81, 163, 257, 791, 505, 1903, 2703, 11919}},
+{1386, 14, 3031, {1, 3, 7, 7, 27, 63, 17, 147, 111, 851, 1533, 1365, 5359, 3315}},
+{1387, 14, 3038, {1, 3, 7, 1, 15, 5, 61, 143, 385, 261, 1019, 1705, 1737, 14485}},
+{1388, 14, 3041, {1, 3, 5, 5, 25, 17, 49, 229, 431, 567, 1613, 3431, 2139, 2981}},
+{1389, 14, 3042, {1, 3, 5, 11, 17, 57, 71, 241, 31, 1007, 1695, 2965, 149, 14125}},
+{1390, 14, 3051, {1, 1, 3, 11, 7, 49, 39, 101, 5, 501, 1491, 3061, 225, 12255}},
+{1391, 14, 3073, {1, 3, 5, 7, 17, 35, 37, 97, 415, 15, 1349, 997, 2949, 4511}},
+{1392, 14, 3088, {1, 3, 1, 5, 25, 35, 99, 183, 161, 59, 1363, 515, 3767, 3641}},
+{1393, 14, 3097, {1, 1, 7, 15, 7, 15, 127, 137, 281, 67, 139, 2315, 3517, 13371}},
+{1394, 14, 3098, {1, 1, 5, 15, 23, 49, 19, 79, 425, 805, 1035, 429, 7707, 14195}},
+{1395, 14, 3103, {1, 3, 5, 3, 21, 25, 123, 11, 425, 475, 961, 2995, 7405, 5449}},
+{1396, 14, 3104, {1, 1, 7, 1, 21, 1, 75, 231, 451, 595, 719, 2369, 5907, 1227}},
+{1397, 14, 3146, {1, 1, 1, 9, 21, 57, 45, 255, 19, 79, 481, 3363, 3451, 8399}},
+{1398, 14, 3148, {1, 1, 7, 13, 31, 49, 95, 69, 483, 427, 37, 4047, 7057, 9111}},
+{1399, 14, 3153, {1, 3, 3, 11, 3, 61, 87, 79, 499, 91, 771, 1987, 2017, 3381}},
+{1400, 14, 3159, {1, 3, 1, 7, 5, 57, 1, 121, 155, 225, 501, 477, 6555, 9863}},
+{1401, 14, 3182, {1, 3, 7, 11, 27, 49, 83, 213, 61, 283, 1599, 3205, 2525, 8553}},
+{1402, 14, 3187, {1, 1, 1, 9, 9, 49, 3, 51, 141, 33, 301, 2167, 587, 15067}},
+{1403, 14, 3189, {1, 1, 1, 11, 7, 55, 99, 81, 191, 553, 953, 3753, 6731, 1093}},
+{1404, 14, 3199, {1, 1, 3, 3, 11, 59, 57, 235, 297, 197, 853, 1411, 3799, 7527}},
+{1405, 14, 3239, {1, 3, 5, 3, 7, 7, 5, 201, 393, 95, 91, 3273, 6285, 10661}},
+{1406, 14, 3263, {1, 1, 5, 7, 17, 57, 87, 3, 413, 915, 659, 369, 3593, 14429}},
+{1407, 14, 3271, {1, 3, 7, 1, 31, 31, 45, 115, 417, 427, 745, 4087, 953, 1119}},
+{1408, 14, 3275, {1, 3, 7, 3, 29, 43, 45, 221, 41, 641, 451, 173, 2999, 12103}},
+{1409, 14, 3278, {1, 1, 3, 11, 25, 57, 117, 201, 135, 787, 1525, 3879, 3247, 8907}},
+{1410, 14, 3280, {1, 1, 7, 11, 3, 35, 69, 157, 331, 615, 573, 2169, 3575, 289}},
+{1411, 14, 3283, {1, 3, 3, 13, 15, 51, 67, 127, 265, 495, 103, 3145, 2685, 15919}},
+{1412, 14, 3290, {1, 3, 5, 11, 31, 27, 65, 57, 153, 465, 1163, 467, 4103, 4713}},
+{1413, 14, 3311, {1, 3, 7, 3, 23, 31, 9, 51, 239, 417, 1597, 229, 2865, 15199}},
+{1414, 14, 3316, {1, 3, 5, 3, 11, 45, 123, 217, 31, 765, 1009, 2001, 3645, 9407}},
+{1415, 14, 3343, {1, 3, 3, 9, 5, 23, 117, 83, 237, 1017, 251, 1187, 2631, 5151}},
+{1416, 14, 3346, {1, 1, 1, 7, 23, 55, 97, 141, 501, 305, 467, 4061, 2369, 15973}},
+{1417, 14, 3357, {1, 1, 7, 5, 31, 51, 125, 191, 219, 495, 37, 3337, 813, 241}},
+{1418, 14, 3358, {1, 3, 1, 1, 11, 39, 93, 109, 285, 147, 1297, 737, 4051, 7223}},
+{1419, 14, 3361, {1, 3, 1, 15, 13, 17, 57, 171, 463, 163, 609, 1681, 7583, 9231}},
+{1420, 14, 3362, {1, 3, 1, 1, 23, 5, 51, 5, 205, 415, 419, 989, 4239, 10943}},
+{1421, 14, 3364, {1, 1, 3, 15, 3, 13, 65, 145, 387, 59, 395, 1067, 4143, 5649}},
+{1422, 14, 3386, {1, 3, 1, 13, 9, 59, 121, 127, 95, 71, 1541, 1423, 1753, 8041}},
+{1423, 14, 3418, {1, 1, 3, 15, 7, 5, 69, 167, 181, 991, 1189, 4017, 5935, 6669}},
+{1424, 14, 3424, {1, 3, 5, 7, 23, 41, 53, 21, 47, 261, 1231, 2011, 133, 2247}},
+{1425, 14, 3433, {1, 1, 1, 5, 17, 47, 77, 19, 331, 609, 1893, 3965, 3123, 9093}},
+{1426, 14, 3434, {1, 3, 1, 3, 9, 39, 103, 231, 249, 75, 373, 107, 1823, 10801}},
+{1427, 14, 3436, {1, 3, 3, 7, 1, 51, 35, 111, 137, 879, 1221, 225, 4285, 2287}},
+{1428, 14, 3463, {1, 1, 7, 9, 23, 17, 75, 245, 409, 163, 395, 3731, 7111, 6845}},
+{1429, 14, 3467, {1, 1, 3, 13, 29, 47, 75, 153, 497, 621, 1691, 3187, 2125, 10533}},
+{1430, 14, 3477, {1, 1, 7, 7, 9, 7, 55, 159, 255, 417, 1335, 643, 3843, 3733}},
+{1431, 14, 3484, {1, 3, 3, 1, 21, 41, 7, 21, 5, 679, 1655, 95, 5699, 5785}},
+{1432, 14, 3505, {1, 1, 1, 13, 19, 7, 85, 7, 195, 357, 1097, 2893, 2913, 9635}},
+{1433, 14, 3508, {1, 1, 5, 9, 25, 33, 41, 155, 39, 655, 1993, 3117, 3639, 7977}},
+{1434, 14, 3515, {1, 1, 1, 13, 3, 63, 121, 247, 151, 673, 609, 285, 2299, 7663}},
+{1435, 14, 3532, {1, 3, 7, 11, 17, 13, 49, 253, 245, 21, 273, 993, 911, 863}},
+{1436, 14, 3553, {1, 1, 5, 5, 23, 1, 121, 95, 225, 9, 1237, 1183, 6461, 559}},
+{1437, 14, 3554, {1, 3, 7, 13, 3, 7, 121, 151, 233, 561, 281, 3583, 897, 1767}},
+{1438, 14, 3568, {1, 1, 7, 7, 9, 47, 107, 41, 25, 569, 1697, 2299, 6231, 12209}},
+{1439, 14, 3573, {1, 3, 7, 7, 27, 43, 59, 37, 31, 51, 503, 149, 4043, 11847}},
+{1440, 14, 3587, {1, 3, 3, 11, 5, 1, 119, 181, 47, 641, 685, 4017, 637, 16251}},
+{1441, 14, 3589, {1, 3, 3, 7, 11, 1, 101, 7, 239, 747, 307, 1721, 5979, 4367}},
+{1442, 14, 3596, {1, 3, 5, 7, 1, 63, 19, 151, 469, 333, 1587, 2453, 897, 4711}},
+{1443, 14, 3608, {1, 3, 1, 5, 11, 61, 21, 253, 91, 993, 1347, 1993, 5607, 13031}},
+{1444, 14, 3620, {1, 3, 5, 5, 1, 39, 65, 71, 189, 389, 1437, 1055, 6439, 3989}},
+{1445, 14, 3630, {1, 1, 3, 3, 19, 15, 93, 3, 339, 165, 1675, 3953, 2145, 12113}},
+{1446, 14, 3644, {1, 1, 3, 13, 13, 45, 5, 175, 211, 993, 705, 2761, 3023, 13633}},
+{1447, 14, 3649, {1, 1, 3, 1, 19, 39, 121, 29, 287, 87, 281, 3491, 7107, 13007}},
+{1448, 14, 3664, {1, 1, 7, 1, 29, 49, 103, 187, 39, 923, 51, 1533, 3249, 4399}},
+{1449, 14, 3679, {1, 1, 5, 5, 5, 43, 25, 107, 453, 955, 115, 57, 4589, 14573}},
+{1450, 14, 3680, {1, 1, 3, 5, 21, 45, 103, 99, 183, 987, 1207, 1697, 8033, 13703}},
+{1451, 14, 3685, {1, 1, 5, 7, 11, 23, 9, 17, 261, 749, 1957, 935, 6283, 8625}},
+{1452, 14, 3686, {1, 1, 1, 9, 9, 51, 69, 225, 265, 323, 1161, 2993, 7305, 2249}},
+{1453, 14, 3698, {1, 3, 1, 9, 23, 19, 57, 205, 503, 489, 1499, 3277, 817, 11931}},
+{1454, 14, 3714, {1, 3, 3, 5, 1, 7, 49, 1, 313, 123, 643, 2027, 1469, 3585}},
+{1455, 14, 3726, {1, 3, 7, 11, 27, 47, 95, 111, 27, 213, 465, 3693, 3661, 7531}},
+{1456, 14, 3737, {1, 1, 7, 9, 3, 37, 115, 189, 31, 613, 1393, 1229, 4767, 12425}},
+{1457, 14, 3767, {1, 1, 3, 3, 25, 17, 99, 47, 161, 931, 959, 1293, 7095, 8325}},
+{1458, 14, 3782, {1, 1, 1, 7, 23, 9, 11, 51, 205, 419, 479, 1497, 2493, 13921}},
+{1459, 14, 3786, {1, 3, 1, 9, 17, 29, 51, 79, 159, 435, 477, 413, 3815, 5589}},
+{1460, 14, 3793, {1, 3, 7, 5, 7, 23, 99, 43, 169, 665, 403, 1163, 4337, 1335}},
+{1461, 14, 3796, {1, 3, 1, 5, 25, 27, 125, 249, 421, 267, 1259, 4089, 59, 9377}},
+{1462, 14, 3805, {1, 3, 3, 1, 27, 37, 91, 17, 123, 597, 1749, 3449, 6503, 11043}},
+{1463, 14, 3815, {1, 3, 7, 7, 23, 41, 19, 245, 109, 569, 547, 1917, 7943, 2697}},
+{1464, 14, 3841, {1, 3, 7, 7, 9, 1, 123, 105, 329, 435, 2013, 2745, 347, 11045}},
+{1465, 14, 3847, {1, 1, 1, 13, 29, 53, 51, 67, 105, 89, 1887, 3543, 963, 8159}},
+{1466, 14, 3853, {1, 1, 5, 3, 5, 27, 41, 67, 67, 883, 973, 1785, 901, 14969}},
+{1467, 14, 3862, {1, 3, 3, 13, 17, 11, 117, 115, 163, 939, 79, 641, 4365, 2267}},
+{1468, 14, 3875, {1, 1, 3, 3, 9, 5, 41, 123, 149, 9, 1533, 3939, 5995, 12701}},
+{1469, 14, 3902, {1, 1, 1, 15, 31, 1, 101, 229, 191, 965, 61, 2671, 4177, 15779}},
+{1470, 14, 3904, {1, 1, 5, 15, 1, 25, 49, 185, 33, 697, 1043, 2639, 7819, 3171}},
+{1471, 14, 3916, {1, 3, 5, 13, 19, 9, 111, 49, 47, 847, 1865, 717, 5287, 13417}},
+{1472, 14, 3947, {1, 3, 7, 11, 5, 61, 63, 111, 171, 735, 2003, 73, 5701, 647}},
+{1473, 14, 3949, {1, 3, 1, 11, 1, 49, 121, 79, 431, 671, 1241, 1161, 2057, 263}},
+{1474, 14, 3955, {1, 3, 3, 1, 1, 23, 75, 15, 117, 641, 313, 1525, 2041, 1409}},
+{1475, 14, 3962, {1, 3, 5, 11, 15, 57, 13, 67, 139, 131, 1339, 2419, 7945, 11877}},
+{1476, 14, 3971, {1, 3, 1, 1, 19, 39, 97, 83, 297, 595, 1611, 5, 4753, 3435}},
+{1477, 14, 3980, {1, 3, 1, 9, 7, 49, 125, 101, 383, 717, 63, 2295, 3873, 13461}},
+{1478, 14, 3985, {1, 1, 3, 3, 15, 29, 89, 77, 269, 689, 229, 1207, 7311, 8663}},
+{1479, 14, 3998, {1, 1, 1, 1, 1, 61, 25, 255, 203, 233, 271, 987, 2277, 8735}},
+{1480, 14, 4001, {1, 1, 5, 7, 21, 27, 63, 79, 337, 133, 1453, 3633, 6157, 15875}},
+{1481, 14, 4002, {1, 3, 1, 7, 7, 55, 31, 81, 203, 709, 1743, 1677, 4247, 11411}},
+{1482, 14, 4016, {1, 1, 3, 3, 29, 51, 37, 17, 487, 325, 1393, 1433, 3467, 2851}},
+{1483, 14, 4021, {1, 1, 7, 9, 3, 41, 99, 177, 241, 869, 739, 2729, 4585, 14801}},
+{1484, 14, 4026, {1, 1, 3, 1, 9, 43, 97, 65, 99, 295, 1693, 2083, 3241, 4073}},
+{1485, 14, 4043, {1, 1, 1, 9, 5, 39, 67, 119, 235, 543, 795, 2773, 3195, 6273}},
+{1486, 14, 4079, {1, 1, 5, 5, 21, 41, 89, 1, 85, 81, 57, 2951, 1531, 10101}},
+{1487, 14, 4102, {1, 1, 1, 7, 3, 35, 127, 69, 39, 265, 1643, 2973, 267, 12365}},
+{1488, 14, 4106, {1, 3, 1, 1, 21, 57, 99, 205, 119, 477, 1771, 1989, 2761, 12573}},
+{1489, 14, 4119, {1, 1, 3, 13, 1, 59, 93, 125, 279, 935, 1877, 2061, 4845, 7835}},
+{1490, 14, 4126, {1, 1, 7, 9, 7, 45, 69, 99, 273, 35, 1579, 2137, 7175, 6999}},
+{1491, 14, 4147, {1, 1, 7, 7, 29, 21, 127, 91, 9, 383, 787, 1783, 601, 5047}},
+{1492, 14, 4149, {1, 1, 7, 13, 7, 29, 35, 219, 43, 581, 2043, 2211, 6169, 12173}},
+{1493, 14, 4164, {1, 3, 5, 13, 29, 29, 39, 63, 411, 645, 415, 2383, 1989, 11411}},
+{1494, 14, 4174, {1, 1, 7, 9, 15, 9, 87, 95, 321, 709, 543, 3831, 2453, 4167}},
+{1495, 14, 4181, {1, 3, 1, 5, 31, 25, 5, 85, 239, 487, 1613, 3937, 4661, 3535}},
+{1496, 14, 4185, {1, 3, 5, 11, 27, 41, 3, 201, 39, 91, 1997, 237, 5639, 14703}},
+{1497, 14, 4188, {1, 1, 7, 3, 27, 49, 87, 71, 473, 247, 1007, 47, 475, 5413}},
+{1498, 14, 4202, {1, 3, 7, 15, 9, 57, 81, 149, 287, 333, 1911, 3417, 1081, 8995}},
+{1499, 14, 4228, {1, 1, 5, 1, 3, 63, 43, 151, 97, 431, 961, 1019, 5153, 2407}},
+{1500, 14, 4232, {1, 1, 5, 5, 27, 21, 127, 161, 507, 311, 129, 3489, 1133, 3241}},
+{1501, 14, 4246, {1, 3, 7, 15, 21, 33, 117, 83, 497, 667, 1399, 931, 1695, 8171}},
+{1502, 14, 4252, {1, 1, 1, 13, 3, 39, 53, 27, 193, 993, 671, 1871, 7579, 11457}},
+{1503, 14, 4256, {1, 1, 5, 11, 7, 39, 81, 107, 195, 387, 849, 395, 1317, 6487}},
+{1504, 14, 4286, {1, 3, 3, 3, 3, 15, 45, 127, 279, 111, 331, 357, 4637, 4697}},
+{1505, 14, 4303, {1, 1, 3, 9, 21, 49, 47, 97, 61, 101, 181, 1867, 1201, 14099}},
+{1506, 14, 4306, {1, 1, 5, 11, 25, 19, 51, 51, 101, 451, 545, 101, 7497, 9141}},
+{1507, 14, 4311, {1, 1, 1, 3, 13, 53, 119, 81, 377, 245, 765, 251, 3757, 16045}},
+{1508, 14, 4317, {1, 1, 1, 3, 5, 61, 65, 37, 331, 925, 1439, 3219, 2843, 11397}},
+{1509, 14, 4342, {1, 3, 5, 9, 23, 31, 95, 155, 83, 641, 1129, 135, 477, 1623}},
+{1510, 14, 4346, {1, 1, 3, 9, 9, 61, 93, 11, 331, 585, 799, 1417, 1533, 463}},
+{1511, 14, 4377, {1, 1, 7, 7, 21, 51, 61, 29, 467, 935, 11, 3357, 1087, 12337}},
+{1512, 14, 4401, {1, 3, 3, 11, 1, 39, 103, 153, 351, 893, 1823, 835, 2149, 4203}},
+{1513, 14, 4407, {1, 1, 1, 9, 31, 13, 61, 235, 369, 359, 835, 2067, 2697, 15289}},
+{1514, 14, 4414, {1, 1, 7, 1, 15, 1, 107, 27, 201, 451, 1521, 313, 3195, 3847}},
+{1515, 14, 4422, {1, 1, 5, 13, 1, 27, 63, 137, 355, 489, 2039, 1015, 2519, 13797}},
+{1516, 14, 4431, {1, 1, 7, 9, 29, 33, 23, 197, 49, 555, 1087, 3447, 7299, 15513}},
+{1517, 14, 4434, {1, 3, 5, 11, 7, 37, 55, 63, 443, 573, 1715, 631, 3405, 6155}},
+{1518, 14, 4436, {1, 3, 3, 3, 31, 35, 51, 167, 225, 617, 2007, 2555, 6819, 12709}},
+{1519, 14, 4443, {1, 1, 1, 13, 15, 5, 73, 85, 109, 43, 1067, 3941, 1125, 10269}},
+{1520, 14, 4459, {1, 1, 7, 11, 17, 3, 127, 145, 279, 19, 1007, 3287, 4751, 12507}},
+{1521, 14, 4461, {1, 3, 7, 3, 19, 1, 117, 111, 193, 435, 47, 1801, 529, 8547}},
+{1522, 14, 4462, {1, 3, 3, 13, 1, 19, 101, 19, 469, 187, 207, 1243, 8153, 3273}},
+{1523, 14, 4473, {1, 3, 1, 5, 11, 51, 69, 189, 453, 775, 241, 3331, 4067, 14759}},
+{1524, 14, 4497, {1, 1, 1, 1, 23, 55, 113, 133, 497, 731, 391, 2777, 3529, 955}},
+{1525, 14, 4504, {1, 3, 1, 11, 5, 49, 59, 35, 261, 949, 325, 3595, 7433, 11099}},
+{1526, 14, 4507, {1, 3, 5, 9, 13, 37, 103, 219, 329, 865, 1787, 2497, 7249, 9877}},
+{1527, 14, 4525, {1, 3, 7, 9, 11, 33, 19, 255, 191, 935, 1115, 1901, 1577, 9623}},
+{1528, 14, 4534, {1, 1, 5, 7, 29, 23, 77, 43, 283, 143, 1211, 73, 2835, 10235}},
+{1529, 14, 4538, {1, 1, 7, 3, 3, 27, 35, 173, 453, 425, 1225, 3023, 2159, 8433}},
+{1530, 14, 4548, {1, 1, 1, 5, 27, 21, 35, 25, 71, 145, 1545, 523, 4527, 7655}},
+{1531, 14, 4552, {1, 1, 5, 3, 13, 49, 61, 157, 113, 775, 763, 1785, 225, 11851}},
+{1532, 14, 4560, {1, 1, 3, 1, 31, 57, 97, 229, 291, 777, 213, 4067, 921, 8203}},
+{1533, 14, 4575, {1, 1, 5, 1, 25, 13, 125, 123, 263, 207, 119, 3111, 3841, 843}},
+{1534, 14, 4599, {1, 1, 7, 7, 25, 57, 81, 129, 31, 133, 1869, 2949, 5563, 14965}},
+{1535, 14, 4612, {1, 3, 3, 7, 3, 51, 33, 127, 281, 425, 1253, 405, 7941, 8799}},
+{1536, 14, 4619, {1, 1, 3, 9, 3, 63, 93, 173, 255, 609, 49, 111, 7785, 15865}},
+{1537, 14, 4640, {1, 1, 1, 3, 17, 59, 113, 55, 155, 789, 1335, 177, 3071, 1851}},
+{1538, 14, 4643, {1, 3, 7, 15, 15, 23, 35, 35, 131, 623, 47, 437, 1337, 9891}},
+{1539, 14, 4677, {1, 3, 7, 5, 29, 57, 39, 31, 111, 271, 59, 1473, 949, 3899}},
+{1540, 14, 4687, {1, 1, 3, 11, 17, 19, 41, 229, 259, 691, 1455, 3023, 7455, 9711}},
+{1541, 14, 4723, {1, 3, 5, 11, 29, 13, 9, 165, 499, 355, 1415, 1395, 7595, 15571}},
+{1542, 14, 4730, {1, 3, 1, 9, 5, 5, 25, 247, 185, 241, 1325, 3133, 7471, 2649}},
+{1543, 14, 4736, {1, 3, 3, 11, 17, 29, 57, 61, 51, 203, 993, 1837, 3785, 15163}},
+{1544, 14, 4741, {1, 1, 7, 7, 21, 57, 79, 165, 277, 133, 93, 1055, 7169, 15685}},
+{1545, 14, 4763, {1, 1, 5, 3, 5, 17, 25, 177, 95, 323, 367, 1359, 4915, 6409}},
+{1546, 14, 4765, {1, 1, 1, 1, 11, 25, 115, 45, 373, 221, 1483, 591, 6561, 4527}},
+{1547, 14, 4770, {1, 3, 5, 3, 5, 23, 69, 77, 313, 473, 1037, 4045, 3969, 5445}},
+{1548, 14, 4781, {1, 3, 1, 5, 1, 15, 73, 83, 439, 463, 203, 361, 6835, 1061}},
+{1549, 14, 4808, {1, 1, 3, 11, 21, 5, 89, 233, 405, 253, 773, 3901, 6085, 5677}},
+{1550, 14, 4822, {1, 1, 3, 9, 15, 53, 71, 29, 101, 599, 1073, 705, 4507, 12779}},
+{1551, 14, 4828, {1, 1, 3, 1, 3, 9, 27, 97, 207, 859, 417, 735, 2179, 5071}},
+{1552, 14, 4831, {1, 1, 1, 3, 13, 63, 65, 125, 195, 611, 649, 2221, 3143, 143}},
+{1553, 14, 4842, {1, 3, 3, 15, 17, 57, 99, 119, 243, 407, 1229, 813, 5245, 1893}},
+{1554, 14, 4855, {1, 1, 1, 5, 27, 27, 49, 13, 313, 287, 473, 2629, 3509, 11371}},
+{1555, 14, 4859, {1, 1, 7, 7, 23, 3, 75, 59, 245, 689, 1215, 2375, 3325, 1593}},
+{1556, 14, 4867, {1, 3, 1, 5, 21, 51, 43, 107, 91, 611, 1405, 677, 2087, 9565}},
+{1557, 14, 4870, {1, 3, 7, 11, 9, 27, 81, 101, 449, 201, 1507, 2217, 6767, 8059}},
+{1558, 14, 4881, {1, 1, 3, 9, 13, 41, 21, 195, 421, 315, 347, 2621, 2359, 9247}},
+{1559, 14, 4893, {1, 1, 5, 7, 31, 45, 77, 229, 455, 575, 1087, 1147, 2273, 13773}},
+{1560, 14, 4910, {1, 1, 1, 1, 9, 5, 87, 19, 207, 545, 1435, 495, 1299, 4947}},
+{1561, 14, 4917, {1, 1, 3, 3, 15, 9, 63, 67, 219, 735, 1911, 2361, 6503, 11977}},
+{1562, 14, 4929, {1, 3, 1, 9, 31, 27, 103, 153, 81, 939, 461, 2753, 697, 537}},
+{1563, 14, 4939, {1, 3, 3, 9, 21, 53, 49, 211, 415, 817, 321, 3775, 2921, 9473}},
+{1564, 14, 4947, {1, 1, 7, 3, 23, 55, 15, 51, 435, 1013, 73, 3967, 4575, 13099}},
+{1565, 14, 4949, {1, 1, 3, 7, 5, 27, 43, 225, 267, 21, 1261, 603, 6913, 4421}},
+{1566, 14, 4954, {1, 1, 7, 13, 25, 31, 101, 109, 237, 91, 1587, 1987, 2795, 6991}},
+{1567, 14, 4972, {1, 1, 3, 13, 23, 51, 91, 89, 287, 39, 1513, 463, 6135, 10469}},
+{1568, 14, 4975, {1, 3, 3, 1, 9, 43, 125, 157, 369, 495, 1849, 785, 6357, 6557}},
+{1569, 14, 5000, {1, 3, 1, 13, 5, 25, 107, 139, 367, 239, 1671, 1239, 7027, 5291}},
+{1570, 14, 5005, {1, 3, 5, 13, 11, 13, 35, 177, 45, 939, 251, 59, 333, 13105}},
+{1571, 14, 5029, {1, 3, 5, 7, 29, 57, 109, 227, 435, 739, 423, 1941, 3345, 12731}},
+{1572, 14, 5039, {1, 3, 3, 9, 23, 51, 19, 207, 69, 99, 955, 519, 7305, 2415}},
+{1573, 14, 5044, {1, 1, 5, 13, 17, 1, 67, 201, 61, 403, 1059, 2915, 2419, 12773}},
+{1574, 14, 5051, {1, 3, 1, 11, 17, 19, 25, 27, 207, 299, 143, 1955, 5669, 2301}},
+{1575, 14, 5056, {1, 1, 5, 3, 25, 57, 45, 255, 489, 1011, 1699, 2637, 5279, 12211}},
+{1576, 14, 5073, {1, 3, 3, 15, 7, 47, 113, 33, 511, 907, 1815, 1741, 2091, 13857}},
+{1577, 14, 5096, {1, 3, 3, 5, 5, 27, 95, 3, 353, 253, 947, 393, 1815, 14551}},
+{1578, 14, 5128, {1, 1, 5, 11, 29, 19, 63, 117, 293, 861, 2039, 9, 5999, 6909}},
+{1579, 14, 5134, {1, 3, 7, 3, 15, 63, 107, 173, 509, 817, 99, 2825, 131, 7917}},
+{1580, 14, 5161, {1, 3, 1, 1, 29, 49, 33, 153, 119, 777, 1315, 3581, 5675, 4043}},
+{1581, 14, 5179, {1, 3, 5, 15, 13, 11, 17, 147, 327, 305, 367, 3237, 5423, 13757}},
+{1582, 14, 5193, {1, 1, 5, 13, 1, 39, 35, 29, 25, 751, 1365, 2243, 8181, 7063}},
+{1583, 14, 5199, {1, 3, 7, 11, 25, 53, 11, 111, 289, 755, 1201, 691, 3679, 3725}},
+{1584, 14, 5202, {1, 1, 1, 11, 11, 37, 33, 211, 395, 691, 1817, 861, 6485, 12077}},
+{1585, 14, 5204, {1, 3, 3, 11, 21, 3, 111, 171, 305, 561, 1501, 2011, 7841, 10931}},
+{1586, 14, 5218, {1, 3, 7, 9, 9, 59, 109, 113, 31, 915, 103, 1861, 2779, 10619}},
+{1587, 14, 5247, {1, 1, 1, 1, 7, 25, 61, 97, 103, 723, 1145, 3105, 371, 339}},
+{1588, 14, 5260, {1, 1, 7, 13, 17, 9, 113, 51, 233, 209, 1117, 211, 6969, 2347}},
+{1589, 14, 5271, {1, 1, 5, 9, 25, 43, 21, 217, 327, 735, 197, 1063, 799, 801}},
+{1590, 14, 5301, {1, 1, 7, 13, 9, 13, 73, 33, 415, 923, 863, 1999, 5383, 8119}},
+{1591, 14, 5305, {1, 3, 1, 5, 7, 33, 51, 185, 289, 967, 1277, 1011, 767, 15505}},
+{1592, 14, 5319, {1, 3, 3, 13, 21, 11, 105, 235, 343, 1021, 2009, 2251, 3865, 6923}},
+{1593, 14, 5326, {1, 3, 5, 9, 29, 11, 33, 17, 149, 155, 1739, 3039, 7015, 2401}},
+{1594, 14, 5328, {1, 3, 7, 7, 17, 13, 89, 177, 297, 267, 545, 3861, 329, 13267}},
+{1595, 14, 5333, {1, 3, 5, 15, 27, 33, 1, 231, 181, 557, 447, 379, 7845, 1295}},
+{1596, 14, 5364, {1, 1, 5, 13, 3, 63, 59, 33, 263, 877, 1867, 1383, 641, 7139}},
+{1597, 14, 5376, {1, 3, 7, 5, 13, 51, 9, 113, 223, 605, 1189, 4063, 6925, 9563}},
+{1598, 14, 5399, {1, 1, 1, 13, 5, 35, 83, 107, 295, 231, 265, 5, 4087, 6407}},
+{1599, 14, 5416, {1, 1, 5, 1, 7, 25, 95, 137, 97, 987, 1753, 2781, 1369, 6903}},
+{1600, 14, 5421, {1, 1, 5, 13, 19, 61, 77, 229, 193, 165, 811, 249, 79, 10719}},
+{1601, 14, 5427, {1, 3, 7, 7, 27, 9, 119, 193, 459, 43, 1989, 2959, 3595, 6341}},
+{1602, 14, 5429, {1, 1, 5, 11, 5, 43, 35, 33, 25, 581, 897, 351, 4201, 3971}},
+{1603, 14, 5430, {1, 1, 7, 11, 21, 29, 53, 45, 359, 197, 313, 3825, 6717, 4077}},
+{1604, 14, 5434, {1, 1, 1, 15, 3, 45, 99, 133, 357, 315, 1159, 241, 2463, 11253}},
+{1605, 14, 5441, {1, 1, 7, 11, 9, 33, 111, 85, 443, 601, 447, 337, 6471, 7029}},
+{1606, 14, 5451, {1, 3, 7, 9, 13, 33, 25, 31, 9, 729, 1763, 4077, 7575, 7877}},
+{1607, 14, 5465, {1, 3, 5, 13, 13, 37, 29, 103, 53, 229, 591, 1073, 1323, 14405}},
+{1608, 14, 5466, {1, 1, 5, 1, 17, 33, 15, 183, 473, 297, 2003, 93, 4955, 1787}},
+{1609, 14, 5471, {1, 1, 5, 13, 5, 29, 113, 161, 267, 451, 1193, 149, 273, 11809}},
+{1610, 14, 5477, {1, 1, 1, 9, 17, 39, 47, 233, 165, 373, 955, 2891, 7523, 7235}},
+{1611, 14, 5492, {1, 1, 1, 3, 7, 21, 115, 205, 153, 449, 339, 2073, 1077, 5749}},
+{1612, 14, 5495, {1, 1, 7, 13, 9, 39, 117, 187, 37, 753, 227, 3519, 7391, 5751}},
+{1613, 14, 5505, {1, 1, 1, 9, 5, 19, 41, 161, 141, 195, 1719, 3321, 5, 12877}},
+{1614, 14, 5515, {1, 3, 7, 11, 21, 13, 83, 55, 299, 75, 1905, 3765, 4685, 12297}},
+{1615, 14, 5525, {1, 1, 7, 3, 3, 23, 111, 243, 187, 297, 1061, 2515, 977, 9555}},
+{1616, 14, 5529, {1, 3, 7, 3, 29, 11, 103, 177, 225, 875, 1649, 1401, 6383, 8309}},
+{1617, 14, 5532, {1, 3, 5, 3, 3, 41, 71, 3, 373, 757, 701, 2825, 1521, 13217}},
+{1618, 14, 5539, {1, 1, 5, 3, 11, 5, 103, 227, 209, 723, 1543, 3895, 6345, 7901}},
+{1619, 14, 5541, {1, 1, 5, 1, 9, 51, 77, 67, 359, 937, 557, 993, 3871, 3577}},
+{1620, 14, 5556, {1, 3, 7, 1, 1, 15, 121, 239, 29, 113, 1123, 3877, 6941, 14129}},
+{1621, 14, 5566, {1, 1, 5, 1, 27, 61, 83, 113, 185, 601, 947, 3933, 381, 13869}},
+{1622, 14, 5568, {1, 1, 5, 3, 5, 37, 97, 31, 81, 367, 747, 1811, 5313, 14151}},
+{1623, 14, 5574, {1, 3, 5, 9, 27, 61, 87, 31, 185, 521, 837, 959, 5001, 3957}},
+{1624, 14, 5595, {1, 3, 5, 3, 11, 61, 37, 19, 107, 749, 1345, 3829, 6701, 4315}},
+{1625, 14, 5602, {1, 3, 1, 15, 13, 45, 101, 113, 243, 963, 1861, 3283, 1419, 12131}},
+{1626, 14, 5611, {1, 1, 7, 1, 11, 63, 17, 117, 271, 819, 677, 669, 1991, 12511}},
+{1627, 14, 5616, {1, 1, 1, 13, 13, 33, 41, 73, 187, 537, 993, 3147, 1013, 16063}},
+{1628, 14, 5622, {1, 3, 1, 1, 25, 21, 107, 81, 117, 917, 113, 349, 4475, 9149}},
+{1629, 14, 5628, {1, 1, 1, 11, 21, 21, 29, 251, 125, 681, 141, 2893, 5843, 14359}},
+{1630, 14, 5655, {1, 3, 3, 1, 5, 41, 85, 163, 387, 29, 1593, 221, 2769, 10809}},
+{1631, 14, 5662, {1, 3, 5, 11, 1, 17, 69, 127, 273, 449, 1855, 2971, 7031, 10583}},
+{1632, 14, 5675, {1, 1, 5, 7, 1, 61, 9, 211, 123, 563, 111, 1883, 5801, 2191}},
+{1633, 14, 5689, {1, 1, 3, 11, 11, 51, 1, 81, 405, 803, 2017, 161, 5429, 731}},
+{1634, 14, 5722, {1, 1, 7, 9, 15, 55, 65, 51, 459, 485, 1539, 3135, 2929, 7867}},
+{1635, 14, 5724, {1, 1, 7, 11, 3, 45, 15, 7, 331, 417, 1813, 4009, 1341, 10965}},
+{1636, 14, 5728, {1, 1, 1, 5, 9, 29, 89, 121, 277, 509, 1989, 1293, 4787, 16097}},
+{1637, 14, 5731, {1, 1, 3, 9, 17, 45, 97, 197, 339, 943, 1377, 2947, 5833, 7}},
+{1638, 14, 5746, {1, 1, 7, 9, 15, 61, 75, 233, 401, 705, 825, 2521, 3787, 14387}},
+{1639, 14, 5764, {1, 1, 7, 15, 25, 57, 3, 43, 361, 459, 1551, 1859, 6787, 2293}},
+{1640, 14, 5771, {1, 3, 3, 11, 11, 35, 91, 65, 43, 509, 1829, 1149, 4801, 4109}},
+{1641, 14, 5781, {1, 3, 5, 9, 15, 3, 81, 109, 231, 481, 417, 2505, 315, 6693}},
+{1642, 14, 5801, {1, 1, 3, 9, 3, 7, 107, 221, 297, 543, 149, 579, 927, 79}},
+{1643, 14, 5809, {1, 3, 1, 11, 17, 3, 81, 137, 157, 587, 741, 1277, 2631, 3953}},
+{1644, 14, 5810, {1, 1, 7, 5, 13, 43, 117, 19, 495, 185, 1105, 605, 5249, 11099}},
+{1645, 14, 5812, {1, 1, 7, 9, 23, 55, 91, 213, 21, 779, 857, 2047, 7813, 10053}},
+{1646, 14, 5841, {1, 1, 1, 1, 27, 7, 39, 181, 63, 519, 1073, 3147, 4111, 363}},
+{1647, 14, 5848, {1, 3, 7, 9, 15, 61, 7, 139, 495, 805, 1545, 3789, 2411, 3989}},
+{1648, 14, 5853, {1, 1, 3, 1, 25, 11, 23, 241, 167, 607, 479, 153, 7787, 13929}},
+{1649, 14, 5854, {1, 3, 5, 15, 29, 35, 45, 71, 457, 297, 883, 3021, 5361, 15427}},
+{1650, 14, 5858, {1, 3, 1, 7, 29, 27, 93, 241, 427, 89, 1185, 37, 3863, 14095}},
+{1651, 14, 5892, {1, 3, 1, 5, 5, 45, 51, 15, 235, 889, 1649, 2331, 2713, 10943}},
+{1652, 14, 5907, {1, 1, 3, 11, 11, 15, 71, 85, 135, 163, 139, 1147, 1043, 3195}},
+{1653, 14, 5910, {1, 3, 5, 13, 3, 43, 71, 131, 473, 933, 569, 2491, 7751, 1865}},
+{1654, 14, 5913, {1, 1, 7, 9, 21, 37, 105, 227, 329, 509, 1319, 307, 1557, 14625}},
+{1655, 14, 5920, {1, 1, 3, 13, 15, 1, 25, 93, 335, 953, 769, 4039, 369, 10727}},
+{1656, 14, 5929, {1, 3, 7, 5, 17, 21, 59, 89, 437, 679, 437, 1543, 7663, 5005}},
+{1657, 14, 5949, {1, 1, 7, 15, 27, 49, 125, 13, 397, 877, 1087, 2191, 4711, 9065}},
+{1658, 14, 5952, {1, 1, 7, 5, 15, 47, 115, 125, 187, 31, 1003, 2575, 5397, 3883}},
+{1659, 14, 5955, {1, 1, 7, 11, 15, 1, 127, 207, 383, 707, 183, 1053, 3123, 14071}},
+{1660, 14, 5962, {1, 3, 3, 1, 31, 53, 15, 19, 477, 245, 777, 1613, 5813, 7443}},
+{1661, 14, 5975, {1, 3, 1, 11, 23, 59, 65, 23, 493, 157, 1389, 2833, 4535, 3907}},
+{1662, 14, 5985, {1, 1, 7, 1, 19, 7, 51, 135, 327, 441, 1841, 3091, 3451, 14381}},
+{1663, 14, 5997, {1, 1, 7, 7, 3, 37, 29, 249, 437, 319, 1693, 945, 7639, 5923}},
+{1664, 14, 5998, {1, 3, 7, 15, 7, 61, 81, 127, 383, 99, 23, 3833, 3973, 7651}},
+{1665, 14, 6012, {1, 3, 1, 7, 7, 21, 119, 185, 243, 619, 1363, 2033, 4835, 5089}},
+{1666, 14, 6016, {1, 3, 1, 1, 3, 27, 63, 145, 271, 735, 695, 3981, 3049, 5433}},
+{1667, 14, 6026, {1, 3, 3, 1, 3, 29, 79, 211, 279, 819, 501, 3665, 1455, 10455}},
+{1668, 14, 6036, {1, 1, 3, 3, 31, 61, 113, 5, 411, 91, 489, 3257, 5939, 6715}},
+{1669, 14, 6040, {1, 1, 5, 1, 23, 11, 103, 89, 377, 441, 43, 967, 3383, 8717}},
+{1670, 14, 6045, {1, 1, 5, 13, 29, 39, 97, 189, 197, 621, 1755, 333, 6783, 9711}},
+{1671, 14, 6055, {1, 1, 5, 13, 27, 17, 97, 197, 351, 799, 335, 765, 5329, 12549}},
+{1672, 14, 6059, {1, 1, 5, 11, 29, 17, 9, 211, 127, 633, 1187, 3965, 4145, 12667}},
+{1673, 14, 6088, {1, 1, 7, 5, 27, 29, 65, 115, 287, 325, 461, 5, 899, 2027}},
+{1674, 14, 6115, {1, 1, 1, 5, 27, 17, 31, 13, 231, 627, 1163, 649, 1693, 9975}},
+{1675, 14, 6124, {1, 3, 1, 15, 7, 49, 113, 123, 427, 603, 347, 2785, 7129, 4645}},
+{1676, 14, 6127, {1, 1, 3, 7, 1, 33, 113, 105, 411, 939, 205, 3965, 4361, 4649}},
+{1677, 14, 6132, {1, 1, 1, 1, 5, 21, 35, 159, 275, 929, 1193, 3205, 4787, 3515}},
+{1678, 14, 6146, {1, 1, 1, 5, 1, 21, 29, 191, 275, 233, 1239, 515, 4349, 14989}},
+{1679, 14, 6158, {1, 1, 5, 11, 27, 43, 111, 83, 153, 577, 1537, 149, 231, 839}},
+{1680, 14, 6169, {1, 3, 5, 13, 21, 19, 57, 69, 87, 163, 271, 3535, 1057, 8517}},
+{1681, 14, 6206, {1, 3, 3, 13, 17, 49, 65, 45, 457, 241, 391, 2033, 2507, 7771}},
+{1682, 14, 6228, {1, 1, 5, 7, 11, 19, 79, 133, 341, 761, 27, 3905, 4137, 14363}},
+{1683, 14, 6237, {1, 3, 3, 13, 19, 1, 11, 139, 249, 245, 1393, 2151, 2857, 1665}},
+{1684, 14, 6244, {1, 1, 3, 15, 11, 7, 127, 47, 385, 1007, 713, 2235, 5489, 8755}},
+{1685, 14, 6247, {1, 3, 5, 13, 19, 21, 21, 167, 405, 655, 1653, 889, 7367, 4177}},
+{1686, 14, 6256, {1, 1, 5, 3, 19, 63, 99, 39, 89, 415, 951, 2863, 6569, 3797}},
+{1687, 14, 6281, {1, 1, 1, 13, 31, 29, 119, 35, 311, 839, 1749, 941, 7487, 2385}},
+{1688, 14, 6282, {1, 3, 7, 3, 17, 3, 97, 143, 465, 345, 1457, 2201, 5329, 359}},
+{1689, 14, 6284, {1, 3, 7, 11, 1, 15, 3, 115, 335, 567, 1749, 1811, 3491, 15939}},
+{1690, 14, 6296, {1, 1, 3, 13, 3, 21, 7, 141, 149, 571, 1877, 473, 2143, 9569}},
+{1691, 14, 6299, {1, 3, 3, 11, 23, 61, 47, 179, 297, 453, 181, 3405, 2981, 13409}},
+{1692, 14, 6302, {1, 3, 1, 13, 1, 43, 5, 201, 371, 1003, 367, 2709, 7675, 14973}},
+{1693, 14, 6325, {1, 3, 3, 15, 29, 17, 19, 241, 495, 317, 1135, 2227, 6457, 4783}},
+{1694, 14, 6349, {1, 3, 3, 7, 29, 9, 57, 95, 261, 531, 1717, 3389, 7991, 3793}},
+{1695, 14, 6352, {1, 1, 1, 5, 31, 43, 73, 119, 499, 589, 1529, 3337, 4097, 15641}},
+{1696, 14, 6362, {1, 1, 7, 9, 29, 43, 127, 91, 243, 979, 1325, 2835, 2787, 9445}},
+{1697, 14, 6383, {1, 1, 7, 5, 9, 3, 115, 199, 219, 901, 747, 1077, 3197, 2443}},
+{1698, 14, 6386, {1, 3, 5, 1, 3, 43, 7, 117, 297, 313, 1043, 1579, 5099, 13289}},
+{1699, 14, 6395, {1, 1, 7, 11, 29, 33, 15, 121, 131, 579, 317, 1871, 1121, 11653}},
+{1700, 14, 6397, {1, 1, 5, 9, 25, 25, 43, 89, 355, 1011, 1385, 2901, 6387, 1653}},
+{1701, 14, 6415, {1, 1, 1, 9, 5, 47, 61, 165, 85, 757, 1397, 1177, 1657, 4899}},
+{1702, 14, 6424, {1, 1, 3, 9, 11, 49, 15, 139, 261, 613, 931, 1299, 2777, 2835}},
+{1703, 14, 6429, {1, 1, 1, 5, 3, 55, 83, 227, 125, 581, 1607, 1171, 6681, 14463}},
+{1704, 14, 6439, {1, 3, 5, 13, 5, 55, 3, 247, 493, 155, 1073, 3743, 5719, 4019}},
+{1705, 14, 6451, {1, 1, 7, 1, 11, 23, 13, 75, 399, 847, 499, 1643, 6977, 3699}},
+{1706, 14, 6489, {1, 3, 1, 9, 11, 41, 47, 131, 313, 627, 481, 2469, 3281, 979}},
+{1707, 14, 6496, {1, 3, 5, 13, 29, 3, 65, 101, 11, 29, 1807, 153, 1487, 16109}},
+{1708, 14, 6502, {1, 1, 5, 9, 13, 31, 83, 195, 351, 355, 467, 3871, 3085, 4441}},
+{1709, 14, 6511, {1, 3, 5, 3, 19, 21, 111, 179, 143, 361, 1619, 1547, 3409, 6905}},
+{1710, 14, 6514, {1, 1, 5, 9, 31, 1, 93, 199, 491, 135, 1627, 2559, 1389, 14561}},
+{1711, 14, 6520, {1, 3, 3, 9, 25, 53, 3, 105, 39, 445, 259, 1045, 1129, 9153}},
+{1712, 14, 6523, {1, 1, 5, 9, 19, 63, 71, 9, 73, 435, 1377, 4015, 1821, 6453}},
+{1713, 14, 6529, {1, 3, 7, 13, 19, 13, 37, 247, 391, 23, 1491, 1257, 6395, 237}},
+{1714, 14, 6532, {1, 1, 3, 3, 19, 55, 109, 23, 227, 747, 729, 2221, 727, 2209}},
+{1715, 14, 6547, {1, 1, 5, 11, 25, 21, 75, 37, 219, 355, 1005, 1895, 7039, 5225}},
+{1716, 14, 6549, {1, 3, 5, 13, 11, 43, 9, 67, 87, 797, 1077, 245, 4521, 11845}},
+{1717, 14, 6598, {1, 3, 5, 3, 15, 29, 127, 237, 277, 373, 1859, 3083, 587, 1123}},
+{1718, 14, 6601, {1, 1, 7, 15, 13, 7, 103, 53, 13, 965, 1497, 775, 3439, 1501}},
+{1719, 14, 6610, {1, 3, 3, 15, 17, 13, 97, 169, 67, 953, 189, 2739, 1459, 10543}},
+{1720, 14, 6622, {1, 1, 5, 1, 17, 39, 15, 127, 327, 989, 1471, 3235, 2801, 15311}},
+{1721, 14, 6632, {1, 1, 1, 15, 5, 37, 55, 155, 47, 463, 1851, 3467, 2765, 9359}},
+{1722, 14, 6655, {1, 3, 3, 15, 1, 13, 93, 239, 291, 115, 365, 61, 395, 15853}},
+{1723, 14, 6665, {1, 1, 5, 1, 19, 27, 61, 95, 105, 369, 1557, 961, 6917, 3621}},
+{1724, 14, 6666, {1, 3, 3, 9, 7, 35, 115, 53, 111, 345, 1145, 1687, 3401, 12107}},
+{1725, 14, 6695, {1, 1, 1, 5, 7, 31, 63, 19, 373, 79, 1369, 3037, 2835, 4439}},
+{1726, 14, 6701, {1, 3, 7, 9, 11, 17, 29, 33, 331, 447, 1981, 3333, 6535, 6557}},
+{1727, 14, 6709, {1, 3, 3, 5, 11, 41, 29, 43, 365, 279, 1919, 945, 179, 1987}},
+{1728, 14, 6710, {1, 3, 1, 13, 7, 7, 25, 33, 103, 367, 1267, 763, 5691, 8643}},
+{1729, 14, 6741, {1, 3, 1, 5, 11, 15, 3, 213, 511, 211, 1069, 4047, 3335, 12729}},
+{1730, 14, 6745, {1, 1, 3, 1, 5, 11, 27, 201, 361, 537, 679, 3709, 293, 2997}},
+{1731, 14, 6758, {1, 1, 3, 1, 25, 15, 19, 185, 369, 577, 1625, 655, 2363, 3861}},
+{1732, 14, 6767, {1, 1, 5, 5, 1, 47, 61, 45, 411, 597, 955, 1007, 3775, 5809}},
+{1733, 14, 6772, {1, 1, 5, 3, 27, 51, 101, 167, 429, 333, 1703, 3541, 2947, 3695}},
+{1734, 14, 6782, {1, 3, 5, 5, 1, 53, 17, 63, 141, 215, 1223, 3129, 635, 15919}},
+{1735, 14, 6797, {1, 3, 3, 1, 23, 31, 25, 11, 195, 241, 995, 3941, 573, 13855}},
+{1736, 14, 6800, {1, 3, 3, 7, 17, 13, 71, 203, 465, 479, 1857, 1493, 8067, 7113}},
+{1737, 14, 6843, {1, 1, 5, 3, 11, 57, 9, 59, 225, 691, 425, 2423, 6031, 6631}},
+{1738, 14, 6845, {1, 3, 7, 1, 29, 57, 103, 123, 401, 807, 471, 2759, 5113, 15937}},
+{1739, 14, 6860, {1, 3, 1, 1, 3, 1, 67, 123, 157, 655, 519, 323, 1853, 15041}},
+{1740, 14, 6865, {1, 1, 7, 5, 11, 11, 105, 135, 247, 689, 1141, 2347, 7113, 9347}},
+{1741, 14, 6878, {1, 1, 3, 11, 15, 37, 87, 3, 209, 575, 1521, 3863, 3893, 211}},
+{1742, 14, 6887, {1, 3, 1, 3, 29, 55, 115, 31, 19, 195, 985, 3275, 363, 9801}},
+{1743, 14, 6888, {1, 1, 3, 9, 13, 31, 57, 251, 201, 275, 1751, 389, 1463, 13159}},
+{1744, 14, 6901, {1, 3, 5, 15, 19, 51, 127, 255, 397, 243, 29, 3007, 7845, 4687}},
+{1745, 14, 6906, {1, 1, 7, 15, 9, 37, 39, 217, 509, 137, 1123, 3361, 6323, 5323}},
+{1746, 14, 6940, {1, 3, 7, 5, 25, 3, 93, 203, 345, 581, 261, 2811, 4829, 6977}},
+{1747, 14, 6947, {1, 1, 7, 1, 15, 41, 51, 227, 447, 893, 1209, 3865, 5229, 4277}},
+{1748, 14, 6953, {1, 1, 1, 5, 31, 19, 23, 195, 359, 853, 595, 337, 2503, 16371}},
+{1749, 14, 6954, {1, 3, 7, 5, 5, 13, 89, 157, 351, 777, 151, 3565, 4219, 7423}},
+{1750, 14, 6959, {1, 1, 1, 5, 7, 1, 9, 89, 175, 909, 1523, 2295, 7949, 6739}},
+{1751, 14, 6961, {1, 3, 5, 15, 27, 17, 11, 235, 19, 105, 457, 465, 3819, 11335}},
+{1752, 14, 6964, {1, 3, 1, 13, 3, 41, 85, 221, 451, 613, 543, 2265, 6831, 1725}},
+{1753, 14, 6991, {1, 1, 7, 7, 3, 29, 9, 197, 455, 665, 343, 1811, 5395, 393}},
+{1754, 14, 6993, {1, 1, 3, 13, 29, 55, 71, 95, 475, 615, 2029, 123, 413, 16127}},
+{1755, 14, 6999, {1, 1, 5, 9, 15, 61, 9, 51, 105, 271, 511, 2801, 693, 11839}},
+{1756, 14, 7016, {1, 1, 7, 13, 29, 9, 105, 59, 377, 635, 717, 4033, 6963, 10541}},
+{1757, 14, 7029, {1, 1, 1, 13, 7, 13, 59, 17, 335, 355, 77, 3665, 7003, 9521}},
+{1758, 14, 7036, {1, 3, 1, 1, 23, 43, 51, 209, 151, 365, 1021, 2859, 3937, 2899}},
+{1759, 14, 7045, {1, 1, 3, 3, 31, 41, 111, 107, 171, 433, 1233, 505, 2971, 6927}},
+{1760, 14, 7076, {1, 3, 7, 13, 17, 25, 127, 195, 257, 551, 1867, 2145, 3695, 14567}},
+{1761, 14, 7083, {1, 1, 5, 13, 13, 45, 39, 195, 55, 991, 1981, 1043, 5875, 581}},
+{1762, 14, 7094, {1, 3, 3, 11, 25, 31, 91, 153, 415, 449, 1301, 563, 7755, 10671}},
+{1763, 14, 7097, {1, 1, 3, 5, 31, 63, 1, 157, 229, 949, 971, 137, 6589, 8387}},
+{1764, 14, 7123, {1, 3, 7, 15, 25, 7, 89, 133, 73, 497, 1361, 613, 455, 1005}},
+{1765, 14, 7130, {1, 3, 3, 1, 13, 5, 119, 93, 175, 511, 1923, 763, 7573, 7545}},
+{1766, 14, 7139, {1, 1, 3, 15, 27, 59, 49, 205, 497, 485, 117, 2523, 4495, 15153}},
+{1767, 14, 7145, {1, 3, 7, 9, 15, 47, 111, 31, 363, 11, 475, 2931, 6813, 1259}},
+{1768, 14, 7146, {1, 1, 5, 5, 1, 35, 95, 225, 17, 991, 809, 2601, 6455, 13803}},
+{1769, 14, 7178, {1, 1, 5, 5, 15, 1, 1, 171, 433, 887, 1813, 3431, 2471, 7803}},
+{1770, 14, 7186, {1, 3, 3, 15, 1, 15, 43, 179, 15, 949, 1881, 1027, 6989, 8955}},
+{1771, 14, 7192, {1, 3, 7, 13, 1, 3, 49, 183, 373, 175, 1733, 913, 929, 1065}},
+{1772, 14, 7198, {1, 3, 5, 7, 15, 51, 107, 115, 323, 357, 167, 2069, 7541, 9601}},
+{1773, 14, 7222, {1, 1, 3, 5, 5, 21, 31, 107, 21, 299, 1937, 43, 3673, 8155}},
+{1774, 14, 7269, {1, 3, 5, 11, 9, 55, 35, 113, 29, 99, 161, 1607, 8141, 4951}},
+{1775, 14, 7270, {1, 3, 7, 15, 25, 7, 113, 179, 213, 19, 1717, 1027, 2021, 11263}},
+{1776, 14, 7276, {1, 1, 5, 1, 31, 33, 85, 111, 67, 95, 2013, 2217, 871, 5329}},
+{1777, 14, 7287, {1, 1, 1, 7, 7, 63, 67, 145, 495, 419, 1945, 3437, 6255, 151}},
+{1778, 14, 7307, {1, 3, 5, 7, 17, 37, 97, 187, 215, 399, 1603, 2195, 5923, 769}},
+{1779, 14, 7315, {1, 1, 3, 9, 25, 1, 119, 193, 385, 861, 2005, 2769, 675, 767}},
+{1780, 14, 7334, {1, 3, 1, 15, 19, 7, 5, 227, 173, 383, 289, 461, 579, 3689}},
+{1781, 14, 7340, {1, 3, 1, 11, 1, 37, 93, 239, 465, 891, 1479, 921, 4439, 15265}},
+{1782, 14, 7351, {1, 1, 1, 13, 27, 61, 99, 69, 279, 655, 1853, 1593, 6319, 9003}},
+{1783, 14, 7352, {1, 1, 1, 11, 5, 7, 19, 7, 387, 303, 321, 931, 5809, 16029}},
+{1784, 14, 7357, {1, 1, 1, 15, 21, 55, 43, 107, 217, 687, 19, 3225, 3419, 9991}},
+{1785, 14, 7360, {1, 1, 7, 5, 7, 55, 79, 41, 317, 357, 859, 1205, 191, 9395}},
+{1786, 14, 7363, {1, 1, 3, 11, 3, 43, 7, 133, 115, 995, 1205, 1055, 4153, 10481}},
+{1787, 14, 7384, {1, 1, 7, 11, 31, 57, 53, 9, 459, 223, 1969, 3513, 7033, 8505}},
+{1788, 14, 7396, {1, 1, 3, 7, 17, 11, 115, 255, 281, 97, 1685, 2039, 2845, 11637}},
+{1789, 14, 7403, {1, 3, 7, 1, 23, 41, 69, 199, 53, 105, 657, 1453, 4429, 1101}},
+{1790, 14, 7406, {1, 3, 1, 5, 11, 33, 91, 131, 191, 73, 823, 117, 1053, 127}},
+{1791, 14, 7425, {1, 3, 7, 11, 7, 3, 21, 65, 187, 103, 1393, 1797, 6673, 1409}},
+{1792, 14, 7437, {1, 3, 7, 1, 31, 25, 25, 161, 299, 275, 417, 2267, 6861, 1255}},
+{1793, 14, 7445, {1, 3, 5, 13, 5, 11, 61, 155, 115, 1001, 747, 889, 3235, 5709}},
+{1794, 14, 7450, {1, 3, 7, 7, 7, 1, 97, 177, 507, 273, 1781, 3455, 5123, 15607}},
+{1795, 14, 7455, {1, 1, 7, 5, 1, 7, 59, 49, 147, 343, 97, 3517, 5611, 8705}},
+{1796, 14, 7461, {1, 1, 5, 13, 21, 29, 13, 21, 503, 515, 1217, 3905, 5513, 15849}},
+{1797, 14, 7466, {1, 3, 1, 9, 9, 39, 65, 111, 385, 757, 583, 2225, 2039, 2817}},
+{1798, 14, 7488, {1, 3, 3, 15, 23, 17, 63, 169, 503, 949, 849, 461, 6799, 669}},
+{1799, 14, 7494, {1, 1, 1, 3, 1, 41, 63, 159, 251, 457, 521, 1653, 623, 3287}},
+{1800, 14, 7515, {1, 1, 7, 3, 9, 1, 41, 37, 441, 921, 1415, 2955, 5841, 1451}},
+{1801, 14, 7517, {1, 1, 5, 11, 23, 29, 89, 185, 413, 357, 1131, 2369, 3835, 6233}},
+{1802, 14, 7521, {1, 1, 5, 15, 27, 35, 17, 73, 315, 911, 1761, 797, 5349, 3219}},
+{1803, 14, 7536, {1, 3, 7, 11, 21, 9, 119, 233, 249, 901, 189, 3625, 2691, 16201}},
+{1804, 14, 7546, {1, 3, 3, 13, 29, 61, 105, 145, 187, 79, 609, 321, 4289, 3933}},
+{1805, 14, 7569, {1, 3, 1, 15, 19, 63, 13, 185, 115, 219, 1021, 1205, 4273, 11521}},
+{1806, 14, 7591, {1, 1, 3, 3, 23, 31, 93, 153, 87, 947, 1039, 469, 4047, 8869}},
+{1807, 14, 7592, {1, 1, 1, 1, 9, 1, 85, 3, 15, 995, 455, 2769, 6781, 16203}},
+{1808, 14, 7598, {1, 1, 3, 3, 13, 7, 55, 215, 185, 367, 765, 441, 4497, 1521}},
+{1809, 14, 7612, {1, 1, 1, 5, 1, 31, 13, 95, 417, 735, 975, 3407, 4871, 16133}},
+{1810, 14, 7623, {1, 1, 3, 3, 5, 43, 111, 107, 419, 515, 1075, 3597, 1187, 4143}},
+{1811, 14, 7632, {1, 1, 3, 13, 31, 51, 83, 163, 489, 887, 863, 599, 9, 13861}},
+{1812, 14, 7637, {1, 3, 3, 3, 19, 27, 91, 115, 103, 969, 593, 3667, 1867, 15433}},
+{1813, 14, 7644, {1, 3, 3, 13, 7, 25, 47, 141, 57, 553, 1785, 1709, 7453, 2209}},
+{1814, 14, 7657, {1, 3, 1, 13, 11, 13, 71, 219, 5, 451, 2043, 1605, 6439, 12203}},
+{1815, 14, 7665, {1, 3, 1, 13, 5, 57, 61, 223, 401, 413, 321, 1365, 619, 12477}},
+{1816, 14, 7672, {1, 3, 1, 5, 25, 57, 89, 211, 195, 455, 1165, 3979, 6313, 5751}},
+{1817, 14, 7682, {1, 1, 1, 9, 31, 23, 71, 145, 89, 285, 1593, 1171, 5685, 15459}},
+{1818, 14, 7699, {1, 3, 7, 7, 9, 41, 65, 251, 65, 137, 1577, 3027, 5555, 2865}},
+{1819, 14, 7702, {1, 1, 5, 13, 27, 5, 125, 21, 171, 647, 983, 2921, 6623, 5695}},
+{1820, 14, 7724, {1, 1, 1, 13, 15, 9, 117, 197, 123, 953, 1191, 3657, 5757, 15957}},
+{1821, 14, 7749, {1, 1, 3, 7, 29, 13, 5, 175, 395, 127, 679, 255, 6055, 7639}},
+{1822, 14, 7753, {1, 3, 7, 15, 15, 51, 77, 147, 319, 147, 1775, 3983, 3175, 5723}},
+{1823, 14, 7754, {1, 3, 3, 3, 7, 11, 119, 41, 43, 153, 975, 679, 3081, 10359}},
+{1824, 14, 7761, {1, 1, 5, 13, 3, 7, 65, 67, 63, 399, 1561, 2789, 2083, 12289}},
+{1825, 14, 7771, {1, 1, 7, 3, 19, 53, 103, 67, 35, 865, 161, 93, 2533, 3851}},
+{1826, 14, 7777, {1, 1, 1, 11, 31, 9, 29, 189, 199, 817, 1571, 395, 345, 3777}},
+{1827, 14, 7784, {1, 3, 5, 11, 31, 3, 9, 67, 277, 735, 181, 2777, 3009, 7233}},
+{1828, 14, 7804, {1, 1, 3, 3, 17, 7, 17, 3, 375, 933, 237, 3919, 5409, 3355}},
+{1829, 14, 7807, {1, 3, 3, 5, 9, 27, 19, 77, 221, 3, 1965, 309, 3001, 15977}},
+{1830, 14, 7808, {1, 1, 5, 1, 3, 33, 35, 133, 37, 709, 627, 1705, 2525, 4307}},
+{1831, 14, 7818, {1, 1, 7, 3, 25, 21, 105, 55, 375, 681, 881, 1299, 5879, 459}},
+{1832, 14, 7835, {1, 3, 7, 1, 13, 7, 113, 103, 313, 515, 1041, 3683, 4619, 5093}},
+{1833, 14, 7842, {1, 1, 3, 7, 19, 43, 83, 37, 39, 133, 1759, 1171, 1521, 13717}},
+{1834, 14, 7865, {1, 1, 7, 13, 7, 35, 15, 155, 293, 1001, 157, 3883, 405, 1797}},
+{1835, 14, 7868, {1, 1, 3, 3, 13, 19, 125, 49, 333, 387, 339, 1815, 4503, 7359}},
+{1836, 14, 7880, {1, 1, 3, 13, 19, 19, 105, 225, 151, 27, 1251, 885, 4815, 7863}},
+{1837, 14, 7883, {1, 1, 1, 5, 7, 59, 17, 145, 77, 117, 1355, 1429, 2301, 16177}},
+{1838, 14, 7891, {1, 3, 3, 13, 5, 31, 119, 167, 459, 727, 1799, 2537, 695, 13637}},
+{1839, 14, 7897, {1, 3, 3, 3, 27, 51, 107, 85, 267, 57, 1279, 823, 6247, 3603}},
+{1840, 14, 7907, {1, 1, 7, 15, 29, 17, 67, 197, 215, 465, 109, 3461, 5269, 15287}},
+{1841, 14, 7910, {1, 1, 3, 5, 11, 15, 123, 53, 293, 797, 1105, 1777, 6509, 217}},
+{1842, 14, 7924, {1, 3, 3, 13, 3, 5, 109, 53, 203, 693, 871, 135, 369, 11149}},
+{1843, 14, 7933, {1, 3, 5, 15, 17, 43, 81, 235, 119, 817, 1777, 261, 8049, 4251}},
+{1844, 14, 7934, {1, 1, 3, 7, 7, 13, 87, 99, 481, 931, 1507, 651, 5267, 8281}},
+{1845, 14, 7942, {1, 3, 1, 13, 27, 43, 77, 225, 341, 163, 933, 429, 4943, 7781}},
+{1846, 14, 7948, {1, 1, 7, 1, 1, 49, 85, 211, 449, 479, 1395, 787, 5653, 14891}},
+{1847, 14, 7959, {1, 1, 5, 9, 25, 13, 49, 85, 125, 85, 1281, 3365, 4305, 11791}},
+{1848, 14, 7984, {1, 3, 1, 13, 3, 31, 117, 39, 43, 151, 663, 669, 1571, 5207}},
+{1849, 14, 7994, {1, 3, 7, 15, 17, 7, 79, 163, 37, 841, 1799, 1787, 4501, 3785}},
+{1850, 14, 7999, {1, 1, 3, 9, 1, 23, 67, 191, 449, 931, 1521, 2705, 887, 7037}},
+{1851, 14, 8014, {1, 1, 1, 1, 5, 13, 55, 161, 419, 577, 1703, 2589, 2651, 2873}},
+{1852, 14, 8021, {1, 3, 3, 3, 5, 19, 37, 169, 69, 1003, 1755, 3101, 1469, 8583}},
+{1853, 14, 8041, {1, 1, 1, 1, 11, 33, 105, 79, 283, 91, 299, 835, 3193, 5593}},
+{1854, 14, 8049, {1, 3, 3, 13, 25, 21, 81, 213, 465, 475, 331, 457, 61, 9511}},
+{1855, 14, 8050, {1, 1, 3, 11, 1, 11, 77, 95, 455, 949, 1999, 1833, 1275, 5631}},
+{1856, 14, 8068, {1, 1, 1, 1, 15, 25, 51, 137, 275, 451, 1179, 3595, 5177, 7105}},
+{1857, 14, 8080, {1, 3, 3, 3, 3, 59, 79, 143, 393, 583, 349, 3039, 7079, 14245}},
+{1858, 14, 8095, {1, 1, 7, 9, 21, 11, 123, 105, 53, 297, 803, 4025, 5421, 14527}},
+{1859, 14, 8102, {1, 3, 7, 11, 21, 15, 103, 109, 311, 321, 1217, 2777, 5457, 1823}},
+{1860, 14, 8106, {1, 3, 5, 11, 19, 31, 79, 89, 295, 413, 817, 499, 3699, 14411}},
+{1861, 14, 8120, {1, 1, 1, 5, 11, 3, 81, 13, 315, 841, 1543, 411, 6883, 6347}},
+{1862, 14, 8133, {1, 3, 3, 11, 23, 43, 23, 131, 17, 517, 995, 2687, 7443, 15085}},
+{1863, 14, 8134, {1, 1, 1, 1, 11, 57, 73, 9, 123, 905, 1763, 1789, 3701, 7131}},
+{1864, 14, 8143, {1, 1, 3, 5, 9, 53, 99, 229, 43, 207, 625, 1583, 6727, 15249}},
+{1865, 14, 8162, {1, 1, 7, 7, 17, 39, 91, 1, 297, 711, 225, 513, 7391, 291}},
+{1866, 14, 8168, {1, 1, 7, 11, 7, 55, 111, 129, 423, 521, 1807, 3015, 1449, 12321}},
+{1867, 14, 8179, {1, 3, 7, 3, 13, 9, 125, 187, 11, 485, 647, 275, 3495, 11989}},
+{1868, 15, 1, {1, 1, 3, 11, 11, 25, 49, 33, 361, 105, 271, 3841, 4837, 2437, 30181}},
+{1869, 15, 8, {1, 3, 5, 1, 27, 15, 119, 35, 159, 273, 1489, 3157, 5433, 3337, 26859}},
+{1870, 15, 11, {1, 3, 5, 13, 23, 31, 97, 145, 41, 605, 1455, 59, 5389, 5527, 14447}},
+{1871, 15, 22, {1, 1, 7, 9, 7, 41, 61, 193, 353, 879, 1805, 581, 5447, 11177, 7331}},
+{1872, 15, 26, {1, 1, 7, 11, 29, 19, 55, 207, 361, 759, 63, 2255, 2119, 14671, 21783}},
+{1873, 15, 47, {1, 3, 1, 13, 17, 7, 73, 179, 103, 23, 917, 1205, 4925, 1691, 5419}},
+{1874, 15, 59, {1, 3, 5, 3, 15, 3, 9, 109, 227, 861, 867, 3529, 1535, 489, 22873}},
+{1875, 15, 64, {1, 3, 3, 9, 15, 15, 95, 193, 385, 997, 1525, 1865, 1425, 4079, 14771}},
+{1876, 15, 67, {1, 1, 3, 5, 5, 29, 49, 171, 171, 623, 1167, 3743, 1809, 12009, 7043}},
+{1877, 15, 73, {1, 3, 7, 5, 23, 11, 87, 183, 299, 555, 1857, 489, 3505, 9161, 28763}},
+{1878, 15, 82, {1, 3, 5, 9, 19, 21, 85, 127, 337, 439, 1183, 1891, 1877, 4373, 10451}},
+{1879, 15, 97, {1, 3, 7, 13, 27, 17, 29, 83, 463, 385, 1167, 3453, 4523, 4759, 9321}},
+{1880, 15, 103, {1, 1, 3, 7, 21, 59, 65, 83, 177, 763, 317, 2913, 7527, 5967, 17167}},
+{1881, 15, 110, {1, 1, 7, 15, 13, 27, 49, 35, 253, 101, 1699, 355, 2181, 10859, 24221}},
+{1882, 15, 115, {1, 1, 5, 1, 17, 17, 81, 91, 349, 655, 1373, 2225, 945, 899, 31801}},
+{1883, 15, 122, {1, 3, 7, 11, 5, 1, 81, 53, 215, 587, 167, 4045, 5671, 5597, 13529}},
+{1884, 15, 128, {1, 3, 5, 15, 1, 9, 59, 235, 315, 195, 909, 2237, 505, 10415, 28145}},
+{1885, 15, 138, {1, 1, 1, 3, 9, 31, 41, 43, 275, 921, 25, 671, 5737, 11241, 4193}},
+{1886, 15, 146, {1, 3, 3, 13, 29, 13, 95, 213, 317, 995, 1489, 3779, 3043, 8569, 28823}},
+{1887, 15, 171, {1, 1, 7, 5, 9, 49, 125, 241, 87, 153, 1673, 3849, 7253, 1715, 11627}},
+{1888, 15, 174, {1, 1, 3, 9, 27, 27, 19, 223, 63, 463, 1095, 1395, 6643, 11589, 2145}},
+{1889, 15, 176, {1, 1, 3, 15, 21, 17, 45, 23, 357, 11, 1307, 1791, 2481, 2123, 24341}},
+{1890, 15, 182, {1, 3, 5, 15, 31, 53, 117, 51, 433, 193, 1239, 3329, 2403, 12745, 32219}},
+{1891, 15, 194, {1, 1, 5, 9, 7, 27, 9, 115, 417, 579, 83, 173, 4717, 15665, 27463}},
+{1892, 15, 208, {1, 3, 5, 7, 9, 9, 31, 35, 249, 567, 331, 905, 5101, 14817, 14255}},
+{1893, 15, 211, {1, 3, 7, 3, 1, 61, 29, 129, 119, 421, 1597, 2987, 3041, 7629, 23451}},
+{1894, 15, 220, {1, 1, 7, 9, 13, 1, 99, 105, 107, 509, 989, 2259, 1009, 6827, 8903}},
+{1895, 15, 229, {1, 3, 5, 15, 11, 29, 85, 29, 265, 105, 2035, 3349, 3543, 13903, 10213}},
+{1896, 15, 230, {1, 3, 1, 1, 25, 19, 53, 139, 467, 485, 491, 3067, 7353, 13861, 25819}},
+{1897, 15, 239, {1, 1, 5, 3, 3, 43, 41, 185, 45, 463, 351, 2823, 2519, 6705, 11395}},
+{1898, 15, 254, {1, 3, 7, 13, 11, 15, 87, 221, 427, 673, 1631, 599, 3259, 10691, 31283}},
+{1899, 15, 265, {1, 3, 5, 11, 9, 9, 15, 49, 275, 335, 1613, 3587, 5309, 14849, 26475}},
+{1900, 15, 285, {1, 3, 7, 9, 29, 13, 79, 225, 381, 781, 1411, 2761, 7157, 14983, 19717}},
+{1901, 15, 290, {1, 1, 7, 11, 29, 25, 117, 183, 101, 651, 653, 3157, 445, 14389, 23293}},
+{1902, 15, 319, {1, 1, 1, 3, 5, 33, 73, 155, 473, 387, 591, 2045, 5965, 16299, 31499}},
+{1903, 15, 324, {1, 3, 1, 7, 11, 33, 29, 21, 491, 937, 729, 4075, 975, 2461, 18991}},
+{1904, 15, 327, {1, 3, 7, 15, 29, 39, 105, 111, 173, 943, 69, 295, 8175, 13037, 26131}},
+{1905, 15, 333, {1, 1, 5, 15, 7, 5, 97, 147, 105, 887, 443, 2595, 5889, 10753, 1619}},
+{1906, 15, 357, {1, 3, 3, 15, 11, 45, 87, 207, 353, 909, 1847, 323, 2283, 12885, 16415}},
+{1907, 15, 364, {1, 1, 5, 3, 19, 33, 43, 79, 115, 653, 359, 2873, 4609, 12439, 6339}},
+{1908, 15, 395, {1, 3, 7, 9, 17, 61, 49, 227, 291, 69, 1753, 3899, 483, 3187, 29041}},
+{1909, 15, 397, {1, 3, 5, 3, 25, 35, 61, 211, 393, 199, 691, 1779, 6295, 13371, 15817}},
+{1910, 15, 405, {1, 3, 7, 5, 7, 23, 37, 91, 245, 915, 579, 867, 6193, 1063, 17363}},
+{1911, 15, 409, {1, 3, 7, 7, 23, 51, 41, 63, 375, 3, 159, 1889, 4419, 1687, 17977}},
+{1912, 15, 419, {1, 1, 1, 7, 13, 11, 53, 43, 317, 325, 1749, 2423, 4123, 8595, 20773}},
+{1913, 15, 422, {1, 1, 7, 7, 9, 9, 61, 113, 437, 213, 1407, 645, 4345, 807, 30411}},
+{1914, 15, 431, {1, 3, 3, 11, 17, 39, 17, 113, 391, 385, 581, 2023, 7449, 10153, 22033}},
+{1915, 15, 433, {1, 1, 3, 5, 29, 31, 101, 215, 379, 377, 1113, 2855, 7147, 14377, 25515}},
+{1916, 15, 436, {1, 3, 5, 5, 13, 3, 121, 125, 227, 969, 11, 1115, 5657, 9209, 6117}},
+{1917, 15, 440, {1, 3, 7, 15, 29, 17, 33, 123, 317, 301, 749, 1365, 5619, 605, 1613}},
+{1918, 15, 453, {1, 3, 1, 15, 7, 53, 125, 249, 219, 655, 105, 2825, 1649, 12783, 19777}},
+{1919, 15, 460, {1, 1, 7, 1, 25, 53, 19, 53, 157, 373, 1855, 495, 5065, 9465, 2313}},
+{1920, 15, 471, {1, 3, 5, 13, 3, 57, 57, 161, 431, 415, 1859, 1033, 6349, 1577, 31579}},
+{1921, 15, 478, {1, 1, 7, 5, 23, 63, 29, 221, 13, 965, 1997, 2265, 1583, 10491, 9551}},
+{1922, 15, 482, {1, 1, 3, 13, 31, 25, 23, 61, 285, 5, 2005, 879, 795, 13299, 19685}},
+{1923, 15, 488, {1, 1, 7, 1, 21, 45, 121, 89, 263, 543, 1333, 2711, 219, 10823, 26139}},
+{1924, 15, 524, {1, 1, 3, 3, 27, 13, 19, 117, 161, 457, 1541, 295, 4953, 12125, 14503}},
+{1925, 15, 529, {1, 3, 5, 3, 7, 63, 13, 247, 439, 681, 977, 2537, 6923, 10323, 7349}},
+{1926, 15, 535, {1, 3, 5, 9, 3, 51, 81, 251, 349, 983, 581, 2515, 2281, 2849, 31915}},
+{1927, 15, 536, {1, 3, 5, 3, 11, 63, 47, 137, 303, 627, 91, 2269, 7097, 2145, 31059}},
+{1928, 15, 539, {1, 1, 3, 15, 13, 17, 53, 27, 133, 13, 117, 1837, 4103, 5843, 29153}},
+{1929, 15, 563, {1, 1, 5, 13, 21, 33, 37, 253, 465, 209, 309, 49, 3209, 15677, 14569}},
+{1930, 15, 566, {1, 1, 7, 15, 13, 21, 33, 203, 499, 141, 1155, 3893, 1663, 2115, 27459}},
+{1931, 15, 572, {1, 3, 5, 11, 21, 9, 39, 157, 257, 273, 1257, 1831, 515, 7969, 20133}},
+{1932, 15, 577, {1, 1, 3, 13, 19, 29, 15, 189, 103, 219, 1395, 517, 7425, 6585, 15865}},
+{1933, 15, 587, {1, 1, 5, 11, 21, 31, 49, 151, 39, 537, 1783, 3449, 6915, 223, 11587}},
+{1934, 15, 592, {1, 3, 3, 11, 7, 63, 69, 31, 27, 911, 1903, 2821, 7977, 12949, 32257}},
+{1935, 15, 602, {1, 1, 7, 9, 25, 45, 23, 233, 511, 595, 1383, 1721, 6789, 12055, 21179}},
+{1936, 15, 623, {1, 1, 7, 13, 1, 27, 123, 49, 439, 683, 501, 641, 1947, 6111, 25423}},
+{1937, 15, 635, {1, 3, 3, 5, 1, 23, 57, 241, 243, 593, 2039, 1617, 2209, 5171, 9675}},
+{1938, 15, 638, {1, 1, 1, 7, 5, 19, 83, 55, 481, 125, 177, 1021, 1139, 11403, 23099}},
+{1939, 15, 654, {1, 1, 3, 5, 29, 39, 33, 217, 461, 907, 733, 3795, 4811, 12939, 27715}},
+{1940, 15, 656, {1, 3, 7, 3, 7, 11, 39, 165, 495, 147, 999, 1827, 817, 603, 9293}},
+{1941, 15, 659, {1, 3, 7, 15, 25, 53, 35, 15, 431, 733, 1213, 2907, 8087, 3939, 27363}},
+{1942, 15, 665, {1, 3, 7, 13, 13, 9, 33, 27, 485, 183, 455, 3341, 2555, 4985, 8793}},
+{1943, 15, 675, {1, 1, 1, 15, 25, 47, 75, 21, 205, 15, 1639, 3067, 1295, 11693, 16903}},
+{1944, 15, 677, {1, 1, 1, 15, 3, 31, 93, 57, 43, 185, 251, 1899, 7885, 10829, 3609}},
+{1945, 15, 687, {1, 1, 3, 1, 29, 9, 69, 223, 221, 537, 365, 3411, 5771, 15279, 5309}},
+{1946, 15, 696, {1, 1, 7, 5, 1, 5, 125, 243, 213, 1003, 1571, 3355, 3981, 8781, 25993}},
+{1947, 15, 701, {1, 1, 1, 13, 7, 19, 53, 243, 301, 75, 1183, 2723, 6687, 13, 16581}},
+{1948, 15, 704, {1, 3, 1, 13, 17, 51, 91, 239, 437, 191, 1065, 2495, 5755, 3405, 8299}},
+{1949, 15, 710, {1, 1, 5, 5, 11, 59, 21, 169, 299, 123, 1845, 2199, 2157, 14461, 10327}},
+{1950, 15, 721, {1, 3, 7, 7, 19, 47, 51, 179, 41, 19, 1347, 2325, 8063, 5993, 15653}},
+{1951, 15, 728, {1, 1, 1, 9, 25, 27, 7, 133, 223, 533, 719, 353, 7093, 8285, 10375}},
+{1952, 15, 738, {1, 3, 5, 15, 31, 5, 67, 39, 441, 495, 977, 3699, 1435, 11385, 14567}},
+{1953, 15, 740, {1, 1, 3, 15, 15, 39, 25, 33, 91, 523, 249, 4035, 769, 5181, 9691}},
+{1954, 15, 749, {1, 1, 3, 3, 3, 57, 83, 187, 423, 165, 161, 3453, 2241, 981, 8429}},
+{1955, 15, 758, {1, 1, 7, 15, 1, 17, 57, 189, 283, 11, 823, 3505, 7025, 11879, 15441}},
+{1956, 15, 761, {1, 1, 3, 11, 1, 41, 7, 255, 385, 339, 607, 1405, 1473, 13697, 9491}},
+{1957, 15, 772, {1, 1, 7, 15, 5, 9, 91, 99, 211, 233, 51, 2663, 1165, 9283, 18495}},
+{1958, 15, 776, {1, 1, 3, 7, 21, 37, 13, 91, 39, 27, 1021, 2813, 5937, 6645, 3403}},
+{1959, 15, 782, {1, 3, 1, 1, 29, 29, 5, 69, 399, 665, 1407, 3921, 2653, 11753, 18925}},
+{1960, 15, 789, {1, 3, 7, 15, 13, 41, 39, 1, 437, 549, 161, 2315, 5631, 8335, 22661}},
+{1961, 15, 810, {1, 1, 3, 1, 7, 17, 115, 61, 69, 955, 475, 3763, 8035, 927, 17893}},
+{1962, 15, 812, {1, 3, 1, 13, 21, 59, 81, 145, 463, 145, 1941, 2777, 7453, 14229, 11281}},
+{1963, 15, 818, {1, 1, 1, 15, 15, 11, 27, 165, 461, 395, 1645, 3611, 7463, 12379, 26787}},
+{1964, 15, 830, {1, 1, 7, 9, 29, 19, 27, 123, 21, 149, 1643, 4001, 7207, 6769, 4647}},
+{1965, 15, 832, {1, 1, 1, 11, 13, 9, 103, 139, 185, 587, 591, 1113, 2223, 11667, 32671}},
+{1966, 15, 852, {1, 3, 1, 1, 31, 13, 19, 93, 229, 125, 1471, 2369, 3055, 10277, 28563}},
+{1967, 15, 855, {1, 3, 7, 5, 7, 53, 99, 175, 161, 851, 617, 4027, 2357, 11199, 1931}},
+{1968, 15, 859, {1, 3, 5, 11, 3, 31, 111, 179, 237, 845, 539, 1057, 259, 3417, 26637}},
+{1969, 15, 865, {1, 1, 5, 3, 21, 49, 125, 119, 463, 403, 737, 1811, 3941, 13015, 29081}},
+{1970, 15, 877, {1, 3, 5, 13, 5, 29, 69, 251, 313, 357, 663, 1097, 3307, 12845, 28495}},
+{1971, 15, 895, {1, 3, 3, 5, 29, 17, 89, 15, 411, 409, 2013, 757, 4085, 12521, 11131}},
+{1972, 15, 901, {1, 1, 1, 15, 7, 51, 3, 193, 493, 133, 381, 2027, 227, 6635, 12931}},
+{1973, 15, 902, {1, 1, 1, 15, 7, 23, 99, 203, 323, 1007, 1465, 2887, 2215, 1787, 22069}},
+{1974, 15, 906, {1, 1, 5, 9, 29, 59, 77, 151, 509, 313, 415, 3977, 5431, 8019, 8571}},
+{1975, 15, 916, {1, 3, 1, 15, 19, 13, 57, 217, 87, 119, 25, 1149, 5667, 3765, 6959}},
+{1976, 15, 920, {1, 3, 7, 13, 19, 31, 119, 3, 457, 117, 905, 361, 1483, 12405, 27005}},
+{1977, 15, 949, {1, 3, 5, 11, 15, 35, 61, 77, 119, 51, 1753, 2765, 1091, 10573, 23595}},
+{1978, 15, 962, {1, 3, 3, 7, 1, 35, 17, 93, 197, 511, 1253, 3031, 2739, 15127, 15147}},
+{1979, 15, 964, {1, 3, 3, 1, 11, 55, 55, 107, 161, 75, 129, 2195, 2023, 4877, 25797}},
+{1980, 15, 967, {1, 3, 5, 7, 23, 19, 113, 167, 167, 271, 1303, 125, 5057, 1323, 5165}},
+{1981, 15, 981, {1, 1, 5, 3, 21, 31, 11, 119, 215, 483, 1535, 407, 6485, 15401, 30297}},
+{1982, 15, 982, {1, 3, 5, 9, 21, 5, 77, 95, 443, 247, 913, 605, 365, 7465, 19707}},
+{1983, 15, 985, {1, 3, 1, 7, 17, 59, 9, 35, 391, 767, 1493, 475, 4725, 7529, 31579}},
+{1984, 15, 991, {1, 3, 3, 7, 31, 21, 61, 31, 421, 179, 273, 771, 5745, 10575, 32765}},
+{1985, 15, 1007, {1, 3, 5, 15, 27, 13, 125, 55, 423, 1021, 497, 3521, 6903, 15111, 8285}},
+{1986, 15, 1016, {1, 1, 5, 9, 13, 31, 105, 93, 421, 709, 643, 1079, 1533, 9149, 10799}},
+{1987, 15, 1024, {1, 3, 1, 11, 19, 29, 53, 199, 319, 247, 655, 3039, 6411, 12267, 14245}},
+{1988, 15, 1051, {1, 3, 1, 11, 9, 57, 5, 91, 469, 149, 259, 329, 5433, 6941, 15093}},
+{1989, 15, 1060, {1, 3, 1, 5, 5, 51, 59, 25, 455, 367, 1623, 441, 3155, 11695, 20767}},
+{1990, 15, 1070, {1, 3, 7, 7, 11, 49, 113, 95, 91, 389, 605, 1973, 2051, 2315, 22229}},
+{1991, 15, 1072, {1, 3, 5, 3, 19, 11, 99, 135, 433, 781, 1473, 885, 1105, 3573, 3739}},
+{1992, 15, 1084, {1, 3, 1, 11, 3, 25, 9, 227, 433, 723, 317, 139, 6627, 8067, 28439}},
+{1993, 15, 1089, {1, 1, 1, 9, 9, 9, 5, 63, 241, 215, 1991, 2949, 3943, 775, 31511}},
+{1994, 15, 1095, {1, 1, 3, 7, 17, 49, 35, 167, 131, 107, 1295, 2465, 4577, 11147, 29833}},
+{1995, 15, 1114, {1, 1, 5, 1, 5, 25, 119, 129, 391, 743, 1069, 2957, 349, 6891, 13635}},
+{1996, 15, 1123, {1, 3, 1, 7, 9, 31, 63, 253, 215, 51, 1347, 2361, 3125, 13049, 28461}},
+{1997, 15, 1132, {1, 1, 7, 9, 3, 31, 21, 163, 255, 47, 259, 535, 5461, 3349, 30649}},
+{1998, 15, 1154, {1, 3, 3, 13, 17, 33, 87, 47, 243, 709, 929, 3943, 3107, 3421, 13721}},
+{1999, 15, 1156, {1, 3, 5, 11, 25, 61, 61, 173, 397, 735, 2005, 3355, 8121, 11593, 27697}},
+{2000, 15, 1163, {1, 3, 5, 15, 17, 43, 63, 231, 275, 311, 1277, 2669, 7307, 2099, 9755}},
+{2001, 15, 1171, {1, 3, 5, 3, 25, 43, 71, 191, 9, 121, 1873, 3747, 7491, 14055, 24293}},
+{2002, 15, 1202, {1, 3, 5, 13, 17, 35, 113, 113, 385, 941, 39, 2705, 1225, 5167, 1373}},
+{2003, 15, 1228, {1, 3, 5, 5, 7, 35, 19, 105, 487, 71, 139, 627, 4187, 3183, 713}},
+{2004, 15, 1239, {1, 1, 5, 13, 29, 29, 103, 5, 157, 869, 1675, 423, 6689, 10697, 5303}},
+{2005, 15, 1255, {1, 1, 5, 1, 29, 31, 61, 111, 473, 963, 685, 1483, 2383, 8109, 8495}},
+{2006, 15, 1256, {1, 1, 5, 3, 19, 13, 95, 113, 217, 59, 1353, 1647, 3617, 3271, 2321}},
+{2007, 15, 1262, {1, 3, 5, 7, 25, 35, 59, 131, 309, 445, 415, 93, 1453, 8789, 30201}},
+{2008, 15, 1270, {1, 1, 5, 1, 5, 43, 71, 241, 123, 189, 831, 3469, 8093, 6187, 32721}},
+{2009, 15, 1279, {1, 3, 7, 5, 25, 31, 123, 171, 319, 379, 889, 2365, 4881, 12225, 16609}},
+{2010, 15, 1308, {1, 3, 1, 11, 27, 43, 121, 63, 291, 591, 811, 1995, 4777, 2083, 31385}},
+{2011, 15, 1322, {1, 1, 5, 11, 27, 53, 85, 187, 461, 823, 703, 399, 6925, 11517, 28697}},
+{2012, 15, 1329, {1, 1, 3, 5, 13, 11, 33, 121, 93, 717, 1275, 3877, 4247, 5845, 26909}},
+{2013, 15, 1330, {1, 3, 1, 9, 7, 5, 47, 199, 367, 561, 185, 2855, 5997, 2699, 7581}},
+{2014, 15, 1336, {1, 1, 5, 9, 23, 11, 71, 201, 61, 729, 1011, 3529, 663, 1413, 25675}},
+{2015, 15, 1341, {1, 3, 7, 13, 27, 21, 11, 127, 281, 487, 1217, 3129, 5541, 3129, 17783}},
+{2016, 15, 1347, {1, 1, 5, 9, 1, 29, 85, 193, 213, 743, 1473, 611, 391, 9405, 21137}},
+{2017, 15, 1349, {1, 3, 3, 3, 31, 63, 37, 147, 39, 351, 79, 3069, 2441, 8901, 8777}},
+{2018, 15, 1359, {1, 1, 7, 7, 25, 49, 55, 47, 441, 343, 1267, 1123, 5917, 14395, 10579}},
+{2019, 15, 1367, {1, 1, 7, 1, 13, 55, 55, 123, 103, 773, 125, 2145, 4743, 13347, 2589}},
+{2020, 15, 1368, {1, 3, 7, 3, 9, 33, 25, 183, 469, 213, 291, 75, 6725, 6847, 26745}},
+{2021, 15, 1390, {1, 3, 3, 7, 15, 43, 7, 79, 171, 21, 1767, 2537, 4285, 12007, 24039}},
+{2022, 15, 1413, {1, 3, 7, 13, 9, 61, 125, 23, 227, 879, 215, 1635, 2835, 883, 15939}},
+{2023, 15, 1414, {1, 1, 5, 13, 25, 45, 63, 43, 183, 829, 149, 989, 987, 3819, 12181}},
+{2024, 15, 1437, {1, 1, 3, 7, 19, 27, 35, 83, 135, 459, 785, 131, 2655, 3329, 3009}},
+{2025, 15, 1441, {1, 1, 7, 5, 11, 41, 9, 219, 475, 985, 1329, 3787, 1975, 4679, 8627}},
+{2026, 15, 1462, {1, 1, 7, 3, 1, 17, 91, 155, 3, 763, 1879, 233, 215, 2955, 25993}},
+{2027, 15, 1465, {1, 1, 1, 11, 25, 11, 23, 227, 453, 775, 1935, 3833, 4583, 269, 705}},
+{2028, 15, 1480, {1, 3, 3, 11, 7, 25, 105, 21, 449, 555, 1275, 3475, 5503, 15617, 813}},
+{2029, 15, 1486, {1, 3, 7, 13, 31, 37, 25, 255, 233, 663, 1155, 1563, 4775, 7449, 29949}},
+{2030, 15, 1504, {1, 1, 3, 1, 23, 51, 51, 137, 63, 809, 349, 2789, 6953, 10605, 18959}},
+{2031, 15, 1509, {1, 3, 3, 13, 21, 45, 15, 161, 393, 229, 437, 2967, 4019, 3893, 21305}},
+{2032, 15, 1514, {1, 1, 3, 7, 5, 11, 15, 211, 287, 131, 1847, 2569, 7881, 15669, 31037}},
+{2033, 15, 1522, {1, 3, 3, 15, 27, 19, 85, 251, 221, 639, 665, 3729, 5771, 7873, 28005}},
+{2034, 15, 1528, {1, 3, 7, 15, 15, 47, 93, 215, 343, 85, 1401, 1375, 2949, 13661, 25453}},
+{2035, 15, 1552, {1, 1, 1, 9, 7, 51, 53, 217, 471, 389, 551, 1141, 1767, 2237, 17797}},
+{2036, 15, 1555, {1, 1, 7, 9, 3, 29, 65, 29, 223, 591, 1719, 1049, 7643, 3853, 29867}},
+{2037, 15, 1571, {1, 1, 1, 11, 13, 41, 85, 29, 451, 387, 1783, 3733, 8033, 4711, 31643}},
+{2038, 15, 1578, {1, 3, 1, 11, 11, 57, 75, 153, 7, 373, 2011, 271, 469, 3267, 18969}},
+{2039, 15, 1585, {1, 1, 5, 3, 19, 43, 7, 243, 385, 293, 923, 843, 4895, 469, 8421}},
+{2040, 15, 1588, {1, 3, 1, 15, 29, 47, 17, 125, 471, 927, 349, 3859, 3059, 11483, 14791}},
+{2041, 15, 1603, {1, 3, 1, 11, 17, 17, 111, 109, 9, 213, 1313, 3903, 4411, 4329, 28277}},
+{2042, 15, 1609, {1, 3, 3, 15, 1, 55, 47, 69, 143, 789, 1149, 3833, 5053, 6949, 10569}},
+{2043, 15, 1617, {1, 3, 5, 7, 11, 15, 79, 83, 123, 937, 1115, 2775, 3041, 11869, 21167}},
+{2044, 15, 1620, {1, 3, 7, 13, 9, 47, 45, 221, 139, 923, 1661, 1379, 2485, 7233, 6035}},
+{2045, 15, 1629, {1, 1, 3, 3, 11, 55, 77, 3, 87, 693, 1991, 1145, 2783, 16207, 24569}},
+{2046, 15, 1636, {1, 1, 5, 11, 3, 35, 91, 9, 391, 927, 101, 1839, 3755, 10345, 16907}},
+{2047, 15, 1648, {1, 3, 5, 3, 5, 49, 79, 91, 205, 443, 1369, 197, 2537, 11219, 17765}},
+{2048, 15, 1667, {1, 1, 3, 15, 9, 7, 25, 25, 357, 247, 477, 421, 7679, 5987, 30079}},
+{2049, 15, 1669, {1, 1, 5, 3, 29, 5, 89, 117, 481, 491, 371, 389, 7101, 2253, 23617}},
+{2050, 15, 1682, {1, 1, 5, 13, 29, 59, 17, 181, 511, 291, 1991, 3499, 8177, 5559, 30045}},
+{2051, 15, 1697, {1, 3, 3, 11, 23, 31, 117, 217, 241, 115, 749, 945, 1897, 12253, 8473}},
+{2052, 15, 1704, {1, 1, 7, 15, 25, 47, 31, 1, 165, 311, 635, 3629, 1593, 8305, 30033}},
+{2053, 15, 1709, {1, 3, 5, 9, 3, 17, 101, 237, 379, 503, 49, 929, 1687, 3865, 26723}},
+{2054, 15, 1727, {1, 3, 5, 5, 15, 41, 1, 239, 53, 215, 1733, 827, 579, 4089, 6579}},
+{2055, 15, 1730, {1, 3, 1, 15, 15, 21, 35, 21, 403, 257, 1475, 2403, 4705, 11553, 203}},
+{2056, 15, 1732, {1, 3, 5, 11, 9, 53, 113, 9, 447, 511, 543, 3141, 7389, 11249, 431}},
+{2057, 15, 1741, {1, 3, 5, 9, 9, 11, 55, 93, 325, 411, 305, 2573, 6871, 12339, 6435}},
+{2058, 15, 1744, {1, 3, 3, 7, 31, 27, 21, 113, 99, 853, 365, 589, 3731, 10875, 12767}},
+{2059, 15, 1759, {1, 3, 1, 7, 15, 27, 31, 17, 275, 93, 1161, 2619, 1329, 7307, 587}},
+{2060, 15, 1765, {1, 3, 5, 9, 17, 47, 49, 237, 27, 193, 1237, 591, 5151, 5521, 31583}},
+{2061, 15, 1766, {1, 3, 5, 3, 13, 1, 27, 87, 43, 977, 305, 3293, 2475, 14571, 18321}},
+{2062, 15, 1778, {1, 1, 5, 7, 15, 13, 101, 1, 291, 807, 1711, 2277, 5573, 11051, 13133}},
+{2063, 15, 1780, {1, 3, 3, 1, 9, 3, 65, 81, 415, 733, 1527, 2747, 6069, 159, 7095}},
+{2064, 15, 1783, {1, 3, 3, 15, 27, 1, 71, 49, 231, 851, 2039, 613, 1899, 2537, 14511}},
+{2065, 15, 1797, {1, 1, 1, 11, 3, 41, 55, 23, 247, 1011, 581, 2363, 2745, 1337, 20931}},
+{2066, 15, 1807, {1, 1, 3, 11, 17, 61, 67, 255, 143, 357, 945, 3407, 5817, 4155, 23851}},
+{2067, 15, 1821, {1, 3, 5, 3, 23, 1, 75, 247, 265, 413, 1899, 2565, 6629, 15655, 16117}},
+{2068, 15, 1832, {1, 1, 1, 9, 11, 49, 11, 189, 223, 177, 1457, 1931, 163, 15905, 17297}},
+{2069, 15, 1835, {1, 3, 7, 13, 17, 1, 111, 189, 343, 961, 427, 2507, 2393, 8653, 6353}},
+{2070, 15, 1849, {1, 3, 7, 13, 23, 61, 59, 51, 313, 963, 791, 3681, 5637, 3965, 9263}},
+{2071, 15, 1850, {1, 3, 7, 7, 21, 53, 127, 141, 499, 859, 337, 2835, 3195, 4351, 32369}},
+{2072, 15, 1863, {1, 1, 7, 5, 1, 5, 53, 63, 497, 535, 35, 305, 4395, 9757, 13193}},
+{2073, 15, 1867, {1, 1, 5, 13, 13, 31, 59, 229, 211, 745, 1453, 3677, 3005, 7703, 23907}},
+{2074, 15, 1869, {1, 3, 5, 5, 7, 63, 17, 197, 493, 861, 499, 3015, 6349, 1815, 7437}},
+{2075, 15, 1872, {1, 1, 1, 13, 13, 37, 29, 189, 253, 1017, 321, 3145, 407, 7547, 17099}},
+{2076, 15, 1887, {1, 3, 3, 3, 23, 53, 69, 77, 175, 17, 1831, 841, 3851, 1295, 32107}},
+{2077, 15, 1888, {1, 3, 7, 13, 13, 39, 107, 237, 389, 729, 635, 3717, 3041, 3169, 14987}},
+{2078, 15, 1897, {1, 1, 3, 1, 25, 7, 69, 35, 495, 49, 659, 2783, 6051, 13875, 23927}},
+{2079, 15, 1906, {1, 3, 7, 5, 5, 25, 49, 7, 193, 493, 93, 657, 1515, 13975, 14155}},
+{2080, 15, 1917, {1, 3, 1, 1, 11, 15, 113, 45, 21, 595, 731, 3397, 4117, 9711, 16625}},
+{2081, 15, 1927, {1, 3, 3, 9, 19, 19, 59, 7, 105, 579, 599, 2859, 97, 14717, 15361}},
+{2082, 15, 1939, {1, 1, 1, 5, 27, 49, 113, 5, 367, 563, 1397, 2805, 3021, 3111, 20671}},
+{2083, 15, 1941, {1, 3, 3, 15, 27, 51, 99, 167, 109, 365, 1959, 1523, 6959, 14405, 18191}},
+{2084, 15, 1948, {1, 3, 1, 5, 21, 51, 125, 67, 123, 45, 1657, 51, 4825, 14081, 31049}},
+{2085, 15, 1970, {1, 1, 5, 7, 21, 59, 21, 249, 77, 793, 1687, 2561, 2241, 4321, 7477}},
+{2086, 15, 1979, {1, 1, 1, 7, 15, 35, 71, 29, 267, 611, 1813, 1823, 7039, 3299, 9919}},
+{2087, 15, 1982, {1, 3, 7, 11, 21, 59, 109, 213, 371, 785, 659, 1687, 4827, 6017, 19619}},
+{2088, 15, 2002, {1, 1, 3, 11, 27, 17, 1, 55, 367, 939, 333, 127, 5105, 2405, 28139}},
+{2089, 15, 2020, {1, 1, 7, 13, 5, 35, 59, 133, 509, 573, 625, 3857, 7935, 5279, 3727}},
+{2090, 15, 2024, {1, 1, 1, 7, 11, 47, 127, 157, 19, 403, 151, 1143, 7407, 8985, 32521}},
+{2091, 15, 2032, {1, 3, 1, 1, 5, 13, 105, 123, 63, 139, 1569, 1983, 563, 7175, 27705}},
+{2092, 15, 2053, {1, 1, 3, 13, 9, 35, 105, 227, 145, 21, 1369, 57, 393, 2921, 18511}},
+{2093, 15, 2060, {1, 3, 1, 7, 17, 61, 99, 187, 261, 281, 437, 2219, 5999, 1857, 18001}},
+{2094, 15, 2063, {1, 3, 3, 5, 1, 59, 67, 45, 451, 439, 2005, 3607, 3, 7167, 14227}},
+{2095, 15, 2066, {1, 3, 3, 3, 29, 19, 25, 251, 275, 733, 1749, 4021, 871, 3227, 13701}},
+{2096, 15, 2075, {1, 3, 3, 13, 27, 53, 57, 243, 491, 521, 1921, 1037, 5013, 5703, 15261}},
+{2097, 15, 2078, {1, 3, 1, 11, 13, 57, 1, 15, 123, 533, 785, 335, 1423, 14269, 3483}},
+{2098, 15, 2081, {1, 3, 7, 13, 15, 55, 5, 139, 385, 47, 1981, 1291, 7397, 12925, 29445}},
+{2099, 15, 2091, {1, 1, 7, 1, 23, 23, 59, 93, 117, 57, 63, 3047, 4849, 11637, 25311}},
+{2100, 15, 2096, {1, 1, 7, 13, 19, 37, 25, 203, 477, 447, 1345, 3485, 2099, 13347, 11621}},
+{2101, 15, 2102, {1, 1, 7, 3, 11, 23, 81, 17, 41, 735, 1149, 3253, 7665, 8291, 22293}},
+{2102, 15, 2106, {1, 1, 5, 3, 15, 9, 57, 167, 463, 493, 747, 1947, 6471, 1111, 31619}},
+{2103, 15, 2116, {1, 1, 5, 15, 7, 15, 107, 205, 325, 167, 1749, 927, 3589, 6127, 7617}},
+{2104, 15, 2120, {1, 1, 1, 13, 21, 25, 83, 147, 411, 399, 1423, 2279, 3661, 7591, 17429}},
+{2105, 15, 2125, {1, 1, 1, 9, 5, 17, 69, 205, 243, 647, 473, 1717, 1977, 10725, 2913}},
+{2106, 15, 2134, {1, 1, 3, 5, 5, 37, 103, 15, 485, 641, 1761, 3755, 6997, 10985, 11773}},
+{2107, 15, 2178, {1, 1, 5, 13, 9, 51, 87, 195, 97, 807, 1801, 961, 6341, 4307, 29105}},
+{2108, 15, 2180, {1, 3, 1, 13, 9, 35, 83, 61, 387, 817, 951, 3993, 7831, 8479, 23941}},
+{2109, 15, 2187, {1, 1, 7, 11, 19, 47, 75, 37, 91, 337, 953, 1169, 163, 2259, 24713}},
+{2110, 15, 2189, {1, 1, 1, 11, 13, 15, 83, 171, 159, 87, 619, 2973, 2653, 13725, 12499}},
+{2111, 15, 2190, {1, 3, 5, 3, 5, 63, 119, 25, 343, 269, 553, 2183, 959, 3825, 22189}},
+{2112, 15, 2208, {1, 1, 5, 15, 5, 37, 89, 109, 497, 1013, 265, 669, 1859, 2647, 3445}},
+{2113, 15, 2214, {1, 3, 3, 9, 21, 21, 15, 245, 107, 649, 367, 1601, 7279, 15783, 4943}},
+{2114, 15, 2237, {1, 3, 3, 15, 5, 41, 125, 113, 159, 161, 1191, 3491, 3531, 55, 20857}},
+{2115, 15, 2252, {1, 3, 5, 9, 21, 57, 21, 195, 99, 193, 1915, 2923, 6349, 15085, 24929}},
+{2116, 15, 2257, {1, 1, 1, 11, 31, 11, 73, 141, 361, 621, 1021, 2067, 5115, 12665, 26845}},
+{2117, 15, 2260, {1, 1, 1, 3, 29, 11, 43, 61, 209, 923, 1753, 1937, 843, 205, 8367}},
+{2118, 15, 2264, {1, 1, 1, 5, 15, 33, 119, 209, 215, 973, 1775, 815, 6693, 7957, 14517}},
+{2119, 15, 2270, {1, 1, 1, 5, 17, 57, 27, 147, 489, 59, 1439, 2279, 445, 11791, 19739}},
+{2120, 15, 2279, {1, 3, 1, 7, 11, 55, 1, 83, 305, 17, 1909, 405, 2325, 5293, 28559}},
+{2121, 15, 2288, {1, 3, 3, 7, 11, 27, 103, 157, 455, 1005, 2033, 3145, 1919, 15723, 25197}},
+{2122, 15, 2305, {1, 1, 5, 11, 15, 51, 37, 131, 503, 1007, 1795, 2421, 1335, 7413, 21741}},
+{2123, 15, 2312, {1, 1, 3, 1, 23, 63, 69, 83, 419, 283, 583, 123, 7725, 2243, 8403}},
+{2124, 15, 2317, {1, 1, 5, 5, 27, 45, 109, 17, 299, 65, 351, 947, 1165, 10723, 2053}},
+{2125, 15, 2323, {1, 1, 3, 3, 23, 61, 115, 253, 1, 931, 1481, 3187, 441, 14735, 27207}},
+{2126, 15, 2329, {1, 1, 5, 3, 25, 11, 83, 141, 359, 343, 901, 1629, 731, 12841, 14357}},
+{2127, 15, 2335, {1, 1, 3, 9, 7, 45, 97, 3, 299, 217, 663, 1527, 6379, 4527, 26147}},
+{2128, 15, 2342, {1, 1, 7, 9, 11, 53, 9, 203, 337, 713, 1517, 719, 4587, 11443, 26905}},
+{2129, 15, 2345, {1, 1, 7, 9, 11, 41, 125, 213, 237, 377, 361, 3231, 4223, 3263, 12655}},
+{2130, 15, 2365, {1, 3, 7, 7, 7, 33, 99, 19, 117, 273, 985, 107, 3831, 10135, 19423}},
+{2131, 15, 2371, {1, 1, 5, 15, 25, 41, 13, 125, 449, 169, 1149, 4021, 5663, 3077, 19163}},
+{2132, 15, 2378, {1, 3, 5, 9, 25, 57, 47, 103, 269, 51, 1805, 2503, 6687, 8065, 12045}},
+{2133, 15, 2385, {1, 3, 5, 7, 3, 35, 87, 225, 189, 229, 931, 3293, 1347, 1427, 3269}},
+{2134, 15, 2395, {1, 1, 1, 3, 5, 31, 61, 19, 247, 9, 1667, 343, 559, 2703, 3763}},
+{2135, 15, 2404, {1, 3, 5, 15, 31, 19, 57, 187, 109, 121, 1287, 2269, 659, 16235, 1273}},
+{2136, 15, 2414, {1, 1, 1, 3, 5, 47, 59, 243, 255, 97, 1959, 1723, 1347, 3019, 26989}},
+{2137, 15, 2426, {1, 3, 3, 15, 29, 35, 75, 67, 497, 731, 193, 3307, 3579, 12005, 7209}},
+{2138, 15, 2428, {1, 1, 5, 9, 13, 35, 79, 213, 51, 983, 1927, 1793, 5037, 5463, 965}},
+{2139, 15, 2441, {1, 1, 7, 11, 5, 41, 7, 83, 15, 411, 1775, 3515, 6755, 3249, 16425}},
+{2140, 15, 2456, {1, 3, 5, 1, 19, 61, 3, 19, 395, 819, 1331, 179, 5225, 5333, 3601}},
+{2141, 15, 2466, {1, 1, 3, 9, 7, 5, 87, 15, 387, 609, 1465, 277, 987, 8377, 903}},
+{2142, 15, 2468, {1, 1, 1, 3, 15, 11, 123, 107, 355, 333, 285, 1801, 6989, 1549, 25791}},
+{2143, 15, 2475, {1, 1, 7, 13, 27, 13, 73, 111, 481, 227, 1091, 365, 5713, 5087, 27217}},
+{2144, 15, 2489, {1, 3, 3, 15, 1, 55, 95, 213, 377, 405, 139, 1867, 2175, 4217, 28813}},
+{2145, 15, 2495, {1, 3, 5, 11, 21, 43, 109, 155, 181, 901, 1951, 507, 4389, 10815, 3141}},
+{2146, 15, 2497, {1, 1, 1, 15, 17, 11, 43, 215, 501, 19, 259, 3479, 6381, 6927, 31247}},
+{2147, 15, 2510, {1, 3, 5, 15, 19, 61, 75, 41, 391, 95, 865, 1441, 7993, 13979, 24663}},
+{2148, 15, 2512, {1, 3, 1, 3, 21, 15, 115, 213, 1, 645, 777, 1517, 2543, 11223, 3633}},
+{2149, 15, 2522, {1, 3, 5, 3, 9, 57, 39, 211, 407, 65, 1795, 2805, 2799, 8691, 1987}},
+{2150, 15, 2533, {1, 1, 3, 13, 17, 55, 47, 113, 29, 139, 1301, 3303, 1129, 13947, 29821}},
+{2151, 15, 2543, {1, 1, 3, 13, 5, 35, 97, 151, 477, 409, 1397, 3399, 4421, 15929, 6163}},
+{2152, 15, 2551, {1, 3, 1, 9, 21, 51, 99, 133, 149, 763, 623, 173, 4311, 11081, 1095}},
+{2153, 15, 2552, {1, 3, 7, 15, 13, 3, 99, 3, 195, 907, 1335, 1355, 7977, 5773, 32383}},
+{2154, 15, 2557, {1, 1, 3, 9, 17, 43, 43, 217, 475, 917, 1373, 1677, 4871, 9619, 16657}},
+{2155, 15, 2567, {1, 3, 3, 7, 31, 31, 55, 11, 73, 693, 25, 417, 1195, 6225, 32279}},
+{2156, 15, 2581, {1, 3, 5, 9, 21, 57, 127, 149, 79, 379, 1609, 2543, 6473, 16033, 27191}},
+{2157, 15, 2586, {1, 1, 5, 1, 13, 9, 81, 153, 297, 789, 1749, 2819, 3961, 11231, 24927}},
+{2158, 15, 2597, {1, 3, 5, 3, 23, 61, 45, 43, 43, 133, 1481, 1543, 2991, 13739, 10287}},
+{2159, 15, 2601, {1, 1, 3, 9, 25, 43, 31, 177, 337, 193, 1083, 1, 991, 9725, 8379}},
+{2160, 15, 2622, {1, 3, 5, 11, 13, 33, 65, 83, 421, 149, 409, 2443, 7423, 8847, 29599}},
+{2161, 15, 2633, {1, 1, 5, 11, 11, 1, 23, 225, 77, 585, 1505, 2525, 739, 10915, 25733}},
+{2162, 15, 2636, {1, 3, 7, 13, 7, 55, 3, 223, 415, 521, 1865, 2349, 5663, 7455, 16569}},
+{2163, 15, 2642, {1, 1, 7, 13, 1, 45, 121, 49, 463, 99, 1061, 2559, 5087, 13389, 11035}},
+{2164, 15, 2644, {1, 3, 7, 11, 31, 51, 35, 235, 385, 1023, 1771, 2013, 5437, 4877, 22119}},
+{2165, 15, 2653, {1, 3, 3, 11, 21, 3, 11, 119, 81, 737, 1093, 2377, 4055, 1121, 15767}},
+{2166, 15, 2667, {1, 1, 5, 13, 9, 3, 83, 217, 387, 249, 1047, 1861, 4103, 15367, 24545}},
+{2167, 15, 2669, {1, 3, 3, 1, 5, 37, 43, 183, 383, 463, 937, 1165, 1481, 959, 17047}},
+{2168, 15, 2672, {1, 1, 3, 5, 7, 43, 127, 243, 81, 1021, 165, 753, 4711, 12965, 22049}},
+{2169, 15, 2675, {1, 1, 5, 5, 3, 61, 65, 53, 425, 89, 5, 1467, 1395, 9579, 8961}},
+{2170, 15, 2682, {1, 3, 7, 13, 11, 35, 123, 21, 83, 689, 667, 1203, 5959, 15697, 26885}},
+{2171, 15, 2687, {1, 1, 5, 13, 9, 49, 41, 101, 291, 339, 1067, 657, 4453, 1137, 21131}},
+{2172, 15, 2691, {1, 3, 3, 3, 17, 61, 11, 213, 27, 805, 1691, 1057, 6011, 11941, 18883}},
+{2173, 15, 2698, {1, 3, 1, 7, 3, 51, 5, 63, 121, 3, 245, 2631, 3737, 16121, 26803}},
+{2174, 15, 2708, {1, 3, 1, 1, 23, 51, 79, 19, 161, 107, 609, 3489, 3389, 4035, 2427}},
+{2175, 15, 2712, {1, 3, 1, 1, 17, 11, 101, 101, 373, 63, 1641, 285, 1333, 165, 14025}},
+{2176, 15, 2718, {1, 1, 1, 5, 1, 51, 83, 137, 45, 1019, 821, 867, 6055, 10443, 9857}},
+{2177, 15, 2722, {1, 3, 1, 5, 17, 23, 25, 181, 429, 495, 317, 3219, 5963, 13945, 9969}},
+{2178, 15, 2736, {1, 3, 7, 3, 3, 15, 123, 191, 369, 177, 1697, 2113, 3889, 5201, 21839}},
+{2179, 15, 2741, {1, 3, 1, 11, 21, 39, 51, 139, 271, 605, 1007, 3513, 3365, 3781, 6799}},
+{2180, 15, 2756, {1, 1, 7, 5, 13, 19, 47, 165, 249, 405, 255, 1295, 4513, 14395, 5587}},
+{2181, 15, 2765, {1, 1, 3, 7, 5, 17, 99, 1, 393, 31, 621, 797, 6113, 16003, 32043}},
+{2182, 15, 2774, {1, 3, 5, 13, 11, 21, 65, 81, 147, 443, 775, 3671, 7029, 11749, 3339}},
+{2183, 15, 2799, {1, 3, 7, 1, 23, 33, 99, 177, 161, 577, 1729, 617, 3465, 11787, 17577}},
+{2184, 15, 2804, {1, 1, 5, 7, 15, 15, 53, 193, 97, 255, 1223, 545, 5153, 873, 24525}},
+{2185, 15, 2825, {1, 3, 5, 1, 7, 57, 47, 121, 383, 835, 1709, 2363, 4731, 12163, 7001}},
+{2186, 15, 2826, {1, 3, 3, 11, 19, 33, 63, 99, 387, 95, 783, 1009, 6373, 4021, 7685}},
+{2187, 15, 2840, {1, 1, 1, 15, 25, 33, 73, 135, 335, 785, 935, 1927, 5847, 10501, 7719}},
+{2188, 15, 2843, {1, 1, 5, 3, 27, 45, 71, 215, 489, 157, 1189, 2577, 6901, 10219, 3025}},
+{2189, 15, 2846, {1, 1, 7, 7, 21, 3, 97, 225, 101, 159, 293, 2789, 7955, 14829, 1209}},
+{2190, 15, 2849, {1, 3, 1, 5, 23, 41, 83, 63, 361, 195, 1707, 2081, 5363, 6327, 179}},
+{2191, 15, 2867, {1, 1, 3, 1, 21, 51, 59, 67, 175, 363, 825, 2971, 3321, 8837, 11805}},
+{2192, 15, 2876, {1, 3, 7, 1, 19, 3, 15, 21, 429, 675, 1589, 2615, 2575, 1537, 7139}},
+{2193, 15, 2891, {1, 3, 3, 5, 21, 29, 17, 115, 345, 397, 523, 1699, 7043, 11173, 3023}},
+{2194, 15, 2902, {1, 1, 5, 7, 19, 63, 99, 175, 91, 433, 153, 3749, 517, 13667, 7423}},
+{2195, 15, 2912, {1, 3, 7, 3, 25, 23, 53, 149, 65, 551, 1231, 365, 6637, 15137, 16319}},
+{2196, 15, 2917, {1, 3, 7, 13, 5, 45, 11, 151, 323, 31, 1749, 409, 6753, 10503, 14991}},
+{2197, 15, 2927, {1, 3, 7, 3, 5, 21, 29, 117, 321, 341, 1811, 3619, 4337, 12255, 8629}},
+{2198, 15, 2941, {1, 3, 7, 3, 7, 3, 5, 221, 407, 671, 1763, 3669, 2353, 8175, 23489}},
+{2199, 15, 2965, {1, 1, 3, 7, 11, 55, 53, 185, 247, 35, 1823, 513, 1379, 11827, 20069}},
+{2200, 15, 2970, {1, 3, 3, 5, 29, 51, 73, 191, 185, 961, 881, 2019, 5651, 1019, 15587}},
+{2201, 15, 2982, {1, 3, 7, 13, 7, 55, 59, 5, 417, 829, 453, 2339, 587, 13283, 797}},
+{2202, 15, 2993, {1, 3, 7, 3, 11, 41, 75, 85, 65, 149, 1583, 529, 2707, 11479, 7109}},
+{2203, 15, 3018, {1, 3, 7, 9, 13, 57, 37, 243, 91, 613, 665, 171, 1631, 13737, 2377}},
+{2204, 15, 3023, {1, 1, 3, 7, 5, 43, 97, 53, 477, 793, 999, 3647, 2555, 7371, 19295}},
+{2205, 15, 3025, {1, 1, 7, 1, 1, 9, 99, 253, 317, 817, 1559, 2081, 2529, 14611, 15997}},
+{2206, 15, 3026, {1, 3, 3, 1, 5, 41, 57, 121, 387, 441, 709, 1511, 7045, 8409, 13297}},
+{2207, 15, 3028, {1, 1, 1, 13, 29, 57, 63, 183, 327, 473, 1943, 213, 3973, 16289, 2739}},
+{2208, 15, 3032, {1, 3, 7, 9, 25, 15, 75, 185, 335, 881, 1041, 3339, 4471, 6823, 21121}},
+{2209, 15, 3053, {1, 3, 3, 13, 23, 3, 57, 117, 511, 927, 771, 3229, 949, 15487, 11963}},
+{2210, 15, 3054, {1, 1, 3, 7, 27, 19, 55, 207, 331, 705, 1945, 797, 7125, 10493, 16585}},
+{2211, 15, 3065, {1, 3, 1, 1, 29, 7, 91, 93, 459, 93, 1501, 1927, 6415, 16255, 9823}},
+{2212, 15, 3071, {1, 1, 5, 5, 31, 11, 97, 179, 505, 807, 877, 4003, 4377, 8851, 4239}},
+{2213, 15, 3076, {1, 1, 3, 5, 11, 25, 17, 131, 23, 95, 311, 1429, 2029, 13091, 23739}},
+{2214, 15, 3088, {1, 1, 3, 11, 13, 27, 33, 127, 481, 117, 1127, 1619, 6493, 8507, 6615}},
+{2215, 15, 3107, {1, 3, 1, 13, 19, 27, 89, 101, 27, 235, 1579, 1701, 4421, 16037, 16239}},
+{2216, 15, 3146, {1, 3, 1, 15, 1, 15, 3, 117, 317, 475, 1691, 2423, 5519, 1703, 2969}},
+{2217, 15, 3148, {1, 1, 3, 1, 13, 15, 19, 37, 237, 467, 1321, 453, 2169, 13313, 31499}},
+{2218, 15, 3159, {1, 1, 3, 15, 29, 55, 31, 199, 85, 285, 967, 367, 3941, 151, 20587}},
+{2219, 15, 3165, {1, 3, 7, 15, 7, 13, 31, 35, 117, 543, 1179, 3441, 3039, 11225, 30229}},
+{2220, 15, 3170, {1, 1, 3, 15, 3, 43, 1, 63, 353, 395, 1775, 3493, 5175, 13193, 25343}},
+{2221, 15, 3179, {1, 3, 3, 15, 17, 25, 57, 205, 411, 83, 1877, 2093, 5599, 12115, 8751}},
+{2222, 15, 3182, {1, 1, 1, 11, 15, 9, 115, 99, 85, 887, 987, 4015, 7077, 3739, 21505}},
+{2223, 15, 3205, {1, 3, 1, 11, 25, 39, 127, 37, 329, 273, 1531, 3211, 7115, 15501, 26575}},
+{2224, 15, 3212, {1, 1, 5, 13, 15, 3, 3, 101, 431, 645, 493, 723, 8083, 1423, 14879}},
+{2225, 15, 3218, {1, 3, 3, 5, 31, 35, 37, 131, 259, 849, 325, 3403, 3627, 3295, 30885}},
+{2226, 15, 3220, {1, 3, 7, 1, 9, 3, 31, 201, 379, 907, 1005, 3333, 7457, 2533, 30357}},
+{2227, 15, 3223, {1, 3, 1, 9, 7, 7, 95, 103, 121, 157, 895, 2683, 5839, 12403, 14327}},
+{2228, 15, 3227, {1, 3, 7, 3, 13, 5, 55, 233, 3, 855, 859, 1115, 3883, 8041, 3353}},
+{2229, 15, 3233, {1, 1, 5, 9, 3, 55, 99, 79, 263, 831, 1579, 205, 5673, 1999, 14879}},
+{2230, 15, 3234, {1, 3, 1, 5, 17, 25, 85, 19, 189, 141, 877, 667, 4461, 11915, 23247}},
+{2231, 15, 3254, {1, 1, 5, 5, 1, 35, 15, 219, 469, 725, 1793, 3683, 3661, 15627, 30197}},
+{2232, 15, 3263, {1, 1, 7, 5, 27, 3, 41, 153, 431, 487, 759, 1345, 6735, 9937, 26277}},
+{2233, 15, 3268, {1, 1, 1, 11, 11, 13, 41, 121, 265, 465, 1447, 5, 3407, 1907, 10037}},
+{2234, 15, 3272, {1, 3, 5, 9, 15, 63, 5, 7, 407, 83, 365, 3687, 7721, 6973, 16967}},
+{2235, 15, 3277, {1, 1, 7, 7, 5, 41, 75, 155, 417, 565, 1199, 1111, 2823, 10703, 22561}},
+{2236, 15, 3292, {1, 3, 7, 5, 7, 43, 39, 185, 105, 327, 1977, 1137, 3261, 10583, 11661}},
+{2237, 15, 3295, {1, 3, 7, 7, 19, 19, 103, 137, 169, 273, 1357, 3413, 7647, 10531, 32489}},
+{2238, 15, 3296, {1, 1, 3, 13, 13, 3, 81, 23, 161, 295, 735, 2031, 1027, 15513, 20165}},
+{2239, 15, 3301, {1, 1, 5, 1, 15, 1, 91, 35, 375, 207, 1417, 1115, 2237, 11749, 8509}},
+{2240, 15, 3306, {1, 3, 7, 3, 25, 51, 49, 219, 195, 417, 1523, 3953, 5739, 7499, 27071}},
+{2241, 15, 3313, {1, 1, 3, 11, 23, 29, 19, 81, 421, 633, 513, 547, 7545, 29, 11909}},
+{2242, 15, 3346, {1, 1, 1, 7, 13, 61, 33, 243, 221, 231, 111, 879, 2861, 1795, 27531}},
+{2243, 15, 3367, {1, 3, 7, 3, 19, 21, 1, 141, 159, 605, 969, 3013, 6583, 2447, 19919}},
+{2244, 15, 3371, {1, 3, 7, 3, 31, 9, 91, 83, 29, 873, 929, 43, 2253, 12539, 23951}},
+{2245, 15, 3373, {1, 1, 5, 3, 31, 15, 87, 105, 319, 973, 1489, 3417, 3377, 15749, 2357}},
+{2246, 15, 3374, {1, 1, 3, 15, 7, 23, 3, 81, 383, 419, 713, 997, 6873, 593, 285}},
+{2247, 15, 3376, {1, 3, 3, 1, 29, 13, 29, 101, 441, 693, 2039, 2951, 5921, 12129, 12053}},
+{2248, 15, 3382, {1, 1, 3, 15, 9, 29, 97, 117, 421, 433, 1017, 125, 3607, 9415, 6843}},
+{2249, 15, 3388, {1, 3, 5, 9, 11, 13, 75, 155, 413, 75, 109, 1599, 6161, 16115, 12621}},
+{2250, 15, 3391, {1, 3, 3, 3, 11, 13, 49, 225, 401, 599, 1815, 1643, 7853, 13305, 25195}},
+{2251, 15, 3403, {1, 3, 7, 5, 15, 11, 27, 95, 387, 931, 549, 2179, 3397, 15883, 16563}},
+{2252, 15, 3406, {1, 1, 7, 3, 9, 39, 121, 5, 453, 27, 1747, 657, 2593, 1289, 12577}},
+{2253, 15, 3413, {1, 3, 7, 5, 25, 25, 109, 49, 185, 985, 631, 803, 3865, 8955, 17901}},
+{2254, 15, 3420, {1, 1, 3, 13, 3, 59, 47, 49, 139, 275, 1471, 2995, 5593, 14011, 18741}},
+{2255, 15, 3427, {1, 1, 5, 15, 29, 11, 97, 225, 245, 291, 1873, 2365, 767, 3419, 14943}},
+{2256, 15, 3441, {1, 3, 3, 5, 15, 17, 19, 209, 359, 891, 1375, 2003, 7247, 5299, 28841}},
+{2257, 15, 3453, {1, 3, 7, 7, 9, 55, 105, 35, 77, 47, 1023, 13, 2901, 847, 10265}},
+{2258, 15, 3464, {1, 3, 7, 7, 7, 5, 65, 233, 141, 277, 1333, 2357, 443, 7257, 21979}},
+{2259, 15, 3469, {1, 3, 5, 11, 13, 63, 41, 87, 193, 737, 1085, 2317, 7869, 10149, 12163}},
+{2260, 15, 3481, {1, 3, 1, 1, 7, 57, 75, 235, 461, 857, 155, 2679, 5925, 2565, 10881}},
+{2261, 15, 3488, {1, 1, 7, 15, 13, 41, 63, 135, 433, 387, 1943, 2249, 5469, 11679, 28661}},
+{2262, 15, 3497, {1, 3, 3, 13, 5, 3, 103, 161, 367, 649, 789, 1179, 4163, 5699, 16787}},
+{2263, 15, 3503, {1, 3, 7, 7, 31, 13, 45, 141, 113, 769, 1035, 457, 6709, 14989, 27311}},
+{2264, 15, 3511, {1, 1, 3, 1, 1, 43, 119, 145, 111, 593, 1139, 417, 637, 4437, 17285}},
+{2265, 15, 3515, {1, 3, 5, 9, 9, 33, 19, 99, 201, 685, 1793, 2621, 6857, 8769, 5623}},
+{2266, 15, 3525, {1, 3, 5, 5, 23, 43, 27, 189, 325, 415, 215, 1253, 3599, 1215, 10093}},
+{2267, 15, 3529, {1, 1, 3, 13, 11, 35, 113, 173, 503, 19, 1459, 503, 5363, 3967, 13945}},
+{2268, 15, 3547, {1, 1, 5, 11, 31, 49, 13, 173, 199, 623, 1231, 2495, 6581, 7957, 25321}},
+{2269, 15, 3550, {1, 3, 1, 9, 23, 3, 79, 149, 505, 937, 1839, 3701, 1673, 8589, 8031}},
+{2270, 15, 3573, {1, 3, 3, 5, 21, 27, 107, 11, 505, 407, 177, 3593, 4729, 12773, 11685}},
+{2271, 15, 3583, {1, 3, 1, 11, 29, 49, 79, 53, 61, 895, 2035, 563, 5613, 6065, 6207}},
+{2272, 15, 3594, {1, 1, 3, 7, 1, 53, 3, 215, 99, 865, 1749, 3533, 4305, 1243, 28463}},
+{2273, 15, 3607, {1, 1, 1, 13, 31, 59, 115, 53, 403, 909, 847, 103, 4967, 10623, 30073}},
+{2274, 15, 3613, {1, 1, 7, 5, 27, 1, 119, 83, 457, 81, 395, 811, 6221, 14337, 541}},
+{2275, 15, 3624, {1, 1, 5, 5, 5, 53, 83, 117, 269, 327, 875, 101, 3343, 715, 26339}},
+{2276, 15, 3630, {1, 1, 1, 11, 31, 39, 121, 147, 305, 383, 1211, 1897, 7647, 11687, 18907}},
+{2277, 15, 3635, {1, 3, 3, 15, 23, 53, 17, 85, 395, 503, 61, 1745, 4713, 4641, 13787}},
+{2278, 15, 3642, {1, 1, 7, 7, 27, 1, 105, 29, 287, 37, 959, 975, 4427, 4705, 10175}},
+{2279, 15, 3644, {1, 3, 3, 5, 7, 63, 57, 199, 27, 107, 1095, 3923, 6969, 713, 11619}},
+{2280, 15, 3650, {1, 3, 5, 1, 5, 49, 85, 45, 449, 45, 49, 3419, 1109, 455, 15917}},
+{2281, 15, 3679, {1, 1, 1, 5, 13, 15, 39, 27, 467, 85, 1537, 3055, 1977, 8829, 25231}},
+{2282, 15, 3690, {1, 1, 1, 15, 1, 47, 23, 121, 147, 547, 1865, 1491, 779, 3515, 12667}},
+{2283, 15, 3698, {1, 3, 3, 1, 19, 5, 77, 101, 1, 721, 1149, 2967, 4925, 11889, 16655}},
+{2284, 15, 3704, {1, 1, 1, 7, 1, 35, 95, 239, 127, 855, 1031, 455, 7631, 6039, 21983}},
+{2285, 15, 3707, {1, 3, 7, 9, 23, 43, 75, 105, 335, 223, 1825, 3217, 413, 7473, 30005}},
+{2286, 15, 3713, {1, 1, 5, 15, 29, 9, 43, 145, 223, 523, 511, 323, 5955, 11141, 22533}},
+{2287, 15, 3754, {1, 1, 3, 1, 13, 61, 93, 133, 461, 233, 383, 693, 7347, 3165, 27493}},
+{2288, 15, 3756, {1, 3, 7, 1, 13, 45, 113, 207, 53, 1007, 815, 1145, 2937, 289, 22195}},
+{2289, 15, 3761, {1, 3, 5, 5, 19, 17, 113, 89, 19, 1023, 1625, 3277, 697, 5187, 15433}},
+{2290, 15, 3776, {1, 1, 3, 13, 21, 15, 15, 197, 409, 391, 1993, 2475, 3189, 4431, 29585}},
+{2291, 15, 3781, {1, 1, 5, 5, 31, 7, 111, 231, 187, 543, 45, 3863, 3811, 4573, 4437}},
+{2292, 15, 3788, {1, 3, 3, 7, 19, 7, 123, 23, 79, 513, 189, 3663, 1291, 13257, 8949}},
+{2293, 15, 3791, {1, 1, 5, 13, 3, 53, 109, 133, 157, 223, 651, 3059, 6055, 14455, 26903}},
+{2294, 15, 3794, {1, 1, 7, 1, 23, 63, 59, 229, 17, 199, 643, 637, 7631, 13647, 7399}},
+{2295, 15, 3806, {1, 1, 1, 3, 1, 51, 119, 67, 335, 543, 913, 3565, 4795, 13405, 7463}},
+{2296, 15, 3841, {1, 1, 5, 3, 31, 5, 91, 97, 23, 223, 837, 1353, 1929, 12043, 10039}},
+{2297, 15, 3848, {1, 3, 5, 7, 19, 3, 79, 171, 301, 687, 1545, 355, 4709, 12965, 16797}},
+{2298, 15, 3851, {1, 3, 5, 11, 11, 49, 111, 123, 251, 569, 1605, 401, 5439, 13519, 8847}},
+{2299, 15, 3856, {1, 3, 1, 3, 3, 53, 7, 55, 369, 633, 181, 4037, 2993, 15815, 8661}},
+{2300, 15, 3868, {1, 1, 1, 13, 31, 29, 75, 167, 279, 597, 539, 1791, 8013, 4387, 9717}},
+{2301, 15, 3875, {1, 1, 5, 7, 17, 15, 99, 183, 211, 49, 225, 3143, 4537, 13141, 23375}},
+{2302, 15, 3882, {1, 1, 3, 5, 3, 59, 25, 149, 467, 69, 1939, 1007, 2765, 4693, 29815}},
+{2303, 15, 3884, {1, 3, 1, 3, 17, 33, 119, 189, 447, 251, 879, 177, 5395, 13487, 9587}},
+{2304, 15, 3889, {1, 3, 3, 7, 15, 31, 115, 3, 21, 817, 475, 1849, 6041, 12541, 18701}},
+{2305, 15, 3892, {1, 1, 5, 13, 31, 33, 7, 115, 361, 587, 1919, 1007, 3537, 7493, 19357}},
+{2306, 15, 3919, {1, 3, 7, 13, 23, 35, 15, 111, 123, 633, 805, 1983, 2109, 14477, 4985}},
+{2307, 15, 3921, {1, 3, 3, 11, 25, 13, 11, 205, 97, 893, 927, 1291, 4007, 13593, 29693}},
+{2308, 15, 3958, {1, 3, 5, 15, 9, 13, 121, 89, 215, 823, 1389, 1581, 8095, 4707, 16061}},
+{2309, 15, 3961, {1, 3, 1, 3, 23, 39, 83, 23, 47, 941, 1419, 2389, 5699, 7519, 5829}},
+{2310, 15, 3973, {1, 3, 1, 9, 23, 43, 79, 237, 93, 203, 695, 225, 5645, 3591, 16775}},
+{2311, 15, 3977, {1, 3, 5, 3, 15, 19, 89, 129, 375, 125, 225, 1323, 2267, 11607, 17937}},
+{2312, 15, 3985, {1, 3, 3, 1, 31, 37, 93, 133, 377, 959, 707, 621, 7179, 15493, 30287}},
+{2313, 15, 3991, {1, 3, 7, 13, 5, 13, 15, 1, 37, 525, 1641, 2829, 6139, 4069, 19187}},
+{2314, 15, 4004, {1, 3, 3, 9, 17, 3, 67, 97, 375, 845, 403, 973, 3919, 2275, 31627}},
+{2315, 15, 4007, {1, 1, 3, 3, 25, 7, 91, 67, 271, 465, 481, 3477, 5229, 241, 8411}},
+{2316, 15, 4019, {1, 1, 1, 11, 1, 41, 109, 115, 75, 787, 309, 2887, 179, 9073, 13895}},
+{2317, 15, 4045, {1, 3, 3, 15, 11, 31, 113, 91, 303, 907, 1933, 2167, 7799, 11821, 20659}},
+{2318, 15, 4054, {1, 3, 1, 15, 27, 17, 21, 41, 99, 137, 1397, 929, 5819, 11977, 6201}},
+{2319, 15, 4057, {1, 1, 7, 13, 21, 29, 47, 239, 287, 305, 899, 2711, 1723, 3315, 199}},
+{2320, 15, 4058, {1, 1, 1, 3, 31, 21, 101, 149, 107, 761, 1197, 1703, 4803, 8411, 10649}},
+{2321, 15, 4070, {1, 1, 5, 15, 23, 45, 109, 221, 85, 619, 169, 1013, 3305, 9451, 26189}},
+{2322, 15, 4101, {1, 3, 5, 13, 7, 57, 19, 153, 231, 627, 565, 1595, 6309, 5037, 25505}},
+{2323, 15, 4113, {1, 1, 7, 7, 1, 45, 43, 79, 271, 59, 219, 2255, 1785, 7919, 24061}},
+{2324, 15, 4114, {1, 3, 7, 5, 31, 57, 57, 231, 33, 227, 531, 679, 1141, 85, 19777}},
+{2325, 15, 4119, {1, 1, 3, 15, 11, 59, 59, 169, 459, 693, 907, 1191, 3783, 12809, 6263}},
+{2326, 15, 4129, {1, 1, 7, 13, 19, 21, 105, 65, 267, 141, 1547, 781, 7295, 13565, 17775}},
+{2327, 15, 4141, {1, 3, 3, 5, 31, 63, 97, 155, 477, 661, 329, 797, 2539, 4061, 10537}},
+{2328, 15, 4142, {1, 3, 3, 7, 11, 17, 119, 89, 71, 103, 1043, 413, 6035, 12829, 11559}},
+{2329, 15, 4147, {1, 3, 1, 9, 5, 19, 53, 185, 103, 629, 2015, 1257, 5163, 10581, 13449}},
+{2330, 15, 4149, {1, 1, 1, 5, 23, 35, 25, 129, 179, 959, 677, 2249, 6315, 12151, 3459}},
+{2331, 15, 4150, {1, 1, 1, 1, 9, 47, 93, 45, 35, 45, 265, 2065, 6225, 25, 27135}},
+{2332, 15, 4164, {1, 3, 1, 11, 21, 53, 127, 163, 311, 667, 597, 1561, 4515, 23, 9551}},
+{2333, 15, 4168, {1, 1, 3, 3, 7, 47, 105, 211, 241, 95, 389, 899, 6001, 8129, 19889}},
+{2334, 15, 4186, {1, 1, 3, 15, 29, 45, 9, 27, 483, 799, 269, 1811, 4493, 7109, 22149}},
+{2335, 15, 4198, {1, 1, 3, 3, 29, 5, 57, 205, 187, 615, 1677, 3987, 4577, 8799, 16311}},
+{2336, 15, 4207, {1, 1, 5, 3, 15, 5, 91, 101, 319, 445, 1261, 2039, 4071, 8249, 11611}},
+{2337, 15, 4221, {1, 3, 7, 11, 19, 17, 1, 185, 153, 579, 1001, 2031, 2295, 16335, 24771}},
+{2338, 15, 4225, {1, 3, 3, 15, 13, 45, 93, 185, 319, 667, 1085, 93, 577, 11551, 11355}},
+{2339, 15, 4231, {1, 1, 7, 13, 3, 61, 45, 191, 51, 981, 1151, 2715, 2503, 4147, 4587}},
+{2340, 15, 4238, {1, 1, 3, 3, 27, 17, 71, 141, 57, 981, 1033, 333, 4639, 15885, 1039}},
+{2341, 15, 4243, {1, 3, 3, 15, 21, 55, 33, 123, 357, 893, 829, 4045, 5027, 11727, 13357}},
+{2342, 15, 4249, {1, 1, 1, 9, 31, 47, 27, 223, 311, 205, 179, 3411, 4019, 10997, 28115}},
+{2343, 15, 4250, {1, 3, 5, 1, 3, 39, 15, 7, 501, 641, 735, 295, 2005, 12641, 19779}},
+{2344, 15, 4252, {1, 3, 3, 1, 15, 1, 75, 243, 329, 267, 1323, 2285, 5389, 11881, 15737}},
+{2345, 15, 4259, {1, 1, 3, 3, 13, 17, 101, 99, 209, 939, 1147, 3221, 5159, 3435, 183}},
+{2346, 15, 4279, {1, 1, 1, 1, 27, 43, 29, 179, 179, 659, 807, 313, 4165, 963, 11317}},
+{2347, 15, 4285, {1, 1, 3, 13, 9, 51, 125, 245, 381, 555, 1383, 3887, 2045, 12829, 12029}},
+{2348, 15, 4288, {1, 1, 1, 9, 29, 39, 55, 127, 235, 617, 1553, 3133, 7735, 14725, 16733}},
+{2349, 15, 4303, {1, 1, 3, 5, 15, 9, 47, 217, 89, 987, 1083, 1045, 4745, 12915, 13719}},
+{2350, 15, 4312, {1, 3, 3, 7, 23, 3, 35, 79, 45, 435, 1549, 2645, 2831, 10359, 10041}},
+{2351, 15, 4322, {1, 1, 7, 15, 31, 61, 25, 223, 511, 319, 487, 1677, 739, 7097, 18417}},
+{2352, 15, 4327, {1, 1, 7, 5, 19, 21, 123, 237, 299, 367, 1341, 1449, 2949, 8629, 11051}},
+{2353, 15, 4336, {1, 3, 7, 7, 31, 53, 125, 33, 257, 719, 1297, 895, 5095, 10237, 12309}},
+{2354, 15, 4359, {1, 3, 1, 5, 31, 59, 73, 211, 97, 209, 1289, 4033, 6143, 14275, 7997}},
+{2355, 15, 4384, {1, 1, 5, 7, 31, 5, 75, 105, 389, 985, 9, 4033, 1185, 7821, 19083}},
+{2356, 15, 4387, {1, 1, 1, 15, 11, 39, 73, 253, 275, 813, 25, 3441, 2493, 5873, 3739}},
+{2357, 15, 4401, {1, 3, 7, 1, 31, 19, 119, 5, 109, 397, 1329, 3347, 5941, 12449, 2533}},
+{2358, 15, 4407, {1, 1, 1, 1, 5, 59, 61, 175, 435, 985, 65, 3781, 5425, 15073, 16361}},
+{2359, 15, 4428, {1, 3, 5, 7, 31, 13, 53, 87, 69, 305, 1455, 273, 2197, 4277, 24423}},
+{2360, 15, 4436, {1, 3, 3, 15, 13, 13, 91, 171, 71, 583, 15, 3599, 6801, 10041, 26097}},
+{2361, 15, 4450, {1, 3, 3, 5, 5, 13, 91, 225, 63, 69, 1795, 341, 461, 5015, 9471}},
+{2362, 15, 4452, {1, 3, 7, 5, 21, 55, 109, 39, 459, 925, 229, 2855, 5807, 2117, 31739}},
+{2363, 15, 4459, {1, 1, 3, 3, 1, 5, 17, 177, 401, 727, 1555, 3097, 1243, 5933, 14579}},
+{2364, 15, 4461, {1, 1, 7, 3, 19, 19, 37, 87, 105, 73, 197, 4067, 6237, 10553, 9207}},
+{2365, 15, 4470, {1, 1, 3, 15, 1, 55, 119, 115, 441, 3, 1003, 1631, 197, 12929, 25385}},
+{2366, 15, 4483, {1, 3, 7, 11, 31, 1, 119, 49, 467, 647, 685, 2771, 3689, 11049, 26787}},
+{2367, 15, 4485, {1, 1, 1, 11, 19, 19, 21, 73, 459, 935, 615, 371, 1099, 14407, 10375}},
+{2368, 15, 4486, {1, 3, 5, 13, 15, 3, 107, 179, 259, 677, 1101, 315, 7673, 14639, 11241}},
+{2369, 15, 4492, {1, 1, 7, 9, 15, 21, 93, 25, 349, 23, 1087, 27, 5691, 12997, 29301}},
+{2370, 15, 4497, {1, 3, 3, 5, 7, 43, 1, 195, 69, 753, 1315, 2629, 3259, 5595, 19439}},
+{2371, 15, 4514, {1, 3, 5, 5, 31, 9, 75, 217, 217, 197, 1925, 2033, 3585, 15219, 20251}},
+{2372, 15, 4533, {1, 1, 5, 11, 17, 31, 3, 209, 315, 49, 949, 2267, 4611, 4375, 16431}},
+{2373, 15, 4537, {1, 1, 7, 9, 17, 35, 13, 115, 119, 553, 1527, 2857, 3599, 391, 25101}},
+{2374, 15, 4546, {1, 3, 3, 15, 13, 59, 17, 177, 301, 719, 909, 1663, 5033, 1129, 529}},
+{2375, 15, 4551, {1, 1, 7, 5, 15, 13, 99, 157, 379, 975, 1019, 2251, 3807, 10621, 351}},
+{2376, 15, 4555, {1, 3, 3, 13, 5, 57, 5, 31, 361, 981, 883, 3723, 2259, 5151, 11783}},
+{2377, 15, 4560, {1, 1, 1, 13, 1, 43, 125, 19, 77, 509, 1817, 3795, 1863, 8401, 27253}},
+{2378, 15, 4569, {1, 1, 5, 7, 19, 41, 21, 151, 89, 189, 769, 1937, 4497, 13607, 24691}},
+{2379, 15, 4576, {1, 1, 1, 9, 21, 9, 1, 195, 31, 907, 1719, 1549, 809, 13629, 16597}},
+{2380, 15, 4582, {1, 1, 1, 3, 21, 61, 103, 219, 311, 849, 523, 21, 4533, 6367, 3935}},
+{2381, 15, 4586, {1, 1, 7, 9, 7, 33, 77, 19, 489, 933, 1729, 1813, 6741, 10701, 7}},
+{2382, 15, 4609, {1, 1, 1, 5, 23, 53, 43, 63, 453, 209, 1313, 2847, 2641, 13783, 14983}},
+{2383, 15, 4610, {1, 3, 7, 7, 15, 45, 83, 241, 509, 659, 213, 221, 5205, 6019, 18945}},
+{2384, 15, 4612, {1, 1, 5, 9, 25, 43, 37, 9, 191, 505, 765, 295, 953, 1045, 11203}},
+{2385, 15, 4649, {1, 3, 7, 11, 5, 49, 45, 177, 379, 695, 355, 1711, 7747, 497, 7597}},
+{2386, 15, 4652, {1, 1, 5, 13, 23, 47, 101, 145, 301, 207, 195, 2225, 8093, 15345, 14097}},
+{2387, 15, 4672, {1, 3, 7, 13, 9, 9, 55, 223, 343, 921, 1825, 3281, 2627, 855, 27651}},
+{2388, 15, 4677, {1, 1, 7, 1, 21, 1, 67, 149, 433, 111, 577, 3675, 495, 9043, 23613}},
+{2389, 15, 4684, {1, 3, 1, 13, 9, 39, 37, 73, 117, 559, 1131, 2511, 7599, 8393, 24747}},
+{2390, 15, 4690, {1, 3, 3, 7, 11, 15, 85, 229, 7, 21, 1649, 739, 375, 13991, 27053}},
+{2391, 15, 4695, {1, 1, 5, 5, 15, 41, 49, 117, 173, 825, 1343, 377, 1789, 12519, 30667}},
+{2392, 15, 4696, {1, 1, 7, 15, 9, 11, 97, 99, 347, 729, 9, 1703, 1177, 5189, 9061}},
+{2393, 15, 4702, {1, 1, 5, 11, 15, 25, 99, 63, 89, 675, 561, 215, 8111, 3955, 24635}},
+{2394, 15, 4705, {1, 1, 1, 1, 7, 53, 99, 193, 233, 731, 733, 1883, 7783, 14413, 14003}},
+{2395, 15, 4717, {1, 3, 5, 7, 31, 23, 45, 153, 337, 293, 443, 2301, 5135, 7455, 13123}},
+{2396, 15, 4726, {1, 3, 1, 3, 23, 53, 23, 165, 53, 875, 1543, 1035, 4247, 5101, 28445}},
+{2397, 15, 4736, {1, 1, 1, 15, 13, 41, 77, 93, 205, 743, 1101, 1413, 2371, 7183, 12337}},
+{2398, 15, 4753, {1, 1, 3, 15, 17, 63, 25, 101, 147, 149, 1207, 3525, 2661, 9539, 11145}},
+{2399, 15, 4754, {1, 3, 1, 9, 17, 5, 3, 35, 389, 909, 1017, 2803, 5243, 13025, 8851}},
+{2400, 15, 4756, {1, 1, 7, 15, 19, 27, 69, 91, 71, 547, 1421, 831, 6969, 5517, 28233}},
+{2401, 15, 4775, {1, 1, 3, 3, 17, 45, 55, 63, 263, 819, 1211, 2739, 655, 13269, 22281}},
+{2402, 15, 4801, {1, 3, 1, 5, 23, 13, 81, 251, 83, 551, 491, 1029, 3561, 357, 23393}},
+{2403, 15, 4819, {1, 3, 1, 13, 25, 27, 93, 143, 407, 403, 1395, 1733, 3187, 1917, 31453}},
+{2404, 15, 4828, {1, 1, 7, 13, 3, 21, 85, 113, 483, 461, 1343, 561, 2081, 10857, 24253}},
+{2405, 15, 4838, {1, 1, 1, 1, 11, 11, 53, 135, 25, 163, 1729, 617, 1533, 10881, 16041}},
+{2406, 15, 4852, {1, 1, 5, 1, 3, 49, 125, 139, 77, 891, 815, 3431, 4875, 12513, 4595}},
+{2407, 15, 4856, {1, 1, 1, 1, 27, 63, 111, 109, 421, 425, 345, 1613, 5447, 1357, 32413}},
+{2408, 15, 4873, {1, 3, 5, 3, 17, 5, 37, 171, 259, 281, 1003, 2901, 3241, 15557, 21415}},
+{2409, 15, 4887, {1, 1, 5, 11, 15, 55, 75, 199, 493, 215, 1625, 2345, 7873, 2325, 11003}},
+{2410, 15, 4891, {1, 3, 7, 1, 21, 33, 23, 5, 495, 941, 1185, 475, 5799, 15161, 10677}},
+{2411, 15, 4904, {1, 1, 5, 9, 31, 37, 37, 29, 217, 389, 297, 3097, 7319, 2601, 15307}},
+{2412, 15, 4912, {1, 3, 7, 5, 7, 45, 111, 167, 297, 275, 1669, 2489, 1511, 15753, 1289}},
+{2413, 15, 4921, {1, 3, 1, 7, 3, 45, 19, 11, 189, 199, 1227, 2647, 1897, 9077, 17189}},
+{2414, 15, 4936, {1, 1, 1, 13, 15, 39, 19, 179, 147, 341, 283, 3029, 7599, 8937, 18761}},
+{2415, 15, 4941, {1, 3, 3, 9, 3, 11, 41, 255, 365, 835, 921, 389, 919, 15223, 14541}},
+{2416, 15, 4942, {1, 1, 3, 3, 5, 37, 29, 203, 313, 271, 1207, 487, 3711, 3811, 26757}},
+{2417, 15, 4963, {1, 3, 7, 9, 19, 53, 49, 139, 351, 537, 1681, 1595, 5399, 13839, 28685}},
+{2418, 15, 4984, {1, 3, 1, 1, 15, 35, 21, 37, 247, 891, 1855, 1243, 3137, 10381, 30379}},
+{2419, 15, 4990, {1, 3, 7, 5, 9, 47, 91, 25, 479, 337, 781, 3545, 1045, 9491, 22853}},
+{2420, 15, 5005, {1, 1, 5, 15, 19, 31, 81, 5, 117, 923, 565, 2443, 7383, 1795, 11685}},
+{2421, 15, 5013, {1, 3, 3, 5, 17, 15, 21, 245, 489, 889, 2047, 2737, 7445, 14785, 13401}},
+{2422, 15, 5020, {1, 1, 1, 15, 19, 45, 67, 117, 299, 607, 953, 743, 6863, 12123, 6701}},
+{2423, 15, 5039, {1, 1, 3, 1, 1, 43, 19, 129, 345, 861, 209, 2387, 7205, 7131, 8235}},
+{2424, 15, 5048, {1, 3, 5, 1, 1, 13, 75, 99, 333, 157, 23, 1217, 1857, 15479, 16031}},
+{2425, 15, 5062, {1, 3, 3, 11, 7, 61, 119, 89, 491, 401, 227, 1739, 3807, 16003, 2875}},
+{2426, 15, 5080, {1, 3, 7, 15, 13, 55, 3, 159, 405, 593, 975, 361, 2563, 6061, 28087}},
+{2427, 15, 5085, {1, 1, 3, 13, 19, 5, 5, 9, 119, 41, 33, 1111, 4443, 4663, 28841}},
+{2428, 15, 5086, {1, 1, 7, 7, 25, 59, 125, 255, 49, 947, 1673, 2947, 6369, 2267, 8813}},
+{2429, 15, 5095, {1, 1, 5, 15, 25, 25, 111, 193, 217, 193, 821, 2779, 69, 2957, 27043}},
+{2430, 15, 5096, {1, 3, 5, 7, 21, 19, 51, 157, 203, 487, 1745, 1875, 911, 14071, 7557}},
+{2431, 15, 5102, {1, 1, 5, 9, 3, 15, 55, 73, 313, 245, 1061, 1929, 3035, 607, 11563}},
+{2432, 15, 5107, {1, 1, 5, 7, 3, 57, 105, 121, 461, 43, 803, 1801, 4059, 2157, 17547}},
+{2433, 15, 5141, {1, 3, 7, 7, 19, 11, 1, 121, 499, 841, 601, 3515, 2969, 13697, 8917}},
+{2434, 15, 5145, {1, 3, 3, 3, 13, 35, 113, 231, 391, 689, 697, 2871, 7387, 715, 27005}},
+{2435, 15, 5148, {1, 1, 1, 13, 19, 5, 17, 43, 175, 291, 987, 1917, 7635, 15655, 10689}},
+{2436, 15, 5157, {1, 1, 7, 15, 19, 37, 121, 243, 125, 623, 1231, 29, 2325, 5147, 21435}},
+{2437, 15, 5158, {1, 3, 5, 15, 25, 27, 57, 187, 77, 401, 1489, 2977, 5415, 3381, 2551}},
+{2438, 15, 5162, {1, 1, 1, 7, 1, 1, 85, 27, 115, 559, 9, 2365, 711, 5733, 2819}},
+{2439, 15, 5172, {1, 3, 1, 15, 9, 29, 61, 113, 169, 349, 591, 1061, 6041, 7613, 23691}},
+{2440, 15, 5182, {1, 1, 5, 1, 13, 45, 49, 227, 345, 563, 87, 3597, 3961, 7205, 8441}},
+{2441, 15, 5184, {1, 1, 1, 5, 3, 21, 121, 183, 463, 83, 1365, 539, 1485, 10063, 24867}},
+{2442, 15, 5193, {1, 3, 5, 5, 3, 61, 101, 237, 41, 147, 1907, 3049, 7583, 8283, 6099}},
+{2443, 15, 5199, {1, 3, 1, 15, 31, 57, 19, 155, 445, 805, 1793, 207, 1975, 3357, 14281}},
+{2444, 15, 5201, {1, 1, 7, 13, 9, 39, 27, 73, 165, 345, 543, 4095, 133, 10469, 11573}},
+{2445, 15, 5204, {1, 1, 7, 15, 17, 57, 99, 81, 359, 367, 1057, 1173, 4225, 15127, 2615}},
+{2446, 15, 5211, {1, 3, 5, 3, 31, 23, 113, 111, 495, 947, 1625, 1195, 2053, 1509, 1347}},
+{2447, 15, 5223, {1, 1, 5, 5, 9, 47, 25, 63, 455, 107, 771, 3815, 3827, 16287, 11615}},
+{2448, 15, 5230, {1, 1, 7, 9, 17, 61, 51, 215, 63, 123, 1253, 3927, 721, 9647, 3283}},
+{2449, 15, 5232, {1, 1, 5, 15, 11, 17, 83, 255, 473, 107, 681, 763, 7855, 8043, 31503}},
+{2450, 15, 5253, {1, 3, 1, 7, 7, 31, 37, 5, 253, 155, 2017, 609, 1421, 14927, 25241}},
+{2451, 15, 5257, {1, 3, 3, 13, 31, 25, 21, 241, 431, 193, 681, 2265, 5091, 11479, 21443}},
+{2452, 15, 5260, {1, 3, 5, 5, 15, 9, 49, 255, 157, 995, 631, 1995, 3605, 9085, 24245}},
+{2453, 15, 5284, {1, 3, 3, 7, 19, 31, 85, 153, 493, 951, 451, 1587, 6609, 3681, 13205}},
+{2454, 15, 5306, {1, 1, 5, 1, 17, 41, 107, 231, 307, 361, 575, 3239, 3443, 16159, 20625}},
+{2455, 15, 5331, {1, 1, 7, 9, 31, 49, 93, 79, 181, 117, 1241, 3645, 4901, 12599, 13247}},
+{2456, 15, 5334, {1, 3, 3, 9, 7, 31, 127, 201, 11, 199, 1851, 23, 5667, 8159, 20951}},
+{2457, 15, 5364, {1, 3, 3, 7, 3, 37, 29, 189, 65, 461, 769, 321, 6577, 16223, 16865}},
+{2458, 15, 5367, {1, 1, 5, 11, 1, 13, 91, 167, 33, 111, 1445, 1047, 2479, 12623, 22893}},
+{2459, 15, 5371, {1, 1, 3, 1, 3, 1, 47, 185, 329, 903, 1651, 3005, 907, 1255, 8303}},
+{2460, 15, 5382, {1, 3, 5, 13, 19, 31, 5, 233, 265, 769, 1303, 2503, 2229, 14019, 20257}},
+{2461, 15, 5386, {1, 3, 7, 3, 27, 11, 67, 195, 5, 661, 125, 3761, 7211, 16043, 7267}},
+{2462, 15, 5399, {1, 1, 1, 3, 27, 13, 115, 25, 473, 417, 1751, 2223, 2099, 5913, 14273}},
+{2463, 15, 5400, {1, 3, 7, 15, 13, 53, 99, 115, 225, 737, 1621, 539, 4131, 471, 31865}},
+{2464, 15, 5409, {1, 1, 5, 5, 25, 19, 39, 207, 153, 569, 1755, 2477, 3065, 7383, 29919}},
+{2465, 15, 5415, {1, 3, 5, 11, 13, 59, 33, 3, 435, 273, 701, 3819, 7291, 11803, 26111}},
+{2466, 15, 5416, {1, 1, 3, 9, 29, 19, 71, 59, 93, 1019, 887, 83, 4675, 7541, 26821}},
+{2467, 15, 5424, {1, 3, 1, 3, 21, 53, 71, 73, 43, 321, 1581, 1399, 4043, 12995, 16825}},
+{2468, 15, 5436, {1, 3, 7, 15, 3, 13, 37, 11, 93, 873, 1193, 3481, 451, 15869, 17879}},
+{2469, 15, 5454, {1, 3, 1, 11, 31, 19, 101, 57, 129, 753, 853, 463, 6757, 11083, 8667}},
+{2470, 15, 5462, {1, 3, 5, 15, 25, 41, 25, 197, 235, 609, 905, 993, 3233, 1935, 24661}},
+{2471, 15, 5468, {1, 3, 1, 5, 21, 7, 53, 107, 473, 77, 1135, 1045, 4933, 5615, 15931}},
+{2472, 15, 5481, {1, 3, 7, 11, 3, 9, 105, 183, 151, 527, 425, 975, 4073, 913, 2793}},
+{2473, 15, 5505, {1, 1, 7, 13, 19, 61, 81, 9, 413, 851, 1723, 1113, 1453, 8635, 3353}},
+{2474, 15, 5511, {1, 3, 7, 15, 19, 53, 83, 31, 441, 343, 575, 935, 4543, 1303, 12567}},
+{2475, 15, 5518, {1, 1, 1, 5, 29, 19, 119, 75, 3, 591, 845, 649, 1717, 13695, 26905}},
+{2476, 15, 5530, {1, 1, 7, 9, 5, 53, 127, 191, 15, 773, 1433, 2899, 21, 4977, 17839}},
+{2477, 15, 5532, {1, 1, 5, 9, 21, 9, 99, 115, 397, 99, 725, 3835, 973, 1219, 21159}},
+{2478, 15, 5539, {1, 3, 5, 3, 7, 39, 29, 93, 303, 913, 981, 3549, 5225, 10907, 393}},
+{2479, 15, 5553, {1, 3, 3, 11, 9, 25, 105, 101, 1, 867, 389, 2241, 773, 14123, 10015}},
+{2480, 15, 5573, {1, 1, 5, 1, 1, 37, 117, 213, 391, 779, 1851, 1485, 1277, 5607, 819}},
+{2481, 15, 5580, {1, 3, 7, 1, 3, 5, 43, 47, 483, 367, 749, 1693, 4961, 15257, 3775}},
+{2482, 15, 5597, {1, 3, 3, 1, 27, 11, 21, 83, 437, 379, 1041, 393, 5611, 2421, 31739}},
+{2483, 15, 5602, {1, 3, 5, 7, 19, 1, 79, 63, 53, 201, 1159, 2501, 6327, 11317, 9537}},
+{2484, 15, 5608, {1, 3, 5, 13, 9, 37, 61, 217, 427, 913, 1311, 3503, 5473, 10583, 19723}},
+{2485, 15, 5611, {1, 1, 3, 9, 11, 29, 121, 175, 141, 515, 925, 837, 6011, 10419, 32157}},
+{2486, 15, 5613, {1, 3, 5, 9, 27, 57, 97, 175, 365, 367, 1737, 3845, 1257, 12243, 2201}},
+{2487, 15, 5625, {1, 3, 3, 9, 23, 1, 53, 123, 127, 333, 1335, 707, 5747, 6541, 9809}},
+{2488, 15, 5632, {1, 3, 1, 9, 17, 37, 101, 41, 91, 61, 433, 979, 4345, 12351, 10829}},
+{2489, 15, 5635, {1, 3, 3, 13, 3, 21, 15, 49, 257, 99, 1793, 2987, 5233, 11625, 28069}},
+{2490, 15, 5638, {1, 1, 7, 11, 21, 13, 89, 11, 135, 153, 783, 2893, 6815, 12007, 15605}},
+{2491, 15, 5652, {1, 3, 7, 13, 5, 61, 73, 5, 269, 699, 925, 2925, 5919, 5841, 24875}},
+{2492, 15, 5659, {1, 3, 5, 5, 25, 45, 43, 93, 15, 927, 1253, 319, 1173, 14559, 20221}},
+{2493, 15, 5677, {1, 1, 3, 3, 27, 45, 9, 103, 447, 627, 1239, 3869, 2169, 49, 17917}},
+{2494, 15, 5686, {1, 3, 7, 7, 11, 9, 1, 1, 1, 527, 825, 3295, 623, 2095, 10537}},
+{2495, 15, 5689, {1, 3, 3, 11, 21, 11, 59, 165, 33, 743, 1461, 1535, 6393, 1301, 17823}},
+{2496, 15, 5698, {1, 1, 7, 3, 19, 43, 47, 245, 469, 551, 1447, 1963, 169, 1481, 31925}},
+{2497, 15, 5703, {1, 1, 3, 1, 11, 21, 51, 7, 251, 199, 1153, 767, 6417, 3417, 30171}},
+{2498, 15, 5707, {1, 3, 7, 1, 31, 5, 41, 103, 447, 263, 211, 2029, 8021, 4705, 10579}},
+{2499, 15, 5731, {1, 1, 3, 5, 17, 25, 55, 75, 393, 107, 2017, 2389, 1685, 14021, 9161}},
+{2500, 15, 5738, {1, 1, 1, 9, 13, 1, 75, 237, 205, 461, 689, 2531, 2839, 13925, 23351}},
+{2501, 15, 5743, {1, 3, 7, 1, 23, 39, 33, 189, 157, 571, 239, 1053, 1559, 1685, 23059}},
+{2502, 15, 5748, {1, 3, 3, 3, 27, 61, 71, 121, 49, 157, 1341, 1707, 2417, 11689, 26507}},
+{2503, 15, 5758, {1, 3, 7, 7, 19, 63, 47, 53, 95, 791, 1467, 1273, 2045, 755, 8555}},
+{2504, 15, 5762, {1, 1, 3, 15, 27, 33, 21, 253, 317, 153, 1509, 1765, 3809, 601, 5907}},
+{2505, 15, 5768, {1, 3, 5, 15, 11, 17, 97, 91, 165, 199, 1751, 2135, 1315, 3077, 29995}},
+{2506, 15, 5773, {1, 3, 1, 5, 3, 33, 93, 49, 39, 743, 341, 2549, 7603, 3369, 30889}},
+{2507, 15, 5776, {1, 1, 3, 13, 3, 5, 87, 63, 293, 785, 1591, 675, 3915, 2209, 18201}},
+{2508, 15, 5815, {1, 3, 3, 11, 3, 15, 69, 231, 241, 127, 429, 2201, 8173, 12549, 25745}},
+{2509, 15, 5841, {1, 1, 5, 11, 15, 39, 3, 29, 125, 685, 643, 1385, 829, 7347, 28793}},
+{2510, 15, 5847, {1, 1, 7, 15, 27, 15, 59, 237, 299, 773, 1097, 3875, 6503, 7129, 28495}},
+{2511, 15, 5860, {1, 3, 5, 13, 9, 17, 31, 227, 69, 443, 1633, 525, 1659, 14681, 15209}},
+{2512, 15, 5870, {1, 3, 5, 5, 13, 51, 69, 173, 111, 433, 279, 2145, 2091, 9741, 24881}},
+{2513, 15, 5875, {1, 3, 1, 7, 7, 35, 55, 51, 357, 99, 1789, 333, 2073, 10151, 14527}},
+{2514, 15, 5877, {1, 3, 3, 7, 13, 41, 101, 87, 425, 701, 1143, 2733, 6473, 8667, 17419}},
+{2515, 15, 5884, {1, 1, 5, 5, 25, 29, 63, 31, 385, 537, 563, 607, 6723, 9251, 6531}},
+{2516, 15, 5892, {1, 3, 5, 5, 9, 63, 111, 131, 239, 723, 705, 2805, 6579, 12691, 17521}},
+{2517, 15, 5902, {1, 3, 1, 7, 31, 55, 101, 225, 477, 271, 611, 3179, 7859, 9835, 2165}},
+{2518, 15, 5910, {1, 1, 3, 3, 5, 15, 81, 127, 391, 333, 419, 1091, 5997, 12315, 31521}},
+{2519, 15, 5916, {1, 3, 5, 15, 23, 7, 35, 109, 181, 295, 825, 419, 969, 15753, 9365}},
+{2520, 15, 5919, {1, 3, 5, 5, 25, 23, 69, 177, 325, 359, 1577, 619, 6233, 11753, 8103}},
+{2521, 15, 5935, {1, 3, 5, 11, 31, 13, 79, 61, 241, 1011, 1961, 949, 6211, 497, 7099}},
+{2522, 15, 5937, {1, 3, 5, 3, 25, 19, 67, 235, 337, 1015, 1485, 355, 3653, 12735, 14503}},
+{2523, 15, 5944, {1, 3, 5, 7, 31, 23, 35, 231, 147, 15, 263, 1995, 431, 5941, 18931}},
+{2524, 15, 5947, {1, 3, 3, 7, 1, 35, 37, 7, 85, 443, 715, 743, 2189, 12537, 17427}},
+{2525, 15, 5958, {1, 1, 3, 1, 7, 41, 1, 209, 121, 929, 661, 3999, 955, 5123, 31115}},
+{2526, 15, 5962, {1, 1, 3, 5, 11, 43, 127, 125, 107, 293, 273, 2071, 3003, 11631, 7769}},
+{2527, 15, 5969, {1, 1, 1, 13, 13, 29, 39, 217, 111, 779, 1287, 1675, 4201, 4869, 20403}},
+{2528, 15, 5981, {1, 1, 3, 15, 25, 53, 25, 135, 389, 925, 1971, 663, 7545, 2673, 7725}},
+{2529, 15, 5995, {1, 1, 5, 13, 3, 59, 97, 91, 357, 45, 947, 3031, 8095, 6269, 13975}},
+{2530, 15, 5998, {1, 1, 5, 15, 25, 31, 1, 171, 375, 939, 507, 3591, 1089, 13605, 2813}},
+{2531, 15, 6003, {1, 1, 3, 7, 25, 21, 41, 131, 147, 737, 9, 1603, 1859, 11573, 28397}},
+{2532, 15, 6010, {1, 3, 3, 9, 21, 9, 59, 27, 169, 875, 711, 1389, 2899, 7937, 4173}},
+{2533, 15, 6016, {1, 1, 5, 9, 13, 29, 71, 39, 51, 337, 1067, 2661, 1203, 5967, 19249}},
+{2534, 15, 6025, {1, 3, 7, 1, 17, 21, 43, 79, 181, 741, 1901, 3445, 7171, 2109, 1589}},
+{2535, 15, 6031, {1, 1, 3, 9, 23, 37, 105, 51, 227, 775, 1265, 2987, 2197, 13903, 28891}},
+{2536, 15, 6036, {1, 1, 1, 13, 23, 47, 111, 41, 93, 261, 75, 2155, 4301, 11517, 16101}},
+{2537, 15, 6039, {1, 1, 3, 3, 27, 27, 123, 125, 501, 775, 413, 1065, 7607, 15065, 26013}},
+{2538, 15, 6045, {1, 3, 7, 3, 27, 11, 59, 87, 207, 743, 1765, 2969, 913, 8101, 11583}},
+{2539, 15, 6049, {1, 3, 3, 1, 23, 7, 113, 17, 285, 993, 695, 2399, 5019, 4779, 28917}},
+{2540, 15, 6052, {1, 3, 1, 5, 11, 51, 49, 139, 213, 435, 1475, 2209, 6695, 12981, 9851}},
+{2541, 15, 6067, {1, 3, 5, 7, 1, 63, 31, 151, 173, 767, 1453, 1497, 6911, 9597, 25551}},
+{2542, 15, 6074, {1, 1, 7, 7, 21, 53, 39, 159, 389, 231, 309, 359, 7701, 14819, 5175}},
+{2543, 15, 6087, {1, 1, 1, 1, 11, 47, 83, 29, 247, 89, 369, 2727, 3103, 14421, 17369}},
+{2544, 15, 6101, {1, 3, 1, 5, 25, 25, 111, 245, 239, 755, 113, 1765, 3583, 917, 403}},
+{2545, 15, 6121, {1, 3, 3, 3, 5, 59, 85, 151, 463, 591, 743, 3767, 121, 2927, 11031}},
+{2546, 15, 6129, {1, 3, 5, 9, 11, 39, 77, 161, 275, 233, 1991, 2683, 6545, 2423, 32113}},
+{2547, 15, 6142, {1, 3, 5, 11, 5, 57, 13, 229, 329, 757, 1863, 3959, 4243, 7265, 15599}},
+{2548, 15, 6151, {1, 1, 1, 1, 1, 23, 19, 67, 453, 593, 2011, 1813, 4695, 8903, 9623}},
+{2549, 15, 6157, {1, 3, 3, 7, 1, 29, 103, 255, 493, 647, 1709, 4065, 4199, 949, 28829}},
+{2550, 15, 6166, {1, 1, 7, 9, 3, 55, 53, 33, 5, 223, 423, 3347, 7647, 7211, 25157}},
+{2551, 15, 6170, {1, 3, 5, 13, 3, 43, 79, 255, 471, 573, 1007, 2119, 6731, 10047, 23179}},
+{2552, 15, 6175, {1, 1, 1, 3, 7, 39, 55, 61, 53, 377, 435, 401, 3307, 12621, 14299}},
+{2553, 15, 6186, {1, 3, 3, 7, 21, 31, 67, 17, 243, 425, 747, 2995, 1389, 2557, 18415}},
+{2554, 15, 6203, {1, 3, 1, 3, 3, 39, 75, 11, 447, 249, 1135, 1011, 1657, 10767, 19501}},
+{2555, 15, 6217, {1, 3, 1, 11, 17, 51, 117, 129, 17, 143, 785, 103, 5049, 14703, 28479}},
+{2556, 15, 6231, {1, 3, 7, 5, 13, 17, 75, 255, 75, 661, 1175, 477, 1811, 1479, 15783}},
+{2557, 15, 6241, {1, 3, 7, 9, 11, 57, 101, 77, 431, 247, 997, 3657, 5117, 6815, 3841}},
+{2558, 15, 6242, {1, 1, 5, 1, 17, 21, 101, 183, 209, 69, 299, 1585, 6381, 12983, 10053}},
+{2559, 15, 6248, {1, 1, 7, 3, 5, 13, 21, 63, 83, 857, 749, 1251, 5363, 9629, 16563}},
+{2560, 15, 6256, {1, 3, 3, 9, 3, 59, 9, 45, 55, 489, 137, 2423, 2661, 12111, 4375}},
+{2561, 15, 6265, {1, 1, 5, 9, 23, 9, 41, 177, 447, 671, 1631, 3115, 4215, 14435, 8743}},
+{2562, 15, 6275, {1, 3, 7, 11, 19, 23, 15, 221, 413, 783, 1247, 2343, 4397, 3145, 32043}},
+{2563, 15, 6277, {1, 3, 3, 1, 31, 55, 31, 87, 333, 849, 1777, 343, 5199, 1507, 11621}},
+{2564, 15, 6302, {1, 3, 7, 3, 17, 57, 63, 63, 111, 977, 631, 3019, 2953, 14273, 29209}},
+{2565, 15, 6315, {1, 3, 1, 13, 9, 39, 87, 15, 397, 185, 701, 1487, 3807, 13727, 19883}},
+{2566, 15, 6318, {1, 3, 7, 1, 17, 57, 57, 157, 119, 181, 899, 353, 3603, 15041, 7421}},
+{2567, 15, 6330, {1, 1, 7, 3, 29, 13, 29, 191, 105, 373, 961, 1991, 5531, 6793, 29497}},
+{2568, 15, 6343, {1, 3, 3, 11, 7, 61, 65, 39, 215, 187, 191, 1651, 2481, 3951, 24965}},
+{2569, 15, 6347, {1, 1, 7, 5, 25, 11, 105, 23, 257, 771, 1359, 2837, 7821, 12223, 28033}},
+{2570, 15, 6350, {1, 3, 5, 11, 3, 3, 23, 139, 407, 885, 1679, 2979, 8149, 14281, 12487}},
+{2571, 15, 6352, {1, 3, 7, 3, 21, 45, 13, 85, 249, 1015, 2023, 1429, 965, 7091, 31721}},
+{2572, 15, 6371, {1, 1, 1, 13, 19, 5, 119, 47, 91, 285, 211, 2607, 4287, 9197, 455}},
+{2573, 15, 6383, {1, 3, 1, 1, 9, 59, 25, 137, 121, 287, 577, 3325, 2365, 8823, 5033}},
+{2574, 15, 6386, {1, 3, 3, 13, 25, 63, 99, 43, 15, 855, 245, 3189, 59, 5181, 21299}},
+{2575, 15, 6405, {1, 3, 5, 11, 7, 9, 41, 157, 359, 773, 1347, 2049, 4589, 13731, 32133}},
+{2576, 15, 6409, {1, 1, 7, 11, 31, 37, 83, 105, 183, 375, 79, 1821, 1989, 15199, 22207}},
+{2577, 15, 6410, {1, 1, 5, 3, 23, 37, 127, 9, 467, 651, 993, 69, 6943, 4093, 20871}},
+{2578, 15, 6433, {1, 1, 3, 15, 31, 49, 123, 149, 211, 371, 1825, 3011, 485, 1251, 17343}},
+{2579, 15, 6436, {1, 1, 1, 15, 11, 33, 127, 251, 89, 317, 1869, 219, 2275, 14201, 27063}},
+{2580, 15, 6439, {1, 1, 5, 5, 19, 5, 81, 35, 233, 95, 9, 863, 725, 11095, 16217}},
+{2581, 15, 6463, {1, 1, 1, 15, 23, 47, 51, 43, 169, 637, 865, 57, 1509, 1683, 7587}},
+{2582, 15, 6468, {1, 3, 1, 3, 7, 7, 117, 187, 273, 303, 717, 3091, 2083, 3315, 647}},
+{2583, 15, 6477, {1, 1, 5, 15, 13, 27, 23, 227, 145, 547, 1783, 987, 6895, 7135, 11023}},
+{2584, 15, 6496, {1, 1, 5, 11, 21, 39, 57, 203, 477, 17, 985, 1729, 4297, 7483, 13263}},
+{2585, 15, 6511, {1, 3, 7, 9, 3, 49, 71, 45, 143, 967, 39, 583, 2123, 5165, 17437}},
+{2586, 15, 6516, {1, 1, 1, 9, 21, 51, 71, 163, 441, 709, 397, 445, 6167, 7753, 11513}},
+{2587, 15, 6519, {1, 1, 7, 7, 27, 35, 5, 181, 449, 53, 621, 3401, 5263, 4557, 9141}},
+{2588, 15, 6523, {1, 1, 5, 7, 7, 37, 83, 111, 485, 881, 465, 3371, 5603, 371, 29393}},
+{2589, 15, 6530, {1, 3, 1, 15, 7, 47, 41, 245, 377, 823, 309, 3929, 2159, 13917, 13365}},
+{2590, 15, 6539, {1, 3, 7, 7, 7, 29, 25, 141, 19, 611, 79, 2689, 109, 12321, 8345}},
+{2591, 15, 6547, {1, 1, 1, 13, 3, 53, 113, 151, 381, 791, 137, 3185, 3567, 211, 597}},
+{2592, 15, 6589, {1, 1, 3, 9, 7, 53, 87, 89, 491, 861, 467, 3763, 2025, 4187, 9637}},
+{2593, 15, 6592, {1, 1, 7, 1, 27, 33, 71, 41, 63, 1011, 741, 1135, 175, 3739, 21493}},
+{2594, 15, 6601, {1, 3, 3, 5, 9, 19, 55, 175, 325, 55, 1193, 1423, 2049, 9633, 17515}},
+{2595, 15, 6610, {1, 1, 3, 1, 27, 55, 69, 103, 401, 707, 825, 399, 6799, 13199, 6295}},
+{2596, 15, 6616, {1, 3, 7, 3, 19, 63, 25, 151, 17, 159, 1673, 615, 6317, 13261, 26267}},
+{2597, 15, 6619, {1, 3, 7, 9, 27, 1, 77, 129, 423, 647, 707, 2579, 3525, 6723, 31615}},
+{2598, 15, 6626, {1, 3, 3, 7, 7, 31, 35, 241, 309, 369, 895, 3683, 4795, 11319, 451}},
+{2599, 15, 6635, {1, 3, 5, 7, 17, 7, 117, 141, 267, 713, 569, 1915, 4369, 7793, 30853}},
+{2600, 15, 6637, {1, 3, 7, 1, 29, 61, 81, 73, 413, 13, 1977, 3229, 5853, 8451, 15539}},
+{2601, 15, 6638, {1, 3, 7, 1, 5, 45, 109, 21, 431, 487, 2019, 2647, 927, 16015, 10711}},
+{2602, 15, 6652, {1, 3, 1, 3, 11, 19, 37, 183, 451, 377, 269, 3993, 3229, 4899, 26561}},
+{2603, 15, 6656, {1, 3, 1, 11, 5, 19, 121, 55, 57, 117, 687, 83, 3047, 1367, 17595}},
+{2604, 15, 6662, {1, 3, 1, 7, 17, 31, 41, 219, 239, 963, 199, 2895, 5599, 7639, 17201}},
+{2605, 15, 6689, {1, 3, 3, 5, 27, 53, 71, 183, 509, 771, 1809, 1539, 2229, 4893, 17115}},
+{2606, 15, 6699, {1, 1, 3, 9, 9, 9, 13, 49, 265, 643, 1929, 859, 497, 9797, 27771}},
+{2607, 15, 6710, {1, 3, 7, 11, 19, 39, 115, 139, 207, 903, 963, 1849, 4403, 6229, 10021}},
+{2608, 15, 6714, {1, 3, 7, 13, 3, 57, 99, 223, 503, 423, 1755, 807, 1885, 213, 18723}},
+{2609, 15, 6719, {1, 3, 7, 15, 11, 15, 111, 193, 243, 599, 593, 3385, 5393, 15073, 17777}},
+{2610, 15, 6739, {1, 1, 5, 3, 19, 63, 121, 207, 99, 435, 1961, 2747, 6405, 3971, 23481}},
+{2611, 15, 6751, {1, 3, 5, 13, 9, 29, 79, 131, 415, 49, 229, 1003, 3263, 12975, 15987}},
+{2612, 15, 6775, {1, 1, 3, 7, 1, 41, 127, 155, 29, 73, 963, 659, 2741, 3465, 2595}},
+{2613, 15, 6779, {1, 1, 3, 5, 23, 23, 93, 233, 113, 521, 427, 1557, 6917, 12953, 22441}},
+{2614, 15, 6788, {1, 1, 5, 13, 5, 25, 85, 191, 387, 69, 955, 243, 4473, 9813, 21711}},
+{2615, 15, 6798, {1, 3, 3, 7, 1, 53, 95, 65, 231, 995, 539, 2103, 5513, 14087, 28655}},
+{2616, 15, 6815, {1, 3, 5, 3, 17, 13, 19, 227, 197, 91, 1437, 1121, 3307, 6903, 3297}},
+{2617, 15, 6819, {1, 1, 5, 11, 31, 29, 109, 171, 257, 783, 861, 9, 4895, 1859, 10909}},
+{2618, 15, 6825, {1, 1, 7, 13, 5, 47, 61, 5, 363, 351, 1525, 823, 2883, 12435, 17629}},
+{2619, 15, 6826, {1, 1, 5, 11, 9, 3, 69, 159, 371, 477, 1223, 1973, 2757, 413, 31223}},
+{2620, 15, 6836, {1, 1, 3, 5, 23, 45, 43, 195, 423, 829, 1673, 1563, 6633, 14775, 21097}},
+{2621, 15, 6843, {1, 1, 3, 3, 13, 9, 107, 209, 49, 609, 1047, 3691, 7483, 4269, 7557}},
+{2622, 15, 6845, {1, 1, 3, 15, 3, 43, 73, 161, 53, 813, 325, 3439, 7009, 8691, 11711}},
+{2623, 15, 6858, {1, 1, 3, 3, 23, 45, 99, 61, 407, 15, 1515, 1557, 953, 8567, 13729}},
+{2624, 15, 6868, {1, 1, 5, 9, 31, 35, 117, 57, 227, 923, 1373, 1811, 3405, 11979, 10149}},
+{2625, 15, 6877, {1, 1, 3, 9, 15, 53, 105, 209, 153, 67, 1477, 667, 3077, 4911, 3871}},
+{2626, 15, 6881, {1, 1, 3, 3, 21, 53, 93, 101, 183, 1023, 3, 3041, 5815, 9043, 5801}},
+{2627, 15, 6891, {1, 3, 3, 5, 17, 49, 127, 161, 321, 869, 1369, 923, 3235, 711, 30007}},
+{2628, 15, 6896, {1, 1, 3, 3, 15, 17, 97, 229, 389, 159, 1075, 2001, 7905, 15191, 14693}},
+{2629, 15, 6899, {1, 1, 5, 11, 5, 5, 121, 173, 95, 173, 1883, 3915, 1439, 9981, 24375}},
+{2630, 15, 6901, {1, 3, 3, 1, 31, 53, 29, 189, 37, 623, 217, 949, 3959, 7189, 25427}},
+{2631, 15, 6908, {1, 3, 5, 9, 21, 45, 101, 23, 355, 729, 797, 2317, 2931, 7433, 29175}},
+{2632, 15, 6914, {1, 3, 7, 1, 1, 63, 63, 155, 237, 865, 1169, 43, 7335, 6445, 7979}},
+{2633, 15, 6916, {1, 3, 7, 7, 11, 51, 37, 199, 503, 991, 319, 3013, 7885, 12837, 32419}},
+{2634, 15, 6923, {1, 3, 7, 7, 27, 31, 101, 243, 37, 811, 1909, 109, 6455, 7903, 11821}},
+{2635, 15, 6925, {1, 1, 3, 13, 23, 21, 89, 99, 243, 605, 1017, 1871, 1101, 12825, 8227}},
+{2636, 15, 6928, {1, 3, 3, 13, 19, 3, 51, 59, 501, 605, 385, 2189, 3229, 7981, 31407}},
+{2637, 15, 6931, {1, 1, 1, 1, 25, 11, 127, 215, 295, 237, 1245, 3657, 7803, 3897, 655}},
+{2638, 15, 6934, {1, 1, 7, 7, 5, 9, 63, 129, 143, 417, 795, 3409, 2847, 5887, 3093}},
+{2639, 15, 6937, {1, 3, 3, 13, 7, 57, 67, 57, 5, 847, 1185, 3349, 4841, 11457, 8857}},
+{2640, 15, 6938, {1, 1, 3, 3, 9, 53, 51, 43, 85, 437, 13, 2543, 3651, 15493, 767}},
+{2641, 15, 6949, {1, 1, 7, 9, 1, 49, 97, 115, 133, 1011, 1399, 2653, 7765, 13999, 12097}},
+{2642, 15, 6956, {1, 1, 5, 1, 3, 27, 123, 107, 389, 401, 1759, 1333, 1371, 5277, 14865}},
+{2643, 15, 6973, {1, 1, 5, 1, 13, 23, 3, 123, 137, 821, 399, 1671, 3095, 3121, 31387}},
+{2644, 15, 6976, {1, 1, 5, 3, 7, 35, 57, 237, 509, 753, 1783, 2815, 6495, 13283, 7091}},
+{2645, 15, 6981, {1, 1, 7, 11, 5, 37, 77, 109, 7, 969, 1087, 3705, 1695, 14223, 28959}},
+{2646, 15, 6988, {1, 3, 1, 11, 25, 5, 25, 163, 179, 185, 671, 1031, 4537, 11601, 9323}},
+{2647, 15, 6999, {1, 1, 3, 7, 17, 25, 49, 221, 183, 619, 1953, 343, 4523, 14883, 6833}},
+{2648, 15, 7016, {1, 3, 7, 5, 27, 19, 59, 153, 11, 807, 513, 3019, 6875, 5307, 8405}},
+{2649, 15, 7027, {1, 1, 1, 13, 25, 41, 21, 109, 321, 135, 497, 1235, 5177, 5167, 18609}},
+{2650, 15, 7029, {1, 1, 7, 5, 21, 53, 25, 197, 411, 503, 1009, 1921, 4305, 2633, 31415}},
+{2651, 15, 7055, {1, 3, 5, 1, 25, 45, 27, 227, 271, 903, 639, 3805, 657, 8683, 29585}},
+{2652, 15, 7058, {1, 1, 5, 3, 9, 49, 37, 35, 351, 491, 851, 2983, 31, 5619, 6919}},
+{2653, 15, 7074, {1, 1, 5, 3, 11, 49, 33, 153, 393, 1017, 1561, 2795, 4435, 12589, 22349}},
+{2654, 15, 7083, {1, 1, 1, 15, 17, 29, 49, 245, 217, 359, 1133, 393, 3317, 415, 16407}},
+{2655, 15, 7093, {1, 1, 3, 5, 3, 9, 95, 63, 319, 319, 1009, 19, 6453, 16279, 6975}},
+{2656, 15, 7100, {1, 1, 5, 9, 3, 25, 67, 95, 369, 237, 285, 2409, 671, 5143, 121}},
+{2657, 15, 7105, {1, 1, 3, 1, 9, 49, 35, 87, 317, 185, 445, 2263, 7923, 10183, 26615}},
+{2658, 15, 7112, {1, 3, 3, 11, 9, 59, 29, 135, 129, 477, 353, 3571, 1057, 16329, 23523}},
+{2659, 15, 7118, {1, 1, 1, 15, 13, 11, 19, 5, 133, 827, 1799, 1893, 1939, 1101, 12147}},
+{2660, 15, 7120, {1, 1, 3, 3, 15, 49, 33, 185, 511, 1013, 41, 3499, 6235, 7643, 16725}},
+{2661, 15, 7129, {1, 1, 5, 11, 27, 45, 89, 157, 63, 137, 2047, 1275, 4995, 625, 6111}},
+{2662, 15, 7166, {1, 3, 7, 11, 3, 1, 121, 1, 341, 33, 1895, 3033, 3929, 10257, 21037}},
+{2663, 15, 7207, {1, 3, 3, 11, 7, 11, 117, 5, 115, 287, 335, 3415, 5397, 15065, 19121}},
+{2664, 15, 7216, {1, 3, 3, 13, 21, 25, 15, 125, 277, 125, 801, 3761, 2623, 11333, 16867}},
+{2665, 15, 7226, {1, 3, 5, 11, 19, 33, 21, 71, 499, 747, 1515, 185, 1759, 14623, 895}},
+{2666, 15, 7234, {1, 3, 7, 1, 29, 35, 9, 203, 277, 299, 1509, 2017, 2897, 14175, 1643}},
+{2667, 15, 7236, {1, 3, 5, 11, 7, 47, 111, 197, 459, 941, 1619, 2119, 2191, 11049, 6811}},
+{2668, 15, 7246, {1, 1, 5, 9, 7, 43, 103, 115, 87, 269, 1235, 77, 5887, 1611, 29041}},
+{2669, 15, 7248, {1, 1, 5, 7, 1, 61, 83, 225, 179, 81, 1145, 2403, 1485, 8967, 20607}},
+{2670, 15, 7254, {1, 3, 3, 1, 25, 47, 27, 157, 359, 803, 1683, 1995, 6445, 13113, 17899}},
+{2671, 15, 7263, {1, 3, 1, 7, 21, 37, 43, 119, 245, 49, 1581, 2275, 3311, 4087, 29765}},
+{2672, 15, 7273, {1, 1, 3, 13, 5, 33, 49, 191, 455, 105, 665, 3855, 3207, 2671, 32203}},
+{2673, 15, 7274, {1, 3, 1, 1, 25, 63, 19, 217, 17, 353, 947, 1951, 4097, 9041, 11921}},
+{2674, 15, 7293, {1, 3, 1, 7, 21, 31, 113, 97, 347, 993, 1799, 3831, 3711, 6193, 1235}},
+{2675, 15, 7297, {1, 1, 1, 5, 3, 63, 11, 203, 425, 445, 1361, 531, 1265, 1755, 11685}},
+{2676, 15, 7310, {1, 3, 1, 7, 13, 29, 23, 85, 57, 467, 1835, 133, 7961, 4175, 2445}},
+{2677, 15, 7315, {1, 1, 1, 15, 23, 27, 37, 5, 123, 913, 1293, 1633, 3113, 5413, 26407}},
+{2678, 15, 7317, {1, 1, 5, 13, 27, 1, 121, 151, 303, 931, 375, 3679, 1863, 12301, 30907}},
+{2679, 15, 7331, {1, 3, 1, 9, 31, 9, 49, 203, 177, 937, 1503, 933, 5867, 12533, 13621}},
+{2680, 15, 7338, {1, 3, 3, 15, 1, 41, 23, 191, 191, 931, 837, 3553, 2611, 4735, 18105}},
+{2681, 15, 7340, {1, 1, 5, 7, 27, 49, 51, 111, 435, 195, 1229, 711, 7145, 14571, 31707}},
+{2682, 15, 7346, {1, 1, 7, 7, 3, 41, 59, 203, 291, 903, 1727, 2757, 1463, 6287, 31535}},
+{2683, 15, 7355, {1, 1, 7, 13, 23, 5, 75, 3, 207, 525, 411, 2133, 2231, 477, 7155}},
+{2684, 15, 7366, {1, 3, 5, 7, 13, 19, 111, 225, 489, 83, 1177, 4077, 4617, 14413, 7133}},
+{2685, 15, 7383, {1, 3, 1, 7, 9, 59, 3, 113, 379, 803, 1289, 3347, 4127, 6669, 14867}},
+{2686, 15, 7389, {1, 3, 7, 3, 31, 37, 87, 79, 399, 749, 995, 1611, 3137, 12543, 31955}},
+{2687, 15, 7393, {1, 1, 5, 7, 21, 59, 49, 45, 511, 639, 1033, 2169, 3265, 15001, 10745}},
+{2688, 15, 7396, {1, 1, 5, 1, 25, 19, 23, 203, 11, 883, 1031, 4087, 5059, 11321, 21675}},
+{2689, 15, 7400, {1, 3, 7, 5, 11, 27, 33, 205, 163, 289, 501, 3505, 1515, 1895, 15889}},
+{2690, 15, 7414, {1, 3, 1, 1, 23, 7, 39, 239, 29, 119, 1499, 2071, 6495, 12107, 5339}},
+{2691, 15, 7417, {1, 3, 1, 1, 23, 29, 55, 181, 327, 905, 427, 1033, 427, 3687, 5367}},
+{2692, 15, 7426, {1, 3, 3, 7, 21, 27, 115, 127, 393, 855, 1291, 2121, 381, 9995, 29757}},
+{2693, 15, 7432, {1, 3, 5, 1, 25, 13, 15, 183, 269, 1005, 1531, 3451, 3975, 9479, 23695}},
+{2694, 15, 7452, {1, 3, 7, 7, 19, 31, 111, 97, 33, 179, 1343, 2069, 977, 5043, 9129}},
+{2695, 15, 7468, {1, 3, 1, 5, 17, 57, 99, 129, 379, 829, 837, 1845, 3613, 7351, 19291}},
+{2696, 15, 7488, {1, 3, 3, 5, 31, 23, 119, 229, 135, 389, 9, 705, 6697, 15441, 5303}},
+{2697, 15, 7491, {1, 1, 1, 11, 25, 31, 105, 95, 5, 931, 789, 375, 7543, 9957, 28627}},
+{2698, 15, 7494, {1, 1, 7, 15, 21, 17, 19, 103, 389, 545, 1725, 2867, 4251, 3829, 6907}},
+{2699, 15, 7497, {1, 3, 7, 7, 15, 37, 97, 65, 337, 409, 1649, 2869, 7929, 8905, 21989}},
+{2700, 15, 7515, {1, 3, 5, 3, 11, 15, 69, 29, 353, 207, 233, 411, 2047, 10303, 31655}},
+{2701, 15, 7531, {1, 3, 3, 7, 27, 43, 125, 107, 69, 981, 215, 1955, 3589, 597, 12703}},
+{2702, 15, 7552, {1, 1, 7, 9, 25, 13, 109, 73, 227, 663, 1115, 285, 471, 3359, 15787}},
+{2703, 15, 7562, {1, 3, 7, 5, 1, 45, 7, 79, 441, 149, 701, 1457, 6595, 14829, 20865}},
+{2704, 15, 7564, {1, 3, 7, 15, 15, 47, 83, 239, 295, 23, 1085, 813, 1209, 3573, 2855}},
+{2705, 15, 7569, {1, 1, 3, 15, 13, 7, 59, 67, 255, 537, 1841, 3857, 6821, 15175, 13997}},
+{2706, 15, 7582, {1, 3, 1, 1, 9, 57, 59, 21, 21, 41, 1693, 2805, 7953, 1389, 14105}},
+{2707, 15, 7585, {1, 3, 5, 15, 19, 49, 107, 117, 99, 607, 145, 53, 1863, 9383, 12029}},
+{2708, 15, 7588, {1, 3, 3, 13, 1, 39, 5, 141, 503, 265, 281, 1785, 2673, 6597, 6333}},
+{2709, 15, 7592, {1, 1, 5, 3, 3, 19, 3, 181, 169, 269, 955, 2399, 3157, 11053, 8563}},
+{2710, 15, 7597, {1, 3, 3, 13, 11, 1, 95, 43, 179, 507, 443, 209, 3239, 14239, 21829}},
+{2711, 15, 7603, {1, 1, 7, 9, 3, 17, 99, 179, 445, 479, 1897, 1507, 5753, 4757, 2135}},
+{2712, 15, 7610, {1, 3, 3, 1, 9, 51, 29, 13, 295, 291, 927, 85, 5707, 7447, 32319}},
+{2713, 15, 7624, {1, 1, 1, 3, 13, 11, 21, 157, 213, 327, 1071, 591, 2639, 15405, 6617}},
+{2714, 15, 7642, {1, 3, 5, 1, 7, 25, 55, 47, 495, 681, 727, 2707, 2955, 705, 7489}},
+{2715, 15, 7647, {1, 1, 3, 9, 17, 3, 73, 67, 465, 367, 1473, 3195, 7825, 5299, 1817}},
+{2716, 15, 7653, {1, 1, 1, 1, 19, 31, 77, 253, 71, 599, 1601, 871, 2243, 6699, 13013}},
+{2717, 15, 7654, {1, 1, 7, 9, 21, 1, 71, 115, 5, 65, 767, 925, 7901, 10761, 19431}},
+{2718, 15, 7666, {1, 3, 1, 7, 23, 31, 31, 15, 105, 391, 585, 2995, 2635, 10607, 24951}},
+{2719, 15, 7668, {1, 3, 3, 1, 19, 25, 71, 211, 41, 197, 787, 225, 6781, 813, 10117}},
+{2720, 15, 7684, {1, 3, 3, 3, 17, 29, 3, 153, 231, 643, 1151, 447, 3699, 9625, 26677}},
+{2721, 15, 7705, {1, 1, 5, 9, 1, 25, 71, 21, 395, 297, 557, 3841, 233, 1877, 4569}},
+{2722, 15, 7732, {1, 1, 3, 13, 1, 45, 115, 61, 5, 937, 173, 2109, 2927, 9599, 9155}},
+{2723, 15, 7741, {1, 1, 3, 3, 15, 21, 61, 121, 253, 285, 1083, 3545, 5537, 6773, 2629}},
+{2724, 15, 7749, {1, 3, 3, 15, 13, 63, 33, 77, 49, 849, 1795, 2771, 5481, 9833, 603}},
+{2725, 15, 7750, {1, 1, 7, 5, 1, 39, 113, 237, 225, 1005, 1687, 2297, 3213, 2605, 14669}},
+{2726, 15, 7759, {1, 1, 3, 1, 11, 1, 39, 23, 67, 441, 1235, 2545, 3139, 15901, 29243}},
+{2727, 15, 7764, {1, 3, 1, 3, 15, 49, 39, 57, 311, 345, 525, 223, 4923, 6311, 25275}},
+{2728, 15, 7777, {1, 1, 5, 7, 9, 13, 69, 11, 349, 423, 1773, 1055, 1001, 9359, 17025}},
+{2729, 15, 7790, {1, 1, 1, 13, 15, 63, 89, 207, 335, 591, 1223, 2701, 55, 12471, 13127}},
+{2730, 15, 7817, {1, 1, 3, 5, 15, 19, 83, 67, 407, 113, 1961, 779, 5803, 12417, 21751}},
+{2731, 15, 7826, {1, 3, 3, 1, 21, 53, 81, 95, 405, 427, 1047, 2443, 4153, 5843, 22511}},
+{2732, 15, 7831, {1, 1, 7, 7, 7, 25, 115, 155, 453, 537, 741, 2379, 2343, 16035, 19587}},
+{2733, 15, 7859, {1, 3, 3, 11, 27, 21, 111, 121, 503, 437, 803, 3399, 5303, 10163, 18199}},
+{2734, 15, 7871, {1, 1, 5, 13, 19, 27, 7, 81, 259, 545, 965, 743, 4533, 8813, 21253}},
+{2735, 15, 7873, {1, 1, 5, 5, 1, 59, 37, 11, 105, 343, 75, 1319, 6317, 9593, 1699}},
+{2736, 15, 7876, {1, 3, 1, 9, 13, 9, 115, 131, 387, 1023, 253, 693, 5191, 12777, 10565}},
+{2737, 15, 7900, {1, 3, 1, 15, 7, 35, 111, 195, 287, 305, 533, 1901, 3363, 10085, 30791}},
+{2738, 15, 7904, {1, 1, 3, 9, 27, 51, 21, 77, 413, 925, 717, 791, 4147, 585, 5649}},
+{2739, 15, 7913, {1, 3, 3, 5, 25, 59, 79, 249, 185, 567, 71, 1997, 7373, 2327, 18637}},
+{2740, 15, 7916, {1, 3, 3, 11, 15, 21, 97, 99, 391, 57, 1973, 29, 7451, 2529, 25737}},
+{2741, 15, 7922, {1, 3, 7, 5, 7, 59, 93, 5, 287, 469, 1639, 3637, 5465, 14431, 32265}},
+{2742, 15, 7946, {1, 1, 3, 11, 3, 1, 71, 75, 427, 299, 811, 3697, 3529, 5433, 26957}},
+{2743, 15, 7953, {1, 3, 1, 9, 19, 59, 37, 255, 165, 1005, 19, 2851, 4309, 455, 9485}},
+{2744, 15, 7956, {1, 1, 1, 5, 1, 55, 15, 233, 133, 47, 1831, 713, 2601, 1017, 3201}},
+{2745, 15, 7963, {1, 1, 5, 5, 21, 55, 127, 69, 377, 41, 25, 2295, 7595, 4733, 11615}},
+{2746, 15, 7979, {1, 1, 5, 3, 23, 5, 7, 181, 161, 775, 1095, 2271, 6637, 14489, 6873}},
+{2747, 15, 7981, {1, 3, 5, 9, 9, 15, 5, 133, 357, 21, 127, 2685, 6299, 4363, 17573}},
+{2748, 15, 7984, {1, 3, 3, 9, 13, 39, 51, 223, 201, 401, 1839, 2461, 7633, 6039, 10445}},
+{2749, 15, 7989, {1, 1, 5, 1, 9, 21, 19, 249, 227, 359, 255, 2895, 4117, 2073, 27687}},
+{2750, 15, 7999, {1, 1, 5, 15, 5, 61, 113, 161, 95, 3, 877, 2775, 293, 6655, 4023}},
+{2751, 15, 8001, {1, 3, 7, 1, 7, 55, 73, 39, 295, 403, 985, 2315, 1667, 13525, 1453}},
+{2752, 15, 8021, {1, 1, 5, 1, 27, 1, 85, 195, 11, 713, 1841, 3895, 3131, 2193, 17607}},
+{2753, 15, 8056, {1, 3, 5, 13, 25, 1, 119, 97, 239, 167, 1393, 1753, 6989, 12155, 12509}},
+{2754, 15, 8080, {1, 1, 7, 15, 31, 21, 41, 255, 425, 445, 165, 2097, 5627, 4971, 13207}},
+{2755, 15, 8083, {1, 1, 1, 15, 13, 33, 81, 105, 453, 197, 13, 1547, 7381, 8709, 15103}},
+{2756, 15, 8089, {1, 1, 3, 11, 11, 33, 107, 123, 483, 367, 121, 995, 1911, 8205, 22577}},
+{2757, 15, 8090, {1, 1, 1, 9, 9, 43, 71, 49, 273, 431, 1705, 3313, 4259, 16291, 14345}},
+{2758, 15, 8114, {1, 1, 1, 7, 3, 1, 43, 213, 97, 547, 1559, 1149, 2791, 3751, 887}},
+{2759, 15, 8128, {1, 1, 3, 15, 25, 47, 49, 251, 425, 35, 295, 3767, 6305, 9633, 5045}},
+{2760, 15, 8133, {1, 3, 3, 1, 5, 55, 91, 245, 27, 981, 331, 555, 6553, 11017, 15289}},
+{2761, 15, 8145, {1, 1, 3, 7, 1, 23, 23, 155, 223, 565, 1005, 3211, 3847, 7479, 3643}},
+{2762, 15, 8155, {1, 1, 5, 1, 17, 7, 47, 95, 35, 779, 1685, 2099, 7505, 15425, 18089}},
+{2763, 15, 8161, {1, 3, 3, 7, 3, 63, 83, 151, 211, 147, 611, 1171, 1681, 7687, 13423}},
+{2764, 15, 8182, {1, 3, 3, 1, 3, 27, 107, 117, 497, 537, 195, 3075, 2753, 1665, 19399}},
+{2765, 15, 8186, {1, 1, 1, 7, 23, 5, 103, 209, 117, 845, 1243, 1283, 4253, 9723, 20937}},
+{2766, 15, 8191, {1, 3, 1, 1, 5, 49, 7, 13, 419, 125, 287, 1599, 8161, 1275, 24661}},
+{2767, 15, 8192, {1, 3, 3, 3, 13, 63, 23, 183, 39, 979, 1301, 2349, 905, 15805, 30151}},
+{2768, 15, 8195, {1, 1, 3, 9, 17, 11, 97, 189, 189, 511, 1779, 2077, 6891, 11623, 23949}},
+{2769, 15, 8201, {1, 1, 7, 11, 13, 45, 15, 37, 11, 853, 915, 1569, 6103, 10633, 3137}},
+{2770, 15, 8207, {1, 3, 3, 5, 15, 61, 91, 255, 131, 821, 1755, 1501, 2663, 1747, 941}},
+{2771, 15, 8210, {1, 1, 3, 7, 19, 19, 65, 95, 499, 239, 2023, 3185, 4649, 3861, 3767}},
+{2772, 15, 8228, {1, 3, 5, 15, 15, 63, 55, 93, 127, 303, 171, 1763, 4991, 9479, 9917}},
+{2773, 15, 8249, {1, 3, 7, 5, 31, 53, 111, 35, 433, 163, 1903, 3991, 3585, 643, 21941}},
+{2774, 15, 8252, {1, 3, 1, 9, 27, 39, 67, 89, 487, 349, 587, 1723, 4311, 11321, 25785}},
+{2775, 15, 8258, {1, 3, 5, 7, 1, 63, 23, 237, 507, 689, 1341, 441, 1721, 843, 20335}},
+{2776, 15, 8267, {1, 1, 3, 3, 31, 63, 83, 103, 25, 799, 1379, 1817, 3809, 12285, 16673}},
+{2777, 15, 8270, {1, 1, 5, 3, 25, 29, 99, 193, 21, 549, 33, 3109, 4135, 10071, 32355}},
+{2778, 15, 8275, {1, 3, 1, 7, 13, 27, 83, 189, 121, 167, 379, 1503, 7955, 13189, 313}},
+{2779, 15, 8284, {1, 3, 5, 15, 25, 19, 83, 87, 257, 237, 709, 1169, 1561, 7117, 4785}},
+{2780, 15, 8293, {1, 1, 1, 7, 9, 55, 21, 5, 439, 367, 403, 2311, 6243, 8349, 13127}},
+{2781, 15, 8298, {1, 3, 7, 3, 5, 35, 51, 67, 453, 767, 29, 3293, 6665, 11459, 2799}},
+{2782, 15, 8305, {1, 3, 3, 3, 5, 19, 59, 7, 367, 683, 783, 1317, 7119, 6129, 19525}},
+{2783, 15, 8317, {1, 1, 5, 5, 5, 19, 61, 67, 381, 291, 875, 2179, 2481, 9325, 11253}},
+{2784, 15, 8328, {1, 3, 5, 5, 7, 47, 107, 9, 141, 667, 1989, 821, 3909, 1733, 10187}},
+{2785, 15, 8336, {1, 1, 7, 7, 31, 61, 1, 71, 477, 689, 1539, 3617, 8105, 6535, 3293}},
+{2786, 15, 8345, {1, 1, 5, 5, 23, 9, 103, 197, 241, 249, 297, 3607, 6217, 1673, 30103}},
+{2787, 15, 8351, {1, 3, 1, 5, 23, 15, 115, 105, 365, 51, 825, 2687, 359, 16325, 15083}},
+{2788, 15, 8367, {1, 1, 3, 11, 29, 45, 65, 251, 169, 189, 1243, 2345, 1345, 14471, 25631}},
+{2789, 15, 8379, {1, 1, 5, 9, 7, 63, 81, 167, 309, 539, 1169, 3949, 4193, 12047, 1491}},
+{2790, 15, 8381, {1, 3, 1, 9, 29, 33, 89, 167, 67, 73, 1885, 477, 5745, 13365, 6819}},
+{2791, 15, 8382, {1, 3, 7, 9, 9, 49, 95, 13, 157, 997, 1725, 935, 7543, 6349, 18277}},
+{2792, 15, 8393, {1, 1, 5, 5, 11, 59, 97, 17, 303, 469, 93, 2761, 7395, 9021, 24299}},
+{2793, 15, 8402, {1, 1, 7, 3, 27, 63, 71, 99, 407, 139, 711, 2589, 4715, 5405, 3277}},
+{2794, 15, 8414, {1, 3, 7, 3, 11, 15, 49, 57, 271, 493, 1165, 2839, 8191, 2609, 14759}},
+{2795, 15, 8417, {1, 1, 1, 7, 21, 15, 71, 245, 413, 473, 1321, 1165, 1027, 6983, 12867}},
+{2796, 15, 8420, {1, 1, 5, 3, 15, 21, 19, 197, 401, 627, 2047, 2761, 5807, 5751, 28025}},
+{2797, 15, 8429, {1, 1, 3, 3, 5, 57, 19, 209, 341, 165, 489, 455, 231, 14385, 12457}},
+{2798, 15, 8435, {1, 3, 3, 11, 13, 63, 79, 129, 17, 315, 1881, 1069, 177, 12013, 29567}},
+{2799, 15, 8438, {1, 1, 3, 7, 31, 29, 51, 235, 475, 375, 617, 437, 6379, 8505, 23079}},
+{2800, 15, 8450, {1, 1, 3, 7, 27, 3, 3, 137, 203, 959, 363, 371, 2899, 13491, 22979}},
+{2801, 15, 8452, {1, 3, 3, 3, 9, 1, 57, 7, 363, 537, 713, 2417, 509, 7747, 22135}},
+{2802, 15, 8459, {1, 3, 3, 3, 13, 21, 79, 121, 487, 921, 113, 281, 2853, 14855, 19747}},
+{2803, 15, 8470, {1, 1, 1, 11, 3, 53, 89, 123, 307, 585, 567, 1925, 505, 15935, 20419}},
+{2804, 15, 8486, {1, 1, 3, 3, 15, 45, 77, 197, 499, 683, 1405, 3573, 981, 14135, 19763}},
+{2805, 15, 8490, {1, 1, 1, 11, 27, 31, 61, 191, 29, 601, 373, 2011, 6193, 3599, 4387}},
+{2806, 15, 8500, {1, 3, 5, 9, 7, 13, 1, 193, 469, 603, 1315, 3329, 3761, 8355, 10425}},
+{2807, 15, 8524, {1, 1, 3, 9, 29, 61, 103, 17, 117, 251, 2029, 2963, 3763, 16117, 6627}},
+{2808, 15, 8536, {1, 3, 1, 3, 7, 51, 91, 145, 497, 657, 871, 3707, 5905, 10449, 14901}},
+{2809, 15, 8552, {1, 1, 3, 1, 3, 53, 23, 149, 461, 333, 1809, 1315, 1815, 8223, 13297}},
+{2810, 15, 8558, {1, 1, 1, 7, 15, 31, 3, 47, 443, 829, 1305, 893, 4191, 9681, 32661}},
+{2811, 15, 8570, {1, 3, 1, 3, 27, 43, 51, 221, 295, 825, 649, 2953, 6203, 8237, 20253}},
+{2812, 15, 8576, {1, 3, 1, 3, 9, 35, 41, 195, 249, 225, 387, 3789, 1499, 2559, 28413}},
+{2813, 15, 8582, {1, 1, 5, 15, 19, 29, 13, 115, 333, 787, 787, 723, 2987, 6227, 10865}},
+{2814, 15, 8594, {1, 3, 5, 13, 5, 59, 5, 251, 79, 387, 11, 3167, 6619, 13317, 18979}},
+{2815, 15, 8606, {1, 1, 7, 11, 31, 51, 43, 1, 189, 519, 1945, 2129, 4365, 14059, 3139}},
+{2816, 15, 8619, {1, 1, 7, 5, 31, 9, 43, 19, 151, 533, 1061, 3849, 6871, 6941, 14935}},
+{2817, 15, 8621, {1, 3, 7, 5, 19, 57, 7, 129, 25, 353, 17, 1739, 6513, 399, 28835}},
+{2818, 15, 8624, {1, 3, 5, 15, 25, 15, 37, 125, 39, 239, 271, 65, 2189, 10449, 11815}},
+{2819, 15, 8633, {1, 3, 7, 15, 19, 57, 47, 245, 509, 945, 385, 3987, 3585, 14711, 9655}},
+{2820, 15, 8641, {1, 1, 3, 13, 21, 31, 13, 81, 9, 489, 1321, 63, 1363, 2219, 19541}},
+{2821, 15, 8653, {1, 1, 5, 7, 3, 57, 25, 147, 23, 553, 889, 307, 6429, 15807, 12861}},
+{2822, 15, 8654, {1, 1, 3, 15, 29, 21, 99, 237, 151, 881, 675, 3625, 1159, 11759, 21347}},
+{2823, 15, 8662, {1, 1, 7, 1, 9, 13, 111, 239, 235, 609, 1569, 3271, 2837, 13807, 7301}},
+{2824, 15, 8675, {1, 3, 1, 15, 7, 59, 27, 81, 129, 9, 647, 3595, 1877, 1067, 1859}},
+{2825, 15, 8689, {1, 3, 7, 1, 3, 25, 119, 57, 145, 441, 1045, 789, 215, 1265, 9369}},
+{2826, 15, 8695, {1, 3, 7, 3, 17, 25, 87, 211, 441, 229, 223, 2795, 7241, 7007, 20575}},
+{2827, 15, 8702, {1, 1, 3, 1, 13, 1, 55, 227, 389, 141, 1097, 2487, 7603, 4161, 5025}},
+{2828, 15, 8706, {1, 1, 3, 5, 15, 29, 29, 145, 233, 209, 891, 89, 8097, 2897, 26685}},
+{2829, 15, 8720, {1, 1, 3, 1, 29, 53, 19, 95, 161, 359, 435, 3313, 4955, 7965, 21015}},
+{2830, 15, 8729, {1, 3, 5, 9, 19, 3, 109, 77, 29, 937, 1663, 125, 2453, 1069, 20639}},
+{2831, 15, 8739, {1, 3, 7, 13, 5, 23, 43, 231, 347, 591, 1963, 2491, 4045, 16029, 8149}},
+{2832, 15, 8741, {1, 1, 5, 1, 13, 3, 75, 211, 419, 929, 901, 3453, 8121, 799, 8897}},
+{2833, 15, 8751, {1, 1, 7, 15, 11, 11, 123, 111, 309, 415, 1071, 975, 2009, 12945, 19617}},
+{2834, 15, 8759, {1, 1, 1, 7, 31, 35, 81, 255, 89, 643, 451, 513, 497, 11751, 24215}},
+{2835, 15, 8766, {1, 3, 5, 5, 25, 17, 5, 165, 139, 929, 1927, 1353, 7427, 9719, 17087}},
+{2836, 15, 8777, {1, 3, 5, 1, 21, 55, 79, 85, 333, 847, 1305, 851, 5057, 8361, 18269}},
+{2837, 15, 8783, {1, 3, 7, 15, 27, 17, 55, 125, 395, 223, 271, 781, 1639, 10569, 11143}},
+{2838, 15, 8786, {1, 1, 7, 9, 7, 33, 127, 85, 209, 339, 483, 241, 2523, 14951, 6855}},
+{2839, 15, 8795, {1, 1, 3, 9, 5, 19, 9, 183, 435, 343, 1105, 3139, 7617, 1311, 267}},
+{2840, 15, 8802, {1, 1, 5, 1, 15, 53, 11, 63, 113, 241, 855, 3123, 4777, 3495, 23345}},
+{2841, 15, 8814, {1, 3, 1, 5, 19, 29, 119, 205, 167, 683, 289, 1629, 4977, 8981, 6867}},
+{2842, 15, 8821, {1, 3, 1, 1, 31, 63, 95, 159, 267, 231, 863, 3385, 5315, 7267, 13757}},
+{2843, 15, 8828, {1, 3, 5, 11, 19, 21, 53, 41, 125, 179, 533, 1279, 3759, 7073, 13905}},
+{2844, 15, 8831, {1, 3, 5, 9, 17, 7, 27, 67, 97, 809, 1423, 2743, 2859, 16121, 329}},
+{2845, 15, 8837, {1, 3, 1, 15, 1, 41, 59, 155, 509, 51, 1827, 3739, 3879, 13369, 30821}},
+{2846, 15, 8842, {1, 3, 3, 7, 21, 31, 7, 13, 347, 919, 1225, 497, 5051, 3769, 20211}},
+{2847, 15, 8855, {1, 3, 7, 13, 31, 9, 127, 195, 123, 387, 3, 3593, 6623, 9827, 29319}},
+{2848, 15, 8856, {1, 1, 3, 9, 7, 27, 95, 211, 287, 189, 1683, 1999, 7641, 14983, 4699}},
+{2849, 15, 8868, {1, 1, 5, 3, 7, 21, 29, 189, 101, 423, 885, 3275, 6569, 11023, 22265}},
+{2850, 15, 8877, {1, 3, 5, 3, 9, 33, 79, 75, 327, 975, 287, 3025, 2157, 7301, 24447}},
+{2851, 15, 8890, {1, 3, 3, 15, 31, 27, 63, 1, 71, 119, 1151, 517, 6131, 11055, 179}},
+{2852, 15, 8892, {1, 3, 7, 11, 23, 15, 101, 247, 349, 735, 673, 997, 6451, 229, 32103}},
+{2853, 15, 8900, {1, 3, 5, 15, 7, 1, 51, 135, 207, 741, 1831, 1235, 4747, 11915, 22009}},
+{2854, 15, 8909, {1, 3, 1, 13, 9, 31, 19, 221, 465, 681, 627, 2595, 5617, 14201, 30355}},
+{2855, 15, 8912, {1, 1, 3, 1, 13, 49, 55, 155, 11, 885, 1275, 3591, 2217, 6659, 30885}},
+{2856, 15, 8921, {1, 1, 7, 11, 27, 57, 93, 95, 243, 63, 1405, 2049, 7689, 15943, 18503}},
+{2857, 15, 8922, {1, 1, 7, 7, 5, 11, 47, 189, 467, 631, 1665, 2717, 4285, 2087, 1435}},
+{2858, 15, 8927, {1, 1, 3, 11, 7, 27, 127, 3, 231, 757, 435, 2545, 3537, 9127, 19915}},
+{2859, 15, 8943, {1, 1, 5, 13, 5, 29, 85, 127, 339, 875, 497, 1573, 6553, 11983, 18029}},
+{2860, 15, 8948, {1, 3, 1, 1, 21, 3, 15, 91, 231, 683, 1529, 2651, 4147, 13437, 23861}},
+{2861, 15, 8951, {1, 3, 1, 7, 27, 17, 19, 179, 243, 223, 1037, 1501, 5935, 2259, 25185}},
+{2862, 15, 8958, {1, 1, 3, 15, 11, 19, 127, 27, 483, 219, 583, 2555, 531, 3451, 17875}},
+{2863, 15, 8984, {1, 1, 1, 13, 31, 39, 89, 149, 363, 741, 1355, 4067, 3171, 6783, 1799}},
+{2864, 15, 8994, {1, 1, 3, 11, 25, 51, 45, 235, 379, 123, 1701, 725, 1991, 7471, 9833}},
+{2865, 15, 9000, {1, 1, 5, 13, 15, 47, 13, 201, 263, 57, 375, 2963, 7475, 15929, 13775}},
+{2866, 15, 9013, {1, 1, 3, 1, 29, 29, 11, 161, 345, 253, 97, 255, 7267, 2379, 3933}},
+{2867, 15, 9018, {1, 3, 1, 15, 3, 47, 11, 69, 347, 747, 795, 2401, 3367, 2383, 6125}},
+{2868, 15, 9020, {1, 1, 7, 3, 1, 49, 101, 47, 71, 761, 1503, 2619, 191, 8895, 873}},
+{2869, 15, 9031, {1, 3, 3, 5, 25, 41, 93, 85, 427, 109, 1675, 2409, 4317, 9233, 30283}},
+{2870, 15, 9035, {1, 1, 3, 9, 11, 3, 67, 159, 425, 751, 887, 1415, 403, 15977, 10739}},
+{2871, 15, 9045, {1, 1, 5, 13, 9, 1, 9, 103, 481, 601, 931, 1957, 5763, 7095, 27141}},
+{2872, 15, 9052, {1, 1, 3, 15, 29, 13, 43, 33, 297, 269, 1041, 1411, 3461, 12043, 10045}},
+{2873, 15, 9056, {1, 3, 5, 3, 3, 3, 5, 7, 185, 753, 133, 1561, 5595, 13777, 25795}},
+{2874, 15, 9059, {1, 3, 5, 5, 1, 19, 29, 145, 163, 149, 619, 2603, 7757, 10035, 10189}},
+{2875, 15, 9066, {1, 3, 7, 15, 27, 15, 111, 173, 135, 117, 157, 2601, 7919, 12111, 22795}},
+{2876, 15, 9076, {1, 3, 1, 1, 29, 27, 65, 31, 101, 715, 289, 3643, 2335, 6789, 23397}},
+{2877, 15, 9089, {1, 3, 1, 3, 11, 45, 71, 109, 321, 423, 1695, 169, 3075, 12423, 11391}},
+{2878, 15, 9129, {1, 1, 3, 9, 13, 51, 35, 121, 203, 279, 433, 2725, 7951, 2105, 27333}},
+{2879, 15, 9132, {1, 1, 1, 15, 23, 31, 25, 105, 501, 441, 1511, 3133, 2811, 10595, 21779}},
+{2880, 15, 9147, {1, 1, 5, 13, 7, 1, 97, 193, 121, 993, 1347, 1903, 1883, 6583, 24535}},
+{2881, 15, 9164, {1, 1, 7, 9, 7, 29, 17, 41, 101, 447, 1289, 387, 1891, 2723, 26091}},
+{2882, 15, 9167, {1, 1, 3, 3, 3, 53, 81, 81, 177, 165, 195, 3413, 8177, 3817, 8453}},
+{2883, 15, 9185, {1, 3, 7, 15, 15, 31, 23, 31, 337, 439, 1773, 63, 5351, 5491, 1767}},
+{2884, 15, 9195, {1, 3, 1, 11, 5, 15, 23, 75, 437, 553, 429, 2705, 3625, 13851, 19865}},
+{2885, 15, 9197, {1, 3, 3, 9, 13, 15, 33, 235, 215, 415, 1737, 1409, 2101, 14623, 14717}},
+{2886, 15, 9210, {1, 3, 7, 7, 13, 51, 101, 217, 175, 813, 1639, 4009, 1625, 4991, 17525}},
+{2887, 15, 9217, {1, 1, 5, 13, 23, 33, 29, 175, 39, 673, 557, 3239, 5129, 11049, 27227}},
+{2888, 15, 9229, {1, 3, 7, 13, 1, 37, 33, 139, 493, 891, 1883, 2525, 5741, 15795, 5875}},
+{2889, 15, 9248, {1, 3, 1, 15, 15, 27, 127, 111, 147, 363, 725, 3077, 4341, 9131, 24635}},
+{2890, 15, 9254, {1, 1, 7, 3, 17, 25, 59, 135, 177, 635, 73, 3455, 3083, 6009, 13033}},
+{2891, 15, 9263, {1, 1, 1, 5, 15, 53, 93, 161, 215, 459, 1087, 179, 2235, 8885, 15309}},
+{2892, 15, 9266, {1, 1, 7, 13, 7, 17, 75, 173, 449, 855, 103, 2739, 3421, 11811, 18805}},
+{2893, 15, 9268, {1, 1, 7, 9, 5, 11, 53, 75, 247, 249, 1201, 953, 2455, 4589, 6027}},
+{2894, 15, 9290, {1, 1, 5, 13, 27, 51, 119, 39, 137, 11, 1435, 3773, 3889, 6081, 11829}},
+{2895, 15, 9310, {1, 1, 5, 5, 5, 35, 1, 197, 501, 185, 1039, 1563, 6421, 14373, 25655}},
+{2896, 15, 9316, {1, 1, 3, 13, 31, 55, 115, 183, 483, 655, 1351, 3203, 725, 3299, 22579}},
+{2897, 15, 9338, {1, 3, 5, 11, 31, 31, 83, 59, 395, 21, 1881, 2821, 2251, 11781, 26265}},
+{2898, 15, 9340, {1, 3, 7, 13, 21, 19, 103, 21, 403, 443, 1951, 55, 985, 15983, 15087}},
+{2899, 15, 9343, {1, 1, 5, 15, 29, 11, 51, 53, 255, 183, 1475, 1491, 259, 387, 10303}},
+{2900, 15, 9344, {1, 3, 5, 7, 21, 37, 45, 39, 479, 637, 1325, 3753, 3319, 7403, 31759}},
+{2901, 15, 9350, {1, 1, 3, 5, 7, 43, 89, 53, 269, 187, 995, 141, 119, 8139, 29699}},
+{2902, 15, 9354, {1, 1, 1, 5, 1, 53, 3, 23, 379, 223, 1889, 4035, 1437, 12425, 9051}},
+{2903, 15, 9359, {1, 3, 1, 13, 3, 31, 61, 43, 249, 449, 901, 1921, 3495, 8599, 5263}},
+{2904, 15, 9361, {1, 1, 3, 5, 3, 25, 35, 133, 25, 597, 915, 3663, 5147, 11831, 24269}},
+{2905, 15, 9364, {1, 1, 1, 9, 21, 27, 93, 93, 217, 299, 1881, 3647, 4825, 7989, 24121}},
+{2906, 15, 9368, {1, 3, 1, 15, 5, 15, 49, 129, 315, 631, 2037, 1567, 4043, 15589, 30905}},
+{2907, 15, 9371, {1, 3, 3, 7, 25, 5, 123, 51, 47, 471, 1563, 3947, 7975, 3681, 9611}},
+{2908, 15, 9373, {1, 3, 7, 15, 1, 17, 73, 245, 465, 95, 95, 1159, 1319, 4675, 8841}},
+{2909, 15, 9389, {1, 1, 3, 15, 5, 51, 35, 71, 423, 651, 753, 173, 2131, 15799, 29601}},
+{2910, 15, 9390, {1, 1, 1, 1, 3, 53, 83, 187, 445, 827, 1549, 979, 5363, 1701, 2149}},
+{2911, 15, 9409, {1, 1, 7, 9, 3, 15, 65, 161, 37, 233, 771, 3749, 727, 6857, 17175}},
+{2912, 15, 9443, {1, 1, 7, 7, 27, 29, 107, 247, 249, 353, 773, 3677, 7273, 5419, 29397}},
+{2913, 15, 9445, {1, 3, 3, 7, 31, 49, 87, 159, 145, 497, 1715, 2115, 5035, 6431, 7245}},
+{2914, 15, 9446, {1, 3, 3, 5, 7, 31, 51, 117, 101, 617, 557, 2551, 6589, 13295, 31975}},
+{2915, 15, 9452, {1, 1, 3, 3, 15, 27, 125, 163, 169, 893, 1771, 25, 5787, 10267, 10297}},
+{2916, 15, 9490, {1, 1, 1, 5, 9, 47, 85, 65, 289, 783, 1105, 4035, 4111, 2589, 24575}},
+{2917, 15, 9492, {1, 3, 3, 13, 23, 33, 7, 49, 301, 531, 1713, 2755, 5543, 8153, 24099}},
+{2918, 15, 9495, {1, 1, 5, 9, 7, 39, 101, 67, 417, 923, 757, 1537, 5553, 12233, 20881}},
+{2919, 15, 9508, {1, 1, 5, 1, 19, 7, 25, 123, 125, 183, 573, 3317, 6867, 871, 17631}},
+{2920, 15, 9523, {1, 1, 3, 15, 19, 13, 117, 41, 129, 715, 1525, 2257, 2179, 10807, 23271}},
+{2921, 15, 9543, {1, 3, 1, 5, 25, 53, 19, 169, 289, 569, 1135, 1967, 7001, 15883, 15113}},
+{2922, 15, 9558, {1, 3, 7, 15, 7, 37, 127, 147, 415, 313, 1541, 1889, 3763, 16199, 12681}},
+{2923, 15, 9567, {1, 1, 3, 9, 1, 35, 95, 137, 237, 951, 899, 3177, 6073, 10655, 31687}},
+{2924, 15, 9580, {1, 1, 5, 5, 29, 57, 45, 253, 297, 529, 1553, 467, 8035, 15675, 21691}},
+{2925, 15, 9585, {1, 3, 7, 15, 25, 41, 59, 81, 87, 985, 1001, 2369, 661, 7551, 11829}},
+{2926, 15, 9591, {1, 1, 7, 9, 27, 21, 7, 233, 309, 67, 701, 2737, 4261, 2467, 15691}},
+{2927, 15, 9611, {1, 3, 7, 1, 19, 55, 47, 155, 333, 101, 517, 1991, 4619, 10435, 27241}},
+{2928, 15, 9613, {1, 1, 7, 3, 23, 35, 7, 125, 157, 537, 933, 3281, 4975, 8969, 27581}},
+{2929, 15, 9614, {1, 1, 3, 7, 19, 53, 81, 103, 461, 435, 777, 335, 5261, 12249, 9695}},
+{2930, 15, 9621, {1, 3, 1, 7, 19, 9, 75, 245, 355, 37, 1855, 1339, 3107, 7251, 16543}},
+{2931, 15, 9631, {1, 1, 1, 3, 5, 35, 39, 223, 113, 423, 1423, 713, 6113, 349, 24147}},
+{2932, 15, 9642, {1, 3, 1, 1, 15, 31, 11, 75, 499, 345, 1253, 2629, 2551, 7483, 25395}},
+{2933, 15, 9656, {1, 1, 3, 11, 25, 25, 3, 211, 185, 45, 1865, 1805, 3303, 11091, 529}},
+{2934, 15, 9661, {1, 3, 1, 1, 9, 21, 7, 165, 107, 641, 1083, 2805, 2099, 5855, 18477}},
+{2935, 15, 9667, {1, 3, 5, 3, 9, 21, 77, 103, 505, 277, 335, 797, 3869, 2957, 1979}},
+{2936, 15, 9694, {1, 3, 5, 15, 31, 23, 77, 247, 303, 891, 1261, 3233, 3495, 13111, 13185}},
+{2937, 15, 9715, {1, 3, 5, 11, 11, 35, 49, 229, 149, 931, 881, 775, 2949, 3141, 29157}},
+{2938, 15, 9722, {1, 1, 3, 5, 19, 57, 23, 95, 347, 221, 195, 3561, 1481, 2063, 3979}},
+{2939, 15, 9738, {1, 3, 5, 3, 13, 1, 23, 173, 431, 29, 421, 3235, 2751, 4447, 28283}},
+{2940, 15, 9745, {1, 1, 5, 13, 23, 3, 1, 9, 327, 855, 1251, 2997, 6129, 4223, 11555}},
+{2941, 15, 9758, {1, 3, 7, 13, 29, 21, 37, 229, 217, 353, 1239, 3955, 491, 12183, 14777}},
+{2942, 15, 9764, {1, 1, 5, 5, 1, 33, 103, 187, 183, 939, 1873, 2633, 6143, 15405, 17353}},
+{2943, 15, 9782, {1, 1, 1, 9, 21, 27, 71, 129, 499, 279, 1181, 4053, 2485, 1961, 30603}},
+{2944, 15, 9791, {1, 1, 3, 15, 21, 37, 45, 201, 221, 187, 727, 1241, 6171, 1383, 22277}},
+{2945, 15, 9793, {1, 3, 7, 5, 21, 17, 67, 177, 323, 601, 633, 865, 6131, 10329, 8689}},
+{2946, 15, 9794, {1, 3, 5, 9, 15, 45, 71, 43, 359, 651, 103, 403, 3249, 11769, 6567}},
+{2947, 15, 9805, {1, 3, 3, 13, 3, 23, 101, 145, 367, 999, 1489, 3673, 2959, 10855, 16029}},
+{2948, 15, 9808, {1, 3, 7, 3, 13, 43, 123, 87, 55, 1015, 141, 2917, 6567, 16025, 25555}},
+{2949, 15, 9811, {1, 3, 1, 3, 17, 7, 21, 161, 41, 889, 1315, 1897, 639, 15451, 3049}},
+{2950, 15, 9817, {1, 3, 5, 15, 27, 33, 55, 17, 81, 431, 325, 909, 3547, 10121, 17815}},
+{2951, 15, 9824, {1, 1, 3, 1, 15, 37, 43, 137, 203, 191, 1129, 1585, 435, 3177, 769}},
+{2952, 15, 9836, {1, 3, 7, 11, 21, 23, 125, 41, 17, 951, 465, 3691, 3465, 13247, 13779}},
+{2953, 15, 9851, {1, 3, 3, 1, 31, 23, 43, 101, 405, 739, 1061, 2955, 5643, 16137, 8763}},
+{2954, 15, 9853, {1, 1, 5, 1, 19, 33, 99, 109, 203, 65, 395, 2775, 1373, 2557, 5875}},
+{2955, 15, 9854, {1, 3, 3, 3, 27, 51, 79, 63, 331, 365, 1071, 1661, 4549, 8561, 1719}},
+{2956, 15, 9877, {1, 3, 3, 9, 3, 17, 53, 161, 141, 489, 1325, 1709, 1381, 5093, 171}},
+{2957, 15, 9881, {1, 1, 7, 15, 9, 3, 95, 237, 197, 949, 7, 1837, 729, 10111, 6637}},
+{2958, 15, 9923, {1, 1, 3, 3, 19, 31, 57, 173, 483, 861, 1001, 1919, 3389, 11777, 20693}},
+{2959, 15, 9935, {1, 3, 1, 9, 27, 13, 113, 177, 75, 925, 949, 119, 4759, 7775, 23033}},
+{2960, 15, 9937, {1, 1, 7, 15, 23, 15, 65, 61, 137, 653, 1843, 323, 379, 15157, 29885}},
+{2961, 15, 9954, {1, 3, 3, 7, 29, 3, 11, 205, 347, 745, 1477, 3929, 5749, 4735, 29435}},
+{2962, 15, 9959, {1, 3, 5, 9, 1, 11, 111, 15, 7, 69, 45, 3607, 1099, 9203, 21301}},
+{2963, 15, 9963, {1, 3, 3, 3, 23, 3, 83, 173, 73, 485, 681, 1867, 3839, 11823, 13339}},
+{2964, 15, 9968, {1, 1, 3, 11, 31, 43, 107, 127, 465, 389, 1595, 427, 1571, 5885, 29569}},
+{2965, 15, 9973, {1, 1, 7, 9, 27, 25, 117, 27, 287, 391, 279, 3247, 35, 12973, 5483}},
+{2966, 15, 9974, {1, 3, 7, 11, 19, 55, 45, 127, 245, 945, 305, 3907, 2455, 3163, 31}},
+{2967, 15, 9980, {1, 1, 7, 11, 15, 17, 65, 15, 37, 207, 1447, 3027, 2281, 6557, 16717}},
+{2968, 15, 9983, {1, 1, 1, 13, 5, 27, 33, 213, 29, 603, 1171, 3235, 2255, 2017, 30999}},
+{2969, 15, 9985, {1, 3, 1, 5, 11, 1, 73, 233, 69, 125, 397, 297, 3337, 6191, 31055}},
+{2970, 15, 10003, {1, 1, 1, 15, 1, 1, 65, 145, 201, 917, 1891, 2999, 4069, 10413, 15819}},
+{2971, 15, 10010, {1, 3, 5, 13, 15, 51, 115, 167, 311, 375, 1069, 2595, 3337, 753, 11903}},
+{2972, 15, 10034, {1, 1, 3, 1, 1, 23, 69, 125, 147, 915, 1945, 411, 979, 13863, 30443}},
+{2973, 15, 10040, {1, 3, 1, 11, 5, 1, 93, 23, 135, 93, 1689, 23, 3519, 4491, 24673}},
+{2974, 15, 10063, {1, 1, 7, 3, 11, 59, 93, 153, 487, 475, 1191, 1455, 5963, 8259, 18811}},
+{2975, 15, 10077, {1, 1, 3, 1, 13, 15, 55, 71, 433, 33, 491, 1835, 5695, 10509, 347}},
+{2976, 15, 10081, {1, 1, 1, 15, 19, 1, 23, 47, 235, 101, 1057, 901, 5477, 7079, 30885}},
+{2977, 15, 10082, {1, 1, 5, 13, 11, 43, 119, 77, 441, 121, 783, 827, 1757, 12751, 31593}},
+{2978, 15, 10084, {1, 3, 7, 11, 19, 17, 37, 225, 329, 231, 515, 1541, 7371, 6355, 10905}},
+{2979, 15, 10088, {1, 1, 5, 13, 7, 11, 35, 215, 345, 577, 147, 2803, 3291, 4631, 5329}},
+{2980, 15, 10091, {1, 1, 3, 9, 21, 55, 113, 251, 25, 221, 1445, 3385, 1589, 4109, 29897}},
+{2981, 15, 10105, {1, 1, 5, 7, 9, 45, 5, 33, 331, 285, 1101, 3131, 2713, 5653, 3823}},
+{2982, 15, 10111, {1, 3, 7, 7, 5, 39, 43, 167, 481, 629, 777, 1827, 4653, 403, 4781}},
+{2983, 15, 10118, {1, 3, 3, 7, 31, 33, 31, 159, 313, 673, 1425, 663, 5819, 1297, 26627}},
+{2984, 15, 10127, {1, 3, 3, 1, 19, 61, 117, 93, 373, 491, 1031, 757, 4185, 771, 7265}},
+{2985, 15, 10135, {1, 1, 7, 9, 3, 45, 65, 223, 437, 41, 1139, 2733, 5963, 2709, 25429}},
+{2986, 15, 10169, {1, 3, 5, 11, 21, 27, 31, 127, 255, 761, 1865, 1319, 6583, 9235, 10717}},
+{2987, 15, 10172, {1, 1, 1, 5, 21, 1, 63, 43, 413, 557, 567, 2893, 8017, 2307, 29525}},
+{2988, 15, 10183, {1, 1, 7, 3, 31, 1, 15, 235, 215, 395, 1971, 469, 5275, 431, 5349}},
+{2989, 15, 10190, {1, 1, 1, 13, 25, 59, 71, 245, 389, 279, 1293, 89, 6551, 10285, 14495}},
+{2990, 15, 10192, {1, 1, 5, 5, 9, 63, 17, 229, 425, 939, 877, 3689, 7229, 6707, 30771}},
+{2991, 15, 10211, {1, 3, 7, 7, 11, 29, 43, 41, 25, 237, 1585, 3735, 2617, 7541, 26243}},
+{2992, 15, 10218, {1, 1, 7, 9, 21, 5, 69, 231, 361, 39, 1695, 3043, 2973, 5487, 12857}},
+{2993, 15, 10228, {1, 1, 5, 3, 17, 63, 91, 217, 407, 133, 1373, 4021, 1737, 10043, 4561}},
+{2994, 15, 10235, {1, 3, 7, 9, 31, 13, 101, 231, 175, 457, 89, 2167, 2725, 8505, 375}},
+{2995, 15, 10242, {1, 1, 3, 15, 31, 11, 27, 211, 347, 291, 1881, 3091, 3307, 5117, 13341}},
+{2996, 15, 10244, {1, 3, 5, 5, 13, 25, 5, 197, 237, 135, 635, 1175, 5085, 14737, 10807}},
+{2997, 15, 10271, {1, 3, 3, 9, 7, 63, 107, 127, 147, 477, 1813, 2619, 8089, 2651, 26549}},
+{2998, 15, 10278, {1, 1, 5, 11, 15, 45, 27, 133, 45, 621, 707, 2679, 5929, 19, 9599}},
+{2999, 15, 10296, {1, 3, 7, 9, 21, 37, 41, 255, 69, 1009, 1999, 367, 6177, 10017, 3549}},
+{3000, 15, 10299, {1, 1, 1, 15, 19, 55, 73, 189, 423, 983, 1811, 2551, 4765, 12077, 18205}},
+{3001, 15, 10307, {1, 1, 5, 7, 17, 13, 25, 225, 463, 471, 631, 1811, 5797, 3235, 32253}},
+{3002, 15, 10309, {1, 3, 7, 1, 29, 7, 123, 187, 331, 735, 1757, 1115, 2077, 15725, 2183}},
+{3003, 15, 10310, {1, 3, 7, 9, 17, 61, 111, 93, 21, 1003, 1905, 3719, 2111, 11845, 6427}},
+{3004, 15, 10314, {1, 3, 7, 7, 17, 21, 51, 59, 115, 723, 2039, 2833, 5969, 5737, 18407}},
+{3005, 15, 10316, {1, 3, 3, 13, 9, 47, 95, 233, 13, 281, 1049, 619, 405, 16205, 20097}},
+{3006, 15, 10321, {1, 3, 7, 13, 9, 41, 11, 171, 453, 713, 587, 1669, 2489, 10277, 18599}},
+{3007, 15, 10328, {1, 3, 3, 13, 21, 41, 123, 173, 511, 399, 859, 1515, 5773, 12535, 26289}},
+{3008, 15, 10338, {1, 1, 7, 15, 11, 3, 113, 111, 73, 7, 1191, 2573, 7713, 465, 27615}},
+{3009, 15, 10343, {1, 1, 7, 15, 5, 5, 39, 11, 489, 13, 1041, 1639, 7879, 11899, 6899}},
+{3010, 15, 10344, {1, 1, 5, 9, 27, 31, 15, 237, 401, 795, 1675, 2361, 7333, 12507, 14627}},
+{3011, 15, 10347, {1, 3, 1, 7, 21, 53, 31, 81, 189, 683, 1283, 419, 7585, 9207, 15053}},
+{3012, 15, 10352, {1, 3, 5, 11, 21, 1, 49, 251, 403, 489, 1235, 429, 4855, 4081, 17575}},
+{3013, 15, 10364, {1, 3, 1, 15, 29, 33, 77, 53, 105, 731, 749, 2677, 3967, 7967, 18723}},
+{3014, 15, 10373, {1, 3, 3, 11, 9, 47, 11, 95, 137, 923, 599, 1585, 1969, 9625, 19171}},
+{3015, 15, 10386, {1, 1, 1, 5, 7, 7, 85, 49, 339, 883, 261, 2125, 3831, 9797, 16395}},
+{3016, 15, 10391, {1, 3, 3, 3, 5, 9, 33, 99, 75, 889, 101, 2099, 6635, 11511, 21573}},
+{3017, 15, 10398, {1, 1, 5, 11, 1, 11, 79, 49, 7, 131, 471, 1235, 3287, 14777, 12053}},
+{3018, 15, 10408, {1, 1, 5, 15, 9, 9, 83, 15, 21, 899, 1785, 2349, 3471, 6723, 1405}},
+{3019, 15, 10413, {1, 3, 5, 11, 1, 7, 121, 223, 509, 859, 1037, 491, 5529, 481, 17029}},
+{3020, 15, 10422, {1, 1, 7, 5, 17, 35, 91, 171, 113, 65, 423, 2371, 5105, 12827, 31087}},
+{3021, 15, 10445, {1, 1, 3, 3, 21, 47, 55, 11, 159, 51, 263, 2113, 661, 9147, 28929}},
+{3022, 15, 10460, {1, 1, 1, 9, 19, 7, 43, 223, 207, 787, 543, 2141, 4247, 7369, 29031}},
+{3023, 15, 10463, {1, 1, 7, 11, 11, 51, 121, 9, 211, 905, 687, 889, 1827, 13395, 3507}},
+{3024, 15, 10464, {1, 3, 1, 7, 15, 23, 5, 139, 469, 569, 33, 3477, 5391, 13665, 17011}},
+{3025, 15, 10474, {1, 1, 1, 15, 29, 29, 29, 201, 63, 1019, 97, 1671, 9, 4617, 19833}},
+{3026, 15, 10476, {1, 1, 5, 15, 25, 5, 67, 225, 189, 919, 1471, 1451, 5017, 16189, 31555}},
+{3027, 15, 10487, {1, 3, 5, 5, 15, 51, 89, 221, 149, 863, 43, 2381, 1767, 8037, 5319}},
+{3028, 15, 10494, {1, 3, 3, 1, 15, 17, 5, 77, 69, 27, 1883, 63, 5987, 1497, 3723}},
+{3029, 15, 10499, {1, 3, 7, 11, 7, 5, 113, 229, 123, 709, 1531, 641, 6655, 14923, 22947}},
+{3030, 15, 10506, {1, 3, 1, 13, 21, 15, 45, 175, 81, 499, 1113, 587, 7573, 11689, 15651}},
+{3031, 15, 10513, {1, 3, 1, 1, 29, 43, 101, 37, 131, 757, 465, 743, 2737, 8063, 23967}},
+{3032, 15, 10516, {1, 1, 7, 13, 9, 21, 39, 177, 51, 691, 2047, 1519, 6137, 5271, 8703}},
+{3033, 15, 10523, {1, 1, 3, 3, 5, 55, 63, 21, 3, 317, 461, 527, 2673, 16211, 6721}},
+{3034, 15, 10539, {1, 3, 5, 5, 5, 47, 7, 241, 387, 589, 323, 203, 7241, 14761, 13287}},
+{3035, 15, 10549, {1, 3, 5, 3, 23, 63, 55, 61, 231, 1023, 1315, 1181, 243, 7389, 25639}},
+{3036, 15, 10550, {1, 1, 7, 13, 31, 43, 41, 81, 127, 887, 1513, 4055, 1361, 2443, 6963}},
+{3037, 15, 10567, {1, 1, 1, 5, 7, 43, 43, 33, 323, 911, 1373, 3053, 6503, 513, 6457}},
+{3038, 15, 10576, {1, 1, 7, 11, 25, 61, 21, 149, 205, 349, 1433, 1587, 149, 7275, 5465}},
+{3039, 15, 10625, {1, 3, 5, 5, 11, 9, 31, 217, 119, 511, 209, 3325, 2023, 2877, 463}},
+{3040, 15, 10635, {1, 3, 5, 15, 21, 47, 89, 41, 347, 849, 1375, 3311, 807, 11443, 27643}},
+{3041, 15, 10643, {1, 1, 5, 7, 29, 43, 123, 191, 321, 373, 447, 2145, 1221, 2071, 12689}},
+{3042, 15, 10656, {1, 3, 5, 15, 1, 21, 43, 141, 461, 779, 1109, 2915, 909, 8585, 19859}},
+{3043, 15, 10671, {1, 3, 3, 11, 5, 17, 57, 13, 393, 661, 1761, 2455, 43, 8593, 20505}},
+{3044, 15, 10676, {1, 3, 5, 1, 31, 47, 65, 249, 77, 513, 851, 2381, 3447, 693, 7729}},
+{3045, 15, 10683, {1, 3, 5, 15, 31, 19, 83, 47, 369, 697, 1815, 819, 7573, 9245, 8013}},
+{3046, 15, 10685, {1, 3, 5, 5, 11, 25, 27, 151, 107, 339, 299, 3869, 3393, 5661, 2947}},
+{3047, 15, 10688, {1, 1, 3, 1, 1, 59, 85, 57, 175, 465, 239, 3115, 7157, 7035, 11463}},
+{3048, 15, 10697, {1, 1, 7, 5, 31, 41, 53, 149, 121, 743, 189, 159, 5289, 2945, 1179}},
+{3049, 15, 10700, {1, 3, 3, 15, 23, 51, 83, 25, 159, 163, 61, 713, 4529, 5253, 1603}},
+{3050, 15, 10712, {1, 3, 5, 11, 7, 29, 15, 177, 507, 695, 1305, 1863, 7525, 3063, 27433}},
+{3051, 15, 10724, {1, 1, 3, 11, 5, 41, 115, 227, 409, 951, 591, 4003, 7717, 4369, 15637}},
+{3052, 15, 10728, {1, 1, 7, 11, 23, 55, 71, 135, 51, 411, 2003, 2375, 6823, 1711, 4443}},
+{3053, 15, 10734, {1, 3, 1, 3, 31, 47, 31, 233, 243, 3, 313, 1649, 6955, 13679, 32327}},
+{3054, 15, 10739, {1, 1, 3, 11, 29, 9, 1, 79, 247, 677, 685, 3107, 5987, 9675, 29523}},
+{3055, 15, 10762, {1, 1, 1, 7, 25, 31, 39, 241, 483, 839, 1143, 437, 2317, 2437, 173}},
+{3056, 15, 10772, {1, 1, 5, 1, 17, 19, 83, 57, 39, 479, 715, 1911, 1091, 10937, 22145}},
+{3057, 15, 10781, {1, 1, 7, 1, 27, 45, 35, 55, 477, 719, 217, 3349, 7717, 6853, 9699}},
+{3058, 15, 10800, {1, 3, 1, 11, 9, 39, 25, 223, 303, 713, 151, 2611, 4629, 5855, 31729}},
+{3059, 15, 10805, {1, 1, 1, 11, 13, 35, 53, 39, 167, 779, 1673, 1221, 6281, 15113, 32027}},
+{3060, 15, 10827, {1, 1, 5, 9, 19, 63, 89, 113, 199, 107, 1015, 835, 2879, 9499, 25597}},
+{3061, 15, 10830, {1, 1, 7, 3, 19, 37, 15, 23, 449, 641, 1811, 3407, 6775, 6283, 31157}},
+{3062, 15, 10837, {1, 1, 3, 1, 19, 15, 31, 99, 511, 897, 1693, 2093, 955, 15897, 26693}},
+{3063, 15, 10841, {1, 1, 5, 1, 5, 15, 47, 19, 441, 541, 1621, 3877, 6407, 15991, 1931}},
+{3064, 15, 10847, {1, 3, 5, 9, 21, 61, 15, 77, 265, 351, 879, 3835, 6555, 2349, 23235}},
+{3065, 15, 10848, {1, 1, 5, 11, 25, 37, 29, 181, 341, 641, 1213, 1319, 6359, 6231, 32573}},
+{3066, 15, 10857, {1, 1, 1, 7, 1, 37, 87, 123, 33, 913, 111, 2613, 4895, 12595, 26633}},
+{3067, 15, 10866, {1, 3, 5, 3, 27, 11, 45, 89, 183, 241, 1355, 783, 3343, 239, 8643}},
+{3068, 15, 10868, {1, 3, 7, 7, 9, 35, 67, 187, 233, 577, 1445, 3063, 6039, 16233, 1453}},
+{3069, 15, 10872, {1, 1, 3, 13, 27, 11, 23, 15, 95, 63, 1931, 911, 8149, 6833, 3051}},
+{3070, 15, 10887, {1, 3, 3, 5, 29, 49, 125, 117, 47, 143, 423, 3215, 3605, 3677, 17155}},
+{3071, 15, 10899, {1, 3, 1, 1, 31, 1, 123, 195, 83, 893, 1947, 339, 2927, 7183, 15443}},
+{3072, 15, 10901, {1, 1, 7, 13, 31, 15, 91, 207, 39, 275, 439, 2617, 3093, 11041, 24997}},
+{3073, 15, 10915, {1, 1, 5, 3, 3, 41, 13, 67, 361, 497, 25, 3807, 3551, 9681, 21043}},
+{3074, 15, 10924, {1, 3, 3, 3, 11, 27, 103, 59, 427, 327, 1705, 29, 8127, 1641, 20847}},
+{3075, 15, 10929, {1, 3, 7, 5, 3, 37, 81, 137, 225, 101, 187, 3067, 2491, 12687, 16227}},
+{3076, 15, 10942, {1, 3, 5, 15, 15, 33, 69, 223, 225, 771, 1917, 2293, 2889, 12083, 23971}},
+{3077, 15, 10971, {1, 1, 3, 5, 11, 9, 121, 81, 203, 425, 1189, 2011, 3041, 3247, 739}},
+{3078, 15, 10992, {1, 3, 1, 1, 13, 9, 39, 169, 437, 571, 1481, 3355, 3895, 8975, 31031}},
+{3079, 15, 10995, {1, 3, 1, 11, 1, 43, 35, 35, 293, 11, 657, 1415, 5021, 14463, 17945}},
+{3080, 15, 11002, {1, 1, 5, 5, 13, 47, 91, 15, 159, 23, 971, 3575, 757, 13477, 31757}},
+{3081, 15, 11010, {1, 1, 7, 1, 5, 63, 69, 27, 71, 129, 123, 3767, 89, 7865, 1189}},
+{3082, 15, 11027, {1, 3, 3, 5, 23, 1, 83, 3, 487, 491, 217, 2583, 3889, 15009, 9227}},
+{3083, 15, 11029, {1, 3, 5, 15, 25, 1, 73, 107, 245, 191, 1449, 571, 1403, 6953, 17457}},
+{3084, 15, 11045, {1, 3, 3, 3, 27, 19, 25, 105, 207, 857, 1161, 3657, 2107, 7955, 517}},
+{3085, 15, 11057, {1, 3, 3, 9, 21, 29, 5, 103, 219, 35, 3, 1635, 4815, 15797, 29839}},
+{3086, 15, 11070, {1, 1, 7, 7, 3, 63, 75, 77, 13, 57, 603, 2333, 7761, 14397, 10875}},
+{3087, 15, 11092, {1, 3, 7, 13, 3, 11, 5, 255, 1, 947, 1695, 1927, 7447, 7407, 20797}},
+{3088, 15, 11099, {1, 1, 5, 1, 1, 21, 105, 73, 429, 973, 1801, 3943, 6161, 1309, 3359}},
+{3089, 15, 11106, {1, 1, 3, 15, 27, 9, 9, 129, 117, 545, 9, 1983, 6351, 10925, 27337}},
+{3090, 15, 11115, {1, 3, 3, 5, 5, 5, 13, 155, 503, 875, 1243, 2259, 3445, 11953, 6517}},
+{3091, 15, 11120, {1, 1, 7, 3, 29, 21, 121, 147, 413, 423, 1887, 2429, 2765, 16335, 3071}},
+{3092, 15, 11126, {1, 1, 7, 9, 5, 53, 41, 137, 463, 583, 1627, 1731, 6675, 3703, 8177}},
+{3093, 15, 11153, {1, 3, 5, 11, 31, 29, 67, 159, 425, 25, 1457, 139, 5019, 701, 7357}},
+{3094, 15, 11190, {1, 3, 1, 5, 25, 15, 123, 123, 245, 859, 249, 2175, 2137, 5765, 4873}},
+{3095, 15, 11199, {1, 1, 3, 5, 23, 1, 111, 111, 111, 469, 1473, 1777, 3579, 13503, 2569}},
+{3096, 15, 11222, {1, 1, 7, 3, 17, 23, 51, 23, 499, 135, 713, 3317, 807, 9589, 11349}},
+{3097, 15, 11225, {1, 1, 1, 15, 9, 51, 75, 159, 359, 773, 1521, 2913, 5901, 3047, 14649}},
+{3098, 15, 11226, {1, 1, 3, 1, 13, 61, 117, 195, 49, 267, 57, 1769, 3621, 9415, 29443}},
+{3099, 15, 11231, {1, 3, 7, 11, 3, 25, 33, 31, 315, 191, 359, 3399, 2481, 13831, 20205}},
+{3100, 15, 11244, {1, 3, 3, 5, 31, 43, 35, 125, 291, 51, 1469, 3857, 1707, 2641, 32137}},
+{3101, 15, 11259, {1, 3, 5, 1, 25, 11, 113, 137, 211, 159, 1667, 939, 6439, 5337, 32059}},
+{3102, 15, 11261, {1, 3, 3, 11, 31, 61, 99, 49, 383, 343, 395, 51, 6931, 16039, 5901}},
+{3103, 15, 11270, {1, 1, 3, 5, 9, 63, 63, 49, 405, 915, 1505, 2141, 6749, 7799, 17313}},
+{3104, 15, 11273, {1, 3, 7, 11, 15, 11, 49, 161, 155, 869, 121, 301, 6561, 4279, 15233}},
+{3105, 15, 11300, {1, 1, 5, 13, 19, 13, 103, 59, 503, 293, 701, 2527, 5327, 13927, 5025}},
+{3106, 15, 11307, {1, 1, 7, 1, 1, 37, 55, 155, 485, 399, 855, 2677, 5927, 9657, 2795}},
+{3107, 15, 11318, {1, 1, 1, 5, 19, 15, 121, 69, 385, 75, 1567, 2649, 5601, 12981, 15903}},
+{3108, 15, 11332, {1, 1, 1, 11, 19, 21, 45, 59, 505, 737, 15, 1383, 1177, 8375, 15557}},
+{3109, 15, 11335, {1, 1, 7, 13, 29, 19, 123, 127, 469, 773, 733, 3289, 8087, 5803, 27897}},
+{3110, 15, 11341, {1, 3, 3, 11, 19, 55, 101, 67, 485, 939, 607, 1521, 6161, 12235, 16499}},
+{3111, 15, 11347, {1, 3, 5, 13, 29, 31, 31, 9, 453, 151, 1055, 3873, 405, 12877, 29829}},
+{3112, 15, 11354, {1, 3, 5, 1, 17, 1, 17, 131, 107, 1003, 1749, 1849, 6207, 2153, 21275}},
+{3113, 15, 11360, {1, 3, 7, 15, 7, 25, 51, 143, 51, 517, 1841, 1771, 5389, 4633, 11123}},
+{3114, 15, 11369, {1, 3, 7, 11, 23, 7, 89, 95, 403, 361, 835, 585, 2783, 8091, 5141}},
+{3115, 15, 11372, {1, 3, 1, 9, 1, 53, 115, 11, 493, 587, 305, 3605, 1711, 4169, 20013}},
+{3116, 15, 11378, {1, 3, 7, 3, 17, 59, 55, 251, 49, 759, 1227, 3685, 7765, 1445, 20385}},
+{3117, 15, 11396, {1, 1, 5, 7, 29, 55, 19, 157, 129, 927, 893, 1235, 1955, 8153, 2865}},
+{3118, 15, 11405, {1, 3, 1, 15, 21, 35, 81, 53, 175, 939, 1635, 3597, 747, 14011, 12867}},
+{3119, 15, 11417, {1, 3, 7, 1, 27, 61, 91, 73, 405, 677, 603, 2715, 7099, 941, 24523}},
+{3120, 15, 11424, {1, 3, 5, 9, 13, 45, 35, 167, 57, 483, 735, 2777, 7847, 6257, 13109}},
+{3121, 15, 11427, {1, 3, 5, 7, 1, 3, 97, 13, 159, 533, 1791, 1061, 981, 10795, 26165}},
+{3122, 15, 11430, {1, 1, 5, 13, 27, 5, 125, 25, 251, 221, 1909, 197, 6987, 11537, 15287}},
+{3123, 15, 11439, {1, 3, 5, 5, 27, 15, 1, 131, 375, 923, 81, 3153, 6071, 2515, 23729}},
+{3124, 15, 11442, {1, 3, 3, 9, 9, 23, 71, 13, 465, 261, 937, 1549, 5993, 11325, 15065}},
+{3125, 15, 11448, {1, 3, 1, 3, 7, 63, 17, 129, 435, 23, 215, 2251, 1561, 9703, 26483}},
+{3126, 15, 11461, {1, 1, 3, 1, 5, 53, 77, 109, 9, 605, 371, 2081, 6023, 7145, 15837}},
+{3127, 15, 11468, {1, 3, 7, 11, 27, 39, 115, 47, 259, 337, 1857, 3465, 1549, 7747, 8525}},
+{3128, 15, 11471, {1, 3, 7, 7, 29, 29, 75, 77, 29, 661, 899, 3137, 2661, 15271, 28093}},
+{3129, 15, 11473, {1, 1, 1, 3, 3, 3, 11, 219, 39, 757, 1465, 249, 7445, 7013, 15187}},
+{3130, 15, 11476, {1, 3, 7, 15, 15, 1, 39, 245, 427, 1003, 1493, 1913, 6435, 14787, 13481}},
+{3131, 15, 11480, {1, 1, 7, 3, 3, 37, 5, 97, 343, 833, 1379, 1551, 5403, 1843, 5877}},
+{3132, 15, 11489, {1, 3, 1, 1, 3, 17, 17, 163, 339, 691, 1707, 1845, 5941, 4259, 24531}},
+{3133, 15, 11499, {1, 1, 1, 1, 27, 21, 85, 221, 71, 949, 1753, 391, 6349, 15901, 20811}},
+{3134, 15, 11516, {1, 1, 1, 5, 31, 19, 45, 99, 469, 783, 1747, 3807, 5889, 9485, 13715}},
+{3135, 15, 11522, {1, 3, 1, 9, 23, 21, 39, 25, 421, 713, 461, 2857, 5023, 5341, 6409}},
+{3136, 15, 11531, {1, 3, 7, 5, 25, 19, 59, 147, 387, 857, 375, 3103, 1261, 13697, 25675}},
+{3137, 15, 11539, {1, 3, 5, 5, 31, 21, 49, 251, 463, 441, 473, 3487, 3915, 11151, 17721}},
+{3138, 15, 11546, {1, 1, 3, 9, 15, 47, 81, 219, 143, 141, 81, 1705, 5847, 3437, 30521}},
+{3139, 15, 11551, {1, 1, 7, 3, 25, 19, 97, 41, 77, 105, 1337, 695, 7589, 8587, 7509}},
+{3140, 15, 11564, {1, 1, 5, 13, 3, 11, 61, 19, 139, 667, 963, 1567, 5715, 7079, 15967}},
+{3141, 15, 11582, {1, 1, 5, 5, 5, 29, 67, 57, 477, 173, 1163, 727, 823, 15635, 17705}},
+{3142, 15, 11589, {1, 3, 7, 11, 13, 39, 57, 193, 73, 617, 535, 1623, 4581, 4451, 2589}},
+{3143, 15, 11593, {1, 1, 5, 5, 9, 27, 75, 127, 325, 413, 1669, 1749, 8045, 16199, 12237}},
+{3144, 15, 11601, {1, 1, 3, 1, 17, 23, 27, 189, 319, 953, 347, 909, 4401, 12791, 25077}},
+{3145, 15, 11608, {1, 1, 3, 3, 17, 51, 37, 79, 301, 607, 885, 1169, 3275, 3327, 20013}},
+{3146, 15, 11617, {1, 3, 5, 3, 21, 9, 99, 213, 387, 889, 575, 3591, 5377, 2981, 23989}},
+{3147, 15, 11630, {1, 3, 3, 13, 11, 7, 23, 255, 279, 853, 453, 2377, 8123, 15393, 9669}},
+{3148, 15, 11663, {1, 3, 1, 7, 11, 9, 109, 35, 405, 449, 1967, 2943, 3485, 5031, 14273}},
+{3149, 15, 11666, {1, 3, 3, 1, 25, 27, 43, 115, 435, 675, 1937, 1477, 4831, 9417, 7017}},
+{3150, 15, 11668, {1, 1, 7, 13, 19, 45, 83, 241, 487, 215, 1453, 209, 4061, 1765, 15623}},
+{3151, 15, 11677, {1, 1, 7, 7, 21, 31, 95, 9, 287, 1005, 1933, 3405, 6913, 7733, 18975}},
+{3152, 15, 11682, {1, 1, 1, 11, 13, 11, 25, 39, 283, 57, 255, 2809, 5767, 6127, 6705}},
+{3153, 15, 11687, {1, 3, 1, 11, 1, 51, 73, 181, 261, 215, 385, 2777, 5169, 12431, 23563}},
+{3154, 15, 11696, {1, 3, 3, 9, 9, 39, 123, 197, 501, 679, 109, 3369, 4817, 8855, 7997}},
+{3155, 15, 11713, {1, 1, 5, 1, 29, 61, 15, 183, 453, 999, 1211, 3217, 8035, 5153, 19975}},
+{3156, 15, 11728, {1, 3, 7, 11, 11, 21, 51, 45, 379, 793, 289, 309, 1229, 7159, 581}},
+{3157, 15, 11747, {1, 1, 3, 9, 17, 11, 75, 67, 289, 191, 1083, 2949, 6063, 6611, 21595}},
+{3158, 15, 11750, {1, 3, 7, 3, 27, 45, 59, 193, 485, 277, 27, 1219, 2389, 15875, 6273}},
+{3159, 15, 11754, {1, 1, 5, 3, 31, 29, 65, 197, 115, 163, 9, 783, 5573, 2833, 12603}},
+{3160, 15, 11759, {1, 1, 3, 7, 5, 53, 115, 181, 175, 749, 1335, 1151, 2131, 12467, 15811}},
+{3161, 15, 11761, {1, 1, 1, 9, 27, 39, 11, 1, 443, 677, 777, 1857, 7459, 3177, 3875}},
+{3162, 15, 11764, {1, 1, 7, 7, 17, 3, 23, 161, 105, 603, 1991, 3845, 465, 11467, 2077}},
+{3163, 15, 11767, {1, 1, 3, 13, 5, 23, 39, 35, 399, 795, 265, 207, 1823, 15069, 31839}},
+{3164, 15, 11797, {1, 1, 1, 1, 29, 61, 89, 193, 41, 99, 315, 1021, 6109, 12507, 19973}},
+{3165, 15, 11804, {1, 1, 5, 3, 13, 57, 119, 251, 215, 695, 1521, 4081, 2481, 657, 855}},
+{3166, 15, 11808, {1, 1, 7, 3, 25, 5, 3, 133, 111, 385, 773, 1027, 4327, 3031, 3537}},
+{3167, 15, 11831, {1, 3, 7, 5, 5, 27, 43, 117, 479, 83, 1421, 2791, 6551, 6231, 10353}},
+{3168, 15, 11832, {1, 1, 1, 13, 3, 29, 35, 71, 85, 821, 1671, 3057, 797, 13683, 7025}},
+{3169, 15, 11849, {1, 3, 7, 1, 1, 47, 117, 233, 141, 993, 1381, 2551, 1031, 11765, 18429}},
+{3170, 15, 11855, {1, 3, 1, 3, 13, 3, 77, 29, 35, 807, 1109, 695, 5605, 5477, 449}},
+{3171, 15, 11863, {1, 1, 1, 15, 21, 37, 117, 105, 273, 311, 1287, 1415, 1221, 1847, 19487}},
+{3172, 15, 11880, {1, 3, 1, 11, 21, 61, 107, 225, 335, 501, 1995, 2399, 5475, 12613, 18877}},
+{3173, 15, 11883, {1, 3, 3, 1, 31, 41, 27, 205, 103, 837, 639, 2007, 2759, 12471, 1457}},
+{3174, 15, 11885, {1, 1, 7, 13, 29, 39, 71, 245, 105, 235, 1277, 1515, 6129, 15947, 26653}},
+{3175, 15, 11898, {1, 1, 7, 5, 7, 13, 87, 251, 315, 1017, 587, 2917, 5911, 2919, 29715}},
+{3176, 15, 11916, {1, 1, 1, 3, 7, 19, 81, 243, 177, 917, 2023, 2365, 7465, 4901, 29841}},
+{3177, 15, 11924, {1, 3, 5, 15, 1, 31, 15, 147, 285, 1003, 1757, 47, 6925, 1197, 19633}},
+{3178, 15, 11928, {1, 1, 5, 7, 27, 25, 47, 209, 85, 403, 1399, 2331, 3663, 595, 13407}},
+{3179, 15, 11947, {1, 3, 5, 9, 7, 25, 7, 139, 389, 817, 1153, 1421, 5735, 9577, 10269}},
+{3180, 15, 11955, {1, 1, 1, 9, 5, 61, 49, 117, 389, 541, 433, 1405, 2575, 223, 7265}},
+{3181, 15, 11961, {1, 1, 5, 7, 15, 1, 81, 207, 435, 843, 835, 3797, 7637, 5333, 31115}},
+{3182, 15, 11962, {1, 3, 7, 11, 13, 3, 47, 249, 301, 715, 2015, 3049, 8155, 10989, 26051}},
+{3183, 15, 11982, {1, 1, 7, 7, 3, 33, 119, 113, 381, 575, 367, 41, 3317, 11727, 4351}},
+{3184, 15, 11990, {1, 3, 3, 13, 9, 3, 51, 37, 173, 137, 533, 1827, 631, 10047, 6267}},
+{3185, 15, 12010, {1, 3, 3, 11, 17, 39, 61, 245, 13, 139, 1281, 1319, 1233, 13629, 32269}},
+{3186, 15, 12018, {1, 1, 1, 7, 15, 17, 91, 109, 163, 609, 11, 3251, 7653, 14035, 31755}},
+{3187, 15, 12027, {1, 3, 3, 15, 13, 21, 55, 231, 385, 133, 1833, 2637, 6935, 14303, 26745}},
+{3188, 15, 12029, {1, 1, 1, 7, 17, 41, 125, 141, 89, 823, 1411, 3637, 6211, 13323, 6111}},
+{3189, 15, 12035, {1, 1, 1, 11, 1, 21, 9, 43, 97, 685, 1223, 1491, 121, 1793, 2397}},
+{3190, 15, 12055, {1, 3, 5, 5, 17, 17, 5, 223, 129, 865, 1839, 1137, 6391, 4377, 9233}},
+{3191, 15, 12062, {1, 3, 7, 15, 21, 55, 5, 77, 341, 637, 1853, 1435, 1195, 9283, 21257}},
+{3192, 15, 12068, {1, 3, 5, 1, 9, 49, 43, 211, 127, 655, 1397, 1235, 5279, 2351, 24229}},
+{3193, 15, 12071, {1, 3, 5, 3, 25, 29, 13, 229, 25, 675, 837, 2753, 2125, 9863, 11293}},
+{3194, 15, 12072, {1, 3, 5, 7, 23, 43, 127, 1, 163, 237, 337, 3019, 7747, 16227, 2881}},
+{3195, 15, 12086, {1, 3, 5, 5, 25, 9, 43, 171, 421, 521, 1885, 337, 7873, 6347, 13181}},
+{3196, 15, 12097, {1, 3, 5, 5, 7, 47, 107, 173, 163, 191, 625, 3389, 2833, 7945, 24787}},
+{3197, 15, 12098, {1, 1, 7, 3, 27, 57, 27, 209, 253, 815, 301, 1633, 3945, 5051, 28851}},
+{3198, 15, 12100, {1, 3, 7, 9, 9, 51, 103, 213, 437, 189, 1857, 1331, 5551, 10641, 27405}},
+{3199, 15, 12112, {1, 1, 5, 5, 15, 1, 25, 105, 117, 347, 161, 3369, 3589, 12903, 23559}},
+{3200, 15, 12118, {1, 1, 1, 5, 3, 61, 93, 51, 81, 281, 1383, 745, 4137, 2005, 3635}},
+{3201, 15, 12133, {1, 3, 7, 5, 13, 57, 111, 211, 303, 477, 359, 4019, 6779, 5129, 22035}},
+{3202, 15, 12134, {1, 1, 1, 7, 17, 29, 113, 113, 201, 531, 749, 739, 2879, 3315, 18733}},
+{3203, 15, 12137, {1, 3, 7, 13, 21, 55, 21, 183, 359, 75, 377, 2211, 4281, 14317, 28307}},
+{3204, 15, 12161, {1, 3, 7, 1, 21, 1, 49, 213, 317, 75, 113, 1741, 7963, 12785, 11571}},
+{3205, 15, 12162, {1, 3, 7, 9, 11, 31, 29, 101, 261, 141, 715, 2727, 8187, 2075, 32433}},
+{3206, 15, 12171, {1, 3, 7, 3, 23, 9, 17, 143, 385, 211, 593, 241, 6567, 10777, 6677}},
+{3207, 15, 12174, {1, 1, 3, 15, 3, 17, 117, 99, 91, 793, 989, 2421, 5643, 16103, 9759}},
+{3208, 15, 12185, {1, 3, 7, 11, 23, 43, 107, 35, 421, 431, 743, 853, 7939, 12169, 4199}},
+{3209, 15, 12204, {1, 1, 1, 11, 21, 53, 17, 203, 123, 395, 59, 929, 255, 7585, 10945}},
+{3210, 15, 12212, {1, 3, 3, 15, 17, 57, 57, 133, 67, 71, 1685, 903, 4079, 15423, 26495}},
+{3211, 15, 12215, {1, 1, 1, 15, 3, 47, 95, 39, 405, 407, 1557, 3001, 6225, 15187, 5663}},
+{3212, 15, 12216, {1, 3, 5, 5, 13, 47, 33, 61, 375, 1023, 1981, 2773, 2375, 11321, 17731}},
+{3213, 15, 12253, {1, 3, 5, 9, 17, 59, 117, 95, 493, 149, 1269, 2865, 369, 2109, 24601}},
+{3214, 15, 12260, {1, 3, 5, 13, 17, 63, 67, 247, 95, 721, 67, 305, 6179, 15399, 32559}},
+{3215, 15, 12277, {1, 1, 5, 1, 3, 21, 41, 15, 453, 475, 2017, 3193, 5903, 897, 4237}},
+{3216, 15, 12289, {1, 1, 5, 3, 15, 41, 1, 141, 441, 575, 155, 3791, 7711, 11231, 24611}},
+{3217, 15, 12295, {1, 3, 7, 1, 17, 53, 27, 169, 31, 437, 963, 1793, 7777, 1917, 29311}},
+{3218, 15, 12314, {1, 3, 3, 13, 9, 27, 77, 87, 329, 885, 749, 1713, 6013, 6921, 629}},
+{3219, 15, 12323, {1, 3, 5, 13, 3, 7, 53, 27, 353, 267, 925, 2141, 439, 15175, 30851}},
+{3220, 15, 12325, {1, 3, 3, 13, 17, 57, 35, 101, 265, 901, 1825, 2159, 6149, 5967, 24023}},
+{3221, 15, 12335, {1, 1, 5, 11, 13, 51, 99, 111, 193, 415, 1541, 2929, 5045, 3147, 12587}},
+{3222, 15, 12349, {1, 3, 7, 11, 15, 9, 33, 17, 511, 815, 299, 1077, 6171, 10451, 15039}},
+{3223, 15, 12358, {1, 1, 1, 15, 25, 63, 51, 137, 449, 951, 1051, 1101, 4725, 2463, 7355}},
+{3224, 15, 12372, {1, 1, 1, 7, 27, 63, 29, 179, 317, 521, 1459, 827, 6599, 13459, 15439}},
+{3225, 15, 12376, {1, 3, 3, 15, 17, 31, 37, 191, 229, 245, 181, 941, 5761, 1849, 31599}},
+{3226, 15, 12379, {1, 1, 1, 9, 27, 45, 67, 239, 481, 615, 1667, 3751, 8141, 10013, 2125}},
+{3227, 15, 12386, {1, 1, 1, 1, 13, 51, 117, 135, 73, 151, 1291, 2541, 1411, 3767, 26949}},
+{3228, 15, 12395, {1, 3, 1, 9, 7, 11, 21, 187, 243, 857, 1951, 865, 7273, 2041, 8155}},
+{3229, 15, 12416, {1, 1, 3, 3, 19, 33, 89, 115, 455, 137, 707, 1867, 4221, 2433, 9119}},
+{3230, 15, 12421, {1, 1, 3, 11, 5, 3, 121, 1, 71, 951, 603, 3873, 723, 3285, 19289}},
+{3231, 15, 12440, {1, 3, 7, 15, 21, 1, 117, 17, 455, 519, 731, 3003, 5741, 9557, 29163}},
+{3232, 15, 12452, {1, 1, 3, 13, 25, 5, 43, 147, 209, 895, 255, 1231, 241, 487, 15593}},
+{3233, 15, 12455, {1, 1, 3, 13, 7, 1, 89, 187, 217, 927, 2029, 3521, 2777, 8103, 22819}},
+{3234, 15, 12456, {1, 1, 7, 11, 7, 33, 3, 73, 5, 489, 227, 2259, 7031, 6425, 26135}},
+{3235, 15, 12462, {1, 3, 3, 7, 31, 19, 97, 201, 455, 819, 945, 2771, 8083, 8711, 2835}},
+{3236, 15, 12467, {1, 1, 1, 5, 15, 45, 43, 157, 245, 967, 877, 2289, 4499, 9891, 18827}},
+{3237, 15, 12479, {1, 3, 1, 7, 21, 59, 123, 63, 231, 485, 1781, 1211, 4597, 5269, 1607}},
+{3238, 15, 12505, {1, 1, 1, 13, 23, 39, 105, 55, 249, 991, 1625, 3089, 3825, 4275, 29139}},
+{3239, 15, 12521, {1, 3, 3, 1, 29, 29, 55, 169, 13, 895, 1355, 1101, 6063, 12935, 23215}},
+{3240, 15, 12535, {1, 1, 5, 5, 31, 49, 99, 137, 209, 1017, 1179, 3931, 637, 14131, 19285}},
+{3241, 15, 12547, {1, 1, 1, 1, 3, 11, 119, 11, 215, 337, 243, 3883, 3807, 7335, 11901}},
+{3242, 15, 12556, {1, 3, 7, 3, 7, 27, 71, 225, 219, 367, 1213, 2739, 1185, 10175, 21313}},
+{3243, 15, 12561, {1, 3, 7, 13, 7, 49, 23, 223, 61, 1011, 797, 1335, 6711, 5961, 5605}},
+{3244, 15, 12568, {1, 3, 3, 11, 19, 37, 1, 149, 39, 661, 929, 2125, 2299, 5181, 28083}},
+{3245, 15, 12578, {1, 3, 3, 13, 13, 9, 67, 21, 463, 279, 529, 523, 6705, 11011, 31695}},
+{3246, 15, 12583, {1, 3, 1, 5, 13, 1, 123, 3, 291, 625, 1949, 2713, 5917, 10343, 13627}},
+{3247, 15, 12595, {1, 1, 3, 9, 27, 41, 3, 207, 103, 265, 811, 549, 6109, 313, 8889}},
+{3248, 15, 12604, {1, 3, 3, 13, 23, 43, 99, 33, 279, 463, 955, 793, 4113, 10615, 16957}},
+{3249, 15, 12610, {1, 1, 5, 7, 11, 49, 79, 45, 17, 937, 359, 1037, 1099, 3003, 31561}},
+{3250, 15, 12621, {1, 1, 1, 7, 3, 45, 111, 35, 109, 983, 53, 4057, 7349, 3599, 2209}},
+{3251, 15, 12622, {1, 3, 7, 11, 9, 43, 27, 9, 85, 529, 1497, 347, 759, 12449, 11373}},
+{3252, 15, 12624, {1, 1, 3, 9, 17, 1, 49, 31, 367, 813, 1385, 2025, 773, 4679, 4543}},
+{3253, 15, 12629, {1, 1, 5, 15, 15, 9, 43, 97, 239, 995, 1037, 841, 4167, 12113, 23765}},
+{3254, 15, 12630, {1, 3, 5, 9, 29, 53, 123, 49, 221, 113, 1157, 73, 6087, 1363, 11029}},
+{3255, 15, 12639, {1, 3, 1, 13, 3, 15, 69, 199, 279, 919, 5, 161, 4817, 15031, 121}},
+{3256, 15, 12640, {1, 3, 1, 9, 3, 31, 117, 77, 393, 241, 645, 3181, 1067, 15879, 2037}},
+{3257, 15, 12650, {1, 3, 3, 15, 3, 63, 57, 33, 117, 789, 941, 1301, 5865, 12693, 3523}},
+{3258, 15, 12679, {1, 1, 5, 13, 3, 61, 51, 151, 175, 305, 95, 1557, 6567, 7841, 13903}},
+{3259, 15, 12680, {1, 3, 3, 5, 15, 25, 127, 79, 245, 767, 645, 3933, 1357, 12579, 4067}},
+{3260, 15, 12698, {1, 3, 5, 11, 21, 31, 13, 251, 127, 231, 1795, 2627, 1191, 3363, 23543}},
+{3261, 15, 12716, {1, 1, 3, 5, 7, 49, 121, 57, 131, 481, 1879, 525, 5225, 337, 1957}},
+{3262, 15, 12721, {1, 1, 5, 13, 9, 55, 27, 37, 211, 125, 119, 3373, 251, 12357, 13975}},
+{3263, 15, 12722, {1, 3, 3, 15, 1, 51, 91, 119, 233, 993, 203, 1635, 1167, 6327, 29119}},
+{3264, 15, 12731, {1, 1, 7, 1, 13, 5, 23, 253, 121, 989, 1105, 3321, 3221, 6073, 21185}},
+{3265, 15, 12742, {1, 1, 3, 15, 13, 49, 121, 247, 247, 133, 485, 1067, 7875, 411, 7647}},
+{3266, 15, 12745, {1, 3, 7, 13, 31, 37, 127, 241, 145, 133, 53, 267, 2029, 3703, 16123}},
+{3267, 15, 12751, {1, 3, 1, 15, 15, 9, 15, 89, 35, 367, 401, 61, 1953, 7873, 17861}},
+{3268, 15, 12759, {1, 1, 1, 1, 1, 41, 71, 249, 213, 779, 1385, 1767, 999, 15151, 16647}},
+{3269, 15, 12763, {1, 3, 7, 13, 31, 23, 123, 235, 343, 949, 309, 3777, 3587, 853, 19779}},
+{3270, 15, 12769, {1, 1, 3, 13, 29, 35, 5, 37, 63, 757, 303, 1579, 3443, 243, 11873}},
+{3271, 15, 12781, {1, 3, 1, 9, 19, 49, 81, 53, 11, 901, 1857, 147, 3103, 14019, 21}},
+{3272, 15, 12793, {1, 3, 7, 13, 3, 39, 99, 99, 45, 91, 1567, 551, 3129, 4809, 29057}},
+{3273, 15, 12799, {1, 3, 7, 3, 3, 27, 17, 231, 377, 381, 1479, 2525, 2595, 2799, 25737}},
+{3274, 15, 12815, {1, 3, 5, 15, 15, 25, 103, 215, 301, 59, 1417, 981, 7579, 12731, 22329}},
+{3275, 15, 12824, {1, 1, 1, 13, 5, 31, 61, 31, 349, 925, 1301, 685, 435, 11567, 10715}},
+{3276, 15, 12836, {1, 1, 7, 9, 19, 57, 109, 1, 37, 377, 1015, 2273, 6741, 3191, 15949}},
+{3277, 15, 12845, {1, 3, 3, 13, 3, 23, 103, 127, 11, 59, 1847, 1175, 425, 3423, 20643}},
+{3278, 15, 12853, {1, 3, 3, 7, 3, 11, 105, 141, 55, 217, 1427, 477, 667, 9403, 11905}},
+{3279, 15, 12854, {1, 3, 3, 5, 3, 27, 11, 187, 495, 907, 1925, 445, 6639, 8159, 15225}},
+{3280, 15, 12857, {1, 3, 1, 5, 27, 31, 77, 213, 73, 343, 1123, 3609, 2431, 15329, 32165}},
+{3281, 15, 12866, {1, 1, 7, 5, 1, 11, 105, 139, 485, 1007, 709, 3509, 5231, 11717, 31433}},
+{3282, 15, 12872, {1, 1, 3, 15, 23, 49, 95, 169, 399, 1019, 19, 2013, 5311, 7951, 22609}},
+{3283, 15, 12875, {1, 3, 1, 7, 13, 3, 29, 203, 209, 701, 1791, 2615, 5351, 4237, 12565}},
+{3284, 15, 12878, {1, 3, 1, 15, 27, 11, 91, 31, 205, 205, 1683, 901, 5129, 6049, 11865}},
+{3285, 15, 12880, {1, 1, 7, 7, 27, 59, 21, 3, 209, 79, 769, 4013, 2041, 2645, 11561}},
+{3286, 15, 12885, {1, 3, 7, 11, 5, 45, 39, 243, 185, 871, 795, 1845, 8043, 6285, 20991}},
+{3287, 15, 12901, {1, 1, 5, 7, 13, 7, 15, 165, 349, 179, 789, 1269, 3787, 5429, 26567}},
+{3288, 15, 12902, {1, 3, 3, 13, 31, 23, 75, 41, 177, 735, 1889, 4039, 3519, 15003, 965}},
+{3289, 15, 12920, {1, 3, 1, 7, 15, 57, 15, 139, 27, 469, 1003, 691, 7893, 9643, 30983}},
+{3290, 15, 12926, {1, 3, 1, 13, 23, 27, 3, 237, 233, 875, 99, 883, 6167, 5463, 6245}},
+{3291, 15, 12929, {1, 1, 5, 13, 25, 57, 79, 51, 147, 619, 1147, 279, 6583, 1939, 477}},
+{3292, 15, 12939, {1, 3, 5, 5, 31, 61, 125, 163, 213, 699, 583, 3865, 615, 9707, 11651}},
+{3293, 15, 12941, {1, 1, 5, 1, 5, 21, 93, 239, 31, 641, 777, 27, 5247, 8993, 21053}},
+{3294, 15, 12950, {1, 3, 7, 9, 1, 13, 61, 57, 503, 453, 83, 3271, 2845, 1121, 18639}},
+{3295, 15, 12953, {1, 1, 7, 5, 29, 53, 13, 219, 379, 441, 821, 3179, 4877, 2535, 7557}},
+{3296, 15, 12992, {1, 1, 7, 13, 9, 53, 17, 183, 265, 393, 587, 2753, 6453, 7135, 24737}},
+{3297, 15, 13002, {1, 1, 1, 13, 11, 23, 73, 109, 393, 1013, 559, 755, 7291, 6631, 26509}},
+{3298, 15, 13010, {1, 3, 1, 5, 5, 15, 107, 103, 355, 307, 1559, 837, 5413, 5285, 17489}},
+{3299, 15, 13058, {1, 1, 5, 7, 17, 21, 21, 23, 109, 709, 1947, 3585, 3629, 4669, 949}},
+{3300, 15, 13072, {1, 3, 7, 1, 9, 33, 85, 147, 467, 259, 1913, 199, 7399, 9551, 22387}},
+{3301, 15, 13084, {1, 3, 5, 11, 15, 53, 23, 41, 249, 515, 1161, 2467, 1299, 7449, 2613}},
+{3302, 15, 13087, {1, 1, 5, 5, 5, 29, 91, 139, 487, 545, 321, 3035, 4545, 6747, 21673}},
+{3303, 15, 13091, {1, 1, 3, 13, 23, 49, 95, 103, 25, 119, 469, 2515, 2551, 841, 25089}},
+{3304, 15, 13097, {1, 1, 5, 7, 11, 31, 31, 197, 245, 715, 257, 4043, 8099, 11531, 5617}},
+{3305, 15, 13108, {1, 1, 3, 3, 19, 7, 9, 179, 103, 995, 191, 179, 3843, 5215, 27639}},
+{3306, 15, 13123, {1, 3, 1, 7, 23, 59, 25, 65, 399, 211, 1453, 3511, 7203, 16015, 32197}},
+{3307, 15, 13149, {1, 3, 3, 5, 9, 35, 109, 67, 197, 449, 643, 519, 5751, 15551, 11331}},
+{3308, 15, 13150, {1, 3, 5, 3, 1, 17, 53, 201, 265, 351, 467, 911, 1117, 7183, 20371}},
+{3309, 15, 13163, {1, 1, 7, 7, 27, 17, 93, 81, 227, 619, 1191, 735, 815, 12615, 2719}},
+{3310, 15, 13166, {1, 3, 1, 15, 19, 3, 83, 75, 343, 297, 1019, 3469, 4383, 13299, 29755}},
+{3311, 15, 13178, {1, 1, 5, 3, 13, 55, 119, 169, 85, 595, 299, 2469, 5625, 2877, 16117}},
+{3312, 15, 13180, {1, 1, 3, 5, 15, 17, 61, 161, 47, 393, 143, 867, 5517, 9495, 12795}},
+{3313, 15, 13184, {1, 3, 5, 1, 27, 31, 113, 125, 251, 687, 969, 1473, 2245, 6355, 13655}},
+{3314, 15, 13204, {1, 1, 1, 5, 5, 37, 29, 133, 443, 899, 277, 2353, 7223, 4459, 19159}},
+{3315, 15, 13238, {1, 1, 3, 9, 19, 27, 53, 145, 195, 167, 2045, 447, 1803, 1895, 8431}},
+{3316, 15, 13242, {1, 1, 3, 9, 5, 27, 91, 147, 233, 451, 475, 27, 4629, 16181, 16437}},
+{3317, 15, 13249, {1, 3, 5, 3, 29, 17, 53, 167, 433, 689, 1131, 2985, 1553, 11697, 6993}},
+{3318, 15, 13255, {1, 3, 3, 13, 21, 43, 69, 229, 399, 525, 179, 237, 7017, 5703, 17653}},
+{3319, 15, 13269, {1, 1, 3, 15, 13, 39, 75, 163, 229, 875, 197, 477, 3667, 15501, 15801}},
+{3320, 15, 13270, {1, 1, 7, 15, 15, 51, 81, 187, 487, 673, 865, 1915, 1009, 5935, 8097}},
+{3321, 15, 13274, {1, 3, 5, 5, 7, 3, 63, 77, 495, 815, 391, 2321, 1007, 15661, 30715}},
+{3322, 15, 13285, {1, 1, 7, 3, 17, 25, 83, 173, 173, 911, 1373, 2957, 4549, 15977, 17695}},
+{3323, 15, 13289, {1, 1, 7, 13, 13, 23, 77, 147, 497, 1003, 1687, 1795, 1393, 1881, 8479}},
+{3324, 15, 13298, {1, 3, 7, 11, 27, 43, 97, 25, 61, 457, 203, 2573, 5943, 15021, 4003}},
+{3325, 15, 13307, {1, 3, 3, 13, 9, 37, 37, 25, 219, 889, 1535, 2791, 4531, 13679, 12663}},
+{3326, 15, 13312, {1, 1, 3, 1, 17, 7, 51, 123, 89, 887, 1467, 1645, 3767, 6383, 30837}},
+{3327, 15, 13335, {1, 3, 3, 1, 21, 47, 5, 151, 83, 257, 569, 2711, 637, 12569, 16893}},
+{3328, 15, 13345, {1, 3, 7, 1, 31, 37, 73, 3, 115, 919, 1817, 2483, 4811, 15245, 4375}},
+{3329, 15, 13357, {1, 1, 1, 5, 1, 39, 39, 231, 9, 733, 455, 3383, 4777, 7235, 12631}},
+{3330, 15, 13366, {1, 1, 7, 9, 13, 25, 55, 25, 73, 59, 1699, 929, 755, 1279, 5583}},
+{3331, 15, 13372, {1, 3, 5, 3, 9, 49, 79, 55, 479, 179, 1159, 4079, 3503, 11603, 12361}},
+{3332, 15, 13380, {1, 1, 5, 9, 21, 45, 31, 163, 377, 817, 219, 147, 2581, 12769, 30783}},
+{3333, 15, 13384, {1, 3, 1, 7, 15, 27, 39, 189, 493, 259, 1663, 1213, 961, 11089, 16079}},
+{3334, 15, 13395, {1, 1, 5, 9, 5, 41, 13, 153, 313, 337, 1027, 1267, 4249, 13071, 27043}},
+{3335, 15, 13407, {1, 3, 7, 3, 13, 11, 23, 255, 51, 527, 317, 3217, 5037, 12723, 17411}},
+{3336, 15, 13408, {1, 1, 5, 1, 25, 57, 83, 97, 233, 513, 1283, 2675, 4111, 4111, 32141}},
+{3337, 15, 13413, {1, 3, 3, 15, 25, 33, 103, 81, 155, 189, 139, 1179, 2691, 15119, 13959}},
+{3338, 15, 13414, {1, 3, 3, 1, 25, 55, 67, 19, 19, 9, 437, 579, 4273, 10733, 7125}},
+{3339, 15, 13417, {1, 1, 1, 7, 23, 41, 47, 5, 435, 749, 595, 199, 3941, 7199, 4795}},
+{3340, 15, 13437, {1, 3, 1, 15, 5, 49, 35, 9, 199, 703, 1769, 3269, 5689, 13063, 22771}},
+{3341, 15, 13441, {1, 1, 5, 5, 21, 55, 125, 55, 63, 149, 1167, 3577, 1051, 3921, 20545}},
+{3342, 15, 13447, {1, 3, 7, 13, 29, 53, 107, 193, 163, 339, 1335, 1573, 5809, 5681, 29487}},
+{3343, 15, 13456, {1, 1, 1, 9, 17, 9, 91, 177, 211, 453, 1807, 1881, 6051, 225, 6021}},
+{3344, 15, 13459, {1, 1, 1, 13, 15, 1, 29, 43, 181, 105, 1945, 2313, 6429, 2901, 6221}},
+{3345, 15, 13461, {1, 3, 5, 11, 29, 55, 115, 115, 187, 1013, 697, 1885, 121, 12387, 32443}},
+{3346, 15, 13466, {1, 1, 1, 7, 19, 51, 21, 107, 55, 125, 1655, 2281, 3293, 15749, 27521}},
+{3347, 15, 13484, {1, 1, 7, 9, 19, 9, 81, 93, 139, 401, 193, 73, 5159, 9323, 6019}},
+{3348, 15, 13487, {1, 1, 7, 9, 15, 51, 115, 69, 247, 599, 1163, 2251, 1211, 8827, 15581}},
+{3349, 15, 13489, {1, 1, 7, 9, 5, 39, 75, 185, 321, 911, 849, 843, 6791, 10407, 10513}},
+{3350, 15, 13492, {1, 1, 5, 5, 15, 9, 21, 47, 459, 681, 2001, 1545, 5939, 7073, 29043}},
+{3351, 15, 13496, {1, 3, 1, 11, 13, 25, 53, 97, 487, 797, 567, 3757, 5597, 6313, 18531}},
+{3352, 15, 13510, {1, 1, 3, 3, 29, 55, 11, 219, 325, 591, 2015, 383, 2595, 11855, 22501}},
+{3353, 15, 13531, {1, 1, 1, 5, 15, 57, 33, 125, 323, 749, 1843, 4019, 2075, 6673, 6957}},
+{3354, 15, 13538, {1, 1, 5, 7, 19, 7, 47, 239, 51, 107, 1081, 467, 5493, 7617, 10355}},
+{3355, 15, 13543, {1, 3, 1, 1, 11, 3, 67, 199, 175, 421, 935, 309, 4449, 6363, 9183}},
+{3356, 15, 13547, {1, 1, 1, 7, 9, 33, 3, 219, 481, 513, 417, 1267, 2863, 765, 18431}},
+{3357, 15, 13572, {1, 3, 1, 1, 19, 1, 89, 109, 415, 105, 487, 3241, 7465, 9233, 16307}},
+{3358, 15, 13581, {1, 1, 3, 13, 9, 43, 25, 231, 383, 789, 1855, 691, 3465, 2387, 11715}},
+{3359, 15, 13590, {1, 3, 3, 3, 13, 39, 63, 107, 33, 265, 437, 117, 3179, 5543, 28179}},
+{3360, 15, 13605, {1, 3, 3, 13, 21, 5, 31, 111, 321, 425, 253, 3501, 3209, 15429, 18383}},
+{3361, 15, 13612, {1, 3, 5, 9, 1, 27, 117, 187, 433, 459, 1999, 1069, 4857, 8591, 26343}},
+{3362, 15, 13624, {1, 1, 7, 3, 15, 43, 11, 193, 391, 341, 1203, 1259, 7265, 1783, 13161}},
+{3363, 15, 13630, {1, 1, 7, 1, 5, 15, 45, 143, 193, 985, 1105, 3483, 2421, 9687, 22347}},
+{3364, 15, 13632, {1, 3, 7, 13, 21, 17, 79, 231, 487, 663, 1101, 1025, 5779, 14681, 29181}},
+{3365, 15, 13638, {1, 1, 3, 9, 15, 19, 55, 219, 27, 963, 1513, 1017, 3907, 12279, 32655}},
+{3366, 15, 13661, {1, 3, 7, 3, 31, 27, 17, 1, 51, 861, 529, 1225, 6395, 15787, 5231}},
+{3367, 15, 13665, {1, 3, 3, 11, 27, 7, 101, 143, 21, 191, 1437, 2393, 4097, 14319, 6977}},
+{3368, 15, 13668, {1, 3, 3, 3, 25, 35, 105, 141, 433, 269, 1469, 2939, 5387, 7373, 7863}},
+{3369, 15, 13686, {1, 3, 7, 5, 5, 21, 23, 11, 217, 357, 1847, 101, 1161, 5297, 14879}},
+{3370, 15, 13699, {1, 3, 1, 3, 25, 23, 81, 217, 505, 161, 1667, 1343, 1751, 2463, 26431}},
+{3371, 15, 13701, {1, 1, 3, 1, 17, 51, 125, 205, 385, 351, 731, 2911, 2749, 2689, 27031}},
+{3372, 15, 13708, {1, 1, 5, 5, 5, 17, 31, 171, 477, 671, 167, 1797, 8047, 10123, 4325}},
+{3373, 15, 13716, {1, 1, 7, 1, 11, 23, 123, 161, 99, 1007, 765, 1965, 5395, 16193, 17751}},
+{3374, 15, 13725, {1, 3, 1, 9, 13, 11, 111, 217, 31, 753, 377, 2267, 7893, 7195, 24999}},
+{3375, 15, 13730, {1, 3, 1, 9, 21, 53, 127, 121, 151, 395, 1447, 1411, 5179, 12043, 27607}},
+{3376, 15, 13742, {1, 1, 5, 3, 11, 37, 97, 139, 113, 835, 229, 3741, 827, 5527, 5779}},
+{3377, 15, 13747, {1, 1, 7, 7, 27, 55, 11, 55, 429, 269, 1179, 233, 1053, 10225, 16703}},
+{3378, 15, 13749, {1, 1, 1, 3, 15, 9, 67, 119, 95, 753, 511, 2507, 3953, 6403, 27635}},
+{3379, 15, 13753, {1, 3, 3, 7, 27, 57, 25, 27, 249, 515, 193, 4043, 2017, 751, 10949}},
+{3380, 15, 13754, {1, 3, 1, 9, 31, 57, 67, 21, 177, 573, 1835, 2015, 6201, 2383, 31087}},
+{3381, 15, 13771, {1, 1, 5, 1, 19, 3, 89, 243, 69, 387, 1905, 3465, 2775, 7713, 30081}},
+{3382, 15, 13773, {1, 1, 3, 3, 9, 59, 15, 89, 85, 605, 881, 263, 2551, 797, 16541}},
+{3383, 15, 13782, {1, 3, 7, 11, 25, 41, 59, 139, 405, 571, 1147, 2963, 4175, 12901, 6309}},
+{3384, 15, 13785, {1, 3, 1, 5, 29, 29, 11, 243, 183, 281, 807, 1, 7079, 10079, 13865}},
+{3385, 15, 13798, {1, 3, 7, 5, 5, 1, 89, 55, 423, 157, 675, 1849, 241, 6467, 15459}},
+{3386, 15, 13802, {1, 1, 7, 11, 15, 63, 89, 109, 501, 549, 317, 3043, 1151, 3895, 19851}},
+{3387, 15, 13809, {1, 3, 1, 15, 7, 23, 97, 97, 225, 737, 1117, 3325, 209, 14169, 10813}},
+{3388, 15, 13828, {1, 3, 7, 13, 13, 39, 91, 153, 395, 879, 1041, 3753, 5577, 1985, 25247}},
+{3389, 15, 13832, {1, 1, 1, 3, 17, 15, 113, 143, 101, 901, 1119, 1819, 3577, 3441, 31511}},
+{3390, 15, 13840, {1, 3, 1, 11, 15, 27, 21, 37, 287, 121, 451, 1353, 2173, 299, 18791}},
+{3391, 15, 13850, {1, 3, 3, 5, 23, 1, 49, 145, 315, 769, 99, 1385, 5961, 9121, 1465}},
+{3392, 15, 13861, {1, 3, 3, 13, 21, 39, 39, 233, 271, 113, 615, 2257, 3765, 5921, 313}},
+{3393, 15, 13874, {1, 3, 7, 7, 25, 45, 11, 237, 83, 203, 929, 1819, 2679, 11583, 30091}},
+{3394, 15, 13876, {1, 1, 1, 7, 21, 63, 85, 251, 133, 991, 1515, 2547, 6051, 7279, 3569}},
+{3395, 15, 13886, {1, 3, 7, 15, 11, 19, 87, 17, 313, 283, 1021, 2743, 4855, 13741, 17955}},
+{3396, 15, 13897, {1, 1, 7, 13, 29, 13, 61, 93, 81, 91, 995, 907, 4847, 2599, 20041}},
+{3397, 15, 13900, {1, 1, 3, 11, 13, 45, 103, 33, 243, 109, 2029, 121, 231, 16179, 13741}},
+{3398, 15, 13915, {1, 3, 5, 9, 9, 5, 73, 225, 199, 723, 611, 1909, 2345, 10257, 9909}},
+{3399, 15, 13927, {1, 1, 3, 11, 7, 5, 33, 89, 431, 899, 803, 3173, 6131, 16097, 20561}},
+{3400, 15, 13951, {1, 3, 3, 7, 7, 47, 23, 47, 411, 69, 239, 661, 5591, 10457, 24245}},
+{3401, 15, 13955, {1, 1, 5, 15, 25, 35, 87, 23, 115, 939, 1579, 119, 4001, 13791, 9729}},
+{3402, 15, 13962, {1, 3, 5, 11, 25, 45, 29, 195, 369, 237, 735, 155, 123, 4415, 32255}},
+{3403, 15, 13969, {1, 3, 3, 9, 13, 53, 15, 77, 313, 75, 529, 925, 5679, 14585, 19889}},
+{3404, 15, 13979, {1, 1, 7, 15, 15, 27, 105, 13, 31, 669, 563, 1809, 4321, 7797, 4177}},
+{3405, 15, 13988, {1, 1, 5, 9, 3, 29, 111, 177, 33, 235, 1951, 1561, 141, 4803, 16327}},
+{3406, 15, 13998, {1, 1, 1, 7, 9, 41, 1, 149, 95, 933, 115, 1619, 771, 8189, 8781}},
+{3407, 15, 14000, {1, 1, 5, 3, 13, 41, 33, 159, 355, 159, 1243, 1439, 6571, 14397, 31321}},
+{3408, 15, 14005, {1, 1, 7, 11, 9, 15, 91, 145, 457, 255, 1449, 611, 1449, 2521, 28949}},
+{3409, 15, 14027, {1, 3, 7, 5, 27, 57, 35, 99, 447, 287, 743, 1163, 4379, 7361, 3831}},
+{3410, 15, 14037, {1, 3, 3, 7, 15, 53, 41, 83, 133, 571, 1739, 531, 2921, 11527, 21941}},
+{3411, 15, 14051, {1, 1, 1, 13, 9, 27, 39, 113, 429, 447, 595, 3171, 5245, 4095, 14847}},
+{3412, 15, 14054, {1, 1, 3, 7, 19, 19, 21, 101, 489, 1011, 265, 3899, 3225, 11701, 5193}},
+{3413, 15, 14060, {1, 3, 7, 3, 15, 25, 103, 213, 441, 215, 1483, 263, 3561, 7915, 7969}},
+{3414, 15, 14063, {1, 3, 3, 3, 11, 47, 97, 29, 489, 867, 1347, 2155, 4871, 8001, 18305}},
+{3415, 15, 14071, {1, 3, 1, 9, 25, 15, 61, 17, 343, 775, 1765, 3803, 4577, 8437, 12605}},
+{3416, 15, 14078, {1, 1, 5, 3, 11, 39, 69, 23, 23, 65, 1967, 2429, 1703, 6671, 14981}},
+{3417, 15, 14080, {1, 1, 5, 15, 23, 59, 125, 51, 225, 439, 2019, 2589, 7781, 13111, 2911}},
+{3418, 15, 14085, {1, 1, 1, 3, 1, 31, 37, 245, 203, 305, 821, 367, 5211, 9791, 21777}},
+{3419, 15, 14086, {1, 1, 5, 9, 9, 31, 97, 25, 271, 83, 343, 2461, 1805, 14383, 10059}},
+{3420, 15, 14095, {1, 1, 5, 13, 15, 33, 127, 109, 137, 963, 961, 1647, 7881, 8133, 22359}},
+{3421, 15, 14138, {1, 1, 3, 7, 25, 31, 123, 241, 283, 1, 1781, 23, 971, 6485, 127}},
+{3422, 15, 14145, {1, 1, 5, 15, 15, 27, 25, 145, 395, 679, 979, 571, 1585, 14787, 7465}},
+{3423, 15, 14158, {1, 1, 5, 7, 13, 11, 7, 131, 511, 597, 379, 1513, 6267, 16039, 1503}},
+{3424, 15, 14166, {1, 1, 1, 13, 15, 49, 73, 217, 353, 577, 1913, 1127, 961, 11557, 24993}},
+{3425, 15, 14179, {1, 3, 3, 9, 7, 3, 105, 141, 377, 687, 1917, 485, 983, 11149, 23303}},
+{3426, 15, 14181, {1, 1, 3, 15, 11, 7, 117, 179, 505, 67, 1817, 913, 5757, 1981, 1637}},
+{3427, 15, 14188, {1, 1, 1, 7, 5, 29, 3, 43, 223, 295, 1895, 3425, 5355, 5155, 17197}},
+{3428, 15, 14193, {1, 1, 7, 9, 21, 59, 121, 245, 73, 233, 1527, 869, 4145, 7995, 6473}},
+{3429, 15, 14200, {1, 1, 5, 13, 17, 21, 89, 179, 495, 669, 453, 2603, 5969, 6161, 4743}},
+{3430, 15, 14203, {1, 1, 7, 11, 25, 21, 103, 131, 391, 249, 1633, 2603, 2207, 8987, 15487}},
+{3431, 15, 14215, {1, 3, 7, 9, 13, 45, 99, 251, 115, 597, 1505, 2421, 1231, 10015, 24295}},
+{3432, 15, 14224, {1, 1, 5, 5, 31, 49, 17, 67, 463, 813, 1491, 3309, 7881, 8109, 7289}},
+{3433, 15, 14230, {1, 3, 1, 15, 23, 35, 123, 21, 169, 499, 95, 603, 1829, 7865, 26313}},
+{3434, 15, 14233, {1, 1, 7, 1, 9, 29, 45, 65, 95, 97, 673, 3673, 2969, 2317, 22209}},
+{3435, 15, 14236, {1, 1, 3, 7, 29, 33, 121, 17, 331, 487, 1901, 1951, 5383, 9375, 4029}},
+{3436, 15, 14246, {1, 3, 7, 9, 25, 43, 91, 147, 141, 401, 1647, 2697, 4645, 7179, 31857}},
+{3437, 15, 14267, {1, 3, 5, 11, 9, 31, 127, 105, 39, 883, 1635, 919, 5069, 2875, 24519}},
+{3438, 15, 14282, {1, 1, 5, 9, 1, 63, 73, 135, 95, 503, 385, 3903, 545, 12635, 27569}},
+{3439, 15, 14287, {1, 1, 3, 11, 27, 31, 47, 173, 55, 339, 1255, 1947, 793, 14133, 13963}},
+{3440, 15, 14301, {1, 1, 3, 15, 17, 33, 113, 249, 401, 743, 1307, 3123, 627, 1253, 13285}},
+{3441, 15, 14323, {1, 1, 3, 1, 9, 7, 39, 65, 281, 107, 833, 193, 2987, 12267, 31335}},
+{3442, 15, 14325, {1, 1, 7, 3, 15, 21, 99, 211, 39, 179, 587, 1169, 6455, 8225, 2049}},
+{3443, 15, 14329, {1, 3, 5, 13, 5, 13, 123, 1, 223, 273, 731, 2967, 4793, 4229, 26031}},
+{3444, 15, 14339, {1, 1, 1, 1, 3, 17, 7, 23, 225, 757, 743, 1257, 2047, 12509, 25467}},
+{3445, 15, 14342, {1, 1, 7, 15, 29, 3, 15, 113, 227, 675, 1295, 2777, 2921, 5485, 2577}},
+{3446, 15, 14351, {1, 3, 7, 13, 19, 21, 85, 129, 45, 599, 317, 1513, 4953, 10383, 25253}},
+{3447, 15, 14356, {1, 1, 7, 11, 13, 47, 127, 67, 219, 131, 905, 2005, 851, 15243, 5777}},
+{3448, 15, 14359, {1, 1, 5, 3, 23, 57, 57, 189, 153, 37, 955, 2049, 1295, 15119, 27213}},
+{3449, 15, 14370, {1, 3, 7, 11, 13, 61, 3, 241, 269, 789, 1595, 2369, 4843, 11347, 21543}},
+{3450, 15, 14402, {1, 1, 5, 5, 25, 21, 19, 237, 3, 605, 1343, 3965, 3511, 7889, 27759}},
+{3451, 15, 14411, {1, 3, 1, 15, 21, 15, 123, 5, 345, 945, 283, 1313, 335, 2085, 19505}},
+{3452, 15, 14421, {1, 1, 3, 3, 5, 21, 123, 89, 67, 11, 1247, 1155, 287, 13455, 5693}},
+{3453, 15, 14431, {1, 3, 3, 13, 1, 53, 101, 27, 387, 379, 19, 751, 2445, 11737, 975}},
+{3454, 15, 14435, {1, 3, 3, 3, 9, 29, 81, 117, 443, 145, 1619, 1813, 8125, 5829, 28617}},
+{3455, 15, 14442, {1, 1, 5, 15, 27, 15, 83, 83, 61, 715, 1655, 1631, 3457, 2727, 2163}},
+{3456, 15, 14447, {1, 3, 1, 5, 11, 11, 121, 7, 135, 883, 927, 1817, 6839, 12361, 24119}},
+{3457, 15, 14456, {1, 3, 7, 11, 23, 59, 39, 165, 109, 355, 1303, 381, 5697, 275, 3771}},
+{3458, 15, 14459, {1, 3, 5, 11, 11, 5, 81, 157, 55, 435, 613, 127, 4087, 3791, 21627}},
+{3459, 15, 14472, {1, 3, 7, 15, 13, 37, 83, 195, 207, 771, 51, 3685, 6389, 1229, 11101}},
+{3460, 15, 14477, {1, 3, 7, 13, 31, 3, 9, 13, 487, 95, 77, 809, 5809, 12887, 29933}},
+{3461, 15, 14490, {1, 1, 3, 7, 25, 9, 13, 29, 353, 659, 1785, 3825, 3729, 13109, 12973}},
+{3462, 15, 14496, {1, 1, 1, 5, 21, 3, 97, 1, 245, 917, 29, 1429, 8141, 7569, 32493}},
+{3463, 15, 14501, {1, 3, 1, 9, 19, 13, 13, 109, 377, 1007, 1737, 1939, 1419, 1145, 5065}},
+{3464, 15, 14505, {1, 1, 7, 9, 27, 57, 53, 69, 423, 43, 1629, 1003, 1473, 10809, 5659}},
+{3465, 15, 14513, {1, 1, 1, 9, 1, 45, 11, 231, 351, 155, 663, 2783, 3491, 5725, 25207}},
+{3466, 15, 14520, {1, 1, 1, 3, 15, 25, 77, 89, 231, 813, 657, 2603, 4885, 1383, 14499}},
+{3467, 15, 14534, {1, 3, 5, 5, 9, 21, 101, 181, 449, 491, 737, 803, 659, 11771, 545}},
+{3468, 15, 14562, {1, 3, 7, 9, 7, 19, 27, 199, 265, 329, 1031, 1235, 3191, 10071, 16281}},
+{3469, 15, 14576, {1, 1, 7, 11, 27, 55, 3, 127, 503, 1003, 1041, 1953, 5835, 4851, 13485}},
+{3470, 15, 14579, {1, 1, 7, 15, 5, 45, 97, 61, 221, 497, 1949, 3163, 4707, 8441, 1437}},
+{3471, 15, 14585, {1, 3, 5, 1, 3, 35, 107, 9, 473, 971, 227, 2225, 3999, 3095, 18879}},
+{3472, 15, 14586, {1, 1, 1, 9, 21, 59, 21, 1, 41, 435, 575, 491, 1839, 1095, 9727}},
+{3473, 15, 14606, {1, 3, 5, 9, 13, 29, 123, 251, 465, 701, 1105, 829, 573, 11503, 11861}},
+{3474, 15, 14627, {1, 3, 3, 13, 27, 59, 29, 111, 225, 973, 561, 1481, 835, 9261, 13831}},
+{3475, 15, 14630, {1, 1, 1, 7, 17, 3, 97, 211, 333, 315, 571, 3523, 7305, 6461, 20139}},
+{3476, 15, 14634, {1, 3, 7, 11, 31, 21, 105, 247, 113, 863, 1767, 381, 4623, 8935, 7911}},
+{3477, 15, 14636, {1, 1, 5, 7, 29, 45, 17, 155, 69, 17, 655, 1983, 6385, 6177, 7961}},
+{3478, 15, 14647, {1, 3, 3, 15, 31, 15, 63, 81, 309, 115, 393, 3445, 689, 13963, 18887}},
+{3479, 15, 14653, {1, 1, 5, 1, 19, 39, 127, 61, 357, 53, 195, 2745, 7853, 5753, 3669}},
+{3480, 15, 14659, {1, 3, 7, 7, 17, 51, 57, 145, 451, 365, 1517, 909, 4265, 10737, 9579}},
+{3481, 15, 14671, {1, 1, 3, 13, 3, 37, 121, 103, 257, 47, 1685, 2951, 5753, 15379, 8899}},
+{3482, 15, 14674, {1, 1, 5, 7, 31, 63, 61, 197, 97, 773, 133, 1517, 3093, 14879, 22941}},
+{3483, 15, 14701, {1, 1, 5, 1, 3, 9, 27, 53, 97, 663, 1915, 409, 471, 1391, 24853}},
+{3484, 15, 14716, {1, 1, 1, 7, 21, 53, 69, 5, 187, 571, 2023, 997, 323, 12059, 7071}},
+{3485, 15, 14719, {1, 3, 3, 1, 7, 59, 55, 157, 101, 123, 1301, 3709, 4673, 3897, 28791}},
+{3486, 15, 14720, {1, 3, 7, 5, 5, 23, 39, 139, 365, 415, 1481, 3415, 6323, 11109, 5719}},
+{3487, 15, 14725, {1, 3, 5, 3, 5, 11, 23, 143, 243, 229, 183, 3367, 3187, 8151, 28351}},
+{3488, 15, 14730, {1, 3, 7, 9, 5, 37, 29, 23, 437, 827, 985, 2879, 7611, 1391, 19087}},
+{3489, 15, 14743, {1, 3, 3, 5, 7, 9, 5, 143, 217, 757, 1697, 2459, 453, 8679, 4513}},
+{3490, 15, 14747, {1, 3, 5, 5, 11, 33, 3, 143, 293, 921, 185, 2461, 5547, 12247, 28591}},
+{3491, 15, 14786, {1, 3, 7, 5, 3, 53, 43, 179, 235, 417, 1307, 1367, 3695, 12809, 1807}},
+{3492, 15, 14788, {1, 3, 1, 11, 15, 43, 115, 229, 157, 25, 687, 3347, 271, 5777, 8557}},
+{3493, 15, 14792, {1, 3, 7, 5, 27, 37, 55, 135, 209, 47, 1603, 957, 5785, 11141, 10407}},
+{3494, 15, 14795, {1, 1, 1, 15, 17, 17, 103, 29, 489, 493, 119, 1707, 3463, 1815, 32055}},
+{3495, 15, 14809, {1, 3, 7, 11, 17, 13, 115, 145, 77, 515, 1911, 477, 5997, 8731, 3143}},
+{3496, 15, 14831, {1, 3, 1, 13, 31, 41, 73, 91, 231, 1, 455, 2023, 4691, 3613, 16329}},
+{3497, 15, 14834, {1, 1, 5, 15, 15, 39, 17, 117, 131, 657, 1939, 2245, 2575, 195, 25209}},
+{3498, 15, 14850, {1, 3, 7, 15, 5, 51, 69, 141, 499, 931, 1165, 2119, 1703, 10867, 28443}},
+{3499, 15, 14855, {1, 1, 1, 15, 13, 45, 45, 103, 115, 177, 651, 2545, 1417, 5349, 3385}},
+{3500, 15, 14859, {1, 3, 3, 1, 1, 41, 117, 15, 225, 861, 843, 2775, 4543, 6275, 14671}},
+{3501, 15, 14864, {1, 3, 5, 15, 5, 35, 87, 193, 341, 55, 1131, 945, 6865, 11271, 18705}},
+{3502, 15, 14876, {1, 3, 5, 9, 13, 35, 71, 197, 79, 351, 3, 3939, 1105, 12455, 28921}},
+{3503, 15, 14889, {1, 3, 1, 13, 9, 23, 89, 165, 59, 257, 1369, 161, 6255, 2997, 19175}},
+{3504, 15, 14890, {1, 3, 5, 3, 5, 41, 107, 231, 111, 207, 1865, 2079, 5891, 2487, 5863}},
+{3505, 15, 14898, {1, 3, 7, 15, 3, 3, 105, 235, 263, 991, 367, 1885, 1769, 7805, 11909}},
+{3506, 15, 14909, {1, 3, 3, 5, 15, 59, 67, 247, 77, 367, 1641, 1959, 1921, 5939, 17355}},
+{3507, 15, 14917, {1, 1, 7, 1, 3, 53, 37, 5, 221, 779, 1353, 1633, 2769, 6355, 8505}},
+{3508, 15, 14924, {1, 1, 7, 13, 11, 13, 73, 227, 115, 523, 355, 3127, 7545, 8409, 22335}},
+{3509, 15, 14929, {1, 1, 5, 11, 21, 15, 91, 115, 427, 683, 461, 2433, 6313, 4595, 24401}},
+{3510, 15, 14942, {1, 3, 7, 5, 29, 21, 57, 215, 423, 717, 1455, 705, 6835, 4503, 26077}},
+{3511, 15, 14951, {1, 1, 1, 15, 3, 33, 25, 227, 381, 477, 1023, 2751, 2229, 631, 16903}},
+{3512, 15, 14969, {1, 3, 1, 11, 9, 17, 59, 73, 53, 671, 251, 1729, 7593, 12473, 22533}},
+{3513, 15, 14970, {1, 3, 3, 1, 3, 35, 37, 173, 459, 143, 135, 3871, 2689, 8007, 4379}},
+{3514, 15, 14972, {1, 3, 5, 9, 23, 19, 43, 45, 493, 509, 1851, 1615, 5675, 13793, 6973}},
+{3515, 15, 14982, {1, 3, 3, 15, 5, 17, 77, 85, 451, 753, 579, 1057, 4851, 6017, 4195}},
+{3516, 15, 14988, {1, 3, 3, 5, 31, 29, 81, 159, 103, 391, 15, 899, 4623, 5957, 31961}},
+{3517, 15, 14994, {1, 1, 1, 7, 17, 57, 81, 17, 177, 633, 49, 2793, 5229, 5995, 9491}},
+{3518, 15, 15005, {1, 1, 7, 15, 17, 19, 65, 57, 189, 239, 1229, 929, 2681, 12845, 29311}},
+{3519, 15, 15016, {1, 3, 1, 11, 13, 47, 61, 203, 383, 875, 943, 139, 4217, 8279, 1047}},
+{3520, 15, 15024, {1, 3, 7, 13, 23, 7, 1, 69, 47, 537, 1325, 3101, 685, 14057, 19953}},
+{3521, 15, 15030, {1, 3, 3, 1, 1, 7, 39, 77, 47, 755, 527, 2985, 5433, 15095, 27741}},
+{3522, 15, 15048, {1, 1, 7, 5, 23, 57, 79, 155, 81, 937, 1071, 3929, 1655, 3831, 17351}},
+{3523, 15, 15054, {1, 3, 7, 1, 3, 41, 13, 235, 207, 487, 1883, 2247, 1231, 2751, 15615}},
+{3524, 15, 15066, {1, 1, 7, 1, 21, 57, 95, 191, 119, 483, 283, 2221, 5665, 14819, 26097}},
+{3525, 15, 15071, {1, 3, 1, 1, 9, 59, 27, 51, 393, 31, 925, 715, 7705, 14885, 28767}},
+{3526, 15, 15072, {1, 1, 3, 3, 3, 61, 109, 131, 113, 249, 1331, 2521, 2973, 6375, 20093}},
+{3527, 15, 15075, {1, 3, 7, 9, 31, 37, 125, 245, 237, 245, 111, 379, 7495, 15531, 2325}},
+{3528, 15, 15119, {1, 3, 7, 13, 21, 21, 57, 21, 449, 969, 417, 2999, 509, 639, 7797}},
+{3529, 15, 15121, {1, 3, 7, 7, 7, 29, 11, 175, 55, 705, 891, 863, 3021, 10071, 10267}},
+{3530, 15, 15133, {1, 1, 3, 13, 19, 17, 127, 57, 449, 579, 337, 899, 1235, 11269, 4245}},
+{3531, 15, 15138, {1, 1, 1, 11, 29, 61, 35, 75, 249, 683, 287, 45, 3277, 7521, 2073}},
+{3532, 15, 15143, {1, 3, 5, 5, 15, 25, 77, 63, 63, 801, 1387, 1533, 2185, 10899, 28381}},
+{3533, 15, 15170, {1, 3, 1, 1, 21, 49, 3, 249, 419, 575, 87, 3749, 2523, 16125, 9483}},
+{3534, 15, 15194, {1, 1, 1, 11, 21, 43, 85, 211, 449, 439, 1495, 1841, 4765, 15253, 1467}},
+{3535, 15, 15212, {1, 3, 3, 15, 3, 37, 31, 243, 187, 995, 1103, 2723, 1523, 15967, 28649}},
+{3536, 15, 15223, {1, 1, 5, 11, 9, 11, 17, 87, 335, 125, 1079, 1657, 1237, 8059, 29833}},
+{3537, 15, 15229, {1, 3, 1, 3, 3, 41, 35, 37, 33, 61, 505, 3203, 5, 101, 8571}},
+{3538, 15, 15254, {1, 1, 3, 11, 9, 11, 85, 235, 261, 473, 109, 2127, 5745, 6389, 7431}},
+{3539, 15, 15263, {1, 1, 5, 15, 3, 55, 77, 97, 17, 193, 1267, 3063, 6531, 9797, 8639}},
+{3540, 15, 15270, {1, 1, 5, 5, 25, 41, 79, 83, 485, 697, 149, 1023, 89, 6115, 15227}},
+{3541, 15, 15273, {1, 1, 3, 15, 1, 9, 73, 251, 33, 599, 1017, 353, 4305, 16033, 29663}},
+{3542, 15, 15287, {1, 3, 7, 15, 3, 1, 89, 39, 125, 337, 1445, 3131, 3685, 9849, 25829}},
+{3543, 15, 15299, {1, 3, 7, 3, 19, 1, 63, 179, 349, 135, 185, 2977, 2527, 15087, 18133}},
+{3544, 15, 15301, {1, 1, 3, 3, 23, 7, 91, 221, 325, 723, 345, 81, 8077, 5501, 8453}},
+{3545, 15, 15306, {1, 1, 3, 9, 7, 3, 13, 173, 479, 161, 1989, 3255, 2069, 6717, 559}},
+{3546, 15, 15313, {1, 3, 3, 5, 9, 61, 93, 203, 277, 367, 1141, 981, 4745, 12625, 21003}},
+{3547, 15, 15320, {1, 3, 5, 5, 27, 17, 5, 211, 403, 701, 5, 3091, 4611, 5615, 23667}},
+{3548, 15, 15323, {1, 1, 3, 1, 21, 61, 125, 77, 57, 463, 1499, 791, 2087, 2805, 18829}},
+{3549, 15, 15329, {1, 3, 5, 3, 11, 41, 125, 231, 119, 837, 831, 1331, 7439, 2381, 3759}},
+{3550, 15, 15332, {1, 3, 1, 11, 19, 59, 117, 107, 443, 699, 315, 1491, 2581, 15871, 17159}},
+{3551, 15, 15341, {1, 3, 5, 11, 5, 9, 121, 35, 209, 877, 527, 3493, 4657, 16093, 17589}},
+{3552, 15, 15359, {1, 1, 7, 15, 9, 43, 119, 29, 381, 479, 1443, 3171, 5053, 9625, 21161}},
+{3553, 15, 15361, {1, 1, 3, 5, 15, 21, 31, 223, 83, 399, 1529, 3605, 6343, 10469, 10099}},
+{3554, 15, 15364, {1, 1, 3, 5, 5, 45, 23, 123, 353, 971, 85, 3069, 3245, 6569, 13241}},
+{3555, 15, 15367, {1, 1, 1, 3, 25, 49, 5, 77, 491, 881, 993, 1195, 7677, 5709, 10807}},
+{3556, 15, 15379, {1, 3, 3, 3, 5, 49, 127, 255, 183, 583, 1599, 987, 7281, 7149, 28507}},
+{3557, 15, 15391, {1, 1, 5, 1, 13, 55, 55, 157, 197, 25, 1971, 3161, 3903, 8919, 13563}},
+{3558, 15, 15415, {1, 3, 7, 9, 3, 37, 79, 193, 25, 103, 843, 2651, 6341, 2653, 24337}},
+{3559, 15, 15416, {1, 1, 7, 3, 25, 49, 99, 139, 45, 211, 2033, 2331, 7037, 7177, 1755}},
+{3560, 15, 15419, {1, 3, 7, 3, 5, 19, 127, 135, 403, 221, 141, 1065, 3935, 2745, 25979}},
+{3561, 15, 15433, {1, 1, 3, 3, 31, 23, 111, 37, 261, 7, 835, 2379, 7927, 8181, 23751}},
+{3562, 15, 15469, {1, 3, 7, 15, 1, 39, 79, 3, 103, 427, 1917, 809, 5039, 689, 1939}},
+{3563, 15, 15478, {1, 1, 1, 15, 29, 37, 39, 243, 149, 353, 763, 3405, 5751, 9441, 6653}},
+{3564, 15, 15481, {1, 3, 3, 11, 1, 57, 125, 151, 445, 423, 841, 2265, 5017, 15863, 13057}},
+{3565, 15, 15482, {1, 3, 5, 13, 11, 49, 61, 159, 211, 917, 561, 1903, 3985, 11117, 28969}},
+{3566, 15, 15498, {1, 3, 5, 13, 29, 5, 35, 51, 91, 291, 9, 3713, 3341, 4551, 12085}},
+{3567, 15, 15505, {1, 3, 3, 1, 1, 39, 111, 141, 319, 179, 1709, 1605, 5063, 13279, 10003}},
+{3568, 15, 15517, {1, 1, 3, 9, 7, 59, 91, 41, 343, 475, 1669, 2311, 5141, 12661, 25847}},
+{3569, 15, 15518, {1, 3, 5, 9, 9, 11, 49, 221, 1, 243, 791, 229, 503, 373, 19189}},
+{3570, 15, 15527, {1, 1, 5, 11, 17, 13, 45, 57, 215, 491, 1601, 2183, 3713, 429, 22007}},
+{3571, 15, 15528, {1, 1, 3, 11, 31, 61, 23, 237, 261, 955, 1085, 1541, 2601, 909, 7749}},
+{3572, 15, 15545, {1, 1, 3, 9, 13, 11, 121, 173, 177, 551, 1757, 2745, 2265, 4611, 743}},
+{3573, 15, 15548, {1, 1, 3, 15, 23, 43, 107, 239, 463, 369, 1857, 1073, 1247, 1029, 22557}},
+{3574, 15, 15554, {1, 1, 3, 11, 23, 35, 89, 93, 41, 941, 1141, 2339, 1423, 8007, 28685}},
+{3575, 15, 15565, {1, 3, 5, 13, 29, 7, 79, 15, 59, 145, 1237, 2215, 1257, 12621, 31101}},
+{3576, 15, 15577, {1, 1, 3, 7, 13, 55, 57, 229, 205, 1009, 341, 3901, 5189, 957, 32587}},
+{3577, 15, 15580, {1, 3, 7, 11, 1, 1, 41, 7, 365, 407, 1609, 1423, 6483, 5171, 32519}},
+{3578, 15, 15587, {1, 3, 7, 3, 17, 31, 125, 27, 125, 335, 1395, 2639, 329, 2549, 14449}},
+{3579, 15, 15601, {1, 3, 3, 7, 19, 45, 11, 73, 123, 179, 1685, 3385, 2379, 3387, 16793}},
+{3580, 15, 15604, {1, 3, 7, 5, 31, 25, 47, 153, 121, 453, 935, 3953, 2081, 12145, 24979}},
+{3581, 15, 15611, {1, 1, 7, 13, 25, 11, 65, 3, 277, 237, 1129, 1801, 4165, 9065, 18747}},
+{3582, 15, 15616, {1, 1, 7, 7, 13, 5, 37, 253, 507, 645, 1355, 3401, 6707, 6329, 11237}},
+{3583, 15, 15619, {1, 1, 3, 15, 17, 49, 3, 233, 407, 451, 69, 3859, 3171, 12303, 21031}},
+{3584, 15, 15625, {1, 1, 3, 3, 9, 53, 119, 117, 401, 903, 1449, 3639, 4083, 2095, 22085}},
+{3585, 15, 15633, {1, 3, 7, 15, 5, 61, 117, 193, 137, 431, 195, 4019, 3047, 5049, 14281}},
+{3586, 15, 15674, {1, 1, 1, 15, 17, 19, 29, 83, 449, 257, 1105, 1949, 1749, 3459, 6343}},
+{3587, 15, 15681, {1, 1, 1, 15, 23, 39, 61, 219, 109, 365, 863, 1813, 6673, 15999, 5101}},
+{3588, 15, 15691, {1, 1, 5, 5, 13, 11, 37, 151, 365, 719, 1233, 2425, 1285, 1721, 1205}},
+{3589, 15, 15693, {1, 3, 3, 3, 7, 53, 109, 153, 45, 425, 1741, 1229, 4405, 8071, 25155}},
+{3590, 15, 15696, {1, 3, 1, 1, 1, 13, 39, 49, 413, 77, 1367, 2553, 5563, 7659, 3467}},
+{3591, 15, 15712, {1, 1, 5, 9, 3, 49, 23, 11, 445, 121, 1505, 877, 4137, 1809, 2429}},
+{3592, 15, 15717, {1, 1, 1, 11, 21, 13, 93, 33, 493, 805, 775, 2939, 2961, 13625, 31879}},
+{3593, 15, 15724, {1, 1, 7, 5, 1, 59, 63, 131, 373, 23, 337, 2107, 5315, 4889, 22851}},
+{3594, 15, 15727, {1, 1, 3, 13, 21, 47, 15, 131, 353, 793, 1891, 1757, 5793, 1147, 23697}},
+{3595, 15, 15730, {1, 3, 5, 13, 7, 59, 25, 135, 259, 109, 1835, 429, 8153, 7355, 145}},
+{3596, 15, 15746, {1, 3, 3, 13, 9, 47, 121, 89, 89, 635, 1079, 2353, 4803, 11369, 12653}},
+{3597, 15, 15751, {1, 3, 5, 9, 23, 39, 49, 231, 105, 603, 613, 2021, 6073, 11819, 10595}},
+{3598, 15, 15760, {1, 3, 7, 7, 7, 19, 19, 155, 347, 387, 1459, 3793, 619, 14437, 2455}},
+{3599, 15, 15770, {1, 1, 1, 15, 21, 35, 19, 185, 483, 425, 479, 3429, 5403, 10791, 14219}},
+{3600, 15, 15782, {1, 1, 3, 11, 5, 51, 105, 63, 493, 677, 1457, 2865, 5619, 9321, 19583}},
+{3601, 15, 15791, {1, 1, 3, 3, 23, 1, 77, 177, 263, 289, 1567, 3837, 5359, 3269, 16023}},
+{3602, 15, 15796, {1, 1, 7, 3, 13, 61, 79, 77, 51, 953, 1417, 795, 4467, 2981, 25131}},
+{3603, 15, 15808, {1, 1, 5, 13, 23, 13, 29, 185, 337, 7, 149, 3609, 8119, 9545, 16579}},
+{3604, 15, 15814, {1, 3, 1, 5, 23, 9, 123, 15, 99, 55, 1021, 3709, 1521, 15189, 22193}},
+{3605, 15, 15825, {1, 3, 7, 9, 13, 41, 39, 45, 49, 181, 1587, 3213, 1037, 14775, 3333}},
+{3606, 15, 15828, {1, 1, 1, 7, 29, 55, 59, 31, 411, 601, 191, 283, 3211, 7951, 7919}},
+{3607, 15, 15835, {1, 1, 7, 7, 21, 47, 7, 193, 343, 831, 1267, 3289, 1015, 13093, 2717}},
+{3608, 15, 15844, {1, 3, 7, 1, 17, 9, 97, 19, 279, 827, 1699, 3573, 3137, 3535, 17791}},
+{3609, 15, 15847, {1, 1, 5, 11, 27, 15, 103, 135, 35, 625, 1575, 97, 7013, 13353, 19333}},
+{3610, 15, 15853, {1, 3, 3, 7, 17, 13, 49, 135, 435, 743, 1799, 2655, 4839, 2893, 31153}},
+{3611, 15, 15856, {1, 1, 5, 1, 3, 41, 1, 195, 53, 803, 1575, 2939, 3873, 10495, 5211}},
+{3612, 15, 15877, {1, 3, 1, 15, 19, 19, 37, 59, 355, 483, 685, 3899, 4645, 15127, 3479}},
+{3613, 15, 15878, {1, 1, 5, 3, 25, 9, 9, 229, 101, 631, 1165, 4091, 3723, 10655, 9463}},
+{3614, 15, 15887, {1, 3, 5, 15, 5, 13, 91, 61, 19, 469, 1675, 3331, 3121, 3435, 4111}},
+{3615, 15, 15908, {1, 1, 7, 1, 31, 61, 23, 83, 165, 551, 1097, 3825, 5385, 4723, 3635}},
+{3616, 15, 15917, {1, 3, 7, 15, 9, 31, 11, 121, 503, 855, 561, 1647, 1229, 1147, 15997}},
+{3617, 15, 15923, {1, 3, 7, 13, 21, 47, 41, 195, 197, 719, 1263, 3609, 7515, 2659, 30713}},
+{3618, 15, 15930, {1, 1, 1, 7, 31, 61, 101, 101, 479, 571, 605, 301, 6633, 15587, 23665}},
+{3619, 15, 15937, {1, 3, 7, 3, 25, 39, 35, 225, 135, 463, 53, 709, 5129, 4135, 10421}},
+{3620, 15, 15958, {1, 1, 5, 13, 19, 55, 107, 15, 163, 287, 673, 899, 5197, 4619, 3465}},
+{3621, 15, 15977, {1, 3, 3, 5, 21, 49, 15, 105, 283, 877, 1875, 1079, 3431, 13053, 26599}},
+{3622, 15, 15991, {1, 1, 7, 1, 1, 1, 95, 113, 119, 575, 1159, 2325, 6895, 12177, 4369}},
+{3623, 15, 16007, {1, 1, 1, 11, 25, 25, 83, 207, 301, 729, 1947, 2321, 3621, 15707, 11303}},
+{3624, 15, 16011, {1, 1, 5, 5, 7, 63, 83, 105, 211, 175, 1817, 2883, 5385, 7437, 24865}},
+{3625, 15, 16014, {1, 3, 7, 5, 23, 39, 19, 211, 151, 295, 573, 223, 5065, 6345, 23187}},
+{3626, 15, 16021, {1, 1, 7, 11, 15, 31, 89, 123, 57, 695, 685, 1799, 659, 9929, 22933}},
+{3627, 15, 16022, {1, 1, 7, 7, 19, 17, 27, 137, 117, 141, 1481, 869, 7061, 3073, 19671}},
+{3628, 15, 16028, {1, 3, 3, 11, 9, 19, 123, 93, 39, 517, 883, 3769, 2267, 8089, 6617}},
+{3629, 15, 16035, {1, 3, 1, 7, 9, 61, 51, 241, 319, 853, 1239, 899, 105, 1677, 29351}},
+{3630, 15, 16041, {1, 1, 7, 15, 13, 59, 85, 175, 223, 87, 905, 3175, 3405, 3489, 18475}},
+{3631, 15, 16056, {1, 1, 1, 15, 1, 55, 79, 97, 315, 605, 851, 4015, 3689, 9371, 31523}},
+{3632, 15, 16069, {1, 1, 5, 15, 1, 39, 91, 27, 211, 881, 1375, 2307, 5791, 10185, 23093}},
+{3633, 15, 16076, {1, 3, 1, 5, 3, 17, 59, 219, 105, 623, 21, 2843, 3427, 4799, 3793}},
+{3634, 15, 16081, {1, 3, 3, 7, 21, 55, 17, 29, 397, 93, 1981, 4047, 935, 5971, 14589}},
+{3635, 15, 16087, {1, 1, 3, 9, 5, 57, 63, 27, 373, 815, 167, 205, 367, 4945, 30041}},
+{3636, 15, 16088, {1, 1, 5, 9, 7, 3, 69, 35, 197, 309, 1729, 3735, 1523, 10427, 26253}},
+{3637, 15, 16110, {1, 1, 3, 7, 7, 49, 35, 189, 297, 311, 2025, 305, 3863, 14393, 2533}},
+{3638, 15, 16112, {1, 3, 3, 9, 17, 31, 5, 17, 167, 601, 909, 3149, 2533, 12123, 25325}},
+{3639, 15, 16117, {1, 3, 5, 3, 11, 41, 69, 199, 79, 611, 133, 3519, 5955, 4609, 27403}},
+{3640, 15, 16150, {1, 3, 3, 13, 3, 17, 53, 165, 361, 797, 1447, 869, 6707, 6541, 32249}},
+{3641, 15, 16153, {1, 3, 1, 1, 29, 47, 17, 45, 473, 199, 1595, 3095, 3635, 6965, 21859}},
+{3642, 15, 16160, {1, 1, 3, 9, 1, 15, 59, 163, 91, 811, 1087, 1707, 6743, 12643, 29901}},
+{3643, 15, 16166, {1, 1, 1, 3, 19, 21, 7, 209, 121, 821, 709, 1085, 5333, 7689, 28355}},
+{3644, 15, 16172, {1, 3, 1, 15, 5, 27, 115, 31, 37, 79, 1347, 155, 3709, 13251, 32151}},
+{3645, 15, 16190, {1, 3, 7, 15, 27, 27, 127, 231, 137, 205, 1665, 1461, 299, 2797, 879}},
+{3646, 15, 16195, {1, 1, 1, 7, 13, 3, 127, 13, 253, 481, 1435, 1895, 2665, 7611, 17761}},
+{3647, 15, 16204, {1, 1, 3, 7, 7, 21, 71, 247, 301, 183, 1785, 331, 4835, 2251, 4493}},
+{3648, 15, 16216, {1, 3, 7, 9, 9, 1, 77, 169, 103, 647, 1959, 1847, 5803, 3421, 15915}},
+{3649, 15, 16222, {1, 3, 1, 7, 19, 17, 81, 45, 263, 549, 1607, 2177, 1117, 14427, 16451}},
+{3650, 15, 16228, {1, 1, 7, 15, 27, 25, 27, 27, 33, 813, 1667, 253, 2749, 927, 29707}},
+{3651, 15, 16245, {1, 1, 7, 3, 17, 29, 13, 67, 417, 303, 19, 3809, 7225, 12775, 3933}},
+{3652, 15, 16255, {1, 1, 1, 11, 13, 41, 77, 217, 281, 659, 1099, 3047, 1619, 525, 4313}},
+{3653, 15, 16265, {1, 3, 3, 9, 23, 47, 5, 33, 219, 531, 77, 2307, 1893, 8335, 8281}},
+{3654, 15, 16273, {1, 3, 7, 3, 3, 35, 27, 249, 159, 495, 431, 3001, 1475, 11505, 15693}},
+{3655, 15, 16276, {1, 1, 5, 9, 21, 49, 43, 159, 465, 959, 179, 993, 121, 11569, 21027}},
+{3656, 15, 16283, {1, 3, 1, 5, 1, 61, 9, 221, 231, 55, 191, 2829, 3331, 8911, 15109}},
+{3657, 15, 16295, {1, 1, 7, 1, 7, 35, 67, 97, 159, 191, 935, 3151, 6397, 10751, 1835}},
+{3658, 15, 16304, {1, 1, 1, 7, 15, 39, 127, 163, 437, 333, 829, 753, 8151, 13239, 523}},
+{3659, 15, 16313, {1, 1, 3, 13, 9, 25, 73, 155, 445, 239, 2035, 15, 5243, 15531, 1733}},
+{3660, 15, 16319, {1, 3, 7, 15, 5, 25, 3, 55, 117, 57, 783, 1509, 7043, 13159, 8557}},
+{3661, 15, 16328, {1, 3, 5, 1, 21, 55, 89, 119, 199, 79, 161, 1597, 3263, 3335, 5757}},
+{3662, 15, 16345, {1, 3, 7, 5, 27, 23, 85, 113, 111, 211, 389, 1513, 2759, 7945, 931}},
+{3663, 15, 16355, {1, 1, 1, 7, 1, 5, 17, 177, 357, 619, 5, 2583, 621, 2973, 28845}},
+{3664, 15, 16364, {1, 3, 7, 13, 11, 21, 47, 99, 421, 279, 1541, 1305, 4571, 6127, 20735}},
+{3665, 15, 16372, {1, 3, 5, 5, 23, 43, 19, 137, 425, 409, 1625, 2671, 4385, 3197, 25753}},
+{3666, 15, 16375, {1, 1, 7, 5, 27, 17, 57, 15, 383, 181, 951, 2115, 5237, 1495, 9671}},
+{3667, 15, 16382, {1, 3, 3, 11, 9, 1, 53, 127, 375, 499, 1487, 121, 1465, 3175, 24337}},
+{3668, 16, 22, {1, 3, 7, 11, 29, 35, 67, 129, 221, 439, 1159, 3501, 7741, 8885, 11381, 20707}},
+{3669, 16, 28, {1, 3, 5, 11, 29, 59, 23, 117, 343, 637, 1825, 1687, 2823, 11641, 3311, 23603}},
+{3670, 16, 31, {1, 1, 5, 11, 1, 35, 103, 155, 233, 575, 1761, 503, 4175, 6105, 29737, 32681}},
+{3671, 16, 41, {1, 3, 3, 1, 5, 63, 27, 71, 245, 433, 1779, 2475, 5479, 4705, 10795, 34247}},
+{3672, 16, 94, {1, 3, 5, 7, 29, 45, 117, 5, 393, 849, 843, 3131, 6995, 9979, 28907, 30115}},
+{3673, 16, 107, {1, 3, 5, 9, 27, 29, 69, 5, 395, 561, 1531, 409, 2779, 8785, 16405, 27315}},
+{3674, 16, 151, {1, 3, 1, 9, 15, 29, 85, 3, 331, 19, 1941, 567, 6957, 747, 1627, 11347}},
+{3675, 16, 158, {1, 1, 3, 9, 27, 45, 47, 127, 133, 921, 1817, 2231, 6333, 14371, 12799, 9831}},
+{3676, 16, 167, {1, 1, 5, 15, 31, 7, 125, 13, 455, 159, 331, 3629, 4705, 11261, 3657, 36307}},
+{3677, 16, 174, {1, 1, 5, 9, 11, 53, 51, 35, 87, 885, 1975, 3899, 1013, 7667, 32385, 33635}},
+{3678, 16, 203, {1, 1, 1, 3, 7, 45, 107, 177, 193, 765, 731, 139, 5563, 623, 16485, 54999}},
+{3679, 16, 208, {1, 1, 5, 9, 17, 53, 117, 69, 385, 587, 1483, 149, 2769, 3013, 18183, 10173}},
+{3680, 16, 214, {1, 1, 5, 11, 5, 3, 25, 153, 351, 749, 801, 3077, 3209, 11189, 25241, 14115}},
+{3681, 16, 223, {1, 1, 7, 9, 1, 47, 41, 247, 135, 163, 899, 1517, 5647, 10595, 32531, 12497}},
+{3682, 16, 227, {1, 3, 5, 11, 5, 61, 111, 215, 251, 279, 825, 2155, 3527, 173, 10973, 59257}},
+{3683, 16, 266, {1, 3, 5, 11, 25, 15, 71, 83, 135, 231, 1415, 3761, 7513, 8337, 28979, 43615}},
+{3684, 16, 268, {1, 3, 5, 13, 19, 5, 55, 165, 141, 119, 1891, 2255, 4735, 16217, 26195, 50527}},
+{3685, 16, 274, {1, 1, 7, 15, 23, 59, 59, 191, 1, 855, 453, 2619, 5013, 14749, 24335, 44339}},
+{3686, 16, 279, {1, 1, 1, 13, 15, 41, 51, 147, 229, 495, 1191, 867, 1525, 581, 29713, 26391}},
+{3687, 16, 302, {1, 1, 1, 9, 29, 5, 59, 127, 105, 417, 301, 2249, 6335, 3513, 17373, 52977}},
+{3688, 16, 310, {1, 1, 3, 7, 21, 27, 109, 143, 63, 347, 1429, 2889, 2597, 10243, 9913, 22687}},
+{3689, 16, 322, {1, 3, 5, 5, 7, 3, 125, 147, 313, 351, 1163, 415, 5615, 5571, 7089, 55621}},
+{3690, 16, 328, {1, 3, 3, 3, 31, 43, 101, 93, 9, 671, 135, 333, 2169, 11169, 7403, 50707}},
+{3691, 16, 336, {1, 1, 7, 13, 15, 33, 125, 155, 227, 827, 1047, 2441, 3007, 10881, 19969, 63805}},
+{3692, 16, 370, {1, 3, 3, 5, 31, 33, 29, 249, 159, 797, 1475, 841, 6933, 6417, 25629, 61865}},
+{3693, 16, 398, {1, 3, 3, 15, 11, 55, 11, 117, 149, 911, 1589, 3133, 6477, 6123, 10471, 41099}},
+{3694, 16, 421, {1, 3, 3, 9, 27, 37, 1, 119, 509, 969, 831, 3771, 2093, 13621, 31737, 43269}},
+{3695, 16, 436, {1, 1, 1, 1, 9, 23, 119, 109, 487, 753, 1673, 2163, 3349, 4741, 29971, 3407}},
+{3696, 16, 440, {1, 3, 3, 7, 25, 7, 67, 9, 461, 631, 651, 2271, 5663, 2621, 3953, 20975}},
+{3697, 16, 451, {1, 1, 5, 11, 13, 31, 29, 255, 371, 517, 845, 3649, 1187, 10061, 22887, 58417}},
+{3698, 16, 454, {1, 3, 5, 13, 29, 1, 11, 137, 151, 249, 167, 1243, 997, 11023, 11875, 42315}},
+{3699, 16, 463, {1, 1, 5, 5, 5, 55, 103, 71, 255, 1023, 209, 1005, 2147, 11527, 17863, 6661}},
+{3700, 16, 465, {1, 1, 3, 3, 31, 39, 7, 151, 353, 775, 1313, 1257, 4197, 2625, 9571, 27269}},
+{3701, 16, 494, {1, 1, 1, 3, 7, 17, 3, 127, 501, 503, 1879, 2329, 3049, 10603, 2111, 33189}},
+{3702, 16, 508, {1, 3, 3, 7, 13, 59, 93, 13, 375, 483, 1991, 2257, 3003, 1699, 4339, 51827}},
+{3703, 16, 532, {1, 3, 7, 15, 27, 41, 59, 225, 405, 807, 1545, 2581, 1173, 14137, 3413, 39299}},
+{3704, 16, 555, {1, 1, 1, 3, 9, 23, 37, 123, 465, 1023, 1065, 1455, 5107, 3839, 20451, 11461}},
+{3705, 16, 563, {1, 1, 1, 11, 19, 55, 91, 121, 317, 199, 215, 3031, 7223, 11891, 21463, 64921}},
+{3706, 16, 577, {1, 3, 7, 11, 19, 5, 5, 115, 399, 219, 71, 1465, 281, 14451, 26807, 42541}},
+{3707, 16, 580, {1, 3, 5, 13, 3, 33, 75, 35, 19, 559, 761, 947, 7479, 15325, 31453, 20561}},
+{3708, 16, 584, {1, 3, 3, 13, 23, 47, 99, 73, 331, 353, 401, 1737, 6235, 13781, 5547, 56443}},
+{3709, 16, 607, {1, 3, 3, 13, 21, 37, 41, 205, 87, 399, 51, 3175, 7403, 12875, 21129, 7079}},
+{3710, 16, 608, {1, 3, 5, 11, 15, 47, 33, 39, 465, 871, 277, 2351, 695, 1953, 24293, 20595}},
+{3711, 16, 665, {1, 1, 7, 11, 13, 15, 115, 59, 469, 715, 191, 1927, 905, 13463, 29005, 46789}},
+{3712, 16, 675, {1, 3, 5, 9, 13, 55, 79, 17, 265, 887, 905, 3985, 6907, 3379, 20055, 58569}},
+{3713, 16, 692, {1, 1, 7, 11, 21, 29, 23, 109, 17, 427, 1623, 2219, 3857, 3709, 25033, 63823}},
+{3714, 16, 707, {1, 3, 5, 15, 19, 27, 113, 15, 25, 63, 1885, 2693, 5301, 9385, 14137, 26097}},
+{3715, 16, 737, {1, 3, 3, 11, 17, 5, 73, 143, 79, 957, 461, 1709, 4909, 2285, 18113, 8401}},
+{3716, 16, 750, {1, 1, 3, 7, 9, 9, 101, 127, 137, 755, 1359, 1965, 83, 13335, 27763, 7941}},
+{3717, 16, 757, {1, 1, 1, 3, 13, 61, 95, 61, 295, 615, 555, 2163, 8155, 14043, 21465, 46741}},
+{3718, 16, 800, {1, 1, 1, 13, 29, 19, 111, 17, 373, 153, 1703, 2199, 7209, 15845, 1879, 7493}},
+{3719, 16, 805, {1, 3, 1, 13, 21, 51, 49, 51, 255, 151, 207, 1915, 7629, 2705, 8739, 7467}},
+{3720, 16, 809, {1, 3, 7, 5, 21, 21, 23, 193, 467, 739, 519, 2315, 2953, 10633, 9163, 6007}},
+{3721, 16, 837, {1, 3, 1, 5, 23, 19, 23, 247, 93, 297, 1089, 2349, 4683, 13609, 7615, 18647}},
+{3722, 16, 865, {1, 1, 3, 3, 21, 39, 19, 71, 93, 1, 133, 3531, 7503, 2819, 24211, 1739}},
+{3723, 16, 949, {1, 3, 5, 13, 9, 43, 31, 111, 493, 739, 705, 2715, 3613, 11877, 27945, 46053}},
+{3724, 16, 950, {1, 1, 7, 13, 27, 59, 103, 129, 53, 531, 1379, 1441, 5341, 14937, 5079, 39881}},
+{3725, 16, 956, {1, 1, 3, 3, 11, 63, 91, 95, 433, 393, 715, 809, 591, 4141, 17417, 54107}},
+{3726, 16, 961, {1, 3, 5, 1, 7, 25, 25, 175, 205, 803, 183, 1441, 1279, 2753, 20001, 56677}},
+{3727, 16, 1016, {1, 1, 5, 3, 13, 23, 77, 25, 133, 137, 1907, 1313, 2463, 14339, 13, 57757}},
+{3728, 16, 1030, {1, 1, 5, 9, 23, 35, 1, 119, 111, 61, 403, 1815, 1985, 5651, 10883, 55943}},
+{3729, 16, 1072, {1, 3, 1, 7, 21, 43, 115, 7, 107, 719, 759, 1521, 467, 8735, 29785, 63821}},
+{3730, 16, 1119, {1, 1, 3, 13, 19, 17, 51, 141, 399, 569, 703, 2221, 2809, 13355, 1907, 15837}},
+{3731, 16, 1130, {1, 1, 5, 15, 15, 53, 57, 31, 481, 69, 1439, 4049, 6727, 11307, 20683, 63517}},
+{3732, 16, 1135, {1, 1, 1, 3, 13, 27, 9, 255, 363, 131, 1745, 2489, 6451, 6585, 12873, 35405}},
+{3733, 16, 1137, {1, 3, 5, 1, 17, 31, 113, 135, 449, 915, 1017, 2317, 6821, 5483, 30707, 45279}},
+{3734, 16, 1144, {1, 3, 5, 1, 13, 47, 25, 53, 413, 545, 1777, 3049, 7527, 9689, 25935, 9919}},
+{3735, 16, 1149, {1, 3, 7, 11, 17, 39, 13, 131, 295, 517, 1755, 2977, 6267, 12351, 8957, 17765}},
+{3736, 16, 1180, {1, 1, 7, 5, 27, 57, 47, 21, 125, 429, 1169, 1717, 5455, 16359, 29065, 6671}},
+{3737, 16, 1214, {1, 1, 5, 5, 21, 15, 79, 241, 83, 515, 859, 2351, 3125, 7465, 30475, 19759}},
+{3738, 16, 1221, {1, 3, 1, 9, 11, 5, 81, 11, 7, 221, 141, 3329, 3435, 323, 18999, 54735}},
+{3739, 16, 1234, {1, 1, 1, 15, 7, 57, 87, 251, 63, 561, 929, 1367, 2511, 14527, 9335, 38775}},
+{3740, 16, 1239, {1, 3, 3, 9, 23, 37, 59, 105, 179, 515, 235, 2445, 433, 13039, 27005, 48829}},
+{3741, 16, 1249, {1, 1, 1, 1, 23, 37, 103, 31, 89, 921, 1687, 831, 387, 10237, 1241, 19295}},
+{3742, 16, 1250, {1, 3, 3, 7, 25, 23, 57, 251, 309, 579, 603, 807, 7383, 8579, 4025, 16757}},
+{3743, 16, 1267, {1, 1, 3, 15, 23, 59, 29, 33, 467, 641, 1271, 2915, 2549, 14767, 26557, 43483}},
+{3744, 16, 1273, {1, 1, 7, 13, 1, 57, 23, 129, 321, 75, 189, 4087, 5011, 4355, 25759, 37153}},
+{3745, 16, 1342, {1, 1, 5, 1, 21, 57, 25, 183, 37, 669, 259, 1381, 877, 10245, 16643, 61035}},
+{3746, 16, 1344, {1, 1, 7, 5, 11, 11, 85, 141, 393, 957, 1745, 2243, 1681, 5583, 16527, 12017}},
+{3747, 16, 1373, {1, 1, 5, 15, 23, 31, 5, 169, 287, 527, 1831, 2937, 7533, 9739, 24305, 2239}},
+{3748, 16, 1378, {1, 1, 7, 1, 7, 13, 3, 243, 189, 309, 607, 3659, 6369, 7649, 24255, 55373}},
+{3749, 16, 1408, {1, 1, 1, 3, 3, 59, 103, 209, 287, 913, 1223, 1063, 7715, 6073, 26697, 25671}},
+{3750, 16, 1417, {1, 3, 7, 5, 19, 19, 117, 191, 275, 637, 991, 2199, 2921, 10553, 21211, 25981}},
+{3751, 16, 1418, {1, 3, 3, 5, 29, 59, 17, 13, 127, 57, 1405, 3181, 2237, 1795, 21419, 43421}},
+{3752, 16, 1448, {1, 1, 1, 15, 25, 41, 11, 117, 463, 425, 305, 1441, 4307, 7967, 17529, 4043}},
+{3753, 16, 1454, {1, 3, 5, 5, 19, 53, 69, 73, 453, 611, 1583, 1721, 6303, 10561, 18527, 48973}},
+{3754, 16, 1510, {1, 1, 7, 11, 15, 61, 87, 69, 463, 771, 819, 469, 8165, 8897, 29657, 55161}},
+{3755, 16, 1513, {1, 1, 5, 1, 15, 25, 23, 47, 287, 457, 1219, 473, 4127, 3349, 9425, 41541}},
+{3756, 16, 1522, {1, 3, 7, 5, 17, 17, 33, 161, 239, 231, 241, 1297, 4879, 12761, 20939, 65261}},
+{3757, 16, 1543, {1, 3, 3, 9, 19, 53, 95, 89, 117, 333, 1815, 2217, 7779, 8213, 4667, 58395}},
+{3758, 16, 1550, {1, 3, 3, 9, 17, 7, 41, 99, 371, 797, 729, 2851, 2003, 4463, 20793, 54315}},
+{3759, 16, 1552, {1, 3, 5, 5, 23, 39, 19, 235, 163, 365, 141, 791, 455, 2761, 9115, 53351}},
+{3760, 16, 1588, {1, 3, 3, 3, 9, 27, 29, 139, 165, 867, 2023, 1333, 3771, 10451, 9141, 41177}},
+{3761, 16, 1592, {1, 1, 3, 7, 3, 11, 125, 157, 355, 519, 187, 3381, 1151, 1629, 25247, 42797}},
+{3762, 16, 1597, {1, 3, 3, 3, 21, 25, 37, 155, 257, 311, 961, 1945, 1383, 5679, 7857, 7183}},
+{3763, 16, 1606, {1, 3, 3, 5, 29, 11, 49, 125, 171, 605, 1923, 2781, 2555, 5063, 5075, 43301}},
+{3764, 16, 1610, {1, 3, 5, 9, 27, 1, 27, 149, 253, 205, 1299, 2901, 2891, 975, 7641, 8115}},
+{3765, 16, 1617, {1, 3, 5, 3, 31, 7, 49, 215, 81, 791, 1485, 837, 5051, 1947, 7521, 25723}},
+{3766, 16, 1623, {1, 3, 5, 7, 23, 25, 69, 13, 3, 859, 441, 3577, 1687, 6559, 8687, 46757}},
+{3767, 16, 1657, {1, 1, 1, 9, 1, 59, 3, 31, 251, 187, 617, 2607, 4635, 6121, 8565, 8871}},
+{3768, 16, 1697, {1, 3, 3, 9, 29, 37, 127, 87, 153, 633, 1691, 2729, 3167, 3219, 21237, 25573}},
+{3769, 16, 1729, {1, 1, 5, 13, 19, 63, 93, 235, 299, 621, 405, 663, 6639, 12265, 9303, 42719}},
+{3770, 16, 1735, {1, 1, 3, 9, 25, 11, 9, 231, 101, 335, 1793, 1497, 7069, 4171, 30199, 63}},
+{3771, 16, 1769, {1, 1, 1, 1, 5, 19, 17, 217, 165, 413, 925, 1409, 6559, 14537, 22057, 44331}},
+{3772, 16, 1778, {1, 1, 3, 7, 11, 51, 45, 217, 57, 795, 951, 2933, 6705, 137, 30525, 9679}},
+{3773, 16, 1826, {1, 1, 3, 15, 27, 47, 35, 125, 363, 619, 1027, 2861, 3923, 10459, 16789, 27277}},
+{3774, 16, 1858, {1, 1, 7, 7, 13, 37, 33, 29, 385, 851, 143, 119, 7345, 4251, 25121, 31609}},
+{3775, 16, 1870, {1, 3, 1, 1, 17, 25, 119, 7, 365, 397, 601, 2087, 6903, 15345, 14671, 37889}},
+{3776, 16, 1875, {1, 3, 1, 13, 19, 51, 41, 139, 133, 723, 25, 2621, 1257, 7037, 9527, 50037}},
+{3777, 16, 1922, {1, 1, 5, 11, 5, 59, 119, 75, 397, 545, 1095, 585, 3271, 1049, 123, 33029}},
+{3778, 16, 1924, {1, 1, 7, 11, 9, 27, 21, 197, 177, 31, 453, 2457, 2733, 7787, 1923, 24639}},
+{3779, 16, 1933, {1, 1, 7, 13, 29, 13, 91, 91, 243, 279, 601, 1699, 7169, 4727, 7815, 29099}},
+{3780, 16, 1972, {1, 3, 7, 5, 1, 35, 27, 235, 163, 913, 1479, 769, 7179, 1983, 25977, 55373}},
+{3781, 16, 1979, {1, 3, 5, 11, 9, 33, 99, 141, 301, 109, 1785, 129, 1707, 5181, 4797, 9979}},
+{3782, 16, 1987, {1, 1, 1, 13, 3, 47, 89, 43, 293, 87, 1689, 3885, 7747, 5607, 477, 31887}},
+{3783, 16, 1994, {1, 1, 5, 1, 9, 21, 73, 37, 45, 621, 1855, 3691, 4899, 2191, 13459, 23543}},
+{3784, 16, 2008, {1, 1, 1, 1, 7, 39, 61, 125, 341, 905, 213, 1755, 241, 13407, 8791, 10165}},
+{3785, 16, 2023, {1, 1, 1, 1, 19, 31, 79, 19, 55, 875, 1017, 1787, 4879, 533, 15029, 52295}},
+{3786, 16, 2029, {1, 3, 1, 1, 9, 59, 113, 71, 113, 649, 561, 71, 5253, 783, 7389, 19361}},
+{3787, 16, 2053, {1, 1, 1, 11, 5, 39, 61, 225, 291, 907, 795, 1099, 597, 11829, 15137, 42865}},
+{3788, 16, 2081, {1, 3, 1, 5, 25, 11, 71, 155, 271, 309, 1981, 1253, 463, 1133, 20833, 48625}},
+{3789, 16, 2087, {1, 3, 5, 9, 7, 41, 87, 241, 457, 899, 1493, 3675, 3025, 10607, 22569, 52813}},
+{3790, 16, 2094, {1, 3, 7, 13, 7, 37, 37, 103, 281, 915, 1259, 4049, 559, 173, 4123, 63767}},
+{3791, 16, 2111, {1, 3, 7, 15, 13, 57, 9, 51, 39, 549, 1431, 2887, 1081, 4643, 16331, 14221}},
+{3792, 16, 2113, {1, 3, 5, 7, 13, 1, 101, 125, 25, 713, 1423, 513, 3323, 9951, 7163, 20969}},
+{3793, 16, 2114, {1, 1, 7, 15, 11, 25, 25, 3, 47, 531, 1529, 471, 6191, 10051, 29671, 49085}},
+{3794, 16, 2123, {1, 1, 3, 5, 23, 51, 117, 141, 55, 275, 761, 1923, 6267, 2291, 3701, 26615}},
+{3795, 16, 2190, {1, 1, 7, 9, 15, 19, 111, 65, 137, 373, 1753, 3591, 1137, 11639, 28591, 27265}},
+{3796, 16, 2231, {1, 3, 1, 15, 29, 5, 67, 13, 425, 961, 453, 2481, 1407, 3479, 23303, 30407}},
+{3797, 16, 2276, {1, 1, 5, 3, 19, 39, 39, 123, 351, 77, 1339, 1765, 3767, 1907, 13627, 23877}},
+{3798, 16, 2285, {1, 3, 5, 9, 23, 7, 103, 177, 221, 197, 561, 2121, 7231, 12053, 30127, 29849}},
+{3799, 16, 2297, {1, 1, 5, 7, 15, 1, 3, 123, 197, 493, 171, 2425, 3865, 4061, 31883, 2491}},
+{3800, 16, 2336, {1, 1, 3, 13, 29, 33, 99, 67, 327, 969, 1793, 1871, 1839, 13059, 7605, 16797}},
+{3801, 16, 2345, {1, 3, 5, 11, 25, 53, 25, 93, 303, 623, 1889, 1471, 1213, 14459, 8527, 25095}},
+{3802, 16, 2353, {1, 1, 1, 13, 15, 3, 115, 3, 289, 743, 1855, 359, 2375, 13765, 19711, 40765}},
+{3803, 16, 2363, {1, 1, 7, 11, 27, 51, 85, 163, 219, 871, 637, 2011, 5981, 587, 17521, 17333}},
+{3804, 16, 2368, {1, 3, 5, 1, 21, 59, 49, 39, 305, 513, 2017, 285, 5817, 13123, 27765, 46741}},
+{3805, 16, 2373, {1, 3, 3, 7, 21, 39, 71, 163, 423, 845, 783, 397, 7319, 10677, 13407, 47471}},
+{3806, 16, 2391, {1, 3, 7, 5, 21, 59, 99, 179, 473, 687, 1393, 723, 2245, 2933, 25943, 7769}},
+{3807, 16, 2402, {1, 1, 5, 9, 5, 45, 71, 189, 165, 555, 643, 2289, 3133, 12319, 22209, 1533}},
+{3808, 16, 2413, {1, 1, 3, 9, 7, 43, 1, 155, 323, 169, 339, 2561, 4049, 4953, 5289, 8783}},
+{3809, 16, 2422, {1, 3, 1, 11, 15, 5, 25, 201, 267, 891, 561, 501, 575, 15147, 1743, 45237}},
+{3810, 16, 2425, {1, 3, 5, 13, 25, 27, 105, 205, 165, 795, 975, 943, 7413, 10299, 14839, 54895}},
+{3811, 16, 2461, {1, 1, 5, 1, 17, 43, 69, 103, 449, 917, 103, 945, 513, 709, 11647, 28065}},
+{3812, 16, 2462, {1, 1, 3, 15, 23, 51, 23, 7, 159, 743, 177, 3457, 415, 1775, 25353, 36385}},
+{3813, 16, 2490, {1, 3, 5, 13, 9, 63, 121, 19, 165, 449, 1523, 1959, 6901, 12281, 29149, 45999}},
+{3814, 16, 2492, {1, 3, 7, 11, 17, 19, 9, 155, 373, 753, 1313, 2205, 3571, 16317, 16151, 15325}},
+{3815, 16, 2510, {1, 3, 3, 7, 15, 43, 65, 183, 407, 123, 1151, 375, 3461, 6673, 12985, 21005}},
+{3816, 16, 2564, {1, 3, 7, 7, 9, 1, 87, 247, 489, 123, 1677, 1947, 7961, 13497, 27919, 28993}},
+{3817, 16, 2573, {1, 3, 3, 7, 19, 21, 95, 227, 217, 133, 69, 1535, 699, 3521, 29255, 34733}},
+{3818, 16, 2598, {1, 3, 5, 3, 7, 57, 45, 251, 407, 81, 1259, 2425, 2217, 13097, 12773, 14643}},
+{3819, 16, 2627, {1, 1, 1, 11, 23, 37, 13, 229, 467, 591, 1521, 469, 3763, 2289, 14233, 24053}},
+{3820, 16, 2633, {1, 3, 5, 1, 27, 53, 105, 5, 85, 765, 1973, 2597, 5725, 1063, 18145, 961}},
+{3821, 16, 2647, {1, 3, 7, 1, 21, 47, 115, 95, 403, 3, 1593, 3379, 7371, 15553, 12503, 57979}},
+{3822, 16, 2660, {1, 1, 3, 1, 1, 35, 121, 29, 379, 245, 919, 2673, 3503, 14197, 31193, 8355}},
+{3823, 16, 2664, {1, 3, 5, 11, 19, 49, 97, 7, 195, 1013, 1671, 3415, 2009, 13389, 4837, 27453}},
+{3824, 16, 2678, {1, 1, 5, 13, 9, 15, 115, 97, 463, 449, 303, 2681, 1215, 12559, 15685, 21321}},
+{3825, 16, 2684, {1, 3, 5, 13, 23, 5, 113, 193, 419, 301, 1121, 317, 5503, 4683, 25519, 65}},
+{3826, 16, 2691, {1, 3, 3, 7, 15, 29, 45, 97, 323, 475, 143, 1173, 4033, 8939, 31849, 3575}},
+{3827, 16, 2759, {1, 1, 7, 7, 21, 1, 101, 143, 197, 409, 855, 1753, 5211, 3763, 11139, 37309}},
+{3828, 16, 2768, {1, 1, 3, 13, 25, 33, 55, 45, 381, 349, 991, 535, 4823, 3701, 31629, 48037}},
+{3829, 16, 2773, {1, 3, 1, 11, 17, 51, 27, 57, 409, 551, 949, 365, 8093, 10831, 19697, 39437}},
+{3830, 16, 2794, {1, 3, 5, 3, 31, 33, 81, 49, 91, 865, 469, 2115, 377, 8237, 31907, 38239}},
+{3831, 16, 2813, {1, 1, 3, 7, 29, 59, 57, 17, 121, 889, 1557, 1797, 5001, 14209, 21355, 59739}},
+{3832, 16, 2831, {1, 1, 5, 9, 11, 45, 89, 87, 397, 785, 525, 1593, 5251, 12449, 23579, 54265}},
+{3833, 16, 2843, {1, 3, 5, 11, 5, 31, 19, 47, 207, 331, 91, 1691, 5171, 53, 15945, 33349}},
+{3834, 16, 2846, {1, 1, 1, 15, 11, 41, 91, 177, 505, 871, 815, 3673, 5631, 9915, 1133, 37861}},
+{3835, 16, 2849, {1, 3, 5, 5, 25, 63, 53, 231, 55, 51, 481, 303, 1859, 11973, 28557, 22045}},
+{3836, 16, 2856, {1, 1, 5, 3, 27, 11, 37, 91, 363, 411, 1131, 3369, 377, 6585, 7353, 42949}},
+{3837, 16, 2893, {1, 3, 1, 9, 31, 63, 83, 23, 405, 941, 119, 1471, 2509, 15507, 29239, 49613}},
+{3838, 16, 2901, {1, 1, 5, 1, 11, 63, 117, 237, 407, 231, 1425, 71, 8005, 4023, 9029, 59819}},
+{3839, 16, 2924, {1, 1, 5, 7, 1, 9, 43, 87, 351, 63, 1075, 3381, 5447, 2437, 24983, 26905}},
+{3840, 16, 2942, {1, 3, 7, 5, 5, 35, 33, 89, 251, 819, 1735, 2625, 6363, 6837, 27603, 26669}},
+{3841, 16, 2975, {1, 3, 7, 13, 29, 63, 51, 245, 371, 791, 907, 3499, 3033, 8443, 20023, 1805}},
+{3842, 16, 2979, {1, 1, 5, 7, 13, 15, 109, 197, 451, 709, 929, 3193, 5727, 11185, 29479, 1671}},
+{3843, 16, 2985, {1, 1, 7, 13, 19, 23, 97, 9, 359, 635, 777, 39, 893, 2531, 13563, 19295}},
+{3844, 16, 3020, {1, 1, 5, 1, 31, 63, 55, 7, 157, 877, 991, 1317, 1595, 2019, 21435, 52255}},
+{3845, 16, 3025, {1, 1, 5, 3, 19, 37, 23, 13, 335, 431, 483, 615, 2431, 505, 26245, 63323}},
+{3846, 16, 3028, {1, 3, 7, 5, 5, 9, 37, 65, 303, 423, 1907, 2661, 7213, 2975, 29045, 16243}},
+{3847, 16, 3051, {1, 3, 1, 5, 13, 37, 115, 217, 227, 159, 707, 1387, 943, 4935, 5503, 35171}},
+{3848, 16, 3127, {1, 3, 7, 9, 19, 15, 87, 233, 453, 159, 169, 1077, 2129, 413, 19773, 629}},
+{3849, 16, 3142, {1, 1, 5, 15, 29, 39, 37, 243, 233, 365, 1843, 2219, 1255, 15287, 603, 13511}},
+{3850, 16, 3145, {1, 1, 3, 3, 31, 53, 33, 125, 497, 597, 127, 1829, 3905, 2611, 4263, 40971}},
+{3851, 16, 3156, {1, 3, 5, 9, 11, 47, 71, 215, 383, 321, 1445, 135, 5953, 8791, 22073, 16537}},
+{3852, 16, 3165, {1, 3, 3, 13, 15, 7, 7, 133, 401, 459, 1117, 3165, 4105, 11943, 22431, 56821}},
+{3853, 16, 3196, {1, 1, 7, 9, 31, 39, 19, 7, 19, 401, 79, 3641, 6815, 1489, 7537, 49467}},
+{3854, 16, 3199, {1, 3, 7, 7, 17, 11, 91, 205, 251, 321, 515, 3521, 311, 3169, 271, 34749}},
+{3855, 16, 3217, {1, 3, 3, 7, 29, 15, 5, 153, 83, 603, 1373, 997, 4939, 9811, 243, 5375}},
+{3856, 16, 3218, {1, 1, 3, 11, 21, 47, 25, 221, 237, 177, 535, 2819, 6213, 7877, 26795, 36609}},
+{3857, 16, 3253, {1, 3, 7, 3, 31, 1, 69, 73, 47, 653, 139, 1649, 7183, 1293, 26507, 38415}},
+{3858, 16, 3258, {1, 1, 1, 13, 17, 41, 23, 73, 115, 509, 787, 3733, 1871, 171, 29967, 39941}},
+{3859, 16, 3260, {1, 3, 5, 1, 9, 7, 61, 23, 105, 381, 1421, 2887, 3717, 643, 26375, 57991}},
+{3860, 16, 3289, {1, 3, 3, 3, 19, 3, 101, 117, 393, 83, 1255, 3331, 6481, 8661, 20855, 28875}},
+{3861, 16, 3314, {1, 3, 5, 11, 21, 13, 111, 193, 51, 899, 159, 1989, 7931, 10511, 3933, 447}},
+{3862, 16, 3326, {1, 1, 5, 15, 23, 35, 49, 139, 397, 145, 597, 1847, 7077, 715, 20227, 42183}},
+{3863, 16, 3331, {1, 3, 3, 3, 17, 3, 87, 233, 35, 317, 337, 237, 6901, 3439, 20033, 10307}},
+{3864, 16, 3371, {1, 3, 5, 3, 11, 35, 13, 171, 7, 963, 1443, 1501, 7617, 963, 25453, 62589}},
+{3865, 16, 3381, {1, 1, 1, 5, 11, 9, 39, 175, 409, 411, 1407, 2743, 4255, 989, 15823, 1707}},
+{3866, 16, 3396, {1, 1, 7, 13, 27, 55, 63, 239, 355, 417, 2007, 2299, 2921, 1637, 10687, 60615}},
+{3867, 16, 3441, {1, 1, 7, 9, 5, 61, 57, 73, 263, 307, 2003, 1763, 639, 5885, 14709, 16985}},
+{3868, 16, 3442, {1, 1, 3, 3, 21, 55, 19, 249, 509, 533, 1361, 1397, 2777, 15523, 4389, 13339}},
+{3869, 16, 3460, {1, 3, 5, 15, 9, 3, 91, 237, 451, 299, 1541, 4083, 879, 7859, 21585, 14833}},
+{3870, 16, 3477, {1, 1, 7, 3, 31, 47, 49, 231, 123, 391, 1633, 2567, 5577, 1631, 27951, 22913}},
+{3871, 16, 3491, {1, 3, 7, 13, 11, 13, 1, 111, 183, 87, 839, 1915, 5523, 3677, 13065, 38225}},
+{3872, 16, 3493, {1, 1, 3, 7, 15, 15, 63, 241, 167, 345, 653, 701, 4725, 12911, 11545, 24475}},
+{3873, 16, 3543, {1, 1, 3, 7, 25, 15, 49, 235, 331, 639, 965, 1117, 7147, 3789, 3309, 20255}},
+{3874, 16, 3549, {1, 3, 5, 7, 7, 63, 93, 241, 253, 31, 951, 3723, 3359, 7303, 191, 36427}},
+{3875, 16, 3550, {1, 3, 7, 9, 9, 59, 5, 107, 181, 413, 1269, 3121, 1929, 11921, 8931, 47459}},
+{3876, 16, 3553, {1, 3, 1, 15, 25, 27, 13, 47, 295, 111, 1287, 2551, 4887, 4145, 17063, 42037}},
+{3877, 16, 3563, {1, 3, 3, 13, 17, 17, 21, 17, 491, 845, 1463, 1305, 1375, 16149, 19331, 25043}},
+{3878, 16, 3568, {1, 3, 5, 1, 27, 5, 93, 139, 283, 711, 1141, 1743, 5001, 8851, 19351, 12275}},
+{3879, 16, 3604, {1, 1, 1, 1, 23, 25, 51, 63, 429, 735, 201, 3785, 6677, 16375, 19681, 17857}},
+{3880, 16, 3632, {1, 3, 3, 3, 9, 63, 71, 147, 463, 465, 1163, 1045, 6967, 12537, 31853, 38391}},
+{3881, 16, 3650, {1, 3, 7, 1, 5, 51, 79, 239, 389, 3, 601, 3787, 7635, 16295, 1681, 63971}},
+{3882, 16, 3662, {1, 3, 1, 3, 5, 31, 103, 89, 321, 971, 783, 3685, 1155, 10353, 2167, 35423}},
+{3883, 16, 3674, {1, 1, 5, 15, 25, 19, 93, 59, 361, 217, 1141, 597, 5877, 15961, 1593, 22925}},
+{3884, 16, 3685, {1, 3, 1, 9, 25, 59, 69, 89, 477, 89, 487, 237, 5625, 9579, 30421, 21883}},
+{3885, 16, 3686, {1, 1, 3, 7, 1, 5, 13, 225, 9, 981, 1081, 1407, 6855, 15215, 21713, 62313}},
+{3886, 16, 3700, {1, 1, 7, 15, 11, 13, 119, 109, 151, 245, 1195, 3741, 755, 8047, 15431, 21001}},
+{3887, 16, 3703, {1, 3, 7, 3, 17, 47, 107, 137, 99, 255, 1597, 3281, 5779, 13487, 15061, 19199}},
+{3888, 16, 3704, {1, 1, 3, 3, 9, 39, 77, 227, 511, 839, 1375, 3887, 25, 14763, 13259, 217}},
+{3889, 16, 3723, {1, 3, 5, 7, 17, 3, 87, 61, 439, 287, 709, 4085, 4251, 8945, 28203, 24011}},
+{3890, 16, 3743, {1, 3, 1, 1, 29, 25, 49, 101, 209, 359, 285, 1593, 4161, 2943, 23225, 6381}},
+{3891, 16, 3753, {1, 1, 3, 13, 1, 45, 87, 7, 491, 399, 905, 1403, 4791, 7419, 14355, 47767}},
+{3892, 16, 3756, {1, 1, 7, 15, 13, 25, 111, 197, 297, 301, 499, 4007, 2235, 7681, 4641, 32447}},
+{3893, 16, 3759, {1, 1, 3, 3, 27, 41, 97, 83, 405, 353, 1609, 201, 1503, 10673, 29377, 20445}},
+{3894, 16, 3762, {1, 1, 7, 3, 9, 47, 65, 191, 207, 545, 377, 3011, 7361, 3467, 14073, 46769}},
+{3895, 16, 3771, {1, 1, 7, 5, 7, 39, 9, 91, 187, 949, 1829, 161, 3689, 4145, 32675, 23263}},
+{3896, 16, 3776, {1, 1, 5, 9, 29, 9, 83, 113, 77, 673, 613, 3645, 6671, 8583, 27701, 18615}},
+{3897, 16, 3779, {1, 3, 5, 9, 29, 13, 127, 247, 285, 845, 463, 539, 4441, 1867, 12469, 16213}},
+{3898, 16, 3839, {1, 3, 7, 15, 1, 29, 47, 157, 239, 595, 563, 1103, 3431, 2849, 28125, 19969}},
+{3899, 16, 3856, {1, 1, 1, 15, 25, 13, 1, 131, 57, 257, 2021, 169, 7603, 10721, 21675, 63171}},
+{3900, 16, 3871, {1, 3, 5, 3, 5, 19, 31, 57, 275, 381, 775, 681, 1145, 12237, 5141, 29375}},
+{3901, 16, 3887, {1, 3, 5, 13, 27, 13, 47, 201, 267, 581, 1563, 3845, 951, 7209, 27253, 19755}},
+{3902, 16, 3896, {1, 3, 5, 15, 19, 35, 57, 17, 61, 273, 967, 3029, 1747, 1753, 31321, 23711}},
+{3903, 16, 3901, {1, 1, 1, 5, 13, 13, 7, 177, 335, 393, 1401, 1411, 4703, 8259, 1281, 39835}},
+{3904, 16, 3916, {1, 1, 3, 15, 25, 27, 27, 121, 183, 105, 663, 1375, 6987, 7151, 13763, 39323}},
+{3905, 16, 3919, {1, 3, 7, 5, 15, 1, 81, 129, 455, 163, 675, 81, 3735, 14409, 7269, 16425}},
+{3906, 16, 3937, {1, 3, 3, 11, 13, 7, 79, 157, 165, 663, 229, 3539, 1837, 6485, 30729, 42157}},
+{3907, 16, 3943, {1, 1, 5, 15, 9, 9, 9, 47, 133, 863, 43, 1461, 511, 13991, 24781, 19221}},
+{3908, 16, 3955, {1, 3, 1, 7, 31, 33, 103, 13, 159, 689, 1353, 4025, 6051, 7683, 1741, 30047}},
+{3909, 16, 3961, {1, 1, 3, 11, 5, 45, 71, 219, 475, 585, 1207, 3163, 4661, 4713, 12729, 30445}},
+{3910, 16, 3988, {1, 3, 7, 5, 5, 53, 101, 227, 129, 521, 91, 1129, 4683, 11235, 24697, 45055}},
+{3911, 16, 3997, {1, 1, 3, 13, 1, 43, 7, 1, 73, 857, 1713, 185, 1685, 2369, 24187, 40419}},
+{3912, 16, 4011, {1, 1, 7, 7, 21, 7, 13, 177, 503, 1003, 1091, 2411, 1433, 9063, 13901, 3329}},
+{3913, 16, 4026, {1, 1, 7, 1, 7, 41, 99, 203, 325, 249, 1763, 545, 2981, 14125, 7815, 11385}},
+{3914, 16, 4033, {1, 3, 7, 11, 3, 11, 95, 137, 325, 701, 1177, 1631, 4483, 2955, 30229, 25577}},
+{3915, 16, 4045, {1, 1, 7, 7, 17, 45, 77, 103, 143, 97, 1963, 3635, 1539, 10491, 23483, 22767}},
+{3916, 16, 4060, {1, 1, 7, 15, 7, 5, 81, 63, 243, 55, 39, 207, 2315, 8285, 8155, 11631}},
+{3917, 16, 4063, {1, 3, 5, 15, 23, 19, 115, 9, 125, 851, 161, 3767, 3513, 1855, 11139, 1719}},
+{3918, 16, 4064, {1, 3, 7, 11, 11, 23, 15, 13, 235, 5, 1039, 1425, 6485, 5539, 8967, 64809}},
+{3919, 16, 4126, {1, 3, 5, 7, 19, 11, 83, 135, 45, 905, 1081, 1857, 3185, 13555, 21365, 38143}},
+{3920, 16, 4136, {1, 1, 5, 1, 25, 27, 119, 109, 167, 847, 1539, 2653, 797, 11185, 23501, 22389}},
+{3921, 16, 4167, {1, 1, 7, 7, 11, 3, 51, 97, 277, 557, 207, 3645, 825, 8521, 26653, 60071}},
+{3922, 16, 4173, {1, 3, 3, 15, 17, 35, 57, 7, 267, 549, 97, 243, 1137, 10311, 6737, 19077}},
+{3923, 16, 4188, {1, 1, 1, 15, 23, 33, 27, 203, 415, 1023, 1145, 1881, 7715, 4413, 3727, 5185}},
+{3924, 16, 4195, {1, 1, 3, 3, 13, 47, 63, 13, 75, 505, 595, 2911, 4029, 14187, 23151, 42877}},
+{3925, 16, 4226, {1, 1, 5, 15, 23, 5, 11, 65, 147, 675, 1961, 2177, 727, 15077, 23759, 10195}},
+{3926, 16, 4291, {1, 3, 5, 9, 9, 39, 69, 229, 341, 627, 1331, 3139, 3921, 9219, 14887, 4659}},
+{3927, 16, 4298, {1, 1, 7, 3, 1, 35, 49, 71, 165, 83, 719, 2771, 6475, 7821, 16709, 4449}},
+{3928, 16, 4308, {1, 3, 5, 5, 23, 15, 3, 57, 465, 77, 121, 3767, 6841, 13601, 12035, 14075}},
+{3929, 16, 4312, {1, 1, 7, 3, 3, 23, 45, 131, 287, 941, 713, 415, 6865, 14209, 29555, 55493}},
+{3930, 16, 4336, {1, 3, 5, 11, 29, 35, 55, 75, 225, 779, 569, 1795, 1377, 12765, 19081, 47287}},
+{3931, 16, 4371, {1, 3, 7, 3, 31, 47, 127, 89, 157, 737, 1395, 3615, 7923, 14731, 15797, 40061}},
+{3932, 16, 4378, {1, 1, 1, 11, 21, 37, 21, 59, 9, 141, 193, 3095, 3435, 12371, 26931, 61861}},
+{3933, 16, 4384, {1, 1, 3, 7, 13, 51, 15, 153, 77, 1013, 651, 3949, 6229, 14297, 1039, 46139}},
+{3934, 16, 4393, {1, 3, 3, 13, 7, 43, 95, 61, 217, 3, 549, 739, 123, 3661, 15375, 13919}},
+{3935, 16, 4421, {1, 3, 5, 9, 13, 37, 101, 89, 55, 413, 1089, 775, 7575, 13063, 31393, 29583}},
+{3936, 16, 4425, {1, 1, 3, 9, 25, 63, 119, 143, 499, 145, 603, 2067, 4713, 13457, 14053, 117}},
+{3937, 16, 4439, {1, 1, 5, 9, 7, 23, 57, 253, 115, 591, 2003, 63, 7615, 11493, 28519, 47087}},
+{3938, 16, 4440, {1, 1, 7, 3, 7, 53, 121, 33, 233, 645, 1093, 1697, 7213, 2603, 10743, 51303}},
+{3939, 16, 4500, {1, 3, 5, 7, 13, 31, 17, 125, 93, 969, 159, 1529, 7165, 7371, 8707, 56953}},
+{3940, 16, 4514, {1, 3, 3, 1, 13, 9, 91, 25, 171, 843, 1635, 2043, 1043, 15893, 11409, 53689}},
+{3941, 16, 4523, {1, 3, 5, 7, 13, 19, 89, 97, 203, 923, 1109, 2061, 463, 11703, 8925, 56015}},
+{3942, 16, 4534, {1, 3, 5, 11, 5, 21, 79, 237, 195, 649, 717, 211, 919, 12855, 3045, 39659}},
+{3943, 16, 4593, {1, 1, 1, 15, 13, 19, 21, 69, 393, 257, 1263, 309, 3209, 8403, 24467, 6467}},
+{3944, 16, 4615, {1, 1, 1, 11, 7, 27, 59, 117, 379, 353, 943, 2513, 3869, 4567, 12989, 13139}},
+{3945, 16, 4630, {1, 1, 1, 3, 13, 43, 11, 15, 149, 237, 1555, 71, 2357, 15773, 21419, 40571}},
+{3946, 16, 4636, {1, 3, 1, 9, 19, 23, 59, 215, 15, 921, 1729, 249, 3785, 7171, 1233, 3449}},
+{3947, 16, 4645, {1, 1, 1, 7, 7, 37, 63, 205, 75, 599, 951, 2513, 3347, 2497, 8019, 5433}},
+{3948, 16, 4684, {1, 3, 3, 15, 27, 17, 25, 201, 23, 699, 1525, 465, 1115, 12299, 14747, 40363}},
+{3949, 16, 4687, {1, 1, 1, 3, 29, 59, 115, 233, 107, 815, 291, 3821, 7325, 7381, 21445, 33917}},
+{3950, 16, 4723, {1, 3, 1, 11, 11, 33, 107, 171, 421, 893, 587, 3373, 4101, 3885, 25383, 12035}},
+{3951, 16, 4735, {1, 3, 3, 7, 5, 23, 43, 51, 357, 77, 1327, 2995, 1321, 1571, 26419, 23603}},
+{3952, 16, 4746, {1, 3, 7, 9, 27, 57, 101, 51, 215, 215, 469, 303, 723, 2903, 30569, 42631}},
+{3953, 16, 4779, {1, 3, 3, 13, 1, 7, 63, 205, 143, 321, 1439, 253, 2667, 1271, 11761, 55631}},
+{3954, 16, 4782, {1, 1, 7, 9, 3, 7, 7, 15, 503, 875, 1619, 1715, 5047, 5665, 5503, 17745}},
+{3955, 16, 4793, {1, 1, 7, 15, 19, 49, 65, 31, 245, 371, 377, 2963, 6185, 5519, 10743, 33231}},
+{3956, 16, 4796, {1, 1, 7, 3, 25, 27, 115, 51, 299, 451, 285, 1709, 6153, 14881, 17861, 22071}},
+{3957, 16, 4813, {1, 3, 1, 5, 21, 21, 127, 185, 325, 995, 213, 3279, 4769, 15943, 2589, 29567}},
+{3958, 16, 4850, {1, 3, 7, 5, 21, 9, 63, 59, 159, 743, 663, 2965, 97, 8993, 25633, 29033}},
+{3959, 16, 4867, {1, 3, 7, 13, 3, 35, 59, 101, 21, 659, 1531, 3995, 795, 2143, 21749, 52715}},
+{3960, 16, 4874, {1, 3, 3, 15, 27, 29, 95, 1, 501, 425, 417, 2351, 7877, 4127, 3633, 23347}},
+{3961, 16, 4881, {1, 3, 5, 7, 7, 49, 55, 19, 329, 467, 425, 1609, 6987, 16123, 26879, 42883}},
+{3962, 16, 4894, {1, 1, 1, 15, 17, 21, 13, 13, 85, 7, 677, 3739, 5491, 6299, 29957, 55765}},
+{3963, 16, 4904, {1, 1, 1, 7, 31, 21, 1, 5, 193, 659, 979, 3409, 3151, 6615, 7445, 8151}},
+{3964, 16, 4927, {1, 3, 1, 1, 11, 61, 27, 205, 263, 805, 955, 3469, 1233, 1609, 15329, 13353}},
+{3965, 16, 4929, {1, 3, 3, 9, 3, 29, 59, 75, 149, 557, 663, 3887, 3369, 3397, 10611, 9511}},
+{3966, 16, 4989, {1, 1, 7, 13, 29, 21, 101, 139, 99, 411, 569, 2343, 6901, 1685, 20599, 49543}},
+{3967, 16, 5000, {1, 3, 3, 15, 11, 3, 87, 89, 5, 293, 291, 1405, 1489, 9877, 32505, 32263}},
+{3968, 16, 5020, {1, 1, 5, 5, 19, 45, 89, 5, 381, 253, 1339, 707, 4645, 14177, 29441, 8965}},
+{3969, 16, 5036, {1, 3, 7, 15, 27, 45, 25, 177, 81, 229, 1339, 2143, 6547, 6841, 23449, 14813}},
+{3970, 16, 5041, {1, 1, 1, 3, 27, 23, 81, 157, 53, 513, 1435, 277, 2353, 3545, 21461, 51479}},
+{3971, 16, 5059, {1, 3, 1, 3, 3, 17, 75, 139, 283, 881, 1157, 2081, 937, 14549, 10215, 13053}},
+{3972, 16, 5074, {1, 1, 7, 9, 25, 27, 27, 133, 21, 559, 225, 613, 6931, 11785, 23413, 35757}},
+{3973, 16, 5090, {1, 1, 3, 13, 19, 9, 65, 49, 453, 779, 621, 1151, 1807, 13269, 6515, 17113}},
+{3974, 16, 5110, {1, 1, 1, 13, 21, 49, 39, 79, 119, 401, 903, 493, 3779, 7389, 29425, 28091}},
+{3975, 16, 5134, {1, 3, 1, 3, 23, 57, 59, 213, 463, 839, 1201, 1951, 5197, 13035, 29657, 35517}},
+{3976, 16, 5152, {1, 3, 7, 7, 3, 49, 29, 181, 367, 101, 1277, 3329, 3563, 10373, 29757, 62555}},
+{3977, 16, 5176, {1, 3, 1, 7, 31, 31, 117, 213, 373, 57, 1095, 2733, 3431, 3915, 7665, 44459}},
+{3978, 16, 5181, {1, 1, 7, 5, 9, 25, 47, 117, 355, 495, 1367, 2579, 5617, 787, 27655, 18885}},
+{3979, 16, 5204, {1, 1, 1, 3, 9, 39, 113, 87, 107, 477, 891, 2273, 4239, 7521, 147, 1737}},
+{3980, 16, 5218, {1, 1, 1, 3, 13, 61, 81, 225, 113, 441, 889, 1915, 3897, 15179, 4053, 5925}},
+{3981, 16, 5242, {1, 1, 5, 3, 15, 47, 59, 187, 475, 197, 1381, 33, 4605, 1487, 14359, 33769}},
+{3982, 16, 5253, {1, 3, 7, 15, 23, 45, 53, 215, 129, 465, 795, 53, 7077, 9517, 2663, 55397}},
+{3983, 16, 5260, {1, 1, 7, 13, 25, 49, 105, 255, 245, 153, 1093, 2123, 2823, 5125, 17483, 49003}},
+{3984, 16, 5281, {1, 1, 1, 13, 31, 5, 7, 243, 255, 231, 1663, 1007, 7573, 405, 29183, 11367}},
+{3985, 16, 5282, {1, 1, 5, 13, 15, 15, 115, 91, 63, 1013, 1713, 1945, 6397, 14213, 24417, 40807}},
+{3986, 16, 5313, {1, 1, 5, 3, 19, 49, 91, 25, 43, 601, 25, 2405, 1973, 629, 497, 12625}},
+{3987, 16, 5316, {1, 1, 3, 5, 13, 45, 11, 81, 251, 545, 1155, 1409, 7187, 847, 2835, 32909}},
+{3988, 16, 5326, {1, 3, 1, 13, 27, 57, 1, 103, 465, 809, 1727, 3721, 3347, 3791, 17247, 8377}},
+{3989, 16, 5340, {1, 3, 3, 15, 25, 31, 91, 91, 119, 205, 1431, 703, 5327, 7323, 30415, 61955}},
+{3990, 16, 5347, {1, 3, 5, 11, 19, 39, 79, 243, 109, 463, 1869, 2133, 4139, 10461, 14793, 24025}},
+{3991, 16, 5354, {1, 3, 5, 7, 23, 41, 5, 7, 249, 3, 1743, 489, 4921, 397, 30955, 22207}},
+{3992, 16, 5368, {1, 3, 5, 15, 3, 7, 115, 19, 217, 231, 1183, 3723, 5055, 12967, 7855, 5067}},
+{3993, 16, 5394, {1, 3, 3, 3, 11, 31, 113, 41, 429, 797, 557, 1199, 1819, 1933, 9917, 32229}},
+{3994, 16, 5396, {1, 1, 5, 3, 13, 63, 31, 183, 465, 915, 723, 3227, 4125, 2813, 26313, 34287}},
+{3995, 16, 5400, {1, 1, 7, 5, 31, 55, 117, 243, 37, 885, 85, 1067, 3895, 15655, 28527, 32109}},
+{3996, 16, 5405, {1, 3, 7, 15, 17, 43, 43, 173, 119, 187, 1161, 599, 4595, 1681, 11981, 681}},
+{3997, 16, 5439, {1, 1, 7, 7, 29, 47, 25, 93, 411, 103, 783, 1029, 1927, 3569, 27647, 8281}},
+{3998, 16, 5442, {1, 3, 3, 9, 19, 57, 31, 183, 141, 889, 157, 2267, 5701, 6273, 25739, 34039}},
+{3999, 16, 5459, {1, 3, 5, 1, 29, 35, 105, 165, 505, 299, 1149, 2397, 2013, 11591, 15917, 4791}},
+{4000, 16, 5478, {1, 3, 3, 9, 7, 35, 47, 77, 69, 335, 585, 1131, 531, 8597, 307, 55985}},
+{4001, 16, 5484, {1, 3, 7, 1, 29, 9, 25, 155, 149, 845, 567, 3735, 3501, 9365, 12025, 19131}},
+{4002, 16, 5508, {1, 3, 5, 3, 11, 31, 25, 9, 411, 519, 1611, 1441, 1487, 10049, 14373, 24605}},
+{4003, 16, 5523, {1, 3, 3, 5, 3, 7, 101, 107, 339, 155, 1843, 2529, 443, 8177, 28655, 8151}},
+{4004, 16, 5545, {1, 1, 7, 5, 29, 37, 73, 131, 125, 451, 947, 797, 5053, 10155, 30801, 27235}},
+{4005, 16, 5565, {1, 1, 7, 13, 19, 47, 101, 45, 495, 457, 1293, 1971, 5495, 12737, 17687, 26123}},
+{4006, 16, 5566, {1, 1, 7, 7, 11, 11, 75, 177, 251, 553, 1883, 3379, 1429, 12227, 10301, 16467}},
+{4007, 16, 5580, {1, 3, 3, 9, 3, 61, 95, 35, 97, 551, 233, 2045, 4873, 9109, 10019, 64523}},
+{4008, 16, 5608, {1, 3, 1, 5, 11, 3, 15, 177, 301, 573, 2029, 191, 5551, 12083, 27287, 57235}},
+{4009, 16, 5613, {1, 3, 5, 1, 21, 9, 121, 169, 347, 187, 57, 3163, 5609, 1921, 17581, 28351}},
+{4010, 16, 5647, {1, 3, 3, 1, 31, 51, 15, 45, 429, 245, 573, 1595, 5343, 7519, 17009, 1299}},
+{4011, 16, 5661, {1, 1, 7, 3, 13, 47, 109, 65, 389, 867, 963, 145, 1089, 9749, 19625, 43121}},
+{4012, 16, 5671, {1, 3, 1, 7, 21, 61, 77, 67, 143, 579, 625, 2007, 6343, 4259, 21233, 237}},
+{4013, 16, 5678, {1, 3, 5, 9, 27, 15, 107, 91, 399, 895, 645, 2301, 439, 6789, 18299, 47285}},
+{4014, 16, 5680, {1, 3, 3, 5, 13, 11, 43, 199, 505, 409, 25, 2057, 479, 6031, 9561, 51613}},
+{4015, 16, 5685, {1, 1, 7, 13, 15, 55, 105, 53, 171, 925, 1849, 2881, 6951, 13069, 865, 41019}},
+{4016, 16, 5689, {1, 3, 1, 9, 17, 31, 45, 23, 411, 185, 189, 2123, 2583, 12713, 12681, 2231}},
+{4017, 16, 5692, {1, 3, 7, 9, 3, 63, 11, 253, 177, 127, 545, 3293, 4449, 15995, 10223, 33529}},
+{4018, 16, 5724, {1, 1, 5, 11, 13, 7, 53, 161, 421, 551, 697, 627, 3879, 1639, 24419, 3337}},
+{4019, 16, 5745, {1, 1, 7, 7, 27, 7, 37, 205, 429, 407, 1133, 3563, 2921, 6173, 11173, 3009}},
+{4020, 16, 5755, {1, 3, 3, 15, 31, 39, 117, 81, 337, 729, 567, 2299, 1481, 3189, 1795, 40299}},
+{4021, 16, 5757, {1, 3, 5, 15, 15, 47, 91, 127, 275, 55, 951, 3423, 2879, 6115, 1549, 2287}},
+{4022, 16, 5786, {1, 3, 3, 11, 17, 3, 127, 207, 141, 889, 185, 1095, 4567, 1371, 30545, 54445}},
+{4023, 16, 5792, {1, 1, 7, 3, 25, 11, 11, 139, 43, 1, 1977, 397, 5775, 6913, 13249, 46767}},
+{4024, 16, 5810, {1, 1, 7, 7, 27, 13, 31, 251, 191, 1015, 161, 3719, 5321, 13013, 25187, 51881}},
+{4025, 16, 5824, {1, 1, 1, 1, 3, 3, 13, 19, 423, 349, 1955, 2103, 6395, 3315, 23809, 25925}},
+{4026, 16, 5869, {1, 3, 5, 13, 3, 59, 41, 167, 423, 93, 1299, 2623, 5829, 8537, 8701, 43757}},
+{4027, 16, 5872, {1, 3, 5, 11, 9, 19, 127, 119, 329, 819, 7, 3809, 5305, 3643, 27369, 61827}},
+{4028, 16, 5895, {1, 3, 1, 15, 25, 43, 55, 159, 205, 911, 983, 2825, 3751, 7845, 12023, 18431}},
+{4029, 16, 5923, {1, 3, 3, 13, 11, 1, 65, 133, 479, 181, 679, 981, 3317, 6241, 11693, 9619}},
+{4030, 16, 5925, {1, 3, 3, 3, 21, 25, 117, 183, 127, 73, 703, 1469, 257, 11229, 10167, 50847}},
+{4031, 16, 5926, {1, 1, 5, 13, 5, 5, 113, 15, 231, 269, 989, 465, 3267, 15239, 29503, 42855}},
+{4032, 16, 5944, {1, 3, 3, 15, 9, 63, 79, 27, 21, 709, 1969, 3761, 1015, 13619, 4205, 40591}},
+{4033, 16, 5986, {1, 1, 7, 11, 29, 3, 5, 45, 107, 131, 1287, 3551, 849, 2003, 27451, 47103}},
+{4034, 16, 6012, {1, 3, 5, 11, 3, 47, 59, 53, 369, 249, 915, 2475, 7539, 763, 7063, 63971}},
+{4035, 16, 6015, {1, 1, 5, 1, 7, 53, 45, 127, 321, 341, 635, 2277, 1383, 10951, 29055, 45087}},
+{4036, 16, 6046, {1, 3, 7, 3, 5, 1, 119, 79, 487, 93, 25, 491, 4085, 6403, 27779, 8753}},
+{4037, 16, 6049, {1, 1, 1, 3, 9, 59, 49, 141, 323, 703, 1175, 423, 4323, 10083, 4289, 28931}},
+{4038, 16, 6061, {1, 3, 3, 15, 31, 31, 73, 15, 187, 653, 91, 1707, 1431, 9861, 19071, 8137}},
+{4039, 16, 6067, {1, 1, 1, 5, 27, 63, 93, 1, 329, 353, 863, 473, 7681, 10653, 15819, 8495}},
+{4040, 16, 6099, {1, 1, 1, 5, 25, 57, 119, 167, 219, 319, 231, 1065, 6217, 5131, 1513, 49281}},
+{4041, 16, 6121, {1, 3, 7, 3, 17, 3, 113, 91, 201, 179, 1907, 3423, 821, 12927, 24827, 49403}},
+{4042, 16, 6155, {1, 1, 5, 7, 19, 63, 75, 151, 387, 489, 777, 2049, 1151, 1351, 25687, 4143}},
+{4043, 16, 6163, {1, 3, 5, 7, 9, 37, 9, 3, 87, 385, 1667, 2139, 7527, 16133, 30023, 28783}},
+{4044, 16, 6203, {1, 1, 5, 9, 11, 55, 95, 73, 413, 867, 589, 2901, 3021, 413, 5955, 38921}},
+{4045, 16, 6208, {1, 3, 5, 15, 1, 17, 17, 7, 485, 323, 519, 2325, 2255, 4211, 20661, 28931}},
+{4046, 16, 6231, {1, 1, 5, 13, 21, 19, 85, 189, 167, 645, 1475, 3095, 7123, 3351, 7961, 20967}},
+{4047, 16, 6241, {1, 1, 7, 13, 3, 47, 13, 213, 237, 291, 285, 1465, 1765, 12361, 32651, 54205}},
+{4048, 16, 6254, {1, 3, 7, 13, 13, 27, 71, 35, 67, 117, 647, 2359, 3295, 8445, 24761, 29379}},
+{4049, 16, 6262, {1, 1, 1, 3, 3, 19, 23, 37, 5, 1019, 5, 1605, 2291, 14015, 9311, 39751}},
+{4050, 16, 6266, {1, 3, 3, 3, 31, 1, 65, 159, 221, 675, 1061, 971, 2333, 8265, 14361, 3263}},
+{4051, 16, 6275, {1, 1, 3, 7, 3, 5, 81, 17, 101, 991, 753, 2883, 4977, 4409, 1757, 26803}},
+{4052, 16, 6278, {1, 1, 5, 9, 13, 25, 45, 43, 199, 967, 829, 713, 4547, 7223, 6497, 53895}},
+{4053, 16, 6292, {1, 1, 7, 5, 23, 15, 89, 179, 509, 147, 315, 133, 111, 15577, 23427, 5229}},
+{4054, 16, 6329, {1, 3, 3, 7, 27, 7, 113, 65, 315, 135, 1309, 1179, 5755, 7513, 6815, 5137}},
+{4055, 16, 6355, {1, 1, 3, 7, 1, 13, 29, 155, 477, 721, 71, 865, 3897, 3331, 30641, 65471}},
+{4056, 16, 6357, {1, 1, 7, 3, 29, 45, 83, 3, 461, 109, 1545, 1365, 6633, 16137, 23859, 5995}},
+{4057, 16, 6374, {1, 3, 1, 1, 3, 33, 77, 83, 459, 187, 879, 3731, 6939, 6707, 23409, 24245}},
+{4058, 16, 6380, {1, 3, 5, 5, 13, 43, 127, 41, 29, 735, 1391, 2947, 4873, 4627, 15, 41719}},
+{4059, 16, 6423, {1, 3, 1, 3, 17, 17, 51, 93, 189, 227, 449, 2809, 825, 2009, 9563, 41435}},
+{4060, 16, 6427, {1, 3, 3, 11, 25, 47, 113, 173, 141, 919, 677, 117, 5293, 815, 23749, 19789}},
+{4061, 16, 6430, {1, 1, 1, 13, 15, 61, 121, 223, 53, 389, 489, 1527, 4771, 8975, 8005, 14275}},
+{4062, 16, 6436, {1, 1, 3, 15, 31, 57, 111, 145, 279, 991, 489, 3239, 7647, 473, 31279, 33447}},
+{4063, 16, 6443, {1, 1, 7, 5, 31, 13, 75, 185, 395, 611, 609, 159, 7931, 9887, 4115, 53121}},
+{4064, 16, 6445, {1, 3, 5, 5, 13, 39, 103, 237, 77, 913, 511, 1583, 6763, 14523, 4247, 63403}},
+{4065, 16, 6458, {1, 1, 1, 15, 11, 5, 43, 43, 297, 827, 747, 5, 3785, 15021, 11291, 36743}},
+{4066, 16, 6478, {1, 1, 7, 9, 9, 53, 113, 95, 403, 53, 1335, 4033, 8147, 11963, 6523, 23675}},
+{4067, 16, 6490, {1, 1, 5, 9, 27, 29, 69, 79, 327, 409, 1147, 1579, 2625, 12227, 30933, 9057}},
+{4068, 16, 6508, {1, 1, 1, 7, 1, 33, 29, 173, 5, 517, 437, 2035, 57, 12825, 22095, 65519}},
+{4069, 16, 6519, {1, 1, 3, 7, 27, 29, 53, 79, 429, 707, 589, 2605, 339, 7039, 19319, 17649}},
+{4070, 16, 6520, {1, 3, 3, 11, 9, 57, 43, 117, 39, 193, 1427, 2553, 6877, 7653, 29041, 44865}},
+{4071, 16, 6530, {1, 3, 3, 7, 23, 45, 29, 151, 265, 739, 365, 3565, 6447, 9761, 24021, 679}},
+{4072, 16, 6541, {1, 3, 5, 1, 1, 43, 73, 55, 131, 175, 959, 659, 7315, 15145, 18301, 14865}},
+{4073, 16, 6556, {1, 1, 3, 5, 15, 15, 91, 113, 359, 241, 1627, 1069, 1761, 211, 32671, 58833}},
+{4074, 16, 6607, {1, 3, 3, 7, 29, 27, 79, 53, 409, 81, 693, 3137, 7385, 11007, 28459, 28621}},
+{4075, 16, 6612, {1, 1, 7, 5, 29, 7, 67, 195, 77, 773, 1361, 2153, 4459, 7301, 5129, 17797}},
+{4076, 16, 6626, {1, 3, 3, 7, 25, 27, 91, 223, 115, 91, 1645, 2167, 1955, 9601, 22127, 13055}},
+{4077, 16, 6632, {1, 3, 7, 3, 27, 53, 67, 249, 51, 151, 663, 3231, 895, 6777, 3037, 56755}},
+{4078, 16, 6649, {1, 1, 5, 1, 25, 63, 71, 179, 375, 301, 1127, 2125, 783, 14481, 7293, 47883}},
+{4079, 16, 6666, {1, 1, 3, 9, 25, 3, 39, 69, 1, 85, 1271, 1571, 1953, 5077, 20369, 44827}},
+{4080, 16, 6674, {1, 3, 1, 13, 11, 61, 77, 59, 127, 475, 1609, 3553, 2553, 15589, 9351, 59787}},
+{4081, 16, 6733, {1, 3, 1, 5, 21, 7, 61, 27, 199, 653, 1243, 2481, 5369, 12903, 30229, 39453}},
+{4082, 16, 6782, {1, 3, 7, 3, 13, 15, 107, 153, 501, 573, 863, 3179, 6019, 15177, 16075, 43767}},
+{4083, 16, 6786, {1, 1, 7, 1, 23, 55, 17, 35, 5, 137, 1707, 1377, 6857, 15361, 27299, 61871}},
+{4084, 16, 6798, {1, 3, 5, 7, 27, 17, 87, 213, 95, 125, 1239, 3923, 4193, 11049, 12783, 45017}},
+{4085, 16, 6821, {1, 1, 5, 15, 9, 55, 11, 217, 7, 249, 369, 205, 4251, 13785, 24781, 48929}},
+{4086, 16, 6840, {1, 3, 7, 1, 15, 35, 33, 107, 503, 563, 1591, 3487, 7495, 1767, 24791, 31281}},
+{4087, 16, 6846, {1, 3, 1, 11, 3, 15, 47, 193, 289, 253, 909, 1105, 5119, 1415, 7737, 4341}},
+{4088, 16, 6865, {1, 1, 1, 3, 23, 33, 53, 187, 469, 573, 835, 2049, 791, 1177, 31051, 30955}},
+{4089, 16, 6884, {1, 3, 3, 11, 15, 51, 77, 143, 369, 991, 1103, 1293, 6019, 6361, 26301, 20741}},
+{4090, 16, 6891, {1, 1, 1, 5, 17, 19, 85, 135, 113, 593, 579, 1063, 7173, 2491, 9355, 19223}},
+{4091, 16, 6925, {1, 1, 5, 15, 25, 51, 107, 193, 31, 1, 1693, 125, 6223, 14619, 22683, 26321}},
+{4092, 16, 6938, {1, 1, 7, 1, 17, 45, 87, 39, 87, 499, 1185, 2763, 3989, 2863, 24555, 33817}},
+{4093, 16, 6967, {1, 3, 1, 11, 31, 5, 121, 231, 185, 793, 255, 2785, 5261, 3687, 21711, 3941}},
+{4094, 16, 6988, {1, 3, 7, 15, 5, 59, 73, 227, 365, 937, 893, 2155, 4385, 14345, 6813, 28461}},
+{4095, 16, 6996, {1, 1, 5, 7, 7, 23, 7, 239, 431, 45, 1015, 1663, 1893, 5035, 24075, 2119}},
+{4096, 16, 7009, {1, 3, 5, 1, 3, 15, 63, 103, 119, 801, 1681, 3463, 6083, 6453, 11379, 8205}},
+{4097, 16, 7016, {1, 3, 7, 9, 21, 61, 9, 9, 433, 541, 603, 3905, 3787, 10187, 3643, 21319}},
+{4098, 16, 7030, {1, 3, 5, 3, 11, 1, 101, 243, 363, 559, 561, 1163, 455, 4657, 1147, 39961}},
+{4099, 16, 7043, {1, 3, 5, 13, 17, 37, 57, 47, 483, 571, 1579, 1137, 8125, 12271, 23279, 1615}},
+{4100, 16, 7045, {1, 3, 5, 1, 21, 5, 13, 155, 75, 705, 389, 2855, 6345, 2279, 12627, 49451}},
+{4101, 16, 7052, {1, 1, 3, 9, 15, 51, 73, 99, 445, 227, 1705, 2175, 8111, 9381, 31555, 48491}},
+{4102, 16, 7073, {1, 3, 3, 5, 9, 63, 107, 51, 461, 979, 1033, 421, 4807, 11707, 13261, 26015}},
+{4103, 16, 7142, {1, 1, 5, 3, 13, 53, 117, 249, 57, 851, 1391, 3245, 35, 16043, 24399, 63667}},
+{4104, 16, 7153, {1, 3, 1, 11, 23, 33, 57, 125, 385, 495, 871, 199, 4269, 2269, 22897, 23597}},
+{4105, 16, 7168, {1, 3, 5, 15, 29, 11, 77, 21, 479, 369, 723, 3721, 1121, 9463, 19775, 54525}},
+{4106, 16, 7174, {1, 3, 5, 7, 7, 45, 29, 153, 395, 223, 1917, 3713, 5087, 10827, 1383, 36823}},
+{4107, 16, 7183, {1, 3, 1, 3, 31, 19, 111, 55, 275, 923, 917, 2925, 673, 6579, 18783, 5137}},
+{4108, 16, 7195, {1, 3, 1, 15, 25, 31, 59, 255, 31, 697, 1751, 381, 299, 295, 14037, 40953}},
+{4109, 16, 7204, {1, 3, 1, 7, 15, 23, 69, 219, 351, 183, 1083, 2227, 6249, 9385, 13167, 2901}},
+{4110, 16, 7214, {1, 3, 7, 1, 5, 61, 117, 13, 67, 521, 41, 2929, 3937, 1215, 25593, 32627}},
+{4111, 16, 7222, {1, 3, 5, 1, 9, 47, 63, 39, 371, 657, 491, 2243, 4049, 10517, 12409, 40597}},
+{4112, 16, 7267, {1, 3, 7, 15, 17, 3, 77, 13, 275, 225, 487, 2055, 1293, 15927, 31773, 18275}},
+{4113, 16, 7269, {1, 1, 5, 13, 11, 57, 113, 27, 191, 363, 1341, 3487, 8031, 13801, 7563, 40675}},
+{4114, 16, 7279, {1, 1, 3, 3, 27, 31, 103, 143, 271, 305, 2033, 3623, 4219, 9307, 7501, 8959}},
+{4115, 16, 7293, {1, 1, 1, 13, 1, 3, 27, 97, 475, 143, 333, 2997, 1807, 4231, 27437, 59717}},
+{4116, 16, 7312, {1, 3, 7, 5, 5, 3, 69, 233, 309, 511, 1429, 1887, 2745, 4969, 17595, 5451}},
+{4117, 16, 7327, {1, 1, 7, 3, 23, 17, 115, 89, 265, 467, 257, 2027, 5331, 1195, 4451, 8621}},
+{4118, 16, 7334, {1, 1, 7, 13, 29, 35, 117, 155, 99, 327, 853, 3595, 2997, 10745, 21619, 26549}},
+{4119, 16, 7337, {1, 3, 3, 13, 1, 13, 75, 151, 67, 271, 1609, 1117, 4293, 4645, 12005, 55983}},
+{4120, 16, 7343, {1, 1, 1, 13, 1, 61, 101, 63, 161, 261, 1759, 567, 665, 2339, 9157, 55603}},
+{4121, 16, 7346, {1, 1, 7, 11, 25, 19, 71, 27, 255, 435, 227, 4087, 4309, 14903, 14513, 30207}},
+{4122, 16, 7372, {1, 3, 3, 3, 11, 41, 1, 67, 383, 403, 45, 1521, 1535, 3353, 27361, 7549}},
+{4123, 16, 7387, {1, 1, 1, 1, 13, 51, 31, 137, 147, 907, 19, 3639, 3739, 877, 15005, 60357}},
+{4124, 16, 7390, {1, 1, 3, 11, 11, 23, 29, 173, 105, 873, 1727, 2761, 2015, 7491, 17491, 41065}},
+{4125, 16, 7396, {1, 1, 5, 3, 31, 1, 119, 53, 11, 731, 393, 4031, 4421, 15715, 6431, 18089}},
+{4126, 16, 7423, {1, 1, 3, 5, 15, 37, 55, 147, 307, 521, 711, 3085, 5989, 8081, 23351, 35259}},
+{4127, 16, 7428, {1, 3, 5, 13, 21, 19, 47, 107, 447, 713, 1655, 2809, 4741, 2105, 9255, 103}},
+{4128, 16, 7437, {1, 3, 1, 3, 17, 47, 63, 125, 343, 763, 1777, 607, 5625, 9517, 7221, 27257}},
+{4129, 16, 7466, {1, 1, 7, 5, 31, 13, 67, 255, 41, 947, 99, 721, 7367, 11427, 1357, 12383}},
+{4130, 16, 7474, {1, 1, 7, 3, 23, 27, 73, 185, 189, 545, 1877, 3169, 5419, 15873, 29059, 23983}},
+{4131, 16, 7476, {1, 1, 3, 1, 5, 13, 81, 45, 79, 717, 819, 3539, 7561, 7319, 5113, 27273}},
+{4132, 16, 7483, {1, 3, 7, 9, 21, 25, 71, 247, 41, 583, 771, 3745, 1883, 5717, 755, 14549}},
+{4133, 16, 7518, {1, 1, 3, 7, 23, 25, 87, 143, 499, 515, 1753, 1229, 173, 10629, 30579, 29643}},
+{4134, 16, 7527, {1, 3, 1, 13, 29, 33, 31, 69, 503, 117, 1717, 101, 7647, 1567, 28677, 3079}},
+{4135, 16, 7545, {1, 3, 1, 15, 29, 45, 57, 81, 171, 813, 505, 3647, 3913, 5557, 2477, 42429}},
+{4136, 16, 7572, {1, 1, 5, 13, 21, 13, 81, 5, 471, 221, 1563, 1741, 7269, 16327, 22687, 5291}},
+{4137, 16, 7586, {1, 3, 5, 3, 23, 41, 107, 61, 95, 79, 467, 1533, 739, 6791, 26911, 20309}},
+{4138, 16, 7597, {1, 3, 7, 7, 3, 53, 71, 163, 459, 975, 687, 1115, 5241, 299, 26361, 38583}},
+{4139, 16, 7630, {1, 3, 1, 9, 3, 63, 7, 133, 421, 325, 823, 1175, 6201, 5707, 31539, 34645}},
+{4140, 16, 7653, {1, 3, 7, 5, 27, 27, 107, 239, 247, 257, 1367, 3685, 7839, 11693, 3237, 13085}},
+{4141, 16, 7657, {1, 1, 1, 3, 27, 41, 51, 69, 271, 809, 1453, 519, 1301, 2367, 637, 5267}},
+{4142, 16, 7671, {1, 3, 7, 13, 19, 17, 3, 69, 369, 447, 1685, 4075, 6143, 11387, 5411, 29825}},
+{4143, 16, 7672, {1, 1, 3, 1, 25, 61, 79, 163, 1, 905, 1969, 2735, 7709, 16121, 20441, 4543}},
+{4144, 16, 7715, {1, 3, 7, 5, 15, 29, 7, 245, 343, 803, 1719, 3993, 983, 2925, 10393, 6053}},
+{4145, 16, 7717, {1, 3, 1, 7, 17, 55, 63, 29, 441, 387, 885, 3269, 1977, 1927, 3657, 47043}},
+{4146, 16, 7732, {1, 1, 3, 1, 17, 59, 51, 9, 173, 327, 1185, 3241, 3785, 10907, 19429, 22209}},
+{4147, 16, 7735, {1, 1, 3, 13, 21, 57, 125, 5, 359, 437, 1231, 2441, 5813, 9991, 283, 52555}},
+{4148, 16, 7753, {1, 3, 1, 7, 15, 19, 39, 125, 405, 381, 1757, 4075, 5565, 2065, 295, 8867}},
+{4149, 16, 7811, {1, 3, 3, 11, 7, 33, 95, 19, 253, 141, 1093, 1787, 7495, 5229, 15923, 44157}},
+{4150, 16, 7817, {1, 3, 7, 15, 1, 49, 69, 163, 85, 345, 901, 2329, 8003, 9915, 2209, 33979}},
+{4151, 16, 7825, {1, 1, 1, 9, 23, 51, 125, 163, 257, 681, 565, 945, 6375, 8679, 5985, 28919}},
+{4152, 16, 7832, {1, 3, 5, 7, 11, 23, 123, 231, 377, 121, 1519, 2061, 2957, 14537, 17625, 37773}},
+{4153, 16, 7838, {1, 3, 5, 1, 17, 43, 89, 119, 455, 279, 1857, 3405, 5225, 13035, 6055, 30861}},
+{4154, 16, 7841, {1, 3, 7, 15, 31, 63, 25, 225, 3, 527, 355, 1435, 5763, 15203, 26579, 45659}},
+{4155, 16, 7844, {1, 1, 1, 3, 27, 43, 71, 193, 135, 5, 683, 925, 7023, 7711, 2807, 56003}},
+{4156, 16, 7859, {1, 1, 1, 11, 3, 3, 109, 29, 109, 683, 419, 3295, 1961, 5953, 8887, 1523}},
+{4157, 16, 7861, {1, 3, 3, 11, 17, 39, 19, 225, 103, 249, 81, 3875, 4515, 3969, 24745, 60031}},
+{4158, 16, 7873, {1, 1, 3, 3, 3, 23, 15, 149, 305, 399, 1347, 1001, 597, 10003, 22123, 29919}},
+{4159, 16, 7880, {1, 3, 5, 1, 23, 35, 123, 7, 283, 283, 759, 3061, 2011, 7771, 32201, 40667}},
+{4160, 16, 7897, {1, 3, 7, 15, 23, 5, 81, 51, 357, 79, 133, 285, 425, 7743, 13499, 18983}},
+{4161, 16, 7904, {1, 3, 3, 5, 17, 37, 75, 221, 473, 111, 335, 683, 7353, 2283, 13457, 61171}},
+{4162, 16, 7910, {1, 3, 1, 7, 13, 45, 13, 223, 149, 209, 727, 3553, 2573, 177, 855, 44139}},
+{4163, 16, 7960, {1, 1, 3, 15, 23, 5, 103, 139, 17, 29, 1961, 3021, 5745, 12963, 30669, 44171}},
+{4164, 16, 7969, {1, 3, 1, 1, 3, 33, 67, 203, 29, 785, 71, 1693, 4487, 10221, 24523, 51223}},
+{4165, 16, 7970, {1, 1, 5, 7, 7, 27, 17, 183, 229, 669, 1675, 3751, 3233, 10677, 7509, 52313}},
+{4166, 16, 7976, {1, 1, 5, 5, 25, 35, 21, 163, 483, 399, 195, 3465, 6349, 545, 18861, 31759}},
+{4167, 16, 7979, {1, 3, 1, 5, 15, 39, 13, 157, 71, 841, 447, 3625, 53, 12745, 2719, 27617}},
+{4168, 16, 8007, {1, 1, 5, 5, 3, 45, 113, 121, 263, 887, 709, 2189, 3811, 1409, 10451, 48777}},
+{4169, 16, 8041, {1, 1, 5, 15, 9, 41, 31, 95, 377, 215, 437, 3633, 433, 11935, 15283, 55451}},
+{4170, 16, 8047, {1, 1, 7, 7, 13, 23, 79, 3, 451, 409, 1103, 1771, 553, 3175, 28703, 49357}},
+{4171, 16, 8052, {1, 3, 1, 1, 13, 33, 95, 133, 419, 851, 955, 3985, 5869, 14219, 253, 46883}},
+{4172, 16, 8061, {1, 3, 3, 3, 23, 55, 91, 207, 281, 355, 361, 261, 6837, 4401, 25455, 25313}},
+{4173, 16, 8078, {1, 3, 5, 9, 27, 9, 107, 51, 69, 555, 835, 3541, 1827, 5737, 31225, 55619}},
+{4174, 16, 8128, {1, 1, 1, 11, 27, 51, 79, 85, 447, 447, 9, 2803, 377, 4347, 2183, 61257}},
+{4175, 16, 8146, {1, 1, 1, 3, 23, 21, 51, 217, 297, 135, 573, 689, 4947, 14143, 26247, 43061}},
+{4176, 16, 8162, {1, 3, 1, 7, 15, 13, 27, 151, 463, 707, 43, 3641, 4999, 3783, 9083, 22085}},
+{4177, 16, 8250, {1, 3, 3, 5, 3, 1, 15, 119, 343, 605, 105, 2939, 2259, 889, 21759, 34073}},
+{4178, 16, 8270, {1, 1, 1, 7, 3, 63, 103, 1, 235, 317, 263, 2701, 7331, 15921, 17295, 613}},
+{4179, 16, 8294, {1, 1, 7, 3, 19, 3, 5, 17, 105, 491, 755, 233, 5397, 12365, 16325, 59377}},
+{4180, 16, 8324, {1, 3, 3, 15, 15, 27, 37, 151, 481, 949, 1473, 233, 1925, 15471, 24957, 3241}},
+{4181, 16, 8351, {1, 1, 7, 5, 9, 61, 49, 91, 169, 179, 701, 3957, 473, 15087, 6109, 25083}},
+{4182, 16, 8357, {1, 3, 3, 11, 27, 43, 5, 33, 69, 705, 733, 2675, 2677, 4235, 11109, 15557}},
+{4183, 16, 8361, {1, 3, 1, 3, 17, 19, 101, 119, 289, 341, 1395, 563, 6859, 10359, 10077, 26905}},
+{4184, 16, 8364, {1, 1, 1, 15, 21, 47, 41, 145, 439, 583, 1755, 1977, 5235, 15961, 21315, 60577}},
+{4185, 16, 8393, {1, 1, 5, 3, 9, 59, 71, 143, 27, 1007, 313, 1567, 1685, 11063, 28889, 44253}},
+{4186, 16, 8396, {1, 1, 5, 5, 29, 29, 43, 127, 13, 585, 1245, 187, 2697, 8791, 19561, 6463}},
+{4187, 16, 8407, {1, 1, 3, 11, 29, 39, 127, 75, 23, 521, 421, 3115, 139, 5429, 23341, 58035}},
+{4188, 16, 8413, {1, 1, 3, 1, 27, 35, 27, 9, 185, 653, 887, 2715, 3775, 1753, 22105, 62095}},
+{4189, 16, 8414, {1, 1, 5, 5, 5, 63, 23, 31, 317, 1001, 1751, 1185, 7933, 525, 30501, 15565}},
+{4190, 16, 8432, {1, 1, 1, 5, 9, 27, 79, 91, 453, 995, 1041, 3213, 8027, 5855, 7435, 64079}},
+{4191, 16, 8435, {1, 1, 3, 11, 1, 51, 27, 195, 139, 41, 1891, 1437, 1033, 11671, 3235, 35083}},
+{4192, 16, 8441, {1, 3, 1, 3, 11, 25, 33, 249, 373, 497, 1631, 293, 3657, 10741, 15831, 59545}},
+{4193, 16, 8447, {1, 1, 1, 1, 15, 63, 13, 165, 113, 559, 1615, 3579, 1993, 1907, 22335, 47791}},
+{4194, 16, 8449, {1, 1, 3, 15, 13, 49, 63, 235, 31, 811, 1729, 221, 5143, 11547, 30029, 52003}},
+{4195, 16, 8456, {1, 1, 5, 13, 29, 61, 25, 221, 421, 221, 583, 373, 2341, 7493, 13981, 54141}},
+{4196, 16, 8485, {1, 1, 5, 11, 21, 49, 71, 249, 237, 369, 1273, 1067, 4411, 409, 7219, 52933}},
+{4197, 16, 8504, {1, 3, 1, 1, 13, 23, 53, 15, 137, 553, 401, 2247, 5591, 14021, 445, 20433}},
+{4198, 16, 8512, {1, 1, 7, 7, 7, 23, 19, 189, 119, 643, 847, 2123, 5343, 11839, 4575, 60461}},
+{4199, 16, 8532, {1, 1, 5, 5, 11, 19, 111, 219, 185, 499, 595, 723, 3519, 10891, 27603, 29261}},
+{4200, 16, 8551, {1, 3, 3, 1, 9, 13, 95, 227, 459, 133, 1535, 3481, 7187, 14797, 16511, 6737}},
+{4201, 16, 8560, {1, 1, 7, 7, 19, 57, 117, 7, 455, 941, 455, 797, 6313, 10071, 18651, 25013}},
+{4202, 16, 8566, {1, 3, 7, 3, 25, 25, 79, 19, 383, 971, 1625, 2803, 2461, 633, 32317, 48407}},
+{4203, 16, 8581, {1, 1, 7, 7, 25, 43, 93, 135, 155, 685, 2001, 3007, 7315, 15555, 30401, 36291}},
+{4204, 16, 8609, {1, 1, 1, 5, 13, 33, 123, 221, 341, 105, 1075, 3125, 5323, 14293, 29875, 52215}},
+{4205, 16, 8639, {1, 1, 3, 9, 29, 51, 25, 59, 171, 563, 1695, 2845, 6067, 10671, 2909, 33977}},
+{4206, 16, 8641, {1, 3, 3, 7, 25, 21, 39, 65, 485, 949, 1773, 2775, 6019, 14587, 6715, 54793}},
+{4207, 16, 8671, {1, 1, 7, 11, 17, 57, 125, 17, 111, 167, 289, 3939, 7357, 2289, 1717, 45225}},
+{4208, 16, 8695, {1, 1, 7, 7, 21, 55, 3, 139, 471, 747, 1437, 1353, 7657, 13133, 14193, 38191}},
+{4209, 16, 8701, {1, 3, 5, 7, 25, 57, 55, 17, 315, 159, 437, 933, 7493, 6025, 2775, 24287}},
+{4210, 16, 8711, {1, 1, 7, 1, 15, 45, 67, 191, 355, 681, 1763, 1237, 105, 1425, 26089, 42879}},
+{4211, 16, 8739, {1, 1, 5, 13, 13, 53, 25, 127, 103, 155, 935, 2561, 475, 4341, 30541, 43835}},
+{4212, 16, 8763, {1, 1, 5, 15, 27, 59, 99, 173, 189, 41, 105, 3287, 4071, 15005, 18301, 34487}},
+{4213, 16, 8778, {1, 1, 5, 11, 21, 9, 57, 115, 495, 561, 579, 397, 3049, 2007, 5041, 37345}},
+{4214, 16, 8783, {1, 1, 5, 11, 15, 11, 101, 241, 69, 483, 1007, 4069, 5221, 5323, 20177, 24397}},
+{4215, 16, 8785, {1, 1, 1, 7, 29, 15, 119, 161, 21, 517, 847, 2217, 4487, 4817, 24053, 21683}},
+{4216, 16, 8797, {1, 3, 1, 3, 3, 51, 85, 63, 345, 799, 1699, 3961, 7109, 3931, 28173, 46851}},
+{4217, 16, 8802, {1, 1, 5, 7, 15, 25, 97, 139, 331, 969, 1129, 2451, 3107, 12235, 12949, 29837}},
+{4218, 16, 8816, {1, 3, 7, 1, 19, 21, 51, 155, 295, 565, 29, 2107, 341, 14611, 15281, 50727}},
+{4219, 16, 8828, {1, 3, 1, 11, 3, 37, 13, 217, 429, 217, 301, 1217, 5655, 13845, 32465, 23559}},
+{4220, 16, 8837, {1, 3, 3, 9, 9, 57, 79, 231, 433, 703, 699, 3813, 7035, 5885, 19185, 52551}},
+{4221, 16, 8852, {1, 1, 1, 5, 19, 17, 31, 209, 49, 515, 279, 909, 5881, 2673, 23635, 23101}},
+{4222, 16, 8859, {1, 1, 5, 7, 3, 3, 119, 139, 245, 775, 1009, 1157, 1405, 9737, 17671, 62981}},
+{4223, 16, 8889, {1, 3, 7, 11, 17, 21, 105, 21, 67, 871, 233, 3607, 571, 9141, 9751, 28093}},
+{4224, 16, 8900, {1, 1, 3, 13, 5, 53, 91, 181, 143, 375, 1113, 705, 837, 10505, 11459, 57753}},
+{4225, 16, 8903, {1, 3, 5, 11, 9, 19, 107, 229, 305, 107, 1027, 691, 4677, 8987, 7931, 951}},
+{4226, 16, 8909, {1, 1, 7, 9, 9, 17, 39, 195, 103, 315, 517, 123, 7167, 7039, 3571, 40469}},
+{4227, 16, 8910, {1, 1, 1, 5, 1, 21, 121, 53, 427, 111, 717, 1065, 2843, 5873, 28411, 42443}},
+{4228, 16, 8922, {1, 1, 3, 11, 27, 7, 37, 255, 429, 363, 997, 2429, 6871, 1271, 29375, 62897}},
+{4229, 16, 8924, {1, 3, 3, 13, 23, 23, 123, 119, 213, 51, 771, 1603, 1621, 1497, 23667, 13443}},
+{4230, 16, 8955, {1, 1, 3, 13, 17, 21, 81, 17, 211, 815, 1751, 3875, 4001, 3927, 6185, 28753}},
+{4231, 16, 8958, {1, 3, 1, 5, 13, 41, 23, 187, 475, 353, 1307, 543, 5077, 3459, 20553, 29119}},
+{4232, 16, 8980, {1, 1, 1, 7, 1, 39, 3, 247, 375, 101, 81, 1515, 1079, 15307, 18865, 63115}},
+{4233, 16, 8994, {1, 1, 5, 9, 23, 7, 61, 45, 379, 553, 435, 1805, 4147, 2289, 22081, 40041}},
+{4234, 16, 9006, {1, 1, 7, 3, 17, 13, 107, 169, 119, 981, 1825, 3329, 7779, 12245, 28367, 6749}},
+{4235, 16, 9017, {1, 3, 3, 13, 29, 13, 93, 155, 331, 507, 1073, 279, 6615, 14077, 3005, 10171}},
+{4236, 16, 9032, {1, 1, 5, 7, 29, 23, 81, 181, 321, 921, 1531, 2607, 7291, 1255, 29889, 30095}},
+{4237, 16, 9040, {1, 1, 1, 5, 7, 1, 9, 231, 203, 559, 243, 3999, 3649, 7939, 14729, 34771}},
+{4238, 16, 9061, {1, 3, 7, 3, 17, 29, 79, 251, 305, 641, 1125, 1155, 7139, 6721, 43, 34927}},
+{4239, 16, 9066, {1, 1, 5, 13, 21, 39, 55, 103, 143, 487, 849, 1111, 1105, 8483, 5417, 10521}},
+{4240, 16, 9071, {1, 1, 5, 5, 19, 5, 111, 49, 95, 917, 843, 2539, 6831, 9019, 16045, 59363}},
+{4241, 16, 9076, {1, 3, 3, 11, 7, 45, 87, 51, 49, 615, 603, 1623, 5351, 11939, 21945, 40539}},
+{4242, 16, 9086, {1, 1, 5, 9, 9, 33, 113, 37, 163, 853, 1313, 4021, 965, 11465, 8573, 24425}},
+{4243, 16, 9104, {1, 3, 3, 9, 17, 19, 121, 95, 93, 441, 1951, 3335, 6279, 16087, 14763, 60771}},
+{4244, 16, 9150, {1, 3, 3, 9, 13, 15, 19, 129, 257, 641, 533, 1667, 5959, 2259, 10439, 29745}},
+{4245, 16, 9161, {1, 1, 7, 7, 11, 31, 45, 247, 233, 101, 899, 2033, 7803, 11423, 30645, 7723}},
+{4246, 16, 9164, {1, 3, 5, 11, 23, 3, 69, 79, 319, 125, 1463, 2047, 7311, 5819, 445, 13725}},
+{4247, 16, 9185, {1, 1, 1, 3, 7, 43, 83, 89, 467, 709, 1993, 3773, 7805, 305, 15701, 51101}},
+{4248, 16, 9188, {1, 1, 7, 5, 19, 53, 77, 237, 27, 853, 1003, 2041, 5739, 4663, 9783, 23761}},
+{4249, 16, 9212, {1, 1, 3, 7, 19, 31, 71, 33, 479, 693, 1503, 9, 2779, 1481, 9413, 36227}},
+{4250, 16, 9230, {1, 3, 1, 11, 9, 23, 1, 99, 247, 33, 1987, 1577, 8029, 7785, 29947, 38751}},
+{4251, 16, 9242, {1, 1, 1, 3, 15, 57, 23, 53, 431, 553, 1433, 2447, 1871, 10701, 30961, 12281}},
+{4252, 16, 9247, {1, 3, 5, 9, 11, 49, 123, 91, 87, 155, 301, 3339, 6183, 15895, 17309, 45927}},
+{4253, 16, 9260, {1, 1, 1, 9, 9, 41, 79, 123, 261, 547, 1931, 2553, 7405, 14431, 24079, 20769}},
+{4254, 16, 9280, {1, 3, 1, 3, 31, 17, 17, 137, 419, 591, 1693, 3977, 861, 16025, 189, 60995}},
+{4255, 16, 9300, {1, 3, 7, 11, 19, 47, 107, 243, 87, 135, 507, 189, 1397, 3841, 22999, 50781}},
+{4256, 16, 9313, {1, 3, 5, 5, 15, 11, 19, 239, 133, 295, 673, 2389, 4753, 4363, 21669, 25579}},
+{4257, 16, 9325, {1, 3, 5, 7, 19, 43, 55, 129, 239, 89, 1731, 1381, 5483, 11773, 9201, 17745}},
+{4258, 16, 9343, {1, 3, 1, 13, 3, 15, 77, 131, 417, 845, 1953, 2871, 1789, 10343, 11363, 20699}},
+{4259, 16, 9349, {1, 3, 7, 1, 9, 43, 55, 223, 239, 317, 1951, 2725, 209, 3853, 2201, 6839}},
+{4260, 16, 9354, {1, 3, 1, 3, 7, 35, 29, 21, 149, 779, 467, 65, 811, 4859, 14021, 38429}},
+{4261, 16, 9367, {1, 3, 7, 1, 19, 31, 97, 9, 11, 415, 689, 1513, 2475, 5039, 5669, 65103}},
+{4262, 16, 9368, {1, 3, 3, 3, 11, 25, 37, 247, 189, 911, 429, 2395, 3653, 79, 28115, 23513}},
+{4263, 16, 9455, {1, 1, 5, 5, 5, 27, 25, 45, 291, 455, 741, 2259, 8131, 11779, 14693, 58729}},
+{4264, 16, 9458, {1, 3, 3, 7, 21, 33, 67, 49, 153, 491, 1811, 1955, 925, 15555, 13801, 48717}},
+{4265, 16, 9469, {1, 3, 1, 3, 11, 53, 105, 129, 457, 225, 497, 1123, 973, 2901, 26655, 3643}},
+{4266, 16, 9481, {1, 1, 7, 13, 29, 49, 71, 37, 321, 865, 735, 357, 7629, 6011, 28221, 39041}},
+{4267, 16, 9482, {1, 3, 5, 3, 19, 59, 65, 199, 69, 391, 1735, 3075, 287, 16213, 3211, 22425}},
+{4268, 16, 9495, {1, 1, 1, 5, 15, 61, 67, 255, 5, 689, 759, 155, 7245, 5881, 21685, 3863}},
+{4269, 16, 9526, {1, 1, 3, 11, 23, 63, 69, 241, 359, 735, 371, 603, 2707, 15833, 31795, 14901}},
+{4270, 16, 9530, {1, 1, 1, 7, 19, 33, 83, 19, 13, 667, 317, 3891, 5497, 8213, 4913, 22387}},
+{4271, 16, 9558, {1, 3, 5, 9, 13, 21, 11, 187, 249, 647, 349, 605, 2199, 5033, 29773, 48953}},
+{4272, 16, 9562, {1, 3, 3, 11, 3, 3, 93, 235, 441, 933, 383, 2007, 4015, 4175, 3937, 20623}},
+{4273, 16, 9573, {1, 3, 7, 13, 3, 61, 87, 219, 263, 651, 1343, 2709, 31, 16249, 4749, 28909}},
+{4274, 16, 9583, {1, 3, 1, 1, 17, 19, 101, 107, 499, 127, 13, 2123, 5597, 3751, 14527, 12009}},
+{4275, 16, 9595, {1, 3, 5, 13, 27, 57, 1, 195, 107, 947, 1475, 2831, 6449, 16117, 20555, 61513}},
+{4276, 16, 9597, {1, 3, 1, 9, 9, 47, 89, 187, 401, 299, 637, 197, 1235, 12655, 25025, 24443}},
+{4277, 16, 9616, {1, 1, 3, 5, 9, 57, 33, 41, 451, 983, 391, 2707, 705, 13913, 28843, 34091}},
+{4278, 16, 9638, {1, 3, 5, 3, 29, 19, 61, 31, 349, 253, 1267, 3345, 2151, 11309, 19623, 62407}},
+{4279, 16, 9649, {1, 1, 1, 3, 11, 37, 31, 59, 1, 253, 103, 2811, 1871, 4239, 26311, 32507}},
+{4280, 16, 9662, {1, 1, 5, 7, 7, 7, 69, 63, 281, 901, 1785, 2131, 4265, 253, 13997, 30177}},
+{4281, 16, 9691, {1, 3, 1, 11, 3, 27, 111, 67, 411, 751, 241, 293, 6271, 4187, 22119, 63737}},
+{4282, 16, 9700, {1, 3, 5, 5, 27, 19, 45, 203, 81, 59, 1839, 935, 4847, 1869, 12037, 30971}},
+{4283, 16, 9703, {1, 1, 3, 9, 19, 25, 9, 27, 373, 875, 1735, 689, 2957, 7873, 29771, 4093}},
+{4284, 16, 9710, {1, 1, 7, 11, 13, 39, 11, 129, 53, 433, 1731, 899, 5855, 10221, 24165, 50205}},
+{4285, 16, 9721, {1, 3, 1, 15, 25, 31, 85, 49, 325, 299, 183, 287, 2425, 15353, 25999, 59129}},
+{4286, 16, 9724, {1, 1, 5, 5, 17, 25, 23, 5, 287, 677, 591, 981, 429, 15297, 14573, 61095}},
+{4287, 16, 9727, {1, 1, 5, 15, 5, 15, 67, 195, 209, 341, 1621, 1379, 3031, 5469, 31563, 49291}},
+{4288, 16, 9743, {1, 1, 1, 1, 25, 33, 61, 201, 15, 125, 969, 1965, 2021, 10253, 23801, 28165}},
+{4289, 16, 9779, {1, 1, 5, 5, 13, 17, 5, 245, 11, 133, 287, 1929, 4331, 15919, 29663, 10243}},
+{4290, 16, 9785, {1, 1, 7, 9, 19, 33, 39, 191, 489, 631, 69, 1883, 2183, 14993, 32715, 62217}},
+{4291, 16, 9811, {1, 3, 3, 13, 23, 61, 103, 193, 501, 431, 437, 417, 6557, 11701, 27577, 42943}},
+{4292, 16, 9820, {1, 3, 3, 9, 9, 27, 69, 247, 469, 841, 733, 813, 2673, 7145, 5385, 44917}},
+{4293, 16, 9827, {1, 1, 7, 9, 5, 13, 19, 71, 323, 923, 1885, 3031, 4507, 13787, 14149, 1483}},
+{4294, 16, 9851, {1, 3, 1, 5, 1, 15, 89, 229, 301, 733, 1343, 2415, 6463, 1875, 9293, 6037}},
+{4295, 16, 9854, {1, 3, 1, 5, 29, 57, 67, 121, 311, 441, 1079, 1963, 7137, 6745, 9893, 22811}},
+{4296, 16, 9863, {1, 1, 7, 7, 25, 13, 27, 61, 331, 361, 481, 3783, 3061, 7827, 18885, 27583}},
+{4297, 16, 9884, {1, 3, 1, 5, 17, 47, 19, 83, 309, 65, 1573, 3437, 5623, 12691, 21075, 27789}},
+{4298, 16, 9894, {1, 1, 7, 9, 13, 51, 7, 209, 131, 111, 1143, 53, 7277, 9297, 20869, 33121}},
+{4299, 16, 9903, {1, 1, 3, 9, 13, 17, 57, 89, 239, 281, 775, 333, 5631, 2805, 10195, 9665}},
+{4300, 16, 9908, {1, 1, 3, 7, 19, 39, 71, 79, 63, 551, 103, 3169, 2761, 13929, 20751, 18951}},
+{4301, 16, 9912, {1, 1, 7, 11, 5, 23, 7, 249, 447, 483, 433, 3117, 1421, 14991, 5397, 19813}},
+{4302, 16, 9925, {1, 3, 1, 13, 3, 9, 109, 241, 181, 33, 853, 3939, 3751, 2151, 28375, 64443}},
+{4303, 16, 9926, {1, 1, 7, 7, 3, 33, 65, 211, 251, 631, 1819, 3913, 3353, 12975, 19117, 51515}},
+{4304, 16, 9971, {1, 1, 1, 13, 3, 21, 9, 203, 223, 229, 1399, 117, 6297, 11535, 16383, 12541}},
+{4305, 16, 9973, {1, 1, 5, 7, 25, 9, 53, 27, 497, 103, 1915, 2179, 3679, 11375, 18907, 63385}},
+{4306, 16, 9977, {1, 3, 1, 5, 1, 53, 91, 169, 87, 387, 377, 1121, 7241, 5133, 1949, 13433}},
+{4307, 16, 10021, {1, 1, 1, 3, 27, 35, 61, 189, 241, 445, 287, 325, 127, 2363, 30663, 43557}},
+{4308, 16, 10039, {1, 3, 1, 3, 17, 47, 59, 237, 213, 979, 807, 85, 4621, 9915, 13631, 55657}},
+{4309, 16, 10048, {1, 3, 5, 7, 27, 5, 101, 89, 495, 675, 1181, 2295, 1913, 3731, 32639, 58297}},
+{4310, 16, 10051, {1, 3, 3, 11, 5, 41, 49, 229, 93, 659, 927, 3425, 4083, 11859, 10603, 20631}},
+{4311, 16, 10065, {1, 3, 5, 11, 31, 51, 67, 69, 253, 497, 1665, 1985, 5439, 15999, 4175, 62175}},
+{4312, 16, 10071, {1, 1, 7, 11, 1, 21, 95, 19, 205, 513, 1329, 1821, 1251, 2381, 32623, 23923}},
+{4313, 16, 10072, {1, 1, 5, 13, 3, 1, 29, 175, 315, 865, 599, 1695, 1391, 2313, 31035, 19159}},
+{4314, 16, 10101, {1, 3, 3, 1, 3, 45, 109, 93, 481, 285, 869, 3441, 3715, 1355, 9581, 50173}},
+{4315, 16, 10106, {1, 3, 7, 7, 15, 35, 107, 107, 315, 213, 281, 2073, 4689, 5877, 31, 40967}},
+{4316, 16, 10130, {1, 1, 3, 11, 11, 3, 73, 41, 79, 37, 481, 1993, 931, 7677, 11321, 45735}},
+{4317, 16, 10136, {1, 1, 7, 1, 15, 21, 65, 237, 263, 849, 863, 4039, 3171, 13381, 30373, 51639}},
+{4318, 16, 10148, {1, 1, 1, 3, 21, 57, 113, 3, 487, 41, 1277, 633, 2839, 4977, 14537, 31749}},
+{4319, 16, 10155, {1, 1, 5, 1, 1, 55, 71, 181, 147, 895, 1839, 2157, 3187, 6403, 30367, 48915}},
+{4320, 16, 10157, {1, 1, 5, 3, 9, 17, 19, 127, 115, 875, 831, 2439, 7475, 1921, 18657, 27709}},
+{4321, 16, 10160, {1, 3, 3, 13, 29, 11, 35, 81, 291, 483, 625, 3957, 6017, 12543, 18773, 2471}},
+{4322, 16, 10166, {1, 3, 3, 13, 11, 39, 7, 85, 493, 209, 819, 3277, 4275, 8997, 22943, 33199}},
+{4323, 16, 10183, {1, 1, 1, 7, 11, 25, 1, 57, 505, 135, 1713, 3051, 5893, 10711, 10681, 12235}},
+{4324, 16, 10192, {1, 3, 5, 11, 23, 33, 13, 107, 289, 251, 235, 1747, 4097, 12237, 17559, 5063}},
+{4325, 16, 10225, {1, 3, 3, 9, 19, 17, 23, 45, 297, 147, 1301, 2057, 7871, 9971, 1965, 62449}},
+{4326, 16, 10241, {1, 1, 7, 3, 17, 21, 19, 203, 289, 897, 1967, 3519, 3261, 8199, 24181, 23273}},
+{4327, 16, 10247, {1, 1, 7, 11, 1, 17, 25, 63, 509, 969, 47, 1329, 701, 5227, 419, 14839}},
+{4328, 16, 10284, {1, 3, 5, 11, 1, 41, 81, 157, 395, 97, 1919, 3043, 6015, 15, 23733, 55485}},
+{4329, 16, 10304, {1, 1, 3, 11, 17, 37, 17, 181, 179, 297, 1007, 1559, 6275, 11645, 7535, 28941}},
+{4330, 16, 10322, {1, 3, 7, 15, 5, 47, 31, 237, 215, 563, 207, 1867, 6635, 6857, 11837, 22865}},
+{4331, 16, 10331, {1, 3, 1, 7, 7, 39, 51, 179, 57, 987, 893, 2715, 1045, 5799, 19805, 54275}},
+{4332, 16, 10333, {1, 1, 7, 15, 25, 9, 127, 243, 323, 1013, 929, 2891, 7549, 1071, 17663, 15247}},
+{4333, 16, 10340, {1, 1, 1, 5, 25, 23, 101, 9, 371, 89, 1749, 3559, 8071, 13887, 14807, 42825}},
+{4334, 16, 10347, {1, 3, 3, 11, 21, 41, 3, 77, 3, 709, 1745, 3615, 4141, 5275, 28329, 59739}},
+{4335, 16, 10357, {1, 1, 7, 13, 1, 11, 73, 183, 363, 241, 863, 3983, 3235, 293, 649, 441}},
+{4336, 16, 10371, {1, 1, 5, 3, 13, 27, 13, 191, 57, 639, 1803, 2353, 3143, 12763, 5771, 36155}},
+{4337, 16, 10386, {1, 1, 5, 3, 1, 53, 85, 45, 283, 823, 1213, 3261, 4599, 13267, 4613, 12657}},
+{4338, 16, 10404, {1, 3, 5, 15, 27, 49, 59, 123, 357, 527, 337, 2751, 3999, 8525, 12501, 40621}},
+{4339, 16, 10414, {1, 1, 1, 7, 1, 55, 85, 17, 447, 599, 1315, 2313, 1649, 907, 25647, 3251}},
+{4340, 16, 10422, {1, 3, 5, 13, 9, 1, 37, 121, 143, 1, 631, 2273, 1673, 3649, 27533, 28731}},
+{4341, 16, 10448, {1, 1, 7, 13, 9, 31, 57, 249, 397, 815, 501, 895, 1217, 11387, 8635, 65193}},
+{4342, 16, 10451, {1, 1, 5, 5, 9, 35, 95, 193, 133, 513, 1929, 3841, 3063, 2383, 24413, 51185}},
+{4343, 16, 10473, {1, 1, 1, 13, 3, 49, 45, 191, 15, 181, 1819, 3741, 1227, 12775, 9461, 44951}},
+{4344, 16, 10479, {1, 1, 1, 1, 3, 45, 121, 19, 269, 829, 517, 3913, 183, 11019, 24969, 21973}},
+{4345, 16, 10501, {1, 1, 5, 11, 31, 39, 125, 189, 401, 57, 1557, 1727, 1415, 4025, 30353, 36589}},
+{4346, 16, 10530, {1, 1, 3, 9, 3, 55, 125, 187, 409, 499, 1853, 2781, 4323, 16159, 16345, 34659}},
+{4347, 16, 10542, {1, 3, 5, 11, 31, 5, 125, 137, 197, 475, 2003, 617, 1289, 8365, 28981, 57537}},
+{4348, 16, 10544, {1, 1, 1, 5, 19, 29, 83, 127, 311, 177, 1635, 2187, 5377, 12841, 7591, 6095}},
+{4349, 16, 10571, {1, 3, 5, 5, 21, 39, 65, 197, 115, 411, 1457, 3011, 7021, 14119, 61, 21107}},
+{4350, 16, 10628, {1, 3, 3, 9, 19, 57, 99, 23, 451, 507, 973, 415, 7123, 11367, 29767, 23763}},
+{4351, 16, 10643, {1, 1, 5, 7, 29, 23, 47, 11, 267, 873, 591, 373, 7097, 3783, 23289, 5547}},
+{4352, 16, 10673, {1, 1, 5, 15, 7, 7, 7, 91, 389, 841, 1995, 459, 7013, 3109, 23615, 21519}},
+{4353, 16, 10683, {1, 3, 1, 1, 13, 25, 87, 235, 193, 201, 713, 1633, 3117, 13609, 17211, 573}},
+{4354, 16, 10736, {1, 1, 1, 9, 27, 53, 105, 39, 217, 781, 997, 661, 6243, 6427, 17739, 62239}},
+{4355, 16, 10795, {1, 1, 7, 3, 3, 49, 75, 125, 239, 195, 215, 2983, 1185, 4743, 12069, 55509}},
+{4356, 16, 10797, {1, 1, 5, 15, 31, 11, 9, 91, 253, 361, 571, 1589, 2425, 4279, 3765, 46519}},
+{4357, 16, 10815, {1, 1, 3, 3, 21, 49, 49, 213, 399, 253, 1565, 2447, 453, 7957, 24799, 58503}},
+{4358, 16, 10817, {1, 1, 7, 1, 5, 59, 81, 97, 209, 477, 17, 3085, 3655, 599, 24011, 14981}},
+{4359, 16, 10842, {1, 3, 3, 13, 19, 49, 7, 35, 111, 169, 629, 1587, 5345, 13699, 21187, 30199}},
+{4360, 16, 10844, {1, 1, 3, 13, 19, 59, 73, 127, 475, 509, 9, 2661, 711, 15835, 31429, 33885}},
+{4361, 16, 10863, {1, 3, 5, 3, 31, 15, 43, 185, 29, 897, 1041, 1057, 6285, 13925, 4023, 25741}},
+{4362, 16, 10899, {1, 3, 5, 11, 1, 33, 63, 155, 175, 501, 1147, 3395, 3285, 16237, 22315, 50945}},
+{4363, 16, 10902, {1, 3, 3, 3, 5, 13, 77, 227, 85, 139, 139, 1, 7147, 2023, 32705, 38753}},
+{4364, 16, 10917, {1, 3, 5, 11, 31, 59, 35, 179, 489, 537, 1537, 2877, 4937, 10825, 2445, 34907}},
+{4365, 16, 10953, {1, 3, 7, 11, 17, 17, 95, 223, 165, 925, 829, 3971, 1, 7393, 8825, 25705}},
+{4366, 16, 10967, {1, 1, 1, 1, 25, 17, 25, 143, 385, 907, 1381, 1823, 3819, 8475, 5321, 12037}},
+{4367, 16, 11002, {1, 1, 5, 11, 7, 47, 97, 85, 105, 23, 263, 1329, 1905, 12121, 29635, 41249}},
+{4368, 16, 11024, {1, 1, 7, 11, 1, 51, 13, 13, 5, 143, 83, 3831, 959, 6083, 16997, 59887}},
+{4369, 16, 11029, {1, 3, 3, 13, 25, 9, 31, 5, 215, 791, 767, 1733, 2715, 14283, 25795, 54249}},
+{4370, 16, 11030, {1, 3, 7, 5, 11, 19, 125, 81, 71, 131, 1869, 1111, 6763, 5275, 23095, 1139}},
+{4371, 16, 11043, {1, 3, 3, 9, 25, 43, 119, 49, 133, 217, 521, 1367, 5867, 6829, 29871, 60383}},
+{4372, 16, 11087, {1, 1, 7, 9, 5, 11, 59, 157, 279, 301, 481, 3273, 7943, 3273, 27783, 17271}},
+{4373, 16, 11106, {1, 3, 3, 13, 11, 57, 13, 5, 435, 169, 541, 517, 2359, 9121, 27911, 15679}},
+{4374, 16, 11130, {1, 1, 3, 9, 9, 55, 65, 113, 21, 807, 373, 2825, 1527, 15565, 8339, 7227}},
+{4375, 16, 11156, {1, 3, 5, 9, 1, 1, 49, 255, 477, 821, 1647, 713, 6841, 3187, 22649, 51469}},
+{4376, 16, 11176, {1, 3, 3, 11, 13, 43, 63, 139, 71, 809, 993, 2429, 833, 6545, 10987, 39567}},
+{4377, 16, 11221, {1, 1, 1, 9, 19, 23, 47, 199, 191, 827, 391, 837, 1209, 2493, 24071, 46589}},
+{4378, 16, 11267, {1, 1, 5, 13, 25, 51, 39, 43, 103, 899, 1729, 2389, 2965, 189, 3063, 50609}},
+{4379, 16, 11282, {1, 1, 3, 1, 5, 29, 105, 201, 503, 199, 507, 205, 2389, 695, 15233, 50353}},
+{4380, 16, 11294, {1, 3, 1, 7, 19, 53, 45, 21, 89, 545, 1885, 765, 6673, 13485, 9987, 2609}},
+{4381, 16, 11332, {1, 3, 7, 13, 17, 7, 59, 23, 159, 309, 1407, 2483, 1807, 15733, 5603, 52989}},
+{4382, 16, 11353, {1, 1, 1, 11, 13, 19, 123, 185, 413, 745, 361, 2391, 6697, 2281, 11999, 13175}},
+{4383, 16, 11369, {1, 3, 5, 5, 11, 49, 123, 173, 325, 667, 895, 1067, 8121, 10577, 30561, 17391}},
+{4384, 16, 11372, {1, 1, 5, 5, 23, 21, 77, 223, 281, 161, 141, 345, 3879, 11393, 26907, 53805}},
+{4385, 16, 11375, {1, 3, 3, 5, 3, 47, 17, 109, 185, 139, 957, 1417, 4553, 6101, 29537, 34821}},
+{4386, 16, 11413, {1, 1, 5, 3, 29, 49, 89, 61, 45, 593, 269, 1483, 2971, 991, 21239, 29301}},
+{4387, 16, 11429, {1, 1, 3, 13, 29, 45, 33, 253, 291, 783, 737, 2363, 2651, 8627, 21785, 58419}},
+{4388, 16, 11430, {1, 3, 7, 15, 29, 15, 81, 185, 363, 681, 1737, 3789, 4365, 3295, 23205, 4457}},
+{4389, 16, 11444, {1, 3, 3, 11, 15, 39, 67, 167, 197, 357, 871, 2201, 5377, 6299, 20873, 59283}},
+{4390, 16, 11462, {1, 3, 3, 5, 9, 15, 127, 49, 21, 719, 357, 425, 5507, 9639, 275, 47503}},
+{4391, 16, 11465, {1, 1, 7, 1, 13, 63, 111, 121, 21, 481, 247, 3147, 5783, 8947, 20809, 42039}},
+{4392, 16, 11471, {1, 1, 3, 3, 31, 33, 9, 69, 187, 517, 2029, 2205, 7661, 4757, 27525, 9665}},
+{4393, 16, 11473, {1, 1, 1, 13, 7, 41, 103, 161, 233, 221, 693, 213, 4609, 7771, 28703, 17407}},
+{4394, 16, 11495, {1, 3, 7, 15, 31, 47, 27, 111, 479, 1003, 1687, 347, 2179, 11861, 8169, 31941}},
+{4395, 16, 11499, {1, 1, 3, 5, 5, 63, 25, 125, 199, 147, 589, 3565, 3449, 8331, 8923, 31207}},
+{4396, 16, 11519, {1, 1, 3, 11, 19, 25, 77, 99, 299, 19, 1641, 2193, 4299, 3635, 20621, 267}},
+{4397, 16, 11562, {1, 3, 7, 11, 9, 59, 7, 167, 1, 775, 29, 1935, 3723, 11835, 2887, 65285}},
+{4398, 16, 11576, {1, 1, 7, 13, 5, 47, 101, 155, 235, 93, 465, 3581, 1837, 7675, 10789, 45167}},
+{4399, 16, 11582, {1, 1, 3, 5, 9, 59, 121, 109, 59, 821, 1625, 343, 1591, 3875, 13729, 56381}},
+{4400, 16, 11596, {1, 1, 1, 9, 27, 53, 93, 215, 133, 561, 39, 2591, 1041, 11913, 24493, 37921}},
+{4401, 16, 11602, {1, 1, 1, 7, 23, 7, 81, 107, 219, 943, 563, 1083, 5803, 5687, 32559, 62727}},
+{4402, 16, 11611, {1, 3, 7, 7, 21, 53, 3, 5, 231, 601, 1561, 103, 3837, 2675, 5263, 23375}},
+{4403, 16, 11627, {1, 1, 3, 13, 15, 27, 89, 7, 251, 887, 951, 3001, 5687, 4921, 5091, 59337}},
+{4404, 16, 11682, {1, 3, 7, 15, 25, 53, 19, 155, 185, 503, 547, 1917, 7633, 15167, 14177, 46761}},
+{4405, 16, 11687, {1, 3, 5, 15, 21, 49, 13, 163, 471, 281, 1141, 3013, 6847, 9261, 15955, 9397}},
+{4406, 16, 11691, {1, 3, 3, 3, 1, 21, 19, 239, 479, 609, 65, 2735, 5337, 6293, 19351, 34135}},
+{4407, 16, 11733, {1, 1, 7, 1, 9, 1, 119, 23, 411, 535, 101, 1597, 2379, 2421, 31471, 36473}},
+{4408, 16, 11747, {1, 3, 1, 11, 31, 63, 17, 225, 45, 409, 59, 3943, 8043, 11759, 10667, 58793}},
+{4409, 16, 11759, {1, 1, 3, 3, 9, 49, 61, 239, 245, 765, 1945, 3567, 5355, 14799, 7141, 59511}},
+{4410, 16, 11778, {1, 3, 7, 9, 3, 33, 103, 99, 35, 799, 1347, 2253, 8189, 14177, 13479, 13749}},
+{4411, 16, 11852, {1, 3, 1, 15, 15, 51, 7, 179, 471, 265, 1571, 2983, 701, 15133, 7885, 29977}},
+{4412, 16, 11857, {1, 1, 5, 9, 15, 37, 49, 213, 113, 729, 1115, 2727, 2635, 8433, 11145, 46779}},
+{4413, 16, 11858, {1, 3, 5, 11, 7, 3, 115, 151, 133, 723, 7, 4063, 5807, 9845, 25829, 29315}},
+{4414, 16, 11893, {1, 3, 5, 9, 25, 55, 17, 135, 145, 379, 1603, 3459, 5773, 6545, 17509, 25847}},
+{4415, 16, 11907, {1, 1, 7, 11, 1, 61, 113, 147, 489, 775, 1347, 2199, 299, 9589, 19931, 1335}},
+{4416, 16, 11928, {1, 3, 1, 3, 1, 7, 27, 243, 355, 425, 1215, 3723, 3489, 9285, 12739, 24797}},
+{4417, 16, 11931, {1, 3, 5, 11, 15, 25, 57, 221, 247, 647, 259, 1665, 7055, 2835, 16411, 42999}},
+{4418, 16, 11933, {1, 1, 3, 7, 9, 25, 61, 233, 73, 235, 1539, 1865, 5671, 1329, 5767, 43039}},
+{4419, 16, 11967, {1, 1, 7, 9, 21, 11, 123, 7, 41, 407, 1485, 1723, 585, 10597, 16215, 63403}},
+{4420, 16, 11976, {1, 1, 5, 7, 27, 9, 123, 101, 273, 673, 1141, 3841, 4041, 13169, 8221, 12915}},
+{4421, 16, 11989, {1, 3, 1, 13, 3, 17, 105, 17, 237, 321, 855, 2821, 2467, 3503, 15187, 1689}},
+{4422, 16, 12003, {1, 1, 5, 5, 19, 23, 9, 205, 87, 153, 1543, 1193, 6619, 6845, 8459, 37533}},
+{4423, 16, 12024, {1, 1, 7, 15, 13, 29, 79, 9, 203, 211, 239, 2349, 3447, 7797, 19311, 58071}},
+{4424, 16, 12030, {1, 3, 5, 11, 5, 49, 71, 151, 333, 895, 1095, 2471, 2477, 14493, 16711, 14393}},
+{4425, 16, 12037, {1, 1, 5, 13, 17, 19, 25, 149, 111, 631, 763, 2535, 3631, 1809, 8163, 18037}},
+{4426, 16, 12044, {1, 3, 3, 13, 23, 61, 25, 179, 351, 247, 1021, 2413, 2585, 3731, 5435, 52723}},
+{4427, 16, 12052, {1, 1, 5, 11, 1, 39, 65, 59, 21, 927, 1989, 2823, 4857, 15521, 30495, 16067}},
+{4428, 16, 12059, {1, 3, 3, 7, 17, 5, 17, 125, 379, 875, 1565, 2435, 933, 6809, 20129, 26339}},
+{4429, 16, 12075, {1, 1, 7, 5, 3, 57, 51, 213, 455, 663, 2007, 3995, 4889, 9527, 23507, 3261}},
+{4430, 16, 12083, {1, 3, 7, 5, 1, 29, 85, 151, 165, 123, 1425, 2851, 4427, 7683, 21085, 28925}},
+{4431, 16, 12117, {1, 1, 5, 3, 11, 33, 127, 3, 41, 591, 1539, 3823, 125, 421, 9051, 55025}},
+{4432, 16, 12138, {1, 3, 1, 5, 7, 9, 69, 35, 59, 477, 1207, 1245, 6423, 11329, 26535, 37621}},
+{4433, 16, 12146, {1, 3, 1, 1, 15, 35, 17, 123, 303, 193, 1489, 2587, 1883, 4063, 1921, 60413}},
+{4434, 16, 12202, {1, 1, 5, 1, 7, 61, 39, 247, 139, 1015, 757, 823, 4757, 9307, 32287, 37241}},
+{4435, 16, 12230, {1, 1, 7, 15, 3, 5, 85, 93, 457, 999, 1331, 919, 5271, 11687, 24233, 38803}},
+{4436, 16, 12254, {1, 3, 3, 9, 5, 43, 37, 13, 505, 603, 1857, 2675, 2017, 9481, 10873, 54755}},
+{4437, 16, 12304, {1, 1, 5, 15, 13, 3, 7, 239, 471, 835, 553, 413, 4029, 8613, 15533, 58987}},
+{4438, 16, 12316, {1, 3, 1, 5, 19, 27, 21, 43, 57, 755, 1245, 2805, 3799, 2013, 21145, 10317}},
+{4439, 16, 12337, {1, 3, 5, 13, 9, 23, 35, 5, 315, 169, 399, 2641, 1525, 10561, 11917, 33009}},
+{4440, 16, 12347, {1, 3, 5, 7, 23, 53, 101, 105, 451, 207, 1271, 3067, 6725, 15525, 7951, 1283}},
+{4441, 16, 12367, {1, 1, 5, 5, 27, 21, 77, 143, 213, 443, 149, 2667, 5269, 10359, 25287, 5843}},
+{4442, 16, 12398, {1, 3, 5, 5, 25, 27, 109, 157, 459, 767, 765, 2667, 1833, 3781, 9077, 64321}},
+{4443, 16, 12421, {1, 3, 3, 13, 31, 25, 97, 237, 279, 431, 1713, 809, 1989, 10431, 5867, 42197}},
+{4444, 16, 12428, {1, 3, 7, 3, 9, 5, 5, 191, 73, 521, 787, 903, 3073, 2067, 24741, 57029}},
+{4445, 16, 12446, {1, 3, 3, 1, 3, 41, 125, 53, 125, 781, 865, 3677, 6279, 357, 10667, 1127}},
+{4446, 16, 12449, {1, 1, 5, 11, 25, 19, 99, 121, 359, 73, 607, 2149, 5739, 15669, 29457, 57549}},
+{4447, 16, 12467, {1, 1, 5, 3, 23, 5, 35, 55, 369, 239, 329, 3057, 3757, 12523, 5017, 52185}},
+{4448, 16, 12479, {1, 3, 3, 13, 17, 61, 69, 165, 267, 323, 2007, 2025, 4423, 15975, 31897, 37013}},
+{4449, 16, 12502, {1, 3, 7, 13, 19, 19, 87, 111, 389, 611, 1523, 963, 4671, 12569, 21839, 10919}},
+{4450, 16, 12521, {1, 1, 1, 3, 1, 27, 13, 227, 29, 457, 221, 127, 5335, 16247, 19559, 19185}},
+{4451, 16, 12553, {1, 3, 5, 7, 29, 21, 23, 157, 197, 87, 1591, 1829, 407, 15885, 14933, 1997}},
+{4452, 16, 12568, {1, 1, 1, 9, 3, 35, 43, 187, 195, 325, 197, 2905, 7323, 1563, 7659, 45185}},
+{4453, 16, 12573, {1, 1, 1, 15, 3, 23, 105, 33, 73, 495, 1409, 2583, 1099, 1041, 28955, 60293}},
+{4454, 16, 12592, {1, 3, 7, 13, 25, 19, 99, 137, 139, 719, 529, 1147, 5813, 11551, 30183, 14593}},
+{4455, 16, 12597, {1, 3, 3, 5, 17, 25, 73, 193, 309, 887, 1655, 1641, 2091, 12087, 21881, 1145}},
+{4456, 16, 12601, {1, 3, 1, 1, 27, 41, 13, 151, 83, 645, 327, 1795, 2717, 12433, 22751, 9823}},
+{4457, 16, 12615, {1, 1, 3, 7, 1, 43, 77, 229, 59, 499, 1883, 135, 3461, 9821, 219, 6111}},
+{4458, 16, 12619, {1, 3, 3, 3, 23, 7, 17, 67, 361, 565, 1621, 3253, 7973, 281, 3209, 48215}},
+{4459, 16, 12694, {1, 1, 3, 7, 31, 15, 97, 141, 197, 883, 1689, 269, 7487, 10403, 18903, 58147}},
+{4460, 16, 12697, {1, 3, 3, 3, 23, 9, 87, 125, 359, 527, 1251, 637, 1145, 12721, 14693, 6021}},
+{4461, 16, 12698, {1, 1, 3, 5, 13, 43, 105, 173, 205, 859, 1237, 1227, 1409, 15513, 25317, 30745}},
+{4462, 16, 12713, {1, 3, 3, 15, 31, 43, 125, 149, 145, 109, 975, 1167, 7629, 8373, 5923, 64117}},
+{4463, 16, 12722, {1, 3, 1, 15, 3, 33, 89, 173, 379, 615, 1401, 1567, 4453, 7461, 32555, 64369}},
+{4464, 16, 12733, {1, 3, 7, 11, 27, 23, 45, 7, 15, 21, 1663, 3327, 5611, 8535, 27669, 25525}},
+{4465, 16, 12736, {1, 1, 3, 15, 15, 61, 127, 145, 151, 41, 629, 767, 5801, 3395, 1157, 30033}},
+{4466, 16, 12790, {1, 1, 1, 5, 9, 63, 73, 9, 299, 237, 369, 1295, 4869, 6821, 19961, 32129}},
+{4467, 16, 12794, {1, 1, 5, 13, 19, 7, 119, 35, 319, 405, 1255, 1299, 4311, 14999, 24567, 4001}},
+{4468, 16, 12803, {1, 1, 1, 13, 9, 39, 13, 207, 355, 691, 37, 3137, 6073, 16179, 28661, 41}},
+{4469, 16, 12815, {1, 1, 3, 7, 21, 3, 123, 27, 187, 183, 769, 2367, 2957, 7065, 17855, 60805}},
+{4470, 16, 12829, {1, 1, 1, 1, 19, 31, 71, 85, 303, 617, 1007, 283, 8087, 11079, 11463, 65295}},
+{4471, 16, 12833, {1, 1, 3, 13, 25, 63, 61, 187, 401, 465, 1485, 801, 3649, 7763, 8495, 54479}},
+{4472, 16, 12840, {1, 3, 7, 3, 13, 51, 41, 119, 311, 699, 1113, 3631, 1981, 3259, 25871, 45659}},
+{4473, 16, 12875, {1, 3, 7, 13, 31, 27, 57, 181, 325, 107, 1745, 635, 3941, 3305, 14563, 29855}},
+{4474, 16, 12877, {1, 3, 7, 15, 5, 55, 5, 147, 365, 485, 1841, 3673, 6513, 11121, 5725, 18027}},
+{4475, 16, 12916, {1, 3, 5, 11, 13, 45, 35, 79, 109, 683, 1171, 3015, 2163, 4823, 4365, 42931}},
+{4476, 16, 12923, {1, 1, 7, 7, 13, 45, 57, 39, 297, 985, 1559, 487, 5071, 2657, 9401, 41889}},
+{4477, 16, 12935, {1, 1, 5, 9, 29, 33, 79, 237, 509, 537, 549, 3657, 7141, 15189, 30853, 36089}},
+{4478, 16, 12949, {1, 3, 5, 7, 31, 15, 75, 73, 237, 273, 865, 743, 2607, 7611, 18441, 12703}},
+{4479, 16, 12954, {1, 1, 1, 9, 27, 9, 35, 137, 265, 181, 1341, 1945, 5615, 161, 18369, 4791}},
+{4480, 16, 12956, {1, 3, 7, 11, 27, 29, 29, 43, 489, 177, 1489, 2927, 623, 14571, 22447, 46905}},
+{4481, 16, 12959, {1, 3, 3, 3, 19, 41, 107, 53, 239, 263, 1433, 1655, 7991, 7405, 2735, 25519}},
+{4482, 16, 12978, {1, 3, 5, 7, 19, 37, 73, 243, 215, 445, 1781, 3223, 187, 8443, 18185, 45093}},
+{4483, 16, 13001, {1, 1, 3, 13, 9, 57, 111, 111, 221, 505, 1261, 3045, 1655, 16247, 21033, 17993}},
+{4484, 16, 13010, {1, 1, 7, 5, 7, 55, 77, 5, 131, 969, 1481, 2883, 2645, 3003, 5601, 37063}},
+{4485, 16, 13043, {1, 1, 5, 15, 29, 55, 39, 197, 349, 29, 341, 67, 1977, 425, 4063, 42705}},
+{4486, 16, 13049, {1, 1, 7, 13, 1, 57, 81, 81, 129, 681, 1407, 2465, 3627, 2325, 31649, 18449}},
+{4487, 16, 13058, {1, 3, 5, 5, 23, 59, 35, 217, 393, 155, 1315, 105, 2285, 5167, 27997, 55193}},
+{4488, 16, 13112, {1, 1, 7, 3, 11, 59, 53, 179, 319, 819, 947, 3881, 765, 4219, 16405, 48055}},
+{4489, 16, 13140, {1, 1, 3, 9, 23, 9, 67, 67, 137, 523, 1585, 2441, 167, 5217, 12031, 14297}},
+{4490, 16, 13149, {1, 1, 5, 13, 31, 63, 121, 91, 439, 917, 203, 1519, 4363, 2391, 25755, 26677}},
+{4491, 16, 13163, {1, 1, 3, 5, 25, 31, 11, 95, 339, 817, 35, 3923, 7365, 10537, 5521, 54579}},
+{4492, 16, 13187, {1, 3, 7, 1, 3, 33, 47, 13, 139, 445, 1357, 3907, 7495, 8789, 26589, 43479}},
+{4493, 16, 13196, {1, 1, 1, 11, 5, 45, 61, 13, 167, 287, 931, 881, 5713, 12937, 12951, 21597}},
+{4494, 16, 13237, {1, 3, 5, 1, 29, 23, 7, 117, 503, 897, 733, 1113, 7205, 11507, 561, 34011}},
+{4495, 16, 13244, {1, 3, 5, 7, 3, 51, 21, 147, 35, 259, 689, 3801, 2481, 9673, 4065, 595}},
+{4496, 16, 13264, {1, 3, 3, 9, 9, 29, 5, 191, 393, 979, 1627, 937, 75, 2339, 24007, 30555}},
+{4497, 16, 13279, {1, 1, 5, 7, 9, 35, 111, 23, 113, 563, 1689, 1575, 6127, 9919, 2555, 52261}},
+{4498, 16, 13292, {1, 3, 1, 5, 31, 21, 117, 159, 473, 279, 1281, 311, 159, 3343, 27761, 59989}},
+{4499, 16, 13295, {1, 1, 5, 1, 23, 31, 67, 241, 401, 69, 933, 777, 267, 12411, 23767, 9047}},
+{4500, 16, 13307, {1, 1, 5, 1, 15, 49, 99, 15, 267, 913, 1581, 3713, 651, 14275, 10103, 57619}},
+{4501, 16, 13312, {1, 3, 5, 9, 19, 23, 95, 5, 449, 153, 1195, 1315, 2347, 12683, 10865, 50703}},
+{4502, 16, 13317, {1, 1, 1, 13, 17, 17, 115, 31, 135, 725, 795, 1695, 6199, 4179, 5223, 48457}},
+{4503, 16, 13327, {1, 3, 5, 15, 31, 15, 3, 247, 385, 269, 1665, 581, 2809, 6333, 7459, 14815}},
+{4504, 16, 13348, {1, 3, 7, 5, 15, 35, 117, 85, 11, 621, 1523, 981, 511, 14113, 4673, 22683}},
+{4505, 16, 13390, {1, 1, 7, 1, 27, 61, 119, 249, 431, 147, 173, 423, 1353, 4747, 12761, 32947}},
+{4506, 16, 13413, {1, 3, 7, 1, 23, 39, 15, 153, 219, 359, 1233, 169, 2817, 11043, 12435, 30135}},
+{4507, 16, 13417, {1, 1, 5, 1, 1, 55, 39, 1, 151, 865, 125, 2351, 6315, 1165, 20163, 43991}},
+{4508, 16, 13418, {1, 1, 3, 9, 25, 41, 115, 221, 129, 265, 1887, 4057, 7523, 13591, 5735, 59645}},
+{4509, 16, 13451, {1, 1, 5, 5, 19, 15, 9, 77, 511, 627, 153, 2015, 247, 15949, 9715, 45411}},
+{4510, 16, 13475, {1, 1, 7, 7, 17, 17, 107, 183, 39, 647, 1339, 3915, 4937, 537, 27011, 58937}},
+{4511, 16, 13482, {1, 3, 3, 13, 3, 3, 69, 201, 431, 65, 683, 121, 7017, 2791, 16713, 62555}},
+{4512, 16, 13510, {1, 3, 7, 3, 7, 41, 117, 237, 23, 757, 545, 3899, 1837, 5555, 7891, 29151}},
+{4513, 16, 13527, {1, 1, 1, 3, 27, 15, 39, 195, 353, 299, 1431, 2279, 1795, 13773, 24915, 49701}},
+{4514, 16, 13543, {1, 1, 5, 5, 7, 7, 125, 5, 401, 523, 1967, 2471, 7279, 7559, 12025, 60599}},
+{4515, 16, 13547, {1, 1, 1, 13, 13, 59, 13, 249, 465, 847, 1483, 975, 7729, 2773, 15745, 51237}},
+{4516, 16, 13627, {1, 1, 7, 9, 31, 41, 115, 141, 247, 355, 1109, 3239, 6495, 4515, 30145, 47705}},
+{4517, 16, 13650, {1, 1, 3, 13, 29, 41, 69, 179, 45, 271, 1909, 3095, 7199, 14049, 9903, 33383}},
+{4518, 16, 13683, {1, 1, 3, 13, 7, 45, 105, 105, 243, 121, 67, 3169, 237, 137, 4175, 54325}},
+{4519, 16, 13696, {1, 3, 3, 11, 19, 51, 93, 155, 79, 579, 1621, 1251, 7639, 15875, 25815, 56063}},
+{4520, 16, 13702, {1, 3, 3, 9, 27, 27, 77, 45, 217, 965, 1045, 875, 4515, 11261, 27859, 757}},
+{4521, 16, 13713, {1, 1, 3, 11, 17, 7, 81, 37, 299, 765, 977, 3371, 3163, 13267, 18345, 9239}},
+{4522, 16, 13739, {1, 1, 1, 3, 15, 23, 115, 11, 183, 511, 557, 3253, 153, 8465, 22659, 42143}},
+{4523, 16, 13749, {1, 1, 5, 13, 17, 61, 127, 219, 225, 981, 615, 731, 4069, 12637, 11601, 38257}},
+{4524, 16, 13767, {1, 1, 5, 3, 29, 3, 73, 79, 393, 779, 823, 2473, 3811, 4417, 9399, 50011}},
+{4525, 16, 13774, {1, 3, 3, 9, 21, 35, 61, 99, 115, 657, 629, 1129, 2355, 12665, 459, 40831}},
+{4526, 16, 13781, {1, 3, 1, 7, 25, 61, 53, 249, 15, 649, 665, 595, 1441, 8035, 5381, 7147}},
+{4527, 16, 13795, {1, 3, 1, 7, 19, 9, 27, 207, 205, 461, 1069, 4039, 6549, 2333, 29, 50067}},
+{4528, 16, 13821, {1, 1, 5, 3, 15, 7, 115, 205, 71, 73, 53, 71, 6049, 15293, 17041, 20313}},
+{4529, 16, 13825, {1, 1, 7, 7, 9, 7, 119, 99, 357, 729, 2041, 3355, 5333, 1263, 30521, 64867}},
+{4530, 16, 13838, {1, 1, 1, 7, 31, 63, 63, 159, 281, 295, 913, 2161, 8033, 13789, 17711, 14915}},
+{4531, 16, 13852, {1, 1, 7, 9, 29, 55, 69, 129, 453, 361, 1883, 17, 1765, 111, 10311, 55019}},
+{4532, 16, 13879, {1, 1, 5, 9, 21, 15, 31, 57, 291, 915, 945, 1775, 5905, 9073, 3271, 15571}},
+{4533, 16, 13888, {1, 1, 1, 7, 21, 11, 1, 9, 167, 143, 1535, 1267, 6675, 13037, 19513, 52027}},
+{4534, 16, 13897, {1, 3, 3, 7, 31, 45, 57, 105, 63, 121, 631, 679, 3873, 16333, 32069, 64725}},
+{4535, 16, 13906, {1, 1, 1, 9, 23, 41, 29, 207, 489, 319, 905, 3147, 4195, 2697, 5281, 1771}},
+{4536, 16, 13939, {1, 1, 1, 9, 25, 33, 57, 201, 405, 111, 407, 3489, 449, 8601, 1273, 42105}},
+{4537, 16, 13962, {1, 1, 1, 3, 19, 45, 123, 159, 237, 173, 781, 787, 7537, 15453, 25567, 53729}},
+{4538, 16, 13981, {1, 1, 7, 3, 29, 9, 89, 207, 345, 685, 1701, 2859, 8065, 9289, 2459, 28367}},
+{4539, 16, 13985, {1, 3, 1, 3, 31, 41, 55, 241, 81, 1001, 595, 1725, 853, 11427, 20617, 1717}},
+{4540, 16, 14020, {1, 1, 3, 3, 9, 45, 121, 69, 177, 1017, 211, 2753, 6923, 1387, 32063, 45337}},
+{4541, 16, 14030, {1, 1, 5, 15, 21, 23, 95, 61, 485, 403, 619, 3035, 4881, 13423, 17815, 35221}},
+{4542, 16, 14041, {1, 1, 3, 3, 3, 59, 23, 69, 77, 309, 227, 2877, 3739, 3539, 20083, 23415}},
+{4543, 16, 14047, {1, 3, 7, 3, 17, 43, 95, 239, 223, 353, 1237, 3239, 1369, 7245, 32401, 63889}},
+{4544, 16, 14048, {1, 1, 1, 5, 25, 63, 123, 3, 291, 819, 793, 241, 5619, 8871, 18341, 2757}},
+{4545, 16, 14066, {1, 3, 7, 15, 3, 21, 17, 97, 395, 333, 909, 3783, 3635, 751, 24227, 44281}},
+{4546, 16, 14092, {1, 3, 7, 13, 29, 49, 123, 195, 191, 159, 211, 1887, 3047, 4871, 2607, 32425}},
+{4547, 16, 14120, {1, 1, 7, 7, 15, 57, 91, 255, 267, 897, 441, 1581, 953, 6951, 17275, 50229}},
+{4548, 16, 14126, {1, 3, 7, 15, 1, 35, 91, 219, 7, 117, 119, 2687, 1215, 9517, 10849, 28347}},
+{4549, 16, 14131, {1, 1, 1, 1, 21, 55, 67, 221, 503, 883, 1037, 2965, 1485, 8557, 28091, 25459}},
+{4550, 16, 14143, {1, 3, 5, 9, 19, 3, 73, 123, 95, 307, 1339, 3669, 5077, 12049, 523, 21457}},
+{4551, 16, 14146, {1, 3, 1, 13, 3, 1, 111, 97, 371, 697, 1989, 3715, 7875, 6841, 7009, 17809}},
+{4552, 16, 14152, {1, 1, 1, 9, 25, 21, 19, 43, 329, 531, 491, 1147, 1469, 12841, 29651, 29517}},
+{4553, 16, 14155, {1, 1, 5, 1, 15, 63, 101, 197, 477, 245, 341, 61, 3803, 10001, 5519, 19083}},
+{4554, 16, 14157, {1, 3, 7, 5, 13, 43, 7, 143, 291, 531, 1727, 871, 7091, 5737, 24285, 51017}},
+{4555, 16, 14188, {1, 3, 5, 1, 17, 13, 15, 85, 361, 153, 989, 1367, 4705, 3599, 4441, 52471}},
+{4556, 16, 14206, {1, 1, 7, 13, 21, 43, 111, 29, 299, 439, 1929, 283, 5901, 14113, 3929, 55843}},
+{4557, 16, 14243, {1, 3, 3, 9, 31, 59, 63, 43, 91, 171, 733, 1359, 425, 8505, 19777, 54723}},
+{4558, 16, 14278, {1, 1, 5, 7, 31, 1, 97, 253, 331, 307, 1749, 2115, 2535, 9945, 11013, 14231}},
+{4559, 16, 14308, {1, 1, 5, 11, 13, 7, 109, 237, 301, 383, 683, 1603, 6393, 2437, 12101, 1767}},
+{4560, 16, 14317, {1, 1, 3, 11, 15, 61, 119, 199, 109, 265, 1431, 1729, 3409, 10129, 16945, 34681}},
+{4561, 16, 14335, {1, 3, 7, 9, 13, 59, 121, 73, 29, 513, 279, 457, 7985, 15199, 10185, 33621}},
+{4562, 16, 14354, {1, 3, 7, 7, 23, 17, 27, 65, 387, 487, 1803, 2789, 461, 11201, 7001, 40229}},
+{4563, 16, 14356, {1, 1, 3, 15, 9, 13, 55, 127, 33, 513, 1055, 643, 505, 3005, 6121, 64147}},
+{4564, 16, 14379, {1, 3, 5, 15, 5, 11, 77, 233, 175, 691, 171, 2491, 6915, 14195, 7845, 36499}},
+{4565, 16, 14381, {1, 1, 5, 11, 19, 45, 103, 207, 99, 645, 1739, 1517, 5907, 16035, 14559, 44007}},
+{4566, 16, 14384, {1, 3, 7, 15, 21, 27, 53, 107, 89, 291, 983, 3527, 1025, 2985, 13747, 32715}},
+{4567, 16, 14389, {1, 1, 3, 15, 23, 17, 27, 209, 77, 959, 813, 3597, 5809, 693, 10325, 16855}},
+{4568, 16, 14390, {1, 1, 7, 11, 23, 53, 123, 99, 211, 935, 1371, 1657, 4699, 2683, 27933, 21451}},
+{4569, 16, 14414, {1, 3, 3, 3, 17, 21, 93, 201, 423, 351, 1639, 227, 5719, 13111, 5993, 44615}},
+{4570, 16, 14425, {1, 1, 7, 3, 13, 49, 59, 255, 213, 147, 1441, 3593, 6419, 15657, 1947, 62713}},
+{4571, 16, 14462, {1, 3, 1, 7, 7, 41, 79, 135, 275, 585, 925, 3139, 4351, 1827, 23533, 63031}},
+{4572, 16, 14472, {1, 1, 7, 3, 11, 1, 13, 149, 29, 897, 1043, 2393, 3931, 6741, 19973, 46303}},
+{4573, 16, 14508, {1, 1, 1, 13, 13, 57, 9, 253, 149, 67, 1531, 4049, 3013, 13947, 3371, 35317}},
+{4574, 16, 14511, {1, 3, 1, 1, 15, 19, 11, 125, 179, 383, 1273, 1551, 6441, 6579, 19659, 31005}},
+{4575, 16, 14519, {1, 1, 3, 15, 29, 37, 11, 199, 273, 663, 549, 3167, 2049, 8815, 30719, 47905}},
+{4576, 16, 14528, {1, 1, 1, 15, 7, 9, 113, 231, 155, 27, 419, 1303, 4493, 5633, 5743, 51335}},
+{4577, 16, 14561, {1, 3, 5, 13, 21, 35, 7, 63, 391, 637, 2011, 841, 5933, 10563, 7593, 34767}},
+{4578, 16, 14574, {1, 3, 1, 15, 19, 13, 89, 127, 507, 715, 1305, 2989, 7551, 1953, 26101, 54913}},
+{4579, 16, 14588, {1, 1, 5, 1, 1, 33, 101, 211, 173, 761, 177, 2721, 6949, 15801, 6639, 21405}},
+{4580, 16, 14594, {1, 3, 1, 13, 15, 23, 113, 177, 43, 743, 57, 3875, 7833, 13619, 17637, 5547}},
+{4581, 16, 14606, {1, 1, 3, 13, 21, 7, 123, 83, 391, 731, 597, 2595, 1949, 14619, 17141, 60595}},
+{4582, 16, 14614, {1, 3, 7, 13, 31, 55, 15, 43, 17, 855, 233, 1411, 1063, 12977, 22159, 59185}},
+{4583, 16, 14639, {1, 3, 7, 7, 17, 53, 67, 37, 245, 941, 1213, 1965, 6635, 10189, 12979, 63503}},
+{4584, 16, 14641, {1, 1, 5, 15, 31, 23, 15, 175, 177, 643, 1705, 3541, 2009, 12005, 27281, 16821}},
+{4585, 16, 14648, {1, 3, 1, 13, 27, 37, 1, 171, 255, 445, 171, 3555, 8169, 399, 20975, 36195}},
+{4586, 16, 14668, {1, 3, 7, 11, 13, 15, 123, 65, 173, 317, 1991, 2093, 8073, 12831, 15455, 30175}},
+{4587, 16, 14673, {1, 3, 1, 7, 5, 53, 59, 219, 407, 501, 875, 2627, 1335, 14387, 25523, 28337}},
+{4588, 16, 14679, {1, 3, 3, 13, 13, 41, 93, 125, 41, 461, 887, 1085, 3393, 11945, 16329, 43531}},
+{4589, 16, 14695, {1, 3, 1, 11, 21, 39, 1, 185, 429, 285, 443, 1165, 451, 10903, 31511, 50555}},
+{4590, 16, 14702, {1, 1, 7, 5, 11, 25, 61, 171, 493, 733, 215, 1871, 7783, 14113, 2061, 58961}},
+{4591, 16, 14704, {1, 1, 7, 7, 27, 23, 53, 45, 131, 301, 275, 3855, 4883, 6303, 25269, 12697}},
+{4592, 16, 14740, {1, 3, 5, 7, 11, 15, 71, 101, 377, 803, 1369, 3741, 633, 10571, 30659, 31101}},
+{4593, 16, 14754, {1, 1, 5, 15, 19, 53, 3, 153, 411, 685, 1405, 109, 5755, 13311, 3713, 24579}},
+{4594, 16, 14774, {1, 1, 3, 3, 27, 7, 89, 39, 5, 853, 1757, 2927, 2889, 9735, 17959, 39301}},
+{4595, 16, 14792, {1, 3, 1, 3, 13, 41, 57, 71, 187, 285, 825, 1807, 7261, 2645, 21861, 1839}},
+{4596, 16, 14797, {1, 3, 3, 5, 15, 21, 23, 7, 341, 981, 891, 721, 7221, 3137, 28725, 54993}},
+{4597, 16, 14806, {1, 1, 5, 3, 3, 61, 59, 97, 205, 359, 185, 3361, 7637, 15473, 6351, 62097}},
+{4598, 16, 14812, {1, 1, 1, 9, 13, 11, 123, 71, 199, 251, 535, 371, 1605, 12107, 13833, 2019}},
+{4599, 16, 14856, {1, 1, 7, 13, 27, 1, 43, 73, 409, 601, 1481, 649, 3293, 12257, 23377, 17225}},
+{4600, 16, 14876, {1, 1, 7, 11, 15, 55, 99, 45, 261, 461, 1507, 3575, 4425, 9895, 20191, 61863}},
+{4601, 16, 14900, {1, 3, 7, 1, 3, 7, 19, 85, 139, 691, 1685, 137, 7547, 16143, 14193, 52479}},
+{4602, 16, 14910, {1, 3, 5, 9, 17, 61, 7, 189, 31, 641, 1381, 3999, 4909, 8463, 31761, 54493}},
+{4603, 16, 14912, {1, 1, 5, 15, 17, 15, 69, 111, 55, 1011, 1859, 2643, 6043, 5125, 15875, 611}},
+{4604, 16, 14915, {1, 1, 3, 5, 3, 33, 73, 227, 327, 369, 189, 1841, 5625, 1179, 18651, 34951}},
+{4605, 16, 14922, {1, 3, 7, 13, 1, 17, 109, 149, 89, 889, 799, 3423, 2599, 14525, 12763, 23855}},
+{4606, 16, 14939, {1, 1, 3, 15, 5, 63, 87, 7, 63, 171, 1215, 557, 3009, 16305, 23517, 40101}},
+{4607, 16, 14946, {1, 1, 3, 3, 29, 31, 79, 183, 401, 813, 41, 1111, 5669, 15697, 7813, 10215}},
+{4608, 16, 14955, {1, 1, 5, 7, 9, 25, 25, 57, 343, 375, 535, 3405, 1909, 3201, 2417, 52285}},
+{4609, 16, 14966, {1, 1, 5, 9, 25, 19, 33, 183, 29, 991, 1045, 2249, 2933, 12525, 13943, 10423}},
+{4610, 16, 14976, {1, 3, 1, 7, 3, 45, 49, 37, 429, 67, 821, 1289, 7311, 16165, 25861, 57715}},
+{4611, 16, 14986, {1, 1, 7, 3, 19, 3, 33, 153, 505, 683, 611, 1691, 6421, 15517, 19161, 49013}},
+{4612, 16, 14993, {1, 3, 7, 7, 21, 21, 85, 55, 293, 199, 1671, 1881, 7147, 8241, 16173, 51873}},
+{4613, 16, 15012, {1, 3, 1, 15, 3, 61, 97, 191, 435, 511, 1599, 2705, 1897, 2607, 1801, 48583}},
+{4614, 16, 15041, {1, 1, 5, 3, 9, 23, 23, 185, 401, 947, 33, 385, 7491, 14129, 14561, 13759}},
+{4615, 16, 15053, {1, 3, 5, 15, 19, 21, 37, 233, 149, 673, 29, 1315, 3487, 6705, 28283, 43135}},
+{4616, 16, 15056, {1, 1, 1, 11, 9, 35, 101, 255, 345, 829, 689, 2747, 2145, 2101, 24863, 35529}},
+{4617, 16, 15059, {1, 3, 7, 9, 5, 5, 53, 247, 157, 729, 1621, 129, 2485, 5371, 11115, 47771}},
+{4618, 16, 15110, {1, 1, 3, 9, 29, 29, 13, 229, 87, 281, 1119, 1085, 4423, 1667, 27067, 50397}},
+{4619, 16, 15116, {1, 1, 3, 7, 11, 29, 77, 85, 121, 495, 501, 3209, 3531, 2307, 11367, 34135}},
+{4620, 16, 15133, {1, 1, 7, 9, 3, 37, 33, 209, 493, 869, 367, 3221, 1643, 3353, 22851, 4313}},
+{4621, 16, 15134, {1, 1, 1, 7, 15, 53, 27, 17, 29, 345, 821, 1831, 1963, 10089, 5101, 32689}},
+{4622, 16, 15137, {1, 1, 3, 9, 9, 61, 31, 215, 497, 591, 1301, 157, 3329, 13877, 9017, 34673}},
+{4623, 16, 15147, {1, 1, 5, 1, 29, 49, 93, 139, 279, 167, 143, 279, 6145, 6247, 519, 8869}},
+{4624, 16, 15182, {1, 3, 3, 1, 25, 41, 81, 219, 505, 335, 1941, 2963, 413, 775, 4181, 55269}},
+{4625, 16, 15203, {1, 1, 1, 11, 27, 23, 91, 9, 497, 811, 1469, 1999, 5377, 2943, 17635, 11151}},
+{4626, 16, 15215, {1, 1, 5, 15, 17, 23, 15, 235, 271, 749, 1873, 3805, 5405, 7421, 24339, 14351}},
+{4627, 16, 15245, {1, 3, 7, 1, 5, 61, 81, 9, 269, 43, 1391, 2711, 6973, 11299, 2263, 8715}},
+{4628, 16, 15246, {1, 1, 5, 13, 11, 1, 69, 235, 25, 227, 63, 2591, 913, 12555, 6263, 38981}},
+{4629, 16, 15264, {1, 3, 1, 7, 17, 7, 97, 251, 149, 959, 1895, 1179, 4031, 15975, 20313, 64067}},
+{4630, 16, 15269, {1, 3, 7, 15, 3, 17, 85, 229, 149, 925, 585, 3755, 2359, 13131, 12665, 28861}},
+{4631, 16, 15296, {1, 3, 3, 9, 5, 31, 107, 93, 347, 851, 1249, 2161, 6095, 8315, 20259, 39527}},
+{4632, 16, 15314, {1, 3, 7, 7, 21, 63, 85, 241, 501, 627, 1211, 1713, 6907, 4229, 7557, 55719}},
+{4633, 16, 15323, {1, 1, 1, 13, 19, 43, 21, 177, 13, 353, 679, 511, 5565, 993, 25345, 25087}},
+{4634, 16, 15364, {1, 3, 3, 15, 21, 15, 87, 83, 381, 547, 1429, 2417, 2425, 2097, 20889, 12353}},
+{4635, 16, 15386, {1, 3, 1, 11, 23, 21, 69, 147, 427, 271, 1829, 525, 2951, 10773, 32425, 17685}},
+{4636, 16, 15391, {1, 3, 1, 7, 15, 55, 21, 131, 195, 927, 635, 3505, 3817, 14883, 1149, 10079}},
+{4637, 16, 15436, {1, 3, 3, 9, 23, 15, 45, 147, 249, 87, 377, 1551, 4343, 15373, 2895, 44973}},
+{4638, 16, 15460, {1, 3, 1, 7, 31, 63, 67, 107, 109, 1019, 815, 231, 8135, 559, 8175, 21735}},
+{4639, 16, 15464, {1, 1, 5, 7, 7, 63, 103, 133, 167, 883, 1647, 2827, 6015, 8541, 16963, 37129}},
+{4640, 16, 15469, {1, 3, 5, 9, 27, 25, 59, 147, 29, 943, 865, 1233, 2165, 15259, 2235, 25831}},
+{4641, 16, 15470, {1, 1, 5, 7, 25, 5, 67, 89, 493, 111, 359, 1115, 7963, 6545, 7749, 29179}},
+{4642, 16, 15477, {1, 3, 7, 5, 19, 17, 89, 195, 337, 115, 1417, 3837, 4761, 1959, 16205, 61597}},
+{4643, 16, 15488, {1, 1, 5, 11, 25, 43, 3, 111, 491, 897, 1541, 909, 4751, 739, 7827, 64485}},
+{4644, 16, 15494, {1, 1, 5, 15, 19, 61, 39, 111, 451, 419, 1657, 2427, 4589, 5577, 23967, 19259}},
+{4645, 16, 15548, {1, 3, 3, 1, 31, 15, 7, 131, 329, 847, 537, 1775, 3833, 5683, 17267, 16389}},
+{4646, 16, 15551, {1, 1, 7, 1, 9, 29, 13, 25, 409, 513, 1695, 2175, 5099, 727, 5723, 43547}},
+{4647, 16, 15560, {1, 1, 5, 7, 13, 11, 29, 123, 127, 193, 1647, 3157, 2149, 16209, 19909, 14473}},
+{4648, 16, 15563, {1, 1, 1, 15, 15, 37, 125, 157, 487, 143, 1891, 2895, 4397, 10685, 1463, 55027}},
+{4649, 16, 15604, {1, 3, 7, 1, 1, 15, 115, 105, 479, 529, 1095, 2687, 4483, 15027, 15487, 7113}},
+{4650, 16, 15607, {1, 1, 3, 9, 23, 63, 113, 211, 155, 931, 175, 3037, 2359, 10413, 24561, 21099}},
+{4651, 16, 15616, {1, 3, 3, 11, 5, 15, 13, 37, 257, 447, 203, 545, 2467, 9979, 17543, 62703}},
+{4652, 16, 15631, {1, 1, 3, 7, 17, 31, 83, 91, 79, 265, 1415, 2347, 5337, 7615, 27739, 33841}},
+{4653, 16, 15699, {1, 3, 5, 7, 17, 63, 37, 153, 347, 909, 1945, 7, 2071, 15195, 32083, 26713}},
+{4654, 16, 15701, {1, 1, 3, 11, 19, 51, 69, 21, 323, 635, 443, 1685, 6275, 13787, 20921, 45553}},
+{4655, 16, 15708, {1, 3, 3, 7, 15, 35, 67, 247, 257, 429, 2029, 523, 3219, 3893, 26677, 53273}},
+{4656, 16, 15739, {1, 1, 7, 9, 9, 3, 119, 121, 445, 149, 1539, 1887, 2995, 14867, 809, 48065}},
+{4657, 16, 15746, {1, 3, 5, 13, 15, 27, 75, 9, 217, 35, 1363, 2383, 4357, 1153, 20565, 62277}},
+{4658, 16, 15772, {1, 1, 7, 1, 21, 1, 11, 53, 331, 765, 407, 453, 2725, 11199, 645, 14915}},
+{4659, 16, 15793, {1, 1, 5, 1, 29, 11, 5, 159, 395, 53, 323, 1347, 5529, 8525, 24003, 20535}},
+{4660, 16, 15832, {1, 3, 3, 15, 9, 19, 87, 181, 391, 639, 703, 611, 997, 359, 2471, 58465}},
+{4661, 16, 15837, {1, 3, 5, 9, 27, 9, 117, 47, 223, 509, 1537, 1235, 3885, 6767, 17131, 63421}},
+{4662, 16, 15866, {1, 1, 5, 1, 15, 15, 113, 67, 477, 597, 1795, 3065, 4565, 3609, 16419, 19667}},
+{4663, 16, 15899, {1, 1, 7, 11, 1, 63, 33, 211, 271, 773, 499, 2309, 1303, 14015, 30377, 53195}},
+{4664, 16, 15911, {1, 1, 7, 11, 5, 23, 17, 183, 321, 315, 203, 3371, 907, 9331, 21031, 33765}},
+{4665, 16, 15918, {1, 3, 3, 7, 7, 53, 111, 69, 441, 283, 195, 2415, 7293, 7659, 2731, 5417}},
+{4666, 16, 15952, {1, 3, 5, 15, 3, 61, 5, 241, 427, 463, 1729, 653, 7671, 10979, 7247, 36931}},
+{4667, 16, 15962, {1, 3, 1, 9, 3, 5, 105, 117, 465, 853, 2005, 3925, 4419, 4441, 3701, 50747}},
+{4668, 16, 15967, {1, 1, 3, 7, 1, 3, 3, 149, 65, 405, 299, 99, 481, 14323, 11565, 6227}},
+{4669, 16, 15973, {1, 3, 7, 5, 29, 3, 19, 3, 253, 895, 879, 2435, 2151, 10673, 11013, 43055}},
+{4670, 16, 15977, {1, 3, 1, 11, 15, 57, 127, 197, 319, 913, 1039, 811, 7767, 5791, 31725, 8733}},
+{4671, 16, 16016, {1, 1, 7, 3, 13, 25, 25, 81, 229, 185, 39, 2789, 579, 4973, 28617, 60871}},
+{4672, 16, 16035, {1, 1, 7, 3, 25, 17, 41, 7, 103, 269, 55, 2651, 7579, 10935, 8917, 14323}},
+{4673, 16, 16044, {1, 3, 7, 7, 13, 7, 99, 205, 293, 877, 1893, 3013, 2389, 6021, 2645, 18175}},
+{4674, 16, 16067, {1, 1, 3, 7, 9, 39, 59, 187, 191, 761, 339, 3381, 2921, 5197, 16963, 43019}},
+{4675, 16, 16082, {1, 3, 3, 13, 7, 23, 41, 203, 311, 981, 323, 1675, 6689, 579, 3885, 64475}},
+{4676, 16, 16084, {1, 3, 5, 15, 21, 39, 35, 193, 167, 1009, 493, 829, 6571, 1299, 13061, 1163}},
+{4677, 16, 16098, {1, 1, 3, 5, 3, 19, 123, 123, 111, 599, 193, 3419, 7173, 5595, 12449, 52247}},
+{4678, 16, 16107, {1, 3, 5, 11, 9, 25, 65, 49, 239, 953, 481, 3455, 4335, 305, 22469, 11949}},
+{4679, 16, 16142, {1, 1, 3, 7, 15, 1, 13, 77, 147, 49, 1445, 931, 3405, 15951, 15215, 26451}},
+{4680, 16, 16149, {1, 3, 1, 1, 21, 53, 17, 7, 247, 243, 805, 795, 489, 13351, 13493, 30937}},
+{4681, 16, 16165, {1, 3, 7, 5, 5, 13, 39, 115, 397, 757, 423, 2559, 1677, 9449, 24563, 869}},
+{4682, 16, 16172, {1, 1, 3, 11, 23, 9, 27, 233, 165, 853, 1721, 599, 551, 11657, 27623, 40119}},
+{4683, 16, 16178, {1, 1, 3, 1, 3, 47, 75, 207, 113, 417, 1317, 2215, 2395, 1841, 23125, 50401}},
+{4684, 16, 16197, {1, 3, 3, 1, 13, 55, 103, 55, 351, 785, 1665, 3603, 7705, 4811, 21129, 38115}},
+{4685, 16, 16201, {1, 1, 1, 5, 5, 49, 93, 189, 317, 701, 1545, 1017, 4133, 7655, 19827, 52155}},
+{4686, 16, 16215, {1, 3, 3, 13, 17, 37, 7, 249, 139, 529, 235, 3801, 7871, 459, 15127, 13231}},
+{4687, 16, 16221, {1, 3, 7, 5, 7, 63, 99, 241, 131, 455, 1287, 3539, 8029, 12661, 23313, 54029}},
+{4688, 16, 16226, {1, 3, 1, 3, 29, 63, 51, 227, 497, 685, 1351, 449, 7851, 10815, 17379, 62097}},
+{4689, 16, 16232, {1, 3, 1, 11, 25, 61, 73, 29, 467, 533, 855, 853, 5557, 10953, 18307, 27135}},
+{4690, 16, 16246, {1, 1, 7, 3, 13, 49, 63, 171, 177, 283, 1365, 3087, 5445, 15109, 12523, 25193}},
+{4691, 16, 16261, {1, 3, 5, 15, 9, 39, 95, 81, 417, 199, 1653, 3673, 2663, 8101, 12199, 22759}},
+{4692, 16, 16279, {1, 1, 3, 9, 29, 15, 29, 215, 21, 721, 245, 1197, 7251, 5721, 6735, 7751}},
+{4693, 16, 16280, {1, 3, 5, 5, 21, 7, 81, 61, 157, 707, 819, 1689, 4203, 5559, 25483, 43325}},
+{4694, 16, 16290, {1, 1, 7, 13, 15, 51, 47, 197, 269, 921, 353, 2865, 6227, 537, 20015, 53823}},
+{4695, 16, 16314, {1, 1, 3, 5, 13, 25, 91, 221, 111, 587, 1119, 2343, 4651, 4641, 15915, 36323}},
+{4696, 16, 16345, {1, 1, 7, 11, 1, 45, 7, 215, 483, 545, 731, 3041, 3121, 8681, 20651, 4069}},
+{4697, 16, 16355, {1, 3, 7, 13, 13, 27, 109, 65, 103, 805, 299, 2069, 6017, 14565, 20505, 16161}},
+{4698, 16, 16361, {1, 1, 7, 5, 11, 33, 105, 213, 237, 583, 1033, 2333, 845, 6493, 505, 2563}},
+{4699, 16, 16393, {1, 1, 5, 7, 3, 5, 11, 173, 373, 341, 269, 177, 3175, 9413, 601, 13591}},
+{4700, 16, 16394, {1, 1, 5, 13, 7, 57, 61, 187, 121, 405, 665, 111, 7535, 3355, 14051, 511}},
+{4701, 16, 16438, {1, 1, 1, 3, 3, 29, 15, 253, 227, 123, 333, 1343, 7313, 1955, 17741, 30831}},
+{4702, 16, 16450, {1, 3, 5, 1, 5, 47, 65, 183, 199, 839, 925, 2711, 4609, 201, 15177, 29817}},
+{4703, 16, 16507, {1, 3, 7, 9, 21, 63, 5, 163, 265, 581, 1795, 3937, 4641, 2073, 32225, 60831}},
+{4704, 16, 16523, {1, 1, 1, 5, 7, 47, 125, 203, 511, 841, 1937, 3431, 1495, 12827, 5893, 19265}},
+{4705, 16, 16533, {1, 1, 5, 5, 9, 49, 17, 247, 391, 241, 3, 2253, 6319, 89, 4449, 6371}},
+{4706, 16, 16603, {1, 3, 1, 1, 31, 7, 51, 61, 461, 391, 273, 1609, 5825, 16029, 3851, 39213}},
+{4707, 16, 16648, {1, 3, 3, 7, 29, 21, 65, 75, 317, 925, 1319, 3827, 965, 5685, 17007, 64365}},
+{4708, 16, 16653, {1, 3, 1, 5, 23, 23, 109, 59, 31, 659, 635, 2209, 857, 9847, 2507, 18325}},
+{4709, 16, 16672, {1, 1, 1, 1, 17, 51, 53, 77, 461, 147, 229, 2821, 2405, 1259, 1121, 17429}},
+{4710, 16, 16682, {1, 3, 5, 3, 31, 3, 57, 157, 321, 731, 1609, 2139, 899, 12599, 19803, 51083}},
+{4711, 16, 16709, {1, 1, 3, 11, 27, 43, 73, 209, 431, 587, 1247, 2803, 3593, 1351, 18701, 33423}},
+{4712, 16, 16713, {1, 3, 5, 13, 27, 19, 67, 245, 339, 879, 2035, 1801, 5845, 3883, 22057, 15771}},
+{4713, 16, 16719, {1, 1, 3, 11, 11, 55, 93, 51, 57, 127, 1325, 3975, 3989, 2347, 18831, 2979}},
+{4714, 16, 16733, {1, 1, 1, 13, 17, 1, 17, 103, 303, 777, 1973, 2943, 7439, 8953, 27227, 10229}},
+{4715, 16, 16740, {1, 3, 3, 15, 1, 41, 53, 219, 415, 399, 995, 205, 7719, 10937, 31879, 755}},
+{4716, 16, 16761, {1, 3, 7, 9, 13, 7, 99, 93, 419, 1019, 1605, 161, 3831, 9147, 7877, 1333}},
+{4717, 16, 16767, {1, 3, 7, 15, 5, 51, 37, 115, 259, 549, 353, 2067, 7657, 1283, 20333, 2325}},
+{4718, 16, 16771, {1, 1, 3, 3, 23, 33, 63, 233, 363, 719, 1099, 471, 3079, 10577, 19063, 31535}},
+{4719, 16, 16788, {1, 3, 7, 15, 23, 19, 109, 105, 497, 881, 1055, 537, 4607, 239, 22785, 60201}},
+{4720, 16, 16811, {1, 3, 3, 5, 19, 11, 1, 207, 163, 437, 713, 667, 1427, 7505, 28055, 43101}},
+{4721, 16, 16814, {1, 3, 5, 5, 25, 45, 75, 9, 109, 545, 573, 2685, 1013, 2973, 18619, 55945}},
+{4722, 16, 16816, {1, 1, 1, 3, 27, 27, 39, 33, 285, 453, 613, 2707, 2155, 4355, 21105, 7969}},
+{4723, 16, 16828, {1, 3, 3, 9, 1, 31, 71, 101, 491, 409, 65, 1479, 5743, 525, 2863, 53657}},
+{4724, 16, 16834, {1, 1, 3, 1, 17, 63, 55, 11, 125, 447, 275, 2243, 6827, 5753, 32401, 13819}},
+{4725, 16, 16863, {1, 1, 3, 9, 21, 47, 5, 127, 285, 471, 1681, 945, 6141, 5651, 10273, 30811}},
+{4726, 16, 16864, {1, 3, 3, 1, 13, 53, 91, 3, 255, 429, 107, 2937, 2971, 10251, 15009, 37477}},
+{4727, 16, 16879, {1, 1, 7, 13, 21, 63, 73, 3, 63, 491, 101, 1981, 7457, 879, 6243, 22275}},
+{4728, 16, 16888, {1, 3, 1, 1, 11, 43, 121, 101, 293, 639, 645, 2723, 2075, 3629, 22105, 18199}},
+{4729, 16, 16904, {1, 1, 3, 1, 31, 9, 69, 97, 511, 663, 1147, 1237, 389, 255, 8661, 38533}},
+{4730, 16, 16909, {1, 3, 3, 7, 3, 13, 23, 71, 197, 439, 2003, 1771, 8073, 1549, 29089, 5409}},
+{4731, 16, 16921, {1, 3, 1, 1, 9, 23, 1, 221, 159, 699, 593, 3385, 3869, 10105, 22097, 34753}},
+{4732, 16, 16934, {1, 1, 7, 1, 29, 47, 41, 137, 333, 357, 325, 3151, 6641, 3823, 8763, 28327}},
+{4733, 16, 16951, {1, 3, 1, 7, 19, 19, 39, 225, 477, 619, 583, 229, 6177, 9615, 1203, 13711}},
+{4734, 16, 16983, {1, 1, 3, 13, 9, 41, 127, 147, 13, 301, 861, 2019, 3517, 1147, 21587, 42387}},
+{4735, 16, 16999, {1, 1, 5, 11, 9, 63, 11, 121, 251, 199, 483, 2287, 4667, 3887, 10611, 6019}},
+{4736, 16, 17000, {1, 1, 3, 13, 23, 19, 89, 73, 355, 399, 749, 687, 5707, 11443, 817, 38967}},
+{4737, 16, 17006, {1, 3, 5, 9, 3, 23, 115, 207, 373, 541, 73, 1285, 7245, 12505, 5787, 61207}},
+{4738, 16, 17020, {1, 3, 5, 15, 27, 37, 115, 203, 195, 793, 1577, 1283, 7299, 4025, 5319, 5375}},
+{4739, 16, 17030, {1, 1, 7, 15, 25, 19, 61, 11, 215, 771, 1057, 451, 1965, 13693, 25617, 42657}},
+{4740, 16, 17033, {1, 3, 3, 7, 1, 19, 23, 217, 175, 901, 2009, 2989, 5111, 5027, 4805, 37843}},
+{4741, 16, 17044, {1, 3, 1, 11, 11, 37, 3, 131, 459, 769, 201, 3979, 3009, 8691, 27005, 32175}},
+{4742, 16, 17051, {1, 3, 5, 7, 27, 27, 117, 23, 403, 1003, 1501, 785, 6313, 10187, 5085, 30751}},
+{4743, 16, 17072, {1, 1, 7, 3, 11, 41, 73, 151, 19, 657, 131, 1901, 3879, 14995, 24085, 56621}},
+{4744, 16, 17078, {1, 3, 7, 15, 23, 3, 61, 199, 67, 483, 1961, 3583, 5937, 5749, 16685, 11831}},
+{4745, 16, 17084, {1, 1, 3, 15, 25, 15, 97, 9, 299, 641, 883, 2901, 123, 1523, 7055, 15609}},
+{4746, 16, 17087, {1, 3, 5, 5, 31, 55, 19, 45, 239, 543, 2005, 1041, 1711, 11059, 19927, 17475}},
+{4747, 16, 17090, {1, 1, 3, 9, 5, 59, 105, 209, 323, 613, 1963, 2227, 2947, 11761, 21375, 13265}},
+{4748, 16, 17123, {1, 3, 3, 15, 1, 5, 117, 37, 93, 243, 305, 2299, 5163, 9205, 28761, 35987}},
+{4749, 16, 17132, {1, 1, 1, 5, 5, 29, 13, 147, 457, 187, 1729, 1547, 7745, 13155, 7833, 57449}},
+{4750, 16, 17140, {1, 3, 3, 13, 1, 51, 49, 253, 23, 389, 1611, 3045, 5909, 3947, 25105, 3327}},
+{4751, 16, 17149, {1, 3, 1, 11, 15, 47, 19, 15, 231, 57, 763, 1879, 1765, 14861, 22893, 19437}},
+{4752, 16, 17157, {1, 1, 3, 15, 1, 19, 85, 65, 139, 629, 361, 3513, 3807, 799, 8349, 29247}},
+{4753, 16, 17164, {1, 3, 3, 13, 9, 11, 65, 201, 471, 89, 355, 121, 3947, 10775, 3599, 6041}},
+{4754, 16, 17170, {1, 3, 7, 3, 5, 53, 33, 167, 431, 129, 1449, 3263, 7691, 12569, 7551, 41101}},
+{4755, 16, 17179, {1, 1, 3, 15, 9, 41, 5, 239, 361, 773, 955, 3663, 6051, 12889, 5841, 59615}},
+{4756, 16, 17237, {1, 1, 7, 5, 5, 33, 97, 9, 495, 845, 1953, 3533, 5715, 15055, 25211, 9351}},
+{4757, 16, 17248, {1, 3, 1, 11, 25, 37, 83, 153, 289, 739, 353, 1121, 7641, 2081, 28439, 38085}},
+{4758, 16, 17260, {1, 3, 1, 1, 27, 9, 63, 135, 395, 641, 1759, 3727, 4371, 5193, 2783, 12389}},
+{4759, 16, 17272, {1, 3, 3, 15, 3, 9, 5, 153, 111, 675, 1957, 3817, 4269, 10787, 3413, 34199}},
+{4760, 16, 17275, {1, 3, 5, 9, 23, 23, 97, 137, 255, 249, 333, 2329, 1055, 13769, 13109, 33443}},
+{4761, 16, 17287, {1, 1, 1, 15, 7, 37, 99, 219, 483, 755, 263, 3523, 6179, 4817, 29873, 12771}},
+{4762, 16, 17294, {1, 1, 3, 5, 23, 7, 77, 97, 105, 631, 175, 1911, 7271, 1009, 24081, 61207}},
+{4763, 16, 17296, {1, 3, 5, 3, 1, 31, 71, 91, 265, 669, 1839, 3989, 8127, 15001, 1419, 8895}},
+{4764, 16, 17305, {1, 3, 1, 13, 27, 51, 93, 155, 49, 991, 653, 203, 3863, 5363, 31969, 36083}},
+{4765, 16, 17312, {1, 3, 3, 7, 31, 27, 21, 73, 21, 675, 407, 1215, 2963, 6799, 15259, 13125}},
+{4766, 16, 17321, {1, 3, 5, 13, 5, 53, 19, 215, 243, 487, 689, 2519, 6393, 3987, 30847, 37919}},
+{4767, 16, 17367, {1, 3, 3, 7, 5, 31, 115, 231, 255, 955, 2023, 1487, 6575, 9873, 22585, 29951}},
+{4768, 16, 17368, {1, 3, 5, 11, 11, 57, 109, 203, 417, 29, 1311, 893, 1047, 2413, 9305, 38219}},
+{4769, 16, 17378, {1, 3, 1, 7, 23, 51, 113, 3, 105, 915, 1145, 3431, 7331, 3323, 31669, 21485}},
+{4770, 16, 17433, {1, 1, 7, 13, 9, 29, 119, 205, 403, 1023, 257, 863, 2983, 1895, 16539, 23385}},
+{4771, 16, 17455, {1, 1, 7, 13, 27, 21, 47, 139, 341, 509, 1107, 2197, 3649, 14301, 30789, 48783}},
+{4772, 16, 17457, {1, 3, 3, 7, 25, 19, 99, 11, 309, 919, 1809, 3015, 1587, 3779, 1289, 30207}},
+{4773, 16, 17508, {1, 3, 5, 11, 9, 43, 57, 171, 9, 151, 173, 2301, 7723, 2083, 319, 52883}},
+{4774, 16, 17559, {1, 1, 3, 1, 3, 13, 63, 11, 231, 117, 1257, 237, 581, 13871, 15501, 8741}},
+{4775, 16, 17560, {1, 3, 5, 9, 13, 63, 55, 155, 291, 721, 123, 929, 3351, 11651, 12513, 1779}},
+{4776, 16, 17582, {1, 3, 7, 3, 31, 5, 61, 81, 465, 639, 1363, 3157, 2401, 9513, 32559, 34477}},
+{4777, 16, 17596, {1, 3, 1, 15, 27, 25, 3, 117, 277, 13, 707, 3825, 7287, 10181, 30127, 57247}},
+{4778, 16, 17599, {1, 1, 7, 11, 21, 21, 53, 17, 407, 851, 1191, 285, 6815, 1595, 25507, 8099}},
+{4779, 16, 17613, {1, 3, 5, 9, 9, 61, 83, 61, 65, 671, 63, 311, 6897, 15327, 29809, 4899}},
+{4780, 16, 17619, {1, 1, 7, 1, 21, 45, 99, 235, 477, 461, 1119, 4087, 2057, 14861, 31969, 24357}},
+{4781, 16, 17622, {1, 1, 7, 9, 31, 9, 65, 123, 281, 273, 1059, 1625, 6265, 9635, 11563, 45053}},
+{4782, 16, 17655, {1, 3, 3, 7, 1, 41, 15, 23, 43, 727, 1271, 1741, 765, 13265, 4145, 1335}},
+{4783, 16, 17661, {1, 1, 3, 7, 17, 55, 107, 231, 263, 197, 659, 3621, 2789, 5171, 28635, 13595}},
+{4784, 16, 17698, {1, 1, 5, 1, 27, 23, 13, 83, 431, 507, 1571, 1573, 1733, 12171, 8181, 30843}},
+{4785, 16, 17712, {1, 3, 7, 11, 1, 53, 107, 39, 497, 579, 453, 1339, 1415, 10317, 2741, 34599}},
+{4786, 16, 17715, {1, 3, 3, 5, 31, 41, 49, 41, 33, 665, 1783, 87, 317, 6603, 22603, 22879}},
+{4787, 16, 17721, {1, 3, 1, 15, 5, 47, 41, 87, 231, 853, 1615, 2299, 4643, 9249, 15641, 14323}},
+{4788, 16, 17722, {1, 3, 7, 9, 5, 45, 55, 153, 31, 247, 67, 2335, 6057, 4379, 27579, 38437}},
+{4789, 16, 17742, {1, 1, 5, 7, 9, 3, 73, 81, 479, 909, 1097, 3945, 4485, 7815, 22855, 20825}},
+{4790, 16, 17778, {1, 3, 1, 15, 19, 43, 97, 57, 339, 167, 135, 1777, 7681, 9715, 13863, 6347}},
+{4791, 16, 17818, {1, 1, 1, 1, 5, 53, 33, 123, 449, 165, 1283, 2977, 5919, 12929, 32073, 61851}},
+{4792, 16, 17836, {1, 1, 5, 15, 27, 27, 19, 157, 267, 651, 1319, 3841, 7739, 9947, 16801, 41325}},
+{4793, 16, 17841, {1, 3, 7, 9, 19, 7, 83, 95, 401, 293, 437, 1983, 119, 7553, 11097, 11925}},
+{4794, 16, 17856, {1, 1, 3, 5, 21, 1, 53, 201, 385, 843, 1801, 99, 2697, 9659, 28789, 31417}},
+{4795, 16, 17883, {1, 1, 5, 5, 29, 57, 103, 89, 77, 597, 1849, 3433, 4267, 11167, 3841, 44023}},
+{4796, 16, 17896, {1, 1, 7, 1, 21, 47, 113, 253, 249, 431, 1899, 2859, 7345, 5725, 14805, 19999}},
+{4797, 16, 17901, {1, 3, 3, 5, 1, 11, 77, 213, 359, 665, 1855, 2743, 2407, 14677, 17957, 63257}},
+{4798, 16, 17926, {1, 3, 7, 13, 23, 29, 127, 183, 275, 849, 1005, 3159, 3867, 13029, 7527, 13035}},
+{4799, 16, 17937, {1, 1, 1, 15, 29, 47, 81, 225, 77, 879, 1279, 1929, 1457, 2025, 32229, 2847}},
+{4800, 16, 17992, {1, 1, 1, 3, 29, 45, 37, 189, 217, 53, 281, 1785, 1929, 763, 5875, 34303}},
+{4801, 16, 17995, {1, 3, 1, 9, 21, 61, 21, 149, 215, 13, 1221, 5, 7153, 14089, 3119, 33115}},
+{4802, 16, 17998, {1, 3, 7, 11, 7, 57, 89, 185, 485, 649, 1765, 747, 2983, 6791, 25015, 13627}},
+{4803, 16, 18021, {1, 1, 1, 9, 11, 53, 77, 203, 425, 237, 487, 2317, 1047, 8277, 23405, 30445}},
+{4804, 16, 18039, {1, 1, 3, 5, 7, 29, 39, 195, 109, 381, 655, 931, 4469, 16215, 10627, 64171}},
+{4805, 16, 18067, {1, 3, 1, 3, 5, 9, 89, 131, 509, 275, 489, 3161, 3701, 11951, 6579, 42839}},
+{4806, 16, 18122, {1, 3, 7, 13, 15, 37, 65, 91, 305, 433, 1815, 169, 3117, 47, 30331, 34863}},
+{4807, 16, 18129, {1, 3, 3, 9, 21, 3, 21, 113, 25, 833, 1579, 4021, 3481, 55, 20833, 46277}},
+{4808, 16, 18130, {1, 1, 1, 5, 19, 37, 61, 229, 61, 363, 817, 1235, 6235, 7261, 29917, 43057}},
+{4809, 16, 18142, {1, 3, 1, 9, 7, 59, 119, 189, 341, 945, 633, 3683, 2589, 15453, 4989, 40055}},
+{4810, 16, 18148, {1, 1, 1, 5, 25, 63, 61, 73, 207, 205, 1011, 2857, 8137, 2121, 26731, 46011}},
+{4811, 16, 18163, {1, 3, 7, 11, 13, 59, 107, 57, 49, 555, 441, 1771, 4939, 12107, 8263, 16243}},
+{4812, 16, 18192, {1, 3, 5, 13, 15, 49, 89, 217, 83, 225, 2001, 2727, 4651, 619, 16473, 47525}},
+{4813, 16, 18211, {1, 3, 5, 9, 5, 63, 115, 91, 337, 757, 703, 559, 1683, 14875, 30769, 30331}},
+{4814, 16, 18228, {1, 3, 1, 15, 3, 3, 119, 79, 487, 519, 523, 1177, 7105, 12343, 24671, 31711}},
+{4815, 16, 18264, {1, 1, 7, 15, 25, 63, 87, 23, 59, 277, 849, 953, 4567, 11309, 26181, 749}},
+{4816, 16, 18347, {1, 3, 7, 15, 5, 33, 21, 127, 3, 239, 839, 997, 7253, 8183, 19779, 4185}},
+{4817, 16, 18372, {1, 1, 5, 15, 25, 37, 99, 51, 465, 137, 1339, 541, 4319, 9883, 17425, 30743}},
+{4818, 16, 18409, {1, 3, 3, 5, 13, 7, 3, 249, 365, 749, 527, 3675, 3005, 12905, 9621, 899}},
+{4819, 16, 18412, {1, 3, 3, 7, 29, 31, 69, 21, 365, 1021, 1329, 2623, 3549, 5491, 21293, 63771}},
+{4820, 16, 18418, {1, 1, 5, 9, 5, 35, 53, 247, 193, 17, 227, 381, 5233, 821, 3991, 4439}},
+{4821, 16, 18423, {1, 1, 7, 15, 5, 59, 27, 167, 489, 335, 1565, 2999, 1777, 5009, 519, 57967}},
+{4822, 16, 18433, {1, 1, 1, 11, 25, 47, 23, 155, 419, 863, 1905, 355, 1089, 5871, 10149, 53341}},
+{4823, 16, 18439, {1, 1, 7, 7, 29, 55, 127, 83, 33, 309, 2017, 1021, 5987, 1101, 13657, 60587}},
+{4824, 16, 18445, {1, 1, 1, 7, 3, 1, 9, 75, 257, 407, 659, 529, 2087, 14759, 14483, 36425}},
+{4825, 16, 18451, {1, 3, 7, 3, 11, 29, 113, 255, 301, 799, 1171, 3721, 135, 3467, 7109, 50339}},
+{4826, 16, 18467, {1, 1, 1, 7, 21, 25, 15, 31, 61, 491, 57, 189, 2033, 4363, 31295, 16313}},
+{4827, 16, 18502, {1, 1, 5, 1, 5, 17, 33, 77, 483, 469, 355, 2245, 4165, 459, 30411, 29507}},
+{4828, 16, 18514, {1, 1, 3, 13, 1, 27, 29, 85, 491, 787, 1157, 1299, 4743, 14795, 32587, 12807}},
+{4829, 16, 18547, {1, 3, 3, 1, 23, 45, 35, 129, 3, 55, 969, 2387, 3929, 10397, 19879, 2723}},
+{4830, 16, 18575, {1, 1, 1, 7, 19, 3, 9, 23, 497, 347, 2039, 913, 5925, 7965, 5789, 40949}},
+{4831, 16, 18593, {1, 1, 7, 1, 29, 61, 89, 3, 133, 647, 1585, 2661, 1875, 1859, 3937, 12707}},
+{4832, 16, 18613, {1, 3, 3, 7, 25, 11, 41, 149, 427, 463, 901, 2433, 2617, 13511, 3443, 39867}},
+{4833, 16, 18620, {1, 1, 1, 5, 27, 33, 103, 251, 201, 1023, 1979, 3745, 6365, 14945, 22153, 55535}},
+{4834, 16, 18637, {1, 3, 1, 15, 23, 25, 57, 215, 111, 181, 385, 1123, 3095, 7085, 31863, 37393}},
+{4835, 16, 18640, {1, 3, 5, 13, 17, 35, 27, 159, 255, 241, 413, 1823, 5329, 1825, 28489, 58763}},
+{4836, 16, 18712, {1, 3, 1, 15, 3, 33, 97, 27, 409, 889, 409, 2315, 4743, 14827, 3037, 57149}},
+{4837, 16, 18728, {1, 1, 3, 5, 19, 63, 93, 51, 233, 715, 1571, 1101, 2751, 14805, 25683, 13323}},
+{4838, 16, 18742, {1, 3, 7, 3, 21, 15, 117, 179, 263, 229, 199, 2597, 3999, 3037, 3801, 4775}},
+{4839, 16, 18748, {1, 3, 3, 15, 1, 15, 49, 91, 383, 21, 1955, 773, 1213, 5971, 19525, 8699}},
+{4840, 16, 18753, {1, 3, 1, 15, 29, 49, 11, 101, 261, 761, 709, 3811, 4055, 15675, 32305, 15173}},
+{4841, 16, 18756, {1, 1, 1, 3, 9, 41, 127, 23, 413, 461, 237, 1595, 2257, 2971, 31845, 61485}},
+{4842, 16, 18771, {1, 1, 1, 11, 23, 13, 63, 21, 23, 209, 1317, 1071, 3619, 7275, 9343, 21455}},
+{4843, 16, 18814, {1, 1, 5, 9, 31, 35, 41, 249, 477, 569, 1175, 1571, 4679, 10337, 3507, 23415}},
+{4844, 16, 18818, {1, 3, 5, 11, 29, 3, 117, 65, 301, 913, 1709, 1765, 1801, 15513, 31495, 38131}},
+{4845, 16, 18827, {1, 3, 5, 11, 27, 3, 71, 195, 81, 313, 505, 3941, 3797, 2031, 24151, 65085}},
+{4846, 16, 18835, {1, 1, 1, 5, 13, 17, 59, 151, 191, 489, 1267, 3207, 4495, 15145, 12789, 46313}},
+{4847, 16, 18842, {1, 3, 1, 7, 29, 9, 25, 31, 33, 527, 1939, 4089, 333, 757, 8895, 25331}},
+{4848, 16, 18854, {1, 1, 1, 1, 9, 27, 11, 205, 211, 141, 1171, 1881, 4029, 10587, 30103, 39661}},
+{4849, 16, 18858, {1, 1, 3, 3, 23, 3, 23, 175, 355, 753, 183, 1331, 6403, 3369, 29891, 11109}},
+{4850, 16, 18895, {1, 3, 7, 3, 17, 25, 95, 145, 135, 525, 1073, 1841, 3951, 2027, 23053, 19699}},
+{4851, 16, 18914, {1, 1, 5, 3, 11, 43, 117, 67, 299, 885, 1095, 2777, 8185, 14331, 29543, 655}},
+{4852, 16, 18925, {1, 3, 7, 7, 3, 59, 127, 147, 323, 713, 99, 1179, 6395, 1821, 12673, 35587}},
+{4853, 16, 18933, {1, 3, 5, 3, 7, 11, 33, 87, 99, 967, 1443, 1585, 6215, 15125, 30747, 21513}},
+{4854, 16, 18937, {1, 3, 7, 11, 23, 5, 91, 171, 229, 601, 833, 3157, 1691, 15081, 20607, 7643}},
+{4855, 16, 18944, {1, 1, 3, 1, 5, 1, 39, 59, 157, 7, 601, 2079, 3045, 3693, 26511, 13245}},
+{4856, 16, 18973, {1, 3, 5, 9, 9, 27, 83, 135, 185, 379, 2027, 1407, 7409, 7363, 26471, 35907}},
+{4857, 16, 19001, {1, 3, 7, 15, 29, 49, 1, 69, 383, 915, 183, 3809, 4511, 8751, 4715, 7033}},
+{4858, 16, 19012, {1, 3, 3, 3, 1, 17, 71, 233, 243, 933, 1165, 3089, 3565, 6521, 13203, 13065}},
+{4859, 16, 19016, {1, 1, 5, 9, 9, 55, 53, 129, 331, 943, 587, 2573, 2247, 15101, 4987, 62983}},
+{4860, 16, 19027, {1, 3, 1, 13, 11, 43, 45, 127, 129, 857, 669, 321, 3915, 4477, 26973, 19911}},
+{4861, 16, 19040, {1, 3, 1, 13, 15, 3, 83, 23, 13, 441, 953, 2373, 3539, 4895, 26327, 61961}},
+{4862, 16, 19074, {1, 1, 5, 13, 23, 11, 125, 83, 339, 901, 1809, 2691, 3789, 15007, 10569, 65399}},
+{4863, 16, 19085, {1, 3, 1, 1, 17, 27, 105, 199, 435, 245, 1227, 3029, 3911, 1021, 2931, 24957}},
+{4864, 16, 19093, {1, 3, 1, 11, 17, 5, 123, 39, 413, 627, 1149, 3925, 6635, 8959, 31387, 65047}},
+{4865, 16, 19100, {1, 3, 5, 1, 23, 41, 93, 217, 21, 115, 1311, 3901, 2559, 2925, 30755, 7575}},
+{4866, 16, 19107, {1, 1, 3, 9, 13, 11, 63, 171, 135, 983, 1679, 395, 7349, 5153, 26405, 40589}},
+{4867, 16, 19128, {1, 3, 7, 13, 27, 47, 53, 169, 85, 871, 1087, 619, 7399, 9719, 6349, 59211}},
+{4868, 16, 19141, {1, 3, 3, 15, 31, 45, 3, 33, 11, 879, 929, 1977, 1939, 1049, 16159, 41515}},
+{4869, 16, 19142, {1, 3, 5, 11, 9, 27, 13, 23, 127, 747, 1121, 2497, 8141, 8601, 12431, 3243}},
+{4870, 16, 19156, {1, 3, 7, 15, 23, 43, 23, 225, 283, 13, 1837, 2089, 6435, 10121, 22307, 58767}},
+{4871, 16, 19169, {1, 1, 5, 11, 17, 3, 41, 221, 143, 669, 261, 1367, 7813, 15265, 32751, 62007}},
+{4872, 16, 19176, {1, 1, 1, 1, 5, 45, 41, 161, 327, 185, 1403, 485, 2831, 10025, 12555, 47661}},
+{4873, 16, 19222, {1, 3, 7, 1, 31, 55, 87, 83, 439, 929, 653, 4095, 5443, 7361, 27801, 12979}},
+{4874, 16, 19226, {1, 3, 1, 7, 1, 57, 11, 145, 55, 269, 711, 1889, 8023, 7171, 3247, 35691}},
+{4875, 16, 19247, {1, 1, 1, 3, 15, 1, 15, 131, 479, 797, 815, 2343, 1603, 10775, 21341, 20825}},
+{4876, 16, 19259, {1, 3, 5, 9, 3, 27, 31, 117, 441, 177, 215, 3991, 3197, 8397, 19195, 3883}},
+{4877, 16, 19262, {1, 1, 5, 13, 1, 19, 13, 27, 157, 1001, 43, 251, 7997, 7495, 16515, 44287}},
+{4878, 16, 19291, {1, 1, 3, 5, 17, 57, 117, 53, 413, 905, 551, 149, 7531, 14885, 32493, 34961}},
+{4879, 16, 19309, {1, 3, 3, 7, 27, 1, 7, 13, 259, 21, 189, 451, 6171, 3603, 12053, 45619}},
+{4880, 16, 19324, {1, 1, 7, 11, 5, 41, 59, 119, 419, 93, 1399, 629, 1269, 3789, 17035, 61583}},
+{4881, 16, 19334, {1, 3, 5, 11, 1, 11, 59, 83, 473, 273, 839, 3111, 3081, 10159, 6143, 16297}},
+{4882, 16, 19338, {1, 1, 5, 15, 25, 15, 17, 63, 275, 927, 189, 89, 6595, 4399, 27201, 57205}},
+{4883, 16, 19343, {1, 1, 7, 3, 31, 17, 63, 203, 321, 655, 1751, 2985, 3291, 11567, 15135, 49747}},
+{4884, 16, 19376, {1, 3, 5, 13, 27, 25, 89, 39, 299, 833, 1269, 271, 6481, 3045, 7203, 20279}},
+{4885, 16, 19408, {1, 3, 1, 1, 29, 13, 13, 37, 33, 563, 1825, 3257, 3153, 963, 25801, 15861}},
+{4886, 16, 19413, {1, 3, 5, 11, 15, 7, 49, 117, 479, 221, 579, 2995, 1673, 14927, 2869, 35547}},
+{4887, 16, 19420, {1, 3, 1, 11, 31, 11, 77, 161, 183, 187, 1967, 3037, 4441, 10547, 1443, 8619}},
+{4888, 16, 19441, {1, 1, 3, 11, 27, 41, 83, 179, 293, 421, 1395, 1673, 6375, 9801, 14265, 18117}},
+{4889, 16, 19444, {1, 1, 3, 7, 9, 19, 55, 235, 499, 637, 1121, 3583, 8007, 3749, 20903, 6179}},
+{4890, 16, 19454, {1, 3, 7, 13, 9, 55, 125, 77, 395, 9, 2005, 2247, 1609, 6805, 13099, 26367}},
+{4891, 16, 19461, {1, 3, 5, 13, 9, 41, 49, 133, 443, 995, 209, 341, 8013, 11037, 29663, 21161}},
+{4892, 16, 19473, {1, 3, 1, 1, 1, 47, 45, 243, 161, 433, 129, 39, 4885, 8777, 6395, 16953}},
+{4893, 16, 19479, {1, 3, 3, 15, 11, 13, 41, 113, 279, 657, 763, 2411, 7115, 463, 10759, 50493}},
+{4894, 16, 19489, {1, 1, 5, 5, 31, 5, 25, 181, 385, 445, 625, 313, 4983, 11763, 6065, 63835}},
+{4895, 16, 19591, {1, 3, 3, 15, 13, 25, 103, 5, 205, 223, 1327, 73, 677, 6751, 2071, 24963}},
+{4896, 16, 19605, {1, 1, 7, 15, 21, 61, 21, 11, 47, 775, 113, 991, 1943, 1459, 18049, 45025}},
+{4897, 16, 19616, {1, 3, 3, 1, 11, 43, 27, 89, 49, 711, 173, 181, 1261, 2751, 21321, 5467}},
+{4898, 16, 19619, {1, 3, 3, 7, 17, 7, 57, 61, 87, 973, 985, 1849, 559, 7319, 11457, 46071}},
+{4899, 16, 19653, {1, 1, 1, 1, 9, 37, 99, 157, 423, 189, 1355, 3983, 6357, 10825, 26517, 45815}},
+{4900, 16, 19654, {1, 1, 3, 11, 23, 33, 57, 55, 59, 831, 339, 725, 359, 14859, 17523, 36149}},
+{4901, 16, 19681, {1, 1, 5, 5, 27, 29, 47, 147, 153, 801, 1737, 3617, 5447, 8011, 30631, 7921}},
+{4902, 16, 19711, {1, 1, 5, 1, 11, 43, 35, 105, 69, 453, 1023, 875, 6755, 6015, 12449, 50235}},
+{4903, 16, 19719, {1, 3, 1, 5, 29, 31, 43, 89, 369, 891, 1447, 353, 8103, 2555, 1197, 64005}},
+{4904, 16, 19726, {1, 3, 3, 9, 21, 33, 117, 205, 473, 289, 1699, 2361, 7083, 13001, 24127, 48611}},
+{4905, 16, 19738, {1, 3, 3, 15, 3, 23, 79, 139, 475, 511, 181, 1331, 6137, 2653, 14071, 16947}},
+{4906, 16, 19767, {1, 3, 3, 1, 11, 47, 51, 217, 305, 599, 1609, 237, 4537, 5377, 717, 13269}},
+{4907, 16, 19819, {1, 1, 7, 3, 19, 31, 1, 173, 509, 817, 785, 1223, 5585, 8911, 643, 44575}},
+{4908, 16, 19864, {1, 1, 3, 11, 5, 11, 31, 129, 269, 369, 1833, 2885, 441, 11517, 2323, 26735}},
+{4909, 16, 19867, {1, 1, 5, 9, 7, 51, 31, 21, 5, 157, 541, 2939, 4569, 1679, 17467, 27995}},
+{4910, 16, 19885, {1, 1, 7, 3, 21, 33, 85, 213, 41, 851, 1947, 3205, 5065, 6079, 30789, 63677}},
+{4911, 16, 19894, {1, 1, 5, 3, 9, 53, 3, 179, 157, 407, 537, 1193, 4645, 13791, 28153, 11349}},
+{4912, 16, 19900, {1, 1, 7, 13, 25, 61, 9, 151, 263, 143, 1583, 2859, 6617, 8861, 4163, 40695}},
+{4913, 16, 19903, {1, 1, 1, 1, 7, 25, 19, 207, 335, 1019, 1919, 3893, 831, 12421, 4667, 38967}},
+{4914, 16, 19941, {1, 3, 5, 3, 5, 51, 81, 9, 425, 333, 451, 2569, 2771, 12145, 26065, 14385}},
+{4915, 16, 19951, {1, 1, 3, 7, 3, 49, 17, 147, 327, 331, 1197, 7, 3703, 15247, 9723, 52819}},
+{4916, 16, 19959, {1, 3, 3, 7, 27, 21, 117, 229, 255, 603, 195, 1049, 6243, 13593, 14553, 8267}},
+{4917, 16, 19966, {1, 1, 5, 15, 9, 53, 1, 187, 79, 151, 321, 1883, 6105, 13879, 8201, 53213}},
+{4918, 16, 20009, {1, 1, 1, 7, 21, 27, 103, 147, 351, 901, 1927, 2145, 2685, 453, 15173, 7371}},
+{4919, 16, 20018, {1, 1, 3, 5, 21, 27, 125, 77, 395, 27, 827, 3617, 6033, 1511, 29461, 18907}},
+{4920, 16, 20020, {1, 3, 5, 3, 3, 27, 75, 129, 441, 831, 1213, 2499, 5829, 12181, 7991, 58167}},
+{4921, 16, 20038, {1, 1, 1, 9, 3, 33, 85, 135, 45, 405, 1731, 551, 1251, 7895, 3975, 41621}},
+{4922, 16, 20049, {1, 3, 5, 7, 19, 19, 25, 7, 477, 569, 1089, 2705, 6157, 10279, 14029, 36229}},
+{4923, 16, 20066, {1, 3, 7, 3, 5, 19, 99, 137, 67, 361, 2021, 2891, 1957, 14961, 22673, 45707}},
+{4924, 16, 20108, {1, 3, 7, 1, 21, 11, 81, 225, 151, 235, 1761, 3875, 7427, 11213, 27023, 17945}},
+{4925, 16, 20130, {1, 1, 7, 1, 3, 1, 3, 123, 39, 769, 1467, 1907, 7833, 2099, 19, 54653}},
+{4926, 16, 20132, {1, 1, 1, 3, 25, 35, 33, 111, 407, 497, 1527, 3999, 3083, 6221, 8319, 56959}},
+{4927, 16, 20167, {1, 1, 3, 15, 21, 49, 113, 11, 191, 801, 1835, 3413, 3379, 13129, 3655, 23885}},
+{4928, 16, 20219, {1, 3, 1, 5, 21, 57, 87, 133, 409, 325, 569, 2099, 8143, 315, 23287, 21905}},
+{4929, 16, 20227, {1, 1, 5, 5, 21, 43, 25, 169, 265, 123, 81, 2683, 6137, 7341, 16383, 26435}},
+{4930, 16, 20263, {1, 3, 1, 5, 23, 17, 125, 173, 3, 829, 693, 751, 8021, 3701, 32643, 35405}},
+{4931, 16, 20267, {1, 1, 3, 1, 31, 13, 1, 195, 435, 487, 961, 1681, 1233, 6001, 3113, 29515}},
+{4932, 16, 20272, {1, 1, 7, 5, 9, 41, 81, 137, 257, 337, 1837, 145, 4191, 6313, 9991, 25541}},
+{4933, 16, 20289, {1, 1, 5, 13, 29, 13, 1, 117, 501, 991, 571, 793, 1433, 6005, 19, 61135}},
+{4934, 16, 20296, {1, 1, 7, 1, 9, 43, 65, 69, 297, 331, 1777, 1843, 6477, 13943, 1301, 51001}},
+{4935, 16, 20307, {1, 1, 1, 3, 7, 35, 23, 211, 33, 649, 255, 1831, 635, 9965, 16679, 14531}},
+{4936, 16, 20316, {1, 1, 1, 13, 23, 57, 113, 247, 321, 401, 1761, 4001, 1823, 14457, 5251, 4965}},
+{4937, 16, 20323, {1, 1, 5, 5, 31, 5, 53, 103, 297, 575, 1577, 2217, 977, 14415, 16953, 14793}},
+{4938, 16, 20335, {1, 1, 5, 7, 9, 19, 25, 29, 121, 563, 1707, 901, 6167, 10799, 11897, 31187}},
+{4939, 16, 20344, {1, 1, 5, 9, 17, 39, 89, 29, 251, 259, 411, 819, 6037, 4601, 11481, 46141}},
+{4940, 16, 20354, {1, 1, 1, 15, 23, 9, 65, 95, 189, 93, 1485, 2417, 5183, 5513, 26623, 42637}},
+{4941, 16, 20360, {1, 1, 5, 5, 3, 3, 113, 161, 463, 225, 1089, 2023, 2341, 14931, 28097, 56365}},
+{4942, 16, 20368, {1, 1, 5, 9, 9, 3, 109, 141, 27, 473, 107, 4023, 3279, 7595, 13289, 35649}},
+{4943, 16, 20390, {1, 1, 5, 3, 9, 37, 73, 153, 487, 57, 2035, 3583, 239, 2183, 10903, 171}},
+{4944, 16, 20402, {1, 3, 3, 15, 23, 39, 87, 217, 451, 597, 1817, 2883, 145, 11341, 16015, 16765}},
+{4945, 16, 20413, {1, 1, 7, 5, 19, 61, 45, 37, 473, 883, 277, 2801, 13, 7021, 3851, 53223}},
+{4946, 16, 20425, {1, 3, 3, 9, 1, 35, 97, 237, 279, 541, 1911, 661, 7603, 8183, 22071, 37317}},
+{4947, 16, 20428, {1, 3, 3, 11, 11, 63, 101, 71, 227, 259, 1545, 2779, 3859, 4859, 18957, 31749}},
+{4948, 16, 20434, {1, 3, 3, 1, 27, 29, 91, 215, 381, 607, 1701, 1709, 247, 12403, 29943, 59533}},
+{4949, 16, 20443, {1, 1, 7, 1, 11, 23, 47, 141, 37, 881, 1443, 3921, 3281, 7417, 1549, 50653}},
+{4950, 16, 20488, {1, 1, 7, 11, 23, 61, 17, 39, 373, 871, 1107, 1875, 1419, 3981, 1333, 11485}},
+{4951, 16, 20502, {1, 1, 7, 11, 21, 51, 127, 145, 129, 425, 1263, 1989, 699, 7317, 24827, 15049}},
+{4952, 16, 20505, {1, 1, 1, 11, 9, 59, 59, 67, 329, 841, 905, 467, 1905, 895, 29711, 25585}},
+{4953, 16, 20535, {1, 1, 1, 15, 3, 39, 11, 205, 297, 383, 445, 2139, 2935, 2399, 22237, 20355}},
+{4954, 16, 20541, {1, 3, 7, 7, 17, 9, 17, 205, 369, 1019, 1703, 755, 5507, 14749, 16461, 14519}},
+{4955, 16, 20554, {1, 3, 7, 3, 5, 31, 97, 35, 43, 249, 773, 4033, 6085, 1241, 24743, 22415}},
+{4956, 16, 20577, {1, 3, 7, 3, 17, 11, 45, 203, 251, 669, 1463, 1897, 7913, 2315, 30307, 15431}},
+{4957, 16, 20583, {1, 1, 5, 5, 7, 53, 83, 13, 1, 841, 423, 1059, 3951, 14209, 11113, 13931}},
+{4958, 16, 20602, {1, 3, 3, 5, 5, 15, 11, 71, 237, 553, 829, 3653, 4991, 1003, 8353, 52173}},
+{4959, 16, 20611, {1, 3, 3, 9, 27, 39, 83, 137, 315, 883, 1155, 3541, 3815, 10633, 13277, 20269}},
+{4960, 16, 20614, {1, 3, 3, 15, 13, 55, 43, 19, 345, 351, 1117, 1747, 1949, 3195, 12241, 52441}},
+{4961, 16, 20626, {1, 1, 3, 5, 1, 11, 113, 117, 37, 103, 1681, 3269, 1659, 14779, 30479, 31123}},
+{4962, 16, 20628, {1, 3, 7, 13, 1, 63, 9, 63, 65, 737, 785, 1713, 8123, 10053, 29871, 17647}},
+{4963, 16, 20635, {1, 1, 3, 5, 17, 45, 71, 37, 283, 145, 1927, 75, 7355, 4681, 2777, 31465}},
+{4964, 16, 20642, {1, 1, 3, 7, 21, 19, 113, 89, 67, 751, 99, 421, 201, 6345, 9473, 39849}},
+{4965, 16, 20674, {1, 1, 5, 11, 31, 57, 75, 79, 393, 745, 1435, 3039, 1175, 983, 923, 42867}},
+{4966, 16, 20716, {1, 1, 5, 9, 31, 47, 31, 61, 85, 651, 1733, 3973, 1979, 7223, 13817, 30593}},
+{4967, 16, 20734, {1, 1, 1, 11, 31, 21, 23, 177, 401, 55, 537, 3775, 3241, 15157, 11849, 15629}},
+{4968, 16, 20765, {1, 1, 1, 13, 31, 53, 79, 57, 35, 617, 61, 89, 6917, 6045, 23879, 45485}},
+{4969, 16, 20801, {1, 3, 7, 7, 3, 43, 57, 243, 107, 321, 273, 2171, 2069, 6171, 29181, 8281}},
+{4970, 16, 20804, {1, 1, 1, 11, 3, 27, 51, 57, 81, 795, 1673, 2601, 7335, 16243, 863, 20663}},
+{4971, 16, 20808, {1, 1, 5, 9, 7, 19, 31, 87, 509, 899, 1133, 1609, 2163, 7595, 10523, 43181}},
+{4972, 16, 20831, {1, 1, 1, 7, 21, 53, 103, 43, 507, 317, 685, 1329, 7057, 7275, 2277, 28271}},
+{4973, 16, 20832, {1, 1, 7, 7, 3, 35, 81, 81, 261, 587, 1571, 2771, 4653, 6517, 25101, 56753}},
+{4974, 16, 20862, {1, 3, 1, 11, 17, 61, 29, 137, 7, 929, 393, 2513, 2423, 5457, 6285, 12525}},
+{4975, 16, 20877, {1, 3, 1, 9, 25, 63, 17, 45, 439, 591, 273, 877, 7741, 8381, 32277, 24635}},
+{4976, 16, 20880, {1, 3, 1, 5, 19, 11, 17, 175, 297, 77, 961, 3331, 5193, 14347, 12713, 32067}},
+{4977, 16, 20885, {1, 1, 5, 11, 3, 17, 13, 21, 219, 653, 1279, 1657, 7659, 14459, 27661, 38093}},
+{4978, 16, 20889, {1, 3, 7, 7, 29, 17, 67, 35, 451, 91, 919, 3163, 7459, 14971, 4317, 42503}},
+{4979, 16, 20905, {1, 3, 3, 15, 7, 61, 69, 211, 349, 97, 911, 503, 3903, 12327, 11049, 29387}},
+{4980, 16, 20914, {1, 1, 7, 3, 5, 7, 63, 237, 387, 931, 693, 1143, 6545, 8529, 25217, 53087}},
+{4981, 16, 20967, {1, 1, 5, 7, 1, 13, 21, 169, 259, 289, 437, 649, 4905, 15261, 29997, 34043}},
+{4982, 16, 21028, {1, 1, 1, 9, 25, 13, 19, 229, 29, 213, 1941, 1501, 3463, 15761, 15635, 39687}},
+{4983, 16, 21031, {1, 1, 5, 7, 13, 29, 101, 57, 483, 913, 1025, 2139, 4327, 7847, 12455, 41797}},
+{4984, 16, 21043, {1, 1, 3, 11, 17, 27, 97, 79, 411, 9, 1797, 3721, 5291, 859, 8889, 6151}},
+{4985, 16, 21052, {1, 1, 1, 5, 17, 61, 45, 187, 157, 301, 1017, 1507, 6031, 4271, 32593, 23739}},
+{4986, 16, 21058, {1, 1, 3, 11, 31, 39, 7, 169, 15, 799, 1585, 2055, 4683, 13247, 23743, 50399}},
+{4987, 16, 21087, {1, 1, 1, 9, 25, 37, 15, 39, 339, 383, 1153, 1211, 5745, 15249, 26021, 39871}},
+{4988, 16, 21088, {1, 1, 3, 13, 17, 51, 27, 137, 231, 877, 309, 3633, 2575, 12259, 2743, 14781}},
+{4989, 16, 21093, {1, 1, 5, 7, 5, 33, 95, 19, 37, 829, 1489, 3525, 3887, 8277, 21867, 3581}},
+{4990, 16, 21106, {1, 1, 1, 15, 11, 33, 99, 213, 365, 549, 1603, 777, 3787, 12209, 14999, 50607}},
+{4991, 16, 21108, {1, 3, 1, 9, 23, 25, 57, 147, 73, 285, 1229, 1763, 4579, 14771, 4003, 38197}},
+{4992, 16, 21118, {1, 1, 5, 1, 15, 55, 25, 209, 135, 895, 311, 139, 2445, 6903, 12129, 27907}},
+{4993, 16, 21122, {1, 1, 5, 7, 23, 29, 33, 135, 325, 517, 2021, 1721, 4235, 2363, 12905, 18811}},
+{4994, 16, 21131, {1, 1, 1, 9, 3, 19, 69, 29, 157, 787, 1969, 3711, 8179, 5691, 4059, 25541}},
+{4995, 16, 21139, {1, 1, 5, 15, 1, 61, 11, 195, 317, 13, 923, 2149, 4001, 12843, 27109, 30625}},
+{4996, 16, 21141, {1, 3, 1, 7, 3, 13, 45, 187, 445, 859, 53, 3227, 4381, 8273, 32699, 48719}},
+{4997, 16, 21146, {1, 1, 7, 7, 21, 19, 47, 101, 119, 311, 577, 3309, 4585, 12109, 15153, 22915}},
+{4998, 16, 21162, {1, 3, 5, 15, 21, 39, 15, 211, 349, 237, 1873, 3333, 7837, 12811, 14321, 20227}},
+{4999, 16, 21164, {1, 1, 5, 5, 19, 47, 15, 239, 23, 763, 537, 1477, 2231, 10885, 19487, 47385}},
+{5000, 16, 21184, {1, 1, 3, 1, 19, 37, 67, 85, 11, 817, 869, 2249, 4111, 12411, 10405, 20055}},
+{5001, 16, 21208, {1, 1, 3, 3, 1, 41, 85, 137, 91, 369, 1863, 759, 303, 15859, 8063, 12811}},
+{5002, 16, 21211, {1, 3, 1, 11, 23, 1, 11, 219, 201, 573, 1573, 619, 2959, 6485, 7483, 46099}},
+{5003, 16, 21213, {1, 3, 3, 9, 13, 9, 9, 255, 47, 375, 409, 1435, 1665, 14967, 3247, 18193}},
+{5004, 16, 21230, {1, 1, 1, 5, 9, 61, 121, 173, 51, 415, 1621, 3947, 1379, 847, 23187, 39259}},
+{5005, 16, 21270, {1, 1, 1, 7, 3, 19, 95, 59, 187, 453, 1533, 445, 2699, 4817, 25983, 50925}},
+{5006, 16, 21276, {1, 3, 5, 13, 25, 25, 33, 5, 497, 1, 535, 1653, 6541, 10939, 17721, 43829}},
+{5007, 16, 21285, {1, 3, 7, 11, 9, 59, 115, 127, 85, 505, 541, 3243, 5853, 12673, 25275, 39577}},
+{5008, 16, 21297, {1, 3, 7, 1, 17, 25, 83, 127, 225, 295, 1823, 2051, 847, 4249, 13763, 5723}},
+{5009, 16, 21304, {1, 1, 1, 5, 3, 63, 39, 131, 191, 983, 119, 3287, 3335, 7969, 31347, 39439}},
+{5010, 16, 21310, {1, 3, 7, 9, 19, 31, 19, 91, 35, 677, 1229, 1371, 6497, 3315, 15239, 54235}},
+{5011, 16, 21330, {1, 1, 1, 15, 3, 49, 113, 199, 135, 35, 709, 385, 7923, 3711, 18351, 12711}},
+{5012, 16, 21339, {1, 1, 3, 15, 31, 13, 41, 1, 183, 95, 1625, 1675, 7881, 6607, 4165, 27151}},
+{5013, 16, 21346, {1, 3, 3, 15, 21, 57, 81, 49, 5, 297, 131, 883, 1113, 2497, 32129, 39139}},
+{5014, 16, 21391, {1, 3, 5, 7, 29, 47, 101, 173, 299, 879, 143, 3341, 3929, 6797, 8753, 47963}},
+{5015, 16, 21427, {1, 3, 3, 13, 11, 39, 27, 187, 27, 763, 1515, 1903, 5897, 10061, 14595, 12713}},
+{5016, 16, 21451, {1, 3, 5, 11, 27, 35, 37, 213, 45, 867, 1591, 3083, 8123, 5045, 31703, 61487}},
+{5017, 16, 21465, {1, 1, 3, 5, 3, 31, 23, 89, 369, 371, 1165, 3673, 6821, 333, 10881, 4153}},
+{5018, 16, 21468, {1, 1, 7, 13, 1, 33, 49, 195, 223, 197, 1799, 2427, 6171, 493, 13503, 23619}},
+{5019, 16, 21471, {1, 1, 3, 9, 5, 59, 105, 215, 449, 527, 1661, 2643, 309, 11239, 11633, 63459}},
+{5020, 16, 21533, {1, 1, 3, 11, 13, 11, 15, 99, 409, 807, 1911, 883, 1323, 9037, 6401, 545}},
+{5021, 16, 21610, {1, 1, 5, 7, 7, 7, 1, 167, 353, 923, 1403, 3109, 4981, 3877, 25451, 4667}},
+{5022, 16, 21615, {1, 1, 5, 11, 11, 25, 121, 153, 111, 785, 1301, 1497, 6267, 14919, 24125, 52029}},
+{5023, 16, 21630, {1, 3, 3, 5, 29, 55, 63, 177, 305, 41, 111, 1065, 1127, 113, 2815, 12979}},
+{5024, 16, 21633, {1, 3, 5, 7, 23, 39, 17, 179, 267, 917, 511, 3923, 915, 14173, 10689, 50749}},
+{5025, 16, 21657, {1, 1, 5, 3, 9, 45, 15, 157, 495, 625, 407, 2769, 3267, 7593, 17957, 54597}},
+{5026, 16, 21658, {1, 3, 3, 11, 21, 13, 5, 207, 107, 965, 1803, 1541, 3487, 3483, 109, 26923}},
+{5027, 16, 21669, {1, 1, 5, 11, 25, 49, 99, 135, 109, 371, 1307, 1815, 1095, 2329, 27101, 52269}},
+{5028, 16, 21670, {1, 3, 5, 5, 13, 9, 109, 79, 151, 47, 311, 3873, 3645, 3773, 1083, 31599}},
+{5029, 16, 21673, {1, 3, 5, 15, 1, 9, 87, 21, 145, 583, 159, 2435, 587, 10123, 24803, 19993}},
+{5030, 16, 21701, {1, 3, 1, 1, 23, 11, 5, 45, 373, 1011, 1353, 277, 7051, 3845, 12391, 25313}},
+{5031, 16, 21719, {1, 1, 1, 9, 13, 13, 109, 251, 97, 483, 1723, 2555, 813, 9345, 11351, 44705}},
+{5032, 16, 21720, {1, 3, 5, 7, 21, 49, 63, 13, 119, 813, 1559, 983, 499, 15159, 24163, 59903}},
+{5033, 16, 21747, {1, 1, 3, 5, 27, 33, 27, 165, 207, 693, 1401, 1357, 7637, 337, 10163, 43273}},
+{5034, 16, 21819, {1, 1, 5, 13, 29, 7, 71, 187, 1, 655, 1829, 2645, 6969, 5435, 28415, 33199}},
+{5035, 16, 21839, {1, 1, 1, 13, 17, 21, 13, 141, 41, 267, 1165, 1893, 3455, 10737, 16693, 33065}},
+{5036, 16, 21854, {1, 1, 5, 1, 7, 27, 7, 67, 107, 11, 763, 2529, 3023, 15745, 17023, 51911}},
+{5037, 16, 21857, {1, 3, 3, 3, 7, 57, 123, 249, 309, 511, 1655, 1379, 725, 7325, 20261, 65039}},
+{5038, 16, 21864, {1, 1, 5, 11, 3, 27, 23, 27, 285, 771, 2017, 1727, 4847, 2665, 30655, 47625}},
+{5039, 16, 21882, {1, 3, 7, 7, 17, 3, 93, 133, 427, 1021, 1135, 341, 6711, 11713, 24157, 1561}},
+{5040, 16, 21900, {1, 1, 3, 7, 15, 55, 11, 247, 65, 115, 1967, 535, 841, 15131, 28381, 31337}},
+{5041, 16, 21903, {1, 3, 1, 7, 9, 45, 73, 151, 127, 125, 767, 2003, 6893, 3875, 451, 30275}},
+{5042, 16, 21928, {1, 1, 7, 3, 5, 55, 127, 123, 163, 763, 1165, 1637, 6267, 7215, 23403, 20961}},
+{5043, 16, 21931, {1, 1, 1, 13, 1, 21, 65, 141, 369, 413, 1675, 27, 7357, 6929, 18083, 829}},
+{5044, 16, 21946, {1, 3, 5, 13, 1, 17, 97, 107, 249, 931, 47, 3537, 2245, 9827, 13673, 23217}},
+{5045, 16, 21971, {1, 1, 1, 11, 13, 19, 43, 31, 51, 727, 1001, 927, 771, 11853, 5761, 60537}},
+{5046, 16, 21974, {1, 3, 1, 7, 23, 27, 115, 5, 201, 431, 1021, 585, 6069, 12511, 6129, 2105}},
+{5047, 16, 21978, {1, 1, 3, 11, 3, 25, 75, 129, 389, 131, 223, 2263, 5377, 5561, 15633, 39527}},
+{5048, 16, 21993, {1, 3, 3, 1, 27, 43, 101, 55, 319, 549, 1971, 2255, 353, 93, 25661, 59077}},
+{5049, 16, 21994, {1, 1, 5, 11, 29, 57, 27, 135, 341, 913, 1637, 1781, 457, 11293, 1013, 53863}},
+{5050, 16, 22030, {1, 1, 1, 11, 3, 51, 79, 251, 443, 651, 393, 3635, 7397, 5443, 4225, 991}},
+{5051, 16, 22035, {1, 3, 7, 13, 31, 9, 3, 109, 427, 735, 891, 2789, 2169, 6459, 355, 43177}},
+{5052, 16, 22063, {1, 3, 3, 3, 13, 7, 93, 195, 293, 37, 75, 2467, 933, 8017, 9925, 61397}},
+{5053, 16, 22068, {1, 1, 5, 7, 25, 15, 69, 199, 161, 769, 387, 1491, 4553, 4173, 25631, 37089}},
+{5054, 16, 22086, {1, 3, 1, 3, 7, 59, 53, 93, 103, 413, 531, 887, 6149, 2901, 22611, 27135}},
+{5055, 16, 22104, {1, 1, 1, 13, 31, 39, 71, 215, 385, 821, 1603, 3043, 4967, 10953, 11543, 64433}},
+{5056, 16, 22119, {1, 3, 1, 7, 7, 63, 5, 143, 1, 339, 1165, 3809, 4257, 12879, 21581, 21307}},
+{5057, 16, 22153, {1, 1, 1, 15, 1, 35, 67, 227, 277, 879, 513, 3423, 6153, 11573, 12809, 34335}},
+{5058, 16, 22168, {1, 3, 7, 9, 9, 39, 47, 17, 101, 179, 631, 1307, 481, 871, 16807, 39811}},
+{5059, 16, 22183, {1, 3, 1, 1, 13, 25, 53, 179, 285, 267, 407, 3781, 3267, 3545, 525, 15733}},
+{5060, 16, 22189, {1, 1, 1, 13, 11, 35, 45, 181, 319, 767, 283, 3021, 5405, 403, 3587, 7291}},
+{5061, 16, 22204, {1, 1, 7, 3, 5, 9, 67, 129, 101, 117, 267, 1925, 1209, 13095, 7123, 62941}},
+{5062, 16, 22230, {1, 1, 7, 3, 5, 63, 109, 199, 95, 421, 193, 3519, 6551, 955, 1679, 16627}},
+{5063, 16, 22240, {1, 1, 5, 13, 1, 47, 71, 157, 343, 653, 981, 1335, 3737, 7185, 28861, 22883}},
+{5064, 16, 22246, {1, 1, 3, 15, 7, 63, 7, 81, 481, 5, 1159, 1361, 4167, 2575, 7437, 16917}},
+{5065, 16, 22269, {1, 3, 7, 1, 27, 17, 61, 193, 317, 841, 1149, 955, 5161, 4275, 1955, 15665}},
+{5066, 16, 22282, {1, 1, 1, 7, 19, 63, 77, 57, 367, 237, 579, 3701, 5763, 4951, 24151, 45215}},
+{5067, 16, 22302, {1, 1, 5, 11, 29, 7, 119, 155, 431, 999, 757, 2433, 5811, 3709, 29573, 23639}},
+{5068, 16, 22330, {1, 3, 3, 3, 15, 35, 125, 13, 275, 507, 1719, 1537, 2349, 12909, 8107, 9845}},
+{5069, 16, 22347, {1, 3, 1, 13, 27, 27, 11, 69, 15, 1017, 207, 625, 809, 2921, 8939, 30293}},
+{5070, 16, 22349, {1, 1, 7, 11, 31, 51, 113, 193, 69, 845, 73, 919, 3523, 3987, 23665, 36527}},
+{5071, 16, 22383, {1, 3, 7, 11, 21, 31, 103, 29, 5, 81, 1081, 3847, 4697, 8857, 30769, 40053}},
+{5072, 16, 22386, {1, 1, 1, 1, 5, 11, 5, 169, 13, 899, 769, 3823, 5405, 5991, 3821, 27767}},
+{5073, 16, 22432, {1, 1, 3, 15, 1, 35, 9, 83, 23, 701, 1807, 1681, 4009, 127, 31751, 38059}},
+{5074, 16, 22450, {1, 3, 3, 7, 9, 61, 73, 111, 193, 607, 2001, 413, 3751, 16337, 16597, 23959}},
+{5075, 16, 22473, {1, 1, 7, 7, 21, 29, 53, 253, 187, 507, 1191, 3521, 463, 2167, 23785, 19867}},
+{5076, 16, 22487, {1, 3, 5, 3, 19, 43, 101, 93, 257, 61, 1589, 3883, 1975, 7283, 5253, 23257}},
+{5077, 16, 22527, {1, 3, 1, 9, 1, 63, 25, 101, 377, 571, 1701, 3385, 243, 12051, 32619, 10459}},
+{5078, 16, 22537, {1, 1, 1, 5, 17, 11, 37, 197, 205, 879, 625, 959, 7389, 7857, 20615, 20405}},
+{5079, 16, 22557, {1, 3, 5, 5, 27, 41, 9, 109, 197, 623, 1045, 63, 7977, 11355, 28613, 5131}},
+{5080, 16, 22561, {1, 1, 5, 11, 5, 29, 27, 85, 131, 247, 433, 3981, 2677, 15415, 869, 6045}},
+{5081, 16, 22568, {1, 3, 1, 13, 9, 49, 25, 79, 135, 719, 93, 631, 2149, 5929, 29833, 38673}},
+{5082, 16, 22573, {1, 3, 7, 11, 15, 13, 37, 233, 227, 205, 1579, 65, 1429, 13499, 26355, 63821}},
+{5083, 16, 22591, {1, 1, 5, 11, 21, 19, 7, 183, 409, 275, 899, 3665, 6207, 849, 24339, 1617}},
+{5084, 16, 22593, {1, 3, 1, 3, 21, 61, 23, 125, 463, 489, 1265, 2975, 3907, 11881, 7533, 43331}},
+{5085, 16, 22605, {1, 3, 1, 15, 15, 51, 83, 31, 175, 47, 1791, 3651, 6735, 5013, 723, 24141}},
+{5086, 16, 22620, {1, 3, 1, 9, 17, 41, 57, 43, 469, 911, 1251, 2105, 3133, 3437, 10097, 26687}},
+{5087, 16, 22627, {1, 1, 3, 3, 9, 9, 125, 201, 141, 943, 1509, 1239, 6575, 8707, 363, 23309}},
+{5088, 16, 22636, {1, 1, 5, 3, 19, 37, 43, 141, 413, 149, 1449, 1003, 4473, 12395, 4101, 61201}},
+{5089, 16, 22647, {1, 1, 5, 11, 17, 37, 41, 33, 57, 627, 325, 1895, 1773, 1339, 24859, 587}},
+{5090, 16, 22697, {1, 1, 1, 3, 5, 49, 127, 109, 361, 853, 1437, 3451, 4031, 5379, 27463, 47425}},
+{5091, 16, 22715, {1, 3, 5, 7, 9, 57, 71, 219, 347, 791, 797, 73, 6241, 12717, 24429, 40977}},
+{5092, 16, 22725, {1, 1, 5, 9, 27, 43, 43, 227, 433, 413, 1109, 2589, 4535, 8947, 8121, 43479}},
+{5093, 16, 22732, {1, 3, 7, 1, 9, 21, 81, 23, 157, 313, 197, 2845, 8059, 15957, 28657, 28093}},
+{5094, 16, 22749, {1, 3, 1, 11, 15, 17, 115, 27, 421, 743, 1885, 2089, 5011, 7137, 7395, 36853}},
+{5095, 16, 22766, {1, 1, 5, 15, 5, 53, 69, 255, 63, 29, 1011, 3201, 1467, 15441, 26255, 62895}},
+{5096, 16, 22768, {1, 3, 1, 11, 3, 47, 35, 195, 149, 849, 1317, 439, 3539, 845, 15295, 42183}},
+{5097, 16, 22771, {1, 1, 5, 15, 15, 37, 67, 105, 495, 985, 1777, 3137, 8039, 11795, 29771, 35045}},
+{5098, 16, 22788, {1, 1, 3, 1, 25, 17, 67, 227, 229, 419, 1319, 3325, 1293, 8585, 28425, 34013}},
+{5099, 16, 22797, {1, 1, 5, 1, 27, 51, 71, 197, 375, 407, 259, 4005, 3309, 5475, 13421, 60065}},
+{5100, 16, 22822, {1, 3, 1, 5, 11, 17, 89, 45, 311, 425, 1629, 773, 7267, 8699, 27547, 37081}},
+{5101, 16, 22828, {1, 3, 1, 7, 9, 25, 101, 105, 489, 217, 103, 1959, 4049, 5793, 31201, 11947}},
+{5102, 16, 22851, {1, 1, 5, 5, 19, 3, 63, 55, 431, 49, 273, 3253, 5357, 13801, 9735, 21883}},
+{5103, 16, 22888, {1, 1, 1, 11, 13, 3, 75, 201, 477, 201, 1875, 657, 6217, 8651, 2207, 16421}},
+{5104, 16, 22893, {1, 1, 5, 13, 5, 31, 75, 113, 25, 171, 1147, 3089, 7095, 4405, 26155, 42323}},
+{5105, 16, 22901, {1, 3, 5, 5, 5, 49, 99, 171, 445, 1023, 1793, 3159, 5809, 12509, 31723, 60411}},
+{5106, 16, 22902, {1, 3, 7, 3, 23, 51, 111, 27, 103, 159, 433, 293, 1741, 3599, 4067, 40667}},
+{5107, 16, 22921, {1, 3, 3, 13, 11, 9, 11, 21, 453, 35, 1649, 1261, 3539, 14081, 5581, 57105}},
+{5108, 16, 22929, {1, 3, 3, 13, 7, 9, 113, 87, 391, 647, 223, 1345, 4481, 9855, 20129, 10807}},
+{5109, 16, 22946, {1, 3, 7, 15, 3, 61, 15, 117, 97, 495, 985, 819, 181, 1363, 13111, 35857}},
+{5110, 16, 22948, {1, 3, 1, 9, 3, 27, 125, 151, 217, 961, 707, 2647, 5307, 621, 12581, 13941}},
+{5111, 16, 22951, {1, 3, 1, 11, 17, 37, 35, 211, 179, 29, 627, 3623, 6429, 16237, 24699, 14385}},
+{5112, 16, 22958, {1, 3, 3, 9, 3, 57, 35, 3, 85, 1017, 1739, 2241, 7297, 15637, 27085, 41237}},
+{5113, 16, 22975, {1, 1, 3, 7, 7, 13, 5, 85, 505, 51, 409, 867, 677, 12451, 13633, 47883}},
+{5114, 16, 22983, {1, 3, 5, 13, 5, 51, 37, 79, 237, 133, 1331, 3263, 349, 4971, 16067, 62485}},
+{5115, 16, 22990, {1, 1, 7, 11, 29, 41, 101, 219, 391, 1023, 1681, 3163, 4071, 14665, 11041, 14523}},
+{5116, 16, 23032, {1, 1, 3, 3, 13, 55, 37, 119, 471, 665, 1315, 3071, 5993, 12005, 13549, 63425}},
+{5117, 16, 23047, {1, 3, 5, 7, 5, 25, 59, 71, 77, 841, 91, 1841, 6997, 1139, 11843, 52209}},
+{5118, 16, 23053, {1, 3, 7, 15, 17, 25, 85, 173, 373, 459, 1713, 1055, 5337, 9921, 15213, 44235}},
+{5119, 16, 23054, {1, 1, 1, 15, 7, 11, 89, 237, 131, 565, 745, 457, 4447, 5581, 11053, 43819}},
+{5120, 16, 23082, {1, 3, 5, 1, 29, 21, 11, 7, 125, 851, 2023, 3321, 1885, 67, 8809, 43291}},
+{5121, 16, 23095, {1, 3, 5, 11, 11, 43, 41, 97, 353, 813, 85, 2453, 769, 11709, 4697, 2849}},
+{5122, 16, 23116, {1, 1, 5, 5, 21, 29, 87, 179, 157, 981, 129, 2139, 6841, 5479, 27111, 20749}},
+{5123, 16, 23197, {1, 1, 3, 9, 31, 59, 61, 15, 423, 33, 467, 1817, 6535, 7341, 31061, 20937}},
+{5124, 16, 23221, {1, 1, 7, 3, 1, 21, 127, 135, 321, 699, 727, 3079, 753, 3971, 5611, 28345}},
+{5125, 16, 23257, {1, 3, 7, 11, 27, 3, 39, 63, 389, 433, 43, 1443, 6241, 10769, 20485, 58823}},
+{5126, 16, 23260, {1, 1, 1, 11, 3, 13, 5, 57, 503, 707, 677, 3355, 6691, 8841, 20041, 11867}},
+{5127, 16, 23263, {1, 1, 3, 11, 31, 39, 107, 221, 81, 125, 1439, 2429, 2109, 3931, 31007, 10915}},
+{5128, 16, 23267, {1, 3, 3, 9, 17, 53, 13, 121, 127, 15, 1825, 1909, 5951, 13503, 31565, 56163}},
+{5129, 16, 23282, {1, 1, 1, 1, 19, 55, 3, 153, 385, 277, 1297, 3655, 6027, 3057, 11341, 46989}},
+{5130, 16, 23284, {1, 1, 5, 9, 3, 55, 37, 223, 353, 141, 1917, 3827, 2255, 7617, 10971, 10641}},
+{5131, 16, 23314, {1, 3, 7, 9, 29, 41, 71, 19, 137, 243, 2047, 395, 6981, 15887, 9479, 60199}},
+{5132, 16, 23326, {1, 1, 1, 9, 17, 43, 51, 191, 405, 727, 485, 987, 1855, 15801, 22529, 10165}},
+{5133, 16, 23335, {1, 3, 1, 7, 27, 31, 69, 255, 153, 793, 1353, 1981, 83, 11387, 6747, 23379}},
+{5134, 16, 23368, {1, 1, 5, 5, 31, 49, 83, 157, 63, 647, 1367, 3995, 5899, 8429, 18317, 3471}},
+{5135, 16, 23373, {1, 3, 5, 13, 19, 15, 99, 13, 143, 887, 529, 2855, 573, 9799, 13585, 59263}},
+{5136, 16, 23401, {1, 3, 5, 3, 13, 47, 103, 87, 11, 381, 397, 899, 71, 15539, 13005, 38297}},
+{5137, 16, 23415, {1, 1, 1, 3, 1, 53, 45, 141, 1, 941, 261, 3291, 5177, 9843, 6309, 62799}},
+{5138, 16, 23432, {1, 1, 5, 9, 29, 31, 107, 57, 135, 229, 1147, 247, 265, 12757, 21365, 7219}},
+{5139, 16, 23476, {1, 1, 1, 3, 1, 49, 55, 247, 495, 449, 141, 1349, 7393, 2589, 23587, 1097}},
+{5140, 16, 23479, {1, 3, 5, 1, 9, 11, 73, 153, 89, 575, 1805, 137, 435, 3687, 32169, 24275}},
+{5141, 16, 23497, {1, 1, 7, 15, 25, 61, 51, 21, 109, 139, 611, 3907, 6721, 5081, 6665, 51463}},
+{5142, 16, 23505, {1, 1, 1, 9, 13, 23, 59, 203, 33, 1013, 1533, 291, 6171, 15463, 8581, 9497}},
+{5143, 16, 23508, {1, 3, 3, 9, 7, 25, 51, 189, 49, 265, 1163, 1141, 2467, 7839, 7083, 65527}},
+{5144, 16, 23531, {1, 1, 3, 9, 19, 33, 77, 9, 181, 919, 623, 1521, 7853, 2199, 24115, 60607}},
+{5145, 16, 23536, {1, 1, 3, 11, 9, 11, 27, 57, 355, 313, 151, 3391, 4869, 12541, 30031, 29455}},
+{5146, 16, 23542, {1, 3, 5, 9, 17, 13, 91, 123, 235, 841, 1113, 1451, 501, 3863, 32483, 9445}},
+{5147, 16, 23565, {1, 3, 7, 3, 13, 25, 87, 243, 449, 293, 1279, 3571, 2693, 13459, 5895, 38127}},
+{5148, 16, 23573, {1, 1, 3, 15, 27, 61, 7, 57, 255, 971, 131, 2585, 2187, 7191, 17779, 34587}},
+{5149, 16, 23590, {1, 3, 3, 7, 23, 29, 55, 41, 463, 873, 1781, 2851, 4731, 9819, 25587, 32199}},
+{5150, 16, 23593, {1, 1, 1, 9, 29, 39, 25, 143, 171, 141, 223, 467, 4417, 9575, 23159, 33819}},
+{5151, 16, 23604, {1, 1, 5, 13, 19, 61, 19, 75, 25, 361, 585, 1627, 2231, 1831, 24885, 37917}},
+{5152, 16, 23621, {1, 3, 7, 7, 23, 19, 59, 55, 323, 55, 143, 131, 27, 15363, 26423, 43963}},
+{5153, 16, 23622, {1, 1, 5, 5, 25, 9, 33, 17, 427, 481, 315, 3999, 4757, 4545, 7695, 56733}},
+{5154, 16, 23636, {1, 3, 5, 13, 5, 59, 45, 117, 115, 263, 1441, 3307, 1085, 3875, 25869, 19725}},
+{5155, 16, 23662, {1, 3, 3, 15, 13, 39, 31, 243, 293, 345, 343, 1911, 6123, 12577, 32081, 59993}},
+{5156, 16, 23667, {1, 3, 5, 13, 17, 37, 105, 201, 205, 929, 435, 1467, 8063, 6963, 13709, 53275}},
+{5157, 16, 23703, {1, 3, 7, 15, 31, 3, 65, 221, 191, 413, 427, 2579, 377, 2793, 26943, 61299}},
+{5158, 16, 23725, {1, 3, 5, 3, 11, 61, 75, 107, 53, 689, 1845, 859, 333, 889, 27607, 48795}},
+{5159, 16, 23734, {1, 1, 5, 7, 1, 11, 37, 181, 323, 187, 1511, 25, 5517, 11957, 7093, 429}},
+{5160, 16, 23738, {1, 3, 3, 1, 25, 31, 125, 139, 433, 583, 683, 587, 5389, 1225, 26047, 18717}},
+{5161, 16, 23752, {1, 3, 1, 15, 23, 33, 23, 147, 279, 513, 157, 4023, 2669, 7543, 2111, 9191}},
+{5162, 16, 23800, {1, 3, 1, 1, 5, 39, 55, 127, 257, 649, 347, 3001, 2215, 15579, 29665, 10337}},
+{5163, 16, 23803, {1, 1, 1, 15, 19, 55, 105, 183, 505, 1003, 1311, 2253, 1861, 3561, 19581, 46183}},
+{5164, 16, 23818, {1, 3, 1, 9, 23, 5, 127, 215, 195, 817, 719, 1285, 919, 8627, 20427, 2723}},
+{5165, 16, 23832, {1, 1, 1, 5, 15, 31, 43, 131, 377, 57, 1531, 915, 2871, 1805, 19765, 60529}},
+{5166, 16, 23842, {1, 3, 3, 3, 15, 1, 93, 55, 477, 221, 643, 1319, 959, 475, 14015, 48823}},
+{5167, 16, 23851, {1, 3, 3, 7, 19, 13, 13, 191, 421, 751, 1103, 2129, 1973, 14935, 26485, 41269}},
+{5168, 16, 23873, {1, 1, 5, 13, 17, 43, 81, 83, 67, 643, 1799, 1157, 4365, 2815, 29871, 5351}},
+{5169, 16, 23883, {1, 3, 1, 9, 21, 31, 87, 177, 25, 403, 1357, 4047, 959, 5133, 7307, 4333}},
+{5170, 16, 23888, {1, 1, 7, 7, 29, 39, 27, 139, 159, 529, 1323, 3823, 4569, 12711, 30263, 10961}},
+{5171, 16, 23910, {1, 3, 1, 13, 27, 15, 59, 1, 107, 723, 497, 43, 143, 16119, 29177, 5653}},
+{5172, 16, 23934, {1, 1, 5, 9, 15, 41, 23, 109, 101, 639, 277, 1687, 1311, 1995, 5403, 6867}},
+{5173, 16, 23938, {1, 1, 5, 3, 13, 1, 95, 177, 379, 545, 789, 3479, 4135, 445, 5869, 38923}},
+{5174, 16, 23949, {1, 1, 3, 9, 21, 31, 23, 65, 209, 383, 271, 367, 6605, 1169, 27267, 9331}},
+{5175, 16, 23955, {1, 1, 1, 1, 27, 39, 121, 29, 155, 465, 947, 2675, 6753, 11647, 29781, 30251}},
+{5176, 16, 23967, {1, 3, 1, 5, 7, 45, 7, 21, 223, 363, 1021, 751, 2257, 14423, 19629, 64867}},
+{5177, 16, 23973, {1, 3, 1, 9, 31, 53, 13, 99, 49, 389, 867, 327, 4145, 3265, 15423, 14985}},
+{5178, 16, 23991, {1, 1, 1, 15, 11, 11, 27, 41, 333, 161, 1343, 2023, 3789, 13563, 16957, 26849}},
+{5179, 16, 24024, {1, 3, 7, 1, 7, 51, 7, 163, 239, 393, 231, 3985, 309, 875, 837, 24791}},
+{5180, 16, 24030, {1, 1, 1, 7, 1, 43, 105, 7, 351, 755, 1781, 1925, 4961, 2961, 13427, 44317}},
+{5181, 16, 24039, {1, 3, 1, 9, 17, 39, 81, 75, 201, 931, 1547, 1857, 7251, 11687, 14437, 12603}},
+{5182, 16, 24067, {1, 3, 3, 15, 15, 23, 95, 7, 193, 9, 1749, 809, 5083, 14645, 24893, 35979}},
+{5183, 16, 24069, {1, 1, 7, 1, 9, 9, 127, 149, 433, 985, 1347, 3379, 2881, 681, 20777, 30703}},
+{5184, 16, 24084, {1, 3, 1, 11, 1, 27, 121, 111, 251, 45, 1341, 1709, 3733, 11297, 29063, 57119}},
+{5185, 16, 24112, {1, 3, 3, 1, 19, 3, 77, 127, 187, 831, 1125, 3119, 4665, 9857, 5301, 36755}},
+{5186, 16, 24115, {1, 3, 3, 3, 29, 29, 61, 225, 257, 635, 665, 1279, 3019, 2401, 8253, 40251}},
+{5187, 16, 24184, {1, 1, 7, 9, 29, 43, 47, 95, 221, 823, 257, 1485, 5183, 225, 27675, 60479}},
+{5188, 16, 24187, {1, 1, 5, 3, 15, 49, 25, 69, 101, 393, 901, 305, 4917, 13479, 30209, 9199}},
+{5189, 16, 24262, {1, 1, 3, 15, 1, 9, 47, 243, 403, 341, 143, 1365, 1817, 6017, 3853, 58625}},
+{5190, 16, 24276, {1, 3, 3, 11, 9, 49, 93, 149, 39, 177, 1863, 1027, 659, 9253, 2131, 26943}},
+{5191, 16, 24279, {1, 3, 1, 3, 25, 1, 43, 255, 217, 353, 957, 39, 4607, 15761, 24291, 33619}},
+{5192, 16, 24313, {1, 1, 1, 7, 29, 51, 71, 237, 1, 703, 19, 213, 6429, 11783, 22049, 30597}},
+{5193, 16, 24331, {1, 3, 1, 7, 31, 63, 105, 203, 473, 731, 257, 91, 5749, 4099, 30125, 40171}},
+{5194, 16, 24336, {1, 3, 7, 9, 7, 29, 119, 181, 225, 743, 1031, 55, 3997, 16221, 11663, 14847}},
+{5195, 16, 24348, {1, 3, 3, 11, 5, 21, 43, 17, 473, 981, 125, 2077, 6141, 4757, 7585, 29207}},
+{5196, 16, 24367, {1, 1, 7, 1, 27, 61, 27, 45, 267, 483, 119, 767, 957, 3411, 2653, 53967}},
+{5197, 16, 24372, {1, 1, 1, 3, 9, 41, 43, 17, 485, 253, 825, 3605, 5919, 9285, 1815, 6095}},
+{5198, 16, 24402, {1, 1, 1, 11, 7, 5, 53, 107, 309, 609, 1389, 2035, 861, 15565, 9375, 42363}},
+{5199, 16, 24420, {1, 3, 5, 3, 27, 57, 7, 177, 183, 227, 865, 183, 2903, 6325, 4393, 5257}},
+{5200, 16, 24444, {1, 3, 1, 5, 21, 29, 79, 107, 365, 427, 813, 3563, 7713, 3865, 4289, 28555}},
+{5201, 16, 24465, {1, 3, 5, 7, 11, 27, 1, 197, 425, 769, 1737, 3627, 1273, 4469, 11967, 823}},
+{5202, 16, 24466, {1, 1, 1, 13, 3, 31, 127, 159, 471, 367, 2047, 949, 1591, 12429, 21497, 27153}},
+{5203, 16, 24471, {1, 3, 1, 3, 3, 31, 31, 87, 243, 413, 1777, 1361, 4575, 1147, 17451, 33985}},
+{5204, 16, 24475, {1, 3, 3, 5, 13, 47, 45, 3, 165, 329, 743, 397, 2479, 4999, 12921, 26689}},
+{5205, 16, 24481, {1, 1, 5, 7, 17, 59, 25, 117, 217, 601, 235, 2691, 5569, 7853, 31063, 28281}},
+{5206, 16, 24488, {1, 3, 1, 11, 11, 39, 71, 77, 481, 39, 363, 1921, 3263, 12849, 13325, 41803}},
+{5207, 16, 24501, {1, 3, 7, 5, 19, 1, 59, 197, 239, 787, 1657, 1449, 4245, 1317, 19609, 53583}},
+{5208, 16, 24514, {1, 1, 7, 1, 13, 33, 81, 53, 223, 323, 477, 2421, 4045, 1855, 5823, 9661}},
+{5209, 16, 24531, {1, 3, 1, 7, 1, 3, 121, 19, 329, 569, 481, 3443, 499, 12407, 19625, 4627}},
+{5210, 16, 24534, {1, 1, 1, 7, 3, 33, 91, 241, 69, 581, 1635, 1025, 4677, 14651, 5229, 19555}},
+{5211, 16, 24559, {1, 3, 1, 15, 9, 11, 99, 47, 489, 755, 601, 1221, 4251, 4377, 20567, 33839}},
+{5212, 16, 24602, {1, 3, 3, 5, 21, 21, 127, 151, 499, 971, 1627, 609, 2365, 3183, 7413, 697}},
+{5213, 16, 24614, {1, 3, 7, 13, 5, 35, 61, 121, 51, 297, 29, 1825, 495, 1299, 12741, 3253}},
+{5214, 16, 24637, {1, 1, 1, 1, 13, 15, 49, 205, 235, 9, 849, 1101, 4533, 10221, 32419, 50151}},
+{5215, 16, 24664, {1, 1, 3, 13, 29, 31, 57, 77, 217, 195, 1951, 189, 981, 6169, 22677, 64415}},
+{5216, 16, 24676, {1, 3, 1, 5, 15, 37, 25, 233, 43, 843, 1205, 153, 6339, 3767, 16725, 32699}},
+{5217, 16, 24679, {1, 3, 3, 1, 19, 37, 11, 217, 461, 897, 1181, 2815, 295, 15153, 25351, 57211}},
+{5218, 16, 24697, {1, 3, 5, 11, 15, 9, 5, 179, 353, 769, 1457, 2919, 1201, 14871, 29549, 52265}},
+{5219, 16, 24709, {1, 1, 3, 3, 5, 51, 127, 221, 329, 543, 1537, 2701, 2709, 9311, 2715, 42669}},
+{5220, 16, 24714, {1, 3, 5, 15, 5, 41, 79, 233, 445, 265, 2001, 935, 3133, 3977, 3601, 21389}},
+{5221, 16, 24716, {1, 3, 5, 11, 3, 7, 115, 45, 311, 827, 1897, 3399, 4251, 5341, 22621, 25519}},
+{5222, 16, 24731, {1, 3, 7, 1, 11, 57, 117, 103, 401, 505, 1683, 2161, 4363, 11189, 20263, 13065}},
+{5223, 16, 24744, {1, 1, 1, 7, 23, 29, 31, 77, 63, 179, 195, 2747, 579, 11701, 5101, 11497}},
+{5224, 16, 24762, {1, 3, 7, 3, 9, 33, 81, 165, 433, 545, 1893, 3709, 3813, 6615, 1485, 6395}},
+{5225, 16, 24764, {1, 3, 1, 15, 9, 5, 27, 157, 389, 683, 1919, 509, 455, 3865, 2303, 6993}},
+{5226, 16, 24769, {1, 3, 3, 9, 5, 5, 3, 5, 299, 59, 539, 1199, 2443, 10821, 3359, 44345}},
+{5227, 16, 24806, {1, 3, 5, 9, 21, 37, 87, 35, 501, 943, 1313, 3929, 351, 9851, 22971, 35659}},
+{5228, 16, 24812, {1, 3, 7, 11, 11, 33, 77, 175, 411, 315, 1797, 2731, 4611, 1809, 22027, 50595}},
+{5229, 16, 24872, {1, 3, 7, 13, 15, 11, 13, 189, 209, 1015, 1869, 1593, 6887, 8571, 7217, 2641}},
+{5230, 16, 24878, {1, 1, 3, 13, 29, 15, 119, 127, 329, 275, 865, 1693, 225, 15735, 11071, 37127}},
+{5231, 16, 24883, {1, 3, 7, 13, 9, 31, 85, 25, 281, 401, 1923, 2391, 3875, 2079, 2055, 53275}},
+{5232, 16, 24909, {1, 3, 1, 5, 23, 57, 79, 127, 209, 901, 315, 1165, 3393, 15095, 1981, 34993}},
+{5233, 16, 24943, {1, 3, 7, 7, 25, 13, 15, 223, 157, 335, 1061, 395, 6895, 6283, 18375, 4887}},
+{5234, 16, 24946, {1, 3, 7, 13, 9, 15, 99, 201, 105, 643, 117, 3027, 641, 13353, 4343, 11875}},
+{5235, 16, 24964, {1, 1, 3, 11, 5, 51, 5, 77, 281, 207, 1201, 1187, 8107, 6625, 7517, 34377}},
+{5236, 16, 24992, {1, 1, 1, 5, 29, 61, 3, 181, 297, 151, 565, 2713, 6611, 8665, 32425, 50399}},
+{5237, 16, 25016, {1, 3, 1, 5, 1, 61, 41, 245, 95, 647, 49, 2195, 5927, 15531, 28547, 51075}},
+{5238, 16, 25022, {1, 3, 3, 15, 15, 63, 123, 63, 77, 813, 423, 715, 91, 3793, 20901, 54927}},
+{5239, 16, 25024, {1, 3, 7, 9, 15, 35, 31, 161, 127, 13, 1667, 1225, 5279, 15487, 18769, 24887}},
+{5240, 16, 25039, {1, 1, 3, 5, 27, 25, 61, 21, 447, 175, 1419, 2691, 1993, 13059, 30809, 38325}},
+{5241, 16, 25051, {1, 3, 1, 3, 15, 21, 15, 193, 233, 435, 1993, 4003, 4581, 13837, 16535, 43781}},
+{5242, 16, 25060, {1, 1, 1, 5, 1, 11, 21, 253, 59, 59, 497, 77, 2165, 8197, 5933, 25743}},
+{5243, 16, 25072, {1, 1, 3, 9, 25, 61, 29, 217, 95, 269, 799, 409, 801, 421, 19065, 53443}},
+{5244, 16, 25097, {1, 1, 7, 1, 1, 41, 71, 59, 191, 867, 223, 1467, 6679, 16031, 4451, 15313}},
+{5245, 16, 25122, {1, 1, 1, 11, 13, 27, 7, 241, 167, 969, 1267, 2953, 3769, 2415, 30065, 39483}},
+{5246, 16, 25148, {1, 1, 1, 3, 25, 61, 103, 23, 53, 799, 989, 3859, 7299, 13613, 12007, 37535}},
+{5247, 16, 25194, {1, 1, 7, 1, 29, 19, 121, 57, 355, 663, 643, 3723, 1775, 10363, 1389, 16039}},
+{5248, 16, 25201, {1, 3, 7, 3, 21, 55, 51, 67, 363, 843, 1187, 1983, 7757, 5413, 26575, 53329}},
+{5249, 16, 25204, {1, 3, 1, 3, 31, 55, 73, 55, 75, 533, 197, 1463, 2933, 6033, 24397, 41579}},
+{5250, 16, 25238, {1, 3, 1, 11, 9, 15, 107, 141, 473, 825, 901, 937, 7433, 13119, 20047, 6695}},
+{5251, 16, 25241, {1, 3, 5, 7, 19, 27, 3, 149, 507, 137, 1025, 1841, 33, 3113, 15101, 28187}},
+{5252, 16, 25248, {1, 3, 5, 7, 31, 27, 53, 45, 177, 129, 1241, 1525, 991, 4141, 17681, 39435}},
+{5253, 16, 25257, {1, 1, 1, 15, 31, 57, 29, 137, 395, 563, 101, 3367, 1277, 5431, 1169, 44321}},
+{5254, 16, 25275, {1, 3, 5, 7, 21, 15, 123, 181, 113, 313, 1763, 1429, 2985, 715, 26129, 549}},
+{5255, 16, 25278, {1, 3, 3, 1, 15, 27, 27, 139, 507, 79, 1999, 2505, 485, 7011, 13369, 7159}},
+{5256, 16, 25304, {1, 3, 3, 11, 27, 53, 109, 179, 399, 657, 697, 421, 5467, 4273, 7837, 11631}},
+{5257, 16, 25307, {1, 1, 1, 15, 1, 57, 91, 199, 443, 569, 1945, 2531, 6349, 4851, 3931, 20537}},
+{5258, 16, 25320, {1, 1, 3, 13, 3, 3, 107, 237, 261, 377, 135, 2809, 7239, 1613, 24035, 26053}},
+{5259, 16, 25334, {1, 3, 3, 5, 3, 59, 65, 197, 411, 363, 1729, 967, 3963, 4535, 111, 7273}},
+{5260, 16, 25348, {1, 1, 7, 3, 13, 39, 105, 235, 203, 1015, 1031, 3127, 1209, 10817, 22177, 44117}},
+{5261, 16, 25357, {1, 3, 3, 13, 19, 21, 123, 31, 59, 185, 1007, 1115, 1965, 13087, 18489, 34063}},
+{5262, 16, 25372, {1, 1, 7, 5, 27, 7, 33, 159, 245, 57, 2003, 3229, 2095, 4939, 31355, 23121}},
+{5263, 16, 25394, {1, 3, 3, 9, 9, 41, 49, 203, 397, 915, 821, 3685, 2269, 11159, 25441, 46377}},
+{5264, 16, 25454, {1, 3, 7, 5, 29, 33, 29, 227, 361, 961, 1905, 1149, 2799, 8115, 28235, 25685}},
+{5265, 16, 25465, {1, 3, 1, 1, 19, 13, 73, 103, 11, 183, 853, 2425, 3809, 2391, 18615, 32735}},
+{5266, 16, 25472, {1, 1, 3, 3, 21, 57, 47, 57, 157, 43, 1085, 3319, 461, 11499, 6809, 10435}},
+{5267, 16, 25492, {1, 1, 5, 5, 17, 21, 55, 17, 421, 865, 159, 1643, 4523, 1485, 11937, 8287}},
+{5268, 16, 25505, {1, 1, 3, 11, 7, 43, 39, 37, 187, 797, 1273, 1227, 2683, 1249, 3375, 44499}},
+{5269, 16, 25517, {1, 1, 5, 11, 17, 35, 27, 73, 97, 59, 921, 2171, 7577, 2847, 93, 35911}},
+{5270, 16, 25530, {1, 1, 5, 1, 5, 17, 117, 189, 357, 581, 1945, 2141, 1679, 12019, 11249, 6809}},
+{5271, 16, 25558, {1, 1, 5, 7, 15, 53, 9, 191, 153, 257, 533, 493, 2389, 4657, 20757, 57275}},
+{5272, 16, 25562, {1, 1, 1, 11, 13, 35, 85, 37, 501, 525, 543, 4057, 2001, 6183, 949, 18465}},
+{5273, 16, 25598, {1, 1, 1, 3, 15, 7, 39, 169, 359, 671, 731, 1523, 211, 1233, 29515, 57787}},
+{5274, 16, 25609, {1, 1, 3, 7, 27, 7, 41, 15, 71, 733, 1919, 401, 1915, 4815, 10571, 839}},
+{5275, 16, 25612, {1, 1, 7, 13, 27, 61, 5, 25, 293, 779, 477, 1537, 6695, 7435, 1281, 64369}},
+{5276, 16, 25627, {1, 1, 7, 7, 19, 11, 101, 45, 449, 883, 1181, 3521, 6019, 16305, 23429, 43789}},
+{5277, 16, 25651, {1, 1, 7, 5, 1, 49, 121, 89, 275, 367, 461, 1717, 2733, 4403, 9123, 35217}},
+{5278, 16, 25653, {1, 1, 7, 1, 1, 37, 41, 221, 281, 531, 357, 3783, 3561, 8135, 18405, 56045}},
+{5279, 16, 25668, {1, 3, 5, 7, 29, 9, 127, 37, 13, 519, 1059, 3973, 7253, 15159, 19337, 57103}},
+{5280, 16, 25711, {1, 3, 3, 15, 3, 41, 91, 7, 63, 747, 1649, 3367, 5945, 3603, 28465, 511}},
+{5281, 16, 25765, {1, 3, 3, 15, 27, 19, 67, 179, 505, 131, 149, 1753, 3603, 1135, 15811, 5305}},
+{5282, 16, 25770, {1, 1, 1, 5, 5, 63, 71, 235, 151, 651, 1383, 249, 3223, 14559, 26809, 4551}},
+{5283, 16, 25775, {1, 3, 3, 9, 29, 41, 67, 111, 175, 515, 1123, 1707, 6653, 8233, 22775, 61029}},
+{5284, 16, 25777, {1, 3, 3, 9, 23, 1, 75, 145, 159, 785, 537, 1995, 2241, 8641, 30709, 41373}},
+{5285, 16, 25783, {1, 1, 5, 9, 21, 1, 87, 233, 401, 643, 197, 3437, 8163, 6363, 6537, 17283}},
+{5286, 16, 25801, {1, 3, 5, 3, 23, 19, 55, 243, 405, 369, 1221, 1959, 5455, 11729, 26117, 9097}},
+{5287, 16, 25802, {1, 1, 3, 13, 3, 57, 71, 235, 125, 263, 873, 1079, 2627, 1343, 1979, 49519}},
+{5288, 16, 25812, {1, 3, 1, 11, 21, 15, 27, 7, 425, 935, 305, 2593, 4437, 9517, 26207, 4229}},
+{5289, 16, 25821, {1, 1, 3, 13, 11, 53, 1, 149, 97, 939, 147, 3365, 5023, 607, 2083, 8715}},
+{5290, 16, 25897, {1, 1, 5, 3, 13, 13, 113, 51, 263, 837, 1145, 3621, 5697, 2867, 7975, 22839}},
+{5291, 16, 25906, {1, 1, 3, 15, 31, 9, 91, 231, 399, 295, 1935, 4021, 7669, 3867, 28015, 9865}},
+{5292, 16, 25929, {1, 1, 1, 1, 13, 59, 51, 35, 407, 733, 1629, 2429, 291, 11923, 32129, 28847}},
+{5293, 16, 25940, {1, 3, 3, 11, 25, 21, 13, 117, 31, 547, 327, 2801, 2247, 4051, 27523, 4257}},
+{5294, 16, 25950, {1, 1, 7, 7, 15, 33, 15, 17, 255, 363, 1013, 1463, 7537, 14093, 21883, 35389}},
+{5295, 16, 25968, {1, 1, 5, 9, 11, 61, 7, 161, 121, 413, 515, 413, 4439, 15405, 30265, 23939}},
+{5296, 16, 25971, {1, 3, 7, 7, 11, 15, 5, 181, 315, 231, 1567, 2985, 1653, 12251, 269, 37317}},
+{5297, 16, 25977, {1, 3, 1, 11, 3, 15, 91, 45, 489, 571, 11, 1239, 7705, 4303, 12535, 21359}},
+{5298, 16, 25994, {1, 1, 7, 15, 29, 43, 81, 63, 483, 851, 389, 1719, 6111, 15293, 2513, 44397}},
+{5299, 16, 25996, {1, 1, 5, 15, 25, 33, 97, 131, 183, 269, 1903, 2733, 7197, 4507, 24471, 36871}},
+{5300, 16, 25999, {1, 3, 3, 13, 17, 33, 73, 83, 247, 207, 79, 1139, 581, 12147, 3539, 45423}},
+{5301, 16, 26001, {1, 1, 1, 15, 29, 49, 79, 151, 267, 393, 1995, 105, 2873, 3981, 19147, 53987}},
+{5302, 16, 26030, {1, 1, 5, 1, 31, 25, 39, 203, 459, 181, 661, 717, 6235, 13413, 1197, 40665}},
+{5303, 16, 26069, {1, 1, 5, 9, 19, 33, 65, 239, 463, 133, 461, 3601, 7755, 1771, 20683, 7417}},
+{5304, 16, 26100, {1, 1, 1, 1, 25, 19, 25, 155, 431, 33, 341, 959, 5679, 1205, 2599, 37499}},
+{5305, 16, 26109, {1, 1, 3, 5, 25, 5, 83, 87, 91, 991, 1833, 4063, 147, 14497, 25725, 4617}},
+{5306, 16, 26131, {1, 3, 5, 7, 31, 7, 73, 51, 339, 313, 1593, 2089, 7387, 15759, 3249, 7953}},
+{5307, 16, 26144, {1, 3, 7, 1, 27, 49, 35, 11, 21, 45, 1689, 1665, 4591, 3713, 12781, 4805}},
+{5308, 16, 26149, {1, 1, 3, 9, 29, 51, 73, 51, 303, 179, 67, 3917, 7615, 6131, 26225, 55991}},
+{5309, 16, 26162, {1, 3, 7, 11, 9, 63, 29, 47, 153, 883, 1859, 1913, 3563, 11451, 6333, 51367}},
+{5310, 16, 26167, {1, 3, 1, 3, 5, 25, 69, 87, 389, 613, 989, 3557, 1339, 12503, 14505, 63209}},
+{5311, 16, 26173, {1, 1, 3, 1, 5, 13, 37, 163, 499, 163, 2025, 1467, 5059, 8479, 2889, 62957}},
+{5312, 16, 26179, {1, 1, 7, 9, 23, 31, 109, 49, 73, 197, 337, 2763, 4789, 8983, 9691, 32155}},
+{5313, 16, 26193, {1, 3, 1, 3, 31, 25, 121, 91, 371, 339, 833, 2217, 4997, 9425, 10685, 60037}},
+{5314, 16, 26230, {1, 1, 7, 11, 31, 3, 105, 125, 255, 175, 803, 1787, 6231, 4441, 5031, 29737}},
+{5315, 16, 26234, {1, 1, 1, 11, 21, 63, 75, 209, 393, 437, 495, 2397, 4759, 15703, 29869, 62685}},
+{5316, 16, 26246, {1, 1, 7, 7, 25, 33, 117, 7, 293, 623, 2001, 2409, 2487, 14803, 3329, 38277}},
+{5317, 16, 26267, {1, 1, 7, 9, 31, 51, 75, 151, 487, 85, 639, 3529, 4491, 1957, 22099, 20263}},
+{5318, 16, 26283, {1, 1, 7, 5, 3, 29, 11, 1, 255, 555, 1269, 779, 1525, 7689, 25847, 39347}},
+{5319, 16, 26300, {1, 1, 7, 7, 19, 21, 9, 123, 3, 943, 1627, 2979, 919, 4565, 31435, 59789}},
+{5320, 16, 26341, {1, 3, 7, 5, 29, 13, 57, 221, 9, 893, 1685, 1879, 4575, 7369, 26191, 6067}},
+{5321, 16, 26356, {1, 3, 7, 9, 13, 11, 9, 27, 313, 751, 1377, 1121, 3799, 1673, 16305, 30665}},
+{5322, 16, 26377, {1, 3, 3, 13, 23, 17, 59, 47, 499, 525, 681, 3195, 1611, 7003, 7325, 53019}},
+{5323, 16, 26397, {1, 3, 1, 7, 23, 51, 59, 127, 67, 263, 1305, 2479, 637, 9441, 6329, 12857}},
+{5324, 16, 26404, {1, 1, 7, 7, 9, 3, 51, 193, 205, 503, 19, 2513, 7489, 9241, 15371, 20875}},
+{5325, 16, 26411, {1, 3, 3, 1, 1, 57, 17, 181, 23, 549, 769, 2325, 3669, 7017, 25601, 64479}},
+{5326, 16, 26422, {1, 3, 1, 15, 5, 55, 53, 13, 327, 447, 1031, 1599, 3639, 15305, 1387, 16035}},
+{5327, 16, 26451, {1, 3, 7, 15, 9, 41, 53, 113, 97, 99, 1377, 4047, 3713, 8891, 5601, 5853}},
+{5328, 16, 26454, {1, 1, 7, 9, 9, 7, 29, 249, 411, 315, 181, 2153, 6135, 6947, 27595, 15553}},
+{5329, 16, 26463, {1, 1, 7, 11, 3, 57, 35, 55, 165, 313, 577, 3049, 4259, 4231, 7225, 58973}},
+{5330, 16, 26488, {1, 1, 1, 1, 15, 43, 53, 143, 157, 843, 465, 3897, 4797, 12305, 28807, 46381}},
+{5331, 16, 26498, {1, 3, 7, 9, 17, 3, 99, 61, 475, 507, 831, 2207, 367, 27, 23205, 2303}},
+{5332, 16, 26509, {1, 1, 3, 11, 27, 29, 99, 237, 43, 955, 361, 3231, 1863, 7973, 8969, 58663}},
+{5333, 16, 26512, {1, 3, 1, 7, 15, 15, 11, 251, 135, 261, 675, 3723, 7675, 7993, 1725, 41149}},
+{5334, 16, 26517, {1, 3, 3, 9, 29, 11, 105, 37, 151, 215, 1911, 4051, 5427, 11019, 9073, 33129}},
+{5335, 16, 26534, {1, 3, 3, 1, 19, 7, 103, 81, 371, 253, 1043, 1231, 6497, 10377, 2349, 29047}},
+{5336, 16, 26545, {1, 3, 7, 9, 15, 11, 85, 61, 507, 629, 811, 3883, 1435, 13035, 31913, 2153}},
+{5337, 16, 26546, {1, 1, 5, 11, 13, 7, 63, 147, 117, 223, 1217, 3317, 3275, 6851, 2917, 55901}},
+{5338, 16, 26636, {1, 3, 3, 9, 7, 21, 1, 63, 117, 297, 405, 797, 337, 10173, 8327, 29157}},
+{5339, 16, 26749, {1, 1, 7, 11, 31, 63, 97, 191, 259, 421, 1829, 2117, 4203, 11919, 18001, 55791}},
+{5340, 16, 26753, {1, 3, 7, 9, 21, 13, 125, 247, 133, 611, 463, 227, 7815, 8877, 17961, 3641}},
+{5341, 16, 26759, {1, 1, 7, 9, 27, 21, 97, 165, 371, 715, 491, 3929, 3067, 12501, 5511, 18217}},
+{5342, 16, 26774, {1, 3, 3, 15, 27, 17, 81, 161, 263, 273, 135, 1159, 7535, 4581, 16065, 11493}},
+{5343, 16, 26789, {1, 3, 3, 7, 11, 59, 111, 47, 381, 413, 243, 2173, 4957, 2451, 15669, 22071}},
+{5344, 16, 26808, {1, 3, 7, 5, 3, 31, 65, 131, 111, 141, 1891, 2983, 3331, 769, 24075, 40865}},
+{5345, 16, 26825, {1, 3, 7, 11, 11, 63, 7, 213, 333, 111, 1235, 961, 3749, 9123, 5067, 9657}},
+{5346, 16, 26831, {1, 3, 3, 1, 9, 33, 1, 225, 37, 951, 1995, 3215, 3117, 3723, 15013, 64525}},
+{5347, 16, 26859, {1, 3, 3, 13, 29, 19, 103, 65, 67, 423, 1679, 3791, 5551, 11711, 195, 52291}},
+{5348, 16, 26888, {1, 3, 1, 15, 31, 7, 65, 249, 489, 287, 1385, 1075, 1357, 13593, 20853, 46221}},
+{5349, 16, 26918, {1, 1, 1, 13, 23, 45, 29, 175, 147, 101, 1007, 1867, 5387, 12683, 29609, 55861}},
+{5350, 16, 26929, {1, 3, 5, 13, 21, 31, 85, 187, 183, 179, 1337, 481, 71, 6117, 2177, 27915}},
+{5351, 16, 26950, {1, 3, 5, 1, 15, 5, 11, 141, 205, 177, 891, 3591, 4371, 889, 12957, 61083}},
+{5352, 16, 26954, {1, 3, 7, 7, 11, 39, 81, 241, 13, 757, 521, 3029, 2345, 12385, 20683, 64053}},
+{5353, 16, 26973, {1, 1, 5, 13, 7, 3, 77, 211, 215, 97, 1409, 1021, 1267, 4785, 27231, 2877}},
+{5354, 16, 26997, {1, 3, 5, 3, 11, 57, 93, 39, 415, 179, 1033, 3267, 5383, 10451, 27117, 10711}},
+{5355, 16, 26998, {1, 1, 1, 1, 3, 45, 93, 179, 453, 995, 1423, 3849, 4381, 15789, 20789, 18775}},
+{5356, 16, 27008, {1, 3, 1, 3, 13, 25, 33, 165, 351, 887, 1109, 195, 8131, 3061, 16743, 22997}},
+{5357, 16, 27038, {1, 3, 1, 5, 23, 35, 93, 155, 333, 603, 1571, 229, 2979, 6295, 20793, 40901}},
+{5358, 16, 27109, {1, 3, 3, 11, 29, 57, 101, 61, 487, 719, 1009, 1933, 7815, 15329, 12489, 26105}},
+{5359, 16, 27127, {1, 3, 3, 9, 23, 59, 73, 13, 141, 815, 1819, 3557, 2555, 5901, 23039, 62321}},
+{5360, 16, 27150, {1, 1, 3, 5, 19, 49, 27, 139, 35, 995, 565, 323, 6439, 15679, 27017, 30889}},
+{5361, 16, 27168, {1, 3, 7, 3, 1, 3, 27, 153, 235, 59, 989, 2763, 4197, 3931, 31227, 27129}},
+{5362, 16, 27178, {1, 3, 1, 15, 23, 45, 71, 205, 465, 451, 347, 1909, 3287, 8363, 9081, 35641}},
+{5363, 16, 27212, {1, 1, 5, 1, 25, 29, 17, 201, 463, 903, 1729, 3435, 2483, 10835, 14315, 52505}},
+{5364, 16, 27224, {1, 1, 1, 15, 13, 23, 3, 175, 273, 305, 1945, 3319, 7777, 9411, 4209, 4047}},
+{5365, 16, 27229, {1, 1, 5, 15, 25, 5, 71, 35, 307, 89, 301, 3465, 1497, 13467, 21911, 13611}},
+{5366, 16, 27246, {1, 3, 1, 7, 11, 7, 33, 241, 349, 751, 633, 3281, 6733, 13833, 23605, 34307}},
+{5367, 16, 27251, {1, 1, 1, 15, 17, 27, 45, 13, 259, 843, 1207, 1735, 4063, 6259, 1751, 45107}},
+{5368, 16, 27257, {1, 1, 5, 15, 29, 51, 73, 95, 5, 31, 933, 423, 5505, 2193, 14919, 2715}},
+{5369, 16, 27258, {1, 3, 1, 3, 23, 5, 29, 7, 271, 485, 827, 1159, 77, 16337, 27933, 18741}},
+{5370, 16, 27260, {1, 3, 7, 9, 23, 33, 47, 191, 59, 301, 1277, 3745, 7837, 799, 2861, 25853}},
+{5371, 16, 27287, {1, 3, 7, 13, 13, 39, 33, 91, 279, 855, 1917, 3601, 3971, 6193, 16951, 6115}},
+{5372, 16, 27300, {1, 1, 3, 13, 15, 59, 89, 239, 313, 545, 431, 3823, 5741, 14981, 2647, 42813}},
+{5373, 16, 27315, {1, 1, 1, 3, 17, 21, 45, 37, 343, 737, 1795, 2659, 2897, 7683, 15191, 1393}},
+{5374, 16, 27329, {1, 1, 3, 3, 19, 55, 27, 201, 459, 953, 1531, 671, 5667, 11695, 149, 14605}},
+{5375, 16, 27332, {1, 3, 7, 13, 9, 63, 67, 229, 69, 819, 859, 2035, 5725, 13403, 24197, 2599}},
+{5376, 16, 27349, {1, 1, 7, 7, 1, 59, 45, 105, 327, 779, 59, 791, 7593, 8189, 28161, 13339}},
+{5377, 16, 27350, {1, 3, 3, 15, 25, 55, 125, 189, 327, 733, 115, 3541, 5227, 12143, 32719, 15785}},
+{5378, 16, 27354, {1, 3, 3, 7, 19, 51, 35, 63, 507, 89, 1441, 2369, 4927, 7953, 10193, 8331}},
+{5379, 16, 27359, {1, 1, 5, 5, 21, 1, 41, 49, 217, 1001, 1649, 2789, 5267, 1525, 3811, 40785}},
+{5380, 16, 27377, {1, 1, 7, 15, 31, 21, 33, 183, 425, 393, 367, 3253, 3047, 465, 28229, 44743}},
+{5381, 16, 27378, {1, 3, 7, 5, 1, 23, 11, 71, 269, 707, 5, 2931, 1959, 15089, 9299, 43927}},
+{5382, 16, 27383, {1, 3, 5, 15, 21, 51, 31, 15, 49, 481, 297, 3871, 751, 10661, 26401, 62923}},
+{5383, 16, 27384, {1, 3, 1, 7, 17, 27, 35, 255, 205, 865, 1659, 1921, 5457, 11633, 2825, 13549}},
+{5384, 16, 27387, {1, 1, 5, 15, 17, 35, 83, 237, 437, 7, 2001, 2225, 2601, 10841, 7953, 20651}},
+{5385, 16, 27392, {1, 1, 1, 3, 3, 37, 43, 135, 451, 203, 1319, 261, 3889, 14489, 9635, 52545}},
+{5386, 16, 27402, {1, 3, 3, 13, 15, 41, 95, 207, 43, 997, 207, 3459, 5995, 5187, 15851, 28551}},
+{5387, 16, 27438, {1, 1, 1, 5, 23, 57, 49, 101, 303, 921, 745, 1407, 7071, 2765, 18703, 32671}},
+{5388, 16, 27481, {1, 1, 7, 13, 9, 59, 65, 157, 209, 295, 107, 3175, 3401, 1197, 1875, 9033}},
+{5389, 16, 27482, {1, 1, 3, 3, 17, 9, 101, 75, 177, 905, 1013, 397, 3421, 6475, 15897, 11269}},
+{5390, 16, 27494, {1, 3, 1, 5, 29, 53, 105, 83, 383, 137, 1169, 1245, 6973, 8701, 317, 10073}},
+{5391, 16, 27531, {1, 1, 1, 3, 15, 55, 69, 219, 507, 707, 945, 397, 779, 4157, 10333, 7869}},
+{5392, 16, 27542, {1, 3, 1, 3, 9, 21, 125, 153, 107, 969, 1979, 651, 1199, 11419, 17043, 32269}},
+{5393, 16, 27546, {1, 1, 1, 7, 1, 29, 71, 127, 209, 853, 1515, 1169, 5055, 9981, 30291, 29569}},
+{5394, 16, 27564, {1, 3, 1, 11, 1, 1, 109, 251, 329, 633, 2021, 1237, 2147, 11471, 26025, 19649}},
+{5395, 16, 27567, {1, 1, 5, 1, 5, 7, 77, 175, 251, 143, 711, 1241, 2133, 9993, 9203, 24949}},
+{5396, 16, 27582, {1, 3, 5, 11, 19, 11, 101, 83, 91, 595, 753, 2389, 1887, 11569, 29759, 55785}},
+{5397, 16, 27608, {1, 1, 1, 3, 29, 47, 49, 249, 495, 451, 1887, 2547, 543, 2755, 17207, 24379}},
+{5398, 16, 27611, {1, 3, 7, 7, 19, 15, 95, 143, 109, 221, 2041, 3593, 4571, 14547, 14217, 16711}},
+{5399, 16, 27624, {1, 3, 5, 13, 27, 55, 31, 209, 39, 989, 1435, 1665, 7265, 14127, 13517, 37647}},
+{5400, 16, 27629, {1, 1, 3, 7, 1, 49, 63, 71, 249, 371, 435, 3591, 2677, 143, 28897, 38981}},
+{5401, 16, 27655, {1, 1, 7, 7, 21, 9, 53, 221, 23, 515, 1971, 3759, 3511, 10207, 12929, 42021}},
+{5402, 16, 27667, {1, 3, 1, 13, 25, 21, 3, 85, 421, 19, 663, 3219, 3541, 13021, 5765, 39623}},
+{5403, 16, 27676, {1, 3, 1, 7, 11, 5, 125, 169, 293, 715, 1111, 2965, 4815, 6047, 27207, 23093}},
+{5404, 16, 27710, {1, 1, 5, 13, 11, 15, 37, 201, 457, 551, 821, 25, 435, 14307, 25855, 1811}},
+{5405, 16, 27724, {1, 3, 3, 9, 27, 15, 1, 253, 217, 549, 1013, 2277, 4171, 3813, 19857, 8641}},
+{5406, 16, 27745, {1, 3, 5, 5, 29, 37, 71, 49, 163, 949, 425, 2459, 945, 13125, 13981, 21669}},
+{5407, 16, 27752, {1, 3, 3, 9, 17, 23, 53, 235, 83, 887, 439, 1939, 7601, 15275, 15739, 17623}},
+{5408, 16, 27770, {1, 3, 5, 13, 7, 51, 73, 67, 167, 849, 2021, 2977, 6591, 3721, 5827, 40897}},
+{5409, 16, 27779, {1, 1, 5, 11, 27, 19, 81, 181, 383, 23, 1061, 3327, 1671, 7113, 7435, 17591}},
+{5410, 16, 27781, {1, 3, 3, 7, 25, 33, 73, 23, 103, 821, 917, 1425, 4739, 7227, 12365, 29509}},
+{5411, 16, 27791, {1, 1, 1, 7, 3, 37, 81, 231, 135, 663, 1983, 399, 6881, 14991, 4957, 20913}},
+{5412, 16, 27809, {1, 3, 7, 15, 25, 41, 65, 215, 301, 471, 1669, 65, 227, 9307, 29867, 9503}},
+{5413, 16, 27810, {1, 1, 7, 3, 25, 47, 31, 63, 53, 995, 33, 1297, 3423, 12301, 16255, 14467}},
+{5414, 16, 27815, {1, 3, 1, 1, 31, 25, 79, 131, 353, 169, 1425, 2257, 2631, 1559, 793, 48383}},
+{5415, 16, 27827, {1, 3, 3, 5, 31, 9, 93, 35, 503, 243, 595, 2939, 771, 7333, 13429, 59457}},
+{5416, 16, 27834, {1, 3, 1, 7, 5, 51, 21, 237, 453, 743, 775, 2207, 453, 12077, 12283, 9735}},
+{5417, 16, 27865, {1, 3, 1, 15, 5, 47, 59, 239, 87, 97, 885, 3191, 2547, 13227, 7433, 4989}},
+{5418, 16, 27899, {1, 3, 5, 15, 21, 33, 41, 155, 509, 317, 517, 1101, 133, 1897, 8235, 57673}},
+{5419, 16, 27901, {1, 1, 5, 15, 7, 9, 59, 155, 415, 831, 1173, 1263, 5451, 7181, 7233, 51483}},
+{5420, 16, 27914, {1, 1, 7, 3, 31, 43, 71, 39, 155, 529, 895, 827, 3203, 4625, 32185, 53507}},
+{5421, 16, 27950, {1, 3, 1, 11, 15, 17, 85, 141, 277, 439, 1775, 4015, 4457, 281, 22455, 47591}},
+{5422, 16, 27994, {1, 3, 5, 11, 25, 41, 93, 39, 51, 655, 1347, 3109, 2479, 9057, 18939, 26217}},
+{5423, 16, 28005, {1, 3, 3, 11, 31, 41, 7, 189, 241, 443, 65, 1723, 4817, 13405, 9641, 63965}},
+{5424, 16, 28009, {1, 1, 5, 3, 19, 29, 111, 11, 399, 277, 425, 1331, 5365, 14521, 16449, 29411}},
+{5425, 16, 28033, {1, 1, 3, 9, 25, 53, 91, 175, 481, 307, 1025, 71, 7425, 10667, 4053, 25605}},
+{5426, 16, 28039, {1, 3, 7, 7, 3, 13, 75, 175, 467, 363, 1889, 1759, 1155, 5511, 13047, 39637}},
+{5427, 16, 28060, {1, 3, 7, 9, 5, 21, 65, 43, 223, 97, 835, 2253, 3313, 9817, 23015, 55365}},
+{5428, 16, 28067, {1, 1, 1, 13, 9, 63, 95, 61, 417, 713, 1469, 1815, 795, 13609, 1567, 33535}},
+{5429, 16, 28069, {1, 3, 7, 1, 25, 45, 41, 27, 53, 407, 1633, 1317, 6267, 3293, 8899, 45235}},
+{5430, 16, 28099, {1, 3, 5, 11, 23, 47, 91, 211, 41, 775, 1301, 1407, 7931, 4491, 7579, 62321}},
+{5431, 16, 28113, {1, 1, 1, 7, 23, 15, 57, 31, 437, 293, 1999, 2589, 5453, 2519, 15533, 26949}},
+{5432, 16, 28114, {1, 3, 1, 9, 1, 27, 41, 165, 129, 297, 1887, 1171, 201, 5817, 24503, 38911}},
+{5433, 16, 28139, {1, 3, 1, 7, 1, 11, 63, 225, 191, 623, 1281, 3275, 167, 14697, 4905, 47289}},
+{5434, 16, 28142, {1, 3, 7, 7, 15, 47, 87, 177, 303, 391, 355, 3997, 7557, 6201, 20531, 22483}},
+{5435, 16, 28153, {1, 3, 3, 15, 17, 31, 111, 87, 61, 477, 1581, 3787, 5919, 10511, 2607, 62951}},
+{5436, 16, 28166, {1, 3, 3, 9, 29, 19, 63, 27, 205, 915, 1131, 3821, 673, 2875, 12703, 14367}},
+{5437, 16, 28172, {1, 3, 7, 1, 21, 19, 25, 97, 281, 635, 629, 181, 5207, 11133, 3687, 3489}},
+{5438, 16, 28183, {1, 3, 3, 9, 5, 63, 3, 21, 385, 713, 1805, 3583, 2807, 15455, 13057, 39771}},
+{5439, 16, 28194, {1, 3, 5, 9, 3, 59, 1, 253, 123, 405, 575, 3911, 4609, 11869, 23593, 947}},
+{5440, 16, 28232, {1, 1, 7, 5, 21, 27, 101, 221, 413, 153, 1647, 3637, 803, 5697, 20761, 61137}},
+{5441, 16, 28245, {1, 3, 7, 13, 31, 35, 111, 253, 187, 499, 465, 157, 5551, 10417, 323, 34913}},
+{5442, 16, 28246, {1, 1, 1, 7, 11, 41, 29, 65, 393, 69, 1373, 2291, 7807, 13159, 13735, 31001}},
+{5443, 16, 28252, {1, 3, 7, 13, 31, 49, 1, 35, 377, 11, 427, 2803, 1725, 9165, 22633, 63985}},
+{5444, 16, 28265, {1, 3, 7, 13, 3, 41, 27, 43, 269, 599, 1035, 3681, 309, 6011, 1065, 27901}},
+{5445, 16, 28301, {1, 3, 5, 13, 1, 19, 105, 143, 425, 883, 1669, 155, 189, 8573, 10759, 25507}},
+{5446, 16, 28323, {1, 3, 5, 1, 15, 37, 115, 9, 149, 79, 1733, 1045, 1849, 3289, 13957, 63171}},
+{5447, 16, 28344, {1, 1, 3, 9, 17, 27, 49, 201, 155, 901, 47, 1585, 4419, 8117, 25425, 14699}},
+{5448, 16, 28362, {1, 1, 7, 13, 19, 55, 19, 21, 427, 77, 1295, 1471, 6271, 7985, 19337, 12701}},
+{5449, 16, 28400, {1, 1, 1, 1, 11, 49, 101, 53, 175, 157, 839, 2713, 6149, 6391, 8089, 27739}},
+{5450, 16, 28417, {1, 3, 1, 1, 5, 21, 121, 199, 107, 221, 993, 1737, 409, 2545, 9287, 54605}},
+{5451, 16, 28454, {1, 1, 1, 3, 25, 25, 51, 121, 371, 861, 967, 3257, 6221, 11701, 27897, 42509}},
+{5452, 16, 28466, {1, 1, 1, 3, 17, 25, 101, 191, 313, 817, 815, 1855, 7999, 12649, 23385, 26081}},
+{5453, 16, 28468, {1, 1, 5, 1, 25, 55, 51, 237, 63, 943, 455, 619, 2381, 9773, 14575, 34205}},
+{5454, 16, 28477, {1, 3, 3, 3, 13, 49, 101, 37, 457, 727, 1009, 2389, 4841, 16303, 9599, 17773}},
+{5455, 16, 28498, {1, 1, 7, 9, 19, 59, 111, 205, 19, 229, 1755, 1169, 7767, 13335, 19669, 33269}},
+{5456, 16, 28510, {1, 3, 1, 15, 29, 1, 51, 167, 7, 415, 1295, 3165, 1241, 12859, 5531, 20083}},
+{5457, 16, 28513, {1, 1, 3, 7, 7, 51, 31, 221, 57, 643, 1461, 3951, 6237, 5757, 1907, 40471}},
+{5458, 16, 28571, {1, 3, 3, 5, 23, 39, 49, 177, 183, 117, 1379, 3803, 771, 12723, 22291, 32667}},
+{5459, 16, 28573, {1, 1, 3, 13, 27, 17, 39, 27, 313, 141, 1421, 2967, 2213, 1915, 23219, 15113}},
+{5460, 16, 28578, {1, 1, 1, 11, 5, 55, 51, 55, 389, 895, 57, 1447, 1497, 2799, 19585, 11587}},
+{5461, 16, 28587, {1, 1, 5, 13, 11, 55, 91, 77, 69, 131, 93, 1383, 3321, 10487, 15087, 8539}},
+{5462, 16, 28601, {1, 1, 3, 9, 23, 49, 107, 131, 363, 733, 1189, 3575, 7815, 10071, 20291, 7533}},
+{5463, 16, 28646, {1, 1, 3, 15, 31, 31, 73, 15, 199, 17, 761, 3271, 1419, 12985, 32717, 37317}},
+{5464, 16, 28663, {1, 3, 1, 13, 23, 9, 3, 59, 109, 729, 1321, 4023, 7041, 14445, 22205, 8993}},
+{5465, 16, 28681, {1, 1, 3, 15, 19, 43, 99, 59, 491, 479, 715, 2235, 7493, 889, 31465, 1375}},
+{5466, 16, 28682, {1, 3, 3, 15, 9, 47, 35, 115, 227, 615, 605, 1143, 5923, 10939, 9497, 24911}},
+{5467, 16, 28699, {1, 1, 3, 15, 23, 53, 111, 87, 423, 497, 85, 3525, 7341, 8885, 21543, 30083}},
+{5468, 16, 28706, {1, 1, 5, 3, 21, 5, 117, 157, 407, 743, 715, 1883, 4425, 10187, 6395, 43673}},
+{5469, 16, 28708, {1, 3, 3, 3, 31, 39, 119, 77, 269, 891, 1391, 3085, 2881, 10639, 3391, 44911}},
+{5470, 16, 28717, {1, 3, 7, 5, 7, 5, 115, 91, 5, 107, 1401, 1409, 1811, 737, 5399, 9119}},
+{5471, 16, 28720, {1, 1, 5, 9, 17, 45, 107, 15, 397, 299, 1219, 1675, 963, 10111, 31679, 13809}},
+{5472, 16, 28735, {1, 1, 3, 7, 29, 17, 43, 95, 261, 601, 1091, 3633, 1357, 13461, 16583, 12183}},
+{5473, 16, 28761, {1, 1, 5, 1, 19, 55, 5, 195, 187, 427, 421, 1717, 4223, 2943, 23147, 32985}},
+{5474, 16, 28783, {1, 3, 1, 3, 3, 23, 69, 95, 347, 273, 1223, 3061, 1587, 4707, 32415, 53991}},
+{5475, 16, 28788, {1, 1, 7, 13, 15, 13, 29, 151, 325, 949, 2029, 813, 5339, 14165, 1159, 56917}},
+{5476, 16, 28811, {1, 1, 1, 13, 9, 33, 67, 109, 215, 313, 1407, 3543, 2403, 5051, 20367, 13527}},
+{5477, 16, 28825, {1, 3, 1, 9, 5, 1, 9, 195, 497, 495, 1107, 745, 1647, 10637, 1933, 44965}},
+{5478, 16, 28838, {1, 1, 3, 9, 13, 19, 49, 183, 497, 519, 1433, 519, 4317, 2359, 10349, 63789}},
+{5479, 16, 28850, {1, 3, 5, 9, 29, 45, 55, 163, 189, 533, 275, 237, 5453, 8895, 6377, 14117}},
+{5480, 16, 28891, {1, 3, 7, 5, 25, 3, 111, 241, 139, 383, 689, 3481, 2557, 11163, 5275, 14671}},
+{5481, 16, 28897, {1, 3, 3, 9, 3, 5, 5, 141, 507, 331, 645, 1957, 5857, 2083, 24717, 11131}},
+{5482, 16, 28932, {1, 1, 5, 1, 11, 49, 113, 45, 491, 945, 1467, 3485, 6369, 15983, 14489, 12679}},
+{5483, 16, 28975, {1, 3, 7, 9, 11, 41, 77, 127, 147, 635, 1757, 587, 7423, 4233, 14875, 30531}},
+{5484, 16, 28998, {1, 3, 3, 9, 17, 29, 21, 249, 155, 441, 1443, 2093, 1967, 2117, 5815, 3857}},
+{5485, 16, 29052, {1, 3, 5, 3, 11, 55, 75, 157, 105, 507, 309, 3737, 2645, 7547, 29373, 62775}},
+{5486, 16, 29090, {1, 1, 3, 3, 11, 29, 49, 241, 21, 653, 1273, 715, 8123, 14241, 25257, 1681}},
+{5487, 16, 29096, {1, 1, 7, 5, 11, 31, 33, 215, 243, 369, 247, 3365, 4065, 9389, 32457, 58393}},
+{5488, 16, 29104, {1, 3, 5, 3, 31, 55, 51, 201, 439, 835, 1805, 25, 7987, 10611, 26893, 43663}},
+{5489, 16, 29113, {1, 1, 5, 9, 27, 51, 29, 31, 17, 163, 71, 603, 3083, 12439, 11043, 6471}},
+{5490, 16, 29133, {1, 1, 5, 7, 13, 1, 91, 109, 213, 721, 1345, 3037, 3047, 5209, 15559, 17467}},
+{5491, 16, 29142, {1, 1, 3, 9, 19, 37, 93, 185, 107, 859, 501, 3843, 1631, 4389, 2215, 52225}},
+{5492, 16, 29170, {1, 1, 3, 3, 25, 5, 119, 17, 33, 841, 997, 439, 6135, 7405, 8445, 40087}},
+{5493, 16, 29192, {1, 1, 7, 15, 19, 17, 101, 43, 423, 647, 29, 1143, 3259, 7807, 15929, 809}},
+{5494, 16, 29221, {1, 1, 7, 13, 21, 57, 83, 101, 183, 309, 171, 3173, 7919, 7263, 29403, 11055}},
+{5495, 16, 29236, {1, 1, 1, 13, 3, 1, 57, 15, 435, 713, 459, 847, 3115, 191, 19809, 43037}},
+{5496, 16, 29246, {1, 1, 7, 7, 17, 45, 91, 117, 157, 647, 121, 4091, 3611, 14169, 19883, 9069}},
+{5497, 16, 29293, {1, 1, 7, 7, 1, 47, 21, 253, 419, 157, 549, 2105, 4475, 3127, 3939, 5809}},
+{5498, 16, 29305, {1, 1, 5, 7, 15, 7, 71, 195, 87, 757, 77, 1391, 151, 12995, 26403, 17789}},
+{5499, 16, 29312, {1, 1, 1, 15, 15, 3, 79, 43, 475, 263, 1195, 2385, 5955, 7039, 15625, 19263}},
+{5500, 16, 29339, {1, 1, 5, 13, 13, 29, 5, 29, 489, 929, 2027, 2771, 6899, 14173, 13747, 1019}},
+{5501, 16, 29365, {1, 1, 7, 1, 5, 45, 37, 85, 221, 871, 627, 3445, 4853, 4243, 21651, 30201}},
+{5502, 16, 29389, {1, 3, 7, 11, 9, 49, 73, 245, 161, 321, 579, 2641, 6653, 5513, 11555, 53091}},
+{5503, 16, 29402, {1, 1, 7, 7, 25, 63, 101, 179, 497, 113, 9, 549, 5341, 6097, 13305, 52421}},
+{5504, 16, 29423, {1, 3, 3, 7, 21, 7, 89, 79, 137, 651, 189, 3025, 1403, 4559, 32611, 1857}},
+{5505, 16, 29443, {1, 3, 1, 13, 27, 55, 61, 135, 81, 195, 799, 3477, 4873, 2691, 29769, 59033}},
+{5506, 16, 29445, {1, 3, 3, 15, 29, 11, 7, 11, 151, 649, 1511, 2327, 6921, 12911, 3571, 35039}},
+{5507, 16, 29463, {1, 1, 5, 11, 25, 19, 49, 133, 455, 373, 1827, 3619, 2127, 3365, 11327, 52785}},
+{5508, 16, 29473, {1, 3, 5, 1, 9, 19, 107, 171, 205, 93, 1557, 2693, 4297, 4415, 20407, 19221}},
+{5509, 16, 29493, {1, 3, 3, 11, 15, 45, 37, 143, 61, 759, 2047, 2465, 3923, 9477, 30831, 46377}},
+{5510, 16, 29506, {1, 3, 7, 11, 17, 51, 117, 129, 77, 579, 1167, 1575, 1967, 10099, 22137, 31431}},
+{5511, 16, 29518, {1, 1, 5, 13, 31, 61, 67, 37, 49, 283, 235, 783, 7353, 5149, 12245, 18725}},
+{5512, 16, 29532, {1, 1, 5, 3, 17, 33, 35, 83, 359, 253, 1911, 913, 6481, 4635, 24223, 19693}},
+{5513, 16, 29560, {1, 1, 1, 13, 19, 15, 81, 131, 417, 969, 1911, 2829, 3097, 5333, 11175, 52269}},
+{5514, 16, 29590, {1, 3, 7, 15, 5, 39, 19, 205, 329, 83, 1473, 3259, 6409, 12297, 30557, 40917}},
+{5515, 16, 29594, {1, 3, 1, 15, 17, 33, 123, 185, 501, 299, 621, 929, 5797, 10539, 12321, 61043}},
+{5516, 16, 29637, {1, 3, 3, 1, 7, 51, 119, 19, 17, 203, 373, 2145, 2367, 9965, 28071, 50083}},
+{5517, 16, 29647, {1, 1, 1, 5, 1, 35, 43, 243, 91, 793, 1299, 2705, 7987, 1291, 10147, 17863}},
+{5518, 16, 29650, {1, 3, 5, 15, 27, 13, 99, 33, 179, 479, 897, 1113, 1639, 12321, 23987, 36219}},
+{5519, 16, 29655, {1, 1, 5, 9, 29, 41, 85, 9, 389, 583, 293, 1727, 2575, 13767, 15443, 40027}},
+{5520, 16, 29661, {1, 1, 7, 11, 29, 33, 93, 115, 51, 747, 1569, 3557, 869, 1991, 29877, 44131}},
+{5521, 16, 29680, {1, 3, 7, 7, 29, 11, 33, 137, 411, 689, 1815, 1789, 6557, 5973, 19445, 49449}},
+{5522, 16, 29721, {1, 1, 5, 1, 17, 3, 77, 55, 351, 325, 983, 3935, 819, 14127, 18893, 62553}},
+{5523, 16, 29751, {1, 3, 3, 1, 15, 33, 25, 159, 135, 385, 837, 3615, 1649, 1687, 3421, 47579}},
+{5524, 16, 29755, {1, 3, 1, 7, 17, 25, 125, 169, 469, 919, 1789, 863, 2827, 949, 21347, 10517}},
+{5525, 16, 29760, {1, 3, 1, 11, 27, 19, 45, 255, 175, 483, 1073, 3779, 611, 2809, 179, 19767}},
+{5526, 16, 29772, {1, 1, 3, 1, 21, 61, 47, 171, 179, 85, 61, 1209, 4005, 11439, 8477, 27229}},
+{5527, 16, 29778, {1, 1, 1, 1, 3, 1, 43, 159, 261, 411, 1449, 1621, 3681, 3465, 24029, 3493}},
+{5528, 16, 29799, {1, 3, 1, 11, 5, 13, 9, 23, 369, 769, 363, 3329, 409, 13151, 30269, 9621}},
+{5529, 16, 29824, {1, 1, 5, 1, 13, 39, 121, 39, 295, 981, 1151, 4039, 8179, 5007, 25527, 1249}},
+{5530, 16, 29841, {1, 3, 7, 5, 17, 21, 47, 233, 211, 349, 643, 109, 7553, 11453, 30967, 30959}},
+{5531, 16, 29842, {1, 1, 5, 3, 31, 39, 105, 137, 487, 855, 107, 1567, 2385, 2889, 25777, 33709}},
+{5532, 16, 29853, {1, 1, 1, 9, 1, 7, 9, 69, 465, 965, 355, 299, 3327, 14997, 14599, 2241}},
+{5533, 16, 29867, {1, 3, 5, 11, 5, 39, 69, 203, 367, 611, 199, 3931, 5039, 8683, 8675, 49151}},
+{5534, 16, 29949, {1, 1, 7, 13, 31, 35, 101, 213, 273, 827, 203, 2773, 4131, 1397, 15311, 62903}},
+{5535, 16, 29950, {1, 3, 7, 9, 23, 41, 33, 213, 411, 965, 563, 3035, 247, 15019, 20429, 61081}},
+{5536, 16, 29964, {1, 1, 5, 5, 5, 1, 1, 203, 27, 199, 67, 1301, 7831, 12839, 2777, 6325}},
+{5537, 16, 29967, {1, 3, 1, 11, 27, 3, 11, 173, 9, 121, 1701, 2741, 29, 16319, 15849, 11989}},
+{5538, 16, 29985, {1, 1, 5, 13, 17, 49, 125, 153, 261, 603, 1617, 3967, 6083, 7745, 19683, 49885}},
+{5539, 16, 29992, {1, 3, 3, 7, 23, 13, 39, 169, 135, 361, 579, 1443, 7615, 2389, 5669, 651}},
+{5540, 16, 30000, {1, 3, 5, 9, 31, 19, 81, 83, 483, 93, 1895, 2285, 7771, 8281, 8353, 39677}},
+{5541, 16, 30020, {1, 1, 7, 7, 23, 51, 127, 25, 101, 611, 1095, 3013, 2685, 8153, 22629, 53355}},
+{5542, 16, 30024, {1, 1, 1, 11, 11, 37, 35, 127, 317, 877, 1591, 401, 4121, 9945, 12121, 28257}},
+{5543, 16, 30030, {1, 3, 5, 11, 23, 9, 43, 135, 37, 405, 2009, 2903, 3065, 6591, 8473, 58231}},
+{5544, 16, 30066, {1, 1, 3, 11, 21, 45, 21, 205, 425, 891, 357, 2609, 495, 7541, 2161, 37853}},
+{5545, 16, 30071, {1, 3, 1, 1, 25, 9, 113, 243, 317, 491, 997, 2023, 5869, 13643, 11483, 6733}},
+{5546, 16, 30078, {1, 3, 1, 15, 13, 3, 75, 25, 409, 421, 1817, 857, 4575, 12559, 1211, 62177}},
+{5547, 16, 30082, {1, 1, 3, 7, 17, 35, 115, 195, 217, 223, 1195, 749, 5619, 7265, 7369, 46907}},
+{5548, 16, 30096, {1, 1, 1, 13, 5, 57, 117, 161, 121, 533, 987, 3959, 5047, 15213, 15811, 41841}},
+{5549, 16, 30101, {1, 3, 7, 1, 19, 55, 97, 191, 217, 75, 1881, 3351, 3737, 12179, 22875, 28767}},
+{5550, 16, 30102, {1, 3, 1, 9, 15, 41, 9, 97, 491, 31, 1191, 963, 875, 8259, 2723, 9503}},
+{5551, 16, 30122, {1, 3, 7, 9, 3, 17, 21, 71, 1, 523, 2031, 3469, 3181, 8707, 6093, 8837}},
+{5552, 16, 30141, {1, 3, 5, 3, 5, 1, 11, 91, 33, 37, 643, 85, 4325, 4293, 8351, 28311}},
+{5553, 16, 30159, {1, 3, 7, 5, 15, 45, 47, 183, 391, 113, 493, 3607, 2541, 13521, 31613, 36049}},
+{5554, 16, 30168, {1, 1, 3, 9, 15, 33, 115, 69, 289, 217, 1875, 1339, 4995, 9073, 6909, 15977}},
+{5555, 16, 30177, {1, 1, 7, 3, 9, 29, 39, 219, 119, 369, 893, 1293, 4511, 15703, 11093, 30259}},
+{5556, 16, 30183, {1, 1, 5, 13, 19, 9, 17, 75, 149, 415, 35, 97, 563, 1689, 18311, 54291}},
+{5557, 16, 30197, {1, 1, 7, 3, 17, 15, 71, 29, 25, 883, 1801, 1675, 5585, 9413, 3813, 26673}},
+{5558, 16, 30213, {1, 1, 3, 15, 5, 13, 31, 41, 311, 411, 573, 281, 8075, 7163, 11817, 29121}},
+{5559, 16, 30231, {1, 1, 7, 9, 7, 57, 15, 141, 337, 123, 269, 3737, 6455, 2539, 13655, 59809}},
+{5560, 16, 30232, {1, 3, 1, 15, 15, 23, 111, 51, 429, 483, 1567, 1317, 8057, 1609, 30181, 35687}},
+{5561, 16, 30241, {1, 3, 7, 9, 25, 43, 67, 13, 319, 587, 1827, 443, 2031, 8563, 16173, 58667}},
+{5562, 16, 30253, {1, 3, 5, 13, 11, 63, 89, 105, 377, 257, 7, 4077, 5091, 5125, 25, 39033}},
+{5563, 16, 30259, {1, 3, 3, 1, 9, 29, 7, 87, 239, 469, 1851, 1711, 5797, 7137, 11405, 20175}},
+{5564, 16, 30262, {1, 3, 3, 1, 13, 17, 101, 209, 301, 95, 1181, 3091, 4451, 1241, 17057, 335}},
+{5565, 16, 30268, {1, 1, 1, 9, 31, 7, 81, 161, 391, 677, 115, 141, 5375, 7279, 1887, 1645}},
+{5566, 16, 30297, {1, 1, 1, 11, 27, 61, 3, 195, 189, 409, 1747, 331, 2931, 9535, 1369, 47233}},
+{5567, 16, 30316, {1, 3, 5, 15, 7, 15, 105, 255, 491, 689, 97, 1131, 3459, 7147, 27541, 62307}},
+{5568, 16, 30322, {1, 3, 5, 9, 5, 23, 1, 209, 233, 717, 1919, 1835, 5073, 10403, 28979, 1945}},
+{5569, 16, 30344, {1, 1, 3, 9, 3, 35, 107, 209, 255, 447, 227, 273, 443, 9367, 24105, 34095}},
+{5570, 16, 30350, {1, 1, 3, 11, 3, 33, 5, 165, 83, 787, 1555, 31, 4351, 16301, 27453, 56739}},
+{5571, 16, 30355, {1, 1, 5, 5, 29, 9, 127, 253, 281, 487, 441, 1129, 2811, 9113, 28855, 57117}},
+{5572, 16, 30429, {1, 1, 1, 13, 13, 1, 17, 143, 121, 917, 1571, 3777, 2297, 3691, 3001, 42327}},
+{5573, 16, 30445, {1, 1, 5, 1, 25, 7, 41, 245, 241, 929, 1203, 3755, 7113, 9333, 22549, 12253}},
+{5574, 16, 30477, {1, 3, 1, 11, 1, 13, 69, 73, 285, 975, 1331, 3411, 7777, 3489, 2763, 44297}},
+{5575, 16, 30513, {1, 3, 5, 11, 3, 37, 21, 105, 153, 307, 989, 627, 3127, 6169, 10573, 22139}},
+{5576, 16, 30520, {1, 3, 5, 15, 11, 11, 39, 21, 355, 437, 547, 2283, 6443, 5561, 6367, 53899}},
+{5577, 16, 30540, {1, 1, 1, 9, 25, 51, 97, 175, 131, 207, 1367, 2561, 7455, 8289, 5877, 4383}},
+{5578, 16, 30551, {1, 3, 7, 1, 29, 17, 7, 1, 43, 831, 591, 2145, 975, 909, 23107, 43987}},
+{5579, 16, 30573, {1, 3, 5, 13, 5, 47, 65, 65, 439, 807, 271, 1615, 1873, 10905, 30537, 3337}},
+{5580, 16, 30609, {1, 1, 1, 13, 29, 1, 53, 5, 307, 347, 1059, 545, 1129, 11883, 5969, 50433}},
+{5581, 16, 30622, {1, 1, 3, 5, 31, 29, 63, 201, 255, 803, 677, 1499, 1691, 14037, 18251, 6881}},
+{5582, 16, 30635, {1, 3, 1, 5, 5, 13, 13, 121, 505, 855, 467, 2803, 3297, 4689, 18443, 60757}},
+{5583, 16, 30658, {1, 1, 5, 13, 11, 19, 11, 201, 101, 431, 693, 1267, 6909, 7759, 2265, 6125}},
+{5584, 16, 30667, {1, 1, 7, 13, 9, 3, 37, 209, 269, 27, 1041, 2587, 4667, 11077, 27009, 27967}},
+{5585, 16, 30681, {1, 1, 5, 5, 1, 5, 127, 179, 463, 949, 1525, 231, 1201, 3283, 9929, 46677}},
+{5586, 16, 30684, {1, 3, 1, 15, 9, 11, 89, 129, 331, 833, 1415, 229, 2059, 13145, 30525, 33773}},
+{5587, 16, 30703, {1, 1, 7, 15, 7, 43, 95, 177, 313, 989, 483, 825, 1885, 4535, 8213, 39835}},
+{5588, 16, 30705, {1, 1, 7, 3, 19, 27, 45, 163, 17, 523, 1565, 3753, 7433, 14117, 8499, 40177}},
+{5589, 16, 30715, {1, 3, 3, 15, 23, 45, 95, 31, 55, 469, 383, 237, 6287, 5561, 20901, 48259}},
+{5590, 16, 30742, {1, 1, 3, 1, 23, 61, 101, 185, 35, 553, 463, 1169, 2875, 12491, 14327, 47999}},
+{5591, 16, 30748, {1, 3, 3, 13, 23, 29, 77, 21, 19, 3, 769, 1943, 2081, 9135, 29767, 11367}},
+{5592, 16, 30758, {1, 1, 5, 15, 5, 11, 59, 163, 355, 993, 375, 3181, 2675, 8515, 17007, 38467}},
+{5593, 16, 30767, {1, 1, 5, 13, 19, 5, 107, 83, 123, 843, 413, 2137, 7531, 3833, 6149, 55925}},
+{5594, 16, 30770, {1, 3, 1, 13, 23, 9, 41, 145, 265, 591, 1899, 3145, 5255, 13653, 12245, 25367}},
+{5595, 16, 30772, {1, 1, 3, 15, 1, 45, 119, 79, 121, 137, 1945, 2041, 2409, 1377, 29501, 29885}},
+{5596, 16, 30807, {1, 1, 7, 11, 27, 57, 75, 183, 341, 237, 1909, 2785, 5973, 9965, 21729, 45089}},
+{5597, 16, 30814, {1, 3, 5, 7, 21, 1, 41, 189, 131, 1021, 1375, 1463, 5985, 12499, 4115, 9131}},
+{5598, 16, 30824, {1, 3, 7, 15, 21, 19, 59, 171, 339, 841, 1725, 2909, 6437, 2499, 17191, 43275}},
+{5599, 16, 30857, {1, 3, 1, 1, 15, 55, 31, 199, 351, 183, 1819, 1873, 7877, 12407, 7881, 1663}},
+{5600, 16, 30875, {1, 1, 3, 15, 1, 61, 111, 61, 115, 243, 1281, 3195, 1229, 10973, 189, 36049}},
+{5601, 16, 30931, {1, 1, 3, 15, 13, 13, 3, 49, 61, 839, 1615, 1853, 3619, 7805, 25441, 8789}},
+{5602, 16, 30933, {1, 3, 1, 9, 27, 43, 7, 193, 397, 869, 1079, 1785, 6535, 1801, 29363, 59269}},
+{5603, 16, 30949, {1, 3, 5, 5, 31, 57, 37, 53, 41, 871, 809, 1235, 1011, 12979, 8749, 52151}},
+{5604, 16, 30953, {1, 1, 7, 13, 25, 59, 69, 117, 463, 587, 513, 297, 6991, 5905, 25737, 37249}},
+{5605, 16, 30982, {1, 1, 5, 1, 27, 19, 121, 97, 349, 793, 1971, 3057, 4781, 15841, 22625, 58637}},
+{5606, 16, 31010, {1, 1, 5, 5, 25, 31, 11, 133, 411, 239, 1071, 3473, 1733, 7175, 31841, 46665}},
+{5607, 16, 31012, {1, 3, 3, 13, 19, 25, 99, 175, 271, 175, 1755, 3597, 4615, 15207, 25573, 16089}},
+{5608, 16, 31039, {1, 1, 7, 11, 17, 19, 119, 91, 505, 791, 55, 2979, 7463, 10147, 23647, 33283}},
+{5609, 16, 31041, {1, 3, 1, 1, 21, 11, 43, 173, 239, 839, 1533, 1559, 549, 15621, 22133, 46387}},
+{5610, 16, 31061, {1, 1, 3, 13, 31, 15, 73, 15, 209, 267, 701, 2899, 1163, 10093, 7727, 44211}},
+{5611, 16, 31082, {1, 3, 1, 11, 29, 21, 5, 39, 421, 375, 411, 3693, 3901, 8507, 10883, 16189}},
+{5612, 16, 31087, {1, 3, 1, 7, 13, 13, 73, 167, 149, 677, 1435, 621, 2511, 13813, 13129, 55327}},
+{5613, 16, 31096, {1, 3, 5, 15, 7, 59, 83, 221, 77, 357, 281, 2689, 5629, 5837, 1701, 30811}},
+{5614, 16, 31115, {1, 3, 3, 11, 17, 1, 43, 95, 473, 981, 1487, 1337, 905, 3307, 22357, 181}},
+{5615, 16, 31130, {1, 1, 3, 7, 1, 27, 9, 3, 489, 1, 1265, 2463, 539, 12769, 825, 6149}},
+{5616, 16, 31168, {1, 3, 3, 3, 11, 27, 81, 237, 411, 241, 1613, 931, 6397, 4325, 29651, 49003}},
+{5617, 16, 31171, {1, 3, 3, 13, 1, 19, 55, 73, 47, 203, 1661, 1245, 6847, 2457, 25427, 33069}},
+{5618, 16, 31177, {1, 3, 7, 3, 7, 47, 11, 165, 391, 457, 301, 1213, 1913, 14531, 7847, 14811}},
+{5619, 16, 31180, {1, 3, 1, 9, 1, 9, 57, 203, 15, 733, 1131, 2751, 5869, 3165, 21497, 28881}},
+{5620, 16, 31191, {1, 3, 1, 5, 9, 7, 29, 85, 71, 571, 469, 2395, 2819, 8443, 2281, 50489}},
+{5621, 16, 31207, {1, 3, 5, 11, 13, 63, 47, 47, 349, 21, 861, 2217, 2945, 6967, 6605, 16459}},
+{5622, 16, 31247, {1, 1, 7, 5, 13, 3, 41, 53, 409, 289, 1225, 2965, 5283, 1785, 14443, 51755}},
+{5623, 16, 31249, {1, 3, 7, 13, 19, 1, 29, 191, 119, 37, 697, 1909, 481, 14157, 13425, 60581}},
+{5624, 16, 31285, {1, 3, 1, 13, 1, 15, 105, 79, 505, 681, 1741, 3683, 5775, 7479, 11387, 1321}},
+{5625, 16, 31303, {1, 1, 1, 11, 9, 35, 77, 73, 351, 217, 2029, 2845, 5143, 5677, 15465, 33123}},
+{5626, 16, 31310, {1, 1, 3, 3, 19, 49, 63, 109, 335, 743, 741, 1673, 3311, 3139, 25197, 13793}},
+{5627, 16, 31337, {1, 3, 1, 3, 29, 63, 79, 1, 493, 13, 1487, 4015, 6983, 1433, 26023, 55591}},
+{5628, 16, 31352, {1, 3, 3, 11, 1, 25, 57, 207, 309, 201, 1513, 1749, 3785, 9217, 11531, 40597}},
+{5629, 16, 31357, {1, 3, 7, 13, 3, 23, 69, 253, 311, 773, 807, 1063, 745, 4843, 25221, 55885}},
+{5630, 16, 31374, {1, 1, 3, 11, 29, 47, 67, 183, 11, 259, 5, 1935, 2295, 8105, 19139, 11707}},
+{5631, 16, 31379, {1, 1, 3, 3, 23, 3, 53, 165, 255, 501, 1547, 3649, 5631, 13307, 8869, 5595}},
+{5632, 16, 31388, {1, 1, 3, 5, 7, 29, 37, 223, 289, 925, 959, 309, 1479, 3141, 18661, 52123}},
+{5633, 16, 31410, {1, 3, 1, 1, 7, 59, 101, 219, 91, 793, 1103, 1485, 7547, 12889, 19097, 15613}},
+{5634, 16, 31416, {1, 1, 5, 15, 1, 17, 79, 83, 131, 683, 1611, 1635, 5405, 9621, 29489, 4801}},
+{5635, 16, 31467, {1, 1, 5, 7, 31, 63, 59, 125, 401, 261, 1445, 33, 187, 12913, 8639, 48413}},
+{5636, 16, 31495, {1, 3, 3, 13, 27, 37, 27, 99, 379, 851, 1311, 4051, 5483, 13935, 29679, 30905}},
+{5637, 16, 31504, {1, 1, 3, 1, 7, 57, 79, 23, 97, 561, 1083, 2327, 1545, 5387, 12119, 29717}},
+{5638, 16, 31507, {1, 1, 7, 7, 9, 41, 63, 165, 315, 247, 89, 2055, 7399, 1399, 2057, 39851}},
+{5639, 16, 31509, {1, 1, 1, 15, 9, 23, 7, 15, 457, 669, 661, 3269, 915, 3475, 15845, 59769}},
+{5640, 16, 31514, {1, 3, 7, 15, 17, 53, 83, 5, 457, 103, 1297, 2413, 1095, 7711, 27935, 56357}},
+{5641, 16, 31516, {1, 1, 3, 5, 17, 3, 81, 23, 165, 341, 781, 3583, 1751, 6763, 13937, 35331}},
+{5642, 16, 31530, {1, 1, 5, 11, 31, 21, 7, 63, 369, 867, 573, 45, 2781, 4507, 21553, 51933}},
+{5643, 16, 31555, {1, 1, 5, 15, 1, 37, 85, 133, 489, 733, 1471, 2089, 979, 7723, 7339, 59595}},
+{5644, 16, 31567, {1, 1, 1, 1, 7, 3, 3, 77, 137, 1009, 481, 1343, 397, 15865, 21701, 37509}},
+{5645, 16, 31570, {1, 3, 7, 5, 17, 57, 19, 245, 249, 289, 1847, 3057, 4905, 5905, 32459, 41305}},
+{5646, 16, 31586, {1, 1, 5, 1, 23, 23, 1, 177, 115, 337, 983, 421, 3135, 6319, 27109, 59641}},
+{5647, 16, 31598, {1, 3, 1, 5, 25, 1, 63, 73, 61, 967, 1567, 2645, 7347, 11877, 28777, 38507}},
+{5648, 16, 31605, {1, 1, 3, 9, 5, 41, 39, 101, 339, 337, 1079, 3861, 5049, 5601, 14377, 34093}},
+{5649, 16, 31609, {1, 3, 7, 7, 3, 47, 95, 157, 167, 1011, 1117, 3669, 7993, 11735, 8505, 64713}},
+{5650, 16, 31612, {1, 3, 1, 9, 3, 33, 11, 33, 65, 329, 401, 2659, 2851, 3903, 29791, 41613}},
+{5651, 16, 31626, {1, 1, 1, 15, 15, 17, 9, 69, 359, 41, 1475, 1919, 5829, 2189, 21295, 33255}},
+{5652, 16, 31634, {1, 3, 1, 3, 9, 23, 73, 247, 399, 775, 419, 3033, 865, 12595, 16345, 15079}},
+{5653, 16, 31655, {1, 3, 1, 5, 1, 17, 33, 23, 419, 585, 673, 929, 6955, 10247, 12647, 29107}},
+{5654, 16, 31681, {1, 3, 3, 13, 9, 33, 11, 13, 127, 529, 1219, 2401, 6459, 14745, 5123, 53023}},
+{5655, 16, 31705, {1, 3, 5, 11, 23, 11, 5, 19, 281, 121, 1671, 2171, 4545, 10691, 24875, 28849}},
+{5656, 16, 31706, {1, 3, 1, 3, 13, 25, 85, 131, 127, 977, 1599, 3319, 3107, 3185, 4879, 3455}},
+{5657, 16, 31718, {1, 1, 5, 1, 3, 13, 77, 15, 133, 185, 1319, 727, 2181, 12175, 28017, 28023}},
+{5658, 16, 31735, {1, 3, 7, 5, 29, 51, 113, 203, 331, 847, 1, 3445, 3669, 7711, 13647, 58651}},
+{5659, 16, 31741, {1, 3, 1, 3, 31, 27, 35, 199, 491, 839, 1275, 3385, 4743, 821, 26259, 11345}},
+{5660, 16, 31744, {1, 1, 7, 9, 21, 47, 9, 67, 119, 985, 127, 1987, 5451, 6403, 26183, 8349}},
+{5661, 16, 31762, {1, 3, 5, 1, 19, 3, 91, 217, 301, 595, 1789, 735, 4993, 229, 18033, 59625}},
+{5662, 16, 31774, {1, 3, 3, 3, 11, 25, 103, 211, 117, 9, 773, 1521, 2265, 8277, 23179, 22433}},
+{5663, 16, 31864, {1, 1, 7, 9, 3, 27, 63, 255, 175, 699, 293, 2409, 3155, 285, 8663, 53503}},
+{5664, 16, 31874, {1, 1, 5, 7, 27, 23, 63, 213, 323, 697, 1541, 3497, 2985, 12389, 11155, 26217}},
+{5665, 16, 31900, {1, 3, 1, 3, 31, 7, 47, 207, 185, 873, 1063, 1055, 205, 12469, 23505, 56245}},
+{5666, 16, 31910, {1, 3, 7, 13, 31, 17, 47, 95, 91, 483, 1997, 3273, 445, 2601, 15219, 10997}},
+{5667, 16, 31928, {1, 3, 3, 5, 29, 45, 29, 83, 457, 823, 1395, 1411, 1879, 9409, 11609, 32001}},
+{5668, 16, 31965, {1, 3, 5, 11, 21, 11, 43, 73, 159, 137, 29, 1957, 815, 5077, 16127, 42199}},
+{5669, 16, 31976, {1, 3, 5, 13, 9, 59, 47, 215, 293, 807, 309, 1951, 2285, 9287, 1019, 49501}},
+{5670, 16, 32016, {1, 1, 7, 13, 31, 7, 95, 189, 233, 363, 1039, 1675, 1715, 9049, 8537, 31051}},
+{5671, 16, 32032, {1, 3, 7, 9, 23, 35, 125, 251, 107, 401, 1113, 3585, 6331, 2363, 27889, 28877}},
+{5672, 16, 32037, {1, 1, 7, 13, 9, 1, 13, 69, 257, 369, 547, 1595, 1823, 9553, 25653, 31181}},
+{5673, 16, 32062, {1, 1, 7, 11, 9, 43, 3, 93, 69, 1019, 1935, 3297, 47, 7101, 1037, 63473}},
+{5674, 16, 32069, {1, 1, 7, 5, 21, 9, 97, 105, 405, 893, 1673, 3783, 2965, 7329, 4549, 25433}},
+{5675, 16, 32115, {1, 1, 5, 13, 5, 17, 31, 123, 415, 173, 1333, 2245, 1557, 16011, 28321, 4039}},
+{5676, 16, 32128, {1, 1, 5, 9, 15, 3, 27, 79, 511, 39, 945, 49, 3231, 9199, 21327, 11183}},
+{5677, 16, 32171, {1, 3, 3, 9, 3, 15, 115, 141, 387, 341, 953, 399, 6109, 12037, 21079, 26745}},
+{5678, 16, 32173, {1, 3, 3, 1, 5, 5, 31, 195, 477, 755, 687, 3811, 805, 679, 20687, 46299}},
+{5679, 16, 32182, {1, 1, 7, 15, 1, 31, 67, 159, 205, 141, 1667, 3077, 451, 13161, 16211, 6887}},
+{5680, 16, 32191, {1, 3, 3, 1, 7, 43, 87, 5, 49, 205, 231, 3957, 2947, 13199, 15743, 4681}},
+{5681, 16, 32193, {1, 3, 3, 15, 25, 37, 95, 11, 439, 553, 59, 1241, 7407, 13467, 22403, 44441}},
+{5682, 16, 32194, {1, 1, 1, 3, 21, 3, 127, 239, 491, 139, 1411, 3417, 4247, 6247, 13809, 31609}},
+{5683, 16, 32229, {1, 1, 5, 1, 9, 13, 5, 155, 109, 593, 119, 4091, 1911, 8301, 4239, 50081}},
+{5684, 16, 32230, {1, 3, 5, 13, 27, 3, 99, 225, 253, 169, 801, 3741, 1905, 12073, 31831, 17997}},
+{5685, 16, 32248, {1, 3, 7, 15, 9, 23, 93, 171, 453, 983, 1657, 1133, 6381, 5229, 32303, 17439}},
+{5686, 16, 32263, {1, 1, 7, 11, 7, 5, 125, 141, 63, 763, 1293, 1007, 4579, 1479, 11977, 59261}},
+{5687, 16, 32264, {1, 3, 1, 7, 1, 15, 49, 41, 367, 639, 1933, 401, 2335, 2441, 13653, 55555}},
+{5688, 16, 32269, {1, 3, 1, 7, 15, 23, 5, 213, 45, 721, 543, 2133, 4525, 9719, 28053, 54075}},
+{5689, 16, 32298, {1, 3, 7, 3, 11, 7, 23, 35, 169, 829, 1957, 2423, 3583, 4951, 28957, 29753}},
+{5690, 16, 32335, {1, 1, 3, 3, 1, 5, 19, 235, 175, 969, 229, 2335, 7215, 10195, 7487, 64191}},
+{5691, 16, 32340, {1, 1, 7, 3, 27, 1, 73, 49, 445, 863, 69, 3555, 993, 9553, 31941, 29901}},
+{5692, 16, 32356, {1, 3, 5, 11, 9, 25, 59, 177, 23, 997, 1041, 1135, 3879, 767, 2263, 51267}},
+{5693, 16, 32374, {1, 1, 7, 3, 1, 63, 49, 51, 237, 569, 1293, 1143, 3125, 16315, 17009, 24821}},
+{5694, 16, 32390, {1, 3, 3, 15, 11, 17, 121, 25, 349, 833, 557, 1975, 5405, 15189, 31243, 53541}},
+{5695, 16, 32401, {1, 3, 7, 9, 11, 15, 39, 15, 75, 87, 55, 2069, 3291, 507, 16925, 57751}},
+{5696, 16, 32414, {1, 1, 3, 15, 1, 21, 61, 139, 357, 931, 647, 947, 2291, 15557, 6739, 5881}},
+{5697, 16, 32417, {1, 3, 1, 9, 1, 47, 73, 59, 115, 497, 733, 1777, 905, 16181, 4351, 7345}},
+{5698, 16, 32442, {1, 3, 3, 7, 5, 21, 67, 113, 71, 743, 757, 1851, 7899, 10315, 15437, 61803}},
+{5699, 16, 32450, {1, 3, 7, 1, 9, 23, 77, 131, 395, 767, 1229, 2629, 5731, 11907, 32217, 18473}},
+{5700, 16, 32461, {1, 3, 5, 15, 1, 23, 123, 207, 291, 565, 1211, 501, 2111, 11381, 5171, 54841}},
+{5701, 16, 32473, {1, 1, 1, 15, 21, 13, 3, 175, 405, 109, 1353, 2495, 7619, 14971, 28179, 34737}},
+{5702, 16, 32479, {1, 3, 5, 3, 17, 25, 53, 71, 229, 729, 1953, 3119, 7747, 1551, 23417, 35563}},
+{5703, 16, 32530, {1, 1, 7, 7, 11, 31, 81, 43, 149, 537, 1253, 2759, 431, 4813, 8375, 46329}},
+{5704, 16, 32536, {1, 1, 1, 5, 11, 27, 61, 199, 239, 889, 723, 2353, 5663, 7385, 28165, 14675}},
+{5705, 16, 32548, {1, 3, 1, 7, 3, 3, 83, 247, 247, 57, 579, 1163, 2615, 4051, 2809, 46413}},
+{5706, 16, 32577, {1, 1, 3, 11, 13, 47, 11, 235, 475, 35, 843, 2329, 3519, 8899, 14533, 24889}},
+{5707, 16, 32628, {1, 3, 1, 1, 7, 31, 15, 101, 327, 499, 471, 1001, 339, 11863, 24787, 47191}},
+{5708, 16, 32642, {1, 1, 7, 1, 3, 55, 93, 43, 11, 65, 289, 1249, 5325, 13867, 29841, 34333}},
+{5709, 16, 32665, {1, 3, 3, 1, 25, 61, 87, 113, 115, 265, 1007, 1129, 7633, 6109, 5733, 22649}},
+{5710, 16, 32666, {1, 3, 1, 11, 31, 59, 127, 83, 33, 419, 1037, 3777, 6383, 2711, 2113, 17233}},
+{5711, 16, 32668, {1, 1, 5, 13, 11, 17, 73, 41, 257, 223, 359, 3821, 4617, 1943, 11331, 40153}},
+{5712, 16, 32696, {1, 1, 1, 1, 9, 25, 43, 179, 17, 1021, 1323, 761, 5861, 11547, 26017, 5165}},
+{5713, 16, 32722, {1, 3, 5, 3, 29, 21, 53, 111, 213, 717, 1101, 3215, 3021, 16343, 23387, 33439}},
+{5714, 16, 32757, {1, 3, 5, 13, 29, 11, 21, 89, 107, 111, 1121, 2785, 3493, 9873, 13, 40863}},
+{5715, 16, 32758, {1, 1, 5, 13, 15, 15, 111, 219, 59, 43, 333, 3581, 1311, 2799, 23987, 21637}},
+{5716, 17, 4, {1, 3, 1, 11, 21, 57, 115, 247, 499, 525, 1629, 3679, 2109, 6607, 27435, 1745, 71201}},
+{5717, 17, 7, {1, 3, 3, 3, 31, 17, 113, 165, 189, 361, 103, 1775, 3001, 3865, 30591, 2873, 17129}},
+{5718, 17, 16, {1, 1, 5, 5, 15, 47, 47, 85, 247, 471, 713, 3571, 2407, 9811, 8187, 32133, 8541}},
+{5719, 17, 22, {1, 3, 3, 1, 15, 1, 59, 151, 469, 351, 671, 2925, 7207, 5061, 28691, 4363, 50767}},
+{5720, 17, 25, {1, 1, 5, 7, 11, 35, 67, 45, 193, 3, 627, 3333, 6497, 12307, 28807, 13997, 108645}},
+{5721, 17, 31, {1, 3, 1, 1, 17, 63, 125, 185, 485, 759, 717, 1993, 6707, 3993, 2181, 8173, 18057}},
+{5722, 17, 32, {1, 1, 3, 13, 7, 15, 113, 207, 103, 191, 1895, 2595, 3873, 12021, 19259, 12553, 119119}},
+{5723, 17, 42, {1, 3, 7, 1, 17, 11, 101, 209, 315, 9, 901, 2303, 7623, 7459, 26391, 45143, 5753}},
+{5724, 17, 52, {1, 1, 5, 15, 1, 5, 71, 155, 167, 89, 145, 3483, 2385, 15205, 9193, 20637, 58473}},
+{5725, 17, 61, {1, 1, 5, 7, 25, 55, 57, 51, 333, 299, 1721, 1667, 6513, 10191, 29405, 21923, 76593}},
+{5726, 17, 70, {1, 1, 5, 1, 7, 37, 107, 91, 241, 137, 627, 2749, 5573, 11243, 26197, 4545, 105599}},
+{5727, 17, 76, {1, 3, 1, 5, 25, 37, 73, 61, 57, 249, 1953, 1385, 6479, 3701, 10693, 617, 62535}},
+{5728, 17, 81, {1, 1, 1, 15, 5, 63, 41, 151, 395, 681, 227, 3027, 8123, 15091, 15475, 35671, 21129}},
+{5729, 17, 87, {1, 3, 5, 11, 29, 21, 15, 233, 103, 463, 1829, 2257, 1717, 2249, 9599, 5097, 55705}},
+{5730, 17, 93, {1, 3, 5, 1, 29, 3, 35, 151, 193, 105, 1107, 827, 7169, 1843, 15225, 29025, 43165}},
+{5731, 17, 98, {1, 1, 7, 15, 17, 51, 93, 199, 205, 41, 113, 1081, 1571, 11471, 11057, 16149, 66905}},
+{5732, 17, 122, {1, 1, 3, 11, 5, 25, 107, 195, 51, 675, 1683, 3739, 1653, 611, 23249, 53157, 127785}},
+{5733, 17, 133, {1, 1, 7, 5, 7, 3, 25, 145, 453, 735, 441, 77, 8171, 9281, 22749, 36973, 106237}},
+{5734, 17, 134, {1, 1, 3, 13, 13, 5, 95, 33, 223, 369, 453, 2031, 3531, 6931, 8977, 54109, 115487}},
+{5735, 17, 140, {1, 1, 7, 7, 1, 61, 33, 183, 245, 623, 529, 1831, 1867, 2845, 8311, 10143, 67897}},
+{5736, 17, 146, {1, 3, 7, 11, 27, 23, 93, 9, 61, 451, 67, 1695, 4227, 2415, 19249, 44765, 24611}},
+{5737, 17, 158, {1, 3, 3, 11, 29, 57, 65, 117, 349, 149, 363, 1095, 4989, 3071, 17519, 18079, 7277}},
+{5738, 17, 171, {1, 3, 5, 9, 1, 7, 59, 87, 307, 111, 1291, 789, 7361, 6477, 11229, 36785, 33303}},
+{5739, 17, 176, {1, 3, 5, 1, 19, 47, 53, 81, 127, 849, 1479, 1459, 1889, 15087, 22115, 20587, 121005}},
+{5740, 17, 179, {1, 1, 7, 15, 31, 31, 71, 55, 253, 927, 277, 2087, 1313, 3721, 22729, 34709, 9821}},
+{5741, 17, 182, {1, 3, 5, 13, 13, 63, 73, 41, 165, 315, 1907, 2005, 691, 725, 22685, 8673, 76011}},
+{5742, 17, 191, {1, 1, 5, 9, 23, 61, 47, 167, 279, 683, 683, 1261, 4037, 15251, 9421, 45359, 38001}},
+{5743, 17, 193, {1, 1, 7, 3, 17, 33, 69, 139, 235, 709, 1475, 2483, 7559, 8581, 23965, 31153, 5097}},
+{5744, 17, 224, {1, 1, 7, 15, 23, 61, 43, 5, 433, 531, 761, 2749, 2881, 5225, 13491, 16479, 50203}},
+{5745, 17, 227, {1, 1, 3, 9, 29, 7, 9, 23, 339, 315, 1723, 779, 2983, 6571, 16025, 63055, 111103}},
+{5746, 17, 229, {1, 1, 7, 13, 23, 55, 71, 121, 297, 193, 41, 3165, 4419, 5853, 28127, 56151, 16597}},
+{5747, 17, 236, {1, 1, 5, 7, 7, 23, 93, 11, 261, 297, 1769, 1239, 2579, 531, 4423, 7891, 21729}},
+{5748, 17, 248, {1, 3, 5, 1, 13, 35, 83, 85, 125, 887, 161, 3311, 7261, 9557, 28975, 28643, 21479}},
+{5749, 17, 262, {1, 3, 5, 3, 27, 5, 47, 175, 287, 867, 141, 3079, 7583, 4997, 18271, 24097, 96319}},
+{5750, 17, 273, {1, 3, 5, 1, 21, 51, 47, 67, 211, 281, 1861, 1169, 6403, 4229, 3995, 9921, 41515}},
+{5751, 17, 276, {1, 3, 3, 11, 23, 23, 81, 55, 441, 211, 169, 3197, 7213, 7205, 15, 11771, 129091}},
+{5752, 17, 280, {1, 3, 7, 3, 23, 39, 23, 163, 253, 1005, 1775, 3393, 7659, 8065, 30021, 61065, 35171}},
+{5753, 17, 283, {1, 3, 1, 1, 29, 29, 39, 143, 191, 711, 1077, 13, 4137, 15425, 11139, 1269, 71915}},
+{5754, 17, 290, {1, 3, 3, 5, 11, 41, 101, 127, 301, 335, 45, 2065, 5835, 7801, 2639, 5735, 63445}},
+{5755, 17, 309, {1, 3, 5, 9, 3, 39, 51, 53, 489, 663, 951, 3931, 3075, 753, 22179, 20573, 10775}},
+{5756, 17, 316, {1, 3, 3, 15, 13, 31, 1, 237, 79, 587, 395, 591, 607, 13105, 21301, 26829, 112181}},
+{5757, 17, 319, {1, 1, 7, 7, 5, 55, 31, 117, 247, 229, 247, 307, 3821, 6483, 31317, 22975, 40535}},
+{5758, 17, 321, {1, 3, 7, 15, 15, 59, 101, 17, 437, 373, 1727, 471, 2783, 7825, 24555, 58765, 5097}},
+{5759, 17, 328, {1, 1, 3, 9, 31, 27, 71, 147, 71, 871, 793, 2363, 3213, 13383, 29801, 53187, 70021}},
+{5760, 17, 346, {1, 3, 1, 1, 19, 47, 121, 61, 303, 565, 1371, 3703, 2201, 6835, 26041, 56039, 80227}},
+{5761, 17, 355, {1, 1, 5, 5, 3, 45, 91, 61, 257, 947, 1449, 4031, 4925, 8627, 11909, 9529, 3429}},
+{5762, 17, 367, {1, 1, 1, 7, 9, 63, 69, 233, 141, 361, 1443, 2157, 2877, 643, 2779, 8109, 126911}},
+{5763, 17, 369, {1, 1, 5, 1, 5, 3, 67, 157, 21, 1, 361, 35, 1475, 12877, 22169, 6653, 85005}},
+{5764, 17, 372, {1, 1, 7, 9, 25, 1, 7, 175, 47, 963, 405, 3955, 3905, 8429, 8483, 62037, 11323}},
+{5765, 17, 382, {1, 1, 5, 11, 29, 23, 77, 211, 319, 745, 1935, 2429, 1687, 2173, 1571, 19457, 117777}},
+{5766, 17, 388, {1, 1, 7, 5, 15, 57, 121, 189, 303, 79, 527, 1801, 71, 9857, 14197, 59007, 75341}},
+{5767, 17, 392, {1, 3, 3, 5, 25, 3, 19, 141, 155, 157, 287, 769, 5789, 8443, 31823, 1019, 79111}},
+{5768, 17, 395, {1, 1, 5, 11, 27, 27, 117, 141, 355, 1023, 869, 995, 6311, 6573, 11721, 1565, 35517}},
+{5769, 17, 397, {1, 1, 1, 9, 1, 33, 107, 51, 41, 889, 1191, 1055, 503, 14779, 6641, 58117, 74157}},
+{5770, 17, 403, {1, 1, 7, 5, 13, 39, 39, 33, 293, 75, 963, 3379, 1847, 12371, 9005, 38107, 69753}},
+{5771, 17, 409, {1, 1, 5, 5, 7, 37, 19, 241, 427, 635, 1711, 3835, 773, 10525, 17207, 1675, 127255}},
+{5772, 17, 410, {1, 1, 3, 7, 17, 19, 11, 113, 191, 947, 1133, 3173, 213, 10125, 1373, 56797, 111011}},
+{5773, 17, 425, {1, 3, 1, 1, 29, 45, 65, 237, 223, 695, 697, 3197, 6887, 8079, 22099, 12079, 54847}},
+{5774, 17, 443, {1, 3, 3, 7, 5, 47, 19, 215, 341, 863, 1879, 571, 7113, 2465, 23407, 52555, 44375}},
+{5775, 17, 472, {1, 3, 5, 11, 25, 31, 109, 73, 429, 553, 1905, 1753, 6733, 4433, 13785, 32041, 27115}},
+{5776, 17, 475, {1, 1, 1, 3, 27, 5, 97, 47, 343, 977, 1241, 721, 3355, 3559, 28349, 56389, 63103}},
+{5777, 17, 481, {1, 3, 3, 9, 21, 53, 57, 211, 73, 155, 1855, 715, 3179, 5963, 10061, 35141, 63131}},
+{5778, 17, 488, {1, 3, 1, 15, 21, 25, 51, 73, 31, 25, 1385, 637, 6585, 49, 2105, 6829, 9353}},
+{5779, 17, 493, {1, 1, 7, 5, 11, 55, 31, 69, 145, 637, 1131, 2175, 3547, 13031, 2131, 12361, 74737}},
+{5780, 17, 501, {1, 3, 3, 5, 31, 7, 119, 119, 309, 925, 895, 3813, 1131, 4765, 17865, 48707, 113577}},
+{5781, 17, 515, {1, 3, 3, 9, 13, 33, 127, 177, 323, 727, 1881, 775, 7329, 11881, 28309, 987, 116093}},
+{5782, 17, 522, {1, 1, 3, 5, 31, 55, 39, 41, 511, 157, 1655, 2991, 3633, 8521, 27049, 18771, 54015}},
+{5783, 17, 524, {1, 3, 5, 13, 11, 45, 113, 185, 375, 661, 1331, 4013, 5521, 1037, 23365, 30239, 76957}},
+{5784, 17, 527, {1, 3, 3, 7, 19, 7, 23, 17, 435, 913, 1985, 353, 6049, 7549, 3371, 60867, 41099}},
+{5785, 17, 535, {1, 3, 3, 15, 17, 9, 53, 127, 149, 849, 1181, 2237, 1345, 539, 19715, 26277, 125445}},
+{5786, 17, 542, {1, 1, 1, 3, 1, 9, 67, 79, 79, 795, 1793, 3167, 5917, 5323, 22043, 22007, 3917}},
+{5787, 17, 545, {1, 3, 5, 9, 15, 19, 59, 37, 141, 145, 413, 1095, 7709, 669, 27061, 40171, 101499}},
+{5788, 17, 555, {1, 3, 1, 1, 9, 49, 109, 7, 119, 861, 875, 1049, 4125, 6113, 15699, 6105, 48799}},
+{5789, 17, 558, {1, 1, 3, 9, 11, 29, 43, 175, 371, 357, 1181, 3933, 43, 4559, 10333, 23603, 83095}},
+{5790, 17, 560, {1, 3, 3, 9, 9, 7, 57, 61, 409, 143, 591, 761, 4107, 8117, 1051, 4471, 91771}},
+{5791, 17, 563, {1, 1, 3, 11, 3, 53, 119, 21, 213, 219, 51, 3491, 7143, 937, 24693, 3211, 99463}},
+{5792, 17, 570, {1, 1, 3, 3, 1, 47, 53, 153, 211, 523, 1637, 3351, 3753, 12489, 31825, 27613, 96431}},
+{5793, 17, 578, {1, 1, 5, 15, 23, 57, 81, 231, 147, 9, 1043, 3157, 1463, 4835, 22435, 57407, 59615}},
+{5794, 17, 583, {1, 3, 3, 13, 15, 63, 111, 5, 449, 957, 1175, 2887, 7741, 8975, 28775, 4067, 69283}},
+{5795, 17, 590, {1, 3, 1, 1, 5, 61, 109, 211, 349, 179, 951, 153, 3147, 7555, 27037, 59829, 16077}},
+{5796, 17, 597, {1, 3, 3, 7, 15, 33, 53, 61, 309, 991, 227, 3437, 3983, 14559, 13065, 46387, 49105}},
+{5797, 17, 604, {1, 3, 5, 3, 25, 23, 97, 139, 315, 601, 1179, 1083, 6799, 1813, 15511, 60433, 65641}},
+{5798, 17, 608, {1, 1, 7, 1, 11, 43, 87, 87, 173, 161, 91, 3011, 1869, 2313, 13691, 3509, 39433}},
+{5799, 17, 614, {1, 3, 5, 7, 15, 5, 39, 251, 269, 819, 815, 2283, 5635, 6953, 27017, 65143, 45281}},
+{5800, 17, 635, {1, 3, 7, 9, 1, 37, 9, 57, 467, 37, 1743, 4031, 3751, 8105, 23789, 46847, 21911}},
+{5801, 17, 637, {1, 1, 7, 1, 23, 47, 63, 99, 59, 951, 1837, 2829, 161, 857, 4045, 9945, 53487}},
+{5802, 17, 653, {1, 3, 7, 7, 11, 47, 43, 99, 279, 945, 1189, 2091, 4597, 183, 15527, 7151, 112403}},
+{5803, 17, 654, {1, 3, 3, 15, 9, 53, 63, 135, 119, 95, 131, 2461, 157, 10631, 20847, 51699, 58865}},
+{5804, 17, 659, {1, 1, 3, 1, 25, 3, 115, 29, 303, 361, 1529, 3993, 5899, 11501, 4463, 47121, 75333}},
+{5805, 17, 666, {1, 3, 1, 15, 9, 39, 31, 199, 305, 279, 15, 611, 561, 6593, 3189, 1863, 61875}},
+{5806, 17, 671, {1, 3, 5, 15, 5, 49, 87, 17, 87, 5, 1179, 1351, 7647, 7529, 15901, 30351, 31959}},
+{5807, 17, 689, {1, 3, 3, 9, 31, 57, 127, 239, 349, 773, 547, 2649, 1309, 8071, 10741, 57645, 14423}},
+{5808, 17, 690, {1, 1, 5, 9, 5, 15, 59, 185, 315, 411, 1425, 3905, 853, 12393, 21, 15195, 114291}},
+{5809, 17, 695, {1, 3, 1, 5, 29, 47, 19, 203, 319, 673, 1169, 2413, 5295, 6251, 19883, 2725, 28937}},
+{5810, 17, 713, {1, 3, 1, 5, 21, 55, 19, 185, 103, 827, 117, 341, 3315, 5625, 345, 63845, 49081}},
+{5811, 17, 722, {1, 1, 7, 9, 27, 51, 105, 15, 243, 735, 1221, 1641, 293, 14423, 5363, 60873, 66223}},
+{5812, 17, 733, {1, 1, 5, 1, 19, 5, 109, 131, 131, 67, 231, 2907, 4389, 5079, 20503, 59045, 33625}},
+{5813, 17, 758, {1, 3, 1, 5, 5, 15, 79, 67, 287, 225, 519, 1543, 2389, 671, 7767, 62625, 61639}},
+{5814, 17, 770, {1, 1, 1, 9, 25, 35, 83, 15, 291, 207, 1757, 3691, 5669, 11255, 27939, 57813, 46251}},
+{5815, 17, 782, {1, 3, 1, 1, 29, 3, 83, 109, 323, 179, 1855, 3205, 7665, 16201, 13863, 16347, 98977}},
+{5816, 17, 784, {1, 3, 1, 13, 17, 1, 101, 183, 153, 985, 125, 999, 855, 15897, 19491, 8953, 23277}},
+{5817, 17, 793, {1, 1, 7, 11, 9, 33, 45, 229, 411, 155, 537, 3037, 1785, 11719, 8589, 16617, 47339}},
+{5818, 17, 803, {1, 1, 5, 5, 9, 11, 7, 163, 305, 621, 1647, 2609, 7901, 14421, 23447, 1205, 52681}},
+{5819, 17, 805, {1, 3, 3, 1, 7, 29, 39, 227, 419, 561, 129, 3299, 3123, 4243, 18689, 12335, 71783}},
+{5820, 17, 812, {1, 3, 1, 9, 11, 61, 65, 207, 123, 763, 485, 1943, 3617, 415, 22397, 58597, 128017}},
+{5821, 17, 838, {1, 1, 5, 13, 25, 43, 115, 73, 269, 137, 1765, 705, 1705, 16137, 22751, 60021, 4333}},
+{5822, 17, 849, {1, 1, 5, 13, 3, 57, 9, 141, 75, 695, 597, 3435, 1085, 4905, 19625, 16061, 12111}},
+{5823, 17, 875, {1, 1, 5, 9, 29, 13, 119, 251, 353, 421, 1955, 3503, 2605, 2587, 12503, 46419, 128815}},
+{5824, 17, 877, {1, 3, 5, 7, 7, 29, 67, 25, 37, 327, 1607, 1899, 1691, 5801, 17441, 9755, 24993}},
+{5825, 17, 880, {1, 1, 3, 11, 17, 29, 121, 201, 371, 597, 213, 2361, 6615, 169, 24801, 56175, 129241}},
+{5826, 17, 892, {1, 3, 5, 1, 31, 63, 85, 77, 151, 599, 103, 677, 4431, 12897, 6373, 40349, 100819}},
+{5827, 17, 895, {1, 3, 5, 9, 25, 9, 119, 219, 379, 939, 1907, 945, 5819, 7433, 32519, 56493, 50441}},
+{5828, 17, 899, {1, 1, 3, 9, 13, 1, 63, 189, 135, 839, 1821, 2247, 2547, 965, 6847, 63335, 32921}},
+{5829, 17, 919, {1, 3, 5, 13, 21, 25, 111, 37, 319, 469, 1999, 1637, 8167, 2641, 24615, 63713, 115923}},
+{5830, 17, 920, {1, 3, 5, 9, 9, 27, 1, 63, 275, 223, 1675, 3833, 7377, 9755, 6279, 37161, 108805}},
+{5831, 17, 932, {1, 3, 3, 13, 29, 23, 21, 73, 401, 863, 701, 2527, 4557, 5549, 22493, 6651, 39167}},
+{5832, 17, 935, {1, 1, 3, 15, 25, 21, 97, 25, 83, 925, 2029, 3789, 3241, 7617, 13699, 31123, 124619}},
+{5833, 17, 936, {1, 3, 7, 5, 23, 7, 95, 227, 123, 215, 359, 2099, 4505, 8477, 32665, 18211, 99679}},
+{5834, 17, 941, {1, 3, 1, 9, 11, 57, 75, 17, 105, 175, 831, 1033, 5425, 8419, 16163, 23901, 33889}},
+{5835, 17, 950, {1, 1, 7, 1, 17, 49, 71, 23, 129, 413, 333, 2547, 4627, 14961, 16745, 53649, 73059}},
+{5836, 17, 961, {1, 3, 5, 3, 13, 33, 121, 147, 443, 187, 1949, 319, 8141, 14359, 11203, 53569, 70415}},
+{5837, 17, 962, {1, 3, 1, 11, 15, 1, 23, 29, 509, 985, 1217, 3755, 385, 3697, 24631, 37619, 62435}},
+{5838, 17, 971, {1, 3, 3, 3, 17, 11, 107, 37, 227, 913, 259, 2799, 3249, 2347, 9703, 52741, 101187}},
+{5839, 17, 982, {1, 1, 5, 13, 25, 25, 47, 77, 405, 415, 1947, 1675, 5079, 1333, 10059, 32033, 88975}},
+{5840, 17, 986, {1, 3, 5, 9, 27, 7, 19, 241, 445, 205, 333, 285, 7997, 6339, 29643, 10229, 29965}},
+{5841, 17, 1012, {1, 3, 5, 11, 17, 9, 91, 223, 173, 1013, 779, 3967, 781, 5471, 4309, 24795, 99203}},
+{5842, 17, 1021, {1, 1, 1, 3, 19, 53, 7, 159, 351, 515, 223, 3375, 1, 4985, 16729, 43333, 85917}},
+{5843, 17, 1024, {1, 3, 3, 1, 19, 35, 95, 69, 19, 157, 1177, 579, 7109, 3499, 3219, 26641, 49491}},
+{5844, 17, 1029, {1, 3, 3, 5, 25, 21, 125, 5, 39, 857, 615, 2925, 2005, 5503, 25523, 36711, 30939}},
+{5845, 17, 1030, {1, 3, 1, 5, 11, 33, 29, 5, 425, 125, 939, 1641, 321, 1023, 12551, 4587, 116617}},
+{5846, 17, 1051, {1, 3, 3, 13, 9, 59, 93, 137, 103, 517, 1555, 13, 7965, 13629, 14339, 37425, 65891}},
+{5847, 17, 1054, {1, 3, 7, 1, 31, 31, 87, 237, 365, 951, 267, 2019, 5085, 6133, 29371, 50319, 94313}},
+{5848, 17, 1064, {1, 3, 5, 7, 17, 19, 23, 225, 501, 189, 1291, 603, 6873, 8633, 11425, 30565, 26355}},
+{5849, 17, 1067, {1, 3, 7, 11, 23, 17, 91, 111, 415, 225, 1287, 2081, 4683, 12069, 3627, 32281, 17995}},
+{5850, 17, 1082, {1, 1, 5, 15, 25, 59, 75, 203, 179, 405, 1711, 3147, 7483, 5583, 3729, 11765, 61019}},
+{5851, 17, 1096, {1, 3, 3, 9, 3, 43, 65, 7, 269, 33, 829, 1789, 967, 13119, 26329, 16937, 18533}},
+{5852, 17, 1116, {1, 1, 3, 15, 11, 39, 73, 11, 31, 143, 1913, 1227, 1363, 11831, 28687, 50489, 106373}},
+{5853, 17, 1119, {1, 1, 3, 3, 25, 19, 15, 11, 349, 1011, 421, 3193, 3665, 6149, 20729, 6997, 51437}},
+{5854, 17, 1129, {1, 3, 5, 9, 13, 63, 73, 55, 417, 223, 1753, 2913, 4809, 3947, 10769, 5751, 93867}},
+{5855, 17, 1130, {1, 3, 7, 13, 31, 39, 39, 133, 483, 839, 1137, 3303, 7285, 4309, 24079, 60529, 103337}},
+{5856, 17, 1132, {1, 1, 3, 7, 1, 55, 3, 253, 435, 589, 1949, 1461, 513, 381, 29455, 4263, 16831}},
+{5857, 17, 1137, {1, 1, 1, 15, 25, 19, 77, 101, 299, 187, 1021, 1533, 8021, 4165, 2277, 18927, 110439}},
+{5858, 17, 1147, {1, 1, 1, 11, 9, 35, 71, 159, 409, 527, 15, 4073, 5749, 8563, 2503, 53015, 111581}},
+{5859, 17, 1150, {1, 1, 7, 5, 21, 47, 113, 23, 477, 559, 543, 409, 4701, 11479, 30761, 8373, 87777}},
+{5860, 17, 1154, {1, 3, 5, 13, 9, 27, 25, 137, 81, 37, 799, 857, 3539, 4471, 15753, 59015, 48589}},
+{5861, 17, 1165, {1, 1, 3, 7, 11, 57, 103, 83, 209, 71, 193, 3251, 4839, 13959, 32009, 6471, 23631}},
+{5862, 17, 1166, {1, 1, 7, 11, 25, 33, 85, 31, 371, 253, 1667, 1627, 6159, 10039, 15177, 52121, 39475}},
+{5863, 17, 1174, {1, 1, 5, 9, 13, 55, 37, 13, 95, 113, 1895, 1525, 1907, 6361, 5863, 27767, 108143}},
+{5864, 17, 1177, {1, 1, 3, 13, 21, 5, 53, 39, 485, 171, 1355, 2117, 3127, 6467, 31697, 45343, 111477}},
+{5865, 17, 1184, {1, 1, 7, 15, 13, 57, 11, 231, 329, 703, 1823, 2983, 215, 2835, 19719, 56637, 126169}},
+{5866, 17, 1194, {1, 3, 5, 15, 13, 51, 13, 173, 301, 867, 127, 2391, 2795, 4945, 13293, 49947, 10765}},
+{5867, 17, 1204, {1, 3, 3, 9, 23, 5, 29, 165, 467, 599, 1181, 3213, 4069, 5473, 8937, 51495, 42611}},
+{5868, 17, 1208, {1, 1, 7, 15, 5, 5, 31, 125, 397, 519, 1465, 115, 7877, 7025, 14213, 50343, 85827}},
+{5869, 17, 1213, {1, 3, 7, 3, 25, 59, 95, 103, 101, 347, 95, 3, 1251, 15109, 12615, 7511, 56789}},
+{5870, 17, 1219, {1, 3, 5, 9, 13, 59, 71, 19, 107, 73, 345, 3177, 6519, 2407, 18033, 31075, 113185}},
+{5871, 17, 1233, {1, 1, 1, 3, 27, 37, 5, 219, 169, 149, 355, 549, 1811, 11351, 22627, 53931, 88619}},
+{5872, 17, 1264, {1, 3, 1, 3, 27, 7, 9, 97, 399, 947, 1393, 3917, 5439, 15845, 19465, 30123, 69099}},
+{5873, 17, 1267, {1, 1, 7, 9, 13, 25, 107, 45, 111, 409, 967, 3359, 2499, 1703, 20763, 45187, 16265}},
+{5874, 17, 1281, {1, 1, 1, 13, 5, 49, 43, 249, 49, 947, 597, 1773, 2387, 2693, 15297, 57969, 53385}},
+{5875, 17, 1312, {1, 1, 7, 15, 27, 25, 27, 121, 421, 781, 143, 817, 7335, 14211, 139, 55601, 56671}},
+{5876, 17, 1321, {1, 3, 1, 5, 29, 47, 77, 23, 413, 931, 785, 1221, 769, 13131, 26955, 56441, 85745}},
+{5877, 17, 1330, {1, 1, 1, 11, 27, 3, 53, 21, 467, 43, 1533, 1053, 691, 6369, 8325, 51087, 71261}},
+{5878, 17, 1332, {1, 1, 3, 15, 7, 9, 43, 225, 293, 143, 1049, 3095, 6119, 3165, 9913, 26023, 62657}},
+{5879, 17, 1335, {1, 3, 7, 9, 11, 39, 99, 193, 217, 941, 259, 3811, 6757, 281, 10377, 46961, 48949}},
+{5880, 17, 1341, {1, 1, 1, 1, 25, 1, 99, 61, 495, 861, 2013, 487, 2821, 12921, 30111, 27213, 97363}},
+{5881, 17, 1356, {1, 1, 5, 9, 23, 33, 103, 237, 161, 721, 2021, 159, 995, 475, 20615, 30961, 31767}},
+{5882, 17, 1371, {1, 3, 1, 1, 5, 59, 63, 139, 451, 789, 1285, 655, 5501, 273, 21061, 35937, 20811}},
+{5883, 17, 1377, {1, 3, 3, 9, 9, 15, 121, 233, 287, 929, 1605, 1243, 417, 1695, 29903, 28699, 85981}},
+{5884, 17, 1380, {1, 3, 3, 5, 7, 25, 27, 253, 469, 255, 285, 2467, 4897, 4079, 29759, 50351, 76451}},
+{5885, 17, 1384, {1, 1, 3, 3, 5, 33, 29, 209, 291, 967, 1429, 1953, 5957, 14065, 8875, 32675, 4629}},
+{5886, 17, 1395, {1, 3, 5, 9, 7, 31, 97, 21, 177, 485, 1115, 4051, 6683, 7761, 30181, 37531, 51789}},
+{5887, 17, 1397, {1, 1, 7, 3, 25, 51, 23, 183, 57, 699, 1245, 2519, 2783, 4457, 6381, 43199, 40071}},
+{5888, 17, 1411, {1, 3, 5, 5, 19, 55, 45, 101, 299, 461, 1009, 319, 7335, 7769, 5479, 61113, 7937}},
+{5889, 17, 1414, {1, 1, 7, 3, 29, 21, 55, 55, 437, 771, 363, 683, 4299, 15569, 13813, 40663, 86285}},
+{5890, 17, 1426, {1, 1, 1, 13, 31, 35, 93, 175, 451, 387, 1145, 3367, 3833, 13495, 11019, 48925, 85721}},
+{5891, 17, 1432, {1, 1, 7, 15, 31, 21, 55, 205, 117, 895, 535, 2627, 1473, 10779, 24493, 42999, 130805}},
+{5892, 17, 1435, {1, 1, 3, 13, 27, 11, 45, 37, 193, 237, 1505, 1405, 3613, 9565, 3037, 53643, 85211}},
+{5893, 17, 1437, {1, 1, 3, 13, 9, 17, 19, 27, 117, 503, 65, 1033, 7891, 4005, 9229, 20999, 96601}},
+{5894, 17, 1442, {1, 3, 3, 5, 17, 3, 71, 79, 145, 985, 935, 3997, 6239, 12511, 13895, 65031, 126383}},
+{5895, 17, 1454, {1, 1, 5, 1, 23, 55, 3, 105, 71, 243, 1479, 111, 7103, 10753, 26193, 35833, 14583}},
+{5896, 17, 1468, {1, 3, 3, 3, 15, 3, 73, 125, 267, 29, 1775, 1437, 8091, 10891, 25731, 54381, 12821}},
+{5897, 17, 1473, {1, 1, 1, 3, 23, 15, 67, 123, 401, 347, 807, 1097, 31, 11209, 8727, 58149, 129099}},
+{5898, 17, 1488, {1, 3, 3, 7, 7, 61, 49, 129, 423, 535, 135, 3587, 233, 4509, 23209, 59203, 41297}},
+{5899, 17, 1491, {1, 3, 1, 7, 5, 29, 65, 31, 335, 855, 835, 1421, 3081, 14219, 16321, 48269, 41603}},
+{5900, 17, 1509, {1, 1, 1, 13, 3, 21, 5, 117, 163, 603, 1519, 3789, 7873, 10981, 4615, 9165, 83929}},
+{5901, 17, 1524, {1, 3, 5, 11, 15, 21, 75, 151, 193, 757, 647, 1603, 333, 10515, 22771, 55459, 3315}},
+{5902, 17, 1533, {1, 1, 7, 1, 27, 3, 63, 197, 271, 175, 1599, 2119, 1031, 8671, 10893, 35641, 94535}},
+{5903, 17, 1555, {1, 1, 1, 15, 1, 59, 93, 17, 5, 213, 1663, 941, 435, 8107, 1963, 34951, 106181}},
+{5904, 17, 1567, {1, 1, 5, 11, 13, 35, 111, 97, 267, 737, 2023, 1301, 7407, 11249, 31785, 31933, 20673}},
+{5905, 17, 1571, {1, 3, 3, 15, 5, 15, 29, 63, 189, 687, 27, 2005, 7129, 11377, 23175, 42389, 30933}},
+{5906, 17, 1586, {1, 1, 1, 9, 13, 63, 7, 155, 67, 291, 1419, 755, 2623, 4749, 22971, 7545, 55711}},
+{5907, 17, 1592, {1, 3, 7, 7, 23, 29, 83, 151, 213, 201, 157, 3051, 6553, 6401, 15931, 47941, 22869}},
+{5908, 17, 1595, {1, 3, 5, 5, 7, 45, 33, 155, 225, 25, 49, 2419, 4241, 6835, 11401, 50725, 118343}},
+{5909, 17, 1600, {1, 1, 3, 13, 31, 27, 37, 41, 19, 375, 1771, 1789, 2313, 2577, 12615, 22715, 22179}},
+{5910, 17, 1606, {1, 3, 1, 11, 17, 53, 55, 229, 235, 837, 143, 3583, 2789, 5471, 6515, 44565, 8619}},
+{5911, 17, 1627, {1, 1, 5, 15, 5, 17, 23, 95, 217, 551, 353, 27, 3973, 2547, 27903, 50611, 72277}},
+{5912, 17, 1648, {1, 1, 3, 7, 5, 13, 41, 111, 157, 215, 1327, 3073, 1871, 11875, 24239, 40527, 97637}},
+{5913, 17, 1651, {1, 3, 1, 1, 29, 63, 111, 187, 369, 395, 1197, 3229, 4353, 14715, 29671, 50503, 89321}},
+{5914, 17, 1654, {1, 3, 1, 1, 5, 63, 11, 39, 171, 209, 463, 3421, 3451, 4453, 14397, 2219, 98261}},
+{5915, 17, 1667, {1, 3, 3, 5, 1, 1, 13, 101, 67, 815, 1521, 1543, 7221, 7337, 10765, 30029, 47881}},
+{5916, 17, 1669, {1, 1, 5, 7, 9, 9, 33, 197, 439, 893, 961, 11, 4319, 14265, 24839, 33581, 35531}},
+{5917, 17, 1674, {1, 3, 3, 15, 29, 35, 43, 229, 313, 369, 955, 1069, 2939, 12623, 20373, 1533, 9105}},
+{5918, 17, 1687, {1, 3, 1, 7, 21, 7, 127, 243, 103, 353, 859, 3789, 4369, 12063, 22369, 14531, 94289}},
+{5919, 17, 1698, {1, 3, 5, 15, 1, 27, 65, 127, 229, 99, 627, 2693, 7173, 7305, 29971, 7097, 10113}},
+{5920, 17, 1710, {1, 1, 5, 15, 3, 47, 61, 29, 155, 725, 1727, 2667, 7003, 16277, 21983, 21365, 129365}},
+{5921, 17, 1717, {1, 1, 5, 7, 27, 61, 115, 133, 137, 661, 1201, 2151, 367, 3567, 12885, 62143, 53955}},
+{5922, 17, 1722, {1, 1, 1, 11, 9, 41, 113, 103, 469, 687, 1541, 3679, 6833, 10493, 32747, 39909, 121445}},
+{5923, 17, 1735, {1, 1, 7, 5, 5, 5, 91, 91, 5, 405, 529, 3999, 6783, 2387, 16621, 12919, 8659}},
+{5924, 17, 1741, {1, 1, 7, 13, 21, 47, 125, 155, 83, 913, 1833, 4027, 6657, 7031, 31231, 58201, 88943}},
+{5925, 17, 1749, {1, 3, 7, 3, 17, 55, 25, 29, 181, 205, 1173, 1081, 6475, 5037, 18461, 22487, 114131}},
+{5926, 17, 1750, {1, 1, 7, 7, 25, 63, 101, 103, 171, 191, 1863, 3441, 2515, 14179, 30123, 19145, 31669}},
+{5927, 17, 1769, {1, 3, 7, 11, 29, 49, 73, 163, 415, 821, 1809, 723, 7049, 14565, 4829, 19395, 61131}},
+{5928, 17, 1775, {1, 1, 7, 9, 5, 25, 103, 167, 381, 757, 813, 471, 3021, 6619, 20929, 38133, 129505}},
+{5929, 17, 1777, {1, 1, 5, 13, 25, 61, 59, 199, 257, 999, 169, 3289, 7181, 2049, 2185, 39045, 102703}},
+{5930, 17, 1778, {1, 1, 3, 1, 21, 1, 111, 125, 289, 33, 701, 3491, 5569, 8055, 23149, 26793, 102563}},
+{5931, 17, 1792, {1, 1, 7, 3, 25, 15, 105, 235, 307, 201, 1947, 699, 2519, 10615, 29345, 17061, 112949}},
+{5932, 17, 1797, {1, 3, 3, 15, 19, 1, 93, 173, 399, 13, 269, 1189, 523, 5145, 32731, 54087, 94123}},
+{5933, 17, 1802, {1, 3, 1, 15, 9, 41, 59, 79, 217, 833, 1993, 2429, 3599, 6919, 30911, 12615, 67947}},
+{5934, 17, 1822, {1, 3, 3, 13, 31, 9, 95, 37, 343, 955, 1363, 3851, 4091, 13165, 15241, 14853, 35747}},
+{5935, 17, 1825, {1, 1, 3, 5, 27, 39, 37, 217, 385, 473, 1997, 2247, 7353, 1503, 9003, 15055, 27289}},
+{5936, 17, 1831, {1, 3, 7, 11, 1, 13, 21, 243, 375, 91, 1295, 1661, 203, 15251, 15355, 16065, 24183}},
+{5937, 17, 1838, {1, 3, 1, 13, 11, 45, 85, 5, 275, 741, 1395, 4011, 7987, 16087, 24113, 50555, 128147}},
+{5938, 17, 1852, {1, 1, 1, 7, 3, 11, 13, 189, 55, 151, 395, 657, 807, 11973, 26297, 13043, 109641}},
+{5939, 17, 1855, {1, 1, 7, 13, 31, 19, 33, 235, 491, 647, 1115, 2299, 6381, 7525, 2237, 36197, 126457}},
+{5940, 17, 1860, {1, 3, 5, 1, 21, 15, 53, 231, 77, 347, 969, 141, 4501, 9429, 1815, 50887, 74581}},
+{5941, 17, 1867, {1, 1, 1, 9, 29, 43, 47, 103, 327, 131, 927, 441, 7517, 7277, 21065, 409, 50351}},
+{5942, 17, 1869, {1, 1, 5, 1, 11, 13, 103, 157, 239, 69, 1347, 477, 5017, 9723, 28133, 65135, 12359}},
+{5943, 17, 1875, {1, 1, 1, 13, 17, 63, 117, 189, 323, 565, 927, 1727, 5337, 13243, 5739, 31241, 14209}},
+{5944, 17, 1882, {1, 1, 3, 9, 29, 9, 103, 61, 467, 217, 1367, 2405, 5355, 5743, 31469, 30149, 98775}},
+{5945, 17, 1903, {1, 1, 1, 15, 23, 23, 17, 229, 103, 583, 179, 115, 7081, 9437, 32623, 62639, 72391}},
+{5946, 17, 1908, {1, 1, 5, 11, 11, 39, 97, 209, 115, 107, 593, 2347, 1445, 6179, 32011, 8435, 65847}},
+{5947, 17, 1917, {1, 3, 7, 3, 29, 27, 55, 111, 27, 731, 995, 1871, 5017, 1485, 11313, 2559, 6561}},
+{5948, 17, 1927, {1, 3, 1, 3, 27, 9, 103, 247, 83, 197, 517, 1629, 2189, 7255, 183, 35111, 15077}},
+{5949, 17, 1941, {1, 3, 7, 5, 31, 37, 87, 223, 343, 331, 1361, 3371, 2007, 13235, 10897, 63839, 109837}},
+{5950, 17, 1945, {1, 1, 7, 11, 17, 5, 41, 197, 489, 625, 1595, 2663, 5941, 14029, 30999, 16781, 116001}},
+{5951, 17, 1948, {1, 3, 3, 7, 19, 19, 61, 175, 125, 609, 1391, 147, 3001, 4189, 10133, 24031, 46219}},
+{5952, 17, 1962, {1, 1, 3, 13, 13, 57, 117, 181, 299, 939, 583, 3151, 829, 6561, 30449, 12211, 107879}},
+{5953, 17, 1975, {1, 1, 5, 11, 23, 45, 87, 115, 259, 613, 1001, 171, 57, 13789, 22173, 56837, 26263}},
+{5954, 17, 1976, {1, 1, 3, 3, 7, 43, 45, 131, 87, 251, 1411, 2737, 2739, 4595, 12561, 12043, 82885}},
+{5955, 17, 1987, {1, 3, 3, 7, 19, 39, 87, 223, 461, 37, 283, 3937, 6193, 10887, 11509, 41131, 38359}},
+{5956, 17, 1993, {1, 3, 1, 11, 11, 37, 25, 133, 105, 1013, 925, 3301, 239, 16295, 4831, 8649, 125767}},
+{5957, 17, 2004, {1, 3, 3, 11, 25, 11, 41, 155, 1, 717, 1587, 635, 279, 1803, 14817, 28669, 88835}},
+{5958, 17, 2020, {1, 3, 3, 11, 29, 17, 39, 51, 13, 871, 1197, 2561, 6671, 8465, 22709, 15933, 15923}},
+{5959, 17, 2029, {1, 3, 7, 1, 13, 17, 57, 43, 267, 261, 901, 241, 3767, 15053, 11017, 36321, 72497}},
+{5960, 17, 2030, {1, 3, 1, 15, 23, 13, 17, 63, 171, 919, 1387, 2673, 7605, 8523, 14807, 21187, 56057}},
+{5961, 17, 2038, {1, 3, 7, 15, 23, 41, 85, 95, 53, 629, 1877, 3167, 2411, 9619, 24621, 31213, 30069}},
+{5962, 17, 2041, {1, 1, 5, 3, 3, 25, 99, 39, 321, 549, 599, 1279, 2401, 2335, 8227, 59429, 94549}},
+{5963, 17, 2048, {1, 3, 3, 11, 9, 21, 29, 55, 477, 19, 1275, 29, 2253, 11421, 30401, 57059, 93219}},
+{5964, 17, 2054, {1, 1, 7, 1, 27, 13, 117, 249, 463, 769, 281, 515, 7467, 11507, 1621, 39765, 31109}},
+{5965, 17, 2057, {1, 3, 5, 7, 19, 7, 77, 107, 23, 895, 1013, 2701, 3805, 7327, 27247, 6119, 102395}},
+{5966, 17, 2058, {1, 1, 3, 13, 21, 49, 99, 15, 163, 641, 1703, 3061, 163, 4265, 32571, 13957, 75005}},
+{5967, 17, 2068, {1, 1, 5, 11, 27, 17, 87, 169, 427, 959, 361, 1023, 5727, 16279, 1099, 39081, 67215}},
+{5968, 17, 2072, {1, 3, 3, 9, 23, 13, 1, 91, 173, 325, 1881, 1385, 8023, 935, 9221, 19673, 36949}},
+{5969, 17, 2075, {1, 3, 1, 7, 7, 25, 119, 189, 107, 249, 811, 973, 6499, 101, 11281, 55227, 32361}},
+{5970, 17, 2077, {1, 1, 5, 13, 19, 37, 117, 95, 463, 587, 1419, 445, 4019, 7257, 29757, 50773, 52247}},
+{5971, 17, 2082, {1, 1, 1, 1, 17, 57, 81, 57, 43, 789, 1035, 625, 1707, 9683, 3681, 12411, 110623}},
+{5972, 17, 2084, {1, 1, 7, 5, 7, 57, 49, 91, 459, 513, 1869, 3377, 139, 10037, 24091, 54247, 41279}},
+{5973, 17, 2087, {1, 3, 3, 9, 9, 33, 29, 51, 355, 415, 1907, 809, 6543, 349, 18507, 12919, 41667}},
+{5974, 17, 2101, {1, 1, 5, 11, 3, 17, 73, 201, 121, 909, 1623, 799, 3271, 9051, 5717, 15169, 127861}},
+{5975, 17, 2111, {1, 1, 7, 7, 23, 31, 1, 155, 475, 87, 2001, 2459, 1285, 5931, 6803, 56757, 71671}},
+{5976, 17, 2113, {1, 1, 5, 13, 5, 1, 21, 109, 263, 841, 723, 1539, 7529, 433, 23721, 33195, 57001}},
+{5977, 17, 2119, {1, 3, 3, 13, 29, 55, 105, 231, 405, 265, 671, 351, 4693, 9033, 21963, 52073, 125131}},
+{5978, 17, 2147, {1, 3, 1, 13, 25, 51, 55, 227, 245, 983, 251, 2553, 2017, 1381, 31461, 3953, 75775}},
+{5979, 17, 2154, {1, 1, 1, 11, 31, 11, 91, 91, 287, 749, 1019, 4055, 3237, 6965, 14765, 1663, 82987}},
+{5980, 17, 2161, {1, 1, 7, 3, 11, 15, 67, 161, 79, 729, 1115, 3713, 2715, 9361, 9365, 26093, 63409}},
+{5981, 17, 2164, {1, 3, 1, 7, 1, 51, 125, 15, 457, 433, 405, 2329, 157, 4817, 25867, 38177, 45319}},
+{5982, 17, 2177, {1, 3, 7, 9, 25, 57, 5, 233, 481, 781, 1313, 3179, 7219, 8717, 14825, 16079, 127149}},
+{5983, 17, 2178, {1, 1, 7, 15, 27, 51, 5, 65, 77, 313, 1751, 1489, 4307, 10541, 11345, 52577, 18143}},
+{5984, 17, 2184, {1, 1, 1, 15, 21, 5, 113, 71, 411, 327, 1681, 1023, 5661, 15815, 5387, 10351, 21121}},
+{5985, 17, 2198, {1, 1, 5, 5, 29, 55, 25, 255, 69, 879, 501, 1915, 3731, 633, 12197, 5249, 31129}},
+{5986, 17, 2201, {1, 3, 5, 7, 3, 23, 107, 163, 485, 853, 359, 3069, 4353, 371, 6027, 53239, 105541}},
+{5987, 17, 2213, {1, 3, 5, 15, 7, 41, 9, 47, 33, 327, 621, 147, 577, 29, 14623, 3403, 9791}},
+{5988, 17, 2217, {1, 3, 3, 15, 29, 47, 41, 149, 477, 127, 573, 877, 3101, 5963, 28457, 14231, 67425}},
+{5989, 17, 2228, {1, 1, 1, 15, 31, 7, 55, 191, 101, 259, 1071, 219, 2233, 3583, 21969, 32745, 80529}},
+{5990, 17, 2240, {1, 3, 7, 13, 17, 53, 115, 69, 241, 71, 1475, 191, 509, 3721, 15537, 53773, 18005}},
+{5991, 17, 2245, {1, 1, 3, 9, 5, 57, 13, 95, 103, 871, 2043, 2239, 7833, 10727, 6513, 55273, 3781}},
+{5992, 17, 2250, {1, 1, 5, 5, 9, 11, 55, 151, 239, 537, 135, 2779, 7393, 15393, 11097, 58593, 100745}},
+{5993, 17, 2263, {1, 1, 1, 9, 15, 39, 29, 105, 441, 181, 1113, 2125, 8145, 11045, 6589, 33603, 83377}},
+{5994, 17, 2267, {1, 3, 1, 1, 11, 63, 69, 153, 225, 845, 675, 407, 4691, 13383, 27359, 38881, 5509}},
+{5995, 17, 2285, {1, 3, 7, 11, 23, 31, 69, 3, 41, 57, 683, 887, 6861, 12161, 14537, 27293, 113001}},
+{5996, 17, 2286, {1, 1, 1, 11, 5, 1, 101, 175, 437, 3, 1477, 1005, 6607, 7429, 7213, 4025, 66479}},
+{5997, 17, 2291, {1, 1, 7, 5, 19, 7, 99, 131, 273, 977, 1717, 3831, 175, 5673, 12577, 36787, 30945}},
+{5998, 17, 2298, {1, 3, 1, 1, 15, 37, 105, 195, 61, 869, 255, 2625, 7401, 9361, 13217, 52811, 130811}},
+{5999, 17, 2306, {1, 3, 5, 3, 29, 27, 105, 23, 511, 813, 1311, 2859, 1647, 1949, 1329, 27589, 125209}},
+{6000, 17, 2325, {1, 3, 3, 1, 21, 11, 119, 247, 123, 401, 409, 1845, 2133, 10793, 221, 43217, 14069}},
+{6001, 17, 2329, {1, 1, 5, 1, 29, 21, 51, 73, 501, 861, 725, 249, 4249, 8029, 15767, 11985, 18637}},
+{6002, 17, 2332, {1, 1, 5, 11, 19, 39, 97, 65, 13, 283, 489, 2307, 5239, 4161, 18639, 60035, 22405}},
+{6003, 17, 2335, {1, 3, 5, 1, 3, 7, 109, 27, 429, 663, 1569, 3001, 3453, 8627, 9719, 23941, 110451}},
+{6004, 17, 2339, {1, 3, 7, 5, 17, 13, 125, 209, 347, 95, 1937, 1419, 5661, 7171, 20607, 9777, 68343}},
+{6005, 17, 2346, {1, 1, 1, 1, 7, 41, 43, 229, 57, 49, 1863, 2819, 3735, 915, 1571, 11603, 116275}},
+{6006, 17, 2351, {1, 1, 7, 9, 21, 27, 5, 199, 181, 521, 303, 1097, 5427, 8899, 30325, 55457, 16189}},
+{6007, 17, 2353, {1, 3, 3, 7, 19, 41, 3, 205, 279, 223, 971, 633, 2617, 13191, 10193, 23375, 62563}},
+{6008, 17, 2363, {1, 3, 3, 13, 23, 59, 85, 25, 253, 405, 65, 1625, 4401, 4679, 14381, 57833, 30001}},
+{6009, 17, 2378, {1, 3, 3, 3, 13, 35, 11, 157, 123, 397, 119, 2513, 1919, 14583, 5469, 11463, 94711}},
+{6010, 17, 2383, {1, 1, 1, 7, 17, 37, 83, 211, 451, 939, 449, 13, 6671, 1457, 19855, 15053, 52327}},
+{6011, 17, 2391, {1, 1, 5, 3, 9, 57, 39, 183, 331, 451, 1391, 1865, 7801, 14293, 29069, 705, 109497}},
+{6012, 17, 2401, {1, 3, 7, 7, 23, 21, 85, 81, 255, 9, 1685, 2879, 6327, 12675, 31657, 38877, 74131}},
+{6013, 17, 2408, {1, 1, 5, 9, 25, 19, 41, 195, 31, 555, 927, 1445, 593, 11067, 10819, 17205, 82037}},
+{6014, 17, 2414, {1, 3, 1, 13, 1, 35, 29, 71, 323, 705, 53, 3885, 6223, 1319, 30853, 59935, 35949}},
+{6015, 17, 2419, {1, 1, 7, 3, 27, 63, 67, 31, 149, 61, 1611, 77, 4271, 3161, 12493, 38341, 53837}},
+{6016, 17, 2428, {1, 1, 1, 15, 27, 53, 31, 249, 429, 925, 1485, 1855, 4421, 5703, 10097, 14827, 36685}},
+{6017, 17, 2441, {1, 3, 7, 13, 7, 63, 53, 9, 317, 485, 1679, 3631, 3745, 5643, 21615, 45129, 48027}},
+{6018, 17, 2444, {1, 1, 1, 1, 17, 43, 19, 163, 441, 847, 937, 959, 6649, 13071, 1065, 55193, 129509}},
+{6019, 17, 2461, {1, 1, 1, 11, 29, 47, 9, 215, 397, 637, 961, 3139, 2007, 12603, 27657, 22825, 72873}},
+{6020, 17, 2480, {1, 3, 3, 15, 7, 45, 55, 163, 259, 899, 951, 3245, 4191, 15813, 20195, 8361, 54025}},
+{6021, 17, 2483, {1, 1, 5, 11, 3, 17, 13, 223, 289, 255, 875, 2937, 1593, 9729, 21569, 63199, 83875}},
+{6022, 17, 2486, {1, 1, 1, 15, 19, 31, 17, 129, 267, 9, 2015, 3233, 6799, 12891, 18473, 37865, 19547}},
+{6023, 17, 2489, {1, 1, 5, 5, 5, 29, 81, 37, 357, 539, 1525, 2839, 8041, 5569, 4423, 8907, 35461}},
+{6024, 17, 2490, {1, 1, 5, 5, 29, 11, 85, 61, 333, 521, 1111, 3627, 325, 9805, 17889, 25655, 39537}},
+{6025, 17, 2518, {1, 3, 5, 11, 11, 53, 81, 25, 79, 253, 1963, 287, 7487, 15045, 21431, 35417, 102391}},
+{6026, 17, 2527, {1, 1, 1, 5, 11, 33, 45, 45, 425, 773, 1817, 4077, 1471, 11655, 683, 7115, 92651}},
+{6027, 17, 2540, {1, 1, 3, 3, 21, 13, 101, 215, 311, 853, 41, 1007, 5511, 2581, 25565, 13155, 117225}},
+{6028, 17, 2558, {1, 1, 3, 11, 19, 9, 125, 59, 273, 691, 499, 1547, 567, 10259, 21963, 48725, 3601}},
+{6029, 17, 2567, {1, 1, 3, 7, 27, 31, 39, 125, 317, 625, 1329, 3947, 3943, 6889, 2811, 34055, 1449}},
+{6030, 17, 2571, {1, 1, 1, 3, 29, 45, 73, 239, 319, 611, 647, 1839, 5277, 7807, 3107, 14683, 20203}},
+{6031, 17, 2574, {1, 3, 3, 3, 5, 5, 107, 139, 103, 809, 1343, 4041, 3273, 1789, 16205, 47873, 27803}},
+{6032, 17, 2579, {1, 3, 1, 9, 21, 23, 13, 131, 105, 741, 1773, 981, 5633, 14609, 12281, 50343, 14317}},
+{6033, 17, 2585, {1, 1, 1, 5, 11, 5, 125, 171, 109, 555, 159, 905, 691, 12401, 22817, 41411, 70113}},
+{6034, 17, 2615, {1, 3, 3, 9, 31, 37, 109, 231, 59, 615, 799, 319, 2459, 4521, 8525, 4827, 22969}},
+{6035, 17, 2639, {1, 3, 1, 5, 11, 7, 49, 237, 345, 473, 981, 2073, 6525, 8805, 13403, 3659, 69897}},
+{6036, 17, 2641, {1, 3, 1, 5, 9, 37, 13, 203, 141, 573, 745, 2613, 5589, 607, 24483, 38427, 95775}},
+{6037, 17, 2644, {1, 1, 3, 1, 23, 61, 75, 57, 299, 191, 805, 2993, 5175, 12037, 13649, 58831, 48791}},
+{6038, 17, 2663, {1, 3, 7, 13, 31, 57, 13, 219, 185, 717, 1607, 3785, 4719, 11583, 29285, 48207, 92021}},
+{6039, 17, 2667, {1, 3, 7, 15, 23, 35, 23, 69, 411, 773, 1549, 1087, 1685, 15703, 27193, 62675, 43505}},
+{6040, 17, 2669, {1, 1, 5, 3, 25, 19, 97, 75, 493, 549, 1655, 2881, 4989, 2765, 4797, 43143, 113955}},
+{6041, 17, 2672, {1, 1, 5, 7, 21, 5, 65, 37, 383, 133, 1907, 3747, 1525, 5803, 19977, 50551, 23157}},
+{6042, 17, 2687, {1, 1, 1, 11, 15, 61, 59, 109, 489, 901, 1787, 1611, 6101, 10653, 3071, 35643, 56227}},
+{6043, 17, 2700, {1, 3, 1, 5, 15, 25, 121, 111, 25, 251, 1467, 1795, 1631, 13753, 32391, 14831, 90739}},
+{6044, 17, 2705, {1, 1, 1, 13, 23, 55, 119, 147, 45, 871, 1389, 1929, 1023, 16131, 10041, 40055, 23337}},
+{6045, 17, 2724, {1, 3, 1, 15, 27, 33, 23, 41, 463, 603, 1633, 3445, 2007, 5999, 11175, 18343, 13159}},
+{6046, 17, 2728, {1, 3, 1, 9, 17, 15, 107, 63, 493, 411, 293, 3669, 6143, 3057, 8253, 25491, 58907}},
+{6047, 17, 2733, {1, 3, 5, 11, 1, 43, 5, 117, 127, 813, 1881, 3711, 2567, 7819, 5809, 64471, 104221}},
+{6048, 17, 2741, {1, 3, 5, 9, 25, 27, 49, 93, 77, 705, 1773, 1745, 4605, 16137, 14621, 62893, 81637}},
+{6049, 17, 2748, {1, 3, 1, 15, 9, 29, 41, 101, 291, 763, 1475, 3185, 3661, 10351, 26645, 50375, 59373}},
+{6050, 17, 2751, {1, 1, 5, 15, 9, 31, 107, 159, 125, 471, 1023, 2361, 4805, 8073, 21563, 14903, 77801}},
+{6051, 17, 2756, {1, 3, 7, 1, 27, 17, 75, 129, 71, 697, 551, 1969, 6597, 13821, 2605, 61783, 74791}},
+{6052, 17, 2771, {1, 1, 7, 15, 17, 27, 49, 47, 59, 47, 1671, 2535, 1299, 2387, 24349, 23661, 91123}},
+{6053, 17, 2774, {1, 1, 5, 15, 21, 61, 45, 37, 415, 189, 143, 351, 1815, 3479, 2399, 56753, 123893}},
+{6054, 17, 2793, {1, 1, 3, 7, 7, 19, 93, 249, 335, 305, 1437, 1329, 2693, 13201, 9589, 61513, 115995}},
+{6055, 17, 2796, {1, 1, 1, 11, 21, 57, 33, 205, 235, 253, 751, 259, 6029, 9811, 10231, 36899, 78035}},
+{6056, 17, 2804, {1, 1, 1, 11, 13, 25, 115, 195, 111, 913, 1851, 3283, 6083, 11717, 2773, 40727, 493}},
+{6057, 17, 2814, {1, 3, 3, 9, 9, 17, 83, 137, 465, 671, 1277, 325, 2767, 12413, 21977, 47525, 23041}},
+{6058, 17, 2822, {1, 1, 1, 11, 15, 47, 65, 219, 271, 197, 297, 3195, 1325, 9991, 26385, 46055, 43151}},
+{6059, 17, 2845, {1, 1, 1, 13, 31, 21, 39, 89, 127, 629, 367, 2935, 6259, 6627, 15691, 55781, 97251}},
+{6060, 17, 2846, {1, 1, 7, 13, 11, 45, 65, 75, 211, 785, 1221, 2087, 7751, 15619, 25489, 28195, 69007}},
+{6061, 17, 2850, {1, 3, 5, 15, 27, 37, 75, 111, 487, 219, 233, 583, 6433, 15105, 355, 28331, 21105}},
+{6062, 17, 2855, {1, 3, 3, 15, 31, 53, 33, 95, 27, 197, 1727, 1467, 7115, 15479, 26873, 31075, 12793}},
+{6063, 17, 2856, {1, 3, 7, 1, 19, 3, 19, 105, 225, 599, 737, 107, 7951, 10193, 31699, 59207, 85619}},
+{6064, 17, 2867, {1, 3, 1, 3, 7, 17, 73, 191, 247, 421, 537, 1473, 189, 4219, 29993, 25491, 21189}},
+{6065, 17, 2891, {1, 3, 7, 7, 13, 21, 33, 95, 147, 699, 943, 2275, 4093, 6067, 9063, 25503, 111085}},
+{6066, 17, 2894, {1, 1, 7, 9, 13, 47, 123, 121, 347, 467, 225, 957, 2329, 14075, 29843, 61753, 97179}},
+{6067, 17, 2902, {1, 3, 3, 7, 17, 55, 37, 167, 215, 819, 163, 1747, 4485, 15991, 28011, 36351, 106495}},
+{6068, 17, 2908, {1, 1, 3, 9, 25, 5, 83, 199, 209, 395, 1757, 1967, 5739, 2573, 13989, 32145, 4847}},
+{6069, 17, 2951, {1, 3, 3, 13, 11, 21, 25, 223, 239, 569, 1877, 299, 8089, 3697, 801, 64775, 26827}},
+{6070, 17, 2970, {1, 3, 5, 7, 17, 9, 127, 9, 65, 919, 1073, 2661, 1337, 10065, 30099, 30929, 90067}},
+{6071, 17, 2972, {1, 3, 1, 13, 25, 41, 35, 251, 279, 351, 111, 3917, 2815, 7989, 9895, 54859, 126355}},
+{6072, 17, 2975, {1, 1, 3, 7, 17, 61, 13, 73, 335, 831, 703, 37, 2765, 13169, 12513, 56301, 13907}},
+{6073, 17, 2976, {1, 1, 5, 13, 11, 15, 33, 45, 505, 127, 1723, 17, 4927, 11453, 28859, 9671, 80041}},
+{6074, 17, 2981, {1, 3, 1, 5, 9, 1, 25, 147, 281, 601, 243, 2687, 5533, 6725, 11075, 34807, 24619}},
+{6075, 17, 2986, {1, 1, 3, 1, 7, 21, 71, 31, 485, 561, 1361, 1237, 8171, 15885, 7941, 4583, 32851}},
+{6076, 17, 2999, {1, 3, 7, 1, 5, 35, 95, 155, 283, 959, 577, 1343, 4269, 13481, 30819, 40273, 8711}},
+{6077, 17, 3000, {1, 3, 7, 3, 1, 53, 77, 45, 215, 537, 1045, 77, 2791, 3553, 13273, 23819, 62263}},
+{6078, 17, 3006, {1, 3, 1, 15, 29, 59, 7, 145, 85, 3, 251, 2691, 7547, 11241, 32295, 24645, 75739}},
+{6079, 17, 3014, {1, 1, 5, 9, 19, 9, 39, 163, 303, 233, 2039, 2027, 7169, 2773, 28649, 38317, 66761}},
+{6080, 17, 3028, {1, 3, 7, 5, 21, 27, 93, 227, 131, 1019, 1619, 1497, 4043, 1131, 25761, 20173, 99957}},
+{6081, 17, 3031, {1, 3, 7, 5, 19, 33, 15, 173, 435, 399, 531, 2001, 3221, 12627, 10153, 24421, 61805}},
+{6082, 17, 3035, {1, 3, 1, 9, 11, 3, 69, 105, 289, 183, 1103, 831, 2297, 1613, 18801, 54395, 54243}},
+{6083, 17, 3037, {1, 3, 3, 9, 3, 53, 113, 183, 79, 355, 1629, 1061, 3713, 4563, 14365, 43529, 56073}},
+{6084, 17, 3053, {1, 3, 7, 11, 31, 39, 107, 139, 187, 873, 225, 33, 4943, 15837, 225, 6407, 85967}},
+{6085, 17, 3059, {1, 3, 1, 11, 17, 47, 93, 233, 119, 699, 1429, 2845, 2061, 8887, 20665, 45497, 33107}},
+{6086, 17, 3065, {1, 3, 5, 1, 25, 11, 55, 75, 91, 1009, 1887, 3167, 515, 15929, 11659, 57953, 63401}},
+{6087, 17, 3080, {1, 1, 3, 15, 27, 59, 103, 53, 353, 553, 2021, 1543, 2785, 9373, 14609, 21213, 19911}},
+{6088, 17, 3091, {1, 3, 7, 9, 3, 1, 101, 133, 437, 773, 1399, 1067, 7419, 1793, 16589, 3483, 42065}},
+{6089, 17, 3094, {1, 3, 7, 1, 25, 57, 127, 113, 65, 577, 1865, 1527, 6485, 11273, 15803, 39625, 75219}},
+{6090, 17, 3109, {1, 3, 5, 9, 7, 63, 29, 89, 155, 45, 1029, 2407, 6783, 4749, 4849, 26639, 54059}},
+{6091, 17, 3110, {1, 3, 7, 9, 25, 13, 113, 41, 267, 767, 1071, 1689, 269, 14437, 21255, 39473, 65771}},
+{6092, 17, 3113, {1, 3, 1, 15, 5, 3, 77, 43, 391, 763, 59, 1027, 6263, 3715, 31061, 43311, 130725}},
+{6093, 17, 3116, {1, 3, 7, 7, 21, 51, 127, 71, 229, 171, 397, 1099, 871, 2717, 1643, 17363, 125979}},
+{6094, 17, 3136, {1, 1, 5, 15, 25, 11, 11, 113, 203, 795, 1703, 3901, 1113, 12819, 25345, 46691, 112313}},
+{6095, 17, 3139, {1, 3, 7, 5, 1, 59, 91, 81, 325, 483, 595, 1491, 7455, 6699, 199, 35597, 59851}},
+{6096, 17, 3141, {1, 3, 5, 1, 3, 33, 43, 195, 201, 575, 1395, 1305, 7001, 2023, 22419, 15233, 120355}},
+{6097, 17, 3154, {1, 1, 3, 3, 15, 37, 81, 59, 87, 675, 199, 3231, 4473, 5023, 16753, 51475, 102113}},
+{6098, 17, 3160, {1, 1, 7, 9, 13, 39, 65, 9, 51, 565, 1171, 119, 7875, 12149, 6565, 56849, 123235}},
+{6099, 17, 3169, {1, 3, 3, 7, 15, 45, 53, 93, 111, 533, 1849, 643, 2265, 10241, 24741, 11559, 74333}},
+{6100, 17, 3182, {1, 3, 1, 1, 11, 61, 75, 51, 5, 199, 535, 279, 5821, 6005, 2907, 32521, 74121}},
+{6101, 17, 3187, {1, 1, 3, 15, 3, 21, 29, 193, 71, 993, 1719, 1865, 6135, 7683, 12171, 29275, 14539}},
+{6102, 17, 3189, {1, 1, 1, 7, 7, 13, 1, 61, 315, 431, 1145, 2067, 5745, 1641, 1047, 55111, 129477}},
+{6103, 17, 3190, {1, 1, 5, 1, 21, 43, 115, 193, 153, 573, 1181, 3947, 7809, 11317, 30649, 56891, 47741}},
+{6104, 17, 3203, {1, 1, 5, 7, 19, 15, 61, 239, 109, 683, 395, 2869, 3103, 1531, 12019, 45159, 37525}},
+{6105, 17, 3217, {1, 1, 5, 7, 29, 55, 45, 7, 353, 659, 591, 3371, 5777, 8475, 2743, 47483, 11983}},
+{6106, 17, 3229, {1, 3, 1, 3, 13, 17, 39, 195, 43, 5, 1749, 2559, 5843, 8719, 21421, 58511, 105637}},
+{6107, 17, 3236, {1, 3, 5, 5, 5, 21, 29, 63, 387, 301, 567, 3325, 2109, 403, 23053, 24851, 14493}},
+{6108, 17, 3248, {1, 1, 3, 3, 17, 57, 107, 131, 85, 855, 1101, 3199, 7159, 14739, 4197, 27943, 113009}},
+{6109, 17, 3257, {1, 1, 3, 11, 1, 61, 31, 79, 33, 123, 1509, 507, 6679, 2279, 8465, 37279, 17553}},
+{6110, 17, 3278, {1, 3, 1, 15, 7, 33, 11, 71, 217, 609, 1661, 3437, 5497, 13365, 6247, 649, 26407}},
+{6111, 17, 3283, {1, 1, 3, 1, 19, 45, 49, 125, 5, 455, 1669, 4083, 253, 10101, 27327, 16401, 120399}},
+{6112, 17, 3289, {1, 3, 1, 1, 27, 19, 117, 137, 261, 341, 1697, 457, 7553, 12169, 30049, 49281, 36937}},
+{6113, 17, 3292, {1, 1, 1, 3, 9, 49, 33, 13, 461, 545, 1537, 2623, 883, 10921, 5583, 58997, 114183}},
+{6114, 17, 3302, {1, 1, 7, 9, 29, 53, 29, 165, 205, 989, 1347, 2343, 7505, 7609, 18503, 51677, 105993}},
+{6115, 17, 3316, {1, 1, 1, 13, 1, 29, 59, 121, 297, 659, 1965, 1765, 5255, 10971, 32613, 18763, 41983}},
+{6116, 17, 3328, {1, 3, 7, 11, 21, 41, 19, 47, 125, 485, 475, 2745, 4075, 8101, 31227, 4679, 115473}},
+{6117, 17, 3333, {1, 3, 3, 7, 21, 23, 55, 65, 223, 1001, 317, 1459, 183, 5139, 26553, 41471, 116373}},
+{6118, 17, 3337, {1, 1, 7, 3, 1, 9, 29, 139, 343, 913, 1993, 3139, 3791, 5869, 6057, 23863, 35737}},
+{6119, 17, 3340, {1, 3, 3, 3, 7, 21, 77, 197, 239, 467, 35, 591, 1061, 3417, 31811, 38825, 124981}},
+{6120, 17, 3368, {1, 3, 3, 1, 21, 29, 5, 213, 417, 111, 1681, 1409, 2899, 16233, 1053, 51235, 87767}},
+{6121, 17, 3371, {1, 1, 5, 3, 13, 47, 61, 203, 223, 73, 1947, 3613, 5885, 13567, 7593, 34329, 68597}},
+{6122, 17, 3376, {1, 3, 1, 1, 17, 9, 11, 187, 361, 973, 781, 1835, 1539, 12917, 21725, 48279, 115037}},
+{6123, 17, 3385, {1, 3, 1, 1, 9, 25, 117, 157, 433, 395, 403, 2183, 3327, 5427, 7505, 2673, 77137}},
+{6124, 17, 3386, {1, 1, 7, 15, 31, 15, 27, 155, 441, 837, 1877, 3829, 5139, 16331, 31183, 15803, 95699}},
+{6125, 17, 3393, {1, 1, 7, 15, 5, 51, 77, 179, 289, 727, 1763, 2529, 6715, 3967, 29267, 27293, 67953}},
+{6126, 17, 3399, {1, 3, 7, 13, 7, 3, 3, 17, 311, 547, 1465, 1413, 3937, 2725, 24523, 12321, 109763}},
+{6127, 17, 3405, {1, 3, 5, 15, 9, 5, 87, 135, 281, 97, 2021, 1903, 8007, 10321, 27989, 18993, 110407}},
+{6128, 17, 3414, {1, 1, 1, 13, 25, 61, 89, 107, 233, 823, 1375, 3531, 1757, 1577, 29457, 1461, 17217}},
+{6129, 17, 3433, {1, 1, 1, 13, 17, 17, 27, 193, 485, 759, 145, 3943, 4183, 14119, 11217, 3793, 1935}},
+{6130, 17, 3436, {1, 1, 1, 3, 13, 31, 101, 227, 311, 363, 1925, 1525, 5275, 2385, 15093, 48769, 121189}},
+{6131, 17, 3448, {1, 1, 5, 13, 11, 61, 89, 141, 117, 229, 417, 3935, 7249, 13869, 30591, 62763, 67521}},
+{6132, 17, 3467, {1, 1, 3, 15, 7, 59, 105, 239, 453, 221, 1101, 395, 2031, 8941, 23155, 7077, 125593}},
+{6133, 17, 3469, {1, 1, 1, 11, 7, 55, 99, 31, 305, 371, 1035, 577, 4473, 577, 371, 46093, 69157}},
+{6134, 17, 3472, {1, 3, 1, 9, 9, 33, 35, 245, 95, 47, 1623, 2965, 6849, 7269, 5321, 31641, 73321}},
+{6135, 17, 3477, {1, 1, 1, 15, 21, 61, 65, 65, 159, 151, 625, 2281, 2993, 1311, 29757, 24703, 71029}},
+{6136, 17, 3484, {1, 3, 5, 15, 29, 59, 29, 69, 351, 901, 631, 3501, 7031, 703, 20805, 36437, 94931}},
+{6137, 17, 3494, {1, 3, 7, 1, 21, 11, 19, 125, 237, 807, 1651, 2389, 7347, 11759, 27151, 38669, 965}},
+{6138, 17, 3505, {1, 1, 5, 1, 15, 41, 1, 105, 89, 127, 895, 29, 2339, 15951, 18633, 2781, 67269}},
+{6139, 17, 3515, {1, 1, 5, 15, 25, 7, 3, 33, 375, 447, 203, 2579, 6145, 14015, 9939, 52777, 123181}},
+{6140, 17, 3523, {1, 3, 1, 15, 29, 7, 7, 27, 451, 869, 107, 2457, 5557, 11601, 28957, 36181, 41419}},
+{6141, 17, 3530, {1, 1, 1, 7, 1, 57, 33, 213, 329, 763, 815, 169, 623, 155, 20529, 20603, 73311}},
+{6142, 17, 3543, {1, 3, 5, 7, 25, 21, 7, 217, 159, 89, 1373, 1735, 705, 4093, 13083, 3855, 55875}},
+{6143, 17, 3559, {1, 3, 1, 1, 29, 33, 105, 127, 95, 543, 235, 67, 691, 5015, 22139, 18251, 89945}},
+{6144, 17, 3568, {1, 1, 3, 11, 27, 53, 105, 83, 337, 331, 1571, 1145, 745, 1845, 17881, 17697, 88139}},
+{6145, 17, 3577, {1, 3, 7, 15, 19, 37, 119, 35, 35, 463, 1925, 1665, 673, 12193, 12137, 62371, 10957}},
+{6146, 17, 3578, {1, 3, 3, 3, 19, 21, 113, 29, 459, 467, 623, 2661, 857, 16265, 27509, 46555, 18867}},
+{6147, 17, 3594, {1, 3, 7, 5, 17, 49, 123, 41, 85, 673, 41, 1871, 7649, 8687, 28269, 64423, 93675}},
+{6148, 17, 3601, {1, 3, 3, 3, 7, 23, 101, 171, 181, 527, 65, 2387, 6629, 6089, 17387, 46551, 36143}},
+{6149, 17, 3607, {1, 1, 5, 1, 13, 51, 21, 251, 139, 429, 1993, 3767, 1089, 5459, 19407, 41747, 41033}},
+{6150, 17, 3608, {1, 1, 1, 11, 15, 9, 81, 91, 73, 969, 1513, 2067, 7959, 2605, 26641, 37631, 124571}},
+{6151, 17, 3620, {1, 1, 3, 15, 29, 15, 5, 57, 247, 901, 527, 3325, 5859, 11299, 9871, 63947, 125247}},
+{6152, 17, 3629, {1, 3, 1, 5, 1, 35, 75, 21, 307, 43, 1111, 3299, 1647, 3585, 31045, 18217, 95169}},
+{6153, 17, 3644, {1, 3, 1, 7, 23, 35, 11, 103, 3, 461, 1915, 4019, 453, 13111, 26941, 43091, 22917}},
+{6154, 17, 3656, {1, 1, 5, 5, 1, 61, 121, 167, 475, 5, 1749, 887, 2237, 5055, 7077, 29453, 17691}},
+{6155, 17, 3664, {1, 3, 3, 15, 15, 15, 9, 15, 171, 787, 1965, 577, 4507, 7325, 20901, 8557, 111909}},
+{6156, 17, 3670, {1, 3, 5, 1, 27, 15, 123, 141, 63, 55, 599, 4095, 1245, 13919, 27485, 49977, 74551}},
+{6157, 17, 3680, {1, 3, 5, 9, 21, 61, 79, 119, 7, 573, 1923, 2775, 3127, 12689, 12135, 53429, 130163}},
+{6158, 17, 3685, {1, 3, 3, 13, 27, 41, 67, 249, 447, 277, 311, 775, 8187, 10161, 12953, 22885, 121247}},
+{6159, 17, 3686, {1, 3, 5, 9, 21, 55, 115, 65, 45, 395, 481, 2063, 6493, 4199, 19219, 27119, 62255}},
+{6160, 17, 3695, {1, 1, 3, 13, 7, 41, 3, 127, 383, 923, 1725, 1033, 7731, 11971, 3089, 46459, 98369}},
+{6161, 17, 3698, {1, 1, 3, 11, 13, 39, 39, 149, 309, 311, 1491, 807, 2109, 363, 14637, 65429, 124731}},
+{6162, 17, 3703, {1, 1, 7, 13, 13, 35, 67, 81, 493, 859, 1177, 237, 4605, 15319, 16669, 16661, 21385}},
+{6163, 17, 3710, {1, 1, 3, 7, 7, 39, 57, 103, 239, 753, 221, 1611, 1557, 13317, 27453, 10245, 33839}},
+{6164, 17, 3714, {1, 1, 5, 13, 27, 53, 97, 41, 123, 253, 535, 1839, 5827, 7587, 1261, 20313, 65961}},
+{6165, 17, 3726, {1, 1, 7, 1, 11, 47, 93, 135, 223, 591, 1087, 3329, 3293, 14207, 6187, 54789, 23781}},
+{6166, 17, 3731, {1, 3, 7, 7, 25, 21, 97, 105, 269, 515, 1805, 3711, 3295, 7307, 21065, 65205, 116969}},
+{6167, 17, 3733, {1, 3, 1, 11, 25, 37, 21, 89, 109, 581, 1055, 2393, 1291, 1115, 25545, 36383, 93605}},
+{6168, 17, 3737, {1, 3, 7, 1, 27, 13, 113, 11, 395, 473, 943, 4045, 5507, 15051, 25203, 2971, 31961}},
+{6169, 17, 3756, {1, 1, 5, 5, 27, 35, 57, 219, 67, 949, 659, 203, 5235, 6509, 13731, 61533, 54963}},
+{6170, 17, 3759, {1, 3, 1, 1, 15, 39, 85, 13, 347, 99, 25, 3595, 3081, 13617, 14373, 58909, 102181}},
+{6171, 17, 3767, {1, 1, 7, 13, 3, 25, 97, 91, 287, 389, 665, 2981, 2301, 12625, 4495, 57489, 68677}},
+{6172, 17, 3776, {1, 1, 5, 1, 15, 57, 77, 55, 299, 713, 1457, 3699, 2807, 5549, 467, 47367, 8163}},
+{6173, 17, 3785, {1, 1, 7, 3, 23, 45, 91, 251, 501, 193, 1121, 2359, 4781, 12797, 13713, 55171, 927}},
+{6174, 17, 3793, {1, 3, 3, 7, 7, 31, 87, 163, 249, 163, 937, 1293, 4827, 10299, 31935, 58787, 80589}},
+{6175, 17, 3812, {1, 3, 1, 9, 7, 1, 73, 65, 475, 791, 1429, 3319, 7149, 433, 10373, 44061, 121195}},
+{6176, 17, 3815, {1, 1, 5, 9, 9, 61, 27, 249, 435, 437, 1329, 2163, 5859, 13663, 623, 55569, 94283}},
+{6177, 17, 3824, {1, 3, 7, 11, 1, 29, 117, 195, 399, 999, 1705, 1325, 6043, 9823, 27335, 30377, 16627}},
+{6178, 17, 3844, {1, 1, 1, 15, 5, 11, 63, 185, 15, 741, 1061, 2961, 3455, 5, 26587, 54081, 18107}},
+{6179, 17, 3859, {1, 1, 5, 7, 29, 57, 17, 203, 501, 177, 49, 2773, 8069, 12513, 14437, 64489, 58661}},
+{6180, 17, 3866, {1, 3, 3, 9, 11, 23, 121, 3, 415, 447, 1773, 135, 5901, 4951, 2683, 437, 126251}},
+{6181, 17, 3872, {1, 3, 3, 1, 7, 23, 17, 23, 115, 591, 1075, 3133, 49, 15183, 10615, 37857, 122609}},
+{6182, 17, 3884, {1, 1, 3, 3, 13, 49, 63, 37, 275, 763, 1135, 2913, 1563, 11037, 6693, 18799, 32089}},
+{6183, 17, 3889, {1, 3, 5, 11, 7, 29, 59, 45, 227, 941, 1947, 2733, 797, 10485, 7071, 14741, 11451}},
+{6184, 17, 3899, {1, 1, 1, 9, 21, 19, 77, 97, 75, 991, 187, 1003, 5619, 11013, 3931, 19907, 79723}},
+{6185, 17, 3902, {1, 1, 7, 13, 1, 57, 61, 177, 443, 227, 1347, 2665, 2011, 12329, 14137, 37795, 63331}},
+{6186, 17, 3909, {1, 3, 3, 9, 31, 59, 87, 93, 485, 635, 901, 1845, 6153, 10797, 1289, 8989, 41717}},
+{6187, 17, 3913, {1, 1, 1, 1, 3, 7, 85, 17, 67, 309, 1891, 435, 303, 8011, 32127, 54309, 21457}},
+{6188, 17, 3933, {1, 3, 7, 1, 29, 27, 41, 239, 293, 717, 1331, 917, 6145, 7131, 28199, 35093, 103683}},
+{6189, 17, 3938, {1, 3, 7, 3, 21, 63, 65, 233, 257, 789, 1095, 505, 4557, 16259, 7397, 24815, 89529}},
+{6190, 17, 3949, {1, 3, 3, 11, 29, 41, 55, 17, 335, 715, 779, 2121, 6393, 8887, 32753, 45647, 82665}},
+{6191, 17, 3952, {1, 1, 1, 11, 27, 47, 71, 13, 141, 283, 967, 3359, 4309, 6661, 20481, 23175, 50835}},
+{6192, 17, 3980, {1, 3, 3, 7, 3, 25, 19, 241, 409, 573, 1565, 3355, 1307, 12205, 18017, 8271, 117007}},
+{6193, 17, 3991, {1, 3, 3, 9, 21, 39, 21, 253, 439, 963, 341, 3637, 2275, 1845, 11015, 481, 83369}},
+{6194, 17, 3992, {1, 3, 7, 9, 31, 29, 29, 163, 111, 983, 571, 713, 2621, 11569, 13341, 28341, 130381}},
+{6195, 17, 4002, {1, 3, 7, 7, 11, 35, 89, 49, 81, 115, 113, 1857, 3527, 14819, 6909, 14659, 23557}},
+{6196, 17, 4008, {1, 3, 3, 15, 29, 41, 85, 241, 317, 737, 213, 1667, 5789, 16321, 13991, 36165, 124151}},
+{6197, 17, 4011, {1, 3, 1, 3, 31, 1, 75, 99, 495, 241, 1499, 1535, 2033, 2135, 6699, 58893, 37031}},
+{6198, 17, 4016, {1, 1, 7, 9, 25, 15, 101, 23, 477, 563, 1691, 2655, 2321, 2323, 4255, 22055, 99661}},
+{6199, 17, 4034, {1, 3, 7, 5, 7, 7, 49, 221, 51, 83, 279, 2205, 2939, 2119, 14073, 32839, 108075}},
+{6200, 17, 4036, {1, 3, 5, 11, 17, 39, 3, 127, 87, 501, 799, 401, 4439, 9895, 13017, 64975, 67177}},
+{6201, 17, 4063, {1, 3, 3, 9, 17, 41, 59, 95, 283, 309, 83, 1293, 6385, 5783, 30115, 33997, 12531}},
+{6202, 17, 4067, {1, 3, 5, 3, 7, 31, 69, 171, 225, 409, 1237, 3343, 835, 8039, 16723, 37203, 129047}},
+{6203, 17, 4073, {1, 3, 3, 15, 17, 23, 107, 1, 105, 135, 1245, 993, 4101, 7325, 7425, 17379, 98121}},
+{6204, 17, 4082, {1, 1, 7, 9, 27, 5, 67, 111, 75, 531, 243, 2239, 2527, 4513, 27059, 40533, 88169}},
+{6205, 17, 4091, {1, 3, 5, 7, 21, 63, 57, 15, 75, 679, 1729, 1845, 6259, 8531, 18691, 49321, 101599}},
+{6206, 17, 4093, {1, 1, 5, 9, 3, 35, 7, 201, 351, 885, 669, 2339, 5009, 279, 26469, 54597, 67933}},
+{6207, 17, 4101, {1, 3, 5, 13, 27, 5, 85, 161, 141, 733, 1017, 2021, 6951, 15595, 21817, 17243, 88607}},
+{6208, 17, 4113, {1, 3, 5, 1, 11, 31, 117, 97, 175, 629, 995, 1207, 2941, 5825, 5319, 48191, 9505}},
+{6209, 17, 4120, {1, 3, 3, 7, 25, 39, 45, 79, 21, 607, 1593, 1749, 7951, 10425, 17491, 16617, 56903}},
+{6210, 17, 4125, {1, 1, 1, 5, 15, 41, 107, 115, 79, 693, 919, 3513, 6793, 6541, 5545, 58583, 27963}},
+{6211, 17, 4126, {1, 3, 7, 11, 21, 19, 123, 1, 441, 531, 359, 2117, 2465, 11389, 13489, 32755, 4577}},
+{6212, 17, 4139, {1, 1, 5, 13, 7, 7, 7, 127, 201, 377, 1423, 269, 2611, 3339, 19153, 25659, 33069}},
+{6213, 17, 4142, {1, 3, 7, 1, 13, 35, 45, 5, 313, 739, 1779, 2983, 1815, 8817, 14239, 3921, 57975}},
+{6214, 17, 4144, {1, 3, 1, 11, 9, 39, 33, 111, 39, 255, 159, 2345, 2193, 11475, 12841, 47579, 90309}},
+{6215, 17, 4147, {1, 1, 1, 3, 27, 49, 85, 157, 243, 247, 1473, 323, 4631, 1787, 15193, 5533, 104999}},
+{6216, 17, 4153, {1, 1, 7, 9, 11, 29, 23, 219, 57, 339, 1797, 409, 6025, 10569, 27409, 15147, 130281}},
+{6217, 17, 4154, {1, 1, 7, 1, 31, 31, 113, 229, 63, 877, 319, 2655, 3335, 7743, 19593, 10089, 28215}},
+{6218, 17, 4164, {1, 1, 3, 11, 23, 3, 71, 235, 329, 751, 159, 2579, 5363, 12681, 20233, 53855, 16407}},
+{6219, 17, 4174, {1, 1, 5, 1, 7, 61, 21, 235, 379, 849, 61, 2969, 6399, 2655, 21635, 16955, 58675}},
+{6220, 17, 4182, {1, 3, 7, 7, 29, 15, 5, 11, 143, 699, 1875, 2115, 6633, 6195, 5829, 53633, 111221}},
+{6221, 17, 4185, {1, 3, 7, 11, 19, 41, 17, 219, 483, 829, 1233, 3183, 6283, 2363, 25245, 63075, 82733}},
+{6222, 17, 4188, {1, 3, 7, 13, 21, 17, 1, 207, 443, 575, 521, 2585, 6875, 14871, 14739, 10211, 127435}},
+{6223, 17, 4191, {1, 3, 7, 7, 15, 39, 99, 197, 219, 259, 1723, 3737, 6625, 849, 887, 41293, 53825}},
+{6224, 17, 4195, {1, 3, 3, 3, 5, 3, 75, 155, 189, 935, 85, 2273, 1375, 4217, 10709, 58047, 81689}},
+{6225, 17, 4219, {1, 3, 5, 5, 27, 27, 107, 229, 179, 887, 91, 421, 7313, 6495, 451, 43859, 40033}},
+{6226, 17, 4225, {1, 3, 5, 11, 25, 49, 121, 73, 169, 311, 1387, 1037, 6519, 9317, 26975, 50627, 46805}},
+{6227, 17, 4228, {1, 1, 5, 11, 17, 21, 19, 125, 387, 697, 1017, 1759, 7295, 9869, 28241, 9367, 119255}},
+{6228, 17, 4232, {1, 1, 7, 5, 29, 27, 87, 187, 95, 625, 933, 1751, 5253, 313, 30841, 16349, 67347}},
+{6229, 17, 4246, {1, 1, 3, 3, 15, 51, 23, 101, 183, 267, 243, 711, 983, 12461, 17801, 1429, 47273}},
+{6230, 17, 4255, {1, 1, 1, 3, 17, 3, 73, 67, 49, 449, 879, 2559, 401, 11983, 13697, 12023, 78855}},
+{6231, 17, 4274, {1, 3, 7, 15, 25, 25, 43, 81, 141, 161, 595, 621, 1165, 10869, 22875, 6741, 90017}},
+{6232, 17, 4283, {1, 3, 5, 11, 13, 57, 53, 219, 145, 937, 769, 1961, 4725, 3335, 12623, 8335, 46305}},
+{6233, 17, 4286, {1, 1, 3, 5, 7, 39, 19, 101, 313, 583, 483, 2515, 125, 5211, 2559, 11937, 126717}},
+{6234, 17, 4306, {1, 3, 1, 7, 7, 1, 117, 49, 231, 133, 381, 697, 927, 8263, 26529, 64881, 25059}},
+{6235, 17, 4311, {1, 1, 1, 15, 11, 25, 77, 149, 233, 215, 1239, 3045, 99, 11183, 30279, 32271, 100943}},
+{6236, 17, 4317, {1, 1, 5, 7, 31, 25, 1, 51, 221, 607, 1733, 2145, 6765, 7011, 16927, 29257, 2445}},
+{6237, 17, 4321, {1, 3, 5, 1, 19, 23, 123, 93, 381, 295, 765, 2335, 8025, 14003, 4801, 54243, 57297}},
+{6238, 17, 4324, {1, 1, 7, 9, 9, 31, 63, 191, 495, 527, 251, 2119, 1663, 209, 7445, 1441, 4075}},
+{6239, 17, 4331, {1, 3, 5, 5, 13, 17, 97, 79, 369, 55, 677, 2031, 7315, 4769, 31659, 21975, 22061}},
+{6240, 17, 4333, {1, 3, 3, 7, 3, 63, 121, 243, 39, 917, 1917, 297, 7241, 1565, 31675, 14443, 67239}},
+{6241, 17, 4359, {1, 3, 7, 1, 13, 25, 51, 65, 145, 475, 1853, 4023, 5121, 14411, 15993, 42165, 13615}},
+{6242, 17, 4360, {1, 3, 3, 1, 3, 51, 75, 29, 169, 311, 1309, 2929, 7669, 1507, 14605, 32667, 103861}},
+{6243, 17, 4368, {1, 3, 7, 1, 23, 37, 89, 211, 137, 495, 1469, 3425, 1167, 12429, 27301, 46857, 83007}},
+{6244, 17, 4373, {1, 3, 7, 7, 27, 37, 33, 129, 73, 23, 761, 119, 6217, 4749, 20835, 47477, 33665}},
+{6245, 17, 4389, {1, 1, 3, 5, 29, 35, 79, 21, 183, 933, 43, 3149, 5273, 12159, 20695, 5387, 23569}},
+{6246, 17, 4394, {1, 1, 5, 5, 3, 11, 57, 205, 349, 657, 1509, 3693, 5495, 11865, 13861, 62215, 94141}},
+{6247, 17, 4413, {1, 3, 1, 7, 17, 43, 117, 119, 75, 849, 1247, 643, 2691, 2289, 9759, 18683, 68649}},
+{6248, 17, 4422, {1, 1, 1, 15, 5, 55, 89, 177, 427, 701, 735, 2993, 5293, 15395, 567, 5501, 102393}},
+{6249, 17, 4431, {1, 3, 3, 15, 5, 37, 73, 111, 9, 141, 407, 1579, 6691, 11843, 6377, 64181, 97347}},
+{6250, 17, 4436, {1, 1, 5, 1, 9, 17, 71, 127, 285, 929, 1243, 2605, 359, 14589, 32603, 39879, 115901}},
+{6251, 17, 4440, {1, 3, 7, 15, 3, 27, 91, 121, 47, 631, 1589, 385, 5997, 14077, 21285, 33895, 36985}},
+{6252, 17, 4445, {1, 3, 3, 9, 1, 47, 89, 79, 213, 27, 547, 1703, 4035, 13205, 4341, 21895, 34247}},
+{6253, 17, 4452, {1, 3, 5, 7, 9, 9, 47, 89, 231, 857, 297, 2949, 2715, 1275, 14427, 20227, 21569}},
+{6254, 17, 4462, {1, 3, 1, 3, 15, 57, 61, 183, 377, 477, 1135, 1729, 2863, 8607, 29241, 34983, 84443}},
+{6255, 17, 4469, {1, 1, 7, 7, 5, 53, 91, 149, 71, 41, 1025, 3945, 3989, 15853, 20903, 26943, 99841}},
+{6256, 17, 4470, {1, 3, 3, 3, 29, 21, 59, 217, 483, 257, 331, 657, 2935, 945, 9821, 42501, 98087}},
+{6257, 17, 4473, {1, 3, 5, 3, 17, 39, 123, 103, 109, 957, 853, 3821, 555, 10869, 27673, 38315, 83105}},
+{6258, 17, 4479, {1, 3, 1, 3, 27, 7, 97, 57, 429, 53, 1791, 1405, 4113, 8435, 12845, 21567, 91559}},
+{6259, 17, 4480, {1, 3, 3, 1, 17, 61, 125, 77, 225, 395, 945, 3213, 1363, 15947, 27049, 4389, 64037}},
+{6260, 17, 4483, {1, 1, 1, 3, 15, 51, 15, 189, 449, 989, 939, 985, 6929, 13779, 25011, 22277, 72543}},
+{6261, 17, 4489, {1, 3, 3, 1, 25, 53, 5, 219, 195, 703, 163, 1405, 821, 6797, 14329, 1675, 96653}},
+{6262, 17, 4503, {1, 1, 7, 13, 7, 1, 45, 135, 369, 125, 711, 2509, 131, 13663, 29769, 19497, 116779}},
+{6263, 17, 4519, {1, 1, 7, 15, 23, 25, 7, 225, 435, 835, 1981, 2537, 5727, 15961, 30089, 58905, 100339}},
+{6264, 17, 4520, {1, 3, 7, 3, 19, 9, 79, 63, 371, 419, 1357, 3649, 7987, 14541, 6631, 50555, 84217}},
+{6265, 17, 4525, {1, 3, 3, 9, 7, 61, 11, 157, 99, 95, 945, 2803, 1703, 117, 12891, 21817, 84259}},
+{6266, 17, 4526, {1, 3, 7, 7, 25, 37, 111, 99, 65, 599, 1313, 2557, 5489, 3625, 7429, 19309, 78111}},
+{6267, 17, 4533, {1, 3, 1, 1, 19, 15, 85, 253, 347, 315, 1349, 983, 2507, 4155, 15311, 43535, 101409}},
+{6268, 17, 4552, {1, 3, 3, 3, 1, 55, 3, 57, 375, 107, 177, 1673, 6871, 7137, 10297, 65363, 42293}},
+{6269, 17, 4581, {1, 1, 1, 3, 9, 5, 83, 45, 139, 893, 63, 2859, 6333, 15591, 18491, 26387, 25573}},
+{6270, 17, 4585, {1, 1, 7, 15, 1, 39, 113, 127, 503, 617, 1367, 1855, 185, 4233, 5787, 8265, 42097}},
+{6271, 17, 4591, {1, 1, 3, 11, 11, 41, 119, 165, 331, 625, 81, 2495, 7247, 9139, 15269, 31447, 128425}},
+{6272, 17, 4594, {1, 1, 5, 5, 17, 35, 39, 1, 91, 563, 1841, 2975, 1233, 3837, 22145, 36719, 104503}},
+{6273, 17, 4596, {1, 1, 7, 3, 23, 35, 77, 69, 271, 487, 921, 2597, 8011, 13037, 6001, 20519, 32673}},
+{6274, 17, 4599, {1, 1, 1, 1, 29, 17, 11, 145, 473, 877, 813, 727, 6805, 3563, 13371, 22169, 17239}},
+{6275, 17, 4612, {1, 1, 1, 13, 17, 13, 1, 125, 313, 423, 1079, 2401, 2325, 2219, 24071, 25613, 34163}},
+{6276, 17, 4621, {1, 1, 5, 7, 29, 33, 53, 215, 11, 555, 555, 1965, 3643, 5433, 12923, 59655, 25339}},
+{6277, 17, 4630, {1, 3, 3, 3, 23, 37, 119, 117, 459, 359, 1849, 1019, 433, 15391, 5625, 52649, 81313}},
+{6278, 17, 4636, {1, 3, 3, 1, 21, 31, 121, 161, 113, 667, 863, 105, 3805, 14459, 28235, 24543, 89755}},
+{6279, 17, 4640, {1, 1, 5, 15, 17, 37, 15, 111, 511, 477, 611, 955, 2591, 16137, 14179, 30995, 129575}},
+{6280, 17, 4649, {1, 3, 3, 3, 21, 49, 25, 37, 287, 263, 851, 1015, 8133, 9429, 10959, 64483, 82533}},
+{6281, 17, 4650, {1, 1, 5, 1, 25, 19, 49, 159, 155, 443, 975, 1413, 321, 7871, 22935, 57303, 124027}},
+{6282, 17, 4660, {1, 3, 1, 1, 19, 45, 47, 89, 409, 509, 1249, 2445, 2053, 3781, 7517, 61869, 125137}},
+{6283, 17, 4677, {1, 1, 5, 13, 27, 57, 45, 43, 361, 329, 1321, 771, 4665, 12245, 18993, 15121, 127485}},
+{6284, 17, 4687, {1, 3, 3, 7, 3, 41, 127, 75, 485, 821, 497, 2649, 6423, 12419, 31421, 9441, 63645}},
+{6285, 17, 4696, {1, 1, 3, 5, 19, 61, 91, 35, 311, 287, 449, 3955, 5805, 5631, 25613, 55409, 104545}},
+{6286, 17, 4701, {1, 3, 7, 11, 27, 19, 27, 53, 19, 35, 1687, 3923, 3379, 10435, 15053, 12343, 89077}},
+{6287, 17, 4705, {1, 3, 5, 13, 31, 41, 15, 239, 349, 533, 1771, 737, 6503, 14355, 18781, 27805, 79049}},
+{6288, 17, 4706, {1, 3, 1, 3, 13, 11, 69, 227, 169, 873, 533, 2217, 1047, 12415, 12271, 22447, 14163}},
+{6289, 17, 4711, {1, 1, 3, 9, 7, 31, 23, 155, 133, 305, 1569, 521, 201, 10339, 16999, 29163, 32817}},
+{6290, 17, 4720, {1, 1, 1, 5, 31, 57, 43, 223, 121, 803, 357, 1855, 4321, 10245, 25725, 2543, 47395}},
+{6291, 17, 4723, {1, 3, 5, 9, 3, 5, 47, 189, 217, 899, 1455, 691, 1277, 7861, 3627, 14895, 41109}},
+{6292, 17, 4732, {1, 3, 7, 3, 29, 9, 37, 63, 453, 709, 921, 771, 8069, 239, 22639, 59937, 10635}},
+{6293, 17, 4736, {1, 3, 7, 1, 11, 51, 79, 131, 225, 757, 549, 1605, 3921, 1849, 16307, 29809, 120597}},
+{6294, 17, 4742, {1, 3, 7, 7, 1, 45, 33, 185, 23, 881, 1941, 4093, 4741, 11633, 2059, 32007, 11103}},
+{6295, 17, 4748, {1, 3, 5, 11, 17, 21, 43, 205, 363, 559, 697, 4057, 631, 6697, 883, 61705, 102791}},
+{6296, 17, 4754, {1, 1, 7, 9, 29, 35, 109, 85, 373, 321, 415, 2969, 6163, 6999, 9999, 36435, 125267}},
+{6297, 17, 4759, {1, 1, 7, 11, 25, 9, 113, 91, 337, 889, 947, 2093, 5289, 1367, 13297, 36155, 21825}},
+{6298, 17, 4769, {1, 1, 3, 9, 17, 25, 35, 79, 275, 687, 335, 1181, 7327, 3729, 1561, 27441, 114355}},
+{6299, 17, 4787, {1, 3, 3, 11, 25, 41, 27, 89, 115, 361, 871, 1497, 5735, 6365, 1737, 14277, 63847}},
+{6300, 17, 4807, {1, 3, 7, 7, 1, 63, 31, 73, 289, 67, 277, 1821, 4883, 10795, 11755, 15471, 105871}},
+{6301, 17, 4814, {1, 3, 7, 9, 23, 17, 37, 179, 409, 957, 373, 2393, 2363, 6735, 28737, 41927, 115735}},
+{6302, 17, 4837, {1, 1, 3, 9, 15, 43, 111, 61, 455, 181, 1643, 3063, 4311, 13705, 29993, 21731, 25243}},
+{6303, 17, 4867, {1, 1, 1, 15, 13, 13, 69, 187, 91, 395, 209, 3477, 4649, 7727, 30557, 14719, 1953}},
+{6304, 17, 4873, {1, 1, 1, 15, 9, 39, 119, 193, 459, 135, 567, 25, 4583, 8401, 22161, 14771, 74165}},
+{6305, 17, 4879, {1, 1, 3, 7, 5, 39, 77, 149, 293, 585, 1245, 3615, 357, 11613, 13865, 40227, 41023}},
+{6306, 17, 4884, {1, 1, 7, 9, 9, 37, 5, 177, 121, 181, 771, 733, 7683, 4855, 13629, 8349, 46137}},
+{6307, 17, 4898, {1, 1, 3, 13, 3, 37, 73, 69, 281, 109, 563, 1427, 5127, 8957, 16749, 41489, 49531}},
+{6308, 17, 4907, {1, 1, 7, 11, 29, 63, 79, 127, 95, 809, 1175, 1567, 6353, 7505, 26551, 5073, 53733}},
+{6309, 17, 4910, {1, 1, 1, 5, 25, 41, 59, 103, 59, 365, 1111, 3909, 3749, 14889, 3639, 10435, 45407}},
+{6310, 17, 4918, {1, 1, 1, 5, 3, 61, 93, 199, 97, 779, 67, 241, 6197, 6785, 16869, 7573, 46745}},
+{6311, 17, 4924, {1, 1, 5, 9, 27, 29, 21, 69, 165, 661, 1245, 1265, 2979, 9685, 17781, 23329, 48029}},
+{6312, 17, 4953, {1, 1, 1, 7, 7, 23, 39, 197, 169, 561, 499, 2197, 4371, 157, 6837, 44635, 94861}},
+{6313, 17, 4956, {1, 1, 5, 13, 7, 5, 9, 207, 321, 243, 899, 2967, 3553, 15413, 8961, 55039, 6459}},
+{6314, 17, 4965, {1, 3, 5, 3, 13, 25, 33, 145, 45, 979, 33, 2211, 7003, 11147, 11327, 55151, 30697}},
+{6315, 17, 4966, {1, 1, 3, 13, 7, 51, 25, 229, 231, 115, 1815, 3867, 1533, 15259, 8067, 64803, 87535}},
+{6316, 17, 4970, {1, 1, 3, 3, 21, 51, 101, 49, 227, 393, 1659, 955, 545, 7395, 31563, 5499, 130541}},
+{6317, 17, 4972, {1, 3, 1, 1, 21, 41, 57, 161, 269, 35, 893, 1817, 857, 7027, 973, 12529, 46659}},
+{6318, 17, 4983, {1, 1, 3, 7, 17, 35, 23, 29, 335, 725, 453, 1051, 6019, 7595, 29451, 1853, 116615}},
+{6319, 17, 4989, {1, 3, 3, 1, 3, 55, 73, 187, 213, 329, 997, 703, 5829, 7903, 1081, 33359, 119123}},
+{6320, 17, 4994, {1, 3, 3, 15, 29, 55, 15, 17, 245, 117, 1735, 767, 4457, 8803, 17621, 26925, 72487}},
+{6321, 17, 5000, {1, 3, 5, 3, 25, 7, 119, 139, 159, 199, 317, 3875, 8115, 7581, 29239, 50225, 48459}},
+{6322, 17, 5005, {1, 3, 7, 11, 11, 41, 107, 225, 395, 545, 259, 2379, 6709, 11669, 14545, 43663, 69979}},
+{6323, 17, 5014, {1, 3, 5, 13, 23, 45, 73, 137, 447, 305, 117, 2659, 7989, 233, 31991, 60495, 571}},
+{6324, 17, 5018, {1, 3, 7, 9, 1, 37, 31, 1, 433, 701, 159, 3811, 4529, 6697, 7121, 31107, 61555}},
+{6325, 17, 5023, {1, 3, 5, 5, 13, 21, 81, 63, 95, 741, 1189, 1567, 1223, 12371, 28435, 10537, 53785}},
+{6326, 17, 5039, {1, 1, 1, 11, 17, 31, 67, 121, 281, 593, 561, 1759, 387, 9639, 28595, 22473, 4935}},
+{6327, 17, 5053, {1, 3, 7, 3, 5, 43, 59, 151, 351, 263, 297, 423, 1681, 3785, 15171, 7145, 57531}},
+{6328, 17, 5054, {1, 3, 7, 15, 9, 35, 105, 189, 261, 175, 1669, 1289, 5401, 12801, 19585, 48169, 93195}},
+{6329, 17, 5061, {1, 1, 7, 1, 31, 41, 23, 237, 151, 549, 1079, 2933, 5509, 15593, 1791, 15757, 44607}},
+{6330, 17, 5065, {1, 1, 1, 3, 29, 1, 59, 115, 13, 999, 1179, 3561, 2749, 10059, 12861, 6797, 11793}},
+{6331, 17, 5080, {1, 3, 3, 7, 11, 5, 23, 217, 101, 775, 1497, 4047, 2427, 5117, 9683, 28895, 27557}},
+{6332, 17, 5083, {1, 3, 7, 5, 31, 55, 99, 65, 55, 587, 1271, 2277, 7947, 12995, 13149, 4463, 37625}},
+{6333, 17, 5107, {1, 1, 7, 11, 3, 63, 23, 191, 125, 365, 1153, 2657, 6763, 4557, 21643, 26885, 36753}},
+{6334, 17, 5119, {1, 1, 1, 15, 25, 15, 111, 135, 507, 745, 1947, 2545, 4329, 14325, 8187, 52021, 63401}},
+{6335, 17, 5146, {1, 1, 3, 3, 27, 25, 19, 211, 393, 467, 1015, 2495, 7135, 495, 10385, 26961, 49325}},
+{6336, 17, 5151, {1, 1, 3, 5, 15, 35, 3, 203, 337, 337, 703, 1989, 6869, 6055, 21095, 4749, 125669}},
+{6337, 17, 5152, {1, 1, 5, 1, 31, 39, 57, 101, 419, 717, 1489, 199, 5729, 3003, 2607, 64593, 11515}},
+{6338, 17, 5155, {1, 3, 7, 13, 15, 3, 33, 61, 17, 433, 1097, 957, 5351, 3043, 3679, 44881, 126909}},
+{6339, 17, 5169, {1, 1, 3, 11, 5, 1, 121, 175, 119, 367, 399, 2527, 2157, 2667, 31069, 24797, 119621}},
+{6340, 17, 5170, {1, 3, 1, 7, 27, 47, 115, 229, 455, 775, 73, 837, 1181, 3457, 4057, 33907, 67151}},
+{6341, 17, 5176, {1, 3, 3, 1, 7, 51, 71, 177, 463, 921, 393, 3137, 1225, 5709, 303, 20597, 77581}},
+{6342, 17, 5179, {1, 3, 5, 3, 31, 1, 93, 53, 177, 433, 1471, 2191, 4471, 9211, 19397, 57727, 60367}},
+{6343, 17, 5182, {1, 1, 3, 11, 29, 55, 121, 89, 67, 869, 1631, 2657, 7357, 7159, 22449, 16357, 20077}},
+{6344, 17, 5189, {1, 3, 7, 15, 11, 39, 127, 63, 211, 359, 971, 1221, 1909, 9963, 7827, 60923, 98495}},
+{6345, 17, 5193, {1, 1, 7, 9, 23, 47, 47, 85, 307, 471, 1287, 3825, 5451, 15151, 15647, 63043, 92443}},
+{6346, 17, 5196, {1, 3, 7, 5, 19, 11, 11, 27, 307, 695, 99, 1037, 1997, 13673, 591, 8183, 82197}},
+{6347, 17, 5204, {1, 3, 5, 5, 3, 53, 109, 227, 503, 855, 1269, 3903, 5049, 10647, 21751, 58707, 78311}},
+{6348, 17, 5207, {1, 1, 3, 11, 31, 3, 51, 211, 285, 919, 487, 3393, 3463, 2271, 8053, 56791, 33763}},
+{6349, 17, 5211, {1, 3, 3, 5, 21, 15, 5, 5, 327, 809, 915, 1365, 7323, 4247, 31603, 26261, 80389}},
+{6350, 17, 5220, {1, 3, 7, 7, 15, 33, 31, 221, 291, 815, 1307, 929, 3249, 14573, 13613, 59509, 59741}},
+{6351, 17, 5258, {1, 3, 7, 15, 19, 41, 61, 27, 353, 965, 1901, 87, 2669, 12757, 29723, 47165, 16521}},
+{6352, 17, 5265, {1, 3, 5, 3, 11, 43, 97, 215, 361, 901, 1425, 4063, 5327, 14119, 457, 43145, 107401}},
+{6353, 17, 5271, {1, 1, 3, 15, 19, 37, 101, 69, 131, 927, 897, 477, 7641, 4299, 21213, 26017, 123801}},
+{6354, 17, 5277, {1, 3, 7, 7, 19, 5, 11, 51, 277, 985, 1071, 3437, 6595, 9547, 11855, 64249, 30957}},
+{6355, 17, 5278, {1, 1, 7, 9, 21, 41, 89, 113, 61, 235, 685, 1419, 7619, 9863, 21221, 28685, 53409}},
+{6356, 17, 5282, {1, 1, 1, 1, 27, 1, 19, 3, 473, 827, 269, 1659, 2621, 12347, 13359, 64687, 99293}},
+{6357, 17, 5296, {1, 3, 7, 7, 29, 37, 61, 49, 215, 883, 625, 2671, 3743, 4517, 2075, 64865, 58611}},
+{6358, 17, 5299, {1, 3, 3, 7, 15, 11, 35, 37, 255, 781, 613, 3587, 7643, 13081, 32467, 14427, 15235}},
+{6359, 17, 5319, {1, 1, 1, 11, 31, 47, 107, 65, 489, 377, 425, 3453, 2901, 9999, 7687, 13311, 103947}},
+{6360, 17, 5328, {1, 3, 3, 7, 9, 17, 7, 107, 33, 545, 407, 3335, 7563, 14315, 32725, 8483, 69093}},
+{6361, 17, 5343, {1, 1, 1, 5, 17, 9, 87, 229, 417, 769, 423, 569, 7073, 8705, 24487, 63743, 69807}},
+{6362, 17, 5353, {1, 3, 1, 9, 1, 29, 75, 25, 483, 259, 1941, 1533, 8147, 14127, 24087, 37475, 130961}},
+{6363, 17, 5364, {1, 3, 3, 11, 15, 15, 51, 45, 215, 283, 1687, 185, 4521, 12205, 13041, 33283, 77007}},
+{6364, 17, 5368, {1, 1, 3, 3, 5, 47, 107, 67, 325, 87, 1831, 2845, 1645, 1741, 10811, 8983, 58515}},
+{6365, 17, 5379, {1, 3, 1, 13, 19, 17, 1, 151, 411, 915, 1739, 3781, 4939, 15767, 25897, 7205, 17285}},
+{6366, 17, 5381, {1, 3, 5, 15, 19, 1, 125, 33, 321, 325, 639, 4013, 967, 4347, 19743, 13445, 61229}},
+{6367, 17, 5399, {1, 3, 3, 13, 13, 37, 71, 85, 51, 775, 973, 739, 4341, 15707, 12221, 24321, 48073}},
+{6368, 17, 5415, {1, 1, 7, 13, 15, 13, 9, 211, 331, 429, 1323, 3027, 1091, 13311, 289, 57789, 93261}},
+{6369, 17, 5422, {1, 1, 1, 1, 27, 7, 13, 27, 67, 573, 455, 2353, 113, 11831, 9069, 4503, 89291}},
+{6370, 17, 5441, {1, 1, 1, 7, 21, 63, 47, 39, 419, 991, 1623, 11, 3153, 12633, 9425, 65087, 44935}},
+{6371, 17, 5451, {1, 3, 1, 7, 23, 11, 15, 11, 99, 543, 1739, 3955, 5883, 12469, 7529, 14177, 1945}},
+{6372, 17, 5456, {1, 3, 1, 3, 5, 17, 31, 251, 387, 311, 725, 3827, 6835, 5065, 3141, 43441, 87955}},
+{6373, 17, 5462, {1, 1, 1, 11, 25, 7, 75, 135, 67, 589, 889, 3429, 155, 9081, 28653, 8059, 57251}},
+{6374, 17, 5490, {1, 3, 5, 15, 21, 15, 103, 149, 311, 407, 1391, 717, 1765, 14887, 14381, 37483, 29587}},
+{6375, 17, 5495, {1, 3, 5, 5, 19, 31, 93, 5, 507, 193, 1735, 3841, 7895, 9853, 10317, 14867, 49529}},
+{6376, 17, 5501, {1, 3, 7, 7, 19, 3, 99, 201, 479, 313, 693, 3435, 5453, 1157, 23127, 49005, 20167}},
+{6377, 17, 5502, {1, 3, 7, 9, 15, 21, 123, 41, 19, 281, 1837, 2589, 1003, 1993, 18345, 10039, 89325}},
+{6378, 17, 5505, {1, 3, 5, 1, 19, 21, 77, 151, 145, 951, 2017, 609, 5847, 4475, 12439, 6357, 108277}},
+{6379, 17, 5512, {1, 1, 1, 9, 17, 21, 91, 91, 111, 951, 497, 1759, 503, 12787, 25117, 24323, 96447}},
+{6380, 17, 5523, {1, 1, 3, 11, 13, 9, 73, 205, 329, 243, 1187, 829, 2821, 5563, 14391, 771, 116441}},
+{6381, 17, 5529, {1, 1, 1, 1, 11, 57, 39, 221, 41, 521, 1541, 3515, 2367, 4179, 21039, 52943, 11627}},
+{6382, 17, 5548, {1, 3, 3, 3, 23, 13, 103, 125, 67, 217, 863, 3755, 213, 12657, 31399, 3771, 54107}},
+{6383, 17, 5551, {1, 3, 3, 7, 3, 9, 107, 217, 497, 935, 519, 3041, 323, 14895, 5695, 28789, 36085}},
+{6384, 17, 5553, {1, 1, 5, 11, 23, 33, 81, 23, 167, 3, 1683, 2279, 5365, 847, 14717, 9689, 64481}},
+{6385, 17, 5565, {1, 3, 1, 7, 1, 15, 107, 93, 429, 363, 1745, 1459, 5879, 8351, 17527, 44001, 70293}},
+{6386, 17, 5568, {1, 3, 3, 9, 27, 55, 125, 211, 141, 827, 1239, 663, 4803, 11067, 32039, 28091, 56421}},
+{6387, 17, 5577, {1, 3, 5, 5, 7, 13, 125, 231, 427, 483, 967, 549, 3105, 13919, 3017, 39207, 23253}},
+{6388, 17, 5578, {1, 3, 7, 3, 21, 29, 79, 67, 39, 451, 157, 337, 3585, 3621, 9545, 31205, 63201}},
+{6389, 17, 5583, {1, 3, 1, 1, 29, 25, 77, 57, 167, 899, 95, 2487, 3743, 5381, 3637, 56289, 39453}},
+{6390, 17, 5585, {1, 1, 1, 9, 29, 19, 41, 97, 75, 199, 1709, 483, 4099, 3113, 10953, 20659, 109273}},
+{6391, 17, 5588, {1, 3, 5, 15, 13, 9, 83, 43, 111, 789, 965, 4061, 1239, 14577, 10113, 26359, 52609}},
+{6392, 17, 5613, {1, 3, 5, 5, 11, 39, 113, 31, 457, 119, 725, 831, 4143, 5675, 27431, 12431, 94977}},
+{6393, 17, 5614, {1, 1, 3, 3, 25, 17, 93, 253, 307, 625, 143, 1061, 4415, 3563, 3313, 53527, 29537}},
+{6394, 17, 5616, {1, 3, 5, 3, 29, 41, 43, 109, 147, 919, 1675, 465, 6101, 12251, 28915, 15397, 85233}},
+{6395, 17, 5622, {1, 1, 1, 1, 31, 25, 59, 187, 439, 561, 559, 413, 1917, 9319, 27475, 49715, 32953}},
+{6396, 17, 5631, {1, 1, 7, 13, 23, 31, 95, 231, 141, 207, 1373, 2173, 2905, 169, 23825, 55071, 6147}},
+{6397, 17, 5637, {1, 1, 7, 13, 15, 39, 43, 117, 321, 297, 661, 2941, 7359, 11675, 15483, 24093, 7269}},
+{6398, 17, 5638, {1, 3, 3, 13, 9, 59, 51, 49, 81, 563, 745, 1843, 295, 4689, 19847, 42137, 63197}},
+{6399, 17, 5668, {1, 3, 1, 9, 5, 33, 21, 199, 509, 927, 1777, 1349, 3593, 1065, 24943, 55667, 73539}},
+{6400, 17, 5675, {1, 3, 1, 11, 17, 15, 91, 21, 59, 587, 1207, 543, 6669, 10861, 24755, 1789, 91249}},
+{6401, 17, 5683, {1, 3, 7, 15, 13, 47, 57, 147, 381, 1021, 921, 1347, 3847, 5969, 9075, 39081, 127241}},
+{6402, 17, 5695, {1, 3, 3, 15, 19, 15, 1, 97, 203, 409, 1745, 1217, 2199, 7945, 24361, 41771, 123127}},
+{6403, 17, 5703, {1, 3, 3, 5, 17, 17, 43, 255, 179, 717, 1993, 645, 6527, 1533, 32719, 27481, 122425}},
+{6404, 17, 5710, {1, 3, 5, 9, 13, 59, 15, 157, 373, 937, 27, 3325, 2297, 89, 10861, 48615, 16083}},
+{6405, 17, 5715, {1, 3, 1, 3, 19, 27, 109, 243, 189, 17, 99, 1879, 695, 11329, 12467, 6053, 41749}},
+{6406, 17, 5727, {1, 1, 5, 5, 23, 41, 103, 69, 171, 917, 1303, 2101, 617, 10017, 26525, 11009, 66137}},
+{6407, 17, 5738, {1, 1, 1, 9, 21, 45, 47, 171, 455, 257, 411, 4021, 6995, 12881, 4793, 51193, 60775}},
+{6408, 17, 5752, {1, 3, 7, 5, 25, 31, 89, 53, 321, 593, 1795, 2435, 3833, 2767, 17241, 63373, 25457}},
+{6409, 17, 5767, {1, 3, 1, 1, 3, 45, 19, 255, 179, 991, 1407, 3683, 1435, 6803, 12215, 12835, 2005}},
+{6410, 17, 5773, {1, 3, 7, 3, 17, 5, 117, 251, 71, 983, 1391, 3499, 5119, 7257, 7325, 16565, 6321}},
+{6411, 17, 5776, {1, 3, 5, 7, 5, 49, 47, 201, 297, 485, 1879, 2205, 4903, 13619, 22537, 5479, 121625}},
+{6412, 17, 5781, {1, 1, 3, 5, 27, 27, 87, 61, 145, 943, 343, 1639, 6307, 4549, 20765, 33479, 113697}},
+{6413, 17, 5791, {1, 1, 3, 9, 17, 5, 101, 129, 305, 653, 1901, 3901, 6361, 2369, 7449, 55259, 75215}},
+{6414, 17, 5792, {1, 1, 7, 5, 31, 45, 117, 55, 335, 827, 1309, 2603, 2111, 11005, 14747, 56999, 97373}},
+{6415, 17, 5795, {1, 1, 7, 11, 29, 29, 81, 175, 169, 453, 293, 2589, 1057, 15795, 32397, 65433, 79455}},
+{6416, 17, 5798, {1, 1, 1, 5, 11, 7, 13, 249, 29, 407, 1289, 2385, 8113, 15327, 4029, 32005, 105901}},
+{6417, 17, 5801, {1, 1, 5, 5, 7, 61, 103, 141, 109, 391, 631, 821, 1479, 14771, 25057, 1415, 8081}},
+{6418, 17, 5810, {1, 3, 1, 1, 9, 37, 17, 231, 501, 745, 1695, 45, 7797, 2945, 5529, 34747, 39069}},
+{6419, 17, 5812, {1, 1, 7, 9, 21, 59, 103, 103, 33, 875, 723, 3477, 4729, 7311, 29979, 60901, 72187}},
+{6420, 17, 5836, {1, 3, 3, 3, 15, 63, 93, 237, 203, 635, 1189, 2035, 6499, 9943, 9133, 62977, 29657}},
+{6421, 17, 5839, {1, 1, 1, 9, 3, 11, 63, 207, 95, 563, 775, 3009, 7125, 13141, 4489, 16343, 120951}},
+{6422, 17, 5841, {1, 1, 3, 1, 21, 57, 15, 217, 185, 305, 463, 1597, 6529, 4989, 14011, 11265, 131031}},
+{6423, 17, 5867, {1, 3, 5, 15, 17, 61, 35, 127, 411, 579, 1349, 615, 3293, 8475, 9773, 30635, 117639}},
+{6424, 17, 5870, {1, 1, 7, 9, 11, 3, 55, 105, 305, 223, 1899, 2217, 1261, 9831, 23693, 3013, 30489}},
+{6425, 17, 5877, {1, 3, 7, 15, 15, 29, 1, 99, 67, 293, 499, 1941, 5303, 1329, 24547, 14065, 7927}},
+{6426, 17, 5881, {1, 1, 5, 11, 17, 55, 71, 49, 499, 435, 985, 2803, 6139, 1503, 24167, 47181, 102529}},
+{6427, 17, 5899, {1, 3, 5, 1, 19, 53, 71, 17, 63, 469, 1871, 2051, 357, 11661, 5689, 36373, 13379}},
+{6428, 17, 5914, {1, 1, 5, 1, 27, 47, 23, 247, 59, 381, 1895, 2453, 3665, 5487, 24081, 50501, 91659}},
+{6429, 17, 5925, {1, 1, 5, 7, 29, 19, 3, 33, 83, 301, 133, 3603, 5133, 16171, 22905, 36271, 10405}},
+{6430, 17, 5929, {1, 3, 7, 9, 11, 23, 57, 87, 9, 731, 631, 3703, 2593, 12851, 7115, 8801, 108919}},
+{6431, 17, 5943, {1, 3, 3, 3, 23, 35, 33, 99, 343, 837, 231, 3921, 6975, 15093, 15049, 64623, 123523}},
+{6432, 17, 5949, {1, 1, 7, 11, 15, 61, 113, 103, 501, 57, 1345, 3155, 2965, 4433, 10605, 43765, 42169}},
+{6433, 17, 5962, {1, 1, 7, 13, 7, 53, 91, 121, 229, 127, 103, 833, 7829, 1571, 10847, 20861, 101155}},
+{6434, 17, 5969, {1, 3, 7, 1, 9, 25, 71, 103, 37, 473, 1133, 1129, 1651, 6965, 6937, 16597, 20439}},
+{6435, 17, 5976, {1, 1, 5, 9, 1, 9, 47, 131, 285, 967, 1869, 1075, 8127, 135, 15575, 38569, 123729}},
+{6436, 17, 5988, {1, 1, 7, 9, 5, 31, 33, 227, 347, 41, 2025, 3755, 857, 7805, 13121, 38307, 125825}},
+{6437, 17, 5997, {1, 3, 5, 7, 11, 11, 19, 55, 23, 627, 1477, 3093, 2779, 7653, 7165, 23053, 76123}},
+{6438, 17, 6006, {1, 1, 3, 1, 3, 47, 83, 89, 177, 381, 1247, 141, 7051, 6443, 27369, 34323, 43063}},
+{6439, 17, 6010, {1, 1, 7, 7, 13, 15, 55, 223, 351, 525, 1051, 3009, 5443, 11499, 8335, 37949, 69149}},
+{6440, 17, 6016, {1, 1, 1, 3, 13, 61, 89, 33, 129, 921, 1905, 201, 3141, 5531, 135, 34103, 56883}},
+{6441, 17, 6022, {1, 1, 5, 13, 17, 27, 13, 163, 169, 471, 1263, 1421, 7015, 7927, 21027, 58001, 26739}},
+{6442, 17, 6026, {1, 1, 1, 15, 19, 49, 109, 207, 245, 49, 1271, 3635, 2561, 5091, 24415, 59195, 67701}},
+{6443, 17, 6031, {1, 3, 5, 7, 27, 57, 99, 155, 461, 595, 1859, 1727, 857, 4993, 31733, 42141, 10035}},
+{6444, 17, 6040, {1, 1, 1, 15, 11, 11, 85, 9, 251, 375, 155, 379, 7501, 12559, 32583, 36317, 4675}},
+{6445, 17, 6043, {1, 1, 5, 13, 19, 57, 81, 69, 201, 293, 593, 3169, 4519, 9057, 16685, 12847, 123797}},
+{6446, 17, 6050, {1, 3, 1, 5, 5, 1, 19, 243, 345, 661, 561, 3549, 2541, 5887, 25879, 41467, 72799}},
+{6447, 17, 6059, {1, 1, 5, 13, 15, 51, 67, 61, 79, 89, 447, 1471, 4915, 10637, 10901, 48157, 103545}},
+{6448, 17, 6079, {1, 3, 5, 13, 31, 25, 73, 129, 435, 659, 1851, 3595, 753, 7717, 10927, 30115, 109221}},
+{6449, 17, 6099, {1, 1, 1, 3, 25, 3, 121, 43, 349, 205, 1209, 2671, 6445, 8755, 7171, 58631, 74319}},
+{6450, 17, 6101, {1, 1, 3, 1, 11, 15, 83, 37, 483, 65, 759, 1835, 3883, 1693, 30051, 61077, 1187}},
+{6451, 17, 6105, {1, 3, 7, 15, 29, 23, 85, 77, 139, 903, 1821, 943, 6453, 1523, 18539, 49039, 110787}},
+{6452, 17, 6108, {1, 1, 7, 15, 15, 17, 69, 253, 507, 921, 523, 79, 747, 4011, 25795, 42029, 88309}},
+{6453, 17, 6124, {1, 1, 7, 3, 25, 47, 119, 83, 313, 45, 985, 145, 205, 3407, 9013, 64517, 115811}},
+{6454, 17, 6132, {1, 1, 7, 1, 29, 21, 9, 123, 97, 545, 1987, 2979, 6901, 12667, 23325, 63635, 70593}},
+{6455, 17, 6145, {1, 3, 7, 3, 23, 45, 81, 255, 41, 29, 1493, 4065, 3201, 10479, 17193, 39999, 55493}},
+{6456, 17, 6146, {1, 3, 1, 3, 9, 43, 43, 135, 235, 603, 481, 3139, 2729, 14759, 7269, 7995, 110351}},
+{6457, 17, 6151, {1, 3, 1, 11, 17, 35, 113, 93, 417, 967, 755, 659, 3115, 16163, 22997, 38205, 126961}},
+{6458, 17, 6152, {1, 1, 7, 11, 29, 57, 81, 235, 93, 869, 475, 825, 6269, 15819, 14977, 53057, 116021}},
+{6459, 17, 6158, {1, 1, 7, 13, 5, 61, 5, 241, 245, 673, 1651, 3367, 2355, 713, 20107, 30133, 735}},
+{6460, 17, 6160, {1, 1, 5, 9, 21, 3, 121, 241, 129, 703, 1435, 1943, 5087, 13123, 30023, 58287, 50377}},
+{6461, 17, 6163, {1, 1, 1, 15, 23, 27, 67, 197, 123, 629, 169, 3303, 1679, 11051, 16875, 28055, 12379}},
+{6462, 17, 6165, {1, 1, 3, 3, 7, 63, 97, 43, 89, 739, 779, 2893, 7763, 6351, 26135, 44647, 127987}},
+{6463, 17, 6170, {1, 3, 3, 9, 31, 59, 95, 131, 131, 321, 1125, 127, 4865, 145, 26237, 47871, 114549}},
+{6464, 17, 6182, {1, 3, 3, 13, 21, 3, 33, 17, 445, 693, 1599, 2517, 1679, 2237, 15053, 30983, 106755}},
+{6465, 17, 6196, {1, 1, 5, 13, 31, 37, 49, 67, 403, 27, 575, 1795, 3385, 1067, 585, 60277, 123189}},
+{6466, 17, 6199, {1, 3, 1, 15, 13, 35, 23, 247, 493, 305, 363, 451, 4011, 3679, 18281, 31751, 127933}},
+{6467, 17, 6200, {1, 1, 7, 5, 21, 45, 123, 253, 469, 267, 985, 2349, 3427, 7653, 25685, 13747, 531}},
+{6468, 17, 6205, {1, 1, 5, 11, 7, 59, 105, 209, 27, 847, 593, 3775, 6165, 1655, 29867, 28465, 92193}},
+{6469, 17, 6226, {1, 3, 1, 11, 7, 25, 101, 81, 233, 311, 9, 2735, 3951, 485, 10105, 24489, 649}},
+{6470, 17, 6228, {1, 3, 1, 7, 27, 5, 115, 243, 295, 659, 215, 1787, 5131, 2513, 29201, 21195, 103383}},
+{6471, 17, 6237, {1, 3, 5, 13, 29, 21, 7, 57, 345, 467, 1297, 207, 5115, 335, 6153, 32959, 125697}},
+{6472, 17, 6247, {1, 1, 1, 9, 3, 63, 63, 5, 373, 123, 1265, 2365, 1623, 1561, 14805, 17487, 104787}},
+{6473, 17, 6251, {1, 3, 1, 5, 15, 13, 55, 69, 251, 341, 463, 2611, 4793, 12157, 4669, 11613, 128705}},
+{6474, 17, 6253, {1, 3, 7, 13, 19, 7, 93, 149, 453, 693, 1731, 861, 6971, 943, 18891, 56547, 34411}},
+{6475, 17, 6256, {1, 1, 7, 1, 27, 49, 27, 9, 281, 121, 581, 393, 2583, 1159, 26989, 39955, 100765}},
+{6476, 17, 6268, {1, 1, 3, 9, 3, 43, 97, 207, 311, 617, 1987, 2559, 2101, 15791, 30085, 40713, 41909}},
+{6477, 17, 6272, {1, 3, 1, 3, 15, 19, 53, 183, 375, 867, 397, 3203, 4207, 5381, 25065, 60357, 88739}},
+{6478, 17, 6275, {1, 3, 3, 3, 27, 51, 85, 231, 19, 559, 567, 4049, 4875, 14201, 11623, 39763, 57339}},
+{6479, 17, 6281, {1, 1, 5, 1, 19, 7, 81, 249, 41, 789, 985, 3725, 4053, 4255, 9861, 1609, 29511}},
+{6480, 17, 6289, {1, 3, 5, 5, 21, 13, 49, 41, 367, 283, 1161, 2753, 4733, 3691, 27931, 53055, 83625}},
+{6481, 17, 6335, {1, 3, 5, 11, 29, 47, 95, 51, 265, 85, 385, 833, 7957, 14985, 7017, 41937, 41377}},
+{6482, 17, 6338, {1, 1, 7, 5, 1, 23, 17, 191, 185, 323, 515, 3183, 7685, 7361, 21143, 5227, 110297}},
+{6483, 17, 6355, {1, 3, 3, 7, 11, 39, 31, 97, 237, 497, 1649, 3529, 6153, 5055, 29021, 35125, 121581}},
+{6484, 17, 6362, {1, 3, 5, 3, 17, 47, 105, 75, 55, 343, 595, 2447, 5575, 10673, 32015, 37541, 127867}},
+{6485, 17, 6373, {1, 3, 1, 7, 19, 39, 31, 135, 167, 979, 219, 1353, 489, 9667, 27107, 55565, 72291}},
+{6486, 17, 6386, {1, 1, 3, 13, 31, 49, 87, 93, 235, 577, 1551, 2663, 387, 1129, 26683, 31285, 15913}},
+{6487, 17, 6388, {1, 3, 3, 7, 15, 29, 61, 33, 115, 511, 1781, 2029, 4265, 6745, 1467, 34415, 40907}},
+{6488, 17, 6391, {1, 1, 7, 5, 1, 55, 13, 129, 167, 937, 79, 2047, 3589, 1979, 4153, 15229, 85745}},
+{6489, 17, 6397, {1, 1, 7, 15, 15, 25, 89, 129, 31, 435, 1359, 49, 2659, 2829, 8741, 25215, 4239}},
+{6490, 17, 6405, {1, 3, 5, 3, 11, 39, 95, 239, 187, 615, 1481, 3509, 1133, 13497, 24833, 59635, 45695}},
+{6491, 17, 6406, {1, 1, 5, 3, 19, 17, 17, 235, 315, 943, 883, 1381, 7129, 15709, 9847, 41183, 116071}},
+{6492, 17, 6410, {1, 1, 1, 3, 9, 63, 109, 209, 309, 1015, 1391, 2617, 1481, 6483, 4151, 28063, 49887}},
+{6493, 17, 6417, {1, 1, 5, 13, 23, 37, 31, 89, 501, 461, 41, 931, 7863, 15499, 25635, 16995, 41651}},
+{6494, 17, 6443, {1, 1, 1, 9, 29, 29, 125, 161, 219, 439, 1465, 1615, 7483, 7497, 1121, 49693, 30269}},
+{6495, 17, 6457, {1, 3, 1, 5, 7, 43, 27, 161, 431, 375, 419, 2995, 527, 8207, 747, 18491, 15351}},
+{6496, 17, 6468, {1, 1, 3, 13, 25, 21, 67, 177, 9, 453, 1171, 65, 2845, 16147, 12699, 30905, 122255}},
+{6497, 17, 6475, {1, 3, 1, 5, 29, 47, 77, 251, 473, 385, 947, 3239, 5375, 13617, 10639, 36005, 95821}},
+{6498, 17, 6486, {1, 3, 1, 15, 13, 1, 75, 223, 509, 19, 175, 1541, 637, 5711, 1097, 44901, 35277}},
+{6499, 17, 6489, {1, 3, 3, 7, 3, 27, 17, 151, 39, 583, 391, 2739, 7339, 2051, 17005, 49573, 85969}},
+{6500, 17, 6495, {1, 3, 1, 11, 3, 25, 119, 125, 17, 629, 201, 2347, 2923, 1273, 14871, 58299, 97667}},
+{6501, 17, 6499, {1, 1, 7, 1, 31, 39, 11, 121, 339, 667, 1863, 3479, 1895, 11319, 5683, 64969, 9261}},
+{6502, 17, 6505, {1, 1, 5, 9, 27, 61, 101, 221, 221, 583, 287, 707, 5931, 4225, 29537, 46097, 114361}},
+{6503, 17, 6511, {1, 1, 1, 9, 23, 47, 1, 35, 85, 1021, 151, 3153, 3867, 971, 31573, 4745, 107639}},
+{6504, 17, 6520, {1, 1, 7, 13, 15, 15, 63, 37, 291, 907, 411, 1571, 6415, 7443, 26635, 27945, 130909}},
+{6505, 17, 6529, {1, 3, 1, 9, 21, 13, 77, 147, 485, 107, 235, 481, 2389, 957, 11493, 53033, 46373}},
+{6506, 17, 6542, {1, 3, 5, 7, 3, 55, 125, 237, 205, 411, 1911, 4053, 5983, 15489, 29333, 44727, 62167}},
+{6507, 17, 6547, {1, 1, 3, 3, 17, 3, 59, 239, 209, 495, 447, 3427, 3425, 2347, 10057, 26147, 52243}},
+{6508, 17, 6550, {1, 1, 3, 1, 11, 31, 3, 139, 441, 997, 295, 1267, 2181, 6047, 32419, 62657, 24921}},
+{6509, 17, 6554, {1, 3, 7, 15, 5, 3, 11, 9, 211, 701, 1987, 2611, 6195, 14379, 22919, 15785, 52149}},
+{6510, 17, 6556, {1, 1, 7, 9, 7, 27, 35, 253, 343, 679, 103, 1217, 3983, 8677, 17671, 41347, 89355}},
+{6511, 17, 6560, {1, 1, 1, 5, 7, 55, 111, 115, 231, 999, 773, 2111, 3617, 2469, 16967, 60735, 24557}},
+{6512, 17, 6569, {1, 3, 5, 1, 29, 5, 77, 217, 131, 307, 473, 3595, 2713, 6503, 18459, 57245, 91897}},
+{6513, 17, 6572, {1, 3, 5, 13, 9, 33, 93, 31, 59, 343, 1337, 1971, 7593, 15629, 22693, 19885, 4139}},
+{6514, 17, 6590, {1, 3, 3, 3, 21, 33, 115, 205, 373, 587, 739, 669, 8065, 5339, 16507, 29455, 15863}},
+{6515, 17, 6592, {1, 3, 5, 11, 9, 43, 45, 41, 91, 87, 19, 1523, 5059, 9403, 6739, 36893, 6395}},
+{6516, 17, 6601, {1, 1, 5, 15, 19, 43, 81, 3, 401, 621, 1839, 1443, 179, 8085, 27021, 7757, 95011}},
+{6517, 17, 6610, {1, 3, 5, 15, 19, 21, 45, 167, 77, 977, 309, 431, 3437, 8327, 12895, 50521, 68473}},
+{6518, 17, 6632, {1, 3, 3, 15, 7, 21, 49, 169, 327, 271, 7, 785, 1767, 14747, 7083, 65223, 24213}},
+{6519, 17, 6635, {1, 1, 5, 9, 9, 51, 101, 197, 507, 839, 1413, 3131, 331, 15725, 32293, 60433, 86759}},
+{6520, 17, 6640, {1, 1, 7, 1, 17, 39, 127, 201, 341, 607, 1565, 1615, 1367, 16043, 28265, 29139, 63813}},
+{6521, 17, 6643, {1, 3, 5, 7, 9, 1, 107, 73, 121, 649, 1385, 3203, 2897, 8479, 28519, 34041, 1359}},
+{6522, 17, 6649, {1, 1, 7, 7, 21, 55, 19, 13, 415, 647, 2015, 107, 4167, 5033, 16849, 41407, 94387}},
+{6523, 17, 6659, {1, 3, 5, 13, 31, 27, 107, 95, 425, 679, 55, 3521, 6737, 11459, 19995, 64189, 44323}},
+{6524, 17, 6662, {1, 1, 3, 9, 17, 47, 29, 167, 17, 63, 5, 2505, 6483, 14089, 7127, 7907, 68555}},
+{6525, 17, 6666, {1, 1, 5, 3, 29, 3, 87, 107, 227, 893, 1821, 341, 5481, 13317, 10637, 8611, 28625}},
+{6526, 17, 6690, {1, 1, 1, 13, 11, 19, 59, 157, 397, 103, 1821, 3913, 3083, 6053, 1015, 25475, 94813}},
+{6527, 17, 6692, {1, 3, 1, 3, 15, 45, 1, 209, 335, 1015, 539, 2959, 1711, 2567, 30169, 147, 25383}},
+{6528, 17, 6704, {1, 3, 7, 1, 17, 5, 99, 121, 91, 531, 865, 1667, 5615, 4729, 7473, 21445, 37925}},
+{6529, 17, 6713, {1, 1, 7, 13, 3, 51, 27, 115, 439, 761, 1121, 1503, 3047, 2127, 29253, 48147, 10813}},
+{6530, 17, 6728, {1, 3, 7, 15, 1, 51, 33, 161, 509, 159, 1705, 3365, 7953, 14027, 3873, 29609, 33101}},
+{6531, 17, 6731, {1, 1, 5, 15, 15, 53, 119, 115, 433, 75, 497, 1259, 1681, 7715, 24767, 34647, 82007}},
+{6532, 17, 6734, {1, 1, 5, 3, 27, 63, 41, 181, 393, 439, 95, 2765, 7617, 817, 1311, 18595, 16921}},
+{6533, 17, 6746, {1, 3, 1, 15, 31, 7, 57, 89, 371, 745, 475, 3211, 6893, 10681, 18547, 28373, 127787}},
+{6534, 17, 6755, {1, 3, 5, 13, 5, 55, 45, 167, 147, 833, 765, 1153, 4037, 8503, 10751, 49541, 77489}},
+{6535, 17, 6757, {1, 3, 1, 11, 11, 7, 45, 167, 431, 759, 1035, 1367, 1649, 11711, 4915, 58915, 72479}},
+{6536, 17, 6764, {1, 1, 5, 1, 11, 3, 15, 135, 427, 637, 879, 1667, 6139, 14759, 25665, 13083, 67961}},
+{6537, 17, 6772, {1, 3, 3, 9, 1, 3, 73, 167, 269, 51, 1481, 3659, 7863, 7187, 3951, 10711, 5909}},
+{6538, 17, 6792, {1, 1, 3, 3, 9, 53, 101, 209, 109, 691, 1641, 919, 1083, 6247, 23041, 44681, 130105}},
+{6539, 17, 6797, {1, 3, 7, 5, 21, 55, 127, 9, 437, 225, 1599, 2575, 5407, 8099, 20009, 40339, 110581}},
+{6540, 17, 6821, {1, 3, 3, 13, 7, 41, 15, 137, 363, 337, 995, 1215, 3651, 11011, 27209, 53927, 78065}},
+{6541, 17, 6822, {1, 1, 1, 7, 11, 17, 27, 9, 481, 79, 905, 1297, 811, 10221, 463, 12979, 114731}},
+{6542, 17, 6831, {1, 1, 3, 13, 7, 59, 105, 79, 253, 699, 139, 3823, 4939, 12955, 32069, 7255, 18159}},
+{6543, 17, 6834, {1, 3, 5, 7, 29, 7, 79, 79, 147, 921, 425, 1423, 5967, 6397, 17393, 30009, 84075}},
+{6544, 17, 6851, {1, 3, 7, 13, 23, 45, 51, 141, 237, 443, 1101, 309, 4533, 7479, 22415, 31517, 120407}},
+{6545, 17, 6858, {1, 1, 5, 13, 3, 19, 97, 185, 59, 179, 1343, 2537, 3165, 16295, 25005, 49769, 78007}},
+{6546, 17, 6860, {1, 3, 7, 15, 11, 53, 127, 195, 309, 121, 1741, 1415, 225, 15645, 16365, 38729, 70061}},
+{6547, 17, 6871, {1, 3, 7, 11, 29, 35, 47, 109, 179, 3, 849, 2305, 3035, 15289, 31569, 28851, 90057}},
+{6548, 17, 6875, {1, 1, 7, 1, 13, 27, 93, 119, 439, 45, 623, 1263, 6595, 6669, 12981, 64721, 130109}},
+{6549, 17, 6884, {1, 1, 7, 13, 5, 43, 43, 99, 395, 417, 795, 3991, 5601, 13115, 12803, 52247, 39245}},
+{6550, 17, 6888, {1, 3, 3, 3, 15, 61, 85, 91, 407, 391, 359, 3885, 1925, 4873, 169, 41727, 129471}},
+{6551, 17, 6894, {1, 3, 3, 9, 11, 47, 3, 33, 355, 853, 1329, 1347, 1995, 8197, 10015, 787, 66773}},
+{6552, 17, 6919, {1, 3, 3, 13, 31, 31, 49, 195, 55, 185, 1743, 3523, 1781, 8469, 7623, 55933, 74953}},
+{6553, 17, 6940, {1, 3, 5, 15, 29, 31, 5, 45, 149, 71, 2033, 3171, 4601, 9941, 15005, 55709, 74403}},
+{6554, 17, 6950, {1, 3, 5, 3, 1, 27, 105, 7, 139, 805, 1877, 915, 1843, 11897, 29485, 19275, 44711}},
+{6555, 17, 6959, {1, 1, 5, 7, 25, 57, 111, 57, 401, 935, 1685, 2985, 2015, 13501, 14581, 53579, 117011}},
+{6556, 17, 6968, {1, 1, 5, 11, 13, 47, 63, 137, 145, 77, 1727, 2629, 7377, 6311, 537, 13703, 129503}},
+{6557, 17, 6981, {1, 1, 7, 9, 5, 49, 67, 51, 163, 989, 845, 7, 2141, 14467, 3197, 57581, 121087}},
+{6558, 17, 6988, {1, 1, 5, 3, 31, 49, 57, 103, 171, 491, 1109, 1255, 4353, 11927, 29525, 16685, 48469}},
+{6559, 17, 6996, {1, 1, 1, 3, 7, 29, 17, 111, 339, 747, 763, 179, 7747, 2483, 18415, 45301, 25155}},
+{6560, 17, 6999, {1, 1, 7, 7, 1, 41, 71, 109, 401, 815, 1311, 3933, 1349, 13327, 20847, 44391, 49721}},
+{6561, 17, 7015, {1, 1, 1, 15, 27, 57, 39, 129, 391, 701, 619, 3925, 701, 403, 11821, 30517, 22035}},
+{6562, 17, 7019, {1, 1, 5, 11, 21, 49, 109, 101, 497, 417, 73, 2727, 2899, 2777, 22161, 35561, 70211}},
+{6563, 17, 7022, {1, 1, 3, 3, 15, 43, 1, 159, 41, 833, 55, 2415, 5009, 9663, 31295, 29397, 3187}},
+{6564, 17, 7040, {1, 1, 3, 7, 27, 5, 113, 187, 453, 753, 1649, 1605, 2405, 11791, 4239, 20915, 54033}},
+{6565, 17, 7045, {1, 3, 1, 11, 1, 57, 49, 229, 283, 113, 345, 785, 8009, 11977, 30169, 63787, 32011}},
+{6566, 17, 7049, {1, 1, 7, 3, 5, 59, 57, 91, 327, 685, 219, 1949, 3095, 8389, 2035, 11903, 73461}},
+{6567, 17, 7055, {1, 1, 3, 3, 19, 59, 19, 37, 453, 1, 1811, 3263, 1807, 16147, 24861, 14003, 31747}},
+{6568, 17, 7073, {1, 1, 3, 11, 1, 53, 93, 203, 429, 629, 1931, 1487, 3301, 8805, 4901, 2459, 98555}},
+{6569, 17, 7076, {1, 1, 7, 5, 21, 5, 37, 135, 159, 749, 1589, 2631, 8145, 7279, 28397, 47113, 82309}},
+{6570, 17, 7085, {1, 1, 5, 15, 25, 61, 19, 51, 217, 495, 109, 1179, 2743, 12107, 12509, 13003, 94375}},
+{6571, 17, 7091, {1, 3, 3, 15, 11, 7, 67, 165, 57, 925, 427, 2549, 7189, 5917, 13113, 30933, 62703}},
+{6572, 17, 7103, {1, 1, 5, 5, 9, 5, 43, 5, 485, 159, 757, 3979, 4963, 3389, 29731, 48477, 113429}},
+{6573, 17, 7112, {1, 3, 5, 1, 5, 5, 81, 163, 493, 357, 2005, 1093, 5951, 1045, 10569, 40321, 56881}},
+{6574, 17, 7117, {1, 3, 1, 5, 7, 29, 11, 7, 7, 13, 1641, 1031, 4025, 16337, 24333, 9589, 37779}},
+{6575, 17, 7118, {1, 3, 5, 11, 15, 3, 69, 19, 141, 79, 749, 391, 4505, 6939, 3079, 3647, 22363}},
+{6576, 17, 7123, {1, 3, 3, 3, 29, 3, 7, 189, 183, 513, 1225, 239, 4203, 9197, 23507, 33089, 124433}},
+{6577, 17, 7126, {1, 3, 3, 13, 27, 37, 81, 221, 287, 891, 1197, 3501, 539, 2053, 20509, 48635, 50269}},
+{6578, 17, 7154, {1, 1, 5, 7, 13, 3, 35, 79, 3, 885, 343, 3527, 1043, 7197, 6973, 8515, 39315}},
+{6579, 17, 7180, {1, 3, 3, 9, 21, 53, 79, 225, 229, 759, 457, 293, 953, 12857, 20483, 3677, 93839}},
+{6580, 17, 7192, {1, 3, 5, 3, 5, 17, 45, 107, 153, 279, 761, 1923, 7013, 2989, 10137, 19107, 126897}},
+{6581, 17, 7195, {1, 3, 1, 3, 23, 53, 91, 1, 133, 729, 13, 2017, 6933, 7405, 1255, 49509, 105571}},
+{6582, 17, 7207, {1, 3, 5, 1, 9, 45, 35, 153, 209, 289, 1779, 2557, 315, 981, 15347, 30391, 16027}},
+{6583, 17, 7208, {1, 3, 3, 5, 17, 3, 51, 105, 263, 959, 1255, 1177, 8143, 10541, 7687, 38731, 93561}},
+{6584, 17, 7214, {1, 1, 1, 13, 19, 1, 15, 135, 447, 847, 663, 3893, 3539, 6833, 13265, 62923, 8375}},
+{6585, 17, 7222, {1, 3, 1, 15, 31, 11, 105, 1, 91, 523, 1583, 3493, 2665, 117, 10757, 29845, 127201}},
+{6586, 17, 7234, {1, 1, 1, 3, 29, 49, 9, 103, 309, 605, 1751, 1981, 833, 3653, 14001, 16545, 58513}},
+{6587, 17, 7254, {1, 1, 5, 9, 1, 19, 117, 71, 237, 765, 249, 1983, 2289, 6019, 26505, 31427, 64333}},
+{6588, 17, 7258, {1, 1, 3, 11, 15, 31, 5, 207, 347, 143, 11, 1987, 3569, 2051, 31051, 22193, 93289}},
+{6589, 17, 7264, {1, 1, 3, 5, 13, 15, 5, 73, 457, 611, 673, 2675, 8071, 13245, 19443, 14399, 99599}},
+{6590, 17, 7279, {1, 1, 1, 9, 11, 5, 103, 231, 31, 457, 1031, 2257, 3159, 8323, 31585, 26163, 45159}},
+{6591, 17, 7282, {1, 3, 1, 11, 29, 51, 29, 7, 89, 331, 783, 951, 6353, 15421, 12801, 8337, 119171}},
+{6592, 17, 7293, {1, 1, 3, 13, 23, 57, 63, 43, 505, 1, 657, 4005, 6327, 7545, 15455, 27097, 53649}},
+{6593, 17, 7297, {1, 1, 1, 5, 31, 7, 51, 107, 175, 461, 1893, 305, 157, 4819, 18549, 33087, 9499}},
+{6594, 17, 7322, {1, 3, 1, 3, 19, 45, 37, 9, 459, 143, 1327, 3611, 1899, 15109, 30151, 17911, 13233}},
+{6595, 17, 7324, {1, 1, 5, 15, 19, 49, 11, 227, 375, 661, 665, 259, 3659, 13723, 28239, 48159, 59209}},
+{6596, 17, 7351, {1, 3, 7, 7, 17, 49, 77, 161, 505, 713, 1521, 935, 3629, 5033, 26717, 47199, 3693}},
+{6597, 17, 7363, {1, 3, 5, 9, 17, 61, 1, 201, 259, 179, 1637, 2485, 4995, 2813, 19923, 43739, 32183}},
+{6598, 17, 7380, {1, 1, 3, 5, 1, 23, 125, 61, 225, 703, 2011, 1013, 6651, 14029, 27375, 23301, 80269}},
+{6599, 17, 7384, {1, 1, 3, 9, 11, 57, 37, 49, 321, 443, 1055, 1989, 4755, 8467, 22001, 18647, 112617}},
+{6600, 17, 7389, {1, 3, 1, 5, 5, 39, 21, 139, 101, 583, 1881, 2599, 4185, 15679, 22215, 19093, 76737}},
+{6601, 17, 7396, {1, 3, 1, 11, 31, 51, 85, 91, 159, 421, 2005, 1075, 7757, 12653, 25489, 3545, 62961}},
+{6602, 17, 7413, {1, 1, 1, 15, 27, 57, 75, 151, 357, 571, 395, 299, 5607, 12865, 2149, 21059, 120753}},
+{6603, 17, 7417, {1, 1, 1, 3, 15, 57, 63, 171, 265, 709, 1089, 677, 7243, 10207, 9789, 38431, 130415}},
+{6604, 17, 7431, {1, 3, 7, 5, 21, 9, 73, 149, 197, 773, 773, 3931, 4135, 5671, 2733, 57173, 90693}},
+{6605, 17, 7443, {1, 1, 5, 1, 23, 1, 47, 201, 33, 167, 1643, 4009, 2687, 5725, 28733, 27859, 55163}},
+{6606, 17, 7445, {1, 1, 5, 15, 25, 11, 57, 139, 471, 625, 1067, 3647, 6213, 15605, 23537, 5005, 32593}},
+{6607, 17, 7450, {1, 3, 1, 11, 17, 11, 25, 163, 199, 21, 1775, 3721, 2845, 15769, 2381, 27643, 19909}},
+{6608, 17, 7456, {1, 3, 5, 5, 21, 41, 23, 125, 401, 483, 535, 925, 7065, 1727, 3761, 8485, 3519}},
+{6609, 17, 7466, {1, 1, 3, 15, 27, 31, 11, 7, 93, 237, 611, 3635, 4747, 9751, 20607, 20473, 73935}},
+{6610, 17, 7468, {1, 1, 7, 3, 15, 19, 69, 169, 387, 291, 1981, 635, 3387, 15817, 20357, 47537, 107311}},
+{6611, 17, 7474, {1, 3, 7, 15, 13, 59, 31, 235, 399, 343, 1265, 2975, 6839, 13335, 5397, 58915, 31313}},
+{6612, 17, 7479, {1, 1, 7, 1, 3, 35, 81, 243, 387, 421, 1533, 799, 2615, 13219, 9041, 26967, 22677}},
+{6613, 17, 7486, {1, 1, 7, 15, 17, 41, 89, 115, 67, 569, 1647, 1831, 5533, 4629, 1413, 20037, 97343}},
+{6614, 17, 7497, {1, 1, 5, 1, 23, 41, 11, 149, 319, 377, 439, 1237, 4819, 14303, 14657, 61711, 129235}},
+{6615, 17, 7508, {1, 3, 3, 7, 9, 11, 79, 219, 249, 607, 1453, 2931, 3407, 13725, 28289, 42869, 96759}},
+{6616, 17, 7515, {1, 1, 5, 11, 7, 9, 101, 51, 11, 893, 697, 1221, 4237, 1873, 11191, 25517, 119861}},
+{6617, 17, 7533, {1, 1, 3, 11, 23, 23, 19, 245, 485, 317, 1945, 2339, 193, 9389, 30709, 33927, 95089}},
+{6618, 17, 7542, {1, 1, 3, 1, 27, 55, 5, 81, 63, 185, 223, 3639, 6093, 10053, 1793, 11885, 29307}},
+{6619, 17, 7546, {1, 1, 7, 13, 15, 41, 33, 133, 467, 457, 213, 3687, 1313, 2555, 19487, 44257, 108667}},
+{6620, 17, 7551, {1, 1, 3, 5, 31, 51, 53, 115, 449, 273, 1043, 2743, 1759, 2013, 28171, 57091, 76837}},
+{6621, 17, 7569, {1, 1, 5, 15, 21, 43, 11, 215, 151, 253, 913, 1889, 2799, 13787, 3869, 54413, 50991}},
+{6622, 17, 7572, {1, 1, 3, 13, 29, 19, 81, 123, 461, 203, 81, 555, 6601, 15689, 12637, 41467, 105343}},
+{6623, 17, 7595, {1, 1, 3, 13, 7, 21, 75, 111, 47, 481, 1519, 3299, 6199, 3501, 31323, 29215, 45607}},
+{6624, 17, 7603, {1, 3, 1, 3, 17, 51, 45, 223, 321, 233, 267, 3333, 3803, 3099, 4601, 29061, 88441}},
+{6625, 17, 7605, {1, 1, 5, 13, 23, 27, 7, 57, 273, 893, 773, 239, 6357, 15875, 5497, 21775, 108291}},
+{6626, 17, 7629, {1, 3, 1, 15, 25, 17, 11, 229, 175, 909, 691, 3507, 5247, 2933, 1741, 35059, 62841}},
+{6627, 17, 7632, {1, 3, 5, 1, 29, 7, 11, 69, 345, 87, 99, 3243, 5669, 11053, 1185, 6979, 117069}},
+{6628, 17, 7638, {1, 3, 5, 11, 13, 33, 23, 183, 89, 475, 643, 2773, 7899, 15219, 133, 5073, 129355}},
+{6629, 17, 7648, {1, 3, 7, 9, 23, 17, 31, 53, 455, 193, 1695, 2557, 1645, 12675, 27857, 50447, 121335}},
+{6630, 17, 7654, {1, 1, 3, 11, 15, 19, 41, 57, 305, 235, 1131, 1165, 1857, 13667, 19285, 29755, 118885}},
+{6631, 17, 7663, {1, 3, 7, 3, 9, 43, 107, 3, 275, 673, 677, 3769, 3097, 5497, 24911, 4617, 80505}},
+{6632, 17, 7675, {1, 1, 7, 9, 21, 39, 107, 155, 471, 753, 579, 2929, 4951, 4245, 25035, 41795, 86955}},
+{6633, 17, 7693, {1, 3, 1, 7, 31, 51, 27, 165, 147, 751, 709, 399, 45, 947, 9893, 32721, 122127}},
+{6634, 17, 7705, {1, 3, 3, 1, 31, 31, 73, 59, 351, 293, 845, 3139, 4177, 3537, 9465, 20689, 65837}},
+{6635, 17, 7717, {1, 3, 5, 9, 27, 29, 13, 115, 417, 435, 465, 1291, 5225, 11687, 29207, 39895, 55443}},
+{6636, 17, 7724, {1, 3, 3, 15, 29, 49, 111, 179, 221, 565, 787, 1811, 4055, 7863, 27273, 32975, 26985}},
+{6637, 17, 7727, {1, 1, 1, 7, 15, 49, 121, 145, 277, 27, 149, 965, 4903, 3497, 32333, 37217, 105073}},
+{6638, 17, 7735, {1, 1, 7, 1, 23, 29, 31, 77, 353, 349, 755, 2081, 4291, 567, 641, 41751, 20397}},
+{6639, 17, 7761, {1, 1, 5, 3, 25, 31, 97, 3, 405, 607, 965, 2981, 3217, 14695, 25977, 22457, 113539}},
+{6640, 17, 7767, {1, 3, 3, 15, 25, 3, 91, 125, 269, 825, 1163, 2181, 4247, 6813, 4699, 35091, 87771}},
+{6641, 17, 7783, {1, 1, 5, 9, 25, 23, 113, 145, 71, 31, 1115, 3729, 6793, 11869, 26509, 18779, 99499}},
+{6642, 17, 7784, {1, 1, 1, 9, 31, 51, 77, 217, 247, 599, 1541, 3217, 1383, 5203, 27971, 23647, 71823}},
+{6643, 17, 7798, {1, 1, 5, 7, 17, 35, 113, 73, 475, 511, 35, 1961, 5311, 2257, 1935, 58963, 94349}},
+{6644, 17, 7802, {1, 3, 1, 7, 27, 31, 67, 253, 95, 883, 1213, 855, 3429, 15049, 26715, 56099, 101797}},
+{6645, 17, 7811, {1, 1, 3, 5, 9, 9, 61, 57, 511, 537, 1803, 949, 1327, 3921, 11297, 13807, 64629}},
+{6646, 17, 7817, {1, 1, 5, 1, 31, 57, 105, 161, 309, 283, 1291, 2737, 7141, 7497, 25893, 14453, 35375}},
+{6647, 17, 7823, {1, 1, 3, 1, 21, 3, 77, 37, 13, 211, 1863, 1895, 8035, 5801, 25981, 12317, 48375}},
+{6648, 17, 7832, {1, 3, 7, 7, 25, 45, 13, 77, 185, 553, 1501, 1349, 5951, 15581, 32657, 18467, 128363}},
+{6649, 17, 7837, {1, 3, 5, 9, 23, 63, 105, 239, 213, 935, 1331, 3653, 2775, 6591, 6067, 34597, 19217}},
+{6650, 17, 7842, {1, 3, 7, 13, 15, 19, 79, 91, 391, 637, 1685, 2263, 3507, 2025, 2111, 15875, 14831}},
+{6651, 17, 7853, {1, 3, 3, 5, 7, 29, 81, 69, 511, 399, 343, 737, 2833, 1021, 10471, 18689, 36181}},
+{6652, 17, 7854, {1, 1, 5, 11, 21, 17, 39, 137, 145, 857, 583, 789, 8057, 15995, 32113, 64163, 37153}},
+{6653, 17, 7856, {1, 3, 3, 11, 9, 61, 87, 131, 487, 667, 1295, 493, 4629, 7719, 18157, 49715, 2051}},
+{6654, 17, 7861, {1, 3, 5, 9, 19, 5, 85, 3, 491, 353, 571, 2829, 4411, 343, 24781, 62325, 123959}},
+{6655, 17, 7862, {1, 1, 7, 13, 13, 39, 11, 31, 413, 285, 27, 2433, 3307, 6165, 26565, 40065, 102655}},
+{6656, 17, 7873, {1, 1, 5, 11, 25, 45, 7, 97, 9, 973, 1833, 2537, 1457, 7389, 24087, 38061, 122805}},
+{6657, 17, 7874, {1, 3, 5, 3, 21, 63, 77, 21, 249, 525, 1145, 1421, 8011, 3357, 15051, 30293, 127017}},
+{6658, 17, 7886, {1, 1, 5, 3, 13, 53, 81, 185, 303, 307, 1579, 841, 2277, 607, 10899, 34209, 215}},
+{6659, 17, 7914, {1, 3, 3, 13, 17, 1, 125, 145, 205, 763, 127, 1865, 4129, 849, 27247, 29845, 36515}},
+{6660, 17, 7927, {1, 3, 7, 13, 5, 59, 19, 71, 227, 111, 365, 1309, 5857, 6035, 32379, 11303, 127329}},
+{6661, 17, 7936, {1, 1, 1, 1, 19, 61, 79, 253, 459, 23, 725, 3615, 4583, 429, 13215, 31879, 4523}},
+{6662, 17, 7951, {1, 1, 1, 7, 19, 13, 53, 41, 243, 107, 1767, 983, 3483, 2249, 2209, 58895, 14805}},
+{6663, 17, 7963, {1, 1, 1, 9, 5, 63, 31, 85, 119, 307, 633, 3295, 841, 3495, 22965, 57587, 108271}},
+{6664, 17, 7966, {1, 3, 5, 9, 17, 13, 57, 49, 97, 613, 405, 2637, 3229, 14253, 4663, 61345, 33415}},
+{6665, 17, 7976, {1, 3, 1, 1, 17, 37, 63, 3, 5, 375, 1073, 3971, 665, 4445, 153, 20437, 38513}},
+{6666, 17, 7993, {1, 3, 3, 15, 5, 9, 77, 161, 409, 461, 443, 567, 5581, 8623, 27735, 9041, 5517}},
+{6667, 17, 8001, {1, 3, 5, 13, 13, 5, 19, 53, 263, 155, 557, 3973, 6841, 4829, 30751, 30025, 121973}},
+{6668, 17, 8004, {1, 3, 7, 9, 27, 37, 49, 243, 107, 1013, 1743, 1509, 4465, 15415, 4741, 41409, 72695}},
+{6669, 17, 8013, {1, 1, 3, 5, 11, 49, 39, 45, 21, 463, 875, 3681, 1901, 15325, 24553, 51369, 82227}},
+{6670, 17, 8021, {1, 1, 3, 15, 11, 35, 21, 91, 383, 149, 1815, 911, 4633, 12027, 12413, 22307, 120049}},
+{6671, 17, 8026, {1, 3, 5, 7, 7, 3, 15, 83, 477, 687, 145, 1705, 6893, 5233, 20171, 43337, 72603}},
+{6672, 17, 8028, {1, 1, 3, 9, 25, 35, 19, 173, 67, 5, 561, 2139, 4557, 4911, 26273, 38409, 22801}},
+{6673, 17, 8031, {1, 1, 3, 13, 15, 39, 85, 91, 91, 187, 1851, 1181, 4049, 16353, 26525, 43703, 19415}},
+{6674, 17, 8035, {1, 3, 1, 9, 13, 41, 77, 179, 415, 705, 693, 3017, 5847, 16191, 11435, 28979, 51839}},
+{6675, 17, 8042, {1, 1, 3, 5, 23, 15, 3, 159, 269, 67, 625, 4043, 4701, 1599, 6467, 10949, 80073}},
+{6676, 17, 8071, {1, 3, 3, 15, 7, 43, 81, 157, 393, 321, 1875, 2801, 4359, 11703, 1063, 64015, 109997}},
+{6677, 17, 8085, {1, 1, 7, 3, 25, 21, 37, 123, 133, 691, 973, 3115, 2291, 10519, 13339, 22751, 85445}},
+{6678, 17, 8092, {1, 3, 1, 1, 21, 21, 9, 23, 431, 679, 1873, 289, 4503, 3939, 14417, 36081, 18709}},
+{6679, 17, 8102, {1, 3, 5, 5, 1, 53, 109, 133, 33, 279, 727, 2233, 3065, 8557, 7487, 25797, 109177}},
+{6680, 17, 8105, {1, 1, 7, 7, 1, 9, 47, 127, 179, 757, 1985, 547, 169, 13393, 22669, 58795, 92897}},
+{6681, 17, 8114, {1, 3, 5, 11, 17, 21, 95, 219, 263, 579, 1493, 3283, 5461, 1235, 1749, 33325, 36033}},
+{6682, 17, 8123, {1, 1, 3, 11, 21, 49, 45, 143, 511, 983, 1933, 965, 7905, 1925, 27857, 40723, 68251}},
+{6683, 17, 8131, {1, 3, 7, 3, 27, 9, 73, 7, 441, 877, 107, 1599, 4795, 7251, 6819, 7671, 21137}},
+{6684, 17, 8140, {1, 1, 3, 3, 21, 25, 49, 43, 247, 949, 627, 2859, 2507, 4787, 11269, 53221, 126387}},
+{6685, 17, 8145, {1, 1, 5, 3, 5, 53, 127, 65, 353, 521, 1701, 2981, 3201, 611, 13475, 58015, 2605}},
+{6686, 17, 8157, {1, 1, 5, 13, 9, 39, 55, 103, 53, 281, 705, 2433, 6179, 3381, 31973, 30267, 91307}},
+{6687, 17, 8158, {1, 1, 7, 13, 31, 23, 29, 161, 347, 449, 123, 3427, 5731, 12691, 15175, 20487, 74695}},
+{6688, 17, 8185, {1, 3, 3, 15, 13, 19, 83, 137, 437, 317, 921, 913, 7979, 6665, 5313, 1435, 60271}},
+{6689, 17, 8186, {1, 3, 5, 7, 19, 23, 31, 131, 421, 95, 1999, 897, 4839, 1815, 12387, 45009, 2609}},
+{6690, 17, 8188, {1, 1, 1, 7, 3, 53, 121, 33, 47, 283, 813, 3841, 4449, 2543, 15211, 59285, 42551}},
+{6691, 17, 8192, {1, 3, 1, 13, 9, 43, 37, 167, 93, 417, 213, 2721, 3395, 2089, 13743, 32925, 91147}},
+{6692, 17, 8212, {1, 3, 7, 5, 31, 25, 97, 25, 19, 11, 543, 1889, 455, 5765, 9517, 56963, 131069}},
+{6693, 17, 8219, {1, 3, 1, 7, 3, 7, 87, 61, 209, 39, 1303, 1637, 6687, 8001, 5003, 47911, 110657}},
+{6694, 17, 8221, {1, 1, 5, 3, 11, 25, 99, 77, 379, 843, 1423, 2933, 7535, 4181, 32223, 49327, 48041}},
+{6695, 17, 8235, {1, 3, 3, 13, 9, 7, 85, 59, 47, 777, 401, 2449, 2795, 11289, 25023, 7725, 73887}},
+{6696, 17, 8237, {1, 1, 3, 5, 11, 51, 93, 57, 369, 871, 1175, 2705, 1253, 5169, 24691, 14243, 119667}},
+{6697, 17, 8249, {1, 3, 1, 3, 5, 7, 33, 171, 359, 115, 1909, 2003, 1413, 13829, 3471, 36185, 118399}},
+{6698, 17, 8260, {1, 1, 1, 11, 5, 49, 97, 145, 415, 731, 671, 2309, 7211, 11359, 22757, 15415, 70951}},
+{6699, 17, 8264, {1, 1, 3, 5, 7, 51, 61, 101, 375, 575, 1321, 2835, 7569, 9599, 4707, 7655, 53417}},
+{6700, 17, 8270, {1, 3, 1, 15, 9, 63, 25, 117, 203, 5, 1345, 2571, 5273, 2059, 4689, 27237, 23199}},
+{6701, 17, 8282, {1, 1, 3, 15, 15, 23, 69, 49, 349, 995, 5, 1565, 903, 10165, 9565, 6343, 16653}},
+{6702, 17, 8291, {1, 1, 3, 9, 21, 15, 69, 9, 463, 69, 1447, 2347, 5125, 7479, 18257, 14405, 51321}},
+{6703, 17, 8293, {1, 1, 7, 11, 23, 57, 57, 179, 17, 129, 999, 777, 6281, 1693, 31885, 31085, 29237}},
+{6704, 17, 8297, {1, 3, 5, 1, 25, 55, 15, 21, 199, 271, 1645, 1719, 2023, 10049, 15215, 11959, 44875}},
+{6705, 17, 8298, {1, 3, 1, 3, 29, 43, 83, 11, 281, 27, 429, 685, 7189, 9151, 8665, 9553, 115293}},
+{6706, 17, 8305, {1, 3, 1, 7, 17, 43, 125, 11, 189, 803, 713, 683, 7285, 4455, 18195, 45333, 32281}},
+{6707, 17, 8306, {1, 3, 3, 3, 11, 55, 21, 59, 173, 283, 709, 1561, 5391, 5097, 24725, 19217, 13769}},
+{6708, 17, 8311, {1, 3, 5, 13, 7, 29, 117, 207, 415, 525, 567, 1741, 3553, 6729, 433, 17619, 45971}},
+{6709, 17, 8318, {1, 1, 7, 7, 3, 23, 43, 43, 213, 823, 609, 1037, 3797, 4733, 30717, 61067, 89581}},
+{6710, 17, 8327, {1, 3, 5, 7, 11, 7, 7, 241, 379, 217, 739, 2815, 2549, 14297, 10283, 1509, 80613}},
+{6711, 17, 8345, {1, 1, 1, 1, 17, 45, 53, 229, 193, 893, 1881, 227, 6751, 7135, 20823, 36939, 27667}},
+{6712, 17, 8379, {1, 3, 3, 1, 15, 39, 27, 217, 101, 949, 1963, 2213, 2357, 4129, 11925, 841, 59259}},
+{6713, 17, 8390, {1, 1, 3, 3, 5, 53, 59, 255, 421, 1009, 683, 2171, 6691, 12489, 20865, 29363, 70611}},
+{6714, 17, 8394, {1, 1, 7, 15, 7, 31, 105, 141, 153, 401, 549, 3045, 5443, 11147, 18159, 24283, 21859}},
+{6715, 17, 8414, {1, 3, 7, 1, 11, 17, 17, 231, 175, 603, 1915, 111, 3203, 10627, 9687, 47235, 87057}},
+{6716, 17, 8417, {1, 1, 1, 11, 19, 21, 115, 41, 45, 727, 1523, 739, 3025, 10321, 27353, 63139, 16051}},
+{6717, 17, 8432, {1, 3, 7, 11, 13, 9, 33, 121, 237, 565, 2043, 2131, 3079, 12575, 2187, 14427, 85939}},
+{6718, 17, 8437, {1, 3, 1, 15, 21, 19, 91, 227, 485, 49, 101, 15, 1903, 4039, 23819, 40001, 66405}},
+{6719, 17, 8441, {1, 3, 1, 5, 15, 25, 65, 25, 393, 287, 1435, 1851, 6437, 5983, 13769, 37847, 120907}},
+{6720, 17, 8449, {1, 3, 7, 15, 15, 21, 97, 37, 359, 155, 807, 1421, 517, 13135, 2955, 56979, 52299}},
+{6721, 17, 8456, {1, 1, 5, 1, 27, 53, 79, 27, 467, 605, 267, 1193, 31, 6177, 12369, 32621, 38319}},
+{6722, 17, 8473, {1, 1, 1, 11, 27, 15, 15, 231, 205, 677, 331, 133, 3313, 7193, 8059, 36449, 21671}},
+{6723, 17, 8489, {1, 3, 3, 11, 19, 57, 113, 83, 399, 801, 1843, 2119, 2779, 14061, 30901, 28745, 120903}},
+{6724, 17, 8495, {1, 1, 1, 11, 5, 27, 121, 247, 467, 251, 1487, 251, 897, 3171, 28383, 22473, 1709}},
+{6725, 17, 8522, {1, 1, 1, 15, 7, 59, 123, 165, 123, 373, 167, 1323, 5239, 9027, 13791, 55593, 78785}},
+{6726, 17, 8524, {1, 3, 1, 11, 31, 11, 81, 229, 123, 183, 461, 1751, 5713, 2615, 27795, 1657, 39253}},
+{6727, 17, 8529, {1, 1, 7, 1, 21, 45, 107, 3, 283, 149, 549, 3731, 6435, 3595, 32753, 16079, 84257}},
+{6728, 17, 8545, {1, 3, 3, 15, 19, 9, 81, 37, 51, 341, 909, 985, 1503, 12787, 16129, 37789, 113515}},
+{6729, 17, 8557, {1, 3, 5, 13, 3, 33, 127, 219, 369, 341, 1191, 1305, 567, 2339, 31221, 49435, 114927}},
+{6730, 17, 8565, {1, 1, 7, 15, 29, 47, 103, 107, 257, 15, 2029, 2133, 2129, 11235, 29553, 49139, 33809}},
+{6731, 17, 8572, {1, 3, 3, 13, 23, 33, 105, 43, 155, 815, 1087, 2261, 2781, 3461, 7371, 4479, 123093}},
+{6732, 17, 8576, {1, 1, 1, 13, 17, 7, 89, 107, 143, 349, 637, 3651, 4153, 12131, 28393, 45781, 84133}},
+{6733, 17, 8582, {1, 3, 5, 11, 31, 47, 105, 101, 267, 403, 1853, 3977, 3277, 1737, 15503, 47365, 14361}},
+{6734, 17, 8594, {1, 1, 1, 13, 1, 63, 125, 107, 123, 183, 1027, 3491, 3597, 15949, 5779, 34665, 81257}},
+{6735, 17, 8629, {1, 3, 1, 9, 13, 5, 125, 41, 389, 73, 1487, 1983, 957, 12645, 13983, 7675, 72711}},
+{6736, 17, 8636, {1, 3, 7, 5, 17, 5, 25, 63, 211, 591, 261, 2345, 3883, 4403, 773, 43963, 93509}},
+{6737, 17, 8668, {1, 3, 3, 1, 11, 35, 15, 251, 225, 643, 537, 3769, 7593, 6113, 1377, 52185, 81459}},
+{6738, 17, 8678, {1, 3, 5, 15, 27, 27, 51, 35, 389, 853, 1437, 2803, 5739, 1887, 15099, 3299, 111827}},
+{6739, 17, 8701, {1, 1, 3, 15, 25, 63, 31, 201, 79, 131, 31, 3929, 4195, 13045, 8681, 48121, 110723}},
+{6740, 17, 8702, {1, 1, 5, 7, 11, 43, 101, 57, 69, 271, 189, 3087, 4893, 11365, 6945, 14285, 41961}},
+{6741, 17, 8708, {1, 1, 7, 9, 21, 61, 41, 123, 25, 947, 1619, 2895, 7879, 12397, 17405, 48139, 71519}},
+{6742, 17, 8712, {1, 3, 1, 15, 1, 27, 113, 225, 441, 855, 541, 357, 3111, 4867, 20571, 30627, 70123}},
+{6743, 17, 8745, {1, 3, 5, 3, 5, 33, 103, 1, 21, 93, 383, 407, 5145, 7857, 20289, 51943, 16223}},
+{6744, 17, 8754, {1, 1, 7, 15, 1, 13, 41, 215, 463, 417, 513, 3417, 1755, 16165, 7271, 3101, 54353}},
+{6745, 17, 8759, {1, 3, 3, 13, 19, 29, 5, 205, 245, 927, 1249, 773, 3653, 9959, 357, 40863, 37289}},
+{6746, 17, 8763, {1, 3, 3, 7, 3, 5, 85, 241, 29, 627, 1963, 3133, 1369, 503, 11449, 4699, 2573}},
+{6747, 17, 8766, {1, 1, 7, 15, 3, 35, 47, 157, 413, 437, 1627, 3953, 947, 12721, 22209, 34303, 81237}},
+{6748, 17, 8780, {1, 1, 5, 5, 1, 45, 47, 245, 253, 349, 1853, 3481, 6105, 7267, 3159, 38833, 117889}},
+{6749, 17, 8783, {1, 3, 7, 15, 23, 43, 25, 181, 121, 681, 479, 1239, 6155, 3317, 9419, 28717, 44643}},
+{6750, 17, 8786, {1, 3, 3, 15, 31, 43, 111, 99, 405, 991, 301, 1689, 7107, 16131, 16703, 24059, 40345}},
+{6751, 17, 8798, {1, 1, 3, 9, 25, 5, 107, 91, 117, 351, 1595, 163, 3007, 13743, 24535, 38671, 29745}},
+{6752, 17, 8804, {1, 3, 3, 5, 27, 47, 15, 195, 119, 919, 665, 1903, 1981, 7753, 21709, 33699, 15963}},
+{6753, 17, 8819, {1, 3, 1, 11, 23, 23, 75, 115, 477, 105, 541, 1111, 209, 13939, 17129, 7565, 75415}},
+{6754, 17, 8826, {1, 1, 1, 11, 7, 61, 123, 201, 305, 713, 779, 2059, 4899, 13733, 20529, 15617, 39833}},
+{6755, 17, 8835, {1, 1, 7, 11, 21, 7, 63, 113, 213, 871, 375, 29, 1925, 15237, 7091, 12229, 8457}},
+{6756, 17, 8838, {1, 1, 1, 7, 19, 57, 83, 91, 297, 255, 1993, 63, 5337, 4569, 21243, 40867, 46969}},
+{6757, 17, 8856, {1, 1, 3, 7, 13, 63, 91, 191, 281, 259, 1367, 3505, 5885, 10557, 12423, 56303, 14731}},
+{6758, 17, 8862, {1, 1, 5, 15, 27, 15, 29, 67, 115, 287, 253, 1497, 3739, 2183, 14427, 44931, 11547}},
+{6759, 17, 8871, {1, 3, 1, 9, 25, 61, 25, 113, 137, 819, 781, 3741, 2457, 7817, 31209, 20707, 93007}},
+{6760, 17, 8875, {1, 1, 7, 3, 5, 13, 23, 3, 365, 77, 1117, 3061, 4707, 3013, 27899, 10887, 78677}},
+{6761, 17, 8890, {1, 3, 1, 15, 1, 39, 85, 107, 483, 83, 603, 3121, 1995, 5241, 32319, 9515, 94551}},
+{6762, 17, 8892, {1, 1, 7, 3, 27, 13, 105, 41, 285, 237, 1589, 517, 2009, 10833, 1459, 26217, 50759}},
+{6763, 17, 8898, {1, 1, 3, 11, 27, 1, 127, 83, 355, 107, 1003, 657, 4997, 4123, 13151, 56601, 122307}},
+{6764, 17, 8927, {1, 1, 1, 7, 13, 17, 93, 75, 481, 473, 131, 1359, 4859, 1319, 23919, 50079, 128849}},
+{6765, 17, 8928, {1, 1, 3, 7, 9, 33, 111, 229, 11, 283, 1089, 3049, 1635, 959, 19109, 62821, 105391}},
+{6766, 17, 8945, {1, 3, 1, 3, 9, 47, 49, 169, 343, 929, 1379, 1985, 5867, 6053, 12179, 39727, 116053}},
+{6767, 17, 8952, {1, 3, 3, 15, 27, 39, 61, 113, 439, 719, 1313, 3701, 4793, 10275, 2943, 32405, 95457}},
+{6768, 17, 8955, {1, 1, 1, 1, 27, 49, 121, 171, 319, 365, 1593, 1655, 63, 6257, 18097, 35285, 112245}},
+{6769, 17, 8965, {1, 3, 1, 1, 19, 33, 89, 235, 281, 519, 1867, 525, 4475, 12059, 26611, 14789, 59541}},
+{6770, 17, 8972, {1, 3, 1, 15, 1, 51, 65, 71, 131, 599, 117, 2459, 7421, 7157, 24393, 48139, 53701}},
+{6771, 17, 8977, {1, 1, 7, 7, 1, 41, 57, 191, 207, 329, 43, 1235, 5671, 12243, 22549, 40751, 104513}},
+{6772, 17, 8990, {1, 3, 5, 13, 15, 21, 55, 187, 283, 209, 1511, 1329, 6665, 15953, 4521, 16879, 57625}},
+{6773, 17, 8996, {1, 1, 5, 3, 3, 53, 75, 123, 291, 663, 1893, 3669, 4903, 8575, 27971, 46977, 56357}},
+{6774, 17, 9025, {1, 3, 1, 5, 27, 41, 19, 199, 489, 197, 439, 3299, 6315, 6957, 15809, 35297, 5559}},
+{6775, 17, 9037, {1, 3, 5, 1, 3, 25, 109, 191, 33, 543, 125, 2309, 429, 14059, 3149, 45747, 47357}},
+{6776, 17, 9040, {1, 1, 3, 11, 15, 61, 109, 103, 305, 1, 1479, 2781, 6521, 8921, 23681, 9583, 87257}},
+{6777, 17, 9049, {1, 1, 7, 15, 5, 19, 121, 139, 177, 967, 1363, 705, 211, 11877, 22457, 34563, 7801}},
+{6778, 17, 9062, {1, 1, 7, 13, 9, 21, 103, 95, 483, 567, 5, 2095, 4659, 2447, 23521, 27273, 85867}},
+{6779, 17, 9068, {1, 3, 5, 15, 23, 55, 13, 237, 275, 113, 1431, 2931, 5165, 5317, 5625, 51865, 42177}},
+{6780, 17, 9076, {1, 3, 3, 7, 1, 23, 15, 171, 303, 43, 1137, 1255, 3843, 9049, 1799, 7075, 2115}},
+{6781, 17, 9079, {1, 1, 7, 5, 23, 53, 75, 129, 1, 511, 793, 265, 6535, 9641, 25173, 9449, 46949}},
+{6782, 17, 9099, {1, 3, 3, 1, 19, 39, 51, 173, 5, 281, 2047, 4065, 3225, 14587, 16947, 1459, 87227}},
+{6783, 17, 9107, {1, 3, 7, 13, 13, 53, 39, 115, 403, 37, 1533, 2727, 2229, 8291, 18687, 59553, 37629}},
+{6784, 17, 9114, {1, 3, 1, 9, 3, 55, 63, 191, 147, 321, 1287, 2419, 6881, 2249, 11141, 54839, 50263}},
+{6785, 17, 9123, {1, 1, 5, 3, 9, 61, 85, 139, 1, 409, 633, 53, 163, 14677, 13043, 12253, 106939}},
+{6786, 17, 9126, {1, 1, 7, 3, 19, 3, 7, 165, 497, 621, 1563, 1267, 8113, 2383, 17205, 13337, 102547}},
+{6787, 17, 9137, {1, 3, 3, 13, 15, 29, 23, 31, 481, 535, 471, 2125, 331, 9421, 29799, 27097, 5307}},
+{6788, 17, 9149, {1, 1, 1, 1, 31, 45, 47, 139, 235, 509, 889, 685, 1855, 13599, 24431, 62105, 109509}},
+{6789, 17, 9150, {1, 3, 1, 7, 3, 13, 25, 197, 111, 45, 1815, 1031, 4803, 349, 32369, 40837, 111529}},
+{6790, 17, 9155, {1, 1, 7, 1, 27, 9, 3, 73, 403, 321, 967, 2713, 6953, 16123, 8611, 48651, 120635}},
+{6791, 17, 9161, {1, 3, 5, 3, 3, 25, 69, 231, 249, 393, 1141, 1721, 7071, 3711, 15627, 21815, 104735}},
+{6792, 17, 9162, {1, 3, 1, 11, 19, 63, 77, 5, 55, 481, 1021, 119, 3941, 1227, 10997, 29513, 18923}},
+{6793, 17, 9167, {1, 3, 7, 5, 1, 11, 13, 99, 365, 797, 1993, 699, 3091, 11401, 3659, 15339, 90395}},
+{6794, 17, 9172, {1, 3, 5, 7, 31, 43, 55, 143, 273, 379, 1189, 1689, 4811, 5159, 3281, 63819, 57065}},
+{6795, 17, 9186, {1, 1, 1, 13, 9, 25, 9, 3, 461, 281, 959, 2439, 3187, 4837, 13857, 20221, 29733}},
+{6796, 17, 9188, {1, 1, 7, 11, 31, 17, 13, 101, 81, 921, 1329, 2421, 2747, 9435, 23313, 7093, 7547}},
+{6797, 17, 9191, {1, 1, 3, 3, 9, 51, 67, 95, 511, 1011, 1519, 4089, 5001, 1351, 15367, 50665, 92111}},
+{6798, 17, 9198, {1, 1, 5, 13, 27, 43, 115, 77, 439, 589, 31, 915, 7027, 697, 25143, 1443, 59093}},
+{6799, 17, 9200, {1, 1, 7, 3, 17, 5, 107, 117, 133, 649, 1309, 2979, 969, 9789, 12597, 24507, 106825}},
+{6800, 17, 9205, {1, 1, 7, 13, 1, 27, 97, 35, 431, 183, 199, 2619, 515, 89, 20281, 30291, 97977}},
+{6801, 17, 9206, {1, 1, 7, 1, 31, 9, 35, 11, 359, 21, 1875, 3227, 1307, 15691, 17343, 21163, 84671}},
+{6802, 17, 9215, {1, 3, 1, 11, 29, 21, 47, 137, 441, 841, 1641, 3283, 1371, 8835, 16287, 45009, 13779}},
+{6803, 17, 9227, {1, 1, 3, 9, 23, 53, 1, 99, 473, 649, 447, 2589, 5667, 15579, 6497, 44321, 46993}},
+{6804, 17, 9232, {1, 1, 7, 9, 31, 63, 95, 81, 197, 373, 1027, 3959, 7189, 13369, 17287, 53643, 12673}},
+{6805, 17, 9241, {1, 3, 1, 5, 25, 61, 79, 183, 489, 725, 1077, 1147, 113, 7357, 27505, 529, 61855}},
+{6806, 17, 9244, {1, 1, 7, 11, 19, 35, 73, 223, 125, 765, 1303, 2887, 7861, 14839, 9537, 27027, 94327}},
+{6807, 17, 9251, {1, 3, 1, 3, 17, 35, 63, 233, 317, 133, 1837, 3339, 4351, 10071, 5005, 13245, 34327}},
+{6808, 17, 9254, {1, 3, 1, 3, 17, 13, 59, 113, 247, 1015, 1831, 3391, 6337, 6853, 7145, 64309, 40109}},
+{6809, 17, 9275, {1, 3, 5, 13, 15, 23, 65, 203, 241, 545, 1521, 1253, 3171, 7777, 21145, 565, 87813}},
+{6810, 17, 9283, {1, 1, 5, 15, 31, 9, 9, 145, 409, 155, 409, 2935, 5817, 11427, 32617, 38167, 69465}},
+{6811, 17, 9285, {1, 1, 5, 11, 19, 31, 43, 85, 97, 931, 687, 1501, 3991, 2215, 11091, 64735, 56999}},
+{6812, 17, 9303, {1, 1, 1, 3, 7, 11, 101, 21, 345, 829, 531, 1475, 6617, 1187, 26885, 32135, 9733}},
+{6813, 17, 9304, {1, 3, 5, 11, 7, 49, 79, 197, 57, 15, 1845, 1485, 6167, 10887, 17083, 59367, 7411}},
+{6814, 17, 9313, {1, 3, 7, 5, 9, 33, 7, 91, 311, 847, 1435, 3573, 3693, 5369, 26817, 30105, 115337}},
+{6815, 17, 9314, {1, 3, 1, 9, 25, 43, 65, 69, 225, 337, 575, 1979, 5555, 8499, 8127, 33035, 52549}},
+{6816, 17, 9320, {1, 1, 3, 11, 17, 29, 71, 99, 379, 145, 1067, 2561, 7635, 5647, 32491, 56621, 93603}},
+{6817, 17, 9328, {1, 1, 5, 13, 25, 43, 75, 237, 407, 393, 1219, 3651, 7719, 11685, 26123, 62767, 1043}},
+{6818, 17, 9333, {1, 1, 7, 15, 13, 59, 9, 163, 273, 225, 873, 3201, 633, 6121, 18777, 58763, 77731}},
+{6819, 17, 9337, {1, 3, 7, 7, 3, 7, 99, 155, 279, 991, 799, 753, 7205, 9567, 23643, 38263, 19083}},
+{6820, 17, 9338, {1, 3, 7, 11, 11, 29, 65, 3, 207, 575, 253, 2407, 7935, 11323, 23239, 1923, 47737}},
+{6821, 17, 9340, {1, 1, 5, 9, 25, 47, 1, 25, 397, 1009, 193, 4031, 3023, 2029, 10561, 32363, 104405}},
+{6822, 17, 9353, {1, 3, 7, 9, 19, 55, 63, 179, 385, 97, 461, 3393, 8137, 8929, 17621, 9611, 58925}},
+{6823, 17, 9356, {1, 1, 1, 7, 1, 17, 127, 45, 157, 529, 809, 3545, 5173, 5083, 13325, 52295, 91261}},
+{6824, 17, 9364, {1, 1, 7, 9, 25, 49, 99, 79, 157, 535, 1569, 2195, 1725, 1187, 18423, 47957, 10043}},
+{6825, 17, 9373, {1, 1, 3, 7, 3, 31, 83, 45, 199, 665, 1261, 3497, 7885, 5761, 17187, 12041, 12867}},
+{6826, 17, 9374, {1, 3, 1, 7, 3, 55, 73, 215, 41, 1011, 1883, 1051, 7293, 1881, 27435, 29459, 130933}},
+{6827, 17, 9378, {1, 1, 3, 9, 21, 31, 113, 209, 35, 771, 365, 3151, 787, 3845, 26555, 13823, 36951}},
+{6828, 17, 9380, {1, 3, 7, 15, 13, 21, 119, 91, 15, 251, 1337, 2715, 1665, 3451, 8309, 11033, 127159}},
+{6829, 17, 9389, {1, 3, 1, 9, 9, 63, 5, 145, 357, 9, 859, 1565, 1141, 14689, 25121, 41337, 83357}},
+{6830, 17, 9395, {1, 1, 7, 11, 13, 63, 57, 151, 33, 595, 2025, 571, 4713, 11019, 26771, 16221, 92439}},
+{6831, 17, 9412, {1, 3, 3, 15, 29, 49, 93, 131, 167, 835, 33, 263, 93, 8475, 16139, 61237, 95081}},
+{6832, 17, 9422, {1, 1, 7, 13, 1, 57, 43, 91, 485, 841, 1415, 3083, 2665, 8521, 9825, 59955, 21763}},
+{6833, 17, 9439, {1, 1, 1, 1, 29, 47, 63, 107, 439, 847, 537, 2011, 7571, 3699, 23961, 54887, 92681}},
+{6834, 17, 9450, {1, 3, 7, 5, 27, 41, 105, 161, 95, 821, 451, 2627, 4687, 1899, 18851, 35167, 6869}},
+{6835, 17, 9452, {1, 1, 1, 11, 7, 7, 13, 163, 399, 471, 1587, 2561, 1241, 5365, 27189, 49883, 68101}},
+{6836, 17, 9482, {1, 3, 7, 9, 19, 5, 119, 251, 151, 359, 235, 2387, 3919, 7135, 17591, 1053, 6265}},
+{6837, 17, 9487, {1, 1, 5, 9, 13, 25, 43, 23, 453, 693, 517, 1235, 1045, 4299, 27877, 3733, 72269}},
+{6838, 17, 9489, {1, 1, 7, 1, 27, 43, 103, 249, 487, 67, 855, 3239, 2157, 8121, 4701, 37803, 49971}},
+{6839, 17, 9499, {1, 1, 3, 13, 1, 37, 125, 115, 365, 57, 1419, 4085, 7039, 10079, 14991, 48861, 61979}},
+{6840, 17, 9501, {1, 1, 5, 5, 3, 35, 109, 19, 219, 653, 1219, 1625, 6847, 11271, 4525, 56341, 57801}},
+{6841, 17, 9508, {1, 3, 7, 5, 31, 19, 37, 73, 185, 13, 1723, 1139, 5919, 11717, 27161, 13635, 51765}},
+{6842, 17, 9515, {1, 1, 1, 1, 19, 61, 53, 111, 215, 189, 1199, 591, 943, 2111, 17171, 15621, 128459}},
+{6843, 17, 9518, {1, 1, 7, 9, 17, 61, 101, 159, 85, 537, 15, 1427, 6139, 4091, 32639, 28655, 115385}},
+{6844, 17, 9520, {1, 1, 7, 5, 23, 31, 125, 7, 151, 967, 1079, 4059, 3287, 11673, 19307, 49469, 65981}},
+{6845, 17, 9526, {1, 3, 3, 1, 29, 59, 95, 119, 31, 427, 1653, 721, 5509, 6385, 17043, 45133, 74155}},
+{6846, 17, 9537, {1, 1, 3, 9, 13, 61, 35, 189, 1, 559, 119, 3719, 4137, 1369, 19147, 10923, 43909}},
+{6847, 17, 9552, {1, 3, 3, 13, 1, 41, 31, 185, 451, 379, 29, 153, 4121, 13153, 4171, 36993, 109241}},
+{6848, 17, 9571, {1, 1, 1, 9, 15, 41, 99, 17, 21, 93, 649, 2765, 6955, 10843, 12547, 64989, 63713}},
+{6849, 17, 9588, {1, 1, 7, 5, 5, 5, 73, 187, 473, 235, 1907, 409, 7335, 4429, 7493, 20703, 14505}},
+{6850, 17, 9613, {1, 1, 3, 11, 27, 59, 17, 103, 337, 117, 1241, 951, 3701, 10407, 16741, 46531, 56485}},
+{6851, 17, 9619, {1, 1, 3, 15, 11, 51, 111, 189, 137, 939, 97, 1563, 851, 13949, 1375, 41463, 61445}},
+{6852, 17, 9622, {1, 1, 7, 9, 19, 39, 117, 173, 165, 547, 483, 361, 6819, 15093, 13631, 29785, 29593}},
+{6853, 17, 9637, {1, 3, 3, 5, 15, 39, 41, 249, 455, 79, 233, 3133, 405, 9487, 23161, 32751, 117743}},
+{6854, 17, 9652, {1, 1, 5, 15, 7, 63, 7, 57, 127, 349, 1913, 1145, 3371, 3733, 30971, 35717, 60935}},
+{6855, 17, 9655, {1, 1, 7, 11, 7, 57, 49, 63, 51, 233, 855, 2125, 6961, 15011, 28503, 40549, 47175}},
+{6856, 17, 9661, {1, 3, 7, 1, 25, 49, 35, 39, 237, 545, 1637, 1401, 3279, 10499, 14463, 34973, 29485}},
+{6857, 17, 9664, {1, 3, 3, 13, 7, 13, 79, 141, 55, 277, 843, 3087, 2339, 6855, 10635, 13021, 11273}},
+{6858, 17, 9669, {1, 3, 1, 1, 11, 39, 51, 255, 119, 691, 559, 3287, 5485, 791, 19283, 51027, 8061}},
+{6859, 17, 9681, {1, 3, 7, 7, 3, 59, 119, 241, 185, 81, 1843, 2313, 7471, 15689, 2271, 59781, 107439}},
+{6860, 17, 9682, {1, 3, 3, 3, 17, 63, 93, 217, 329, 39, 583, 3031, 4315, 4623, 12557, 42063, 11877}},
+{6861, 17, 9688, {1, 1, 1, 1, 15, 57, 37, 233, 387, 639, 37, 425, 637, 1577, 16449, 33665, 80417}},
+{6862, 17, 9697, {1, 1, 1, 15, 25, 1, 67, 159, 423, 961, 959, 417, 5657, 8417, 8127, 29251, 105893}},
+{6863, 17, 9700, {1, 3, 5, 15, 31, 9, 87, 217, 259, 771, 1663, 2899, 1531, 7849, 1961, 61487, 55399}},
+{6864, 17, 9715, {1, 1, 3, 9, 21, 13, 39, 107, 89, 811, 449, 2569, 4617, 8977, 1649, 37721, 48943}},
+{6865, 17, 9722, {1, 3, 7, 15, 15, 59, 63, 195, 287, 677, 269, 1715, 3545, 3269, 5231, 46433, 25921}},
+{6866, 17, 9727, {1, 1, 5, 7, 19, 27, 57, 221, 243, 47, 1791, 2309, 2751, 4403, 7083, 34223, 64905}},
+{6867, 17, 9734, {1, 1, 1, 15, 1, 63, 119, 155, 383, 649, 429, 3857, 7309, 9823, 9539, 8933, 128573}},
+{6868, 17, 9740, {1, 3, 7, 11, 17, 19, 99, 19, 321, 415, 1501, 2123, 6119, 9705, 11397, 39521, 34327}},
+{6869, 17, 9743, {1, 1, 5, 15, 29, 37, 9, 95, 417, 19, 1637, 2949, 4961, 10743, 9619, 16045, 48083}},
+{6870, 17, 9745, {1, 1, 1, 11, 21, 17, 57, 23, 247, 201, 1781, 779, 2207, 2511, 4829, 13847, 77593}},
+{6871, 17, 9757, {1, 3, 1, 13, 7, 1, 95, 87, 223, 73, 1129, 383, 1355, 4965, 29645, 63465, 76281}},
+{6872, 17, 9761, {1, 3, 3, 13, 3, 47, 33, 123, 155, 621, 1019, 1817, 4083, 4723, 24701, 47503, 18007}},
+{6873, 17, 9762, {1, 1, 7, 15, 13, 41, 73, 93, 379, 923, 1183, 2475, 5901, 10599, 10053, 9941, 112107}},
+{6874, 17, 9767, {1, 1, 3, 3, 13, 35, 59, 231, 45, 1011, 1101, 2467, 2703, 10305, 12575, 7587, 25737}},
+{6875, 17, 9768, {1, 3, 7, 1, 21, 31, 9, 55, 373, 779, 397, 1551, 5139, 16339, 1769, 10413, 74059}},
+{6876, 17, 9774, {1, 1, 7, 15, 7, 3, 67, 179, 411, 217, 1219, 13, 1577, 13463, 12263, 41465, 83001}},
+{6877, 17, 9786, {1, 3, 7, 1, 21, 53, 7, 187, 395, 777, 391, 737, 47, 12681, 16749, 26507, 49415}},
+{6878, 17, 9796, {1, 1, 5, 7, 5, 57, 93, 53, 419, 731, 825, 487, 45, 9199, 20947, 56067, 45343}},
+{6879, 17, 9820, {1, 3, 3, 9, 31, 41, 35, 133, 63, 293, 1503, 51, 3111, 15711, 15051, 1965, 64951}},
+{6880, 17, 9823, {1, 1, 5, 9, 9, 47, 53, 229, 405, 621, 1795, 1923, 6609, 6983, 1695, 18021, 71893}},
+{6881, 17, 9839, {1, 1, 5, 9, 23, 13, 107, 13, 149, 759, 1113, 1329, 1747, 14159, 16705, 61841, 82955}},
+{6882, 17, 9844, {1, 3, 3, 9, 25, 49, 31, 145, 481, 609, 1847, 1485, 6345, 7859, 21231, 37303, 69975}},
+{6883, 17, 9851, {1, 3, 1, 15, 13, 49, 59, 221, 27, 517, 431, 3961, 6401, 8483, 10161, 37453, 128237}},
+{6884, 17, 9853, {1, 1, 3, 1, 3, 55, 37, 111, 263, 735, 655, 2831, 2219, 9449, 8413, 49585, 91355}},
+{6885, 17, 9863, {1, 3, 7, 1, 31, 33, 7, 55, 261, 977, 1215, 1967, 7297, 14815, 27009, 35001, 89671}},
+{6886, 17, 9864, {1, 1, 7, 11, 13, 21, 33, 151, 195, 373, 181, 1631, 355, 7857, 12555, 7531, 50417}},
+{6887, 17, 9877, {1, 3, 1, 15, 19, 25, 79, 195, 237, 385, 1531, 2509, 4371, 16103, 3575, 62265, 124251}},
+{6888, 17, 9884, {1, 3, 1, 11, 5, 61, 21, 159, 51, 37, 845, 3075, 8039, 14269, 10505, 36369, 73793}},
+{6889, 17, 9888, {1, 3, 5, 9, 11, 43, 67, 57, 271, 451, 989, 3705, 2481, 10717, 10861, 63785, 10183}},
+{6890, 17, 9897, {1, 3, 3, 5, 13, 29, 119, 171, 439, 459, 479, 3173, 3781, 11131, 6827, 53925, 119939}},
+{6891, 17, 9915, {1, 3, 7, 3, 27, 21, 1, 167, 79, 305, 1283, 1903, 5483, 5727, 17911, 16075, 97629}},
+{6892, 17, 9925, {1, 3, 1, 3, 23, 21, 29, 185, 227, 295, 915, 2033, 6269, 2089, 20785, 15207, 115675}},
+{6893, 17, 9949, {1, 3, 7, 15, 11, 15, 65, 103, 249, 27, 1805, 2079, 4797, 2535, 16865, 61449, 90923}},
+{6894, 17, 9954, {1, 3, 7, 9, 27, 41, 77, 181, 457, 677, 633, 1601, 8085, 2431, 7957, 55913, 38677}},
+{6895, 17, 9960, {1, 1, 5, 7, 11, 37, 3, 221, 79, 895, 1023, 653, 3925, 12755, 19729, 18221, 91123}},
+{6896, 17, 9965, {1, 3, 1, 5, 23, 61, 119, 191, 425, 41, 853, 3497, 6915, 1927, 5513, 55303, 4895}},
+{6897, 17, 9978, {1, 3, 5, 3, 7, 35, 47, 243, 167, 821, 267, 2149, 5797, 6329, 32495, 51037, 18313}},
+{6898, 17, 9986, {1, 1, 7, 9, 23, 29, 79, 205, 115, 839, 1217, 479, 1601, 9681, 1, 35293, 28731}},
+{6899, 17, 9992, {1, 3, 3, 5, 31, 17, 31, 161, 35, 953, 377, 451, 7985, 11371, 15115, 60131, 27033}},
+{6900, 17, 9995, {1, 1, 3, 9, 15, 19, 43, 215, 327, 429, 145, 1837, 725, 14775, 10465, 7367, 21271}},
+{6901, 17, 10005, {1, 3, 7, 13, 31, 17, 85, 49, 487, 795, 1679, 599, 3783, 3195, 2683, 53475, 38603}},
+{6902, 17, 10026, {1, 1, 1, 7, 19, 11, 71, 143, 443, 199, 1117, 3445, 6429, 12037, 13751, 43609, 101563}},
+{6903, 17, 10031, {1, 3, 5, 7, 29, 63, 65, 87, 305, 721, 851, 2235, 4987, 3051, 23015, 1281, 15755}},
+{6904, 17, 10040, {1, 1, 3, 9, 17, 3, 57, 47, 223, 305, 1409, 235, 4379, 5779, 27695, 22535, 9387}},
+{6905, 17, 10051, {1, 1, 3, 11, 25, 33, 75, 141, 155, 699, 85, 1729, 2551, 7101, 7739, 18025, 100819}},
+{6906, 17, 10057, {1, 3, 3, 13, 5, 45, 63, 83, 141, 383, 1931, 3343, 7397, 4823, 28893, 41279, 67805}},
+{6907, 17, 10072, {1, 3, 5, 7, 19, 29, 97, 67, 177, 583, 1783, 4007, 5087, 805, 30999, 23197, 117553}},
+{6908, 17, 10096, {1, 3, 5, 1, 25, 41, 33, 109, 511, 449, 653, 995, 5881, 2163, 13689, 54385, 97419}},
+{6909, 17, 10102, {1, 3, 3, 13, 25, 17, 49, 77, 497, 659, 783, 3513, 3735, 3541, 573, 50237, 99247}},
+{6910, 17, 10105, {1, 3, 1, 7, 17, 13, 37, 169, 19, 965, 289, 455, 6855, 11233, 7553, 7007, 57389}},
+{6911, 17, 10115, {1, 1, 7, 11, 5, 15, 11, 177, 75, 243, 453, 3861, 3091, 4625, 12489, 11537, 74199}},
+{6912, 17, 10124, {1, 1, 5, 13, 17, 21, 23, 57, 343, 985, 1755, 3947, 3899, 11847, 19321, 62295, 51265}},
+{6913, 17, 10139, {1, 1, 3, 9, 19, 37, 31, 243, 433, 725, 535, 3733, 33, 7885, 1425, 41919, 66507}},
+{6914, 17, 10145, {1, 3, 5, 11, 15, 11, 25, 255, 93, 33, 71, 2389, 1855, 317, 12773, 13311, 81927}},
+{6915, 17, 10148, {1, 3, 1, 3, 7, 55, 21, 175, 357, 235, 1679, 931, 2051, 14213, 20539, 38049, 122513}},
+{6916, 17, 10157, {1, 1, 5, 15, 5, 51, 127, 79, 297, 135, 1423, 2783, 7229, 14451, 27619, 7299, 49189}},
+{6917, 17, 10158, {1, 1, 1, 3, 5, 13, 9, 209, 455, 483, 1745, 323, 789, 7645, 26373, 61659, 23671}},
+{6918, 17, 10163, {1, 1, 1, 9, 23, 63, 99, 91, 377, 275, 275, 3005, 1563, 5945, 23825, 33211, 52753}},
+{6919, 17, 10180, {1, 1, 1, 1, 31, 55, 31, 109, 481, 581, 771, 197, 6155, 3465, 8451, 25925, 41159}},
+{6920, 17, 10187, {1, 3, 7, 13, 5, 33, 113, 161, 265, 493, 1723, 513, 5111, 10177, 21755, 5321, 58831}},
+{6921, 17, 10198, {1, 1, 7, 1, 21, 33, 117, 183, 89, 689, 1253, 2215, 6565, 3079, 16343, 22427, 96447}},
+{6922, 17, 10208, {1, 1, 1, 5, 15, 61, 5, 139, 111, 463, 573, 1907, 4615, 14975, 5715, 51017, 69827}},
+{6923, 17, 10214, {1, 1, 1, 13, 3, 3, 117, 249, 25, 361, 1177, 2901, 1601, 11381, 18981, 44811, 47117}},
+{6924, 17, 10220, {1, 1, 5, 3, 29, 5, 49, 221, 247, 57, 553, 1889, 479, 15581, 7035, 7293, 53065}},
+{6925, 17, 10237, {1, 3, 3, 3, 15, 49, 91, 187, 213, 981, 1417, 211, 3719, 13693, 17671, 16691, 57147}},
+{6926, 17, 10238, {1, 1, 7, 9, 7, 17, 109, 185, 459, 769, 1783, 899, 885, 2291, 30023, 26315, 7337}},
+{6927, 17, 10241, {1, 1, 5, 11, 11, 31, 73, 191, 95, 25, 1953, 1387, 1077, 7547, 9661, 57739, 76799}},
+{6928, 17, 10244, {1, 1, 7, 13, 23, 41, 69, 177, 407, 699, 1055, 3653, 1239, 8113, 12823, 1803, 117815}},
+{6929, 17, 10251, {1, 1, 1, 15, 1, 55, 71, 133, 401, 593, 605, 2855, 4569, 3533, 14141, 65457, 125655}},
+{6930, 17, 10253, {1, 1, 7, 9, 31, 55, 53, 11, 65, 17, 561, 925, 1561, 8929, 19859, 57111, 12777}},
+{6931, 17, 10256, {1, 3, 3, 11, 7, 59, 125, 205, 473, 655, 1429, 337, 6829, 7551, 27873, 11667, 39231}},
+{6932, 17, 10259, {1, 3, 3, 9, 13, 23, 25, 161, 443, 545, 1967, 1895, 6929, 5975, 17801, 41769, 30429}},
+{6933, 17, 10266, {1, 3, 7, 13, 15, 1, 99, 43, 45, 451, 21, 639, 7121, 4781, 2813, 419, 17761}},
+{6934, 17, 10284, {1, 1, 5, 13, 11, 9, 53, 83, 443, 441, 1601, 3177, 1913, 12211, 25835, 1733, 4793}},
+{6935, 17, 10290, {1, 3, 3, 1, 13, 15, 11, 187, 471, 699, 1751, 3279, 2305, 15259, 31541, 21357, 73763}},
+{6936, 17, 10331, {1, 3, 5, 9, 23, 11, 125, 57, 261, 479, 879, 719, 3221, 2943, 10593, 11521, 83979}},
+{6937, 17, 10334, {1, 3, 7, 13, 3, 39, 119, 135, 85, 417, 1675, 971, 7577, 12709, 20407, 26105, 97021}},
+{6938, 17, 10350, {1, 1, 5, 11, 15, 63, 83, 141, 281, 663, 1745, 2775, 5605, 9127, 553, 7177, 115969}},
+{6939, 17, 10355, {1, 1, 7, 1, 19, 47, 7, 165, 87, 95, 361, 1879, 6351, 2861, 9103, 37489, 24525}},
+{6940, 17, 10357, {1, 3, 3, 11, 9, 21, 51, 149, 375, 967, 1583, 1427, 1223, 11611, 7481, 36619, 128429}},
+{6941, 17, 10367, {1, 1, 5, 1, 3, 31, 7, 217, 453, 565, 1517, 2847, 6937, 1197, 24339, 44311, 66843}},
+{6942, 17, 10368, {1, 1, 5, 3, 3, 17, 127, 59, 3, 905, 531, 1179, 3559, 5175, 24627, 60941, 129457}},
+{6943, 17, 10377, {1, 1, 1, 7, 15, 15, 1, 31, 373, 643, 279, 3831, 4881, 9763, 17641, 43219, 83109}},
+{6944, 17, 10388, {1, 3, 3, 9, 5, 21, 41, 71, 371, 201, 573, 1481, 3631, 10783, 6679, 1089, 117347}},
+{6945, 17, 10407, {1, 1, 7, 7, 5, 25, 73, 63, 173, 197, 147, 981, 1491, 1597, 11733, 14285, 74021}},
+{6946, 17, 10421, {1, 1, 5, 11, 17, 15, 3, 175, 391, 503, 1745, 319, 791, 5607, 18173, 37319, 92025}},
+{6947, 17, 10434, {1, 3, 1, 1, 9, 37, 43, 81, 439, 951, 805, 251, 4625, 15617, 13715, 62263, 3827}},
+{6948, 17, 10439, {1, 3, 1, 1, 25, 21, 67, 191, 499, 205, 1355, 105, 1637, 563, 22291, 9045, 6545}},
+{6949, 17, 10440, {1, 1, 5, 5, 9, 3, 75, 75, 287, 303, 1767, 1789, 3437, 4637, 9605, 2537, 64935}},
+{6950, 17, 10443, {1, 1, 3, 3, 1, 51, 27, 155, 375, 149, 885, 187, 1551, 13109, 27011, 57301, 41047}},
+{6951, 17, 10446, {1, 1, 7, 5, 21, 23, 1, 81, 163, 231, 2039, 1519, 1279, 15379, 25549, 6711, 81499}},
+{6952, 17, 10457, {1, 1, 3, 5, 3, 37, 71, 243, 165, 365, 379, 351, 4649, 4287, 13395, 30329, 78383}},
+{6953, 17, 10469, {1, 3, 1, 1, 25, 63, 27, 215, 223, 699, 2029, 3737, 5947, 7287, 20813, 4931, 19345}},
+{6954, 17, 10476, {1, 1, 3, 15, 21, 7, 25, 187, 219, 53, 1749, 1797, 3533, 14307, 53, 11095, 75469}},
+{6955, 17, 10479, {1, 1, 3, 13, 27, 31, 91, 121, 481, 291, 915, 535, 4291, 5271, 12181, 55921, 125917}},
+{6956, 17, 10481, {1, 3, 1, 1, 3, 29, 21, 251, 361, 747, 997, 2989, 1809, 7235, 17855, 31027, 100689}},
+{6957, 17, 10494, {1, 3, 7, 1, 21, 13, 49, 93, 183, 673, 881, 1931, 7009, 2565, 26021, 53815, 19807}},
+{6958, 17, 10501, {1, 1, 7, 13, 9, 23, 47, 237, 487, 843, 1357, 919, 1753, 903, 2911, 31527, 73027}},
+{6959, 17, 10505, {1, 1, 1, 1, 25, 33, 97, 241, 421, 375, 73, 2541, 6231, 14659, 15335, 5915, 110791}},
+{6960, 17, 10516, {1, 3, 3, 7, 21, 17, 97, 125, 7, 271, 167, 475, 4887, 1847, 30173, 25913, 36659}},
+{6961, 17, 10532, {1, 1, 3, 15, 15, 37, 67, 5, 463, 423, 823, 941, 1551, 14175, 15377, 6017, 118297}},
+{6962, 17, 10541, {1, 1, 1, 7, 31, 51, 71, 127, 73, 517, 881, 3205, 6219, 11213, 14783, 64275, 70033}},
+{6963, 17, 10547, {1, 3, 1, 5, 17, 17, 57, 107, 359, 999, 1415, 757, 4743, 7775, 14111, 20075, 73269}},
+{6964, 17, 10550, {1, 3, 5, 3, 21, 57, 87, 43, 307, 777, 717, 3329, 4159, 12545, 31355, 31329, 41377}},
+{6965, 17, 10591, {1, 3, 7, 15, 25, 43, 19, 147, 487, 517, 977, 3625, 2311, 14173, 15167, 56563, 110417}},
+{6966, 17, 10597, {1, 3, 3, 11, 23, 1, 67, 157, 461, 169, 231, 1977, 5657, 865, 711, 24213, 76895}},
+{6967, 17, 10602, {1, 1, 7, 13, 5, 37, 51, 165, 331, 97, 431, 3819, 1379, 12083, 27521, 19689, 100119}},
+{6968, 17, 10610, {1, 1, 7, 15, 29, 21, 59, 193, 397, 467, 951, 3037, 2955, 13235, 20981, 63865, 30069}},
+{6969, 17, 10619, {1, 3, 3, 5, 7, 49, 41, 143, 319, 71, 353, 2159, 3043, 15317, 24095, 12017, 64393}},
+{6970, 17, 10631, {1, 1, 5, 13, 25, 45, 57, 153, 311, 805, 953, 1763, 5655, 3961, 12085, 58761, 76533}},
+{6971, 17, 10646, {1, 1, 3, 15, 29, 19, 71, 107, 203, 221, 1173, 1597, 1179, 9649, 21659, 10463, 8195}},
+{6972, 17, 10655, {1, 1, 3, 9, 31, 29, 53, 151, 247, 577, 543, 459, 8141, 5613, 12029, 24199, 118603}},
+{6973, 17, 10665, {1, 3, 1, 5, 1, 55, 103, 23, 405, 5, 181, 3805, 1103, 13389, 6725, 48733, 99639}},
+{6974, 17, 10673, {1, 1, 5, 9, 1, 47, 115, 231, 151, 885, 427, 2849, 361, 12969, 705, 41711, 53587}},
+{6975, 17, 10674, {1, 1, 3, 11, 9, 3, 11, 231, 77, 775, 657, 2721, 3431, 11919, 10425, 29405, 91561}},
+{6976, 17, 10680, {1, 1, 1, 5, 5, 7, 79, 41, 181, 333, 963, 3117, 7703, 2259, 16671, 51139, 27997}},
+{6977, 17, 10693, {1, 3, 7, 7, 13, 55, 59, 157, 377, 711, 1475, 1509, 1375, 6825, 13729, 28613, 109199}},
+{6978, 17, 10700, {1, 3, 3, 3, 13, 11, 51, 1, 67, 609, 467, 2161, 7693, 9019, 1847, 27969, 74863}},
+{6979, 17, 10721, {1, 1, 3, 3, 11, 33, 87, 217, 239, 505, 1451, 2801, 1417, 695, 29883, 15877, 99969}},
+{6980, 17, 10727, {1, 3, 3, 5, 3, 61, 9, 171, 57, 547, 2003, 2335, 2259, 3205, 5639, 21721, 25893}},
+{6981, 17, 10746, {1, 3, 1, 3, 19, 15, 83, 69, 47, 897, 627, 2839, 7123, 8567, 14707, 13159, 125139}},
+{6982, 17, 10748, {1, 3, 7, 11, 1, 59, 53, 33, 135, 1009, 1829, 3011, 1245, 421, 28909, 45517, 55071}},
+{6983, 17, 10757, {1, 1, 5, 9, 3, 27, 11, 243, 235, 683, 1329, 3145, 2141, 14027, 3707, 5933, 51965}},
+{6984, 17, 10761, {1, 1, 5, 7, 13, 63, 79, 105, 27, 195, 1657, 3107, 1245, 1681, 29619, 10589, 78197}},
+{6985, 17, 10770, {1, 3, 3, 7, 21, 1, 5, 79, 73, 125, 1587, 3053, 5977, 10745, 28343, 39023, 56201}},
+{6986, 17, 10776, {1, 1, 3, 15, 23, 21, 39, 41, 173, 913, 1267, 1323, 2967, 1979, 16763, 53753, 21905}},
+{6987, 17, 10782, {1, 1, 5, 7, 11, 11, 117, 151, 409, 345, 1461, 1703, 687, 557, 31651, 35507, 54909}},
+{6988, 17, 10791, {1, 1, 1, 15, 15, 49, 55, 223, 289, 765, 1737, 1117, 3717, 15465, 31949, 55061, 97091}},
+{6989, 17, 10792, {1, 1, 5, 9, 21, 29, 99, 13, 119, 35, 1461, 61, 5155, 6785, 15957, 11295, 52203}},
+{6990, 17, 10805, {1, 3, 5, 7, 23, 39, 73, 161, 465, 715, 153, 3529, 2243, 13773, 16573, 26233, 130263}},
+{6991, 17, 10810, {1, 3, 7, 9, 11, 51, 5, 149, 501, 119, 2047, 3417, 3955, 15055, 31633, 473, 127305}},
+{6992, 17, 10832, {1, 1, 1, 9, 31, 57, 91, 119, 215, 11, 1013, 3969, 1285, 11521, 8039, 36737, 86365}},
+{6993, 17, 10835, {1, 1, 5, 3, 7, 17, 9, 27, 59, 883, 541, 3027, 6219, 1091, 2453, 38247, 21323}},
+{6994, 17, 10841, {1, 1, 1, 1, 25, 39, 55, 249, 61, 313, 467, 1763, 4067, 8367, 32431, 44463, 66439}},
+{6995, 17, 10842, {1, 3, 3, 1, 13, 3, 37, 209, 21, 653, 1971, 3649, 6165, 3789, 12793, 56327, 60351}},
+{6996, 17, 10847, {1, 1, 7, 9, 31, 33, 21, 51, 313, 631, 515, 1761, 4149, 2601, 12481, 25975, 94061}},
+{6997, 17, 10853, {1, 1, 7, 15, 3, 7, 55, 129, 297, 735, 779, 633, 3265, 11713, 3893, 61197, 113991}},
+{6998, 17, 10860, {1, 3, 5, 13, 1, 15, 27, 253, 435, 595, 1163, 2753, 7399, 15225, 26215, 59753, 74933}},
+{6999, 17, 10871, {1, 1, 7, 7, 15, 23, 111, 43, 467, 957, 1687, 2893, 2315, 2025, 1475, 9061, 101611}},
+{7000, 17, 10878, {1, 1, 3, 3, 29, 41, 53, 169, 125, 415, 361, 869, 3399, 8821, 18193, 38575, 73979}},
+{7001, 17, 10881, {1, 1, 1, 15, 3, 5, 27, 5, 293, 765, 1809, 1961, 955, 12441, 10915, 2363, 49617}},
+{7002, 17, 10888, {1, 1, 5, 15, 19, 11, 3, 91, 59, 323, 545, 1177, 7967, 2729, 14085, 3283, 79859}},
+{7003, 17, 10894, {1, 1, 7, 13, 11, 17, 29, 163, 295, 951, 311, 3471, 1339, 10719, 701, 32377, 41685}},
+{7004, 17, 10901, {1, 3, 5, 7, 21, 19, 81, 247, 495, 767, 251, 3455, 6383, 7221, 19943, 64865, 33193}},
+{7005, 17, 10915, {1, 1, 7, 15, 23, 41, 63, 195, 311, 619, 211, 743, 889, 7627, 12527, 15865, 40103}},
+{7006, 17, 10918, {1, 1, 3, 1, 23, 23, 57, 221, 153, 27, 939, 3949, 411, 6357, 31985, 939, 91001}},
+{7007, 17, 10922, {1, 3, 5, 15, 7, 5, 35, 135, 245, 921, 307, 823, 775, 4891, 24575, 53503, 48147}},
+{7008, 17, 10936, {1, 1, 5, 7, 9, 31, 23, 139, 477, 495, 287, 807, 1855, 8321, 13963, 52197, 78509}},
+{7009, 17, 10954, {1, 3, 3, 3, 29, 59, 33, 83, 211, 65, 623, 1269, 1745, 16383, 10759, 57199, 14035}},
+{7010, 17, 10968, {1, 3, 3, 15, 25, 55, 69, 171, 411, 937, 731, 2275, 2597, 4133, 5089, 50507, 39989}},
+{7011, 17, 10971, {1, 3, 1, 9, 5, 47, 51, 21, 171, 913, 233, 43, 2673, 471, 27077, 57039, 32579}},
+{7012, 17, 10973, {1, 3, 5, 3, 29, 35, 5, 105, 233, 379, 77, 1775, 2409, 4597, 19879, 12691, 49739}},
+{7013, 17, 10978, {1, 3, 7, 13, 17, 29, 117, 177, 163, 927, 45, 3227, 7263, 5551, 9219, 32101, 122473}},
+{7014, 17, 10998, {1, 1, 7, 5, 31, 39, 75, 147, 311, 991, 1431, 3821, 6891, 9637, 17887, 661, 23067}},
+{7015, 17, 11009, {1, 3, 5, 13, 31, 53, 69, 79, 153, 329, 207, 479, 2395, 6505, 29553, 52023, 31531}},
+{7016, 17, 11021, {1, 3, 1, 7, 15, 7, 87, 233, 25, 275, 981, 1207, 3083, 16349, 30185, 60611, 120607}},
+{7017, 17, 11029, {1, 1, 5, 3, 21, 7, 47, 173, 291, 965, 65, 545, 7465, 4471, 2249, 34281, 107217}},
+{7018, 17, 11030, {1, 1, 3, 11, 19, 53, 17, 243, 193, 297, 1937, 1513, 4979, 14867, 15497, 10049, 9135}},
+{7019, 17, 11034, {1, 3, 1, 3, 25, 39, 29, 63, 231, 145, 247, 1745, 3439, 8635, 26687, 18595, 67123}},
+{7020, 17, 11050, {1, 1, 7, 9, 29, 33, 89, 175, 429, 675, 891, 1739, 3567, 5453, 30427, 33671, 83395}},
+{7021, 17, 11063, {1, 3, 1, 5, 31, 25, 69, 237, 235, 307, 1217, 3805, 153, 13387, 6209, 14179, 128725}},
+{7022, 17, 11064, {1, 1, 3, 3, 19, 45, 117, 135, 67, 601, 369, 3369, 5505, 2049, 24099, 22515, 96575}},
+{7023, 17, 11077, {1, 1, 1, 3, 3, 45, 29, 255, 327, 77, 1103, 4067, 2875, 6487, 5903, 26625, 19631}},
+{7024, 17, 11078, {1, 3, 5, 1, 31, 63, 115, 7, 255, 855, 913, 1779, 7001, 14387, 26765, 51987, 3191}},
+{7025, 17, 11105, {1, 1, 3, 11, 15, 43, 71, 247, 303, 231, 445, 3963, 3699, 11851, 18941, 43465, 63431}},
+{7026, 17, 11106, {1, 1, 3, 5, 31, 33, 93, 127, 267, 399, 653, 1997, 5005, 14535, 4813, 64065, 2159}},
+{7027, 17, 11126, {1, 3, 7, 13, 31, 39, 61, 155, 141, 515, 1217, 161, 4309, 3697, 22445, 43599, 43329}},
+{7028, 17, 11129, {1, 3, 3, 3, 7, 51, 103, 147, 511, 971, 195, 3731, 6629, 12125, 12053, 34951, 60059}},
+{7029, 17, 11135, {1, 1, 5, 11, 21, 49, 99, 31, 55, 309, 1805, 2253, 7095, 15265, 28445, 54813, 48615}},
+{7030, 17, 11151, {1, 3, 1, 15, 9, 41, 61, 125, 65, 143, 1567, 3259, 6757, 653, 31601, 63127, 52179}},
+{7031, 17, 11159, {1, 1, 5, 3, 29, 5, 19, 197, 153, 447, 7, 1713, 469, 6043, 1259, 63641, 29171}},
+{7032, 17, 11165, {1, 3, 3, 7, 3, 41, 95, 245, 445, 15, 607, 565, 2361, 2673, 21077, 20153, 6199}},
+{7033, 17, 11176, {1, 1, 5, 1, 5, 59, 93, 127, 485, 663, 683, 635, 1599, 16377, 31819, 6539, 27789}},
+{7034, 17, 11179, {1, 3, 1, 3, 31, 3, 11, 215, 441, 1005, 1815, 3945, 5109, 5539, 23935, 62671, 90731}},
+{7035, 17, 11182, {1, 3, 3, 1, 13, 47, 19, 229, 191, 427, 1141, 2321, 7105, 1587, 26347, 63265, 23377}},
+{7036, 17, 11189, {1, 1, 5, 15, 31, 55, 61, 93, 89, 945, 1203, 3631, 4457, 15097, 32019, 41747, 46009}},
+{7037, 17, 11204, {1, 1, 5, 13, 5, 33, 69, 59, 93, 247, 503, 421, 1923, 9855, 9825, 14257, 98663}},
+{7038, 17, 11216, {1, 3, 1, 13, 27, 21, 91, 39, 131, 571, 1527, 2715, 2061, 627, 19705, 47165, 84345}},
+{7039, 17, 11232, {1, 1, 1, 7, 3, 3, 7, 251, 225, 959, 1017, 2423, 6163, 1549, 7473, 3193, 104259}},
+{7040, 17, 11235, {1, 3, 3, 1, 5, 5, 115, 221, 505, 649, 1525, 2459, 167, 1899, 23939, 29253, 122835}},
+{7041, 17, 11242, {1, 3, 1, 5, 15, 9, 123, 221, 133, 43, 31, 1211, 4737, 5001, 20065, 6369, 93865}},
+{7042, 17, 11250, {1, 1, 5, 11, 11, 5, 23, 29, 333, 133, 1469, 1895, 5879, 15599, 2131, 25005, 96271}},
+{7043, 17, 11264, {1, 1, 3, 11, 25, 11, 19, 57, 397, 645, 1233, 2433, 6371, 10577, 15489, 60709, 3957}},
+{7044, 17, 11273, {1, 3, 1, 1, 19, 3, 33, 131, 429, 835, 1363, 2213, 3185, 14385, 8831, 43159, 32975}},
+{7045, 17, 11282, {1, 1, 5, 5, 23, 11, 127, 139, 213, 259, 897, 1913, 5737, 1287, 26617, 4885, 30193}},
+{7046, 17, 11288, {1, 3, 5, 13, 3, 27, 99, 31, 11, 27, 1003, 2473, 7055, 12923, 4269, 41433, 90637}},
+{7047, 17, 11291, {1, 3, 1, 7, 17, 25, 95, 151, 199, 237, 207, 1879, 2943, 9845, 3765, 53533, 111191}},
+{7048, 17, 11293, {1, 3, 1, 9, 19, 27, 5, 249, 85, 185, 1883, 1401, 2041, 12721, 20593, 30993, 2601}},
+{7049, 17, 11318, {1, 3, 3, 9, 23, 1, 15, 133, 387, 779, 707, 2723, 4485, 989, 27125, 37295, 125319}},
+{7050, 17, 11321, {1, 1, 7, 3, 9, 41, 81, 151, 349, 941, 357, 3817, 7123, 10079, 27519, 107, 102281}},
+{7051, 17, 11329, {1, 1, 1, 1, 13, 5, 111, 167, 73, 85, 1185, 1213, 333, 153, 13101, 38087, 39389}},
+{7052, 17, 11336, {1, 3, 3, 15, 11, 41, 99, 231, 377, 539, 1335, 1059, 5373, 9611, 27927, 29801, 85749}},
+{7053, 17, 11339, {1, 3, 1, 9, 19, 37, 125, 27, 15, 699, 1867, 2711, 1589, 1675, 32007, 61339, 96919}},
+{7054, 17, 11342, {1, 3, 3, 3, 3, 27, 21, 159, 249, 783, 1517, 2923, 2609, 1207, 13705, 57371, 43603}},
+{7055, 17, 11356, {1, 1, 5, 15, 17, 55, 77, 1, 401, 897, 987, 345, 5283, 5827, 17755, 44371, 13253}},
+{7056, 17, 11383, {1, 3, 1, 7, 3, 3, 99, 237, 487, 405, 771, 3503, 1199, 4779, 26893, 45821, 46383}},
+{7057, 17, 11389, {1, 1, 7, 3, 9, 47, 81, 27, 459, 989, 1891, 3997, 4081, 4075, 15079, 65081, 125185}},
+{7058, 17, 11405, {1, 3, 5, 9, 25, 23, 71, 251, 251, 197, 353, 3553, 2165, 2953, 3733, 52369, 100641}},
+{7059, 17, 11411, {1, 1, 1, 5, 25, 43, 63, 187, 495, 345, 1547, 2293, 7327, 7797, 14001, 61865, 40329}},
+{7060, 17, 11423, {1, 1, 5, 15, 25, 37, 67, 23, 315, 801, 71, 1235, 7293, 7207, 30929, 9417, 94735}},
+{7061, 17, 11424, {1, 1, 1, 3, 23, 29, 87, 171, 337, 457, 1597, 3933, 4151, 1237, 19563, 56997, 81497}},
+{7062, 17, 11430, {1, 3, 3, 11, 3, 33, 79, 239, 277, 611, 205, 2283, 7459, 425, 21999, 26491, 58681}},
+{7063, 17, 11444, {1, 1, 7, 1, 5, 37, 53, 93, 205, 97, 779, 3623, 7777, 521, 21915, 46539, 128811}},
+{7064, 17, 11447, {1, 1, 5, 7, 19, 7, 39, 183, 299, 193, 1351, 3867, 5709, 11655, 1231, 15555, 128023}},
+{7065, 17, 11459, {1, 3, 7, 11, 31, 13, 113, 57, 197, 841, 921, 2087, 2195, 8279, 8353, 1955, 22121}},
+{7066, 17, 11465, {1, 3, 3, 11, 21, 55, 61, 105, 357, 747, 363, 3511, 2547, 16283, 25747, 56041, 33695}},
+{7067, 17, 11473, {1, 3, 3, 13, 27, 13, 5, 27, 93, 691, 1869, 2331, 3131, 14411, 2355, 37195, 129273}},
+{7068, 17, 11479, {1, 3, 3, 7, 27, 9, 11, 165, 435, 811, 215, 1617, 347, 4289, 29373, 15749, 91445}},
+{7069, 17, 11501, {1, 1, 7, 13, 29, 3, 95, 53, 457, 633, 959, 3705, 7461, 9307, 21963, 51599, 6751}},
+{7070, 17, 11510, {1, 1, 1, 15, 29, 25, 95, 1, 125, 61, 683, 2067, 6485, 9095, 5571, 61281, 70865}},
+{7071, 17, 11514, {1, 1, 7, 7, 1, 35, 119, 107, 247, 991, 237, 1865, 3961, 12583, 11417, 14913, 90897}},
+{7072, 17, 11522, {1, 3, 7, 15, 11, 51, 73, 193, 289, 381, 1767, 3803, 3197, 3797, 15059, 19393, 98947}},
+{7073, 17, 11527, {1, 1, 5, 3, 13, 7, 91, 223, 347, 59, 1721, 1501, 6391, 4141, 14495, 47283, 47237}},
+{7074, 17, 11533, {1, 3, 7, 11, 17, 39, 43, 247, 35, 423, 1859, 3199, 5343, 7061, 8609, 6819, 88575}},
+{7075, 17, 11536, {1, 1, 5, 13, 31, 27, 57, 19, 499, 1007, 1965, 795, 1231, 12755, 24631, 53343, 82305}},
+{7076, 17, 11548, {1, 1, 1, 9, 13, 23, 127, 161, 245, 467, 2025, 2545, 3085, 13035, 27087, 14461, 35971}},
+{7077, 17, 11551, {1, 3, 5, 1, 7, 3, 99, 159, 75, 341, 1755, 2337, 5981, 5055, 19445, 30043, 61427}},
+{7078, 17, 11552, {1, 1, 1, 7, 13, 33, 41, 73, 267, 21, 961, 3509, 6839, 13215, 8471, 46735, 93071}},
+{7079, 17, 11555, {1, 3, 7, 7, 3, 25, 81, 239, 357, 445, 1483, 389, 3891, 5131, 21357, 34757, 111063}},
+{7080, 17, 11572, {1, 3, 7, 1, 1, 37, 119, 121, 195, 935, 1711, 2049, 7001, 7117, 9957, 7309, 102293}},
+{7081, 17, 11587, {1, 1, 7, 11, 1, 49, 107, 95, 149, 329, 289, 1121, 7217, 15091, 19071, 13801, 13}},
+{7082, 17, 11601, {1, 1, 1, 13, 17, 17, 7, 105, 81, 1017, 1867, 1567, 5133, 7325, 19797, 16301, 40471}},
+{7083, 17, 11613, {1, 3, 5, 5, 27, 45, 117, 135, 499, 53, 973, 121, 53, 8771, 11893, 35827, 57691}},
+{7084, 17, 11614, {1, 1, 1, 1, 7, 23, 11, 163, 17, 871, 129, 2959, 5583, 12253, 1419, 28367, 32539}},
+{7085, 17, 11618, {1, 1, 3, 5, 23, 31, 127, 33, 115, 799, 331, 1873, 1729, 1383, 23601, 51145, 72027}},
+{7086, 17, 11624, {1, 1, 1, 9, 15, 49, 105, 163, 51, 539, 451, 3983, 6509, 1073, 30757, 13971, 51371}},
+{7087, 17, 11630, {1, 1, 7, 1, 1, 57, 71, 135, 5, 171, 983, 951, 777, 9257, 3607, 3239, 76237}},
+{7088, 17, 11663, {1, 1, 7, 7, 21, 17, 49, 175, 9, 807, 289, 2777, 7309, 14911, 28349, 43871, 96019}},
+{7089, 17, 11682, {1, 3, 1, 13, 5, 7, 83, 215, 297, 319, 347, 633, 7285, 8293, 18811, 31065, 114077}},
+{7090, 17, 11684, {1, 3, 1, 11, 3, 29, 91, 231, 161, 601, 355, 2719, 2941, 6065, 21849, 58051, 46515}},
+{7091, 17, 11702, {1, 1, 3, 9, 25, 41, 111, 135, 71, 755, 29, 131, 1339, 5053, 15713, 14557, 106777}},
+{7092, 17, 11705, {1, 1, 7, 13, 21, 59, 13, 45, 503, 71, 1611, 4021, 2359, 11653, 7261, 14537, 33031}},
+{7093, 17, 11713, {1, 1, 1, 11, 5, 31, 1, 181, 37, 527, 1345, 1979, 4899, 3289, 25181, 49959, 44609}},
+{7094, 17, 11731, {1, 3, 3, 13, 21, 25, 33, 105, 57, 637, 841, 1595, 3881, 5053, 9441, 58717, 127255}},
+{7095, 17, 11734, {1, 3, 5, 7, 23, 57, 9, 117, 281, 769, 1573, 2857, 1139, 6413, 14001, 21097, 55215}},
+{7096, 17, 11740, {1, 1, 7, 7, 3, 5, 75, 149, 269, 353, 437, 61, 2451, 11987, 17243, 5649, 105107}},
+{7097, 17, 11747, {1, 1, 3, 3, 25, 61, 53, 21, 113, 57, 1415, 2825, 11, 14977, 6159, 4181, 96765}},
+{7098, 17, 11754, {1, 1, 7, 5, 15, 25, 121, 159, 71, 773, 601, 147, 6507, 16171, 16607, 32017, 77845}},
+{7099, 17, 11761, {1, 3, 1, 1, 27, 19, 59, 109, 347, 991, 165, 683, 6147, 493, 22017, 19069, 52857}},
+{7100, 17, 11762, {1, 1, 5, 5, 21, 1, 93, 115, 407, 15, 421, 1305, 3495, 14287, 31831, 65347, 35339}},
+{7101, 17, 11787, {1, 3, 5, 11, 29, 35, 87, 27, 453, 769, 1991, 2757, 2607, 9225, 293, 49441, 18185}},
+{7102, 17, 11792, {1, 1, 5, 3, 23, 41, 67, 195, 499, 903, 197, 1121, 4691, 9277, 29225, 34597, 37395}},
+{7103, 17, 11814, {1, 1, 7, 7, 21, 7, 65, 245, 241, 909, 1063, 2271, 1979, 10287, 1747, 61523, 72969}},
+{7104, 17, 11823, {1, 3, 1, 13, 23, 25, 3, 89, 385, 481, 1463, 3431, 6907, 1129, 3519, 35789, 82585}},
+{7105, 17, 11825, {1, 3, 5, 3, 31, 17, 11, 209, 77, 991, 885, 3341, 6895, 3429, 21611, 38555, 35475}},
+{7106, 17, 11837, {1, 1, 3, 1, 9, 61, 27, 219, 433, 787, 281, 1155, 2915, 4449, 30881, 34461, 15357}},
+{7107, 17, 11838, {1, 1, 3, 15, 27, 55, 51, 101, 117, 799, 1475, 4013, 5145, 14991, 27847, 49537, 57339}},
+{7108, 17, 11846, {1, 3, 7, 13, 13, 9, 13, 167, 283, 883, 1501, 2635, 1463, 3353, 14961, 30349, 62043}},
+{7109, 17, 11855, {1, 1, 7, 3, 3, 47, 119, 37, 389, 655, 701, 2471, 5749, 6645, 845, 27065, 82299}},
+{7110, 17, 11864, {1, 1, 7, 15, 27, 5, 95, 195, 227, 991, 1137, 3715, 4901, 9459, 1917, 43857, 126505}},
+{7111, 17, 11876, {1, 3, 7, 5, 29, 35, 45, 165, 361, 257, 641, 1265, 6533, 11333, 26081, 12621, 66909}},
+{7112, 17, 11885, {1, 1, 1, 11, 19, 55, 73, 137, 29, 355, 725, 1161, 6717, 2035, 19769, 43531, 72577}},
+{7113, 17, 11904, {1, 3, 7, 5, 19, 3, 99, 17, 387, 621, 137, 117, 6567, 7667, 14979, 17981, 68319}},
+{7114, 17, 11909, {1, 1, 5, 5, 7, 53, 31, 33, 245, 371, 691, 2763, 95, 16369, 7853, 29839, 34957}},
+{7115, 17, 11913, {1, 1, 3, 1, 9, 1, 83, 177, 17, 141, 1739, 1791, 3849, 3093, 22271, 53755, 7817}},
+{7116, 17, 11916, {1, 3, 3, 1, 3, 51, 71, 69, 439, 987, 807, 3353, 4747, 16031, 29591, 61091, 95675}},
+{7117, 17, 11940, {1, 3, 5, 1, 17, 47, 51, 211, 7, 5, 1751, 1735, 1647, 13389, 13861, 49427, 13577}},
+{7118, 17, 11943, {1, 3, 7, 5, 11, 23, 17, 55, 11, 61, 809, 927, 6533, 1509, 29261, 21555, 55075}},
+{7119, 17, 11972, {1, 3, 1, 1, 15, 51, 37, 47, 183, 117, 597, 3225, 1435, 13359, 19127, 17339, 17345}},
+{7120, 17, 11981, {1, 1, 5, 3, 5, 11, 33, 179, 295, 129, 29, 713, 1561, 27, 21087, 50305, 39253}},
+{7121, 17, 11990, {1, 1, 5, 7, 17, 25, 105, 241, 41, 915, 1223, 2625, 617, 10983, 10749, 2137, 101831}},
+{7122, 17, 11993, {1, 3, 5, 7, 15, 15, 85, 23, 193, 625, 1803, 2903, 1935, 523, 8377, 12165, 105851}},
+{7123, 17, 12000, {1, 3, 3, 7, 3, 35, 5, 107, 191, 855, 405, 1659, 5523, 5011, 6401, 45187, 31345}},
+{7124, 17, 12005, {1, 3, 3, 1, 9, 21, 103, 75, 501, 669, 547, 3685, 411, 2663, 14743, 13869, 124389}},
+{7125, 17, 12015, {1, 3, 5, 13, 15, 37, 39, 79, 19, 165, 1685, 1367, 5951, 12303, 13423, 51083, 119933}},
+{7126, 17, 12020, {1, 1, 3, 1, 7, 25, 1, 221, 415, 591, 859, 1457, 1789, 2269, 15947, 31913, 86397}},
+{7127, 17, 12038, {1, 3, 7, 15, 11, 49, 15, 171, 45, 925, 407, 1719, 4505, 5695, 17397, 28849, 77}},
+{7128, 17, 12042, {1, 1, 3, 11, 21, 33, 91, 115, 263, 141, 753, 3335, 7695, 1981, 6029, 22629, 2467}},
+{7129, 17, 12056, {1, 3, 5, 3, 25, 5, 21, 67, 429, 323, 223, 2395, 761, 14817, 12387, 37905, 19551}},
+{7130, 17, 12065, {1, 3, 1, 15, 31, 43, 35, 255, 73, 533, 1093, 965, 557, 607, 6913, 35283, 12261}},
+{7131, 17, 12066, {1, 3, 1, 15, 25, 13, 39, 83, 77, 269, 1205, 1577, 4095, 6669, 8643, 48807, 98227}},
+{7132, 17, 12072, {1, 3, 3, 7, 31, 57, 25, 177, 441, 973, 1255, 675, 5579, 4899, 27925, 52555, 70845}},
+{7133, 17, 12080, {1, 3, 1, 5, 13, 47, 15, 75, 387, 461, 1909, 841, 7, 9567, 913, 41411, 12565}},
+{7134, 17, 12083, {1, 1, 5, 7, 5, 21, 17, 189, 319, 645, 403, 2723, 6747, 15471, 26533, 12709, 49417}},
+{7135, 17, 12090, {1, 1, 5, 7, 7, 41, 99, 179, 137, 435, 1061, 3987, 4583, 4101, 23781, 54263, 36695}},
+{7136, 17, 12092, {1, 3, 1, 11, 19, 37, 125, 177, 111, 921, 1003, 1433, 1399, 3991, 28193, 40471, 97041}},
+{7137, 17, 12103, {1, 1, 7, 1, 5, 33, 7, 139, 127, 413, 1171, 2237, 265, 10145, 18793, 28957, 25037}},
+{7138, 17, 12109, {1, 3, 1, 1, 25, 37, 13, 17, 471, 195, 1645, 3165, 5635, 8433, 28507, 453, 107709}},
+{7139, 17, 12112, {1, 3, 3, 11, 1, 55, 119, 97, 243, 371, 95, 97, 7833, 777, 12177, 1861, 56323}},
+{7140, 17, 12117, {1, 1, 7, 5, 7, 29, 59, 219, 405, 411, 275, 111, 4899, 10367, 24331, 57295, 47065}},
+{7141, 17, 12121, {1, 1, 3, 3, 19, 23, 91, 111, 221, 195, 1013, 3001, 3227, 6359, 30383, 49699, 49157}},
+{7142, 17, 12137, {1, 1, 5, 7, 1, 21, 125, 23, 177, 291, 249, 861, 1899, 14101, 5079, 5211, 14373}},
+{7143, 17, 12143, {1, 1, 7, 11, 11, 59, 33, 41, 291, 919, 253, 609, 1657, 14633, 15189, 22245, 99815}},
+{7144, 17, 12145, {1, 3, 5, 3, 23, 49, 71, 137, 393, 343, 1845, 343, 5853, 6639, 17435, 62143, 76041}},
+{7145, 17, 12148, {1, 1, 5, 3, 9, 27, 55, 193, 25, 965, 1453, 2739, 3785, 12497, 29607, 11111, 25145}},
+{7146, 17, 12168, {1, 1, 1, 1, 29, 11, 111, 73, 491, 629, 405, 2779, 5313, 589, 1459, 47555, 67945}},
+{7147, 17, 12174, {1, 3, 1, 7, 13, 21, 99, 75, 79, 963, 207, 1725, 6875, 8359, 10573, 45219, 130463}},
+{7148, 17, 12188, {1, 3, 7, 13, 1, 17, 105, 227, 487, 891, 1053, 1333, 7651, 5415, 18661, 22085, 82055}},
+{7149, 17, 12191, {1, 1, 3, 3, 31, 27, 91, 93, 383, 331, 965, 3035, 4931, 13265, 9729, 28985, 118227}},
+{7150, 17, 12192, {1, 3, 1, 1, 11, 9, 59, 191, 253, 909, 301, 3811, 255, 14937, 28627, 54509, 95993}},
+{7151, 17, 12201, {1, 3, 3, 5, 11, 5, 105, 77, 323, 713, 637, 1857, 2697, 12473, 12261, 2933, 101287}},
+{7152, 17, 12224, {1, 3, 3, 11, 9, 63, 19, 19, 213, 859, 1479, 2849, 1067, 5749, 13511, 14933, 11125}},
+{7153, 17, 12230, {1, 1, 5, 9, 19, 19, 13, 49, 237, 511, 533, 543, 575, 8095, 27335, 18847, 18173}},
+{7154, 17, 12239, {1, 3, 5, 5, 9, 53, 47, 157, 35, 827, 637, 2327, 787, 5269, 5145, 10135, 111273}},
+{7155, 17, 12242, {1, 3, 3, 7, 27, 41, 69, 173, 53, 655, 809, 481, 6999, 3101, 20781, 2481, 94957}},
+{7156, 17, 12251, {1, 1, 5, 11, 17, 23, 95, 201, 363, 613, 863, 1365, 1131, 15417, 20705, 8283, 55235}},
+{7157, 17, 12258, {1, 1, 5, 13, 3, 15, 37, 219, 291, 595, 1665, 1861, 1953, 15385, 20569, 46085, 15163}},
+{7158, 17, 12264, {1, 3, 3, 11, 23, 43, 125, 133, 85, 45, 819, 243, 7325, 8723, 1499, 58139, 120353}},
+{7159, 17, 12310, {1, 1, 1, 11, 21, 49, 91, 145, 175, 619, 1817, 3533, 8155, 7521, 30361, 45431, 130175}},
+{7160, 17, 12319, {1, 1, 3, 1, 11, 59, 57, 51, 37, 903, 1221, 3813, 8043, 14165, 31503, 7905, 61515}},
+{7161, 17, 12323, {1, 1, 1, 1, 15, 9, 115, 175, 285, 839, 97, 3119, 719, 15283, 22947, 25417, 40665}},
+{7162, 17, 12325, {1, 3, 1, 7, 5, 49, 127, 111, 373, 747, 393, 2351, 4577, 15227, 23149, 16901, 80253}},
+{7163, 17, 12332, {1, 1, 5, 3, 15, 5, 95, 197, 251, 275, 831, 1389, 3907, 12343, 11599, 24369, 65361}},
+{7164, 17, 12343, {1, 3, 7, 5, 25, 37, 11, 75, 417, 789, 745, 811, 2189, 15381, 4785, 41657, 2897}},
+{7165, 17, 12344, {1, 3, 1, 13, 29, 55, 55, 33, 279, 383, 1645, 975, 4683, 1357, 1149, 30271, 90527}},
+{7166, 17, 12352, {1, 3, 5, 3, 5, 3, 79, 61, 371, 225, 141, 369, 1037, 12249, 29431, 37253, 9899}},
+{7167, 17, 12370, {1, 1, 3, 13, 13, 7, 127, 147, 507, 119, 1085, 1949, 6289, 10179, 10107, 55989, 74395}},
+{7168, 17, 12388, {1, 3, 1, 7, 21, 35, 53, 209, 103, 365, 683, 553, 4977, 14371, 24037, 11453, 45369}},
+{7169, 17, 12395, {1, 1, 5, 11, 27, 39, 41, 145, 437, 55, 893, 2375, 4977, 5451, 21225, 46815, 1423}},
+{7170, 17, 12403, {1, 3, 5, 1, 23, 53, 113, 75, 209, 323, 1975, 3809, 1829, 14625, 3821, 53773, 129173}},
+{7171, 17, 12409, {1, 1, 5, 3, 7, 51, 97, 73, 289, 481, 339, 1375, 3101, 4395, 13933, 33267, 68115}},
+{7172, 17, 12410, {1, 3, 5, 1, 5, 45, 83, 57, 3, 667, 109, 3979, 6447, 8603, 20147, 49291, 18023}},
+{7173, 17, 12415, {1, 3, 7, 1, 11, 7, 45, 233, 65, 745, 1009, 2979, 5965, 10681, 3499, 23077, 87479}},
+{7174, 17, 12419, {1, 3, 3, 3, 13, 25, 25, 189, 197, 83, 1429, 2857, 2877, 8577, 24811, 33049, 46009}},
+{7175, 17, 12426, {1, 1, 1, 7, 11, 47, 47, 255, 89, 625, 449, 3747, 2035, 3509, 4901, 2961, 14073}},
+{7176, 17, 12439, {1, 1, 1, 13, 9, 55, 35, 47, 389, 573, 847, 1037, 1345, 5487, 7575, 57435, 77303}},
+{7177, 17, 12445, {1, 1, 5, 11, 25, 51, 113, 109, 79, 339, 95, 2049, 5881, 13209, 20041, 26419, 110319}},
+{7178, 17, 12459, {1, 1, 7, 1, 27, 15, 93, 145, 253, 917, 1211, 2221, 1087, 14209, 32097, 20083, 67841}},
+{7179, 17, 12464, {1, 1, 3, 15, 13, 19, 67, 107, 75, 919, 2047, 3675, 6231, 1243, 14335, 35939, 17281}},
+{7180, 17, 12474, {1, 3, 7, 5, 27, 47, 53, 239, 475, 231, 1645, 825, 4039, 15985, 10853, 32951, 34985}},
+{7181, 17, 12484, {1, 1, 7, 5, 15, 61, 107, 93, 51, 221, 717, 2859, 7885, 9571, 11841, 45143, 33723}},
+{7182, 17, 12491, {1, 1, 7, 7, 9, 25, 63, 25, 47, 55, 2041, 3965, 215, 14857, 31669, 54775, 42157}},
+{7183, 17, 12501, {1, 3, 5, 1, 5, 45, 123, 109, 471, 599, 479, 475, 3499, 11963, 23709, 18851, 66861}},
+{7184, 17, 12505, {1, 3, 3, 3, 5, 29, 71, 81, 315, 329, 1471, 3995, 623, 5871, 11171, 15645, 97251}},
+{7185, 17, 12508, {1, 1, 7, 11, 15, 15, 101, 173, 445, 871, 765, 1121, 1937, 13055, 7309, 54175, 85559}},
+{7186, 17, 12511, {1, 3, 5, 7, 7, 13, 43, 237, 361, 981, 19, 3113, 4681, 3313, 19147, 35193, 87281}},
+{7187, 17, 12521, {1, 3, 5, 3, 27, 13, 37, 51, 233, 573, 1599, 2807, 7149, 12083, 28927, 7797, 130879}},
+{7188, 17, 12522, {1, 1, 1, 13, 31, 63, 127, 89, 209, 717, 1075, 3887, 1427, 87, 18565, 39973, 55025}},
+{7189, 17, 12530, {1, 3, 1, 5, 15, 11, 121, 247, 273, 613, 1857, 2059, 7399, 13951, 9025, 39523, 68121}},
+{7190, 17, 12544, {1, 3, 7, 13, 31, 9, 61, 143, 375, 433, 471, 1315, 5299, 1167, 10099, 11445, 51693}},
+{7191, 17, 12547, {1, 1, 7, 9, 25, 31, 125, 5, 13, 595, 621, 3551, 7959, 10643, 14345, 37683, 118377}},
+{7192, 17, 12561, {1, 1, 5, 11, 1, 33, 45, 31, 447, 229, 893, 3777, 4101, 2505, 4855, 14057, 20133}},
+{7193, 17, 12571, {1, 1, 1, 1, 7, 23, 89, 53, 483, 873, 521, 2115, 1461, 11241, 1003, 28749, 68227}},
+{7194, 17, 12580, {1, 3, 5, 5, 3, 17, 23, 219, 281, 975, 895, 4043, 6505, 5991, 27401, 38791, 89239}},
+{7195, 17, 12597, {1, 1, 1, 7, 29, 41, 63, 151, 195, 495, 469, 305, 7437, 1107, 31147, 30755, 116551}},
+{7196, 17, 12607, {1, 3, 7, 3, 13, 25, 33, 193, 23, 135, 3, 513, 4169, 15355, 2255, 32167, 68691}},
+{7197, 17, 12609, {1, 3, 3, 11, 29, 19, 125, 177, 83, 361, 393, 663, 1859, 1333, 17507, 10661, 72387}},
+{7198, 17, 12610, {1, 1, 5, 11, 23, 13, 61, 33, 149, 145, 995, 649, 7587, 6743, 25225, 54997, 10193}},
+{7199, 17, 12616, {1, 1, 7, 13, 29, 51, 107, 79, 467, 881, 1227, 1083, 3277, 2559, 26819, 57311, 48095}},
+{7200, 17, 12621, {1, 3, 1, 1, 1, 19, 23, 25, 239, 703, 119, 2525, 8079, 5433, 8989, 42517, 116755}},
+{7201, 17, 12624, {1, 1, 7, 11, 31, 9, 9, 113, 381, 363, 447, 3751, 7523, 15995, 3853, 42069, 81455}},
+{7202, 17, 12639, {1, 1, 5, 9, 29, 41, 103, 179, 477, 527, 1593, 3003, 1095, 6823, 6911, 44987, 32445}},
+{7203, 17, 12645, {1, 1, 7, 15, 5, 31, 55, 181, 149, 127, 1745, 2753, 801, 285, 20199, 33707, 118397}},
+{7204, 17, 12652, {1, 3, 7, 7, 11, 29, 89, 215, 351, 303, 1519, 2593, 2045, 14699, 1657, 40799, 39641}},
+{7205, 17, 12655, {1, 1, 7, 13, 3, 35, 73, 111, 15, 803, 1819, 3453, 3611, 8337, 14239, 14875, 83983}},
+{7206, 17, 12660, {1, 1, 5, 15, 15, 49, 27, 101, 149, 3, 717, 2229, 7397, 6579, 10965, 35997, 28823}},
+{7207, 17, 12667, {1, 1, 5, 7, 3, 17, 49, 245, 343, 657, 15, 749, 6413, 10811, 2909, 47309, 34613}},
+{7208, 17, 12686, {1, 3, 5, 15, 13, 35, 67, 99, 481, 379, 2003, 3367, 3065, 5845, 7799, 43931, 15263}},
+{7209, 17, 12688, {1, 1, 5, 13, 21, 49, 81, 77, 395, 919, 1931, 661, 123, 9965, 10487, 55131, 1567}},
+{7210, 17, 12697, {1, 3, 5, 11, 23, 39, 41, 121, 159, 473, 191, 1983, 6411, 10503, 10523, 40601, 64153}},
+{7211, 17, 12700, {1, 1, 5, 7, 9, 37, 73, 207, 497, 789, 1671, 325, 1697, 11281, 31185, 4961, 124431}},
+{7212, 17, 12707, {1, 1, 5, 15, 7, 51, 71, 91, 449, 707, 621, 2427, 627, 1747, 12779, 17569, 98289}},
+{7213, 17, 12710, {1, 1, 5, 5, 31, 3, 89, 163, 77, 647, 1747, 2965, 1669, 3311, 17651, 8111, 30739}},
+{7214, 17, 12719, {1, 1, 3, 11, 15, 31, 77, 173, 405, 913, 459, 2955, 6153, 13391, 20439, 64433, 12371}},
+{7215, 17, 12739, {1, 1, 3, 11, 13, 55, 29, 37, 379, 689, 407, 1373, 397, 5027, 15497, 25687, 48193}},
+{7216, 17, 12742, {1, 3, 3, 15, 13, 7, 81, 207, 395, 901, 779, 1683, 2491, 3807, 31979, 32403, 81113}},
+{7217, 17, 12746, {1, 3, 3, 13, 29, 31, 25, 81, 459, 991, 793, 3285, 2775, 16199, 11423, 52597, 86041}},
+{7218, 17, 12754, {1, 3, 3, 13, 17, 17, 101, 183, 19, 735, 671, 1097, 2461, 9863, 25985, 31915, 73047}},
+{7219, 17, 12765, {1, 3, 3, 3, 3, 11, 71, 63, 429, 899, 351, 1275, 3907, 14241, 19135, 14875, 43325}},
+{7220, 17, 12772, {1, 1, 7, 11, 11, 61, 15, 213, 411, 13, 1409, 1741, 5257, 8729, 28351, 6381, 77501}},
+{7221, 17, 12784, {1, 1, 7, 7, 29, 27, 51, 217, 411, 261, 599, 3027, 7871, 9133, 32423, 44275, 34701}},
+{7222, 17, 12789, {1, 3, 7, 7, 1, 1, 127, 209, 151, 845, 1421, 3115, 7775, 10133, 6163, 41165, 91187}},
+{7223, 17, 12800, {1, 3, 1, 9, 1, 35, 75, 3, 81, 477, 131, 1383, 1377, 6857, 3863, 12583, 7855}},
+{7224, 17, 12805, {1, 3, 1, 3, 3, 11, 1, 167, 347, 317, 557, 3763, 7175, 13341, 759, 23275, 78039}},
+{7225, 17, 12809, {1, 3, 5, 11, 19, 53, 85, 139, 67, 757, 487, 919, 6001, 16031, 24959, 28013, 65771}},
+{7226, 17, 12815, {1, 1, 1, 1, 23, 9, 83, 55, 249, 305, 1305, 109, 5559, 5129, 30973, 19889, 6691}},
+{7227, 17, 12827, {1, 1, 1, 3, 21, 19, 85, 89, 213, 847, 861, 1651, 6613, 6001, 8157, 2555, 98673}},
+{7228, 17, 12830, {1, 1, 1, 15, 25, 15, 125, 133, 177, 295, 549, 1763, 2811, 4381, 1079, 7813, 87909}},
+{7229, 17, 12833, {1, 1, 1, 5, 5, 17, 25, 225, 353, 997, 1565, 2225, 7265, 16227, 28209, 9011, 97193}},
+{7230, 17, 12840, {1, 3, 7, 15, 13, 13, 35, 239, 331, 965, 1547, 1627, 6409, 7745, 30899, 36915, 59293}},
+{7231, 17, 12851, {1, 1, 1, 13, 27, 45, 23, 179, 193, 801, 381, 3783, 3551, 11855, 11041, 49911, 62101}},
+{7232, 17, 12868, {1, 1, 7, 3, 3, 31, 61, 5, 421, 939, 1637, 217, 389, 1797, 32141, 28817, 6997}},
+{7233, 17, 12871, {1, 3, 3, 5, 21, 31, 83, 65, 421, 577, 1137, 2561, 2943, 4171, 2803, 23325, 92315}},
+{7234, 17, 12886, {1, 1, 3, 3, 27, 33, 75, 81, 477, 3, 1903, 773, 5551, 10069, 7285, 58103, 98311}},
+{7235, 17, 12899, {1, 3, 7, 15, 1, 17, 95, 209, 65, 747, 1633, 581, 7395, 1393, 21795, 15735, 129757}},
+{7236, 17, 12923, {1, 3, 5, 3, 17, 3, 9, 131, 51, 693, 1571, 1865, 8137, 915, 13345, 35137, 59005}},
+{7237, 17, 12926, {1, 1, 3, 7, 23, 27, 61, 163, 449, 87, 717, 1075, 4309, 4887, 11741, 24549, 96729}},
+{7238, 17, 12932, {1, 3, 7, 13, 21, 5, 3, 97, 191, 999, 1193, 1215, 5907, 10491, 2281, 6455, 68625}},
+{7239, 17, 12935, {1, 1, 5, 7, 9, 9, 101, 5, 375, 137, 1473, 1265, 5307, 259, 20699, 25367, 129393}},
+{7240, 17, 12939, {1, 3, 7, 7, 21, 1, 77, 65, 23, 139, 945, 491, 1069, 253, 12335, 26861, 129467}},
+{7241, 17, 12942, {1, 1, 3, 9, 15, 33, 85, 225, 45, 311, 281, 1601, 7325, 12265, 2591, 51955, 130681}},
+{7242, 17, 12953, {1, 1, 1, 3, 27, 33, 17, 89, 495, 91, 527, 3347, 7883, 9481, 28731, 54729, 15265}},
+{7243, 17, 12959, {1, 1, 3, 3, 9, 47, 115, 161, 299, 493, 1857, 3597, 7175, 15603, 11523, 33837, 57557}},
+{7244, 17, 12960, {1, 3, 7, 3, 15, 47, 127, 195, 391, 869, 99, 429, 7125, 10413, 5063, 61845, 71843}},
+{7245, 17, 13002, {1, 3, 3, 1, 7, 31, 27, 69, 7, 83, 315, 2749, 5693, 13377, 28091, 13065, 111029}},
+{7246, 17, 13004, {1, 1, 3, 15, 15, 45, 125, 229, 459, 611, 1167, 3375, 3587, 81, 9275, 45327, 39749}},
+{7247, 17, 13016, {1, 3, 7, 11, 9, 3, 43, 161, 221, 209, 51, 1475, 3577, 13973, 15285, 35553, 83935}},
+{7248, 17, 13021, {1, 1, 7, 9, 15, 55, 25, 119, 39, 537, 317, 1331, 2161, 1791, 19221, 63459, 124595}},
+{7249, 17, 13035, {1, 1, 1, 11, 9, 7, 113, 187, 295, 67, 1795, 113, 119, 9127, 32119, 7719, 67591}},
+{7250, 17, 13038, {1, 3, 7, 13, 1, 53, 17, 19, 331, 711, 359, 2945, 5847, 7237, 23617, 17411, 2203}},
+{7251, 17, 13052, {1, 3, 3, 7, 21, 63, 115, 159, 225, 161, 1255, 2381, 7411, 95, 1625, 30493, 56685}},
+{7252, 17, 13058, {1, 1, 5, 9, 13, 57, 5, 107, 195, 271, 677, 2081, 6027, 11091, 14171, 19007, 102119}},
+{7253, 17, 13069, {1, 3, 3, 3, 19, 13, 31, 155, 209, 89, 955, 523, 615, 5319, 16079, 9289, 49135}},
+{7254, 17, 13082, {1, 3, 1, 13, 1, 31, 69, 143, 329, 813, 635, 891, 2967, 5563, 19643, 35813, 14345}},
+{7255, 17, 13093, {1, 1, 5, 5, 17, 47, 97, 49, 123, 997, 15, 3685, 3925, 4973, 11195, 17115, 63709}},
+{7256, 17, 13094, {1, 1, 7, 13, 13, 17, 99, 149, 309, 281, 329, 905, 6487, 4495, 31831, 24413, 26431}},
+{7257, 17, 13100, {1, 1, 5, 5, 5, 47, 113, 115, 61, 157, 955, 2323, 4445, 229, 24049, 14753, 15189}},
+{7258, 17, 13115, {1, 3, 7, 15, 25, 21, 13, 137, 377, 45, 629, 1339, 8037, 5073, 24741, 48589, 28953}},
+{7259, 17, 13125, {1, 3, 3, 9, 3, 41, 7, 101, 333, 59, 1213, 1871, 3993, 11261, 4403, 42785, 58753}},
+{7260, 17, 13132, {1, 3, 1, 7, 5, 33, 87, 73, 317, 575, 1459, 905, 1033, 14179, 19595, 30269, 103853}},
+{7261, 17, 13143, {1, 1, 1, 1, 19, 49, 63, 181, 227, 401, 695, 1811, 2383, 3835, 14379, 30685, 114731}},
+{7262, 17, 13144, {1, 1, 5, 15, 9, 41, 35, 91, 357, 659, 155, 3725, 6509, 405, 25449, 37719, 6013}},
+{7263, 17, 13153, {1, 1, 7, 3, 11, 59, 33, 151, 291, 393, 741, 3961, 2787, 993, 10361, 11737, 42047}},
+{7264, 17, 13160, {1, 3, 7, 3, 15, 15, 55, 59, 419, 203, 55, 801, 2719, 15487, 13213, 58473, 50315}},
+{7265, 17, 13165, {1, 3, 7, 13, 17, 21, 113, 111, 159, 163, 711, 1135, 1133, 15519, 30515, 55777, 25025}},
+{7266, 17, 13173, {1, 1, 3, 5, 13, 25, 23, 3, 93, 873, 559, 1815, 3381, 5311, 14365, 34349, 17333}},
+{7267, 17, 13174, {1, 3, 5, 7, 15, 43, 85, 33, 23, 903, 1247, 3279, 1393, 12059, 19251, 19389, 5097}},
+{7268, 17, 13187, {1, 3, 1, 11, 21, 59, 3, 153, 403, 95, 1939, 2679, 419, 9035, 31219, 2897, 15727}},
+{7269, 17, 13190, {1, 3, 5, 1, 11, 21, 35, 169, 453, 15, 791, 3931, 1021, 16321, 6033, 10639, 16173}},
+{7270, 17, 13204, {1, 3, 1, 11, 7, 57, 39, 61, 381, 465, 451, 2863, 575, 5597, 31041, 8625, 82373}},
+{7271, 17, 13218, {1, 1, 3, 5, 13, 5, 63, 1, 75, 245, 1305, 285, 3367, 10107, 5853, 35275, 128255}},
+{7272, 17, 13247, {1, 1, 1, 3, 1, 57, 21, 91, 139, 669, 765, 1867, 2153, 10347, 26119, 35517, 4725}},
+{7273, 17, 13250, {1, 3, 5, 1, 21, 41, 59, 247, 473, 1015, 975, 485, 2161, 11941, 10341, 35245, 55587}},
+{7274, 17, 13262, {1, 1, 5, 9, 7, 59, 33, 149, 97, 619, 393, 3613, 6037, 10895, 19461, 15975, 47919}},
+{7275, 17, 13267, {1, 3, 3, 15, 7, 17, 95, 13, 147, 361, 915, 2585, 4483, 3159, 12255, 44685, 116163}},
+{7276, 17, 13274, {1, 3, 1, 15, 27, 31, 75, 31, 423, 233, 1453, 2815, 3633, 6531, 25721, 29649, 80645}},
+{7277, 17, 13304, {1, 3, 3, 3, 19, 7, 73, 33, 163, 495, 1483, 2277, 6455, 6523, 9331, 21869, 52175}},
+{7278, 17, 13309, {1, 3, 5, 13, 5, 1, 63, 35, 335, 189, 713, 2997, 3277, 10049, 4681, 16753, 17107}},
+{7279, 17, 13315, {1, 3, 5, 9, 3, 55, 29, 171, 395, 585, 671, 1875, 4449, 12895, 5455, 11023, 106189}},
+{7280, 17, 13317, {1, 3, 5, 3, 25, 53, 33, 169, 109, 285, 787, 861, 5549, 5171, 15293, 2977, 14559}},
+{7281, 17, 13324, {1, 3, 7, 1, 21, 25, 97, 115, 1, 999, 1033, 3471, 129, 16093, 495, 16859, 34615}},
+{7282, 17, 13332, {1, 3, 5, 9, 13, 5, 109, 41, 57, 957, 231, 3771, 2917, 15649, 8869, 14857, 64943}},
+{7283, 17, 13342, {1, 1, 7, 7, 21, 41, 101, 59, 167, 441, 997, 2951, 7891, 16325, 12669, 53829, 100705}},
+{7284, 17, 13346, {1, 1, 7, 9, 19, 59, 23, 141, 193, 237, 1067, 1823, 3351, 3239, 3135, 9275, 37069}},
+{7285, 17, 13355, {1, 3, 3, 9, 3, 17, 95, 73, 19, 231, 779, 3065, 2245, 2967, 24971, 62589, 16729}},
+{7286, 17, 13358, {1, 3, 3, 13, 25, 19, 117, 147, 443, 123, 157, 2037, 327, 14715, 5693, 54641, 33325}},
+{7287, 17, 13360, {1, 3, 1, 9, 21, 21, 21, 125, 49, 787, 767, 2831, 511, 2461, 31537, 27155, 44053}},
+{7288, 17, 13369, {1, 3, 7, 9, 31, 19, 125, 67, 119, 465, 287, 1869, 3979, 15723, 21069, 8581, 66939}},
+{7289, 17, 13372, {1, 1, 1, 11, 7, 37, 123, 237, 353, 499, 113, 3829, 217, 4751, 7385, 20343, 83699}},
+{7290, 17, 13398, {1, 3, 7, 13, 9, 3, 53, 27, 487, 87, 35, 2645, 3481, 14409, 27875, 31695, 78489}},
+{7291, 17, 13404, {1, 3, 3, 13, 9, 43, 67, 51, 153, 83, 591, 1991, 1787, 11973, 7273, 34801, 47199}},
+{7292, 17, 13407, {1, 3, 7, 1, 15, 53, 71, 11, 205, 853, 2011, 581, 1281, 7819, 23083, 33731, 74951}},
+{7293, 17, 13414, {1, 1, 5, 5, 17, 63, 109, 219, 225, 997, 1251, 3287, 1441, 13489, 22723, 45191, 50249}},
+{7294, 17, 13426, {1, 1, 5, 3, 13, 1, 43, 53, 293, 685, 1369, 1515, 7479, 3233, 20007, 65235, 102467}},
+{7295, 17, 13432, {1, 3, 5, 7, 29, 45, 63, 45, 219, 445, 2047, 317, 7553, 325, 1465, 949, 35163}},
+{7296, 17, 13466, {1, 1, 3, 9, 7, 31, 73, 211, 501, 233, 1495, 701, 5857, 10763, 9743, 10289, 23801}},
+{7297, 17, 13481, {1, 3, 7, 3, 23, 47, 99, 61, 179, 833, 1425, 1275, 4467, 4367, 5567, 23513, 68677}},
+{7298, 17, 13490, {1, 1, 5, 5, 27, 33, 119, 229, 329, 51, 1025, 3167, 3405, 4039, 4135, 6655, 43771}},
+{7299, 17, 13496, {1, 3, 7, 15, 5, 49, 91, 55, 425, 15, 2003, 1571, 3539, 10375, 29645, 5889, 51887}},
+{7300, 17, 13504, {1, 1, 7, 3, 13, 55, 85, 91, 181, 723, 1941, 75, 4443, 11507, 7027, 14189, 50685}},
+{7301, 17, 13516, {1, 3, 5, 5, 29, 49, 13, 3, 97, 165, 41, 3039, 3325, 2161, 775, 38501, 42381}},
+{7302, 17, 13527, {1, 1, 5, 11, 9, 57, 47, 109, 9, 585, 375, 1839, 937, 6877, 29847, 60163, 103081}},
+{7303, 17, 13533, {1, 1, 3, 13, 5, 47, 11, 195, 253, 235, 275, 2313, 163, 14683, 5681, 13381, 84553}},
+{7304, 17, 13537, {1, 3, 3, 15, 15, 1, 93, 157, 437, 557, 307, 1179, 6857, 3101, 16723, 50579, 69603}},
+{7305, 17, 13552, {1, 1, 5, 9, 11, 29, 23, 219, 337, 689, 1155, 2007, 6853, 6749, 20127, 13199, 48433}},
+{7306, 17, 13561, {1, 1, 1, 13, 1, 61, 73, 213, 335, 539, 903, 2719, 775, 2775, 29109, 33367, 3281}},
+{7307, 17, 13567, {1, 3, 1, 5, 15, 31, 65, 231, 439, 623, 1871, 2299, 5365, 10333, 9147, 2781, 63813}},
+{7308, 17, 13582, {1, 1, 3, 1, 1, 25, 23, 229, 173, 279, 181, 1299, 2893, 15475, 12473, 46097, 123387}},
+{7309, 17, 13587, {1, 1, 7, 13, 7, 43, 17, 187, 467, 113, 1293, 2013, 6091, 14621, 22195, 24079, 45379}},
+{7310, 17, 13589, {1, 3, 1, 7, 1, 7, 119, 159, 377, 11, 705, 2853, 3767, 13739, 23375, 25563, 73987}},
+{7311, 17, 13593, {1, 1, 3, 15, 21, 13, 111, 119, 401, 1005, 777, 1699, 2431, 15139, 27887, 28415, 71519}},
+{7312, 17, 13596, {1, 1, 7, 9, 1, 49, 19, 171, 297, 77, 1343, 1249, 5769, 13889, 21401, 24915, 17641}},
+{7313, 17, 13615, {1, 1, 7, 11, 31, 45, 51, 231, 123, 817, 13, 791, 6235, 2787, 475, 1717, 5071}},
+{7314, 17, 13617, {1, 3, 3, 13, 5, 9, 21, 129, 253, 731, 785, 2275, 7343, 7841, 5477, 8973, 101033}},
+{7315, 17, 13623, {1, 1, 7, 13, 23, 1, 119, 221, 293, 709, 2031, 3019, 1529, 2007, 10823, 43193, 82661}},
+{7316, 17, 13641, {1, 3, 1, 11, 29, 29, 87, 79, 415, 679, 1899, 3453, 7355, 8627, 28225, 41857, 106645}},
+{7317, 17, 13647, {1, 1, 5, 15, 9, 13, 21, 241, 491, 927, 999, 2131, 3501, 11063, 28595, 54691, 21297}},
+{7318, 17, 13650, {1, 1, 1, 3, 5, 41, 85, 89, 483, 309, 791, 825, 3043, 2715, 16573, 6551, 77875}},
+{7319, 17, 13659, {1, 3, 1, 1, 25, 21, 107, 123, 79, 1019, 821, 1251, 4943, 1429, 17843, 37013, 53285}},
+{7320, 17, 13671, {1, 1, 5, 3, 7, 5, 35, 123, 445, 315, 627, 2543, 1261, 13737, 15991, 36591, 18309}},
+{7321, 17, 13677, {1, 3, 3, 5, 25, 43, 65, 249, 309, 1023, 737, 1933, 4735, 7725, 12063, 53023, 126677}},
+{7322, 17, 13678, {1, 3, 1, 9, 13, 37, 77, 61, 179, 275, 277, 1431, 2869, 14563, 665, 60553, 7661}},
+{7323, 17, 13680, {1, 3, 5, 3, 29, 1, 127, 73, 363, 311, 1591, 3863, 6481, 4725, 8287, 61311, 39011}},
+{7324, 17, 13685, {1, 3, 1, 7, 13, 23, 115, 215, 385, 563, 1033, 2343, 5023, 11013, 12131, 26997, 48645}},
+{7325, 17, 13689, {1, 1, 5, 13, 3, 59, 41, 155, 263, 507, 1175, 2967, 7929, 8237, 11841, 15365, 51881}},
+{7326, 17, 13701, {1, 1, 3, 11, 19, 35, 89, 115, 121, 315, 1697, 2121, 1867, 6865, 23639, 26525, 44687}},
+{7327, 17, 13706, {1, 3, 5, 15, 9, 5, 125, 183, 149, 447, 309, 1743, 6089, 369, 16153, 63799, 57657}},
+{7328, 17, 13720, {1, 1, 1, 7, 7, 39, 89, 139, 457, 741, 1613, 2883, 5057, 12495, 18669, 55469, 97941}},
+{7329, 17, 13729, {1, 1, 5, 7, 29, 39, 97, 9, 481, 667, 1353, 3387, 2813, 16205, 8353, 22121, 92965}},
+{7330, 17, 13735, {1, 3, 7, 9, 11, 55, 79, 159, 349, 717, 829, 3157, 1457, 6199, 5861, 2553, 20387}},
+{7331, 17, 13736, {1, 1, 1, 11, 3, 51, 113, 53, 287, 109, 1717, 2405, 7207, 4473, 11145, 2549, 591}},
+{7332, 17, 13756, {1, 1, 3, 13, 3, 61, 31, 141, 217, 487, 299, 2755, 3389, 10053, 1105, 21129, 74203}},
+{7333, 17, 13759, {1, 1, 1, 3, 11, 55, 7, 113, 413, 449, 787, 3279, 5123, 16025, 15005, 12175, 6795}},
+{7334, 17, 13761, {1, 3, 1, 1, 25, 23, 107, 191, 3, 3, 49, 1083, 3275, 10385, 7989, 53739, 25505}},
+{7335, 17, 13771, {1, 1, 5, 13, 7, 17, 59, 13, 471, 147, 1627, 2119, 3555, 15555, 10333, 49363, 80959}},
+{7336, 17, 13782, {1, 1, 1, 15, 23, 33, 61, 191, 207, 939, 45, 2781, 71, 9661, 28433, 13089, 76419}},
+{7337, 17, 13786, {1, 3, 3, 7, 29, 47, 111, 19, 315, 381, 851, 1303, 2627, 6255, 30369, 37723, 12949}},
+{7338, 17, 13798, {1, 1, 1, 13, 31, 43, 3, 193, 5, 99, 769, 2523, 1949, 129, 9693, 60535, 67059}},
+{7339, 17, 13810, {1, 1, 3, 15, 5, 33, 73, 149, 253, 985, 863, 1551, 4369, 5911, 8269, 35463, 117055}},
+{7340, 17, 13819, {1, 3, 1, 5, 27, 57, 3, 105, 253, 731, 119, 3287, 613, 4627, 22003, 56027, 123005}},
+{7341, 17, 13826, {1, 1, 3, 3, 27, 47, 67, 147, 495, 865, 1233, 3707, 2511, 2951, 7367, 15625, 86417}},
+{7342, 17, 13831, {1, 1, 7, 1, 7, 7, 13, 255, 457, 529, 953, 1481, 5565, 12495, 4723, 41615, 121829}},
+{7343, 17, 13837, {1, 3, 5, 11, 1, 51, 91, 153, 323, 609, 1353, 2995, 4035, 13835, 28619, 46217, 4967}},
+{7344, 17, 13846, {1, 1, 5, 7, 25, 59, 81, 101, 185, 709, 1249, 2285, 6579, 8655, 17563, 9707, 63845}},
+{7345, 17, 13856, {1, 3, 3, 9, 31, 25, 17, 19, 111, 627, 1187, 2621, 6529, 9457, 25027, 18069, 47559}},
+{7346, 17, 13862, {1, 3, 7, 15, 7, 15, 103, 201, 391, 1023, 817, 535, 2713, 1317, 13469, 56043, 70847}},
+{7347, 17, 13866, {1, 1, 3, 7, 17, 57, 35, 99, 439, 367, 27, 2695, 3519, 8337, 14047, 58489, 69}},
+{7348, 17, 13885, {1, 1, 1, 3, 17, 23, 71, 189, 57, 39, 715, 1779, 3081, 14657, 21895, 59203, 31005}},
+{7349, 17, 13891, {1, 1, 7, 13, 1, 47, 69, 159, 353, 517, 271, 973, 5077, 15707, 11095, 19671, 3389}},
+{7350, 17, 13893, {1, 1, 7, 13, 25, 55, 115, 21, 43, 939, 1697, 101, 4751, 1993, 2389, 28353, 45251}},
+{7351, 17, 13905, {1, 3, 1, 15, 11, 57, 17, 49, 121, 419, 909, 121, 5047, 4235, 13051, 21529, 42097}},
+{7352, 17, 13908, {1, 1, 1, 3, 19, 37, 31, 233, 251, 175, 929, 1527, 7527, 3605, 17075, 61053, 56235}},
+{7353, 17, 13912, {1, 1, 1, 3, 9, 5, 117, 131, 251, 475, 1695, 1381, 2445, 5921, 14921, 937, 80791}},
+{7354, 17, 13917, {1, 1, 3, 9, 11, 5, 31, 215, 37, 567, 1537, 2183, 3291, 1601, 14025, 48807, 7243}},
+{7355, 17, 13918, {1, 3, 1, 9, 7, 13, 81, 249, 321, 473, 1419, 3977, 7037, 14191, 10865, 56131, 43225}},
+{7356, 17, 13946, {1, 1, 1, 13, 15, 23, 31, 69, 449, 491, 1461, 729, 7955, 4003, 16817, 37273, 72025}},
+{7357, 17, 13948, {1, 1, 5, 13, 7, 41, 93, 169, 347, 1013, 301, 2813, 1455, 13187, 10769, 60807, 46333}},
+{7358, 17, 13964, {1, 1, 5, 3, 23, 15, 1, 161, 29, 35, 415, 235, 93, 14543, 29585, 29657, 36489}},
+{7359, 17, 13970, {1, 3, 1, 3, 31, 63, 39, 235, 153, 549, 43, 147, 2317, 3537, 25561, 58287, 58725}},
+{7360, 17, 13975, {1, 1, 3, 5, 5, 11, 59, 97, 349, 307, 501, 1701, 4243, 13717, 17419, 23387, 29533}},
+{7361, 17, 13979, {1, 3, 1, 7, 7, 19, 33, 243, 67, 353, 2023, 3111, 7173, 10979, 28117, 40175, 45337}},
+{7362, 17, 13997, {1, 1, 1, 5, 15, 59, 55, 135, 107, 543, 1743, 2695, 3293, 111, 32629, 8249, 52273}},
+{7363, 17, 14000, {1, 3, 5, 13, 15, 57, 39, 79, 5, 451, 571, 1445, 1393, 2125, 31713, 59655, 20897}},
+{7364, 17, 14006, {1, 1, 3, 11, 29, 61, 1, 37, 173, 513, 1779, 2649, 3289, 4679, 2039, 47587, 28973}},
+{7365, 17, 14020, {1, 1, 5, 5, 15, 19, 17, 143, 387, 359, 275, 625, 7383, 15537, 10311, 40005, 20729}},
+{7366, 17, 14023, {1, 1, 3, 9, 7, 23, 71, 179, 85, 447, 345, 3459, 2857, 8331, 5489, 62207, 64933}},
+{7367, 17, 14024, {1, 1, 1, 1, 11, 61, 47, 131, 213, 611, 701, 713, 1269, 9563, 25223, 50697, 88679}},
+{7368, 17, 14029, {1, 1, 5, 15, 21, 5, 77, 59, 455, 243, 459, 2809, 13, 9325, 32047, 3939, 48389}},
+{7369, 17, 14035, {1, 3, 7, 1, 21, 53, 111, 225, 407, 119, 713, 3635, 1539, 15321, 29827, 36069, 74483}},
+{7370, 17, 14044, {1, 1, 5, 13, 7, 45, 75, 43, 191, 715, 169, 759, 33, 11329, 1069, 36103, 28055}},
+{7371, 17, 14047, {1, 3, 7, 5, 7, 13, 7, 35, 27, 391, 517, 1439, 5699, 1067, 23857, 7293, 66167}},
+{7372, 17, 14058, {1, 1, 7, 11, 3, 31, 1, 83, 299, 345, 65, 669, 1529, 7569, 28959, 50561, 69493}},
+{7373, 17, 14066, {1, 3, 1, 5, 25, 25, 43, 149, 83, 225, 1589, 1691, 7777, 773, 10421, 49523, 23533}},
+{7374, 17, 14075, {1, 1, 5, 11, 25, 29, 81, 11, 497, 43, 951, 2551, 821, 13805, 12315, 61299, 81397}},
+{7375, 17, 14080, {1, 3, 1, 9, 29, 23, 109, 123, 235, 255, 1519, 3289, 7761, 14575, 11851, 1719, 51655}},
+{7376, 17, 14095, {1, 3, 5, 15, 21, 49, 13, 43, 87, 517, 687, 1457, 1501, 15959, 31907, 13771, 69379}},
+{7377, 17, 14100, {1, 1, 5, 3, 21, 11, 87, 9, 343, 317, 845, 1663, 7933, 14063, 24915, 31487, 17445}},
+{7378, 17, 14114, {1, 1, 3, 13, 21, 31, 87, 99, 185, 333, 993, 3899, 971, 2851, 23643, 195, 66957}},
+{7379, 17, 14116, {1, 1, 1, 15, 19, 47, 23, 1, 67, 57, 165, 3903, 421, 10561, 11621, 13815, 10349}},
+{7380, 17, 14123, {1, 3, 5, 11, 9, 19, 73, 17, 229, 913, 459, 3809, 2667, 9775, 3693, 52945, 90837}},
+{7381, 17, 14134, {1, 1, 5, 15, 3, 25, 109, 131, 507, 637, 1615, 859, 6785, 14891, 24801, 39095, 79557}},
+{7382, 17, 14143, {1, 1, 5, 7, 1, 51, 71, 251, 19, 799, 835, 1119, 2349, 15083, 16509, 55621, 123501}},
+{7383, 17, 14151, {1, 3, 5, 9, 13, 39, 127, 1, 233, 37, 735, 3307, 5163, 4529, 5961, 12893, 103641}},
+{7384, 17, 14160, {1, 1, 7, 5, 23, 15, 49, 123, 511, 201, 2025, 289, 3847, 15755, 24279, 52543, 42017}},
+{7385, 17, 14163, {1, 1, 5, 3, 9, 61, 19, 37, 3, 361, 1065, 2971, 2517, 1259, 27359, 3823, 60181}},
+{7386, 17, 14179, {1, 3, 1, 7, 15, 17, 57, 249, 57, 979, 147, 2407, 2579, 3159, 8467, 8433, 72873}},
+{7387, 17, 14181, {1, 1, 3, 1, 25, 7, 47, 117, 449, 321, 143, 3867, 165, 7961, 27597, 10033, 2437}},
+{7388, 17, 14193, {1, 3, 5, 13, 19, 49, 1, 83, 477, 549, 509, 2911, 1559, 14017, 10469, 62171, 82829}},
+{7389, 17, 14209, {1, 3, 3, 7, 27, 21, 15, 63, 31, 45, 1223, 3903, 5469, 11983, 29627, 27453, 32019}},
+{7390, 17, 14210, {1, 1, 7, 7, 9, 9, 7, 77, 349, 467, 61, 3465, 6921, 15761, 15179, 38649, 2469}},
+{7391, 17, 14224, {1, 3, 1, 13, 9, 59, 55, 67, 271, 617, 643, 4071, 7963, 8153, 5121, 43917, 26219}},
+{7392, 17, 14245, {1, 1, 3, 7, 29, 21, 63, 103, 327, 623, 931, 1511, 3125, 229, 28949, 61315, 72667}},
+{7393, 17, 14249, {1, 3, 7, 1, 19, 37, 49, 63, 403, 885, 161, 121, 1447, 9227, 15019, 50049, 26939}},
+{7394, 17, 14255, {1, 3, 3, 3, 23, 57, 95, 79, 485, 173, 93, 835, 7161, 11247, 3485, 5759, 36393}},
+{7395, 17, 14267, {1, 3, 7, 13, 23, 33, 5, 97, 235, 531, 313, 2925, 2223, 847, 18591, 15477, 3129}},
+{7396, 17, 14270, {1, 1, 3, 13, 25, 25, 101, 183, 477, 947, 1251, 2631, 7987, 13417, 23759, 55305, 123817}},
+{7397, 17, 14277, {1, 1, 5, 9, 27, 63, 49, 137, 179, 861, 33, 2375, 3827, 6485, 19689, 7867, 124429}},
+{7398, 17, 14305, {1, 3, 7, 3, 15, 43, 63, 103, 45, 947, 1837, 833, 7055, 7487, 19669, 12045, 78377}},
+{7399, 17, 14308, {1, 3, 5, 3, 29, 35, 57, 19, 471, 985, 1147, 741, 5403, 10057, 25375, 50889, 82719}},
+{7400, 17, 14312, {1, 3, 3, 1, 17, 19, 111, 13, 121, 821, 1831, 4043, 123, 9529, 1511, 10917, 105961}},
+{7401, 17, 14325, {1, 1, 3, 11, 1, 43, 23, 75, 345, 9, 1379, 2157, 5887, 1197, 14849, 17103, 91925}},
+{7402, 17, 14332, {1, 1, 3, 3, 19, 11, 1, 179, 343, 1023, 1801, 915, 255, 519, 5787, 32913, 43471}},
+{7403, 17, 14345, {1, 3, 5, 5, 3, 3, 3, 211, 461, 55, 851, 3165, 2903, 15077, 8537, 2037, 109057}},
+{7404, 17, 14354, {1, 1, 7, 15, 7, 7, 43, 249, 27, 511, 1369, 735, 6093, 12575, 26675, 21745, 117053}},
+{7405, 17, 14372, {1, 1, 5, 7, 21, 53, 45, 83, 415, 645, 325, 4027, 5181, 8485, 1917, 55623, 45203}},
+{7406, 17, 14387, {1, 1, 3, 15, 7, 1, 121, 221, 387, 403, 1877, 1671, 2113, 2379, 5667, 39867, 8079}},
+{7407, 17, 14390, {1, 1, 1, 7, 5, 29, 35, 77, 197, 661, 1859, 2539, 4045, 13497, 305, 44987, 31215}},
+{7408, 17, 14402, {1, 1, 5, 5, 13, 37, 13, 85, 287, 347, 579, 2283, 7911, 5463, 21141, 9035, 105067}},
+{7409, 17, 14408, {1, 1, 1, 9, 17, 17, 63, 97, 57, 629, 1917, 1133, 779, 12365, 17127, 52549, 18755}},
+{7410, 17, 14413, {1, 1, 7, 11, 7, 17, 65, 137, 485, 841, 653, 2921, 4935, 16273, 23333, 7399, 43129}},
+{7411, 17, 14431, {1, 3, 1, 11, 31, 55, 93, 225, 319, 35, 947, 1909, 7733, 8303, 20739, 55713, 6633}},
+{7412, 17, 14438, {1, 1, 1, 3, 11, 25, 1, 165, 305, 275, 607, 3845, 5203, 1989, 13803, 597, 39751}},
+{7413, 17, 14447, {1, 1, 5, 11, 31, 43, 83, 237, 453, 59, 457, 741, 411, 15895, 18891, 30133, 66767}},
+{7414, 17, 14455, {1, 3, 5, 11, 3, 23, 65, 81, 299, 527, 1057, 2731, 3839, 6023, 28887, 64929, 41405}},
+{7415, 17, 14461, {1, 3, 1, 1, 3, 5, 11, 169, 123, 957, 1495, 1717, 4079, 13239, 28339, 33677, 30591}},
+{7416, 17, 14466, {1, 1, 7, 15, 3, 1, 37, 245, 169, 273, 2039, 415, 6555, 13131, 11181, 62179, 36885}},
+{7417, 17, 14480, {1, 1, 3, 11, 1, 55, 19, 19, 425, 113, 1367, 2101, 5581, 985, 2475, 53983, 68999}},
+{7418, 17, 14490, {1, 1, 5, 9, 5, 33, 101, 193, 303, 579, 1265, 2791, 479, 12083, 17609, 31801, 113089}},
+{7419, 17, 14492, {1, 1, 3, 3, 17, 61, 59, 249, 81, 821, 1, 431, 5327, 8675, 23469, 15349, 67711}},
+{7420, 17, 14508, {1, 1, 7, 9, 31, 51, 89, 19, 469, 843, 561, 559, 4823, 7803, 31699, 44537, 56835}},
+{7421, 17, 14513, {1, 3, 7, 9, 11, 57, 27, 43, 469, 655, 433, 3081, 6719, 6651, 30823, 61503, 110711}},
+{7422, 17, 14516, {1, 3, 5, 11, 9, 53, 25, 147, 61, 533, 1369, 879, 7935, 13829, 26655, 17327, 52983}},
+{7423, 17, 14519, {1, 3, 7, 11, 15, 27, 97, 175, 435, 53, 75, 807, 549, 5277, 1831, 19421, 55669}},
+{7424, 17, 14525, {1, 1, 7, 15, 23, 5, 99, 133, 485, 587, 65, 2585, 7667, 2783, 19437, 52769, 1587}},
+{7425, 17, 14534, {1, 1, 7, 7, 13, 39, 111, 165, 489, 355, 1963, 333, 2993, 5233, 9173, 18951, 93737}},
+{7426, 17, 14537, {1, 1, 5, 7, 1, 29, 67, 135, 427, 91, 53, 3109, 3745, 9529, 17567, 42361, 84577}},
+{7427, 17, 14543, {1, 3, 5, 1, 31, 35, 59, 181, 87, 345, 1975, 781, 603, 16365, 19453, 9933, 112739}},
+{7428, 17, 14545, {1, 3, 3, 1, 31, 41, 127, 35, 263, 403, 1811, 383, 1523, 8477, 5973, 41569, 99309}},
+{7429, 17, 14552, {1, 3, 7, 7, 5, 25, 11, 201, 231, 679, 519, 2481, 7415, 12397, 21265, 49419, 13903}},
+{7430, 17, 14562, {1, 1, 7, 5, 1, 11, 63, 221, 327, 509, 419, 871, 7891, 11835, 11099, 10669, 43853}},
+{7431, 17, 14571, {1, 1, 5, 11, 19, 11, 37, 105, 265, 513, 1013, 707, 6083, 14571, 17573, 7645, 5363}},
+{7432, 17, 14574, {1, 1, 1, 13, 19, 19, 67, 93, 113, 509, 1013, 4037, 1939, 7015, 24487, 57183, 123463}},
+{7433, 17, 14582, {1, 1, 1, 1, 21, 17, 95, 25, 261, 1005, 685, 691, 4467, 14723, 24043, 32287, 19651}},
+{7434, 17, 14611, {1, 3, 1, 15, 15, 15, 57, 191, 27, 719, 229, 1977, 241, 9021, 21335, 30967, 81207}},
+{7435, 17, 14614, {1, 3, 1, 9, 23, 61, 103, 67, 361, 925, 811, 1007, 5707, 11479, 5907, 3897, 65141}},
+{7436, 17, 14620, {1, 3, 5, 9, 17, 61, 11, 15, 351, 715, 939, 2141, 4857, 8397, 9693, 26845, 120007}},
+{7437, 17, 14633, {1, 3, 1, 5, 19, 55, 99, 19, 291, 309, 287, 1969, 4341, 7579, 30909, 37277, 54927}},
+{7438, 17, 14641, {1, 3, 7, 3, 19, 29, 43, 163, 367, 753, 1733, 1463, 7927, 10671, 16817, 41229, 113887}},
+{7439, 17, 14648, {1, 3, 7, 1, 11, 51, 39, 207, 283, 73, 1423, 2473, 7593, 3581, 30179, 6369, 112217}},
+{7440, 17, 14671, {1, 1, 3, 15, 15, 25, 43, 5, 271, 611, 959, 537, 303, 3659, 18073, 8147, 81531}},
+{7441, 17, 14674, {1, 3, 7, 1, 27, 55, 77, 11, 367, 209, 1967, 3409, 935, 5309, 18857, 46225, 8367}},
+{7442, 17, 14689, {1, 1, 5, 11, 11, 63, 75, 73, 43, 869, 2021, 3285, 269, 9113, 32699, 2091, 17327}},
+{7443, 17, 14690, {1, 1, 5, 11, 9, 25, 31, 245, 109, 805, 1645, 3607, 817, 9571, 12767, 65441, 129977}},
+{7444, 17, 14692, {1, 3, 7, 5, 11, 61, 67, 223, 433, 387, 935, 1615, 7915, 6133, 24087, 55323, 100619}},
+{7445, 17, 14699, {1, 1, 1, 15, 25, 61, 7, 39, 311, 353, 183, 33, 2591, 4951, 31377, 9081, 9707}},
+{7446, 17, 14710, {1, 1, 3, 3, 1, 9, 65, 229, 185, 47, 1255, 1365, 2231, 6843, 26927, 27195, 60651}},
+{7447, 17, 14719, {1, 1, 7, 5, 7, 25, 91, 133, 159, 737, 1767, 3117, 7321, 6159, 3361, 27793, 33473}},
+{7448, 17, 14730, {1, 3, 7, 3, 11, 7, 5, 125, 369, 951, 1277, 65, 7703, 1817, 11773, 25657, 67045}},
+{7449, 17, 14732, {1, 1, 3, 9, 21, 27, 21, 41, 131, 605, 1, 119, 1553, 1361, 31973, 43135, 119321}},
+{7450, 17, 14743, {1, 3, 7, 1, 25, 63, 55, 173, 323, 403, 1401, 1367, 3455, 15335, 13045, 20759, 8309}},
+{7451, 17, 14744, {1, 1, 3, 5, 3, 61, 59, 7, 39, 439, 721, 2829, 3035, 2293, 32015, 28509, 104831}},
+{7452, 17, 14750, {1, 3, 5, 1, 29, 35, 71, 87, 351, 917, 1661, 547, 4501, 7107, 5493, 17833, 130729}},
+{7453, 17, 14759, {1, 1, 5, 5, 7, 5, 69, 57, 319, 595, 1749, 3789, 1437, 6327, 24089, 7387, 125109}},
+{7454, 17, 14763, {1, 3, 5, 9, 15, 53, 95, 59, 217, 37, 1561, 401, 5259, 4361, 1049, 3437, 30559}},
+{7455, 17, 14768, {1, 3, 7, 13, 15, 15, 107, 167, 475, 157, 1565, 2219, 1891, 1433, 11829, 43433, 48111}},
+{7456, 17, 14773, {1, 1, 1, 3, 11, 41, 25, 211, 243, 355, 1831, 2093, 2747, 2523, 9885, 9503, 120089}},
+{7457, 17, 14777, {1, 3, 7, 5, 11, 3, 1, 231, 243, 541, 341, 887, 3567, 14759, 26763, 35705, 29417}},
+{7458, 17, 14786, {1, 1, 7, 13, 17, 35, 117, 177, 81, 361, 1425, 2437, 6821, 1061, 15019, 19135, 106007}},
+{7459, 17, 14795, {1, 3, 3, 11, 19, 5, 39, 23, 367, 9, 879, 3583, 2527, 14375, 28359, 27393, 55041}},
+{7460, 17, 14800, {1, 1, 7, 11, 9, 41, 63, 125, 33, 337, 587, 3939, 2635, 4559, 1007, 38991, 35651}},
+{7461, 17, 14812, {1, 1, 3, 1, 19, 11, 83, 13, 227, 649, 415, 1661, 3285, 55, 3683, 22319, 2127}},
+{7462, 17, 14816, {1, 3, 7, 13, 19, 49, 113, 129, 83, 5, 19, 1095, 6561, 11049, 3805, 11355, 84265}},
+{7463, 17, 14836, {1, 3, 1, 9, 19, 41, 111, 193, 429, 319, 67, 1717, 1819, 12959, 31449, 21035, 113161}},
+{7464, 17, 14840, {1, 1, 5, 11, 19, 19, 115, 237, 145, 681, 1525, 2215, 7915, 15529, 7533, 45981, 85461}},
+{7465, 17, 14856, {1, 1, 1, 1, 25, 3, 73, 207, 15, 69, 43, 1643, 7707, 12505, 27101, 40735, 6091}},
+{7466, 17, 14859, {1, 1, 5, 11, 21, 61, 119, 7, 37, 147, 1379, 3165, 6555, 3867, 24027, 45161, 93015}},
+{7467, 17, 14870, {1, 1, 3, 9, 9, 25, 51, 125, 511, 209, 75, 2849, 2299, 2901, 25157, 13079, 67733}},
+{7468, 17, 14873, {1, 3, 7, 9, 31, 49, 99, 21, 89, 1, 1391, 1741, 2733, 7283, 12087, 9287, 39713}},
+{7469, 17, 14879, {1, 1, 5, 5, 1, 5, 89, 109, 499, 343, 431, 401, 2023, 5541, 16615, 40059, 119195}},
+{7470, 17, 14880, {1, 3, 5, 15, 27, 27, 9, 159, 395, 31, 865, 2793, 55, 10961, 23123, 63731, 54385}},
+{7471, 17, 14889, {1, 3, 7, 1, 11, 47, 123, 239, 399, 383, 1497, 4075, 4659, 2911, 2101, 8295, 115717}},
+{7472, 17, 14892, {1, 1, 3, 1, 11, 63, 125, 171, 65, 15, 349, 753, 2981, 6713, 6219, 14093, 78797}},
+{7473, 17, 14895, {1, 1, 1, 13, 9, 15, 1, 113, 221, 867, 1907, 103, 1411, 27, 22743, 377, 116907}},
+{7474, 17, 14900, {1, 3, 1, 5, 27, 5, 27, 245, 221, 575, 2009, 1561, 4263, 11843, 28331, 12865, 10483}},
+{7475, 17, 14903, {1, 3, 7, 9, 1, 51, 119, 241, 439, 913, 1191, 2343, 2055, 10247, 18283, 40175, 63321}},
+{7476, 17, 14910, {1, 1, 3, 15, 21, 59, 45, 151, 485, 293, 981, 3523, 7689, 2789, 5003, 62383, 126221}},
+{7477, 17, 14912, {1, 1, 1, 1, 13, 15, 39, 201, 405, 513, 1721, 2077, 5995, 2433, 20421, 12695, 20393}},
+{7478, 17, 14942, {1, 3, 5, 15, 11, 35, 113, 133, 187, 583, 577, 291, 7563, 12959, 9383, 44255, 81763}},
+{7479, 17, 14948, {1, 3, 7, 15, 9, 55, 57, 227, 189, 595, 1311, 1131, 1323, 11347, 12777, 50963, 13827}},
+{7480, 17, 14957, {1, 3, 5, 3, 11, 49, 77, 157, 107, 959, 761, 1457, 7121, 3027, 9269, 26291, 125261}},
+{7481, 17, 14963, {1, 1, 5, 9, 23, 53, 125, 211, 303, 433, 1103, 41, 2643, 5325, 11885, 23825, 80415}},
+{7482, 17, 14975, {1, 1, 7, 1, 29, 25, 51, 107, 209, 165, 707, 1855, 7429, 1583, 5941, 47509, 90105}},
+{7483, 17, 14985, {1, 1, 3, 3, 1, 15, 121, 165, 181, 259, 1949, 3049, 3545, 3093, 5967, 49207, 37129}},
+{7484, 17, 14993, {1, 1, 5, 13, 9, 59, 93, 87, 57, 343, 389, 1995, 4001, 11495, 12909, 13491, 61759}},
+{7485, 17, 15003, {1, 3, 1, 5, 11, 27, 27, 133, 459, 733, 1845, 1795, 4613, 3397, 12313, 52839, 129583}},
+{7486, 17, 15010, {1, 3, 5, 3, 19, 1, 7, 145, 255, 337, 1649, 1473, 4113, 4425, 12233, 55477, 69157}},
+{7487, 17, 15022, {1, 1, 3, 1, 25, 27, 93, 59, 415, 437, 25, 1565, 319, 8981, 2453, 53579, 45033}},
+{7488, 17, 15039, {1, 3, 7, 1, 27, 49, 47, 233, 341, 101, 2017, 2827, 8085, 237, 6363, 61139, 88903}},
+{7489, 17, 15041, {1, 1, 1, 5, 23, 47, 65, 251, 423, 957, 1751, 3541, 5405, 1335, 22703, 12587, 60201}},
+{7490, 17, 15047, {1, 1, 3, 3, 5, 51, 85, 195, 423, 519, 1797, 3821, 5915, 12257, 5377, 62733, 41197}},
+{7491, 17, 15048, {1, 3, 7, 15, 3, 47, 97, 1, 5, 175, 1449, 1609, 6873, 12017, 5579, 2665, 58389}},
+{7492, 17, 15056, {1, 3, 3, 15, 19, 37, 35, 29, 79, 767, 21, 1279, 1997, 11611, 14381, 35607, 127701}},
+{7493, 17, 15066, {1, 3, 7, 7, 7, 43, 47, 33, 69, 155, 703, 1373, 1589, 6997, 8627, 50647, 16989}},
+{7494, 17, 15068, {1, 3, 1, 5, 13, 33, 69, 133, 399, 361, 1633, 321, 2077, 8857, 13419, 23227, 40003}},
+{7495, 17, 15075, {1, 1, 1, 15, 15, 9, 45, 181, 427, 1005, 341, 1697, 6423, 5727, 7163, 10401, 38957}},
+{7496, 17, 15077, {1, 1, 7, 1, 17, 5, 17, 95, 279, 171, 825, 2459, 5243, 10683, 1849, 32809, 8995}},
+{7497, 17, 15082, {1, 3, 5, 15, 27, 47, 103, 69, 69, 255, 961, 2173, 5297, 5987, 5863, 14311, 117569}},
+{7498, 17, 15096, {1, 1, 1, 11, 21, 27, 61, 239, 183, 1013, 1955, 3171, 4183, 965, 14885, 49605, 87851}},
+{7499, 17, 15102, {1, 1, 7, 9, 9, 53, 99, 211, 267, 803, 1545, 4011, 7613, 13889, 28277, 6817, 26515}},
+{7500, 17, 15116, {1, 1, 3, 9, 1, 19, 33, 227, 461, 679, 499, 1069, 837, 12129, 20779, 12937, 104367}},
+{7501, 17, 15122, {1, 3, 3, 15, 7, 3, 29, 245, 179, 1015, 1651, 3753, 4185, 15357, 17379, 52835, 51953}},
+{7502, 17, 15127, {1, 3, 3, 3, 3, 25, 95, 239, 263, 427, 1749, 183, 5251, 361, 32549, 24331, 30789}},
+{7503, 17, 15133, {1, 1, 7, 1, 5, 3, 79, 9, 403, 195, 1433, 385, 8105, 7893, 16415, 23253, 127837}},
+{7504, 17, 15137, {1, 3, 7, 3, 23, 45, 115, 27, 473, 241, 361, 1787, 4247, 13451, 5627, 32923, 29375}},
+{7505, 17, 15138, {1, 3, 7, 1, 5, 55, 43, 37, 481, 899, 51, 2459, 5005, 12365, 19261, 32797, 45843}},
+{7506, 17, 15149, {1, 3, 7, 5, 9, 41, 83, 163, 241, 899, 567, 231, 4897, 15175, 10329, 6625, 95927}},
+{7507, 17, 15152, {1, 3, 1, 1, 7, 51, 61, 55, 253, 315, 1893, 2635, 4061, 257, 14147, 36639, 24893}},
+{7508, 17, 15155, {1, 1, 5, 1, 13, 63, 115, 119, 205, 309, 277, 2191, 341, 4715, 13111, 58043, 51241}},
+{7509, 17, 15158, {1, 3, 1, 15, 17, 23, 89, 121, 205, 15, 295, 667, 421, 14071, 27719, 1335, 9887}},
+{7510, 17, 15187, {1, 3, 5, 5, 17, 49, 5, 93, 251, 613, 1029, 945, 1547, 10479, 20183, 26787, 120441}},
+{7511, 17, 15189, {1, 3, 3, 15, 17, 11, 63, 97, 499, 313, 881, 2233, 4287, 5141, 13841, 40725, 49285}},
+{7512, 17, 15190, {1, 3, 3, 11, 19, 33, 105, 203, 325, 337, 353, 1923, 7157, 8623, 23881, 4513, 71495}},
+{7513, 17, 15196, {1, 1, 5, 1, 3, 15, 119, 43, 85, 869, 1597, 2433, 845, 5065, 12813, 64849, 58491}},
+{7514, 17, 15199, {1, 3, 7, 7, 25, 63, 119, 93, 303, 665, 571, 1795, 5853, 13527, 12715, 36483, 57723}},
+{7515, 17, 15205, {1, 3, 7, 13, 19, 43, 55, 85, 189, 627, 1457, 3185, 3491, 1913, 13399, 30681, 69015}},
+{7516, 17, 15212, {1, 3, 5, 9, 5, 41, 51, 65, 147, 425, 569, 1317, 1557, 7631, 17243, 37847, 51161}},
+{7517, 17, 15236, {1, 1, 3, 7, 29, 39, 61, 127, 489, 89, 749, 2073, 195, 14367, 13533, 27403, 16365}},
+{7518, 17, 15243, {1, 3, 7, 15, 13, 35, 45, 157, 373, 415, 725, 779, 3559, 7489, 11369, 36501, 60761}},
+{7519, 17, 15246, {1, 3, 1, 3, 13, 45, 25, 215, 385, 709, 499, 3861, 761, 15597, 3335, 37013, 13173}},
+{7520, 17, 15260, {1, 1, 7, 1, 13, 49, 89, 135, 175, 1015, 67, 957, 4893, 9843, 13027, 14709, 59721}},
+{7521, 17, 15267, {1, 3, 3, 11, 19, 37, 109, 143, 135, 535, 1543, 3991, 189, 6739, 28087, 18845, 41819}},
+{7522, 17, 15274, {1, 1, 7, 5, 1, 7, 11, 5, 211, 251, 1593, 2527, 3539, 10471, 25595, 60119, 89213}},
+{7523, 17, 15279, {1, 1, 5, 7, 13, 51, 121, 167, 299, 403, 977, 521, 279, 15521, 15901, 935, 14065}},
+{7524, 17, 15281, {1, 1, 7, 13, 7, 21, 27, 205, 377, 801, 1365, 1567, 6651, 139, 14229, 30827, 50429}},
+{7525, 17, 15282, {1, 1, 1, 1, 17, 11, 75, 87, 217, 413, 1923, 1765, 2037, 14061, 12433, 30671, 24883}},
+{7526, 17, 15284, {1, 1, 5, 13, 17, 51, 91, 241, 95, 505, 349, 2689, 1117, 4435, 1713, 44501, 125619}},
+{7527, 17, 15291, {1, 1, 3, 15, 11, 21, 25, 59, 511, 353, 799, 91, 4517, 16005, 17061, 21841, 46311}},
+{7528, 17, 15293, {1, 1, 1, 5, 19, 53, 109, 177, 213, 373, 761, 453, 5753, 69, 3503, 49411, 111105}},
+{7529, 17, 15302, {1, 3, 1, 5, 21, 27, 103, 167, 109, 55, 1849, 3999, 7801, 4185, 9789, 7515, 124983}},
+{7530, 17, 15319, {1, 3, 7, 7, 25, 9, 65, 127, 141, 169, 1079, 3377, 691, 5119, 6629, 3517, 28963}},
+{7531, 17, 15329, {1, 1, 3, 11, 15, 61, 127, 35, 87, 891, 1459, 483, 6763, 16173, 5633, 6939, 63411}},
+{7532, 17, 15336, {1, 3, 5, 3, 7, 63, 111, 85, 415, 273, 1705, 4045, 5551, 2377, 29025, 16831, 90203}},
+{7533, 17, 15347, {1, 3, 5, 13, 7, 23, 103, 227, 477, 985, 1059, 1489, 7233, 1917, 10409, 38759, 86761}},
+{7534, 17, 15353, {1, 3, 5, 7, 31, 33, 75, 41, 355, 577, 225, 5, 897, 15653, 27415, 83, 14911}},
+{7535, 17, 15361, {1, 3, 5, 5, 23, 13, 5, 43, 165, 53, 149, 2005, 4545, 477, 17885, 21343, 35751}},
+{7536, 17, 15371, {1, 3, 3, 3, 25, 51, 33, 203, 291, 835, 241, 3255, 3709, 3573, 9859, 33027, 122801}},
+{7537, 17, 15397, {1, 3, 5, 7, 13, 7, 3, 141, 455, 67, 2003, 3411, 4717, 157, 29491, 14429, 44849}},
+{7538, 17, 15404, {1, 1, 1, 11, 3, 33, 101, 93, 219, 371, 1191, 1521, 1663, 8485, 24815, 38283, 120867}},
+{7539, 17, 15407, {1, 1, 3, 9, 25, 61, 71, 173, 69, 181, 1525, 2129, 2979, 19, 13489, 627, 72619}},
+{7540, 17, 15421, {1, 3, 1, 7, 25, 33, 39, 247, 221, 7, 683, 1837, 8037, 9125, 4259, 63049, 63021}},
+{7541, 17, 15433, {1, 3, 3, 9, 17, 15, 9, 189, 357, 707, 521, 711, 8189, 12945, 29675, 11851, 126813}},
+{7542, 17, 15441, {1, 3, 1, 1, 23, 3, 57, 133, 245, 301, 957, 239, 3139, 7949, 27133, 18229, 93015}},
+{7543, 17, 15442, {1, 1, 3, 1, 29, 23, 35, 87, 231, 257, 1997, 271, 3019, 3409, 10613, 42245, 111309}},
+{7544, 17, 15463, {1, 1, 3, 3, 1, 21, 17, 37, 393, 943, 791, 3101, 6715, 11907, 25369, 9061, 75381}},
+{7545, 17, 15472, {1, 1, 7, 7, 17, 31, 25, 7, 183, 819, 1265, 3343, 6845, 2039, 3779, 41861, 38309}},
+{7546, 17, 15478, {1, 1, 1, 5, 17, 25, 1, 41, 173, 995, 863, 3515, 1779, 2159, 28223, 64661, 40697}},
+{7547, 17, 15488, {1, 1, 3, 15, 29, 49, 81, 241, 511, 817, 1301, 3593, 6759, 7483, 8859, 30339, 106137}},
+{7548, 17, 15493, {1, 3, 1, 11, 17, 61, 95, 231, 3, 693, 37, 1091, 3111, 11941, 17475, 8073, 62373}},
+{7549, 17, 15498, {1, 1, 1, 3, 7, 25, 93, 7, 291, 957, 859, 2519, 241, 10963, 10403, 933, 50599}},
+{7550, 17, 15511, {1, 1, 7, 1, 7, 33, 121, 91, 369, 333, 229, 4073, 6063, 6491, 31711, 65061, 107843}},
+{7551, 17, 15521, {1, 1, 5, 15, 17, 1, 117, 195, 445, 547, 867, 2893, 4835, 6513, 29091, 60367, 33409}},
+{7552, 17, 15534, {1, 3, 3, 7, 15, 5, 125, 131, 165, 127, 207, 853, 5927, 3605, 17083, 44481, 111333}},
+{7553, 17, 15539, {1, 1, 1, 9, 3, 43, 75, 191, 319, 889, 1513, 3301, 1535, 4693, 10367, 12491, 43175}},
+{7554, 17, 15541, {1, 3, 5, 5, 29, 19, 75, 221, 393, 977, 1373, 1571, 7377, 1763, 18073, 11381, 101241}},
+{7555, 17, 15560, {1, 3, 1, 15, 3, 15, 73, 91, 165, 213, 1077, 1267, 2411, 15807, 3979, 12731, 86597}},
+{7556, 17, 15563, {1, 1, 3, 7, 3, 21, 5, 135, 95, 337, 1853, 1675, 2449, 12535, 18505, 60127, 76949}},
+{7557, 17, 15574, {1, 1, 7, 3, 15, 11, 63, 127, 329, 169, 1569, 675, 4801, 5859, 3243, 25811, 77841}},
+{7558, 17, 15578, {1, 1, 1, 9, 19, 13, 73, 119, 105, 537, 951, 1033, 5303, 5775, 815, 19277, 57607}},
+{7559, 17, 15584, {1, 3, 5, 5, 23, 21, 91, 231, 117, 1007, 1603, 841, 2595, 11223, 17171, 25963, 17049}},
+{7560, 17, 15593, {1, 1, 5, 11, 15, 43, 7, 229, 55, 129, 599, 993, 563, 15677, 16703, 36253, 17847}},
+{7561, 17, 15604, {1, 3, 1, 9, 25, 3, 109, 21, 87, 721, 1927, 3219, 3395, 3267, 9117, 13591, 89267}},
+{7562, 17, 15614, {1, 1, 1, 15, 11, 17, 47, 49, 125, 925, 333, 945, 2411, 10907, 12021, 47857, 84303}},
+{7563, 17, 15619, {1, 1, 1, 1, 23, 11, 99, 215, 105, 417, 823, 1289, 421, 12285, 17711, 35389, 1935}},
+{7564, 17, 15622, {1, 1, 1, 15, 27, 7, 23, 141, 7, 929, 147, 681, 5473, 4173, 28645, 42053, 83573}},
+{7565, 17, 15633, {1, 1, 1, 11, 5, 61, 71, 65, 287, 697, 1183, 3257, 7251, 14011, 21349, 42445, 4701}},
+{7566, 17, 15639, {1, 3, 5, 9, 5, 23, 45, 217, 369, 189, 1495, 107, 425, 10467, 4909, 64293, 17885}},
+{7567, 17, 15646, {1, 1, 3, 11, 21, 45, 75, 65, 57, 893, 783, 3429, 409, 13617, 483, 62489, 2919}},
+{7568, 17, 15673, {1, 1, 7, 3, 5, 61, 51, 255, 501, 839, 367, 1165, 7055, 8139, 23891, 18807, 20739}},
+{7569, 17, 15674, {1, 1, 3, 7, 23, 15, 97, 139, 323, 463, 921, 1529, 6655, 8697, 23577, 56761, 62023}},
+{7570, 17, 15684, {1, 1, 5, 11, 13, 11, 57, 225, 277, 713, 1427, 95, 1135, 7721, 30731, 32625, 107891}},
+{7571, 17, 15691, {1, 1, 5, 7, 23, 35, 39, 91, 291, 609, 919, 3325, 6843, 7659, 5603, 37471, 41495}},
+{7572, 17, 15694, {1, 1, 1, 1, 25, 11, 117, 15, 389, 589, 1345, 423, 6531, 9903, 20243, 9523, 22991}},
+{7573, 17, 15696, {1, 3, 5, 15, 29, 7, 57, 113, 387, 883, 1141, 3295, 2973, 4129, 16973, 33429, 109997}},
+{7574, 17, 15701, {1, 3, 5, 3, 25, 1, 73, 207, 353, 203, 1479, 985, 6373, 3079, 28403, 63675, 21787}},
+{7575, 17, 15705, {1, 3, 1, 5, 31, 39, 107, 197, 359, 45, 203, 559, 4721, 6579, 11305, 12957, 10061}},
+{7576, 17, 15715, {1, 3, 7, 15, 9, 3, 55, 153, 373, 981, 575, 827, 4757, 15743, 14295, 43875, 17847}},
+{7577, 17, 15729, {1, 3, 5, 1, 17, 1, 93, 87, 207, 997, 1695, 3643, 6973, 9507, 29309, 58531, 6849}},
+{7578, 17, 15730, {1, 3, 1, 11, 3, 39, 17, 241, 83, 931, 39, 3839, 6437, 5159, 28869, 61859, 96873}},
+{7579, 17, 15741, {1, 1, 5, 13, 29, 43, 71, 159, 261, 563, 695, 1205, 2273, 8077, 12569, 17187, 54369}},
+{7580, 17, 15745, {1, 3, 7, 5, 11, 57, 17, 31, 311, 1001, 1419, 3899, 6679, 15531, 28877, 28221, 105413}},
+{7581, 17, 15748, {1, 3, 3, 13, 23, 29, 127, 19, 345, 1003, 1571, 2219, 3199, 9903, 18701, 31865, 108879}},
+{7582, 17, 15757, {1, 3, 7, 13, 23, 51, 95, 43, 35, 439, 25, 323, 2365, 12407, 27525, 57795, 74495}},
+{7583, 17, 15765, {1, 1, 1, 1, 17, 43, 57, 185, 439, 929, 69, 813, 6205, 3139, 3853, 56967, 19073}},
+{7584, 17, 15766, {1, 3, 7, 1, 27, 5, 43, 211, 395, 113, 1675, 1505, 6171, 5169, 9991, 21641, 27101}},
+{7585, 17, 15775, {1, 3, 3, 1, 17, 41, 59, 131, 131, 339, 955, 1145, 5301, 4585, 20441, 43227, 23123}},
+{7586, 17, 15776, {1, 1, 7, 9, 9, 55, 61, 31, 71, 229, 963, 3247, 4677, 9595, 21715, 36391, 86997}},
+{7587, 17, 15779, {1, 1, 7, 5, 9, 17, 55, 179, 27, 229, 79, 1335, 5887, 1003, 22085, 34377, 51367}},
+{7588, 17, 15786, {1, 1, 1, 5, 11, 45, 15, 219, 411, 27, 1003, 1553, 303, 13571, 13985, 6801, 52407}},
+{7589, 17, 15788, {1, 3, 3, 7, 7, 55, 111, 255, 453, 409, 1863, 1449, 4103, 8725, 26923, 5017, 43657}},
+{7590, 17, 15813, {1, 1, 1, 15, 23, 3, 95, 57, 29, 727, 1111, 3309, 1089, 471, 16099, 11517, 51563}},
+{7591, 17, 15814, {1, 3, 1, 15, 17, 57, 83, 163, 251, 987, 1159, 2079, 3463, 13109, 7443, 8665, 123397}},
+{7592, 17, 15842, {1, 1, 7, 1, 27, 13, 35, 209, 471, 843, 1029, 1383, 5413, 2085, 13431, 26557, 47033}},
+{7593, 17, 15851, {1, 3, 1, 1, 21, 21, 83, 135, 303, 27, 1407, 1751, 331, 9207, 31891, 59287, 120687}},
+{7594, 17, 15862, {1, 1, 1, 9, 11, 35, 103, 157, 1, 855, 175, 3203, 4381, 3113, 27589, 4567, 31897}},
+{7595, 17, 15875, {1, 1, 3, 5, 21, 5, 123, 161, 301, 101, 909, 947, 6893, 15459, 29139, 49377, 94901}},
+{7596, 17, 15878, {1, 3, 7, 7, 21, 27, 5, 69, 427, 409, 1389, 3737, 847, 2775, 603, 1001, 87651}},
+{7597, 17, 15889, {1, 1, 3, 5, 1, 57, 109, 89, 99, 593, 581, 3527, 1557, 4971, 27523, 26909, 35787}},
+{7598, 17, 15896, {1, 1, 7, 3, 31, 19, 83, 65, 239, 919, 15, 2289, 4117, 9127, 6033, 49667, 89343}},
+{7599, 17, 15901, {1, 3, 7, 7, 9, 31, 87, 117, 195, 681, 1711, 1753, 2221, 10053, 1985, 6273, 21801}},
+{7600, 17, 15908, {1, 3, 1, 7, 21, 61, 53, 231, 309, 115, 1729, 3883, 6085, 4825, 31455, 50097, 59779}},
+{7601, 17, 15911, {1, 1, 1, 9, 29, 25, 45, 91, 145, 927, 147, 371, 2603, 12537, 17267, 59895, 128009}},
+{7602, 17, 15915, {1, 1, 1, 1, 15, 41, 63, 43, 167, 215, 15, 3387, 1811, 12391, 25721, 6961, 13701}},
+{7603, 17, 15938, {1, 1, 7, 1, 27, 63, 25, 85, 337, 799, 87, 2237, 4085, 14529, 11493, 60149, 86399}},
+{7604, 17, 15944, {1, 3, 1, 11, 1, 41, 103, 145, 279, 805, 1201, 823, 5411, 4227, 25999, 14373, 36295}},
+{7605, 17, 15950, {1, 1, 7, 3, 27, 51, 83, 105, 155, 657, 1879, 3869, 2559, 2939, 19785, 47167, 34503}},
+{7606, 17, 15955, {1, 3, 1, 5, 3, 31, 47, 241, 257, 15, 983, 4095, 3745, 3901, 1639, 5421, 81585}},
+{7607, 17, 15974, {1, 3, 3, 5, 31, 13, 127, 125, 175, 577, 1103, 3573, 6229, 13969, 6267, 19067, 3933}},
+{7608, 17, 15978, {1, 1, 7, 1, 31, 17, 15, 15, 411, 553, 1929, 3731, 1955, 11749, 21991, 39189, 124427}},
+{7609, 17, 15980, {1, 3, 5, 5, 19, 63, 93, 201, 491, 599, 1093, 767, 3411, 13087, 23569, 42981, 35757}},
+{7610, 17, 15983, {1, 1, 1, 15, 27, 7, 51, 101, 429, 939, 111, 781, 2055, 14227, 17821, 42097, 32485}},
+{7611, 17, 15991, {1, 3, 7, 13, 11, 21, 3, 161, 353, 389, 285, 2633, 6245, 7089, 21907, 40765, 88869}},
+{7612, 17, 16004, {1, 1, 5, 9, 7, 27, 101, 203, 243, 897, 1375, 1619, 5275, 12935, 22103, 38005, 65603}},
+{7613, 17, 16011, {1, 1, 5, 9, 13, 25, 15, 21, 447, 7, 947, 1613, 5055, 129, 18057, 58551, 6603}},
+{7614, 17, 16016, {1, 3, 7, 15, 17, 41, 11, 55, 103, 339, 349, 1813, 7423, 11837, 20641, 51951, 61615}},
+{7615, 17, 16019, {1, 3, 3, 15, 21, 59, 113, 3, 123, 689, 465, 3039, 4109, 3241, 30317, 65053, 117845}},
+{7616, 17, 16025, {1, 3, 3, 1, 31, 33, 73, 155, 245, 401, 473, 51, 1387, 489, 10573, 55401, 106733}},
+{7617, 17, 16041, {1, 3, 3, 1, 31, 37, 15, 139, 127, 201, 229, 1753, 7287, 9045, 18321, 63485, 26399}},
+{7618, 17, 16064, {1, 3, 5, 5, 5, 23, 93, 3, 125, 715, 1827, 419, 1213, 9031, 25139, 20771, 41345}},
+{7619, 17, 16067, {1, 3, 5, 15, 23, 15, 13, 145, 105, 477, 1131, 2699, 1929, 10447, 9655, 26791, 80101}},
+{7620, 17, 16074, {1, 1, 1, 13, 1, 35, 75, 73, 269, 851, 737, 1909, 6805, 11359, 28991, 52435, 83767}},
+{7621, 17, 16082, {1, 1, 7, 5, 11, 31, 31, 91, 111, 161, 1865, 2545, 133, 12215, 8957, 20671, 92975}},
+{7622, 17, 16103, {1, 1, 7, 5, 25, 53, 55, 121, 53, 457, 831, 2493, 339, 10955, 30783, 9095, 97921}},
+{7623, 17, 16109, {1, 1, 5, 3, 25, 33, 81, 51, 211, 737, 1865, 4039, 6931, 8473, 22459, 24885, 96355}},
+{7624, 17, 16122, {1, 3, 7, 13, 23, 5, 101, 171, 65, 793, 443, 411, 7629, 14791, 28633, 9055, 123763}},
+{7625, 17, 16149, {1, 3, 3, 1, 11, 7, 99, 79, 461, 481, 1689, 3777, 2125, 4783, 13061, 19537, 68109}},
+{7626, 17, 16170, {1, 1, 3, 11, 31, 53, 109, 7, 49, 925, 1017, 2371, 1537, 13557, 75, 40677, 49181}},
+{7627, 17, 16175, {1, 3, 3, 3, 9, 1, 95, 113, 189, 389, 377, 393, 6523, 3183, 6461, 30201, 66549}},
+{7628, 17, 16178, {1, 1, 7, 15, 13, 19, 41, 171, 475, 157, 949, 3245, 5581, 2783, 25263, 53023, 11155}},
+{7629, 17, 16189, {1, 3, 5, 7, 29, 63, 61, 65, 315, 595, 905, 899, 5059, 4243, 27287, 14023, 64213}},
+{7630, 17, 16202, {1, 3, 1, 3, 15, 37, 109, 161, 9, 867, 1023, 2513, 4593, 7747, 1505, 4801, 127091}},
+{7631, 17, 16204, {1, 3, 1, 7, 11, 59, 75, 129, 469, 695, 63, 2757, 6357, 8675, 6193, 23439, 66445}},
+{7632, 17, 16222, {1, 1, 3, 13, 17, 9, 47, 91, 161, 265, 139, 129, 6707, 9659, 8917, 54757, 77835}},
+{7633, 17, 16231, {1, 1, 3, 13, 19, 37, 113, 255, 99, 913, 1445, 487, 337, 1001, 16395, 37141, 66595}},
+{7634, 17, 16238, {1, 1, 1, 15, 3, 63, 69, 43, 185, 293, 1137, 2061, 2377, 8741, 26817, 5833, 7807}},
+{7635, 17, 16262, {1, 1, 1, 5, 3, 29, 39, 33, 263, 355, 597, 539, 5055, 13075, 8977, 19829, 88171}},
+{7636, 17, 16265, {1, 3, 7, 9, 17, 49, 125, 101, 447, 597, 1337, 559, 2807, 7925, 12421, 17427, 34815}},
+{7637, 17, 16276, {1, 3, 1, 9, 11, 57, 31, 163, 503, 925, 911, 3721, 2515, 8429, 25749, 55209, 90105}},
+{7638, 17, 16285, {1, 3, 5, 3, 21, 57, 119, 233, 319, 745, 563, 3057, 2683, 7063, 11513, 49157, 64561}},
+{7639, 17, 16313, {1, 1, 3, 9, 15, 21, 93, 99, 227, 479, 965, 51, 6941, 9887, 32409, 23171, 98387}},
+{7640, 17, 16314, {1, 3, 5, 5, 19, 1, 47, 49, 233, 931, 971, 2369, 2827, 1291, 18653, 725, 19791}},
+{7641, 17, 16321, {1, 1, 5, 15, 3, 7, 71, 251, 341, 861, 1203, 793, 7627, 10929, 10717, 10677, 49743}},
+{7642, 17, 16327, {1, 3, 1, 7, 3, 43, 9, 187, 247, 621, 1069, 2875, 1525, 4221, 18813, 35807, 117609}},
+{7643, 17, 16333, {1, 3, 3, 3, 29, 39, 83, 201, 205, 337, 231, 547, 2893, 2483, 6197, 26869, 18921}},
+{7644, 17, 16334, {1, 1, 7, 3, 23, 29, 33, 137, 491, 691, 979, 65, 5711, 11685, 5137, 37993, 37075}},
+{7645, 17, 16364, {1, 3, 3, 1, 11, 3, 99, 119, 203, 901, 1887, 879, 7547, 4613, 31233, 13279, 105089}},
+{7646, 17, 16369, {1, 1, 1, 13, 25, 23, 111, 167, 313, 141, 127, 1223, 5711, 4101, 10977, 34695, 128303}},
+{7647, 17, 16370, {1, 1, 7, 15, 5, 3, 89, 151, 289, 769, 539, 2883, 8121, 15403, 22345, 63765, 117015}},
+{7648, 17, 16375, {1, 1, 1, 13, 15, 9, 71, 95, 37, 705, 1575, 3735, 7445, 2027, 27523, 53321, 106085}},
+{7649, 17, 16376, {1, 3, 5, 7, 5, 29, 7, 25, 181, 491, 1173, 1947, 3321, 9233, 17265, 26999, 97783}},
+{7650, 17, 16379, {1, 1, 3, 15, 1, 63, 111, 113, 279, 123, 345, 1529, 2725, 8643, 8551, 30073, 26689}},
+{7651, 17, 16393, {1, 3, 7, 7, 5, 55, 117, 211, 293, 851, 1491, 3265, 4009, 14949, 10297, 16219, 69983}},
+{7652, 17, 16402, {1, 1, 3, 11, 23, 45, 35, 91, 97, 191, 417, 3545, 1733, 3955, 10763, 10229, 75027}},
+{7653, 17, 16408, {1, 1, 3, 13, 3, 61, 69, 205, 379, 627, 295, 3979, 85, 11305, 2493, 35583, 3133}},
+{7654, 17, 16418, {1, 3, 5, 9, 5, 63, 67, 201, 351, 367, 1009, 739, 5409, 8715, 28939, 31511, 34599}},
+{7655, 17, 16438, {1, 1, 1, 5, 3, 25, 21, 25, 477, 301, 623, 157, 563, 9457, 24515, 30135, 107165}},
+{7656, 17, 16441, {1, 1, 3, 15, 5, 41, 49, 171, 469, 427, 857, 2165, 1437, 2151, 24061, 63243, 105331}},
+{7657, 17, 16447, {1, 3, 5, 11, 21, 25, 59, 167, 29, 653, 1503, 2223, 3889, 4605, 28381, 36075, 74907}},
+{7658, 17, 16450, {1, 3, 7, 7, 17, 55, 73, 127, 33, 319, 1565, 2761, 6473, 2187, 19939, 56687, 112137}},
+{7659, 17, 16455, {1, 1, 1, 9, 7, 53, 105, 3, 299, 15, 1009, 607, 6885, 12875, 20719, 16841, 70471}},
+{7660, 17, 16459, {1, 3, 5, 9, 7, 33, 23, 163, 279, 739, 1541, 3017, 2309, 11827, 3875, 44337, 82063}},
+{7661, 17, 16483, {1, 1, 1, 5, 19, 53, 109, 193, 331, 339, 477, 4093, 5177, 13527, 25731, 64137, 81411}},
+{7662, 17, 16490, {1, 3, 7, 13, 15, 63, 101, 145, 127, 13, 1431, 3581, 4993, 14287, 12125, 60217, 102563}},
+{7663, 17, 16492, {1, 3, 1, 7, 17, 27, 127, 81, 223, 763, 761, 2061, 1031, 12251, 14141, 23587, 124813}},
+{7664, 17, 16495, {1, 3, 5, 13, 27, 21, 9, 249, 285, 875, 65, 4075, 6749, 13417, 3079, 29343, 87075}},
+{7665, 17, 16523, {1, 3, 5, 13, 1, 31, 61, 21, 169, 145, 1681, 1229, 5059, 13555, 21373, 35597, 70669}},
+{7666, 17, 16528, {1, 3, 7, 15, 23, 31, 43, 237, 139, 9, 1905, 3197, 801, 14205, 13323, 18717, 88523}},
+{7667, 17, 16543, {1, 1, 1, 11, 1, 7, 21, 83, 15, 459, 537, 4029, 6973, 4019, 1, 35147, 16329}},
+{7668, 17, 16553, {1, 3, 7, 15, 23, 11, 17, 101, 235, 683, 913, 3529, 4363, 13899, 3603, 27741, 74143}},
+{7669, 17, 16562, {1, 1, 7, 7, 3, 3, 91, 107, 499, 723, 315, 2805, 5909, 11041, 18281, 54981, 76041}},
+{7670, 17, 16564, {1, 3, 7, 9, 15, 7, 93, 171, 275, 647, 655, 3565, 2199, 14795, 21945, 9373, 122299}},
+{7671, 17, 16576, {1, 1, 1, 5, 27, 53, 73, 27, 431, 707, 53, 1281, 49, 13199, 1973, 18935, 114821}},
+{7672, 17, 16588, {1, 1, 3, 3, 25, 1, 17, 159, 217, 413, 1393, 2119, 5611, 7659, 6003, 19927, 22287}},
+{7673, 17, 16612, {1, 1, 7, 15, 29, 59, 77, 9, 205, 795, 627, 2167, 2477, 6841, 17663, 34871, 79823}},
+{7674, 17, 16630, {1, 3, 5, 9, 13, 35, 79, 237, 11, 335, 789, 2291, 13, 853, 20373, 39049, 407}},
+{7675, 17, 16654, {1, 1, 5, 7, 13, 27, 21, 173, 137, 659, 123, 2677, 2153, 14879, 26737, 56291, 47613}},
+{7676, 17, 16656, {1, 3, 5, 15, 23, 47, 15, 109, 311, 597, 261, 2407, 8139, 3215, 28169, 60731, 79937}},
+{7677, 17, 16668, {1, 3, 3, 5, 11, 61, 71, 29, 189, 741, 1171, 397, 2669, 10627, 20037, 51703, 6697}},
+{7678, 17, 16672, {1, 3, 3, 3, 9, 41, 125, 1, 381, 399, 349, 3265, 6337, 8113, 14869, 5305, 83409}},
+{7679, 17, 16675, {1, 1, 3, 13, 5, 19, 33, 225, 45, 55, 1809, 1037, 5443, 15719, 9963, 363, 15145}},
+{7680, 17, 16678, {1, 3, 7, 1, 31, 25, 103, 29, 207, 169, 305, 913, 7501, 15323, 10575, 13477, 65245}},
+{7681, 17, 16681, {1, 3, 3, 15, 13, 23, 69, 255, 333, 157, 279, 1989, 3439, 12955, 13649, 52431, 90009}},
+{7682, 17, 16689, {1, 3, 7, 5, 23, 61, 111, 121, 79, 469, 89, 1545, 3405, 12393, 2035, 15989, 84855}},
+{7683, 17, 16699, {1, 1, 7, 5, 17, 21, 127, 151, 283, 521, 5, 3023, 5365, 11633, 21177, 42207, 48925}},
+{7684, 17, 16719, {1, 3, 7, 5, 21, 21, 61, 17, 415, 879, 1485, 3727, 935, 9899, 23241, 651, 103701}},
+{7685, 17, 16734, {1, 3, 5, 15, 31, 47, 19, 245, 249, 467, 253, 1575, 337, 863, 19353, 13153, 125453}},
+{7686, 17, 16737, {1, 1, 7, 15, 9, 41, 39, 63, 139, 875, 1011, 1961, 1627, 7461, 28961, 47195, 16239}},
+{7687, 17, 16750, {1, 3, 3, 7, 27, 55, 51, 245, 231, 619, 43, 91, 2125, 2685, 23661, 10189, 43085}},
+{7688, 17, 16752, {1, 1, 7, 9, 27, 55, 35, 139, 187, 143, 1545, 2685, 3173, 12065, 21607, 42619, 105279}},
+{7689, 17, 16757, {1, 1, 5, 3, 29, 63, 15, 197, 49, 995, 389, 1959, 2441, 11509, 31753, 40539, 26989}},
+{7690, 17, 16761, {1, 3, 7, 15, 19, 37, 17, 37, 305, 469, 945, 2335, 1493, 13843, 19905, 49031, 107893}},
+{7691, 17, 16773, {1, 3, 1, 11, 3, 35, 113, 181, 223, 27, 485, 2435, 3423, 11321, 1687, 45755, 18017}},
+{7692, 17, 16774, {1, 3, 3, 13, 17, 47, 109, 145, 287, 769, 1373, 3423, 1251, 14357, 3209, 28363, 97987}},
+{7693, 17, 16801, {1, 1, 3, 13, 7, 25, 93, 11, 23, 331, 517, 1705, 1957, 291, 763, 10411, 120367}},
+{7694, 17, 16802, {1, 3, 7, 15, 25, 9, 1, 33, 83, 61, 97, 509, 5387, 8701, 14243, 31883, 7375}},
+{7695, 17, 16822, {1, 3, 1, 5, 19, 11, 59, 95, 265, 205, 533, 1857, 693, 12469, 24445, 19449, 130623}},
+{7696, 17, 16831, {1, 1, 7, 7, 1, 5, 15, 159, 333, 361, 391, 1889, 2645, 15115, 30709, 60515, 13315}},
+{7697, 17, 16840, {1, 3, 5, 15, 25, 61, 69, 213, 183, 575, 1573, 3147, 1753, 2387, 23063, 12853, 108507}},
+{7698, 17, 16854, {1, 1, 1, 15, 17, 31, 11, 177, 411, 23, 469, 3985, 2159, 2273, 14175, 20425, 107741}},
+{7699, 17, 16858, {1, 1, 3, 9, 5, 35, 55, 225, 263, 641, 1393, 1277, 595, 2671, 7039, 64999, 114387}},
+{7700, 17, 16863, {1, 1, 3, 3, 11, 23, 1, 161, 77, 755, 1325, 1773, 4291, 13119, 29677, 27295, 81713}},
+{7701, 17, 16867, {1, 1, 5, 13, 31, 45, 115, 141, 449, 171, 1413, 2411, 7937, 10859, 19453, 64403, 45169}},
+{7702, 17, 16876, {1, 3, 5, 7, 1, 27, 117, 157, 99, 119, 1281, 2633, 5117, 16009, 19545, 7421, 30807}},
+{7703, 17, 16891, {1, 1, 3, 13, 19, 11, 61, 239, 331, 731, 1723, 1773, 2623, 15255, 17197, 63793, 100433}},
+{7704, 17, 16894, {1, 3, 7, 11, 11, 7, 119, 33, 195, 521, 811, 2599, 3113, 5497, 16751, 2541, 21813}},
+{7705, 17, 16898, {1, 1, 1, 15, 23, 47, 25, 73, 429, 213, 557, 1613, 7055, 7211, 2225, 1345, 58033}},
+{7706, 17, 16907, {1, 1, 1, 13, 15, 39, 69, 71, 11, 543, 267, 2803, 4853, 9819, 603, 4629, 78343}},
+{7707, 17, 16915, {1, 1, 7, 1, 15, 55, 47, 223, 63, 679, 1135, 3225, 3845, 12031, 6761, 20337, 29021}},
+{7708, 17, 16917, {1, 1, 3, 3, 3, 51, 127, 103, 43, 379, 169, 2549, 7775, 2553, 27415, 30671, 34043}},
+{7709, 17, 16922, {1, 1, 3, 11, 1, 31, 89, 113, 475, 857, 499, 3901, 5343, 8819, 4503, 58757, 60513}},
+{7710, 17, 16924, {1, 3, 5, 11, 27, 49, 97, 217, 91, 971, 1835, 3447, 2021, 3747, 20533, 13659, 84007}},
+{7711, 17, 16933, {1, 1, 5, 1, 31, 39, 49, 21, 135, 983, 579, 3509, 3611, 15101, 29781, 49941, 14353}},
+{7712, 17, 16938, {1, 1, 1, 9, 7, 17, 55, 233, 295, 161, 823, 3823, 4771, 13531, 24197, 42629, 60269}},
+{7713, 17, 16952, {1, 1, 3, 15, 23, 5, 101, 167, 55, 297, 1733, 3819, 7041, 9915, 27803, 60359, 10249}},
+{7714, 17, 16960, {1, 1, 7, 9, 25, 47, 67, 253, 303, 313, 1389, 3785, 2729, 11471, 27267, 42783, 111595}},
+{7715, 17, 16963, {1, 1, 5, 13, 25, 63, 17, 195, 457, 793, 1553, 1673, 6799, 12171, 9003, 22195, 90229}},
+{7716, 17, 16969, {1, 1, 3, 15, 11, 43, 43, 221, 423, 985, 873, 599, 1753, 4875, 7149, 34625, 8941}},
+{7717, 17, 16978, {1, 3, 5, 11, 1, 7, 109, 163, 309, 477, 1291, 3019, 1933, 14055, 15005, 1141, 66867}},
+{7718, 17, 17014, {1, 3, 3, 15, 21, 35, 95, 131, 413, 1009, 147, 2165, 6333, 8313, 20873, 18377, 23579}},
+{7719, 17, 17020, {1, 3, 1, 5, 21, 49, 29, 187, 67, 419, 253, 2345, 3179, 12331, 23127, 8799, 102493}},
+{7720, 17, 17034, {1, 1, 7, 5, 29, 59, 13, 189, 377, 595, 1893, 527, 7993, 14867, 24671, 14585, 38645}},
+{7721, 17, 17036, {1, 3, 5, 13, 3, 11, 99, 69, 253, 833, 1961, 2719, 3953, 8143, 21277, 16257, 26929}},
+{7722, 17, 17042, {1, 3, 7, 3, 3, 19, 19, 57, 393, 187, 945, 2107, 669, 14785, 13895, 26907, 92439}},
+{7723, 17, 17047, {1, 3, 5, 15, 11, 5, 73, 167, 99, 887, 1213, 2019, 3781, 14345, 30249, 16215, 1893}},
+{7724, 17, 17051, {1, 1, 5, 1, 17, 11, 69, 145, 97, 393, 1587, 2513, 1011, 6933, 7945, 41387, 34361}},
+{7725, 17, 17054, {1, 1, 5, 1, 5, 59, 57, 1, 501, 855, 1485, 977, 4981, 7631, 31853, 30737, 103023}},
+{7726, 17, 17063, {1, 3, 1, 5, 3, 27, 55, 171, 317, 641, 1875, 2523, 1631, 4971, 18743, 25119, 118913}},
+{7727, 17, 17069, {1, 1, 3, 15, 7, 39, 73, 209, 125, 29, 1031, 1569, 1793, 5461, 985, 59441, 92997}},
+{7728, 17, 17075, {1, 3, 5, 11, 27, 23, 57, 13, 65, 555, 1309, 1149, 5125, 11573, 3835, 57913, 78699}},
+{7729, 17, 17077, {1, 3, 7, 5, 29, 7, 51, 131, 443, 623, 1491, 1067, 6647, 6277, 25799, 54843, 90869}},
+{7730, 17, 17089, {1, 1, 1, 11, 7, 33, 67, 113, 319, 665, 11, 1225, 3137, 16269, 20101, 40263, 31091}},
+{7731, 17, 17090, {1, 3, 5, 15, 7, 5, 101, 153, 165, 173, 97, 1651, 6633, 6071, 29079, 35641, 77305}},
+{7732, 17, 17107, {1, 3, 7, 13, 9, 45, 103, 55, 121, 1021, 1841, 315, 8127, 6547, 1093, 7181, 39575}},
+{7733, 17, 17126, {1, 3, 3, 11, 15, 17, 27, 55, 341, 443, 377, 681, 3635, 1091, 16719, 49403, 85507}},
+{7734, 17, 17135, {1, 3, 5, 5, 29, 53, 51, 213, 273, 475, 981, 549, 539, 14989, 4037, 23911, 45997}},
+{7735, 17, 17150, {1, 3, 5, 3, 27, 37, 73, 115, 331, 911, 991, 4049, 6299, 3919, 10231, 31507, 98651}},
+{7736, 17, 17162, {1, 1, 5, 13, 21, 13, 1, 175, 137, 837, 1067, 2845, 307, 4399, 15671, 1309, 107409}},
+{7737, 17, 17169, {1, 1, 3, 1, 5, 47, 111, 75, 193, 389, 157, 3731, 6237, 5053, 9933, 28413, 32939}},
+{7738, 17, 17172, {1, 1, 7, 5, 29, 1, 51, 85, 267, 935, 1021, 3135, 3135, 9263, 32597, 6779, 71473}},
+{7739, 17, 17175, {1, 3, 5, 9, 21, 59, 27, 99, 155, 507, 1911, 3501, 4307, 6755, 17127, 29815, 1577}},
+{7740, 17, 17176, {1, 1, 5, 1, 15, 63, 45, 105, 125, 299, 689, 3935, 7229, 5007, 25003, 30453, 27819}},
+{7741, 17, 17191, {1, 1, 7, 15, 19, 9, 67, 151, 45, 985, 2015, 833, 5435, 15383, 25881, 46735, 56717}},
+{7742, 17, 17209, {1, 1, 5, 15, 27, 59, 119, 163, 293, 63, 1251, 1309, 485, 4937, 27207, 47481, 114357}},
+{7743, 17, 17218, {1, 3, 5, 13, 23, 11, 111, 87, 329, 467, 1657, 3309, 3421, 12013, 23163, 14105, 88761}},
+{7744, 17, 17220, {1, 1, 5, 11, 17, 63, 9, 61, 299, 585, 341, 3375, 3213, 15953, 11455, 5333, 66889}},
+{7745, 17, 17227, {1, 3, 5, 5, 5, 35, 57, 235, 137, 543, 77, 2811, 857, 12793, 10791, 55711, 93353}},
+{7746, 17, 17229, {1, 3, 7, 3, 23, 37, 19, 81, 321, 23, 1625, 2359, 3569, 4685, 7385, 32677, 18073}},
+{7747, 17, 17238, {1, 3, 3, 7, 21, 35, 81, 229, 207, 547, 1397, 2709, 7159, 1265, 16823, 9921, 29159}},
+{7748, 17, 17251, {1, 3, 7, 13, 27, 13, 107, 241, 395, 317, 307, 3927, 1153, 15915, 25179, 25173, 21503}},
+{7749, 17, 17257, {1, 3, 1, 5, 1, 51, 25, 135, 381, 229, 1491, 2009, 3331, 16165, 8169, 65161, 9335}},
+{7750, 17, 17258, {1, 1, 5, 5, 17, 15, 57, 221, 183, 225, 1649, 3701, 299, 12349, 4691, 64479, 82237}},
+{7751, 17, 17272, {1, 3, 7, 7, 31, 39, 65, 183, 149, 67, 1697, 3933, 3709, 15501, 12583, 60117, 88691}},
+{7752, 17, 17277, {1, 1, 5, 15, 17, 49, 117, 233, 161, 891, 789, 1347, 4887, 10713, 10613, 4389, 42619}},
+{7753, 17, 17308, {1, 3, 5, 9, 13, 3, 83, 69, 381, 777, 743, 2843, 7233, 3285, 8931, 48667, 120777}},
+{7754, 17, 17311, {1, 3, 1, 3, 11, 7, 55, 107, 165, 533, 1897, 3385, 1069, 12805, 30125, 42729, 123977}},
+{7755, 17, 17321, {1, 1, 1, 5, 13, 17, 103, 237, 77, 537, 1843, 2817, 7467, 13647, 15259, 3525, 18313}},
+{7756, 17, 17329, {1, 1, 7, 7, 13, 59, 29, 197, 309, 917, 1173, 2605, 4313, 12007, 25611, 60409, 104931}},
+{7757, 17, 17342, {1, 3, 3, 3, 27, 57, 7, 207, 491, 467, 1973, 3075, 8043, 3977, 14517, 13179, 47111}},
+{7758, 17, 17344, {1, 1, 7, 5, 31, 33, 125, 235, 79, 847, 1893, 3875, 7513, 1435, 24959, 46813, 82053}},
+{7759, 17, 17350, {1, 3, 7, 5, 3, 53, 103, 1, 215, 71, 787, 223, 1399, 6793, 11281, 39201, 122119}},
+{7760, 17, 17356, {1, 3, 3, 3, 3, 57, 7, 151, 319, 463, 685, 2917, 4037, 14929, 11971, 41827, 57449}},
+{7761, 17, 17371, {1, 1, 7, 3, 5, 11, 15, 139, 379, 563, 135, 65, 5633, 7535, 1451, 18289, 62457}},
+{7762, 17, 17374, {1, 1, 1, 15, 11, 23, 37, 57, 205, 107, 995, 151, 3279, 2015, 28927, 40731, 95551}},
+{7763, 17, 17392, {1, 3, 5, 9, 15, 43, 95, 217, 203, 215, 203, 2207, 8189, 465, 2175, 29285, 25375}},
+{7764, 17, 17402, {1, 3, 3, 5, 19, 59, 51, 123, 285, 721, 1335, 1777, 1645, 15811, 16539, 14637, 123323}},
+{7765, 17, 17410, {1, 3, 5, 5, 11, 35, 23, 23, 259, 789, 567, 1921, 4743, 6635, 6965, 43025, 43175}},
+{7766, 17, 17421, {1, 3, 7, 3, 7, 27, 77, 121, 285, 65, 647, 591, 2553, 7163, 12057, 43675, 24227}},
+{7767, 17, 17424, {1, 1, 5, 9, 3, 25, 17, 85, 235, 715, 1913, 2391, 3719, 11029, 18359, 6323, 4703}},
+{7768, 17, 17427, {1, 1, 1, 3, 25, 31, 37, 31, 89, 311, 1797, 3409, 6785, 9627, 29721, 58591, 111429}},
+{7769, 17, 17434, {1, 3, 1, 5, 9, 37, 47, 45, 419, 115, 1009, 1359, 65, 1161, 15673, 16075, 63895}},
+{7770, 17, 17449, {1, 1, 3, 5, 25, 47, 27, 87, 441, 547, 1801, 3589, 3773, 12215, 14509, 12669, 99983}},
+{7771, 17, 17452, {1, 1, 1, 3, 19, 33, 51, 91, 447, 577, 491, 539, 3177, 7033, 21633, 51737, 47089}},
+{7772, 17, 17463, {1, 1, 3, 15, 23, 53, 93, 113, 143, 973, 999, 2355, 1489, 3451, 29821, 23769, 74633}},
+{7773, 17, 17470, {1, 3, 7, 11, 27, 1, 35, 109, 111, 51, 425, 3203, 2585, 11255, 20939, 281, 92133}},
+{7774, 17, 17477, {1, 1, 1, 11, 13, 37, 13, 149, 421, 655, 79, 3093, 6429, 1145, 27663, 52861, 81431}},
+{7775, 17, 17482, {1, 1, 5, 13, 19, 23, 105, 39, 97, 239, 469, 1047, 4727, 12009, 8055, 45557, 124219}},
+{7776, 17, 17490, {1, 1, 1, 7, 7, 7, 5, 53, 269, 391, 1893, 2263, 2109, 11531, 12109, 31437, 20445}},
+{7777, 17, 17496, {1, 1, 3, 11, 9, 35, 69, 209, 93, 455, 1117, 3297, 2597, 15035, 17943, 19955, 829}},
+{7778, 17, 17508, {1, 1, 5, 7, 23, 23, 101, 71, 339, 553, 1653, 2997, 1191, 3121, 4575, 49979, 17353}},
+{7779, 17, 17511, {1, 3, 3, 13, 13, 9, 51, 181, 33, 185, 111, 589, 3117, 10105, 28811, 31529, 79657}},
+{7780, 17, 17536, {1, 1, 5, 3, 9, 57, 103, 65, 211, 473, 519, 3815, 4087, 2767, 10213, 37829, 9523}},
+{7781, 17, 17563, {1, 1, 5, 7, 7, 31, 81, 161, 311, 617, 1689, 3133, 57, 14595, 22783, 18475, 85811}},
+{7782, 17, 17570, {1, 3, 5, 5, 21, 51, 99, 249, 7, 525, 885, 3981, 2851, 529, 947, 29885, 122901}},
+{7783, 17, 17581, {1, 3, 1, 5, 1, 23, 85, 91, 309, 747, 183, 1347, 2399, 15777, 16205, 15687, 117333}},
+{7784, 17, 17590, {1, 3, 7, 3, 29, 21, 99, 137, 297, 229, 1063, 2747, 6415, 7791, 4775, 62863, 50849}},
+{7785, 17, 17608, {1, 3, 1, 3, 11, 3, 53, 153, 103, 911, 1595, 1899, 1049, 11643, 21105, 61587, 92399}},
+{7786, 17, 17616, {1, 1, 5, 15, 29, 55, 99, 101, 181, 453, 1917, 2081, 4687, 4335, 2817, 11861, 103167}},
+{7787, 17, 17621, {1, 3, 7, 15, 11, 7, 9, 3, 477, 281, 1141, 453, 4993, 7843, 6169, 49785, 53827}},
+{7788, 17, 17628, {1, 3, 7, 11, 25, 61, 77, 159, 83, 95, 1223, 85, 6309, 16145, 18729, 133, 14193}},
+{7789, 17, 17644, {1, 3, 3, 1, 7, 27, 97, 183, 263, 59, 915, 3857, 3349, 8123, 11251, 55163, 125703}},
+{7790, 17, 17649, {1, 3, 5, 5, 17, 33, 57, 55, 503, 811, 953, 349, 1949, 9127, 31015, 14475, 116769}},
+{7791, 17, 17652, {1, 3, 1, 1, 3, 53, 59, 131, 421, 971, 89, 3047, 3513, 13599, 4569, 54525, 54779}},
+{7792, 17, 17679, {1, 1, 3, 11, 9, 45, 95, 123, 197, 257, 1073, 1461, 5, 12701, 12559, 34989, 71631}},
+{7793, 17, 17691, {1, 3, 3, 7, 1, 27, 55, 191, 447, 561, 1975, 2665, 1341, 8969, 18519, 47389, 70847}},
+{7794, 17, 17693, {1, 1, 5, 5, 3, 31, 15, 165, 95, 423, 233, 2309, 7777, 3503, 20105, 3085, 92349}},
+{7795, 17, 17697, {1, 3, 1, 13, 23, 61, 7, 55, 157, 1, 83, 515, 2169, 14397, 18149, 56855, 117265}},
+{7796, 17, 17698, {1, 3, 3, 3, 3, 59, 69, 95, 127, 241, 65, 3145, 491, 13809, 17529, 20223, 96579}},
+{7797, 17, 17700, {1, 1, 1, 5, 13, 43, 117, 163, 305, 955, 2007, 3337, 807, 16019, 5721, 5479, 90937}},
+{7798, 17, 17704, {1, 3, 3, 1, 19, 9, 127, 5, 113, 491, 1873, 2127, 7949, 5207, 32531, 775, 131065}},
+{7799, 17, 17707, {1, 1, 7, 3, 1, 3, 91, 187, 37, 873, 1039, 4075, 5645, 243, 15127, 45615, 3813}},
+{7800, 17, 17715, {1, 1, 3, 11, 3, 37, 67, 59, 439, 763, 213, 1099, 1659, 12783, 30297, 60713, 43497}},
+{7801, 17, 17718, {1, 3, 3, 13, 23, 49, 47, 191, 245, 985, 487, 3165, 7803, 2437, 19073, 30605, 119641}},
+{7802, 17, 17721, {1, 3, 7, 7, 19, 43, 7, 253, 93, 99, 145, 219, 699, 2433, 3009, 565, 99671}},
+{7803, 17, 17722, {1, 1, 3, 13, 7, 5, 9, 23, 219, 155, 925, 3427, 6631, 16353, 4115, 20831, 49525}},
+{7804, 17, 17727, {1, 1, 7, 11, 15, 45, 41, 35, 301, 273, 241, 4031, 5441, 8281, 9341, 8499, 73841}},
+{7805, 17, 17729, {1, 3, 7, 13, 9, 19, 79, 3, 163, 197, 509, 2301, 6971, 11525, 8805, 33805, 111595}},
+{7806, 17, 17747, {1, 3, 3, 1, 15, 45, 69, 253, 155, 639, 1045, 749, 3619, 14871, 18063, 49763, 66687}},
+{7807, 17, 17754, {1, 3, 3, 3, 29, 5, 41, 171, 265, 677, 1719, 2623, 1721, 12243, 18741, 39595, 92873}},
+{7808, 17, 17756, {1, 3, 5, 7, 27, 23, 69, 61, 453, 399, 1857, 3901, 6565, 15595, 1083, 15065, 91249}},
+{7809, 17, 17760, {1, 1, 5, 7, 1, 27, 9, 145, 95, 983, 685, 2079, 5117, 5037, 22695, 53135, 43569}},
+{7810, 17, 17765, {1, 1, 3, 5, 5, 7, 69, 59, 331, 409, 179, 333, 1293, 3863, 9473, 12537, 55605}},
+{7811, 17, 17778, {1, 3, 5, 1, 1, 19, 1, 49, 317, 769, 91, 2073, 1765, 1197, 15029, 52553, 57361}},
+{7812, 17, 17784, {1, 1, 5, 1, 23, 13, 11, 69, 345, 877, 41, 817, 617, 14415, 8337, 53973, 50007}},
+{7813, 17, 17794, {1, 1, 7, 3, 19, 27, 69, 103, 115, 893, 219, 2891, 2813, 9933, 26401, 63323, 30909}},
+{7814, 17, 17805, {1, 1, 5, 5, 27, 15, 119, 3, 11, 783, 541, 2431, 2395, 3921, 15471, 34657, 100295}},
+{7815, 17, 17806, {1, 1, 7, 11, 15, 25, 39, 191, 345, 1001, 1773, 715, 1627, 15957, 30085, 34097, 58747}},
+{7816, 17, 17817, {1, 1, 1, 5, 17, 43, 65, 81, 487, 387, 1359, 145, 2231, 6693, 15857, 59539, 79615}},
+{7817, 17, 17824, {1, 1, 3, 5, 15, 19, 17, 233, 247, 611, 587, 2587, 2321, 2835, 1477, 41991, 88143}},
+{7818, 17, 17839, {1, 3, 3, 15, 27, 15, 53, 61, 359, 989, 283, 3569, 5551, 11849, 20995, 34065, 69407}},
+{7819, 17, 17842, {1, 3, 3, 11, 13, 31, 41, 87, 379, 47, 1289, 3143, 4213, 8643, 17065, 10707, 62773}},
+{7820, 17, 17844, {1, 3, 7, 1, 9, 61, 59, 121, 453, 663, 27, 793, 4501, 7713, 285, 13279, 11633}},
+{7821, 17, 17851, {1, 1, 7, 5, 29, 51, 57, 15, 233, 743, 879, 2317, 3399, 15741, 605, 57529, 87427}},
+{7822, 17, 17862, {1, 1, 1, 1, 19, 59, 51, 119, 273, 403, 1649, 3877, 3561, 10931, 21139, 2599, 77957}},
+{7823, 17, 17868, {1, 3, 1, 3, 5, 1, 79, 131, 251, 585, 359, 2073, 7041, 13611, 22937, 24645, 72827}},
+{7824, 17, 17871, {1, 3, 7, 9, 19, 39, 93, 137, 359, 565, 1123, 1301, 4111, 13683, 1361, 25147, 38315}},
+{7825, 17, 17873, {1, 1, 5, 13, 27, 31, 11, 243, 111, 243, 1615, 1649, 2999, 15873, 19161, 57485, 35819}},
+{7826, 17, 17896, {1, 3, 3, 5, 25, 57, 61, 207, 219, 969, 303, 1165, 6753, 13473, 10789, 52883, 45205}},
+{7827, 17, 17904, {1, 1, 7, 11, 9, 53, 55, 175, 399, 981, 255, 2499, 373, 13131, 26803, 48017, 25599}},
+{7828, 17, 17909, {1, 1, 3, 3, 11, 23, 73, 25, 83, 39, 1813, 747, 3287, 795, 11917, 55509, 105057}},
+{7829, 17, 17920, {1, 3, 7, 15, 29, 59, 47, 171, 219, 875, 71, 123, 8131, 15595, 12471, 62439, 131}},
+{7830, 17, 17923, {1, 3, 5, 13, 9, 27, 119, 233, 323, 943, 375, 3647, 185, 1639, 431, 27225, 130175}},
+{7831, 17, 17947, {1, 3, 7, 3, 7, 17, 31, 155, 89, 835, 1015, 2019, 3973, 7087, 16899, 29591, 40797}},
+{7832, 17, 17950, {1, 3, 3, 1, 3, 11, 83, 231, 209, 537, 1227, 1519, 1059, 14027, 18591, 34031, 125755}},
+{7833, 17, 17956, {1, 3, 3, 1, 7, 39, 19, 99, 169, 961, 385, 1621, 7373, 7459, 8979, 23643, 17101}},
+{7834, 17, 17959, {1, 1, 3, 11, 11, 23, 61, 37, 359, 981, 209, 2555, 2673, 6501, 12731, 10735, 97321}},
+{7835, 17, 17966, {1, 1, 3, 13, 15, 61, 115, 119, 99, 755, 1933, 345, 3133, 12071, 26657, 7133, 18553}},
+{7836, 17, 17971, {1, 3, 1, 5, 17, 7, 29, 119, 445, 911, 89, 19, 6137, 8037, 19527, 22467, 29253}},
+{7837, 17, 17973, {1, 1, 3, 11, 31, 21, 119, 21, 249, 371, 343, 4037, 7539, 14473, 23829, 46415, 60911}},
+{7838, 17, 17992, {1, 1, 7, 9, 21, 53, 29, 149, 467, 893, 479, 359, 1007, 13955, 9667, 10245, 74761}},
+{7839, 17, 18006, {1, 3, 1, 7, 7, 45, 7, 77, 289, 271, 1329, 261, 5675, 8275, 7443, 57945, 117825}},
+{7840, 17, 18009, {1, 1, 1, 3, 21, 57, 117, 77, 287, 119, 1073, 915, 2521, 455, 7433, 56953, 84433}},
+{7841, 17, 18010, {1, 1, 1, 9, 27, 47, 1, 189, 303, 375, 215, 3117, 4541, 12877, 15523, 32317, 104213}},
+{7842, 17, 18022, {1, 1, 3, 1, 13, 39, 37, 249, 371, 159, 1073, 1351, 4703, 2715, 17463, 3945, 51523}},
+{7843, 17, 18039, {1, 3, 5, 5, 29, 15, 79, 25, 61, 995, 1081, 3377, 345, 13773, 4205, 20589, 83591}},
+{7844, 17, 18046, {1, 1, 3, 1, 9, 1, 41, 39, 389, 509, 561, 3273, 1911, 15271, 22655, 34713, 2045}},
+{7845, 17, 18069, {1, 3, 1, 15, 17, 1, 55, 55, 119, 707, 843, 2657, 3687, 11557, 18331, 4935, 110639}},
+{7846, 17, 18074, {1, 3, 5, 1, 23, 35, 119, 215, 471, 643, 1581, 1965, 2627, 2991, 3361, 6737, 111657}},
+{7847, 17, 18076, {1, 3, 5, 7, 9, 19, 33, 197, 33, 993, 1795, 595, 7113, 14721, 12647, 41035, 13669}},
+{7848, 17, 18085, {1, 1, 7, 15, 31, 39, 51, 157, 373, 473, 665, 3541, 6695, 11741, 5617, 17189, 129851}},
+{7849, 17, 18086, {1, 3, 3, 7, 15, 37, 33, 175, 391, 159, 717, 593, 113, 9331, 10685, 59003, 26975}},
+{7850, 17, 18095, {1, 1, 3, 5, 13, 41, 11, 109, 9, 899, 1503, 901, 6237, 7789, 9963, 14923, 63665}},
+{7851, 17, 18100, {1, 3, 7, 7, 25, 61, 3, 231, 235, 29, 1049, 1997, 5371, 9047, 29595, 49239, 108649}},
+{7852, 17, 18109, {1, 1, 3, 5, 27, 1, 53, 209, 315, 747, 1803, 11, 1815, 6539, 8839, 18385, 88681}},
+{7853, 17, 18121, {1, 1, 5, 13, 25, 55, 117, 197, 13, 689, 751, 1203, 2277, 1763, 23453, 54459, 118023}},
+{7854, 17, 18127, {1, 3, 3, 11, 21, 1, 51, 101, 429, 723, 273, 3021, 1491, 9923, 6629, 63741, 98813}},
+{7855, 17, 18129, {1, 1, 1, 15, 17, 25, 111, 251, 43, 403, 465, 17, 787, 6045, 32185, 22921, 115851}},
+{7856, 17, 18132, {1, 1, 5, 11, 11, 13, 13, 93, 489, 941, 1391, 383, 7735, 1921, 16199, 53099, 25181}},
+{7857, 17, 18141, {1, 3, 3, 7, 15, 1, 3, 159, 507, 867, 1589, 2111, 3839, 8989, 12589, 37657, 97055}},
+{7858, 17, 18146, {1, 3, 3, 13, 25, 23, 7, 95, 489, 1001, 105, 2737, 5013, 14465, 25383, 57551, 77425}},
+{7859, 17, 18151, {1, 3, 5, 3, 3, 7, 81, 15, 255, 297, 1183, 655, 741, 3081, 2141, 34493, 103707}},
+{7860, 17, 18157, {1, 1, 7, 9, 27, 57, 49, 121, 21, 239, 829, 2001, 613, 9569, 4419, 20007, 59109}},
+{7861, 17, 18160, {1, 3, 7, 1, 3, 21, 109, 255, 45, 333, 915, 1245, 5893, 765, 28289, 53927, 15335}},
+{7862, 17, 18183, {1, 3, 3, 7, 5, 35, 33, 79, 111, 509, 347, 3915, 2017, 6461, 11847, 17807, 48601}},
+{7863, 17, 18204, {1, 3, 5, 1, 13, 63, 87, 65, 507, 277, 339, 3637, 6289, 719, 9383, 38887, 55061}},
+{7864, 17, 18218, {1, 1, 5, 15, 17, 5, 59, 107, 355, 1021, 1849, 1807, 7679, 305, 31533, 1221, 98165}},
+{7865, 17, 18226, {1, 1, 1, 13, 19, 7, 37, 63, 267, 399, 1451, 2149, 1003, 13635, 18693, 215, 15887}},
+{7866, 17, 18238, {1, 1, 3, 7, 11, 63, 81, 251, 253, 963, 635, 1697, 6393, 9775, 24189, 9099, 106277}},
+{7867, 17, 18245, {1, 3, 3, 13, 17, 47, 63, 47, 279, 879, 271, 1655, 1897, 10743, 2607, 16695, 32779}},
+{7868, 17, 18249, {1, 3, 5, 15, 3, 1, 121, 181, 303, 973, 19, 3327, 3827, 2197, 31857, 22835, 122611}},
+{7869, 17, 18260, {1, 1, 5, 13, 25, 41, 105, 197, 195, 85, 1515, 2735, 7539, 7557, 24297, 38721, 46895}},
+{7870, 17, 18267, {1, 1, 1, 1, 15, 63, 33, 7, 43, 971, 781, 1461, 4483, 2113, 32459, 37653, 68017}},
+{7871, 17, 18270, {1, 3, 3, 9, 7, 1, 65, 183, 171, 695, 191, 3675, 6749, 6823, 3577, 45031, 81597}},
+{7872, 17, 18273, {1, 3, 3, 3, 9, 61, 13, 159, 295, 329, 943, 3293, 79, 14497, 21461, 4667, 96435}},
+{7873, 17, 18274, {1, 1, 7, 9, 29, 37, 117, 215, 295, 591, 1139, 3093, 7469, 7995, 13581, 48075, 5943}},
+{7874, 17, 18276, {1, 3, 1, 9, 11, 11, 117, 255, 419, 551, 1445, 1987, 1169, 14227, 31095, 36041, 63739}},
+{7875, 17, 18283, {1, 1, 7, 15, 17, 25, 81, 27, 87, 463, 1871, 551, 7449, 12231, 28645, 32663, 43037}},
+{7876, 17, 18307, {1, 3, 5, 11, 3, 49, 109, 123, 397, 113, 1269, 2433, 4463, 1257, 2127, 6677, 96009}},
+{7877, 17, 18314, {1, 1, 1, 11, 27, 19, 83, 123, 297, 867, 941, 3929, 3483, 4641, 32505, 48999, 66169}},
+{7878, 17, 18321, {1, 1, 5, 11, 5, 21, 11, 255, 369, 859, 657, 587, 5245, 12973, 22403, 47935, 121375}},
+{7879, 17, 18334, {1, 3, 1, 13, 17, 43, 83, 51, 339, 967, 499, 1485, 5203, 10053, 31707, 31443, 75033}},
+{7880, 17, 18355, {1, 1, 5, 13, 11, 5, 121, 121, 73, 101, 1751, 3805, 1333, 14043, 26957, 27557, 110899}},
+{7881, 17, 18364, {1, 3, 7, 11, 9, 7, 125, 237, 437, 177, 841, 175, 5509, 9157, 3129, 54119, 109315}},
+{7882, 17, 18372, {1, 3, 7, 15, 1, 59, 87, 121, 43, 475, 1589, 1267, 1501, 1585, 31705, 33959, 27247}},
+{7883, 17, 18390, {1, 1, 5, 3, 27, 63, 117, 205, 169, 701, 1081, 2835, 8049, 11875, 4143, 17663, 90043}},
+{7884, 17, 18399, {1, 3, 1, 9, 23, 27, 31, 141, 411, 145, 1177, 3681, 3403, 6943, 10729, 47219, 102713}},
+{7885, 17, 18415, {1, 1, 7, 11, 5, 49, 33, 27, 121, 865, 471, 1871, 6945, 10051, 4493, 7121, 65551}},
+{7886, 17, 18420, {1, 1, 5, 1, 17, 27, 53, 13, 31, 403, 1319, 1381, 1371, 11693, 18805, 54683, 30137}},
+{7887, 17, 18434, {1, 1, 7, 11, 9, 21, 71, 155, 79, 145, 943, 3891, 641, 3163, 28493, 14729, 83391}},
+{7888, 17, 18443, {1, 3, 3, 13, 3, 53, 21, 189, 245, 803, 1625, 4005, 1163, 16033, 5549, 14301, 115859}},
+{7889, 17, 18446, {1, 3, 1, 5, 17, 59, 61, 31, 293, 677, 1753, 1803, 1671, 14619, 22361, 61453, 78203}},
+{7890, 17, 18460, {1, 3, 3, 1, 5, 51, 99, 231, 175, 97, 1335, 689, 1913, 6157, 22757, 52395, 118347}},
+{7891, 17, 18467, {1, 3, 3, 7, 25, 11, 113, 19, 289, 507, 1143, 3437, 7965, 12551, 27603, 8423, 46713}},
+{7892, 17, 18482, {1, 1, 3, 9, 13, 1, 73, 9, 425, 407, 363, 2915, 4269, 2903, 9251, 17733, 80321}},
+{7893, 17, 18484, {1, 1, 3, 11, 31, 47, 37, 211, 433, 237, 1069, 1891, 6175, 9305, 30385, 2497, 94775}},
+{7894, 17, 18501, {1, 1, 3, 1, 23, 5, 113, 103, 427, 587, 1863, 1863, 679, 2575, 13059, 16163, 42289}},
+{7895, 17, 18506, {1, 1, 5, 3, 7, 17, 45, 33, 209, 609, 1897, 95, 5123, 2239, 5483, 60715, 126497}},
+{7896, 17, 18516, {1, 1, 5, 11, 1, 55, 67, 223, 41, 967, 337, 2511, 7879, 1157, 17635, 64081, 421}},
+{7897, 17, 18519, {1, 3, 3, 9, 27, 33, 87, 97, 231, 895, 1337, 829, 47, 8481, 14059, 57209, 109159}},
+{7898, 17, 18547, {1, 3, 7, 1, 25, 5, 41, 161, 393, 523, 1623, 3761, 1933, 8319, 17309, 46717, 97299}},
+{7899, 17, 18569, {1, 1, 1, 11, 5, 55, 19, 191, 41, 791, 1611, 59, 2633, 13873, 25859, 42879, 54807}},
+{7900, 17, 18575, {1, 3, 1, 11, 11, 33, 5, 13, 199, 411, 895, 759, 2735, 16225, 31469, 24081, 31857}},
+{7901, 17, 18589, {1, 1, 7, 13, 27, 57, 21, 191, 389, 977, 1013, 3493, 6401, 15957, 23181, 52461, 41853}},
+{7902, 17, 18590, {1, 3, 7, 5, 23, 19, 117, 117, 427, 923, 1347, 3099, 247, 8879, 5309, 53277, 100625}},
+{7903, 17, 18605, {1, 1, 5, 13, 11, 23, 69, 37, 119, 329, 1935, 2851, 5127, 6907, 24651, 11135, 118287}},
+{7904, 17, 18611, {1, 1, 3, 15, 23, 1, 69, 107, 253, 771, 1697, 4035, 3219, 15011, 6995, 19255, 39909}},
+{7905, 17, 18625, {1, 3, 1, 1, 5, 21, 35, 173, 407, 603, 27, 3589, 2879, 2755, 17679, 6145, 95989}},
+{7906, 17, 18652, {1, 1, 5, 13, 31, 23, 61, 139, 341, 593, 1673, 4031, 4809, 1107, 22657, 29073, 53401}},
+{7907, 17, 18665, {1, 3, 1, 15, 13, 37, 39, 61, 443, 417, 1125, 1529, 1943, 7317, 2985, 50285, 107069}},
+{7908, 17, 18673, {1, 1, 3, 9, 5, 51, 87, 91, 31, 491, 1455, 1685, 2579, 6023, 10989, 64635, 130147}},
+{7909, 17, 18674, {1, 3, 5, 5, 31, 23, 15, 163, 357, 161, 1597, 1571, 5039, 13213, 32221, 4405, 88079}},
+{7910, 17, 18683, {1, 1, 1, 15, 13, 43, 7, 109, 243, 389, 683, 2671, 8003, 4187, 6507, 11171, 116727}},
+{7911, 17, 18688, {1, 3, 7, 1, 17, 31, 53, 5, 227, 755, 1755, 2939, 1789, 8951, 16777, 30203, 79005}},
+{7912, 17, 18691, {1, 3, 3, 9, 27, 5, 111, 241, 89, 333, 371, 1035, 5719, 2433, 29343, 50829, 25131}},
+{7913, 17, 18698, {1, 1, 3, 13, 7, 37, 125, 69, 79, 397, 1595, 123, 255, 2257, 10881, 27085, 99411}},
+{7914, 17, 18717, {1, 1, 3, 15, 1, 35, 61, 73, 507, 775, 1631, 2005, 4277, 8421, 5669, 39221, 19053}},
+{7915, 17, 18733, {1, 1, 3, 7, 15, 17, 65, 157, 19, 997, 861, 1249, 4059, 7975, 955, 5833, 97733}},
+{7916, 17, 18754, {1, 1, 5, 5, 21, 43, 1, 181, 1, 17, 1337, 3333, 3761, 12283, 20941, 231, 30457}},
+{7917, 17, 18759, {1, 3, 3, 7, 7, 23, 105, 101, 101, 757, 1407, 565, 2187, 1529, 29385, 22847, 57675}},
+{7918, 17, 18760, {1, 3, 3, 1, 11, 3, 65, 93, 201, 773, 1037, 1325, 673, 6625, 2909, 63435, 114311}},
+{7919, 17, 18771, {1, 3, 5, 1, 21, 43, 87, 37, 491, 323, 1093, 2493, 4755, 7225, 12037, 9483, 70351}},
+{7920, 17, 18777, {1, 1, 7, 9, 23, 39, 59, 117, 103, 645, 1975, 1177, 55, 325, 23781, 64365, 94915}},
+{7921, 17, 18796, {1, 3, 7, 15, 21, 29, 109, 35, 307, 847, 777, 3457, 7899, 17, 24065, 10517, 35651}},
+{7922, 17, 18799, {1, 1, 7, 9, 25, 35, 49, 131, 377, 429, 1773, 2107, 6305, 15209, 9567, 17685, 5599}},
+{7923, 17, 18807, {1, 1, 3, 11, 13, 27, 47, 125, 483, 229, 921, 2733, 2217, 2615, 24135, 28759, 109411}},
+{7924, 17, 18813, {1, 3, 1, 7, 19, 45, 23, 195, 445, 955, 853, 2877, 6889, 9507, 2009, 18747, 50545}},
+{7925, 17, 18817, {1, 1, 1, 5, 15, 35, 75, 177, 145, 683, 309, 893, 4999, 827, 26563, 30819, 111115}},
+{7926, 17, 18820, {1, 3, 3, 11, 5, 45, 49, 39, 93, 653, 1053, 2553, 863, 12185, 30261, 16459, 121061}},
+{7927, 17, 18827, {1, 3, 7, 5, 11, 29, 57, 43, 409, 71, 67, 3537, 263, 13237, 8825, 58411, 44629}},
+{7928, 17, 18829, {1, 1, 5, 13, 1, 37, 23, 171, 13, 309, 239, 2023, 6233, 8751, 11371, 5825, 77355}},
+{7929, 17, 18838, {1, 3, 1, 13, 5, 1, 47, 217, 369, 609, 453, 879, 4337, 4441, 8785, 51963, 53819}},
+{7930, 17, 18842, {1, 3, 5, 5, 23, 1, 67, 147, 27, 121, 1369, 569, 1519, 11585, 18193, 30889, 78055}},
+{7931, 17, 18848, {1, 1, 1, 13, 11, 53, 33, 37, 419, 111, 1649, 2495, 6105, 12385, 30865, 3683, 63813}},
+{7932, 17, 18853, {1, 3, 3, 5, 17, 35, 107, 235, 471, 735, 1093, 1007, 567, 173, 9623, 39533, 56455}},
+{7933, 17, 18885, {1, 1, 7, 15, 27, 13, 123, 211, 407, 857, 801, 3951, 8153, 4427, 15333, 13217, 92675}},
+{7934, 17, 18890, {1, 1, 1, 7, 11, 61, 99, 131, 121, 119, 1483, 1485, 3521, 13163, 24899, 56849, 111943}},
+{7935, 17, 18898, {1, 3, 3, 1, 19, 1, 29, 139, 127, 557, 1913, 1487, 1381, 185, 11195, 52499, 45059}},
+{7936, 17, 18903, {1, 3, 7, 11, 5, 29, 95, 111, 235, 55, 1101, 2631, 1219, 9867, 22209, 3095, 56793}},
+{7937, 17, 18910, {1, 3, 7, 1, 31, 61, 37, 125, 241, 985, 1079, 1439, 433, 2779, 8463, 59985, 39667}},
+{7938, 17, 18913, {1, 3, 7, 15, 5, 7, 71, 7, 435, 727, 1611, 135, 1421, 8329, 29995, 64243, 58285}},
+{7939, 17, 18931, {1, 3, 3, 15, 27, 11, 121, 27, 281, 499, 267, 2651, 7575, 9499, 5051, 49475, 79573}},
+{7940, 17, 18934, {1, 3, 3, 15, 29, 47, 11, 183, 235, 537, 79, 2467, 3751, 831, 6725, 52173, 108645}},
+{7941, 17, 18956, {1, 3, 5, 13, 23, 31, 23, 19, 477, 511, 727, 183, 5955, 7613, 31979, 8441, 39835}},
+{7942, 17, 18961, {1, 1, 5, 7, 17, 31, 53, 133, 387, 787, 1573, 89, 1975, 1825, 19963, 27203, 124923}},
+{7943, 17, 18968, {1, 1, 1, 9, 3, 15, 125, 135, 89, 37, 517, 3931, 2013, 2143, 25413, 18421, 6097}},
+{7944, 17, 18978, {1, 1, 3, 11, 23, 29, 89, 45, 53, 135, 223, 3523, 7921, 3271, 1819, 40931, 65471}},
+{7945, 17, 18983, {1, 1, 1, 13, 17, 3, 121, 25, 509, 61, 1009, 2009, 7813, 8499, 5807, 63171, 75991}},
+{7946, 17, 18987, {1, 3, 5, 13, 15, 35, 37, 45, 161, 683, 1665, 59, 6297, 9595, 10193, 46745, 105411}},
+{7947, 17, 18992, {1, 3, 1, 7, 21, 19, 85, 107, 3, 845, 673, 1271, 7581, 15971, 27085, 35375, 29027}},
+{7948, 17, 18997, {1, 3, 3, 9, 5, 17, 79, 137, 123, 809, 583, 3507, 7559, 2857, 13911, 57083, 8595}},
+{7949, 17, 19002, {1, 1, 7, 5, 31, 29, 77, 33, 439, 787, 1223, 2471, 5851, 15891, 27925, 51661, 82645}},
+{7950, 17, 19004, {1, 1, 7, 15, 19, 35, 35, 37, 197, 245, 799, 3971, 277, 11289, 20111, 13857, 104571}},
+{7951, 17, 19010, {1, 3, 5, 15, 19, 3, 65, 17, 201, 1007, 1665, 107, 2409, 1469, 23265, 24547, 8189}},
+{7952, 17, 19012, {1, 3, 1, 13, 29, 45, 109, 243, 43, 383, 631, 265, 6671, 15333, 21931, 30675, 103077}},
+{7953, 17, 19030, {1, 1, 5, 1, 25, 25, 77, 189, 109, 777, 1485, 2265, 1403, 2627, 13843, 27263, 14263}},
+{7954, 17, 19043, {1, 3, 5, 1, 13, 49, 73, 107, 225, 243, 1253, 3503, 735, 2605, 27165, 45467, 93001}},
+{7955, 17, 19049, {1, 1, 5, 9, 15, 17, 1, 33, 69, 321, 1375, 3635, 8131, 6579, 1225, 38699, 17447}},
+{7956, 17, 19079, {1, 3, 5, 3, 25, 49, 15, 149, 483, 37, 1929, 1219, 5841, 11975, 805, 31339, 130971}},
+{7957, 17, 19086, {1, 3, 3, 3, 15, 29, 3, 143, 291, 593, 1769, 3603, 1693, 151, 27701, 9015, 25847}},
+{7958, 17, 19100, {1, 3, 1, 11, 5, 35, 55, 127, 137, 71, 967, 2501, 1023, 2061, 31387, 44011, 130121}},
+{7959, 17, 19103, {1, 1, 7, 1, 29, 13, 93, 41, 125, 263, 521, 2633, 4361, 12153, 30647, 55883, 65185}},
+{7960, 17, 19107, {1, 3, 7, 9, 23, 19, 61, 197, 139, 463, 1867, 3627, 5185, 8251, 26977, 48027, 66301}},
+{7961, 17, 19109, {1, 3, 3, 7, 27, 53, 25, 137, 175, 155, 1843, 2253, 4797, 4989, 32613, 55779, 91625}},
+{7962, 17, 19113, {1, 3, 3, 11, 1, 5, 21, 233, 295, 675, 47, 2995, 8075, 8201, 3845, 23925, 82559}},
+{7963, 17, 19116, {1, 1, 3, 7, 31, 53, 93, 21, 307, 709, 9, 3061, 3935, 11009, 13411, 3657, 30251}},
+{7964, 17, 19127, {1, 3, 7, 13, 13, 25, 51, 205, 391, 897, 275, 333, 6831, 9383, 16101, 14301, 99101}},
+{7965, 17, 19134, {1, 1, 5, 15, 17, 47, 119, 7, 189, 765, 753, 2909, 3373, 2379, 20331, 61535, 51345}},
+{7966, 17, 19141, {1, 1, 3, 1, 27, 43, 9, 185, 9, 197, 1179, 67, 7689, 9679, 29683, 29905, 29393}},
+{7967, 17, 19179, {1, 1, 5, 5, 31, 55, 69, 9, 477, 91, 1705, 1877, 5463, 15401, 13449, 27541, 125521}},
+{7968, 17, 19193, {1, 1, 7, 15, 15, 33, 11, 233, 69, 771, 845, 2715, 5293, 10351, 19557, 15319, 36857}},
+{7969, 17, 19194, {1, 3, 7, 7, 15, 9, 123, 47, 165, 739, 361, 1675, 2743, 8021, 10241, 48275, 51935}},
+{7970, 17, 19201, {1, 1, 5, 1, 9, 25, 99, 83, 487, 627, 343, 3233, 6697, 13197, 19771, 38337, 89139}},
+{7971, 17, 19208, {1, 3, 7, 13, 1, 31, 15, 63, 463, 621, 935, 1093, 6043, 14051, 13665, 43413, 104893}},
+{7972, 17, 19214, {1, 1, 1, 3, 27, 1, 47, 151, 127, 357, 689, 3263, 141, 4459, 9847, 205, 88493}},
+{7973, 17, 19225, {1, 3, 7, 15, 29, 13, 41, 113, 495, 421, 195, 197, 6857, 10555, 22861, 30229, 31707}},
+{7974, 17, 19226, {1, 3, 5, 11, 11, 1, 89, 227, 425, 623, 1605, 1901, 7933, 7211, 16301, 3403, 59651}},
+{7975, 17, 19235, {1, 1, 3, 3, 27, 41, 37, 89, 395, 903, 1641, 2739, 5599, 11371, 8683, 61125, 105231}},
+{7976, 17, 19242, {1, 3, 7, 9, 1, 17, 51, 233, 507, 783, 459, 1187, 7281, 15809, 27637, 6067, 125877}},
+{7977, 17, 19264, {1, 3, 1, 3, 13, 57, 5, 199, 261, 357, 1255, 1849, 8013, 10313, 9375, 1271, 64117}},
+{7978, 17, 19267, {1, 3, 1, 11, 9, 59, 55, 95, 401, 423, 1657, 513, 3565, 12957, 19243, 53027, 11323}},
+{7979, 17, 19293, {1, 3, 7, 13, 27, 35, 121, 215, 397, 991, 191, 3443, 3829, 6107, 5381, 48497, 107997}},
+{7980, 17, 19309, {1, 1, 5, 5, 19, 15, 21, 53, 165, 835, 1599, 3245, 5609, 5991, 18141, 28075, 102809}},
+{7981, 17, 19318, {1, 3, 5, 9, 25, 21, 71, 15, 453, 475, 915, 3097, 5869, 699, 13883, 34919, 127211}},
+{7982, 17, 19324, {1, 1, 3, 7, 21, 53, 27, 207, 373, 703, 593, 17, 6991, 15013, 10125, 34801, 129245}},
+{7983, 17, 19337, {1, 3, 3, 13, 17, 9, 89, 95, 291, 681, 1415, 2323, 2885, 11381, 7703, 3691, 51505}},
+{7984, 17, 19340, {1, 1, 1, 11, 15, 63, 55, 153, 373, 665, 983, 3987, 5997, 6873, 27031, 65449, 22021}},
+{7985, 17, 19345, {1, 1, 5, 5, 1, 55, 119, 61, 159, 889, 225, 709, 1879, 2521, 69, 7815, 18733}},
+{7986, 17, 19346, {1, 3, 5, 11, 23, 53, 23, 61, 71, 993, 633, 1829, 3465, 12465, 30205, 40723, 74499}},
+{7987, 17, 19352, {1, 3, 3, 1, 17, 37, 19, 43, 55, 133, 1171, 3101, 3963, 5177, 24791, 7255, 10263}},
+{7988, 17, 19364, {1, 3, 7, 1, 21, 13, 21, 87, 237, 629, 1167, 3699, 597, 6251, 11545, 34429, 104393}},
+{7989, 17, 19382, {1, 1, 7, 1, 11, 53, 105, 111, 463, 869, 549, 2423, 17, 917, 879, 49367, 72235}},
+{7990, 17, 19391, {1, 1, 5, 15, 17, 51, 69, 55, 309, 867, 257, 573, 4821, 5245, 28033, 61801, 18253}},
+{7991, 17, 19405, {1, 1, 5, 3, 1, 23, 103, 241, 13, 267, 21, 1751, 6637, 12537, 26741, 40651, 94493}},
+{7992, 17, 19411, {1, 3, 3, 13, 25, 35, 21, 83, 337, 363, 1111, 1865, 7889, 985, 465, 40287, 64469}},
+{7993, 17, 19439, {1, 1, 7, 5, 27, 1, 99, 95, 209, 211, 1445, 1577, 6097, 13813, 22463, 64395, 106383}},
+{7994, 17, 19442, {1, 3, 1, 15, 1, 45, 77, 247, 273, 1023, 1377, 1989, 5787, 15267, 24363, 42717, 125617}},
+{7995, 17, 19444, {1, 1, 1, 3, 9, 49, 79, 171, 427, 439, 1725, 3179, 6263, 12437, 31353, 22077, 94455}},
+{7996, 17, 19451, {1, 3, 5, 11, 11, 45, 57, 97, 409, 935, 967, 2509, 3431, 5707, 19473, 15853, 129059}},
+{7997, 17, 19465, {1, 1, 7, 5, 7, 21, 105, 29, 359, 145, 1691, 131, 6721, 10971, 16173, 38193, 37091}},
+{7998, 17, 19471, {1, 1, 1, 15, 15, 35, 5, 185, 455, 507, 681, 3355, 2091, 3437, 27231, 28527, 5383}},
+{7999, 17, 19474, {1, 3, 5, 3, 7, 29, 33, 127, 57, 495, 1069, 3635, 7461, 9861, 18757, 39039, 92421}},
+{8000, 17, 19476, {1, 3, 5, 5, 11, 31, 51, 59, 413, 417, 1577, 2837, 5229, 4501, 18645, 37613, 31325}},
+{8001, 17, 19479, {1, 1, 5, 13, 15, 61, 17, 247, 413, 817, 907, 2249, 3901, 11275, 7469, 33403, 30629}},
+{8002, 17, 19485, {1, 3, 5, 7, 31, 7, 109, 177, 277, 75, 449, 3029, 7135, 427, 26641, 43157, 47671}},
+{8003, 17, 19489, {1, 3, 7, 13, 29, 63, 21, 187, 471, 289, 835, 3885, 6111, 8721, 9841, 24017, 18673}},
+{8004, 17, 19496, {1, 1, 5, 13, 25, 37, 15, 35, 227, 623, 47, 189, 3443, 1911, 8579, 50911, 10895}},
+{8005, 17, 19507, {1, 3, 1, 1, 29, 53, 89, 101, 251, 203, 821, 2485, 633, 7943, 27563, 58735, 72057}},
+{8006, 17, 19513, {1, 3, 7, 9, 23, 61, 121, 199, 19, 165, 131, 1373, 637, 7307, 7109, 42475, 126669}},
+{8007, 17, 19514, {1, 3, 7, 13, 7, 5, 125, 173, 365, 65, 565, 751, 3343, 13421, 6177, 39095, 97375}},
+{8008, 17, 19521, {1, 1, 7, 3, 1, 59, 65, 39, 307, 793, 887, 3291, 3405, 4497, 19351, 1821, 67861}},
+{8009, 17, 19524, {1, 1, 1, 3, 19, 9, 101, 183, 163, 819, 769, 49, 5293, 3715, 4055, 32403, 90763}},
+{8010, 17, 19546, {1, 3, 3, 1, 27, 31, 21, 123, 457, 1021, 1791, 2217, 6171, 11445, 15605, 59945, 19663}},
+{8011, 17, 19552, {1, 1, 1, 9, 13, 53, 61, 201, 457, 111, 1217, 377, 5871, 4591, 16379, 42817, 129807}},
+{8012, 17, 19555, {1, 3, 1, 5, 23, 37, 25, 7, 125, 651, 349, 3727, 1487, 5103, 31407, 40215, 16065}},
+{8013, 17, 19557, {1, 1, 3, 11, 19, 29, 1, 193, 13, 287, 331, 985, 5391, 7307, 28075, 9939, 84999}},
+{8014, 17, 19575, {1, 1, 1, 11, 21, 37, 117, 241, 229, 957, 2019, 819, 459, 6185, 21533, 64725, 24709}},
+{8015, 17, 19579, {1, 3, 5, 13, 11, 25, 107, 245, 175, 519, 629, 537, 2227, 15123, 10619, 32611, 118697}},
+{8016, 17, 19591, {1, 3, 1, 11, 5, 53, 119, 253, 489, 181, 1365, 3465, 1323, 949, 3657, 2467, 38545}},
+{8017, 17, 19595, {1, 1, 3, 9, 27, 17, 109, 19, 297, 541, 89, 3021, 761, 5577, 907, 21405, 128029}},
+{8018, 17, 19605, {1, 1, 3, 9, 31, 9, 61, 149, 267, 707, 671, 2733, 1247, 14623, 6395, 42579, 30845}},
+{8019, 17, 19615, {1, 1, 7, 7, 25, 29, 63, 41, 309, 275, 2019, 1373, 1003, 13891, 16571, 16209, 30115}},
+{8020, 17, 19616, {1, 3, 7, 1, 5, 21, 53, 97, 475, 799, 1963, 1181, 4187, 8767, 24779, 10403, 98349}},
+{8021, 17, 19626, {1, 3, 3, 13, 19, 9, 125, 227, 347, 535, 353, 3087, 769, 9049, 20145, 27433, 23105}},
+{8022, 17, 19631, {1, 1, 1, 15, 7, 61, 51, 113, 403, 501, 1767, 2785, 7151, 14517, 17533, 24913, 7121}},
+{8023, 17, 19634, {1, 1, 1, 9, 7, 21, 27, 169, 425, 567, 31, 35, 7859, 929, 6545, 33983, 13227}},
+{8024, 17, 19640, {1, 1, 5, 15, 11, 15, 69, 33, 127, 1005, 1947, 989, 6333, 15587, 18523, 53547, 115613}},
+{8025, 17, 19645, {1, 3, 5, 3, 1, 55, 7, 99, 213, 737, 363, 3167, 3949, 3723, 15777, 23207, 22901}},
+{8026, 17, 19678, {1, 1, 1, 9, 9, 29, 121, 85, 467, 811, 1, 3543, 6259, 4477, 31371, 27633, 22995}},
+{8027, 17, 19681, {1, 3, 5, 3, 11, 21, 95, 19, 55, 71, 803, 3655, 3749, 5113, 13611, 38097, 20943}},
+{8028, 17, 19682, {1, 3, 3, 11, 19, 25, 127, 105, 447, 499, 485, 881, 2649, 10297, 22283, 18305, 128919}},
+{8029, 17, 19706, {1, 3, 7, 1, 11, 45, 21, 87, 481, 645, 815, 793, 5763, 3945, 14379, 19623, 103199}},
+{8030, 17, 19708, {1, 3, 5, 1, 3, 45, 39, 229, 359, 151, 1079, 3955, 2107, 9593, 6701, 2811, 55215}},
+{8031, 17, 19713, {1, 3, 7, 7, 27, 59, 69, 211, 373, 643, 977, 3545, 2647, 10473, 27919, 10719, 24823}},
+{8032, 17, 19714, {1, 1, 3, 11, 7, 27, 117, 21, 59, 679, 969, 3813, 2701, 7363, 17525, 31229, 100665}},
+{8033, 17, 19720, {1, 3, 3, 5, 29, 53, 113, 141, 197, 991, 81, 2701, 6831, 7949, 16569, 44185, 29631}},
+{8034, 17, 19725, {1, 1, 1, 3, 1, 31, 9, 101, 347, 585, 577, 2529, 7461, 11921, 29475, 34505, 74911}},
+{8035, 17, 19743, {1, 1, 1, 15, 25, 19, 95, 37, 93, 755, 1891, 2309, 623, 13503, 5811, 45863, 106501}},
+{8036, 17, 19753, {1, 1, 5, 3, 15, 23, 51, 225, 87, 679, 1225, 4015, 3971, 163, 3185, 12921, 51267}},
+{8037, 17, 19756, {1, 1, 5, 1, 1, 37, 105, 181, 379, 657, 571, 2775, 5905, 8391, 32069, 18713, 125833}},
+{8038, 17, 19759, {1, 1, 7, 11, 11, 19, 109, 125, 371, 321, 629, 2165, 2861, 7883, 15503, 37679, 33057}},
+{8039, 17, 19762, {1, 1, 3, 5, 7, 5, 21, 5, 169, 321, 1145, 2243, 6143, 2537, 4429, 56493, 39391}},
+{8040, 17, 19776, {1, 3, 5, 5, 31, 7, 15, 175, 441, 663, 921, 3113, 2261, 13033, 19135, 28657, 92225}},
+{8041, 17, 19786, {1, 3, 1, 11, 13, 9, 25, 57, 297, 3, 1561, 825, 2803, 11327, 2699, 28631, 57277}},
+{8042, 17, 19799, {1, 1, 3, 9, 15, 25, 81, 197, 345, 341, 1557, 1375, 2509, 11949, 30201, 6807, 95199}},
+{8043, 17, 19800, {1, 3, 5, 3, 15, 23, 91, 147, 277, 59, 495, 1423, 1775, 12065, 8401, 22639, 111199}},
+{8044, 17, 19803, {1, 1, 5, 1, 1, 59, 35, 255, 229, 293, 187, 2663, 3967, 6493, 20103, 36703, 108939}},
+{8045, 17, 19806, {1, 3, 7, 11, 15, 1, 23, 39, 27, 281, 11, 3119, 2791, 1691, 16521, 39715, 32145}},
+{8046, 17, 19815, {1, 3, 5, 5, 9, 53, 43, 49, 107, 1015, 431, 3017, 3317, 9655, 19193, 45621, 56861}},
+{8047, 17, 19816, {1, 3, 1, 15, 27, 63, 127, 31, 21, 245, 1503, 3339, 6375, 5411, 12369, 35973, 9473}},
+{8048, 17, 19857, {1, 1, 3, 13, 31, 61, 19, 99, 25, 593, 539, 1807, 673, 12339, 23567, 22005, 130341}},
+{8049, 17, 19860, {1, 1, 5, 3, 3, 3, 13, 183, 255, 41, 641, 581, 6509, 1891, 19195, 28277, 51725}},
+{8050, 17, 19874, {1, 1, 3, 5, 3, 59, 17, 227, 9, 345, 1303, 1535, 3089, 2653, 20647, 63159, 124677}},
+{8051, 17, 19883, {1, 3, 1, 11, 25, 19, 117, 29, 221, 461, 1285, 1427, 7183, 3051, 10839, 47491, 92613}},
+{8052, 17, 19885, {1, 1, 3, 5, 27, 19, 1, 235, 51, 215, 783, 2325, 1191, 4679, 14365, 35479, 65083}},
+{8053, 17, 19886, {1, 3, 3, 5, 27, 17, 79, 185, 259, 369, 1399, 1029, 2219, 10975, 30487, 15247, 39789}},
+{8054, 17, 19893, {1, 3, 3, 1, 13, 13, 59, 119, 249, 471, 1433, 1165, 5345, 4431, 375, 64999, 85577}},
+{8055, 17, 19932, {1, 1, 1, 3, 1, 19, 13, 243, 35, 675, 321, 3625, 7835, 6403, 651, 48283, 91819}},
+{8056, 17, 19960, {1, 3, 3, 1, 27, 13, 73, 159, 145, 59, 287, 2419, 8115, 7923, 18933, 36109, 123879}},
+{8057, 17, 19972, {1, 3, 1, 7, 21, 1, 83, 245, 477, 623, 391, 129, 6897, 3447, 11109, 17017, 68277}},
+{8058, 17, 19975, {1, 1, 3, 11, 13, 43, 119, 93, 99, 393, 1219, 995, 1881, 7929, 4337, 33579, 103211}},
+{8059, 17, 20005, {1, 1, 7, 7, 31, 5, 39, 25, 119, 819, 409, 2395, 151, 12763, 28265, 28909, 35685}},
+{8060, 17, 20009, {1, 1, 1, 1, 3, 13, 59, 205, 19, 843, 1691, 955, 1859, 1791, 22083, 37843, 63615}},
+{8061, 17, 20010, {1, 1, 1, 3, 11, 63, 41, 243, 103, 875, 1337, 3731, 6317, 12951, 31743, 56935, 55975}},
+{8062, 17, 20012, {1, 1, 3, 13, 19, 11, 51, 97, 469, 279, 1621, 3521, 853, 11849, 3331, 27907, 119081}},
+{8063, 17, 20023, {1, 1, 5, 1, 23, 55, 9, 141, 449, 41, 167, 2441, 6783, 2785, 3547, 35379, 74973}},
+{8064, 17, 20024, {1, 1, 5, 3, 15, 55, 13, 75, 107, 153, 1841, 3991, 3229, 6523, 18541, 21571, 31539}},
+{8065, 17, 20030, {1, 3, 1, 1, 27, 37, 35, 201, 401, 867, 1861, 1783, 6255, 14001, 29543, 25843, 39719}},
+{8066, 17, 20038, {1, 1, 7, 15, 3, 43, 113, 173, 297, 457, 1369, 4053, 5033, 5513, 27387, 14725, 79937}},
+{8067, 17, 20041, {1, 1, 5, 13, 5, 27, 109, 93, 187, 833, 1551, 2899, 1681, 6979, 1289, 3507, 66499}},
+{8068, 17, 20055, {1, 1, 3, 11, 11, 47, 121, 29, 129, 807, 2037, 1527, 6083, 14803, 10669, 46047, 70241}},
+{8069, 17, 20059, {1, 3, 1, 9, 29, 3, 19, 191, 461, 527, 1389, 3359, 81, 6773, 12185, 49207, 19091}},
+{8070, 17, 20061, {1, 3, 7, 7, 5, 47, 33, 27, 445, 1, 149, 343, 4827, 91, 29233, 37775, 89321}},
+{8071, 17, 20080, {1, 3, 5, 1, 13, 55, 107, 99, 259, 591, 983, 3863, 1231, 3457, 29645, 10709, 16543}},
+{8072, 17, 20086, {1, 3, 7, 9, 29, 5, 9, 165, 337, 187, 219, 97, 6511, 193, 23947, 36329, 35317}},
+{8073, 17, 20089, {1, 3, 7, 1, 31, 25, 5, 175, 409, 1021, 1873, 289, 7143, 15341, 31501, 25707, 106453}},
+{8074, 17, 20095, {1, 3, 7, 7, 27, 1, 15, 221, 341, 987, 1739, 1183, 8139, 11081, 29721, 42991, 72805}},
+{8075, 17, 20111, {1, 1, 1, 9, 11, 1, 13, 17, 501, 543, 1485, 987, 1861, 8527, 1621, 30461, 23057}},
+{8076, 17, 20116, {1, 3, 7, 7, 9, 41, 1, 253, 71, 1009, 427, 3347, 6987, 3303, 30535, 33345, 126459}},
+{8077, 17, 20130, {1, 1, 1, 7, 11, 11, 15, 11, 305, 559, 1805, 1111, 377, 1495, 13471, 34831, 123125}},
+{8078, 17, 20136, {1, 1, 5, 7, 9, 37, 27, 45, 61, 705, 263, 3181, 7077, 5227, 28121, 42865, 3809}},
+{8079, 17, 20147, {1, 1, 5, 1, 23, 25, 29, 199, 259, 959, 661, 43, 6157, 1547, 1497, 24077, 129939}},
+{8080, 17, 20153, {1, 3, 5, 3, 13, 49, 33, 19, 367, 891, 1777, 3119, 5673, 8383, 14487, 1763, 63495}},
+{8081, 17, 20156, {1, 1, 1, 13, 9, 57, 35, 181, 7, 225, 449, 3843, 6257, 4983, 31307, 16559, 27633}},
+{8082, 17, 20167, {1, 3, 1, 11, 7, 33, 55, 81, 41, 61, 1711, 3273, 7629, 11283, 9103, 24105, 107547}},
+{8083, 17, 20173, {1, 3, 5, 5, 13, 17, 13, 51, 235, 869, 1543, 1249, 7749, 14773, 21751, 53497, 108709}},
+{8084, 17, 20182, {1, 1, 3, 9, 3, 63, 89, 43, 23, 479, 115, 3917, 7943, 7323, 5659, 64507, 46941}},
+{8085, 17, 20185, {1, 1, 3, 1, 25, 63, 25, 169, 459, 633, 1785, 1059, 5113, 4799, 29281, 24561, 17017}},
+{8086, 17, 20202, {1, 1, 3, 3, 15, 3, 11, 173, 493, 5, 1575, 653, 7391, 7453, 8297, 28653, 6213}},
+{8087, 17, 20209, {1, 1, 7, 5, 29, 5, 1, 57, 75, 479, 787, 3417, 3349, 111, 17787, 41141, 97597}},
+{8088, 17, 20229, {1, 3, 7, 1, 11, 7, 107, 159, 435, 159, 1401, 803, 7065, 5923, 4005, 37271, 113791}},
+{8089, 17, 20233, {1, 1, 5, 1, 23, 55, 7, 59, 351, 801, 1279, 3231, 4561, 2857, 20563, 46115, 79489}},
+{8090, 17, 20236, {1, 3, 3, 15, 19, 13, 113, 33, 149, 175, 1127, 3815, 4357, 12645, 4449, 61355, 83023}},
+{8091, 17, 20241, {1, 1, 7, 15, 3, 17, 41, 57, 243, 319, 1631, 2751, 7853, 5977, 28367, 20023, 56049}},
+{8092, 17, 20242, {1, 3, 1, 7, 27, 59, 7, 13, 497, 241, 1827, 2861, 1331, 1759, 6037, 18967, 42849}},
+{8093, 17, 20248, {1, 3, 1, 1, 31, 43, 41, 183, 241, 219, 335, 2331, 755, 10589, 29431, 29007, 66667}},
+{8094, 17, 20278, {1, 1, 3, 1, 27, 37, 61, 117, 471, 39, 139, 3821, 2945, 7035, 23673, 20167, 56169}},
+{8095, 17, 20282, {1, 3, 1, 1, 9, 29, 123, 61, 171, 1015, 1029, 1695, 1039, 11883, 259, 10879, 97709}},
+{8096, 17, 20299, {1, 3, 3, 5, 29, 39, 65, 193, 285, 635, 999, 717, 5465, 1849, 4293, 19775, 79121}},
+{8097, 17, 20307, {1, 1, 7, 1, 3, 3, 103, 15, 451, 307, 1027, 263, 6585, 11651, 14457, 62695, 38407}},
+{8098, 17, 20313, {1, 3, 7, 11, 13, 13, 29, 83, 267, 561, 2041, 13, 3167, 3475, 14735, 34455, 117533}},
+{8099, 17, 20314, {1, 3, 1, 15, 5, 1, 35, 225, 151, 637, 1347, 833, 7077, 13145, 10285, 46583, 14351}},
+{8100, 17, 20320, {1, 1, 3, 15, 27, 63, 119, 159, 209, 421, 1413, 2727, 1607, 7175, 6133, 29051, 97387}},
+{8101, 17, 20326, {1, 1, 3, 5, 9, 29, 35, 93, 353, 903, 1037, 469, 5473, 7193, 21883, 14709, 89023}},
+{8102, 17, 20332, {1, 1, 1, 11, 9, 17, 51, 155, 145, 443, 1985, 423, 4721, 15721, 9747, 10303, 21909}},
+{8103, 17, 20350, {1, 3, 7, 15, 19, 49, 53, 153, 241, 739, 1585, 3945, 4869, 11, 15845, 17937, 69397}},
+{8104, 17, 20360, {1, 1, 5, 7, 19, 53, 43, 211, 327, 723, 1513, 1569, 919, 1771, 11309, 50787, 7459}},
+{8105, 17, 20371, {1, 1, 1, 9, 7, 29, 49, 89, 409, 685, 201, 1327, 2807, 13101, 2485, 62909, 102595}},
+{8106, 17, 20373, {1, 3, 1, 13, 21, 51, 37, 231, 271, 475, 855, 3703, 4447, 5161, 17937, 14471, 47173}},
+{8107, 17, 20377, {1, 1, 7, 3, 9, 7, 121, 197, 71, 147, 1669, 1745, 6589, 15029, 1529, 12625, 121925}},
+{8108, 17, 20390, {1, 1, 1, 3, 7, 47, 63, 61, 187, 341, 919, 307, 389, 14141, 12941, 17917, 104289}},
+{8109, 17, 20396, {1, 3, 5, 13, 19, 43, 57, 11, 383, 311, 1229, 3527, 3301, 12473, 24377, 16279, 92733}},
+{8110, 17, 20404, {1, 3, 3, 5, 25, 35, 63, 23, 131, 481, 809, 3627, 5685, 13695, 14121, 64751, 66181}},
+{8111, 17, 20413, {1, 3, 1, 5, 11, 43, 89, 55, 103, 219, 1861, 3223, 5111, 5879, 31399, 1395, 87419}},
+{8112, 17, 20434, {1, 3, 1, 11, 21, 27, 123, 205, 47, 923, 7, 1635, 4019, 8431, 28313, 24275, 129617}},
+{8113, 17, 20436, {1, 1, 1, 3, 1, 11, 91, 215, 393, 999, 1071, 3225, 4415, 759, 24499, 16109, 33791}},
+{8114, 17, 20440, {1, 1, 3, 13, 19, 45, 77, 103, 105, 395, 529, 3631, 8179, 4467, 30263, 39379, 70507}},
+{8115, 17, 20443, {1, 3, 3, 9, 17, 45, 101, 219, 433, 971, 471, 1243, 6955, 5941, 20641, 16119, 129383}},
+{8116, 17, 20445, {1, 1, 7, 7, 9, 9, 91, 95, 503, 171, 129, 1509, 7179, 5367, 2219, 50445, 112459}},
+{8117, 17, 20464, {1, 3, 7, 1, 17, 17, 19, 173, 229, 519, 147, 1835, 3797, 8091, 20335, 33177, 90197}},
+{8118, 17, 20476, {1, 3, 3, 5, 23, 29, 107, 205, 43, 969, 799, 1239, 1353, 5221, 15175, 42945, 34043}},
+{8119, 17, 20494, {1, 1, 5, 7, 31, 63, 67, 87, 189, 301, 1719, 3937, 965, 2505, 24781, 25133, 91675}},
+{8120, 17, 20496, {1, 3, 1, 7, 15, 25, 11, 39, 281, 35, 1149, 1445, 6451, 12069, 20959, 29895, 60059}},
+{8121, 17, 20501, {1, 1, 5, 1, 1, 17, 65, 213, 359, 561, 2015, 1629, 3521, 6877, 8099, 62483, 103903}},
+{8122, 17, 20518, {1, 1, 7, 9, 7, 49, 1, 227, 49, 823, 1141, 2419, 2697, 13293, 14143, 6323, 16081}},
+{8123, 17, 20527, {1, 3, 3, 1, 9, 13, 99, 235, 343, 601, 927, 183, 4545, 14529, 5521, 55571, 90675}},
+{8124, 17, 20529, {1, 1, 5, 1, 13, 49, 95, 153, 131, 955, 283, 2951, 3651, 7743, 4285, 42621, 110577}},
+{8125, 17, 20535, {1, 1, 1, 9, 19, 59, 97, 181, 67, 357, 497, 287, 3523, 3729, 28981, 59687, 39463}},
+{8126, 17, 20544, {1, 1, 3, 7, 5, 19, 107, 55, 393, 225, 1953, 669, 8063, 6537, 15983, 59891, 95079}},
+{8127, 17, 20568, {1, 3, 1, 5, 29, 21, 17, 169, 447, 697, 1613, 3483, 3139, 11175, 28865, 12065, 130241}},
+{8128, 17, 20589, {1, 3, 5, 7, 5, 49, 35, 181, 85, 505, 1537, 1345, 773, 3255, 27405, 3959, 126377}},
+{8129, 17, 20592, {1, 1, 7, 15, 9, 9, 17, 99, 409, 319, 807, 1721, 4023, 2171, 32657, 51663, 23253}},
+{8130, 17, 20601, {1, 3, 5, 1, 5, 3, 37, 219, 89, 263, 397, 573, 6147, 9525, 2521, 11153, 94319}},
+{8131, 17, 20617, {1, 1, 5, 5, 11, 39, 55, 205, 209, 239, 1443, 2477, 1941, 8337, 2883, 54593, 129859}},
+{8132, 17, 20625, {1, 1, 1, 7, 11, 13, 127, 65, 127, 413, 1553, 413, 3395, 9451, 7517, 34103, 57029}},
+{8133, 17, 20626, {1, 1, 1, 15, 5, 25, 109, 181, 399, 1023, 277, 3365, 6209, 827, 13933, 27483, 63835}},
+{8134, 17, 20632, {1, 1, 3, 3, 21, 57, 95, 127, 481, 365, 197, 3631, 7443, 4925, 31277, 35061, 35875}},
+{8135, 17, 20638, {1, 1, 7, 13, 3, 31, 59, 127, 441, 967, 1049, 1281, 3553, 375, 9683, 45755, 18889}},
+{8136, 17, 20644, {1, 1, 1, 13, 11, 39, 49, 43, 383, 607, 157, 1887, 3623, 13335, 31949, 49843, 96781}},
+{8137, 17, 20647, {1, 3, 7, 13, 19, 35, 21, 9, 299, 425, 1921, 3481, 6849, 4149, 5227, 56737, 27559}},
+{8138, 17, 20662, {1, 3, 7, 5, 21, 11, 79, 97, 1, 849, 819, 1133, 3393, 5429, 10621, 38787, 120785}},
+{8139, 17, 20671, {1, 1, 1, 13, 21, 29, 3, 239, 399, 619, 759, 2655, 3691, 655, 30979, 15507, 114791}},
+{8140, 17, 20674, {1, 3, 5, 3, 1, 61, 79, 43, 273, 965, 1759, 3901, 2437, 1703, 20205, 46291, 23679}},
+{8141, 17, 20683, {1, 1, 1, 9, 19, 57, 75, 245, 377, 261, 231, 3683, 6745, 7797, 28471, 56269, 109969}},
+{8142, 17, 20704, {1, 3, 1, 11, 9, 55, 53, 87, 33, 431, 1805, 2933, 455, 12479, 16235, 2667, 70105}},
+{8143, 17, 20724, {1, 3, 5, 1, 29, 1, 101, 17, 377, 499, 1365, 209, 4819, 15099, 8769, 37003, 53003}},
+{8144, 17, 20742, {1, 3, 5, 11, 11, 39, 109, 235, 337, 393, 35, 1071, 7085, 7165, 25143, 24223, 71493}},
+{8145, 17, 20748, {1, 3, 1, 5, 13, 49, 9, 205, 305, 943, 799, 2405, 319, 10755, 9785, 32023, 48015}},
+{8146, 17, 20765, {1, 3, 1, 9, 29, 35, 123, 101, 73, 747, 1257, 407, 5871, 4271, 14837, 52727, 13339}},
+{8147, 17, 20776, {1, 3, 3, 9, 31, 7, 113, 27, 89, 123, 1117, 531, 5531, 7897, 11209, 35267, 123457}},
+{8148, 17, 20789, {1, 1, 1, 1, 29, 19, 93, 11, 61, 743, 267, 13, 6561, 7667, 20537, 12675, 10481}},
+{8149, 17, 20796, {1, 1, 5, 13, 27, 47, 103, 171, 349, 139, 1709, 961, 783, 7147, 5569, 53395, 80797}},
+{8150, 17, 20802, {1, 3, 1, 9, 21, 49, 41, 175, 507, 861, 1157, 1033, 6795, 5795, 603, 12485, 75263}},
+{8151, 17, 20807, {1, 1, 5, 7, 23, 3, 21, 165, 123, 951, 785, 2065, 8001, 7009, 22981, 10011, 9807}},
+{8152, 17, 20814, {1, 3, 7, 15, 1, 53, 49, 197, 231, 351, 141, 3465, 7907, 10695, 30913, 26753, 71079}},
+{8153, 17, 20821, {1, 3, 5, 3, 29, 45, 23, 131, 65, 507, 75, 275, 7287, 187, 1093, 52657, 31533}},
+{8154, 17, 20832, {1, 3, 5, 9, 9, 7, 113, 125, 441, 75, 663, 4081, 3147, 1469, 28375, 35747, 122965}},
+{8155, 17, 20835, {1, 1, 7, 3, 3, 57, 5, 17, 183, 237, 965, 3709, 4161, 9513, 217, 58835, 78789}},
+{8156, 17, 20847, {1, 1, 3, 1, 7, 25, 13, 29, 173, 319, 1723, 57, 2401, 10405, 15541, 52915, 93747}},
+{8157, 17, 20859, {1, 1, 7, 5, 1, 31, 11, 61, 341, 97, 1199, 2585, 5909, 3707, 31507, 51233, 2389}},
+{8158, 17, 20871, {1, 1, 5, 15, 15, 21, 127, 155, 229, 203, 1303, 3215, 1965, 9481, 31909, 52307, 112207}},
+{8159, 17, 20883, {1, 3, 1, 13, 9, 45, 91, 39, 113, 587, 895, 637, 2475, 1695, 9347, 53255, 75797}},
+{8160, 17, 20886, {1, 3, 5, 13, 17, 11, 35, 83, 69, 255, 741, 3927, 153, 11001, 29145, 37107, 51873}},
+{8161, 17, 20892, {1, 1, 7, 5, 5, 37, 35, 219, 153, 1005, 973, 2555, 893, 5931, 23857, 34631, 74561}},
+{8162, 17, 20906, {1, 3, 1, 11, 21, 63, 113, 29, 115, 307, 957, 407, 879, 4819, 2865, 1773, 116825}},
+{8163, 17, 20908, {1, 3, 7, 3, 19, 55, 87, 21, 139, 571, 311, 2295, 2729, 6371, 11845, 30223, 19247}},
+{8164, 17, 20957, {1, 3, 7, 5, 23, 9, 59, 25, 357, 863, 435, 2509, 5599, 14039, 25731, 41645, 255}},
+{8165, 17, 20962, {1, 3, 7, 13, 9, 3, 63, 115, 503, 489, 1585, 813, 5419, 691, 23973, 18677, 59979}},
+{8166, 17, 20968, {1, 1, 1, 1, 13, 3, 55, 23, 185, 731, 459, 1497, 433, 16243, 29995, 20777, 59513}},
+{8167, 17, 20979, {1, 1, 7, 3, 27, 55, 77, 57, 349, 5, 617, 385, 6225, 7025, 23335, 877, 21973}},
+{8168, 17, 20991, {1, 3, 3, 5, 3, 37, 105, 197, 153, 639, 1643, 1093, 801, 4605, 4551, 46081, 7739}},
+{8169, 17, 20998, {1, 1, 5, 11, 29, 23, 5, 91, 39, 489, 2029, 887, 4451, 11463, 5641, 56299, 34027}},
+{8170, 17, 21007, {1, 1, 7, 3, 17, 11, 25, 161, 317, 701, 155, 1989, 7549, 11529, 9945, 18395, 61251}},
+{8171, 17, 21010, {1, 1, 7, 13, 23, 55, 113, 91, 17, 149, 1893, 2793, 8185, 81, 29487, 47925, 51837}},
+{8172, 17, 21026, {1, 3, 7, 7, 9, 29, 103, 161, 215, 129, 113, 1987, 919, 9639, 20715, 6541, 15041}},
+{8173, 17, 21037, {1, 1, 5, 9, 19, 19, 127, 43, 263, 997, 1687, 3801, 4249, 6309, 25889, 1787, 122771}},
+{8174, 17, 21038, {1, 3, 5, 13, 17, 3, 91, 183, 349, 467, 333, 3299, 3085, 12135, 16801, 31471, 37227}},
+{8175, 17, 21045, {1, 1, 5, 3, 7, 53, 11, 221, 407, 545, 237, 3631, 1791, 3729, 19737, 921, 57303}},
+{8176, 17, 21057, {1, 3, 7, 15, 3, 27, 71, 45, 219, 9, 1135, 2267, 6841, 8637, 30317, 9397, 115425}},
+{8177, 17, 21082, {1, 1, 3, 5, 29, 59, 121, 225, 419, 813, 1725, 3969, 3451, 8457, 31803, 57659, 33263}},
+{8178, 17, 21093, {1, 3, 3, 3, 17, 3, 65, 249, 423, 293, 1333, 3947, 1477, 4005, 30445, 28171, 95823}},
+{8179, 17, 21094, {1, 3, 3, 11, 29, 45, 67, 89, 75, 95, 555, 1823, 2795, 11929, 1995, 30013, 116241}},
+{8180, 17, 21105, {1, 3, 3, 3, 23, 35, 87, 221, 385, 275, 803, 387, 7765, 15637, 27953, 20913, 25279}},
+{8181, 17, 21117, {1, 3, 7, 15, 15, 43, 21, 179, 393, 95, 1913, 1715, 4467, 15093, 13613, 50775, 37133}},
+{8182, 17, 21121, {1, 1, 7, 7, 31, 27, 49, 71, 323, 123, 597, 2395, 4449, 7249, 20197, 19789, 92685}},
+{8183, 17, 21124, {1, 1, 5, 13, 31, 37, 89, 225, 357, 201, 1887, 3915, 2165, 10809, 21623, 34375, 110905}},
+{8184, 17, 21136, {1, 1, 5, 7, 11, 53, 37, 55, 61, 679, 1465, 1587, 2215, 16237, 14985, 50507, 128637}},
+{8185, 17, 21139, {1, 1, 7, 1, 15, 53, 115, 21, 279, 555, 43, 2429, 7251, 2141, 4813, 47047, 119551}},
+{8186, 17, 21142, {1, 1, 5, 13, 11, 41, 59, 245, 337, 117, 1125, 4007, 947, 10591, 17795, 48535, 72171}},
+{8187, 17, 21145, {1, 1, 5, 15, 27, 41, 71, 43, 505, 539, 975, 1567, 795, 4433, 11689, 53051, 98819}},
+{8188, 17, 21167, {1, 1, 7, 9, 1, 57, 57, 137, 323, 311, 759, 3027, 3713, 13, 24133, 21451, 1153}},
+{8189, 17, 21170, {1, 1, 5, 15, 31, 49, 23, 123, 271, 549, 1995, 5, 6065, 3797, 1085, 50137, 19741}},
+{8190, 17, 21175, {1, 3, 3, 13, 5, 15, 21, 117, 487, 43, 1759, 2899, 4239, 9729, 16711, 31559, 34553}},
+{8191, 17, 21179, {1, 1, 5, 13, 5, 23, 83, 49, 147, 267, 923, 1377, 1687, 1793, 30383, 19537, 66989}},
+{8192, 17, 21182, {1, 1, 1, 13, 9, 41, 105, 241, 499, 891, 885, 3349, 4703, 5609, 11999, 58025, 69089}},
+{8193, 17, 21193, {1, 1, 7, 9, 21, 11, 121, 69, 115, 895, 91, 3745, 41, 12787, 26181, 31399, 30463}},
+{8194, 17, 21194, {1, 1, 7, 13, 11, 3, 23, 173, 5, 907, 45, 3465, 2807, 3731, 14347, 27973, 8567}},
+{8195, 17, 21207, {1, 3, 7, 5, 27, 47, 43, 25, 499, 57, 649, 705, 6223, 4213, 4549, 23213, 13657}},
+{8196, 17, 21217, {1, 1, 7, 11, 21, 35, 5, 79, 295, 359, 1993, 99, 7917, 14917, 2131, 45527, 31451}},
+{8197, 17, 21224, {1, 1, 5, 15, 1, 39, 85, 93, 65, 991, 389, 585, 4835, 11671, 10913, 41787, 84953}},
+{8198, 17, 21244, {1, 1, 1, 5, 27, 5, 1, 15, 11, 83, 1191, 3945, 4697, 7703, 6929, 6057, 88721}},
+{8199, 17, 21247, {1, 1, 3, 7, 27, 39, 71, 181, 191, 997, 419, 1671, 7771, 15305, 18677, 45033, 64745}},
+{8200, 17, 21252, {1, 3, 7, 3, 15, 41, 33, 239, 93, 307, 153, 2701, 1549, 5011, 6913, 19257, 55829}},
+{8201, 17, 21264, {1, 3, 3, 11, 21, 47, 69, 223, 365, 877, 431, 1629, 4803, 11591, 13973, 56359, 11897}},
+{8202, 17, 21273, {1, 3, 7, 7, 1, 59, 63, 129, 251, 873, 603, 2707, 2847, 8739, 31343, 63291, 5607}},
+{8203, 17, 21289, {1, 3, 5, 5, 19, 13, 79, 235, 151, 571, 953, 2191, 5973, 4751, 11119, 14439, 97755}},
+{8204, 17, 21290, {1, 1, 5, 1, 27, 3, 105, 139, 13, 821, 221, 2025, 7303, 1891, 28193, 45537, 92703}},
+{8205, 17, 21295, {1, 3, 7, 9, 13, 63, 27, 149, 51, 121, 587, 3695, 4115, 3955, 22493, 34903, 51669}},
+{8206, 17, 21297, {1, 1, 5, 7, 19, 5, 89, 87, 269, 585, 421, 3827, 315, 14739, 109, 43009, 94969}},
+{8207, 17, 21309, {1, 1, 5, 15, 9, 53, 125, 83, 159, 917, 1583, 585, 6839, 14957, 20007, 60467, 96309}},
+{8208, 17, 21318, {1, 3, 5, 1, 23, 49, 109, 91, 17, 731, 1083, 3153, 1825, 14293, 25639, 44599, 47541}},
+{8209, 17, 21322, {1, 1, 3, 7, 21, 51, 45, 25, 367, 925, 799, 1673, 6977, 7155, 829, 25899, 104615}},
+{8210, 17, 21324, {1, 3, 3, 13, 13, 49, 95, 239, 195, 353, 1967, 1419, 929, 503, 11717, 9485, 62885}},
+{8211, 17, 21329, {1, 1, 1, 15, 3, 41, 109, 91, 327, 789, 1429, 1159, 2801, 4845, 19663, 47737, 11029}},
+{8212, 17, 21332, {1, 3, 5, 1, 21, 63, 57, 107, 229, 771, 1911, 647, 6989, 12615, 23191, 64941, 97595}},
+{8213, 17, 21336, {1, 1, 1, 15, 5, 13, 15, 109, 459, 447, 1625, 1269, 7629, 7929, 4405, 12143, 40481}},
+{8214, 17, 21342, {1, 3, 3, 1, 23, 3, 95, 229, 363, 379, 1149, 1615, 5125, 3645, 27535, 58791, 38091}},
+{8215, 17, 21351, {1, 1, 1, 1, 9, 45, 119, 85, 151, 171, 1123, 41, 6517, 8067, 17845, 23301, 95383}},
+{8216, 17, 21355, {1, 3, 1, 15, 17, 31, 103, 71, 35, 1019, 1687, 1175, 6119, 14075, 26601, 28873, 36617}},
+{8217, 17, 21363, {1, 3, 3, 9, 13, 39, 7, 17, 207, 219, 637, 3025, 1709, 4031, 563, 14865, 129389}},
+{8218, 17, 21372, {1, 3, 7, 1, 21, 11, 121, 85, 111, 641, 1163, 3173, 5189, 13261, 19471, 39635, 76545}},
+{8219, 17, 21382, {1, 3, 7, 15, 3, 45, 3, 37, 121, 967, 1861, 3257, 3699, 6881, 11905, 8413, 59397}},
+{8220, 17, 21388, {1, 3, 3, 13, 25, 53, 85, 181, 1, 979, 2045, 297, 1739, 8139, 17897, 35251, 7193}},
+{8221, 17, 21394, {1, 1, 1, 3, 5, 49, 77, 115, 377, 209, 1415, 3747, 485, 803, 2507, 27729, 52201}},
+{8222, 17, 21403, {1, 3, 1, 5, 31, 55, 85, 171, 135, 893, 1423, 3693, 6155, 5321, 8297, 39183, 88377}},
+{8223, 17, 21409, {1, 3, 3, 15, 1, 35, 73, 239, 181, 101, 509, 2449, 4955, 13049, 27631, 16871, 40151}},
+{8224, 17, 21416, {1, 1, 7, 13, 27, 7, 109, 71, 437, 835, 563, 1355, 3681, 7431, 32743, 59693, 125055}},
+{8225, 17, 21421, {1, 1, 7, 5, 19, 23, 29, 147, 291, 507, 1943, 2069, 3309, 11569, 1031, 49345, 86735}},
+{8226, 17, 21424, {1, 1, 3, 13, 17, 45, 91, 167, 19, 137, 527, 961, 4435, 2277, 6863, 57917, 129407}},
+{8227, 17, 21444, {1, 3, 5, 7, 11, 31, 79, 207, 43, 871, 1121, 2929, 6899, 4099, 29533, 45333, 33299}},
+{8228, 17, 21453, {1, 1, 7, 5, 5, 49, 13, 95, 475, 91, 337, 3531, 3157, 1331, 32655, 46169, 3549}},
+{8229, 17, 21466, {1, 3, 1, 5, 5, 9, 73, 177, 123, 251, 717, 541, 7083, 6907, 1417, 31203, 9755}},
+{8230, 17, 21471, {1, 3, 1, 11, 21, 11, 91, 155, 447, 165, 1525, 2073, 5103, 193, 2677, 43673, 70579}},
+{8231, 17, 21495, {1, 3, 7, 1, 7, 27, 115, 247, 211, 779, 1999, 209, 3215, 111, 25567, 34641, 130873}},
+{8232, 17, 21499, {1, 1, 5, 9, 25, 7, 15, 19, 217, 831, 1577, 2051, 3533, 2337, 7675, 2845, 69135}},
+{8233, 17, 21504, {1, 3, 5, 15, 29, 11, 91, 59, 221, 383, 1235, 1261, 2967, 14989, 11455, 6459, 58047}},
+{8234, 17, 21507, {1, 3, 5, 1, 3, 35, 5, 127, 99, 981, 493, 3001, 5651, 3125, 27789, 57389, 115631}},
+{8235, 17, 21521, {1, 3, 5, 5, 29, 63, 123, 161, 247, 177, 1653, 2665, 3903, 11129, 20961, 49429, 44075}},
+{8236, 17, 21527, {1, 3, 1, 1, 13, 9, 57, 167, 291, 765, 1929, 397, 5503, 5601, 6957, 62003, 104631}},
+{8237, 17, 21555, {1, 1, 7, 15, 9, 43, 57, 85, 157, 361, 1931, 2183, 8045, 14939, 2169, 25733, 29095}},
+{8238, 17, 21558, {1, 1, 3, 15, 13, 35, 47, 123, 13, 667, 1373, 4069, 6259, 13453, 13439, 25349, 99437}},
+{8239, 17, 21562, {1, 3, 7, 1, 31, 15, 69, 45, 355, 919, 415, 793, 3987, 8785, 4905, 8177, 123989}},
+{8240, 17, 21570, {1, 3, 7, 13, 29, 27, 69, 57, 385, 185, 171, 2499, 3983, 13437, 23585, 21501, 88079}},
+{8241, 17, 21576, {1, 1, 5, 11, 27, 3, 77, 99, 221, 997, 1653, 1963, 2251, 15505, 26347, 51933, 100679}},
+{8242, 17, 21579, {1, 1, 1, 7, 19, 39, 49, 69, 193, 235, 959, 2823, 2573, 8001, 4389, 13217, 60975}},
+{8243, 17, 21581, {1, 1, 7, 5, 1, 3, 3, 189, 199, 293, 1225, 1913, 7271, 2255, 661, 23293, 82069}},
+{8244, 17, 21587, {1, 1, 5, 5, 21, 31, 35, 113, 47, 479, 325, 1663, 7409, 8975, 14151, 56317, 79663}},
+{8245, 17, 21590, {1, 1, 5, 9, 15, 63, 99, 135, 277, 715, 667, 387, 6929, 12873, 12913, 2599, 84939}},
+{8246, 17, 21599, {1, 1, 7, 15, 23, 39, 67, 25, 179, 313, 459, 295, 1103, 1737, 7529, 29463, 104693}},
+{8247, 17, 21605, {1, 1, 3, 13, 23, 11, 111, 67, 105, 191, 1967, 3497, 7621, 487, 18545, 59521, 115315}},
+{8248, 17, 21612, {1, 1, 1, 7, 25, 45, 83, 61, 231, 569, 155, 2817, 6985, 5289, 6731, 3087, 89749}},
+{8249, 17, 21618, {1, 3, 7, 1, 1, 61, 103, 49, 135, 411, 659, 1735, 4461, 8077, 12885, 62791, 114769}},
+{8250, 17, 21630, {1, 1, 7, 13, 3, 53, 21, 81, 433, 563, 857, 891, 195, 11669, 24769, 56539, 47601}},
+{8251, 17, 21639, {1, 3, 1, 13, 3, 41, 59, 101, 67, 803, 1209, 3267, 1255, 5763, 5483, 36339, 38451}},
+{8252, 17, 21640, {1, 3, 5, 3, 25, 51, 53, 213, 329, 11, 483, 81, 2151, 7623, 26309, 15289, 85103}},
+{8253, 17, 21643, {1, 3, 3, 13, 23, 17, 9, 161, 417, 207, 39, 3615, 7567, 15207, 20383, 58885, 121765}},
+{8254, 17, 21648, {1, 3, 1, 7, 15, 59, 9, 195, 187, 583, 341, 2737, 3891, 331, 18055, 60455, 113271}},
+{8255, 17, 21669, {1, 1, 3, 3, 19, 25, 95, 37, 281, 59, 1613, 2733, 5715, 4067, 5509, 5851, 35189}},
+{8256, 17, 21679, {1, 3, 1, 3, 31, 43, 125, 107, 341, 109, 1991, 849, 7795, 13607, 20421, 3339, 78979}},
+{8257, 17, 21681, {1, 3, 7, 13, 15, 57, 87, 151, 479, 99, 479, 447, 7407, 303, 16397, 15699, 122273}},
+{8258, 17, 21687, {1, 1, 3, 1, 27, 61, 79, 195, 5, 839, 1411, 3451, 4627, 13715, 18401, 24325, 44027}},
+{8259, 17, 21688, {1, 1, 7, 15, 21, 39, 57, 207, 213, 367, 547, 1203, 6385, 2555, 31465, 15675, 7133}},
+{8260, 17, 21706, {1, 1, 5, 15, 27, 3, 75, 123, 337, 1019, 1525, 3065, 1919, 10779, 27409, 6291, 86291}},
+{8261, 17, 21713, {1, 1, 7, 11, 15, 27, 67, 145, 125, 521, 647, 2957, 6337, 14973, 24139, 29107, 27151}},
+{8262, 17, 21714, {1, 1, 1, 13, 25, 57, 103, 83, 321, 111, 131, 2051, 5267, 4723, 1939, 40389, 4803}},
+{8263, 17, 21716, {1, 3, 1, 7, 29, 7, 35, 133, 349, 855, 613, 2563, 2261, 2119, 13939, 24727, 26719}},
+{8264, 17, 21730, {1, 3, 3, 1, 11, 61, 25, 177, 427, 1005, 2027, 649, 7871, 7803, 4717, 59207, 57945}},
+{8265, 17, 21732, {1, 1, 7, 1, 15, 45, 75, 133, 193, 745, 485, 197, 6001, 13837, 615, 43629, 127321}},
+{8266, 17, 21749, {1, 3, 3, 13, 5, 7, 101, 183, 211, 283, 1327, 1395, 8175, 13359, 18361, 54243, 3555}},
+{8267, 17, 21756, {1, 1, 7, 13, 7, 43, 19, 41, 319, 701, 795, 1407, 7113, 9149, 31953, 17075, 53975}},
+{8268, 17, 21774, {1, 3, 5, 13, 11, 19, 101, 125, 327, 75, 1471, 3465, 2247, 5107, 11519, 45161, 71373}},
+{8269, 17, 21779, {1, 3, 7, 13, 23, 59, 53, 57, 137, 575, 59, 3829, 963, 11259, 25771, 29223, 79535}},
+{8270, 17, 21781, {1, 3, 3, 11, 17, 31, 111, 147, 499, 441, 1385, 769, 6901, 8349, 1427, 16561, 7485}},
+{8271, 17, 21786, {1, 1, 7, 9, 21, 7, 47, 83, 351, 867, 265, 1329, 7853, 6959, 11821, 44947, 42275}},
+{8272, 17, 21792, {1, 1, 7, 15, 3, 17, 79, 143, 449, 577, 1007, 1101, 3229, 6861, 23921, 37551, 117309}},
+{8273, 17, 21810, {1, 3, 5, 11, 27, 63, 107, 15, 289, 821, 1723, 1945, 1373, 14469, 30985, 55987, 21255}},
+{8274, 17, 21819, {1, 3, 5, 3, 21, 39, 79, 85, 485, 733, 2031, 1573, 6873, 12225, 30471, 54233, 26967}},
+{8275, 17, 21829, {1, 3, 5, 7, 17, 29, 93, 251, 437, 583, 825, 551, 6545, 10905, 27863, 37037, 52129}},
+{8276, 17, 21830, {1, 3, 7, 9, 23, 1, 23, 85, 195, 319, 1759, 3985, 2413, 16205, 22197, 48821, 94907}},
+{8277, 17, 21844, {1, 1, 3, 7, 17, 47, 3, 195, 167, 925, 11, 3431, 1767, 5917, 13915, 54565, 64625}},
+{8278, 17, 21853, {1, 3, 1, 13, 23, 43, 97, 93, 313, 773, 591, 127, 6005, 11497, 32573, 8173, 92053}},
+{8279, 17, 21867, {1, 1, 5, 9, 17, 47, 115, 237, 389, 619, 377, 561, 1333, 6433, 9743, 32673, 98039}},
+{8280, 17, 21869, {1, 3, 7, 15, 23, 17, 99, 225, 145, 191, 2041, 581, 841, 9377, 18123, 32773, 66849}},
+{8281, 17, 21882, {1, 3, 7, 15, 21, 49, 97, 41, 357, 527, 2019, 2083, 2611, 12449, 20037, 52503, 105991}},
+{8282, 17, 21891, {1, 1, 5, 13, 17, 53, 41, 75, 355, 207, 1675, 591, 5797, 9217, 16443, 3205, 81905}},
+{8283, 17, 21898, {1, 3, 7, 11, 1, 61, 29, 207, 449, 103, 1527, 2327, 7895, 10137, 25223, 51607, 60809}},
+{8284, 17, 21917, {1, 3, 3, 5, 15, 57, 87, 233, 301, 989, 485, 2143, 7411, 5475, 23377, 56005, 59721}},
+{8285, 17, 21934, {1, 3, 1, 15, 29, 7, 95, 141, 369, 231, 735, 1103, 1565, 11575, 571, 3257, 62961}},
+{8286, 17, 21946, {1, 1, 5, 15, 27, 19, 25, 35, 303, 555, 95, 1323, 6139, 5079, 21763, 59591, 103537}},
+{8287, 17, 21948, {1, 1, 1, 13, 25, 23, 85, 151, 135, 349, 1753, 1061, 7697, 1723, 5213, 12581, 103995}},
+{8288, 17, 21963, {1, 3, 1, 9, 29, 51, 101, 195, 59, 809, 1527, 2179, 63, 3681, 29823, 57537, 121371}},
+{8289, 17, 21966, {1, 1, 7, 11, 27, 61, 85, 213, 245, 261, 1649, 2423, 6127, 5687, 4247, 56061, 109793}},
+{8290, 17, 21968, {1, 3, 5, 15, 11, 33, 127, 31, 269, 857, 2027, 2611, 1729, 11783, 16459, 31083, 30671}},
+{8291, 17, 21973, {1, 1, 7, 9, 11, 29, 127, 177, 505, 227, 1499, 1309, 6855, 9999, 21815, 32987, 79109}},
+{8292, 17, 21977, {1, 3, 7, 11, 7, 21, 107, 1, 493, 459, 867, 3199, 7985, 12957, 28197, 41133, 105985}},
+{8293, 17, 21980, {1, 1, 3, 15, 1, 57, 113, 97, 213, 547, 1017, 2961, 461, 16125, 10621, 4243, 58277}},
+{8294, 17, 21984, {1, 1, 3, 5, 11, 57, 61, 47, 209, 961, 333, 795, 4491, 15115, 25745, 62633, 66269}},
+{8295, 17, 21994, {1, 1, 7, 3, 19, 13, 49, 167, 455, 863, 581, 1407, 4247, 15023, 2247, 19981, 125891}},
+{8296, 17, 21999, {1, 1, 7, 15, 17, 55, 27, 35, 33, 349, 879, 1781, 1075, 2475, 30689, 42043, 29423}},
+{8297, 17, 22018, {1, 1, 1, 11, 25, 53, 121, 117, 117, 845, 447, 3927, 1951, 8643, 24497, 44833, 99533}},
+{8298, 17, 22020, {1, 1, 7, 13, 3, 59, 117, 9, 359, 453, 327, 3419, 5957, 97, 20541, 49441, 5673}},
+{8299, 17, 22029, {1, 3, 5, 5, 31, 35, 95, 107, 435, 733, 827, 1361, 6627, 8905, 2681, 25473, 46093}},
+{8300, 17, 22032, {1, 3, 3, 5, 7, 23, 75, 137, 231, 915, 637, 2963, 4409, 12799, 31587, 65363, 69539}},
+{8301, 17, 22041, {1, 1, 1, 7, 15, 35, 19, 233, 189, 837, 243, 2525, 6185, 565, 8133, 4265, 3089}},
+{8302, 17, 22047, {1, 1, 5, 5, 19, 59, 103, 201, 287, 449, 21, 2331, 341, 13145, 18607, 46407, 2767}},
+{8303, 17, 22048, {1, 3, 3, 15, 19, 41, 49, 179, 109, 367, 1185, 1045, 1635, 9647, 16613, 25357, 34291}},
+{8304, 17, 22071, {1, 3, 5, 1, 13, 11, 89, 25, 159, 637, 1979, 549, 3553, 9163, 227, 50553, 46307}},
+{8305, 17, 22075, {1, 1, 3, 1, 17, 33, 73, 239, 261, 751, 1267, 2643, 2549, 8331, 25083, 9715, 67289}},
+{8306, 17, 22078, {1, 1, 1, 13, 3, 49, 7, 35, 367, 293, 903, 1045, 569, 6017, 27635, 51833, 32963}},
+{8307, 17, 22083, {1, 3, 5, 3, 31, 3, 69, 137, 57, 87, 719, 3977, 3031, 7675, 24605, 8757, 93173}},
+{8308, 17, 22089, {1, 3, 3, 1, 7, 45, 97, 35, 233, 69, 1525, 4047, 2599, 13679, 4389, 49079, 121465}},
+{8309, 17, 22097, {1, 1, 7, 13, 7, 25, 57, 211, 337, 189, 1825, 2451, 7651, 11277, 27763, 40671, 57223}},
+{8310, 17, 22110, {1, 1, 1, 1, 15, 59, 55, 169, 461, 907, 407, 803, 3349, 4727, 20983, 47717, 51647}},
+{8311, 17, 22113, {1, 3, 7, 1, 15, 51, 25, 119, 439, 593, 1289, 3959, 5489, 13283, 31837, 8441, 58373}},
+{8312, 17, 22119, {1, 3, 1, 9, 5, 1, 81, 45, 13, 537, 1091, 3861, 6781, 5679, 2807, 29757, 40917}},
+{8313, 17, 22120, {1, 3, 5, 3, 27, 41, 19, 235, 207, 697, 775, 837, 3431, 3175, 10807, 42775, 67987}},
+{8314, 17, 22126, {1, 3, 7, 3, 29, 33, 35, 119, 271, 609, 1747, 2839, 3415, 2275, 30979, 41293, 99341}},
+{8315, 17, 22133, {1, 3, 3, 3, 5, 17, 13, 169, 269, 709, 1449, 3169, 1545, 16075, 8937, 39705, 19609}},
+{8316, 17, 22134, {1, 3, 5, 15, 29, 13, 1, 199, 65, 385, 977, 797, 1181, 10979, 241, 40393, 73663}},
+{8317, 17, 22140, {1, 1, 3, 7, 17, 35, 47, 63, 193, 451, 151, 3415, 99, 14557, 26025, 31361, 112639}},
+{8318, 17, 22147, {1, 1, 3, 5, 19, 13, 29, 33, 365, 311, 1241, 217, 6205, 13067, 18585, 21693, 97127}},
+{8319, 17, 22161, {1, 1, 3, 15, 19, 7, 87, 25, 91, 13, 1839, 1445, 957, 9779, 25557, 37027, 38987}},
+{8320, 17, 22164, {1, 1, 5, 1, 21, 5, 79, 67, 481, 455, 37, 1321, 7723, 1413, 7919, 11035, 5739}},
+{8321, 17, 22173, {1, 1, 1, 15, 9, 55, 111, 1, 383, 439, 1037, 4055, 4243, 10443, 26737, 21039, 130847}},
+{8322, 17, 22197, {1, 1, 7, 9, 13, 25, 71, 137, 307, 717, 1009, 2477, 3861, 14145, 14549, 59589, 93401}},
+{8323, 17, 22207, {1, 1, 7, 5, 29, 63, 77, 49, 471, 267, 1457, 1743, 1915, 14793, 17899, 28011, 92183}},
+{8324, 17, 22210, {1, 3, 7, 7, 7, 41, 47, 251, 75, 749, 1915, 1015, 5869, 3211, 24097, 14349, 130571}},
+{8325, 17, 22216, {1, 1, 1, 1, 31, 63, 105, 83, 345, 147, 975, 135, 7299, 15801, 19311, 26143, 80293}},
+{8326, 17, 22234, {1, 1, 3, 1, 7, 1, 47, 45, 251, 635, 583, 3515, 5233, 6281, 7797, 37949, 75877}},
+{8327, 17, 22257, {1, 1, 3, 3, 5, 53, 99, 175, 155, 327, 1841, 211, 2811, 16099, 17255, 34253, 124141}},
+{8328, 17, 22264, {1, 3, 1, 3, 13, 27, 81, 217, 115, 245, 101, 1641, 29, 1441, 4829, 28399, 102303}},
+{8329, 17, 22278, {1, 3, 1, 5, 11, 55, 31, 91, 337, 203, 987, 977, 4929, 14933, 25149, 20493, 19783}},
+{8330, 17, 22284, {1, 1, 5, 9, 9, 37, 103, 211, 349, 165, 1421, 3015, 5133, 4615, 28173, 45787, 10711}},
+{8331, 17, 22287, {1, 1, 1, 1, 1, 17, 29, 117, 421, 651, 1617, 1677, 7841, 16303, 8843, 1321, 90701}},
+{8332, 17, 22299, {1, 1, 1, 15, 27, 23, 49, 195, 139, 319, 1277, 901, 63, 14677, 21815, 19497, 24883}},
+{8333, 17, 22301, {1, 3, 3, 13, 1, 23, 17, 189, 293, 765, 1503, 1485, 7427, 11807, 17629, 61739, 111365}},
+{8334, 17, 22308, {1, 1, 5, 5, 15, 41, 25, 53, 221, 449, 1597, 2763, 4119, 6319, 17509, 23493, 104707}},
+{8335, 17, 22337, {1, 3, 7, 11, 29, 21, 101, 197, 161, 457, 331, 3817, 5139, 14307, 23225, 55567, 62535}},
+{8336, 17, 22349, {1, 1, 7, 5, 9, 57, 39, 101, 5, 847, 1311, 313, 2877, 14811, 21969, 31741, 8075}},
+{8337, 17, 22350, {1, 3, 5, 3, 1, 11, 45, 163, 251, 775, 1031, 1957, 1631, 1691, 3191, 6255, 13037}},
+{8338, 17, 22357, {1, 1, 3, 13, 7, 11, 95, 97, 409, 835, 707, 1579, 2409, 9451, 15069, 62425, 106499}},
+{8339, 17, 22364, {1, 3, 3, 11, 5, 25, 23, 207, 429, 299, 537, 1467, 6309, 891, 15009, 56733, 60397}},
+{8340, 17, 22373, {1, 3, 5, 3, 29, 47, 95, 115, 207, 177, 543, 427, 145, 11169, 7441, 10911, 87413}},
+{8341, 17, 22377, {1, 3, 7, 11, 25, 53, 15, 225, 115, 295, 919, 39, 513, 9989, 11045, 24015, 102387}},
+{8342, 17, 22380, {1, 1, 7, 15, 13, 31, 103, 143, 357, 825, 183, 137, 2671, 9803, 14777, 48333, 79483}},
+{8343, 17, 22386, {1, 3, 5, 1, 25, 13, 65, 9, 461, 307, 1289, 1035, 7253, 14223, 16829, 23361, 84987}},
+{8344, 17, 22391, {1, 3, 5, 7, 5, 57, 47, 251, 5, 9, 965, 2883, 3105, 13931, 807, 31977, 119035}},
+{8345, 17, 22392, {1, 1, 3, 5, 3, 7, 55, 165, 3, 787, 1587, 989, 6049, 14021, 30789, 15283, 92851}},
+{8346, 17, 22411, {1, 1, 5, 5, 3, 17, 11, 167, 487, 885, 193, 3485, 8179, 9485, 24913, 40267, 70625}},
+{8347, 17, 22422, {1, 1, 7, 1, 27, 31, 9, 139, 73, 137, 783, 321, 691, 6157, 19905, 45525, 84877}},
+{8348, 17, 22425, {1, 3, 1, 9, 17, 39, 127, 177, 301, 579, 1065, 3899, 281, 9177, 16295, 51217, 120293}},
+{8349, 17, 22431, {1, 1, 7, 9, 31, 59, 17, 93, 247, 779, 847, 1183, 3453, 1073, 18597, 2655, 121633}},
+{8350, 17, 22438, {1, 1, 7, 1, 25, 43, 47, 253, 23, 999, 973, 1201, 1061, 5947, 5619, 36311, 1545}},
+{8351, 17, 22441, {1, 3, 5, 7, 11, 5, 103, 119, 229, 657, 1993, 1991, 1597, 13165, 19137, 7161, 83487}},
+{8352, 17, 22442, {1, 1, 1, 1, 11, 23, 105, 183, 467, 83, 899, 2447, 4949, 4171, 28943, 4829, 13033}},
+{8353, 17, 22449, {1, 3, 1, 7, 15, 7, 47, 215, 253, 109, 1975, 3337, 1553, 13575, 16835, 61525, 26423}},
+{8354, 17, 22452, {1, 1, 7, 1, 21, 17, 53, 79, 175, 267, 999, 249, 6177, 10453, 12475, 59801, 47351}},
+{8355, 17, 22461, {1, 3, 5, 11, 3, 57, 5, 193, 421, 799, 1833, 2635, 6537, 4669, 9597, 40661, 12113}},
+{8356, 17, 22467, {1, 1, 7, 11, 9, 11, 69, 103, 139, 167, 159, 2469, 703, 1519, 21553, 62875, 60449}},
+{8357, 17, 22479, {1, 1, 5, 3, 9, 11, 17, 183, 499, 301, 1275, 605, 7655, 12141, 7783, 39413, 116263}},
+{8358, 17, 22484, {1, 1, 1, 7, 31, 55, 23, 79, 49, 247, 761, 3573, 8187, 4879, 27379, 15725, 81415}},
+{8359, 17, 22487, {1, 3, 5, 5, 5, 49, 23, 205, 509, 383, 1165, 3839, 7663, 1539, 19967, 55901, 4351}},
+{8360, 17, 22493, {1, 1, 1, 11, 7, 15, 3, 159, 235, 735, 391, 2231, 5043, 9759, 4569, 35601, 71989}},
+{8361, 17, 22510, {1, 3, 3, 15, 23, 3, 49, 97, 99, 517, 1097, 3517, 1035, 2319, 27705, 25547, 101555}},
+{8362, 17, 22521, {1, 3, 7, 11, 27, 29, 33, 241, 205, 113, 291, 1993, 3277, 13155, 1039, 42367, 130477}},
+{8363, 17, 22533, {1, 1, 1, 3, 29, 19, 15, 159, 35, 153, 1177, 3011, 6271, 8203, 8971, 19183, 102871}},
+{8364, 17, 22534, {1, 1, 1, 5, 5, 51, 19, 175, 209, 895, 229, 2355, 499, 7877, 4935, 22737, 35587}},
+{8365, 17, 22543, {1, 3, 7, 11, 15, 9, 7, 113, 41, 835, 1593, 3933, 7165, 10959, 15487, 30019, 114505}},
+{8366, 17, 22548, {1, 1, 7, 5, 31, 21, 27, 11, 421, 165, 1605, 1859, 29, 13051, 3273, 3893, 56089}},
+{8367, 17, 22552, {1, 3, 5, 5, 17, 51, 55, 187, 401, 977, 95, 2617, 727, 9609, 5075, 48989, 120299}},
+{8368, 17, 22558, {1, 1, 5, 7, 21, 31, 127, 87, 379, 125, 247, 3607, 2555, 11873, 32535, 16677, 122273}},
+{8369, 17, 22561, {1, 1, 1, 5, 19, 21, 51, 185, 203, 145, 1073, 167, 235, 12753, 17315, 14683, 44101}},
+{8370, 17, 22562, {1, 3, 3, 1, 5, 61, 71, 17, 63, 151, 823, 17, 5315, 4861, 17279, 23049, 84971}},
+{8371, 17, 22568, {1, 3, 3, 5, 21, 63, 21, 235, 295, 467, 1661, 2487, 335, 6107, 28709, 55875, 129085}},
+{8372, 17, 22571, {1, 3, 3, 5, 1, 55, 35, 187, 5, 687, 1633, 2999, 4513, 10105, 15249, 22591, 102857}},
+{8373, 17, 22574, {1, 3, 1, 5, 19, 1, 113, 27, 261, 623, 831, 3011, 4091, 11967, 17191, 17433, 99925}},
+{8374, 17, 22581, {1, 3, 5, 5, 25, 59, 81, 249, 463, 523, 183, 3049, 3675, 2705, 28379, 1279, 25579}},
+{8375, 17, 22594, {1, 1, 3, 9, 19, 19, 71, 127, 189, 613, 647, 1449, 7755, 1415, 9067, 30683, 79703}},
+{8376, 17, 22603, {1, 1, 7, 1, 27, 33, 61, 135, 233, 633, 1969, 2245, 5841, 14069, 6497, 63617, 101483}},
+{8377, 17, 22605, {1, 3, 3, 9, 23, 3, 17, 163, 309, 741, 2023, 2647, 5847, 7871, 22311, 38377, 70663}},
+{8378, 17, 22606, {1, 3, 5, 15, 31, 33, 51, 243, 209, 273, 1305, 1599, 6115, 6249, 8639, 5903, 17215}},
+{8379, 17, 22623, {1, 1, 1, 1, 21, 11, 107, 185, 463, 435, 149, 3789, 6283, 1327, 20893, 10417, 78673}},
+{8380, 17, 22630, {1, 1, 1, 13, 5, 53, 121, 129, 493, 419, 1711, 2765, 7673, 8979, 25845, 62759, 9669}},
+{8381, 17, 22651, {1, 3, 5, 5, 1, 39, 123, 47, 449, 639, 625, 2355, 511, 1685, 1415, 32417, 76529}},
+{8382, 17, 22657, {1, 3, 1, 11, 1, 49, 67, 237, 203, 967, 1401, 2773, 4951, 13889, 14147, 41031, 71897}},
+{8383, 17, 22669, {1, 3, 5, 11, 13, 49, 17, 113, 315, 207, 1057, 3395, 6151, 2767, 16571, 1811, 66403}},
+{8384, 17, 22670, {1, 1, 7, 7, 29, 63, 49, 115, 327, 987, 1853, 3355, 8139, 2703, 30039, 51343, 86999}},
+{8385, 17, 22677, {1, 1, 3, 9, 1, 3, 45, 35, 509, 483, 159, 1795, 8023, 6989, 3755, 20887, 13587}},
+{8386, 17, 22682, {1, 1, 3, 7, 1, 27, 39, 159, 283, 843, 317, 3229, 2297, 15031, 22039, 21721, 70583}},
+{8387, 17, 22698, {1, 1, 3, 11, 9, 23, 1, 35, 79, 77, 1671, 2583, 647, 12313, 16271, 2959, 108389}},
+{8388, 17, 22712, {1, 1, 1, 7, 5, 55, 1, 233, 429, 231, 833, 1279, 7815, 1051, 30627, 4435, 25997}},
+{8389, 17, 22715, {1, 3, 1, 15, 19, 53, 9, 165, 307, 437, 551, 2477, 1841, 11799, 18477, 5871, 20065}},
+{8390, 17, 22729, {1, 1, 1, 1, 21, 5, 65, 41, 77, 909, 93, 751, 2973, 7341, 30427, 60075, 71457}},
+{8391, 17, 22732, {1, 1, 3, 11, 25, 51, 49, 63, 165, 263, 1915, 747, 8053, 6361, 4843, 20189, 110147}},
+{8392, 17, 22735, {1, 3, 1, 9, 29, 9, 45, 177, 415, 557, 1555, 2967, 1239, 8115, 12853, 19193, 73681}},
+{8393, 17, 22738, {1, 1, 5, 5, 11, 5, 51, 157, 325, 517, 1601, 3911, 1487, 13631, 7483, 61515, 48937}},
+{8394, 17, 22740, {1, 3, 7, 5, 29, 31, 107, 47, 437, 837, 1791, 477, 1717, 7, 25855, 48793, 16385}},
+{8395, 17, 22750, {1, 1, 1, 3, 29, 49, 31, 255, 233, 935, 1993, 125, 2255, 12785, 2807, 54697, 62591}},
+{8396, 17, 22753, {1, 3, 1, 7, 15, 13, 9, 245, 79, 289, 841, 253, 5259, 16123, 29189, 63837, 127915}},
+{8397, 17, 22760, {1, 3, 7, 15, 15, 55, 91, 103, 445, 289, 1471, 423, 3387, 15609, 19311, 28993, 23473}},
+{8398, 17, 22765, {1, 1, 3, 11, 31, 39, 69, 125, 115, 309, 397, 3417, 5693, 10301, 1489, 25955, 2699}},
+{8399, 17, 22768, {1, 3, 3, 5, 13, 21, 51, 207, 239, 311, 1601, 2925, 6285, 9597, 30579, 62957, 6153}},
+{8400, 17, 22778, {1, 1, 7, 1, 27, 21, 63, 143, 399, 971, 1385, 1875, 5143, 6423, 6223, 27009, 14237}},
+{8401, 17, 22785, {1, 3, 5, 1, 5, 59, 125, 133, 151, 997, 1315, 3007, 8173, 16289, 13409, 839, 103519}},
+{8402, 17, 22809, {1, 1, 1, 13, 7, 57, 83, 33, 191, 121, 939, 3927, 6089, 10083, 5903, 52229, 78325}},
+{8403, 17, 22810, {1, 1, 3, 5, 9, 61, 43, 107, 279, 135, 1109, 3779, 5305, 15333, 12217, 41257, 20265}},
+{8404, 17, 22812, {1, 3, 7, 1, 31, 59, 83, 43, 219, 119, 511, 2973, 4587, 10701, 30959, 21489, 124077}},
+{8405, 17, 22828, {1, 1, 7, 9, 17, 3, 59, 151, 281, 209, 1405, 173, 3589, 7679, 29803, 53947, 68291}},
+{8406, 17, 22840, {1, 1, 7, 7, 5, 19, 53, 91, 1, 513, 1495, 231, 3627, 1115, 16121, 12953, 108343}},
+{8407, 17, 22845, {1, 3, 1, 13, 17, 3, 35, 35, 211, 481, 2029, 1035, 3131, 5653, 18097, 10735, 102453}},
+{8408, 17, 22848, {1, 3, 1, 11, 29, 7, 121, 135, 51, 837, 681, 1497, 7435, 2215, 26527, 33029, 93241}},
+{8409, 17, 22857, {1, 3, 3, 15, 29, 43, 17, 243, 195, 315, 499, 3801, 5691, 12119, 4061, 51769, 80497}},
+{8410, 17, 22877, {1, 1, 3, 1, 11, 1, 113, 11, 387, 579, 275, 2995, 895, 11859, 4017, 1543, 11853}},
+{8411, 17, 22882, {1, 1, 7, 9, 31, 27, 63, 217, 97, 275, 435, 1355, 5205, 6587, 32589, 46485, 103587}},
+{8412, 17, 22887, {1, 3, 7, 3, 7, 19, 51, 41, 81, 261, 1909, 1475, 425, 3173, 5679, 34701, 34977}},
+{8413, 17, 22894, {1, 1, 7, 3, 27, 15, 35, 49, 387, 471, 1997, 3643, 2701, 11853, 21311, 36027, 104357}},
+{8414, 17, 22912, {1, 3, 1, 9, 5, 47, 73, 163, 309, 891, 229, 2433, 6715, 6721, 25233, 37043, 29367}},
+{8415, 17, 22930, {1, 1, 1, 7, 27, 15, 9, 185, 421, 597, 565, 143, 1531, 15585, 17057, 54309, 82915}},
+{8416, 17, 22936, {1, 1, 7, 1, 5, 43, 87, 61, 121, 341, 25, 3795, 7161, 11985, 32197, 789, 69543}},
+{8417, 17, 22939, {1, 3, 5, 13, 29, 39, 81, 39, 263, 729, 1833, 365, 1073, 9869, 1845, 52621, 5}},
+{8418, 17, 22957, {1, 1, 7, 7, 5, 33, 117, 11, 371, 161, 1303, 629, 2285, 5827, 32355, 43359, 115595}},
+{8419, 17, 22970, {1, 3, 5, 5, 13, 57, 63, 9, 243, 533, 173, 2197, 717, 13441, 22131, 17783, 3319}},
+{8420, 17, 22980, {1, 1, 7, 11, 15, 31, 87, 255, 183, 273, 805, 2347, 5881, 15401, 273, 17397, 41827}},
+{8421, 17, 22984, {1, 3, 1, 13, 7, 17, 121, 49, 47, 121, 333, 3629, 5337, 4117, 2735, 36581, 61345}},
+{8422, 17, 22992, {1, 3, 3, 11, 9, 7, 25, 223, 379, 119, 385, 1217, 4803, 2947, 30665, 7733, 77893}},
+{8423, 17, 22998, {1, 3, 3, 7, 31, 35, 127, 97, 5, 373, 7, 3035, 843, 5991, 9265, 34289, 42785}},
+{8424, 17, 23001, {1, 3, 7, 3, 27, 19, 95, 253, 349, 871, 807, 413, 5847, 10467, 4277, 12429, 75773}},
+{8425, 17, 23044, {1, 3, 3, 7, 21, 1, 79, 89, 219, 505, 41, 505, 5159, 12839, 3317, 49873, 73705}},
+{8426, 17, 23061, {1, 3, 1, 7, 21, 43, 121, 113, 477, 559, 1831, 3759, 3315, 6367, 7149, 16395, 44703}},
+{8427, 17, 23062, {1, 1, 1, 7, 13, 53, 35, 53, 489, 975, 631, 863, 3067, 1905, 21351, 14705, 80041}},
+{8428, 17, 23071, {1, 1, 1, 5, 13, 27, 121, 65, 351, 123, 1731, 367, 8061, 5229, 8537, 20897, 130373}},
+{8429, 17, 23075, {1, 1, 5, 11, 15, 63, 101, 107, 105, 619, 1771, 3549, 7191, 9083, 16827, 29639, 34219}},
+{8430, 17, 23089, {1, 3, 1, 9, 15, 13, 87, 157, 379, 433, 217, 815, 5079, 1797, 26707, 35165, 92305}},
+{8431, 17, 23090, {1, 1, 5, 13, 27, 35, 31, 65, 313, 629, 375, 1391, 5373, 3497, 7311, 23105, 45293}},
+{8432, 17, 23096, {1, 3, 1, 3, 5, 39, 91, 37, 401, 419, 949, 2431, 3685, 6671, 20789, 8597, 44215}},
+{8433, 17, 23101, {1, 1, 7, 11, 7, 15, 3, 181, 363, 913, 309, 2009, 3805, 6651, 27677, 37711, 40813}},
+{8434, 17, 23114, {1, 3, 5, 5, 17, 11, 47, 9, 27, 459, 773, 1403, 7069, 12651, 8163, 42425, 126697}},
+{8435, 17, 23121, {1, 3, 1, 3, 11, 21, 65, 103, 405, 843, 59, 3653, 1759, 5265, 401, 58019, 124999}},
+{8436, 17, 23124, {1, 1, 3, 7, 11, 25, 61, 211, 199, 849, 1835, 1181, 5003, 3873, 23743, 45451, 54901}},
+{8437, 17, 23127, {1, 3, 5, 3, 29, 25, 43, 199, 481, 991, 699, 3937, 7601, 1253, 24399, 6625, 93917}},
+{8438, 17, 23128, {1, 1, 7, 3, 29, 33, 33, 151, 3, 825, 743, 773, 7825, 8157, 22121, 50095, 16435}},
+{8439, 17, 23137, {1, 3, 1, 1, 27, 15, 81, 151, 271, 167, 1755, 1289, 7473, 8525, 12525, 63139, 48787}},
+{8440, 17, 23138, {1, 1, 7, 13, 27, 33, 87, 125, 211, 631, 149, 3451, 643, 6975, 2659, 12629, 33187}},
+{8441, 17, 23150, {1, 1, 3, 3, 5, 49, 99, 99, 85, 647, 351, 2829, 7005, 7283, 5857, 46157, 52061}},
+{8442, 17, 23155, {1, 1, 3, 5, 11, 37, 43, 129, 21, 639, 187, 2279, 8189, 12877, 28707, 7133, 93639}},
+{8443, 17, 23168, {1, 1, 3, 7, 19, 13, 35, 51, 77, 811, 1553, 2769, 763, 4965, 4643, 37639, 44229}},
+{8444, 17, 23173, {1, 3, 5, 15, 11, 29, 103, 203, 435, 1017, 531, 1453, 1407, 6569, 619, 52103, 45213}},
+{8445, 17, 23174, {1, 1, 7, 5, 25, 25, 47, 229, 201, 843, 473, 2637, 2265, 4627, 20013, 41217, 76095}},
+{8446, 17, 23195, {1, 3, 3, 15, 23, 61, 109, 31, 57, 595, 1303, 3915, 67, 8205, 3553, 9543, 103385}},
+{8447, 17, 23202, {1, 1, 3, 3, 21, 19, 21, 41, 137, 905, 2045, 491, 1783, 151, 20963, 38009, 735}},
+{8448, 17, 23225, {1, 1, 7, 11, 13, 33, 95, 251, 179, 211, 1687, 3189, 6213, 3905, 2117, 15153, 4855}},
+{8449, 17, 23226, {1, 1, 5, 3, 19, 9, 67, 243, 23, 611, 1007, 1317, 7303, 11065, 21157, 56677, 81683}},
+{8450, 17, 23239, {1, 1, 3, 5, 19, 41, 63, 129, 233, 15, 37, 1445, 1095, 11309, 30181, 49199, 85113}},
+{8451, 17, 23253, {1, 3, 7, 1, 21, 53, 83, 79, 155, 379, 773, 1823, 1003, 2787, 31107, 36115, 40987}},
+{8452, 17, 23263, {1, 3, 3, 5, 3, 19, 7, 247, 417, 573, 407, 3577, 6079, 10275, 29791, 35149, 102565}},
+{8453, 17, 23264, {1, 3, 3, 9, 21, 49, 57, 223, 125, 671, 655, 2995, 5849, 5355, 21171, 54857, 114841}},
+{8454, 17, 23281, {1, 3, 7, 3, 27, 23, 125, 103, 485, 955, 963, 1865, 2321, 2263, 32497, 47973, 122111}},
+{8455, 17, 23282, {1, 1, 3, 15, 3, 1, 37, 19, 287, 165, 1717, 851, 3619, 13623, 24295, 48253, 13143}},
+{8456, 17, 23288, {1, 1, 7, 9, 13, 59, 69, 97, 113, 163, 871, 1795, 2719, 13675, 11767, 23687, 65841}},
+{8457, 17, 23294, {1, 1, 5, 3, 21, 31, 41, 115, 469, 177, 137, 2129, 1385, 10835, 16471, 59411, 30795}},
+{8458, 17, 23302, {1, 1, 7, 7, 13, 45, 73, 119, 457, 673, 1481, 3735, 2675, 11413, 9069, 34741, 8757}},
+{8459, 17, 23311, {1, 3, 5, 3, 15, 9, 11, 191, 499, 51, 1963, 3957, 1341, 7129, 13491, 65369, 4339}},
+{8460, 17, 23320, {1, 3, 7, 1, 5, 45, 103, 209, 183, 205, 525, 2417, 847, 10801, 10699, 16723, 36421}},
+{8461, 17, 23325, {1, 3, 7, 13, 3, 57, 37, 75, 299, 359, 2017, 125, 6737, 4859, 18443, 20765, 40319}},
+{8462, 17, 23356, {1, 1, 3, 5, 5, 17, 43, 141, 31, 141, 1019, 1685, 6831, 9433, 31245, 29227, 64083}},
+{8463, 17, 23374, {1, 3, 1, 13, 25, 47, 107, 69, 459, 595, 1759, 3391, 1531, 15197, 25975, 16971, 70861}},
+{8464, 17, 23388, {1, 1, 3, 11, 3, 53, 63, 211, 69, 469, 1407, 1435, 2763, 917, 19943, 16591, 97101}},
+{8465, 17, 23402, {1, 3, 5, 13, 25, 41, 39, 61, 319, 809, 1109, 169, 3101, 8801, 21697, 50759, 130985}},
+{8466, 17, 23415, {1, 3, 1, 9, 23, 1, 11, 249, 243, 605, 1419, 269, 1601, 2063, 5365, 38077, 106161}},
+{8467, 17, 23421, {1, 1, 7, 7, 19, 55, 97, 155, 477, 845, 61, 263, 1337, 8857, 31611, 44417, 43111}},
+{8468, 17, 23426, {1, 3, 3, 15, 7, 63, 45, 239, 291, 279, 1875, 3769, 1571, 15857, 13335, 17209, 34399}},
+{8469, 17, 23443, {1, 1, 7, 11, 19, 19, 69, 111, 217, 927, 1643, 1077, 4763, 15893, 17491, 39737, 10705}},
+{8470, 17, 23446, {1, 1, 5, 11, 3, 3, 31, 199, 109, 403, 973, 3833, 2729, 7285, 26743, 53915, 96203}},
+{8471, 17, 23455, {1, 3, 3, 11, 9, 7, 19, 145, 495, 805, 381, 919, 1323, 4343, 15887, 5163, 68267}},
+{8472, 17, 23461, {1, 1, 3, 11, 15, 31, 27, 201, 251, 279, 1377, 1313, 7143, 9731, 10451, 63431, 31307}},
+{8473, 17, 23468, {1, 1, 7, 1, 1, 55, 35, 249, 133, 645, 425, 279, 6401, 11687, 751, 947, 21791}},
+{8474, 17, 23471, {1, 3, 5, 9, 5, 43, 89, 31, 419, 573, 1087, 2197, 3451, 2393, 6569, 4859, 36607}},
+{8475, 17, 23485, {1, 3, 5, 15, 25, 51, 11, 149, 483, 789, 661, 967, 3537, 15511, 26587, 29861, 120337}},
+{8476, 17, 23486, {1, 3, 5, 13, 21, 39, 75, 111, 57, 321, 1591, 381, 7399, 10807, 26651, 62489, 78341}},
+{8477, 17, 23488, {1, 3, 1, 13, 1, 1, 49, 137, 193, 967, 805, 221, 803, 11381, 27803, 51013, 10475}},
+{8478, 17, 23498, {1, 3, 7, 5, 3, 13, 47, 195, 123, 753, 397, 1203, 981, 12863, 20845, 36155, 19055}},
+{8479, 17, 23500, {1, 1, 1, 9, 9, 11, 53, 203, 3, 163, 1537, 2061, 941, 12629, 16053, 34881, 31489}},
+{8480, 17, 23515, {1, 1, 1, 15, 5, 23, 51, 197, 459, 21, 1989, 2529, 4267, 1505, 8951, 15777, 20493}},
+{8481, 17, 23521, {1, 1, 7, 3, 31, 55, 9, 55, 217, 695, 1563, 4077, 3207, 7029, 10881, 39581, 82511}},
+{8482, 17, 23527, {1, 3, 1, 5, 1, 11, 81, 1, 505, 631, 1093, 3655, 2085, 7349, 5009, 49381, 30527}},
+{8483, 17, 23534, {1, 1, 7, 1, 27, 51, 25, 235, 213, 59, 611, 3883, 2909, 6411, 19605, 49001, 114529}},
+{8484, 17, 23546, {1, 3, 5, 3, 25, 29, 19, 137, 199, 681, 1625, 2711, 4873, 14677, 9767, 30441, 54673}},
+{8485, 17, 23559, {1, 1, 1, 9, 27, 43, 109, 161, 139, 675, 741, 2839, 1425, 5701, 19897, 12787, 33069}},
+{8486, 17, 23560, {1, 3, 5, 11, 21, 19, 77, 107, 197, 591, 1899, 1311, 3347, 6369, 26891, 3771, 32455}},
+{8487, 17, 23566, {1, 1, 7, 15, 31, 13, 109, 69, 207, 349, 249, 971, 7891, 10919, 31579, 38453, 124601}},
+{8488, 17, 23584, {1, 3, 5, 5, 27, 61, 67, 193, 53, 259, 1729, 4033, 2637, 8217, 22351, 4001, 118527}},
+{8489, 17, 23587, {1, 1, 3, 5, 9, 45, 55, 73, 189, 131, 1947, 1889, 837, 4085, 10393, 64359, 1037}},
+{8490, 17, 23594, {1, 3, 7, 3, 13, 51, 55, 37, 335, 939, 35, 461, 5057, 2595, 3305, 58823, 3941}},
+{8491, 17, 23602, {1, 1, 7, 11, 7, 3, 121, 139, 241, 477, 615, 2707, 5391, 7611, 11563, 41083, 16719}},
+{8492, 17, 23607, {1, 3, 3, 15, 27, 55, 13, 221, 195, 543, 215, 4035, 1647, 8111, 26425, 43571, 79893}},
+{8493, 17, 23616, {1, 1, 1, 5, 31, 5, 35, 145, 481, 339, 1951, 2155, 1309, 9851, 31505, 37371, 21247}},
+{8494, 17, 23621, {1, 1, 7, 9, 7, 5, 73, 119, 3, 741, 1351, 2855, 2207, 1465, 12047, 13507, 129173}},
+{8495, 17, 23631, {1, 1, 7, 13, 5, 57, 119, 63, 367, 327, 1257, 3191, 6929, 9593, 16565, 54397, 100305}},
+{8496, 17, 23634, {1, 3, 1, 11, 9, 1, 85, 53, 65, 945, 17, 1963, 4819, 16173, 11669, 53579, 33701}},
+{8497, 17, 23636, {1, 1, 3, 15, 25, 27, 3, 25, 23, 429, 197, 2717, 6107, 6719, 12457, 31793, 78647}},
+{8498, 17, 23649, {1, 1, 3, 1, 7, 63, 111, 235, 299, 91, 369, 1423, 7083, 4229, 18535, 33793, 19943}},
+{8499, 17, 23652, {1, 1, 7, 13, 9, 11, 123, 9, 169, 895, 1989, 1047, 6139, 11773, 19381, 9593, 14809}},
+{8500, 17, 23679, {1, 3, 1, 3, 29, 31, 63, 91, 59, 391, 1695, 2459, 3301, 5615, 3425, 8029, 16069}},
+{8501, 17, 23686, {1, 1, 7, 1, 25, 25, 79, 49, 131, 695, 987, 2911, 1109, 8237, 18227, 37287, 22443}},
+{8502, 17, 23697, {1, 3, 3, 3, 25, 21, 33, 207, 187, 381, 129, 445, 2967, 5119, 18777, 14849, 97115}},
+{8503, 17, 23703, {1, 1, 7, 13, 19, 9, 93, 185, 391, 579, 1509, 3245, 3921, 9473, 4795, 6685, 49549}},
+{8504, 17, 23714, {1, 1, 5, 11, 1, 49, 57, 127, 363, 811, 1383, 2869, 7625, 15177, 2581, 64253, 53677}},
+{8505, 17, 23719, {1, 1, 7, 3, 7, 27, 73, 187, 31, 1011, 1013, 3269, 6625, 5001, 20805, 13331, 93725}},
+{8506, 17, 23723, {1, 3, 7, 1, 23, 61, 123, 9, 141, 113, 1009, 3713, 4947, 9929, 24125, 1101, 104249}},
+{8507, 17, 23726, {1, 3, 7, 3, 23, 17, 25, 187, 189, 875, 1435, 163, 4197, 6619, 29031, 23117, 45347}},
+{8508, 17, 23728, {1, 1, 5, 7, 11, 17, 9, 55, 117, 223, 417, 3993, 1843, 5817, 20435, 56705, 98337}},
+{8509, 17, 23733, {1, 1, 7, 3, 21, 59, 3, 77, 297, 61, 407, 1603, 3209, 1611, 30185, 50275, 56139}},
+{8510, 17, 23740, {1, 1, 1, 5, 31, 3, 101, 167, 367, 543, 339, 1885, 7855, 9989, 30969, 6735, 108123}},
+{8511, 17, 23751, {1, 1, 3, 9, 27, 63, 9, 79, 335, 351, 673, 3107, 3955, 1799, 16879, 57631, 109073}},
+{8512, 17, 23755, {1, 1, 1, 3, 27, 17, 107, 115, 155, 371, 379, 2837, 6213, 2663, 1101, 451, 69517}},
+{8513, 17, 23765, {1, 1, 3, 9, 13, 3, 55, 9, 449, 43, 1011, 3281, 5311, 223, 10715, 6639, 79949}},
+{8514, 17, 23766, {1, 3, 3, 11, 23, 9, 43, 185, 271, 1005, 1041, 2633, 377, 4247, 10417, 51903, 19239}},
+{8515, 17, 23769, {1, 3, 1, 9, 15, 39, 115, 233, 33, 425, 1979, 583, 1901, 8943, 1527, 56065, 50159}},
+{8516, 17, 23779, {1, 1, 3, 1, 13, 1, 105, 149, 13, 625, 671, 1811, 3701, 241, 27357, 25835, 127265}},
+{8517, 17, 23794, {1, 3, 1, 9, 11, 23, 107, 197, 21, 589, 1065, 2591, 1163, 15013, 8931, 6355, 87079}},
+{8518, 17, 23796, {1, 3, 5, 3, 17, 5, 121, 61, 99, 987, 2033, 2237, 2299, 14689, 19785, 9599, 101035}},
+{8519, 17, 23803, {1, 1, 1, 1, 17, 25, 5, 97, 55, 75, 1419, 2793, 7215, 3185, 7029, 23023, 89089}},
+{8520, 17, 23813, {1, 3, 3, 3, 11, 57, 103, 191, 405, 463, 1421, 253, 6069, 10905, 18193, 719, 17337}},
+{8521, 17, 23820, {1, 3, 5, 11, 23, 37, 39, 169, 295, 527, 1671, 3913, 6057, 689, 27719, 47245, 95895}},
+{8522, 17, 23841, {1, 3, 7, 5, 13, 9, 43, 189, 411, 155, 559, 3701, 1623, 2401, 10359, 22675, 41897}},
+{8523, 17, 23853, {1, 1, 1, 11, 17, 55, 47, 101, 357, 669, 857, 2745, 6425, 11839, 13095, 10757, 52383}},
+{8524, 17, 23861, {1, 1, 7, 5, 11, 13, 53, 151, 93, 455, 133, 3353, 1417, 7917, 12913, 2615, 34281}},
+{8525, 17, 23862, {1, 1, 3, 5, 29, 57, 43, 35, 203, 423, 311, 3133, 1757, 1291, 2019, 3115, 126939}},
+{8526, 17, 23873, {1, 1, 3, 11, 9, 43, 119, 95, 135, 351, 1865, 2821, 717, 6275, 19713, 42315, 97935}},
+{8527, 17, 23876, {1, 3, 7, 7, 31, 51, 7, 29, 405, 31, 1765, 3231, 1315, 1307, 26469, 62033, 35619}},
+{8528, 17, 23897, {1, 1, 5, 7, 5, 17, 49, 137, 501, 631, 1401, 2851, 6971, 14721, 4329, 26483, 120007}},
+{8529, 17, 23898, {1, 1, 5, 13, 21, 19, 95, 93, 125, 331, 1797, 1653, 1891, 11081, 30989, 24671, 95421}},
+{8530, 17, 23903, {1, 3, 3, 11, 13, 29, 61, 157, 165, 39, 661, 89, 637, 1397, 12561, 62399, 129107}},
+{8531, 17, 23904, {1, 3, 1, 15, 13, 19, 5, 115, 345, 903, 531, 4069, 6775, 7433, 569, 21779, 13271}},
+{8532, 17, 23910, {1, 3, 3, 9, 5, 53, 17, 115, 67, 939, 1907, 3979, 4311, 3573, 857, 34931, 112397}},
+{8533, 17, 23931, {1, 3, 7, 11, 9, 47, 83, 85, 277, 219, 1701, 3013, 3037, 3473, 3797, 40713, 118573}},
+{8534, 17, 23933, {1, 1, 3, 13, 25, 33, 117, 115, 179, 119, 487, 3213, 2873, 17, 20865, 20043, 64381}},
+{8535, 17, 23934, {1, 1, 1, 3, 1, 45, 73, 103, 75, 579, 981, 2449, 2141, 8697, 22995, 59693, 104461}},
+{8536, 17, 23943, {1, 3, 1, 1, 29, 9, 9, 201, 55, 389, 1069, 2057, 4149, 9217, 10753, 7889, 95849}},
+{8537, 17, 23952, {1, 3, 7, 9, 27, 39, 19, 223, 7, 253, 55, 503, 3339, 6049, 32603, 34807, 115403}},
+{8538, 17, 23955, {1, 1, 5, 3, 13, 21, 67, 87, 205, 309, 1371, 1579, 281, 16135, 28403, 25951, 24109}},
+{8539, 17, 23962, {1, 3, 1, 3, 17, 21, 49, 77, 393, 943, 1701, 2661, 5173, 12875, 2731, 40531, 19301}},
+{8540, 17, 23971, {1, 3, 1, 5, 23, 29, 61, 161, 373, 389, 1699, 359, 2513, 4717, 30397, 24395, 20881}},
+{8541, 17, 23978, {1, 3, 5, 5, 29, 3, 115, 251, 277, 487, 7, 3301, 7945, 14233, 20497, 62035, 21537}},
+{8542, 17, 23998, {1, 1, 1, 9, 7, 59, 23, 85, 367, 109, 1761, 4011, 6535, 8263, 2081, 63647, 69807}},
+{8543, 17, 24003, {1, 1, 7, 11, 21, 41, 29, 219, 271, 617, 929, 407, 2899, 14299, 7645, 44815, 58817}},
+{8544, 17, 24009, {1, 3, 5, 7, 11, 29, 119, 33, 261, 571, 2013, 3327, 2181, 12767, 93, 2437, 76533}},
+{8545, 17, 24017, {1, 1, 7, 13, 17, 39, 55, 203, 261, 917, 967, 3651, 7235, 13751, 14439, 7591, 96553}},
+{8546, 17, 24045, {1, 1, 1, 1, 11, 39, 19, 21, 125, 93, 1773, 1155, 6213, 7173, 9057, 6219, 4643}},
+{8547, 17, 24046, {1, 3, 1, 5, 1, 31, 55, 143, 425, 539, 61, 3377, 7647, 257, 15007, 24511, 8707}},
+{8548, 17, 24060, {1, 3, 3, 11, 27, 51, 103, 197, 427, 139, 181, 1169, 3123, 11803, 5285, 1321, 62267}},
+{8549, 17, 24064, {1, 3, 5, 9, 11, 3, 13, 149, 197, 37, 31, 927, 3313, 16149, 14209, 60177, 46525}},
+{8550, 17, 24076, {1, 1, 5, 13, 15, 29, 103, 49, 355, 797, 1253, 1833, 621, 3877, 9981, 49207, 91035}},
+{8551, 17, 24079, {1, 1, 3, 3, 13, 19, 27, 51, 151, 275, 35, 3755, 7511, 14197, 26141, 43765, 104327}},
+{8552, 17, 24087, {1, 3, 5, 15, 23, 47, 101, 213, 97, 957, 831, 1533, 7913, 15763, 29717, 60425, 38559}},
+{8553, 17, 24094, {1, 1, 7, 9, 29, 31, 49, 245, 361, 299, 151, 2969, 1487, 1761, 11697, 4043, 100909}},
+{8554, 17, 24100, {1, 1, 1, 3, 17, 49, 99, 159, 3, 525, 1527, 3435, 5113, 459, 13341, 54103, 85813}},
+{8555, 17, 24118, {1, 3, 1, 1, 5, 59, 35, 75, 107, 91, 1621, 3261, 619, 3271, 10813, 29857, 1547}},
+{8556, 17, 24121, {1, 1, 5, 9, 9, 33, 85, 245, 39, 879, 1621, 2587, 3825, 12939, 30113, 24611, 68491}},
+{8557, 17, 24132, {1, 3, 1, 3, 9, 39, 93, 241, 307, 237, 3, 1763, 7729, 9257, 31911, 32591, 77333}},
+{8558, 17, 24147, {1, 3, 1, 3, 27, 7, 51, 121, 317, 361, 1027, 95, 7035, 3097, 21007, 38311, 88287}},
+{8559, 17, 24165, {1, 3, 7, 3, 19, 3, 111, 115, 339, 793, 1571, 3101, 1911, 14929, 12841, 45871, 119905}},
+{8560, 17, 24172, {1, 1, 5, 7, 31, 61, 37, 143, 279, 941, 1215, 2411, 7617, 1657, 10189, 19139, 6307}},
+{8561, 17, 24177, {1, 1, 3, 9, 21, 35, 13, 157, 187, 79, 689, 1085, 37, 4549, 5901, 15321, 61627}},
+{8562, 17, 24184, {1, 3, 1, 13, 15, 39, 21, 231, 39, 327, 801, 2321, 587, 1877, 3489, 54467, 95773}},
+{8563, 17, 24187, {1, 1, 5, 7, 1, 9, 53, 1, 243, 365, 789, 3833, 317, 10697, 26567, 65187, 22507}},
+{8564, 17, 24213, {1, 3, 3, 7, 9, 41, 31, 135, 425, 939, 15, 2043, 6593, 7651, 25467, 62549, 35847}},
+{8565, 17, 24217, {1, 1, 1, 7, 15, 23, 19, 57, 421, 25, 1037, 3055, 6173, 12451, 485, 54567, 109561}},
+{8566, 17, 24223, {1, 3, 5, 1, 3, 29, 67, 233, 157, 677, 1711, 513, 4673, 2895, 1983, 31075, 1861}},
+{8567, 17, 24230, {1, 1, 1, 1, 7, 39, 115, 251, 275, 791, 15, 1685, 6835, 14685, 12607, 28213, 121475}},
+{8568, 17, 24234, {1, 1, 5, 5, 13, 11, 103, 93, 489, 709, 1339, 2407, 1663, 10195, 3135, 15531, 88427}},
+{8569, 17, 24241, {1, 1, 7, 7, 17, 1, 123, 143, 31, 721, 1739, 2273, 3785, 10261, 14741, 52573, 113677}},
+{8570, 17, 24248, {1, 3, 7, 3, 9, 21, 77, 13, 241, 429, 165, 3399, 7543, 2633, 21129, 13537, 84473}},
+{8571, 17, 24259, {1, 1, 1, 11, 21, 33, 125, 123, 189, 337, 163, 3727, 2101, 14113, 1719, 46017, 68601}},
+{8572, 17, 24262, {1, 1, 7, 9, 9, 53, 101, 111, 125, 605, 1419, 3901, 1769, 4585, 20063, 20857, 21901}},
+{8573, 17, 24271, {1, 3, 7, 11, 1, 19, 51, 7, 457, 119, 871, 3847, 57, 11437, 28763, 58831, 675}},
+{8574, 17, 24279, {1, 3, 1, 15, 25, 63, 69, 25, 405, 823, 1701, 2441, 7561, 8679, 31643, 29325, 25563}},
+{8575, 17, 24286, {1, 1, 3, 9, 15, 5, 89, 13, 73, 951, 959, 2693, 4565, 13095, 991, 12419, 8267}},
+{8576, 17, 24289, {1, 1, 7, 1, 15, 1, 119, 223, 213, 585, 1047, 2623, 4141, 2043, 1583, 59155, 5133}},
+{8577, 17, 24295, {1, 3, 3, 3, 17, 37, 81, 233, 87, 843, 1597, 1251, 4713, 10813, 24357, 48499, 84465}},
+{8578, 17, 24296, {1, 1, 1, 1, 11, 55, 125, 5, 255, 809, 543, 2351, 7079, 7801, 29247, 23937, 97405}},
+{8579, 17, 24299, {1, 3, 3, 5, 17, 55, 87, 245, 371, 679, 943, 655, 5857, 261, 28229, 22519, 35191}},
+{8580, 17, 24314, {1, 1, 7, 15, 9, 49, 25, 155, 13, 893, 1303, 2317, 2903, 15601, 1433, 20397, 70125}},
+{8581, 17, 24336, {1, 3, 5, 3, 11, 47, 99, 63, 253, 95, 1023, 397, 4307, 4771, 17027, 19833, 18269}},
+{8582, 17, 24342, {1, 3, 3, 7, 25, 17, 69, 119, 475, 575, 1637, 3785, 649, 11557, 22457, 38633, 96153}},
+{8583, 17, 24346, {1, 1, 1, 5, 31, 55, 85, 83, 307, 201, 1543, 727, 977, 15779, 21907, 31025, 38969}},
+{8584, 17, 24357, {1, 3, 5, 1, 7, 53, 107, 239, 341, 237, 1567, 2717, 3197, 12419, 23733, 42119, 86619}},
+{8585, 17, 24367, {1, 1, 5, 13, 3, 7, 105, 95, 201, 953, 781, 2043, 5263, 13427, 10303, 60027, 19297}},
+{8586, 17, 24370, {1, 1, 5, 15, 25, 51, 5, 77, 165, 297, 1281, 1635, 4139, 11569, 32325, 23135, 27013}},
+{8587, 17, 24372, {1, 1, 3, 9, 3, 59, 107, 137, 251, 715, 1477, 511, 5629, 12205, 7541, 62559, 4253}},
+{8588, 17, 24387, {1, 1, 7, 11, 31, 29, 7, 251, 119, 547, 1179, 3063, 1625, 8941, 30515, 13601, 72741}},
+{8589, 17, 24389, {1, 3, 7, 13, 27, 43, 31, 43, 465, 355, 1063, 2305, 1425, 11963, 27327, 53335, 127517}},
+{8590, 17, 24402, {1, 3, 1, 3, 21, 17, 53, 171, 269, 783, 349, 1879, 575, 13537, 16931, 61171, 23499}},
+{8591, 17, 24414, {1, 3, 5, 3, 11, 5, 121, 227, 237, 841, 431, 3209, 3241, 6071, 23465, 39533, 102391}},
+{8592, 17, 24420, {1, 3, 5, 11, 9, 1, 59, 143, 181, 869, 1859, 1543, 6419, 13305, 29075, 28051, 105799}},
+{8593, 17, 24435, {1, 1, 7, 13, 31, 1, 105, 169, 67, 693, 1667, 2181, 4127, 4605, 3701, 36467, 19631}},
+{8594, 17, 24437, {1, 1, 7, 5, 31, 15, 119, 161, 55, 549, 1195, 4051, 1923, 2497, 8289, 60393, 96181}},
+{8595, 17, 24442, {1, 1, 3, 3, 5, 43, 13, 123, 469, 603, 2047, 2347, 815, 3457, 7503, 25261, 71951}},
+{8596, 17, 24444, {1, 1, 7, 3, 13, 25, 85, 141, 497, 405, 957, 1407, 2075, 12445, 6675, 9993, 40429}},
+{8597, 17, 24447, {1, 1, 5, 13, 29, 43, 99, 113, 307, 1003, 859, 723, 7513, 12249, 12653, 57685, 89551}},
+{8598, 17, 24468, {1, 3, 7, 3, 11, 3, 9, 141, 501, 113, 69, 2285, 4525, 9049, 24765, 11585, 53787}},
+{8599, 17, 24475, {1, 1, 3, 1, 25, 41, 103, 159, 215, 871, 77, 1849, 609, 15877, 32515, 22931, 11933}},
+{8600, 17, 24484, {1, 1, 5, 11, 3, 27, 27, 111, 479, 861, 1041, 3777, 4443, 3095, 30379, 6293, 30823}},
+{8601, 17, 24493, {1, 3, 5, 5, 27, 45, 9, 25, 451, 845, 1153, 897, 325, 15679, 30151, 37695, 54593}},
+{8602, 17, 24494, {1, 3, 7, 1, 15, 47, 87, 135, 87, 567, 221, 3173, 769, 8173, 2957, 51287, 20961}},
+{8603, 17, 24496, {1, 3, 1, 9, 3, 33, 1, 71, 147, 983, 1485, 3531, 213, 2353, 28269, 49353, 88343}},
+{8604, 17, 24514, {1, 1, 3, 11, 11, 63, 109, 255, 35, 127, 1777, 791, 1379, 9539, 4915, 21593, 98901}},
+{8605, 17, 24519, {1, 1, 7, 5, 3, 47, 93, 219, 381, 963, 359, 2461, 7629, 2803, 17345, 54311, 79057}},
+{8606, 17, 24533, {1, 3, 5, 13, 13, 21, 1, 65, 455, 203, 29, 3717, 4495, 1285, 25289, 38597, 42431}},
+{8607, 17, 24538, {1, 1, 3, 3, 27, 57, 7, 171, 65, 469, 1921, 3855, 1637, 5517, 14907, 48239, 117573}},
+{8608, 17, 24559, {1, 3, 5, 1, 11, 35, 105, 251, 19, 219, 1191, 2177, 7885, 8399, 30527, 61415, 122215}},
+{8609, 17, 24568, {1, 3, 5, 5, 21, 25, 59, 193, 509, 147, 1805, 561, 3505, 9639, 14221, 31, 99261}},
+{8610, 17, 24573, {1, 1, 5, 13, 31, 23, 35, 143, 367, 385, 1335, 2497, 3573, 8113, 16661, 16147, 8763}},
+{8611, 17, 24577, {1, 1, 7, 13, 15, 27, 35, 15, 7, 539, 633, 1145, 2267, 11527, 20975, 16689, 58227}},
+{8612, 17, 24587, {1, 1, 1, 15, 9, 11, 51, 121, 381, 331, 1445, 187, 519, 15827, 27611, 32891, 113671}},
+{8613, 17, 24592, {1, 3, 1, 5, 19, 3, 77, 67, 107, 105, 1025, 3229, 6869, 5717, 4227, 28489, 59759}},
+{8614, 17, 24601, {1, 1, 5, 15, 25, 23, 7, 25, 103, 733, 525, 453, 6467, 2901, 7197, 33267, 68177}},
+{8615, 17, 24602, {1, 1, 5, 7, 27, 27, 41, 93, 449, 733, 571, 411, 1709, 9557, 549, 5925, 24123}},
+{8616, 17, 24608, {1, 1, 7, 5, 31, 57, 119, 227, 105, 533, 717, 3357, 2495, 6467, 7211, 38169, 44603}},
+{8617, 17, 24645, {1, 1, 5, 7, 29, 9, 125, 241, 471, 571, 1271, 2911, 8087, 5067, 31139, 39681, 28579}},
+{8618, 17, 24650, {1, 3, 5, 11, 25, 53, 109, 35, 183, 109, 1961, 1681, 7773, 6935, 28049, 37279, 96829}},
+{8619, 17, 24657, {1, 1, 1, 11, 1, 17, 47, 245, 231, 747, 1395, 1635, 5129, 3165, 627, 34463, 38967}},
+{8620, 17, 24664, {1, 3, 5, 1, 9, 41, 25, 215, 251, 525, 1399, 3405, 7399, 11041, 5599, 51167, 38697}},
+{8621, 17, 24670, {1, 3, 3, 13, 11, 15, 121, 95, 139, 611, 633, 3941, 2619, 15123, 28535, 64823, 17527}},
+{8622, 17, 24673, {1, 3, 7, 13, 21, 53, 65, 175, 81, 5, 699, 1525, 7397, 2465, 4479, 58225, 26387}},
+{8623, 17, 24676, {1, 1, 5, 7, 9, 31, 31, 149, 359, 613, 397, 153, 4861, 8195, 22969, 26003, 124423}},
+{8624, 17, 24680, {1, 3, 1, 13, 27, 17, 107, 27, 19, 13, 1481, 573, 7701, 6273, 30255, 16125, 11809}},
+{8625, 17, 24686, {1, 3, 1, 9, 15, 1, 45, 105, 287, 901, 667, 3197, 3493, 12259, 1511, 63361, 94257}},
+{8626, 17, 24700, {1, 3, 1, 3, 25, 53, 19, 87, 365, 585, 1569, 1731, 3747, 11985, 22673, 17767, 113779}},
+{8627, 17, 24704, {1, 3, 3, 9, 7, 21, 103, 201, 501, 149, 1939, 3111, 4739, 8389, 27127, 55889, 54487}},
+{8628, 17, 24714, {1, 3, 5, 7, 25, 53, 75, 57, 19, 505, 849, 2631, 6999, 11269, 24541, 17695, 97671}},
+{8629, 17, 24728, {1, 1, 7, 15, 5, 51, 123, 93, 445, 379, 1729, 2747, 5821, 10779, 29335, 57419, 109339}},
+{8630, 17, 24731, {1, 1, 7, 3, 7, 57, 117, 65, 297, 891, 487, 1535, 2361, 10457, 30759, 34571, 129949}},
+{8631, 17, 24733, {1, 3, 5, 5, 17, 51, 27, 103, 55, 925, 947, 1237, 1629, 12687, 14775, 49627, 100939}},
+{8632, 17, 24747, {1, 3, 3, 15, 1, 11, 75, 177, 399, 55, 1705, 1165, 7525, 8909, 13071, 60703, 11561}},
+{8633, 17, 24749, {1, 1, 1, 7, 13, 29, 23, 65, 279, 853, 637, 3947, 4099, 6465, 7061, 50417, 35015}},
+{8634, 17, 24750, {1, 1, 3, 3, 15, 11, 111, 169, 135, 279, 1941, 3035, 3027, 6813, 13363, 20387, 3257}},
+{8635, 17, 24764, {1, 3, 3, 11, 3, 5, 95, 181, 405, 313, 39, 1503, 2443, 3221, 17021, 23485, 43909}},
+{8636, 17, 24782, {1, 1, 1, 3, 17, 63, 27, 247, 441, 533, 449, 3845, 4021, 14269, 31477, 7013, 37473}},
+{8637, 17, 24784, {1, 1, 5, 13, 29, 39, 41, 95, 417, 21, 685, 609, 5787, 13145, 32677, 6121, 50919}},
+{8638, 17, 24793, {1, 1, 5, 3, 17, 5, 93, 143, 171, 681, 1143, 2875, 805, 15823, 29649, 63327, 12041}},
+{8639, 17, 24794, {1, 1, 1, 11, 3, 53, 123, 105, 59, 485, 1799, 2939, 657, 2485, 29563, 36221, 89095}},
+{8640, 17, 24810, {1, 1, 5, 5, 15, 13, 127, 87, 211, 579, 175, 793, 6895, 9051, 17681, 28831, 31783}},
+{8641, 17, 24817, {1, 3, 7, 5, 11, 37, 9, 219, 453, 697, 139, 335, 6411, 8495, 4203, 29065, 114837}},
+{8642, 17, 24820, {1, 1, 3, 5, 31, 25, 89, 215, 249, 271, 1731, 3133, 3947, 10227, 9679, 51303, 82833}},
+{8643, 17, 24823, {1, 3, 5, 1, 31, 15, 7, 131, 369, 757, 1963, 3223, 35, 13967, 31807, 5093, 113743}},
+{8644, 17, 24832, {1, 1, 7, 3, 15, 23, 21, 173, 295, 929, 1137, 3943, 1985, 13015, 8523, 59117, 127}},
+{8645, 17, 24855, {1, 3, 7, 1, 31, 1, 115, 229, 345, 859, 1757, 1835, 7491, 4545, 1483, 40149, 122321}},
+{8646, 17, 24859, {1, 1, 1, 3, 13, 5, 3, 133, 177, 47, 1515, 17, 5663, 3185, 2775, 31389, 37409}},
+{8647, 17, 24862, {1, 1, 3, 3, 31, 3, 43, 137, 185, 803, 709, 391, 3513, 8117, 32593, 46593, 61037}},
+{8648, 17, 24877, {1, 1, 1, 7, 29, 27, 13, 35, 61, 961, 777, 2725, 7379, 7053, 21781, 60285, 49221}},
+{8649, 17, 24890, {1, 3, 7, 15, 7, 7, 15, 123, 109, 97, 361, 791, 4773, 8111, 4319, 13981, 92505}},
+{8650, 17, 24900, {1, 1, 3, 11, 21, 33, 113, 221, 453, 981, 341, 4041, 5129, 5981, 11051, 17243, 19023}},
+{8651, 17, 24904, {1, 3, 1, 1, 19, 7, 75, 213, 467, 221, 1829, 1275, 5729, 6843, 23855, 44805, 89269}},
+{8652, 17, 24909, {1, 1, 3, 7, 5, 29, 39, 125, 147, 329, 1485, 2793, 2329, 14979, 18395, 37951, 58699}},
+{8653, 17, 24910, {1, 3, 1, 3, 11, 37, 117, 189, 103, 381, 39, 31, 5205, 5601, 17127, 49073, 121417}},
+{8654, 17, 24915, {1, 3, 3, 13, 23, 49, 57, 187, 441, 189, 349, 2559, 3313, 1321, 7731, 57309, 80195}},
+{8655, 17, 24922, {1, 3, 7, 1, 17, 9, 21, 15, 447, 333, 959, 3471, 5301, 8573, 9761, 23183, 57997}},
+{8656, 17, 24937, {1, 3, 1, 9, 19, 1, 101, 71, 325, 309, 85, 2097, 8003, 12249, 1887, 2097, 68375}},
+{8657, 17, 24945, {1, 1, 7, 7, 11, 39, 85, 241, 293, 205, 387, 1539, 6583, 1395, 8869, 48843, 49983}},
+{8658, 17, 24962, {1, 3, 7, 13, 11, 23, 83, 125, 55, 429, 169, 1893, 4657, 643, 3405, 9943, 128753}},
+{8659, 17, 24964, {1, 1, 3, 11, 19, 43, 13, 171, 495, 117, 437, 3697, 6723, 6199, 1859, 39637, 111499}},
+{8660, 17, 24991, {1, 1, 1, 5, 1, 31, 83, 199, 129, 941, 1637, 1997, 5011, 14957, 32427, 60797, 4989}},
+{8661, 17, 24992, {1, 3, 3, 3, 5, 61, 33, 225, 315, 157, 1709, 807, 7809, 11063, 319, 20901, 73599}},
+{8662, 17, 24995, {1, 1, 7, 3, 27, 3, 1, 173, 125, 769, 1203, 3357, 4899, 13115, 7081, 42459, 18525}},
+{8663, 17, 25001, {1, 1, 7, 9, 9, 27, 43, 115, 229, 867, 661, 1825, 2883, 4285, 22393, 65141, 24699}},
+{8664, 17, 25009, {1, 1, 3, 7, 5, 9, 93, 47, 33, 823, 309, 2977, 5791, 9177, 27645, 35683, 57455}},
+{8665, 17, 25019, {1, 1, 5, 7, 9, 53, 9, 77, 499, 1023, 917, 209, 7311, 249, 773, 18303, 41447}},
+{8666, 17, 25021, {1, 1, 3, 5, 7, 9, 33, 73, 325, 369, 1657, 2257, 2893, 13911, 10797, 21055, 103511}},
+{8667, 17, 25029, {1, 3, 1, 3, 21, 31, 125, 29, 149, 513, 979, 2271, 989, 9541, 4179, 13215, 71369}},
+{8668, 17, 25034, {1, 1, 7, 7, 19, 41, 39, 165, 59, 79, 137, 3479, 3389, 6635, 21467, 51073, 20765}},
+{8669, 17, 25036, {1, 3, 3, 5, 7, 13, 109, 53, 335, 627, 339, 3825, 287, 6077, 11319, 2377, 112693}},
+{8670, 17, 25039, {1, 3, 3, 1, 3, 57, 9, 47, 437, 717, 563, 1219, 6191, 9081, 21533, 2651, 17275}},
+{8671, 17, 25057, {1, 1, 1, 5, 21, 9, 109, 109, 339, 947, 1699, 1487, 6477, 12601, 12327, 39427, 80937}},
+{8672, 17, 25063, {1, 1, 7, 9, 1, 5, 55, 43, 95, 733, 1151, 3657, 2119, 11947, 21279, 21581, 22053}},
+{8673, 17, 25064, {1, 3, 5, 11, 7, 9, 97, 149, 55, 523, 1911, 1389, 5343, 5533, 15439, 65313, 73421}},
+{8674, 17, 25075, {1, 1, 3, 7, 19, 15, 119, 141, 57, 243, 423, 981, 1407, 12633, 20455, 53069, 98593}},
+{8675, 17, 25077, {1, 1, 3, 3, 15, 57, 71, 203, 15, 133, 601, 805, 2821, 11623, 147, 4333, 97681}},
+{8676, 17, 25084, {1, 1, 5, 7, 17, 61, 15, 251, 53, 699, 105, 1195, 3979, 41, 9077, 5145, 80057}},
+{8677, 17, 25088, {1, 1, 5, 15, 29, 33, 53, 19, 41, 471, 1143, 65, 5833, 8417, 17263, 35859, 45035}},
+{8678, 17, 25091, {1, 1, 1, 1, 15, 51, 73, 131, 181, 147, 1863, 3777, 1749, 10135, 11591, 12395, 85163}},
+{8679, 17, 25105, {1, 3, 1, 9, 23, 63, 83, 199, 87, 499, 2025, 863, 4665, 3941, 17647, 52463, 108615}},
+{8680, 17, 25134, {1, 3, 5, 7, 11, 39, 65, 161, 367, 593, 699, 1807, 7217, 5221, 22093, 44933, 6201}},
+{8681, 17, 25165, {1, 1, 7, 13, 9, 41, 35, 77, 353, 291, 1267, 3923, 5397, 15401, 30317, 14945, 8715}},
+{8682, 17, 25183, {1, 3, 1, 15, 11, 3, 29, 25, 505, 945, 1425, 2297, 1133, 4675, 8069, 55115, 114177}},
+{8683, 17, 25184, {1, 3, 1, 5, 27, 63, 25, 7, 5, 399, 473, 1325, 7391, 5953, 27755, 65407, 89435}},
+{8684, 17, 25202, {1, 3, 3, 13, 21, 61, 5, 119, 23, 999, 849, 1225, 3077, 821, 12059, 43223, 45427}},
+{8685, 17, 25204, {1, 3, 7, 13, 1, 5, 93, 173, 181, 453, 1449, 3823, 1713, 14737, 8891, 43643, 1983}},
+{8686, 17, 25211, {1, 1, 3, 3, 29, 53, 31, 163, 321, 539, 1283, 429, 3449, 15617, 4761, 21187, 120725}},
+{8687, 17, 25223, {1, 1, 1, 1, 13, 27, 49, 37, 33, 631, 375, 425, 2465, 8773, 2777, 2115, 35633}},
+{8688, 17, 25224, {1, 3, 5, 3, 25, 25, 27, 201, 63, 259, 1571, 1143, 2325, 6773, 11941, 28897, 19719}},
+{8689, 17, 25235, {1, 1, 3, 5, 11, 39, 59, 203, 37, 899, 559, 2599, 4397, 12159, 29579, 51251, 83213}},
+{8690, 17, 25241, {1, 1, 1, 7, 9, 19, 63, 169, 257, 921, 381, 3605, 3479, 1739, 26599, 20599, 29617}},
+{8691, 17, 25253, {1, 1, 1, 9, 7, 29, 123, 35, 419, 963, 855, 1903, 6199, 2727, 29811, 49279, 101673}},
+{8692, 17, 25258, {1, 3, 5, 11, 29, 23, 73, 13, 467, 935, 181, 3837, 8117, 11501, 18361, 26803, 99471}},
+{8693, 17, 25277, {1, 1, 1, 5, 31, 41, 109, 45, 115, 113, 1893, 727, 2453, 13463, 22339, 13495, 11473}},
+{8694, 17, 25278, {1, 1, 5, 9, 5, 31, 109, 145, 511, 243, 57, 2219, 1601, 1821, 12787, 48239, 89645}},
+{8695, 17, 25280, {1, 3, 1, 7, 19, 41, 25, 57, 45, 489, 1531, 3959, 2007, 14247, 13445, 1991, 114977}},
+{8696, 17, 25290, {1, 3, 7, 15, 7, 17, 107, 27, 249, 207, 183, 2483, 5817, 8927, 10715, 63631, 51947}},
+{8697, 17, 25295, {1, 3, 1, 3, 13, 21, 57, 113, 171, 885, 1335, 783, 7575, 4443, 19497, 13827, 130727}},
+{8698, 17, 25300, {1, 1, 5, 7, 19, 33, 95, 13, 387, 297, 1597, 767, 7543, 16063, 10367, 51683, 119811}},
+{8699, 17, 25307, {1, 3, 7, 9, 27, 57, 111, 209, 305, 139, 179, 25, 2295, 2593, 31361, 23677, 74501}},
+{8700, 17, 25319, {1, 3, 7, 3, 21, 63, 97, 189, 3, 693, 209, 2227, 7169, 9, 32575, 61521, 115155}},
+{8701, 17, 25323, {1, 1, 1, 11, 13, 21, 125, 249, 193, 895, 139, 1207, 5941, 5821, 6623, 7753, 80939}},
+{8702, 17, 25326, {1, 3, 5, 5, 11, 49, 17, 21, 423, 497, 835, 539, 6195, 12783, 1271, 20069, 2657}},
+{8703, 17, 25333, {1, 1, 7, 15, 13, 39, 83, 191, 77, 95, 661, 3627, 1853, 1349, 23109, 43583, 104121}},
+{8704, 17, 25334, {1, 3, 1, 15, 31, 15, 71, 255, 489, 91, 351, 367, 309, 6275, 18325, 51231, 52159}},
+{8705, 17, 25337, {1, 1, 7, 13, 21, 49, 37, 135, 355, 421, 507, 2563, 4955, 4095, 1933, 29517, 119699}},
+{8706, 17, 25348, {1, 1, 1, 1, 27, 41, 15, 161, 475, 635, 863, 3773, 6015, 6197, 24261, 26271, 42375}},
+{8707, 17, 25351, {1, 1, 7, 13, 25, 7, 23, 185, 129, 597, 1561, 3003, 2879, 15187, 4913, 24589, 12927}},
+{8708, 17, 25372, {1, 1, 3, 3, 9, 23, 49, 233, 345, 83, 823, 2627, 5019, 2365, 23755, 9855, 48515}},
+{8709, 17, 25381, {1, 3, 1, 1, 11, 7, 117, 213, 27, 923, 375, 2597, 8173, 8935, 16487, 49283, 104569}},
+{8710, 17, 25403, {1, 1, 7, 7, 23, 13, 61, 131, 313, 883, 495, 1105, 6207, 1473, 21655, 51883, 403}},
+{8711, 17, 25406, {1, 3, 3, 1, 25, 5, 5, 159, 243, 929, 1429, 1151, 5043, 11551, 21231, 38767, 105299}},
+{8712, 17, 25431, {1, 3, 7, 7, 15, 37, 49, 219, 67, 147, 873, 2391, 455, 9565, 8977, 64759, 40347}},
+{8713, 17, 25437, {1, 1, 1, 13, 21, 13, 13, 243, 303, 333, 187, 3591, 871, 2501, 30853, 5247, 48855}},
+{8714, 17, 25453, {1, 1, 1, 5, 1, 5, 127, 249, 23, 79, 789, 3507, 8119, 5025, 26545, 54009, 100633}},
+{8715, 17, 25459, {1, 3, 3, 11, 3, 31, 27, 115, 423, 309, 1805, 169, 789, 4081, 28139, 35355, 47991}},
+{8716, 17, 25462, {1, 3, 1, 5, 19, 13, 43, 165, 165, 241, 309, 1703, 7631, 5899, 12041, 21235, 97045}},
+{8717, 17, 25466, {1, 3, 1, 13, 15, 49, 29, 199, 93, 611, 77, 2681, 191, 10215, 8115, 11895, 108687}},
+{8718, 17, 25477, {1, 1, 3, 3, 13, 45, 15, 151, 345, 111, 1829, 1357, 6317, 5239, 26193, 46763, 73101}},
+{8719, 17, 25484, {1, 3, 7, 3, 1, 19, 119, 63, 23, 759, 173, 307, 967, 2731, 9353, 14479, 119}},
+{8720, 17, 25495, {1, 3, 5, 15, 5, 21, 127, 21, 419, 575, 991, 3465, 7365, 5711, 30657, 43513, 22447}},
+{8721, 17, 25501, {1, 3, 7, 1, 19, 5, 49, 7, 45, 963, 1755, 3745, 4061, 4619, 9089, 59953, 100265}},
+{8722, 17, 25506, {1, 1, 1, 3, 25, 53, 97, 97, 347, 749, 823, 1499, 8151, 9957, 731, 22317, 121623}},
+{8723, 17, 25511, {1, 3, 5, 5, 19, 3, 121, 127, 313, 457, 1737, 4065, 5295, 7957, 16373, 62085, 5711}},
+{8724, 17, 25515, {1, 1, 7, 13, 7, 37, 97, 43, 179, 837, 161, 477, 5095, 4985, 111, 58743, 24049}},
+{8725, 17, 25525, {1, 3, 1, 13, 27, 13, 91, 241, 339, 235, 111, 369, 3361, 15105, 11097, 23955, 53561}},
+{8726, 17, 25529, {1, 3, 5, 3, 9, 17, 103, 133, 309, 683, 71, 3329, 7229, 8763, 4165, 9649, 8529}},
+{8727, 17, 25532, {1, 3, 5, 13, 29, 55, 29, 205, 433, 1007, 1173, 731, 5653, 89, 18447, 37911, 65603}},
+{8728, 17, 25538, {1, 3, 5, 1, 15, 1, 7, 195, 397, 877, 1433, 3487, 1581, 1539, 3361, 7453, 46451}},
+{8729, 17, 25549, {1, 1, 5, 13, 23, 1, 47, 245, 19, 859, 681, 2971, 2531, 11393, 32765, 4595, 45213}},
+{8730, 17, 25552, {1, 3, 1, 3, 1, 11, 85, 185, 467, 413, 25, 3677, 881, 1791, 14655, 44811, 50819}},
+{8731, 17, 25564, {1, 3, 5, 9, 9, 21, 65, 99, 441, 215, 1453, 2873, 5883, 485, 20883, 1303, 11837}},
+{8732, 17, 25567, {1, 3, 3, 5, 9, 37, 87, 211, 247, 535, 1163, 1785, 4219, 12559, 17419, 48201, 21725}},
+{8733, 17, 25574, {1, 1, 1, 11, 29, 11, 9, 215, 375, 601, 627, 2641, 6961, 6175, 10995, 49299, 102891}},
+{8734, 17, 25577, {1, 3, 1, 3, 7, 7, 23, 139, 89, 1005, 1815, 947, 1507, 10349, 35, 43595, 104697}},
+{8735, 17, 25583, {1, 1, 5, 13, 29, 47, 77, 255, 341, 333, 1211, 3473, 1303, 11237, 28371, 43283, 77617}},
+{8736, 17, 25588, {1, 3, 3, 13, 27, 17, 73, 95, 227, 241, 1369, 833, 6683, 2193, 309, 64249, 6731}},
+{8737, 17, 25603, {1, 3, 3, 3, 15, 29, 45, 209, 401, 725, 1123, 1659, 6099, 15941, 5797, 30563, 119385}},
+{8738, 17, 25610, {1, 1, 1, 1, 7, 55, 95, 151, 351, 373, 1131, 2357, 7535, 3899, 19047, 17879, 34623}},
+{8739, 17, 25615, {1, 3, 1, 5, 31, 5, 33, 97, 477, 399, 1255, 1073, 1513, 11651, 2951, 31351, 102635}},
+{8740, 17, 25624, {1, 1, 3, 13, 17, 63, 51, 209, 57, 87, 977, 3663, 6717, 15441, 10709, 607, 48297}},
+{8741, 17, 25636, {1, 1, 5, 1, 9, 29, 1, 105, 343, 19, 977, 3401, 3873, 4259, 23057, 13071, 105771}},
+{8742, 17, 25639, {1, 1, 1, 5, 1, 33, 59, 17, 115, 225, 853, 3295, 965, 12547, 26971, 50097, 54999}},
+{8743, 17, 25643, {1, 3, 3, 13, 1, 51, 29, 19, 245, 781, 493, 1121, 2937, 4177, 3267, 47463, 101195}},
+{8744, 17, 25645, {1, 3, 7, 5, 3, 51, 25, 131, 451, 997, 1809, 1583, 355, 15383, 28159, 39141, 109379}},
+{8745, 17, 25648, {1, 1, 5, 7, 3, 19, 75, 103, 401, 115, 1627, 423, 2485, 7281, 6177, 54677, 31499}},
+{8746, 17, 25671, {1, 1, 1, 11, 23, 7, 57, 121, 5, 921, 1191, 1779, 1979, 3427, 25617, 19423, 73835}},
+{8747, 17, 25678, {1, 3, 3, 11, 17, 51, 15, 163, 265, 665, 1399, 1977, 3097, 7109, 14741, 24291, 79239}},
+{8748, 17, 25689, {1, 1, 7, 3, 25, 61, 69, 77, 341, 23, 713, 2879, 8075, 14855, 9691, 58241, 113277}},
+{8749, 17, 25708, {1, 3, 7, 9, 27, 43, 95, 11, 239, 445, 951, 3869, 1049, 6493, 9569, 9285, 29183}},
+{8750, 17, 25716, {1, 1, 3, 1, 1, 23, 27, 101, 337, 171, 1977, 3181, 2693, 8591, 32309, 24909, 106535}},
+{8751, 17, 25725, {1, 1, 1, 7, 23, 59, 79, 115, 49, 351, 871, 1209, 1045, 5985, 28427, 23047, 113571}},
+{8752, 17, 25730, {1, 1, 7, 13, 27, 3, 35, 7, 319, 503, 977, 3747, 4859, 16315, 30375, 25999, 24341}},
+{8753, 17, 25739, {1, 3, 3, 7, 23, 43, 67, 21, 399, 349, 1541, 2991, 5781, 14501, 5609, 65093, 12789}},
+{8754, 17, 25747, {1, 3, 1, 11, 5, 21, 17, 157, 311, 663, 469, 4033, 1557, 7569, 31163, 14079, 127771}},
+{8755, 17, 25753, {1, 1, 7, 15, 15, 31, 15, 183, 365, 35, 1433, 2793, 6685, 10565, 30409, 46815, 14173}},
+{8756, 17, 25790, {1, 1, 7, 7, 7, 45, 61, 163, 99, 353, 1535, 3185, 4023, 7999, 26173, 12675, 98073}},
+{8757, 17, 25797, {1, 1, 5, 13, 1, 11, 107, 41, 171, 773, 1513, 883, 2117, 14449, 32323, 58271, 97173}},
+{8758, 17, 25804, {1, 1, 3, 13, 27, 15, 123, 247, 281, 851, 233, 1173, 6863, 14805, 12401, 30729, 104127}},
+{8759, 17, 25809, {1, 1, 7, 11, 25, 9, 97, 215, 217, 51, 1865, 3897, 725, 4779, 21661, 11853, 72225}},
+{8760, 17, 25816, {1, 1, 5, 3, 5, 31, 125, 81, 367, 705, 325, 519, 3879, 5607, 3247, 7149, 33177}},
+{8761, 17, 25825, {1, 3, 3, 7, 17, 17, 19, 113, 331, 277, 317, 1893, 1287, 8965, 27523, 61355, 45331}},
+{8762, 17, 25831, {1, 3, 7, 9, 27, 15, 87, 21, 343, 479, 11, 2945, 1235, 1591, 28195, 40559, 42773}},
+{8763, 17, 25845, {1, 3, 3, 13, 1, 45, 115, 41, 263, 569, 71, 4051, 739, 1031, 19213, 23961, 110767}},
+{8764, 17, 25846, {1, 3, 7, 1, 9, 41, 21, 131, 3, 617, 191, 4051, 2445, 13451, 11889, 25075, 82631}},
+{8765, 17, 25867, {1, 3, 3, 15, 7, 55, 65, 67, 443, 1023, 1445, 1467, 3907, 11449, 2247, 65085, 102161}},
+{8766, 17, 25870, {1, 3, 5, 15, 19, 27, 97, 181, 51, 591, 99, 1443, 4927, 9809, 29693, 44293, 29369}},
+{8767, 17, 25897, {1, 1, 7, 7, 17, 59, 69, 163, 37, 171, 107, 2581, 3567, 9455, 19707, 6329, 27755}},
+{8768, 17, 25908, {1, 1, 1, 11, 15, 17, 83, 223, 183, 861, 1047, 3739, 3509, 5571, 28259, 42781, 130657}},
+{8769, 17, 25937, {1, 3, 3, 7, 15, 11, 33, 115, 297, 841, 1629, 1559, 2261, 11763, 22255, 63819, 55831}},
+{8770, 17, 25940, {1, 3, 3, 5, 19, 49, 17, 251, 507, 251, 805, 1041, 3947, 2219, 19977, 65449, 25031}},
+{8771, 17, 25944, {1, 1, 1, 11, 3, 7, 81, 17, 219, 729, 949, 3257, 6495, 4701, 2181, 7009, 106465}},
+{8772, 17, 25949, {1, 3, 7, 5, 27, 35, 15, 83, 43, 1013, 1427, 1943, 7555, 6613, 26879, 42685, 22071}},
+{8773, 17, 25954, {1, 1, 3, 13, 23, 55, 15, 87, 15, 579, 717, 777, 149, 11431, 26197, 17711, 7337}},
+{8774, 17, 25960, {1, 1, 5, 1, 31, 45, 113, 253, 211, 915, 1855, 4043, 2159, 1803, 5061, 40473, 3657}},
+{8775, 17, 25963, {1, 1, 3, 7, 25, 15, 37, 73, 467, 969, 1123, 4053, 4837, 10091, 25461, 40803, 91157}},
+{8776, 17, 25966, {1, 1, 5, 1, 7, 31, 77, 207, 21, 623, 577, 1195, 5839, 13013, 11189, 61691, 33327}},
+{8777, 17, 25978, {1, 3, 7, 7, 13, 3, 9, 55, 47, 779, 599, 3747, 1533, 14705, 23185, 4011, 36003}},
+{8778, 17, 25996, {1, 1, 5, 5, 31, 17, 99, 253, 103, 957, 241, 1893, 7435, 14907, 9089, 23205, 70639}},
+{8779, 17, 26007, {1, 3, 7, 15, 7, 55, 53, 101, 227, 541, 2017, 275, 577, 15621, 1799, 50373, 43197}},
+{8780, 17, 26011, {1, 3, 1, 15, 29, 23, 69, 193, 429, 359, 1045, 4091, 6551, 1673, 29113, 43247, 80993}},
+{8781, 17, 26027, {1, 3, 7, 11, 5, 37, 13, 27, 277, 65, 565, 2631, 6919, 5593, 8481, 14703, 9719}},
+{8782, 17, 26032, {1, 3, 1, 15, 5, 7, 83, 51, 77, 307, 1299, 1373, 5281, 15359, 15569, 50093, 59661}},
+{8783, 17, 26038, {1, 3, 5, 11, 13, 31, 99, 123, 263, 319, 2033, 4055, 2427, 103, 2009, 27517, 112467}},
+{8784, 17, 26049, {1, 1, 7, 3, 13, 1, 51, 131, 17, 861, 459, 3925, 5511, 5255, 28553, 36437, 54591}},
+{8785, 17, 26052, {1, 3, 7, 5, 9, 57, 49, 119, 291, 727, 1611, 4035, 4517, 10979, 28445, 26905, 57517}},
+{8786, 17, 26055, {1, 1, 5, 9, 9, 55, 43, 209, 411, 137, 1619, 3965, 5253, 8217, 7569, 42043, 104163}},
+{8787, 17, 26085, {1, 3, 3, 7, 21, 3, 107, 255, 353, 735, 71, 1789, 3351, 755, 22805, 53537, 126859}},
+{8788, 17, 26089, {1, 1, 7, 5, 15, 55, 13, 167, 165, 289, 1231, 2547, 8135, 5475, 2361, 49019, 110579}},
+{8789, 17, 26090, {1, 3, 1, 11, 17, 21, 59, 37, 177, 517, 499, 4035, 749, 14297, 22415, 54975, 29769}},
+{8790, 17, 26098, {1, 3, 7, 3, 3, 59, 55, 17, 483, 625, 875, 1465, 7583, 2969, 2741, 36965, 80367}},
+{8791, 17, 26104, {1, 1, 3, 13, 31, 5, 11, 149, 7, 297, 1485, 735, 4095, 10089, 5757, 64997, 56629}},
+{8792, 17, 26110, {1, 3, 1, 13, 19, 43, 77, 209, 309, 739, 1765, 3297, 8167, 6523, 27987, 25235, 80555}},
+{8793, 17, 26113, {1, 1, 3, 9, 31, 57, 125, 75, 3, 633, 85, 3339, 1691, 9721, 17465, 36801, 106147}},
+{8794, 17, 26126, {1, 3, 5, 15, 27, 7, 111, 7, 475, 523, 1825, 1367, 1549, 15533, 13827, 14471, 100271}},
+{8795, 17, 26133, {1, 1, 5, 3, 5, 61, 1, 221, 163, 183, 1701, 3549, 349, 10057, 26169, 20725, 55305}},
+{8796, 17, 26138, {1, 1, 3, 1, 15, 41, 13, 71, 269, 909, 1253, 2553, 83, 10055, 1057, 39841, 20437}},
+{8797, 17, 26140, {1, 3, 3, 5, 29, 39, 113, 23, 137, 601, 361, 1779, 279, 15803, 8993, 2633, 114847}},
+{8798, 17, 26156, {1, 1, 3, 7, 29, 45, 35, 27, 71, 253, 231, 3449, 1955, 9109, 9043, 50593, 15023}},
+{8799, 17, 26159, {1, 3, 1, 11, 17, 45, 85, 255, 341, 957, 769, 3009, 3997, 6435, 1161, 34219, 97077}},
+{8800, 17, 26176, {1, 1, 5, 1, 1, 19, 9, 51, 477, 129, 1411, 3223, 5069, 3237, 15947, 27215, 70401}},
+{8801, 17, 26186, {1, 1, 3, 1, 1, 1, 73, 31, 301, 227, 119, 607, 3379, 3907, 1263, 2651, 43769}},
+{8802, 17, 26203, {1, 1, 1, 15, 21, 59, 109, 155, 473, 361, 1871, 3085, 513, 12607, 12747, 41067, 44977}},
+{8803, 17, 26210, {1, 1, 7, 3, 27, 21, 89, 71, 437, 671, 1469, 2191, 4225, 6343, 1131, 29141, 25221}},
+{8804, 17, 26222, {1, 1, 7, 9, 7, 45, 95, 197, 391, 11, 1913, 3107, 5247, 959, 30395, 32809, 20893}},
+{8805, 17, 26224, {1, 3, 7, 15, 13, 49, 77, 245, 463, 769, 1807, 1311, 2715, 14819, 27595, 57521, 105221}},
+{8806, 17, 26229, {1, 1, 1, 5, 23, 45, 119, 77, 325, 405, 1631, 461, 6357, 7037, 31699, 46295, 118577}},
+{8807, 17, 26233, {1, 3, 5, 1, 21, 3, 31, 13, 7, 571, 633, 425, 6547, 3423, 19355, 49481, 76289}},
+{8808, 17, 26236, {1, 1, 3, 9, 7, 51, 113, 173, 169, 97, 1821, 979, 2553, 11505, 20047, 39277, 122905}},
+{8809, 17, 26239, {1, 1, 5, 13, 17, 9, 111, 205, 261, 671, 657, 507, 3903, 10767, 4387, 3045, 102617}},
+{8810, 17, 26267, {1, 1, 3, 3, 5, 11, 19, 61, 401, 605, 455, 2457, 4471, 7255, 18435, 49673, 97289}},
+{8811, 17, 26291, {1, 3, 1, 1, 31, 25, 77, 35, 65, 127, 929, 2325, 2315, 13819, 5509, 12515, 36991}},
+{8812, 17, 26293, {1, 1, 7, 5, 21, 49, 33, 119, 181, 645, 1425, 2411, 245, 13755, 18775, 50061, 47119}},
+{8813, 17, 26298, {1, 3, 7, 5, 27, 43, 81, 191, 233, 435, 829, 3881, 713, 11153, 4637, 37721, 115567}},
+{8814, 17, 26303, {1, 3, 7, 1, 27, 59, 51, 165, 59, 931, 1921, 3059, 6843, 813, 22063, 29445, 114765}},
+{8815, 17, 26308, {1, 1, 5, 11, 31, 53, 89, 69, 29, 893, 1241, 7, 1707, 16167, 8371, 14021, 103281}},
+{8816, 17, 26312, {1, 3, 1, 1, 23, 21, 3, 35, 73, 769, 1417, 4051, 3223, 813, 1141, 18823, 31951}},
+{8817, 17, 26315, {1, 3, 7, 11, 9, 17, 89, 85, 407, 137, 1865, 2881, 1495, 3757, 3711, 36651, 1797}},
+{8818, 17, 26342, {1, 3, 5, 1, 25, 29, 29, 217, 15, 173, 479, 2363, 2341, 6193, 16403, 64097, 1173}},
+{8819, 17, 26354, {1, 3, 3, 3, 11, 29, 113, 167, 333, 573, 1467, 2223, 5693, 1063, 20299, 40993, 69055}},
+{8820, 17, 26363, {1, 1, 3, 7, 3, 51, 45, 139, 79, 393, 1251, 1087, 1423, 1827, 23445, 41635, 78511}},
+{8821, 17, 26365, {1, 3, 3, 13, 29, 45, 85, 229, 33, 373, 113, 1205, 997, 11777, 7663, 18513, 5797}},
+{8822, 17, 26383, {1, 1, 5, 5, 15, 5, 127, 85, 49, 345, 901, 3215, 2347, 2329, 19597, 39555, 25031}},
+{8823, 17, 26391, {1, 1, 7, 11, 9, 25, 71, 183, 341, 1011, 439, 3649, 2859, 10183, 7635, 45297, 38581}},
+{8824, 17, 26398, {1, 1, 1, 11, 23, 13, 1, 69, 461, 77, 1641, 2851, 1889, 2413, 1131, 39009, 33773}},
+{8825, 17, 26416, {1, 3, 7, 7, 25, 19, 67, 233, 141, 207, 1501, 453, 4773, 7411, 22839, 25365, 53189}},
+{8826, 17, 26421, {1, 1, 7, 3, 3, 17, 13, 167, 73, 1005, 887, 2595, 4351, 3249, 5653, 36025, 33733}},
+{8827, 17, 26425, {1, 1, 7, 15, 11, 1, 105, 215, 329, 601, 1477, 723, 4597, 3525, 26235, 63957, 26677}},
+{8828, 17, 26434, {1, 1, 1, 11, 27, 15, 111, 133, 327, 567, 845, 2135, 7905, 7297, 29255, 14947, 104885}},
+{8829, 17, 26439, {1, 1, 7, 9, 21, 11, 67, 179, 459, 423, 295, 3445, 1681, 12907, 29281, 7445, 35539}},
+{8830, 17, 26453, {1, 1, 3, 11, 23, 61, 111, 123, 81, 439, 299, 3557, 2821, 705, 15393, 37175, 11533}},
+{8831, 17, 26454, {1, 1, 3, 1, 13, 15, 113, 227, 285, 313, 687, 2085, 6363, 8003, 32661, 36461, 68759}},
+{8832, 17, 26470, {1, 3, 3, 1, 27, 7, 101, 177, 363, 461, 1519, 2339, 473, 7469, 4335, 30951, 130987}},
+{8833, 17, 26491, {1, 1, 1, 3, 31, 39, 59, 159, 207, 93, 581, 1973, 945, 11343, 15901, 22001, 3515}},
+{8834, 17, 26493, {1, 3, 7, 5, 11, 53, 125, 57, 389, 985, 1055, 3803, 3879, 5537, 28221, 36805, 16025}},
+{8835, 17, 26500, {1, 1, 1, 9, 1, 63, 81, 57, 59, 813, 865, 3491, 3771, 6121, 6847, 14765, 68567}},
+{8836, 17, 26509, {1, 1, 7, 7, 13, 17, 23, 211, 435, 167, 933, 357, 3567, 3019, 28439, 17701, 119937}},
+{8837, 17, 26518, {1, 1, 1, 9, 7, 53, 103, 155, 211, 719, 413, 3673, 2795, 15687, 1737, 50855, 129133}},
+{8838, 17, 26531, {1, 1, 3, 13, 11, 23, 53, 121, 497, 383, 1655, 937, 5563, 2549, 23183, 46149, 78875}},
+{8839, 17, 26533, {1, 3, 5, 11, 25, 1, 45, 139, 437, 729, 2009, 3245, 4091, 551, 25993, 31655, 33641}},
+{8840, 17, 26540, {1, 3, 1, 13, 7, 23, 87, 111, 471, 501, 1767, 1051, 7037, 3199, 19609, 43227, 53667}},
+{8841, 17, 26552, {1, 3, 7, 1, 25, 1, 49, 189, 55, 375, 601, 2065, 2991, 7697, 25739, 14951, 43705}},
+{8842, 17, 26566, {1, 1, 7, 5, 29, 21, 51, 111, 81, 809, 1963, 2143, 5529, 15701, 4719, 11857, 88207}},
+{8843, 17, 26569, {1, 1, 5, 11, 27, 27, 7, 145, 281, 939, 537, 1255, 1475, 11383, 15081, 9105, 102775}},
+{8844, 17, 26583, {1, 1, 5, 7, 9, 45, 67, 23, 65, 139, 1871, 3975, 6357, 6515, 25423, 23915, 76289}},
+{8845, 17, 26590, {1, 1, 5, 11, 31, 31, 89, 65, 451, 341, 819, 2439, 6753, 15113, 9085, 32687, 5055}},
+{8846, 17, 26596, {1, 1, 5, 1, 15, 29, 123, 83, 495, 185, 303, 315, 6015, 5257, 2467, 4903, 78269}},
+{8847, 17, 26624, {1, 1, 3, 5, 31, 51, 49, 199, 501, 407, 733, 1181, 8023, 7321, 14765, 17535, 19893}},
+{8848, 17, 26636, {1, 1, 5, 5, 19, 15, 103, 183, 13, 969, 1537, 3053, 3173, 12983, 21761, 33733, 67799}},
+{8849, 17, 26667, {1, 3, 1, 1, 27, 55, 37, 149, 379, 11, 1655, 2317, 3135, 6459, 25941, 12679, 60245}},
+{8850, 17, 26669, {1, 1, 3, 9, 9, 13, 33, 243, 337, 741, 1685, 1147, 5465, 4865, 559, 23993, 47273}},
+{8851, 17, 26672, {1, 3, 5, 13, 21, 11, 39, 169, 135, 209, 1909, 3655, 3117, 1075, 8165, 54633, 28189}},
+{8852, 17, 26675, {1, 3, 1, 15, 9, 23, 11, 123, 63, 133, 947, 907, 3853, 10291, 22905, 4561, 92497}},
+{8853, 17, 26687, {1, 1, 3, 13, 17, 9, 5, 209, 429, 3, 2035, 1497, 6765, 5991, 24991, 8155, 103417}},
+{8854, 17, 26689, {1, 1, 5, 13, 27, 47, 79, 11, 41, 791, 1939, 3099, 4069, 4665, 20801, 18659, 72163}},
+{8855, 17, 26696, {1, 3, 1, 13, 25, 37, 79, 131, 233, 647, 291, 1419, 5157, 4261, 27715, 611, 83157}},
+{8856, 17, 26702, {1, 1, 5, 1, 17, 61, 45, 163, 137, 937, 91, 1695, 1553, 543, 28615, 6855, 75201}},
+{8857, 17, 26714, {1, 1, 3, 13, 7, 63, 109, 13, 351, 159, 1111, 2791, 4701, 5805, 9707, 18361, 98091}},
+{8858, 17, 26716, {1, 1, 3, 11, 11, 21, 55, 247, 111, 801, 93, 3091, 1043, 9761, 23679, 5555, 195}},
+{8859, 17, 26729, {1, 1, 1, 1, 13, 43, 123, 113, 265, 561, 659, 3755, 6605, 10949, 30511, 29495, 9075}},
+{8860, 17, 26732, {1, 3, 1, 7, 23, 63, 19, 73, 233, 1017, 851, 1971, 3999, 7407, 25309, 63991, 92867}},
+{8861, 17, 26737, {1, 3, 3, 3, 19, 63, 127, 107, 465, 463, 1507, 1323, 4729, 14717, 9129, 24859, 117565}},
+{8862, 17, 26747, {1, 1, 7, 1, 19, 11, 13, 85, 339, 939, 895, 887, 765, 15501, 8783, 65087, 77899}},
+{8863, 17, 26773, {1, 3, 7, 3, 7, 15, 43, 153, 365, 223, 1947, 2295, 787, 5549, 20089, 29203, 4807}},
+{8864, 17, 26780, {1, 3, 7, 3, 31, 27, 51, 217, 483, 623, 633, 2123, 1211, 9173, 17949, 54251, 89161}},
+{8865, 17, 26801, {1, 3, 3, 11, 3, 11, 111, 73, 283, 23, 1925, 253, 5141, 12545, 24913, 16847, 13067}},
+{8866, 17, 26811, {1, 3, 5, 5, 31, 39, 35, 235, 135, 85, 191, 999, 6633, 12527, 21401, 61339, 81239}},
+{8867, 17, 26813, {1, 1, 3, 15, 9, 13, 39, 125, 137, 639, 555, 813, 2821, 1199, 32075, 15079, 104609}},
+{8868, 17, 26831, {1, 3, 7, 7, 15, 43, 99, 51, 245, 25, 147, 89, 6841, 5523, 28493, 13967, 113109}},
+{8869, 17, 26836, {1, 1, 3, 13, 7, 5, 27, 121, 269, 231, 1011, 1365, 5055, 11619, 27393, 48033, 65725}},
+{8870, 17, 26839, {1, 1, 7, 5, 9, 23, 41, 71, 327, 339, 1681, 3303, 4143, 421, 15213, 48405, 98067}},
+{8871, 17, 26849, {1, 3, 7, 15, 15, 33, 73, 33, 351, 131, 1051, 3909, 7535, 7659, 9443, 35015, 329}},
+{8872, 17, 26862, {1, 1, 3, 9, 19, 55, 97, 223, 265, 877, 235, 867, 4961, 3137, 19885, 10955, 7655}},
+{8873, 17, 26869, {1, 3, 5, 13, 1, 11, 75, 215, 271, 793, 1691, 1437, 1317, 10977, 1311, 64865, 92361}},
+{8874, 17, 26873, {1, 1, 1, 5, 23, 23, 35, 53, 187, 345, 115, 929, 3919, 4523, 31709, 16771, 33399}},
+{8875, 17, 26874, {1, 3, 5, 11, 17, 7, 75, 57, 351, 359, 1737, 2665, 4259, 13905, 6999, 45359, 117891}},
+{8876, 17, 26888, {1, 1, 5, 3, 23, 29, 49, 209, 417, 843, 531, 1649, 7829, 6271, 3759, 39727, 47415}},
+{8877, 17, 26891, {1, 1, 7, 1, 21, 45, 101, 105, 385, 797, 985, 1447, 3757, 3287, 583, 29283, 96821}},
+{8878, 17, 26896, {1, 1, 7, 9, 1, 29, 15, 207, 289, 465, 815, 2289, 449, 9403, 19197, 13797, 102651}},
+{8879, 17, 26899, {1, 3, 7, 15, 5, 45, 81, 187, 21, 433, 679, 2759, 3375, 6935, 22595, 50149, 13557}},
+{8880, 17, 26912, {1, 3, 3, 5, 11, 55, 69, 219, 95, 21, 645, 1955, 7527, 6037, 29427, 36297, 62013}},
+{8881, 17, 26921, {1, 1, 7, 15, 13, 35, 25, 67, 383, 13, 539, 2399, 4611, 8065, 3815, 27771, 50411}},
+{8882, 17, 26935, {1, 3, 1, 3, 27, 47, 65, 33, 393, 895, 1663, 1289, 1057, 11887, 1259, 53611, 36811}},
+{8883, 17, 26941, {1, 3, 5, 3, 5, 1, 27, 65, 379, 15, 1643, 1461, 3009, 8177, 15589, 5889, 1103}},
+{8884, 17, 26949, {1, 1, 5, 15, 27, 53, 43, 173, 377, 665, 581, 1061, 1363, 15015, 26709, 29507, 28075}},
+{8885, 17, 26954, {1, 1, 7, 3, 9, 11, 45, 71, 23, 995, 1277, 855, 1001, 12927, 19753, 46639, 16949}},
+{8886, 17, 26967, {1, 1, 7, 5, 15, 33, 27, 27, 437, 415, 1785, 2091, 279, 8041, 2209, 15821, 122363}},
+{8887, 17, 26977, {1, 1, 7, 1, 21, 1, 47, 215, 463, 959, 849, 1703, 5175, 10043, 16991, 11023, 52201}},
+{8888, 17, 27011, {1, 1, 1, 11, 21, 7, 121, 31, 95, 631, 1717, 3017, 2083, 2047, 12051, 63117, 25949}},
+{8889, 17, 27018, {1, 1, 5, 5, 9, 5, 105, 121, 205, 643, 1721, 2601, 2991, 2381, 4873, 12049, 20043}},
+{8890, 17, 27026, {1, 3, 5, 11, 7, 11, 97, 187, 253, 571, 101, 3077, 1479, 9513, 15451, 37105, 34445}},
+{8891, 17, 27028, {1, 1, 7, 11, 19, 19, 39, 115, 221, 13, 217, 369, 6855, 14529, 143, 13461, 62927}},
+{8892, 17, 27032, {1, 3, 3, 7, 29, 27, 9, 171, 419, 571, 837, 3829, 1871, 12691, 30693, 4195, 38905}},
+{8893, 17, 27044, {1, 1, 1, 11, 5, 55, 17, 41, 241, 419, 337, 897, 4663, 14469, 18701, 18009, 44605}},
+{8894, 17, 27053, {1, 1, 7, 7, 1, 33, 63, 197, 257, 655, 1287, 2571, 57, 13275, 29669, 8501, 61389}},
+{8895, 17, 27062, {1, 3, 5, 3, 29, 39, 101, 215, 101, 271, 1373, 2171, 841, 9865, 28951, 20369, 42413}},
+{8896, 17, 27065, {1, 3, 5, 1, 31, 23, 119, 137, 263, 633, 1239, 281, 4965, 14913, 30229, 14147, 37183}},
+{8897, 17, 27068, {1, 3, 1, 3, 11, 55, 33, 45, 69, 913, 269, 1021, 4005, 15191, 11187, 45917, 76905}},
+{8898, 17, 27080, {1, 1, 1, 13, 27, 11, 75, 139, 243, 221, 1289, 2195, 7041, 10053, 5731, 35245, 41317}},
+{8899, 17, 27083, {1, 1, 7, 9, 25, 11, 81, 243, 233, 137, 831, 2825, 6007, 7305, 31733, 64343, 7047}},
+{8900, 17, 27093, {1, 3, 5, 9, 17, 61, 25, 245, 285, 969, 1397, 1331, 5393, 3653, 15533, 9121, 111115}},
+{8901, 17, 27098, {1, 1, 5, 9, 1, 9, 61, 205, 285, 849, 1071, 1013, 2655, 10121, 15165, 25189, 56207}},
+{8902, 17, 27107, {1, 3, 5, 7, 19, 45, 121, 19, 237, 711, 1523, 3251, 693, 13567, 31993, 11239, 64127}},
+{8903, 17, 27110, {1, 1, 1, 11, 23, 25, 33, 211, 321, 1021, 1855, 291, 2911, 11841, 21929, 64147, 63201}},
+{8904, 17, 27114, {1, 1, 7, 3, 27, 21, 119, 219, 431, 819, 83, 2487, 7533, 10697, 3129, 53301, 104999}},
+{8905, 17, 27121, {1, 3, 5, 15, 9, 25, 89, 65, 293, 411, 989, 3103, 5563, 15703, 8757, 32595, 43409}},
+{8906, 17, 27127, {1, 3, 3, 1, 31, 31, 45, 173, 231, 171, 1185, 1499, 1713, 9945, 11575, 37113, 103989}},
+{8907, 17, 27137, {1, 1, 5, 13, 27, 3, 93, 253, 23, 71, 1963, 2571, 6259, 15757, 9709, 42835, 42047}},
+{8908, 17, 27144, {1, 1, 7, 11, 5, 11, 123, 117, 39, 559, 111, 527, 6253, 781, 9177, 47189, 94031}},
+{8909, 17, 27155, {1, 1, 5, 15, 5, 49, 93, 185, 167, 787, 1553, 3291, 3723, 1651, 23225, 5643, 42967}},
+{8910, 17, 27171, {1, 3, 1, 13, 15, 35, 19, 193, 505, 127, 661, 1943, 1249, 5103, 8233, 64319, 76955}},
+{8911, 17, 27178, {1, 3, 7, 7, 17, 13, 97, 185, 415, 331, 283, 3341, 2903, 2927, 7729, 4095, 103083}},
+{8912, 17, 27180, {1, 1, 3, 15, 15, 25, 65, 45, 413, 521, 747, 2605, 5845, 12909, 7651, 45937, 99043}},
+{8913, 17, 27185, {1, 1, 5, 9, 9, 21, 3, 75, 335, 745, 1493, 1721, 1977, 11105, 22621, 49281, 107113}},
+{8914, 17, 27191, {1, 3, 1, 11, 25, 11, 99, 53, 239, 831, 655, 615, 7565, 14039, 29115, 26165, 127159}},
+{8915, 17, 27192, {1, 1, 7, 5, 31, 35, 75, 157, 441, 815, 119, 565, 2703, 14059, 7867, 42487, 93647}},
+{8916, 17, 27195, {1, 3, 7, 3, 3, 59, 101, 223, 257, 989, 363, 1059, 5157, 11129, 1481, 19287, 117623}},
+{8917, 17, 27212, {1, 1, 1, 1, 29, 27, 1, 129, 253, 673, 103, 1881, 7053, 1261, 32003, 23345, 102503}},
+{8918, 17, 27215, {1, 3, 1, 9, 11, 37, 3, 99, 303, 519, 1175, 3021, 2275, 9919, 25011, 45865, 71351}},
+{8919, 17, 27218, {1, 1, 7, 15, 27, 9, 107, 61, 385, 21, 861, 2119, 4643, 8379, 25455, 22425, 113387}},
+{8920, 17, 27230, {1, 1, 1, 7, 27, 15, 73, 211, 497, 527, 873, 329, 2213, 415, 13987, 56581, 27829}},
+{8921, 17, 27234, {1, 3, 5, 1, 31, 43, 107, 149, 209, 211, 2029, 2793, 2213, 12389, 27177, 51375, 51983}},
+{8922, 17, 27245, {1, 3, 3, 7, 25, 57, 67, 101, 127, 43, 1775, 801, 3343, 12203, 8667, 58387, 10735}},
+{8923, 17, 27248, {1, 1, 7, 5, 13, 47, 101, 123, 133, 593, 1409, 3525, 2545, 13009, 11873, 38463, 1075}},
+{8924, 17, 27263, {1, 3, 3, 1, 3, 19, 75, 221, 157, 67, 397, 1141, 5073, 10795, 9857, 35459, 62701}},
+{8925, 17, 27279, {1, 1, 7, 7, 23, 17, 41, 179, 83, 543, 1839, 3709, 131, 15681, 9147, 18685, 90389}},
+{8926, 17, 27288, {1, 1, 5, 7, 17, 15, 31, 217, 79, 687, 1927, 2889, 6127, 15095, 28437, 16403, 123275}},
+{8927, 17, 27294, {1, 3, 7, 15, 13, 17, 123, 75, 45, 635, 525, 3897, 6769, 13855, 16695, 18039, 37479}},
+{8928, 17, 27303, {1, 1, 5, 1, 23, 15, 69, 161, 503, 339, 1061, 839, 9, 10013, 24493, 32711, 50147}},
+{8929, 17, 27304, {1, 3, 3, 11, 5, 45, 9, 233, 131, 629, 1111, 3311, 2211, 9079, 19763, 23793, 85389}},
+{8930, 17, 27312, {1, 1, 7, 7, 7, 27, 15, 85, 291, 925, 1545, 3061, 4867, 1613, 13467, 53731, 92811}},
+{8931, 17, 27330, {1, 3, 5, 1, 21, 21, 71, 33, 141, 675, 1519, 3275, 1491, 10717, 28199, 14983, 18961}},
+{8932, 17, 27341, {1, 3, 5, 5, 31, 13, 109, 239, 369, 373, 257, 3765, 2531, 13281, 11877, 29439, 106939}},
+{8933, 17, 27342, {1, 3, 7, 15, 13, 39, 111, 203, 109, 179, 789, 3849, 433, 5745, 2343, 15795, 92603}},
+{8934, 17, 27344, {1, 3, 5, 5, 11, 57, 3, 245, 289, 249, 713, 315, 2261, 1249, 6963, 44507, 100829}},
+{8935, 17, 27353, {1, 3, 5, 11, 5, 49, 97, 245, 363, 315, 509, 17, 4485, 15393, 28491, 17945, 65663}},
+{8936, 17, 27356, {1, 3, 5, 1, 5, 13, 15, 17, 141, 119, 1393, 581, 2439, 2015, 11527, 8537, 103005}},
+{8937, 17, 27366, {1, 3, 5, 1, 25, 9, 117, 25, 99, 777, 985, 1159, 99, 3013, 21429, 19027, 61833}},
+{8938, 17, 27369, {1, 1, 1, 5, 1, 47, 37, 83, 159, 29, 281, 3789, 2525, 15999, 8965, 11145, 14453}},
+{8939, 17, 27377, {1, 1, 3, 1, 11, 63, 77, 207, 267, 473, 241, 629, 6969, 9093, 839, 3875, 18873}},
+{8940, 17, 27387, {1, 3, 5, 7, 31, 57, 103, 65, 349, 321, 717, 2403, 105, 643, 27999, 2509, 123061}},
+{8941, 17, 27409, {1, 1, 5, 7, 3, 31, 7, 113, 17, 995, 1211, 1749, 6757, 3391, 8011, 47715, 24301}},
+{8942, 17, 27437, {1, 3, 7, 11, 7, 55, 29, 155, 373, 81, 1255, 2205, 3233, 9537, 22129, 24505, 79021}},
+{8943, 17, 27443, {1, 1, 7, 5, 3, 49, 5, 51, 89, 107, 585, 3933, 745, 11685, 20663, 12521, 24357}},
+{8944, 17, 27446, {1, 1, 7, 1, 17, 17, 83, 215, 357, 581, 2025, 3411, 7287, 11925, 2253, 43513, 98655}},
+{8945, 17, 27450, {1, 3, 5, 3, 27, 27, 51, 147, 471, 509, 423, 3807, 677, 8429, 581, 47999, 35913}},
+{8946, 17, 27452, {1, 3, 3, 9, 15, 31, 1, 93, 207, 759, 1991, 473, 2273, 43, 12547, 58085, 20953}},
+{8947, 17, 27457, {1, 1, 3, 3, 1, 27, 39, 219, 381, 187, 159, 2333, 6141, 3775, 5693, 14853, 38765}},
+{8948, 17, 27472, {1, 3, 1, 5, 19, 1, 19, 237, 231, 975, 1609, 723, 241, 10105, 18817, 58373, 118889}},
+{8949, 17, 27475, {1, 1, 5, 7, 7, 43, 99, 181, 109, 529, 421, 1493, 1075, 12219, 24287, 33479, 29987}},
+{8950, 17, 27487, {1, 1, 7, 1, 17, 11, 79, 85, 157, 851, 1429, 3355, 139, 14327, 30025, 60303, 109015}},
+{8951, 17, 27488, {1, 3, 5, 9, 11, 15, 37, 79, 5, 169, 999, 815, 6255, 11763, 16299, 49891, 101917}},
+{8952, 17, 27493, {1, 3, 5, 9, 29, 45, 51, 211, 159, 771, 1631, 2871, 4877, 4941, 18127, 15669, 57515}},
+{8953, 17, 27506, {1, 1, 3, 3, 19, 29, 9, 205, 253, 399, 303, 2441, 3187, 641, 23341, 52951, 57559}},
+{8954, 17, 27508, {1, 3, 3, 15, 11, 29, 121, 227, 69, 935, 365, 217, 4617, 13193, 27663, 46903, 107843}},
+{8955, 17, 27521, {1, 1, 5, 11, 13, 31, 13, 243, 275, 685, 1613, 1915, 2775, 11225, 4729, 45549, 103875}},
+{8956, 17, 27522, {1, 1, 5, 1, 9, 61, 35, 143, 165, 441, 517, 1735, 5281, 10139, 21107, 11713, 130483}},
+{8957, 17, 27527, {1, 3, 5, 5, 13, 21, 7, 219, 97, 887, 1845, 469, 2523, 1569, 9959, 4397, 15823}},
+{8958, 17, 27536, {1, 3, 7, 11, 15, 27, 73, 223, 365, 939, 331, 145, 683, 6441, 23421, 59177, 31763}},
+{8959, 17, 27539, {1, 3, 1, 5, 9, 59, 85, 113, 343, 831, 121, 3157, 6059, 14923, 27401, 19759, 14223}},
+{8960, 17, 27541, {1, 3, 1, 7, 17, 25, 3, 39, 471, 759, 2041, 609, 4293, 7491, 8041, 50857, 25601}},
+{8961, 17, 27546, {1, 1, 5, 15, 19, 45, 21, 5, 269, 197, 527, 1839, 1719, 15105, 18671, 42167, 9617}},
+{8962, 17, 27557, {1, 3, 1, 3, 5, 35, 3, 105, 395, 113, 1945, 3945, 3951, 12207, 32135, 34121, 10237}},
+{8963, 17, 27564, {1, 1, 5, 13, 21, 43, 51, 255, 57, 399, 1937, 1573, 363, 11589, 26989, 54345, 94341}},
+{8964, 17, 27572, {1, 3, 3, 3, 5, 45, 83, 125, 179, 923, 39, 3617, 7683, 8191, 31469, 23633, 79179}},
+{8965, 17, 27576, {1, 3, 7, 9, 9, 37, 107, 65, 423, 77, 1779, 1375, 2085, 11779, 6535, 2973, 29425}},
+{8966, 17, 27584, {1, 1, 7, 3, 11, 39, 101, 137, 407, 855, 1767, 1717, 2821, 10447, 31187, 6329, 124111}},
+{8967, 17, 27608, {1, 1, 5, 11, 27, 27, 45, 103, 225, 681, 725, 1791, 2881, 2923, 14473, 12269, 58743}},
+{8968, 17, 27611, {1, 1, 3, 11, 15, 39, 113, 167, 143, 677, 1189, 1571, 5339, 6065, 30187, 19639, 42227}},
+{8969, 17, 27618, {1, 1, 1, 3, 13, 7, 113, 75, 129, 619, 1741, 1495, 4751, 11085, 22391, 199, 105463}},
+{8970, 17, 27620, {1, 1, 3, 3, 19, 47, 77, 195, 209, 453, 495, 1605, 5255, 15327, 8941, 18239, 54511}},
+{8971, 17, 27627, {1, 1, 7, 7, 21, 29, 95, 175, 3, 689, 611, 2467, 6919, 12399, 18869, 16171, 102753}},
+{8972, 17, 27630, {1, 1, 5, 1, 27, 43, 61, 133, 37, 603, 315, 1915, 813, 15769, 27447, 29589, 122281}},
+{8973, 17, 27637, {1, 1, 7, 3, 11, 1, 119, 235, 93, 481, 1811, 1643, 4853, 11313, 8991, 6153, 68985}},
+{8974, 17, 27638, {1, 1, 1, 7, 1, 13, 99, 83, 221, 775, 1345, 219, 4445, 11837, 10405, 43563, 122111}},
+{8975, 17, 27641, {1, 1, 5, 13, 21, 33, 105, 19, 343, 571, 703, 429, 2485, 15531, 9801, 24101, 88275}},
+{8976, 17, 27647, {1, 3, 5, 1, 27, 55, 73, 49, 33, 773, 1411, 1227, 6827, 1271, 28897, 24265, 32383}},
+{8977, 17, 27650, {1, 3, 7, 3, 9, 45, 59, 5, 157, 669, 261, 2077, 1425, 8221, 5849, 40857, 121029}},
+{8978, 17, 27676, {1, 3, 7, 11, 23, 5, 87, 113, 279, 611, 1195, 1775, 5813, 6737, 18051, 41341, 93331}},
+{8979, 17, 27683, {1, 1, 7, 7, 9, 55, 113, 3, 167, 295, 1579, 2833, 4003, 7583, 22833, 44427, 34781}},
+{8980, 17, 27690, {1, 1, 5, 13, 21, 33, 127, 175, 153, 961, 819, 143, 3969, 6159, 29437, 14123, 65317}},
+{8981, 17, 27695, {1, 1, 1, 15, 31, 27, 1, 17, 329, 963, 1907, 421, 535, 2323, 22749, 44375, 115531}},
+{8982, 17, 27700, {1, 1, 5, 15, 15, 23, 57, 171, 253, 401, 1577, 3855, 197, 7979, 17577, 25275, 88831}},
+{8983, 17, 27704, {1, 1, 7, 9, 27, 9, 7, 13, 381, 847, 533, 357, 6551, 13441, 5717, 20209, 64347}},
+{8984, 17, 27709, {1, 1, 7, 9, 1, 1, 31, 245, 315, 901, 1857, 497, 4285, 13227, 3937, 45025, 59627}},
+{8985, 17, 27715, {1, 1, 7, 3, 5, 23, 119, 147, 479, 71, 113, 3379, 863, 8285, 31259, 15863, 47267}},
+{8986, 17, 27727, {1, 3, 5, 1, 5, 7, 77, 163, 421, 353, 1757, 1335, 4975, 3011, 11703, 56075, 12045}},
+{8987, 17, 27745, {1, 1, 5, 3, 31, 25, 81, 59, 211, 463, 1693, 609, 3307, 3641, 19643, 29361, 8399}},
+{8988, 17, 27763, {1, 1, 7, 13, 19, 47, 43, 43, 275, 735, 535, 3689, 3987, 10695, 17243, 60565, 72299}},
+{8989, 17, 27769, {1, 3, 3, 5, 25, 35, 75, 63, 305, 127, 189, 1785, 731, 12089, 27811, 43259, 28191}},
+{8990, 17, 27770, {1, 3, 7, 11, 17, 17, 59, 107, 139, 355, 1055, 3181, 4743, 14785, 26323, 441, 35613}},
+{8991, 17, 27796, {1, 3, 1, 1, 17, 17, 39, 203, 373, 601, 449, 1837, 835, 7061, 14655, 61765, 80735}},
+{8992, 17, 27810, {1, 3, 5, 7, 27, 17, 25, 41, 125, 895, 1843, 3167, 1527, 4707, 6477, 33575, 97247}},
+{8993, 17, 27812, {1, 3, 3, 3, 13, 39, 25, 15, 279, 347, 1121, 3603, 3019, 9577, 16863, 61483, 15995}},
+{8994, 17, 27834, {1, 3, 5, 11, 15, 33, 15, 81, 185, 289, 909, 1237, 3623, 3983, 24211, 62719, 79685}},
+{8995, 17, 27847, {1, 1, 1, 7, 29, 1, 53, 17, 137, 269, 1209, 3937, 4167, 14057, 8061, 38863, 101477}},
+{8996, 17, 27848, {1, 1, 1, 9, 5, 45, 95, 127, 507, 159, 1763, 1527, 5689, 11007, 549, 22837, 99207}},
+{8997, 17, 27862, {1, 3, 3, 1, 15, 57, 127, 39, 73, 397, 67, 3159, 119, 8929, 29425, 57687, 68063}},
+{8998, 17, 27868, {1, 3, 1, 3, 27, 7, 111, 209, 291, 17, 1381, 1597, 5389, 4577, 20463, 28325, 23743}},
+{8999, 17, 27881, {1, 3, 3, 7, 23, 41, 83, 81, 213, 537, 1037, 2371, 1485, 8391, 12471, 58541, 27559}},
+{9000, 17, 27884, {1, 3, 1, 15, 21, 43, 87, 75, 451, 851, 1917, 2739, 2167, 12531, 29931, 8017, 15163}},
+{9001, 17, 27890, {1, 1, 3, 9, 27, 19, 41, 145, 401, 759, 527, 3085, 187, 10615, 4995, 22421, 69867}},
+{9002, 17, 27895, {1, 3, 3, 13, 29, 51, 65, 47, 157, 609, 1061, 1913, 6195, 12503, 10375, 55819, 122091}},
+{9003, 17, 27904, {1, 1, 3, 7, 1, 19, 3, 149, 453, 279, 569, 3429, 331, 711, 26773, 21163, 129339}},
+{9004, 17, 27914, {1, 1, 5, 3, 7, 47, 39, 181, 115, 771, 2037, 411, 2697, 7501, 6393, 19461, 74967}},
+{9005, 17, 27919, {1, 3, 3, 5, 5, 17, 89, 161, 409, 49, 1447, 3977, 4777, 15553, 3521, 32553, 126385}},
+{9006, 17, 27921, {1, 3, 1, 3, 25, 59, 73, 105, 505, 1009, 1147, 317, 3457, 13743, 8337, 38077, 7709}},
+{9007, 17, 27931, {1, 3, 3, 15, 23, 37, 25, 123, 413, 911, 637, 2345, 691, 15199, 22927, 52467, 126715}},
+{9008, 17, 27933, {1, 1, 5, 1, 9, 51, 93, 123, 269, 45, 1947, 179, 5091, 3743, 31491, 39771, 119175}},
+{9009, 17, 27938, {1, 3, 1, 5, 29, 23, 107, 183, 25, 115, 187, 857, 7337, 469, 8755, 17281, 45941}},
+{9010, 17, 27943, {1, 3, 1, 13, 25, 61, 85, 115, 181, 955, 1365, 837, 5941, 13209, 27009, 58865, 115149}},
+{9011, 17, 27949, {1, 1, 1, 11, 31, 63, 101, 29, 37, 185, 465, 2651, 6249, 6887, 25021, 60539, 50037}},
+{9012, 17, 28005, {1, 3, 1, 7, 7, 61, 57, 243, 143, 223, 1759, 4085, 6765, 13293, 31929, 29579, 35053}},
+{9013, 17, 28012, {1, 3, 1, 3, 29, 9, 121, 3, 285, 199, 1439, 3151, 5059, 8535, 17049, 38917, 46347}},
+{9014, 17, 28017, {1, 3, 1, 3, 17, 43, 63, 87, 427, 341, 1251, 3775, 7729, 3183, 10579, 917, 49035}},
+{9015, 17, 28024, {1, 1, 7, 3, 5, 59, 119, 227, 495, 345, 841, 2021, 2483, 15987, 24663, 9819, 33009}},
+{9016, 17, 28030, {1, 1, 5, 11, 19, 57, 23, 181, 63, 991, 1, 2927, 4785, 9645, 17435, 55627, 1069}},
+{9017, 17, 28034, {1, 1, 7, 1, 31, 11, 57, 123, 279, 815, 1407, 3509, 3963, 8503, 20345, 7777, 103701}},
+{9018, 17, 28045, {1, 1, 5, 5, 19, 51, 37, 15, 363, 939, 1863, 3485, 7073, 3035, 31279, 7289, 39811}},
+{9019, 17, 28048, {1, 1, 3, 3, 3, 41, 29, 37, 311, 535, 1993, 3937, 309, 13055, 22595, 59641, 95317}},
+{9020, 17, 28054, {1, 3, 7, 9, 19, 29, 23, 181, 503, 223, 1655, 997, 7861, 5867, 16979, 4559, 7447}},
+{9021, 17, 28063, {1, 3, 5, 3, 13, 13, 3, 137, 361, 101, 1005, 2339, 609, 11891, 15245, 9653, 63579}},
+{9022, 17, 28069, {1, 1, 1, 15, 31, 15, 117, 151, 51, 805, 1403, 3243, 4007, 11979, 3945, 61935, 43225}},
+{9023, 17, 28070, {1, 1, 7, 3, 1, 43, 93, 105, 9, 555, 731, 655, 2097, 8015, 27557, 27985, 11323}},
+{9024, 17, 28073, {1, 3, 3, 9, 23, 35, 59, 217, 437, 755, 685, 1431, 2965, 5269, 25621, 21735, 1397}},
+{9025, 17, 28084, {1, 1, 5, 1, 9, 61, 41, 53, 101, 111, 531, 3385, 4771, 9535, 15995, 29687, 99035}},
+{9026, 17, 28096, {1, 1, 7, 7, 1, 3, 25, 251, 463, 99, 677, 1889, 3697, 5579, 11429, 38301, 57917}},
+{9027, 17, 28114, {1, 1, 5, 9, 11, 15, 65, 31, 369, 825, 1229, 1595, 3891, 5235, 16973, 25307, 7805}},
+{9028, 17, 28126, {1, 3, 7, 15, 27, 37, 35, 103, 393, 781, 1713, 2009, 1973, 15461, 6801, 17557, 105139}},
+{9029, 17, 28141, {1, 3, 7, 7, 17, 51, 83, 29, 113, 173, 1733, 2137, 3041, 11361, 15999, 25779, 112493}},
+{9030, 17, 28149, {1, 3, 5, 11, 19, 3, 89, 103, 449, 375, 437, 4077, 889, 12163, 29323, 48845, 7783}},
+{9031, 17, 28165, {1, 3, 7, 1, 19, 25, 83, 35, 203, 27, 507, 25, 6629, 13941, 6187, 17533, 83349}},
+{9032, 17, 28177, {1, 3, 5, 9, 15, 59, 3, 87, 473, 733, 1263, 1733, 4275, 9283, 32535, 20807, 59487}},
+{9033, 17, 28189, {1, 3, 3, 9, 19, 11, 27, 83, 355, 949, 1339, 171, 921, 14171, 16271, 41485, 20405}},
+{9034, 17, 28190, {1, 1, 3, 11, 25, 51, 9, 241, 367, 519, 1895, 429, 7689, 9469, 32709, 46363, 75767}},
+{9035, 17, 28203, {1, 1, 7, 7, 27, 59, 85, 87, 467, 273, 1763, 391, 451, 16165, 7501, 44779, 68281}},
+{9036, 17, 28206, {1, 1, 7, 5, 1, 35, 5, 217, 31, 145, 1151, 2255, 3543, 401, 17141, 5981, 25183}},
+{9037, 17, 28208, {1, 1, 1, 13, 11, 11, 19, 93, 95, 751, 31, 1091, 2733, 10517, 2553, 5247, 42651}},
+{9038, 17, 28220, {1, 3, 7, 5, 15, 1, 67, 21, 303, 137, 355, 1989, 5211, 4985, 645, 6867, 126931}},
+{9039, 17, 28226, {1, 1, 3, 15, 21, 23, 59, 209, 121, 623, 575, 2447, 6149, 10481, 4959, 22913, 64963}},
+{9040, 17, 28231, {1, 3, 1, 1, 25, 55, 47, 95, 215, 609, 639, 1023, 1579, 5953, 3063, 13721, 17607}},
+{9041, 17, 28249, {1, 1, 1, 11, 7, 61, 127, 173, 307, 623, 453, 3827, 4847, 16085, 4407, 4043, 14881}},
+{9042, 17, 28256, {1, 1, 7, 11, 5, 15, 51, 125, 439, 795, 203, 91, 3543, 6925, 32055, 52277, 26841}},
+{9043, 17, 28259, {1, 1, 1, 13, 15, 9, 107, 183, 391, 751, 243, 1105, 8031, 7443, 137, 45695, 80163}},
+{9044, 17, 28265, {1, 3, 5, 9, 5, 61, 117, 113, 121, 291, 225, 1705, 4017, 13113, 11035, 28613, 25927}},
+{9045, 17, 28266, {1, 1, 3, 11, 27, 9, 45, 85, 309, 991, 1639, 1183, 8013, 14587, 7563, 21111, 48497}},
+{9046, 17, 28271, {1, 3, 1, 9, 21, 61, 123, 189, 265, 593, 163, 3681, 2271, 2795, 753, 48019, 129507}},
+{9047, 17, 28274, {1, 1, 1, 5, 31, 51, 127, 79, 333, 177, 1723, 1365, 2055, 3063, 10693, 61223, 60659}},
+{9048, 17, 28280, {1, 3, 7, 15, 9, 11, 11, 223, 31, 397, 319, 3283, 3765, 4729, 4711, 58323, 114063}},
+{9049, 17, 28296, {1, 1, 7, 11, 7, 63, 107, 215, 19, 491, 131, 2491, 6373, 11081, 2159, 1311, 109547}},
+{9050, 17, 28316, {1, 3, 5, 5, 21, 13, 105, 21, 193, 447, 1331, 2439, 4165, 15689, 21273, 4007, 55161}},
+{9051, 17, 28319, {1, 3, 5, 11, 19, 47, 25, 211, 335, 437, 1041, 2093, 7239, 2869, 18273, 40505, 13681}},
+{9052, 17, 28343, {1, 3, 3, 15, 7, 13, 127, 59, 439, 163, 1841, 1945, 4915, 16269, 18315, 15057, 43197}},
+{9053, 17, 28344, {1, 1, 3, 3, 15, 33, 101, 241, 131, 353, 1749, 3965, 1231, 8167, 9309, 40337, 4419}},
+{9054, 17, 28357, {1, 3, 1, 1, 1, 43, 33, 129, 137, 889, 799, 2937, 3633, 4769, 2411, 56059, 585}},
+{9055, 17, 28358, {1, 1, 3, 9, 25, 31, 45, 199, 229, 175, 1099, 1143, 1721, 11811, 22757, 59843, 117813}},
+{9056, 17, 28364, {1, 1, 7, 7, 19, 45, 43, 101, 219, 209, 1169, 599, 5523, 2463, 15161, 16675, 85111}},
+{9057, 17, 28370, {1, 1, 3, 15, 23, 27, 91, 51, 397, 705, 651, 2345, 3875, 10005, 29523, 42805, 76891}},
+{9058, 17, 28372, {1, 3, 3, 5, 29, 49, 17, 233, 149, 821, 1953, 1931, 7127, 957, 6477, 21259, 126657}},
+{9059, 17, 28379, {1, 3, 3, 3, 27, 49, 57, 145, 143, 1, 583, 3987, 651, 12285, 20139, 51063, 21449}},
+{9060, 17, 28388, {1, 1, 3, 5, 29, 61, 41, 93, 277, 111, 395, 2929, 5325, 15183, 3981, 23799, 72781}},
+{9061, 17, 28392, {1, 1, 7, 5, 25, 43, 85, 137, 401, 261, 1183, 3959, 1983, 16209, 30523, 429, 109181}},
+{9062, 17, 28395, {1, 1, 1, 5, 7, 19, 79, 237, 373, 929, 907, 1771, 6991, 211, 5269, 2135, 32051}},
+{9063, 17, 28406, {1, 1, 7, 5, 17, 15, 41, 49, 363, 15, 1483, 1017, 2439, 11713, 19983, 26275, 11945}},
+{9064, 17, 28418, {1, 1, 7, 7, 19, 5, 55, 15, 15, 573, 1075, 3225, 6815, 11893, 18417, 50833, 71903}},
+{9065, 17, 28423, {1, 1, 7, 9, 23, 37, 75, 3, 477, 291, 37, 1861, 2697, 13369, 24573, 27285, 96757}},
+{9066, 17, 28435, {1, 1, 1, 13, 5, 29, 65, 195, 365, 465, 865, 2705, 5249, 7051, 3795, 56611, 72317}},
+{9067, 17, 28444, {1, 1, 3, 9, 19, 9, 85, 239, 509, 313, 1137, 2221, 5475, 71, 11901, 1877, 68701}},
+{9068, 17, 28454, {1, 3, 3, 7, 3, 53, 55, 223, 441, 159, 933, 2573, 3441, 3295, 25005, 29021, 97145}},
+{9069, 17, 28468, {1, 3, 5, 5, 3, 11, 101, 181, 293, 319, 47, 2971, 387, 4697, 26613, 8531, 20461}},
+{9070, 17, 28477, {1, 3, 3, 13, 17, 11, 41, 233, 455, 353, 1817, 3065, 4657, 1717, 3039, 10937, 107085}},
+{9071, 17, 28478, {1, 1, 7, 1, 17, 23, 85, 5, 291, 725, 1791, 3525, 7705, 6561, 25311, 44679, 21419}},
+{9072, 17, 28480, {1, 1, 7, 1, 23, 41, 97, 117, 435, 261, 2007, 965, 6913, 12245, 25723, 8445, 30871}},
+{9073, 17, 28486, {1, 1, 1, 15, 29, 39, 101, 33, 55, 1019, 1431, 2601, 3837, 14873, 11785, 12449, 30815}},
+{9074, 17, 28489, {1, 1, 5, 3, 15, 35, 101, 7, 479, 535, 1875, 2435, 1461, 13967, 2755, 45879, 93561}},
+{9075, 17, 28500, {1, 3, 1, 5, 29, 57, 89, 209, 473, 289, 1843, 2051, 3997, 1753, 18179, 41355, 89301}},
+{9076, 17, 28507, {1, 3, 1, 11, 17, 45, 47, 57, 109, 309, 1009, 653, 5175, 15599, 21617, 35353, 55253}},
+{9077, 17, 28519, {1, 3, 5, 3, 1, 11, 57, 83, 385, 765, 1887, 785, 2115, 8689, 14783, 14841, 122221}},
+{9078, 17, 28523, {1, 3, 5, 11, 11, 5, 77, 115, 189, 371, 887, 3653, 8159, 15737, 6763, 52807, 128841}},
+{9079, 17, 28534, {1, 1, 1, 11, 11, 33, 9, 145, 439, 565, 171, 3867, 7149, 4369, 15073, 3277, 25873}},
+{9080, 17, 28547, {1, 1, 3, 1, 11, 9, 17, 255, 129, 835, 1705, 1551, 877, 4831, 12717, 2549, 62723}},
+{9081, 17, 28549, {1, 1, 7, 11, 17, 33, 21, 195, 143, 153, 1855, 1323, 1225, 16359, 16479, 8883, 76449}},
+{9082, 17, 28562, {1, 1, 1, 5, 31, 23, 61, 53, 77, 465, 1983, 4019, 4865, 14721, 18601, 48179, 100453}},
+{9083, 17, 28571, {1, 3, 1, 13, 19, 53, 83, 63, 165, 393, 469, 1465, 2669, 10155, 7029, 26185, 121223}},
+{9084, 17, 28583, {1, 1, 1, 3, 3, 3, 123, 23, 45, 359, 1063, 847, 3943, 6113, 23749, 30323, 10583}},
+{9085, 17, 28584, {1, 3, 5, 15, 1, 55, 65, 149, 139, 217, 141, 2425, 7019, 14127, 11725, 50821, 52643}},
+{9086, 17, 28595, {1, 3, 5, 15, 13, 13, 15, 93, 457, 869, 117, 585, 7159, 5957, 15073, 21861, 118119}},
+{9087, 17, 28597, {1, 3, 1, 15, 3, 31, 29, 245, 47, 895, 197, 1169, 945, 11503, 26615, 14079, 27175}},
+{9088, 17, 28604, {1, 3, 5, 5, 31, 1, 107, 109, 253, 999, 1451, 2243, 6675, 10779, 26181, 64597, 16443}},
+{9089, 17, 28607, {1, 3, 7, 15, 9, 53, 25, 41, 151, 197, 1955, 2365, 5305, 2901, 24825, 9595, 57377}},
+{9090, 17, 28609, {1, 3, 1, 3, 25, 37, 37, 193, 417, 373, 1127, 3239, 4583, 2861, 14501, 64163, 30055}},
+{9091, 17, 28612, {1, 3, 7, 9, 7, 21, 49, 231, 241, 95, 1757, 2281, 2679, 1611, 11115, 31743, 26851}},
+{9092, 17, 28630, {1, 3, 5, 5, 1, 1, 23, 173, 195, 593, 1639, 1449, 4733, 2451, 12677, 31959, 128217}},
+{9093, 17, 28640, {1, 1, 1, 7, 17, 49, 117, 253, 167, 721, 889, 3027, 7781, 13521, 15477, 17981, 95487}},
+{9094, 17, 28669, {1, 1, 1, 15, 13, 47, 125, 9, 33, 567, 1733, 1263, 307, 10285, 6325, 55827, 39823}},
+{9095, 17, 28677, {1, 1, 1, 15, 23, 3, 11, 169, 369, 667, 313, 2287, 6655, 16067, 5915, 8605, 92177}},
+{9096, 17, 28682, {1, 3, 3, 15, 13, 21, 125, 111, 171, 785, 79, 2281, 1247, 11321, 30397, 28555, 84863}},
+{9097, 17, 28690, {1, 1, 5, 13, 1, 31, 123, 97, 127, 245, 1213, 2381, 3545, 13545, 28657, 54087, 79039}},
+{9098, 17, 28695, {1, 1, 7, 9, 9, 21, 87, 111, 27, 33, 843, 199, 1465, 6555, 8019, 39521, 98883}},
+{9099, 17, 28696, {1, 3, 3, 5, 5, 55, 61, 219, 279, 207, 1811, 667, 2989, 3133, 25213, 51979, 87695}},
+{9100, 17, 28717, {1, 1, 7, 3, 17, 11, 31, 97, 277, 385, 229, 3045, 557, 13521, 32733, 36831, 43003}},
+{9101, 17, 28730, {1, 3, 5, 13, 27, 57, 31, 207, 147, 405, 1495, 2471, 4889, 14861, 4861, 28185, 62363}},
+{9102, 17, 28737, {1, 1, 5, 13, 23, 19, 5, 21, 509, 299, 1077, 1747, 6229, 2375, 17903, 58473, 72637}},
+{9103, 17, 28752, {1, 3, 7, 11, 15, 61, 63, 165, 27, 461, 1359, 3375, 3029, 9907, 17393, 11097, 43593}},
+{9104, 17, 28761, {1, 3, 5, 1, 17, 29, 15, 5, 419, 19, 1981, 3169, 2389, 9169, 31697, 26201, 6997}},
+{9105, 17, 28774, {1, 3, 3, 1, 29, 31, 89, 79, 347, 707, 505, 2087, 2163, 5465, 8677, 11421, 93217}},
+{9106, 17, 28783, {1, 3, 7, 9, 3, 23, 75, 215, 7, 971, 925, 3223, 7825, 12347, 19763, 10927, 41245}},
+{9107, 17, 28791, {1, 3, 5, 5, 3, 43, 119, 79, 373, 761, 709, 1897, 3953, 13895, 13421, 16939, 112449}},
+{9108, 17, 28801, {1, 1, 3, 15, 11, 25, 65, 101, 315, 1005, 1319, 1163, 161, 15331, 4845, 40375, 121361}},
+{9109, 17, 28802, {1, 1, 3, 7, 1, 57, 63, 131, 145, 1007, 549, 2327, 1513, 3591, 10839, 56297, 80613}},
+{9110, 17, 28814, {1, 1, 3, 5, 1, 19, 79, 81, 505, 945, 65, 319, 6105, 5491, 13257, 4651, 48247}},
+{9111, 17, 28837, {1, 3, 1, 9, 27, 41, 61, 41, 421, 707, 1279, 3699, 2403, 4075, 16947, 53435, 2917}},
+{9112, 17, 28838, {1, 1, 5, 13, 11, 29, 35, 141, 313, 769, 749, 4025, 2597, 12197, 32265, 32159, 37003}},
+{9113, 17, 28842, {1, 3, 7, 11, 25, 63, 121, 15, 273, 877, 637, 409, 5001, 4723, 27985, 55501, 43495}},
+{9114, 17, 28844, {1, 3, 1, 13, 27, 29, 127, 65, 275, 967, 1723, 4007, 6147, 13277, 8361, 12305, 95433}},
+{9115, 17, 28849, {1, 3, 3, 13, 11, 45, 7, 101, 169, 361, 517, 2897, 4283, 7587, 7495, 31549, 29113}},
+{9116, 17, 28864, {1, 3, 3, 1, 9, 27, 65, 15, 279, 127, 1039, 829, 5739, 1949, 24789, 30433, 54503}},
+{9117, 17, 28867, {1, 3, 7, 5, 13, 19, 95, 133, 25, 271, 1527, 3571, 101, 15987, 10985, 55761, 39833}},
+{9118, 17, 28881, {1, 3, 5, 9, 27, 5, 37, 219, 249, 947, 1063, 4081, 1763, 15003, 23753, 3975, 109803}},
+{9119, 17, 28882, {1, 3, 3, 5, 21, 37, 35, 145, 323, 573, 1939, 885, 4645, 4515, 16815, 28783, 76017}},
+{9120, 17, 28893, {1, 3, 7, 13, 27, 41, 39, 123, 423, 949, 1487, 2207, 8069, 15337, 20671, 20163, 70667}},
+{9121, 17, 28903, {1, 1, 3, 3, 15, 29, 69, 15, 151, 729, 35, 2067, 6715, 12759, 27611, 54133, 16561}},
+{9122, 17, 28907, {1, 3, 7, 13, 21, 13, 7, 161, 327, 339, 535, 2059, 413, 11161, 18415, 12415, 63713}},
+{9123, 17, 28909, {1, 3, 5, 5, 23, 49, 9, 181, 417, 339, 1013, 1707, 5097, 13319, 18951, 56415, 14397}},
+{9124, 17, 28921, {1, 1, 5, 7, 29, 23, 117, 159, 287, 695, 71, 2393, 2655, 6417, 24349, 20441, 77987}},
+{9125, 17, 28927, {1, 1, 5, 7, 31, 23, 81, 125, 145, 141, 1459, 4095, 713, 1817, 9263, 21025, 91983}},
+{9126, 17, 28929, {1, 1, 1, 9, 17, 23, 91, 39, 459, 299, 1951, 3229, 6229, 3267, 15883, 31719, 96573}},
+{9127, 17, 28935, {1, 1, 1, 15, 3, 51, 9, 7, 455, 653, 1447, 153, 8117, 723, 2177, 9107, 7757}},
+{9128, 17, 28941, {1, 3, 1, 15, 27, 47, 49, 245, 499, 807, 175, 1653, 1693, 3931, 27479, 30095, 62353}},
+{9129, 17, 28942, {1, 1, 5, 5, 23, 7, 15, 193, 499, 193, 201, 2771, 4153, 11533, 25883, 23337, 126685}},
+{9130, 17, 28954, {1, 1, 1, 7, 9, 43, 125, 181, 425, 557, 1401, 2593, 1933, 6803, 20021, 32687, 126465}},
+{9131, 17, 28959, {1, 3, 3, 13, 27, 19, 99, 29, 395, 765, 1137, 2963, 7397, 9695, 19259, 27965, 83157}},
+{9132, 17, 28960, {1, 3, 7, 7, 17, 29, 7, 241, 5, 281, 1489, 1599, 5567, 4579, 7739, 41413, 110571}},
+{9133, 17, 28990, {1, 3, 3, 9, 7, 5, 83, 1, 231, 1003, 631, 2557, 831, 6495, 30409, 53519, 79331}},
+{9134, 17, 28992, {1, 1, 5, 1, 7, 49, 45, 241, 201, 551, 1645, 2003, 1455, 3317, 23639, 7841, 100765}},
+{9135, 17, 29004, {1, 3, 5, 13, 25, 47, 103, 37, 81, 263, 1143, 801, 5863, 6871, 8615, 57363, 90161}},
+{9136, 17, 29010, {1, 3, 7, 11, 27, 23, 119, 211, 473, 207, 605, 637, 3369, 7287, 27827, 25003, 65925}},
+{9137, 17, 29012, {1, 3, 1, 15, 27, 31, 97, 247, 75, 893, 1099, 3609, 6807, 4393, 10253, 62759, 89971}},
+{9138, 17, 29021, {1, 1, 7, 15, 27, 19, 43, 59, 419, 263, 387, 3193, 5589, 4197, 19143, 64749, 103093}},
+{9139, 17, 29035, {1, 1, 7, 11, 21, 51, 97, 227, 251, 869, 1927, 2331, 7741, 8207, 12885, 13267, 17945}},
+{9140, 17, 29040, {1, 1, 7, 7, 5, 53, 41, 147, 75, 709, 607, 1073, 2853, 8081, 12797, 5279, 86083}},
+{9141, 17, 29059, {1, 1, 5, 5, 15, 21, 77, 189, 269, 595, 197, 3117, 5073, 14277, 26867, 49505, 75755}},
+{9142, 17, 29068, {1, 3, 5, 15, 13, 55, 1, 223, 135, 367, 735, 3139, 4851, 9773, 11699, 19081, 26011}},
+{9143, 17, 29080, {1, 3, 5, 7, 9, 3, 89, 103, 321, 727, 1809, 3527, 6881, 2399, 13593, 27867, 16219}},
+{9144, 17, 29086, {1, 3, 3, 1, 23, 5, 53, 51, 403, 753, 2037, 1261, 7575, 2725, 11341, 18533, 98767}},
+{9145, 17, 29089, {1, 1, 1, 11, 1, 13, 37, 141, 477, 689, 1789, 1913, 5753, 6069, 6965, 55209, 77329}},
+{9146, 17, 29090, {1, 3, 7, 3, 17, 59, 79, 249, 381, 163, 1773, 1645, 7295, 2359, 21889, 28429, 117073}},
+{9147, 17, 29095, {1, 3, 5, 15, 7, 45, 59, 3, 93, 259, 1257, 2967, 1175, 10171, 873, 51423, 67437}},
+{9148, 17, 29113, {1, 1, 7, 13, 17, 33, 53, 217, 159, 683, 1169, 3363, 4591, 3959, 10089, 35443, 99677}},
+{9149, 17, 29127, {1, 3, 7, 9, 3, 1, 5, 171, 17, 635, 369, 1529, 4861, 4977, 29303, 42357, 69309}},
+{9150, 17, 29131, {1, 3, 7, 9, 21, 17, 77, 127, 105, 427, 525, 1123, 2365, 7487, 6315, 64773, 122747}},
+{9151, 17, 29148, {1, 1, 1, 15, 19, 63, 65, 83, 219, 987, 169, 2589, 3809, 8807, 22473, 6479, 44617}},
+{9152, 17, 29161, {1, 3, 1, 7, 11, 51, 107, 19, 379, 191, 1013, 3145, 1501, 11871, 14111, 18269, 98247}},
+{9153, 17, 29172, {1, 1, 7, 5, 17, 63, 23, 231, 423, 855, 1955, 907, 4553, 16173, 7701, 40329, 42047}},
+{9154, 17, 29179, {1, 3, 7, 1, 7, 45, 103, 127, 185, 721, 1035, 839, 691, 6823, 23819, 50781, 92767}},
+{9155, 17, 29188, {1, 1, 1, 3, 9, 21, 57, 253, 285, 85, 1227, 365, 2347, 7491, 15183, 8619, 108819}},
+{9156, 17, 29192, {1, 1, 3, 15, 27, 13, 5, 85, 45, 1009, 1315, 1749, 2797, 3941, 19367, 50855, 60693}},
+{9157, 17, 29195, {1, 3, 5, 15, 29, 63, 115, 197, 317, 601, 711, 377, 7489, 4247, 4843, 56549, 108447}},
+{9158, 17, 29206, {1, 3, 7, 15, 11, 25, 7, 145, 371, 395, 1743, 267, 2609, 15707, 13909, 55031, 71115}},
+{9159, 17, 29210, {1, 3, 1, 1, 1, 53, 111, 245, 433, 309, 245, 15, 2091, 9051, 11095, 31821, 104535}},
+{9160, 17, 29215, {1, 3, 1, 15, 25, 31, 99, 89, 259, 595, 1095, 3681, 5105, 8671, 23663, 29717, 126429}},
+{9161, 17, 29221, {1, 3, 7, 7, 5, 31, 15, 59, 109, 527, 257, 1785, 6799, 1283, 11741, 34589, 102397}},
+{9162, 17, 29222, {1, 3, 3, 15, 9, 27, 55, 35, 291, 587, 1281, 779, 4615, 373, 24037, 64671, 124019}},
+{9163, 17, 29236, {1, 1, 5, 5, 13, 51, 49, 19, 37, 857, 539, 1291, 6021, 8645, 30351, 33839, 111515}},
+{9164, 17, 29246, {1, 1, 5, 13, 3, 47, 9, 197, 19, 337, 2025, 3003, 7179, 5755, 31187, 59317, 69753}},
+{9165, 17, 29248, {1, 1, 7, 3, 3, 43, 11, 3, 123, 29, 857, 3349, 791, 11157, 23967, 33729, 28445}},
+{9166, 17, 29253, {1, 1, 5, 1, 1, 11, 73, 231, 173, 925, 331, 161, 3303, 11015, 17507, 21271, 56865}},
+{9167, 17, 29272, {1, 1, 3, 9, 21, 21, 115, 145, 421, 981, 1789, 3343, 7591, 12043, 5795, 17737, 106501}},
+{9168, 17, 29288, {1, 1, 7, 13, 7, 15, 51, 75, 497, 637, 1073, 1505, 5613, 1415, 30861, 26159, 79573}},
+{9169, 17, 29293, {1, 1, 3, 15, 17, 35, 17, 129, 169, 283, 1383, 149, 211, 1381, 22205, 28367, 831}},
+{9170, 17, 29294, {1, 3, 5, 5, 17, 11, 127, 183, 503, 499, 2011, 2721, 2717, 3105, 4731, 60319, 9361}},
+{9171, 17, 29308, {1, 1, 1, 7, 27, 55, 77, 203, 255, 761, 1159, 2915, 4479, 13671, 19757, 65497, 4461}},
+{9172, 17, 29318, {1, 3, 1, 9, 9, 51, 67, 205, 445, 35, 371, 1837, 3623, 10365, 19463, 59005, 3185}},
+{9173, 17, 29321, {1, 3, 7, 3, 23, 5, 51, 141, 293, 489, 263, 2187, 1259, 2729, 1779, 61027, 53931}},
+{9174, 17, 29322, {1, 1, 1, 15, 27, 7, 15, 109, 475, 839, 175, 953, 4531, 437, 22475, 24167, 19051}},
+{9175, 17, 29339, {1, 1, 7, 9, 25, 23, 41, 107, 299, 115, 1713, 1559, 5701, 5427, 28813, 39913, 15941}},
+{9176, 17, 29365, {1, 3, 5, 7, 5, 25, 99, 9, 307, 591, 1303, 3501, 1589, 12095, 26629, 52127, 60635}},
+{9177, 17, 29369, {1, 3, 7, 3, 9, 23, 3, 29, 113, 49, 1601, 541, 1415, 11601, 19165, 46595, 111623}},
+{9178, 17, 29372, {1, 1, 3, 11, 5, 53, 37, 153, 51, 41, 1267, 545, 2055, 13137, 7749, 30721, 119591}},
+{9179, 17, 29377, {1, 3, 5, 11, 1, 15, 65, 17, 155, 65, 745, 2547, 6351, 2347, 13553, 5785, 129857}},
+{9180, 17, 29392, {1, 3, 7, 13, 5, 53, 11, 59, 453, 467, 1275, 3669, 4481, 5229, 2953, 23369, 100161}},
+{9181, 17, 29401, {1, 3, 1, 1, 13, 41, 91, 179, 331, 547, 1571, 1787, 6467, 12375, 4579, 45023, 119149}},
+{9182, 17, 29402, {1, 3, 3, 5, 17, 55, 105, 57, 227, 323, 1517, 1215, 3149, 13919, 18595, 5525, 82445}},
+{9183, 17, 29418, {1, 3, 1, 13, 19, 23, 17, 239, 81, 481, 1625, 2003, 7295, 2185, 7021, 19357, 37867}},
+{9184, 17, 29437, {1, 3, 5, 9, 11, 15, 61, 223, 153, 139, 2023, 2579, 495, 14319, 2835, 26541, 113115}},
+{9185, 17, 29445, {1, 1, 3, 13, 29, 9, 13, 149, 325, 87, 697, 2345, 2205, 5069, 9939, 61351, 127313}},
+{9186, 17, 29446, {1, 1, 7, 11, 13, 53, 45, 197, 167, 551, 439, 3715, 4587, 8549, 28193, 35827, 96721}},
+{9187, 17, 29460, {1, 3, 1, 1, 17, 7, 31, 205, 219, 739, 1165, 243, 3877, 15943, 15207, 43857, 120565}},
+{9188, 17, 29467, {1, 3, 7, 9, 7, 43, 81, 203, 295, 553, 279, 2717, 9, 751, 24715, 21591, 11485}},
+{9189, 17, 29473, {1, 1, 1, 11, 15, 17, 41, 121, 355, 157, 955, 3875, 7595, 235, 4937, 20607, 11401}},
+{9190, 17, 29476, {1, 1, 7, 7, 13, 49, 33, 161, 65, 251, 1895, 2665, 3017, 9725, 10797, 46313, 43407}},
+{9191, 17, 29488, {1, 1, 3, 9, 23, 17, 127, 69, 385, 875, 461, 3305, 3001, 5875, 13547, 61239, 113571}},
+{9192, 17, 29511, {1, 3, 7, 5, 15, 47, 113, 131, 465, 89, 733, 433, 799, 5689, 723, 63479, 106945}},
+{9193, 17, 29512, {1, 3, 3, 15, 29, 1, 51, 115, 317, 1021, 1219, 1797, 4005, 10435, 28935, 49467, 66833}},
+{9194, 17, 29517, {1, 1, 3, 11, 15, 9, 51, 209, 477, 479, 1099, 2781, 5525, 12715, 9067, 18317, 121671}},
+{9195, 17, 29523, {1, 3, 1, 7, 19, 35, 61, 27, 479, 815, 1639, 2825, 7449, 13697, 3079, 49833, 35119}},
+{9196, 17, 29526, {1, 3, 7, 3, 17, 53, 95, 155, 505, 185, 717, 3419, 3857, 2369, 14525, 22797, 38553}},
+{9197, 17, 29535, {1, 3, 1, 13, 27, 5, 11, 21, 507, 65, 39, 2841, 7887, 2783, 18767, 34171, 40527}},
+{9198, 17, 29539, {1, 3, 1, 7, 9, 47, 69, 217, 251, 775, 631, 1967, 5541, 10679, 16439, 33533, 57817}},
+{9199, 17, 29545, {1, 1, 5, 11, 27, 57, 103, 255, 359, 745, 63, 3725, 4113, 10943, 7833, 46857, 99239}},
+{9200, 17, 29559, {1, 3, 1, 5, 31, 41, 69, 245, 401, 451, 959, 351, 6999, 6187, 21437, 55067, 53547}},
+{9201, 17, 29560, {1, 1, 1, 13, 25, 49, 85, 181, 457, 731, 743, 1901, 7013, 12027, 14729, 24193, 89685}},
+{9202, 17, 29589, {1, 3, 3, 1, 31, 29, 101, 137, 117, 135, 345, 1419, 7133, 2695, 3631, 53049, 45875}},
+{9203, 17, 29593, {1, 1, 1, 13, 11, 51, 95, 221, 339, 655, 201, 3007, 8179, 8093, 22399, 59123, 127319}},
+{9204, 17, 29599, {1, 3, 7, 3, 31, 37, 23, 199, 191, 649, 817, 1959, 893, 2333, 21477, 29087, 115667}},
+{9205, 17, 29603, {1, 3, 3, 5, 9, 55, 123, 67, 39, 533, 797, 2575, 3955, 14585, 28587, 13079, 60053}},
+{9206, 17, 29610, {1, 3, 1, 1, 17, 19, 15, 219, 185, 21, 967, 667, 3361, 3883, 8059, 26199, 80913}},
+{9207, 17, 29629, {1, 3, 3, 11, 23, 5, 99, 57, 379, 151, 271, 3735, 7087, 12731, 2949, 54831, 37835}},
+{9208, 17, 29644, {1, 3, 1, 7, 21, 25, 9, 195, 497, 585, 901, 19, 7675, 13611, 31155, 14567, 20545}},
+{9209, 17, 29656, {1, 1, 3, 3, 27, 45, 51, 169, 397, 531, 673, 2935, 3779, 7169, 23479, 16157, 100237}},
+{9210, 17, 29662, {1, 1, 1, 1, 19, 49, 3, 75, 455, 805, 591, 1929, 2883, 2797, 31379, 12025, 120929}},
+{9211, 17, 29675, {1, 3, 5, 3, 17, 39, 115, 93, 341, 329, 1857, 2753, 4923, 12539, 25589, 19437, 29027}},
+{9212, 17, 29692, {1, 3, 5, 9, 27, 37, 21, 235, 499, 369, 1341, 3719, 6819, 3153, 30619, 50901, 52999}},
+{9213, 17, 29704, {1, 3, 1, 11, 3, 55, 43, 219, 83, 771, 783, 3569, 7879, 2363, 30605, 5965, 126855}},
+{9214, 17, 29707, {1, 3, 7, 13, 7, 25, 111, 63, 355, 317, 1579, 1523, 2733, 11963, 25205, 20545, 67389}},
+{9215, 17, 29715, {1, 3, 5, 7, 3, 17, 55, 99, 321, 633, 2013, 1991, 1019, 9223, 21117, 23337, 90589}},
+{9216, 17, 29717, {1, 3, 1, 1, 17, 25, 79, 171, 303, 403, 2037, 2595, 3951, 8021, 8669, 9363, 20345}},
+{9217, 17, 29722, {1, 1, 1, 7, 13, 7, 11, 7, 347, 53, 1763, 3097, 3353, 3769, 22947, 20919, 92247}},
+{9218, 17, 29731, {1, 3, 5, 11, 19, 29, 91, 191, 511, 705, 1317, 3367, 7, 4999, 30251, 18299, 66983}},
+{9219, 17, 29740, {1, 1, 3, 7, 19, 17, 71, 77, 285, 189, 853, 2305, 4205, 15603, 15501, 48073, 11411}},
+{9220, 17, 29743, {1, 3, 7, 5, 21, 15, 47, 13, 277, 969, 1861, 3493, 6723, 11521, 22145, 43779, 44713}},
+{9221, 17, 29752, {1, 1, 3, 5, 19, 47, 51, 207, 229, 957, 709, 267, 8081, 611, 26403, 14871, 111841}},
+{9222, 17, 29760, {1, 3, 7, 1, 19, 43, 71, 73, 405, 351, 1131, 3527, 5949, 14363, 20041, 48123, 68123}},
+{9223, 17, 29766, {1, 3, 3, 7, 23, 51, 81, 13, 161, 453, 365, 1089, 3505, 12359, 14277, 56113, 19717}},
+{9224, 17, 29770, {1, 1, 1, 7, 29, 35, 103, 137, 317, 417, 1465, 2787, 6935, 9885, 12943, 43937, 28353}},
+{9225, 17, 29794, {1, 1, 3, 13, 19, 37, 97, 5, 115, 89, 1005, 3033, 2011, 2633, 10615, 6641, 73385}},
+{9226, 17, 29796, {1, 3, 7, 7, 31, 39, 107, 165, 61, 1009, 1159, 865, 3469, 11093, 10425, 43959, 37395}},
+{9227, 17, 29814, {1, 3, 5, 9, 7, 51, 99, 91, 37, 457, 39, 2455, 7481, 4929, 29755, 50603, 48943}},
+{9228, 17, 29817, {1, 1, 5, 13, 5, 39, 47, 149, 341, 303, 843, 3619, 7527, 8739, 5893, 42623, 99899}},
+{9229, 17, 29829, {1, 1, 1, 1, 1, 41, 73, 71, 409, 351, 131, 515, 6657, 337, 23913, 583, 21665}},
+{9230, 17, 29841, {1, 1, 3, 3, 11, 45, 39, 113, 315, 965, 1605, 2779, 501, 7429, 2567, 7011, 71445}},
+{9231, 17, 29851, {1, 3, 7, 13, 21, 13, 45, 105, 385, 281, 1683, 3997, 6391, 10943, 22349, 37261, 57555}},
+{9232, 17, 29860, {1, 1, 3, 5, 17, 55, 109, 71, 393, 561, 433, 1091, 1923, 13861, 12981, 5523, 15467}},
+{9233, 17, 29864, {1, 3, 7, 5, 17, 11, 113, 119, 37, 989, 1609, 2191, 1511, 11835, 25423, 793, 15227}},
+{9234, 17, 29869, {1, 3, 1, 5, 5, 55, 105, 225, 349, 351, 1259, 1309, 821, 2733, 1357, 3665, 38863}},
+{9235, 17, 29870, {1, 3, 5, 1, 23, 61, 49, 113, 169, 319, 85, 1581, 97, 5271, 30625, 37693, 7297}},
+{9236, 17, 29889, {1, 3, 5, 1, 1, 25, 31, 125, 307, 731, 1815, 1047, 7251, 12481, 20781, 63275, 51985}},
+{9237, 17, 29896, {1, 3, 5, 9, 11, 9, 121, 111, 45, 751, 793, 2593, 6409, 4355, 30183, 36959, 105161}},
+{9238, 17, 29901, {1, 1, 3, 9, 25, 37, 95, 253, 401, 481, 1521, 3555, 231, 15459, 1581, 36661, 121727}},
+{9239, 17, 29913, {1, 3, 5, 3, 27, 11, 107, 115, 213, 813, 27, 1789, 603, 383, 1129, 63365, 51147}},
+{9240, 17, 29919, {1, 1, 3, 13, 25, 7, 33, 1, 97, 907, 35, 4069, 5001, 507, 911, 62037, 22019}},
+{9241, 17, 29920, {1, 1, 3, 5, 7, 55, 35, 95, 261, 217, 1565, 3473, 3475, 12181, 569, 27389, 81771}},
+{9242, 17, 29947, {1, 1, 3, 5, 11, 33, 95, 121, 453, 711, 361, 3927, 5231, 15685, 31143, 56915, 23707}},
+{9243, 17, 29958, {1, 1, 3, 11, 25, 15, 53, 155, 469, 647, 1547, 335, 3753, 12873, 13639, 25129, 79287}},
+{9244, 17, 29975, {1, 3, 3, 3, 1, 21, 21, 121, 105, 903, 83, 2287, 4295, 14369, 29183, 26841, 38115}},
+{9245, 17, 29981, {1, 1, 7, 11, 5, 29, 65, 191, 389, 419, 1315, 739, 3485, 10587, 2399, 36377, 28789}},
+{9246, 17, 29985, {1, 3, 3, 11, 3, 29, 71, 169, 265, 747, 395, 1211, 3487, 15705, 25611, 18183, 85771}},
+{9247, 17, 29998, {1, 1, 7, 3, 23, 5, 45, 47, 337, 571, 33, 1221, 5671, 1233, 28361, 36945, 911}},
+{9248, 17, 30010, {1, 1, 5, 11, 17, 15, 57, 97, 185, 999, 1277, 3371, 2785, 3341, 13395, 11925, 86777}},
+{9249, 17, 30012, {1, 1, 3, 1, 31, 37, 23, 105, 503, 869, 1309, 3733, 4629, 8263, 11763, 30669, 26179}},
+{9250, 17, 30044, {1, 1, 3, 15, 25, 61, 37, 27, 325, 413, 809, 2959, 8137, 3397, 21185, 27995, 84297}},
+{9251, 17, 30048, {1, 3, 5, 5, 1, 55, 95, 41, 493, 469, 331, 1789, 7037, 7947, 14239, 16109, 51795}},
+{9252, 17, 30051, {1, 1, 1, 1, 19, 33, 111, 237, 261, 331, 871, 3539, 1731, 6953, 11345, 37901, 5623}},
+{9253, 17, 30063, {1, 1, 5, 7, 21, 41, 49, 179, 49, 797, 231, 1299, 145, 7743, 725, 60595, 19581}},
+{9254, 17, 30065, {1, 3, 7, 15, 7, 43, 67, 219, 133, 641, 1657, 2301, 1591, 12309, 6395, 3999, 92961}},
+{9255, 17, 30072, {1, 1, 1, 5, 1, 49, 37, 81, 219, 323, 461, 1379, 1797, 14825, 21811, 7347, 35643}},
+{9256, 17, 30077, {1, 1, 1, 11, 1, 3, 83, 31, 307, 83, 1169, 3277, 1875, 13397, 20265, 46707, 15205}},
+{9257, 17, 30087, {1, 3, 7, 11, 29, 41, 69, 33, 405, 991, 1937, 1217, 2137, 8657, 4319, 41119, 43371}},
+{9258, 17, 30088, {1, 3, 3, 3, 25, 49, 107, 197, 347, 923, 1585, 3023, 4087, 13875, 22015, 35733, 33755}},
+{9259, 17, 30101, {1, 3, 3, 5, 15, 61, 89, 249, 141, 853, 1469, 999, 7425, 10015, 12341, 51535, 61619}},
+{9260, 17, 30112, {1, 1, 7, 13, 31, 61, 89, 113, 117, 429, 1011, 1589, 1419, 5083, 4843, 26759, 47401}},
+{9261, 17, 30121, {1, 1, 7, 9, 17, 37, 119, 39, 499, 93, 1155, 3069, 2033, 12483, 29849, 40077, 11103}},
+{9262, 17, 30122, {1, 3, 1, 15, 11, 5, 23, 121, 283, 717, 1573, 3911, 2031, 2617, 20387, 33157, 301}},
+{9263, 17, 30130, {1, 3, 5, 7, 17, 61, 109, 3, 205, 617, 1171, 223, 6609, 15027, 2629, 15801, 73749}},
+{9264, 17, 30135, {1, 1, 3, 7, 5, 49, 9, 73, 333, 401, 675, 2765, 993, 77, 19237, 60929, 88703}},
+{9265, 17, 30139, {1, 1, 1, 9, 21, 25, 53, 249, 241, 43, 1959, 545, 3729, 11395, 3027, 12661, 87729}},
+{9266, 17, 30142, {1, 3, 3, 15, 15, 61, 33, 59, 155, 773, 1043, 3111, 6549, 5397, 29099, 57851, 107671}},
+{9267, 17, 30164, {1, 3, 7, 1, 29, 29, 1, 161, 273, 883, 1913, 2389, 401, 9425, 17613, 50443, 84601}},
+{9268, 17, 30167, {1, 3, 7, 11, 15, 63, 41, 53, 371, 153, 1491, 3013, 6635, 4955, 30145, 20175, 16541}},
+{9269, 17, 30180, {1, 3, 3, 11, 31, 27, 127, 207, 11, 313, 1067, 3445, 3075, 4071, 28305, 58911, 85273}},
+{9270, 17, 30202, {1, 1, 7, 11, 17, 47, 77, 119, 209, 657, 1181, 459, 5821, 4267, 5757, 53703, 35621}},
+{9271, 17, 30211, {1, 3, 1, 15, 27, 41, 3, 217, 457, 531, 1749, 2847, 4715, 11451, 25071, 53999, 93503}},
+{9272, 17, 30214, {1, 3, 5, 3, 19, 29, 9, 177, 355, 265, 883, 1113, 2397, 1819, 20757, 50389, 95551}},
+{9273, 17, 30217, {1, 1, 3, 15, 3, 45, 85, 211, 377, 293, 1791, 1193, 1117, 9383, 28039, 27155, 129513}},
+{9274, 17, 30223, {1, 1, 7, 5, 1, 17, 59, 215, 161, 933, 1653, 2407, 2693, 3655, 7515, 2239, 88985}},
+{9275, 17, 30228, {1, 1, 3, 11, 31, 3, 1, 77, 459, 817, 651, 603, 1711, 9391, 20607, 48195, 127153}},
+{9276, 17, 30235, {1, 1, 5, 13, 11, 49, 25, 13, 51, 443, 1877, 1257, 163, 4673, 30313, 18841, 24547}},
+{9277, 17, 30256, {1, 1, 7, 7, 15, 33, 43, 79, 127, 625, 1991, 1311, 2095, 14659, 3477, 56023, 57955}},
+{9278, 17, 30265, {1, 3, 7, 15, 29, 7, 119, 183, 123, 323, 1723, 959, 2733, 2097, 2927, 57595, 86067}},
+{9279, 17, 30286, {1, 3, 5, 5, 29, 57, 93, 139, 495, 739, 1715, 713, 243, 2027, 11223, 44143, 119155}},
+{9280, 17, 30293, {1, 3, 1, 9, 3, 63, 113, 29, 19, 439, 869, 1101, 4947, 2191, 14737, 57049, 93505}},
+{9281, 17, 30298, {1, 1, 7, 1, 11, 39, 27, 29, 281, 829, 1979, 2185, 2207, 14969, 7447, 55541, 59593}},
+{9282, 17, 30310, {1, 1, 7, 13, 11, 15, 15, 143, 383, 469, 1439, 2823, 7489, 7675, 15433, 26203, 80433}},
+{9283, 17, 30314, {1, 1, 1, 7, 15, 45, 23, 93, 477, 1, 1431, 3173, 7879, 12211, 13051, 56971, 114289}},
+{9284, 17, 30327, {1, 3, 1, 1, 27, 55, 61, 185, 323, 569, 1063, 1357, 7373, 14947, 15967, 64517, 104625}},
+{9285, 17, 30333, {1, 1, 5, 11, 25, 1, 127, 163, 419, 657, 911, 361, 3675, 10765, 24565, 2661, 61979}},
+{9286, 17, 30334, {1, 3, 7, 15, 29, 53, 29, 149, 465, 535, 1865, 2243, 4783, 9327, 24843, 52313, 15683}},
+{9287, 17, 30337, {1, 1, 7, 7, 17, 7, 85, 187, 91, 1013, 1917, 2959, 3571, 12047, 25267, 34095, 9877}},
+{9288, 17, 30338, {1, 1, 1, 7, 5, 27, 111, 107, 313, 571, 1081, 3193, 1025, 2589, 1523, 40453, 77065}},
+{9289, 17, 30344, {1, 3, 7, 1, 19, 27, 1, 103, 479, 405, 583, 1737, 3495, 9093, 20397, 16429, 45609}},
+{9290, 17, 30349, {1, 1, 3, 11, 17, 1, 125, 97, 261, 651, 901, 1245, 1181, 14469, 16229, 31935, 100227}},
+{9291, 17, 30352, {1, 1, 7, 11, 15, 1, 19, 151, 453, 833, 1371, 1109, 5373, 25, 5619, 58351, 26349}},
+{9292, 17, 30362, {1, 1, 7, 15, 17, 55, 51, 67, 123, 13, 1873, 1035, 5871, 11943, 11543, 43261, 62587}},
+{9293, 17, 30374, {1, 3, 1, 13, 21, 15, 83, 205, 333, 379, 2021, 1389, 861, 10395, 20587, 38207, 49109}},
+{9294, 17, 30380, {1, 1, 5, 3, 13, 49, 89, 85, 463, 1005, 1367, 3487, 581, 12145, 22445, 35343, 65745}},
+{9295, 17, 30388, {1, 3, 3, 3, 29, 27, 99, 195, 89, 793, 1677, 3989, 4811, 8303, 9165, 50349, 96947}},
+{9296, 17, 30391, {1, 1, 3, 5, 29, 11, 91, 107, 13, 659, 213, 1613, 2245, 11567, 28157, 2937, 53275}},
+{9297, 17, 30395, {1, 3, 7, 5, 3, 41, 65, 27, 93, 747, 1143, 505, 3881, 2123, 2903, 54137, 96185}},
+{9298, 17, 30403, {1, 1, 3, 15, 9, 49, 3, 25, 77, 681, 1709, 915, 2243, 2127, 18243, 13915, 67399}},
+{9299, 17, 30409, {1, 3, 5, 7, 13, 49, 89, 67, 63, 271, 1651, 897, 4035, 1067, 13743, 56791, 44371}},
+{9300, 17, 30424, {1, 1, 7, 9, 25, 19, 125, 15, 125, 705, 1359, 817, 1241, 12447, 19097, 33209, 89091}},
+{9301, 17, 30427, {1, 3, 7, 3, 19, 43, 127, 197, 39, 709, 257, 3547, 3069, 1187, 21255, 6453, 40763}},
+{9302, 17, 30430, {1, 3, 3, 5, 3, 53, 37, 65, 415, 183, 991, 533, 7805, 9905, 18925, 52665, 100987}},
+{9303, 17, 30451, {1, 3, 3, 11, 17, 41, 17, 137, 143, 277, 945, 1531, 7427, 7287, 30869, 27651, 116507}},
+{9304, 17, 30460, {1, 1, 1, 3, 13, 3, 9, 163, 113, 373, 1909, 1051, 97, 10729, 28615, 40081, 129297}},
+{9305, 17, 30475, {1, 3, 3, 9, 11, 47, 113, 27, 307, 339, 1319, 3083, 7383, 1551, 26691, 28769, 114313}},
+{9306, 17, 30480, {1, 3, 7, 7, 25, 49, 31, 231, 485, 629, 59, 283, 7463, 6603, 23055, 63643, 10121}},
+{9307, 17, 30485, {1, 3, 7, 9, 5, 55, 53, 127, 147, 103, 1697, 485, 7051, 14153, 21631, 35561, 10393}},
+{9308, 17, 30486, {1, 3, 3, 7, 23, 7, 83, 17, 135, 487, 315, 719, 7003, 3919, 13255, 24031, 110493}},
+{9309, 17, 30489, {1, 3, 1, 15, 27, 55, 121, 177, 205, 733, 933, 1535, 2925, 4259, 22203, 59059, 89209}},
+{9310, 17, 30492, {1, 1, 1, 11, 9, 11, 127, 47, 493, 349, 1415, 3089, 4739, 14347, 31579, 20739, 72997}},
+{9311, 17, 30499, {1, 3, 1, 7, 9, 31, 121, 111, 163, 733, 1699, 1507, 5467, 13499, 25269, 6303, 70201}},
+{9312, 17, 30511, {1, 3, 1, 5, 7, 23, 123, 203, 329, 387, 577, 2331, 2283, 14029, 19409, 103, 2477}},
+{9313, 17, 30533, {1, 1, 7, 15, 11, 29, 29, 153, 289, 333, 1669, 2065, 5465, 8835, 28753, 21209, 34283}},
+{9314, 17, 30534, {1, 3, 5, 11, 15, 33, 45, 81, 241, 461, 1167, 1073, 5511, 795, 30955, 49121, 42805}},
+{9315, 17, 30540, {1, 1, 1, 13, 7, 33, 11, 201, 161, 475, 1359, 2329, 177, 9883, 8967, 21399, 73045}},
+{9316, 17, 30545, {1, 3, 3, 1, 25, 59, 85, 51, 481, 751, 1213, 3019, 421, 9903, 30071, 50661, 94715}},
+{9317, 17, 30552, {1, 3, 3, 1, 5, 61, 3, 179, 131, 233, 1627, 3577, 6323, 14161, 21595, 44963, 20215}},
+{9318, 17, 30557, {1, 1, 1, 5, 9, 53, 45, 105, 275, 769, 105, 2757, 6769, 14987, 19955, 18291, 81707}},
+{9319, 17, 30558, {1, 1, 7, 1, 1, 59, 33, 19, 385, 775, 423, 1799, 1325, 13545, 16027, 58347, 102397}},
+{9320, 17, 30567, {1, 1, 3, 11, 15, 61, 63, 59, 355, 659, 1483, 3781, 7383, 5563, 32537, 34175, 40303}},
+{9321, 17, 30568, {1, 3, 5, 7, 5, 37, 19, 223, 323, 129, 287, 2655, 3767, 16201, 4147, 315, 54885}},
+{9322, 17, 30581, {1, 1, 7, 13, 13, 23, 43, 129, 405, 205, 1691, 2189, 3313, 11789, 10263, 16367, 65547}},
+{9323, 17, 30597, {1, 3, 5, 1, 15, 21, 85, 233, 427, 71, 475, 3731, 3335, 11483, 28613, 4335, 35669}},
+{9324, 17, 30607, {1, 1, 3, 3, 31, 47, 27, 109, 373, 451, 1459, 3103, 1941, 10405, 20233, 30517, 122787}},
+{9325, 17, 30621, {1, 3, 1, 7, 3, 11, 113, 49, 355, 465, 1959, 1355, 6521, 10863, 11481, 13385, 31787}},
+{9326, 17, 30632, {1, 3, 1, 1, 9, 45, 125, 69, 267, 413, 717, 2767, 833, 317, 23019, 37753, 3081}},
+{9327, 17, 30650, {1, 1, 7, 7, 13, 55, 75, 105, 71, 505, 239, 3739, 4873, 4257, 18841, 41711, 24045}},
+{9328, 17, 30655, {1, 1, 5, 13, 21, 59, 107, 229, 421, 441, 1079, 3727, 7941, 8443, 30433, 56419, 105751}},
+{9329, 17, 30657, {1, 1, 1, 9, 15, 59, 29, 49, 117, 1009, 1971, 115, 2899, 1069, 29145, 11855, 35277}},
+{9330, 17, 30660, {1, 3, 7, 15, 19, 55, 111, 77, 169, 537, 1695, 2687, 3871, 14017, 15119, 27313, 112807}},
+{9331, 17, 30669, {1, 1, 3, 7, 29, 5, 41, 201, 211, 127, 1877, 643, 2441, 8743, 29393, 6077, 52597}},
+{9332, 17, 30675, {1, 3, 1, 11, 7, 1, 95, 15, 229, 339, 475, 3463, 7827, 9943, 30903, 65013, 1145}},
+{9333, 17, 30678, {1, 1, 1, 5, 23, 19, 81, 23, 475, 169, 373, 1147, 1805, 12779, 13173, 8945, 28175}},
+{9334, 17, 30682, {1, 3, 5, 9, 3, 53, 127, 33, 237, 803, 121, 307, 4981, 8765, 12761, 23601, 92921}},
+{9335, 17, 30687, {1, 1, 3, 7, 17, 63, 11, 37, 213, 619, 1095, 1693, 6747, 7373, 17355, 5987, 97923}},
+{9336, 17, 30688, {1, 1, 3, 15, 11, 37, 109, 175, 503, 339, 591, 2745, 2387, 7419, 13915, 4769, 48229}},
+{9337, 17, 30698, {1, 3, 5, 7, 19, 17, 5, 81, 471, 989, 249, 437, 7309, 5747, 25277, 31911, 87907}},
+{9338, 17, 30711, {1, 3, 1, 7, 15, 25, 49, 243, 423, 911, 1957, 911, 6331, 9831, 26021, 58877, 99257}},
+{9339, 17, 30728, {1, 3, 5, 11, 3, 55, 39, 129, 271, 145, 1973, 3391, 2905, 9229, 7989, 15641, 67933}},
+{9340, 17, 30733, {1, 3, 5, 9, 13, 13, 43, 135, 183, 319, 1391, 2953, 2207, 14205, 31203, 6329, 98907}},
+{9341, 17, 30741, {1, 3, 1, 9, 27, 41, 27, 155, 11, 191, 1747, 975, 7043, 13139, 30387, 47099, 120321}},
+{9342, 17, 30746, {1, 1, 5, 9, 25, 27, 53, 235, 437, 77, 371, 2413, 4867, 14245, 27199, 37387, 88217}},
+{9343, 17, 30752, {1, 1, 7, 7, 11, 59, 103, 15, 109, 65, 1987, 3695, 7737, 7341, 26963, 16075, 6301}},
+{9344, 17, 30764, {1, 3, 7, 5, 7, 59, 109, 159, 121, 377, 1851, 3983, 5421, 7633, 7321, 14869, 54633}},
+{9345, 17, 30769, {1, 1, 3, 15, 21, 51, 35, 243, 397, 411, 1107, 3689, 7913, 14715, 26349, 23361, 90665}},
+{9346, 17, 30784, {1, 1, 1, 3, 5, 11, 77, 205, 187, 981, 1969, 1749, 6295, 8267, 16073, 54451, 103603}},
+{9347, 17, 30796, {1, 3, 3, 9, 11, 13, 113, 83, 243, 1021, 2003, 2277, 6457, 10535, 13461, 52741, 9385}},
+{9348, 17, 30799, {1, 3, 3, 11, 19, 9, 103, 13, 219, 269, 1805, 2689, 5219, 11497, 4909, 57985, 40141}},
+{9349, 17, 30804, {1, 1, 1, 1, 29, 25, 15, 217, 69, 567, 839, 1515, 3627, 9837, 21433, 37177, 10487}},
+{9350, 17, 30811, {1, 1, 7, 15, 15, 23, 119, 217, 277, 447, 551, 825, 7571, 3083, 16573, 1189, 64959}},
+{9351, 17, 30814, {1, 1, 3, 11, 9, 13, 63, 77, 313, 195, 941, 1621, 165, 8905, 20265, 53761, 25091}},
+{9352, 17, 30818, {1, 3, 3, 9, 17, 5, 9, 183, 175, 1015, 253, 233, 2883, 15587, 27175, 38517, 22707}},
+{9353, 17, 30827, {1, 3, 3, 11, 23, 63, 83, 17, 49, 671, 749, 3249, 7821, 7189, 26735, 28995, 101737}},
+{9354, 17, 30838, {1, 1, 7, 5, 25, 15, 97, 247, 161, 585, 1307, 3803, 1105, 9093, 23523, 1383, 65671}},
+{9355, 17, 30842, {1, 1, 3, 15, 29, 51, 65, 237, 349, 709, 799, 1425, 6267, 6283, 4773, 18123, 74833}},
+{9356, 17, 30854, {1, 1, 5, 5, 11, 13, 9, 251, 373, 189, 467, 945, 7279, 11349, 10917, 6581, 83967}},
+{9357, 17, 30863, {1, 1, 7, 15, 23, 27, 1, 197, 41, 325, 757, 1229, 6295, 345, 26147, 40135, 123063}},
+{9358, 17, 30865, {1, 1, 7, 9, 23, 9, 93, 225, 191, 837, 103, 3367, 5411, 8289, 7057, 55391, 10669}},
+{9359, 17, 30877, {1, 1, 5, 15, 21, 17, 49, 221, 487, 23, 1943, 1563, 6157, 4035, 27769, 14933, 56913}},
+{9360, 17, 30881, {1, 1, 5, 13, 13, 43, 67, 245, 457, 365, 1115, 2205, 6229, 4173, 25167, 56333, 55605}},
+{9361, 17, 30887, {1, 1, 5, 11, 15, 59, 109, 83, 17, 913, 497, 1299, 5221, 321, 32139, 13717, 94311}},
+{9362, 17, 30908, {1, 3, 3, 3, 31, 11, 5, 203, 3, 843, 2039, 25, 6211, 14927, 6015, 46269, 90369}},
+{9363, 17, 30916, {1, 1, 3, 9, 21, 51, 91, 203, 149, 147, 197, 1771, 2921, 6609, 2343, 35249, 12963}},
+{9364, 17, 30919, {1, 3, 1, 7, 17, 43, 91, 229, 107, 521, 737, 2355, 5855, 6707, 21217, 47041, 81833}},
+{9365, 17, 30925, {1, 3, 3, 7, 7, 31, 97, 135, 503, 665, 1799, 2937, 6867, 4125, 7375, 34401, 18111}},
+{9366, 17, 30928, {1, 1, 7, 1, 11, 29, 89, 185, 495, 633, 507, 3727, 5999, 5871, 5911, 24877, 10259}},
+{9367, 17, 30944, {1, 1, 1, 13, 25, 3, 25, 65, 91, 411, 147, 3699, 7003, 3017, 25635, 56619, 101491}},
+{9368, 17, 30947, {1, 3, 5, 7, 31, 1, 63, 255, 115, 179, 87, 735, 1649, 4767, 31093, 60149, 49829}},
+{9369, 17, 30950, {1, 1, 3, 1, 21, 63, 67, 85, 399, 279, 1963, 1759, 4679, 15423, 11533, 54387, 36563}},
+{9370, 17, 30968, {1, 3, 5, 3, 31, 53, 73, 73, 481, 443, 1393, 2763, 1199, 5375, 8977, 5369, 114603}},
+{9371, 17, 30971, {1, 1, 1, 3, 29, 47, 73, 205, 469, 187, 815, 2787, 1431, 4705, 11455, 53643, 89269}},
+{9372, 17, 30973, {1, 3, 3, 9, 27, 57, 93, 55, 287, 539, 1259, 3279, 1563, 11399, 22975, 27077, 41031}},
+{9373, 17, 30976, {1, 1, 3, 15, 7, 27, 67, 25, 169, 263, 621, 1921, 509, 11715, 15363, 27447, 75535}},
+{9374, 17, 30986, {1, 1, 1, 9, 29, 63, 31, 99, 321, 361, 1693, 763, 5593, 10815, 741, 31257, 70843}},
+{9375, 17, 30993, {1, 1, 1, 9, 1, 17, 73, 141, 401, 549, 415, 1289, 1697, 1903, 8919, 59563, 60017}},
+{9376, 17, 30994, {1, 3, 7, 3, 5, 51, 127, 221, 9, 929, 153, 1045, 6587, 13653, 5343, 14043, 116125}},
+{9377, 17, 31012, {1, 3, 3, 13, 13, 17, 29, 93, 465, 59, 1207, 3121, 6331, 8647, 5047, 41869, 51969}},
+{9378, 17, 31016, {1, 1, 1, 15, 23, 29, 47, 149, 119, 855, 367, 1419, 7739, 1141, 19787, 38185, 84403}},
+{9379, 17, 31029, {1, 3, 1, 9, 29, 63, 5, 63, 435, 401, 1023, 1981, 6819, 7547, 30065, 33833, 7471}},
+{9380, 17, 31039, {1, 3, 1, 15, 1, 47, 35, 161, 243, 225, 935, 2179, 7737, 7841, 28523, 11505, 103741}},
+{9381, 17, 31041, {1, 1, 7, 3, 7, 57, 73, 55, 101, 905, 1705, 4057, 3781, 8213, 18997, 17185, 33265}},
+{9382, 17, 31042, {1, 1, 5, 1, 7, 57, 31, 77, 323, 395, 927, 1969, 6973, 9013, 30789, 757, 84075}},
+{9383, 17, 31044, {1, 1, 3, 7, 15, 53, 51, 205, 401, 679, 1295, 1955, 7739, 11423, 23207, 55449, 60419}},
+{9384, 17, 31053, {1, 3, 5, 11, 23, 21, 67, 141, 157, 767, 219, 3607, 1847, 11051, 31499, 8461, 106353}},
+{9385, 17, 31059, {1, 1, 3, 9, 17, 19, 123, 169, 1, 31, 1019, 1823, 6043, 1895, 17293, 62079, 16945}},
+{9386, 17, 31062, {1, 3, 5, 9, 3, 15, 49, 27, 183, 293, 989, 2161, 1845, 1103, 20149, 11121, 31935}},
+{9387, 17, 31077, {1, 3, 1, 3, 17, 39, 103, 45, 491, 91, 413, 487, 1381, 5457, 22503, 40477, 94297}},
+{9388, 17, 31095, {1, 1, 3, 7, 29, 11, 87, 79, 349, 437, 945, 3753, 6691, 4373, 24875, 54397, 33697}},
+{9389, 17, 31101, {1, 1, 7, 1, 9, 31, 105, 121, 97, 947, 129, 1909, 2371, 5493, 29523, 52685, 24325}},
+{9390, 17, 31105, {1, 1, 5, 9, 19, 21, 63, 115, 511, 525, 49, 1879, 6075, 8181, 10135, 56785, 53309}},
+{9391, 17, 31118, {1, 1, 5, 15, 3, 55, 75, 135, 451, 697, 1407, 2765, 2443, 11589, 24863, 47187, 98477}},
+{9392, 17, 31129, {1, 1, 1, 13, 27, 37, 77, 157, 121, 603, 491, 2201, 619, 9157, 32511, 19843, 49919}},
+{9393, 17, 31132, {1, 1, 3, 1, 23, 17, 23, 115, 119, 349, 987, 2587, 1847, 12099, 31955, 31685, 1989}},
+{9394, 17, 31141, {1, 3, 7, 7, 5, 47, 63, 209, 69, 921, 1041, 1391, 7485, 11121, 30993, 5691, 74551}},
+{9395, 17, 31159, {1, 3, 1, 3, 23, 61, 55, 253, 355, 299, 971, 279, 3543, 10073, 5199, 50539, 88303}},
+{9396, 17, 31183, {1, 1, 1, 11, 13, 19, 7, 255, 189, 267, 2021, 93, 219, 10537, 28627, 58141, 53675}},
+{9397, 17, 31185, {1, 3, 3, 7, 27, 61, 83, 95, 163, 777, 1533, 2485, 7211, 6979, 4013, 20797, 91411}},
+{9398, 17, 31195, {1, 1, 7, 13, 15, 37, 5, 109, 133, 225, 59, 3855, 3351, 659, 24321, 63531, 15573}},
+{9399, 17, 31202, {1, 1, 5, 1, 7, 55, 59, 213, 45, 77, 2003, 2921, 1105, 11089, 17197, 45459, 67681}},
+{9400, 17, 31213, {1, 1, 1, 5, 13, 21, 107, 245, 505, 409, 1453, 1201, 6945, 2103, 7377, 59413, 8785}},
+{9401, 17, 31238, {1, 1, 1, 13, 5, 37, 73, 55, 39, 219, 225, 3877, 6583, 3105, 25355, 14839, 23435}},
+{9402, 17, 31241, {1, 1, 7, 1, 21, 35, 87, 227, 487, 767, 609, 1685, 2731, 10135, 381, 24021, 122137}},
+{9403, 17, 31252, {1, 1, 1, 3, 29, 13, 19, 255, 355, 505, 1757, 3537, 3029, 11403, 22685, 61169, 397}},
+{9404, 17, 31262, {1, 1, 7, 1, 29, 43, 11, 207, 83, 97, 435, 1453, 4709, 4193, 18517, 47203, 3255}},
+{9405, 17, 31265, {1, 1, 1, 1, 21, 49, 39, 163, 459, 849, 561, 1207, 4109, 1435, 17519, 14839, 1331}},
+{9406, 17, 31295, {1, 1, 3, 11, 27, 35, 65, 219, 135, 559, 1111, 2959, 7835, 5165, 26641, 22765, 121829}},
+{9407, 17, 31300, {1, 3, 5, 3, 23, 31, 57, 149, 431, 451, 189, 1771, 5877, 3503, 7531, 46485, 129031}},
+{9408, 17, 31303, {1, 1, 3, 11, 1, 13, 47, 17, 331, 1003, 215, 2797, 689, 6289, 12719, 37139, 35827}},
+{9409, 17, 31317, {1, 3, 5, 9, 19, 13, 11, 29, 275, 165, 783, 313, 2153, 6009, 2247, 5699, 128753}},
+{9410, 17, 31318, {1, 1, 7, 13, 5, 43, 51, 75, 411, 743, 335, 217, 559, 15389, 6567, 41193, 127443}},
+{9411, 17, 31324, {1, 3, 5, 15, 5, 63, 7, 145, 445, 835, 825, 35, 5951, 5121, 16365, 36789, 2941}},
+{9412, 17, 31338, {1, 3, 5, 5, 29, 1, 61, 19, 427, 245, 445, 3505, 3647, 8817, 8031, 64577, 60745}},
+{9413, 17, 31340, {1, 1, 3, 9, 29, 9, 35, 225, 55, 535, 1537, 831, 6483, 16123, 26079, 32809, 62227}},
+{9414, 17, 31345, {1, 3, 7, 7, 25, 33, 15, 61, 343, 749, 1963, 2763, 3171, 6755, 6529, 49449, 88903}},
+{9415, 17, 31355, {1, 1, 7, 13, 17, 35, 91, 119, 87, 1023, 1101, 1785, 2005, 15947, 21679, 63179, 3389}},
+{9416, 17, 31362, {1, 3, 1, 1, 1, 1, 123, 195, 315, 681, 153, 1621, 5097, 3669, 20505, 39305, 127065}},
+{9417, 17, 31371, {1, 1, 5, 11, 1, 17, 73, 251, 185, 59, 1723, 2321, 2103, 6331, 29571, 63811, 66651}},
+{9418, 17, 31373, {1, 1, 7, 13, 15, 19, 111, 91, 211, 85, 711, 2197, 3107, 2717, 16725, 52995, 65791}},
+{9419, 17, 31381, {1, 3, 3, 9, 21, 41, 53, 145, 459, 155, 93, 2833, 6747, 737, 30625, 40581, 65825}},
+{9420, 17, 31391, {1, 3, 3, 3, 1, 45, 119, 81, 185, 431, 1221, 3043, 7277, 10537, 12355, 42261, 126117}},
+{9421, 17, 31409, {1, 3, 7, 7, 11, 47, 37, 41, 123, 643, 707, 2963, 6183, 15527, 10951, 24031, 38187}},
+{9422, 17, 31410, {1, 3, 1, 7, 13, 57, 1, 149, 117, 627, 1999, 2805, 4857, 12805, 31453, 25699, 109447}},
+{9423, 17, 31412, {1, 3, 5, 3, 9, 37, 83, 221, 77, 573, 661, 465, 1279, 7355, 24061, 36151, 96595}},
+{9424, 17, 31434, {1, 1, 7, 15, 29, 31, 125, 205, 449, 563, 1263, 3427, 8013, 14025, 15235, 11833, 25601}},
+{9425, 17, 31458, {1, 3, 7, 11, 31, 35, 99, 193, 163, 527, 1455, 395, 4853, 2561, 11909, 57311, 101007}},
+{9426, 17, 31467, {1, 1, 5, 3, 17, 39, 99, 173, 497, 245, 1671, 3457, 83, 11959, 2963, 3401, 102259}},
+{9427, 17, 31470, {1, 1, 1, 5, 25, 41, 119, 81, 301, 797, 661, 2543, 1195, 2111, 1785, 41533, 51947}},
+{9428, 17, 31475, {1, 3, 3, 13, 5, 59, 61, 153, 213, 541, 1849, 249, 3897, 3877, 17095, 6857, 76781}},
+{9429, 17, 31481, {1, 3, 7, 1, 19, 13, 57, 47, 359, 165, 1085, 2263, 3261, 12825, 17405, 25853, 20731}},
+{9430, 17, 31482, {1, 1, 1, 7, 7, 43, 7, 65, 51, 503, 173, 1023, 283, 14809, 1183, 33497, 110683}},
+{9431, 17, 31484, {1, 3, 5, 11, 19, 51, 29, 157, 159, 191, 1293, 2951, 6569, 12433, 14587, 30631, 30485}},
+{9432, 17, 31492, {1, 3, 7, 5, 1, 27, 25, 221, 255, 471, 779, 3991, 6985, 1803, 28451, 33403, 5567}},
+{9433, 17, 31507, {1, 1, 5, 5, 7, 29, 55, 241, 457, 863, 1715, 3393, 4127, 13985, 6313, 13683, 114837}},
+{9434, 17, 31514, {1, 3, 5, 5, 11, 27, 55, 109, 247, 199, 1593, 2881, 307, 97, 24751, 35921, 121931}},
+{9435, 17, 31538, {1, 3, 1, 13, 3, 59, 17, 161, 47, 467, 1019, 3629, 3017, 15645, 3983, 32393, 79213}},
+{9436, 17, 31547, {1, 1, 3, 11, 19, 57, 67, 199, 319, 107, 2043, 2045, 4025, 5733, 29979, 37721, 117031}},
+{9437, 17, 31549, {1, 3, 7, 11, 9, 23, 31, 81, 177, 801, 1177, 3451, 7777, 15351, 7579, 39033, 23847}},
+{9438, 17, 31555, {1, 1, 3, 5, 17, 61, 63, 7, 371, 905, 1147, 1383, 4075, 6721, 17503, 32015, 112547}},
+{9439, 17, 31557, {1, 1, 3, 13, 13, 25, 69, 159, 49, 133, 227, 2155, 1603, 10077, 3429, 39131, 18949}},
+{9440, 17, 31597, {1, 3, 5, 3, 29, 5, 115, 93, 243, 791, 1113, 2841, 4733, 3041, 31733, 28539, 84567}},
+{9441, 17, 31598, {1, 3, 3, 7, 21, 9, 5, 95, 489, 517, 1453, 2697, 7951, 12369, 19571, 29811, 51805}},
+{9442, 17, 31610, {1, 1, 5, 9, 1, 29, 97, 191, 73, 357, 745, 2787, 7815, 4565, 19761, 33729, 86849}},
+{9443, 17, 31625, {1, 3, 5, 13, 3, 5, 35, 79, 387, 813, 1673, 3187, 337, 5539, 6761, 46903, 122967}},
+{9444, 17, 31634, {1, 1, 7, 11, 1, 15, 125, 175, 255, 35, 145, 2391, 887, 10505, 11587, 53941, 5089}},
+{9445, 17, 31643, {1, 1, 7, 13, 9, 13, 15, 215, 361, 227, 1665, 3345, 3615, 14031, 16281, 4457, 52037}},
+{9446, 17, 31645, {1, 3, 5, 9, 31, 21, 3, 189, 211, 855, 1781, 2097, 1345, 6763, 27651, 54137, 52689}},
+{9447, 17, 31659, {1, 3, 1, 5, 29, 9, 99, 183, 183, 205, 149, 53, 7179, 3387, 9603, 4281, 47145}},
+{9448, 17, 31669, {1, 3, 1, 11, 13, 35, 97, 21, 29, 877, 191, 1621, 2501, 4283, 1707, 48957, 129029}},
+{9449, 17, 31670, {1, 3, 1, 9, 5, 19, 57, 219, 105, 467, 1179, 3155, 7743, 4835, 14845, 35671, 47655}},
+{9450, 17, 31682, {1, 3, 1, 7, 27, 41, 27, 185, 271, 611, 1173, 2875, 529, 11619, 20231, 18741, 41799}},
+{9451, 17, 31694, {1, 3, 7, 13, 9, 3, 35, 71, 467, 689, 1797, 319, 6657, 13193, 15861, 7567, 12891}},
+{9452, 17, 31717, {1, 1, 7, 13, 19, 57, 25, 141, 195, 995, 859, 811, 4685, 6711, 8963, 49657, 54751}},
+{9453, 17, 31718, {1, 1, 1, 11, 27, 25, 9, 91, 97, 251, 757, 2783, 5447, 3617, 26801, 32501, 55245}},
+{9454, 17, 31729, {1, 3, 7, 1, 5, 1, 103, 129, 127, 593, 857, 3957, 3665, 10279, 26211, 2095, 15869}},
+{9455, 17, 31736, {1, 1, 7, 1, 25, 49, 3, 139, 25, 545, 615, 1353, 4103, 1099, 21729, 45383, 110611}},
+{9456, 17, 31742, {1, 3, 5, 3, 7, 49, 83, 41, 209, 357, 939, 849, 5851, 3945, 831, 8131, 105897}},
+{9457, 17, 31749, {1, 1, 1, 3, 27, 19, 123, 71, 195, 1019, 1021, 1287, 5665, 5277, 8647, 27033, 89539}},
+{9458, 17, 31773, {1, 1, 1, 9, 27, 51, 49, 159, 401, 1013, 763, 653, 1449, 12441, 21191, 28871, 106181}},
+{9459, 17, 31777, {1, 1, 5, 7, 31, 7, 105, 137, 331, 367, 1305, 2761, 863, 3915, 12633, 32251, 82867}},
+{9460, 17, 31778, {1, 3, 7, 11, 9, 47, 35, 57, 137, 269, 443, 79, 11, 11817, 28995, 46681, 104263}},
+{9461, 17, 31784, {1, 3, 1, 5, 3, 25, 89, 179, 183, 835, 367, 2215, 295, 5365, 1899, 10785, 88979}},
+{9462, 17, 31801, {1, 3, 7, 13, 3, 5, 93, 43, 409, 363, 267, 2077, 3745, 445, 25957, 34103, 29475}},
+{9463, 17, 31812, {1, 1, 1, 7, 27, 21, 121, 29, 171, 783, 553, 265, 6835, 3929, 18127, 33463, 70999}},
+{9464, 17, 31821, {1, 3, 3, 15, 15, 55, 13, 1, 297, 935, 1307, 1779, 2239, 15471, 32453, 30649, 45973}},
+{9465, 17, 31822, {1, 3, 7, 5, 25, 41, 3, 171, 347, 607, 1873, 1087, 2433, 8377, 7959, 19941, 117319}},
+{9466, 17, 31836, {1, 1, 1, 3, 5, 47, 107, 69, 431, 63, 325, 1241, 3487, 11249, 28559, 30001, 93789}},
+{9467, 17, 31850, {1, 1, 1, 5, 15, 17, 9, 145, 335, 169, 1099, 3637, 5397, 6711, 16095, 27053, 124247}},
+{9468, 17, 31855, {1, 3, 3, 5, 3, 9, 65, 97, 421, 951, 2003, 2837, 7095, 15685, 5147, 56801, 98679}},
+{9469, 17, 31858, {1, 3, 7, 15, 1, 33, 115, 45, 215, 253, 361, 555, 787, 15483, 25531, 53273, 8933}},
+{9470, 17, 31860, {1, 3, 1, 9, 3, 63, 47, 205, 457, 977, 991, 3189, 1369, 14899, 10937, 56999, 11525}},
+{9471, 17, 31886, {1, 1, 7, 5, 11, 61, 53, 55, 231, 357, 1695, 2489, 2355, 7583, 14097, 50039, 96595}},
+{9472, 17, 31891, {1, 3, 7, 7, 3, 57, 115, 245, 259, 573, 1275, 2971, 1793, 13683, 8683, 51815, 26807}},
+{9473, 17, 31909, {1, 1, 5, 3, 17, 59, 55, 237, 491, 757, 1447, 2941, 2641, 14175, 4401, 4367, 36853}},
+{9474, 17, 31928, {1, 3, 1, 15, 3, 63, 67, 1, 403, 79, 1161, 2379, 3337, 14447, 5877, 40759, 12573}},
+{9475, 17, 31931, {1, 1, 7, 15, 17, 1, 91, 5, 173, 215, 1567, 1851, 3309, 9813, 21215, 19151, 96785}},
+{9476, 17, 31934, {1, 1, 1, 9, 31, 45, 123, 221, 397, 51, 1489, 3247, 923, 10423, 10461, 51231, 92909}},
+{9477, 17, 31941, {1, 1, 1, 13, 27, 17, 105, 163, 403, 193, 1487, 2421, 4415, 14303, 6419, 24105, 29997}},
+{9478, 17, 31942, {1, 1, 5, 13, 31, 55, 17, 125, 341, 219, 401, 1611, 891, 12909, 13949, 46245, 26769}},
+{9479, 17, 31945, {1, 3, 7, 3, 31, 41, 65, 207, 311, 643, 1617, 271, 3749, 14635, 26385, 55251, 50719}},
+{9480, 17, 31951, {1, 3, 3, 13, 7, 55, 69, 241, 413, 399, 137, 2255, 5395, 12625, 26583, 64603, 22571}},
+{9481, 17, 31959, {1, 3, 5, 3, 31, 15, 15, 161, 153, 445, 595, 273, 6631, 12845, 23331, 16963, 52099}},
+{9482, 17, 31963, {1, 3, 3, 1, 27, 39, 71, 41, 455, 841, 831, 1719, 3531, 5113, 29183, 1933, 42227}},
+{9483, 17, 31970, {1, 3, 7, 3, 1, 15, 31, 183, 429, 557, 1747, 1059, 2079, 16361, 29103, 43207, 921}},
+{9484, 17, 31984, {1, 3, 1, 1, 31, 39, 97, 73, 339, 405, 1423, 2215, 5435, 9205, 1889, 58249, 61517}},
+{9485, 17, 31987, {1, 3, 7, 1, 23, 59, 127, 245, 11, 627, 1555, 2497, 6427, 7205, 22675, 62847, 69691}},
+{9486, 17, 31990, {1, 1, 3, 5, 1, 13, 95, 9, 167, 481, 947, 3181, 8057, 5559, 7537, 33757, 72419}},
+{9487, 17, 32001, {1, 1, 7, 3, 15, 9, 105, 205, 287, 375, 115, 1731, 1063, 11551, 12077, 41013, 88853}},
+{9488, 17, 32007, {1, 3, 3, 9, 5, 63, 127, 33, 409, 279, 1379, 4069, 4091, 14703, 27435, 19525, 71261}},
+{9489, 17, 32008, {1, 3, 1, 13, 31, 31, 59, 205, 167, 131, 891, 1259, 6909, 211, 31517, 8085, 112065}},
+{9490, 17, 32025, {1, 1, 5, 11, 17, 25, 119, 77, 449, 569, 381, 825, 2459, 983, 2959, 51611, 90721}},
+{9491, 17, 32035, {1, 3, 1, 7, 17, 55, 91, 231, 133, 541, 499, 3609, 4237, 11627, 30007, 58911, 43443}},
+{9492, 17, 32038, {1, 3, 7, 7, 29, 5, 47, 187, 71, 695, 1389, 2855, 5815, 11605, 3643, 24961, 25793}},
+{9493, 17, 32047, {1, 3, 3, 5, 11, 31, 43, 31, 185, 1021, 795, 3585, 3981, 8627, 18117, 42351, 19513}},
+{9494, 17, 32049, {1, 1, 5, 13, 9, 3, 115, 45, 39, 577, 1847, 653, 2625, 9367, 27923, 35661, 113613}},
+{9495, 17, 32062, {1, 3, 7, 7, 17, 9, 69, 233, 367, 673, 11, 2215, 1177, 4501, 9693, 62013, 45647}},
+{9496, 17, 32067, {1, 3, 5, 7, 7, 53, 11, 227, 465, 843, 2017, 689, 6767, 10321, 25163, 56561, 6865}},
+{9497, 17, 32070, {1, 3, 3, 5, 13, 43, 119, 9, 185, 893, 133, 863, 7137, 6653, 7875, 23167, 13893}},
+{9498, 17, 32073, {1, 3, 5, 9, 1, 47, 17, 85, 273, 901, 493, 2411, 983, 15717, 25151, 21323, 57939}},
+{9499, 17, 32074, {1, 1, 7, 5, 19, 17, 49, 37, 425, 443, 781, 2593, 4929, 12313, 12727, 42285, 88451}},
+{9500, 17, 32079, {1, 3, 3, 11, 9, 53, 17, 67, 237, 463, 1509, 2153, 3715, 7909, 21151, 64517, 87695}},
+{9501, 17, 32081, {1, 3, 7, 1, 29, 39, 25, 83, 413, 1005, 2011, 3933, 2911, 7041, 10537, 23135, 22671}},
+{9502, 17, 32082, {1, 1, 3, 9, 23, 61, 117, 33, 431, 181, 1819, 683, 1809, 1723, 27041, 29113, 99347}},
+{9503, 17, 32107, {1, 1, 5, 11, 11, 7, 101, 181, 51, 857, 923, 3495, 7123, 7775, 30081, 48513, 116137}},
+{9504, 17, 32127, {1, 1, 3, 11, 15, 31, 97, 127, 365, 799, 715, 2101, 6081, 11607, 1055, 35027, 62967}},
+{9505, 17, 32145, {1, 3, 5, 7, 3, 31, 109, 247, 225, 221, 1093, 2633, 1847, 7427, 8767, 16581, 32145}},
+{9506, 17, 32151, {1, 3, 1, 7, 15, 23, 43, 109, 327, 417, 1895, 2333, 6265, 6599, 6623, 47375, 92731}},
+{9507, 17, 32152, {1, 3, 7, 1, 29, 29, 45, 217, 163, 941, 1327, 3685, 5481, 15783, 26281, 60339, 34277}},
+{9508, 17, 32173, {1, 1, 7, 11, 1, 7, 119, 201, 29, 193, 1805, 1395, 267, 2011, 637, 26765, 48883}},
+{9509, 17, 32174, {1, 1, 3, 7, 11, 63, 41, 89, 365, 729, 25, 3185, 2143, 1737, 29693, 7443, 78079}},
+{9510, 17, 32186, {1, 3, 1, 13, 25, 27, 63, 233, 79, 1007, 1357, 679, 7581, 8333, 2469, 31787, 128531}},
+{9511, 17, 32194, {1, 3, 1, 3, 23, 39, 53, 99, 219, 475, 931, 507, 3615, 10613, 14663, 1151, 123459}},
+{9512, 17, 32196, {1, 1, 1, 1, 13, 15, 67, 45, 393, 791, 415, 2731, 1151, 8935, 28983, 7239, 106247}},
+{9513, 17, 32200, {1, 3, 7, 7, 11, 35, 95, 153, 421, 193, 1997, 2587, 3183, 9229, 17663, 28221, 6759}},
+{9514, 17, 32208, {1, 3, 1, 7, 5, 5, 123, 55, 509, 973, 261, 463, 2723, 15225, 1925, 62283, 86329}},
+{9515, 17, 32218, {1, 1, 3, 13, 5, 47, 123, 239, 273, 407, 1725, 717, 1229, 1387, 11743, 13739, 104503}},
+{9516, 17, 32236, {1, 3, 3, 13, 23, 35, 43, 113, 299, 847, 1903, 3445, 3395, 641, 11271, 61517, 40747}},
+{9517, 17, 32260, {1, 3, 1, 15, 17, 49, 97, 9, 335, 731, 151, 167, 8129, 11845, 18285, 20113, 122397}},
+{9518, 17, 32263, {1, 1, 5, 11, 11, 63, 3, 153, 345, 511, 1939, 1815, 7231, 10555, 14293, 50753, 14681}},
+{9519, 17, 32288, {1, 3, 7, 5, 21, 31, 127, 223, 241, 783, 887, 3519, 4743, 3541, 4143, 57461, 27791}},
+{9520, 17, 32298, {1, 1, 5, 7, 13, 15, 83, 225, 201, 979, 145, 769, 1491, 12155, 21307, 64877, 113277}},
+{9521, 17, 32315, {1, 1, 7, 1, 27, 25, 105, 69, 239, 323, 1059, 573, 4913, 14215, 27007, 42351, 66315}},
+{9522, 17, 32332, {1, 1, 3, 11, 21, 33, 93, 23, 363, 633, 935, 637, 6171, 12695, 14077, 17505, 69681}},
+{9523, 17, 32340, {1, 3, 1, 5, 15, 11, 93, 211, 175, 377, 33, 1403, 5097, 1503, 8483, 2881, 85877}},
+{9524, 17, 32354, {1, 1, 5, 3, 5, 51, 5, 255, 429, 661, 625, 3015, 4813, 3573, 22917, 45967, 70559}},
+{9525, 17, 32359, {1, 1, 7, 3, 11, 41, 3, 197, 181, 897, 767, 1385, 7395, 15543, 4655, 40309, 73169}},
+{9526, 17, 32366, {1, 1, 5, 9, 15, 35, 71, 119, 509, 817, 1169, 75, 1337, 2959, 611, 38243, 46987}},
+{9527, 17, 32368, {1, 1, 1, 9, 1, 7, 43, 65, 479, 625, 1685, 1309, 5619, 14163, 13633, 18169, 8311}},
+{9528, 17, 32377, {1, 3, 5, 9, 19, 39, 95, 105, 273, 1023, 79, 229, 6895, 2931, 5717, 27911, 22139}},
+{9529, 17, 32384, {1, 3, 5, 7, 1, 55, 15, 15, 297, 731, 2029, 2789, 11, 1333, 26571, 62595, 15131}},
+{9530, 17, 32399, {1, 1, 5, 7, 29, 35, 3, 125, 381, 709, 2047, 2395, 6315, 2301, 7175, 19857, 75085}},
+{9531, 17, 32417, {1, 1, 5, 15, 23, 45, 95, 117, 49, 635, 1525, 1105, 7335, 4653, 18159, 29729, 62627}},
+{9532, 17, 32424, {1, 3, 3, 11, 29, 19, 29, 169, 141, 243, 1765, 1829, 4555, 16299, 3053, 58933, 44605}},
+{9533, 17, 32427, {1, 1, 3, 15, 5, 45, 35, 213, 385, 993, 1521, 9, 3561, 10497, 12601, 38163, 86501}},
+{9534, 17, 32429, {1, 3, 3, 13, 9, 23, 109, 95, 491, 1003, 473, 3325, 6577, 14617, 17765, 33391, 82927}},
+{9535, 17, 32438, {1, 3, 3, 11, 25, 31, 93, 111, 231, 71, 1233, 3581, 6789, 4569, 16741, 61967, 32249}},
+{9536, 17, 32442, {1, 3, 3, 15, 15, 63, 39, 247, 79, 923, 327, 2639, 2013, 12325, 18133, 60623, 2215}},
+{9537, 17, 32447, {1, 3, 5, 1, 5, 49, 121, 53, 283, 529, 37, 3233, 6285, 12447, 4355, 9343, 45631}},
+{9538, 17, 32469, {1, 1, 7, 11, 11, 11, 111, 139, 429, 279, 1019, 2139, 2033, 6809, 8847, 22535, 107005}},
+{9539, 17, 32479, {1, 3, 5, 1, 1, 21, 35, 97, 167, 57, 491, 511, 4065, 11699, 16851, 6847, 40929}},
+{9540, 17, 32483, {1, 3, 1, 15, 3, 55, 113, 33, 255, 537, 835, 1867, 3927, 839, 955, 29079, 93727}},
+{9541, 17, 32498, {1, 1, 7, 3, 5, 7, 35, 111, 165, 885, 115, 3051, 4541, 1701, 22827, 361, 91843}},
+{9542, 17, 32503, {1, 1, 7, 11, 7, 55, 81, 43, 237, 725, 1761, 1599, 639, 14189, 31241, 52827, 107943}},
+{9543, 17, 32507, {1, 3, 1, 3, 29, 35, 67, 119, 369, 877, 1861, 123, 8121, 13861, 31155, 60245, 79799}},
+{9544, 17, 32521, {1, 1, 3, 13, 7, 49, 63, 19, 253, 723, 639, 1677, 291, 13697, 22231, 46893, 90069}},
+{9545, 17, 32532, {1, 3, 5, 1, 7, 57, 29, 233, 35, 715, 515, 3221, 2715, 13839, 18321, 4445, 103843}},
+{9546, 17, 32539, {1, 3, 1, 7, 1, 63, 33, 7, 481, 461, 1923, 2679, 2441, 5449, 13233, 2245, 48667}},
+{9547, 17, 32551, {1, 1, 7, 11, 11, 9, 95, 151, 441, 333, 1871, 1181, 3027, 12887, 11923, 63847, 6953}},
+{9548, 17, 32572, {1, 3, 5, 5, 15, 33, 53, 47, 351, 387, 55, 393, 5475, 3027, 18565, 37997, 120877}},
+{9549, 17, 32577, {1, 3, 5, 9, 23, 43, 67, 97, 445, 783, 1499, 1977, 1441, 10159, 13479, 149, 4939}},
+{9550, 17, 32578, {1, 3, 7, 3, 15, 41, 119, 55, 139, 25, 849, 857, 53, 10421, 2683, 24839, 107797}},
+{9551, 17, 32587, {1, 1, 7, 13, 25, 51, 51, 13, 333, 93, 95, 1755, 3055, 12585, 3519, 44857, 11257}},
+{9552, 17, 32592, {1, 1, 5, 11, 29, 55, 13, 235, 419, 327, 823, 2675, 8031, 9303, 8749, 20215, 12111}},
+{9553, 17, 32602, {1, 1, 3, 5, 7, 31, 103, 19, 467, 255, 583, 419, 2845, 12179, 63, 51693, 9755}},
+{9554, 17, 32604, {1, 1, 1, 13, 15, 29, 109, 81, 381, 659, 601, 3867, 7663, 7307, 16445, 56327, 48559}},
+{9555, 17, 32613, {1, 3, 3, 15, 31, 35, 29, 153, 423, 247, 55, 3259, 6199, 4199, 13931, 14433, 52645}},
+{9556, 17, 32625, {1, 1, 5, 11, 9, 17, 17, 191, 231, 977, 721, 2817, 2485, 4965, 32341, 55131, 4547}},
+{9557, 17, 32631, {1, 1, 7, 7, 7, 7, 89, 69, 299, 503, 597, 311, 1321, 2335, 30193, 45347, 126631}},
+{9558, 17, 32641, {1, 1, 7, 11, 13, 43, 105, 153, 89, 229, 1573, 1549, 3699, 15981, 28911, 45011, 83759}},
+{9559, 17, 32642, {1, 3, 7, 3, 1, 3, 121, 137, 263, 325, 1449, 3793, 5795, 7715, 7449, 26453, 85081}},
+{9560, 17, 32644, {1, 3, 1, 7, 23, 15, 39, 217, 99, 873, 1641, 1411, 4627, 283, 20707, 41795, 62239}},
+{9561, 17, 32656, {1, 3, 5, 9, 15, 15, 35, 255, 501, 945, 79, 799, 2361, 4495, 27825, 27699, 129335}},
+{9562, 17, 32678, {1, 3, 1, 7, 9, 19, 89, 31, 65, 905, 1475, 1353, 7253, 12825, 20723, 47757, 12007}},
+{9563, 17, 32681, {1, 1, 3, 3, 15, 35, 83, 239, 463, 835, 1249, 2521, 3429, 14073, 13569, 6161, 71309}},
+{9564, 17, 32701, {1, 1, 7, 11, 31, 43, 15, 57, 461, 917, 339, 3787, 2925, 1879, 7217, 17091, 108819}},
+{9565, 17, 32713, {1, 3, 7, 3, 17, 51, 29, 105, 221, 941, 1291, 835, 1563, 15623, 2953, 62985, 63037}},
+{9566, 17, 32721, {1, 1, 7, 3, 1, 39, 83, 41, 399, 465, 587, 2011, 137, 6017, 5067, 52389, 71053}},
+{9567, 17, 32727, {1, 1, 7, 11, 17, 55, 103, 239, 173, 181, 1219, 2671, 5183, 3799, 19589, 31247, 68889}},
+{9568, 17, 32731, {1, 1, 3, 3, 21, 43, 123, 253, 281, 627, 353, 3077, 1685, 12143, 19723, 57775, 70761}},
+{9569, 17, 32734, {1, 1, 7, 15, 31, 13, 101, 159, 311, 305, 1783, 3523, 149, 9269, 7103, 40315, 30569}},
+{9570, 17, 32740, {1, 1, 5, 3, 29, 47, 11, 219, 301, 207, 1361, 563, 7831, 14469, 18983, 54535, 64647}},
+{9571, 17, 32773, {1, 1, 3, 15, 11, 37, 85, 237, 225, 1009, 1065, 985, 6849, 5395, 22853, 43965, 51363}},
+{9572, 17, 32774, {1, 3, 3, 1, 11, 61, 45, 131, 201, 609, 757, 2539, 3817, 9309, 24759, 26789, 41437}},
+{9573, 17, 32785, {1, 1, 7, 3, 21, 5, 19, 137, 75, 573, 583, 2499, 41, 3429, 24273, 36711, 110015}},
+{9574, 17, 32788, {1, 3, 7, 9, 1, 51, 39, 75, 115, 269, 1983, 2709, 6989, 6521, 5551, 43675, 1019}},
+{9575, 17, 32792, {1, 1, 3, 9, 27, 1, 125, 7, 67, 821, 275, 1253, 4635, 3557, 4155, 13831, 1523}},
+{9576, 17, 32797, {1, 1, 5, 15, 23, 15, 79, 43, 275, 791, 1867, 2495, 2933, 2167, 22819, 52913, 88871}},
+{9577, 17, 32801, {1, 1, 1, 5, 31, 59, 27, 153, 159, 919, 219, 3373, 3227, 6321, 27559, 33905, 126145}},
+{9578, 17, 32811, {1, 3, 3, 13, 23, 21, 119, 175, 119, 741, 1745, 3985, 3847, 5163, 13699, 32373, 75201}},
+{9579, 17, 32821, {1, 3, 7, 15, 1, 47, 101, 89, 425, 269, 713, 3587, 3373, 13315, 16481, 40031, 50353}},
+{9580, 17, 32828, {1, 3, 7, 3, 19, 29, 5, 69, 385, 979, 1893, 1849, 8007, 14415, 18343, 60555, 109117}},
+{9581, 17, 32839, {1, 1, 3, 13, 5, 35, 111, 239, 489, 395, 1565, 1607, 543, 89, 8971, 22311, 899}},
+{9582, 17, 32854, {1, 1, 7, 7, 11, 51, 105, 211, 341, 85, 991, 1275, 3995, 12611, 2363, 29501, 44217}},
+{9583, 17, 32867, {1, 1, 5, 13, 9, 17, 93, 69, 145, 917, 469, 1109, 7405, 12903, 8341, 50383, 20133}},
+{9584, 17, 32870, {1, 3, 1, 7, 27, 45, 45, 85, 101, 161, 1117, 2757, 7847, 359, 17155, 27073, 123535}},
+{9585, 17, 32873, {1, 3, 1, 3, 9, 11, 67, 205, 109, 257, 1635, 141, 3969, 11571, 211, 48683, 108671}},
+{9586, 17, 32881, {1, 1, 3, 7, 13, 9, 29, 251, 113, 851, 1549, 981, 5553, 6095, 28885, 32953, 112563}},
+{9587, 17, 32891, {1, 1, 5, 7, 11, 5, 13, 83, 343, 499, 587, 3887, 3859, 11459, 7361, 25665, 86151}},
+{9588, 17, 32900, {1, 1, 5, 1, 13, 43, 3, 37, 273, 749, 1707, 2069, 3083, 1095, 3081, 23919, 21939}},
+{9589, 17, 32903, {1, 3, 5, 13, 13, 49, 115, 99, 357, 95, 699, 2615, 1911, 12675, 8607, 12535, 118651}},
+{9590, 17, 32910, {1, 1, 7, 7, 29, 43, 17, 131, 271, 895, 1427, 3659, 1843, 8247, 1175, 48239, 54435}},
+{9591, 17, 32917, {1, 1, 1, 9, 1, 27, 85, 163, 353, 669, 745, 317, 2505, 7685, 14831, 31131, 106687}},
+{9592, 17, 32922, {1, 1, 7, 9, 1, 23, 121, 53, 289, 651, 303, 3049, 6819, 6733, 17485, 20023, 110009}},
+{9593, 17, 32928, {1, 3, 7, 3, 5, 47, 93, 75, 363, 479, 825, 1801, 6807, 3341, 6419, 9889, 5557}},
+{9594, 17, 32945, {1, 1, 3, 15, 23, 5, 7, 25, 73, 811, 1597, 2041, 6707, 6817, 20427, 50749, 46255}},
+{9595, 17, 32946, {1, 3, 7, 9, 1, 11, 61, 63, 435, 977, 1937, 93, 2685, 643, 20113, 25873, 63829}},
+{9596, 17, 32951, {1, 1, 3, 15, 5, 41, 31, 53, 143, 271, 27, 3899, 5045, 1063, 17229, 52715, 67689}},
+{9597, 17, 32958, {1, 1, 3, 11, 1, 57, 121, 13, 291, 861, 1547, 3899, 7949, 15401, 29807, 52307, 104359}},
+{9598, 17, 32965, {1, 3, 5, 15, 23, 3, 95, 43, 377, 437, 1687, 3075, 5131, 11791, 3637, 12621, 105575}},
+{9599, 17, 32978, {1, 3, 1, 3, 27, 1, 117, 11, 153, 401, 1971, 2097, 3227, 14603, 4757, 56281, 112263}},
+{9600, 17, 32980, {1, 3, 3, 5, 13, 25, 51, 209, 367, 327, 1941, 1943, 1347, 14393, 31997, 16001, 129047}},
+{9601, 17, 32983, {1, 1, 5, 11, 19, 51, 109, 229, 71, 923, 1741, 1193, 4657, 6043, 26703, 17757, 75009}},
+{9602, 17, 32987, {1, 1, 7, 3, 23, 3, 125, 165, 137, 999, 1583, 3493, 859, 15603, 7143, 28791, 28201}},
+{9603, 17, 33023, {1, 1, 5, 11, 29, 57, 65, 41, 295, 729, 635, 1871, 6347, 3509, 59, 40765, 42673}},
+{9604, 17, 33031, {1, 3, 3, 3, 15, 59, 53, 97, 15, 131, 891, 1105, 841, 6065, 14427, 4721, 106433}},
+{9605, 17, 33032, {1, 1, 1, 7, 19, 37, 101, 121, 141, 613, 1363, 691, 1731, 12477, 8339, 55669, 99379}},
+{9606, 17, 33035, {1, 3, 5, 13, 17, 49, 75, 25, 447, 113, 1853, 3465, 5225, 4531, 14287, 1039, 17399}},
+{9607, 17, 33038, {1, 3, 5, 3, 3, 49, 101, 79, 117, 939, 1161, 1991, 2343, 7183, 12599, 52877, 94337}},
+{9608, 17, 33040, {1, 3, 1, 1, 19, 47, 73, 195, 475, 435, 1807, 2723, 7885, 15469, 26057, 37325, 57005}},
+{9609, 17, 33043, {1, 1, 1, 11, 17, 7, 111, 143, 357, 977, 719, 553, 4559, 7225, 10405, 26895, 8385}},
+{9610, 17, 33050, {1, 3, 3, 9, 17, 5, 1, 73, 125, 913, 1275, 2387, 5153, 13611, 20585, 8465, 27545}},
+{9611, 17, 33059, {1, 1, 7, 5, 27, 51, 107, 147, 503, 699, 851, 1729, 2875, 16331, 28025, 26451, 92705}},
+{9612, 17, 33080, {1, 1, 5, 9, 3, 37, 21, 139, 13, 427, 225, 1345, 2491, 15495, 25847, 3095, 128879}},
+{9613, 17, 33098, {1, 1, 3, 11, 7, 47, 113, 133, 99, 871, 1151, 1953, 7931, 6389, 28715, 36861, 60017}},
+{9614, 17, 33108, {1, 1, 7, 1, 21, 47, 35, 83, 137, 945, 2047, 3491, 3719, 3001, 20563, 51243, 14491}},
+{9615, 17, 33115, {1, 1, 5, 15, 1, 13, 85, 61, 479, 853, 813, 805, 4931, 12651, 22757, 29531, 92861}},
+{9616, 17, 33117, {1, 3, 7, 7, 27, 63, 31, 169, 43, 185, 637, 729, 7231, 2381, 23539, 53885, 90215}},
+{9617, 17, 33133, {1, 1, 3, 13, 5, 51, 69, 111, 357, 277, 1889, 3809, 8031, 13341, 14261, 34001, 63317}},
+{9618, 17, 33134, {1, 1, 7, 3, 11, 59, 1, 43, 227, 503, 1407, 3917, 7077, 847, 4513, 53007, 66721}},
+{9619, 17, 33157, {1, 1, 5, 11, 15, 25, 109, 169, 25, 391, 597, 2997, 2377, 9045, 15239, 25291, 5451}},
+{9620, 17, 33169, {1, 3, 3, 11, 15, 11, 1, 59, 347, 707, 239, 2473, 8057, 4787, 32247, 17955, 79151}},
+{9621, 17, 33170, {1, 3, 7, 11, 9, 59, 9, 117, 137, 713, 451, 1105, 4485, 14979, 26271, 46017, 89211}},
+{9622, 17, 33176, {1, 3, 3, 3, 3, 19, 95, 131, 413, 291, 1179, 3265, 7107, 10419, 13527, 19905, 8059}},
+{9623, 17, 33182, {1, 3, 7, 9, 29, 43, 19, 243, 443, 27, 1401, 3469, 6925, 2833, 19715, 39667, 11983}},
+{9624, 17, 33192, {1, 3, 3, 7, 23, 33, 115, 59, 29, 61, 1085, 1115, 4007, 12673, 26479, 22397, 95609}},
+{9625, 17, 33205, {1, 3, 3, 5, 1, 47, 43, 83, 21, 621, 59, 1, 891, 12285, 31855, 48641, 52479}},
+{9626, 17, 33212, {1, 3, 3, 5, 3, 9, 17, 181, 15, 315, 1705, 2461, 1853, 14007, 17665, 40593, 126179}},
+{9627, 17, 33215, {1, 3, 5, 3, 3, 23, 83, 163, 29, 293, 1891, 2631, 2989, 7295, 2441, 21689, 8187}},
+{9628, 17, 33217, {1, 3, 1, 1, 1, 23, 53, 215, 185, 843, 1083, 2603, 3857, 4981, 25079, 20249, 93717}},
+{9629, 17, 33227, {1, 3, 5, 11, 7, 61, 127, 13, 449, 395, 1909, 3967, 2441, 3073, 8159, 33979, 26345}},
+{9630, 17, 33229, {1, 1, 5, 1, 15, 5, 93, 87, 319, 173, 1729, 1395, 1019, 5139, 10819, 29877, 81025}},
+{9631, 17, 33238, {1, 3, 3, 7, 17, 55, 61, 227, 299, 245, 849, 211, 895, 2999, 18215, 37069, 32821}},
+{9632, 17, 33241, {1, 1, 5, 3, 17, 49, 115, 55, 447, 533, 1463, 2983, 3245, 9345, 11955, 49145, 128035}},
+{9633, 17, 33260, {1, 3, 1, 7, 5, 17, 61, 71, 101, 529, 1761, 827, 7887, 5713, 31039, 18087, 82277}},
+{9634, 17, 33271, {1, 3, 1, 11, 27, 59, 1, 231, 303, 431, 1279, 3647, 1333, 3675, 29401, 55533, 65997}},
+{9635, 17, 33278, {1, 1, 5, 9, 7, 9, 111, 245, 269, 919, 1147, 1601, 6219, 4931, 3035, 12231, 4011}},
+{9636, 17, 33293, {1, 3, 5, 15, 3, 19, 83, 25, 129, 979, 79, 3027, 3983, 7703, 16859, 12085, 83115}},
+{9637, 17, 33294, {1, 1, 5, 11, 31, 41, 99, 3, 383, 943, 1579, 2435, 1209, 161, 31733, 11755, 95697}},
+{9638, 17, 33296, {1, 1, 1, 9, 9, 55, 115, 187, 499, 165, 1081, 813, 2545, 8065, 10501, 15475, 85107}},
+{9639, 17, 33302, {1, 1, 1, 3, 1, 31, 81, 213, 301, 575, 605, 543, 3347, 12759, 21645, 37173, 36127}},
+{9640, 17, 33305, {1, 3, 3, 9, 21, 29, 51, 91, 307, 617, 1839, 443, 1013, 4473, 3885, 57669, 123271}},
+{9641, 17, 33329, {1, 3, 1, 15, 31, 43, 83, 187, 51, 513, 1505, 3895, 3557, 9527, 27537, 6173, 99595}},
+{9642, 17, 33330, {1, 3, 3, 1, 3, 53, 113, 27, 431, 505, 219, 2143, 6691, 3219, 9589, 9885, 24037}},
+{9643, 17, 33332, {1, 1, 5, 9, 13, 3, 53, 145, 49, 411, 691, 289, 6443, 4963, 13815, 23663, 95497}},
+{9644, 17, 33354, {1, 3, 5, 9, 19, 7, 53, 101, 199, 69, 1821, 3233, 3267, 5947, 4869, 30095, 21255}},
+{9645, 17, 33383, {1, 1, 5, 11, 29, 7, 79, 11, 451, 585, 987, 2333, 1891, 1853, 14739, 34399, 62895}},
+{9646, 17, 33387, {1, 3, 1, 7, 29, 43, 103, 219, 139, 359, 1663, 3453, 7469, 1943, 11457, 19227, 62211}},
+{9647, 17, 33397, {1, 3, 3, 11, 9, 47, 17, 237, 87, 881, 583, 3473, 2579, 975, 1531, 50997, 76219}},
+{9648, 17, 33408, {1, 1, 7, 15, 31, 37, 79, 115, 95, 515, 2003, 2595, 4077, 4537, 9171, 31183, 41219}},
+{9649, 17, 33417, {1, 1, 1, 9, 21, 41, 93, 33, 211, 341, 233, 2217, 6657, 12913, 8329, 3881, 42563}},
+{9650, 17, 33420, {1, 3, 3, 11, 25, 3, 23, 197, 49, 339, 877, 1117, 7817, 14143, 1575, 50301, 92367}},
+{9651, 17, 33423, {1, 3, 5, 5, 19, 45, 69, 179, 447, 861, 1633, 1941, 5821, 1843, 4085, 23501, 109047}},
+{9652, 17, 33431, {1, 3, 1, 3, 31, 29, 49, 183, 311, 133, 345, 1541, 111, 5571, 1943, 11039, 127673}},
+{9653, 17, 33438, {1, 3, 1, 5, 3, 13, 63, 5, 59, 789, 71, 3271, 3871, 9105, 22525, 31, 117803}},
+{9654, 17, 33442, {1, 3, 1, 13, 31, 43, 97, 133, 313, 729, 287, 2971, 5623, 13183, 15179, 47271, 28853}},
+{9655, 17, 33444, {1, 1, 3, 13, 27, 15, 35, 37, 507, 139, 1933, 2847, 361, 10261, 21031, 3889, 56875}},
+{9656, 17, 33448, {1, 3, 1, 15, 31, 13, 45, 73, 279, 331, 471, 3881, 3295, 12035, 28329, 899, 47397}},
+{9657, 17, 33456, {1, 1, 3, 13, 1, 7, 81, 255, 315, 595, 43, 3919, 5229, 7953, 25711, 19509, 107181}},
+{9658, 17, 33459, {1, 1, 3, 15, 7, 33, 117, 169, 71, 577, 629, 3665, 7761, 13529, 26375, 17181, 22125}},
+{9659, 17, 33466, {1, 3, 5, 7, 5, 7, 1, 93, 489, 289, 329, 2273, 685, 14835, 11433, 26041, 112735}},
+{9660, 17, 33473, {1, 3, 3, 3, 9, 39, 45, 23, 171, 35, 571, 551, 7815, 6169, 24283, 61477, 71877}},
+{9661, 17, 33476, {1, 1, 5, 7, 23, 15, 81, 215, 297, 269, 655, 2059, 3643, 12741, 11955, 41085, 46047}},
+{9662, 17, 33491, {1, 1, 7, 5, 3, 35, 125, 141, 419, 137, 1031, 2053, 7925, 7267, 6267, 34323, 77495}},
+{9663, 17, 33494, {1, 1, 7, 11, 3, 57, 91, 43, 139, 691, 1569, 1825, 7855, 1093, 19263, 31601, 16019}},
+{9664, 17, 33507, {1, 3, 1, 5, 21, 7, 11, 225, 105, 757, 1493, 455, 4757, 12007, 5139, 3545, 79717}},
+{9665, 17, 33514, {1, 3, 1, 13, 17, 29, 125, 249, 475, 79, 1271, 341, 863, 853, 2105, 32897, 121261}},
+{9666, 17, 33521, {1, 3, 1, 11, 17, 59, 3, 29, 61, 399, 1465, 4029, 2103, 12481, 28495, 34363, 63781}},
+{9667, 17, 33528, {1, 3, 3, 15, 29, 13, 101, 191, 435, 215, 1355, 2263, 6059, 4545, 7535, 15041, 84091}},
+{9668, 17, 33534, {1, 1, 3, 9, 29, 23, 99, 55, 91, 145, 235, 2847, 725, 209, 24565, 16545, 103669}},
+{9669, 17, 33536, {1, 1, 1, 1, 31, 15, 93, 197, 207, 357, 667, 3511, 3865, 5329, 6491, 9027, 125979}},
+{9670, 17, 33551, {1, 3, 3, 13, 17, 35, 99, 187, 153, 589, 1633, 4053, 1023, 9541, 9841, 39585, 24885}},
+{9671, 17, 33554, {1, 3, 7, 11, 23, 5, 71, 89, 455, 665, 1221, 1821, 591, 11459, 503, 56777, 65691}},
+{9672, 17, 33563, {1, 3, 1, 1, 9, 33, 51, 203, 223, 709, 1263, 3535, 7753, 8279, 8673, 60259, 2671}},
+{9673, 17, 33575, {1, 1, 7, 9, 17, 63, 5, 229, 495, 435, 1711, 3359, 399, 15901, 28519, 56627, 8079}},
+{9674, 17, 33579, {1, 3, 5, 11, 9, 25, 49, 143, 275, 989, 461, 447, 1917, 9253, 28421, 1803, 119725}},
+{9675, 17, 33582, {1, 3, 3, 7, 25, 3, 39, 171, 303, 905, 1353, 2561, 7347, 7339, 15271, 61945, 26343}},
+{9676, 17, 33601, {1, 1, 1, 3, 5, 63, 9, 229, 107, 815, 1705, 3621, 2345, 3065, 16315, 17017, 33667}},
+{9677, 17, 33602, {1, 3, 5, 13, 29, 13, 91, 111, 475, 561, 443, 3825, 5331, 11211, 27639, 28305, 101831}},
+{9678, 17, 33614, {1, 3, 1, 9, 15, 33, 17, 47, 249, 89, 429, 3819, 1959, 14317, 10737, 28151, 40395}},
+{9679, 17, 33625, {1, 3, 7, 13, 19, 29, 83, 81, 511, 783, 823, 2865, 5823, 9459, 27413, 63297, 44181}},
+{9680, 17, 33628, {1, 3, 1, 1, 19, 53, 45, 227, 193, 631, 289, 1227, 6241, 6915, 16051, 31237, 50201}},
+{9681, 17, 33637, {1, 3, 7, 7, 15, 49, 77, 147, 421, 515, 927, 1561, 4391, 12943, 6807, 36889, 70249}},
+{9682, 17, 33656, {1, 3, 7, 7, 17, 15, 63, 123, 101, 283, 59, 977, 5185, 16161, 5007, 36255, 11537}},
+{9683, 17, 33665, {1, 1, 7, 1, 13, 17, 79, 35, 193, 947, 767, 1365, 2145, 13267, 30561, 51949, 37591}},
+{9684, 17, 33683, {1, 1, 1, 13, 11, 13, 91, 129, 355, 549, 295, 673, 209, 15953, 14703, 30857, 47967}},
+{9685, 17, 33695, {1, 3, 5, 9, 17, 17, 83, 161, 189, 585, 21, 1019, 4879, 15943, 17281, 46013, 94839}},
+{9686, 17, 33696, {1, 3, 5, 9, 23, 39, 65, 25, 181, 3, 2005, 635, 201, 9391, 8755, 38535, 88697}},
+{9687, 17, 33702, {1, 3, 1, 15, 13, 35, 47, 125, 429, 901, 895, 3495, 327, 397, 7847, 62157, 3489}},
+{9688, 17, 33708, {1, 3, 5, 3, 19, 21, 81, 39, 85, 169, 1981, 3323, 113, 2057, 16617, 58051, 55059}},
+{9689, 17, 33711, {1, 3, 1, 13, 9, 1, 101, 81, 129, 717, 1495, 4077, 5555, 93, 12957, 14805, 110219}},
+{9690, 17, 33716, {1, 3, 5, 5, 5, 47, 107, 111, 387, 987, 2009, 179, 1111, 3443, 25579, 12293, 123035}},
+{9691, 17, 33728, {1, 1, 7, 13, 21, 25, 33, 211, 9, 783, 1785, 2691, 6835, 2867, 22469, 17853, 90685}},
+{9692, 17, 33737, {1, 1, 3, 3, 19, 57, 59, 203, 197, 347, 553, 1361, 7593, 91, 15303, 30045, 86605}},
+{9693, 17, 33761, {1, 3, 5, 7, 29, 23, 1, 235, 159, 277, 1227, 1727, 1853, 9717, 2377, 13597, 18119}},
+{9694, 17, 33774, {1, 1, 1, 11, 15, 29, 5, 15, 349, 685, 197, 3127, 1075, 8847, 27873, 539, 57149}},
+{9695, 17, 33782, {1, 1, 7, 9, 23, 25, 121, 239, 219, 747, 1981, 2683, 5319, 75, 22569, 29697, 27627}},
+{9696, 17, 33788, {1, 3, 7, 5, 31, 43, 95, 131, 423, 547, 1437, 127, 1953, 861, 839, 54503, 20465}},
+{9697, 17, 33791, {1, 1, 5, 3, 29, 29, 71, 237, 275, 493, 513, 4067, 393, 9415, 20511, 29257, 86267}},
+{9698, 17, 33793, {1, 1, 1, 1, 25, 11, 59, 185, 211, 175, 37, 2999, 4919, 10225, 16727, 60447, 59985}},
+{9699, 17, 33811, {1, 1, 3, 3, 1, 9, 69, 195, 197, 677, 229, 599, 5613, 4537, 5495, 58801, 14297}},
+{9700, 17, 33813, {1, 3, 1, 15, 17, 23, 5, 101, 331, 943, 1433, 2199, 313, 469, 3651, 3281, 100119}},
+{9701, 17, 33818, {1, 1, 5, 15, 13, 25, 87, 45, 229, 821, 59, 761, 6259, 15159, 3197, 39763, 87301}},
+{9702, 17, 33829, {1, 3, 5, 7, 19, 21, 89, 15, 19, 623, 603, 4069, 3531, 13353, 21267, 6355, 53821}},
+{9703, 17, 33842, {1, 1, 5, 9, 13, 13, 111, 77, 439, 599, 1577, 959, 4567, 3117, 7127, 49265, 35667}},
+{9704, 17, 33854, {1, 3, 7, 9, 27, 61, 1, 19, 43, 475, 221, 655, 4351, 15827, 30489, 22245, 41077}},
+{9705, 17, 33856, {1, 1, 3, 13, 17, 17, 111, 85, 253, 11, 367, 2349, 4103, 12517, 27037, 42481, 84451}},
+{9706, 17, 33868, {1, 3, 5, 7, 7, 25, 53, 27, 429, 503, 893, 2923, 2539, 15849, 30157, 12111, 108893}},
+{9707, 17, 33879, {1, 1, 7, 9, 13, 29, 51, 113, 273, 745, 759, 263, 3031, 705, 23203, 64245, 127183}},
+{9708, 17, 33885, {1, 1, 1, 9, 29, 5, 25, 165, 261, 319, 645, 2199, 3135, 10263, 10711, 18713, 63337}},
+{9709, 17, 33886, {1, 1, 5, 1, 23, 41, 43, 71, 365, 683, 1107, 1671, 7079, 8933, 12815, 8095, 97955}},
+{9710, 17, 33892, {1, 3, 1, 15, 9, 43, 105, 217, 131, 299, 1459, 1087, 3493, 15297, 11741, 43383, 35021}},
+{9711, 17, 33907, {1, 3, 1, 3, 3, 57, 69, 7, 73, 977, 1163, 3591, 243, 13129, 23247, 20609, 22489}},
+{9712, 17, 33913, {1, 3, 7, 5, 1, 57, 65, 27, 121, 575, 903, 3527, 5601, 5597, 1941, 60079, 88121}},
+{9713, 17, 33923, {1, 3, 1, 3, 15, 3, 23, 87, 233, 389, 1671, 1557, 4825, 1017, 17697, 26735, 53421}},
+{9714, 17, 33925, {1, 3, 5, 3, 5, 43, 61, 249, 273, 251, 1383, 2415, 1061, 12363, 3071, 23785, 127909}},
+{9715, 17, 33935, {1, 3, 3, 13, 5, 63, 15, 165, 353, 603, 1627, 2037, 487, 11603, 719, 54693, 52645}},
+{9716, 17, 33937, {1, 3, 5, 11, 31, 41, 41, 83, 481, 251, 1903, 2655, 5237, 6073, 20201, 14069, 91649}},
+{9717, 17, 33954, {1, 3, 1, 15, 21, 41, 99, 61, 55, 63, 1595, 1805, 7625, 12261, 23275, 43471, 5147}},
+{9718, 17, 33963, {1, 3, 1, 5, 23, 21, 71, 169, 197, 51, 1653, 3053, 4663, 293, 12751, 15641, 83993}},
+{9719, 17, 33966, {1, 3, 5, 15, 29, 45, 55, 199, 275, 103, 1093, 3569, 5997, 9445, 2291, 30973, 68589}},
+{9720, 17, 33977, {1, 3, 5, 7, 15, 3, 15, 3, 287, 961, 1759, 1153, 7613, 9885, 8981, 5109, 112865}},
+{9721, 17, 33978, {1, 1, 1, 9, 1, 37, 111, 61, 309, 581, 875, 2121, 1035, 4345, 1351, 59743, 34955}},
+{9722, 17, 33991, {1, 3, 7, 7, 11, 23, 51, 235, 23, 697, 991, 1995, 3615, 6665, 15885, 18555, 11711}},
+{9723, 17, 33998, {1, 3, 7, 13, 3, 59, 87, 129, 405, 689, 1189, 2071, 877, 12347, 18381, 28367, 27247}},
+{9724, 17, 34012, {1, 1, 1, 9, 23, 29, 113, 71, 479, 421, 215, 1029, 6125, 13575, 10823, 45303, 3153}},
+{9725, 17, 34016, {1, 1, 3, 11, 13, 5, 31, 29, 279, 597, 791, 319, 1391, 14487, 3811, 36913, 11513}},
+{9726, 17, 34025, {1, 3, 7, 11, 9, 11, 55, 167, 69, 519, 1887, 145, 6133, 1307, 14465, 17419, 18319}},
+{9727, 17, 34033, {1, 1, 3, 1, 29, 25, 57, 75, 19, 187, 1591, 421, 959, 7499, 8377, 42811, 53423}},
+{9728, 17, 34036, {1, 3, 1, 3, 7, 9, 73, 217, 383, 755, 1561, 3923, 3891, 16129, 13195, 62097, 67493}},
+{9729, 17, 34045, {1, 3, 7, 9, 5, 7, 47, 29, 319, 243, 405, 2867, 5803, 2273, 4913, 54777, 88301}},
+{9730, 17, 34065, {1, 3, 7, 1, 25, 11, 51, 183, 387, 863, 39, 2119, 2395, 10175, 20833, 3235, 108197}},
+{9731, 17, 34078, {1, 1, 7, 13, 25, 43, 21, 67, 103, 709, 603, 1045, 7079, 8867, 29039, 61499, 39533}},
+{9732, 17, 34093, {1, 1, 7, 5, 7, 55, 77, 115, 409, 287, 1149, 1535, 7459, 5525, 27129, 43659, 86953}},
+{9733, 17, 34101, {1, 3, 5, 3, 21, 41, 47, 147, 267, 473, 1501, 2663, 5381, 41, 18265, 53845, 16039}},
+{9734, 17, 34108, {1, 1, 7, 15, 27, 63, 95, 103, 169, 1, 133, 3103, 7539, 5765, 11453, 4133, 95133}},
+{9735, 17, 34111, {1, 3, 3, 15, 3, 53, 121, 135, 385, 475, 889, 2557, 4937, 11129, 18461, 16757, 30339}},
+{9736, 17, 34120, {1, 3, 1, 13, 11, 39, 111, 13, 475, 201, 1973, 2151, 6973, 4083, 12593, 44093, 108037}},
+{9737, 17, 34123, {1, 3, 7, 9, 31, 31, 97, 235, 179, 689, 403, 1995, 7697, 7511, 29333, 11005, 50723}},
+{9738, 17, 34125, {1, 1, 7, 13, 23, 5, 7, 171, 441, 921, 1455, 3865, 7089, 5469, 10423, 53013, 80559}},
+{9739, 17, 34153, {1, 3, 5, 3, 25, 43, 105, 157, 507, 143, 297, 1111, 2761, 14103, 4965, 36733, 11741}},
+{9740, 17, 34171, {1, 3, 7, 9, 29, 61, 49, 239, 271, 697, 211, 1633, 2991, 14933, 12347, 44291, 12219}},
+{9741, 17, 34174, {1, 1, 7, 7, 17, 61, 29, 43, 87, 633, 937, 1931, 3541, 12259, 23045, 5923, 48479}},
+{9742, 17, 34178, {1, 3, 3, 3, 15, 25, 105, 17, 159, 863, 1377, 331, 1475, 10573, 28947, 8141, 26671}},
+{9743, 17, 34183, {1, 1, 7, 7, 31, 59, 81, 23, 467, 241, 1257, 1337, 7731, 9071, 3417, 51191, 78369}},
+{9744, 17, 34190, {1, 1, 5, 9, 11, 45, 49, 227, 319, 63, 1339, 885, 4571, 11649, 5607, 10509, 55055}},
+{9745, 17, 34201, {1, 3, 3, 9, 29, 17, 7, 235, 191, 927, 575, 1115, 4111, 14179, 2041, 13331, 29825}},
+{9746, 17, 34211, {1, 1, 5, 9, 27, 61, 71, 201, 341, 577, 221, 1371, 1135, 4347, 24211, 36171, 23435}},
+{9747, 17, 34220, {1, 3, 3, 1, 1, 29, 75, 121, 193, 647, 1429, 275, 5243, 783, 28533, 13941, 68035}},
+{9748, 17, 34225, {1, 3, 5, 15, 21, 27, 117, 183, 251, 991, 935, 3119, 5133, 2765, 7423, 28867, 120565}},
+{9749, 17, 34237, {1, 3, 5, 5, 13, 23, 29, 101, 299, 699, 1249, 1225, 1335, 6079, 17825, 60467, 87787}},
+{9750, 17, 34249, {1, 1, 1, 9, 15, 19, 11, 163, 433, 553, 1487, 813, 3293, 1195, 895, 28431, 62905}},
+{9751, 17, 34250, {1, 1, 1, 13, 25, 37, 111, 129, 391, 813, 1061, 4065, 7339, 10731, 23799, 41463, 99673}},
+{9752, 17, 34264, {1, 1, 7, 15, 3, 21, 45, 77, 471, 155, 967, 711, 4947, 13983, 27827, 28653, 117839}},
+{9753, 17, 34269, {1, 1, 5, 9, 13, 39, 107, 237, 233, 881, 297, 2189, 8085, 1221, 18659, 299, 90951}},
+{9754, 17, 34276, {1, 1, 1, 13, 21, 53, 83, 17, 487, 215, 1203, 3017, 7887, 3759, 10521, 31223, 87917}},
+{9755, 17, 34279, {1, 1, 7, 1, 13, 31, 123, 219, 127, 743, 1325, 3907, 129, 8901, 4855, 22509, 47331}},
+{9756, 17, 34293, {1, 1, 7, 11, 29, 37, 11, 157, 401, 35, 2037, 2873, 7409, 7837, 1247, 33911, 3979}},
+{9757, 17, 34303, {1, 1, 5, 15, 1, 13, 35, 253, 287, 1007, 1417, 1613, 6019, 11617, 6323, 56263, 45073}},
+{9758, 17, 34310, {1, 3, 1, 15, 1, 59, 41, 239, 373, 443, 897, 275, 5783, 8619, 18559, 16279, 92063}},
+{9759, 17, 34340, {1, 3, 1, 9, 23, 33, 83, 43, 231, 819, 1657, 1031, 5507, 12621, 8961, 23059, 63453}},
+{9760, 17, 34349, {1, 1, 7, 5, 29, 49, 21, 251, 267, 43, 729, 4013, 1497, 15489, 16761, 49689, 122755}},
+{9761, 17, 34352, {1, 3, 7, 1, 31, 21, 11, 149, 127, 711, 1249, 49, 5503, 677, 12313, 61301, 16279}},
+{9762, 17, 34355, {1, 1, 5, 11, 9, 15, 41, 61, 81, 991, 1387, 3567, 221, 15835, 8609, 28265, 98199}},
+{9763, 17, 34358, {1, 3, 1, 7, 21, 35, 13, 59, 173, 637, 107, 393, 4551, 6523, 27389, 33129, 45579}},
+{9764, 17, 34362, {1, 1, 1, 9, 29, 51, 65, 199, 417, 553, 1321, 2513, 4749, 8477, 19721, 24301, 16301}},
+{9765, 17, 34376, {1, 3, 5, 1, 25, 13, 7, 55, 163, 581, 1677, 2313, 6843, 15697, 3055, 53171, 59899}},
+{9766, 17, 34381, {1, 3, 1, 5, 31, 13, 101, 195, 235, 359, 911, 1017, 2575, 12801, 997, 7819, 73243}},
+{9767, 17, 34387, {1, 1, 7, 1, 9, 39, 59, 83, 57, 885, 317, 2689, 5741, 11833, 25563, 62581, 62239}},
+{9768, 17, 34389, {1, 1, 5, 15, 25, 25, 55, 207, 223, 907, 913, 387, 5599, 15567, 8859, 13703, 66071}},
+{9769, 17, 34394, {1, 1, 5, 15, 19, 39, 83, 177, 333, 531, 1257, 2687, 7793, 15967, 19175, 1381, 106629}},
+{9770, 17, 34410, {1, 3, 5, 13, 29, 29, 77, 1, 273, 483, 725, 3825, 5115, 4043, 11571, 8693, 49761}},
+{9771, 17, 34423, {1, 1, 7, 3, 5, 45, 37, 65, 267, 191, 301, 2863, 167, 9303, 14563, 41553, 119561}},
+{9772, 17, 34434, {1, 1, 7, 5, 21, 41, 107, 213, 267, 427, 699, 1485, 2125, 16011, 29243, 4691, 50545}},
+{9773, 17, 34436, {1, 3, 3, 9, 15, 29, 81, 53, 289, 689, 933, 2667, 5175, 10409, 28221, 56375, 49109}},
+{9774, 17, 34448, {1, 1, 1, 15, 3, 11, 77, 107, 353, 349, 219, 1961, 7559, 10081, 25119, 46041, 103827}},
+{9775, 17, 34453, {1, 3, 3, 1, 5, 27, 109, 17, 271, 543, 565, 397, 2649, 12037, 4525, 37835, 107071}},
+{9776, 17, 34454, {1, 1, 5, 15, 3, 37, 123, 157, 389, 619, 1379, 4093, 6107, 4419, 21011, 36189, 21269}},
+{9777, 17, 34460, {1, 3, 1, 7, 25, 17, 37, 133, 247, 113, 985, 815, 441, 7869, 25121, 49459, 429}},
+{9778, 17, 34464, {1, 3, 3, 11, 7, 23, 59, 51, 403, 685, 2019, 1167, 7973, 6915, 10819, 43807, 127793}},
+{9779, 17, 34479, {1, 1, 3, 1, 29, 3, 125, 107, 305, 101, 391, 2733, 6883, 5867, 5139, 16025, 112439}},
+{9780, 17, 34491, {1, 1, 5, 5, 23, 23, 89, 33, 275, 451, 1033, 649, 3761, 4735, 26021, 9627, 102747}},
+{9781, 17, 34501, {1, 1, 5, 13, 3, 17, 117, 251, 425, 917, 759, 3047, 8171, 14421, 27765, 11085, 64889}},
+{9782, 17, 34508, {1, 3, 1, 9, 7, 23, 107, 143, 123, 413, 2045, 655, 6283, 8783, 20263, 55463, 33271}},
+{9783, 17, 34516, {1, 3, 7, 11, 5, 49, 73, 55, 465, 43, 587, 3943, 521, 12357, 16273, 26603, 23219}},
+{9784, 17, 34529, {1, 3, 5, 13, 9, 3, 127, 171, 271, 227, 993, 1427, 2235, 6325, 13501, 1411, 44393}},
+{9785, 17, 34530, {1, 1, 1, 3, 13, 27, 19, 37, 175, 423, 5, 3403, 5427, 16345, 30297, 11909, 104647}},
+{9786, 17, 34553, {1, 3, 1, 3, 3, 39, 111, 179, 487, 923, 1945, 1609, 4689, 11807, 13725, 3081, 48163}},
+{9787, 17, 34564, {1, 3, 1, 1, 9, 35, 7, 151, 109, 925, 1249, 3171, 1207, 2053, 5135, 34821, 57291}},
+{9788, 17, 34568, {1, 1, 5, 13, 31, 35, 101, 199, 499, 725, 1229, 2857, 6437, 503, 14437, 35721, 24971}},
+{9789, 17, 34571, {1, 1, 1, 15, 3, 49, 75, 101, 373, 119, 875, 245, 15, 12937, 4731, 13037, 1555}},
+{9790, 17, 34582, {1, 1, 1, 7, 15, 5, 53, 5, 423, 69, 73, 2139, 383, 4035, 6723, 59941, 124503}},
+{9791, 17, 34586, {1, 1, 3, 13, 1, 23, 29, 47, 145, 785, 1013, 1579, 4579, 107, 17571, 46311, 27777}},
+{9792, 17, 34598, {1, 1, 1, 5, 23, 25, 97, 75, 105, 183, 827, 3871, 2005, 6453, 28729, 42583, 62979}},
+{9793, 17, 34604, {1, 3, 5, 9, 11, 49, 29, 201, 333, 441, 429, 1955, 5301, 11775, 22915, 58693, 111917}},
+{9794, 17, 34610, {1, 3, 3, 1, 15, 37, 117, 223, 319, 181, 61, 177, 507, 14871, 16419, 34261, 106937}},
+{9795, 17, 34619, {1, 3, 3, 9, 25, 27, 81, 253, 459, 5, 693, 1271, 485, 16171, 427, 17917, 4393}},
+{9796, 17, 34621, {1, 3, 3, 1, 27, 47, 11, 57, 269, 95, 569, 2733, 3275, 1599, 15073, 58071, 86805}},
+{9797, 17, 34633, {1, 3, 7, 13, 21, 57, 75, 63, 53, 487, 251, 3193, 4279, 2311, 6613, 38319, 93557}},
+{9798, 17, 34634, {1, 3, 5, 5, 31, 35, 39, 255, 11, 81, 605, 1457, 6367, 14121, 8069, 46653, 79945}},
+{9799, 17, 34657, {1, 1, 1, 7, 17, 19, 19, 247, 13, 757, 1069, 2811, 4969, 10943, 29399, 4153, 120817}},
+{9800, 17, 34682, {1, 1, 1, 15, 31, 13, 1, 247, 157, 785, 1565, 897, 4825, 8375, 4933, 60671, 88403}},
+{9801, 17, 34688, {1, 3, 3, 7, 31, 53, 117, 207, 243, 603, 625, 1039, 5725, 5021, 20227, 28613, 123759}},
+{9802, 17, 34691, {1, 1, 5, 1, 7, 29, 65, 153, 393, 821, 295, 2705, 5999, 15801, 31301, 15545, 52917}},
+{9803, 17, 34694, {1, 1, 1, 1, 11, 51, 97, 143, 27, 279, 1005, 1235, 5539, 1523, 26293, 35015, 47835}},
+{9804, 17, 34706, {1, 3, 3, 13, 27, 17, 123, 147, 39, 35, 567, 961, 5431, 5557, 17849, 46675, 102181}},
+{9805, 17, 34708, {1, 1, 7, 11, 7, 25, 73, 223, 459, 207, 1637, 647, 2057, 685, 24539, 48809, 26877}},
+{9806, 17, 34724, {1, 3, 1, 3, 21, 43, 121, 11, 431, 383, 1703, 1451, 2349, 11845, 13801, 20589, 43125}},
+{9807, 17, 34727, {1, 1, 5, 1, 27, 29, 89, 233, 437, 303, 853, 3425, 263, 2073, 14111, 39129, 59547}},
+{9808, 17, 34751, {1, 1, 1, 3, 3, 47, 99, 207, 261, 179, 1761, 2657, 4339, 6567, 25455, 18729, 51431}},
+{9809, 17, 34753, {1, 3, 3, 13, 5, 5, 109, 125, 123, 233, 1713, 1539, 4375, 12187, 18355, 49597, 109959}},
+{9810, 17, 34759, {1, 3, 7, 7, 9, 23, 45, 193, 363, 837, 855, 1413, 7587, 9091, 27907, 17809, 63249}},
+{9811, 17, 34763, {1, 3, 3, 9, 19, 23, 63, 85, 419, 1007, 1753, 539, 1471, 2171, 9239, 36289, 105503}},
+{9812, 17, 34777, {1, 3, 1, 11, 23, 5, 105, 79, 473, 879, 1623, 3155, 5157, 4699, 697, 41919, 15441}},
+{9813, 17, 34778, {1, 1, 7, 11, 5, 21, 43, 207, 491, 355, 857, 2325, 819, 15849, 24529, 5789, 110661}},
+{9814, 17, 34780, {1, 1, 5, 15, 19, 33, 81, 137, 473, 853, 1681, 3841, 5617, 13715, 1987, 52983, 66327}},
+{9815, 17, 34796, {1, 3, 5, 7, 11, 31, 69, 85, 33, 197, 1771, 1957, 1311, 169, 14159, 7327, 8577}},
+{9816, 17, 34799, {1, 1, 3, 9, 11, 23, 19, 143, 9, 579, 111, 2973, 3567, 8561, 10447, 55875, 64305}},
+{9817, 17, 34801, {1, 1, 5, 7, 1, 17, 93, 11, 423, 1007, 839, 719, 3965, 14531, 17301, 29577, 4083}},
+{9818, 17, 34817, {1, 3, 5, 13, 19, 17, 123, 61, 59, 115, 1165, 579, 2545, 633, 5597, 21865, 109167}},
+{9819, 17, 34824, {1, 1, 5, 3, 29, 29, 99, 163, 321, 367, 1523, 3719, 665, 15843, 28831, 63823, 113533}},
+{9820, 17, 34827, {1, 1, 1, 3, 15, 7, 85, 1, 181, 759, 537, 3315, 7159, 4363, 4183, 53775, 8801}},
+{9821, 17, 34837, {1, 3, 1, 1, 15, 53, 9, 35, 459, 417, 1169, 2055, 1175, 10923, 335, 24269, 93001}},
+{9822, 17, 34841, {1, 3, 1, 5, 31, 43, 51, 149, 175, 541, 629, 1147, 7585, 9725, 18623, 13345, 65391}},
+{9823, 17, 34853, {1, 3, 7, 1, 13, 39, 13, 217, 507, 765, 721, 1491, 5037, 6267, 2871, 19181, 123751}},
+{9824, 17, 34858, {1, 1, 3, 5, 21, 9, 123, 195, 63, 347, 7, 531, 3015, 9457, 29543, 51479, 26607}},
+{9825, 17, 34877, {1, 1, 1, 1, 21, 15, 81, 127, 429, 15, 901, 1503, 1919, 6515, 2477, 53571, 113447}},
+{9826, 17, 34886, {1, 3, 1, 13, 9, 33, 79, 169, 499, 767, 441, 2085, 2429, 10213, 4125, 2611, 26137}},
+{9827, 17, 34895, {1, 1, 3, 1, 19, 23, 83, 179, 447, 513, 913, 1201, 1861, 11595, 29037, 7775, 116417}},
+{9828, 17, 34897, {1, 3, 3, 7, 3, 57, 47, 183, 413, 319, 1375, 1401, 2231, 14331, 28625, 43839, 102717}},
+{9829, 17, 34898, {1, 1, 5, 11, 31, 27, 111, 85, 191, 155, 2025, 1501, 4991, 4655, 3451, 10219, 60391}},
+{9830, 17, 34916, {1, 3, 3, 7, 17, 19, 113, 37, 423, 479, 709, 3659, 6567, 1709, 13483, 61821, 77101}},
+{9831, 17, 34923, {1, 3, 1, 13, 3, 17, 73, 61, 275, 359, 1341, 449, 1373, 12047, 11207, 52651, 83305}},
+{9832, 17, 34928, {1, 1, 7, 9, 9, 45, 15, 121, 15, 51, 509, 2189, 5057, 6119, 11669, 14559, 108323}},
+{9833, 17, 34934, {1, 1, 7, 7, 25, 13, 13, 141, 157, 249, 823, 821, 1909, 5925, 3505, 13187, 19237}},
+{9834, 17, 34940, {1, 3, 3, 1, 9, 51, 79, 91, 5, 709, 787, 2427, 4613, 7307, 20141, 1675, 49779}},
+{9835, 17, 34944, {1, 1, 1, 11, 11, 13, 33, 81, 413, 981, 907, 2709, 4113, 10607, 2587, 12845, 11103}},
+{9836, 17, 34947, {1, 1, 7, 9, 13, 25, 37, 81, 375, 1013, 2027, 321, 3947, 2269, 10687, 7537, 67495}},
+{9837, 17, 34953, {1, 3, 5, 11, 9, 43, 53, 111, 339, 841, 503, 3209, 6437, 10893, 13627, 51809, 57229}},
+{9838, 17, 34956, {1, 3, 1, 1, 21, 15, 71, 93, 453, 405, 1099, 2979, 7471, 10173, 17875, 13179, 48615}},
+{9839, 17, 34967, {1, 3, 5, 9, 9, 1, 121, 117, 275, 157, 57, 3459, 4787, 15005, 24591, 23963, 45077}},
+{9840, 17, 34968, {1, 1, 5, 3, 21, 57, 113, 207, 169, 603, 637, 1455, 6281, 6527, 17219, 32307, 18617}},
+{9841, 17, 34971, {1, 3, 7, 5, 25, 15, 99, 91, 253, 267, 537, 713, 3929, 895, 7999, 47989, 118731}},
+{9842, 17, 34974, {1, 3, 7, 15, 23, 17, 5, 129, 121, 251, 219, 2547, 7291, 1079, 14577, 56229, 35253}},
+{9843, 17, 34977, {1, 3, 1, 15, 5, 61, 35, 135, 497, 681, 751, 2303, 6697, 11225, 30389, 61673, 87313}},
+{9844, 17, 34980, {1, 3, 1, 7, 7, 37, 9, 85, 257, 805, 1325, 3597, 6065, 727, 18203, 57077, 437}},
+{9845, 17, 34983, {1, 3, 5, 7, 5, 43, 29, 179, 73, 173, 1441, 1233, 1779, 7893, 10629, 27547, 7775}},
+{9846, 17, 34998, {1, 1, 7, 5, 31, 29, 21, 35, 289, 423, 449, 3331, 2929, 6827, 15569, 9873, 76889}},
+{9847, 17, 35004, {1, 1, 7, 13, 13, 37, 55, 99, 135, 797, 1263, 2539, 893, 4225, 16689, 38259, 50857}},
+{9848, 17, 35010, {1, 1, 3, 1, 5, 3, 95, 29, 15, 539, 825, 3931, 4809, 8299, 29891, 61357, 97523}},
+{9849, 17, 35012, {1, 3, 1, 9, 27, 25, 115, 239, 387, 163, 1153, 31, 2375, 7943, 31929, 1121, 33085}},
+{9850, 17, 35030, {1, 3, 5, 9, 3, 53, 121, 159, 165, 81, 317, 3051, 1991, 493, 2029, 43305, 130209}},
+{9851, 17, 35039, {1, 1, 1, 5, 9, 57, 39, 247, 73, 613, 1047, 3289, 2569, 5363, 18475, 32749, 39415}},
+{9852, 17, 35058, {1, 3, 1, 5, 19, 23, 39, 33, 151, 463, 153, 737, 2501, 7531, 2769, 35595, 71799}},
+{9853, 17, 35063, {1, 3, 5, 5, 29, 49, 105, 81, 67, 441, 1101, 2241, 6243, 6177, 7157, 51635, 81241}},
+{9854, 17, 35082, {1, 3, 3, 3, 29, 53, 13, 239, 487, 503, 97, 1323, 1817, 13021, 12881, 26943, 21011}},
+{9855, 17, 35095, {1, 1, 1, 15, 25, 9, 5, 205, 85, 635, 789, 2495, 5069, 4987, 847, 26857, 84225}},
+{9856, 17, 35096, {1, 1, 3, 15, 9, 51, 79, 13, 377, 637, 159, 3407, 2057, 13967, 31781, 40869, 52987}},
+{9857, 17, 35101, {1, 3, 1, 13, 11, 27, 103, 207, 383, 887, 749, 1119, 285, 4269, 31745, 57539, 5671}},
+{9858, 17, 35102, {1, 3, 1, 13, 23, 19, 41, 43, 455, 425, 1653, 4091, 4855, 16321, 169, 59289, 82397}},
+{9859, 17, 35105, {1, 3, 3, 15, 31, 39, 51, 127, 391, 989, 1831, 3327, 6487, 6077, 17277, 52093, 20389}},
+{9860, 17, 35112, {1, 3, 5, 15, 19, 1, 21, 241, 15, 543, 1529, 2355, 1503, 12795, 17321, 41219, 61115}},
+{9861, 17, 35118, {1, 1, 3, 11, 9, 33, 21, 197, 307, 141, 1663, 371, 1663, 8307, 3617, 56941, 62477}},
+{9862, 17, 35120, {1, 3, 7, 9, 19, 53, 123, 3, 29, 635, 1795, 2471, 2491, 15847, 9169, 2561, 101515}},
+{9863, 17, 35130, {1, 1, 5, 3, 19, 11, 117, 231, 475, 837, 1833, 3499, 4415, 9961, 28285, 37821, 81497}},
+{9864, 17, 35143, {1, 1, 3, 5, 7, 11, 57, 89, 345, 157, 1519, 3021, 7157, 2159, 32557, 31559, 128907}},
+{9865, 17, 35147, {1, 1, 7, 3, 27, 1, 15, 177, 489, 405, 811, 3597, 4939, 15595, 7279, 58097, 84703}},
+{9866, 17, 35152, {1, 3, 1, 9, 25, 61, 119, 219, 111, 339, 1091, 759, 6087, 16001, 6757, 15627, 1691}},
+{9867, 17, 35157, {1, 3, 7, 9, 1, 39, 107, 139, 143, 917, 421, 1623, 7135, 4851, 6687, 6177, 102425}},
+{9868, 17, 35164, {1, 1, 7, 13, 23, 17, 19, 167, 317, 331, 743, 3737, 2195, 545, 2185, 9125, 30503}},
+{9869, 17, 35178, {1, 1, 5, 13, 27, 33, 117, 141, 493, 129, 1553, 2335, 4161, 14205, 24177, 35163, 84869}},
+{9870, 17, 35195, {1, 3, 7, 1, 11, 9, 75, 133, 113, 507, 2007, 2473, 4769, 14655, 17967, 17709, 90653}},
+{9871, 17, 35197, {1, 1, 7, 11, 17, 11, 83, 23, 387, 61, 29, 3905, 4351, 15173, 28375, 9129, 111939}},
+{9872, 17, 35201, {1, 1, 5, 15, 15, 53, 81, 125, 189, 937, 1607, 2595, 2847, 7229, 22241, 26269, 64781}},
+{9873, 17, 35207, {1, 3, 1, 7, 5, 11, 61, 111, 13, 423, 885, 2329, 6003, 16331, 11207, 25743, 54619}},
+{9874, 17, 35231, {1, 3, 5, 9, 1, 13, 95, 241, 237, 629, 263, 1629, 1063, 12695, 14501, 5455, 121483}},
+{9875, 17, 35249, {1, 1, 7, 15, 5, 17, 45, 255, 143, 79, 87, 1755, 6215, 5095, 32411, 8695, 85511}},
+{9876, 17, 35250, {1, 3, 7, 7, 21, 11, 117, 135, 333, 73, 1471, 2749, 5801, 4209, 9353, 46171, 90645}},
+{9877, 17, 35256, {1, 1, 7, 13, 11, 35, 77, 149, 159, 783, 1527, 2881, 1409, 3455, 26991, 3225, 30693}},
+{9878, 17, 35259, {1, 1, 3, 15, 19, 55, 21, 245, 207, 103, 775, 2041, 4637, 7333, 11267, 60509, 43099}},
+{9879, 17, 35262, {1, 3, 3, 15, 17, 63, 23, 81, 183, 923, 75, 391, 615, 13343, 20839, 56529, 115747}},
+{9880, 17, 35273, {1, 3, 1, 13, 5, 5, 15, 27, 263, 497, 1365, 2733, 5395, 7461, 2725, 24735, 89251}},
+{9881, 17, 35282, {1, 1, 7, 7, 29, 17, 39, 117, 363, 915, 123, 283, 4575, 3497, 20995, 37883, 16645}},
+{9882, 17, 35298, {1, 3, 3, 9, 1, 25, 79, 181, 331, 617, 393, 1807, 5145, 8007, 9173, 45189, 37945}},
+{9883, 17, 35307, {1, 3, 1, 5, 1, 9, 127, 137, 379, 371, 367, 3237, 581, 15295, 18191, 37689, 103495}},
+{9884, 17, 35328, {1, 1, 7, 1, 29, 53, 103, 173, 171, 973, 933, 3847, 3185, 10107, 31701, 45021, 106251}},
+{9885, 17, 35334, {1, 1, 1, 7, 23, 9, 61, 25, 343, 471, 2041, 2179, 7647, 1885, 15353, 50379, 67681}},
+{9886, 17, 35343, {1, 1, 5, 11, 31, 13, 51, 185, 83, 917, 85, 1317, 8185, 14949, 32455, 57939, 1217}},
+{9887, 17, 35345, {1, 1, 7, 5, 23, 45, 101, 227, 497, 941, 985, 167, 6847, 9611, 20011, 40069, 83285}},
+{9888, 17, 35355, {1, 1, 5, 13, 17, 33, 61, 197, 433, 255, 67, 1479, 5663, 6501, 30695, 27235, 80141}},
+{9889, 17, 35388, {1, 1, 3, 5, 11, 45, 123, 49, 327, 893, 1963, 2225, 2611, 8925, 22811, 2313, 8411}},
+{9890, 17, 35399, {1, 3, 7, 7, 15, 39, 75, 235, 13, 847, 575, 3947, 6947, 2061, 13467, 103, 86285}},
+{9891, 17, 35403, {1, 1, 7, 3, 21, 43, 113, 197, 141, 873, 1139, 2707, 7235, 10683, 10831, 33695, 57063}},
+{9892, 17, 35408, {1, 3, 5, 1, 3, 27, 45, 43, 119, 979, 1933, 1851, 6497, 14937, 4965, 41285, 120221}},
+{9893, 17, 35413, {1, 1, 3, 1, 23, 59, 67, 7, 49, 351, 1053, 1837, 501, 7671, 26239, 51951, 95119}},
+{9894, 17, 35418, {1, 3, 5, 11, 3, 19, 33, 33, 219, 175, 1439, 197, 1841, 159, 11229, 20463, 81797}},
+{9895, 17, 35434, {1, 1, 7, 1, 13, 11, 79, 75, 53, 525, 91, 233, 5999, 2921, 21295, 56831, 116049}},
+{9896, 17, 35436, {1, 3, 3, 13, 29, 7, 71, 207, 193, 635, 1393, 3093, 3775, 12445, 23281, 29401, 103225}},
+{9897, 17, 35448, {1, 1, 7, 3, 29, 57, 111, 163, 63, 593, 881, 1587, 3027, 12599, 30977, 38891, 95495}},
+{9898, 17, 35460, {1, 1, 5, 15, 17, 57, 111, 169, 149, 767, 377, 765, 7533, 1539, 22979, 55489, 29799}},
+{9899, 17, 35475, {1, 3, 5, 15, 25, 7, 127, 71, 319, 389, 497, 1513, 1287, 7359, 12311, 45457, 45897}},
+{9900, 17, 35494, {1, 1, 5, 3, 3, 35, 45, 17, 49, 483, 197, 727, 5355, 7201, 3035, 14313, 40933}},
+{9901, 17, 35497, {1, 1, 7, 15, 1, 9, 27, 59, 455, 653, 1907, 281, 1435, 14593, 18909, 37655, 87603}},
+{9902, 17, 35503, {1, 1, 7, 11, 29, 9, 67, 17, 353, 709, 859, 3687, 7741, 4251, 12263, 41717, 79393}},
+{9903, 17, 35508, {1, 3, 3, 3, 1, 15, 113, 187, 255, 851, 503, 4089, 7923, 1701, 305, 8353, 16357}},
+{9904, 17, 35511, {1, 1, 5, 3, 17, 31, 29, 233, 377, 215, 1889, 3459, 2443, 3907, 4193, 16519, 49089}},
+{9905, 17, 35518, {1, 1, 3, 1, 17, 39, 11, 255, 247, 305, 669, 1769, 1355, 12055, 2275, 51681, 112337}},
+{9906, 17, 35520, {1, 3, 1, 1, 17, 17, 75, 95, 409, 21, 1513, 1443, 4931, 6491, 1587, 62979, 90395}},
+{9907, 17, 35530, {1, 1, 3, 5, 3, 19, 125, 175, 279, 911, 301, 407, 7773, 949, 32107, 13571, 58717}},
+{9908, 17, 35537, {1, 3, 3, 15, 31, 35, 11, 223, 125, 209, 1719, 1725, 3387, 14879, 32243, 7219, 126791}},
+{9909, 17, 35543, {1, 1, 3, 1, 31, 29, 67, 79, 93, 193, 1573, 2285, 3209, 8397, 17717, 5657, 61545}},
+{9910, 17, 35560, {1, 3, 1, 9, 11, 33, 85, 121, 193, 63, 461, 1835, 889, 10687, 19831, 49551, 59087}},
+{9911, 17, 35566, {1, 3, 3, 7, 11, 3, 9, 87, 91, 487, 289, 1113, 8135, 7971, 16693, 31009, 81197}},
+{9912, 17, 35571, {1, 3, 3, 1, 23, 23, 61, 209, 409, 845, 547, 1493, 465, 6399, 17633, 53647, 52425}},
+{9913, 17, 35598, {1, 1, 7, 7, 21, 31, 71, 249, 63, 895, 653, 93, 4429, 8951, 16873, 48089, 33947}},
+{9914, 17, 35609, {1, 3, 5, 11, 3, 35, 49, 15, 379, 645, 855, 3657, 8019, 2141, 11233, 60731, 80455}},
+{9915, 17, 35612, {1, 3, 1, 3, 1, 53, 101, 157, 255, 765, 1575, 1615, 7677, 9699, 13351, 2207, 90939}},
+{9916, 17, 35615, {1, 3, 7, 7, 5, 43, 123, 109, 119, 391, 1889, 1991, 3151, 1457, 16321, 65245, 75891}},
+{9917, 17, 35616, {1, 3, 1, 15, 9, 1, 113, 249, 1, 675, 501, 487, 2209, 4411, 6609, 29243, 100177}},
+{9918, 17, 35622, {1, 1, 1, 7, 9, 23, 9, 197, 341, 191, 453, 3733, 5475, 15515, 28979, 36077, 17801}},
+{9919, 17, 35626, {1, 1, 3, 13, 5, 35, 85, 121, 59, 429, 1251, 3437, 3121, 12411, 14713, 28125, 31921}},
+{9920, 17, 35633, {1, 3, 5, 3, 27, 17, 61, 255, 485, 709, 83, 3201, 2191, 3371, 2941, 10931, 22141}},
+{9921, 17, 35636, {1, 1, 1, 1, 19, 19, 25, 177, 397, 579, 529, 1619, 3887, 4537, 8123, 52481, 8305}},
+{9922, 17, 35645, {1, 1, 3, 15, 3, 15, 77, 51, 31, 881, 203, 2359, 4947, 6321, 14705, 16471, 84395}},
+{9923, 17, 35653, {1, 3, 7, 9, 13, 53, 67, 41, 289, 721, 1743, 2725, 435, 1327, 14953, 14283, 113211}},
+{9924, 17, 35663, {1, 3, 1, 5, 19, 23, 73, 181, 187, 675, 125, 1877, 6167, 7919, 3955, 25007, 28299}},
+{9925, 17, 35665, {1, 1, 3, 1, 5, 11, 123, 189, 173, 123, 499, 2175, 483, 13017, 14709, 5797, 36327}},
+{9926, 17, 35682, {1, 3, 7, 5, 21, 39, 79, 229, 19, 203, 375, 3901, 1053, 14209, 13535, 63155, 99727}},
+{9927, 17, 35687, {1, 1, 1, 13, 11, 29, 29, 173, 441, 271, 1147, 2891, 965, 10777, 16325, 37135, 101601}},
+{9928, 17, 35688, {1, 1, 3, 3, 25, 13, 79, 233, 75, 191, 987, 3231, 3667, 1525, 14193, 62027, 77441}},
+{9929, 17, 35691, {1, 3, 1, 1, 15, 53, 17, 45, 367, 263, 425, 1565, 6139, 13833, 12547, 61103, 75361}},
+{9930, 17, 35696, {1, 1, 5, 15, 5, 57, 123, 47, 407, 887, 375, 1181, 5367, 10283, 24799, 33121, 76373}},
+{9931, 17, 35727, {1, 1, 7, 3, 11, 17, 65, 133, 3, 609, 601, 3391, 7801, 4137, 32095, 55983, 23037}},
+{9932, 17, 35741, {1, 3, 1, 3, 25, 5, 125, 5, 297, 571, 145, 3601, 1929, 13457, 16977, 21049, 92169}},
+{9933, 17, 35742, {1, 3, 5, 13, 23, 29, 13, 143, 507, 187, 857, 427, 5125, 1377, 10947, 58473, 110541}},
+{9934, 17, 35746, {1, 3, 3, 15, 15, 49, 39, 103, 193, 507, 639, 2399, 3829, 12105, 15993, 52975, 115935}},
+{9935, 17, 35748, {1, 3, 7, 3, 7, 41, 95, 127, 193, 923, 1729, 3039, 7959, 3345, 7725, 35293, 34361}},
+{9936, 17, 35752, {1, 3, 5, 13, 17, 53, 111, 141, 151, 389, 1955, 3333, 4523, 6331, 21239, 57447, 113325}},
+{9937, 17, 35770, {1, 3, 7, 15, 31, 7, 11, 35, 105, 607, 1665, 3281, 487, 9417, 26205, 26963, 81537}},
+{9938, 17, 35811, {1, 3, 1, 1, 17, 15, 3, 55, 451, 691, 1525, 2009, 6443, 4629, 15091, 46961, 83361}},
+{9939, 17, 35817, {1, 3, 1, 15, 1, 29, 99, 79, 225, 665, 623, 2389, 3303, 7221, 20567, 15917, 24677}},
+{9940, 17, 35832, {1, 1, 3, 15, 3, 17, 125, 239, 485, 849, 327, 1459, 3911, 2145, 14475, 24337, 19695}},
+{9941, 17, 35838, {1, 3, 5, 7, 7, 37, 19, 51, 373, 587, 147, 563, 7623, 7781, 18289, 37239, 6803}},
+{9942, 17, 35850, {1, 3, 5, 1, 9, 63, 5, 87, 171, 5, 1553, 429, 5001, 7881, 1493, 20425, 57727}},
+{9943, 17, 35863, {1, 3, 5, 9, 25, 43, 17, 71, 87, 869, 1219, 2661, 4571, 9689, 18799, 62467, 128531}},
+{9944, 17, 35870, {1, 1, 3, 3, 19, 53, 61, 9, 55, 433, 1555, 2369, 1423, 9081, 19185, 8513, 111079}},
+{9945, 17, 35879, {1, 3, 5, 15, 11, 61, 1, 147, 17, 71, 1563, 1113, 4809, 16229, 23743, 59757, 64699}},
+{9946, 17, 35880, {1, 1, 5, 11, 29, 23, 61, 43, 203, 97, 1119, 237, 6445, 14507, 9799, 18447, 14745}},
+{9947, 17, 35891, {1, 3, 5, 15, 11, 17, 117, 139, 117, 537, 251, 149, 2731, 15863, 1381, 25435, 25501}},
+{9948, 17, 35893, {1, 3, 3, 15, 31, 57, 53, 43, 95, 445, 1423, 3833, 2485, 11789, 16011, 8101, 39165}},
+{9949, 17, 35903, {1, 1, 3, 11, 15, 37, 117, 3, 245, 57, 593, 2771, 7181, 11397, 5691, 3217, 44139}},
+{9950, 17, 35905, {1, 3, 5, 1, 11, 13, 121, 85, 85, 511, 1837, 611, 237, 4893, 24025, 28903, 102025}},
+{9951, 17, 35926, {1, 3, 1, 11, 5, 45, 43, 45, 393, 741, 1157, 1511, 1665, 2359, 19071, 24537, 122879}},
+{9952, 17, 35930, {1, 3, 3, 3, 9, 59, 27, 11, 257, 203, 1535, 2729, 2313, 3539, 1689, 31901, 42949}},
+{9953, 17, 35941, {1, 1, 1, 11, 17, 7, 21, 35, 479, 697, 107, 1317, 6585, 705, 3789, 20439, 33375}},
+{9954, 17, 35956, {1, 1, 3, 11, 19, 37, 123, 233, 253, 733, 901, 3047, 3595, 2357, 24533, 40519, 109171}},
+{9955, 17, 35963, {1, 3, 3, 13, 29, 51, 25, 149, 57, 253, 2001, 351, 7367, 15361, 4955, 60951, 19449}},
+{9956, 17, 35970, {1, 1, 3, 15, 21, 53, 25, 239, 257, 437, 711, 3599, 5441, 7405, 15039, 19207, 63841}},
+{9957, 17, 35984, {1, 3, 1, 9, 17, 41, 43, 231, 413, 747, 1447, 1407, 2615, 14529, 10781, 20001, 82713}},
+{9958, 17, 35996, {1, 3, 7, 7, 9, 29, 25, 55, 53, 423, 1711, 2871, 2675, 421, 31703, 57099, 2955}},
+{9959, 17, 36005, {1, 3, 1, 7, 31, 17, 113, 83, 387, 611, 1815, 2137, 3453, 4409, 20377, 60263, 81205}},
+{9960, 17, 36012, {1, 1, 5, 3, 11, 1, 7, 225, 367, 267, 95, 939, 3801, 2619, 1207, 62695, 116407}},
+{9961, 17, 36015, {1, 3, 3, 9, 5, 39, 85, 45, 247, 483, 491, 865, 3493, 8243, 8411, 26449, 50473}},
+{9962, 17, 36030, {1, 3, 3, 9, 1, 53, 23, 127, 13, 529, 1925, 2629, 3451, 15073, 16075, 29909, 34101}},
+{9963, 17, 36035, {1, 3, 1, 11, 1, 9, 125, 57, 79, 633, 979, 3843, 325, 883, 7769, 40155, 104057}},
+{9964, 17, 36042, {1, 1, 7, 13, 23, 53, 27, 157, 493, 901, 1077, 1079, 1327, 15903, 20603, 64377, 103335}},
+{9965, 17, 36047, {1, 3, 3, 3, 3, 35, 37, 167, 73, 301, 385, 1045, 6913, 2269, 22491, 19735, 70125}},
+{9966, 17, 36049, {1, 1, 1, 11, 5, 23, 23, 85, 267, 845, 207, 77, 1245, 16209, 25579, 12417, 48723}},
+{9967, 17, 36059, {1, 1, 5, 15, 11, 17, 43, 83, 373, 1005, 541, 115, 163, 2165, 8181, 35839, 44471}},
+{9968, 17, 36071, {1, 3, 5, 7, 27, 41, 101, 13, 213, 235, 2037, 2179, 2121, 4481, 8127, 20011, 3981}},
+{9969, 17, 36080, {1, 1, 5, 11, 7, 43, 59, 129, 127, 387, 489, 1985, 623, 13307, 19765, 62155, 93271}},
+{9970, 17, 36085, {1, 1, 7, 5, 23, 63, 23, 177, 211, 233, 101, 1809, 7411, 8003, 25101, 32601, 75071}},
+{9971, 17, 36097, {1, 1, 1, 11, 3, 25, 9, 91, 459, 611, 867, 3639, 5457, 9101, 15333, 40069, 67723}},
+{9972, 17, 36110, {1, 3, 7, 5, 3, 29, 111, 75, 459, 195, 1405, 2281, 6085, 4425, 29061, 57335, 87449}},
+{9973, 17, 36115, {1, 3, 7, 11, 21, 45, 53, 81, 77, 863, 1901, 3355, 5253, 10897, 26289, 48399, 26877}},
+{9974, 17, 36118, {1, 3, 3, 13, 21, 37, 69, 87, 259, 101, 1203, 167, 6229, 145, 9355, 15347, 68047}},
+{9975, 17, 36124, {1, 1, 3, 1, 31, 1, 15, 229, 429, 915, 929, 381, 1857, 8441, 22207, 47071, 127853}},
+{9976, 17, 36137, {1, 3, 7, 3, 15, 9, 13, 161, 173, 573, 405, 3253, 7331, 13965, 3061, 40687, 130185}},
+{9977, 17, 36138, {1, 3, 5, 5, 29, 29, 9, 115, 393, 377, 909, 321, 2861, 9881, 17863, 52033, 55133}},
+{9978, 17, 36155, {1, 1, 7, 7, 27, 53, 101, 213, 199, 301, 1995, 2549, 5037, 13639, 18423, 23547, 79359}},
+{9979, 17, 36160, {1, 3, 1, 7, 21, 51, 29, 151, 301, 665, 571, 53, 2637, 7229, 12517, 33647, 49413}},
+{9980, 17, 36189, {1, 3, 3, 13, 13, 49, 49, 131, 325, 273, 1127, 2981, 2365, 14287, 23185, 26915, 81755}},
+{9981, 17, 36190, {1, 1, 5, 3, 17, 45, 25, 79, 37, 265, 1205, 1805, 6707, 11525, 16473, 39525, 9571}},
+{9982, 17, 36203, {1, 3, 3, 15, 9, 43, 55, 101, 469, 939, 365, 3443, 5759, 4751, 28893, 46727, 74569}},
+{9983, 17, 36211, {1, 3, 7, 9, 5, 33, 11, 201, 263, 227, 1475, 2795, 1489, 11129, 18053, 31009, 73105}},
+{9984, 17, 36218, {1, 3, 5, 5, 5, 25, 41, 151, 393, 237, 2017, 3811, 953, 13835, 28761, 22439, 76355}},
+{9985, 17, 36230, {1, 1, 5, 13, 21, 37, 29, 11, 289, 67, 1317, 511, 685, 15227, 8731, 15039, 79491}},
+{9986, 17, 36241, {1, 3, 1, 9, 31, 59, 123, 169, 473, 139, 575, 1057, 3213, 8213, 21845, 28123, 105335}},
+{9987, 17, 36244, {1, 1, 1, 5, 21, 47, 23, 121, 403, 5, 1457, 2137, 569, 9267, 6367, 6991, 3113}},
+{9988, 17, 36253, {1, 3, 3, 7, 13, 7, 25, 215, 81, 1003, 2041, 1317, 3913, 14705, 30551, 50889, 83441}},
+{9989, 17, 36257, {1, 3, 3, 3, 13, 17, 63, 229, 83, 901, 953, 2603, 4685, 6961, 7519, 52441, 33223}},
+{9990, 17, 36264, {1, 3, 7, 5, 7, 57, 65, 73, 243, 531, 261, 2517, 4083, 5889, 22913, 49603, 67135}},
+{9991, 17, 36272, {1, 3, 5, 11, 15, 47, 81, 83, 35, 1021, 1313, 1109, 5103, 5469, 18149, 15307, 34939}},
+{9992, 17, 36290, {1, 3, 7, 5, 21, 13, 105, 157, 435, 23, 931, 3565, 1, 4987, 8829, 7327, 51049}},
+{9993, 17, 36292, {1, 1, 3, 11, 29, 9, 59, 49, 261, 1009, 1953, 2683, 8125, 10937, 16683, 36013, 5967}},
+{9994, 17, 36301, {1, 1, 1, 1, 19, 29, 57, 9, 307, 457, 675, 3023, 495, 15257, 7945, 10449, 30155}},
+{9995, 17, 36309, {1, 1, 7, 13, 25, 9, 51, 135, 491, 205, 1715, 3253, 1031, 4137, 14885, 39925, 6061}},
+{9996, 17, 36313, {1, 1, 7, 7, 3, 13, 111, 91, 469, 133, 1221, 1035, 919, 3697, 26387, 41675, 487}},
+{9997, 17, 36316, {1, 1, 3, 1, 19, 53, 11, 113, 245, 747, 189, 4051, 87, 1767, 3595, 10259, 100097}},
+{9998, 17, 36319, {1, 1, 5, 3, 23, 49, 31, 47, 341, 1019, 723, 2353, 6191, 3809, 3297, 39443, 73529}},
+{9999, 17, 36330, {1, 3, 3, 9, 25, 27, 123, 49, 51, 85, 1063, 2633, 6549, 14493, 7367, 3557, 60651}},
+{10000, 17, 36335, {1, 3, 7, 5, 13, 27, 127, 65, 115, 731, 1147, 283, 91, 14205, 2457, 57083, 35815}},
+{10001, 17, 36347, {1, 3, 3, 3, 25, 63, 99, 249, 25, 951, 733, 3621, 7139, 14223, 23641, 20287, 30743}},
+{10002, 17, 36353, {1, 3, 3, 7, 21, 23, 83, 207, 235, 467, 1857, 2661, 1391, 10097, 12297, 54825, 5035}},
+{10003, 17, 36356, {1, 1, 5, 3, 31, 17, 77, 9, 215, 553, 989, 3643, 729, 2057, 32053, 50305, 5499}},
+{10004, 17, 36368, {1, 1, 7, 1, 23, 5, 111, 195, 431, 947, 403, 1781, 943, 15073, 67, 52225, 98987}},
+{10005, 17, 36374, {1, 1, 5, 11, 23, 1, 41, 33, 457, 767, 275, 801, 5119, 3781, 14805, 52789, 41775}},
+{10006, 17, 36377, {1, 1, 5, 3, 9, 53, 15, 183, 281, 691, 165, 3277, 7673, 1509, 16605, 53799, 100185}},
+{10007, 17, 36384, {1, 3, 5, 11, 19, 45, 29, 159, 167, 67, 1259, 879, 7787, 8855, 24153, 42667, 102855}},
+{10008, 17, 36407, {1, 1, 7, 13, 31, 19, 43, 133, 295, 287, 1985, 2451, 2297, 3853, 22401, 27659, 11149}},
+{10009, 17, 36413, {1, 1, 7, 13, 31, 39, 125, 21, 173, 103, 1119, 3739, 6467, 2113, 4465, 26537, 129949}},
+{10010, 17, 36419, {1, 1, 5, 15, 21, 47, 35, 125, 199, 335, 421, 31, 185, 12769, 30659, 33427, 106981}},
+{10011, 17, 36425, {1, 3, 5, 13, 25, 35, 53, 253, 325, 921, 1705, 2735, 6437, 2287, 20479, 61107, 91453}},
+{10012, 17, 36426, {1, 3, 7, 13, 25, 63, 83, 183, 5, 401, 329, 525, 3141, 393, 30469, 16529, 9605}},
+{10013, 17, 36446, {1, 3, 3, 13, 19, 23, 15, 85, 323, 545, 149, 3645, 6269, 15595, 18453, 39, 128169}},
+{10014, 17, 36461, {1, 3, 7, 15, 17, 5, 61, 61, 91, 353, 1039, 2959, 4147, 13205, 12599, 53281, 39509}},
+{10015, 17, 36467, {1, 1, 3, 7, 21, 9, 97, 111, 249, 775, 845, 1789, 667, 489, 6689, 29217, 56527}},
+{10016, 17, 36474, {1, 3, 5, 7, 11, 5, 59, 219, 29, 803, 923, 3861, 7953, 8969, 1819, 43501, 20513}},
+{10017, 17, 36480, {1, 1, 5, 11, 7, 53, 63, 231, 193, 293, 1467, 1409, 6397, 13237, 15903, 19271, 66257}},
+{10018, 17, 36486, {1, 3, 1, 15, 23, 15, 37, 123, 189, 63, 1121, 751, 6711, 10095, 6493, 40709, 47641}},
+{10019, 17, 36489, {1, 3, 7, 3, 23, 59, 99, 183, 249, 479, 771, 1087, 7979, 409, 4819, 4337, 33345}},
+{10020, 17, 36495, {1, 1, 5, 1, 17, 7, 15, 167, 305, 411, 1429, 3127, 23, 9123, 7185, 44405, 114841}},
+{10021, 17, 36525, {1, 1, 5, 11, 3, 29, 29, 31, 399, 777, 251, 1841, 3607, 211, 23543, 29111, 54565}},
+{10022, 17, 36526, {1, 3, 3, 9, 27, 33, 79, 27, 469, 67, 1327, 183, 5783, 10039, 13165, 20443, 4913}},
+{10023, 17, 36533, {1, 3, 7, 15, 21, 23, 5, 227, 141, 1021, 69, 3347, 7221, 13837, 20921, 20525, 32567}},
+{10024, 17, 36534, {1, 1, 5, 5, 25, 53, 73, 111, 319, 311, 1597, 1809, 5343, 13963, 6613, 14471, 53871}},
+{10025, 17, 36540, {1, 3, 3, 1, 15, 57, 47, 205, 53, 471, 185, 273, 8077, 5031, 31195, 30859, 15979}},
+{10026, 17, 36555, {1, 1, 3, 5, 23, 15, 87, 211, 83, 265, 1629, 2979, 69, 12559, 30455, 36363, 61461}},
+{10027, 17, 36563, {1, 1, 7, 7, 1, 47, 5, 199, 95, 17, 57, 1887, 6847, 9501, 21361, 57763, 77069}},
+{10028, 17, 36565, {1, 1, 3, 5, 9, 15, 15, 149, 141, 605, 639, 2197, 7237, 5753, 9415, 4677, 129947}},
+{10029, 17, 36588, {1, 3, 7, 1, 7, 9, 29, 249, 275, 461, 1667, 4093, 5763, 3205, 24079, 11883, 86455}},
+{10030, 17, 36593, {1, 1, 3, 5, 15, 39, 117, 145, 153, 671, 1819, 111, 3607, 12279, 4927, 63759, 42905}},
+{10031, 17, 36596, {1, 1, 1, 5, 31, 5, 35, 183, 189, 839, 1811, 1877, 6545, 11373, 27947, 27183, 29857}},
+{10032, 17, 36606, {1, 3, 5, 7, 29, 47, 3, 183, 511, 145, 1953, 3419, 6385, 7745, 12823, 59783, 69399}},
+{10033, 17, 36614, {1, 3, 5, 9, 5, 39, 85, 145, 33, 899, 1009, 2035, 6145, 3855, 20583, 4329, 95231}},
+{10034, 17, 36626, {1, 1, 3, 3, 15, 61, 85, 181, 247, 705, 413, 1633, 7489, 1785, 30397, 42851, 80197}},
+{10035, 17, 36628, {1, 3, 3, 13, 23, 11, 3, 97, 307, 183, 113, 3881, 7455, 8327, 6749, 23977, 101629}},
+{10036, 17, 36641, {1, 1, 7, 13, 1, 23, 59, 219, 125, 789, 1401, 707, 6915, 6275, 25813, 46595, 54119}},
+{10037, 17, 36642, {1, 3, 7, 9, 5, 7, 37, 33, 165, 181, 833, 1993, 4541, 5799, 23323, 39825, 44575}},
+{10038, 17, 36651, {1, 3, 1, 13, 13, 43, 69, 219, 437, 521, 503, 2293, 3607, 6845, 22583, 291, 65645}},
+{10039, 17, 36653, {1, 1, 7, 9, 29, 13, 123, 67, 191, 933, 1875, 1223, 5525, 13797, 29771, 58191, 84469}},
+{10040, 17, 36673, {1, 1, 7, 7, 3, 57, 101, 69, 23, 239, 1023, 3289, 1541, 6245, 23379, 161, 61155}},
+{10041, 17, 36676, {1, 3, 7, 13, 25, 33, 49, 145, 487, 681, 451, 1719, 109, 16273, 20009, 3003, 115815}},
+{10042, 17, 36679, {1, 1, 5, 11, 11, 59, 41, 133, 303, 469, 1975, 847, 5291, 13947, 8759, 8533, 25099}},
+{10043, 17, 36694, {1, 1, 1, 1, 29, 31, 53, 11, 239, 57, 1627, 1247, 1577, 3269, 20751, 4627, 40499}},
+{10044, 17, 36698, {1, 3, 7, 15, 1, 1, 51, 39, 383, 203, 1841, 3867, 4975, 9937, 1863, 52611, 83189}},
+{10045, 17, 36704, {1, 3, 7, 7, 13, 59, 15, 217, 355, 945, 1317, 815, 2413, 10985, 30647, 37745, 126553}},
+{10046, 17, 36714, {1, 1, 3, 11, 7, 29, 101, 137, 97, 119, 927, 3269, 6977, 4253, 10741, 61907, 122815}},
+{10047, 17, 36721, {1, 3, 3, 1, 29, 5, 49, 137, 411, 349, 905, 2481, 4961, 4513, 29409, 19503, 77915}},
+{10048, 17, 36722, {1, 1, 7, 13, 29, 59, 93, 61, 393, 29, 257, 3601, 6281, 5105, 17339, 53827, 83137}},
+{10049, 17, 36727, {1, 1, 1, 13, 5, 23, 61, 7, 51, 161, 737, 1549, 6021, 3385, 5539, 21261, 69995}},
+{10050, 17, 36749, {1, 1, 1, 15, 31, 1, 21, 113, 481, 7, 175, 717, 1593, 5937, 12347, 51835, 66649}},
+{10051, 17, 36758, {1, 1, 3, 7, 9, 51, 9, 199, 39, 607, 1157, 3913, 7767, 14195, 28721, 27655, 34709}},
+{10052, 17, 36761, {1, 3, 5, 5, 1, 15, 49, 33, 441, 721, 1749, 1497, 2023, 8351, 12641, 11861, 78545}},
+{10053, 17, 36771, {1, 3, 1, 7, 7, 17, 103, 113, 243, 25, 889, 1419, 3163, 12401, 22459, 39037, 101719}},
+{10054, 17, 36788, {1, 1, 7, 11, 17, 45, 121, 215, 3, 409, 1871, 2149, 4249, 5071, 14277, 55869, 91233}},
+{10055, 17, 36797, {1, 1, 3, 7, 19, 31, 47, 241, 175, 749, 1709, 355, 6037, 10555, 24107, 64683, 42673}},
+{10056, 17, 36805, {1, 3, 7, 11, 5, 21, 105, 137, 307, 101, 417, 1903, 1027, 10257, 27767, 9755, 92105}},
+{10057, 17, 36830, {1, 1, 3, 13, 9, 59, 11, 63, 295, 923, 401, 1471, 3517, 7761, 28855, 11525, 72455}},
+{10058, 17, 36833, {1, 1, 7, 15, 31, 51, 77, 29, 323, 579, 1313, 3441, 2903, 1683, 20605, 8185, 29753}},
+{10059, 17, 36839, {1, 1, 5, 15, 11, 59, 119, 109, 233, 1001, 1527, 2709, 73, 5311, 18313, 27155, 85999}},
+{10060, 17, 36843, {1, 3, 1, 5, 9, 59, 105, 93, 213, 401, 839, 3225, 3263, 13501, 2413, 60367, 121281}},
+{10061, 17, 36860, {1, 1, 7, 3, 19, 25, 75, 27, 325, 435, 527, 1465, 3601, 5785, 6135, 32841, 60129}},
+{10062, 17, 36866, {1, 1, 3, 7, 31, 19, 37, 157, 189, 51, 869, 2963, 5269, 9151, 14845, 30441, 89685}},
+{10063, 17, 36871, {1, 3, 3, 9, 17, 51, 23, 177, 417, 255, 1739, 3085, 7811, 15177, 25433, 38487, 51021}},
+{10064, 17, 36875, {1, 1, 3, 7, 27, 1, 45, 235, 59, 491, 1327, 3967, 7585, 4313, 29669, 47193, 89427}},
+{10065, 17, 36877, {1, 1, 3, 9, 19, 5, 27, 63, 263, 593, 1599, 1311, 1029, 603, 25291, 51391, 98915}},
+{10066, 17, 36880, {1, 3, 3, 15, 11, 7, 97, 99, 263, 155, 437, 3849, 2665, 3371, 8179, 51883, 3601}},
+{10067, 17, 36892, {1, 1, 3, 15, 7, 35, 37, 149, 251, 619, 1423, 553, 4453, 16365, 22543, 6951, 34655}},
+{10068, 17, 36911, {1, 3, 3, 11, 15, 21, 95, 143, 31, 425, 179, 2383, 4799, 7655, 26945, 9273, 103469}},
+{10069, 17, 36914, {1, 3, 1, 9, 13, 49, 3, 117, 361, 459, 227, 2067, 4909, 13461, 22505, 10259, 59697}},
+{10070, 17, 36916, {1, 1, 7, 7, 7, 23, 67, 217, 313, 965, 1747, 995, 579, 6217, 8915, 49329, 851}},
+{10071, 17, 36923, {1, 1, 3, 1, 17, 19, 7, 99, 281, 207, 1685, 2401, 967, 9399, 28741, 28839, 6003}},
+{10072, 17, 36940, {1, 3, 3, 5, 31, 61, 105, 251, 499, 319, 1167, 2203, 1195, 2663, 11797, 12981, 125523}},
+{10073, 17, 36943, {1, 3, 1, 5, 23, 19, 99, 101, 85, 837, 501, 2737, 4051, 2413, 9275, 38995, 21633}},
+{10074, 17, 36948, {1, 3, 7, 13, 17, 17, 119, 75, 281, 527, 1477, 1515, 7765, 5573, 10143, 6219, 57817}},
+{10075, 17, 36957, {1, 1, 5, 11, 19, 35, 85, 171, 107, 905, 1395, 1199, 7345, 15719, 14021, 47425, 36081}},
+{10076, 17, 36958, {1, 1, 3, 9, 9, 63, 109, 15, 323, 73, 1541, 2227, 5197, 12617, 23379, 53415, 105291}},
+{10077, 17, 36967, {1, 3, 3, 5, 5, 41, 85, 99, 3, 895, 1383, 3627, 3897, 1893, 23673, 56501, 78411}},
+{10078, 17, 36974, {1, 1, 7, 1, 25, 27, 45, 185, 475, 577, 1619, 727, 1407, 2383, 9215, 55295, 27349}},
+{10079, 17, 36981, {1, 3, 7, 11, 3, 51, 53, 53, 399, 711, 1075, 511, 5369, 10777, 14419, 63217, 130181}},
+{10080, 17, 37001, {1, 1, 7, 13, 25, 19, 107, 71, 151, 73, 735, 3837, 5307, 10229, 10529, 9989, 111925}},
+{10081, 17, 37012, {1, 1, 1, 15, 19, 59, 65, 77, 465, 957, 1085, 1359, 3959, 15823, 6273, 12565, 126167}},
+{10082, 17, 37015, {1, 1, 5, 5, 31, 53, 23, 173, 407, 795, 41, 3275, 1953, 13673, 26625, 33477, 14149}},
+{10083, 17, 37019, {1, 1, 7, 7, 1, 11, 121, 139, 77, 321, 1939, 2597, 621, 9579, 11629, 13119, 30505}},
+{10084, 17, 37035, {1, 1, 1, 5, 3, 33, 45, 127, 169, 581, 1521, 1019, 6489, 1069, 2469, 40255, 66619}},
+{10085, 17, 37040, {1, 3, 7, 5, 29, 47, 7, 245, 459, 417, 1027, 857, 4905, 11255, 3267, 9491, 78013}},
+{10086, 17, 37063, {1, 3, 5, 9, 25, 49, 61, 215, 19, 731, 303, 1001, 6031, 3705, 7797, 31957, 119383}},
+{10087, 17, 37064, {1, 3, 5, 5, 1, 9, 37, 187, 235, 453, 963, 2833, 3501, 605, 2763, 41215, 93547}},
+{10088, 17, 37069, {1, 3, 1, 1, 21, 3, 41, 53, 425, 687, 1051, 2365, 7835, 3981, 5557, 61993, 127417}},
+{10089, 17, 37077, {1, 3, 3, 7, 13, 61, 41, 189, 261, 163, 1931, 1803, 2379, 16379, 25453, 17911, 123431}},
+{10090, 17, 37093, {1, 1, 7, 15, 23, 21, 95, 7, 27, 897, 721, 3917, 7971, 4643, 5223, 46583, 32453}},
+{10091, 17, 37097, {1, 1, 7, 7, 1, 25, 83, 109, 223, 573, 533, 449, 6477, 10719, 28705, 8283, 94963}},
+{10092, 17, 37106, {1, 1, 5, 13, 21, 45, 63, 31, 21, 223, 31, 1249, 425, 7199, 11539, 7731, 44333}},
+{10093, 17, 37115, {1, 1, 5, 15, 29, 5, 87, 215, 287, 567, 297, 451, 5867, 15511, 1005, 57469, 87257}},
+{10094, 17, 37118, {1, 3, 5, 11, 13, 51, 117, 139, 377, 1015, 1237, 2053, 7625, 1003, 22673, 64345, 16203}},
+{10095, 17, 37123, {1, 1, 3, 15, 19, 39, 73, 205, 185, 331, 869, 857, 5043, 7247, 25253, 5799, 64857}},
+{10096, 17, 37129, {1, 3, 7, 1, 25, 63, 125, 47, 161, 289, 373, 1603, 1663, 1123, 28907, 37855, 47935}},
+{10097, 17, 37130, {1, 1, 7, 15, 9, 17, 97, 63, 79, 123, 1357, 3055, 2323, 16083, 21861, 38743, 81291}},
+{10098, 17, 37135, {1, 1, 3, 15, 5, 23, 7, 159, 127, 511, 55, 2691, 6823, 16151, 8059, 43021, 18911}},
+{10099, 17, 37137, {1, 1, 3, 9, 27, 19, 41, 75, 375, 921, 1745, 35, 1189, 5857, 29869, 43827, 16899}},
+{10100, 17, 37138, {1, 1, 1, 5, 3, 21, 13, 235, 51, 529, 291, 2619, 5419, 12573, 10907, 8865, 54987}},
+{10101, 17, 37140, {1, 3, 1, 13, 7, 9, 85, 131, 159, 743, 1671, 3001, 4559, 12343, 27563, 49941, 68447}},
+{10102, 17, 37144, {1, 1, 7, 5, 17, 61, 99, 63, 199, 383, 485, 2569, 5329, 645, 18805, 20421, 101229}},
+{10103, 17, 37149, {1, 1, 1, 15, 3, 59, 41, 247, 213, 843, 2003, 125, 7755, 4203, 20277, 47195, 48249}},
+{10104, 17, 37156, {1, 1, 5, 15, 15, 17, 113, 101, 27, 811, 1791, 1777, 749, 14317, 17267, 54467, 118369}},
+{10105, 17, 37159, {1, 3, 3, 3, 19, 37, 23, 117, 275, 733, 1259, 567, 1769, 12071, 5413, 49411, 99259}},
+{10106, 17, 37163, {1, 3, 1, 11, 3, 27, 103, 113, 251, 731, 481, 2771, 3205, 14151, 19403, 30307, 114691}},
+{10107, 17, 37165, {1, 1, 5, 15, 19, 15, 103, 25, 357, 197, 1437, 3621, 4747, 773, 5769, 33465, 28307}},
+{10108, 17, 37183, {1, 1, 5, 15, 5, 17, 89, 87, 423, 611, 549, 2549, 1275, 14545, 2931, 3853, 24577}},
+{10109, 17, 37185, {1, 3, 5, 1, 15, 13, 29, 49, 279, 495, 697, 1015, 4899, 15977, 10765, 47979, 40237}},
+{10110, 17, 37195, {1, 3, 3, 9, 31, 51, 21, 5, 279, 947, 1871, 3075, 5433, 1631, 30075, 30517, 99609}},
+{10111, 17, 37198, {1, 1, 1, 15, 19, 63, 79, 81, 19, 629, 617, 1887, 4015, 15501, 10551, 56419, 108739}},
+{10112, 17, 37203, {1, 1, 3, 9, 31, 15, 45, 37, 43, 349, 1357, 189, 4551, 9363, 15683, 48445, 89279}},
+{10113, 17, 37212, {1, 1, 1, 1, 17, 19, 121, 119, 397, 947, 1797, 613, 1627, 9591, 15779, 62295, 118843}},
+{10114, 17, 37233, {1, 1, 1, 7, 25, 55, 71, 227, 507, 497, 1209, 2919, 5733, 15785, 21437, 40043, 2325}},
+{10115, 17, 37236, {1, 1, 1, 15, 11, 1, 59, 93, 69, 859, 67, 1831, 6345, 5643, 29515, 20337, 77281}},
+{10116, 17, 37240, {1, 3, 5, 9, 19, 53, 59, 63, 161, 853, 697, 1441, 3457, 951, 29659, 15337, 38443}},
+{10117, 17, 37256, {1, 3, 1, 9, 7, 21, 73, 81, 89, 291, 411, 3793, 4639, 2829, 6855, 38113, 32875}},
+{10118, 17, 37264, {1, 1, 7, 1, 15, 3, 79, 35, 363, 459, 907, 1157, 5165, 8021, 10135, 36367, 111991}},
+{10119, 17, 37267, {1, 3, 5, 13, 21, 23, 63, 155, 393, 869, 1553, 3345, 2711, 8249, 24907, 28111, 36667}},
+{10120, 17, 37273, {1, 1, 7, 11, 15, 25, 29, 93, 45, 637, 1473, 2053, 313, 8047, 23411, 8643, 2925}},
+{10121, 17, 37295, {1, 3, 7, 9, 11, 5, 73, 69, 311, 949, 2017, 259, 2861, 10547, 12017, 34125, 74101}},
+{10122, 17, 37315, {1, 3, 1, 13, 19, 61, 115, 59, 447, 787, 1621, 2221, 7841, 5329, 18137, 13857, 51889}},
+{10123, 17, 37330, {1, 3, 7, 13, 1, 23, 117, 49, 449, 541, 7, 3269, 1725, 6677, 15979, 4319, 40919}},
+{10124, 17, 37336, {1, 3, 5, 5, 17, 29, 35, 123, 3, 481, 305, 1589, 4319, 5183, 31907, 53019, 49375}},
+{10125, 17, 37339, {1, 3, 1, 7, 11, 59, 79, 89, 479, 821, 763, 3597, 7457, 13775, 11213, 22777, 80379}},
+{10126, 17, 37342, {1, 1, 3, 7, 13, 17, 65, 155, 335, 671, 331, 895, 7459, 1719, 10675, 60109, 63143}},
+{10127, 17, 37357, {1, 3, 5, 1, 29, 33, 105, 249, 61, 469, 1629, 3777, 4393, 14457, 11701, 6065, 2635}},
+{10128, 17, 37365, {1, 3, 7, 3, 13, 13, 21, 15, 363, 63, 1263, 1479, 1459, 6577, 7481, 30393, 19831}},
+{10129, 17, 37372, {1, 1, 3, 7, 29, 25, 71, 247, 501, 815, 1697, 2457, 4975, 3821, 25759, 24901, 120603}},
+{10130, 17, 37381, {1, 1, 1, 5, 19, 3, 59, 163, 367, 779, 47, 905, 897, 3293, 13951, 25497, 99151}},
+{10131, 17, 37399, {1, 3, 1, 5, 11, 47, 21, 171, 123, 215, 1797, 3741, 4921, 7213, 4847, 3239, 114839}},
+{10132, 17, 37416, {1, 3, 3, 5, 23, 63, 57, 31, 409, 431, 1337, 3301, 4695, 7401, 9383, 12639, 34347}},
+{10133, 17, 37429, {1, 3, 3, 5, 27, 57, 29, 147, 111, 1015, 815, 1509, 3967, 7255, 15109, 26001, 90775}},
+{10134, 17, 37436, {1, 1, 7, 13, 31, 45, 21, 99, 377, 399, 255, 459, 6043, 11055, 5675, 3333, 32813}},
+{10135, 17, 37442, {1, 3, 1, 7, 1, 55, 121, 77, 429, 433, 297, 3181, 3029, 6777, 22795, 61515, 58553}},
+{10136, 17, 37451, {1, 3, 5, 9, 1, 19, 121, 1, 499, 589, 1597, 2219, 1029, 4223, 31613, 45685, 53517}},
+{10137, 17, 37453, {1, 3, 1, 9, 29, 39, 83, 193, 43, 41, 467, 1711, 2761, 10635, 15503, 38043, 120615}},
+{10138, 17, 37475, {1, 1, 7, 13, 27, 61, 1, 181, 163, 613, 221, 63, 6147, 8215, 15093, 2417, 71489}},
+{10139, 17, 37482, {1, 1, 7, 15, 31, 63, 47, 139, 427, 847, 53, 1275, 1019, 9455, 12537, 22467, 129947}},
+{10140, 17, 37489, {1, 1, 5, 3, 7, 1, 67, 189, 501, 319, 37, 2849, 2535, 10917, 11115, 48083, 67255}},
+{10141, 17, 37490, {1, 1, 3, 13, 7, 31, 69, 137, 19, 73, 1553, 3945, 2381, 8761, 3977, 24291, 128189}},
+{10142, 17, 37523, {1, 3, 5, 11, 1, 59, 43, 229, 301, 771, 559, 195, 1675, 12605, 22211, 2915, 90351}},
+{10143, 17, 37525, {1, 3, 3, 9, 13, 27, 97, 33, 273, 229, 1537, 1179, 6985, 11679, 17889, 44673, 126641}},
+{10144, 17, 37530, {1, 1, 7, 3, 31, 29, 41, 123, 491, 639, 269, 45, 2155, 14103, 6725, 50781, 42785}},
+{10145, 17, 37535, {1, 3, 5, 9, 9, 11, 89, 249, 475, 701, 1029, 985, 8167, 439, 31897, 24529, 45759}},
+{10146, 17, 37539, {1, 1, 5, 11, 9, 39, 127, 179, 15, 135, 1437, 3331, 5553, 939, 15319, 64937, 110783}},
+{10147, 17, 37548, {1, 3, 1, 5, 7, 61, 1, 219, 111, 801, 85, 3427, 2533, 12861, 5395, 28969, 48091}},
+{10148, 17, 37559, {1, 1, 1, 9, 23, 57, 77, 41, 61, 635, 457, 231, 8121, 5349, 27021, 64807, 87563}},
+{10149, 17, 37560, {1, 3, 5, 7, 31, 31, 101, 155, 255, 199, 1973, 903, 7681, 15379, 12845, 47943, 60663}},
+{10150, 17, 37566, {1, 1, 5, 7, 1, 7, 71, 121, 323, 669, 193, 1209, 267, 9, 21223, 22037, 121567}},
+{10151, 17, 37597, {1, 3, 1, 5, 17, 29, 97, 189, 219, 813, 187, 1763, 5817, 13185, 467, 40159, 18037}},
+{10152, 17, 37601, {1, 1, 7, 9, 7, 59, 3, 189, 379, 843, 631, 3945, 2909, 4191, 30343, 11223, 105629}},
+{10153, 17, 37602, {1, 3, 1, 3, 15, 17, 23, 73, 439, 699, 657, 451, 6139, 15869, 4101, 32327, 55485}},
+{10154, 17, 37604, {1, 3, 3, 5, 21, 37, 87, 157, 205, 493, 705, 1539, 2193, 13539, 2797, 49063, 55595}},
+{10155, 17, 37616, {1, 1, 5, 11, 11, 41, 5, 131, 445, 781, 1153, 1371, 6763, 3101, 32449, 16065, 86579}},
+{10156, 17, 37622, {1, 3, 5, 1, 23, 51, 97, 87, 161, 261, 269, 2035, 2139, 3049, 32217, 25189, 93571}},
+{10157, 17, 37658, {1, 3, 1, 11, 23, 1, 111, 45, 19, 19, 1767, 3571, 6027, 3593, 17453, 53821, 28121}},
+{10158, 17, 37660, {1, 3, 3, 5, 17, 5, 17, 247, 5, 73, 29, 443, 7713, 15803, 22311, 56755, 100119}},
+{10159, 17, 37667, {1, 3, 1, 13, 7, 1, 41, 139, 317, 977, 1529, 1217, 529, 3231, 21491, 28461, 96699}},
+{10160, 17, 37684, {1, 3, 1, 13, 11, 41, 103, 99, 81, 849, 231, 1729, 761, 711, 11499, 25581, 59433}},
+{10161, 17, 37693, {1, 1, 5, 5, 13, 33, 79, 175, 89, 29, 295, 2867, 1197, 6137, 32063, 23471, 21721}},
+{10162, 17, 37694, {1, 1, 5, 15, 17, 29, 123, 249, 273, 437, 443, 2601, 3957, 11955, 261, 54863, 85727}},
+{10163, 17, 37696, {1, 1, 5, 13, 3, 31, 57, 205, 3, 903, 905, 3851, 757, 13761, 28615, 48185, 33227}},
+{10164, 17, 37706, {1, 3, 7, 1, 1, 1, 107, 15, 307, 405, 45, 297, 4365, 1569, 9263, 13685, 36027}},
+{10165, 17, 37711, {1, 3, 1, 9, 17, 61, 113, 121, 249, 743, 191, 2523, 6621, 5395, 23797, 57975, 51675}},
+{10166, 17, 37730, {1, 3, 5, 3, 27, 21, 49, 113, 59, 989, 501, 2651, 3827, 5121, 29667, 32903, 84199}},
+{10167, 17, 37735, {1, 1, 7, 7, 19, 43, 11, 191, 143, 93, 1167, 2521, 2569, 12187, 28575, 13073, 113545}},
+{10168, 17, 37742, {1, 1, 7, 3, 27, 39, 11, 85, 61, 979, 49, 2191, 2607, 13967, 28123, 48903, 16327}},
+{10169, 17, 37744, {1, 1, 5, 3, 17, 17, 1, 149, 189, 1017, 705, 3119, 6441, 1595, 30533, 18795, 34265}},
+{10170, 17, 37759, {1, 1, 3, 11, 31, 11, 125, 109, 39, 41, 191, 2615, 1377, 16089, 8793, 31425, 90507}},
+{10171, 17, 37777, {1, 1, 1, 1, 23, 15, 21, 245, 337, 649, 585, 2893, 927, 883, 15119, 2595, 127963}},
+{10172, 17, 37783, {1, 3, 5, 3, 13, 17, 123, 167, 471, 5, 1671, 2787, 5081, 12903, 4257, 19213, 2503}},
+{10173, 17, 37784, {1, 1, 5, 7, 21, 57, 75, 171, 509, 591, 85, 407, 1747, 6375, 19641, 55683, 111289}},
+{10174, 17, 37793, {1, 1, 7, 7, 3, 31, 121, 111, 19, 361, 1033, 4033, 2359, 13451, 15095, 61817, 69683}},
+{10175, 17, 37800, {1, 1, 5, 9, 21, 33, 83, 179, 387, 69, 1085, 2147, 2751, 10899, 16971, 40623, 110891}},
+{10176, 17, 37818, {1, 1, 7, 9, 11, 45, 81, 71, 73, 551, 145, 159, 7519, 3459, 5197, 48913, 59045}},
+{10177, 17, 37823, {1, 3, 1, 3, 7, 35, 17, 249, 207, 767, 1189, 1451, 4351, 3673, 28807, 671, 69271}},
+{10178, 17, 37825, {1, 3, 1, 15, 21, 27, 81, 243, 55, 191, 1497, 3205, 1601, 705, 14891, 14403, 130729}},
+{10179, 17, 37828, {1, 3, 1, 7, 17, 43, 41, 123, 507, 201, 1873, 3547, 5681, 1819, 4251, 39661, 57923}},
+{10180, 17, 37832, {1, 3, 1, 9, 3, 59, 57, 235, 445, 479, 961, 1937, 2229, 2511, 15235, 59707, 72261}},
+{10181, 17, 37849, {1, 1, 5, 13, 9, 63, 67, 217, 63, 259, 175, 2469, 3075, 12365, 7727, 42215, 12635}},
+{10182, 17, 37856, {1, 1, 3, 13, 11, 9, 125, 131, 17, 399, 675, 767, 7349, 10433, 21615, 46823, 3955}},
+{10183, 17, 37861, {1, 1, 3, 15, 19, 53, 73, 171, 125, 531, 1093, 1449, 2931, 10897, 12263, 9799, 98251}},
+{10184, 17, 37862, {1, 1, 5, 5, 11, 27, 33, 9, 503, 545, 339, 1099, 1973, 13261, 26871, 14569, 22755}},
+{10185, 17, 37886, {1, 3, 7, 1, 19, 5, 79, 133, 247, 1021, 1431, 3707, 4603, 3285, 5469, 46963, 98203}},
+{10186, 17, 37893, {1, 3, 5, 7, 15, 11, 87, 169, 495, 763, 1295, 2533, 4213, 8671, 21683, 12521, 90071}},
+{10187, 17, 37915, {1, 1, 3, 1, 17, 55, 7, 165, 313, 659, 49, 377, 6675, 15255, 9881, 11751, 87789}},
+{10188, 17, 37922, {1, 3, 1, 15, 3, 49, 27, 109, 145, 1011, 1939, 3201, 6141, 7229, 20741, 59285, 129365}},
+{10189, 17, 37936, {1, 1, 5, 5, 5, 51, 117, 17, 363, 795, 1343, 2637, 6209, 1045, 22515, 10687, 48487}},
+{10190, 17, 37939, {1, 1, 5, 15, 1, 37, 91, 241, 245, 703, 505, 3369, 6163, 10265, 12497, 46301, 109523}},
+{10191, 17, 37945, {1, 1, 7, 11, 3, 37, 67, 35, 229, 823, 193, 913, 3331, 4475, 9271, 11859, 52709}},
+{10192, 17, 37956, {1, 1, 3, 3, 7, 25, 61, 159, 81, 1011, 1491, 1439, 1031, 765, 9839, 61891, 20969}},
+{10193, 17, 37960, {1, 3, 3, 7, 25, 39, 73, 59, 101, 101, 225, 1105, 5943, 5223, 12585, 16411, 62699}},
+{10194, 17, 37971, {1, 1, 7, 5, 25, 19, 27, 113, 465, 319, 2035, 2127, 1319, 11793, 26821, 44805, 28217}},
+{10195, 17, 37980, {1, 3, 5, 11, 7, 9, 81, 107, 67, 31, 1503, 3303, 4451, 11417, 32681, 26861, 54845}},
+{10196, 17, 38002, {1, 3, 1, 1, 3, 51, 93, 235, 93, 247, 2027, 1517, 6797, 1703, 10233, 45313, 60771}},
+{10197, 17, 38007, {1, 3, 3, 15, 25, 11, 83, 77, 413, 189, 119, 597, 2199, 12347, 7935, 40191, 125569}},
+{10198, 17, 38018, {1, 3, 7, 9, 11, 3, 77, 31, 89, 163, 1993, 3017, 3973, 10943, 22247, 45565, 7261}},
+{10199, 17, 38020, {1, 3, 7, 7, 15, 13, 7, 155, 373, 893, 607, 3521, 7455, 13809, 6145, 31743, 86329}},
+{10200, 17, 38038, {1, 1, 1, 15, 25, 41, 111, 65, 11, 627, 59, 2725, 995, 3761, 25361, 45189, 48355}},
+{10201, 17, 38041, {1, 1, 7, 5, 29, 43, 91, 139, 323, 503, 679, 4079, 403, 1899, 1425, 26989, 117057}},
+{10202, 17, 38044, {1, 3, 5, 13, 1, 17, 19, 61, 205, 833, 345, 1031, 7995, 999, 27469, 15943, 88011}},
+{10203, 17, 38048, {1, 3, 1, 7, 23, 49, 123, 9, 11, 761, 1163, 669, 3837, 15225, 23393, 19513, 9457}},
+{10204, 17, 38051, {1, 1, 5, 9, 9, 33, 29, 123, 277, 433, 1799, 1583, 3133, 13461, 26443, 15807, 80173}},
+{10205, 17, 38054, {1, 3, 7, 3, 31, 29, 77, 105, 297, 617, 491, 647, 6541, 5033, 31841, 48405, 126985}},
+{10206, 17, 38065, {1, 1, 5, 5, 31, 39, 17, 25, 3, 279, 89, 3985, 3333, 5681, 3701, 36319, 12585}},
+{10207, 17, 38066, {1, 1, 7, 13, 13, 19, 93, 129, 51, 875, 1083, 1739, 5193, 6217, 10033, 51839, 66071}},
+{10208, 17, 38077, {1, 1, 7, 9, 15, 23, 93, 121, 507, 115, 707, 3181, 1521, 9609, 4577, 54389, 19167}},
+{10209, 17, 38090, {1, 3, 3, 7, 17, 51, 19, 29, 387, 711, 1105, 1627, 4421, 15183, 14149, 26485, 106425}},
+{10210, 17, 38109, {1, 3, 3, 15, 25, 59, 11, 45, 259, 1019, 1997, 3373, 5083, 5701, 30217, 44845, 67559}},
+{10211, 17, 38119, {1, 3, 3, 9, 17, 47, 5, 103, 477, 785, 235, 1523, 1505, 8811, 15255, 53493, 4383}},
+{10212, 17, 38120, {1, 3, 7, 3, 7, 37, 73, 247, 397, 409, 1065, 525, 5665, 8533, 30627, 19035, 22937}},
+{10213, 17, 38123, {1, 3, 3, 15, 15, 47, 123, 215, 413, 249, 55, 2563, 8033, 8743, 18659, 7947, 56057}},
+{10214, 17, 38146, {1, 1, 7, 3, 11, 61, 103, 109, 313, 293, 149, 999, 901, 13387, 15351, 52973, 68385}},
+{10215, 17, 38155, {1, 1, 1, 5, 31, 13, 57, 43, 263, 141, 335, 2777, 3435, 4231, 20623, 2597, 33481}},
+{10216, 17, 38160, {1, 1, 7, 13, 21, 53, 101, 75, 237, 275, 1903, 3501, 8023, 3651, 19609, 44417, 60287}},
+{10217, 17, 38181, {1, 1, 1, 1, 13, 43, 83, 255, 355, 567, 1781, 2943, 1061, 2701, 24861, 58381, 60255}},
+{10218, 17, 38188, {1, 1, 3, 9, 25, 5, 81, 85, 445, 857, 517, 3687, 2641, 6699, 19273, 4481, 8715}},
+{10219, 17, 38199, {1, 1, 3, 7, 17, 39, 33, 31, 29, 269, 379, 3149, 4731, 10387, 7941, 49199, 18423}},
+{10220, 17, 38203, {1, 1, 7, 15, 19, 37, 105, 157, 185, 1023, 1865, 53, 6765, 3, 22897, 17019, 109521}},
+{10221, 17, 38225, {1, 3, 7, 5, 5, 7, 117, 211, 19, 149, 1091, 3721, 201, 4455, 18965, 51401, 67225}},
+{10222, 17, 38226, {1, 3, 5, 11, 1, 55, 101, 41, 469, 271, 1251, 949, 861, 11903, 14773, 25675, 114161}},
+{10223, 17, 38231, {1, 1, 7, 7, 23, 13, 103, 185, 137, 575, 797, 1195, 5301, 13307, 12043, 26003, 31719}},
+{10224, 17, 38244, {1, 1, 5, 7, 11, 51, 17, 71, 321, 559, 1461, 3571, 1033, 15575, 7097, 14703, 52359}},
+{10225, 17, 38248, {1, 1, 1, 5, 21, 9, 123, 211, 233, 81, 111, 1433, 7825, 11771, 30743, 23993, 48717}},
+{10226, 17, 38259, {1, 3, 5, 15, 7, 3, 109, 33, 99, 135, 393, 3463, 7271, 14387, 30723, 19079, 83073}},
+{10227, 17, 38268, {1, 3, 3, 15, 3, 51, 77, 219, 409, 11, 67, 3787, 5155, 9259, 7185, 21611, 32577}},
+{10228, 17, 38271, {1, 3, 7, 1, 5, 49, 125, 85, 151, 301, 887, 1765, 5, 12849, 11775, 11319, 29547}},
+{10229, 17, 38272, {1, 1, 7, 11, 17, 15, 105, 29, 327, 637, 1493, 3361, 1823, 14709, 18355, 741, 57807}},
+{10230, 17, 38278, {1, 1, 7, 7, 3, 27, 15, 113, 227, 617, 1543, 1719, 8065, 13627, 23525, 20511, 64759}},
+{10231, 17, 38292, {1, 1, 3, 3, 21, 47, 89, 177, 381, 711, 1367, 2405, 887, 2351, 22957, 49679, 5963}},
+{10232, 17, 38296, {1, 3, 7, 9, 7, 1, 39, 71, 9, 275, 875, 1385, 6215, 10419, 25921, 63427, 18031}},
+{10233, 17, 38318, {1, 1, 7, 5, 23, 57, 27, 7, 445, 111, 953, 37, 2769, 1967, 8165, 35417, 36471}},
+{10234, 17, 38326, {1, 3, 3, 11, 23, 17, 119, 113, 275, 625, 1957, 2795, 3815, 7937, 11049, 31939, 128053}},
+{10235, 17, 38338, {1, 3, 3, 5, 7, 35, 45, 41, 251, 491, 1953, 3201, 751, 5705, 595, 27003, 77917}},
+{10236, 17, 38347, {1, 3, 5, 3, 25, 17, 55, 137, 299, 541, 289, 2225, 4667, 3569, 13687, 36193, 75705}},
+{10237, 17, 38373, {1, 1, 7, 15, 21, 9, 27, 157, 469, 441, 193, 2097, 4863, 2147, 31197, 24283, 102039}},
+{10238, 17, 38378, {1, 1, 1, 11, 17, 39, 73, 37, 91, 121, 1283, 367, 1875, 14365, 28349, 60993, 10791}},
+{10239, 17, 38380, {1, 3, 5, 9, 13, 63, 89, 53, 459, 347, 343, 2321, 5237, 2497, 279, 63833, 10709}},
+{10240, 17, 38388, {1, 1, 1, 15, 11, 23, 41, 79, 45, 567, 1217, 1669, 1679, 2561, 16191, 49041, 4081}},
+{10241, 17, 38392, {1, 3, 1, 5, 3, 9, 103, 245, 47, 561, 229, 2945, 6563, 797, 21571, 25769, 12995}},
+{10242, 17, 38397, {1, 3, 5, 7, 5, 47, 99, 55, 49, 951, 765, 2095, 8021, 4389, 20501, 26047, 119967}},
+{10243, 17, 38398, {1, 1, 5, 3, 15, 47, 81, 121, 379, 527, 419, 1093, 367, 10939, 17181, 13905, 49859}},
+{10244, 17, 38401, {1, 3, 3, 5, 7, 59, 53, 255, 131, 685, 1677, 3757, 3601, 89, 6225, 32705, 28287}},
+{10245, 17, 38404, {1, 3, 7, 1, 7, 55, 85, 47, 425, 793, 605, 2313, 791, 4247, 9693, 10633, 82915}},
+{10246, 17, 38422, {1, 3, 5, 13, 13, 49, 127, 213, 27, 657, 419, 55, 6289, 295, 4211, 8899, 120237}},
+{10247, 17, 38432, {1, 1, 7, 11, 11, 7, 75, 35, 315, 125, 517, 3677, 2323, 6897, 11535, 36789, 20179}},
+{10248, 17, 38469, {1, 1, 5, 9, 11, 3, 77, 43, 323, 647, 383, 485, 3937, 9081, 27745, 59149, 103433}},
+{10249, 17, 38482, {1, 3, 3, 13, 3, 47, 91, 81, 115, 625, 2003, 3601, 531, 113, 20719, 47391, 111039}},
+{10250, 17, 38493, {1, 1, 3, 13, 5, 49, 123, 189, 109, 325, 497, 923, 3861, 14029, 22651, 19857, 104801}},
+{10251, 17, 38507, {1, 1, 5, 3, 29, 23, 25, 23, 501, 371, 1983, 1303, 2261, 11865, 13281, 2587, 75741}},
+{10252, 17, 38518, {1, 3, 5, 13, 27, 61, 45, 11, 157, 615, 897, 1529, 2213, 757, 30105, 2011, 27267}},
+{10253, 17, 38521, {1, 3, 5, 13, 29, 31, 95, 159, 449, 307, 1575, 1897, 2301, 14023, 6921, 30543, 31843}},
+{10254, 17, 38527, {1, 3, 3, 5, 1, 1, 79, 147, 437, 623, 1161, 3407, 3073, 15425, 4329, 19651, 90597}},
+{10255, 17, 38533, {1, 1, 1, 11, 17, 7, 43, 171, 447, 841, 573, 3775, 5517, 3629, 18241, 31907, 51423}},
+{10256, 17, 38534, {1, 1, 3, 7, 15, 53, 111, 203, 171, 963, 1983, 2017, 6067, 12281, 3417, 7431, 33803}},
+{10257, 17, 38552, {1, 3, 1, 1, 31, 49, 125, 65, 7, 579, 1709, 1815, 2643, 11537, 30093, 11813, 65157}},
+{10258, 17, 38561, {1, 3, 7, 15, 1, 3, 61, 21, 163, 809, 1263, 2577, 7811, 12611, 6921, 18529, 25709}},
+{10259, 17, 38576, {1, 1, 3, 5, 17, 43, 13, 81, 29, 905, 1975, 589, 5875, 15683, 29447, 46453, 127911}},
+{10260, 17, 38581, {1, 1, 5, 3, 19, 29, 11, 67, 375, 771, 755, 3939, 1465, 3275, 1119, 24695, 105105}},
+{10261, 17, 38585, {1, 1, 3, 11, 23, 37, 33, 135, 329, 733, 245, 2353, 2547, 7823, 16265, 5975, 37877}},
+{10262, 17, 38594, {1, 3, 7, 13, 15, 9, 47, 181, 239, 723, 1219, 409, 1685, 5493, 14189, 18107, 26231}},
+{10263, 17, 38606, {1, 1, 5, 1, 9, 1, 65, 125, 439, 591, 1499, 3797, 5879, 4231, 18655, 9643, 42265}},
+{10264, 17, 38613, {1, 1, 7, 7, 11, 51, 111, 47, 169, 39, 45, 2211, 6729, 10987, 22367, 27257, 112711}},
+{10265, 17, 38617, {1, 3, 5, 3, 19, 61, 89, 185, 23, 793, 1457, 1743, 3743, 15063, 14053, 50201, 109175}},
+{10266, 17, 38634, {1, 1, 5, 13, 31, 51, 69, 135, 427, 527, 1673, 2393, 5829, 683, 1509, 56617, 105735}},
+{10267, 17, 38644, {1, 1, 1, 15, 31, 51, 3, 105, 125, 593, 1589, 3217, 7449, 525, 30599, 11689, 14781}},
+{10268, 17, 38651, {1, 1, 1, 11, 9, 37, 113, 45, 487, 961, 87, 1461, 3521, 8645, 19771, 43817, 43277}},
+{10269, 17, 38661, {1, 1, 7, 3, 7, 11, 45, 97, 11, 593, 319, 2597, 37, 4157, 6669, 29929, 17213}},
+{10270, 17, 38665, {1, 3, 7, 3, 29, 21, 101, 93, 289, 975, 1937, 3423, 757, 7075, 12575, 26801, 90989}},
+{10271, 17, 38668, {1, 1, 7, 15, 25, 49, 49, 149, 503, 365, 1359, 2155, 7977, 14955, 18439, 44269, 88995}},
+{10272, 17, 38674, {1, 3, 7, 13, 25, 27, 15, 67, 157, 873, 339, 2143, 1405, 12209, 30939, 36109, 107699}},
+{10273, 17, 38689, {1, 3, 5, 5, 21, 33, 121, 95, 61, 159, 1423, 2899, 3811, 263, 9139, 54481, 107375}},
+{10274, 17, 38695, {1, 1, 7, 7, 13, 49, 83, 53, 267, 131, 673, 3945, 5255, 2009, 21017, 41749, 44817}},
+{10275, 17, 38696, {1, 3, 1, 13, 25, 57, 125, 5, 323, 653, 221, 2013, 7225, 8719, 28049, 41953, 14725}},
+{10276, 17, 38707, {1, 3, 7, 7, 5, 13, 35, 161, 221, 951, 769, 717, 267, 2233, 23387, 47411, 95739}},
+{10277, 17, 38710, {1, 3, 7, 11, 23, 47, 37, 67, 501, 159, 763, 4045, 5125, 5667, 9895, 33041, 101171}},
+{10278, 17, 38716, {1, 1, 7, 1, 31, 31, 111, 183, 33, 895, 1819, 3593, 1285, 10145, 3679, 36615, 82863}},
+{10279, 17, 38733, {1, 3, 5, 7, 21, 59, 55, 163, 139, 855, 1903, 3229, 3745, 10289, 28831, 46895, 12647}},
+{10280, 17, 38736, {1, 3, 7, 9, 25, 31, 113, 177, 459, 201, 565, 2089, 725, 9273, 26249, 5987, 49573}},
+{10281, 17, 38742, {1, 1, 7, 15, 3, 37, 49, 145, 121, 803, 1197, 2797, 21, 833, 2277, 28189, 93171}},
+{10282, 17, 38751, {1, 1, 7, 7, 13, 31, 93, 153, 345, 363, 1825, 1481, 3347, 13277, 26119, 63153, 118231}},
+{10283, 17, 38752, {1, 3, 1, 11, 31, 9, 33, 95, 433, 595, 1131, 465, 1797, 15453, 32527, 40789, 37799}},
+{10284, 17, 38775, {1, 1, 5, 11, 31, 29, 83, 33, 243, 633, 1325, 3843, 7717, 851, 29789, 48827, 89209}},
+{10285, 17, 38779, {1, 1, 3, 7, 25, 31, 127, 219, 281, 51, 1843, 3363, 5985, 1697, 3083, 18967, 117421}},
+{10286, 17, 38792, {1, 3, 7, 9, 1, 19, 125, 199, 41, 117, 903, 1131, 7731, 14431, 24753, 62841, 50251}},
+{10287, 17, 38798, {1, 3, 5, 5, 11, 37, 19, 249, 97, 59, 1849, 1151, 2171, 1217, 31277, 26547, 86601}},
+{10288, 17, 38819, {1, 3, 3, 7, 29, 35, 21, 7, 93, 971, 1155, 1847, 89, 6759, 29611, 40793, 88327}},
+{10289, 17, 38822, {1, 3, 5, 5, 29, 23, 91, 71, 479, 943, 1839, 3699, 2491, 9603, 15061, 43221, 20435}},
+{10290, 17, 38839, {1, 3, 3, 7, 29, 11, 15, 83, 21, 585, 501, 161, 4797, 11243, 14879, 12519, 19069}},
+{10291, 17, 38851, {1, 1, 5, 15, 13, 37, 9, 215, 433, 925, 987, 3253, 8027, 7013, 20801, 12891, 36497}},
+{10292, 17, 38854, {1, 3, 7, 1, 15, 31, 95, 85, 355, 1013, 1963, 2943, 1925, 13691, 15237, 28943, 63873}},
+{10293, 17, 38863, {1, 3, 3, 1, 17, 21, 99, 201, 465, 819, 665, 901, 2671, 2457, 29603, 35275, 28339}},
+{10294, 17, 38865, {1, 1, 1, 9, 5, 23, 111, 107, 27, 433, 1341, 91, 6879, 1933, 25433, 37435, 99061}},
+{10295, 17, 38887, {1, 3, 5, 13, 11, 55, 27, 151, 397, 591, 89, 1221, 5581, 2701, 15033, 41879, 71415}},
+{10296, 17, 38896, {1, 3, 3, 5, 17, 35, 15, 119, 487, 903, 875, 3391, 7731, 12181, 27823, 32561, 59133}},
+{10297, 17, 38901, {1, 1, 5, 7, 15, 33, 67, 53, 307, 947, 857, 2713, 803, 765, 4175, 15513, 23985}},
+{10298, 17, 38912, {1, 3, 1, 15, 23, 11, 15, 101, 467, 429, 153, 3205, 5627, 7555, 22515, 12721, 7905}},
+{10299, 17, 38918, {1, 1, 3, 7, 19, 61, 55, 187, 413, 49, 1031, 3415, 3903, 6933, 20017, 50429, 116407}},
+{10300, 17, 38929, {1, 3, 1, 13, 13, 15, 33, 1, 403, 441, 1969, 775, 2209, 15061, 15657, 28819, 62705}},
+{10301, 17, 38941, {1, 1, 5, 13, 13, 47, 67, 97, 87, 677, 1639, 3281, 1395, 8499, 18449, 49935, 25775}},
+{10302, 17, 38948, {1, 3, 3, 13, 7, 13, 77, 45, 405, 881, 293, 2263, 6517, 15415, 25809, 5681, 31327}},
+{10303, 17, 38965, {1, 3, 7, 5, 5, 51, 63, 171, 401, 671, 1631, 1735, 7361, 8741, 31933, 44761, 12209}},
+{10304, 17, 38969, {1, 1, 7, 3, 13, 3, 39, 223, 105, 781, 241, 2895, 5165, 12135, 5683, 63009, 58399}},
+{10305, 17, 38977, {1, 1, 5, 11, 29, 11, 37, 1, 445, 157, 219, 2269, 3025, 5721, 24539, 41879, 128445}},
+{10306, 17, 38987, {1, 3, 7, 15, 23, 21, 125, 105, 141, 101, 1981, 3765, 5349, 13781, 10055, 7069, 77721}},
+{10307, 17, 38992, {1, 1, 7, 9, 3, 37, 111, 95, 33, 53, 1021, 1629, 6945, 4657, 19977, 36715, 101401}},
+{10308, 17, 38995, {1, 3, 3, 1, 9, 5, 65, 77, 459, 471, 1045, 2351, 2787, 13001, 16211, 22585, 116205}},
+{10309, 17, 39001, {1, 1, 7, 9, 25, 41, 21, 187, 471, 997, 583, 2243, 6537, 11837, 21089, 51051, 98517}},
+{10310, 17, 39004, {1, 1, 7, 5, 13, 15, 81, 39, 223, 935, 951, 5, 4315, 11789, 18365, 49647, 92461}},
+{10311, 17, 39011, {1, 3, 3, 5, 11, 15, 97, 245, 43, 819, 1415, 3287, 2051, 15879, 21727, 54467, 53875}},
+{10312, 17, 39018, {1, 3, 1, 11, 7, 47, 125, 155, 301, 469, 805, 3789, 6967, 12117, 30369, 55183, 12671}},
+{10313, 17, 39025, {1, 1, 3, 13, 17, 25, 45, 199, 69, 1015, 581, 3891, 7743, 9273, 7639, 59055, 93923}},
+{10314, 17, 39031, {1, 1, 5, 11, 9, 47, 39, 251, 489, 47, 83, 2147, 943, 1959, 21361, 5325, 106079}},
+{10315, 17, 39032, {1, 3, 5, 13, 27, 59, 35, 1, 155, 367, 165, 2665, 3021, 1127, 28585, 45347, 66763}},
+{10316, 17, 39044, {1, 3, 1, 5, 31, 31, 15, 125, 485, 581, 1987, 2293, 4573, 11431, 20773, 58661, 79869}},
+{10317, 17, 39056, {1, 3, 5, 15, 31, 11, 109, 229, 11, 831, 1545, 919, 6125, 9337, 4169, 58041, 67577}},
+{10318, 17, 39065, {1, 1, 1, 3, 1, 43, 13, 89, 89, 863, 1607, 1897, 4831, 5239, 24503, 51853, 126983}},
+{10319, 17, 39066, {1, 1, 5, 11, 11, 37, 11, 253, 495, 83, 941, 3665, 5187, 13679, 11811, 29563, 80571}},
+{10320, 17, 39084, {1, 3, 7, 15, 3, 45, 45, 157, 477, 321, 1401, 1133, 271, 12455, 31543, 18223, 116701}},
+{10321, 17, 39095, {1, 1, 5, 3, 7, 5, 17, 127, 195, 583, 715, 3975, 6865, 7617, 6749, 15687, 42375}},
+{10322, 17, 39099, {1, 1, 1, 7, 5, 7, 21, 163, 303, 45, 1435, 1345, 2489, 15333, 18459, 60837, 104339}},
+{10323, 17, 39101, {1, 3, 1, 1, 7, 23, 39, 93, 347, 947, 345, 1713, 6383, 15411, 10849, 32559, 126431}},
+{10324, 17, 39102, {1, 3, 1, 5, 19, 41, 119, 213, 3, 991, 1745, 3989, 155, 7761, 28179, 59805, 106759}},
+{10325, 17, 39104, {1, 1, 7, 5, 25, 11, 105, 89, 505, 711, 1213, 2831, 8087, 8855, 31171, 49749, 921}},
+{10326, 17, 39109, {1, 1, 5, 5, 23, 61, 49, 101, 209, 805, 123, 17, 805, 9033, 25753, 33261, 33753}},
+{10327, 17, 39114, {1, 1, 3, 5, 5, 17, 93, 223, 179, 307, 869, 1851, 4313, 477, 12925, 21365, 103999}},
+{10328, 17, 39121, {1, 1, 7, 13, 21, 23, 105, 53, 393, 939, 291, 2407, 4815, 4961, 30305, 8613, 62599}},
+{10329, 17, 39122, {1, 1, 1, 11, 9, 55, 55, 135, 411, 225, 205, 3357, 4553, 10139, 17649, 51209, 94037}},
+{10330, 17, 39127, {1, 3, 5, 15, 17, 17, 119, 15, 121, 581, 169, 2495, 3673, 7173, 13099, 7683, 53397}},
+{10331, 17, 39150, {1, 3, 1, 11, 29, 29, 119, 255, 447, 85, 845, 1015, 2793, 2471, 12639, 32155, 99193}},
+{10332, 17, 39172, {1, 3, 3, 3, 9, 33, 77, 251, 425, 1007, 1003, 2697, 4989, 7799, 26581, 15963, 50443}},
+{10333, 17, 39181, {1, 3, 1, 5, 13, 47, 13, 203, 473, 529, 147, 2061, 343, 4029, 14615, 51355, 27863}},
+{10334, 17, 39184, {1, 1, 3, 15, 19, 63, 39, 25, 241, 487, 461, 3021, 3545, 4537, 8991, 17689, 77131}},
+{10335, 17, 39193, {1, 3, 5, 5, 7, 1, 61, 89, 495, 943, 1061, 405, 449, 12785, 25151, 24497, 65709}},
+{10336, 17, 39199, {1, 1, 5, 3, 7, 43, 51, 55, 193, 615, 37, 1377, 2541, 3861, 29447, 32269, 106335}},
+{10337, 17, 39200, {1, 1, 5, 11, 21, 55, 103, 43, 421, 673, 175, 979, 5175, 1301, 8617, 55875, 111095}},
+{10338, 17, 39206, {1, 3, 5, 13, 29, 31, 33, 241, 129, 473, 201, 2015, 447, 99, 23781, 33517, 107851}},
+{10339, 17, 39209, {1, 3, 5, 3, 13, 27, 125, 205, 287, 957, 1609, 2907, 5481, 14239, 19719, 22459, 75365}},
+{10340, 17, 39235, {1, 3, 3, 5, 27, 23, 53, 39, 329, 381, 745, 517, 7853, 5333, 2773, 29119, 7049}},
+{10341, 17, 39238, {1, 3, 5, 15, 29, 11, 89, 3, 503, 755, 485, 2669, 6737, 16241, 7345, 50991, 107291}},
+{10342, 17, 39242, {1, 1, 7, 3, 17, 45, 11, 3, 157, 715, 577, 1309, 3323, 9401, 10573, 55135, 100067}},
+{10343, 17, 39244, {1, 1, 5, 9, 19, 21, 49, 103, 349, 503, 1447, 675, 4273, 7673, 27507, 57697, 80875}},
+{10344, 17, 39280, {1, 1, 5, 1, 9, 53, 19, 99, 225, 915, 431, 781, 3291, 4383, 26505, 50339, 99799}},
+{10345, 17, 39290, {1, 3, 1, 5, 7, 37, 87, 201, 481, 991, 1553, 1867, 7893, 13147, 18647, 10373, 51951}},
+{10346, 17, 39292, {1, 1, 3, 13, 17, 37, 19, 199, 253, 901, 759, 3545, 3565, 10461, 11867, 57605, 75555}},
+{10347, 17, 39296, {1, 1, 1, 5, 15, 23, 115, 69, 363, 673, 201, 2451, 3197, 10059, 1667, 47145, 89}},
+{10348, 17, 39305, {1, 1, 7, 13, 19, 31, 63, 35, 93, 939, 1057, 3221, 951, 3575, 9659, 7005, 2087}},
+{10349, 17, 39308, {1, 1, 7, 15, 15, 21, 79, 7, 23, 595, 1123, 1909, 6863, 7383, 28067, 30113, 107497}},
+{10350, 17, 39311, {1, 3, 5, 7, 11, 47, 41, 177, 163, 855, 1853, 3837, 6995, 9727, 27285, 62667, 77531}},
+{10351, 17, 39326, {1, 3, 7, 3, 3, 29, 99, 163, 95, 893, 1049, 2001, 2961, 601, 4613, 59745, 61203}},
+{10352, 17, 39329, {1, 3, 5, 1, 27, 5, 5, 47, 119, 631, 1171, 3467, 2115, 8581, 24863, 64193, 52093}},
+{10353, 17, 39330, {1, 1, 1, 5, 9, 51, 49, 251, 97, 177, 311, 993, 1103, 7875, 25273, 51587, 9081}},
+{10354, 17, 39336, {1, 3, 7, 5, 31, 21, 43, 137, 143, 779, 691, 2331, 5073, 5409, 13335, 999, 127765}},
+{10355, 17, 39339, {1, 1, 7, 1, 31, 33, 27, 193, 175, 755, 1559, 659, 5663, 10491, 29209, 50979, 116683}},
+{10356, 17, 39353, {1, 3, 1, 7, 23, 49, 1, 39, 117, 45, 1767, 3503, 4901, 5699, 23613, 44195, 17867}},
+{10357, 17, 39359, {1, 3, 7, 13, 3, 5, 105, 89, 343, 627, 1117, 3419, 2081, 5747, 7919, 44329, 125133}},
+{10358, 17, 39374, {1, 3, 1, 9, 13, 33, 53, 203, 17, 927, 127, 2195, 415, 11301, 15115, 54467, 128777}},
+{10359, 17, 39391, {1, 3, 7, 1, 9, 41, 15, 89, 403, 333, 57, 1159, 1325, 2335, 10609, 20485, 110317}},
+{10360, 17, 39392, {1, 3, 3, 5, 3, 61, 25, 155, 477, 907, 359, 359, 5119, 8157, 29945, 38955, 106485}},
+{10361, 17, 39402, {1, 1, 7, 5, 19, 47, 91, 89, 367, 703, 761, 431, 6813, 2983, 29739, 52453, 125935}},
+{10362, 17, 39409, {1, 1, 1, 7, 7, 61, 127, 239, 277, 649, 1111, 2319, 1737, 5071, 13469, 52119, 48899}},
+{10363, 17, 39410, {1, 3, 5, 15, 7, 17, 21, 209, 265, 895, 719, 263, 6871, 5835, 28483, 49859, 67619}},
+{10364, 17, 39415, {1, 3, 3, 15, 3, 7, 113, 109, 333, 545, 597, 1193, 7593, 3961, 25169, 64673, 47839}},
+{10365, 17, 39419, {1, 1, 1, 3, 15, 45, 55, 41, 317, 719, 1587, 2953, 2441, 1127, 9183, 21637, 69075}},
+{10366, 17, 39431, {1, 3, 1, 9, 25, 57, 59, 29, 89, 833, 379, 1085, 763, 14747, 30797, 24089, 83367}},
+{10367, 17, 39432, {1, 1, 5, 13, 29, 3, 117, 239, 453, 595, 243, 3103, 6047, 631, 22739, 41669, 11683}},
+{10368, 17, 39438, {1, 1, 3, 1, 9, 53, 81, 21, 67, 735, 827, 3519, 7991, 16249, 4183, 61295, 4531}},
+{10369, 17, 39443, {1, 3, 5, 3, 1, 57, 47, 99, 91, 71, 1421, 2949, 5951, 15439, 25239, 26453, 50199}},
+{10370, 17, 39445, {1, 1, 3, 15, 21, 3, 93, 21, 41, 809, 855, 727, 7797, 6957, 15835, 27175, 60617}},
+{10371, 17, 39449, {1, 1, 1, 13, 1, 3, 83, 135, 197, 171, 1459, 2841, 5021, 6961, 30675, 38295, 39555}},
+{10372, 17, 39461, {1, 1, 7, 5, 7, 49, 83, 83, 117, 73, 639, 2717, 651, 3253, 31635, 14427, 116509}},
+{10373, 17, 39462, {1, 3, 1, 3, 23, 63, 15, 23, 433, 539, 903, 2655, 1787, 12901, 12013, 41315, 128217}},
+{10374, 17, 39485, {1, 3, 1, 7, 5, 19, 3, 137, 493, 681, 775, 3725, 4855, 10817, 25277, 3631, 60779}},
+{10375, 17, 39508, {1, 3, 3, 5, 1, 7, 67, 39, 309, 77, 1679, 2853, 3803, 2065, 7461, 1555, 88219}},
+{10376, 17, 39515, {1, 1, 3, 5, 3, 47, 17, 193, 429, 789, 1525, 969, 7905, 6523, 10149, 64689, 40037}},
+{10377, 17, 39522, {1, 3, 5, 7, 21, 17, 65, 61, 255, 517, 1765, 2603, 4929, 11073, 7871, 29313, 84739}},
+{10378, 17, 39533, {1, 1, 5, 7, 13, 55, 111, 63, 499, 9, 1715, 957, 6951, 15839, 13531, 45483, 17923}},
+{10379, 17, 39541, {1, 1, 1, 1, 27, 7, 13, 135, 27, 259, 1735, 3847, 7931, 14777, 15249, 62367, 45773}},
+{10380, 17, 39542, {1, 1, 5, 3, 5, 7, 99, 171, 491, 1007, 195, 2223, 2657, 13557, 6549, 47125, 25117}},
+{10381, 17, 39557, {1, 1, 1, 9, 13, 21, 59, 205, 205, 951, 1707, 3387, 2901, 5463, 13403, 1917, 90591}},
+{10382, 17, 39570, {1, 3, 3, 5, 21, 37, 71, 91, 297, 885, 1415, 355, 2877, 9261, 6485, 45855, 90081}},
+{10383, 17, 39575, {1, 1, 5, 9, 23, 51, 107, 75, 93, 1015, 439, 3589, 3307, 337, 17247, 42285, 85417}},
+{10384, 17, 39576, {1, 1, 7, 15, 29, 33, 51, 23, 269, 35, 1241, 1137, 729, 14531, 14603, 47547, 17151}},
+{10385, 17, 39591, {1, 3, 3, 1, 25, 21, 51, 229, 55, 561, 653, 3289, 7629, 15445, 21115, 35941, 113669}},
+{10386, 17, 39597, {1, 1, 5, 15, 1, 33, 119, 171, 75, 621, 2025, 3235, 1895, 8279, 13205, 61085, 105401}},
+{10387, 17, 39603, {1, 3, 1, 7, 25, 33, 73, 25, 1, 531, 603, 77, 4939, 5957, 28065, 59467, 66659}},
+{10388, 17, 39610, {1, 1, 7, 3, 17, 61, 103, 47, 289, 39, 917, 2515, 6607, 1129, 23361, 46321, 81929}},
+{10389, 17, 39612, {1, 1, 7, 5, 29, 53, 5, 191, 151, 19, 895, 1215, 5401, 9861, 24751, 15481, 34179}},
+{10390, 17, 39617, {1, 3, 7, 9, 5, 3, 29, 205, 173, 547, 727, 947, 5619, 4181, 30621, 5553, 37587}},
+{10391, 17, 39620, {1, 1, 3, 9, 13, 59, 95, 145, 287, 849, 1483, 3375, 3531, 6585, 29565, 4243, 88333}},
+{10392, 17, 39624, {1, 1, 7, 11, 21, 23, 59, 223, 71, 743, 443, 697, 7789, 10371, 28565, 45127, 37967}},
+{10393, 17, 39627, {1, 3, 5, 11, 15, 25, 79, 71, 21, 817, 751, 189, 1769, 3835, 21465, 17991, 102043}},
+{10394, 17, 39635, {1, 1, 7, 11, 3, 19, 25, 5, 261, 181, 49, 261, 7715, 2195, 19771, 43463, 36533}},
+{10395, 17, 39641, {1, 1, 7, 13, 21, 21, 15, 235, 191, 197, 1305, 1351, 4511, 625, 6613, 37053, 59491}},
+{10396, 17, 39666, {1, 1, 1, 13, 15, 13, 93, 239, 251, 1009, 527, 1347, 4173, 14753, 27389, 20397, 13101}},
+{10397, 17, 39668, {1, 1, 3, 1, 15, 11, 127, 141, 277, 775, 1419, 2353, 6929, 2265, 7253, 19807, 74853}},
+{10398, 17, 39686, {1, 3, 3, 15, 15, 49, 9, 183, 407, 377, 675, 871, 347, 3417, 4409, 7805, 40507}},
+{10399, 17, 39692, {1, 3, 5, 3, 23, 11, 81, 53, 343, 681, 1777, 3411, 757, 10875, 3581, 56105, 79907}},
+{10400, 17, 39700, {1, 3, 5, 1, 25, 9, 109, 55, 283, 311, 1607, 2479, 5675, 8819, 10853, 38719, 44471}},
+{10401, 17, 39709, {1, 1, 7, 7, 9, 53, 33, 195, 503, 167, 993, 3203, 3885, 1921, 1039, 25785, 47411}},
+{10402, 17, 39726, {1, 3, 3, 3, 31, 3, 11, 85, 475, 743, 1825, 2649, 2373, 12177, 21481, 35579, 85803}},
+{10403, 17, 39728, {1, 3, 7, 3, 23, 45, 45, 207, 369, 773, 1579, 783, 2491, 7441, 21203, 57091, 107413}},
+{10404, 17, 39737, {1, 1, 1, 5, 19, 7, 97, 213, 431, 533, 637, 1767, 4945, 4693, 977, 64781, 111811}},
+{10405, 17, 39738, {1, 3, 7, 7, 1, 55, 101, 251, 153, 95, 1043, 3219, 3499, 6297, 11571, 9131, 61899}},
+{10406, 17, 39755, {1, 3, 5, 5, 25, 53, 121, 255, 69, 661, 799, 3559, 2029, 11701, 14151, 37897, 18333}},
+{10407, 17, 39757, {1, 1, 1, 9, 21, 19, 97, 21, 321, 957, 1115, 251, 5131, 8465, 24215, 34423, 12747}},
+{10408, 17, 39758, {1, 3, 5, 7, 17, 19, 99, 135, 429, 625, 1401, 1025, 4193, 2911, 7349, 34135, 9341}},
+{10409, 17, 39765, {1, 3, 5, 1, 5, 63, 97, 121, 307, 547, 1967, 641, 487, 4627, 30899, 62049, 94343}},
+{10410, 17, 39766, {1, 3, 5, 13, 1, 1, 109, 23, 267, 843, 271, 2277, 855, 4245, 2177, 33633, 113835}},
+{10411, 17, 39769, {1, 1, 3, 7, 3, 27, 91, 79, 27, 855, 2025, 443, 4797, 9005, 27533, 20497, 100431}},
+{10412, 17, 39779, {1, 3, 3, 5, 23, 7, 73, 35, 395, 649, 881, 2923, 4065, 853, 10829, 19461, 82383}},
+{10413, 17, 39785, {1, 3, 1, 5, 25, 13, 85, 93, 369, 259, 393, 3233, 799, 12409, 26631, 64291, 110133}},
+{10414, 17, 39794, {1, 3, 5, 5, 31, 35, 25, 239, 455, 893, 573, 1449, 3359, 12077, 17149, 12921, 66931}},
+{10415, 17, 39796, {1, 1, 7, 3, 25, 39, 67, 87, 215, 325, 627, 3609, 4417, 10021, 12047, 64593, 116525}},
+{10416, 17, 39809, {1, 1, 5, 5, 23, 51, 125, 247, 83, 419, 655, 635, 7053, 4907, 12887, 18083, 49481}},
+{10417, 17, 39815, {1, 1, 7, 11, 5, 25, 65, 139, 235, 331, 1885, 1851, 1061, 13265, 14371, 23067, 56757}},
+{10418, 17, 39829, {1, 1, 7, 9, 11, 15, 29, 255, 509, 869, 561, 2201, 487, 2989, 14943, 65373, 35789}},
+{10419, 17, 39834, {1, 1, 1, 3, 3, 33, 23, 121, 129, 351, 1481, 65, 321, 15927, 23849, 2813, 98547}},
+{10420, 17, 39839, {1, 1, 1, 3, 23, 55, 121, 35, 339, 87, 1147, 401, 1477, 10617, 15943, 20535, 89321}},
+{10421, 17, 39850, {1, 3, 5, 15, 25, 59, 111, 185, 305, 47, 523, 2801, 5485, 625, 30191, 58153, 9019}},
+{10422, 17, 39857, {1, 1, 7, 13, 15, 51, 105, 55, 77, 419, 1011, 1117, 2705, 15093, 15629, 51429, 58487}},
+{10423, 17, 39881, {1, 3, 7, 5, 15, 27, 19, 7, 401, 295, 1841, 1167, 2133, 1967, 6941, 13571, 29467}},
+{10424, 17, 39905, {1, 1, 5, 15, 25, 43, 23, 253, 173, 927, 1299, 2779, 5489, 16135, 1503, 51097, 105751}},
+{10425, 17, 39912, {1, 3, 3, 5, 9, 13, 5, 13, 411, 639, 1323, 1495, 2539, 15087, 21489, 49653, 76229}},
+{10426, 17, 39938, {1, 1, 1, 11, 7, 51, 47, 99, 247, 541, 1355, 2373, 4121, 13621, 7715, 16763, 127985}},
+{10427, 17, 39940, {1, 1, 3, 9, 7, 1, 85, 45, 269, 769, 581, 2229, 7143, 5203, 22483, 18511, 30997}},
+{10428, 17, 39944, {1, 3, 5, 7, 21, 41, 97, 225, 109, 195, 1197, 3417, 7613, 13225, 29157, 18969, 82045}},
+{10429, 17, 39955, {1, 3, 3, 3, 17, 41, 13, 77, 129, 679, 1659, 1299, 4809, 8537, 19081, 1281, 70793}},
+{10430, 17, 39961, {1, 1, 5, 5, 5, 49, 5, 15, 313, 941, 775, 259, 6579, 7745, 20531, 51669, 35257}},
+{10431, 17, 39977, {1, 1, 5, 5, 17, 35, 13, 235, 169, 699, 1365, 3907, 4231, 10965, 7737, 6735, 4253}},
+{10432, 17, 39980, {1, 1, 5, 3, 29, 3, 1, 197, 133, 935, 571, 3977, 2467, 2029, 12803, 64559, 6427}},
+{10433, 17, 39986, {1, 3, 5, 5, 27, 5, 69, 57, 439, 925, 1695, 827, 4685, 10971, 3011, 56821, 92187}},
+{10434, 17, 39988, {1, 1, 1, 3, 9, 45, 77, 179, 173, 1023, 907, 1999, 3913, 6973, 26987, 30237, 62987}},
+{10435, 17, 39991, {1, 3, 7, 3, 5, 21, 17, 97, 433, 277, 1515, 2923, 8025, 14119, 11243, 3983, 33943}},
+{10436, 17, 39998, {1, 1, 5, 7, 15, 13, 119, 169, 21, 927, 439, 361, 2655, 2237, 19775, 4157, 84245}},
+{10437, 17, 40003, {1, 3, 5, 5, 31, 41, 117, 159, 421, 505, 1617, 3855, 7835, 8105, 29525, 56735, 82335}},
+{10438, 17, 40005, {1, 1, 5, 5, 1, 33, 51, 3, 79, 933, 389, 493, 5969, 12493, 26723, 61159, 116951}},
+{10439, 17, 40023, {1, 3, 7, 13, 17, 23, 75, 13, 355, 111, 675, 3191, 3931, 5651, 17495, 4595, 49869}},
+{10440, 17, 40024, {1, 1, 7, 7, 15, 21, 35, 125, 89, 903, 697, 3493, 4043, 6631, 4793, 45655, 86969}},
+{10441, 17, 40045, {1, 3, 1, 15, 13, 43, 113, 213, 451, 473, 191, 2913, 6391, 1321, 29615, 24791, 26979}},
+{10442, 17, 40046, {1, 3, 3, 13, 17, 25, 9, 163, 163, 161, 1647, 3949, 1343, 12881, 10931, 31365, 70013}},
+{10443, 17, 40058, {1, 3, 7, 3, 3, 19, 1, 121, 387, 543, 1655, 1797, 6727, 2951, 21925, 21595, 73207}},
+{10444, 17, 40088, {1, 1, 5, 9, 7, 19, 91, 9, 83, 893, 1393, 163, 2219, 7763, 32395, 29569, 98645}},
+{10445, 17, 40091, {1, 1, 5, 7, 13, 63, 91, 115, 247, 387, 87, 3239, 7561, 297, 32615, 48817, 41761}},
+{10446, 17, 40098, {1, 3, 5, 3, 21, 23, 27, 141, 257, 377, 1745, 443, 897, 9033, 1715, 9225, 110181}},
+{10447, 17, 40109, {1, 1, 7, 9, 23, 49, 125, 131, 225, 253, 139, 2057, 3273, 4049, 6861, 4463, 11659}},
+{10448, 17, 40112, {1, 1, 5, 11, 5, 41, 97, 213, 133, 481, 2009, 2039, 1533, 10765, 22427, 23297, 80661}},
+{10449, 17, 40124, {1, 1, 5, 15, 9, 11, 77, 129, 421, 219, 1623, 703, 1611, 13377, 9859, 42869, 101943}},
+{10450, 17, 40130, {1, 3, 3, 3, 17, 63, 55, 29, 317, 973, 1159, 11, 1733, 14551, 25911, 39151, 45861}},
+{10451, 17, 40153, {1, 3, 7, 11, 29, 63, 107, 193, 263, 799, 1171, 543, 553, 12591, 21965, 8165, 64347}},
+{10452, 17, 40166, {1, 1, 7, 15, 23, 49, 65, 65, 401, 897, 681, 1113, 6737, 9157, 1557, 55891, 129175}},
+{10453, 17, 40175, {1, 3, 3, 1, 15, 23, 107, 123, 313, 633, 1009, 2615, 1155, 11701, 21945, 7939, 28111}},
+{10454, 17, 40183, {1, 3, 1, 11, 15, 11, 47, 137, 299, 393, 877, 1989, 5903, 6505, 9599, 4129, 23073}},
+{10455, 17, 40184, {1, 1, 7, 15, 9, 49, 67, 15, 79, 125, 505, 17, 8071, 12957, 13855, 23611, 66465}},
+{10456, 17, 40207, {1, 1, 5, 13, 31, 49, 1, 161, 121, 145, 711, 1347, 5297, 11309, 9871, 43075, 95541}},
+{10457, 17, 40215, {1, 3, 3, 13, 19, 7, 55, 199, 469, 471, 1269, 3779, 6251, 3513, 1775, 19501, 94055}},
+{10458, 17, 40225, {1, 3, 3, 13, 9, 41, 109, 211, 197, 227, 1211, 3327, 1247, 12253, 4493, 31507, 38677}},
+{10459, 17, 40235, {1, 1, 7, 3, 11, 45, 11, 103, 325, 849, 1817, 3971, 1059, 9047, 27237, 32211, 121165}},
+{10460, 17, 40240, {1, 3, 3, 3, 13, 43, 7, 35, 293, 3, 679, 1441, 5189, 7585, 32009, 6151, 89803}},
+{10461, 17, 40255, {1, 1, 7, 9, 29, 41, 127, 255, 363, 913, 2027, 3891, 5187, 10233, 8871, 48085, 125609}},
+{10462, 17, 40263, {1, 3, 1, 5, 21, 23, 59, 145, 171, 775, 535, 3803, 6981, 15901, 20255, 63199, 92905}},
+{10463, 17, 40270, {1, 3, 5, 9, 7, 63, 53, 7, 145, 547, 1753, 3351, 1273, 8175, 24103, 42133, 87459}},
+{10464, 17, 40277, {1, 3, 7, 7, 25, 33, 5, 217, 469, 473, 1573, 2525, 7345, 5261, 7023, 50893, 124129}},
+{10465, 17, 40282, {1, 3, 5, 13, 5, 51, 23, 61, 429, 775, 519, 2671, 1979, 9005, 21617, 33611, 120487}},
+{10466, 17, 40297, {1, 3, 3, 15, 23, 1, 73, 187, 47, 369, 943, 99, 2529, 5569, 13649, 51481, 128949}},
+{10467, 17, 40306, {1, 3, 1, 5, 25, 55, 35, 191, 327, 845, 1353, 261, 6297, 6067, 22241, 32381, 17749}},
+{10468, 17, 40315, {1, 1, 5, 15, 31, 5, 29, 129, 15, 47, 739, 755, 7595, 14743, 14705, 34347, 11805}},
+{10469, 17, 40333, {1, 3, 1, 3, 15, 49, 119, 47, 185, 63, 2003, 2847, 5393, 855, 7699, 29521, 67011}},
+{10470, 17, 40334, {1, 3, 7, 15, 11, 41, 37, 149, 173, 1015, 29, 1805, 1269, 16199, 32337, 11023, 60065}},
+{10471, 17, 40336, {1, 1, 1, 7, 31, 19, 65, 81, 255, 875, 1379, 2347, 1873, 14427, 29523, 38413, 65583}},
+{10472, 17, 40342, {1, 1, 1, 15, 13, 59, 3, 219, 127, 479, 1029, 3385, 563, 11825, 10081, 17423, 26431}},
+{10473, 17, 40345, {1, 1, 1, 1, 25, 27, 79, 87, 489, 281, 457, 3527, 5117, 4705, 21167, 46211, 90383}},
+{10474, 17, 40348, {1, 3, 7, 13, 7, 5, 67, 111, 53, 439, 1483, 3639, 7781, 9471, 10957, 60711, 64957}},
+{10475, 17, 40355, {1, 3, 7, 9, 7, 7, 41, 137, 159, 245, 551, 4007, 1277, 4743, 4863, 48689, 123289}},
+{10476, 17, 40372, {1, 3, 7, 9, 15, 49, 55, 77, 41, 475, 1563, 3569, 5993, 301, 14831, 44095, 22641}},
+{10477, 17, 40381, {1, 1, 1, 1, 15, 33, 39, 135, 81, 533, 869, 305, 1125, 6399, 14321, 37217, 121081}},
+{10478, 17, 40390, {1, 1, 7, 15, 21, 59, 43, 7, 225, 1, 115, 1531, 2931, 2593, 15935, 61973, 106899}},
+{10479, 17, 40407, {1, 1, 1, 1, 13, 13, 99, 191, 437, 367, 641, 1933, 5807, 11677, 13557, 46475, 34875}},
+{10480, 17, 40435, {1, 3, 7, 9, 21, 7, 119, 209, 31, 919, 901, 1229, 5823, 11439, 18151, 18991, 114743}},
+{10481, 17, 40437, {1, 3, 3, 3, 19, 37, 109, 53, 411, 617, 1841, 2769, 1271, 5719, 22359, 1199, 72405}},
+{10482, 17, 40441, {1, 1, 1, 5, 29, 3, 51, 59, 141, 897, 1907, 3799, 1463, 5661, 181, 50565, 95085}},
+{10483, 17, 40444, {1, 1, 1, 7, 1, 35, 77, 225, 341, 587, 137, 35, 2177, 15177, 12869, 35013, 39471}},
+{10484, 17, 40458, {1, 1, 3, 13, 15, 63, 45, 33, 337, 1, 1133, 263, 4985, 11591, 1085, 31197, 67897}},
+{10485, 17, 40460, {1, 1, 5, 13, 23, 11, 123, 21, 185, 639, 145, 3865, 2999, 6261, 23247, 23055, 32755}},
+{10486, 17, 40481, {1, 1, 5, 9, 19, 21, 47, 133, 281, 431, 1661, 3719, 3637, 973, 9727, 52627, 60035}},
+{10487, 17, 40484, {1, 1, 3, 5, 3, 19, 19, 89, 63, 549, 551, 3357, 5665, 4781, 22437, 1149, 10825}},
+{10488, 17, 40487, {1, 3, 5, 15, 3, 25, 81, 193, 11, 711, 1481, 1767, 1159, 4967, 16915, 3387, 26245}},
+{10489, 17, 40493, {1, 1, 1, 3, 29, 39, 23, 131, 473, 107, 765, 2249, 6087, 9145, 20751, 21085, 42989}},
+{10490, 17, 40494, {1, 3, 1, 9, 7, 39, 13, 199, 475, 333, 269, 1041, 5927, 14039, 19081, 9045, 119645}},
+{10491, 17, 40501, {1, 1, 5, 13, 11, 61, 99, 71, 151, 175, 1327, 3397, 5063, 10683, 7895, 62255, 85749}},
+{10492, 17, 40502, {1, 3, 7, 9, 1, 57, 21, 217, 423, 467, 1435, 2887, 1567, 8819, 19961, 36507, 110309}},
+{10493, 17, 40525, {1, 3, 3, 11, 11, 35, 77, 127, 153, 357, 865, 1943, 1947, 10995, 13617, 44347, 26851}},
+{10494, 17, 40550, {1, 3, 1, 11, 9, 43, 31, 81, 123, 813, 995, 169, 6593, 13621, 32195, 51125, 53509}},
+{10495, 17, 40553, {1, 1, 5, 5, 27, 29, 77, 35, 93, 545, 377, 2345, 6475, 15729, 15103, 49591, 101121}},
+{10496, 17, 40559, {1, 1, 5, 13, 1, 17, 97, 187, 129, 173, 641, 2937, 3277, 15087, 28111, 46905, 112367}},
+{10497, 17, 40562, {1, 3, 7, 7, 1, 27, 75, 43, 305, 431, 571, 1327, 7419, 3093, 2691, 23417, 11975}},
+{10498, 17, 40573, {1, 1, 5, 15, 17, 3, 91, 57, 417, 87, 1891, 1973, 5765, 5521, 21931, 60011, 20883}},
+{10499, 17, 40574, {1, 3, 1, 3, 27, 13, 105, 153, 495, 371, 453, 1295, 5675, 6377, 8971, 40505, 41149}},
+{10500, 17, 40578, {1, 1, 1, 15, 1, 17, 105, 177, 41, 455, 611, 3585, 2307, 2603, 20985, 5581, 14033}},
+{10501, 17, 40583, {1, 3, 3, 9, 7, 41, 33, 145, 307, 293, 1321, 2151, 3265, 14845, 15687, 38715, 8041}},
+{10502, 17, 40584, {1, 3, 3, 3, 5, 47, 127, 253, 129, 337, 1467, 5, 2743, 1921, 26979, 11737, 41479}},
+{10503, 17, 40587, {1, 1, 1, 5, 15, 35, 37, 9, 5, 405, 1041, 1903, 3655, 14315, 9441, 20577, 50715}},
+{10504, 17, 40597, {1, 1, 5, 15, 7, 5, 53, 61, 409, 353, 87, 1805, 4523, 11417, 24105, 21451, 56387}},
+{10505, 17, 40620, {1, 3, 3, 5, 5, 9, 25, 249, 511, 795, 559, 2695, 3071, 3971, 29421, 46593, 96563}},
+{10506, 17, 40623, {1, 1, 3, 1, 3, 39, 61, 85, 399, 105, 1253, 3787, 3065, 10553, 8195, 5637, 129579}},
+{10507, 17, 40631, {1, 3, 3, 7, 23, 23, 23, 197, 263, 687, 943, 1977, 5767, 15373, 17995, 24509, 81293}},
+{10508, 17, 40643, {1, 3, 1, 11, 15, 37, 15, 67, 207, 985, 895, 509, 3435, 11563, 2055, 19253, 42649}},
+{10509, 17, 40660, {1, 1, 7, 3, 1, 51, 59, 133, 241, 569, 1575, 3633, 2243, 11939, 5501, 11249, 86013}},
+{10510, 17, 40667, {1, 1, 7, 13, 25, 59, 97, 191, 385, 179, 1195, 1537, 1837, 11953, 14231, 37025, 49803}},
+{10511, 17, 40676, {1, 3, 5, 5, 13, 49, 19, 171, 503, 433, 1633, 553, 2759, 4379, 18313, 62437, 37453}},
+{10512, 17, 40693, {1, 3, 3, 15, 29, 49, 107, 239, 21, 913, 1095, 989, 4749, 10657, 27169, 15913, 1573}},
+{10513, 17, 40697, {1, 1, 1, 1, 3, 3, 53, 241, 287, 149, 557, 2665, 2027, 449, 29231, 23025, 102521}},
+{10514, 17, 40708, {1, 3, 5, 7, 23, 21, 9, 1, 11, 837, 1337, 2815, 7883, 16053, 10031, 43405, 5037}},
+{10515, 17, 40718, {1, 3, 7, 1, 23, 53, 113, 125, 337, 491, 1125, 3083, 4941, 951, 15805, 1571, 79779}},
+{10516, 17, 40726, {1, 3, 7, 13, 1, 3, 95, 105, 431, 723, 1771, 3773, 177, 2045, 24719, 57727, 79005}},
+{10517, 17, 40735, {1, 3, 1, 1, 7, 17, 107, 171, 213, 437, 409, 2015, 7543, 12693, 23597, 44477, 72543}},
+{10518, 17, 40739, {1, 3, 5, 9, 7, 21, 27, 167, 473, 901, 1245, 3737, 3485, 14593, 7619, 18753, 14209}},
+{10519, 17, 40748, {1, 1, 1, 3, 25, 37, 51, 21, 363, 73, 711, 3749, 5147, 8495, 30151, 14275, 128217}},
+{10520, 17, 40760, {1, 3, 1, 13, 17, 35, 69, 15, 293, 331, 301, 691, 7315, 6495, 315, 62909, 105047}},
+{10521, 17, 40763, {1, 3, 5, 3, 25, 23, 105, 111, 213, 887, 1701, 2085, 5931, 9217, 4009, 2321, 103631}},
+{10522, 17, 40773, {1, 1, 7, 15, 17, 57, 59, 249, 267, 941, 777, 2509, 6587, 12033, 24969, 31563, 129049}},
+{10523, 17, 40774, {1, 1, 1, 5, 31, 23, 31, 217, 509, 973, 659, 673, 7759, 3865, 21221, 4319, 117411}},
+{10524, 17, 40786, {1, 1, 3, 7, 13, 13, 103, 179, 107, 233, 753, 3121, 835, 13595, 9271, 31421, 45275}},
+{10525, 17, 40791, {1, 3, 5, 13, 23, 61, 125, 189, 283, 83, 1087, 755, 3697, 14845, 27901, 16389, 82993}},
+{10526, 17, 40798, {1, 3, 1, 3, 1, 55, 25, 139, 435, 681, 1913, 975, 3109, 6699, 12943, 50865, 71811}},
+{10527, 17, 40801, {1, 3, 1, 5, 15, 61, 17, 219, 29, 805, 1881, 3761, 3535, 473, 15629, 26301, 51085}},
+{10528, 17, 40808, {1, 3, 1, 1, 7, 43, 87, 93, 355, 247, 641, 2851, 4565, 9293, 6025, 1945, 112549}},
+{10529, 17, 40811, {1, 3, 7, 5, 19, 55, 69, 227, 107, 443, 1587, 2457, 2873, 953, 27529, 57527, 54145}},
+{10530, 17, 40813, {1, 1, 5, 9, 1, 33, 31, 241, 339, 791, 399, 3435, 1711, 10815, 32657, 59875, 31291}},
+{10531, 17, 40825, {1, 1, 1, 7, 25, 59, 87, 115, 435, 47, 1907, 193, 6069, 10933, 9877, 46443, 3451}},
+{10532, 17, 40831, {1, 3, 3, 15, 25, 33, 19, 121, 133, 253, 1227, 75, 2839, 3341, 30727, 52451, 44883}},
+{10533, 17, 40835, {1, 1, 7, 11, 5, 47, 97, 255, 235, 565, 1701, 529, 839, 15473, 24471, 5749, 73135}},
+{10534, 17, 40856, {1, 1, 3, 7, 21, 15, 31, 81, 389, 957, 603, 3879, 2875, 11987, 24625, 53667, 77775}},
+{10535, 17, 40861, {1, 1, 5, 11, 29, 29, 31, 233, 107, 541, 561, 2533, 1421, 13587, 6943, 45635, 71315}},
+{10536, 17, 40880, {1, 3, 1, 9, 25, 19, 33, 53, 509, 485, 1637, 2877, 5927, 16059, 195, 17279, 127025}},
+{10537, 17, 40889, {1, 1, 1, 3, 9, 23, 97, 101, 337, 43, 1979, 1139, 3693, 2601, 8225, 53037, 63709}},
+{10538, 17, 40912, {1, 1, 7, 7, 17, 25, 121, 253, 63, 105, 527, 1397, 121, 9665, 29151, 10795, 79077}},
+{10539, 17, 40918, {1, 3, 3, 1, 27, 33, 123, 69, 209, 25, 1677, 1569, 4441, 7817, 5165, 29517, 117165}},
+{10540, 17, 40924, {1, 1, 5, 15, 3, 59, 13, 25, 359, 71, 179, 3925, 6899, 6007, 9121, 36297, 88541}},
+{10541, 17, 40927, {1, 1, 3, 11, 23, 17, 55, 133, 27, 277, 1055, 1057, 807, 1221, 1665, 64129, 102395}},
+{10542, 17, 40928, {1, 3, 1, 15, 13, 15, 105, 141, 329, 73, 609, 1663, 3277, 1767, 6371, 34325, 109563}},
+{10543, 17, 40938, {1, 1, 5, 1, 17, 21, 37, 81, 187, 403, 291, 1495, 5071, 14289, 29075, 44089, 95001}},
+{10544, 17, 40952, {1, 3, 3, 3, 15, 33, 49, 155, 41, 853, 15, 3571, 1433, 8469, 18711, 59007, 98703}},
+{10545, 17, 40957, {1, 3, 1, 13, 17, 47, 61, 151, 127, 87, 207, 3157, 5141, 14745, 32567, 18401, 7497}},
+{10546, 17, 40961, {1, 3, 5, 1, 19, 25, 49, 147, 137, 603, 1223, 3195, 5965, 11335, 20343, 10109, 63975}},
+{10547, 17, 40968, {1, 1, 7, 13, 29, 59, 1, 33, 157, 765, 961, 641, 7303, 3279, 20287, 37553, 114573}},
+{10548, 17, 40974, {1, 3, 5, 1, 11, 63, 63, 41, 15, 717, 1037, 227, 7875, 8681, 26943, 11761, 28005}},
+{10549, 17, 40986, {1, 3, 1, 3, 19, 5, 67, 169, 209, 293, 343, 2033, 7669, 1077, 15513, 54475, 15459}},
+{10550, 17, 40992, {1, 1, 3, 3, 17, 47, 49, 187, 341, 767, 1463, 301, 2083, 9265, 12313, 14763, 126627}},
+{10551, 17, 41001, {1, 3, 5, 13, 11, 15, 45, 237, 445, 55, 319, 2989, 5043, 1053, 22809, 23111, 7617}},
+{10552, 17, 41004, {1, 1, 7, 9, 7, 15, 41, 185, 511, 701, 1279, 1995, 7829, 2947, 3431, 45799, 1709}},
+{10553, 17, 41022, {1, 3, 7, 15, 5, 15, 85, 29, 487, 811, 1653, 483, 1193, 11331, 21815, 57215, 8373}},
+{10554, 17, 41033, {1, 3, 1, 15, 27, 19, 111, 161, 19, 373, 419, 1547, 2415, 10705, 17283, 56663, 73625}},
+{10555, 17, 41036, {1, 1, 3, 11, 27, 7, 75, 57, 411, 35, 685, 1249, 5227, 7313, 3167, 30537, 40655}},
+{10556, 17, 41039, {1, 3, 1, 9, 7, 37, 9, 209, 353, 319, 843, 657, 2069, 6523, 611, 16291, 107121}},
+{10557, 17, 41044, {1, 1, 5, 11, 11, 51, 25, 171, 315, 63, 207, 2279, 2379, 3583, 31927, 62451, 109911}},
+{10558, 17, 41064, {1, 1, 7, 11, 15, 41, 19, 175, 103, 605, 1889, 3161, 1217, 3259, 29655, 11715, 35551}},
+{10559, 17, 41078, {1, 3, 5, 13, 23, 11, 121, 147, 179, 397, 659, 3753, 2355, 1093, 25863, 39751, 112381}},
+{10560, 17, 41091, {1, 3, 5, 7, 1, 23, 37, 117, 7, 361, 991, 661, 4427, 15333, 5307, 55171, 96959}},
+{10561, 17, 41103, {1, 3, 1, 5, 17, 9, 77, 147, 289, 79, 295, 1271, 7809, 6387, 31785, 26489, 9335}},
+{10562, 17, 41108, {1, 1, 1, 7, 17, 33, 63, 147, 17, 515, 1349, 1907, 7703, 5511, 27773, 54025, 30019}},
+{10563, 17, 41112, {1, 3, 5, 3, 27, 57, 75, 129, 219, 533, 207, 3569, 5799, 6943, 12271, 53115, 120389}},
+{10564, 17, 41127, {1, 1, 1, 13, 11, 25, 101, 251, 289, 215, 1875, 1821, 703, 15395, 27167, 43187, 63401}},
+{10565, 17, 41128, {1, 1, 7, 15, 7, 39, 125, 41, 57, 513, 17, 965, 3225, 12833, 21131, 53243, 60377}},
+{10566, 17, 41136, {1, 3, 5, 3, 21, 19, 43, 195, 259, 523, 587, 3393, 6621, 43, 10951, 51877, 79967}},
+{10567, 17, 41141, {1, 3, 3, 7, 7, 19, 11, 89, 321, 821, 99, 2201, 1297, 949, 11539, 6295, 19721}},
+{10568, 17, 41146, {1, 1, 5, 3, 29, 27, 123, 111, 441, 441, 337, 3849, 1677, 14403, 17203, 50661, 92177}},
+{10569, 17, 41156, {1, 3, 5, 9, 23, 23, 73, 153, 241, 841, 371, 1503, 5815, 14117, 4679, 17997, 112269}},
+{10570, 17, 41159, {1, 1, 1, 1, 7, 37, 105, 185, 453, 905, 15, 57, 6963, 9665, 3371, 2391, 96023}},
+{10571, 17, 41163, {1, 3, 7, 1, 1, 21, 35, 43, 449, 111, 191, 2163, 3249, 15049, 30215, 43569, 127973}},
+{10572, 17, 41165, {1, 3, 3, 3, 17, 13, 77, 123, 471, 929, 1797, 2061, 355, 4441, 1101, 24631, 128711}},
+{10573, 17, 41166, {1, 3, 7, 7, 17, 51, 1, 69, 23, 1003, 535, 3751, 765, 5253, 21027, 52901, 61951}},
+{10574, 17, 41184, {1, 1, 7, 9, 25, 13, 33, 13, 423, 787, 223, 729, 4443, 227, 11487, 14259, 52951}},
+{10575, 17, 41193, {1, 3, 5, 5, 25, 27, 113, 93, 13, 679, 1295, 3773, 7253, 14629, 8907, 45885, 85387}},
+{10576, 17, 41202, {1, 3, 3, 13, 15, 55, 99, 31, 119, 955, 1477, 3745, 6777, 973, 4723, 62133, 65093}},
+{10577, 17, 41211, {1, 3, 3, 9, 13, 51, 105, 37, 477, 579, 765, 2573, 6869, 3891, 30969, 63413, 56603}},
+{10578, 17, 41216, {1, 3, 1, 3, 15, 23, 67, 109, 75, 721, 523, 1433, 3455, 6377, 23795, 13711, 121349}},
+{10579, 17, 41239, {1, 1, 3, 11, 5, 5, 99, 117, 233, 621, 509, 3235, 7483, 12325, 13203, 20075, 27537}},
+{10580, 17, 41243, {1, 3, 3, 9, 23, 51, 93, 245, 307, 689, 1993, 3607, 1985, 11839, 25553, 54941, 68741}},
+{10581, 17, 41249, {1, 1, 3, 5, 19, 21, 33, 71, 447, 539, 351, 2549, 87, 4317, 1287, 62289, 121065}},
+{10582, 17, 41262, {1, 3, 5, 5, 9, 23, 37, 189, 449, 263, 37, 3127, 1709, 10793, 7379, 38565, 8267}},
+{10583, 17, 41267, {1, 1, 7, 7, 7, 33, 23, 79, 457, 947, 1275, 2755, 3747, 9225, 31385, 8785, 76945}},
+{10584, 17, 41276, {1, 3, 1, 9, 17, 33, 29, 59, 505, 649, 1679, 3609, 1361, 5987, 26455, 17295, 98697}},
+{10585, 17, 41279, {1, 1, 3, 11, 7, 47, 127, 79, 419, 143, 349, 985, 6397, 10271, 29427, 19661, 32629}},
+{10586, 17, 41305, {1, 1, 5, 13, 15, 5, 79, 171, 491, 223, 1601, 705, 623, 4405, 10065, 28057, 105737}},
+{10587, 17, 41306, {1, 1, 7, 3, 29, 7, 81, 69, 265, 669, 1763, 2109, 6275, 7683, 19561, 26737, 54449}},
+{10588, 17, 41312, {1, 1, 1, 7, 1, 1, 5, 9, 65, 487, 1663, 1021, 1819, 9971, 22065, 40407, 4187}},
+{10589, 17, 41317, {1, 3, 5, 5, 21, 33, 11, 213, 309, 575, 427, 1421, 6435, 981, 31533, 16751, 47813}},
+{10590, 17, 41321, {1, 3, 3, 13, 7, 59, 65, 65, 401, 195, 211, 421, 1139, 11729, 19717, 20699, 111863}},
+{10591, 17, 41332, {1, 3, 7, 5, 17, 51, 25, 217, 223, 935, 431, 1703, 4869, 5635, 199, 5485, 37311}},
+{10592, 17, 41335, {1, 1, 3, 11, 23, 25, 15, 37, 187, 1007, 857, 3327, 5471, 10089, 13745, 1741, 37769}},
+{10593, 17, 41345, {1, 3, 5, 15, 31, 17, 75, 125, 1, 449, 1293, 3427, 709, 8285, 31143, 50655, 130793}},
+{10594, 17, 41346, {1, 1, 7, 3, 25, 55, 105, 255, 319, 183, 1571, 2425, 5429, 7151, 8569, 37447, 23055}},
+{10595, 17, 41351, {1, 3, 1, 1, 23, 37, 17, 61, 161, 559, 1025, 2651, 5861, 5231, 1365, 4853, 127301}},
+{10596, 17, 41365, {1, 3, 1, 9, 17, 37, 87, 241, 411, 53, 1555, 3805, 6867, 125, 9829, 53581, 117413}},
+{10597, 17, 41388, {1, 3, 3, 3, 23, 55, 121, 109, 441, 623, 1345, 3055, 2591, 11329, 16891, 61347, 125643}},
+{10598, 17, 41399, {1, 3, 1, 1, 5, 29, 53, 97, 15, 275, 1587, 1245, 379, 16117, 24369, 26873, 39547}},
+{10599, 17, 41405, {1, 3, 1, 5, 3, 63, 85, 167, 301, 45, 1357, 1185, 3939, 945, 24961, 59427, 128129}},
+{10600, 17, 41414, {1, 3, 1, 7, 23, 25, 109, 253, 37, 151, 17, 1241, 787, 15895, 7947, 65071, 14765}},
+{10601, 17, 41432, {1, 3, 3, 1, 7, 3, 103, 35, 73, 533, 1055, 823, 7403, 8117, 28813, 42457, 56037}},
+{10602, 17, 41454, {1, 3, 5, 15, 1, 15, 97, 109, 293, 259, 935, 2977, 5257, 14563, 28871, 17647, 34185}},
+{10603, 17, 41461, {1, 1, 1, 3, 29, 21, 101, 163, 173, 1019, 1025, 553, 945, 3781, 1097, 58025, 124819}},
+{10604, 17, 41462, {1, 1, 3, 9, 7, 35, 65, 61, 31, 547, 75, 3515, 6719, 12809, 23287, 14609, 30341}},
+{10605, 17, 41471, {1, 3, 7, 9, 3, 53, 21, 207, 383, 917, 1383, 2873, 1663, 15665, 1787, 50741, 35145}},
+{10606, 17, 41478, {1, 3, 7, 5, 3, 35, 113, 191, 171, 635, 1597, 2943, 2421, 5555, 6457, 22087, 104221}},
+{10607, 17, 41490, {1, 1, 1, 1, 29, 25, 3, 225, 175, 807, 1325, 215, 6475, 10729, 18619, 45401, 20627}},
+{10608, 17, 41506, {1, 1, 5, 11, 23, 25, 39, 207, 81, 633, 403, 3369, 1295, 1289, 20853, 48899, 16613}},
+{10609, 17, 41508, {1, 1, 7, 15, 5, 23, 17, 77, 169, 969, 1459, 3795, 3121, 5501, 32323, 46743, 124175}},
+{10610, 17, 41512, {1, 1, 7, 13, 3, 25, 77, 153, 105, 1017, 1599, 237, 4691, 1993, 6707, 50265, 13529}},
+{10611, 17, 41517, {1, 3, 3, 15, 7, 11, 81, 223, 61, 589, 1263, 3999, 7643, 12101, 19853, 49279, 29999}},
+{10612, 17, 41520, {1, 3, 1, 13, 3, 31, 61, 59, 41, 313, 115, 561, 3973, 13513, 6359, 29395, 34565}},
+{10613, 17, 41529, {1, 1, 7, 7, 7, 61, 91, 181, 307, 875, 2045, 1367, 3743, 6497, 2443, 12153, 96431}},
+{10614, 17, 41530, {1, 1, 3, 7, 19, 63, 97, 211, 157, 945, 891, 3747, 5483, 3081, 28939, 11179, 15935}},
+{10615, 17, 41544, {1, 3, 7, 3, 23, 39, 51, 137, 91, 179, 1515, 1397, 2783, 9343, 11483, 52407, 111725}},
+{10616, 17, 41550, {1, 3, 3, 11, 11, 25, 111, 61, 115, 329, 485, 1713, 565, 8607, 18869, 6595, 18605}},
+{10617, 17, 41571, {1, 1, 5, 1, 13, 59, 67, 231, 443, 695, 1185, 393, 6393, 12957, 15817, 37219, 113127}},
+{10618, 17, 41577, {1, 3, 5, 3, 15, 57, 25, 97, 321, 627, 15, 2005, 3813, 10399, 26779, 24243, 66463}},
+{10619, 17, 41580, {1, 3, 7, 7, 17, 43, 117, 179, 447, 1005, 2007, 1753, 7685, 13331, 5187, 49341, 111927}},
+{10620, 17, 41595, {1, 1, 3, 3, 5, 53, 35, 185, 93, 847, 1523, 3039, 25, 3351, 23195, 41133, 38547}},
+{10621, 17, 41613, {1, 1, 7, 5, 27, 59, 95, 137, 55, 129, 331, 127, 7421, 5633, 557, 18137, 89055}},
+{10622, 17, 41622, {1, 3, 3, 11, 5, 53, 93, 137, 175, 191, 1645, 2047, 2569, 8177, 22691, 4037, 31823}},
+{10623, 17, 41635, {1, 3, 3, 11, 11, 45, 77, 7, 21, 541, 49, 1689, 171, 829, 28917, 45095, 1807}},
+{10624, 17, 41642, {1, 3, 7, 5, 21, 5, 113, 81, 33, 681, 361, 1107, 1597, 115, 11503, 27413, 9199}},
+{10625, 17, 41661, {1, 1, 3, 11, 29, 57, 15, 249, 105, 683, 833, 2579, 3517, 16153, 17373, 32587, 124333}},
+{10626, 17, 41676, {1, 3, 7, 13, 3, 35, 55, 23, 293, 5, 2003, 2741, 4237, 8117, 20569, 63967, 106041}},
+{10627, 17, 41681, {1, 3, 3, 1, 1, 15, 57, 119, 135, 967, 1495, 801, 4959, 5037, 10051, 53915, 116891}},
+{10628, 17, 41684, {1, 1, 7, 9, 15, 29, 53, 139, 505, 473, 1179, 3289, 369, 13147, 15739, 16739, 54949}},
+{10629, 17, 41687, {1, 1, 5, 7, 7, 45, 17, 213, 381, 63, 437, 3099, 3765, 175, 13521, 11689, 58675}},
+{10630, 17, 41688, {1, 1, 7, 1, 15, 35, 55, 43, 147, 873, 1193, 3801, 2301, 14569, 31789, 50443, 62577}},
+{10631, 17, 41694, {1, 1, 5, 7, 21, 41, 3, 45, 43, 303, 1465, 1461, 5295, 13397, 30439, 7103, 87505}},
+{10632, 17, 41698, {1, 1, 1, 15, 19, 27, 81, 141, 307, 259, 521, 1785, 6917, 15635, 27781, 64809, 53297}},
+{10633, 17, 41710, {1, 1, 1, 7, 27, 15, 53, 99, 377, 935, 1869, 3835, 741, 8447, 18947, 10727, 72179}},
+{10634, 17, 41712, {1, 1, 3, 5, 15, 51, 91, 207, 7, 997, 935, 591, 7325, 3025, 11335, 32087, 109535}},
+{10635, 17, 41721, {1, 3, 1, 5, 11, 13, 1, 57, 45, 307, 1839, 1735, 2247, 13117, 17471, 16599, 103063}},
+{10636, 17, 41722, {1, 3, 5, 11, 19, 7, 121, 3, 325, 731, 1945, 4025, 7649, 8939, 11147, 59065, 49971}},
+{10637, 17, 41729, {1, 3, 1, 5, 29, 63, 95, 121, 467, 7, 1857, 2389, 5213, 3931, 21187, 43529, 6767}},
+{10638, 17, 41744, {1, 1, 7, 7, 9, 53, 31, 227, 95, 827, 927, 3501, 2003, 12853, 2595, 33223, 125799}},
+{10639, 17, 41747, {1, 3, 3, 3, 27, 25, 105, 143, 233, 887, 1135, 3449, 5767, 11447, 10251, 34621, 102113}},
+{10640, 17, 41753, {1, 3, 3, 15, 3, 63, 85, 119, 103, 835, 443, 3861, 4957, 5389, 6137, 48851, 51887}},
+{10641, 17, 41766, {1, 3, 7, 9, 23, 23, 45, 129, 463, 653, 1309, 3533, 1303, 2955, 18023, 37457, 114765}},
+{10642, 17, 41783, {1, 3, 7, 1, 23, 17, 31, 151, 71, 515, 781, 1793, 3507, 6051, 30279, 29461, 48271}},
+{10643, 17, 41790, {1, 3, 5, 15, 1, 31, 9, 187, 131, 571, 1309, 965, 7561, 16113, 23209, 54615, 16969}},
+{10644, 17, 41810, {1, 3, 5, 11, 11, 9, 109, 161, 9, 697, 1683, 1245, 2223, 3571, 18117, 13085, 99315}},
+{10645, 17, 41819, {1, 3, 3, 1, 13, 21, 27, 17, 11, 11, 1095, 1447, 6941, 3399, 21245, 36661, 54283}},
+{10646, 17, 41825, {1, 3, 1, 3, 21, 51, 21, 197, 161, 689, 1219, 1337, 6623, 5765, 11579, 2679, 23889}},
+{10647, 17, 41828, {1, 1, 5, 11, 7, 31, 101, 25, 231, 719, 1677, 1545, 459, 14735, 25153, 65079, 15141}},
+{10648, 17, 41843, {1, 1, 7, 9, 17, 7, 49, 1, 83, 829, 815, 307, 3405, 15189, 23699, 50889, 70391}},
+{10649, 17, 41846, {1, 1, 3, 15, 21, 57, 97, 191, 415, 899, 197, 2635, 7507, 14009, 8633, 48997, 93925}},
+{10650, 17, 41862, {1, 3, 5, 15, 23, 13, 67, 127, 33, 551, 911, 3933, 2027, 10665, 19509, 18485, 76111}},
+{10651, 17, 41871, {1, 1, 5, 7, 23, 63, 19, 149, 139, 155, 1621, 3391, 2337, 2809, 21161, 38565, 401}},
+{10652, 17, 41874, {1, 1, 1, 7, 19, 23, 81, 49, 339, 879, 1903, 657, 2677, 2273, 10853, 3225, 57933}},
+{10653, 17, 41876, {1, 3, 5, 5, 13, 31, 19, 203, 269, 1015, 997, 2151, 4471, 11331, 5363, 46519, 51709}},
+{10654, 17, 41892, {1, 1, 5, 11, 29, 19, 17, 169, 511, 389, 1429, 2707, 1341, 10511, 6779, 43345, 68693}},
+{10655, 17, 41899, {1, 1, 5, 11, 19, 25, 29, 37, 423, 345, 953, 2525, 5937, 6595, 31389, 39347, 36343}},
+{10656, 17, 41916, {1, 3, 1, 3, 15, 25, 45, 95, 111, 207, 19, 1723, 4113, 421, 3297, 46771, 8639}},
+{10657, 17, 41928, {1, 1, 3, 9, 9, 47, 27, 99, 327, 393, 1547, 1587, 4463, 719, 14609, 24347, 68107}},
+{10658, 17, 41957, {1, 3, 7, 7, 29, 19, 57, 229, 131, 497, 109, 251, 6599, 8947, 10255, 12875, 83831}},
+{10659, 17, 41964, {1, 3, 3, 7, 17, 5, 17, 45, 423, 393, 1793, 3, 603, 15221, 13141, 40585, 37489}},
+{10660, 17, 41969, {1, 1, 1, 11, 5, 1, 53, 147, 129, 135, 1473, 17, 7539, 13513, 16045, 17375, 41261}},
+{10661, 17, 41981, {1, 3, 1, 5, 3, 15, 75, 57, 47, 581, 739, 3529, 4323, 10225, 27861, 14431, 106811}},
+{10662, 17, 41996, {1, 3, 3, 13, 23, 57, 41, 39, 217, 67, 595, 1381, 6281, 10125, 30605, 7935, 124219}},
+{10663, 17, 41999, {1, 1, 7, 15, 15, 45, 1, 135, 495, 271, 2023, 3267, 39, 15025, 32763, 39023, 20041}},
+{10664, 17, 42001, {1, 3, 7, 13, 23, 53, 75, 147, 187, 633, 1989, 1885, 6581, 12169, 13639, 19707, 96429}},
+{10665, 17, 42017, {1, 1, 5, 9, 13, 55, 13, 41, 305, 105, 1983, 273, 35, 5185, 22569, 54203, 31641}},
+{10666, 17, 42023, {1, 1, 3, 15, 21, 19, 59, 35, 165, 575, 1961, 1443, 4803, 2339, 28329, 47695, 21505}},
+{10667, 17, 42027, {1, 3, 1, 3, 23, 45, 95, 85, 55, 457, 1957, 1243, 4091, 14669, 13213, 53901, 122605}},
+{10668, 17, 42032, {1, 3, 7, 1, 13, 1, 61, 253, 195, 839, 181, 1153, 1391, 205, 6725, 1757, 86817}},
+{10669, 17, 42035, {1, 1, 3, 9, 7, 13, 115, 137, 169, 851, 299, 509, 6709, 6331, 51, 31833, 25217}},
+{10670, 17, 42044, {1, 1, 5, 15, 29, 23, 119, 15, 41, 585, 1713, 1203, 1653, 3287, 25333, 58873, 71853}},
+{10671, 17, 42050, {1, 3, 5, 15, 1, 45, 35, 79, 97, 381, 2027, 3795, 2127, 4775, 4579, 63267, 24719}},
+{10672, 17, 42061, {1, 1, 5, 7, 17, 21, 123, 75, 3, 887, 1537, 2017, 1623, 16315, 12535, 64281, 54925}},
+{10673, 17, 42062, {1, 1, 3, 13, 5, 23, 117, 43, 305, 365, 775, 1599, 5917, 13995, 6353, 3113, 106317}},
+{10674, 17, 42073, {1, 1, 3, 11, 21, 19, 9, 11, 129, 349, 579, 3523, 5259, 8083, 24513, 15077, 115377}},
+{10675, 17, 42098, {1, 1, 7, 9, 19, 31, 107, 3, 185, 821, 907, 2389, 7015, 3161, 13603, 35063, 60641}},
+{10676, 17, 42104, {1, 1, 3, 1, 19, 35, 105, 245, 363, 745, 1287, 4051, 5201, 7787, 20919, 26567, 37357}},
+{10677, 17, 42109, {1, 3, 1, 1, 23, 31, 1, 149, 61, 489, 371, 987, 3689, 14275, 8581, 48221, 44183}},
+{10678, 17, 42120, {1, 1, 5, 3, 9, 35, 51, 17, 439, 355, 461, 2129, 1567, 13261, 22347, 17013, 53857}},
+{10679, 17, 42125, {1, 3, 3, 15, 3, 33, 59, 185, 157, 933, 1489, 647, 4839, 12139, 3145, 57819, 11731}},
+{10680, 17, 42131, {1, 3, 5, 15, 17, 31, 59, 51, 117, 1001, 1585, 2861, 2785, 9579, 28013, 4481, 126723}},
+{10681, 17, 42143, {1, 3, 7, 13, 27, 1, 41, 119, 179, 879, 1617, 4053, 3537, 15389, 16381, 40153, 68019}},
+{10682, 17, 42153, {1, 1, 3, 13, 13, 35, 45, 203, 333, 337, 1415, 1889, 2361, 4207, 10411, 21013, 44009}},
+{10683, 17, 42176, {1, 3, 3, 5, 27, 9, 17, 85, 331, 369, 1219, 247, 1977, 12267, 1181, 18811, 54017}},
+{10684, 17, 42182, {1, 3, 5, 9, 21, 57, 57, 175, 283, 639, 1155, 1595, 8187, 9981, 21451, 7525, 52751}},
+{10685, 17, 42188, {1, 3, 1, 5, 27, 61, 95, 25, 271, 81, 1335, 2821, 7805, 10167, 13197, 58341, 62325}},
+{10686, 17, 42203, {1, 1, 7, 3, 15, 31, 75, 5, 211, 663, 551, 963, 6015, 11907, 17045, 22863, 32389}},
+{10687, 17, 42216, {1, 1, 7, 5, 21, 53, 67, 71, 251, 135, 1153, 2247, 2499, 15431, 21419, 46737, 2827}},
+{10688, 17, 42219, {1, 1, 5, 3, 31, 25, 39, 209, 437, 791, 1595, 637, 1581, 6575, 26407, 24043, 11277}},
+{10689, 17, 42227, {1, 3, 3, 5, 21, 15, 13, 19, 259, 949, 1237, 239, 5739, 4661, 3405, 55775, 58781}},
+{10690, 17, 42234, {1, 1, 3, 5, 1, 63, 5, 197, 329, 625, 981, 913, 3957, 2765, 8801, 56675, 129511}},
+{10691, 17, 42251, {1, 3, 3, 3, 29, 53, 65, 145, 435, 937, 787, 2043, 4945, 14585, 2789, 15771, 112335}},
+{10692, 17, 42254, {1, 3, 7, 13, 3, 23, 33, 141, 131, 375, 739, 711, 897, 469, 3635, 43335, 3069}},
+{10693, 17, 42256, {1, 1, 7, 11, 29, 13, 111, 149, 197, 793, 1541, 1879, 7683, 9397, 6873, 43733, 118507}},
+{10694, 17, 42259, {1, 3, 7, 7, 29, 21, 97, 113, 139, 573, 1099, 2615, 5123, 13021, 9533, 57673, 79283}},
+{10695, 17, 42282, {1, 3, 1, 5, 11, 9, 59, 89, 469, 797, 1119, 1037, 1667, 5947, 6051, 65045, 98275}},
+{10696, 17, 42289, {1, 3, 3, 9, 11, 7, 51, 191, 321, 677, 1601, 681, 3579, 14441, 26579, 18019, 43065}},
+{10697, 17, 42302, {1, 3, 5, 11, 7, 11, 79, 21, 335, 537, 801, 3553, 4311, 375, 7333, 64839, 88841}},
+{10698, 17, 42307, {1, 3, 1, 7, 5, 11, 15, 163, 69, 645, 57, 3685, 5143, 8275, 12763, 25035, 68949}},
+{10699, 17, 42310, {1, 1, 3, 13, 29, 33, 125, 179, 431, 129, 1367, 951, 5843, 13419, 13897, 17315, 58083}},
+{10700, 17, 42322, {1, 1, 3, 11, 31, 33, 3, 7, 185, 821, 231, 869, 6147, 15243, 32029, 20295, 60871}},
+{10701, 17, 42328, {1, 1, 1, 1, 31, 43, 21, 103, 275, 573, 805, 225, 2049, 8375, 32595, 53201, 126487}},
+{10702, 17, 42338, {1, 1, 1, 9, 31, 29, 7, 91, 277, 937, 1223, 2435, 4335, 7861, 9647, 13577, 30059}},
+{10703, 17, 42349, {1, 1, 1, 1, 23, 25, 69, 175, 293, 905, 765, 1527, 6655, 15431, 2511, 3147, 75431}},
+{10704, 17, 42367, {1, 3, 3, 3, 15, 53, 109, 195, 87, 557, 1277, 1471, 7401, 14127, 11479, 41505, 769}},
+{10705, 17, 42386, {1, 1, 5, 11, 23, 37, 121, 181, 199, 359, 1521, 2561, 3641, 7621, 14219, 6959, 77529}},
+{10706, 17, 42398, {1, 3, 1, 11, 5, 7, 69, 199, 501, 251, 707, 1485, 8125, 3209, 30883, 40259, 85087}},
+{10707, 17, 42404, {1, 3, 5, 13, 9, 35, 5, 133, 505, 39, 581, 1605, 6303, 1211, 27211, 55591, 31689}},
+{10708, 17, 42413, {1, 1, 5, 3, 17, 7, 11, 61, 483, 59, 1569, 2583, 759, 5759, 3575, 44547, 89783}},
+{10709, 17, 42419, {1, 1, 7, 15, 5, 27, 107, 5, 471, 421, 383, 3591, 3609, 13817, 633, 22043, 83119}},
+{10710, 17, 42421, {1, 1, 3, 7, 27, 55, 61, 249, 37, 241, 1483, 2839, 1231, 4765, 1551, 55801, 129679}},
+{10711, 17, 42422, {1, 1, 1, 3, 11, 1, 19, 207, 143, 351, 409, 721, 4597, 13389, 30297, 43253, 129923}},
+{10712, 17, 42431, {1, 3, 3, 7, 7, 53, 83, 27, 167, 163, 537, 3871, 2459, 12813, 30019, 41131, 56109}},
+{10713, 17, 42445, {1, 1, 5, 1, 23, 37, 11, 67, 161, 751, 123, 307, 3341, 12983, 21565, 58529, 94503}},
+{10714, 17, 42448, {1, 3, 3, 15, 11, 33, 39, 195, 467, 647, 1479, 1197, 7949, 6501, 18375, 15263, 21121}},
+{10715, 17, 42451, {1, 3, 5, 13, 3, 35, 9, 253, 299, 679, 69, 165, 2735, 14725, 4217, 16391, 107017}},
+{10716, 17, 42454, {1, 1, 1, 15, 3, 11, 87, 87, 391, 515, 843, 3957, 1365, 13201, 15983, 53647, 35643}},
+{10717, 17, 42458, {1, 1, 3, 7, 9, 53, 45, 221, 209, 855, 169, 2729, 1219, 5229, 14111, 28877, 114653}},
+{10718, 17, 42470, {1, 1, 5, 3, 11, 17, 5, 93, 303, 785, 1895, 2483, 7399, 14031, 1007, 2743, 47307}},
+{10719, 17, 42476, {1, 1, 7, 11, 9, 13, 115, 31, 223, 1011, 723, 1291, 5183, 559, 15881, 43045, 28131}},
+{10720, 17, 42500, {1, 3, 7, 11, 7, 59, 85, 111, 79, 227, 691, 1597, 2453, 10023, 19255, 47781, 88351}},
+{10721, 17, 42509, {1, 3, 3, 7, 21, 33, 39, 35, 253, 743, 563, 2455, 8015, 13403, 24883, 47881, 115559}},
+{10722, 17, 42538, {1, 3, 1, 1, 5, 33, 69, 37, 225, 157, 1347, 3241, 4981, 15985, 9949, 49189, 21267}},
+{10723, 17, 42543, {1, 1, 3, 11, 9, 33, 123, 133, 215, 297, 961, 1571, 1133, 1, 31871, 25253, 100097}},
+{10724, 17, 42545, {1, 1, 1, 7, 13, 29, 101, 127, 113, 785, 1257, 525, 7397, 13143, 30315, 5969, 37829}},
+{10725, 17, 42546, {1, 1, 1, 7, 29, 33, 17, 95, 439, 577, 1857, 423, 63, 15365, 4777, 59073, 7773}},
+{10726, 17, 42563, {1, 1, 5, 15, 3, 17, 89, 133, 217, 601, 1979, 391, 105, 13709, 10081, 37725, 40957}},
+{10727, 17, 42570, {1, 1, 1, 15, 25, 7, 85, 197, 155, 367, 1927, 2007, 2563, 13147, 2345, 28735, 88243}},
+{10728, 17, 42580, {1, 3, 5, 3, 5, 33, 87, 153, 153, 779, 825, 2163, 385, 11663, 2005, 51261, 25893}},
+{10729, 17, 42584, {1, 3, 5, 5, 23, 15, 19, 99, 71, 723, 523, 3683, 7773, 191, 17423, 30497, 129889}},
+{10730, 17, 42589, {1, 1, 7, 11, 1, 3, 49, 119, 39, 661, 297, 27, 1575, 12145, 18519, 57285, 50059}},
+{10731, 17, 42608, {1, 3, 7, 5, 7, 37, 75, 235, 403, 743, 603, 1689, 5031, 8871, 28241, 16917, 16947}},
+{10732, 17, 42618, {1, 1, 5, 13, 17, 41, 67, 219, 237, 365, 833, 3521, 3211, 1037, 5657, 34789, 119739}},
+{10733, 17, 42629, {1, 1, 5, 7, 3, 61, 89, 107, 335, 825, 803, 2445, 6861, 5421, 14585, 44037, 92711}},
+{10734, 17, 42636, {1, 3, 7, 3, 19, 25, 81, 51, 101, 477, 1653, 2841, 6597, 9261, 30609, 15681, 48897}},
+{10735, 17, 42639, {1, 1, 7, 11, 17, 1, 43, 39, 133, 513, 1839, 553, 6379, 4865, 28161, 7249, 80073}},
+{10736, 17, 42644, {1, 1, 5, 5, 13, 45, 19, 225, 399, 679, 195, 3613, 413, 2901, 26749, 39971, 31435}},
+{10737, 17, 42647, {1, 3, 7, 3, 23, 55, 57, 77, 447, 721, 677, 271, 6211, 12631, 5843, 35991, 82653}},
+{10738, 17, 42651, {1, 1, 1, 1, 3, 63, 23, 195, 1, 1019, 723, 3865, 5913, 5491, 5495, 27483, 73637}},
+{10739, 17, 42654, {1, 3, 1, 11, 17, 31, 27, 211, 411, 789, 1049, 2487, 2203, 6457, 7275, 4833, 14131}},
+{10740, 17, 42658, {1, 1, 5, 15, 15, 13, 65, 155, 127, 753, 1605, 1859, 2873, 9197, 1763, 11969, 82971}},
+{10741, 17, 42669, {1, 1, 3, 11, 11, 63, 13, 29, 31, 851, 251, 3231, 1227, 5513, 9785, 34659, 123811}},
+{10742, 17, 42678, {1, 3, 5, 1, 19, 57, 41, 205, 91, 39, 989, 1897, 4789, 16071, 6507, 29363, 75773}},
+{10743, 17, 42689, {1, 1, 1, 1, 5, 29, 113, 203, 53, 599, 1529, 1417, 7017, 9609, 4867, 17659, 80719}},
+{10744, 17, 42695, {1, 3, 7, 9, 27, 17, 77, 25, 461, 511, 781, 2977, 7601, 3551, 23615, 57669, 119723}},
+{10745, 17, 42696, {1, 3, 3, 9, 23, 43, 115, 21, 125, 237, 893, 1431, 7423, 3717, 4371, 36193, 30481}},
+{10746, 17, 42710, {1, 1, 5, 13, 3, 37, 13, 239, 267, 665, 205, 2745, 3865, 12167, 26689, 999, 9355}},
+{10747, 17, 42716, {1, 1, 1, 1, 31, 35, 55, 115, 387, 217, 657, 2827, 2963, 3687, 24271, 41701, 5911}},
+{10748, 17, 42730, {1, 1, 3, 3, 27, 57, 41, 183, 351, 841, 1327, 719, 7043, 12503, 17953, 60719, 98223}},
+{10749, 17, 42732, {1, 3, 1, 1, 27, 1, 119, 85, 197, 673, 1951, 2949, 4783, 561, 12807, 43355, 63397}},
+{10750, 17, 42747, {1, 1, 7, 7, 17, 63, 109, 87, 303, 439, 529, 685, 111, 8405, 21249, 33803, 77927}},
+{10751, 17, 42750, {1, 1, 7, 9, 11, 63, 27, 185, 445, 25, 1313, 3979, 4229, 8797, 10671, 33995, 84463}},
+{10752, 17, 42752, {1, 1, 1, 15, 27, 63, 67, 237, 39, 993, 851, 4075, 3417, 1077, 11939, 31737, 93897}},
+{10753, 17, 42761, {1, 1, 3, 5, 25, 9, 51, 241, 213, 661, 1135, 213, 7027, 5933, 24485, 65029, 8583}},
+{10754, 17, 42772, {1, 3, 5, 11, 31, 1, 17, 237, 107, 1021, 279, 181, 1741, 11099, 7871, 63231, 64445}},
+{10755, 17, 42776, {1, 3, 5, 9, 17, 21, 11, 45, 23, 409, 519, 1703, 5467, 9591, 13555, 23739, 73837}},
+{10756, 17, 42779, {1, 3, 3, 15, 3, 39, 11, 157, 273, 241, 413, 1723, 3179, 2125, 16859, 5231, 122969}},
+{10757, 17, 42797, {1, 3, 5, 11, 21, 27, 29, 243, 255, 1011, 1179, 3545, 3557, 8091, 31569, 10217, 108361}},
+{10758, 17, 42815, {1, 1, 5, 9, 25, 33, 29, 67, 395, 123, 1405, 3855, 7481, 5601, 21231, 17099, 13399}},
+{10759, 17, 42824, {1, 1, 5, 5, 13, 17, 111, 47, 77, 827, 577, 1767, 3367, 11719, 8801, 22431, 85451}},
+{10760, 17, 42837, {1, 3, 7, 11, 11, 31, 17, 141, 149, 293, 55, 3459, 19, 13709, 29135, 62765, 66455}},
+{10761, 17, 42844, {1, 1, 7, 15, 13, 19, 59, 211, 189, 773, 1791, 2089, 2857, 1635, 17777, 46585, 70115}},
+{10762, 17, 42868, {1, 1, 5, 11, 29, 29, 15, 7, 93, 733, 1605, 3731, 2381, 1063, 15565, 25081, 46651}},
+{10763, 17, 42877, {1, 3, 1, 9, 25, 5, 87, 113, 25, 93, 881, 1137, 3237, 10983, 14317, 25945, 121493}},
+{10764, 17, 42888, {1, 1, 5, 11, 29, 47, 99, 111, 165, 453, 259, 2001, 7715, 2609, 15633, 40273, 2065}},
+{10765, 17, 42891, {1, 1, 7, 13, 11, 29, 33, 255, 149, 361, 89, 2837, 49, 3033, 1917, 9029, 38123}},
+{10766, 17, 42912, {1, 1, 1, 7, 27, 31, 105, 61, 469, 497, 1919, 3005, 3651, 2143, 24359, 8053, 103647}},
+{10767, 17, 42918, {1, 1, 3, 13, 31, 63, 101, 47, 397, 89, 1915, 2385, 5399, 8897, 21001, 42997, 110333}},
+{10768, 17, 42921, {1, 3, 7, 5, 29, 1, 5, 119, 493, 349, 153, 1839, 283, 14343, 12975, 55597, 89467}},
+{10769, 17, 42927, {1, 3, 5, 3, 5, 51, 71, 227, 63, 799, 745, 1387, 2435, 1003, 27937, 43421, 12279}},
+{10770, 17, 42949, {1, 3, 3, 7, 7, 31, 37, 61, 11, 175, 581, 1583, 4737, 3087, 10335, 60683, 57085}},
+{10771, 17, 42953, {1, 3, 1, 1, 1, 63, 59, 47, 417, 35, 1673, 3277, 1873, 14981, 22463, 26835, 91115}},
+{10772, 17, 42967, {1, 1, 7, 5, 15, 23, 115, 13, 253, 583, 219, 1307, 1189, 9891, 641, 20841, 87133}},
+{10773, 17, 42974, {1, 1, 5, 11, 1, 3, 71, 235, 429, 335, 1649, 1775, 3077, 13723, 3209, 19807, 7283}},
+{10774, 17, 42989, {1, 1, 7, 1, 31, 49, 39, 141, 127, 63, 1561, 2559, 7661, 4825, 9419, 15327, 87145}},
+{10775, 17, 42995, {1, 1, 5, 3, 17, 33, 51, 219, 467, 151, 161, 3301, 7509, 2235, 30371, 64031, 62741}},
+{10776, 17, 42997, {1, 3, 1, 3, 23, 63, 43, 29, 399, 279, 271, 3537, 1863, 1811, 14917, 28247, 34807}},
+{10777, 17, 43007, {1, 1, 3, 5, 13, 29, 37, 151, 129, 19, 149, 2145, 5363, 6835, 19655, 1207, 74527}},
+{10778, 17, 43018, {1, 3, 5, 7, 27, 35, 63, 53, 247, 987, 1767, 483, 3489, 1711, 10763, 6981, 78251}},
+{10779, 17, 43025, {1, 1, 3, 1, 15, 47, 83, 147, 375, 539, 1623, 29, 4599, 7981, 23533, 64659, 48753}},
+{10780, 17, 43031, {1, 1, 1, 9, 21, 17, 85, 45, 167, 469, 1319, 2969, 1605, 1405, 9961, 28829, 125757}},
+{10781, 17, 43032, {1, 3, 1, 11, 3, 45, 43, 159, 301, 579, 1821, 701, 1149, 457, 16601, 49377, 99845}},
+{10782, 17, 43038, {1, 1, 7, 13, 11, 7, 37, 227, 345, 973, 1167, 1247, 5109, 10917, 3029, 60065, 127347}},
+{10783, 17, 43041, {1, 1, 3, 5, 3, 63, 95, 233, 495, 225, 1225, 3451, 7731, 14677, 10437, 1417, 33293}},
+{10784, 17, 43054, {1, 1, 7, 15, 1, 3, 3, 171, 201, 1009, 1481, 587, 7661, 10085, 4961, 46415, 28573}},
+{10785, 17, 43074, {1, 1, 5, 1, 3, 45, 67, 79, 463, 733, 2007, 2811, 2943, 14857, 23469, 14479, 97875}},
+{10786, 17, 43085, {1, 1, 1, 5, 19, 1, 29, 29, 447, 173, 1081, 153, 5343, 5707, 1357, 30169, 122527}},
+{10787, 17, 43097, {1, 1, 1, 5, 15, 57, 33, 129, 71, 717, 173, 3271, 4741, 13211, 28321, 56793, 119833}},
+{10788, 17, 43098, {1, 3, 3, 9, 9, 41, 47, 71, 103, 713, 725, 1335, 5261, 13835, 17619, 47429, 69815}},
+{10789, 17, 43110, {1, 3, 3, 15, 7, 3, 71, 25, 75, 967, 1037, 3585, 3407, 9979, 2195, 51087, 126535}},
+{10790, 17, 43119, {1, 3, 3, 11, 25, 7, 25, 249, 473, 339, 1211, 3503, 4343, 9707, 26127, 62061, 52479}},
+{10791, 17, 43131, {1, 1, 3, 3, 27, 9, 79, 197, 207, 845, 377, 3231, 5177, 899, 19497, 41187, 105897}},
+{10792, 17, 43143, {1, 3, 5, 15, 5, 27, 65, 151, 207, 677, 713, 2495, 681, 15341, 5389, 51965, 43761}},
+{10793, 17, 43144, {1, 3, 3, 11, 19, 11, 55, 189, 291, 183, 1345, 2677, 791, 2391, 25771, 55147, 24223}},
+{10794, 17, 43152, {1, 1, 3, 11, 31, 59, 29, 5, 275, 483, 1361, 1527, 3019, 245, 17667, 57905, 41329}},
+{10795, 17, 43157, {1, 3, 3, 9, 7, 19, 83, 71, 147, 999, 793, 3535, 1931, 12817, 2707, 45735, 31311}},
+{10796, 17, 43178, {1, 1, 5, 7, 5, 1, 117, 247, 127, 1011, 1441, 2449, 4095, 12239, 4743, 64781, 32621}},
+{10797, 17, 43180, {1, 3, 1, 11, 19, 57, 43, 39, 97, 485, 951, 989, 5975, 5219, 14421, 43681, 37305}},
+{10798, 17, 43192, {1, 1, 5, 15, 7, 49, 113, 161, 199, 545, 1113, 3821, 2019, 8747, 4085, 50823, 31955}},
+{10799, 17, 43197, {1, 3, 3, 3, 19, 41, 47, 191, 403, 25, 2043, 3489, 6263, 4843, 12961, 63791, 5027}},
+{10800, 17, 43203, {1, 1, 7, 1, 25, 55, 5, 51, 121, 273, 973, 3893, 1771, 9373, 21927, 29353, 95935}},
+{10801, 17, 43220, {1, 3, 3, 3, 27, 1, 97, 63, 445, 179, 481, 2995, 3123, 4687, 24359, 35973, 74535}},
+{10802, 17, 43236, {1, 1, 5, 1, 29, 23, 117, 183, 197, 819, 695, 641, 4155, 13593, 30965, 41407, 42433}},
+{10803, 17, 43245, {1, 3, 5, 1, 23, 53, 61, 253, 87, 487, 1995, 1281, 3367, 15047, 3493, 41711, 53407}},
+{10804, 17, 43246, {1, 1, 1, 9, 27, 49, 83, 21, 63, 181, 1661, 1649, 281, 12141, 25771, 35563, 42643}},
+{10805, 17, 43260, {1, 3, 5, 13, 15, 59, 121, 113, 379, 487, 1929, 3725, 2477, 6527, 8619, 64869, 57103}},
+{10806, 17, 43265, {1, 3, 1, 7, 27, 39, 69, 93, 193, 395, 433, 2091, 151, 6921, 11599, 36143, 41179}},
+{10807, 17, 43271, {1, 1, 7, 1, 31, 33, 73, 199, 57, 37, 1387, 3505, 7919, 3507, 2855, 8239, 84527}},
+{10808, 17, 43285, {1, 1, 7, 5, 15, 5, 119, 253, 263, 785, 1409, 1485, 3675, 5515, 13057, 30323, 98015}},
+{10809, 17, 43286, {1, 3, 1, 1, 11, 5, 57, 83, 365, 703, 1923, 1397, 1103, 4015, 13123, 47093, 113793}},
+{10810, 17, 43290, {1, 3, 3, 1, 5, 61, 29, 173, 189, 999, 897, 3389, 6745, 1487, 2349, 59105, 107407}},
+{10811, 17, 43299, {1, 1, 1, 1, 17, 51, 65, 1, 249, 863, 399, 3819, 2485, 12215, 12365, 58909, 25559}},
+{10812, 17, 43314, {1, 3, 7, 1, 31, 39, 43, 219, 51, 13, 779, 505, 2259, 14571, 9049, 21555, 11869}},
+{10813, 17, 43323, {1, 1, 7, 7, 13, 5, 97, 85, 111, 511, 587, 63, 2395, 8099, 26223, 757, 119821}},
+{10814, 17, 43337, {1, 3, 3, 5, 5, 19, 113, 35, 101, 41, 499, 1313, 6489, 6793, 31435, 45007, 95691}},
+{10815, 17, 43348, {1, 3, 5, 15, 19, 37, 103, 187, 347, 667, 1957, 1825, 7447, 12359, 21779, 52749, 18679}},
+{10816, 17, 43355, {1, 3, 5, 5, 17, 19, 19, 193, 435, 379, 439, 2093, 725, 2133, 15659, 54645, 59567}},
+{10817, 17, 43357, {1, 3, 7, 3, 23, 35, 33, 13, 23, 349, 231, 1635, 1625, 5039, 21299, 36413, 104681}},
+{10818, 17, 43358, {1, 1, 3, 13, 23, 49, 15, 253, 509, 9, 411, 2157, 3737, 11227, 6021, 42919, 100375}},
+{10819, 17, 43361, {1, 1, 7, 1, 17, 11, 33, 167, 219, 63, 137, 741, 4193, 16149, 9657, 50223, 85213}},
+{10820, 17, 43362, {1, 3, 7, 11, 23, 59, 113, 149, 427, 697, 1723, 255, 201, 10081, 1079, 323, 109091}},
+{10821, 17, 43364, {1, 3, 3, 15, 11, 9, 89, 39, 67, 249, 1939, 1737, 3719, 10515, 16517, 22345, 83959}},
+{10822, 17, 43368, {1, 3, 3, 13, 5, 33, 127, 9, 329, 429, 563, 1579, 4427, 8343, 22083, 5035, 124915}},
+{10823, 17, 43376, {1, 1, 1, 5, 15, 57, 121, 171, 315, 983, 743, 2015, 2421, 12431, 2561, 13331, 73163}},
+{10824, 17, 43385, {1, 1, 3, 9, 1, 39, 85, 159, 23, 979, 1467, 231, 4231, 3669, 16747, 24195, 46745}},
+{10825, 17, 43386, {1, 1, 3, 7, 3, 11, 65, 67, 85, 455, 365, 2279, 3471, 12771, 14443, 42773, 28723}},
+{10826, 17, 43391, {1, 3, 5, 1, 13, 9, 105, 237, 103, 59, 1301, 3125, 509, 12669, 3893, 9775, 81303}},
+{10827, 17, 43397, {1, 1, 3, 11, 19, 9, 125, 23, 191, 979, 533, 429, 3239, 15013, 13833, 40689, 102827}},
+{10828, 17, 43431, {1, 3, 3, 7, 15, 5, 83, 243, 467, 913, 1279, 3889, 8049, 8357, 5957, 39073, 93521}},
+{10829, 17, 43438, {1, 3, 3, 3, 19, 5, 123, 77, 289, 57, 2001, 807, 5257, 1671, 20273, 10183, 128439}},
+{10830, 17, 43440, {1, 1, 7, 13, 19, 45, 25, 47, 135, 929, 1353, 2731, 3351, 7637, 27037, 58835, 50285}},
+{10831, 17, 43452, {1, 3, 1, 1, 13, 55, 55, 197, 409, 93, 1351, 161, 1885, 5913, 27937, 49793, 84541}},
+{10832, 17, 43463, {1, 1, 3, 7, 29, 21, 113, 179, 203, 533, 1471, 2035, 447, 6781, 28729, 31099, 23027}},
+{10833, 17, 43470, {1, 1, 3, 11, 27, 3, 5, 209, 367, 945, 749, 3637, 2881, 8139, 27875, 34223, 97263}},
+{10834, 17, 43478, {1, 3, 5, 13, 25, 27, 35, 3, 13, 707, 303, 3663, 6617, 13501, 25537, 33077, 71485}},
+{10835, 17, 43481, {1, 1, 7, 15, 11, 29, 65, 47, 235, 635, 133, 153, 6175, 2961, 8171, 28641, 122589}},
+{10836, 17, 43488, {1, 1, 5, 15, 17, 41, 85, 147, 323, 673, 1629, 3477, 3341, 16373, 13901, 60961, 39451}},
+{10837, 17, 43491, {1, 3, 1, 15, 29, 15, 37, 109, 293, 863, 1835, 1173, 2263, 13815, 24995, 6989, 103417}},
+{10838, 17, 43506, {1, 3, 3, 15, 3, 31, 23, 47, 15, 717, 1457, 1067, 6229, 7051, 21771, 54815, 115827}},
+{10839, 17, 43512, {1, 1, 1, 13, 21, 3, 45, 239, 89, 603, 407, 781, 8095, 7389, 18035, 32229, 39867}},
+{10840, 17, 43539, {1, 1, 3, 7, 7, 59, 79, 51, 411, 917, 803, 2455, 2623, 12413, 23957, 44199, 67903}},
+{10841, 17, 43567, {1, 3, 1, 9, 17, 37, 117, 47, 101, 733, 1861, 1111, 6785, 13743, 24371, 49427, 54711}},
+{10842, 17, 43579, {1, 3, 1, 15, 27, 63, 107, 33, 351, 287, 1765, 1947, 6209, 8127, 30007, 18757, 31453}},
+{10843, 17, 43584, {1, 3, 5, 13, 11, 13, 29, 247, 7, 609, 1235, 1767, 5365, 12673, 10151, 51579, 106407}},
+{10844, 17, 43601, {1, 3, 7, 15, 5, 25, 81, 197, 51, 615, 1695, 259, 7983, 1403, 7903, 21441, 73263}},
+{10845, 17, 43614, {1, 1, 5, 1, 13, 61, 55, 175, 445, 3, 1957, 1171, 6823, 4285, 11847, 12789, 79787}},
+{10846, 17, 43617, {1, 1, 5, 15, 17, 51, 111, 201, 45, 97, 45, 2533, 1125, 3663, 13685, 45719, 51497}},
+{10847, 17, 43623, {1, 3, 3, 13, 29, 59, 111, 97, 381, 477, 1229, 3709, 5185, 7055, 32729, 32881, 25539}},
+{10848, 17, 43630, {1, 3, 1, 9, 1, 39, 57, 143, 189, 625, 1717, 1755, 3129, 807, 27975, 15511, 66123}},
+{10849, 17, 43647, {1, 3, 3, 1, 5, 41, 25, 27, 163, 397, 1595, 2325, 1803, 12439, 25743, 24509, 72613}},
+{10850, 17, 43658, {1, 1, 5, 13, 29, 41, 125, 113, 367, 709, 1911, 669, 831, 5375, 31145, 26197, 33543}},
+{10851, 17, 43663, {1, 1, 5, 1, 1, 5, 91, 199, 133, 273, 393, 1179, 717, 12791, 17693, 6905, 20433}},
+{10852, 17, 43665, {1, 1, 3, 15, 29, 35, 9, 127, 383, 673, 1821, 2765, 2425, 11789, 19741, 43189, 99557}},
+{10853, 17, 43691, {1, 1, 7, 13, 9, 19, 119, 103, 11, 983, 623, 391, 1609, 2333, 19843, 28269, 41237}},
+{10854, 17, 43701, {1, 3, 7, 5, 29, 3, 13, 213, 387, 361, 749, 669, 1625, 5687, 11369, 38119, 38389}},
+{10855, 17, 43705, {1, 3, 5, 13, 13, 51, 47, 33, 1, 979, 1817, 2633, 7181, 47, 3603, 49211, 4377}},
+{10856, 17, 43708, {1, 3, 1, 1, 11, 63, 5, 249, 13, 805, 1097, 1449, 5235, 16299, 25855, 30949, 3013}},
+{10857, 17, 43719, {1, 3, 7, 9, 29, 35, 89, 135, 475, 945, 999, 771, 6023, 13317, 32611, 43971, 10393}},
+{10858, 17, 43731, {1, 1, 1, 5, 23, 3, 37, 117, 95, 985, 1599, 2191, 3617, 5831, 31113, 10873, 112219}},
+{10859, 17, 43737, {1, 3, 5, 7, 11, 15, 55, 65, 239, 365, 1209, 3509, 8101, 8619, 24775, 65291, 50589}},
+{10860, 17, 43740, {1, 1, 7, 9, 21, 19, 123, 83, 317, 717, 433, 31, 2597, 14723, 28839, 7817, 126123}},
+{10861, 17, 43747, {1, 1, 7, 11, 3, 33, 99, 39, 227, 279, 353, 1921, 7883, 16187, 5157, 41121, 89425}},
+{10862, 17, 43749, {1, 3, 5, 9, 25, 7, 29, 165, 129, 77, 159, 923, 1357, 1159, 23537, 58087, 56443}},
+{10863, 17, 43750, {1, 1, 7, 3, 13, 51, 45, 161, 27, 41, 1295, 2937, 7223, 5271, 17927, 23311, 2543}},
+{10864, 17, 43754, {1, 1, 1, 1, 11, 53, 119, 165, 409, 785, 1649, 3587, 259, 10997, 3171, 31271, 104631}},
+{10865, 17, 43764, {1, 1, 5, 7, 5, 7, 49, 201, 373, 825, 1755, 3751, 8041, 8133, 21347, 12039, 3049}},
+{10866, 17, 43767, {1, 1, 1, 3, 7, 29, 103, 1, 473, 65, 761, 1611, 5121, 14345, 32535, 16679, 11321}},
+{10867, 17, 43768, {1, 3, 3, 11, 21, 57, 35, 63, 237, 415, 1943, 483, 5377, 14647, 23433, 45459, 32535}},
+{10868, 17, 43773, {1, 1, 1, 15, 21, 57, 7, 103, 493, 279, 665, 3699, 169, 7619, 3571, 11539, 31983}},
+{10869, 17, 43785, {1, 1, 1, 1, 9, 5, 81, 159, 105, 927, 379, 1133, 1805, 14341, 9833, 63151, 70877}},
+{10870, 17, 43788, {1, 1, 7, 5, 19, 5, 63, 127, 129, 43, 757, 2215, 3899, 643, 19731, 17345, 102611}},
+{10871, 17, 43810, {1, 3, 7, 7, 27, 21, 3, 69, 475, 283, 319, 833, 3683, 11275, 18191, 44027, 24901}},
+{10872, 17, 43819, {1, 1, 5, 5, 31, 25, 63, 33, 505, 765, 257, 1147, 779, 12505, 19971, 24695, 65935}},
+{10873, 17, 43834, {1, 1, 1, 15, 23, 33, 31, 107, 59, 639, 1307, 3211, 6171, 15665, 16775, 61671, 25569}},
+{10874, 17, 43853, {1, 3, 3, 9, 31, 3, 113, 199, 425, 895, 1051, 2125, 1525, 15199, 14845, 4213, 18449}},
+{10875, 17, 43866, {1, 3, 5, 3, 3, 11, 75, 121, 33, 265, 459, 3879, 909, 6533, 18451, 32421, 117427}},
+{10876, 17, 43871, {1, 1, 1, 9, 11, 9, 125, 175, 309, 847, 959, 2013, 1557, 9291, 2963, 43275, 9917}},
+{10877, 17, 43872, {1, 1, 5, 3, 15, 39, 67, 35, 373, 601, 463, 1263, 1615, 15059, 31011, 36059, 114493}},
+{10878, 17, 43881, {1, 1, 5, 15, 5, 43, 49, 239, 461, 171, 1863, 2249, 2923, 15897, 22941, 29925, 21429}},
+{10879, 17, 43889, {1, 1, 1, 15, 13, 31, 127, 205, 361, 149, 1641, 1443, 5959, 13183, 13861, 9533, 1011}},
+{10880, 17, 43902, {1, 1, 3, 13, 9, 49, 39, 67, 165, 695, 611, 2261, 3425, 6247, 23575, 51833, 106167}},
+{10881, 17, 43926, {1, 1, 7, 9, 29, 21, 75, 251, 87, 263, 2035, 1007, 3821, 12719, 8889, 47901, 39037}},
+{10882, 17, 43935, {1, 3, 1, 3, 15, 51, 79, 127, 201, 497, 1881, 3841, 1821, 14435, 4933, 6853, 104305}},
+{10883, 17, 43946, {1, 1, 5, 11, 23, 47, 33, 109, 481, 585, 333, 2525, 593, 1625, 5787, 23839, 30647}},
+{10884, 17, 43951, {1, 1, 5, 1, 17, 3, 7, 43, 113, 873, 1433, 3377, 45, 831, 17015, 21479, 7257}},
+{10885, 17, 43953, {1, 1, 1, 1, 13, 21, 59, 159, 279, 871, 53, 3647, 2599, 12417, 25807, 6867, 18251}},
+{10886, 17, 43971, {1, 1, 5, 9, 29, 61, 7, 81, 353, 761, 269, 4047, 3051, 8385, 2919, 18875, 15239}},
+{10887, 17, 44008, {1, 1, 7, 13, 31, 17, 71, 103, 107, 655, 1263, 849, 1809, 349, 3239, 45381, 117451}},
+{10888, 17, 44011, {1, 1, 5, 9, 27, 45, 83, 207, 117, 77, 437, 523, 851, 13595, 12381, 27271, 59951}},
+{10889, 17, 44026, {1, 3, 3, 15, 3, 33, 103, 217, 61, 443, 1077, 2887, 1751, 11111, 465, 37051, 89687}},
+{10890, 17, 44033, {1, 1, 1, 5, 15, 15, 13, 115, 275, 565, 1257, 1067, 6561, 8143, 2149, 53169, 123637}},
+{10891, 17, 44048, {1, 3, 3, 15, 27, 63, 25, 191, 143, 103, 1247, 1053, 2469, 9823, 4437, 18195, 91751}},
+{10892, 17, 44057, {1, 1, 7, 11, 1, 63, 31, 103, 249, 861, 983, 335, 35, 4291, 16307, 43669, 68065}},
+{10893, 17, 44058, {1, 3, 1, 15, 13, 29, 51, 145, 177, 851, 39, 3531, 4477, 4243, 3301, 64293, 15741}},
+{10894, 17, 44067, {1, 1, 7, 3, 29, 45, 5, 85, 185, 191, 1007, 3085, 2177, 14911, 18319, 265, 25435}},
+{10895, 17, 44081, {1, 1, 5, 9, 9, 57, 47, 143, 217, 947, 2021, 1835, 4773, 15145, 26519, 46407, 103667}},
+{10896, 17, 44087, {1, 3, 1, 11, 1, 7, 51, 75, 207, 757, 89, 1289, 39, 15641, 9477, 28503, 47113}},
+{10897, 17, 44099, {1, 3, 1, 11, 9, 19, 21, 197, 429, 121, 813, 3447, 6091, 3167, 5401, 27791, 26499}},
+{10898, 17, 44105, {1, 1, 7, 15, 1, 15, 85, 247, 3, 111, 433, 3103, 5049, 7929, 22645, 53247, 53417}},
+{10899, 17, 44106, {1, 1, 7, 7, 27, 19, 125, 101, 269, 7, 777, 1289, 1429, 11561, 18043, 3601, 125857}},
+{10900, 17, 44114, {1, 1, 1, 13, 11, 9, 127, 231, 239, 435, 1291, 4025, 1049, 15549, 7577, 51147, 38121}},
+{10901, 17, 44116, {1, 1, 7, 3, 9, 55, 57, 137, 387, 565, 873, 1417, 5993, 4849, 1731, 51653, 105697}},
+{10902, 17, 44130, {1, 1, 7, 9, 7, 47, 115, 119, 325, 881, 1687, 1009, 7007, 12541, 6737, 28471, 7369}},
+{10903, 17, 44139, {1, 3, 1, 1, 11, 47, 25, 163, 399, 977, 1777, 727, 5575, 1311, 23843, 2199, 93229}},
+{10904, 17, 44141, {1, 1, 7, 5, 13, 19, 53, 123, 439, 585, 1977, 3387, 5305, 1463, 14307, 9519, 537}},
+{10905, 17, 44153, {1, 1, 7, 15, 1, 53, 13, 213, 323, 699, 1585, 3499, 2441, 3055, 31263, 63923, 9779}},
+{10906, 17, 44159, {1, 1, 5, 5, 21, 43, 123, 43, 475, 521, 1301, 3185, 5627, 7443, 1195, 39485, 113125}},
+{10907, 17, 44160, {1, 1, 5, 7, 9, 3, 39, 5, 237, 719, 1743, 1153, 6401, 14701, 5503, 38491, 24123}},
+{10908, 17, 44170, {1, 3, 5, 9, 17, 33, 117, 23, 409, 63, 1829, 2587, 3489, 3209, 4775, 40069, 4721}},
+{10909, 17, 44172, {1, 3, 3, 5, 21, 63, 95, 231, 25, 167, 1181, 813, 4591, 5227, 21999, 19633, 37547}},
+{10910, 17, 44187, {1, 1, 7, 11, 13, 9, 13, 147, 239, 951, 1247, 1199, 7907, 12493, 25371, 1917, 107499}},
+{10911, 17, 44190, {1, 1, 5, 15, 3, 49, 31, 103, 189, 561, 1763, 3941, 3525, 3165, 7789, 57729, 92635}},
+{10912, 17, 44193, {1, 1, 1, 5, 3, 61, 107, 163, 465, 631, 1519, 169, 4469, 8153, 11039, 247, 37657}},
+{10913, 17, 44199, {1, 3, 1, 5, 9, 37, 51, 195, 465, 975, 169, 1077, 995, 2669, 7663, 28997, 25779}},
+{10914, 17, 44213, {1, 1, 7, 13, 7, 37, 3, 117, 147, 335, 629, 4077, 5855, 2893, 5629, 55075, 83359}},
+{10915, 17, 44218, {1, 1, 5, 9, 9, 25, 53, 63, 315, 287, 1833, 1397, 2395, 5719, 6719, 18003, 101073}},
+{10916, 17, 44223, {1, 1, 7, 1, 13, 19, 13, 81, 497, 399, 413, 2411, 3915, 14037, 19735, 4587, 69655}},
+{10917, 17, 44235, {1, 3, 1, 7, 5, 61, 101, 209, 299, 729, 1359, 4013, 2057, 8439, 8113, 57417, 8951}},
+{10918, 17, 44243, {1, 3, 5, 7, 29, 21, 67, 73, 107, 359, 1655, 3729, 4403, 10467, 28103, 10261, 74651}},
+{10919, 17, 44262, {1, 1, 1, 9, 3, 39, 25, 91, 287, 497, 1743, 339, 4739, 1709, 16351, 45385, 64693}},
+{10920, 17, 44283, {1, 3, 1, 1, 7, 13, 41, 93, 49, 285, 997, 891, 4353, 4249, 11269, 36935, 71249}},
+{10921, 17, 44291, {1, 3, 3, 13, 13, 23, 97, 231, 101, 93, 1183, 201, 6795, 16287, 30707, 20845, 105873}},
+{10922, 17, 44293, {1, 1, 1, 9, 7, 57, 123, 167, 451, 245, 1887, 1839, 2967, 2387, 15075, 11877, 629}},
+{10923, 17, 44308, {1, 3, 3, 1, 13, 13, 83, 41, 219, 313, 1743, 1265, 4435, 11731, 17625, 64235, 24865}},
+{10924, 17, 44327, {1, 3, 1, 9, 13, 17, 109, 235, 387, 581, 887, 1071, 603, 10955, 5001, 8419, 20997}},
+{10925, 17, 44341, {1, 3, 1, 5, 31, 55, 1, 219, 27, 623, 1425, 1309, 5409, 9633, 3231, 15029, 22989}},
+{10926, 17, 44346, {1, 3, 3, 13, 25, 47, 23, 223, 283, 189, 1665, 3743, 387, 1807, 16919, 8511, 15933}},
+{10927, 17, 44348, {1, 1, 1, 1, 13, 11, 81, 59, 423, 1007, 317, 2761, 2617, 9715, 24853, 63585, 77083}},
+{10928, 17, 44354, {1, 3, 1, 3, 3, 11, 103, 123, 401, 467, 1159, 2725, 3275, 15513, 2281, 21617, 87211}},
+{10929, 17, 44366, {1, 1, 5, 7, 23, 17, 25, 83, 11, 901, 809, 3233, 3929, 8685, 7609, 50949, 104841}},
+{10930, 17, 44368, {1, 3, 7, 1, 15, 33, 37, 245, 275, 453, 729, 721, 1589, 5417, 29839, 57315, 67227}},
+{10931, 17, 44373, {1, 3, 7, 3, 21, 17, 51, 213, 225, 471, 1201, 931, 1229, 9503, 5507, 4057, 7737}},
+{10932, 17, 44384, {1, 3, 1, 11, 29, 55, 19, 193, 9, 151, 597, 1377, 827, 8549, 1293, 10963, 86183}},
+{10933, 17, 44390, {1, 3, 3, 15, 17, 23, 89, 47, 195, 333, 2001, 1001, 6715, 9797, 21631, 5723, 88847}},
+{10934, 17, 44393, {1, 3, 5, 9, 21, 33, 111, 101, 503, 513, 785, 1947, 1139, 7921, 13189, 34831, 80963}},
+{10935, 17, 44394, {1, 3, 3, 13, 9, 61, 35, 39, 451, 485, 661, 1993, 4705, 9477, 32541, 16553, 33167}},
+{10936, 17, 44399, {1, 3, 3, 9, 29, 37, 115, 87, 367, 325, 539, 1975, 6769, 1453, 31099, 3335, 16939}},
+{10937, 17, 44401, {1, 1, 1, 7, 15, 21, 113, 203, 97, 847, 625, 847, 1819, 1109, 14503, 25319, 100259}},
+{10938, 17, 44408, {1, 1, 5, 11, 9, 13, 65, 21, 429, 865, 513, 2183, 3785, 11817, 6283, 23041, 7969}},
+{10939, 17, 44411, {1, 1, 5, 13, 1, 41, 109, 43, 91, 211, 1477, 3543, 5217, 3133, 12503, 15523, 12917}},
+{10940, 17, 44417, {1, 3, 7, 9, 23, 53, 109, 89, 229, 939, 1211, 2771, 541, 15915, 5411, 47273, 54453}},
+{10941, 17, 44420, {1, 1, 1, 3, 3, 45, 31, 63, 99, 347, 17, 523, 441, 12325, 15673, 1887, 15289}},
+{10942, 17, 44424, {1, 1, 1, 7, 29, 61, 35, 115, 345, 1011, 5, 595, 465, 3897, 28147, 791, 98757}},
+{10943, 17, 44444, {1, 1, 5, 9, 27, 1, 21, 155, 467, 469, 1565, 1439, 5809, 851, 32503, 3025, 97231}},
+{10944, 17, 44451, {1, 1, 1, 9, 3, 17, 15, 73, 487, 1011, 63, 2605, 6647, 9385, 4527, 21993, 19783}},
+{10945, 17, 44453, {1, 1, 3, 9, 17, 17, 65, 75, 175, 897, 1317, 2593, 1495, 15835, 12025, 57457, 29577}},
+{10946, 17, 44466, {1, 1, 1, 13, 7, 1, 13, 145, 491, 427, 375, 1235, 3045, 2991, 26607, 30581, 43377}},
+{10947, 17, 44472, {1, 1, 1, 1, 31, 1, 75, 235, 345, 75, 1505, 1401, 6921, 6207, 13729, 21545, 34703}},
+{10948, 17, 44475, {1, 3, 7, 9, 31, 35, 53, 233, 85, 385, 2045, 1401, 5365, 827, 13093, 41097, 97381}},
+{10949, 17, 44486, {1, 3, 7, 15, 5, 9, 19, 125, 49, 29, 1553, 675, 3947, 4775, 8161, 12321, 55191}},
+{10950, 17, 44500, {1, 3, 3, 7, 17, 17, 27, 237, 87, 927, 275, 1965, 4993, 1429, 31613, 38403, 119319}},
+{10951, 17, 44510, {1, 3, 7, 13, 25, 61, 87, 133, 37, 725, 697, 371, 7607, 13861, 8015, 63997, 25745}},
+{10952, 17, 44531, {1, 1, 5, 3, 1, 29, 115, 53, 355, 533, 1711, 3863, 6983, 4849, 15787, 38933, 100299}},
+{10953, 17, 44534, {1, 1, 3, 5, 7, 11, 95, 21, 363, 1005, 425, 3497, 841, 8251, 11933, 47783, 122699}},
+{10954, 17, 44553, {1, 1, 1, 11, 15, 41, 23, 159, 191, 433, 919, 3151, 5311, 2061, 11277, 4947, 10549}},
+{10955, 17, 44559, {1, 1, 5, 1, 29, 57, 23, 239, 179, 821, 1825, 1745, 4357, 4041, 27517, 8557, 86969}},
+{10956, 17, 44564, {1, 3, 1, 13, 3, 45, 91, 21, 221, 203, 683, 1787, 375, 4101, 13555, 43269, 8063}},
+{10957, 17, 44580, {1, 1, 5, 15, 17, 61, 95, 95, 285, 597, 1967, 4061, 389, 3813, 6061, 50261, 56035}},
+{10958, 17, 44583, {1, 1, 7, 9, 9, 35, 103, 255, 239, 77, 145, 4089, 757, 16151, 29963, 1229, 31895}},
+{10959, 17, 44589, {1, 1, 7, 7, 29, 51, 63, 105, 55, 609, 665, 2101, 4605, 7085, 18543, 64221, 102503}},
+{10960, 17, 44592, {1, 1, 3, 9, 23, 49, 83, 71, 191, 917, 39, 1013, 4689, 2407, 1733, 31113, 31263}},
+{10961, 17, 44609, {1, 1, 5, 11, 31, 51, 17, 223, 325, 829, 541, 3561, 5319, 15397, 12479, 57199, 38611}},
+{10962, 17, 44627, {1, 3, 1, 3, 19, 57, 19, 191, 427, 905, 1111, 695, 5447, 4061, 25543, 45699, 113283}},
+{10963, 17, 44633, {1, 1, 3, 7, 5, 11, 59, 249, 375, 889, 563, 2757, 5857, 3595, 23183, 1785, 105017}},
+{10964, 17, 44643, {1, 3, 5, 7, 11, 55, 95, 167, 27, 823, 903, 2403, 1137, 3209, 6313, 61871, 129865}},
+{10965, 17, 44646, {1, 1, 3, 11, 25, 3, 89, 171, 209, 409, 1357, 3825, 5261, 10805, 13493, 3303, 129987}},
+{10966, 17, 44650, {1, 1, 5, 1, 23, 21, 3, 207, 471, 375, 1785, 2555, 1613, 16235, 1585, 48221, 10197}},
+{10967, 17, 44674, {1, 1, 1, 15, 13, 33, 89, 185, 331, 239, 1401, 789, 2687, 15193, 20911, 18935, 28751}},
+{10968, 17, 44676, {1, 1, 1, 13, 27, 19, 111, 139, 385, 531, 1069, 2343, 7405, 10305, 7049, 48215, 77591}},
+{10969, 17, 44680, {1, 3, 7, 13, 23, 9, 113, 107, 441, 265, 1617, 63, 7629, 5505, 7059, 47307, 82527}},
+{10970, 17, 44683, {1, 3, 1, 9, 27, 27, 35, 233, 189, 517, 1285, 1843, 1569, 14921, 6617, 44337, 46917}},
+{10971, 17, 44703, {1, 1, 3, 15, 7, 15, 9, 255, 109, 629, 437, 3601, 6591, 10873, 1765, 46459, 110991}},
+{10972, 17, 44704, {1, 1, 5, 15, 17, 13, 115, 97, 401, 979, 1139, 2607, 6537, 5369, 17775, 7657, 57175}},
+{10973, 17, 44716, {1, 1, 5, 15, 27, 15, 43, 95, 271, 945, 1205, 3505, 7403, 13203, 27259, 24821, 62921}},
+{10974, 17, 44733, {1, 1, 7, 15, 9, 13, 53, 177, 93, 169, 1933, 1101, 4847, 15477, 22107, 13009, 93675}},
+{10975, 17, 44748, {1, 3, 1, 3, 13, 57, 121, 229, 353, 449, 769, 1207, 557, 5673, 13129, 29383, 35925}},
+{10976, 17, 44759, {1, 3, 3, 1, 31, 33, 5, 87, 461, 873, 795, 2715, 1421, 14723, 17917, 20681, 46103}},
+{10977, 17, 44763, {1, 1, 7, 3, 29, 5, 49, 215, 341, 25, 1473, 177, 1443, 14181, 26723, 49143, 73461}},
+{10978, 17, 44781, {1, 3, 1, 5, 17, 53, 5, 27, 1, 325, 1335, 2941, 7195, 8179, 26971, 63469, 49357}},
+{10979, 17, 44782, {1, 3, 5, 3, 3, 5, 29, 241, 119, 415, 1371, 3201, 2815, 15567, 32521, 18635, 2101}},
+{10980, 17, 44789, {1, 3, 1, 3, 7, 13, 127, 157, 271, 403, 187, 3663, 4073, 12613, 1305, 31061, 48361}},
+{10981, 17, 44794, {1, 1, 3, 5, 1, 39, 41, 201, 113, 923, 621, 497, 3823, 12543, 27273, 58509, 21613}},
+{10982, 17, 44799, {1, 1, 1, 11, 5, 51, 93, 39, 345, 175, 679, 617, 3445, 8591, 4017, 5147, 88847}},
+{10983, 17, 44804, {1, 1, 7, 7, 7, 9, 63, 7, 89, 711, 487, 69, 447, 3355, 31929, 34719, 93629}},
+{10984, 17, 44813, {1, 3, 1, 3, 27, 11, 51, 11, 471, 889, 1935, 2185, 1277, 3127, 8853, 17839, 40279}},
+{10985, 17, 44822, {1, 3, 3, 15, 25, 35, 71, 213, 121, 935, 1601, 537, 5753, 8743, 15243, 59545, 60399}},
+{10986, 17, 44838, {1, 1, 3, 15, 31, 41, 51, 205, 123, 215, 305, 3777, 4103, 7275, 21603, 56853, 54575}},
+{10987, 17, 44842, {1, 3, 7, 9, 17, 19, 37, 59, 193, 303, 1079, 3627, 6503, 14649, 10283, 64469, 83677}},
+{10988, 17, 44849, {1, 3, 1, 5, 11, 3, 115, 139, 213, 307, 721, 1611, 5093, 11817, 32503, 38559, 38449}},
+{10989, 17, 44856, {1, 3, 1, 1, 17, 31, 41, 113, 135, 733, 723, 2021, 7397, 15917, 15741, 7295, 69885}},
+{10990, 17, 44870, {1, 1, 7, 11, 31, 3, 125, 77, 89, 793, 1441, 1527, 457, 9457, 13581, 62979, 125279}},
+{10991, 17, 44887, {1, 1, 1, 5, 9, 17, 19, 115, 43, 395, 183, 2091, 7021, 7555, 20165, 45165, 58925}},
+{10992, 17, 44904, {1, 1, 1, 15, 23, 37, 97, 45, 357, 201, 425, 3605, 5305, 10079, 16397, 40635, 15355}},
+{10993, 17, 44915, {1, 1, 3, 7, 3, 43, 65, 89, 51, 801, 917, 2835, 5675, 2347, 16587, 19701, 68655}},
+{10994, 17, 44917, {1, 3, 7, 13, 11, 59, 93, 155, 53, 435, 165, 3231, 429, 12757, 27033, 14081, 12625}},
+{10995, 17, 44921, {1, 3, 1, 15, 15, 33, 121, 157, 271, 295, 901, 1689, 709, 13395, 17773, 14397, 37743}},
+{10996, 17, 44928, {1, 1, 1, 3, 7, 17, 125, 113, 223, 603, 425, 3213, 2781, 2921, 15181, 18649, 93493}},
+{10997, 17, 44933, {1, 3, 3, 5, 1, 25, 3, 101, 151, 435, 1339, 1207, 7687, 12579, 29331, 4653, 67353}},
+{10998, 17, 44934, {1, 1, 7, 1, 29, 53, 101, 61, 31, 633, 1899, 3919, 1879, 3143, 25319, 45809, 77425}},
+{10999, 17, 44937, {1, 1, 5, 1, 17, 31, 79, 247, 77, 197, 1693, 313, 2183, 14343, 4511, 26009, 44943}},
+{11000, 17, 44940, {1, 1, 7, 5, 31, 29, 119, 251, 345, 867, 271, 165, 6425, 8343, 11251, 28125, 34849}},
+{11001, 17, 44951, {1, 3, 1, 1, 13, 35, 9, 103, 365, 675, 1653, 4095, 3123, 8245, 4679, 18951, 88543}},
+{11002, 17, 44961, {1, 1, 1, 1, 23, 29, 109, 157, 253, 751, 145, 2077, 4555, 7523, 30099, 37709, 97369}},
+{11003, 17, 44962, {1, 3, 3, 11, 5, 1, 51, 11, 203, 963, 1961, 351, 6697, 8137, 25933, 53505, 28531}},
+{11004, 17, 44971, {1, 1, 7, 15, 27, 1, 31, 159, 447, 501, 1873, 2845, 875, 1671, 5049, 38901, 32559}},
+{11005, 17, 44982, {1, 1, 3, 3, 29, 19, 33, 83, 71, 703, 1861, 3683, 3589, 15339, 21075, 40399, 47853}},
+{11006, 17, 44985, {1, 3, 3, 7, 5, 41, 61, 181, 319, 77, 777, 2537, 3887, 2687, 29227, 55217, 55813}},
+{11007, 17, 44996, {1, 3, 3, 1, 25, 41, 23, 31, 31, 775, 693, 891, 861, 7613, 9557, 43275, 36311}},
+{11008, 17, 44999, {1, 1, 7, 13, 11, 5, 99, 217, 81, 441, 765, 3981, 2921, 9657, 6905, 30657, 18395}},
+{11009, 17, 45014, {1, 3, 1, 11, 21, 55, 25, 209, 13, 1021, 1373, 785, 3243, 1541, 12033, 17309, 116517}},
+{11010, 17, 45029, {1, 1, 1, 7, 3, 3, 61, 113, 453, 405, 1321, 2327, 3529, 12779, 11707, 55795, 105137}},
+{11011, 17, 45033, {1, 3, 1, 13, 15, 53, 17, 189, 197, 459, 1999, 935, 7835, 9563, 31231, 47757, 80807}},
+{11012, 17, 45036, {1, 3, 5, 13, 11, 15, 91, 115, 427, 723, 1815, 3527, 5917, 4931, 28297, 12257, 5587}},
+{11013, 17, 45047, {1, 1, 5, 9, 31, 5, 77, 201, 373, 143, 581, 1199, 6807, 6059, 3133, 57069, 4895}},
+{11014, 17, 45065, {1, 3, 1, 9, 17, 13, 127, 61, 235, 991, 279, 1545, 2875, 8453, 13329, 39763, 66897}},
+{11015, 17, 45076, {1, 1, 3, 15, 31, 51, 3, 95, 221, 685, 635, 1747, 177, 9781, 4859, 45345, 37607}},
+{11016, 17, 45085, {1, 3, 5, 1, 3, 55, 63, 51, 63, 707, 883, 2985, 3699, 3881, 8159, 41775, 41411}},
+{11017, 17, 45086, {1, 1, 1, 11, 3, 41, 69, 181, 413, 33, 525, 1883, 6063, 13787, 1259, 19497, 8119}},
+{11018, 17, 45090, {1, 1, 5, 15, 13, 27, 65, 63, 117, 831, 855, 369, 1005, 9069, 16179, 32027, 6527}},
+{11019, 17, 45107, {1, 3, 7, 5, 25, 51, 63, 163, 101, 299, 1637, 641, 2077, 9195, 11181, 59783, 109481}},
+{11020, 17, 45119, {1, 3, 5, 13, 27, 13, 117, 253, 257, 919, 709, 411, 5525, 1247, 19951, 51423, 34605}},
+{11021, 17, 45121, {1, 1, 5, 5, 1, 37, 49, 125, 87, 291, 339, 3235, 1477, 9787, 19637, 22855, 103013}},
+{11022, 17, 45128, {1, 3, 7, 15, 25, 17, 77, 23, 303, 739, 1921, 1425, 6451, 9521, 6311, 38551, 123683}},
+{11023, 17, 45139, {1, 3, 1, 7, 13, 19, 33, 73, 347, 85, 1693, 3671, 713, 1191, 3285, 6815, 61833}},
+{11024, 17, 45151, {1, 1, 3, 3, 13, 53, 81, 177, 305, 967, 551, 1177, 2315, 4899, 5733, 11147, 128895}},
+{11025, 17, 45157, {1, 3, 5, 3, 17, 17, 93, 173, 417, 645, 1631, 1817, 6127, 3545, 6127, 22331, 59751}},
+{11026, 17, 45162, {1, 1, 5, 11, 7, 53, 61, 117, 133, 141, 283, 3351, 6745, 599, 7221, 50583, 9067}},
+{11027, 17, 45164, {1, 3, 7, 3, 29, 45, 71, 177, 97, 897, 589, 3319, 1821, 7207, 25715, 13043, 96695}},
+{11028, 17, 45176, {1, 3, 3, 1, 13, 39, 19, 49, 419, 905, 1063, 4023, 145, 1479, 22197, 43883, 45503}},
+{11029, 17, 45179, {1, 3, 3, 15, 9, 45, 45, 201, 61, 193, 375, 2439, 2339, 15981, 5197, 6285, 109389}},
+{11030, 17, 45198, {1, 1, 7, 13, 29, 51, 93, 223, 509, 1003, 1861, 3715, 2511, 13843, 25297, 1241, 12157}},
+{11031, 17, 45209, {1, 3, 5, 15, 19, 17, 95, 243, 251, 485, 1837, 1829, 2081, 15117, 29635, 63861, 100397}},
+{11032, 17, 45231, {1, 1, 7, 3, 1, 37, 31, 53, 483, 849, 1197, 3069, 2539, 2529, 12749, 64331, 45757}},
+{11033, 17, 45234, {1, 3, 7, 7, 1, 19, 25, 243, 335, 99, 1507, 2155, 6085, 2253, 32439, 16141, 6781}},
+{11034, 17, 45236, {1, 3, 7, 15, 9, 13, 35, 63, 371, 373, 1891, 3913, 4577, 15553, 13079, 60251, 71193}},
+{11035, 17, 45251, {1, 3, 1, 7, 15, 13, 105, 113, 409, 289, 57, 1095, 791, 15675, 21471, 42851, 29203}},
+{11036, 17, 45260, {1, 1, 1, 13, 1, 57, 65, 7, 153, 929, 1325, 229, 3841, 8967, 29889, 49427, 46853}},
+{11037, 17, 45268, {1, 1, 3, 11, 29, 1, 79, 111, 479, 931, 1619, 505, 4503, 4055, 18849, 3979, 46091}},
+{11038, 17, 45277, {1, 1, 7, 3, 31, 27, 127, 63, 219, 43, 883, 1265, 5733, 9051, 17059, 61625, 93843}},
+{11039, 17, 45299, {1, 1, 7, 7, 23, 21, 35, 211, 243, 399, 1225, 1415, 5923, 2143, 25303, 36171, 126349}},
+{11040, 17, 45301, {1, 3, 1, 3, 3, 13, 77, 205, 271, 393, 769, 2101, 4045, 6159, 3409, 44065, 102799}},
+{11041, 17, 45338, {1, 1, 5, 15, 19, 1, 67, 199, 367, 51, 495, 2051, 3195, 15239, 10525, 45319, 50489}},
+{11042, 17, 45344, {1, 1, 1, 9, 3, 19, 105, 147, 417, 399, 373, 1025, 2727, 13779, 30079, 22723, 41551}},
+{11043, 17, 45349, {1, 1, 3, 1, 9, 15, 105, 95, 267, 995, 275, 2627, 3883, 10785, 8075, 40591, 54647}},
+{11044, 17, 45364, {1, 1, 1, 5, 31, 37, 117, 185, 55, 273, 525, 445, 4221, 2081, 16017, 19859, 3297}},
+{11045, 17, 45367, {1, 3, 5, 13, 21, 13, 105, 231, 461, 831, 393, 3253, 1213, 2625, 3393, 36715, 104889}},
+{11046, 17, 45371, {1, 3, 5, 15, 1, 17, 103, 129, 257, 1003, 285, 2927, 3967, 53, 5197, 39665, 50751}},
+{11047, 17, 45373, {1, 1, 1, 13, 1, 61, 47, 255, 137, 849, 213, 301, 681, 9547, 28209, 32941, 72109}},
+{11048, 17, 45376, {1, 1, 7, 11, 31, 15, 81, 117, 327, 289, 1861, 861, 6189, 13425, 18279, 7635, 116969}},
+{11049, 17, 45381, {1, 3, 3, 3, 9, 11, 13, 181, 183, 621, 329, 2751, 3989, 6345, 20319, 52267, 79695}},
+{11050, 17, 45400, {1, 1, 7, 13, 9, 1, 5, 125, 1, 735, 691, 13, 3961, 2273, 18299, 65221, 20115}},
+{11051, 17, 45406, {1, 3, 7, 1, 7, 3, 87, 115, 241, 101, 523, 3019, 7571, 7721, 27409, 49751, 97859}},
+{11052, 17, 45416, {1, 3, 5, 11, 9, 5, 33, 59, 299, 191, 307, 2115, 2823, 10187, 10437, 34137, 93217}},
+{11053, 17, 45422, {1, 3, 3, 7, 21, 31, 5, 113, 77, 215, 177, 2029, 7241, 4465, 31489, 10165, 19035}},
+{11054, 17, 45427, {1, 3, 5, 1, 27, 63, 11, 161, 435, 941, 1593, 1765, 1519, 9111, 12787, 35961, 105263}},
+{11055, 17, 45440, {1, 1, 1, 9, 11, 57, 41, 229, 387, 617, 1991, 221, 2857, 4337, 13851, 23185, 111031}},
+{11056, 17, 45458, {1, 1, 3, 5, 21, 27, 125, 83, 129, 919, 65, 403, 2981, 10111, 17017, 24829, 12205}},
+{11057, 17, 45467, {1, 3, 3, 9, 25, 19, 109, 47, 199, 395, 1909, 2819, 5361, 6629, 7067, 18755, 17921}},
+{11058, 17, 45474, {1, 1, 3, 15, 25, 37, 111, 129, 409, 291, 1403, 2785, 3819, 10245, 24647, 64799, 64951}},
+{11059, 17, 45476, {1, 3, 5, 11, 1, 7, 105, 223, 427, 661, 1817, 1023, 145, 927, 6507, 13235, 30147}},
+{11060, 17, 45488, {1, 3, 5, 13, 7, 15, 65, 125, 121, 113, 923, 2729, 1397, 14247, 8487, 54907, 41921}},
+{11061, 17, 45494, {1, 1, 5, 1, 13, 15, 47, 111, 453, 375, 1705, 1539, 4103, 601, 7499, 33287, 123689}},
+{11062, 17, 45497, {1, 1, 5, 3, 21, 11, 87, 115, 483, 617, 1593, 2817, 6519, 16203, 361, 34415, 100829}},
+{11063, 17, 45500, {1, 3, 7, 15, 23, 25, 41, 193, 473, 517, 1195, 3627, 1089, 13391, 3653, 25637, 5643}},
+{11064, 17, 45512, {1, 3, 1, 1, 13, 57, 29, 175, 35, 107, 5, 3641, 1843, 1507, 7591, 39967, 66859}},
+{11065, 17, 45515, {1, 1, 3, 13, 1, 39, 31, 11, 493, 123, 523, 843, 133, 7971, 14131, 51927, 97943}},
+{11066, 17, 45523, {1, 1, 3, 7, 23, 45, 5, 195, 195, 683, 497, 1215, 5855, 14569, 20441, 29541, 30431}},
+{11067, 17, 45542, {1, 3, 1, 11, 31, 39, 127, 187, 187, 17, 817, 907, 4657, 8223, 13305, 36489, 28909}},
+{11068, 17, 45553, {1, 1, 7, 13, 9, 1, 59, 27, 449, 887, 39, 191, 803, 2339, 5213, 2611, 93175}},
+{11069, 17, 45559, {1, 1, 1, 1, 29, 17, 105, 13, 175, 401, 1145, 297, 6873, 889, 10301, 48993, 49959}},
+{11070, 17, 45589, {1, 3, 5, 5, 1, 57, 81, 81, 403, 719, 1887, 2597, 1069, 5219, 29767, 46905, 8025}},
+{11071, 17, 45594, {1, 1, 5, 11, 13, 37, 41, 3, 487, 895, 343, 1729, 3777, 8681, 24737, 34179, 15015}},
+{11072, 17, 45596, {1, 1, 1, 15, 9, 43, 67, 203, 71, 399, 23, 529, 2375, 15373, 21013, 17389, 93809}},
+{11073, 17, 45603, {1, 3, 7, 7, 9, 23, 81, 27, 39, 529, 631, 199, 3555, 953, 4249, 39297, 88107}},
+{11074, 17, 45605, {1, 3, 1, 3, 31, 45, 33, 63, 319, 245, 1567, 3359, 2051, 11523, 30177, 20293, 13245}},
+{11075, 17, 45610, {1, 1, 1, 13, 9, 61, 39, 127, 453, 1019, 2037, 3541, 6983, 10717, 19587, 8981, 99637}},
+{11076, 17, 45630, {1, 3, 5, 9, 15, 7, 55, 79, 93, 303, 1423, 499, 5499, 795, 14553, 16945, 46161}},
+{11077, 17, 45638, {1, 1, 7, 5, 21, 21, 27, 201, 147, 461, 363, 267, 2963, 3409, 17835, 40777, 71879}},
+{11078, 17, 45641, {1, 1, 7, 9, 23, 63, 115, 243, 103, 119, 2023, 2223, 7989, 1365, 26181, 4631, 88001}},
+{11079, 17, 45647, {1, 3, 5, 5, 27, 57, 101, 199, 461, 853, 449, 2733, 2225, 8609, 19461, 15265, 54079}},
+{11080, 17, 45655, {1, 3, 3, 15, 29, 59, 115, 105, 145, 391, 303, 901, 5481, 1491, 30441, 22331, 3841}},
+{11081, 17, 45659, {1, 1, 3, 1, 27, 45, 11, 167, 73, 181, 253, 1947, 1731, 15269, 16971, 12299, 46439}},
+{11082, 17, 45665, {1, 1, 7, 13, 11, 21, 83, 157, 75, 705, 1709, 487, 5029, 9879, 27589, 21601, 50575}},
+{11083, 17, 45689, {1, 1, 5, 3, 27, 37, 101, 163, 115, 903, 1137, 3807, 2899, 3407, 27935, 14203, 31009}},
+{11084, 17, 45695, {1, 3, 5, 9, 31, 33, 63, 69, 159, 737, 1973, 3661, 6159, 1781, 9239, 12989, 82947}},
+{11085, 17, 45702, {1, 3, 5, 9, 15, 33, 41, 89, 183, 933, 1305, 1013, 7245, 16225, 10891, 6641, 61699}},
+{11086, 17, 45708, {1, 1, 5, 3, 25, 41, 91, 183, 45, 553, 1817, 3305, 5169, 9051, 24917, 52431, 52505}},
+{11087, 17, 45726, {1, 3, 3, 9, 3, 9, 127, 59, 117, 1001, 1255, 3435, 3797, 8507, 28593, 24119, 75569}},
+{11088, 17, 45729, {1, 3, 1, 5, 17, 43, 45, 21, 461, 339, 1127, 2213, 7351, 14585, 2001, 32619, 33825}},
+{11089, 17, 45739, {1, 1, 5, 11, 3, 37, 61, 83, 101, 707, 861, 3037, 1867, 7747, 16313, 58745, 14387}},
+{11090, 17, 45744, {1, 1, 5, 3, 27, 25, 99, 17, 293, 867, 1655, 2301, 2007, 7379, 14487, 18233, 3625}},
+{11091, 17, 45747, {1, 1, 7, 13, 25, 29, 21, 133, 207, 119, 423, 1561, 6587, 1221, 27295, 48141, 125473}},
+{11092, 17, 45762, {1, 3, 3, 1, 19, 45, 39, 85, 127, 249, 157, 1307, 7343, 6309, 31073, 16909, 93223}},
+{11093, 17, 45764, {1, 1, 5, 13, 19, 43, 111, 109, 385, 847, 1071, 1009, 2783, 8471, 5719, 50459, 110507}},
+{11094, 17, 45773, {1, 1, 5, 15, 1, 45, 39, 197, 209, 839, 485, 3943, 5939, 11835, 18297, 61217, 85015}},
+{11095, 17, 45774, {1, 1, 1, 15, 5, 61, 1, 195, 415, 355, 1593, 151, 8143, 3527, 11633, 44337, 99749}},
+{11096, 17, 45781, {1, 1, 5, 13, 11, 11, 117, 109, 91, 663, 1351, 2361, 1409, 9317, 31133, 17577, 123919}},
+{11097, 17, 45785, {1, 3, 3, 9, 3, 5, 115, 173, 459, 937, 1581, 781, 1069, 573, 24025, 30721, 116837}},
+{11098, 17, 45792, {1, 1, 1, 5, 21, 37, 47, 51, 21, 169, 119, 3285, 2543, 14023, 29179, 13407, 130491}},
+{11099, 17, 45801, {1, 3, 5, 5, 25, 27, 41, 147, 485, 79, 737, 699, 6763, 16347, 9265, 52129, 41431}},
+{11100, 17, 45802, {1, 1, 1, 3, 5, 33, 115, 187, 311, 717, 1897, 2215, 2639, 4167, 1429, 26359, 52703}},
+{11101, 17, 45812, {1, 3, 5, 5, 13, 51, 103, 5, 47, 683, 319, 2969, 7701, 11031, 9257, 16725, 80825}},
+{11102, 17, 45816, {1, 3, 1, 11, 31, 47, 17, 205, 11, 411, 523, 4053, 6743, 3095, 3219, 63163, 84547}},
+{11103, 17, 45829, {1, 1, 7, 15, 9, 55, 109, 225, 273, 595, 1697, 2059, 21, 11319, 23277, 60613, 4539}},
+{11104, 17, 45833, {1, 1, 5, 13, 3, 59, 49, 239, 509, 847, 975, 3361, 5443, 1941, 29277, 56379, 38997}},
+{11105, 17, 45847, {1, 3, 1, 7, 15, 5, 49, 19, 235, 437, 1309, 827, 4123, 5839, 22409, 42535, 98041}},
+{11106, 17, 45851, {1, 1, 5, 15, 9, 33, 57, 153, 165, 215, 177, 1271, 1861, 15489, 4183, 43701, 114169}},
+{11107, 17, 45854, {1, 3, 5, 5, 13, 3, 119, 89, 17, 421, 1205, 835, 4917, 6113, 28991, 26839, 114871}},
+{11108, 17, 45863, {1, 3, 5, 1, 7, 49, 49, 159, 205, 601, 1939, 4063, 5975, 11747, 10329, 21103, 16779}},
+{11109, 17, 45870, {1, 1, 5, 15, 13, 33, 89, 21, 113, 639, 891, 989, 829, 1435, 11475, 42711, 67049}},
+{11110, 17, 45901, {1, 1, 5, 5, 9, 59, 57, 105, 385, 733, 1175, 329, 6809, 7175, 27267, 9941, 14203}},
+{11111, 17, 45910, {1, 3, 1, 13, 21, 53, 83, 139, 287, 659, 1991, 3225, 4153, 4325, 16803, 27719, 86263}},
+{11112, 17, 45920, {1, 3, 5, 13, 27, 21, 111, 105, 29, 573, 405, 2781, 1737, 12057, 25263, 16903, 45389}},
+{11113, 17, 45932, {1, 1, 5, 5, 23, 23, 61, 27, 335, 279, 937, 2509, 4751, 2993, 28069, 30187, 3595}},
+{11114, 17, 45938, {1, 1, 5, 7, 29, 37, 117, 71, 221, 875, 1987, 2329, 5953, 15901, 29813, 17419, 4745}},
+{11115, 17, 45940, {1, 3, 3, 13, 21, 51, 77, 85, 53, 573, 1129, 3415, 2283, 5221, 29991, 46091, 65843}},
+{11116, 17, 45943, {1, 1, 1, 3, 17, 51, 89, 211, 463, 743, 1189, 4083, 1437, 5219, 8373, 15559, 18557}},
+{11117, 17, 45949, {1, 1, 5, 3, 29, 27, 1, 207, 285, 739, 505, 1587, 6565, 14195, 4995, 39453, 61023}},
+{11118, 17, 45953, {1, 3, 3, 15, 7, 57, 19, 45, 39, 881, 1207, 2829, 3265, 2637, 7843, 62889, 53289}},
+{11119, 17, 45963, {1, 1, 1, 11, 31, 21, 73, 245, 87, 457, 1523, 2397, 1157, 8237, 26195, 23149, 106523}},
+{11120, 17, 45971, {1, 3, 5, 13, 3, 55, 3, 179, 107, 85, 639, 2711, 6359, 1599, 2325, 59573, 111941}},
+{11121, 17, 45989, {1, 1, 1, 13, 17, 61, 45, 253, 45, 149, 1251, 139, 7113, 6503, 27675, 37301, 21713}},
+{11122, 17, 45999, {1, 3, 5, 9, 31, 31, 67, 79, 355, 225, 1187, 761, 4927, 5481, 9139, 13399, 35653}},
+{11123, 17, 46001, {1, 1, 5, 3, 7, 3, 95, 119, 161, 529, 1443, 1099, 609, 3919, 10935, 37779, 92993}},
+{11124, 17, 46008, {1, 1, 7, 9, 13, 21, 13, 7, 165, 173, 989, 2315, 2305, 13115, 6933, 56233, 112113}},
+{11125, 17, 46022, {1, 1, 7, 3, 9, 11, 25, 45, 493, 119, 839, 3907, 2273, 14113, 29453, 55181, 667}},
+{11126, 17, 46026, {1, 3, 5, 15, 25, 33, 15, 23, 245, 517, 1883, 2865, 1483, 7043, 32615, 12261, 49297}},
+{11127, 17, 46034, {1, 3, 7, 9, 31, 35, 89, 103, 245, 441, 1709, 1321, 3743, 3767, 23885, 43587, 18017}},
+{11128, 17, 46040, {1, 3, 7, 5, 23, 43, 103, 7, 47, 187, 1257, 3517, 591, 16263, 12047, 16699, 81633}},
+{11129, 17, 46043, {1, 1, 5, 15, 5, 5, 79, 11, 327, 719, 37, 2913, 6107, 3463, 25901, 6125, 100647}},
+{11130, 17, 46045, {1, 1, 1, 11, 13, 29, 83, 251, 41, 125, 1137, 2627, 4643, 29, 24631, 51435, 98643}},
+{11131, 17, 46061, {1, 1, 7, 3, 27, 3, 69, 245, 365, 599, 1575, 2969, 3441, 12327, 18951, 56167, 13861}},
+{11132, 17, 46062, {1, 3, 3, 11, 5, 47, 103, 233, 351, 821, 867, 3199, 6133, 4627, 22663, 14775, 83205}},
+{11133, 17, 46076, {1, 3, 1, 13, 9, 35, 27, 251, 281, 727, 873, 3713, 5247, 8407, 17739, 57207, 126201}},
+{11134, 17, 46084, {1, 1, 7, 11, 11, 35, 53, 115, 93, 663, 625, 565, 3137, 7869, 18845, 49155, 83395}},
+{11135, 17, 46094, {1, 3, 3, 5, 21, 13, 99, 151, 319, 9, 1363, 1489, 2545, 1963, 1271, 24815, 43355}},
+{11136, 17, 46102, {1, 3, 5, 9, 15, 51, 109, 85, 67, 131, 1947, 181, 7331, 15163, 2255, 33449, 78107}},
+{11137, 17, 46118, {1, 1, 7, 9, 27, 61, 1, 163, 309, 739, 453, 1837, 2093, 16021, 8485, 19755, 61335}},
+{11138, 17, 46149, {1, 3, 5, 7, 3, 13, 11, 195, 91, 143, 203, 2785, 7319, 7153, 19265, 11597, 63365}},
+{11139, 17, 46154, {1, 3, 1, 9, 29, 1, 123, 247, 253, 757, 191, 1699, 6625, 1785, 29199, 29409, 32577}},
+{11140, 17, 46167, {1, 3, 5, 11, 23, 21, 31, 35, 383, 587, 65, 1695, 4045, 12305, 12437, 5919, 51465}},
+{11141, 17, 46173, {1, 1, 5, 9, 11, 13, 123, 171, 499, 877, 1785, 561, 2547, 1797, 27679, 56305, 93223}},
+{11142, 17, 46177, {1, 3, 1, 3, 25, 41, 63, 243, 219, 533, 753, 1903, 3257, 11901, 4777, 28629, 111141}},
+{11143, 17, 46192, {1, 3, 3, 5, 31, 47, 1, 253, 283, 995, 1787, 1767, 6599, 11913, 21515, 39259, 117727}},
+{11144, 17, 46197, {1, 1, 7, 7, 31, 35, 39, 255, 463, 763, 881, 2583, 347, 14343, 22761, 45821, 119155}},
+{11145, 17, 46201, {1, 3, 5, 9, 5, 37, 43, 55, 423, 525, 157, 3593, 2831, 11539, 15675, 11695, 100609}},
+{11146, 17, 46214, {1, 3, 3, 5, 11, 9, 27, 57, 409, 201, 1029, 2461, 5823, 2593, 32031, 4203, 55327}},
+{11147, 17, 46217, {1, 1, 7, 15, 15, 25, 69, 83, 309, 687, 1607, 819, 7381, 3697, 5289, 33153, 48157}},
+{11148, 17, 46223, {1, 1, 5, 5, 31, 57, 41, 195, 201, 59, 2045, 2213, 6695, 3839, 17331, 4981, 26803}},
+{11149, 17, 46226, {1, 1, 1, 11, 7, 53, 109, 169, 387, 181, 391, 19, 4159, 299, 29059, 27781, 110193}},
+{11150, 17, 46228, {1, 3, 7, 15, 5, 31, 95, 155, 47, 601, 1463, 1799, 8027, 3003, 18067, 24589, 108171}},
+{11151, 17, 46237, {1, 3, 3, 7, 11, 61, 21, 121, 117, 149, 1037, 3829, 3581, 15223, 17051, 34539, 37263}},
+{11152, 17, 46241, {1, 3, 3, 3, 15, 15, 115, 91, 443, 309, 1073, 2053, 789, 7415, 26253, 62657, 49729}},
+{11153, 17, 46251, {1, 3, 5, 5, 31, 19, 23, 221, 19, 105, 1105, 2025, 4209, 7531, 30191, 40777, 46069}},
+{11154, 17, 46259, {1, 1, 1, 7, 29, 45, 29, 215, 33, 21, 1147, 1725, 3711, 2759, 12731, 57031, 42361}},
+{11155, 17, 46262, {1, 1, 5, 15, 13, 59, 111, 169, 317, 841, 1387, 3513, 3137, 8265, 31789, 26963, 126219}},
+{11156, 17, 46266, {1, 1, 3, 1, 23, 21, 13, 113, 71, 177, 345, 3149, 1461, 12945, 3971, 59759, 61839}},
+{11157, 17, 46294, {1, 3, 5, 13, 9, 19, 103, 17, 95, 617, 1477, 263, 4259, 12899, 24351, 47431, 11583}},
+{11158, 17, 46300, {1, 3, 5, 11, 13, 11, 7, 61, 13, 63, 1687, 631, 381, 5899, 10225, 19657, 37087}},
+{11159, 17, 46303, {1, 3, 5, 3, 7, 53, 11, 193, 103, 427, 1097, 299, 2905, 5019, 31803, 28931, 47495}},
+{11160, 17, 46309, {1, 3, 3, 11, 21, 31, 125, 249, 233, 941, 975, 2287, 7837, 6481, 11021, 52829, 63023}},
+{11161, 17, 46321, {1, 1, 7, 15, 13, 17, 33, 85, 503, 11, 689, 637, 4063, 12223, 1835, 17161, 35213}},
+{11162, 17, 46331, {1, 3, 5, 13, 25, 37, 21, 135, 377, 623, 895, 2547, 2757, 9055, 17337, 65457, 24737}},
+{11163, 17, 46339, {1, 1, 1, 15, 25, 11, 17, 95, 65, 271, 1791, 841, 1441, 11177, 10087, 63963, 71481}},
+{11164, 17, 46342, {1, 3, 5, 11, 31, 1, 37, 107, 109, 459, 1185, 2155, 271, 11775, 23243, 53517, 103669}},
+{11165, 17, 46354, {1, 3, 1, 9, 1, 49, 23, 141, 169, 475, 469, 2271, 1379, 13139, 1765, 63625, 14143}},
+{11166, 17, 46370, {1, 1, 1, 9, 13, 7, 23, 219, 381, 105, 743, 1745, 2999, 661, 7245, 39653, 99913}},
+{11167, 17, 46372, {1, 3, 1, 11, 7, 35, 9, 215, 41, 537, 1569, 1803, 3613, 667, 15089, 39485, 85457}},
+{11168, 17, 46379, {1, 1, 1, 15, 9, 49, 75, 235, 119, 97, 273, 209, 2707, 2071, 21943, 60249, 57737}},
+{11169, 17, 46382, {1, 1, 5, 15, 31, 19, 33, 49, 279, 461, 143, 3001, 3539, 1015, 27597, 35389, 36483}},
+{11170, 17, 46393, {1, 3, 7, 1, 23, 51, 123, 247, 485, 343, 1365, 593, 6465, 12305, 29375, 30641, 43165}},
+{11171, 17, 46402, {1, 1, 7, 13, 15, 11, 125, 51, 235, 717, 1427, 3203, 1711, 12607, 8805, 5773, 27467}},
+{11172, 17, 46407, {1, 3, 5, 5, 5, 13, 51, 181, 133, 977, 469, 2513, 6819, 12985, 8917, 47317, 47557}},
+{11173, 17, 46416, {1, 1, 5, 7, 3, 7, 71, 17, 345, 921, 1621, 2801, 5825, 827, 17711, 33701, 113503}},
+{11174, 17, 46425, {1, 3, 1, 1, 17, 7, 99, 83, 73, 349, 567, 713, 5639, 4969, 11549, 35317, 28995}},
+{11175, 17, 46437, {1, 3, 3, 9, 11, 53, 123, 227, 391, 775, 1013, 3971, 6183, 14453, 6403, 57063, 7123}},
+{11176, 17, 46444, {1, 1, 1, 15, 27, 13, 51, 147, 151, 535, 2017, 3019, 6791, 3931, 12529, 30855, 33243}},
+{11177, 17, 46447, {1, 3, 1, 1, 27, 43, 103, 85, 135, 207, 621, 251, 3723, 10893, 29533, 31023, 11043}},
+{11178, 17, 46449, {1, 3, 7, 5, 7, 39, 55, 133, 141, 63, 237, 3299, 861, 15123, 11859, 13271, 32893}},
+{11179, 17, 46456, {1, 3, 7, 9, 23, 17, 73, 197, 113, 725, 137, 2835, 2877, 6913, 22949, 56071, 67597}},
+{11180, 17, 46462, {1, 3, 7, 7, 15, 3, 15, 253, 51, 443, 15, 2549, 7833, 4713, 29211, 22339, 6009}},
+{11181, 17, 46472, {1, 3, 5, 15, 19, 55, 35, 59, 281, 995, 1113, 605, 2345, 10009, 14629, 11757, 53241}},
+{11182, 17, 46475, {1, 1, 1, 11, 3, 31, 11, 193, 437, 1003, 873, 909, 6513, 2045, 10495, 17387, 25461}},
+{11183, 17, 46486, {1, 1, 3, 5, 21, 61, 47, 177, 379, 773, 951, 419, 4455, 10171, 17403, 19045, 87327}},
+{11184, 17, 46490, {1, 3, 3, 11, 31, 41, 69, 229, 207, 299, 1743, 1417, 4785, 1327, 26967, 43077, 124319}},
+{11185, 17, 46495, {1, 3, 7, 15, 19, 37, 65, 219, 33, 691, 205, 1577, 4775, 8427, 28315, 53559, 100789}},
+{11186, 17, 46501, {1, 3, 5, 11, 5, 39, 55, 147, 139, 871, 1563, 3661, 4791, 423, 30007, 1589, 20255}},
+{11187, 17, 46514, {1, 1, 3, 15, 5, 61, 89, 83, 261, 519, 1367, 2019, 3799, 8237, 9011, 28995, 1587}},
+{11188, 17, 46526, {1, 1, 7, 15, 17, 55, 49, 41, 353, 507, 1565, 3365, 7947, 10391, 1323, 61591, 126305}},
+{11189, 17, 46528, {1, 3, 3, 5, 13, 19, 49, 195, 355, 915, 1867, 3513, 1239, 4809, 16925, 22947, 92641}},
+{11190, 17, 46538, {1, 1, 7, 3, 31, 51, 45, 241, 55, 195, 1233, 3675, 8077, 4981, 17679, 53025, 77927}},
+{11191, 17, 46551, {1, 3, 5, 11, 23, 5, 93, 49, 277, 979, 1093, 3031, 6131, 8085, 19121, 45305, 6705}},
+{11192, 17, 46552, {1, 1, 7, 13, 29, 25, 83, 105, 469, 729, 1495, 2607, 2681, 13959, 101, 1913, 2671}},
+{11193, 17, 46564, {1, 1, 1, 15, 7, 19, 63, 105, 253, 807, 1889, 2433, 1591, 16267, 11997, 18939, 113313}},
+{11194, 17, 46579, {1, 1, 5, 3, 13, 23, 29, 227, 337, 115, 783, 475, 6949, 9485, 1797, 18713, 123981}},
+{11195, 17, 46586, {1, 3, 3, 9, 21, 43, 115, 225, 147, 753, 919, 1157, 2901, 14813, 30035, 52553, 30225}},
+{11196, 17, 46602, {1, 1, 3, 15, 23, 19, 65, 83, 457, 965, 579, 2133, 291, 2033, 7533, 52995, 92243}},
+{11197, 17, 46615, {1, 1, 1, 5, 11, 3, 23, 245, 255, 373, 1119, 3695, 6449, 13497, 817, 32215, 103599}},
+{11198, 17, 46616, {1, 3, 1, 5, 5, 19, 57, 53, 145, 441, 1253, 929, 1299, 11491, 29457, 11245, 55717}},
+{11199, 17, 46621, {1, 1, 7, 13, 9, 13, 73, 85, 127, 29, 629, 409, 2487, 13079, 3767, 27985, 110139}},
+{11200, 17, 46635, {1, 1, 5, 11, 29, 39, 27, 9, 487, 623, 757, 2879, 669, 12521, 23471, 47933, 41721}},
+{11201, 17, 46643, {1, 1, 7, 15, 21, 9, 59, 39, 325, 787, 1347, 3039, 7333, 9793, 19337, 41285, 48339}},
+{11202, 17, 46645, {1, 3, 3, 11, 11, 21, 127, 45, 173, 981, 483, 3707, 3651, 10545, 16865, 62105, 114847}},
+{11203, 17, 46649, {1, 3, 5, 11, 11, 49, 89, 179, 393, 455, 1775, 1903, 8173, 12589, 17281, 57687, 56153}},
+{11204, 17, 46667, {1, 3, 1, 3, 7, 7, 59, 223, 255, 559, 375, 2427, 6921, 3709, 24767, 16213, 60373}},
+{11205, 17, 46670, {1, 1, 7, 15, 3, 31, 37, 129, 307, 1023, 1807, 519, 6779, 8997, 15383, 4391, 61161}},
+{11206, 17, 46672, {1, 1, 1, 1, 9, 25, 53, 27, 263, 459, 1015, 417, 4195, 10931, 20507, 19299, 82371}},
+{11207, 17, 46678, {1, 1, 3, 1, 7, 7, 49, 221, 47, 7, 1747, 1533, 3089, 14369, 32609, 64157, 78139}},
+{11208, 17, 46681, {1, 3, 7, 5, 5, 13, 101, 231, 227, 19, 1359, 3017, 1405, 3715, 3541, 933, 1117}},
+{11209, 17, 46684, {1, 1, 7, 15, 5, 63, 59, 253, 269, 781, 1639, 2247, 1041, 667, 7055, 21221, 84447}},
+{11210, 17, 46687, {1, 1, 7, 3, 9, 13, 115, 247, 215, 173, 457, 1125, 5613, 13171, 17847, 26323, 68461}},
+{11211, 17, 46705, {1, 3, 5, 9, 15, 19, 95, 213, 425, 567, 1625, 1659, 6961, 10569, 20985, 17255, 89919}},
+{11212, 17, 46708, {1, 3, 5, 5, 3, 11, 107, 123, 265, 743, 499, 1885, 6079, 7791, 24953, 30925, 112517}},
+{11213, 17, 46721, {1, 1, 5, 15, 29, 27, 103, 195, 119, 873, 1751, 2091, 6623, 7583, 20413, 52367, 16831}},
+{11214, 17, 46724, {1, 1, 7, 7, 21, 15, 111, 197, 89, 107, 1317, 2107, 1951, 189, 31663, 63007, 21405}},
+{11215, 17, 46739, {1, 3, 1, 13, 27, 15, 93, 251, 209, 93, 1419, 3785, 1899, 3143, 3205, 16309, 121455}},
+{11216, 17, 46757, {1, 1, 7, 7, 17, 43, 23, 251, 425, 591, 1101, 1317, 6369, 14209, 10257, 33813, 59557}},
+{11217, 17, 46762, {1, 1, 7, 3, 5, 41, 65, 59, 327, 369, 1867, 1045, 4953, 3155, 25679, 8545, 22753}},
+{11218, 17, 46764, {1, 1, 5, 3, 5, 25, 117, 97, 369, 721, 1459, 2501, 4899, 5299, 3859, 2509, 127723}},
+{11219, 17, 46776, {1, 3, 3, 1, 27, 13, 65, 185, 255, 543, 2013, 2027, 1131, 4067, 1327, 44639, 53275}},
+{11220, 17, 46784, {1, 1, 7, 3, 11, 15, 53, 67, 265, 477, 971, 3201, 51, 10599, 23691, 10493, 130347}},
+{11221, 17, 46790, {1, 3, 7, 7, 19, 35, 47, 61, 375, 547, 1867, 1147, 7775, 12757, 15101, 63243, 89817}},
+{11222, 17, 46796, {1, 1, 5, 3, 5, 21, 57, 59, 145, 901, 835, 1093, 6487, 12727, 20585, 6309, 67803}},
+{11223, 17, 46799, {1, 1, 1, 11, 13, 31, 75, 171, 189, 741, 1923, 3503, 4887, 15423, 2499, 39125, 4125}},
+{11224, 17, 46802, {1, 3, 7, 1, 29, 31, 103, 207, 383, 631, 1017, 1693, 6251, 9429, 17491, 60959, 68131}},
+{11225, 17, 46813, {1, 1, 1, 1, 19, 45, 127, 105, 451, 287, 657, 3521, 2021, 15793, 8993, 34837, 65441}},
+{11226, 17, 46814, {1, 1, 7, 9, 17, 15, 13, 189, 255, 753, 1779, 3047, 1179, 13201, 28249, 5909, 35775}},
+{11227, 17, 46824, {1, 3, 3, 3, 5, 11, 125, 207, 375, 375, 135, 2939, 1141, 12211, 727, 16137, 52253}},
+{11228, 17, 46832, {1, 3, 7, 9, 29, 3, 83, 221, 281, 299, 667, 3435, 589, 8039, 7991, 24289, 13079}},
+{11229, 17, 46841, {1, 3, 5, 13, 9, 11, 11, 99, 337, 155, 233, 2497, 3385, 15045, 5783, 40915, 19201}},
+{11230, 17, 46856, {1, 1, 7, 5, 5, 23, 25, 223, 341, 149, 505, 893, 4933, 14899, 29899, 207, 125359}},
+{11231, 17, 46862, {1, 3, 3, 15, 3, 5, 43, 165, 21, 993, 1091, 3849, 6005, 1905, 7199, 13495, 76915}},
+{11232, 17, 46864, {1, 1, 1, 15, 1, 19, 55, 217, 179, 431, 935, 2219, 8135, 15071, 17437, 43271, 115963}},
+{11233, 17, 46869, {1, 1, 7, 15, 7, 61, 45, 157, 441, 107, 1955, 2877, 5285, 12157, 21783, 60999, 102949}},
+{11234, 17, 46874, {1, 1, 1, 3, 9, 29, 41, 75, 81, 73, 1859, 2923, 3009, 10847, 30257, 44527, 21933}},
+{11235, 17, 46895, {1, 1, 3, 3, 29, 29, 103, 3, 401, 197, 237, 3727, 7919, 13669, 26869, 64987, 1581}},
+{11236, 17, 46900, {1, 1, 5, 13, 13, 47, 99, 209, 45, 745, 1239, 663, 5535, 3777, 10479, 15327, 1441}},
+{11237, 17, 46903, {1, 3, 1, 9, 1, 49, 31, 231, 15, 1001, 773, 2113, 1957, 15271, 25355, 7461, 33089}},
+{11238, 17, 46927, {1, 1, 1, 5, 13, 31, 123, 123, 439, 373, 1817, 2555, 7905, 3151, 2311, 62083, 45535}},
+{11239, 17, 46946, {1, 3, 1, 3, 31, 37, 83, 117, 177, 483, 1285, 1725, 821, 2115, 12893, 54301, 36491}},
+{11240, 17, 46948, {1, 3, 3, 3, 9, 13, 87, 7, 467, 287, 1173, 2739, 3293, 883, 9123, 30799, 110221}},
+{11241, 17, 46955, {1, 3, 1, 15, 3, 5, 119, 235, 393, 789, 67, 1193, 1613, 8607, 17371, 16723, 103747}},
+{11242, 17, 46965, {1, 3, 1, 13, 13, 47, 61, 51, 447, 1, 1221, 1619, 3785, 5851, 10557, 51181, 6535}},
+{11243, 17, 46972, {1, 3, 5, 11, 1, 1, 85, 119, 195, 177, 805, 1161, 4851, 15765, 24405, 41757, 110081}},
+{11244, 17, 46976, {1, 1, 7, 1, 17, 21, 89, 13, 59, 169, 1847, 2401, 6243, 2841, 6153, 16039, 47407}},
+{11245, 17, 46985, {1, 1, 3, 15, 21, 53, 103, 187, 143, 897, 65, 3677, 213, 4027, 22365, 53703, 82951}},
+{11246, 17, 46999, {1, 3, 5, 5, 25, 5, 39, 49, 55, 71, 825, 2123, 2345, 5683, 18027, 29897, 53023}},
+{11247, 17, 47003, {1, 1, 3, 5, 13, 55, 27, 77, 327, 429, 1219, 2103, 7095, 13461, 31027, 15383, 98485}},
+{11248, 17, 47006, {1, 3, 1, 3, 9, 41, 33, 241, 487, 229, 1743, 951, 2319, 15595, 3213, 5959, 90721}},
+{11249, 17, 47016, {1, 1, 7, 1, 29, 45, 45, 163, 123, 227, 305, 1577, 5465, 5639, 14507, 65155, 71425}},
+{11250, 17, 47030, {1, 1, 5, 1, 3, 5, 33, 15, 203, 141, 465, 3509, 6653, 14193, 7073, 22525, 22951}},
+{11251, 17, 47034, {1, 1, 7, 3, 27, 39, 3, 27, 75, 821, 1329, 3655, 4715, 7659, 31957, 60219, 79123}},
+{11252, 17, 47053, {1, 3, 5, 13, 29, 45, 111, 19, 207, 387, 87, 3731, 7427, 13351, 9497, 34285, 25623}},
+{11253, 17, 47056, {1, 1, 3, 11, 19, 39, 79, 219, 97, 125, 947, 1397, 3645, 1021, 9403, 38695, 54985}},
+{11254, 17, 47059, {1, 3, 3, 7, 3, 3, 45, 93, 65, 289, 1843, 1599, 897, 16159, 23485, 24699, 43123}},
+{11255, 17, 47072, {1, 3, 5, 3, 15, 1, 81, 219, 299, 429, 1115, 1763, 6381, 869, 7817, 143, 23583}},
+{11256, 17, 47077, {1, 1, 3, 5, 1, 35, 95, 147, 425, 1011, 1039, 2875, 3089, 3685, 9995, 13279, 60923}},
+{11257, 17, 47099, {1, 1, 5, 7, 5, 59, 105, 241, 151, 307, 735, 1541, 3115, 12331, 19535, 56965, 127015}},
+{11258, 17, 47105, {1, 3, 5, 7, 5, 33, 83, 179, 65, 397, 787, 3425, 1305, 10713, 6973, 9007, 112081}},
+{11259, 17, 47108, {1, 3, 7, 13, 29, 11, 37, 31, 271, 501, 897, 1383, 5333, 13627, 22091, 38421, 94575}},
+{11260, 17, 47112, {1, 3, 1, 1, 9, 61, 87, 115, 13, 79, 391, 2385, 7157, 3369, 26035, 883, 34705}},
+{11261, 17, 47115, {1, 1, 3, 9, 21, 29, 15, 165, 53, 719, 1509, 1295, 4437, 8229, 17961, 55297, 62635}},
+{11262, 17, 47117, {1, 1, 7, 5, 27, 21, 23, 141, 341, 423, 9, 2693, 5555, 5797, 13179, 1107, 33489}},
+{11263, 17, 47120, {1, 3, 1, 13, 27, 33, 101, 29, 379, 119, 1259, 861, 6843, 69, 3253, 61977, 80061}},
+{11264, 17, 47129, {1, 1, 3, 11, 1, 37, 35, 43, 105, 655, 221, 873, 91, 9095, 8999, 44033, 24807}},
+{11265, 17, 47135, {1, 3, 3, 7, 29, 15, 23, 227, 399, 305, 2007, 747, 2717, 14767, 6515, 40617, 7873}},
+{11266, 17, 47151, {1, 1, 5, 15, 21, 43, 39, 7, 261, 421, 505, 1433, 1155, 5621, 2337, 54027, 54039}},
+{11267, 17, 47154, {1, 1, 1, 9, 15, 39, 49, 185, 503, 895, 1321, 375, 4245, 4929, 9637, 50561, 65733}},
+{11268, 17, 47156, {1, 1, 5, 15, 7, 29, 27, 155, 423, 631, 1295, 973, 4227, 2637, 8479, 29527, 70505}},
+{11269, 17, 47166, {1, 3, 1, 3, 31, 33, 13, 67, 195, 335, 1577, 3715, 559, 7251, 7215, 46443, 125359}},
+{11270, 17, 47171, {1, 3, 1, 9, 17, 37, 15, 119, 79, 851, 911, 3549, 99, 9221, 29897, 63489, 34937}},
+{11271, 17, 47195, {1, 3, 5, 9, 31, 11, 125, 1, 265, 467, 835, 2997, 2401, 9615, 19397, 50947, 29963}},
+{11272, 17, 47204, {1, 1, 5, 3, 11, 21, 63, 15, 471, 763, 1963, 2815, 4419, 11457, 7151, 27009, 124847}},
+{11273, 17, 47213, {1, 1, 7, 3, 19, 9, 97, 59, 375, 109, 519, 305, 2787, 3001, 14199, 27415, 35403}},
+{11274, 17, 47222, {1, 1, 1, 3, 13, 47, 3, 93, 307, 979, 419, 2817, 3741, 305, 1813, 34549, 116959}},
+{11275, 17, 47228, {1, 3, 5, 13, 13, 19, 35, 231, 493, 973, 895, 1583, 1843, 9057, 27705, 32333, 130347}},
+{11276, 17, 47241, {1, 1, 1, 13, 31, 35, 81, 11, 363, 229, 1865, 2849, 7805, 877, 3965, 45337, 33239}},
+{11277, 17, 47242, {1, 3, 5, 1, 15, 3, 125, 93, 191, 405, 1359, 929, 3085, 7907, 7777, 7815, 103717}},
+{11278, 17, 47247, {1, 1, 3, 7, 15, 33, 61, 235, 283, 141, 817, 1611, 665, 13113, 4197, 45831, 44505}},
+{11279, 17, 47249, {1, 1, 5, 5, 25, 3, 63, 159, 223, 531, 1147, 2323, 2715, 10319, 32203, 23943, 95407}},
+{11280, 17, 47250, {1, 3, 3, 3, 3, 33, 37, 99, 317, 811, 515, 339, 6527, 11149, 13071, 7177, 1549}},
+{11281, 17, 47261, {1, 3, 1, 11, 31, 53, 9, 17, 297, 259, 1235, 53, 7065, 1721, 8191, 21663, 13393}},
+{11282, 17, 47266, {1, 3, 7, 7, 29, 41, 127, 179, 113, 191, 783, 861, 6509, 5199, 3369, 18327, 30647}},
+{11283, 17, 47268, {1, 3, 1, 7, 23, 41, 49, 155, 135, 513, 1127, 1443, 8081, 2553, 10389, 35459, 122513}},
+{11284, 17, 47278, {1, 1, 7, 3, 25, 3, 117, 125, 283, 165, 1409, 1587, 7915, 12899, 12239, 48161, 7385}},
+{11285, 17, 47286, {1, 3, 7, 3, 23, 19, 29, 47, 7, 723, 455, 4013, 2739, 12303, 29883, 51485, 1571}},
+{11286, 17, 47312, {1, 1, 1, 11, 1, 31, 111, 199, 207, 209, 1163, 2865, 5335, 2647, 9125, 6737, 99881}},
+{11287, 17, 47315, {1, 3, 1, 11, 31, 19, 59, 153, 65, 133, 1399, 2709, 905, 3257, 13603, 46299, 15139}},
+{11288, 17, 47321, {1, 3, 1, 1, 23, 19, 123, 115, 59, 667, 333, 2461, 1843, 16049, 12353, 17297, 107779}},
+{11289, 17, 47322, {1, 1, 5, 1, 5, 29, 91, 241, 97, 557, 1701, 2441, 2995, 13103, 9261, 55833, 843}},
+{11290, 17, 47324, {1, 1, 1, 5, 15, 19, 23, 189, 69, 91, 427, 3149, 5199, 13073, 32273, 41503, 98749}},
+{11291, 17, 47331, {1, 3, 5, 11, 19, 3, 71, 125, 307, 241, 861, 681, 5657, 5189, 7555, 2037, 72921}},
+{11292, 17, 47338, {1, 1, 5, 5, 29, 61, 93, 61, 421, 685, 883, 1559, 5875, 10561, 11761, 18879, 31577}},
+{11293, 17, 47366, {1, 3, 7, 15, 9, 29, 41, 241, 365, 941, 1087, 3743, 6781, 9467, 1409, 20605, 2361}},
+{11294, 17, 47372, {1, 1, 5, 13, 25, 29, 7, 21, 41, 621, 1751, 3731, 2667, 8613, 20999, 3851, 39677}},
+{11295, 17, 47375, {1, 1, 7, 5, 17, 23, 25, 43, 401, 749, 975, 91, 5277, 2711, 19847, 41419, 11851}},
+{11296, 17, 47378, {1, 1, 7, 9, 13, 37, 113, 89, 435, 749, 1553, 1853, 7709, 5449, 25055, 45207, 2269}},
+{11297, 17, 47387, {1, 3, 1, 11, 3, 59, 79, 13, 35, 901, 165, 907, 7579, 12739, 24679, 54163, 61059}},
+{11298, 17, 47389, {1, 1, 5, 7, 9, 47, 101, 61, 25, 461, 1737, 2825, 4439, 5363, 28433, 61979, 120401}},
+{11299, 17, 47390, {1, 3, 3, 3, 1, 55, 103, 1, 449, 473, 375, 2609, 4933, 3411, 19663, 6067, 61129}},
+{11300, 17, 47396, {1, 1, 3, 9, 27, 29, 53, 151, 391, 507, 425, 3469, 6605, 5783, 31747, 37677, 116037}},
+{11301, 17, 47400, {1, 1, 1, 5, 5, 43, 61, 67, 319, 553, 1163, 3095, 4447, 7505, 15617, 26167, 11145}},
+{11302, 17, 47405, {1, 1, 5, 7, 3, 3, 9, 161, 155, 869, 337, 3693, 6847, 8449, 15077, 54769, 123335}},
+{11303, 17, 47408, {1, 3, 3, 7, 11, 19, 17, 71, 105, 649, 323, 3033, 1695, 15973, 6361, 3163, 17669}},
+{11304, 17, 47411, {1, 3, 7, 13, 13, 9, 3, 251, 149, 513, 637, 2211, 6397, 1741, 8547, 3165, 38241}},
+{11305, 17, 47431, {1, 1, 5, 5, 1, 57, 73, 35, 287, 347, 221, 3261, 7693, 5443, 6175, 18181, 23733}},
+{11306, 17, 47443, {1, 3, 7, 5, 5, 19, 1, 167, 5, 825, 815, 1369, 7657, 6169, 9583, 34761, 81003}},
+{11307, 17, 47459, {1, 3, 3, 5, 15, 17, 23, 157, 475, 297, 1495, 811, 8135, 11453, 9683, 55505, 84361}},
+{11308, 17, 47466, {1, 1, 1, 11, 1, 63, 59, 189, 205, 1023, 1065, 1095, 2293, 14629, 29399, 2925, 28327}},
+{11309, 17, 47479, {1, 3, 1, 3, 31, 33, 85, 183, 383, 731, 1223, 3353, 3703, 5655, 31265, 12249, 22127}},
+{11310, 17, 47480, {1, 3, 5, 7, 7, 29, 61, 3, 375, 95, 1815, 4065, 6287, 3797, 32397, 50581, 123371}},
+{11311, 17, 47495, {1, 3, 1, 9, 13, 37, 57, 139, 43, 561, 425, 3603, 1167, 10281, 31825, 32673, 106169}},
+{11312, 17, 47504, {1, 3, 5, 3, 15, 41, 29, 223, 79, 851, 1741, 2241, 5659, 9773, 18369, 37239, 14831}},
+{11313, 17, 47519, {1, 3, 1, 1, 7, 11, 83, 63, 51, 521, 1911, 475, 5207, 3219, 10257, 40461, 9087}},
+{11314, 17, 47520, {1, 3, 5, 7, 23, 17, 97, 195, 5, 451, 1971, 1881, 921, 8729, 3443, 64529, 67747}},
+{11315, 17, 47530, {1, 1, 3, 9, 21, 63, 45, 181, 429, 605, 169, 3493, 2381, 2887, 19515, 53151, 60147}},
+{11316, 17, 47537, {1, 3, 3, 7, 15, 11, 117, 161, 333, 139, 587, 2331, 3175, 12093, 12649, 52381, 107117}},
+{11317, 17, 47555, {1, 1, 5, 15, 23, 57, 19, 57, 507, 461, 799, 611, 1589, 10909, 7649, 17817, 24677}},
+{11318, 17, 47558, {1, 1, 3, 15, 1, 61, 9, 201, 401, 387, 527, 2855, 2339, 3813, 11825, 14273, 73745}},
+{11319, 17, 47567, {1, 3, 1, 5, 1, 37, 27, 105, 475, 335, 1169, 3233, 3225, 12861, 10133, 36673, 55025}},
+{11320, 17, 47569, {1, 1, 1, 9, 27, 53, 55, 197, 229, 5, 93, 1157, 7929, 9745, 5295, 15359, 75567}},
+{11321, 17, 47572, {1, 1, 7, 5, 11, 3, 109, 81, 457, 159, 1899, 557, 1067, 295, 2661, 1145, 8745}},
+{11322, 17, 47582, {1, 1, 1, 15, 31, 29, 77, 171, 411, 425, 1041, 2791, 2567, 5357, 21871, 27689, 103485}},
+{11323, 17, 47591, {1, 3, 5, 11, 19, 47, 23, 97, 405, 667, 2045, 2951, 2063, 7775, 20629, 34283, 26925}},
+{11324, 17, 47595, {1, 3, 5, 7, 5, 51, 125, 67, 165, 145, 733, 1649, 5787, 4333, 24355, 33397, 101001}},
+{11325, 17, 47598, {1, 3, 7, 11, 13, 7, 117, 147, 449, 201, 953, 553, 1839, 6903, 10417, 42751, 36823}},
+{11326, 17, 47609, {1, 1, 3, 5, 3, 21, 109, 35, 95, 953, 211, 2849, 5681, 16287, 16553, 30345, 69729}},
+{11327, 17, 47612, {1, 3, 7, 5, 25, 37, 21, 143, 317, 621, 1417, 283, 3801, 15375, 3799, 13345, 59727}},
+{11328, 17, 47616, {1, 3, 3, 9, 3, 37, 113, 127, 123, 979, 1225, 2585, 2055, 2571, 16727, 38863, 74347}},
+{11329, 17, 47625, {1, 3, 3, 3, 23, 13, 49, 111, 277, 143, 1171, 605, 91, 13693, 1971, 18209, 114203}},
+{11330, 17, 47640, {1, 1, 1, 9, 27, 33, 73, 9, 93, 343, 55, 3045, 2029, 3665, 28483, 6601, 72085}},
+{11331, 17, 47649, {1, 1, 1, 15, 17, 55, 87, 231, 103, 1005, 1451, 3617, 7477, 2045, 10683, 39053, 1289}},
+{11332, 17, 47655, {1, 3, 7, 7, 25, 55, 39, 89, 489, 609, 1969, 159, 7485, 10713, 28371, 14935, 95347}},
+{11333, 17, 47661, {1, 3, 3, 13, 25, 9, 83, 167, 25, 135, 2017, 3313, 1493, 7799, 22479, 49471, 20149}},
+{11334, 17, 47688, {1, 1, 1, 15, 25, 13, 63, 117, 97, 449, 1331, 229, 6027, 1023, 26705, 15283, 60385}},
+{11335, 17, 47711, {1, 1, 7, 5, 5, 37, 3, 79, 337, 861, 1549, 915, 7303, 1503, 19245, 60721, 45313}},
+{11336, 17, 47717, {1, 3, 7, 15, 19, 1, 11, 39, 505, 757, 1627, 2137, 3209, 7651, 31291, 45913, 26851}},
+{11337, 17, 47721, {1, 3, 1, 5, 25, 21, 85, 233, 171, 269, 367, 1651, 3961, 2487, 1977, 7027, 2725}},
+{11338, 17, 47724, {1, 1, 5, 15, 13, 23, 81, 145, 201, 323, 425, 2785, 1149, 12617, 11451, 23205, 117691}},
+{11339, 17, 47727, {1, 1, 7, 11, 29, 37, 69, 141, 15, 773, 1299, 2147, 8129, 12227, 27811, 58701, 103637}},
+{11340, 17, 47730, {1, 3, 5, 13, 3, 33, 29, 227, 261, 221, 823, 1399, 5107, 2423, 23809, 42175, 28207}},
+{11341, 17, 47739, {1, 3, 1, 15, 21, 1, 121, 255, 259, 441, 45, 1899, 2489, 4155, 18317, 52695, 607}},
+{11342, 17, 47745, {1, 3, 5, 9, 25, 43, 115, 111, 329, 997, 753, 1513, 6949, 3197, 28275, 48855, 25089}},
+{11343, 17, 47752, {1, 3, 3, 3, 25, 9, 21, 213, 111, 173, 913, 1465, 4437, 9725, 1455, 53517, 81843}},
+{11344, 17, 47758, {1, 3, 5, 5, 5, 25, 3, 159, 19, 203, 181, 3447, 6395, 2145, 11289, 16797, 59567}},
+{11345, 17, 47765, {1, 3, 3, 1, 29, 25, 43, 115, 257, 833, 379, 941, 4389, 5795, 12593, 2471, 127149}},
+{11346, 17, 47770, {1, 3, 1, 9, 3, 15, 81, 141, 155, 515, 1677, 2569, 1105, 15653, 24143, 3439, 17317}},
+{11347, 17, 47782, {1, 3, 1, 13, 27, 13, 103, 87, 27, 971, 671, 629, 4943, 13897, 4003, 21507, 40193}},
+{11348, 17, 47786, {1, 3, 5, 9, 1, 49, 11, 15, 511, 837, 1953, 1585, 1867, 9095, 543, 16993, 115187}},
+{11349, 17, 47791, {1, 1, 5, 11, 21, 49, 37, 61, 9, 629, 1025, 1635, 4047, 15491, 28481, 43235, 53165}},
+{11350, 17, 47793, {1, 1, 5, 7, 15, 57, 121, 119, 405, 29, 655, 3085, 7131, 14761, 2273, 47113, 8603}},
+{11351, 17, 47796, {1, 1, 3, 3, 11, 45, 51, 107, 367, 235, 675, 3777, 6081, 16319, 19499, 36893, 25579}},
+{11352, 17, 47814, {1, 1, 7, 11, 1, 13, 43, 159, 415, 423, 1223, 2201, 1089, 10189, 12457, 26691, 3603}},
+{11353, 17, 47823, {1, 1, 3, 3, 3, 37, 109, 67, 487, 785, 637, 3931, 929, 14153, 25283, 483, 14371}},
+{11354, 17, 47826, {1, 1, 7, 9, 31, 59, 9, 245, 479, 113, 1419, 3265, 8131, 11123, 32519, 12141, 82059}},
+{11355, 17, 47837, {1, 1, 1, 7, 25, 25, 31, 13, 81, 217, 997, 1161, 1049, 5487, 8487, 57807, 126115}},
+{11356, 17, 47854, {1, 1, 3, 15, 1, 23, 63, 39, 503, 933, 1915, 687, 547, 779, 7689, 38607, 125229}},
+{11357, 17, 47856, {1, 1, 3, 3, 31, 49, 51, 87, 99, 327, 783, 3487, 7307, 2759, 22781, 56343, 126805}},
+{11358, 17, 47871, {1, 3, 3, 11, 27, 43, 99, 197, 275, 19, 775, 329, 3815, 14277, 3363, 26375, 75427}},
+{11359, 17, 47879, {1, 1, 5, 15, 15, 19, 65, 109, 103, 411, 1591, 2569, 1981, 4773, 7861, 6303, 127421}},
+{11360, 17, 47880, {1, 3, 1, 13, 1, 53, 107, 151, 317, 201, 1053, 2701, 5039, 2179, 10085, 31727, 85579}},
+{11361, 17, 47885, {1, 3, 1, 9, 5, 55, 71, 143, 187, 29, 1363, 2403, 2675, 2187, 12123, 32825, 56461}},
+{11362, 17, 47886, {1, 1, 7, 11, 5, 57, 91, 95, 85, 597, 925, 11, 1915, 9159, 9997, 29565, 111655}},
+{11363, 17, 47903, {1, 1, 5, 9, 25, 57, 79, 189, 205, 687, 471, 601, 5343, 9031, 7853, 6079, 40567}},
+{11364, 17, 47907, {1, 1, 3, 1, 31, 53, 67, 191, 511, 369, 1273, 3859, 4253, 14469, 3427, 17691, 22599}},
+{11365, 17, 47913, {1, 1, 3, 9, 17, 53, 101, 219, 41, 663, 635, 3889, 2197, 8125, 8313, 14957, 111445}},
+{11366, 17, 47916, {1, 1, 5, 5, 7, 49, 113, 9, 399, 257, 617, 63, 2773, 4411, 1193, 54449, 89003}},
+{11367, 17, 47928, {1, 1, 7, 11, 13, 29, 77, 73, 161, 419, 985, 303, 2237, 15217, 26621, 20441, 113955}},
+{11368, 17, 47936, {1, 3, 3, 9, 17, 39, 37, 139, 289, 421, 1021, 2635, 2805, 5815, 9101, 48077, 114009}},
+{11369, 17, 47945, {1, 1, 1, 15, 25, 43, 71, 35, 103, 827, 1301, 3567, 3425, 3689, 14453, 10733, 81257}},
+{11370, 17, 47948, {1, 3, 5, 5, 15, 31, 41, 161, 481, 231, 1135, 3045, 439, 11785, 14863, 39729, 59539}},
+{11371, 17, 47956, {1, 1, 5, 7, 27, 9, 81, 141, 395, 105, 41, 3719, 3105, 13685, 7451, 31381, 82907}},
+{11372, 17, 47965, {1, 3, 1, 13, 15, 25, 127, 231, 433, 837, 1923, 1301, 2479, 3243, 21605, 55789, 11311}},
+{11373, 17, 47970, {1, 3, 5, 7, 17, 5, 27, 111, 217, 445, 1245, 1029, 7663, 10291, 16483, 37503, 110205}},
+{11374, 17, 47972, {1, 1, 1, 7, 31, 21, 51, 235, 487, 457, 1687, 2947, 5067, 13779, 7671, 7257, 119141}},
+{11375, 17, 47981, {1, 1, 5, 13, 25, 31, 59, 183, 33, 887, 469, 813, 7939, 11775, 5795, 26227, 57703}},
+{11376, 17, 47987, {1, 3, 3, 15, 17, 7, 19, 87, 365, 177, 1157, 1023, 3055, 15439, 27187, 32593, 112507}},
+{11377, 17, 48010, {1, 1, 1, 9, 19, 49, 103, 239, 207, 409, 1613, 2793, 5477, 11221, 21611, 19963, 99333}},
+{11378, 17, 48012, {1, 3, 3, 11, 17, 1, 103, 77, 93, 197, 1883, 4053, 4613, 11571, 1841, 23189, 4235}},
+{11379, 17, 48023, {1, 3, 5, 9, 9, 49, 29, 231, 167, 593, 1909, 2457, 323, 10549, 6551, 45597, 96591}},
+{11380, 17, 48033, {1, 1, 7, 11, 15, 39, 33, 61, 13, 879, 1589, 2169, 125, 2427, 13029, 24919, 14147}},
+{11381, 17, 48051, {1, 3, 5, 5, 25, 53, 49, 255, 263, 917, 1997, 171, 2945, 14243, 12983, 21821, 119547}},
+{11382, 17, 48071, {1, 1, 1, 15, 5, 25, 113, 235, 311, 377, 1059, 1365, 3457, 8699, 18617, 25119, 110659}},
+{11383, 17, 48075, {1, 1, 5, 1, 9, 61, 1, 137, 301, 85, 1527, 3831, 923, 13753, 20909, 14007, 22939}},
+{11384, 17, 48077, {1, 1, 7, 9, 23, 17, 31, 107, 55, 293, 425, 3513, 3503, 10075, 6299, 40007, 54355}},
+{11385, 17, 48080, {1, 3, 5, 5, 27, 39, 95, 187, 239, 949, 531, 3541, 99, 6339, 32295, 10377, 111287}},
+{11386, 17, 48099, {1, 1, 5, 15, 19, 39, 23, 89, 185, 47, 87, 1721, 2471, 13221, 13201, 31, 12897}},
+{11387, 17, 48106, {1, 3, 1, 9, 7, 7, 109, 241, 39, 687, 175, 139, 583, 1629, 19775, 6371, 121879}},
+{11388, 17, 48114, {1, 1, 1, 13, 13, 9, 73, 153, 367, 425, 217, 3981, 5203, 1111, 12333, 59799, 105259}},
+{11389, 17, 48120, {1, 1, 3, 5, 7, 33, 27, 123, 335, 727, 1619, 3999, 7799, 2807, 2251, 45835, 113193}},
+{11390, 17, 48128, {1, 3, 1, 7, 25, 3, 49, 163, 447, 555, 647, 1461, 5881, 15755, 32233, 48915, 96203}},
+{11391, 17, 48145, {1, 3, 7, 7, 21, 11, 61, 101, 323, 165, 1489, 2933, 3363, 8471, 4311, 65279, 123813}},
+{11392, 17, 48152, {1, 3, 1, 1, 15, 1, 101, 225, 473, 479, 1237, 113, 7591, 2883, 3891, 53703, 14607}},
+{11393, 17, 48155, {1, 3, 5, 3, 17, 51, 23, 31, 487, 957, 1623, 2329, 2801, 6213, 7523, 14131, 23893}},
+{11394, 17, 48182, {1, 1, 5, 7, 9, 39, 93, 105, 13, 481, 53, 3785, 5621, 11889, 993, 23611, 73651}},
+{11395, 17, 48188, {1, 3, 7, 15, 21, 57, 97, 69, 339, 289, 1805, 2661, 1165, 6079, 1127, 51285, 54453}},
+{11396, 17, 48203, {1, 1, 3, 3, 3, 3, 1, 179, 123, 1011, 1363, 231, 6983, 9499, 91, 52573, 32565}},
+{11397, 17, 48217, {1, 3, 3, 15, 5, 37, 97, 7, 189, 547, 1965, 3821, 4907, 8181, 12857, 7907, 19361}},
+{11398, 17, 48218, {1, 1, 5, 3, 29, 33, 45, 99, 359, 337, 1377, 577, 3117, 9545, 30093, 26147, 128509}},
+{11399, 17, 48236, {1, 3, 5, 11, 7, 49, 99, 249, 37, 755, 383, 2845, 4153, 695, 11099, 33653, 105155}},
+{11400, 17, 48241, {1, 3, 1, 1, 19, 3, 3, 177, 97, 323, 1367, 213, 4391, 11223, 26497, 12289, 39047}},
+{11401, 17, 48244, {1, 1, 3, 7, 3, 33, 73, 199, 339, 479, 1797, 3905, 2849, 5667, 18015, 36653, 83491}},
+{11402, 17, 48264, {1, 1, 5, 3, 27, 59, 27, 241, 49, 161, 451, 3993, 2489, 10681, 11895, 60405, 47021}},
+{11403, 17, 48269, {1, 1, 7, 5, 9, 23, 115, 131, 383, 895, 1591, 585, 2571, 7485, 31535, 12871, 95717}},
+{11404, 17, 48278, {1, 1, 1, 15, 13, 49, 3, 157, 311, 159, 1239, 159, 5643, 6405, 11763, 34609, 75259}},
+{11405, 17, 48282, {1, 1, 1, 13, 11, 41, 119, 3, 165, 943, 2035, 179, 357, 14591, 20099, 4787, 12659}},
+{11406, 17, 48288, {1, 1, 5, 11, 13, 9, 67, 139, 259, 947, 1559, 283, 1557, 11297, 29753, 21953, 100317}},
+{11407, 17, 48311, {1, 1, 7, 11, 13, 39, 105, 83, 109, 723, 1643, 3599, 1471, 13653, 4583, 18595, 91935}},
+{11408, 17, 48315, {1, 1, 5, 9, 25, 5, 69, 189, 209, 779, 1421, 467, 849, 12887, 10317, 3005, 100813}},
+{11409, 17, 48317, {1, 3, 7, 11, 19, 1, 93, 239, 333, 713, 1525, 813, 5913, 10811, 7077, 20573, 86999}},
+{11410, 17, 48329, {1, 3, 1, 5, 25, 1, 107, 153, 225, 889, 1319, 497, 2193, 11511, 17553, 23733, 83179}},
+{11411, 17, 48330, {1, 3, 3, 3, 5, 45, 51, 37, 443, 851, 263, 4067, 2629, 10887, 29081, 30489, 1161}},
+{11412, 17, 48337, {1, 1, 3, 9, 25, 19, 115, 31, 347, 641, 1103, 1121, 7051, 14071, 16663, 48517, 24655}},
+{11413, 17, 48350, {1, 1, 3, 15, 11, 33, 123, 181, 225, 437, 875, 1997, 209, 5487, 1989, 6745, 38423}},
+{11414, 17, 48353, {1, 3, 7, 5, 27, 5, 105, 203, 51, 683, 1523, 347, 6881, 4353, 4531, 29589, 108053}},
+{11415, 17, 48360, {1, 1, 3, 9, 15, 33, 127, 145, 125, 429, 915, 1307, 1495, 3553, 26797, 36819, 121375}},
+{11416, 17, 48374, {1, 3, 5, 15, 7, 1, 55, 99, 7, 405, 885, 59, 5359, 13969, 32037, 53399, 77293}},
+{11417, 17, 48380, {1, 1, 7, 1, 29, 31, 89, 69, 405, 837, 1949, 2337, 1139, 14129, 16867, 15167, 21117}},
+{11418, 17, 48405, {1, 1, 3, 5, 3, 25, 61, 175, 135, 109, 959, 501, 13, 16057, 25031, 16321, 27617}},
+{11419, 17, 48406, {1, 3, 1, 5, 17, 39, 59, 113, 25, 707, 1641, 3489, 6193, 10085, 13837, 57851, 77475}},
+{11420, 17, 48409, {1, 1, 3, 5, 17, 35, 111, 163, 253, 641, 715, 1101, 4411, 10771, 20241, 46415, 114719}},
+{11421, 17, 48412, {1, 3, 1, 1, 7, 11, 77, 59, 71, 869, 1505, 751, 4367, 9603, 29735, 7333, 62487}},
+{11422, 17, 48416, {1, 3, 7, 9, 3, 51, 93, 195, 497, 659, 1563, 3801, 6933, 9089, 10891, 9853, 93611}},
+{11423, 17, 48419, {1, 3, 1, 7, 21, 47, 61, 117, 293, 281, 1547, 3437, 4947, 12119, 21425, 5591, 23951}},
+{11424, 17, 48425, {1, 1, 7, 13, 19, 59, 121, 249, 147, 759, 1963, 465, 7785, 7015, 81, 47869, 123845}},
+{11425, 17, 48434, {1, 1, 7, 13, 5, 35, 45, 69, 167, 263, 979, 2855, 1845, 5531, 17167, 7363, 89233}},
+{11426, 17, 48443, {1, 3, 3, 3, 17, 43, 109, 193, 389, 867, 1403, 1271, 7127, 13977, 22547, 53997, 24475}},
+{11427, 17, 48445, {1, 1, 1, 5, 25, 43, 47, 163, 417, 967, 819, 2433, 439, 8499, 29705, 32697, 109963}},
+{11428, 17, 48453, {1, 1, 1, 15, 19, 5, 83, 237, 431, 697, 1383, 2499, 6907, 9033, 12147, 23479, 17649}},
+{11429, 17, 48454, {1, 3, 5, 13, 27, 35, 103, 95, 239, 903, 537, 601, 417, 15859, 16533, 16753, 128229}},
+{11430, 17, 48482, {1, 1, 3, 1, 11, 55, 57, 9, 229, 135, 805, 2745, 2023, 12645, 29135, 39051, 17065}},
+{11431, 17, 48491, {1, 3, 5, 3, 13, 25, 77, 29, 449, 31, 1733, 1451, 3895, 11551, 1011, 22817, 35959}},
+{11432, 17, 48501, {1, 3, 3, 3, 1, 31, 93, 47, 255, 393, 571, 443, 6079, 6245, 11773, 42087, 40651}},
+{11433, 17, 48517, {1, 3, 1, 5, 17, 49, 119, 219, 375, 337, 29, 3409, 3187, 15243, 25853, 44385, 103675}},
+{11434, 17, 48518, {1, 3, 7, 15, 15, 21, 79, 109, 81, 119, 603, 1665, 7813, 3485, 11801, 48693, 108307}},
+{11435, 17, 48545, {1, 1, 1, 15, 9, 5, 103, 141, 181, 841, 7, 1217, 7713, 4843, 9089, 53641, 3029}},
+{11436, 17, 48548, {1, 3, 3, 1, 29, 47, 13, 179, 439, 387, 1553, 3141, 947, 4893, 29119, 30865, 14207}},
+{11437, 17, 48552, {1, 1, 1, 15, 29, 1, 41, 135, 43, 673, 1527, 883, 3211, 5195, 30219, 47133, 56819}},
+{11438, 17, 48569, {1, 3, 5, 13, 13, 47, 97, 219, 277, 397, 1901, 821, 1961, 705, 7291, 19435, 123563}},
+{11439, 17, 48575, {1, 1, 7, 15, 5, 49, 93, 59, 221, 205, 115, 559, 5633, 5819, 6923, 18301, 72639}},
+{11440, 17, 48580, {1, 3, 5, 13, 29, 49, 25, 203, 125, 385, 487, 1897, 2177, 6859, 6105, 763, 36673}},
+{11441, 17, 48584, {1, 3, 3, 9, 23, 63, 9, 115, 489, 89, 1113, 1351, 8181, 2569, 18263, 32619, 24795}},
+{11442, 17, 48590, {1, 1, 5, 11, 25, 51, 97, 155, 15, 139, 1275, 3479, 5851, 3099, 7417, 57155, 90185}},
+{11443, 17, 48595, {1, 3, 1, 11, 1, 37, 67, 221, 493, 475, 1881, 2277, 4365, 9411, 16629, 65229, 28803}},
+{11444, 17, 48602, {1, 3, 1, 1, 15, 53, 39, 141, 453, 151, 335, 795, 1515, 2719, 24197, 21153, 129549}},
+{11445, 17, 48604, {1, 1, 1, 7, 19, 31, 59, 123, 73, 149, 469, 1199, 3603, 1539, 29157, 50031, 22109}},
+{11446, 17, 48618, {1, 1, 3, 15, 23, 51, 45, 211, 423, 553, 1289, 1125, 6347, 6711, 23761, 14109, 17261}},
+{11447, 17, 48625, {1, 3, 5, 13, 5, 7, 35, 185, 263, 791, 161, 325, 4771, 11913, 31595, 56675, 68615}},
+{11448, 17, 48626, {1, 1, 5, 9, 19, 27, 89, 147, 55, 197, 1695, 99, 755, 15115, 1933, 41439, 85063}},
+{11449, 17, 48638, {1, 1, 7, 7, 17, 11, 103, 55, 281, 707, 1973, 2055, 5015, 5713, 3717, 44149, 8033}},
+{11450, 17, 48668, {1, 3, 1, 5, 21, 49, 55, 93, 161, 565, 81, 3241, 3709, 8185, 16935, 60369, 118127}},
+{11451, 17, 48677, {1, 3, 7, 9, 27, 1, 105, 133, 397, 351, 1021, 739, 161, 9971, 24733, 29239, 68853}},
+{11452, 17, 48678, {1, 1, 7, 1, 1, 19, 97, 243, 73, 969, 313, 399, 2955, 2467, 18265, 60637, 35457}},
+{11453, 17, 48687, {1, 3, 1, 11, 29, 25, 35, 35, 469, 143, 1195, 911, 1023, 14685, 10933, 16449, 102113}},
+{11454, 17, 48692, {1, 1, 5, 3, 31, 21, 65, 181, 13, 235, 501, 3621, 3567, 8771, 32747, 59231, 91551}},
+{11455, 17, 48696, {1, 1, 1, 13, 29, 21, 13, 33, 193, 565, 203, 3927, 4749, 9897, 26109, 14221, 27733}},
+{11456, 17, 48704, {1, 1, 1, 5, 29, 41, 7, 125, 391, 295, 533, 2135, 3107, 7711, 27811, 55767, 78821}},
+{11457, 17, 48707, {1, 1, 7, 3, 19, 25, 117, 195, 155, 685, 147, 2049, 3751, 4585, 24893, 36895, 80371}},
+{11458, 17, 48714, {1, 3, 5, 5, 23, 41, 9, 125, 315, 809, 1019, 1453, 4605, 13753, 30641, 50677, 94781}},
+{11459, 17, 48731, {1, 1, 1, 7, 27, 45, 103, 199, 37, 291, 651, 185, 6715, 15387, 30873, 63051, 123231}},
+{11460, 17, 48740, {1, 1, 5, 7, 17, 5, 75, 129, 401, 107, 1681, 2039, 299, 12399, 30947, 26327, 91589}},
+{11461, 17, 48750, {1, 3, 3, 15, 17, 19, 109, 19, 493, 797, 209, 929, 2821, 395, 22173, 27803, 87953}},
+{11462, 17, 48761, {1, 3, 7, 5, 7, 5, 71, 159, 483, 389, 1817, 4093, 963, 4253, 31267, 63919, 62113}},
+{11463, 17, 48785, {1, 3, 3, 15, 9, 49, 89, 49, 15, 61, 2041, 2357, 2173, 3349, 32565, 23207, 21177}},
+{11464, 17, 48786, {1, 1, 1, 13, 15, 21, 31, 143, 387, 371, 567, 1903, 3793, 9559, 7055, 31251, 13663}},
+{11465, 17, 48798, {1, 1, 3, 13, 3, 7, 49, 31, 255, 581, 627, 1947, 2965, 2787, 8275, 59785, 19979}},
+{11466, 17, 48807, {1, 3, 3, 13, 29, 47, 53, 133, 301, 253, 1215, 3409, 5745, 247, 31585, 5555, 31011}},
+{11467, 17, 48808, {1, 3, 7, 15, 23, 49, 1, 89, 141, 423, 707, 645, 7955, 10485, 27223, 35867, 45461}},
+{11468, 17, 48814, {1, 1, 3, 3, 29, 25, 123, 63, 197, 429, 169, 3229, 3797, 4029, 29947, 52781, 16065}},
+{11469, 17, 48826, {1, 3, 3, 7, 29, 17, 83, 95, 199, 253, 133, 265, 6723, 6207, 12863, 61311, 21937}},
+{11470, 17, 48828, {1, 3, 7, 13, 19, 61, 89, 151, 249, 597, 1389, 717, 5111, 3285, 6251, 50237, 108703}},
+{11471, 17, 48834, {1, 3, 5, 11, 1, 23, 35, 61, 143, 45, 625, 1693, 4943, 2213, 9317, 7601, 28359}},
+{11472, 17, 48840, {1, 3, 3, 15, 29, 43, 115, 23, 167, 355, 977, 439, 4767, 9967, 22997, 54725, 125637}},
+{11473, 17, 48845, {1, 3, 7, 1, 29, 45, 83, 71, 395, 247, 1, 113, 6393, 12445, 16137, 35125, 102053}},
+{11474, 17, 48858, {1, 1, 1, 7, 17, 55, 17, 159, 33, 237, 207, 1297, 5611, 6023, 17709, 60905, 3533}},
+{11475, 17, 48864, {1, 3, 1, 13, 27, 57, 27, 235, 141, 917, 1655, 659, 939, 559, 2651, 705, 80141}},
+{11476, 17, 48869, {1, 3, 7, 3, 3, 17, 111, 117, 467, 129, 1105, 3457, 2093, 8513, 19941, 22111, 54597}},
+{11477, 17, 48870, {1, 3, 7, 3, 5, 17, 59, 195, 23, 547, 1799, 1427, 391, 4043, 10407, 31055, 38495}},
+{11478, 17, 48879, {1, 1, 1, 7, 21, 9, 71, 33, 209, 773, 1243, 3239, 3763, 15229, 9609, 24395, 56145}},
+{11479, 17, 48887, {1, 3, 5, 13, 13, 45, 71, 91, 23, 553, 665, 1753, 5173, 4355, 14317, 42517, 32307}},
+{11480, 17, 48899, {1, 3, 5, 11, 31, 3, 37, 95, 63, 425, 1611, 2983, 5075, 1375, 14305, 11099, 101203}},
+{11481, 17, 48911, {1, 1, 3, 1, 21, 7, 15, 141, 389, 871, 617, 271, 1037, 13569, 13019, 58899, 54097}},
+{11482, 17, 48920, {1, 3, 7, 1, 13, 25, 21, 251, 467, 373, 1539, 4065, 1871, 791, 26315, 64187, 119455}},
+{11483, 17, 48926, {1, 3, 1, 3, 25, 37, 43, 9, 187, 323, 409, 443, 2861, 14145, 26185, 24049, 109613}},
+{11484, 17, 48929, {1, 1, 3, 7, 21, 61, 3, 81, 445, 673, 1269, 613, 1279, 8209, 22911, 48017, 54181}},
+{11485, 17, 48971, {1, 1, 1, 15, 25, 63, 71, 147, 217, 491, 183, 977, 4967, 3471, 8791, 11843, 68005}},
+{11486, 17, 48974, {1, 1, 1, 5, 25, 43, 13, 237, 57, 919, 1641, 399, 4269, 7357, 3465, 63901, 61329}},
+{11487, 17, 48981, {1, 1, 7, 15, 27, 57, 47, 187, 295, 117, 1223, 2963, 4995, 13279, 25107, 56089, 37293}},
+{11488, 17, 48998, {1, 1, 5, 13, 29, 19, 83, 121, 129, 931, 1933, 1141, 3125, 3321, 22019, 52729, 119643}},
+{11489, 17, 49007, {1, 1, 1, 1, 21, 19, 49, 241, 227, 57, 1919, 113, 6993, 4687, 1043, 5247, 15565}},
+{11490, 17, 49028, {1, 3, 3, 15, 5, 21, 65, 129, 485, 173, 1663, 2419, 4279, 4167, 25827, 28457, 68219}},
+{11491, 17, 49031, {1, 1, 3, 1, 17, 9, 65, 21, 487, 875, 1111, 1679, 6451, 14825, 23931, 16053, 79687}},
+{11492, 17, 49056, {1, 3, 3, 5, 13, 5, 49, 15, 267, 389, 1111, 1505, 5815, 6285, 26075, 167, 70325}},
+{11493, 17, 49065, {1, 1, 3, 11, 5, 15, 57, 171, 407, 497, 1979, 2819, 1267, 6893, 6601, 30971, 24477}},
+{11494, 17, 49079, {1, 1, 1, 15, 7, 5, 69, 181, 195, 847, 1245, 4019, 2469, 1407, 17013, 43437, 16307}},
+{11495, 17, 49083, {1, 3, 1, 11, 15, 17, 115, 197, 215, 35, 1489, 659, 4725, 11339, 30259, 52539, 13365}},
+{11496, 17, 49088, {1, 1, 1, 13, 23, 43, 21, 33, 17, 969, 1321, 2469, 4371, 7685, 6817, 20179, 113483}},
+{11497, 17, 49093, {1, 3, 7, 3, 31, 11, 79, 55, 123, 263, 1061, 2087, 183, 11623, 20703, 60291, 115261}},
+{11498, 17, 49100, {1, 1, 5, 13, 5, 53, 21, 71, 399, 165, 1997, 2667, 7361, 8863, 27859, 17235, 77623}},
+{11499, 17, 49103, {1, 3, 3, 15, 21, 55, 27, 31, 371, 289, 253, 1453, 105, 7035, 14787, 2281, 128359}},
+{11500, 17, 49124, {1, 1, 3, 15, 23, 29, 3, 143, 47, 255, 115, 2741, 6773, 16267, 5975, 3689, 97497}},
+{11501, 17, 49136, {1, 1, 1, 15, 9, 57, 109, 43, 359, 365, 1577, 4091, 7399, 10521, 7983, 56119, 65451}},
+{11502, 17, 49139, {1, 3, 7, 7, 29, 55, 115, 155, 121, 679, 663, 2345, 3765, 4493, 9555, 24043, 41467}},
+{11503, 17, 49142, {1, 1, 3, 1, 19, 55, 67, 255, 355, 701, 2027, 3703, 7839, 1701, 7657, 36429, 36623}},
+{11504, 17, 49145, {1, 3, 5, 5, 29, 7, 31, 123, 21, 901, 1581, 3993, 5105, 9715, 18347, 27415, 19253}},
+{11505, 17, 49146, {1, 3, 5, 3, 3, 53, 121, 105, 51, 577, 157, 2151, 5105, 7855, 8595, 24457, 55931}},
+{11506, 17, 49171, {1, 3, 1, 9, 23, 25, 67, 115, 79, 809, 1215, 943, 1075, 7103, 729, 18791, 115977}},
+{11507, 17, 49187, {1, 3, 1, 13, 3, 57, 105, 161, 277, 393, 1671, 2765, 5781, 13429, 24075, 10931, 50951}},
+{11508, 17, 49190, {1, 3, 5, 9, 19, 61, 9, 227, 455, 541, 721, 2855, 949, 10159, 13801, 48199, 26747}},
+{11509, 17, 49194, {1, 3, 1, 3, 25, 61, 53, 177, 441, 697, 1845, 3573, 6673, 9691, 911, 46387, 64727}},
+{11510, 17, 49196, {1, 1, 1, 11, 7, 13, 95, 221, 455, 967, 869, 883, 6301, 5261, 18401, 35745, 114645}},
+{11511, 17, 49207, {1, 3, 1, 11, 15, 7, 115, 217, 235, 539, 491, 603, 2201, 241, 25445, 29773, 122695}},
+{11512, 17, 49216, {1, 1, 5, 3, 19, 9, 71, 193, 131, 927, 1931, 3981, 7537, 10811, 27285, 45865, 106171}},
+{11513, 17, 49219, {1, 1, 7, 5, 5, 21, 107, 77, 363, 733, 1011, 3259, 5263, 15043, 19153, 32117, 129409}},
+{11514, 17, 49222, {1, 1, 3, 13, 21, 5, 9, 103, 369, 699, 329, 1065, 895, 13211, 19017, 5359, 38335}},
+{11515, 17, 49240, {1, 1, 7, 15, 21, 11, 73, 153, 371, 753, 805, 3519, 5839, 1809, 7201, 8189, 68361}},
+{11516, 17, 49250, {1, 3, 7, 9, 27, 45, 25, 175, 317, 381, 961, 619, 4827, 15161, 19091, 29369, 21097}},
+{11517, 17, 49262, {1, 1, 5, 5, 7, 7, 21, 69, 23, 589, 1413, 653, 911, 13599, 18349, 47307, 64047}},
+{11518, 17, 49276, {1, 1, 1, 13, 27, 23, 87, 249, 135, 727, 375, 3641, 1489, 13053, 5151, 62689, 101347}},
+{11519, 17, 49289, {1, 1, 5, 11, 7, 39, 1, 109, 203, 961, 973, 1181, 2357, 5123, 31481, 58345, 52705}},
+{11520, 17, 49292, {1, 1, 1, 15, 25, 15, 85, 49, 77, 235, 1761, 2731, 4157, 2057, 27587, 30299, 52997}},
+{11521, 17, 49298, {1, 1, 5, 3, 1, 13, 47, 219, 51, 521, 625, 3243, 7093, 10823, 9559, 58191, 95573}},
+{11522, 17, 49319, {1, 3, 5, 13, 27, 63, 13, 7, 167, 909, 1559, 2103, 1807, 943, 28997, 31015, 85407}},
+{11523, 17, 49320, {1, 1, 3, 5, 17, 21, 101, 163, 477, 223, 175, 3435, 7071, 5121, 28015, 33365, 121057}},
+{11524, 17, 49325, {1, 3, 7, 1, 11, 35, 111, 41, 261, 45, 1009, 2827, 4019, 5029, 22289, 20235, 13481}},
+{11525, 17, 49333, {1, 3, 5, 5, 15, 41, 109, 7, 329, 447, 65, 1317, 6169, 15947, 31191, 47091, 60643}},
+{11526, 17, 49340, {1, 3, 7, 7, 21, 13, 29, 113, 511, 407, 1211, 2065, 455, 10049, 5745, 48589, 48669}},
+{11527, 17, 49343, {1, 1, 5, 5, 21, 45, 89, 19, 279, 165, 1897, 957, 8045, 565, 4959, 37173, 100773}},
+{11528, 17, 49352, {1, 3, 1, 15, 9, 17, 99, 143, 489, 633, 1721, 1255, 3655, 10083, 29079, 17109, 10035}},
+{11529, 17, 49363, {1, 1, 3, 3, 3, 23, 47, 9, 255, 169, 1103, 1799, 7899, 7673, 19259, 61919, 112831}},
+{11530, 17, 49375, {1, 1, 5, 5, 31, 37, 83, 229, 93, 575, 1589, 2353, 185, 7783, 9413, 9617, 123197}},
+{11531, 17, 49391, {1, 3, 5, 7, 31, 7, 113, 255, 231, 309, 1215, 737, 3635, 14631, 28737, 45127, 111399}},
+{11532, 17, 49405, {1, 1, 7, 1, 11, 5, 55, 235, 369, 983, 873, 655, 6277, 11425, 11191, 38231, 88941}},
+{11533, 17, 49413, {1, 3, 1, 9, 3, 1, 119, 93, 245, 167, 853, 2543, 203, 5313, 14129, 6283, 107117}},
+{11534, 17, 49420, {1, 3, 3, 13, 21, 33, 59, 167, 435, 163, 1873, 3341, 2895, 13205, 14147, 19567, 100127}},
+{11535, 17, 49425, {1, 1, 5, 9, 7, 15, 39, 81, 475, 511, 1585, 63, 6861, 10055, 3577, 48999, 80979}},
+{11536, 17, 49431, {1, 1, 5, 13, 21, 29, 17, 3, 499, 739, 1257, 2925, 8179, 13367, 18879, 19917, 109907}},
+{11537, 17, 49432, {1, 3, 7, 13, 15, 57, 109, 19, 265, 579, 233, 2507, 5059, 14713, 9549, 41915, 56199}},
+{11538, 17, 49441, {1, 3, 3, 5, 31, 25, 85, 163, 187, 795, 1597, 1963, 473, 4673, 4555, 51365, 73817}},
+{11539, 17, 49456, {1, 3, 3, 13, 25, 35, 71, 251, 33, 971, 235, 1919, 6705, 14657, 23417, 56377, 21071}},
+{11540, 17, 49476, {1, 3, 3, 11, 3, 29, 85, 193, 11, 831, 29, 1233, 6199, 11991, 9205, 3323, 23749}},
+{11541, 17, 49479, {1, 3, 7, 7, 11, 15, 1, 17, 87, 665, 1593, 2331, 845, 7821, 89, 7057, 114975}},
+{11542, 17, 49504, {1, 1, 5, 11, 9, 37, 39, 79, 455, 397, 1431, 1541, 7629, 15133, 21395, 35619, 123801}},
+{11543, 17, 49514, {1, 1, 1, 7, 11, 59, 67, 45, 169, 869, 1547, 2947, 3025, 12967, 29927, 22181, 44783}},
+{11544, 17, 49528, {1, 1, 5, 7, 3, 57, 123, 253, 369, 537, 83, 1147, 3469, 9775, 14137, 38899, 101143}},
+{11545, 17, 49543, {1, 3, 5, 3, 19, 35, 11, 215, 343, 677, 1873, 1211, 3129, 9017, 29595, 1291, 39397}},
+{11546, 17, 49544, {1, 1, 7, 3, 25, 7, 61, 229, 187, 839, 747, 3347, 4321, 13201, 19665, 56951, 85273}},
+{11547, 17, 49550, {1, 1, 1, 1, 11, 5, 51, 41, 227, 895, 553, 2673, 6581, 6583, 15429, 33211, 100599}},
+{11548, 17, 49558, {1, 3, 3, 5, 21, 27, 91, 65, 213, 341, 723, 567, 4761, 11549, 15041, 23079, 55245}},
+{11549, 17, 49568, {1, 1, 3, 1, 15, 43, 83, 57, 473, 453, 1351, 2055, 5769, 3887, 29481, 57915, 14017}},
+{11550, 17, 49578, {1, 3, 3, 3, 21, 29, 121, 137, 99, 527, 711, 1169, 7869, 6245, 25423, 38989, 87019}},
+{11551, 17, 49600, {1, 1, 5, 11, 9, 61, 125, 7, 207, 245, 1019, 635, 7099, 13133, 11809, 56705, 18801}},
+{11552, 17, 49612, {1, 3, 7, 9, 15, 31, 37, 205, 439, 651, 255, 971, 4311, 7137, 11821, 45041, 31081}},
+{11553, 17, 49633, {1, 1, 5, 9, 7, 55, 51, 147, 371, 881, 359, 3021, 1141, 14515, 14605, 64067, 98231}},
+{11554, 17, 49634, {1, 3, 1, 3, 29, 9, 109, 21, 437, 321, 753, 3227, 2929, 14787, 2451, 54331, 115921}},
+{11555, 17, 49636, {1, 3, 5, 7, 1, 29, 13, 167, 89, 185, 409, 209, 6625, 5237, 22513, 2095, 26427}},
+{11556, 17, 49643, {1, 1, 1, 3, 3, 31, 25, 145, 27, 345, 957, 823, 7873, 9469, 29115, 12455, 39447}},
+{11557, 17, 49654, {1, 1, 3, 3, 31, 15, 99, 181, 247, 165, 441, 59, 1181, 2851, 1337, 4929, 31079}},
+{11558, 17, 49657, {1, 1, 3, 11, 3, 47, 41, 53, 41, 435, 945, 3839, 8083, 4927, 26919, 24689, 61015}},
+{11559, 17, 49663, {1, 3, 3, 9, 7, 21, 121, 233, 493, 271, 549, 1627, 5861, 377, 20751, 52927, 3649}},
+{11560, 17, 49667, {1, 1, 1, 7, 15, 49, 29, 149, 57, 513, 873, 93, 337, 12559, 24287, 27771, 28207}},
+{11561, 17, 49693, {1, 1, 5, 7, 7, 7, 75, 161, 419, 601, 55, 2599, 5325, 12419, 26755, 5103, 10231}},
+{11562, 17, 49700, {1, 3, 5, 15, 3, 55, 67, 183, 7, 371, 141, 4093, 4567, 13971, 3327, 20701, 78819}},
+{11563, 17, 49703, {1, 1, 1, 13, 15, 41, 45, 29, 375, 235, 1985, 1051, 5863, 7043, 11143, 59381, 55007}},
+{11564, 17, 49712, {1, 3, 1, 15, 15, 29, 15, 101, 395, 39, 1839, 1689, 429, 405, 29337, 28573, 10599}},
+{11565, 17, 49717, {1, 3, 3, 11, 7, 5, 11, 153, 235, 227, 561, 1037, 2283, 6657, 6729, 17939, 29809}},
+{11566, 17, 49718, {1, 1, 1, 5, 15, 59, 33, 69, 275, 447, 661, 2071, 5811, 10463, 32707, 64503, 106313}},
+{11567, 17, 49721, {1, 1, 7, 1, 21, 53, 21, 235, 497, 309, 1207, 1613, 7739, 12785, 7743, 37671, 29197}},
+{11568, 17, 49727, {1, 3, 5, 9, 9, 51, 33, 105, 275, 917, 1911, 3607, 865, 899, 5405, 59593, 113965}},
+{11569, 17, 49730, {1, 3, 1, 7, 7, 63, 51, 83, 481, 347, 1323, 3549, 2873, 12527, 16515, 61077, 63239}},
+{11570, 17, 49735, {1, 1, 1, 1, 13, 21, 87, 139, 461, 215, 1173, 1197, 2091, 11247, 25647, 23443, 105761}},
+{11571, 17, 49739, {1, 1, 1, 1, 27, 33, 21, 27, 365, 75, 351, 2111, 3897, 13325, 4821, 41355, 95681}},
+{11572, 17, 49747, {1, 3, 5, 5, 15, 41, 15, 93, 397, 461, 1993, 321, 4375, 1205, 18417, 37549, 30181}},
+{11573, 17, 49765, {1, 3, 5, 15, 1, 49, 101, 129, 215, 773, 1265, 2245, 2517, 16261, 32149, 3545, 27631}},
+{11574, 17, 49770, {1, 1, 1, 15, 5, 5, 3, 127, 265, 721, 875, 3117, 2177, 7843, 15871, 22687, 89347}},
+{11575, 17, 49772, {1, 3, 7, 11, 29, 23, 69, 41, 155, 257, 563, 509, 6105, 9169, 18341, 25373, 127397}},
+{11576, 17, 49777, {1, 1, 5, 13, 31, 23, 65, 131, 131, 61, 1979, 2737, 3793, 3617, 14385, 189, 84567}},
+{11577, 17, 49789, {1, 1, 1, 13, 21, 33, 43, 97, 83, 903, 1971, 3209, 5391, 7703, 13795, 3895, 78045}},
+{11578, 17, 49817, {1, 3, 3, 5, 17, 53, 113, 237, 269, 83, 589, 4029, 3309, 14531, 11359, 25803, 25525}},
+{11579, 17, 49829, {1, 1, 7, 1, 21, 35, 43, 73, 251, 705, 1737, 3341, 1581, 9663, 6251, 16329, 44491}},
+{11580, 17, 49839, {1, 3, 3, 7, 17, 5, 65, 19, 203, 717, 807, 1759, 6907, 15801, 30369, 2655, 69565}},
+{11581, 17, 49844, {1, 1, 1, 1, 31, 21, 75, 221, 115, 395, 1495, 2739, 1745, 5981, 28045, 56581, 130695}},
+{11582, 17, 49851, {1, 3, 1, 9, 27, 5, 113, 123, 367, 701, 647, 117, 2389, 12309, 1747, 23421, 21583}},
+{11583, 17, 49854, {1, 1, 1, 15, 27, 57, 95, 81, 347, 765, 1435, 1727, 153, 6051, 27085, 62787, 40903}},
+{11584, 17, 49874, {1, 1, 3, 11, 23, 29, 23, 29, 169, 653, 835, 357, 5113, 5293, 11779, 23567, 64569}},
+{11585, 17, 49883, {1, 1, 7, 13, 31, 7, 101, 235, 99, 247, 1267, 509, 3927, 14317, 3217, 24389, 34215}},
+{11586, 17, 49886, {1, 3, 3, 5, 21, 27, 33, 229, 33, 551, 815, 3551, 4261, 13325, 31117, 40689, 66549}},
+{11587, 17, 49892, {1, 3, 7, 1, 23, 1, 99, 11, 139, 569, 365, 1233, 3281, 7817, 8833, 47699, 97825}},
+{11588, 17, 49895, {1, 1, 3, 1, 19, 39, 19, 151, 25, 73, 1271, 1435, 3109, 2571, 9191, 48257, 61001}},
+{11589, 17, 49914, {1, 3, 7, 1, 23, 63, 1, 115, 159, 943, 1637, 1443, 809, 10705, 12563, 63111, 96343}},
+{11590, 17, 49931, {1, 1, 7, 15, 5, 17, 65, 157, 45, 199, 371, 2497, 4367, 9109, 31955, 64253, 69279}},
+{11591, 17, 49933, {1, 3, 3, 15, 29, 45, 103, 183, 87, 543, 97, 1545, 2719, 5619, 28871, 4049, 111825}},
+{11592, 17, 49934, {1, 1, 5, 7, 27, 63, 65, 241, 103, 483, 579, 3589, 5673, 13283, 24193, 31993, 72713}},
+{11593, 17, 49941, {1, 3, 7, 9, 21, 35, 59, 183, 459, 211, 753, 3941, 5389, 10535, 2895, 44307, 26577}},
+{11594, 17, 49952, {1, 3, 1, 3, 9, 11, 15, 141, 159, 853, 1975, 4027, 8053, 16129, 32687, 29117, 67507}},
+{11595, 17, 49967, {1, 3, 3, 1, 19, 51, 55, 167, 85, 869, 437, 457, 7879, 2097, 4403, 2139, 10589}},
+{11596, 17, 49969, {1, 3, 3, 15, 19, 33, 63, 229, 197, 269, 1189, 317, 5087, 3147, 787, 64317, 43293}},
+{11597, 17, 49972, {1, 3, 5, 11, 25, 25, 121, 37, 371, 117, 1683, 2921, 671, 11353, 32273, 57597, 56901}},
+{11598, 17, 49976, {1, 3, 7, 7, 9, 37, 91, 159, 195, 1, 77, 2085, 985, 9999, 5639, 25041, 66393}},
+{11599, 17, 49979, {1, 1, 7, 5, 11, 17, 67, 21, 301, 971, 591, 3809, 4795, 12301, 16977, 27495, 98539}},
+{11600, 17, 49999, {1, 3, 1, 9, 13, 53, 83, 205, 111, 609, 631, 23, 1781, 15401, 1563, 34367, 40345}},
+{11601, 17, 50008, {1, 3, 7, 1, 31, 23, 101, 47, 55, 905, 953, 733, 5173, 5937, 17703, 31077, 49707}},
+{11602, 17, 50030, {1, 3, 5, 3, 5, 3, 127, 171, 511, 289, 685, 1157, 6521, 3301, 3017, 58857, 55289}},
+{11603, 17, 50041, {1, 1, 5, 1, 1, 29, 59, 7, 423, 83, 797, 2633, 2015, 1657, 7575, 39819, 181}},
+{11604, 17, 50042, {1, 3, 5, 15, 25, 27, 39, 99, 83, 381, 401, 1033, 867, 15645, 28643, 34917, 53215}},
+{11605, 17, 50044, {1, 3, 5, 15, 17, 1, 67, 63, 355, 841, 681, 2807, 531, 15295, 7859, 64031, 121519}},
+{11606, 17, 50057, {1, 3, 1, 5, 21, 57, 63, 247, 467, 101, 129, 2627, 4763, 479, 11145, 8861, 69803}},
+{11607, 17, 50060, {1, 3, 1, 15, 13, 13, 77, 39, 297, 401, 1653, 659, 3909, 13179, 10477, 45967, 1665}},
+{11608, 17, 50075, {1, 3, 7, 5, 29, 17, 35, 157, 309, 747, 1717, 1279, 6103, 3509, 17499, 22989, 43157}},
+{11609, 17, 50077, {1, 1, 1, 7, 11, 51, 55, 119, 145, 505, 179, 3979, 1237, 12801, 15921, 13561, 69161}},
+{11610, 17, 50091, {1, 1, 5, 7, 13, 9, 73, 203, 247, 257, 1607, 1183, 6237, 12327, 5059, 51645, 88781}},
+{11611, 17, 50096, {1, 3, 5, 9, 1, 9, 27, 59, 235, 81, 689, 2457, 893, 6107, 27643, 40145, 2329}},
+{11612, 17, 50099, {1, 1, 1, 11, 11, 19, 65, 63, 27, 513, 1473, 2955, 8037, 4991, 22035, 41965, 82589}},
+{11613, 17, 50106, {1, 3, 1, 1, 9, 53, 97, 95, 247, 379, 259, 2789, 1433, 15299, 18309, 51813, 63271}},
+{11614, 17, 50116, {1, 1, 5, 1, 11, 41, 69, 193, 391, 27, 1511, 1575, 1161, 14741, 25193, 31149, 79573}},
+{11615, 17, 50133, {1, 3, 7, 15, 19, 31, 101, 9, 111, 427, 531, 1335, 767, 15075, 28373, 54015, 108021}},
+{11616, 17, 50144, {1, 3, 1, 3, 29, 17, 83, 163, 179, 703, 2027, 3027, 5267, 16111, 23929, 9653, 38633}},
+{11617, 17, 50153, {1, 3, 5, 9, 3, 7, 111, 1, 311, 143, 1563, 2605, 301, 2447, 5009, 63767, 37529}},
+{11618, 17, 50154, {1, 3, 5, 5, 23, 23, 97, 11, 475, 741, 1385, 2491, 1717, 14587, 6289, 27651, 21873}},
+{11619, 17, 50168, {1, 1, 5, 1, 31, 31, 119, 93, 209, 861, 1591, 1233, 3469, 9799, 5969, 35965, 110841}},
+{11620, 17, 50179, {1, 1, 5, 13, 19, 31, 69, 107, 423, 651, 757, 665, 1297, 9985, 14983, 3153, 26425}},
+{11621, 17, 50188, {1, 1, 5, 3, 23, 5, 89, 77, 461, 799, 683, 2885, 845, 12847, 26721, 13145, 88689}},
+{11622, 17, 50194, {1, 1, 3, 3, 19, 3, 41, 71, 247, 293, 1047, 2349, 6815, 2413, 13683, 51421, 110737}},
+{11623, 17, 50203, {1, 3, 3, 9, 19, 51, 91, 193, 447, 305, 751, 1757, 1547, 12683, 4645, 39767, 6433}},
+{11624, 17, 50212, {1, 1, 7, 1, 11, 51, 83, 175, 461, 259, 1337, 175, 877, 15895, 22487, 8079, 71291}},
+{11625, 17, 50216, {1, 1, 1, 11, 13, 23, 19, 69, 285, 629, 563, 2433, 815, 4851, 10617, 59949, 59119}},
+{11626, 17, 50222, {1, 3, 5, 5, 19, 49, 47, 27, 343, 579, 197, 35, 7051, 2441, 30091, 9645, 101899}},
+{11627, 17, 50229, {1, 1, 3, 3, 21, 25, 125, 215, 159, 259, 1915, 2193, 4213, 16157, 8665, 10967, 112793}},
+{11628, 17, 50230, {1, 1, 5, 11, 29, 11, 53, 45, 121, 533, 257, 1749, 6311, 7715, 12037, 12003, 38987}},
+{11629, 17, 50234, {1, 3, 1, 11, 25, 31, 93, 191, 231, 801, 361, 1275, 5031, 7927, 26333, 39795, 45875}},
+{11630, 17, 50251, {1, 1, 5, 1, 7, 37, 117, 35, 257, 225, 1769, 1805, 1593, 1507, 27741, 31561, 52107}},
+{11631, 17, 50253, {1, 1, 3, 3, 27, 23, 55, 5, 137, 677, 459, 2821, 1331, 5845, 17751, 17557, 60495}},
+{11632, 17, 50262, {1, 1, 7, 7, 5, 47, 85, 17, 287, 757, 2013, 2233, 2975, 13769, 23199, 32117, 84429}},
+{11633, 17, 50266, {1, 3, 3, 11, 1, 15, 39, 133, 79, 915, 147, 1489, 2319, 13715, 31317, 46785, 64147}},
+{11634, 17, 50272, {1, 1, 3, 11, 1, 25, 83, 69, 395, 537, 895, 565, 2781, 12685, 7831, 36369, 27871}},
+{11635, 17, 50287, {1, 1, 1, 1, 13, 17, 59, 179, 509, 979, 315, 3495, 1773, 16375, 27873, 18065, 20285}},
+{11636, 17, 50295, {1, 1, 5, 1, 27, 31, 39, 251, 121, 899, 751, 1603, 7501, 425, 25791, 35407, 110405}},
+{11637, 17, 50305, {1, 1, 7, 11, 11, 3, 107, 247, 79, 349, 405, 3469, 2201, 8007, 22891, 7901, 11413}},
+{11638, 17, 50306, {1, 1, 1, 11, 15, 55, 121, 151, 127, 239, 115, 611, 6191, 15435, 19831, 64745, 110473}},
+{11639, 17, 50311, {1, 1, 7, 1, 21, 25, 57, 11, 31, 823, 1855, 2337, 7655, 10845, 22167, 36977, 94265}},
+{11640, 17, 50320, {1, 3, 5, 1, 31, 11, 117, 97, 341, 953, 1499, 2487, 559, 8609, 6321, 20669, 28945}},
+{11641, 17, 50323, {1, 3, 7, 1, 5, 27, 15, 161, 83, 139, 75, 3645, 5227, 16199, 1833, 21767, 67579}},
+{11642, 17, 50325, {1, 1, 7, 5, 31, 35, 75, 115, 451, 773, 1987, 1069, 651, 961, 16317, 18391, 56519}},
+{11643, 17, 50339, {1, 1, 1, 1, 31, 11, 23, 255, 215, 251, 867, 2381, 2351, 13189, 17705, 33569, 102361}},
+{11644, 17, 50356, {1, 3, 7, 1, 17, 49, 49, 125, 445, 947, 1985, 2113, 3025, 6277, 1981, 33329, 99413}},
+{11645, 17, 50365, {1, 3, 3, 3, 27, 7, 59, 109, 37, 777, 1359, 2157, 3185, 7317, 30887, 10499, 126563}},
+{11646, 17, 50366, {1, 3, 3, 9, 27, 5, 99, 167, 457, 363, 2031, 1805, 4661, 8695, 4667, 61129, 81143}},
+{11647, 17, 50368, {1, 1, 5, 13, 5, 47, 95, 249, 289, 631, 1739, 2947, 7169, 13019, 10429, 16197, 11539}},
+{11648, 17, 50377, {1, 3, 7, 15, 27, 45, 93, 131, 269, 835, 399, 1133, 6509, 1279, 3635, 17977, 38667}},
+{11649, 17, 50386, {1, 1, 5, 3, 17, 51, 1, 77, 105, 237, 995, 2643, 6921, 6707, 30129, 1543, 94501}},
+{11650, 17, 50397, {1, 1, 1, 7, 29, 1, 117, 33, 141, 805, 1553, 3943, 45, 8911, 24191, 45191, 36525}},
+{11651, 17, 50411, {1, 1, 7, 7, 31, 21, 97, 29, 179, 345, 1059, 701, 7709, 15831, 22923, 57233, 58961}},
+{11652, 17, 50414, {1, 1, 3, 15, 15, 5, 85, 227, 13, 351, 1167, 3283, 6833, 565, 21019, 53249, 4639}},
+{11653, 17, 50425, {1, 3, 3, 5, 27, 1, 5, 89, 101, 295, 481, 2397, 1459, 3729, 3703, 25109, 69237}},
+{11654, 17, 50451, {1, 3, 7, 13, 31, 37, 69, 147, 505, 487, 1701, 1145, 2061, 10067, 18269, 13049, 92091}},
+{11655, 17, 50463, {1, 3, 3, 1, 29, 39, 33, 199, 499, 377, 1081, 3787, 4843, 16287, 23397, 19083, 91381}},
+{11656, 17, 50467, {1, 1, 1, 13, 21, 61, 121, 251, 511, 615, 625, 2245, 5951, 16165, 2155, 37301, 68319}},
+{11657, 17, 50473, {1, 1, 1, 15, 19, 35, 57, 99, 1, 97, 1177, 3109, 7213, 5447, 25251, 24803, 107449}},
+{11658, 17, 50487, {1, 3, 1, 11, 11, 59, 95, 135, 329, 931, 843, 2847, 463, 10725, 3933, 32325, 44545}},
+{11659, 17, 50501, {1, 1, 7, 13, 13, 57, 29, 175, 11, 701, 231, 2907, 5555, 16159, 1249, 38049, 40115}},
+{11660, 17, 50505, {1, 1, 5, 15, 23, 37, 47, 221, 465, 631, 57, 1189, 2083, 6561, 10725, 8015, 21231}},
+{11661, 17, 50514, {1, 3, 7, 5, 9, 25, 31, 47, 139, 639, 999, 2909, 39, 16227, 16967, 30555, 125541}},
+{11662, 17, 50516, {1, 3, 3, 9, 5, 3, 9, 9, 43, 999, 159, 3063, 3661, 7089, 28929, 55305, 105521}},
+{11663, 17, 50536, {1, 3, 1, 11, 17, 7, 3, 57, 457, 753, 135, 3721, 1111, 7267, 12603, 50511, 85433}},
+{11664, 17, 50547, {1, 3, 5, 1, 27, 3, 107, 187, 247, 891, 1311, 423, 1767, 14769, 22119, 36225, 94267}},
+{11665, 17, 50566, {1, 3, 5, 15, 1, 13, 65, 35, 435, 557, 1755, 1343, 2647, 179, 7781, 62903, 18741}},
+{11666, 17, 50572, {1, 1, 7, 15, 29, 57, 63, 227, 407, 163, 1207, 2717, 2731, 1737, 6379, 14937, 46683}},
+{11667, 17, 50583, {1, 1, 1, 9, 25, 35, 93, 1, 77, 677, 875, 3787, 3075, 14033, 23017, 3487, 14999}},
+{11668, 17, 50593, {1, 3, 3, 9, 3, 45, 115, 61, 437, 823, 1401, 459, 301, 5519, 31003, 64499, 1757}},
+{11669, 17, 50599, {1, 3, 1, 11, 23, 37, 69, 215, 197, 961, 1501, 2953, 3679, 6775, 24679, 44215, 52357}},
+{11670, 17, 50613, {1, 3, 1, 15, 29, 23, 1, 133, 451, 677, 687, 1269, 5987, 11975, 11929, 63691, 48683}},
+{11671, 17, 50617, {1, 1, 1, 7, 13, 31, 13, 71, 355, 345, 1193, 3421, 7601, 7413, 6719, 28681, 97605}},
+{11672, 17, 50618, {1, 1, 5, 13, 23, 3, 15, 253, 109, 17, 341, 471, 1131, 14901, 31783, 41369, 64139}},
+{11673, 17, 50620, {1, 1, 3, 1, 25, 25, 85, 157, 443, 83, 269, 3789, 7977, 7783, 28433, 30563, 82805}},
+{11674, 17, 50628, {1, 1, 7, 5, 3, 11, 83, 63, 253, 349, 217, 2733, 4183, 2759, 7617, 41749, 14015}},
+{11675, 17, 50638, {1, 1, 5, 7, 7, 7, 91, 201, 449, 247, 889, 3829, 3529, 14253, 24091, 33521, 6049}},
+{11676, 17, 50652, {1, 1, 3, 7, 25, 7, 123, 161, 227, 965, 511, 619, 4359, 11833, 12859, 26091, 3867}},
+{11677, 17, 50655, {1, 1, 7, 9, 5, 41, 71, 111, 95, 261, 1809, 3835, 7625, 12085, 28885, 64829, 48981}},
+{11678, 17, 50662, {1, 1, 5, 3, 13, 55, 57, 79, 457, 785, 653, 1429, 3879, 13559, 3953, 18205, 5777}},
+{11679, 17, 50665, {1, 3, 5, 9, 23, 25, 107, 255, 151, 191, 119, 3367, 1081, 12691, 3575, 38171, 42573}},
+{11680, 17, 50673, {1, 1, 7, 15, 3, 23, 115, 233, 265, 187, 1961, 1303, 5101, 1035, 6803, 14557, 4527}},
+{11681, 17, 50683, {1, 1, 3, 11, 19, 37, 45, 167, 17, 793, 1361, 3571, 5889, 14421, 20453, 5093, 59927}},
+{11682, 17, 50689, {1, 1, 7, 15, 3, 53, 1, 11, 159, 389, 171, 2351, 7189, 3109, 1541, 53595, 24247}},
+{11683, 17, 50690, {1, 1, 7, 1, 7, 43, 75, 175, 253, 687, 1811, 3277, 447, 8711, 14281, 53265, 7379}},
+{11684, 17, 50692, {1, 1, 5, 3, 21, 45, 113, 25, 309, 31, 1765, 305, 1423, 115, 26421, 50267, 122115}},
+{11685, 17, 50696, {1, 3, 5, 13, 15, 47, 17, 17, 445, 775, 243, 3959, 7263, 9375, 12017, 57399, 58203}},
+{11686, 17, 50704, {1, 3, 3, 1, 31, 37, 37, 213, 125, 929, 243, 1011, 2841, 4499, 16961, 12639, 23381}},
+{11687, 17, 50713, {1, 3, 1, 3, 7, 53, 31, 165, 311, 239, 731, 1759, 1769, 203, 23201, 20267, 33381}},
+{11688, 17, 50719, {1, 3, 3, 11, 1, 1, 73, 57, 497, 693, 693, 861, 5587, 16307, 8559, 28785, 91147}},
+{11689, 17, 50738, {1, 3, 1, 3, 11, 61, 11, 241, 473, 479, 1831, 1771, 25, 10217, 32683, 40165, 98433}},
+{11690, 17, 50757, {1, 1, 5, 3, 17, 51, 39, 27, 189, 631, 689, 2849, 1849, 9143, 19263, 32729, 23031}},
+{11691, 17, 50761, {1, 1, 5, 9, 15, 39, 103, 83, 485, 689, 1561, 55, 5219, 12069, 32225, 7781, 114299}},
+{11692, 17, 50764, {1, 1, 1, 1, 31, 49, 71, 145, 485, 907, 1551, 3931, 4081, 2159, 24747, 6953, 15887}},
+{11693, 17, 50770, {1, 1, 3, 7, 27, 61, 57, 153, 15, 881, 271, 267, 5827, 7625, 18179, 3769, 42211}},
+{11694, 17, 50776, {1, 3, 1, 3, 21, 49, 65, 177, 341, 851, 1825, 3347, 113, 8077, 1117, 9463, 115821}},
+{11695, 17, 50803, {1, 3, 5, 11, 27, 17, 75, 35, 475, 389, 313, 2187, 7005, 911, 21921, 10979, 13705}},
+{11696, 17, 50805, {1, 1, 5, 9, 1, 49, 15, 21, 163, 355, 193, 3473, 4451, 5325, 28343, 251, 125963}},
+{11697, 17, 50806, {1, 3, 7, 1, 9, 63, 9, 129, 453, 887, 1841, 597, 1989, 14755, 7847, 7581, 251}},
+{11698, 17, 50816, {1, 3, 7, 13, 31, 15, 123, 3, 427, 101, 1039, 1355, 3653, 2871, 28937, 31243, 108827}},
+{11699, 17, 50826, {1, 3, 7, 13, 3, 17, 71, 243, 145, 747, 1933, 1105, 455, 6355, 20321, 60075, 31575}},
+{11700, 17, 50840, {1, 3, 5, 5, 11, 25, 95, 85, 461, 459, 313, 173, 1413, 15761, 31481, 63793, 29047}},
+{11701, 17, 50845, {1, 3, 7, 7, 3, 5, 3, 95, 107, 995, 1203, 2965, 2419, 5325, 17667, 40205, 91059}},
+{11702, 17, 50852, {1, 1, 3, 9, 25, 3, 113, 79, 359, 69, 93, 1539, 483, 12701, 19075, 35021, 17929}},
+{11703, 17, 50855, {1, 3, 5, 1, 31, 35, 67, 97, 105, 381, 973, 1355, 3901, 3847, 12343, 64309, 29835}},
+{11704, 17, 50862, {1, 3, 7, 1, 11, 33, 117, 237, 449, 101, 317, 23, 5157, 8187, 28839, 29465, 97485}},
+{11705, 17, 50876, {1, 3, 5, 5, 1, 49, 93, 71, 89, 607, 1143, 3271, 5825, 8529, 18479, 23859, 40571}},
+{11706, 17, 50879, {1, 3, 1, 3, 13, 35, 79, 9, 315, 943, 1199, 1521, 2023, 11745, 8273, 27643, 89545}},
+{11707, 17, 50882, {1, 3, 5, 1, 21, 3, 15, 111, 19, 895, 1539, 3331, 6741, 9087, 5231, 13435, 60645}},
+{11708, 17, 50894, {1, 3, 1, 9, 25, 9, 109, 253, 263, 425, 915, 1955, 659, 6249, 11803, 34523, 22645}},
+{11709, 17, 50899, {1, 1, 1, 9, 15, 23, 13, 79, 369, 689, 565, 743, 3897, 8837, 13753, 17213, 86801}},
+{11710, 17, 50905, {1, 1, 1, 5, 31, 27, 111, 231, 25, 617, 897, 1325, 4885, 5731, 2027, 34639, 67863}},
+{11711, 17, 50924, {1, 1, 3, 13, 1, 9, 29, 23, 95, 113, 1035, 2729, 6555, 335, 24795, 35387, 31301}},
+{11712, 17, 50936, {1, 1, 1, 7, 3, 53, 91, 143, 167, 773, 207, 31, 4993, 7953, 26997, 40031, 113939}},
+{11713, 17, 50944, {1, 1, 3, 5, 17, 43, 121, 231, 411, 575, 1621, 3079, 535, 3313, 19443, 58271, 54207}},
+{11714, 17, 50973, {1, 1, 1, 7, 11, 41, 61, 81, 97, 91, 1987, 981, 3745, 819, 23785, 48331, 63761}},
+{11715, 17, 50974, {1, 1, 5, 13, 7, 29, 25, 73, 355, 669, 241, 65, 2249, 5551, 5217, 58573, 34049}},
+{11716, 17, 51002, {1, 1, 7, 11, 1, 45, 125, 107, 127, 639, 1989, 2727, 2103, 8985, 30249, 40037, 40931}},
+{11717, 17, 51007, {1, 1, 5, 13, 21, 59, 99, 131, 359, 615, 665, 577, 2559, 3555, 11355, 26213, 76427}},
+{11718, 17, 51009, {1, 3, 3, 1, 19, 9, 85, 111, 381, 661, 561, 3419, 1355, 8473, 329, 4989, 9087}},
+{11719, 17, 51029, {1, 1, 7, 5, 11, 23, 33, 95, 343, 9, 1579, 2663, 6245, 267, 7187, 25381, 103181}},
+{11720, 17, 51036, {1, 1, 7, 11, 23, 7, 113, 49, 89, 587, 1221, 409, 873, 15531, 2721, 44519, 25349}},
+{11721, 17, 51063, {1, 3, 3, 1, 17, 17, 45, 239, 453, 639, 1433, 2829, 6009, 12447, 9393, 59979, 93343}},
+{11722, 17, 51067, {1, 1, 3, 15, 19, 61, 125, 101, 219, 327, 1551, 1623, 951, 8379, 21009, 64089, 21891}},
+{11723, 17, 51070, {1, 1, 5, 7, 23, 5, 111, 43, 57, 71, 407, 4027, 4869, 12033, 19941, 51969, 120115}},
+{11724, 17, 51074, {1, 3, 7, 15, 17, 49, 31, 145, 185, 169, 1559, 4011, 5293, 7559, 23487, 12213, 2757}},
+{11725, 17, 51079, {1, 3, 7, 3, 3, 59, 119, 3, 509, 539, 1623, 539, 1405, 3913, 213, 30293, 68497}},
+{11726, 17, 51083, {1, 1, 1, 9, 15, 43, 67, 171, 397, 233, 379, 1681, 6877, 9169, 19667, 1971, 115347}},
+{11727, 17, 51093, {1, 1, 5, 15, 1, 45, 25, 133, 99, 181, 1825, 3485, 5633, 4629, 30181, 15761, 87161}},
+{11728, 17, 51094, {1, 1, 5, 3, 5, 55, 97, 117, 303, 591, 733, 3631, 4305, 169, 5361, 64491, 71793}},
+{11729, 17, 51124, {1, 1, 5, 11, 19, 9, 5, 147, 223, 51, 1763, 3899, 7393, 8107, 19619, 60509, 61427}},
+{11730, 17, 51131, {1, 1, 1, 15, 15, 3, 103, 15, 423, 649, 613, 1387, 6229, 4147, 17517, 225, 35697}},
+{11731, 17, 51151, {1, 3, 1, 3, 21, 57, 77, 193, 203, 649, 631, 3753, 4259, 3983, 27707, 33623, 83857}},
+{11732, 17, 51153, {1, 3, 3, 5, 11, 37, 95, 201, 83, 643, 1639, 153, 7683, 15249, 23859, 27021, 43321}},
+{11733, 17, 51156, {1, 3, 5, 13, 23, 31, 69, 215, 303, 433, 1325, 1013, 2903, 12659, 3813, 34497, 59651}},
+{11734, 17, 51165, {1, 3, 1, 9, 15, 39, 113, 253, 173, 393, 19, 2343, 2939, 8871, 29741, 2141, 121675}},
+{11735, 17, 51175, {1, 1, 7, 9, 7, 9, 91, 211, 169, 299, 507, 2849, 1321, 15397, 23949, 32387, 108691}},
+{11736, 17, 51184, {1, 1, 7, 13, 1, 21, 119, 127, 229, 253, 39, 323, 1831, 121, 17385, 45511, 43743}},
+{11737, 17, 51187, {1, 1, 1, 15, 25, 25, 97, 209, 375, 945, 1343, 2205, 1701, 13085, 25547, 55555, 129395}},
+{11738, 17, 51203, {1, 1, 1, 5, 31, 25, 91, 255, 163, 169, 703, 1607, 4731, 7413, 10013, 10925, 109151}},
+{11739, 17, 51220, {1, 3, 3, 9, 15, 47, 71, 219, 9, 37, 231, 3227, 3447, 8129, 23421, 30113, 120725}},
+{11740, 17, 51224, {1, 3, 3, 11, 15, 47, 93, 203, 299, 865, 151, 3999, 1245, 8487, 13355, 27373, 93583}},
+{11741, 17, 51233, {1, 3, 7, 5, 13, 7, 97, 81, 271, 95, 513, 365, 5039, 403, 5285, 29475, 129347}},
+{11742, 17, 51234, {1, 1, 7, 7, 9, 27, 25, 207, 161, 785, 1453, 3031, 763, 2313, 29347, 61457, 52561}},
+{11743, 17, 51239, {1, 3, 3, 11, 25, 25, 39, 61, 165, 803, 1435, 3643, 299, 13751, 24239, 53955, 94889}},
+{11744, 17, 51246, {1, 3, 5, 9, 9, 13, 63, 221, 123, 947, 905, 913, 953, 7429, 25409, 43017, 2217}},
+{11745, 17, 51248, {1, 1, 3, 3, 31, 19, 107, 211, 503, 675, 1921, 3027, 1273, 5699, 20683, 55605, 119803}},
+{11746, 17, 51251, {1, 1, 3, 3, 9, 17, 115, 183, 325, 259, 2013, 1505, 6999, 11573, 5315, 18731, 9405}},
+{11747, 17, 51257, {1, 3, 1, 5, 29, 37, 81, 145, 5, 851, 1803, 2011, 6655, 3601, 11325, 17137, 68501}},
+{11748, 17, 51266, {1, 3, 5, 1, 25, 51, 111, 19, 75, 765, 1843, 139, 7253, 12967, 13387, 48631, 124881}},
+{11749, 17, 51280, {1, 3, 3, 7, 15, 29, 7, 231, 13, 901, 1913, 3817, 3993, 3049, 32367, 4201, 90837}},
+{11750, 17, 51285, {1, 3, 1, 11, 27, 5, 109, 57, 81, 147, 1141, 2153, 5255, 6367, 189, 5959, 88843}},
+{11751, 17, 51286, {1, 3, 5, 5, 19, 35, 17, 149, 407, 889, 1583, 1727, 465, 10785, 6043, 21785, 80935}},
+{11752, 17, 51289, {1, 1, 3, 7, 15, 21, 105, 249, 427, 491, 923, 3189, 8103, 3875, 18347, 35799, 36703}},
+{11753, 17, 51295, {1, 1, 3, 15, 3, 45, 93, 197, 265, 309, 1909, 1635, 1743, 9499, 21897, 36889, 67449}},
+{11754, 17, 51296, {1, 3, 1, 11, 15, 57, 31, 231, 363, 879, 1377, 1941, 6969, 10721, 21933, 33419, 102939}},
+{11755, 17, 51311, {1, 1, 3, 9, 3, 57, 49, 51, 71, 991, 885, 1367, 2937, 9301, 29893, 9867, 113711}},
+{11756, 17, 51329, {1, 3, 7, 7, 11, 59, 123, 247, 51, 659, 1323, 3371, 3417, 12295, 2021, 62753, 28059}},
+{11757, 17, 51350, {1, 1, 7, 11, 3, 57, 53, 1, 203, 287, 219, 3531, 1365, 6235, 30187, 4479, 29567}},
+{11758, 17, 51356, {1, 1, 7, 9, 5, 41, 41, 39, 137, 495, 149, 2421, 7365, 11381, 25403, 16063, 47491}},
+{11759, 17, 51363, {1, 1, 5, 13, 25, 25, 47, 25, 213, 661, 1345, 883, 7573, 3291, 21303, 8033, 102639}},
+{11760, 17, 51365, {1, 1, 5, 3, 9, 49, 75, 221, 455, 139, 1533, 3155, 1023, 7249, 10129, 63165, 1713}},
+{11761, 17, 51370, {1, 3, 5, 11, 17, 1, 23, 241, 83, 359, 1243, 2791, 2975, 6271, 19035, 55057, 7625}},
+{11762, 17, 51372, {1, 3, 1, 9, 17, 61, 109, 255, 447, 939, 899, 551, 7049, 4247, 17333, 43369, 30105}},
+{11763, 17, 51377, {1, 1, 3, 5, 3, 31, 79, 39, 225, 605, 1893, 3523, 5391, 6879, 18619, 2339, 108295}},
+{11764, 17, 51383, {1, 1, 5, 1, 29, 15, 123, 39, 239, 57, 843, 2799, 4755, 4993, 23383, 45559, 48359}},
+{11765, 17, 51384, {1, 1, 5, 5, 7, 5, 99, 1, 351, 213, 1061, 721, 343, 16071, 29641, 55607, 76727}},
+{11766, 17, 51397, {1, 3, 1, 7, 9, 9, 15, 25, 87, 595, 71, 3769, 2583, 10105, 28639, 48899, 49753}},
+{11767, 17, 51407, {1, 3, 5, 3, 31, 29, 99, 77, 323, 615, 581, 1725, 2471, 16263, 4903, 205, 55441}},
+{11768, 17, 51422, {1, 1, 5, 11, 17, 53, 47, 53, 125, 717, 867, 1251, 4009, 13981, 10165, 4769, 117431}},
+{11769, 17, 51435, {1, 1, 3, 7, 7, 19, 119, 27, 163, 11, 693, 3197, 3981, 12591, 26017, 62113, 48391}},
+{11770, 17, 51440, {1, 1, 3, 15, 13, 17, 13, 81, 19, 821, 677, 233, 5227, 14855, 18269, 18895, 90041}},
+{11771, 17, 51446, {1, 1, 3, 9, 27, 61, 125, 221, 415, 183, 1137, 1879, 3451, 3599, 27317, 53449, 35499}},
+{11772, 17, 51463, {1, 3, 3, 15, 3, 27, 53, 93, 17, 405, 373, 2531, 3121, 2299, 1593, 34623, 102389}},
+{11773, 17, 51467, {1, 1, 1, 11, 23, 19, 85, 87, 209, 17, 1805, 4067, 7401, 6097, 5865, 61383, 42971}},
+{11774, 17, 51491, {1, 1, 7, 9, 29, 43, 99, 125, 385, 347, 97, 1121, 1533, 10545, 17383, 48649, 78443}},
+{11775, 17, 51493, {1, 3, 3, 13, 7, 9, 95, 105, 463, 911, 357, 423, 5701, 2389, 16307, 17817, 108775}},
+{11776, 17, 51494, {1, 3, 5, 11, 21, 21, 79, 53, 511, 995, 1709, 1715, 6031, 10507, 10735, 48817, 28569}},
+{11777, 17, 51508, {1, 3, 5, 7, 31, 49, 43, 109, 267, 981, 1529, 3611, 3379, 1295, 27489, 46721, 58423}},
+{11778, 17, 51518, {1, 3, 3, 11, 3, 31, 21, 3, 79, 31, 1885, 3029, 6337, 15457, 8995, 9955, 95019}},
+{11779, 17, 51520, {1, 1, 7, 13, 9, 9, 77, 73, 111, 769, 813, 1599, 5925, 1063, 12151, 54125, 67723}},
+{11780, 17, 51526, {1, 1, 1, 7, 13, 5, 43, 201, 379, 199, 769, 3227, 3995, 1543, 21903, 10651, 122007}},
+{11781, 17, 51529, {1, 3, 7, 13, 11, 53, 83, 201, 231, 137, 617, 2395, 2513, 6659, 9387, 15653, 96927}},
+{11782, 17, 51530, {1, 3, 1, 13, 29, 19, 97, 57, 231, 985, 805, 1169, 831, 15867, 20195, 53533, 99735}},
+{11783, 17, 51537, {1, 1, 3, 13, 19, 15, 19, 39, 99, 31, 421, 755, 7439, 4927, 19893, 15449, 47937}},
+{11784, 17, 51547, {1, 3, 3, 9, 1, 17, 71, 37, 289, 537, 69, 3687, 6537, 12295, 28403, 6627, 72991}},
+{11785, 17, 51559, {1, 3, 3, 15, 31, 53, 21, 223, 451, 309, 895, 3923, 3149, 5167, 1979, 31425, 53485}},
+{11786, 17, 51565, {1, 3, 1, 1, 29, 7, 5, 197, 445, 455, 185, 633, 897, 4561, 28833, 39477, 46665}},
+{11787, 17, 51568, {1, 1, 3, 9, 29, 19, 45, 239, 323, 1005, 101, 2083, 7403, 10401, 987, 32301, 58141}},
+{11788, 17, 51580, {1, 3, 3, 5, 31, 17, 7, 141, 245, 301, 1607, 3381, 7517, 6663, 6327, 15321, 19963}},
+{11789, 17, 51583, {1, 1, 7, 5, 5, 37, 109, 31, 285, 767, 1689, 2961, 5511, 15415, 32011, 14889, 7237}},
+{11790, 17, 51584, {1, 1, 3, 7, 31, 35, 47, 157, 407, 719, 1213, 1241, 2475, 10321, 11547, 52641, 21603}},
+{11791, 17, 51593, {1, 1, 1, 7, 5, 45, 35, 137, 403, 321, 1151, 529, 6297, 3059, 27791, 18387, 101431}},
+{11792, 17, 51594, {1, 1, 3, 11, 21, 19, 97, 121, 377, 325, 741, 1601, 1115, 6233, 19089, 40491, 53259}},
+{11793, 17, 51607, {1, 1, 1, 9, 3, 13, 83, 243, 443, 91, 1455, 1875, 3327, 7245, 12735, 14943, 44163}},
+{11794, 17, 51608, {1, 3, 5, 11, 1, 15, 107, 211, 25, 125, 623, 1319, 6133, 12177, 1377, 32547, 110919}},
+{11795, 17, 51620, {1, 1, 3, 3, 7, 39, 23, 99, 433, 581, 53, 3421, 733, 12767, 23595, 22957, 88821}},
+{11796, 17, 51624, {1, 1, 1, 13, 5, 53, 103, 127, 409, 379, 1155, 3097, 6529, 11685, 22147, 46003, 59771}},
+{11797, 17, 51642, {1, 3, 3, 3, 15, 37, 9, 67, 237, 79, 697, 1943, 1021, 3217, 16013, 14727, 105729}},
+{11798, 17, 51649, {1, 1, 7, 1, 9, 43, 55, 79, 63, 553, 871, 2881, 6487, 4667, 24263, 41995, 60907}},
+{11799, 17, 51652, {1, 1, 7, 7, 23, 31, 55, 23, 451, 593, 85, 43, 965, 12491, 15121, 16129, 90639}},
+{11800, 17, 51659, {1, 1, 7, 13, 11, 53, 21, 123, 237, 147, 511, 2105, 5961, 4465, 4015, 19069, 89203}},
+{11801, 17, 51661, {1, 3, 5, 1, 1, 39, 59, 239, 391, 91, 923, 85, 1047, 1489, 31119, 58485, 129171}},
+{11802, 17, 51670, {1, 3, 5, 13, 3, 21, 35, 205, 219, 795, 901, 2465, 5887, 275, 22003, 29659, 50589}},
+{11803, 17, 51674, {1, 3, 1, 5, 1, 35, 127, 147, 159, 791, 1643, 1811, 1199, 3851, 9681, 19845, 127075}},
+{11804, 17, 51698, {1, 3, 3, 7, 17, 19, 13, 223, 395, 971, 125, 181, 4455, 13305, 30433, 46161, 122277}},
+{11805, 17, 51707, {1, 3, 1, 3, 19, 1, 15, 71, 425, 459, 655, 2251, 5525, 7611, 5819, 1255, 43107}},
+{11806, 17, 51725, {1, 1, 5, 15, 3, 9, 83, 191, 439, 663, 399, 2263, 1857, 15421, 2079, 2381, 59193}},
+{11807, 17, 51737, {1, 3, 5, 5, 1, 7, 9, 77, 347, 419, 1329, 3173, 7295, 3631, 13435, 3217, 18053}},
+{11808, 17, 51753, {1, 3, 3, 7, 29, 39, 35, 71, 119, 745, 603, 2247, 377, 3297, 30983, 27857, 105739}},
+{11809, 17, 51754, {1, 1, 5, 13, 9, 59, 57, 239, 247, 921, 1383, 2315, 241, 4435, 24661, 6129, 122727}},
+{11810, 17, 51779, {1, 1, 5, 7, 3, 15, 39, 165, 27, 803, 609, 3081, 6009, 12665, 24155, 51647, 3857}},
+{11811, 17, 51791, {1, 3, 5, 11, 27, 41, 61, 255, 195, 169, 557, 1739, 4029, 1791, 471, 16321, 49801}},
+{11812, 17, 51796, {1, 3, 7, 13, 17, 45, 35, 177, 109, 113, 551, 219, 4065, 303, 15489, 25427, 12349}},
+{11813, 17, 51809, {1, 3, 5, 5, 25, 15, 79, 165, 231, 867, 483, 3563, 6611, 11277, 3193, 37455, 127373}},
+{11814, 17, 51816, {1, 3, 3, 11, 25, 21, 47, 255, 27, 543, 485, 2675, 5893, 3029, 3857, 50967, 14681}},
+{11815, 17, 51819, {1, 3, 7, 11, 3, 23, 81, 135, 77, 227, 417, 1733, 5175, 15295, 15985, 50329, 48641}},
+{11816, 17, 51827, {1, 3, 5, 1, 3, 47, 33, 67, 201, 235, 1299, 3703, 1959, 8091, 11115, 10869, 9595}},
+{11817, 17, 51829, {1, 3, 7, 13, 1, 45, 61, 49, 471, 923, 1827, 2175, 1433, 3473, 3781, 7923, 121525}},
+{11818, 17, 51834, {1, 3, 5, 7, 25, 59, 113, 19, 415, 839, 167, 3549, 7435, 6573, 767, 2751, 18383}},
+{11819, 17, 51836, {1, 3, 3, 1, 5, 11, 125, 241, 395, 423, 955, 2551, 963, 8197, 30253, 10473, 28505}},
+{11820, 17, 51846, {1, 1, 1, 3, 5, 31, 69, 103, 153, 505, 1507, 2827, 165, 4943, 8343, 54253, 87593}},
+{11821, 17, 51849, {1, 3, 3, 1, 7, 37, 27, 75, 251, 623, 965, 1907, 6063, 761, 765, 10103, 43479}},
+{11822, 17, 51855, {1, 1, 1, 13, 7, 21, 53, 219, 267, 57, 959, 579, 2951, 13797, 3249, 29895, 47467}},
+{11823, 17, 51858, {1, 1, 5, 9, 13, 7, 85, 107, 3, 635, 1235, 1339, 3263, 3895, 25911, 7521, 34149}},
+{11824, 17, 51869, {1, 1, 5, 15, 29, 37, 73, 43, 413, 993, 499, 719, 1557, 14397, 11245, 58197, 127901}},
+{11825, 17, 51870, {1, 1, 5, 15, 9, 37, 87, 57, 63, 337, 927, 1887, 6407, 11237, 23233, 53567, 120449}},
+{11826, 17, 51874, {1, 1, 3, 7, 27, 11, 85, 227, 159, 849, 647, 1977, 4623, 7343, 8089, 4251, 26609}},
+{11827, 17, 51918, {1, 1, 5, 11, 11, 3, 105, 191, 189, 627, 367, 3935, 6647, 13069, 26195, 23137, 56427}},
+{11828, 17, 51926, {1, 1, 3, 3, 29, 51, 39, 3, 437, 1011, 1061, 1747, 3051, 11165, 8155, 9723, 41035}},
+{11829, 17, 51932, {1, 3, 7, 15, 9, 43, 79, 195, 265, 395, 1349, 337, 911, 15767, 3593, 42859, 70181}},
+{11830, 17, 51936, {1, 3, 7, 7, 11, 47, 11, 85, 489, 801, 1177, 3861, 3517, 9209, 27505, 12291, 35691}},
+{11831, 17, 51948, {1, 1, 3, 9, 15, 61, 71, 123, 287, 419, 1079, 3489, 3519, 12739, 21341, 24323, 33961}},
+{11832, 17, 51954, {1, 3, 7, 3, 9, 17, 119, 137, 389, 391, 601, 1875, 2197, 5271, 13289, 43597, 43279}},
+{11833, 17, 51959, {1, 3, 7, 15, 29, 35, 41, 171, 183, 701, 1673, 981, 5479, 21, 11353, 64953, 88189}},
+{11834, 17, 51971, {1, 3, 3, 13, 15, 35, 35, 81, 297, 245, 475, 393, 5401, 12369, 21129, 65213, 125013}},
+{11835, 17, 51983, {1, 1, 7, 13, 15, 57, 25, 143, 389, 111, 1219, 2195, 769, 9005, 10367, 39435, 3631}},
+{11836, 17, 51992, {1, 3, 3, 13, 9, 29, 9, 47, 127, 377, 1195, 1221, 5751, 15481, 10537, 29909, 112691}},
+{11837, 17, 51997, {1, 1, 3, 5, 17, 47, 29, 1, 299, 651, 1023, 1601, 5917, 3781, 18421, 42393, 51789}},
+{11838, 17, 52016, {1, 3, 3, 15, 31, 51, 101, 147, 367, 159, 359, 705, 3773, 8649, 31373, 5733, 58287}},
+{11839, 17, 52021, {1, 3, 5, 11, 11, 51, 55, 79, 147, 917, 1945, 1725, 289, 12777, 30099, 3013, 91527}},
+{11840, 17, 52031, {1, 1, 7, 13, 1, 51, 33, 27, 169, 573, 117, 2479, 761, 1283, 32723, 13589, 88821}},
+{11841, 17, 52033, {1, 1, 1, 3, 23, 13, 33, 207, 137, 391, 1309, 4093, 6889, 827, 9331, 57113, 110193}},
+{11842, 17, 52034, {1, 1, 1, 13, 15, 57, 115, 53, 59, 443, 1, 3545, 6923, 6603, 8631, 41703, 8519}},
+{11843, 17, 52048, {1, 1, 5, 5, 25, 29, 53, 153, 107, 423, 1829, 2469, 1843, 889, 31727, 20701, 6343}},
+{11844, 17, 52053, {1, 1, 7, 13, 11, 41, 7, 219, 77, 663, 329, 2639, 1111, 1293, 16771, 20731, 46973}},
+{11845, 17, 52057, {1, 3, 3, 15, 23, 19, 45, 107, 111, 155, 1595, 1821, 471, 6089, 21587, 49259, 85393}},
+{11846, 17, 52067, {1, 3, 1, 3, 27, 21, 39, 227, 359, 885, 449, 2615, 3519, 5377, 16017, 57159, 82399}},
+{11847, 17, 52076, {1, 3, 3, 15, 31, 33, 77, 33, 87, 821, 701, 2859, 1777, 3007, 16757, 5447, 3557}},
+{11848, 17, 52079, {1, 1, 1, 15, 11, 31, 127, 79, 363, 341, 169, 3451, 6351, 6867, 13511, 833, 103151}},
+{11849, 17, 52081, {1, 3, 5, 7, 27, 23, 5, 67, 159, 535, 103, 843, 8187, 6891, 19169, 22565, 95255}},
+{11850, 17, 52109, {1, 3, 5, 5, 15, 27, 53, 49, 343, 815, 1203, 1031, 6359, 1337, 1629, 47783, 103391}},
+{11851, 17, 52127, {1, 3, 1, 1, 13, 19, 51, 185, 45, 549, 619, 2247, 2541, 10421, 31507, 60785, 87139}},
+{11852, 17, 52128, {1, 3, 1, 15, 29, 9, 47, 127, 41, 767, 1375, 2183, 7169, 12855, 15021, 377, 69327}},
+{11853, 17, 52133, {1, 1, 3, 9, 5, 23, 23, 203, 101, 809, 1155, 2885, 3901, 3081, 1827, 65373, 106133}},
+{11854, 17, 52148, {1, 3, 3, 13, 3, 21, 73, 135, 353, 905, 1757, 1361, 3801, 15541, 2261, 17159, 18037}},
+{11855, 17, 52155, {1, 1, 7, 7, 27, 23, 57, 33, 225, 407, 1709, 1159, 6353, 13341, 15883, 17339, 50423}},
+{11856, 17, 52157, {1, 1, 3, 15, 13, 21, 33, 91, 183, 975, 1623, 3187, 5495, 8947, 7031, 19687, 104483}},
+{11857, 17, 52172, {1, 3, 5, 7, 17, 25, 77, 1, 335, 85, 1783, 2617, 4463, 3807, 12883, 24487, 66205}},
+{11858, 17, 52178, {1, 1, 3, 15, 23, 37, 83, 93, 211, 757, 903, 2681, 49, 435, 21057, 63635, 36489}},
+{11859, 17, 52184, {1, 3, 1, 13, 3, 45, 63, 57, 65, 21, 627, 1467, 51, 15887, 27465, 59227, 108233}},
+{11860, 17, 52199, {1, 1, 7, 5, 15, 41, 53, 57, 301, 677, 803, 1675, 6937, 3159, 14281, 22355, 37783}},
+{11861, 17, 52200, {1, 1, 5, 13, 15, 43, 39, 245, 191, 875, 1505, 2085, 3903, 185, 24461, 28939, 98771}},
+{11862, 17, 52205, {1, 1, 7, 9, 17, 25, 29, 31, 439, 159, 533, 3177, 4155, 403, 23735, 61817, 121909}},
+{11863, 17, 52206, {1, 1, 3, 15, 29, 43, 111, 47, 483, 513, 63, 2423, 4979, 5159, 15499, 33391, 51575}},
+{11864, 17, 52232, {1, 1, 5, 15, 15, 43, 13, 41, 445, 929, 1365, 2023, 6173, 6067, 30969, 51457, 51179}},
+{11865, 17, 52237, {1, 3, 3, 11, 15, 17, 93, 235, 159, 599, 635, 1113, 1017, 7413, 7737, 20051, 79127}},
+{11866, 17, 52243, {1, 1, 1, 15, 5, 19, 81, 65, 479, 119, 1831, 2515, 2929, 15395, 31607, 29969, 49935}},
+{11867, 17, 52246, {1, 3, 1, 13, 23, 47, 45, 151, 51, 217, 803, 3265, 5907, 14371, 8287, 25659, 27655}},
+{11868, 17, 52252, {1, 1, 1, 13, 13, 53, 11, 63, 501, 487, 1683, 1147, 4693, 2761, 19359, 2215, 112393}},
+{11869, 17, 52261, {1, 3, 3, 1, 31, 15, 61, 237, 129, 119, 135, 39, 6509, 3753, 16997, 3841, 24521}},
+{11870, 17, 52265, {1, 3, 5, 7, 5, 27, 113, 251, 217, 923, 229, 2259, 5241, 6331, 6773, 41929, 89605}},
+{11871, 17, 52266, {1, 1, 5, 9, 17, 41, 21, 185, 95, 137, 1151, 195, 913, 531, 15731, 22893, 93521}},
+{11872, 17, 52273, {1, 1, 5, 1, 29, 57, 123, 11, 345, 581, 227, 1539, 7527, 8537, 16429, 8437, 18953}},
+{11873, 17, 52274, {1, 1, 3, 7, 7, 21, 103, 239, 115, 513, 1287, 3717, 331, 5453, 18943, 17247, 64975}},
+{11874, 17, 52288, {1, 3, 7, 11, 21, 37, 79, 83, 93, 155, 1297, 1371, 1109, 6569, 21137, 29237, 24007}},
+{11875, 17, 52300, {1, 1, 1, 13, 17, 11, 127, 89, 397, 497, 1017, 721, 2837, 5623, 31745, 52243, 107225}},
+{11876, 17, 52303, {1, 1, 7, 9, 15, 43, 29, 215, 449, 233, 313, 2587, 2903, 2735, 4539, 50481, 85279}},
+{11877, 17, 52321, {1, 1, 3, 15, 13, 35, 109, 211, 299, 255, 1595, 533, 1801, 13965, 25277, 52347, 13447}},
+{11878, 17, 52322, {1, 1, 1, 15, 9, 23, 115, 119, 207, 973, 1339, 1315, 6465, 9917, 4593, 65435, 2515}},
+{11879, 17, 52328, {1, 3, 3, 3, 7, 25, 115, 115, 213, 845, 1445, 1217, 1563, 12491, 5197, 44409, 79895}},
+{11880, 17, 52333, {1, 1, 1, 3, 9, 33, 31, 203, 19, 895, 1145, 2893, 4807, 7501, 6999, 54883, 13797}},
+{11881, 17, 52351, {1, 1, 3, 1, 19, 51, 73, 29, 451, 533, 83, 2477, 335, 9703, 9747, 57427, 69443}},
+{11882, 17, 52357, {1, 1, 7, 5, 21, 11, 53, 133, 165, 291, 591, 1419, 3661, 4697, 21363, 53467, 84063}},
+{11883, 17, 52372, {1, 1, 7, 3, 13, 7, 85, 49, 193, 289, 1531, 709, 2351, 12085, 28553, 57145, 129517}},
+{11884, 17, 52381, {1, 1, 1, 1, 17, 19, 13, 213, 75, 977, 811, 1813, 7293, 13795, 28569, 28133, 11949}},
+{11885, 17, 52386, {1, 1, 5, 1, 27, 11, 47, 89, 271, 65, 1651, 2331, 3289, 6227, 15027, 19959, 22945}},
+{11886, 17, 52395, {1, 3, 7, 9, 17, 37, 17, 245, 249, 501, 405, 951, 3005, 9757, 10265, 35575, 70529}},
+{11887, 17, 52403, {1, 3, 1, 15, 21, 47, 15, 75, 113, 45, 125, 1393, 3361, 13477, 24325, 39743, 67409}},
+{11888, 17, 52423, {1, 3, 5, 1, 13, 3, 33, 51, 463, 241, 1421, 1607, 3937, 3405, 26653, 33955, 97915}},
+{11889, 17, 52427, {1, 3, 7, 13, 29, 17, 41, 193, 461, 787, 459, 4019, 1887, 13831, 9387, 25215, 69801}},
+{11890, 17, 52432, {1, 3, 1, 11, 31, 55, 13, 235, 85, 953, 109, 233, 1893, 13225, 26165, 59237, 15845}},
+{11891, 17, 52438, {1, 1, 1, 13, 11, 43, 127, 193, 143, 831, 875, 2471, 7011, 3063, 21979, 42113, 80581}},
+{11892, 17, 52444, {1, 3, 7, 1, 5, 1, 63, 55, 349, 525, 441, 2695, 3301, 15737, 13355, 16727, 25001}},
+{11893, 17, 52457, {1, 3, 7, 7, 31, 23, 87, 99, 331, 101, 1341, 3, 1447, 9507, 18627, 2503, 57597}},
+{11894, 17, 52468, {1, 1, 1, 9, 11, 19, 89, 141, 269, 31, 1933, 429, 7765, 5905, 15327, 25913, 17281}},
+{11895, 17, 52480, {1, 3, 1, 9, 23, 61, 75, 15, 121, 635, 1409, 615, 7841, 11993, 1637, 26073, 70763}},
+{11896, 17, 52498, {1, 3, 3, 1, 5, 63, 85, 3, 443, 87, 1201, 275, 3457, 16187, 26839, 16593, 36335}},
+{11897, 17, 52516, {1, 1, 5, 5, 27, 61, 1, 145, 287, 563, 1135, 2703, 733, 10209, 3937, 23807, 56857}},
+{11898, 17, 52520, {1, 3, 3, 7, 1, 41, 97, 155, 305, 395, 1607, 1171, 1061, 12301, 8041, 12111, 66831}},
+{11899, 17, 52525, {1, 3, 7, 15, 9, 61, 127, 225, 125, 231, 87, 2433, 6951, 2999, 24859, 61685, 111943}},
+{11900, 17, 52531, {1, 3, 5, 15, 13, 39, 87, 57, 305, 469, 1929, 1559, 1383, 2779, 3883, 845, 45181}},
+{11901, 17, 52540, {1, 1, 1, 15, 19, 1, 23, 41, 207, 731, 501, 1147, 6543, 5011, 483, 56889, 48993}},
+{11902, 17, 52545, {1, 3, 3, 15, 21, 35, 75, 129, 441, 497, 953, 201, 6849, 2893, 6351, 62163, 84127}},
+{11903, 17, 52546, {1, 1, 1, 9, 21, 31, 91, 79, 345, 649, 1529, 805, 4931, 12887, 30167, 52305, 92561}},
+{11904, 17, 52552, {1, 1, 5, 1, 3, 21, 121, 223, 67, 185, 801, 889, 7443, 8419, 19929, 11451, 11487}},
+{11905, 17, 52557, {1, 1, 3, 15, 21, 51, 119, 31, 197, 773, 617, 2055, 799, 9105, 12353, 33635, 27589}},
+{11906, 17, 52569, {1, 3, 5, 3, 27, 11, 41, 105, 289, 877, 1175, 3111, 3161, 12537, 18001, 38061, 59089}},
+{11907, 17, 52575, {1, 3, 3, 5, 3, 27, 101, 253, 225, 915, 1757, 1601, 3391, 10443, 3983, 58427, 93391}},
+{11908, 17, 52582, {1, 3, 1, 7, 9, 43, 85, 115, 169, 285, 1267, 3791, 2701, 5599, 10099, 48105, 45219}},
+{11909, 17, 52594, {1, 1, 7, 13, 25, 57, 35, 223, 265, 451, 1913, 2715, 8017, 3725, 7079, 34611, 61159}},
+{11910, 17, 52615, {1, 1, 3, 7, 23, 27, 93, 195, 449, 845, 865, 655, 4263, 12743, 7467, 7929, 7095}},
+{11911, 17, 52619, {1, 3, 5, 5, 29, 51, 109, 123, 227, 693, 2033, 3829, 7187, 4027, 17861, 45093, 7355}},
+{11912, 17, 52624, {1, 1, 1, 11, 27, 31, 127, 75, 443, 479, 865, 1377, 711, 3791, 27235, 17405, 25975}},
+{11913, 17, 52645, {1, 3, 5, 7, 1, 49, 79, 167, 471, 453, 211, 265, 8163, 6517, 3413, 17283, 51961}},
+{11914, 17, 52663, {1, 3, 1, 5, 17, 29, 15, 239, 385, 239, 425, 2197, 3553, 14913, 14889, 31645, 67477}},
+{11915, 17, 52664, {1, 3, 3, 5, 1, 11, 25, 105, 367, 253, 1395, 2077, 2613, 4535, 18215, 37657, 48283}},
+{11916, 17, 52675, {1, 3, 3, 1, 1, 41, 7, 161, 437, 659, 833, 3175, 2063, 14497, 6655, 8817, 127321}},
+{11917, 17, 52687, {1, 3, 1, 11, 17, 27, 3, 51, 75, 183, 1889, 287, 5429, 14007, 14445, 47395, 94543}},
+{11918, 17, 52696, {1, 1, 7, 13, 29, 9, 109, 19, 73, 3, 1529, 457, 6413, 4113, 14733, 24455, 44623}},
+{11919, 17, 52701, {1, 3, 1, 15, 15, 31, 83, 25, 263, 229, 1801, 377, 1703, 8571, 10393, 52021, 100937}},
+{11920, 17, 52706, {1, 3, 5, 9, 25, 57, 79, 19, 117, 437, 275, 3439, 6393, 2111, 8317, 3521, 96927}},
+{11921, 17, 52708, {1, 3, 1, 13, 27, 43, 103, 171, 361, 949, 347, 809, 5819, 2763, 10447, 35129, 46985}},
+{11922, 17, 52711, {1, 3, 5, 11, 17, 1, 27, 37, 473, 851, 1057, 831, 4373, 5179, 18193, 48731, 64317}},
+{11923, 17, 52726, {1, 3, 1, 7, 17, 5, 19, 217, 439, 549, 1983, 2473, 6059, 5271, 10279, 7793, 114357}},
+{11924, 17, 52748, {1, 3, 1, 5, 25, 19, 99, 65, 507, 527, 825, 2517, 2299, 1725, 9913, 5779, 12207}},
+{11925, 17, 52754, {1, 3, 1, 1, 29, 41, 119, 27, 411, 475, 461, 1885, 2339, 4945, 24665, 13621, 78129}},
+{11926, 17, 52756, {1, 3, 1, 11, 27, 29, 119, 155, 487, 29, 1545, 675, 1417, 6119, 12451, 21345, 39377}},
+{11927, 17, 52759, {1, 1, 3, 7, 19, 5, 111, 227, 49, 307, 549, 737, 4793, 13885, 22971, 18653, 69573}},
+{11928, 17, 52769, {1, 3, 3, 1, 27, 59, 87, 7, 379, 497, 903, 591, 6105, 1957, 25849, 55957, 120181}},
+{11929, 17, 52784, {1, 3, 5, 15, 19, 31, 43, 1, 35, 341, 311, 1343, 3625, 16181, 31047, 59679, 89231}},
+{11930, 17, 52790, {1, 1, 1, 15, 21, 19, 93, 229, 49, 597, 1465, 2027, 5935, 12269, 20239, 17861, 26311}},
+{11931, 17, 52804, {1, 1, 1, 1, 3, 31, 115, 87, 129, 419, 871, 2469, 3807, 4473, 25025, 36923, 67959}},
+{11932, 17, 52807, {1, 1, 1, 3, 23, 31, 41, 247, 295, 369, 1131, 2183, 8097, 7609, 4387, 37565, 50177}},
+{11933, 17, 52808, {1, 3, 1, 11, 9, 17, 111, 249, 417, 775, 217, 1435, 6295, 5065, 2967, 55361, 91933}},
+{11934, 17, 52819, {1, 3, 5, 7, 19, 21, 71, 219, 411, 31, 335, 2915, 3687, 5691, 12405, 34659, 76721}},
+{11935, 17, 52826, {1, 3, 5, 13, 29, 31, 95, 203, 149, 399, 547, 2529, 2485, 3371, 20219, 33647, 34217}},
+{11936, 17, 52828, {1, 3, 5, 13, 31, 41, 97, 115, 427, 35, 1319, 2335, 715, 2541, 4507, 49395, 33895}},
+{11937, 17, 52832, {1, 3, 7, 15, 3, 49, 3, 49, 153, 93, 1343, 1035, 5685, 15855, 15751, 27663, 99553}},
+{11938, 17, 52835, {1, 1, 7, 5, 27, 7, 53, 135, 453, 981, 1767, 3503, 1259, 11973, 23259, 41051, 96593}},
+{11939, 17, 52849, {1, 1, 7, 9, 5, 59, 57, 141, 41, 639, 1681, 145, 7019, 6621, 14221, 12051, 71871}},
+{11940, 17, 52859, {1, 1, 3, 1, 13, 39, 7, 187, 7, 919, 1555, 2111, 6507, 2099, 10643, 22851, 82033}},
+{11941, 17, 52877, {1, 3, 7, 9, 25, 59, 27, 225, 239, 715, 1115, 2309, 7785, 11849, 8991, 54305, 107305}},
+{11942, 17, 52880, {1, 1, 7, 11, 21, 51, 1, 223, 481, 195, 2005, 2651, 6797, 12201, 11013, 1843, 65167}},
+{11943, 17, 52896, {1, 3, 3, 11, 27, 3, 117, 5, 255, 595, 399, 1329, 1437, 12061, 32679, 16655, 76235}},
+{11944, 17, 52899, {1, 1, 7, 13, 21, 1, 35, 159, 329, 37, 1247, 2663, 3889, 14603, 25799, 45363, 87963}},
+{11945, 17, 52905, {1, 1, 7, 7, 7, 11, 53, 215, 351, 329, 1039, 969, 4449, 14785, 28617, 25953, 78663}},
+{11946, 17, 52913, {1, 1, 7, 7, 27, 17, 19, 223, 143, 433, 789, 1941, 5527, 711, 25097, 4571, 121975}},
+{11947, 17, 52933, {1, 3, 1, 13, 11, 47, 31, 249, 325, 1003, 509, 2741, 3953, 1691, 12661, 16097, 80211}},
+{11948, 17, 52934, {1, 3, 7, 9, 27, 11, 21, 129, 25, 57, 1523, 3631, 2639, 2541, 14249, 34539, 70551}},
+{11949, 17, 52938, {1, 1, 5, 3, 31, 47, 47, 73, 71, 783, 1353, 2157, 2563, 14015, 997, 31611, 118649}},
+{11950, 17, 52957, {1, 1, 5, 5, 25, 35, 25, 207, 349, 503, 121, 3455, 5783, 10899, 12745, 35117, 36679}},
+{11951, 17, 52979, {1, 3, 1, 3, 11, 39, 123, 177, 19, 441, 1979, 1257, 1351, 4253, 15145, 44559, 59379}},
+{11952, 17, 52981, {1, 3, 7, 3, 7, 35, 41, 203, 439, 1013, 1055, 1165, 1043, 11183, 1795, 31253, 113693}},
+{11953, 17, 52986, {1, 3, 1, 13, 7, 43, 57, 1, 229, 345, 631, 841, 7923, 5971, 20489, 47917, 66833}},
+{11954, 17, 53005, {1, 1, 1, 15, 27, 5, 31, 117, 153, 755, 1207, 619, 8185, 4329, 9979, 57255, 79045}},
+{11955, 17, 53008, {1, 3, 3, 7, 23, 1, 7, 227, 337, 417, 1895, 765, 7799, 13599, 27253, 4485, 112391}},
+{11956, 17, 53024, {1, 3, 5, 13, 27, 63, 5, 87, 101, 351, 953, 2235, 1587, 5479, 26529, 34165, 83303}},
+{11957, 17, 53029, {1, 1, 5, 15, 1, 43, 63, 193, 143, 711, 1779, 3531, 1355, 16253, 14595, 32343, 131021}},
+{11958, 17, 53054, {1, 1, 1, 9, 29, 37, 29, 71, 11, 877, 1301, 2415, 5593, 1855, 25223, 6805, 12901}},
+{11959, 17, 53073, {1, 1, 7, 9, 31, 5, 49, 63, 185, 373, 129, 1695, 7841, 4477, 17809, 42771, 120221}},
+{11960, 17, 53083, {1, 1, 5, 3, 15, 43, 49, 45, 47, 775, 699, 2787, 7831, 4189, 18317, 63933, 83669}},
+{11961, 17, 53086, {1, 3, 5, 3, 23, 33, 85, 255, 119, 685, 1245, 1647, 1999, 13063, 9241, 49017, 32619}},
+{11962, 17, 53095, {1, 1, 7, 15, 29, 15, 125, 233, 189, 411, 1251, 3459, 7213, 10081, 4403, 56819, 17103}},
+{11963, 17, 53102, {1, 3, 3, 11, 21, 13, 93, 125, 213, 793, 1057, 2363, 661, 12213, 2259, 3787, 91451}},
+{11964, 17, 53107, {1, 3, 5, 5, 19, 35, 5, 153, 507, 691, 1743, 1777, 7579, 14229, 10155, 18529, 35945}},
+{11965, 17, 53126, {1, 3, 7, 5, 27, 35, 13, 77, 189, 793, 877, 643, 2787, 5817, 22589, 58363, 49059}},
+{11966, 17, 53130, {1, 3, 7, 9, 9, 37, 21, 251, 119, 895, 1023, 91, 4317, 10943, 7355, 36961, 36903}},
+{11967, 17, 53138, {1, 3, 3, 13, 19, 49, 15, 105, 399, 29, 1903, 3503, 3453, 15429, 31503, 57815, 34009}},
+{11968, 17, 53144, {1, 1, 5, 1, 19, 35, 49, 97, 335, 665, 1871, 887, 4713, 517, 9571, 41601, 9673}},
+{11969, 17, 53156, {1, 3, 5, 13, 29, 45, 111, 233, 251, 407, 1135, 2791, 6525, 11633, 22295, 65381, 117511}},
+{11970, 17, 53163, {1, 1, 3, 3, 17, 7, 65, 43, 391, 91, 315, 3559, 479, 7337, 25629, 785, 19855}},
+{11971, 17, 53165, {1, 1, 5, 9, 29, 31, 67, 17, 381, 875, 1001, 415, 2263, 4415, 11263, 309, 117623}},
+{11972, 17, 53173, {1, 1, 7, 11, 25, 1, 59, 61, 247, 649, 687, 907, 1037, 13935, 7229, 39769, 92755}},
+{11973, 17, 53177, {1, 3, 5, 15, 21, 51, 27, 79, 343, 785, 1567, 1349, 7991, 8531, 11243, 61351, 21297}},
+{11974, 17, 53183, {1, 1, 1, 3, 31, 41, 67, 169, 83, 959, 813, 1953, 2467, 12369, 31431, 50761, 75731}},
+{11975, 17, 53192, {1, 1, 5, 11, 25, 37, 83, 163, 3, 161, 1249, 3009, 7167, 5473, 10561, 44899, 130879}},
+{11976, 17, 53195, {1, 1, 7, 11, 9, 61, 61, 113, 81, 205, 731, 3887, 5525, 13415, 25181, 11557, 59343}},
+{11977, 17, 53200, {1, 3, 7, 5, 19, 27, 107, 89, 295, 715, 1439, 1285, 5813, 8895, 7233, 32905, 3273}},
+{11978, 17, 53212, {1, 1, 5, 1, 29, 11, 125, 253, 445, 295, 1721, 1271, 2203, 2215, 7613, 55655, 112157}},
+{11979, 17, 53219, {1, 1, 5, 11, 11, 13, 111, 55, 19, 551, 1365, 477, 2513, 12311, 22485, 23291, 92447}},
+{11980, 17, 53221, {1, 1, 7, 11, 9, 5, 3, 109, 507, 441, 1767, 1781, 3077, 219, 29293, 21237, 71159}},
+{11981, 17, 53245, {1, 1, 3, 11, 3, 45, 99, 113, 367, 569, 1907, 1281, 51, 13693, 14639, 32999, 77461}},
+{11982, 17, 53254, {1, 3, 5, 11, 5, 19, 97, 11, 473, 937, 1623, 1507, 3245, 9331, 16005, 37505, 40085}},
+{11983, 17, 53257, {1, 1, 7, 13, 21, 61, 103, 111, 35, 141, 61, 1043, 1989, 1311, 29021, 2617, 89915}},
+{11984, 17, 53265, {1, 3, 7, 15, 19, 31, 39, 175, 371, 459, 1293, 1645, 1125, 1199, 4811, 55721, 76071}},
+{11985, 17, 53266, {1, 1, 7, 3, 3, 35, 17, 7, 91, 317, 1615, 3559, 191, 2579, 15027, 58711, 36009}},
+{11986, 17, 53268, {1, 1, 1, 13, 1, 27, 45, 87, 443, 443, 853, 3917, 1437, 4053, 14861, 2897, 109853}},
+{11987, 17, 53275, {1, 1, 5, 3, 21, 47, 73, 195, 115, 517, 1781, 2341, 805, 5679, 12053, 29113, 100479}},
+{11988, 17, 53277, {1, 1, 7, 1, 25, 27, 61, 167, 203, 57, 527, 1071, 7131, 8403, 9943, 11503, 33081}},
+{11989, 17, 53284, {1, 1, 5, 13, 31, 43, 35, 195, 177, 229, 1401, 4011, 2363, 15787, 21125, 32103, 62337}},
+{11990, 17, 53294, {1, 1, 5, 11, 19, 13, 3, 249, 119, 35, 747, 1419, 5451, 13043, 19813, 54859, 94825}},
+{11991, 17, 53308, {1, 3, 1, 9, 17, 13, 51, 125, 391, 157, 1199, 1805, 1763, 11831, 20915, 38547, 14221}},
+{11992, 17, 53314, {1, 1, 7, 1, 23, 61, 25, 69, 435, 183, 1379, 1211, 5529, 9447, 4575, 14127, 91867}},
+{11993, 17, 53319, {1, 3, 3, 15, 11, 15, 101, 135, 419, 685, 1097, 787, 2045, 3393, 26221, 23653, 116917}},
+{11994, 17, 53326, {1, 3, 1, 11, 29, 23, 13, 153, 27, 683, 1569, 413, 261, 10291, 23763, 15579, 39337}},
+{11995, 17, 53328, {1, 3, 7, 7, 19, 23, 121, 23, 339, 165, 1137, 2791, 319, 16111, 14847, 28171, 79237}},
+{11996, 17, 53340, {1, 3, 1, 5, 9, 59, 33, 19, 191, 707, 1883, 1683, 1161, 12905, 12299, 22201, 19811}},
+{11997, 17, 53364, {1, 3, 1, 3, 27, 11, 69, 199, 415, 251, 1079, 1709, 4539, 7867, 21321, 33617, 53459}},
+{11998, 17, 53367, {1, 1, 3, 9, 19, 59, 21, 95, 275, 213, 1819, 721, 6271, 11845, 9573, 16105, 12755}},
+{11999, 17, 53377, {1, 1, 1, 15, 23, 7, 91, 235, 43, 95, 913, 715, 3229, 12339, 23089, 30963, 129525}},
+{12000, 17, 53395, {1, 1, 7, 9, 7, 41, 43, 131, 485, 621, 1293, 1955, 5215, 6545, 29225, 53587, 46901}},
+{12001, 17, 53398, {1, 3, 1, 5, 7, 57, 97, 199, 225, 707, 1223, 1829, 497, 12587, 24551, 12907, 82411}},
+{12002, 17, 53407, {1, 1, 3, 7, 21, 9, 63, 15, 263, 957, 155, 4021, 4455, 2025, 16981, 19743, 88619}},
+{12003, 17, 53413, {1, 1, 7, 5, 31, 3, 27, 45, 369, 747, 1559, 1429, 8049, 15069, 19897, 50067, 52861}},
+{12004, 17, 53414, {1, 1, 5, 13, 23, 35, 91, 139, 73, 275, 207, 2709, 3801, 12755, 19155, 61629, 5513}},
+{12005, 17, 53417, {1, 1, 5, 7, 5, 25, 33, 45, 325, 847, 81, 891, 3191, 14115, 25095, 39867, 3839}},
+{12006, 17, 53443, {1, 3, 5, 13, 9, 31, 31, 113, 507, 833, 691, 2041, 4873, 81, 21365, 35265, 37627}},
+{12007, 17, 53473, {1, 1, 5, 13, 9, 51, 127, 131, 285, 683, 593, 3411, 6685, 3601, 12255, 8337, 80597}},
+{12008, 17, 53476, {1, 1, 5, 15, 29, 13, 79, 199, 157, 421, 1697, 2063, 2213, 4141, 21045, 45785, 124023}},
+{12009, 17, 53480, {1, 3, 1, 11, 19, 5, 79, 57, 71, 373, 487, 671, 3671, 9093, 20989, 48477, 104951}},
+{12010, 17, 53486, {1, 3, 5, 15, 13, 7, 39, 243, 507, 739, 1905, 3431, 4141, 9345, 27877, 64735, 112997}},
+{12011, 17, 53506, {1, 3, 3, 5, 17, 25, 31, 243, 393, 61, 199, 2825, 6981, 5887, 22289, 9201, 77689}},
+{12012, 17, 53542, {1, 3, 5, 15, 15, 63, 77, 39, 463, 883, 671, 3285, 6925, 15085, 1665, 64005, 130619}},
+{12013, 17, 53546, {1, 3, 3, 11, 21, 15, 7, 115, 9, 879, 1097, 3993, 3929, 9809, 22105, 9549, 31819}},
+{12014, 17, 53554, {1, 1, 7, 15, 3, 9, 19, 97, 327, 105, 1915, 205, 3873, 1229, 29915, 57375, 108217}},
+{12015, 17, 53563, {1, 1, 3, 11, 29, 41, 77, 11, 183, 73, 1651, 3739, 3911, 8695, 15339, 19293, 1827}},
+{12016, 17, 53580, {1, 1, 1, 5, 23, 49, 35, 175, 99, 49, 615, 1733, 6901, 2351, 18765, 55553, 99791}},
+{12017, 17, 53591, {1, 3, 7, 3, 25, 17, 67, 161, 507, 941, 35, 2619, 339, 791, 6485, 64277, 123867}},
+{12018, 17, 53598, {1, 1, 3, 13, 11, 9, 79, 193, 75, 391, 1753, 3537, 6971, 6607, 11933, 4447, 87793}},
+{12019, 17, 53611, {1, 1, 1, 5, 19, 9, 63, 203, 51, 395, 1365, 2393, 7265, 11709, 13721, 4519, 118765}},
+{12020, 17, 53621, {1, 1, 3, 9, 17, 53, 29, 103, 325, 973, 903, 785, 7535, 9951, 8121, 12603, 38679}},
+{12021, 17, 53625, {1, 3, 1, 7, 7, 63, 1, 123, 439, 181, 1373, 2705, 995, 10789, 7495, 54543, 120109}},
+{12022, 17, 53628, {1, 1, 7, 3, 17, 13, 79, 179, 165, 965, 1537, 3753, 3497, 12127, 6983, 48605, 113057}},
+{12023, 17, 53632, {1, 1, 5, 7, 3, 7, 41, 25, 267, 633, 19, 1317, 3445, 12377, 27881, 55249, 40841}},
+{12024, 17, 53650, {1, 3, 5, 1, 31, 55, 43, 129, 411, 281, 1, 851, 2419, 7943, 13721, 39371, 114557}},
+{12025, 17, 53655, {1, 1, 7, 7, 23, 19, 83, 37, 9, 161, 125, 3179, 7973, 9703, 23199, 32723, 130915}},
+{12026, 17, 53675, {1, 1, 7, 5, 27, 21, 11, 219, 403, 239, 1723, 2957, 3029, 9911, 10981, 35421, 74025}},
+{12027, 17, 53677, {1, 3, 1, 1, 31, 59, 69, 77, 395, 1, 157, 1259, 4913, 2089, 17619, 51033, 130899}},
+{12028, 17, 53680, {1, 3, 3, 3, 19, 11, 83, 237, 103, 921, 487, 1833, 8187, 3811, 18887, 9389, 80927}},
+{12029, 17, 53683, {1, 3, 7, 3, 17, 51, 107, 209, 187, 831, 1501, 1337, 803, 10361, 11347, 65291, 42219}},
+{12030, 17, 53700, {1, 3, 3, 15, 7, 29, 61, 25, 413, 257, 1185, 4009, 7463, 1839, 6645, 28389, 14449}},
+{12031, 17, 53709, {1, 3, 1, 9, 5, 31, 83, 55, 375, 399, 945, 997, 7649, 12631, 7691, 53325, 50173}},
+{12032, 17, 53724, {1, 1, 5, 9, 13, 9, 83, 37, 487, 975, 487, 3587, 7285, 7505, 10155, 673, 126505}},
+{12033, 17, 53731, {1, 3, 5, 7, 21, 3, 35, 21, 367, 323, 1579, 3351, 5465, 13719, 17033, 42573, 55079}},
+{12034, 17, 53733, {1, 3, 3, 15, 11, 27, 121, 109, 267, 855, 1417, 3839, 6535, 1051, 29355, 23815, 76031}},
+{12035, 17, 53738, {1, 1, 7, 9, 5, 31, 35, 53, 369, 137, 1545, 927, 825, 1333, 13637, 11003, 96963}},
+{12036, 17, 53762, {1, 1, 5, 3, 29, 41, 31, 85, 35, 477, 227, 3325, 1213, 681, 14591, 31325, 12199}},
+{12037, 17, 53767, {1, 3, 7, 11, 11, 11, 33, 255, 335, 747, 855, 31, 6101, 293, 20423, 47521, 62573}},
+{12038, 17, 53785, {1, 1, 1, 15, 31, 15, 33, 175, 321, 441, 1197, 3579, 4989, 9275, 30485, 1077, 122947}},
+{12039, 17, 53786, {1, 3, 5, 15, 23, 21, 127, 223, 249, 373, 1309, 1469, 5701, 9097, 29897, 26627, 38489}},
+{12040, 17, 53795, {1, 3, 7, 3, 3, 35, 83, 149, 259, 315, 1467, 1953, 6035, 7961, 10901, 25171, 130713}},
+{12041, 17, 53802, {1, 1, 3, 9, 7, 63, 55, 33, 375, 421, 151, 1721, 1999, 14937, 17539, 48323, 97345}},
+{12042, 17, 53812, {1, 1, 5, 5, 3, 21, 47, 19, 227, 131, 1591, 3779, 929, 13879, 13489, 19805, 20135}},
+{12043, 17, 53821, {1, 1, 7, 1, 31, 25, 87, 125, 213, 135, 809, 3067, 5035, 7407, 2193, 31423, 123973}},
+{12044, 17, 53827, {1, 3, 5, 13, 17, 19, 77, 169, 345, 115, 227, 649, 3609, 15063, 1895, 17533, 95859}},
+{12045, 17, 53833, {1, 3, 5, 15, 17, 29, 17, 11, 145, 601, 1871, 851, 8161, 14029, 10039, 4247, 62393}},
+{12046, 17, 53841, {1, 1, 7, 13, 25, 5, 49, 231, 261, 71, 335, 4081, 7915, 11367, 17087, 26041, 128737}},
+{12047, 17, 53848, {1, 1, 1, 13, 13, 21, 77, 113, 373, 1005, 109, 2877, 3001, 15011, 2465, 37015, 69049}},
+{12048, 17, 53869, {1, 1, 3, 15, 31, 33, 119, 121, 41, 9, 1567, 577, 1687, 12117, 17049, 675, 10729}},
+{12049, 17, 53897, {1, 3, 5, 11, 31, 7, 47, 41, 127, 81, 273, 1649, 975, 3953, 17021, 24163, 12599}},
+{12050, 17, 53905, {1, 3, 1, 3, 27, 41, 75, 237, 317, 85, 1995, 2255, 2191, 6441, 26629, 25797, 97681}},
+{12051, 17, 53912, {1, 1, 1, 3, 11, 5, 31, 109, 227, 977, 59, 793, 3305, 10905, 16529, 21345, 2403}},
+{12052, 17, 53921, {1, 3, 5, 9, 9, 37, 107, 129, 421, 383, 1415, 885, 3383, 9547, 7303, 41745, 59919}},
+{12053, 17, 53928, {1, 1, 7, 7, 29, 27, 59, 177, 97, 299, 1019, 1393, 7763, 5715, 9253, 58035, 23431}},
+{12054, 17, 53948, {1, 3, 3, 3, 23, 13, 51, 101, 75, 857, 1699, 2687, 3983, 10427, 19845, 49503, 96033}},
+{12055, 17, 53954, {1, 1, 1, 7, 21, 51, 25, 71, 265, 999, 1259, 625, 775, 11045, 20769, 42597, 115521}},
+{12056, 17, 53968, {1, 3, 1, 13, 25, 47, 21, 245, 201, 667, 1193, 1087, 407, 6057, 14929, 35291, 57615}},
+{12057, 17, 53977, {1, 1, 1, 7, 27, 25, 93, 85, 321, 1009, 1045, 1901, 349, 11393, 10917, 10413, 94125}},
+{12058, 17, 53983, {1, 1, 1, 15, 3, 63, 59, 51, 307, 135, 785, 1921, 6921, 5689, 8487, 21061, 69903}},
+{12059, 17, 53984, {1, 3, 7, 1, 13, 47, 59, 155, 107, 573, 843, 2849, 6685, 5927, 31747, 21541, 94271}},
+{12060, 17, 54002, {1, 1, 7, 15, 23, 7, 85, 169, 209, 527, 1027, 3745, 4773, 14893, 10789, 1243, 87133}},
+{12061, 17, 54007, {1, 1, 5, 9, 1, 1, 53, 57, 245, 899, 1785, 1951, 7651, 10909, 30167, 40789, 66965}},
+{12062, 17, 54013, {1, 1, 1, 7, 17, 33, 65, 79, 455, 677, 157, 1313, 1573, 9697, 4161, 4609, 42783}},
+{12063, 17, 54014, {1, 3, 7, 7, 27, 15, 109, 113, 239, 521, 563, 2493, 1471, 15817, 14515, 48465, 66009}},
+{12064, 17, 54021, {1, 3, 5, 3, 29, 33, 125, 169, 483, 593, 1665, 657, 3799, 15829, 29591, 25813, 40987}},
+{12065, 17, 54026, {1, 3, 1, 11, 15, 25, 21, 215, 341, 241, 1599, 3807, 6633, 15137, 15377, 56881, 47499}},
+{12066, 17, 54028, {1, 3, 3, 3, 15, 49, 89, 117, 191, 641, 675, 2671, 4243, 1617, 20261, 42669, 119173}},
+{12067, 17, 54031, {1, 1, 1, 13, 13, 43, 73, 103, 183, 239, 555, 2121, 4889, 1431, 20601, 21545, 11809}},
+{12068, 17, 54036, {1, 3, 1, 9, 9, 9, 121, 51, 77, 455, 1481, 427, 1961, 12149, 21273, 16295, 21909}},
+{12069, 17, 54067, {1, 1, 5, 11, 19, 55, 37, 63, 493, 663, 945, 2191, 2491, 11545, 7407, 36295, 94293}},
+{12070, 17, 54069, {1, 3, 5, 15, 25, 35, 103, 33, 171, 425, 409, 5, 2519, 2239, 30557, 20007, 69079}},
+{12071, 17, 54074, {1, 1, 5, 11, 13, 29, 71, 21, 35, 833, 191, 365, 7013, 12413, 10227, 56705, 61705}},
+{12072, 17, 54076, {1, 1, 1, 1, 21, 13, 87, 113, 63, 537, 283, 925, 2147, 1683, 31239, 2775, 131021}},
+{12073, 17, 54105, {1, 1, 3, 9, 23, 1, 117, 19, 487, 235, 877, 149, 369, 9615, 12501, 60175, 35741}},
+{12074, 17, 54111, {1, 1, 7, 9, 5, 25, 107, 199, 339, 755, 245, 2861, 1119, 14683, 2221, 5227, 81479}},
+{12075, 17, 54118, {1, 1, 1, 15, 5, 15, 37, 63, 511, 219, 783, 3245, 5563, 13231, 22311, 16803, 10393}},
+{12076, 17, 54129, {1, 3, 7, 5, 1, 15, 9, 21, 287, 991, 555, 771, 7683, 1661, 6553, 43735, 118713}},
+{12077, 17, 54145, {1, 3, 1, 3, 3, 29, 119, 157, 13, 599, 537, 2921, 5207, 11621, 1515, 6351, 118429}},
+{12078, 17, 54157, {1, 1, 5, 1, 27, 39, 111, 117, 481, 25, 549, 913, 6427, 7703, 23099, 50501, 7617}},
+{12079, 17, 54158, {1, 1, 7, 5, 29, 63, 43, 151, 63, 43, 197, 3165, 3879, 12435, 461, 64475, 60597}},
+{12080, 17, 54163, {1, 3, 1, 11, 31, 35, 59, 207, 387, 441, 1293, 2117, 3751, 12653, 2811, 42585, 33297}},
+{12081, 17, 54166, {1, 3, 7, 15, 27, 47, 13, 15, 135, 433, 615, 1, 171, 11503, 27117, 64635, 122191}},
+{12082, 17, 54172, {1, 1, 7, 1, 23, 23, 107, 135, 311, 395, 373, 2771, 81, 12513, 16739, 6715, 94999}},
+{12083, 17, 54185, {1, 3, 5, 7, 19, 9, 21, 139, 307, 231, 65, 59, 7767, 2897, 3503, 58163, 48807}},
+{12084, 17, 54186, {1, 3, 5, 13, 23, 5, 51, 247, 125, 911, 1395, 1337, 3215, 15811, 12729, 21495, 22597}},
+{12085, 17, 54188, {1, 3, 5, 5, 1, 19, 123, 125, 197, 533, 1699, 1397, 3473, 15201, 24493, 3395, 98261}},
+{12086, 17, 54208, {1, 1, 3, 7, 29, 39, 69, 97, 353, 293, 1103, 543, 5015, 9913, 6965, 61921, 122073}},
+{12087, 17, 54223, {1, 1, 3, 13, 19, 41, 117, 253, 449, 231, 865, 3055, 4751, 3277, 22863, 3249, 38359}},
+{12088, 17, 54237, {1, 3, 5, 13, 9, 7, 107, 17, 251, 501, 1925, 3733, 5035, 13213, 12535, 13705, 73047}},
+{12089, 17, 54241, {1, 3, 7, 5, 23, 5, 83, 45, 457, 667, 913, 1167, 7063, 10915, 10911, 20501, 61823}},
+{12090, 17, 54244, {1, 3, 3, 13, 7, 15, 29, 223, 503, 713, 667, 3989, 5927, 5909, 27633, 17615, 97931}},
+{12091, 17, 54259, {1, 3, 7, 13, 19, 53, 25, 41, 311, 327, 1323, 3361, 1095, 12701, 1065, 34155, 34705}},
+{12092, 17, 54273, {1, 1, 7, 7, 11, 35, 63, 73, 179, 477, 467, 4043, 3097, 16089, 12749, 18233, 50299}},
+{12093, 17, 54276, {1, 3, 3, 13, 5, 27, 31, 207, 357, 469, 607, 961, 7393, 6707, 25833, 22337, 119083}},
+{12094, 17, 54280, {1, 1, 3, 3, 7, 53, 47, 55, 267, 107, 1307, 2151, 793, 15605, 12153, 13075, 76529}},
+{12095, 17, 54294, {1, 3, 5, 1, 13, 35, 63, 191, 375, 221, 1603, 2049, 5363, 1481, 32271, 22635, 118603}},
+{12096, 17, 54298, {1, 1, 1, 11, 17, 63, 13, 3, 353, 943, 443, 141, 7441, 12335, 4499, 15923, 63677}},
+{12097, 17, 54303, {1, 3, 7, 13, 21, 51, 125, 61, 203, 1, 707, 3893, 4627, 3125, 14629, 62721, 85101}},
+{12098, 17, 54304, {1, 1, 3, 5, 31, 23, 63, 241, 41, 721, 599, 1761, 2593, 1685, 31247, 7811, 87561}},
+{12099, 17, 54309, {1, 1, 7, 9, 7, 53, 51, 9, 303, 675, 1261, 1591, 4363, 15, 29723, 54533, 103869}},
+{12100, 17, 54310, {1, 3, 5, 7, 27, 21, 103, 113, 463, 379, 635, 2363, 607, 11445, 22475, 58433, 93071}},
+{12101, 17, 54316, {1, 1, 5, 5, 5, 63, 23, 67, 399, 279, 829, 945, 6545, 14951, 5135, 22889, 87625}},
+{12102, 17, 54336, {1, 1, 7, 15, 1, 59, 69, 123, 169, 821, 1125, 2051, 3375, 11691, 1379, 57461, 124209}},
+{12103, 17, 54354, {1, 1, 5, 15, 31, 57, 51, 59, 297, 459, 701, 241, 2801, 11893, 4007, 13165, 79403}},
+{12104, 17, 54359, {1, 1, 5, 9, 11, 41, 79, 47, 19, 529, 21, 1871, 371, 6269, 7433, 36183, 96113}},
+{12105, 17, 54375, {1, 1, 7, 5, 29, 3, 33, 191, 119, 501, 1637, 2903, 3347, 4581, 17407, 18169, 10595}},
+{12106, 17, 54376, {1, 3, 5, 11, 9, 35, 95, 193, 413, 727, 1157, 3331, 5993, 1781, 22653, 3975, 110557}},
+{12107, 17, 54381, {1, 1, 1, 1, 23, 5, 35, 65, 57, 515, 569, 4031, 7983, 4603, 29419, 44847, 63601}},
+{12108, 17, 54390, {1, 3, 1, 7, 21, 5, 77, 23, 317, 803, 723, 3229, 7171, 2883, 10943, 50323, 108579}},
+{12109, 17, 54396, {1, 3, 5, 11, 15, 53, 75, 127, 177, 19, 501, 1201, 5113, 9069, 8817, 14725, 104737}},
+{12110, 17, 54399, {1, 3, 7, 9, 7, 39, 5, 121, 409, 103, 1075, 451, 7603, 16023, 32557, 43159, 94385}},
+{12111, 17, 54409, {1, 3, 1, 11, 29, 57, 123, 141, 57, 945, 1777, 2427, 2359, 12839, 7325, 7945, 129811}},
+{12112, 17, 54424, {1, 3, 5, 15, 5, 3, 17, 55, 467, 61, 131, 2891, 6331, 5859, 20437, 49425, 80731}},
+{12113, 17, 54434, {1, 1, 1, 15, 29, 13, 127, 181, 361, 1019, 1675, 2755, 6533, 8957, 14691, 4285, 65459}},
+{12114, 17, 54436, {1, 1, 7, 11, 23, 43, 111, 183, 103, 269, 229, 3291, 1873, 11349, 29319, 64829, 19639}},
+{12115, 17, 54439, {1, 3, 7, 11, 15, 63, 1, 253, 489, 863, 1707, 2769, 3201, 7901, 18161, 12515, 130237}},
+{12116, 17, 54445, {1, 3, 1, 7, 1, 25, 43, 159, 505, 511, 1745, 1421, 6779, 11103, 23535, 61129, 124571}},
+{12117, 17, 54448, {1, 1, 3, 13, 19, 33, 17, 243, 481, 617, 1061, 1891, 7165, 6821, 18505, 8965, 70179}},
+{12118, 17, 54457, {1, 1, 7, 13, 17, 17, 65, 23, 255, 361, 1873, 1605, 2041, 11119, 11419, 63131, 49207}},
+{12119, 17, 54465, {1, 1, 5, 13, 15, 57, 27, 223, 199, 529, 1115, 1513, 8083, 11713, 21005, 50741, 122223}},
+{12120, 17, 54471, {1, 3, 5, 15, 29, 35, 107, 85, 141, 505, 1553, 1283, 4581, 5077, 9461, 59853, 23219}},
+{12121, 17, 54472, {1, 3, 5, 11, 11, 45, 53, 195, 199, 773, 1911, 721, 1563, 3769, 3267, 30673, 80313}},
+{12122, 17, 54485, {1, 3, 7, 7, 21, 37, 9, 129, 431, 79, 1559, 2125, 7781, 6441, 23533, 46919, 25315}},
+{12123, 17, 54508, {1, 1, 5, 15, 11, 61, 77, 231, 349, 647, 225, 85, 6789, 12557, 6505, 21985, 54965}},
+{12124, 17, 54513, {1, 1, 5, 1, 19, 21, 33, 211, 347, 491, 1119, 1619, 3739, 11255, 26705, 59691, 35337}},
+{12125, 17, 54528, {1, 1, 3, 3, 29, 15, 7, 23, 279, 145, 699, 289, 475, 1681, 3201, 64477, 24919}},
+{12126, 17, 54534, {1, 1, 7, 7, 23, 53, 75, 71, 315, 403, 1521, 1417, 3749, 11243, 3951, 61039, 51143}},
+{12127, 17, 54537, {1, 3, 7, 3, 15, 21, 81, 219, 249, 387, 1405, 3495, 7143, 2599, 25435, 15259, 66069}},
+{12128, 17, 54540, {1, 1, 5, 7, 31, 9, 63, 55, 409, 421, 1851, 847, 1593, 10447, 2833, 13209, 47285}},
+{12129, 17, 54551, {1, 1, 3, 7, 15, 3, 35, 49, 253, 21, 1705, 357, 2751, 9671, 12429, 4549, 118691}},
+{12130, 17, 54561, {1, 1, 5, 15, 1, 3, 97, 197, 43, 923, 1273, 663, 4291, 12357, 28221, 15291, 60989}},
+{12131, 17, 54573, {1, 1, 7, 7, 15, 3, 35, 115, 449, 641, 743, 1855, 359, 10983, 2831, 43983, 56465}},
+{12132, 17, 54579, {1, 3, 7, 11, 1, 51, 69, 27, 29, 187, 1673, 1273, 7987, 1223, 8971, 53805, 4413}},
+{12133, 17, 54586, {1, 1, 3, 11, 1, 55, 91, 241, 35, 97, 1027, 3967, 703, 3535, 21681, 55825, 50423}},
+{12134, 17, 54591, {1, 1, 7, 11, 21, 53, 111, 125, 11, 355, 1585, 3603, 1705, 16311, 7045, 15503, 63625}},
+{12135, 17, 54596, {1, 1, 5, 15, 25, 47, 31, 29, 333, 361, 1831, 1545, 7751, 8679, 32453, 61755, 94637}},
+{12136, 17, 54599, {1, 1, 3, 3, 23, 3, 79, 11, 367, 551, 281, 1273, 5097, 12527, 473, 33855, 85783}},
+{12137, 17, 54605, {1, 1, 1, 15, 27, 21, 107, 121, 187, 495, 1877, 1957, 3647, 13263, 30729, 18131, 33689}},
+{12138, 17, 54613, {1, 1, 5, 13, 3, 43, 41, 53, 127, 299, 839, 3327, 7929, 9921, 29471, 18075, 34283}},
+{12139, 17, 54623, {1, 1, 7, 13, 31, 5, 59, 75, 335, 929, 379, 139, 7121, 9281, 31161, 3177, 2615}},
+{12140, 17, 54654, {1, 3, 7, 1, 11, 19, 81, 199, 425, 639, 497, 693, 1271, 7363, 10543, 52513, 130549}},
+{12141, 17, 54667, {1, 3, 3, 7, 21, 41, 101, 67, 363, 5, 1455, 1433, 81, 15609, 16231, 13285, 38995}},
+{12142, 17, 54681, {1, 1, 3, 15, 11, 19, 123, 177, 429, 27, 141, 3095, 5379, 2241, 29877, 59383, 25199}},
+{12143, 17, 54684, {1, 1, 7, 7, 19, 63, 93, 217, 279, 349, 149, 2479, 2355, 6475, 29993, 37941, 58715}},
+{12144, 17, 54687, {1, 3, 7, 3, 21, 23, 59, 177, 489, 817, 1209, 1629, 5805, 3137, 23767, 62967, 16609}},
+{12145, 17, 54694, {1, 3, 3, 7, 9, 55, 59, 31, 191, 891, 833, 1059, 3007, 2331, 385, 58247, 110697}},
+{12146, 17, 54706, {1, 1, 3, 3, 11, 61, 9, 189, 79, 621, 209, 2785, 2959, 4133, 20691, 45605, 117089}},
+{12147, 17, 54712, {1, 3, 3, 5, 5, 47, 31, 1, 451, 765, 2027, 2327, 1725, 14341, 7997, 6449, 77893}},
+{12148, 17, 54715, {1, 1, 7, 1, 7, 27, 27, 129, 227, 505, 1461, 783, 945, 12653, 17913, 61631, 41875}},
+{12149, 17, 54723, {1, 1, 1, 11, 13, 41, 41, 221, 483, 825, 451, 493, 1717, 10389, 7805, 37707, 30733}},
+{12150, 17, 54725, {1, 1, 5, 3, 31, 31, 75, 3, 323, 83, 563, 919, 7387, 1673, 6157, 7415, 14947}},
+{12151, 17, 54726, {1, 1, 7, 13, 19, 37, 29, 93, 153, 491, 1033, 1389, 6361, 11133, 20049, 24585, 107325}},
+{12152, 17, 54740, {1, 1, 1, 15, 3, 35, 79, 251, 383, 665, 2033, 3165, 3411, 15965, 28281, 56521, 56479}},
+{12153, 17, 54750, {1, 3, 1, 15, 23, 1, 87, 145, 443, 405, 635, 1597, 1455, 5983, 12741, 55133, 2815}},
+{12154, 17, 54760, {1, 1, 1, 13, 11, 25, 19, 129, 23, 913, 1121, 223, 1991, 13449, 30443, 50573, 108467}},
+{12155, 17, 54768, {1, 1, 7, 11, 29, 31, 49, 51, 415, 293, 173, 4091, 159, 2679, 30643, 58725, 109287}},
+{12156, 17, 54771, {1, 1, 1, 7, 15, 53, 69, 231, 387, 693, 1299, 1383, 7935, 10313, 22403, 59341, 3347}},
+{12157, 17, 54773, {1, 3, 3, 5, 9, 21, 111, 11, 469, 109, 1565, 3107, 2975, 12491, 26773, 33245, 27589}},
+{12158, 17, 54796, {1, 1, 3, 5, 3, 9, 103, 127, 345, 301, 857, 2035, 3269, 13819, 7555, 5197, 94557}},
+{12159, 17, 54801, {1, 3, 7, 3, 31, 3, 61, 253, 221, 359, 1281, 1405, 4819, 1329, 17773, 29539, 127043}},
+{12160, 17, 54808, {1, 1, 7, 11, 17, 47, 105, 253, 253, 531, 119, 2009, 6125, 9387, 13141, 29079, 28361}},
+{12161, 17, 54814, {1, 1, 3, 5, 21, 13, 21, 223, 79, 819, 1425, 1001, 6517, 8883, 29997, 30637, 7717}},
+{12162, 17, 54837, {1, 3, 1, 3, 1, 23, 113, 69, 235, 95, 1873, 689, 4611, 13209, 12681, 16057, 114071}},
+{12163, 17, 54847, {1, 3, 3, 13, 25, 21, 93, 55, 253, 373, 1659, 829, 6539, 7453, 28195, 33131, 92559}},
+{12164, 17, 54849, {1, 1, 3, 11, 25, 29, 81, 235, 429, 811, 1867, 2923, 5949, 4423, 93, 64631, 48357}},
+{12165, 17, 54864, {1, 3, 5, 13, 29, 27, 35, 15, 105, 849, 247, 3999, 6441, 12443, 19817, 49897, 21515}},
+{12166, 17, 54867, {1, 1, 5, 15, 13, 59, 3, 199, 267, 463, 655, 3875, 2895, 13411, 5081, 22069, 6053}},
+{12167, 17, 54889, {1, 1, 5, 9, 5, 13, 111, 83, 281, 543, 629, 1349, 1863, 9523, 19201, 39229, 78265}},
+{12168, 17, 54895, {1, 3, 7, 1, 29, 23, 109, 75, 347, 643, 97, 1981, 2797, 11201, 28355, 54105, 45551}},
+{12169, 17, 54907, {1, 3, 1, 7, 9, 5, 77, 17, 179, 957, 621, 779, 7117, 1491, 11563, 10131, 98335}},
+{12170, 17, 54919, {1, 3, 3, 1, 3, 53, 39, 217, 309, 105, 485, 3123, 3143, 2359, 4923, 22307, 120319}},
+{12171, 17, 54923, {1, 1, 7, 7, 11, 5, 65, 165, 321, 455, 625, 2417, 999, 14999, 6777, 13319, 43399}},
+{12172, 17, 54926, {1, 1, 7, 3, 11, 55, 43, 119, 135, 129, 581, 3593, 3475, 14667, 30509, 5007, 120135}},
+{12173, 17, 54940, {1, 1, 1, 11, 7, 17, 95, 169, 401, 87, 1425, 1821, 7619, 3605, 10993, 35837, 87311}},
+{12174, 17, 54950, {1, 1, 7, 11, 11, 35, 29, 63, 395, 301, 373, 2457, 6859, 1915, 11215, 41075, 78219}},
+{12175, 17, 54954, {1, 3, 5, 7, 25, 3, 97, 43, 273, 459, 103, 3441, 71, 10269, 29893, 46053, 104801}},
+{12176, 17, 54961, {1, 3, 3, 7, 31, 3, 121, 255, 73, 783, 977, 513, 6527, 1189, 8925, 23245, 22287}},
+{12177, 17, 54973, {1, 3, 3, 13, 15, 53, 51, 135, 465, 341, 263, 1687, 4085, 14257, 18745, 46945, 115475}},
+{12178, 17, 54974, {1, 3, 1, 5, 31, 1, 1, 91, 511, 771, 1501, 2613, 991, 3859, 28911, 65417, 201}},
+{12179, 17, 54976, {1, 1, 7, 1, 27, 21, 107, 153, 163, 949, 811, 3087, 3443, 5621, 28795, 58311, 63763}},
+{12180, 17, 54986, {1, 1, 7, 5, 29, 29, 57, 175, 29, 821, 1545, 2643, 725, 16225, 29111, 19675, 129995}},
+{12181, 17, 54993, {1, 1, 7, 3, 31, 31, 61, 155, 265, 323, 1829, 3891, 6393, 8573, 10627, 10839, 78683}},
+{12182, 17, 55000, {1, 3, 5, 7, 29, 7, 67, 181, 313, 731, 1761, 1681, 3673, 8939, 811, 48931, 82021}},
+{12183, 17, 55010, {1, 3, 1, 3, 11, 51, 81, 67, 173, 881, 855, 3627, 1613, 4825, 7035, 36261, 64899}},
+{12184, 17, 55019, {1, 3, 7, 7, 15, 53, 123, 41, 265, 817, 807, 3875, 7675, 16225, 13313, 62217, 47647}},
+{12185, 17, 55021, {1, 1, 3, 13, 23, 47, 125, 155, 403, 651, 1693, 2185, 5565, 9947, 20893, 11287, 118943}},
+{12186, 17, 55030, {1, 3, 7, 3, 19, 47, 69, 5, 209, 259, 367, 3929, 7579, 12687, 18109, 51885, 128281}},
+{12187, 17, 55033, {1, 1, 7, 5, 27, 41, 45, 41, 205, 1001, 1509, 2649, 1141, 5355, 10265, 34131, 112111}},
+{12188, 17, 55039, {1, 3, 7, 5, 19, 41, 103, 63, 49, 25, 271, 793, 3217, 4741, 2563, 61333, 113205}},
+{12189, 17, 55047, {1, 3, 3, 15, 15, 35, 13, 233, 277, 673, 545, 545, 7419, 6707, 1867, 58873, 110027}},
+{12190, 17, 55048, {1, 1, 7, 3, 9, 23, 67, 55, 3, 1019, 2001, 2909, 7311, 9295, 26953, 43217, 54597}},
+{12191, 17, 55054, {1, 3, 5, 7, 13, 33, 67, 27, 75, 569, 1777, 791, 1223, 1805, 19167, 60537, 60039}},
+{12192, 17, 55059, {1, 1, 5, 13, 15, 61, 49, 59, 289, 907, 1055, 3579, 8169, 12119, 25479, 32867, 65343}},
+{12193, 17, 55068, {1, 3, 5, 9, 5, 63, 91, 225, 377, 469, 891, 891, 5115, 11487, 30151, 44357, 120077}},
+{12194, 17, 55071, {1, 1, 1, 15, 29, 59, 19, 51, 295, 585, 149, 497, 5837, 11629, 7825, 18129, 113797}},
+{12195, 17, 55075, {1, 1, 3, 7, 31, 25, 77, 209, 183, 337, 1753, 2703, 2559, 11847, 17349, 27359, 21771}},
+{12196, 17, 55077, {1, 1, 7, 7, 13, 23, 69, 61, 353, 339, 833, 1935, 4333, 10521, 20331, 62145, 59245}},
+{12197, 17, 55081, {1, 1, 5, 13, 19, 57, 35, 59, 203, 99, 487, 2747, 637, 8213, 27053, 29, 64335}},
+{12198, 17, 55095, {1, 3, 5, 7, 27, 5, 71, 147, 339, 313, 913, 2845, 5713, 4383, 18969, 54871, 51931}},
+{12199, 17, 55099, {1, 1, 1, 5, 7, 23, 19, 11, 111, 543, 311, 1519, 387, 10175, 18209, 14115, 123421}},
+{12200, 17, 55110, {1, 3, 7, 11, 7, 7, 123, 193, 417, 65, 1317, 3821, 2315, 14527, 14113, 25873, 23977}},
+{12201, 17, 55116, {1, 1, 3, 15, 21, 11, 3, 37, 115, 395, 877, 1227, 6997, 4357, 11397, 52855, 24899}},
+{12202, 17, 55122, {1, 1, 7, 5, 15, 45, 45, 17, 441, 605, 429, 739, 4759, 5249, 11311, 55049, 56909}},
+{12203, 17, 55134, {1, 1, 1, 5, 3, 5, 77, 31, 407, 703, 385, 235, 7751, 617, 16013, 27269, 66971}},
+{12204, 17, 55144, {1, 3, 3, 15, 25, 27, 19, 251, 465, 197, 1039, 3261, 4557, 4821, 16083, 43997, 61371}},
+{12205, 17, 55147, {1, 3, 3, 15, 21, 45, 13, 139, 213, 797, 619, 2125, 3805, 4149, 11427, 59807, 104587}},
+{12206, 17, 55158, {1, 3, 1, 1, 29, 27, 25, 7, 371, 535, 1613, 1083, 4221, 8913, 10601, 6447, 17619}},
+{12207, 17, 55162, {1, 1, 3, 3, 13, 35, 37, 127, 285, 899, 307, 123, 129, 14035, 26503, 64103, 27155}},
+{12208, 17, 55171, {1, 1, 7, 7, 27, 25, 45, 245, 271, 281, 69, 3505, 7087, 1529, 7121, 30327, 89131}},
+{12209, 17, 55185, {1, 1, 3, 11, 13, 57, 31, 23, 455, 427, 1683, 3019, 5827, 8817, 12943, 321, 39951}},
+{12210, 17, 55192, {1, 3, 1, 3, 31, 41, 69, 211, 385, 275, 1569, 2265, 4017, 11057, 15, 16619, 126967}},
+{12211, 17, 55197, {1, 3, 3, 1, 27, 27, 21, 145, 125, 929, 1371, 1469, 1591, 5283, 4651, 1265, 17161}},
+{12212, 17, 55207, {1, 3, 7, 5, 29, 31, 41, 141, 49, 967, 1421, 663, 6089, 3831, 11353, 38809, 108605}},
+{12213, 17, 55228, {1, 1, 7, 15, 11, 23, 91, 31, 9, 717, 265, 1729, 3563, 8145, 20441, 22933, 103683}},
+{12214, 17, 55246, {1, 1, 7, 3, 17, 13, 47, 13, 241, 1017, 1803, 2091, 7379, 2941, 11783, 36189, 53513}},
+{12215, 17, 55253, {1, 3, 1, 11, 31, 63, 107, 79, 427, 385, 1497, 1265, 5135, 13597, 27343, 56733, 100595}},
+{12216, 17, 55254, {1, 3, 7, 3, 9, 15, 119, 29, 205, 151, 1453, 3575, 3627, 7815, 3553, 31457, 14267}},
+{12217, 17, 55281, {1, 3, 1, 7, 15, 21, 73, 47, 417, 29, 1231, 2477, 161, 15997, 4457, 3939, 43929}},
+{12218, 17, 55300, {1, 1, 5, 5, 19, 49, 103, 251, 359, 69, 669, 299, 8161, 10579, 13999, 26859, 92199}},
+{12219, 17, 55303, {1, 1, 3, 1, 9, 27, 81, 7, 115, 29, 1067, 1933, 3061, 2885, 27883, 65227, 59365}},
+{12220, 17, 55307, {1, 1, 1, 5, 23, 17, 1, 113, 495, 155, 1673, 3945, 8053, 7935, 3537, 65141, 11809}},
+{12221, 17, 55312, {1, 1, 1, 15, 15, 59, 61, 213, 303, 851, 1893, 615, 6659, 9351, 16621, 6097, 114383}},
+{12222, 17, 55328, {1, 3, 1, 7, 19, 11, 95, 127, 277, 677, 1631, 2563, 3295, 7029, 4059, 44079, 128857}},
+{12223, 17, 55331, {1, 3, 7, 11, 27, 49, 99, 43, 279, 771, 123, 2969, 699, 12915, 22039, 62257, 79359}},
+{12224, 17, 55337, {1, 1, 7, 3, 19, 45, 45, 113, 251, 883, 715, 1541, 1573, 3345, 23855, 62681, 57591}},
+{12225, 17, 55348, {1, 1, 5, 15, 11, 1, 51, 15, 135, 519, 961, 1447, 4425, 2139, 3309, 35111, 74143}},
+{12226, 17, 55352, {1, 3, 7, 7, 17, 39, 109, 25, 11, 549, 315, 2175, 685, 11837, 9151, 6277, 45011}},
+{12227, 17, 55357, {1, 1, 1, 9, 27, 7, 95, 1, 385, 167, 453, 1027, 4105, 16351, 19, 10375, 62833}},
+{12228, 17, 55372, {1, 3, 7, 13, 17, 19, 107, 11, 441, 171, 185, 3567, 1245, 12161, 30257, 48105, 87105}},
+{12229, 17, 55375, {1, 3, 3, 9, 15, 5, 109, 225, 85, 919, 513, 3559, 5411, 9009, 27391, 25115, 84875}},
+{12230, 17, 55377, {1, 3, 3, 7, 11, 37, 81, 51, 121, 25, 1897, 2121, 6425, 16087, 4259, 29501, 118067}},
+{12231, 17, 55394, {1, 1, 7, 3, 5, 53, 73, 127, 137, 739, 543, 1723, 1163, 2791, 18519, 1459, 50869}},
+{12232, 17, 55406, {1, 1, 3, 11, 29, 51, 101, 189, 193, 839, 25, 3109, 3035, 3917, 23929, 38577, 129705}},
+{12233, 17, 55424, {1, 3, 7, 15, 9, 29, 93, 101, 271, 791, 1257, 1843, 2701, 8205, 15195, 9109, 120835}},
+{12234, 17, 55429, {1, 3, 3, 5, 29, 47, 31, 135, 483, 385, 1395, 2955, 7291, 12885, 9491, 14581, 66293}},
+{12235, 17, 55430, {1, 1, 7, 1, 5, 37, 105, 149, 63, 617, 1611, 3025, 3177, 15463, 3373, 3503, 95001}},
+{12236, 17, 55436, {1, 1, 5, 13, 1, 57, 19, 35, 127, 423, 1221, 1547, 4083, 347, 17131, 60087, 27437}},
+{12237, 17, 55439, {1, 3, 7, 9, 25, 1, 105, 39, 25, 921, 1897, 1729, 2207, 7761, 24197, 457, 64241}},
+{12238, 17, 55447, {1, 3, 7, 9, 15, 21, 13, 113, 379, 1021, 489, 1757, 5869, 4833, 24717, 52227, 3209}},
+{12239, 17, 55453, {1, 3, 1, 5, 9, 61, 25, 41, 183, 473, 383, 2259, 6939, 3, 32161, 6319, 93099}},
+{12240, 17, 55458, {1, 1, 5, 13, 13, 47, 97, 3, 357, 837, 1655, 485, 4251, 12153, 9013, 25121, 51877}},
+{12241, 17, 55460, {1, 1, 1, 15, 7, 59, 65, 119, 467, 313, 1333, 2007, 5165, 13935, 13679, 3999, 81811}},
+{12242, 17, 55478, {1, 1, 5, 13, 13, 1, 63, 117, 449, 13, 1017, 1583, 7599, 3669, 32699, 59455, 32363}},
+{12243, 17, 55489, {1, 1, 7, 9, 7, 15, 37, 251, 167, 25, 1085, 2067, 2771, 5737, 20661, 19231, 59547}},
+{12244, 17, 55501, {1, 1, 5, 13, 29, 11, 63, 37, 281, 657, 1567, 2879, 7601, 15617, 16527, 51695, 5583}},
+{12245, 17, 55502, {1, 1, 5, 3, 31, 17, 19, 65, 315, 413, 927, 3617, 4089, 11899, 3759, 47991, 1685}},
+{12246, 17, 55519, {1, 1, 1, 1, 13, 47, 89, 91, 379, 429, 283, 3765, 2923, 14955, 26399, 9579, 39817}},
+{12247, 17, 55525, {1, 1, 1, 9, 1, 17, 91, 119, 327, 291, 39, 2883, 6265, 553, 7559, 60577, 34393}},
+{12248, 17, 55530, {1, 3, 5, 5, 9, 33, 123, 219, 103, 529, 181, 1321, 6815, 2411, 10555, 43911, 18889}},
+{12249, 17, 55544, {1, 1, 5, 7, 9, 13, 7, 45, 427, 523, 1189, 255, 2103, 7217, 16249, 14631, 90409}},
+{12250, 17, 55550, {1, 1, 1, 9, 11, 35, 55, 71, 89, 637, 1417, 411, 5305, 10125, 20715, 62927, 4993}},
+{12251, 17, 55558, {1, 3, 1, 9, 1, 59, 27, 221, 267, 797, 1081, 951, 1369, 2677, 20763, 63301, 61963}},
+{12252, 17, 55561, {1, 3, 5, 5, 17, 9, 67, 177, 89, 953, 1329, 1649, 989, 7773, 28747, 26231, 42331}},
+{12253, 17, 55569, {1, 3, 3, 9, 23, 35, 17, 145, 53, 519, 1173, 2079, 2593, 3633, 32005, 30573, 55651}},
+{12254, 17, 55586, {1, 1, 7, 7, 17, 41, 47, 253, 107, 843, 9, 323, 2391, 3267, 25813, 1741, 93493}},
+{12255, 17, 55591, {1, 1, 1, 9, 31, 43, 47, 91, 235, 569, 2017, 2385, 5055, 5747, 26471, 48819, 47315}},
+{12256, 17, 55598, {1, 3, 5, 9, 1, 17, 87, 91, 55, 287, 995, 2577, 1151, 9119, 22791, 50899, 16423}},
+{12257, 17, 55605, {1, 3, 7, 1, 3, 29, 9, 193, 269, 201, 325, 2209, 1061, 7957, 23265, 65083, 27575}},
+{12258, 17, 55609, {1, 3, 7, 15, 27, 23, 37, 239, 165, 959, 1965, 2105, 1581, 6621, 17315, 49255, 62487}},
+{12259, 17, 55618, {1, 3, 7, 7, 11, 31, 73, 145, 429, 421, 571, 3375, 2797, 15889, 26523, 12315, 48061}},
+{12260, 17, 55630, {1, 3, 3, 15, 23, 27, 105, 75, 497, 137, 475, 1343, 537, 10499, 27807, 46623, 32435}},
+{12261, 17, 55642, {1, 1, 7, 15, 15, 11, 51, 107, 225, 557, 1461, 3447, 1243, 13827, 23675, 26139, 54603}},
+{12262, 17, 55644, {1, 3, 5, 5, 7, 25, 51, 3, 85, 371, 1503, 3217, 1779, 7141, 29471, 42247, 107699}},
+{12263, 17, 55653, {1, 3, 7, 15, 23, 53, 127, 229, 241, 165, 1985, 1921, 5917, 15743, 18349, 23981, 58241}},
+{12264, 17, 55654, {1, 1, 3, 13, 9, 63, 49, 67, 21, 57, 377, 1807, 5603, 13651, 28039, 3745, 4903}},
+{12265, 17, 55660, {1, 3, 7, 11, 1, 43, 17, 95, 79, 343, 1939, 2349, 5195, 3047, 4325, 27829, 53809}},
+{12266, 17, 55671, {1, 1, 5, 9, 7, 43, 111, 221, 493, 151, 1635, 3949, 6661, 4861, 17661, 61909, 4975}},
+{12267, 17, 55693, {1, 3, 1, 3, 31, 47, 63, 45, 401, 153, 1139, 2125, 6639, 14093, 31607, 20645, 52245}},
+{12268, 17, 55706, {1, 1, 3, 1, 19, 31, 59, 139, 285, 749, 751, 775, 7795, 14917, 30295, 61037, 12315}},
+{12269, 17, 55712, {1, 3, 3, 9, 15, 55, 79, 183, 373, 663, 497, 2589, 4955, 5409, 23527, 2683, 5487}},
+{12270, 17, 55718, {1, 3, 7, 11, 25, 47, 53, 225, 197, 109, 1937, 1375, 7347, 7353, 2335, 21775, 14877}},
+{12271, 17, 55739, {1, 3, 1, 9, 23, 61, 51, 221, 129, 57, 115, 1031, 6793, 14773, 3331, 24951, 94761}},
+{12272, 17, 55747, {1, 1, 5, 15, 31, 9, 69, 117, 295, 147, 673, 3627, 7167, 13835, 20593, 53163, 83033}},
+{12273, 17, 55754, {1, 3, 7, 9, 15, 63, 111, 225, 147, 863, 691, 629, 7485, 483, 21835, 46251, 94645}},
+{12274, 17, 55771, {1, 3, 3, 3, 11, 41, 23, 159, 133, 787, 1617, 629, 5047, 4465, 29051, 47499, 7211}},
+{12275, 17, 55774, {1, 1, 3, 13, 21, 61, 29, 159, 73, 165, 917, 2577, 7237, 11807, 3767, 56861, 51395}},
+{12276, 17, 55780, {1, 1, 5, 3, 15, 31, 37, 233, 283, 265, 1645, 3843, 1971, 4989, 26823, 15243, 74931}},
+{12277, 17, 55783, {1, 3, 7, 11, 9, 51, 7, 119, 237, 905, 1211, 3041, 7641, 3387, 8373, 38961, 68925}},
+{12278, 17, 55784, {1, 1, 7, 3, 17, 53, 55, 195, 57, 957, 2027, 3965, 2993, 411, 13947, 58349, 32169}},
+{12279, 17, 55789, {1, 1, 7, 9, 7, 37, 55, 93, 173, 769, 1381, 3977, 5293, 5051, 21455, 45547, 64653}},
+{12280, 17, 55798, {1, 3, 5, 7, 1, 41, 89, 161, 315, 361, 1675, 2993, 3281, 13043, 19003, 22129, 130379}},
+{12281, 17, 55802, {1, 3, 1, 9, 13, 37, 85, 197, 465, 177, 661, 943, 541, 11117, 9751, 4193, 98291}},
+{12282, 17, 55823, {1, 1, 3, 7, 21, 7, 67, 17, 41, 817, 1159, 1483, 6937, 10079, 3639, 27887, 14541}},
+{12283, 17, 55828, {1, 3, 3, 15, 17, 63, 69, 215, 437, 883, 1857, 3319, 3107, 16279, 10709, 30433, 52551}},
+{12284, 17, 55837, {1, 1, 3, 11, 1, 5, 69, 37, 419, 999, 1711, 875, 3807, 10811, 16345, 61155, 116043}},
+{12285, 17, 55838, {1, 3, 7, 13, 17, 7, 57, 237, 81, 691, 1143, 4075, 2481, 643, 8091, 8243, 80111}},
+{12286, 17, 55847, {1, 1, 7, 7, 17, 61, 73, 215, 113, 885, 159, 2243, 1177, 10981, 10123, 48995, 123349}},
+{12287, 17, 55848, {1, 1, 1, 7, 31, 47, 99, 15, 371, 343, 1483, 1985, 25, 11125, 8357, 10677, 130895}},
+{12288, 17, 55885, {1, 3, 1, 13, 25, 41, 83, 37, 129, 493, 641, 185, 6607, 7213, 13285, 10439, 73227}},
+{12289, 17, 55897, {1, 1, 5, 7, 17, 15, 93, 53, 281, 91, 115, 3675, 3081, 9825, 23653, 40095, 91803}},
+{12290, 17, 55904, {1, 1, 1, 5, 3, 25, 39, 207, 419, 361, 953, 2823, 8105, 15763, 29199, 61607, 32633}},
+{12291, 17, 55910, {1, 1, 3, 1, 31, 51, 55, 3, 277, 639, 191, 1783, 139, 29, 16659, 30199, 69109}},
+{12292, 17, 55919, {1, 1, 1, 7, 31, 59, 25, 13, 239, 617, 115, 1787, 5757, 9927, 2417, 37313, 115135}},
+{12293, 17, 55922, {1, 1, 3, 5, 19, 35, 5, 187, 483, 823, 1875, 163, 4235, 853, 23679, 50899, 94981}},
+{12294, 17, 55931, {1, 3, 3, 11, 9, 39, 121, 201, 189, 543, 1493, 1215, 351, 16063, 1701, 56559, 108053}},
+{12295, 17, 55933, {1, 3, 1, 7, 1, 39, 31, 163, 347, 307, 349, 4081, 1729, 16265, 363, 28297, 50631}},
+{12296, 17, 55937, {1, 3, 7, 13, 21, 55, 127, 161, 75, 9, 1285, 1839, 5283, 5667, 10979, 22185, 7581}},
+{12297, 17, 55943, {1, 1, 3, 5, 13, 45, 17, 181, 117, 395, 1685, 663, 3441, 5359, 7157, 27759, 102343}},
+{12298, 17, 55955, {1, 3, 1, 7, 7, 31, 97, 187, 383, 769, 1469, 4007, 5521, 13973, 49, 43823, 75649}},
+{12299, 17, 55957, {1, 3, 5, 7, 31, 13, 47, 11, 335, 961, 321, 3367, 1903, 503, 8409, 1101, 58215}},
+{12300, 17, 55968, {1, 1, 7, 7, 25, 49, 39, 1, 453, 419, 333, 1759, 2287, 6243, 10723, 13687, 56853}},
+{12301, 17, 55980, {1, 3, 3, 7, 11, 55, 125, 197, 19, 591, 1969, 511, 2501, 8429, 29467, 27917, 63457}},
+{12302, 17, 55986, {1, 1, 3, 11, 11, 43, 35, 213, 231, 119, 379, 3761, 4891, 5677, 20317, 5459, 55487}},
+{12303, 17, 55992, {1, 1, 5, 7, 21, 9, 127, 59, 97, 963, 847, 2131, 7907, 11409, 8785, 48197, 96907}},
+{12304, 17, 56005, {1, 3, 5, 3, 23, 7, 45, 95, 179, 691, 1571, 3091, 6359, 9105, 26021, 26925, 43}},
+{12305, 17, 56034, {1, 3, 3, 7, 21, 7, 11, 219, 439, 465, 1983, 117, 4639, 8387, 27637, 15883, 5567}},
+{12306, 17, 56051, {1, 1, 7, 3, 1, 3, 51, 205, 425, 133, 563, 1317, 533, 1227, 8361, 23407, 39825}},
+{12307, 17, 56054, {1, 1, 5, 3, 3, 39, 19, 69, 477, 605, 3, 1887, 2077, 13673, 2763, 64415, 104519}},
+{12308, 17, 56065, {1, 1, 5, 15, 11, 45, 89, 245, 177, 591, 1313, 587, 4781, 5103, 26401, 12643, 38959}},
+{12309, 17, 56080, {1, 1, 1, 5, 11, 13, 15, 95, 271, 99, 2001, 2701, 6065, 3527, 7423, 37525, 117161}},
+{12310, 17, 56101, {1, 3, 7, 7, 21, 17, 111, 149, 373, 591, 1461, 809, 3877, 8635, 13209, 31439, 64285}},
+{12311, 17, 56113, {1, 3, 1, 15, 25, 51, 55, 161, 357, 181, 41, 2345, 3553, 9917, 30123, 40683, 122497}},
+{12312, 17, 56126, {1, 3, 7, 15, 5, 55, 119, 239, 291, 665, 1537, 3309, 2519, 12397, 25897, 51529, 28673}},
+{12313, 17, 56131, {1, 1, 1, 9, 25, 45, 21, 119, 19, 145, 313, 2509, 1031, 3319, 14863, 10759, 22577}},
+{12314, 17, 56134, {1, 3, 1, 15, 1, 61, 87, 229, 511, 83, 79, 51, 1407, 16293, 26217, 25839, 86207}},
+{12315, 17, 56143, {1, 3, 7, 7, 23, 43, 89, 11, 43, 801, 569, 3273, 315, 9537, 681, 34783, 97101}},
+{12316, 17, 56148, {1, 1, 5, 1, 13, 31, 77, 115, 501, 669, 27, 3765, 6789, 9139, 30587, 45995, 102433}},
+{12317, 17, 56152, {1, 1, 7, 1, 15, 21, 57, 197, 243, 353, 71, 341, 7319, 8467, 9779, 15755, 4185}},
+{12318, 17, 56174, {1, 1, 1, 1, 17, 21, 3, 185, 277, 585, 265, 3189, 3975, 353, 8541, 23905, 21881}},
+{12319, 17, 56181, {1, 3, 5, 3, 5, 23, 113, 253, 343, 73, 1419, 2529, 4333, 2007, 14307, 60591, 55411}},
+{12320, 17, 56182, {1, 1, 7, 3, 25, 35, 109, 173, 351, 487, 1551, 3207, 1189, 5091, 3581, 4699, 22085}},
+{12321, 17, 56185, {1, 1, 3, 11, 9, 9, 71, 173, 17, 595, 2015, 2543, 4889, 6025, 15265, 6459, 3977}},
+{12322, 17, 56192, {1, 3, 5, 15, 11, 13, 11, 189, 431, 307, 317, 3131, 1421, 10863, 5311, 25273, 43187}},
+{12323, 17, 56201, {1, 1, 1, 7, 7, 41, 103, 231, 321, 327, 1849, 2485, 6461, 10259, 4577, 52951, 33053}},
+{12324, 17, 56215, {1, 3, 3, 15, 11, 33, 73, 155, 453, 597, 575, 2119, 327, 4227, 32271, 7429, 102007}},
+{12325, 17, 56219, {1, 1, 3, 7, 15, 9, 95, 177, 21, 245, 257, 3637, 821, 16351, 1733, 10635, 59885}},
+{12326, 17, 56222, {1, 1, 3, 7, 23, 41, 107, 147, 57, 877, 1609, 3275, 339, 12997, 5989, 62293, 21549}},
+{12327, 17, 56258, {1, 1, 7, 13, 19, 39, 111, 229, 321, 487, 873, 3365, 4915, 251, 30629, 45775, 73549}},
+{12328, 17, 56264, {1, 1, 1, 13, 25, 61, 43, 111, 135, 463, 1921, 1723, 7505, 13805, 30633, 51683, 7353}},
+{12329, 17, 56269, {1, 1, 1, 1, 31, 41, 35, 205, 375, 189, 635, 3589, 3507, 8131, 13437, 22823, 68451}},
+{12330, 17, 56272, {1, 3, 7, 5, 31, 47, 13, 229, 105, 195, 685, 529, 39, 2651, 6821, 11043, 112123}},
+{12331, 17, 56278, {1, 3, 7, 13, 3, 23, 21, 203, 89, 957, 1577, 1711, 585, 3937, 17681, 55577, 61075}},
+{12332, 17, 56282, {1, 3, 3, 3, 17, 37, 49, 7, 287, 183, 1185, 2979, 2103, 1217, 22105, 11677, 19603}},
+{12333, 17, 56306, {1, 1, 1, 9, 29, 35, 93, 179, 403, 563, 441, 3485, 6909, 12647, 3885, 60089, 29275}},
+{12334, 17, 56308, {1, 3, 3, 9, 15, 37, 49, 103, 509, 77, 495, 921, 2599, 14735, 30951, 22779, 47747}},
+{12335, 17, 56318, {1, 3, 3, 11, 17, 45, 43, 235, 379, 51, 925, 89, 2241, 10273, 27649, 8101, 93977}},
+{12336, 17, 56329, {1, 3, 3, 3, 11, 7, 25, 163, 405, 997, 847, 2743, 4705, 7041, 10997, 50189, 10775}},
+{12337, 17, 56356, {1, 1, 1, 13, 19, 43, 3, 125, 37, 41, 5, 965, 2681, 3737, 29057, 37777, 119537}},
+{12338, 17, 56360, {1, 1, 1, 1, 11, 27, 101, 67, 73, 199, 1739, 2835, 5837, 10595, 9865, 38493, 99323}},
+{12339, 17, 56383, {1, 3, 1, 13, 27, 43, 21, 79, 419, 847, 843, 2563, 8133, 10295, 10127, 30839, 104863}},
+{12340, 17, 56388, {1, 3, 3, 11, 15, 37, 71, 251, 157, 971, 165, 1647, 2583, 205, 23555, 55297, 106893}},
+{12341, 17, 56391, {1, 1, 5, 15, 1, 21, 113, 107, 287, 727, 71, 2655, 1435, 11125, 15257, 18899, 37737}},
+{12342, 17, 56405, {1, 1, 3, 3, 27, 49, 17, 85, 57, 237, 349, 4049, 1103, 2523, 3919, 36587, 128595}},
+{12343, 17, 56406, {1, 3, 5, 9, 13, 1, 65, 13, 361, 409, 413, 2153, 5953, 10651, 25383, 49777, 65399}},
+{12344, 17, 56416, {1, 1, 7, 9, 19, 47, 69, 127, 121, 925, 57, 2775, 4981, 3643, 4077, 3081, 56093}},
+{12345, 17, 56426, {1, 3, 3, 13, 1, 53, 45, 13, 489, 445, 623, 3547, 1659, 1899, 11971, 3725, 12445}},
+{12346, 17, 56439, {1, 3, 7, 11, 13, 9, 59, 157, 125, 975, 1283, 297, 3609, 3179, 31341, 54727, 112515}},
+{12347, 17, 56446, {1, 1, 1, 13, 23, 63, 69, 249, 159, 593, 47, 3957, 757, 14693, 26345, 18839, 111263}},
+{12348, 17, 56450, {1, 1, 1, 1, 31, 37, 37, 199, 7, 425, 337, 1475, 271, 16215, 12089, 16765, 13519}},
+{12349, 17, 56459, {1, 1, 7, 11, 31, 59, 121, 139, 413, 807, 737, 1235, 3505, 5859, 14205, 31939, 4713}},
+{12350, 17, 56461, {1, 1, 1, 9, 21, 51, 113, 159, 345, 807, 635, 523, 5535, 13307, 4239, 14847, 23711}},
+{12351, 17, 56464, {1, 3, 5, 13, 31, 7, 33, 1, 293, 271, 1829, 2535, 6333, 12037, 29401, 35009, 37789}},
+{12352, 17, 56469, {1, 1, 7, 3, 7, 57, 31, 45, 177, 475, 843, 1265, 585, 16099, 29293, 52407, 56131}},
+{12353, 17, 56489, {1, 3, 3, 11, 1, 25, 117, 205, 139, 141, 1229, 903, 1883, 11269, 30493, 3979, 4263}},
+{12354, 17, 56490, {1, 1, 5, 13, 25, 43, 9, 237, 347, 869, 1765, 1389, 1931, 13331, 17325, 45999, 121201}},
+{12355, 17, 56497, {1, 3, 3, 11, 3, 13, 95, 49, 389, 53, 491, 1467, 5105, 16053, 6305, 15759, 51991}},
+{12356, 17, 56509, {1, 3, 5, 15, 1, 53, 85, 69, 75, 409, 1299, 1245, 7951, 10709, 9157, 3509, 103975}},
+{12357, 17, 56515, {1, 1, 1, 13, 1, 33, 97, 235, 463, 413, 1759, 1891, 1781, 5261, 5759, 201, 69199}},
+{12358, 17, 56518, {1, 1, 3, 13, 21, 27, 101, 143, 123, 705, 969, 2461, 6057, 13091, 6077, 38311, 30379}},
+{12359, 17, 56524, {1, 3, 3, 1, 13, 11, 73, 33, 495, 513, 763, 3089, 421, 13663, 30169, 56599, 38847}},
+{12360, 17, 56535, {1, 1, 7, 13, 13, 31, 91, 63, 233, 137, 859, 2449, 539, 12461, 13477, 31605, 58919}},
+{12361, 17, 56542, {1, 1, 1, 9, 13, 49, 107, 45, 451, 707, 1735, 1881, 3451, 9131, 25481, 10841, 116067}},
+{12362, 17, 56545, {1, 3, 7, 1, 27, 21, 51, 117, 63, 53, 575, 3325, 1099, 11181, 23609, 47141, 115421}},
+{12363, 17, 56551, {1, 3, 1, 13, 25, 29, 53, 135, 165, 319, 1695, 341, 8157, 10671, 7095, 60749, 31513}},
+{12364, 17, 56555, {1, 1, 7, 5, 3, 53, 123, 137, 449, 87, 951, 693, 6943, 15331, 1515, 24019, 56613}},
+{12365, 17, 56560, {1, 3, 7, 5, 25, 17, 43, 251, 301, 203, 633, 1271, 6253, 4475, 10773, 25003, 67599}},
+{12366, 17, 56569, {1, 1, 3, 9, 1, 25, 117, 159, 13, 155, 851, 2497, 6155, 6549, 27909, 24423, 82357}},
+{12367, 17, 56580, {1, 1, 1, 1, 21, 59, 103, 43, 291, 111, 1355, 401, 5129, 16017, 25947, 15391, 46745}},
+{12368, 17, 56584, {1, 1, 1, 13, 13, 51, 95, 111, 17, 963, 1535, 3003, 6163, 11377, 6787, 57275, 109559}},
+{12369, 17, 56598, {1, 1, 5, 11, 11, 3, 85, 207, 489, 117, 269, 747, 5719, 8501, 7307, 59223, 18941}},
+{12370, 17, 56601, {1, 1, 5, 1, 9, 53, 41, 255, 271, 995, 1939, 2739, 2221, 14841, 22617, 10643, 6427}},
+{12371, 17, 56602, {1, 3, 3, 9, 7, 55, 109, 143, 427, 45, 579, 115, 2061, 8447, 29469, 5523, 129063}},
+{12372, 17, 56623, {1, 3, 7, 5, 23, 63, 119, 31, 53, 821, 135, 2677, 807, 4685, 24391, 55165, 88079}},
+{12373, 17, 56637, {1, 3, 5, 9, 15, 11, 73, 177, 243, 375, 115, 1633, 7983, 15039, 21169, 25325, 128479}},
+{12374, 17, 56638, {1, 3, 3, 5, 21, 51, 13, 51, 75, 993, 77, 209, 2761, 451, 11987, 40297, 2383}},
+{12375, 17, 56643, {1, 3, 7, 1, 19, 9, 11, 161, 19, 851, 1313, 1169, 4405, 7493, 23935, 37323, 107387}},
+{12376, 17, 56650, {1, 3, 5, 15, 5, 11, 79, 129, 507, 247, 811, 1145, 3893, 5205, 11309, 38205, 2051}},
+{12377, 17, 56673, {1, 1, 5, 1, 11, 13, 33, 155, 21, 185, 771, 3261, 981, 743, 12479, 22611, 25321}},
+{12378, 17, 56676, {1, 1, 5, 9, 7, 25, 11, 235, 429, 563, 1647, 1429, 1385, 14411, 3831, 19769, 67599}},
+{12379, 17, 56686, {1, 3, 3, 5, 5, 7, 109, 117, 251, 823, 669, 2043, 1843, 11829, 27051, 35865, 11461}},
+{12380, 17, 56704, {1, 3, 5, 5, 7, 3, 45, 63, 305, 99, 393, 1765, 1711, 15569, 27295, 16555, 77631}},
+{12381, 17, 56710, {1, 3, 5, 11, 23, 33, 49, 125, 85, 677, 1589, 2667, 5723, 15619, 30415, 39561, 122763}},
+{12382, 17, 56721, {1, 3, 7, 13, 27, 21, 99, 209, 481, 123, 1285, 115, 6517, 11753, 11365, 44959, 89}},
+{12383, 17, 56731, {1, 1, 1, 7, 15, 15, 45, 151, 489, 169, 933, 2987, 657, 3095, 6745, 131, 37767}},
+{12384, 17, 56738, {1, 3, 1, 15, 1, 37, 99, 137, 151, 891, 715, 383, 1293, 719, 10957, 5557, 92841}},
+{12385, 17, 56747, {1, 1, 1, 3, 27, 59, 93, 49, 473, 313, 431, 1129, 5995, 13101, 13185, 7091, 109677}},
+{12386, 17, 56750, {1, 3, 3, 7, 1, 41, 55, 135, 271, 527, 1919, 1093, 2579, 3725, 22853, 31613, 4729}},
+{12387, 17, 56752, {1, 1, 7, 1, 7, 13, 63, 255, 219, 837, 117, 2323, 4295, 15697, 8607, 47047, 117869}},
+{12388, 17, 56757, {1, 1, 1, 7, 29, 29, 55, 171, 437, 733, 491, 1037, 7221, 5705, 31819, 19583, 103991}},
+{12389, 17, 56787, {1, 3, 7, 1, 31, 19, 65, 39, 151, 517, 1985, 2251, 6147, 12983, 28263, 35891, 7545}},
+{12390, 17, 56796, {1, 1, 7, 7, 21, 41, 97, 253, 427, 391, 849, 611, 4827, 10807, 6267, 22513, 62803}},
+{12391, 17, 56803, {1, 3, 7, 7, 25, 9, 49, 245, 491, 39, 603, 1853, 5655, 3517, 10745, 55069, 121497}},
+{12392, 17, 56812, {1, 3, 1, 5, 9, 39, 109, 195, 283, 141, 2007, 3, 1267, 13053, 8387, 48665, 48877}},
+{12393, 17, 56815, {1, 1, 3, 7, 27, 61, 49, 43, 229, 497, 2015, 1345, 3195, 7139, 13453, 56993, 15099}},
+{12394, 17, 56824, {1, 3, 5, 11, 31, 53, 87, 97, 385, 387, 1107, 3287, 2517, 7421, 1007, 37421, 124113}},
+{12395, 17, 56829, {1, 3, 3, 11, 9, 55, 51, 215, 181, 419, 863, 3149, 5815, 15579, 28527, 34715, 61375}},
+{12396, 17, 56833, {1, 3, 3, 3, 31, 57, 5, 35, 445, 957, 1897, 105, 2533, 10255, 19795, 49127, 38491}},
+{12397, 17, 56839, {1, 3, 3, 13, 25, 53, 1, 159, 443, 541, 439, 3377, 5511, 9667, 26777, 32599, 36981}},
+{12398, 17, 56840, {1, 1, 1, 3, 23, 29, 97, 131, 59, 143, 1601, 2765, 4569, 11081, 6027, 38641, 100745}},
+{12399, 17, 56845, {1, 3, 3, 15, 9, 15, 19, 35, 321, 935, 465, 2707, 4799, 7455, 12743, 31029, 114149}},
+{12400, 17, 56853, {1, 1, 1, 1, 11, 51, 23, 79, 387, 701, 107, 623, 231, 12571, 7719, 3061, 79605}},
+{12401, 17, 56854, {1, 3, 5, 15, 17, 49, 109, 83, 185, 295, 853, 219, 3615, 535, 32001, 6655, 4185}},
+{12402, 17, 56858, {1, 3, 3, 15, 15, 7, 35, 151, 305, 705, 1383, 1595, 5595, 11995, 15491, 49119, 83383}},
+{12403, 17, 56863, {1, 3, 7, 9, 3, 25, 57, 47, 359, 719, 1937, 1403, 1399, 10827, 24181, 29141, 79017}},
+{12404, 17, 56864, {1, 3, 5, 1, 1, 21, 21, 245, 361, 485, 1521, 3935, 1587, 8653, 25871, 49449, 103413}},
+{12405, 17, 56881, {1, 3, 3, 3, 9, 61, 31, 69, 401, 261, 1217, 3069, 4045, 12437, 32017, 15113, 10769}},
+{12406, 17, 56882, {1, 3, 1, 1, 21, 33, 123, 87, 481, 793, 625, 4087, 1361, 11077, 18835, 13287, 40107}},
+{12407, 17, 56896, {1, 3, 7, 3, 9, 49, 101, 213, 467, 77, 1691, 2621, 4411, 8025, 30247, 13691, 20559}},
+{12408, 17, 56901, {1, 1, 1, 9, 29, 49, 47, 135, 1, 337, 1649, 389, 3845, 7213, 19527, 2619, 78841}},
+{12409, 17, 56902, {1, 3, 7, 9, 23, 23, 47, 97, 493, 767, 137, 1467, 7015, 2883, 12749, 9267, 12441}},
+{12410, 17, 56908, {1, 1, 3, 15, 9, 57, 53, 19, 401, 385, 1159, 1185, 6977, 14027, 3183, 59119, 42065}},
+{12411, 17, 56923, {1, 1, 1, 15, 21, 33, 83, 251, 147, 395, 321, 443, 6893, 1877, 6687, 28863, 86531}},
+{12412, 17, 56925, {1, 3, 3, 1, 3, 47, 27, 247, 121, 827, 1399, 4079, 7545, 11691, 27915, 28811, 17099}},
+{12413, 17, 56926, {1, 3, 5, 7, 5, 59, 73, 69, 117, 897, 905, 3273, 2935, 11077, 32443, 60959, 16081}},
+{12414, 17, 56932, {1, 1, 7, 5, 27, 49, 107, 169, 75, 435, 1913, 2089, 5733, 2361, 5163, 52239, 87411}},
+{12415, 17, 56939, {1, 1, 7, 13, 1, 13, 123, 89, 427, 301, 1217, 1491, 5361, 10381, 28971, 57655, 108607}},
+{12416, 17, 56947, {1, 1, 7, 11, 13, 5, 23, 151, 117, 369, 623, 2263, 2609, 109, 32485, 52133, 69391}},
+{12417, 17, 56954, {1, 3, 7, 11, 7, 33, 127, 43, 123, 203, 775, 3215, 5115, 1805, 14581, 46791, 128781}},
+{12418, 17, 56970, {1, 3, 3, 1, 7, 23, 37, 99, 1, 719, 293, 2727, 6859, 683, 13241, 17839, 4215}},
+{12419, 17, 56972, {1, 1, 1, 13, 27, 41, 93, 25, 59, 947, 971, 1523, 4443, 1209, 32317, 58651, 11121}},
+{12420, 17, 56977, {1, 1, 1, 3, 31, 33, 23, 87, 349, 265, 445, 3489, 783, 7833, 5767, 59295, 45057}},
+{12421, 17, 56980, {1, 1, 1, 1, 15, 47, 19, 15, 217, 837, 2043, 2805, 4701, 5873, 1517, 46743, 61655}},
+{12422, 17, 56993, {1, 3, 7, 1, 27, 27, 9, 107, 25, 897, 955, 3763, 821, 1535, 14557, 38537, 128737}},
+{12423, 17, 57013, {1, 3, 3, 7, 19, 49, 121, 217, 401, 975, 1189, 715, 3113, 4219, 4885, 57861, 6833}},
+{12424, 17, 57017, {1, 3, 3, 1, 17, 59, 53, 15, 259, 791, 2035, 499, 7707, 13685, 14367, 20155, 91033}},
+{12425, 17, 57018, {1, 3, 5, 5, 11, 11, 69, 237, 139, 73, 541, 1135, 2647, 14109, 18113, 8051, 31917}},
+{12426, 17, 57031, {1, 1, 1, 15, 11, 23, 89, 181, 295, 743, 29, 4009, 4683, 13989, 4575, 38865, 30449}},
+{12427, 17, 57059, {1, 1, 1, 11, 21, 63, 31, 121, 55, 153, 1143, 4059, 3247, 11725, 17659, 48935, 118369}},
+{12428, 17, 57062, {1, 1, 7, 9, 17, 29, 27, 167, 69, 957, 2009, 2795, 3161, 3493, 16365, 43637, 102321}},
+{12429, 17, 57065, {1, 3, 5, 13, 27, 23, 17, 7, 345, 253, 631, 1389, 2523, 9993, 32619, 46731, 4757}},
+{12430, 17, 57071, {1, 1, 1, 11, 17, 1, 41, 107, 25, 183, 1361, 1211, 3607, 12713, 16011, 42987, 36415}},
+{12431, 17, 57083, {1, 1, 7, 5, 13, 29, 33, 69, 261, 213, 73, 3737, 3867, 503, 28225, 53735, 91695}},
+{12432, 17, 57093, {1, 3, 7, 7, 21, 63, 75, 39, 259, 367, 487, 2087, 5411, 1925, 29589, 39019, 73283}},
+{12433, 17, 57097, {1, 3, 1, 7, 29, 29, 25, 191, 91, 509, 1485, 853, 7011, 13321, 27769, 10249, 87341}},
+{12434, 17, 57106, {1, 1, 7, 7, 1, 9, 115, 71, 321, 913, 1679, 2129, 771, 9217, 4731, 24353, 35631}},
+{12435, 17, 57118, {1, 3, 1, 13, 5, 45, 53, 255, 429, 805, 1983, 1437, 2677, 6337, 22221, 55455, 39855}},
+{12436, 17, 57133, {1, 1, 1, 1, 1, 5, 111, 231, 321, 961, 371, 3825, 3623, 3985, 32151, 6113, 130687}},
+{12437, 17, 57134, {1, 3, 7, 3, 15, 29, 103, 181, 261, 149, 1161, 1745, 1765, 1677, 20051, 47033, 84997}},
+{12438, 17, 57141, {1, 3, 7, 1, 25, 21, 7, 229, 407, 673, 1525, 1207, 3099, 14849, 22103, 45695, 85951}},
+{12439, 17, 57146, {1, 3, 7, 1, 9, 5, 105, 149, 181, 81, 1589, 3477, 5387, 7943, 29203, 50355, 39001}},
+{12440, 17, 57156, {1, 3, 7, 1, 21, 31, 39, 121, 397, 1023, 711, 623, 6193, 12315, 11101, 11911, 50033}},
+{12441, 17, 57174, {1, 3, 7, 3, 7, 19, 73, 69, 201, 337, 1037, 3663, 2679, 5153, 28171, 24455, 74685}},
+{12442, 17, 57183, {1, 3, 1, 1, 21, 35, 121, 111, 217, 809, 507, 1347, 4439, 4601, 26371, 23595, 3583}},
+{12443, 17, 57189, {1, 3, 3, 7, 1, 51, 83, 231, 419, 597, 305, 3405, 5831, 11845, 1861, 48671, 105315}},
+{12444, 17, 57190, {1, 3, 1, 15, 25, 37, 103, 141, 495, 727, 1919, 2821, 4689, 6727, 27117, 2259, 54559}},
+{12445, 17, 57193, {1, 3, 5, 3, 27, 55, 5, 117, 199, 979, 1745, 401, 7967, 5345, 29747, 54085, 124765}},
+{12446, 17, 57196, {1, 3, 3, 15, 23, 61, 1, 29, 489, 131, 583, 389, 6033, 8007, 22933, 44513, 111845}},
+{12447, 17, 57207, {1, 1, 7, 13, 3, 55, 119, 147, 181, 485, 793, 3593, 6971, 2227, 28507, 62393, 127303}},
+{12448, 17, 57211, {1, 1, 5, 3, 29, 53, 37, 59, 213, 283, 1809, 3685, 2677, 5761, 19705, 47079, 3477}},
+{12449, 17, 57214, {1, 1, 1, 7, 21, 63, 91, 13, 347, 605, 589, 415, 5737, 10281, 30941, 25609, 67973}},
+{12450, 17, 57218, {1, 1, 3, 1, 27, 49, 87, 161, 507, 693, 59, 1375, 6737, 1029, 14731, 32335, 51961}},
+{12451, 17, 57230, {1, 3, 3, 9, 11, 15, 121, 121, 151, 335, 221, 3099, 1999, 1047, 20891, 23015, 95809}},
+{12452, 17, 57235, {1, 1, 7, 7, 1, 49, 63, 227, 113, 161, 863, 801, 2559, 7737, 27619, 27419, 128009}},
+{12453, 17, 57241, {1, 1, 7, 1, 25, 59, 67, 111, 435, 309, 807, 2107, 8077, 9671, 6739, 53757, 41259}},
+{12454, 17, 57251, {1, 3, 7, 3, 3, 19, 7, 111, 237, 981, 1717, 3131, 6631, 467, 13103, 61435, 126469}},
+{12455, 17, 57260, {1, 1, 7, 9, 19, 31, 59, 185, 199, 111, 351, 611, 6355, 1095, 28549, 32871, 44537}},
+{12456, 17, 57263, {1, 1, 3, 11, 23, 25, 31, 1, 461, 83, 1723, 1711, 3679, 10963, 14927, 17377, 911}},
+{12457, 17, 57265, {1, 1, 5, 13, 3, 37, 127, 159, 199, 223, 1097, 3033, 5825, 13777, 22189, 44305, 20509}},
+{12458, 17, 57271, {1, 1, 5, 15, 13, 49, 17, 79, 289, 601, 1023, 657, 1687, 14477, 15929, 4279, 68007}},
+{12459, 17, 57272, {1, 1, 5, 7, 29, 3, 45, 225, 65, 711, 1039, 3585, 4957, 9041, 22761, 26649, 95627}},
+{12460, 17, 57290, {1, 3, 5, 5, 13, 29, 33, 211, 461, 799, 1437, 1057, 485, 9535, 8133, 57527, 12873}},
+{12461, 17, 57295, {1, 1, 3, 3, 15, 43, 53, 15, 395, 561, 1371, 3543, 7707, 2399, 13311, 25641, 58865}},
+{12462, 17, 57298, {1, 3, 1, 7, 1, 9, 115, 39, 249, 87, 835, 97, 8137, 6665, 11951, 21045, 76387}},
+{12463, 17, 57325, {1, 3, 3, 9, 5, 63, 115, 163, 331, 1007, 733, 4027, 2911, 5329, 6967, 3535, 107293}},
+{12464, 17, 57328, {1, 3, 1, 11, 5, 55, 81, 63, 345, 535, 1093, 207, 4053, 9129, 10397, 26641, 95171}},
+{12465, 17, 57340, {1, 1, 3, 3, 13, 27, 65, 37, 255, 69, 19, 2565, 4329, 11223, 18131, 18701, 31111}},
+{12466, 17, 57344, {1, 3, 7, 7, 25, 57, 81, 189, 227, 377, 829, 1583, 1343, 4643, 23485, 47463, 83535}},
+{12467, 17, 57353, {1, 3, 5, 9, 13, 33, 103, 75, 501, 803, 427, 1171, 1187, 2655, 24187, 32907, 120239}},
+{12468, 17, 57368, {1, 3, 1, 7, 31, 63, 21, 137, 241, 63, 1925, 2193, 1135, 11159, 14685, 28397, 59}},
+{12469, 17, 57371, {1, 1, 7, 1, 15, 7, 85, 87, 493, 63, 561, 1069, 5481, 12253, 25149, 35283, 16123}},
+{12470, 17, 57383, {1, 3, 3, 5, 19, 17, 23, 95, 429, 805, 1343, 2243, 233, 7219, 6549, 21477, 83679}},
+{12471, 17, 57402, {1, 3, 3, 1, 3, 55, 83, 107, 131, 311, 741, 781, 6227, 10059, 3903, 235, 45971}},
+{12472, 17, 57407, {1, 1, 3, 13, 21, 43, 79, 149, 367, 755, 463, 221, 5117, 7015, 17599, 64665, 37443}},
+{12473, 17, 57419, {1, 1, 7, 15, 3, 59, 107, 13, 213, 287, 1505, 2131, 6965, 12873, 23973, 8449, 24829}},
+{12474, 17, 57424, {1, 3, 5, 11, 25, 45, 39, 17, 175, 749, 1179, 3349, 6723, 12543, 3557, 34521, 103197}},
+{12475, 17, 57433, {1, 1, 3, 13, 23, 41, 21, 25, 91, 941, 879, 4015, 137, 12949, 17245, 41903, 39803}},
+{12476, 17, 57452, {1, 1, 7, 15, 11, 33, 45, 127, 321, 895, 1543, 4013, 6179, 14209, 13317, 46803, 99891}},
+{12477, 17, 57458, {1, 3, 3, 13, 13, 11, 101, 11, 177, 869, 509, 2323, 449, 16379, 31965, 2899, 59229}},
+{12478, 17, 57467, {1, 1, 5, 7, 15, 37, 113, 237, 463, 489, 1145, 1629, 3101, 10305, 31705, 29957, 99665}},
+{12479, 17, 57470, {1, 3, 5, 7, 21, 29, 45, 133, 367, 657, 1315, 537, 6069, 8141, 31479, 32983, 57}},
+{12480, 17, 57473, {1, 1, 3, 9, 13, 39, 109, 125, 467, 975, 829, 4007, 773, 6639, 8793, 4579, 60547}},
+{12481, 17, 57479, {1, 1, 1, 15, 21, 5, 113, 51, 159, 501, 1921, 4095, 5603, 16055, 16649, 50229, 49863}},
+{12482, 17, 57480, {1, 1, 5, 13, 9, 21, 77, 187, 355, 299, 1017, 491, 6725, 4177, 16739, 15909, 84069}},
+{12483, 17, 57486, {1, 3, 7, 5, 13, 13, 51, 19, 159, 339, 735, 933, 2523, 11435, 20793, 21975, 19007}},
+{12484, 17, 57491, {1, 1, 7, 5, 1, 11, 61, 111, 129, 643, 1741, 945, 7349, 11579, 24793, 1751, 2367}},
+{12485, 17, 57493, {1, 1, 5, 5, 29, 45, 63, 177, 507, 277, 1789, 729, 4277, 10099, 28985, 43009, 2319}},
+{12486, 17, 57524, {1, 3, 3, 13, 19, 53, 73, 227, 487, 131, 1227, 3735, 3979, 7383, 6923, 31979, 6651}},
+{12487, 17, 57528, {1, 3, 3, 15, 7, 47, 31, 255, 317, 621, 497, 4069, 5249, 15093, 18013, 6891, 81893}},
+{12488, 17, 57534, {1, 1, 7, 5, 17, 23, 119, 27, 55, 555, 221, 2693, 1757, 11117, 23409, 21135, 122977}},
+{12489, 17, 57542, {1, 1, 5, 1, 15, 17, 127, 109, 75, 1017, 1167, 2975, 3249, 5399, 12599, 50779, 78215}},
+{12490, 17, 57560, {1, 3, 5, 5, 1, 13, 65, 199, 101, 75, 513, 493, 6931, 9363, 5607, 16331, 69219}},
+{12491, 17, 57565, {1, 1, 1, 15, 19, 37, 63, 177, 397, 645, 905, 1599, 609, 14291, 14681, 46719, 117745}},
+{12492, 17, 57570, {1, 3, 7, 13, 3, 57, 63, 49, 67, 913, 1659, 1857, 3595, 9219, 11341, 39735, 82275}},
+{12493, 17, 57579, {1, 1, 5, 11, 19, 1, 5, 181, 55, 763, 469, 2417, 2349, 12437, 22589, 17867, 95701}},
+{12494, 17, 57590, {1, 3, 7, 13, 1, 9, 11, 159, 103, 737, 1989, 59, 4711, 8093, 31703, 45663, 92913}},
+{12495, 17, 57601, {1, 3, 3, 11, 15, 9, 35, 217, 299, 479, 1539, 2605, 2003, 8841, 27261, 28853, 98877}},
+{12496, 17, 57604, {1, 1, 5, 5, 15, 45, 73, 159, 205, 1017, 159, 3659, 2377, 3651, 6489, 19711, 109959}},
+{12497, 17, 57607, {1, 1, 3, 15, 7, 41, 7, 47, 357, 433, 211, 111, 2565, 8637, 15917, 47887, 128513}},
+{12498, 17, 57621, {1, 3, 7, 3, 25, 9, 33, 33, 5, 805, 1541, 3333, 7257, 9011, 4813, 53195, 52469}},
+{12499, 17, 57635, {1, 1, 7, 15, 27, 3, 11, 57, 415, 371, 563, 2515, 149, 6555, 31273, 51465, 2989}},
+{12500, 17, 57642, {1, 1, 1, 11, 3, 41, 25, 175, 499, 879, 1145, 1083, 7857, 10497, 16991, 23351, 115353}},
+{12501, 17, 57650, {1, 1, 3, 15, 15, 9, 39, 239, 285, 413, 989, 2927, 7205, 79, 20101, 30115, 113933}},
+{12502, 17, 57655, {1, 1, 7, 5, 13, 29, 29, 69, 25, 533, 1731, 1391, 4065, 12597, 19167, 51989, 101273}},
+{12503, 17, 57670, {1, 1, 5, 3, 9, 41, 83, 127, 197, 627, 173, 273, 593, 15733, 19285, 26517, 107877}},
+{12504, 17, 57676, {1, 1, 1, 5, 29, 17, 89, 163, 125, 473, 1577, 2435, 3379, 3057, 1829, 64325, 111719}},
+{12505, 17, 57682, {1, 3, 1, 11, 1, 29, 97, 53, 421, 941, 1737, 3337, 2715, 1633, 28485, 30369, 116047}},
+{12506, 17, 57687, {1, 1, 5, 13, 25, 43, 39, 85, 385, 129, 819, 1647, 3527, 12319, 573, 58703, 29463}},
+{12507, 17, 57691, {1, 3, 3, 9, 23, 59, 31, 215, 49, 451, 645, 3687, 4507, 9359, 28161, 34609, 123409}},
+{12508, 17, 57700, {1, 3, 1, 9, 13, 25, 97, 239, 203, 31, 1465, 1089, 7665, 3007, 22465, 28389, 119869}},
+{12509, 17, 57704, {1, 3, 3, 1, 29, 51, 19, 83, 443, 193, 647, 3125, 7269, 3031, 9967, 40447, 102179}},
+{12510, 17, 57707, {1, 3, 5, 15, 5, 63, 125, 55, 295, 787, 559, 3309, 7491, 9907, 5775, 15155, 41793}},
+{12511, 17, 57721, {1, 3, 7, 7, 21, 61, 125, 207, 43, 159, 539, 435, 1945, 725, 797, 47489, 43099}},
+{12512, 17, 57731, {1, 1, 5, 7, 11, 11, 61, 103, 23, 693, 493, 1045, 4435, 9009, 22075, 24839, 125431}},
+{12513, 17, 57733, {1, 3, 1, 9, 13, 61, 83, 181, 373, 949, 1397, 247, 5079, 10933, 31887, 14147, 55121}},
+{12514, 17, 57738, {1, 1, 7, 15, 31, 47, 87, 219, 357, 409, 943, 2993, 7615, 7071, 14179, 41489, 104401}},
+{12515, 17, 57745, {1, 3, 3, 1, 11, 15, 87, 241, 389, 761, 1523, 3049, 2111, 11581, 5493, 11301, 32017}},
+{12516, 17, 57748, {1, 1, 7, 11, 29, 39, 37, 63, 411, 671, 1789, 3541, 5651, 11721, 10871, 53867, 112895}},
+{12517, 17, 57751, {1, 3, 3, 1, 23, 21, 99, 161, 467, 197, 1263, 451, 5469, 7667, 22139, 31599, 8345}},
+{12518, 17, 57757, {1, 3, 1, 3, 11, 41, 13, 79, 3, 377, 1865, 2297, 1383, 14033, 17141, 24787, 127911}},
+{12519, 17, 57761, {1, 1, 1, 1, 5, 11, 5, 181, 323, 853, 831, 1599, 3939, 6391, 22817, 37969, 9997}},
+{12520, 17, 57774, {1, 1, 3, 11, 29, 61, 11, 171, 181, 631, 757, 3879, 4779, 16183, 5969, 7909, 42855}},
+{12521, 17, 57779, {1, 3, 3, 15, 19, 17, 107, 187, 19, 743, 909, 1963, 2131, 2107, 659, 35829, 57905}},
+{12522, 17, 57786, {1, 1, 7, 1, 31, 29, 67, 99, 353, 715, 65, 3907, 1931, 1289, 9217, 60635, 32737}},
+{12523, 17, 57808, {1, 3, 3, 13, 3, 17, 19, 173, 263, 203, 1233, 1407, 933, 8905, 26905, 63343, 64963}},
+{12524, 17, 57814, {1, 3, 1, 13, 21, 43, 97, 79, 163, 529, 1571, 1027, 4339, 16235, 9189, 29203, 36789}},
+{12525, 17, 57817, {1, 1, 7, 1, 31, 1, 117, 247, 193, 333, 1797, 3515, 285, 2803, 25345, 9101, 110569}},
+{12526, 17, 57824, {1, 1, 5, 11, 17, 63, 45, 167, 35, 925, 569, 3687, 6739, 12453, 26171, 28249, 73827}},
+{12527, 17, 57827, {1, 1, 5, 1, 19, 49, 107, 183, 435, 305, 1191, 2711, 891, 15813, 13449, 23489, 89749}},
+{12528, 17, 57848, {1, 1, 1, 11, 7, 53, 105, 17, 433, 351, 1151, 4077, 5371, 10183, 18895, 13229, 101219}},
+{12529, 17, 57853, {1, 3, 7, 9, 21, 33, 27, 125, 177, 607, 817, 2689, 2123, 2037, 29643, 27219, 44591}},
+{12530, 17, 57857, {1, 3, 5, 11, 27, 51, 29, 161, 469, 349, 1445, 3613, 1487, 961, 29017, 2235, 45905}},
+{12531, 17, 57858, {1, 1, 3, 11, 7, 15, 37, 195, 329, 875, 559, 1361, 7373, 7143, 15059, 59205, 37167}},
+{12532, 17, 57867, {1, 1, 5, 1, 7, 25, 27, 211, 301, 369, 227, 123, 4415, 15993, 4829, 43801, 83639}},
+{12533, 17, 57872, {1, 1, 3, 5, 25, 37, 31, 205, 69, 275, 855, 1407, 2989, 11001, 16963, 31497, 3505}},
+{12534, 17, 57887, {1, 1, 7, 7, 25, 33, 81, 181, 197, 717, 207, 535, 8083, 5765, 2523, 40347, 27245}},
+{12535, 17, 57894, {1, 3, 1, 5, 13, 3, 107, 143, 233, 419, 1831, 2149, 7277, 13449, 31609, 48345, 82621}},
+{12536, 17, 57915, {1, 3, 5, 9, 31, 35, 39, 113, 415, 803, 1479, 3169, 8015, 4659, 2445, 9159, 91625}},
+{12537, 17, 57920, {1, 3, 1, 5, 27, 25, 83, 165, 459, 955, 1535, 377, 5531, 2945, 18285, 18097, 21589}},
+{12538, 17, 57923, {1, 1, 1, 15, 13, 23, 11, 159, 471, 951, 1971, 677, 2641, 3227, 14761, 39421, 29841}},
+{12539, 17, 57932, {1, 1, 7, 11, 19, 37, 101, 97, 373, 559, 105, 905, 897, 15309, 14979, 52029, 38989}},
+{12540, 17, 57937, {1, 1, 5, 15, 31, 43, 71, 75, 481, 997, 5, 1005, 4987, 7907, 16237, 43075, 94827}},
+{12541, 17, 57943, {1, 3, 5, 11, 23, 55, 123, 91, 183, 307, 97, 1999, 3341, 4717, 19643, 9455, 26555}},
+{12542, 17, 57950, {1, 1, 7, 3, 29, 61, 75, 197, 125, 579, 145, 1333, 85, 15655, 28177, 6169, 43289}},
+{12543, 17, 57960, {1, 3, 7, 13, 21, 15, 1, 221, 293, 991, 35, 2701, 2909, 7333, 27319, 32281, 77861}},
+{12544, 17, 57971, {1, 1, 3, 1, 17, 11, 81, 209, 499, 125, 105, 2987, 3891, 9531, 27963, 39611, 43633}},
+{12545, 17, 57974, {1, 3, 3, 3, 29, 45, 51, 63, 209, 75, 1321, 4055, 7851, 12329, 8371, 59513, 49105}},
+{12546, 17, 57983, {1, 1, 7, 5, 9, 63, 59, 127, 445, 899, 1857, 3737, 625, 15021, 25177, 21007, 25935}},
+{12547, 17, 57987, {1, 1, 5, 9, 9, 57, 25, 63, 235, 191, 1527, 1783, 1401, 1813, 2553, 1241, 100029}},
+{12548, 17, 57994, {1, 3, 1, 11, 27, 5, 49, 39, 505, 653, 1083, 921, 1045, 11337, 25499, 36211, 75851}},
+{12549, 17, 58001, {1, 3, 3, 1, 29, 19, 71, 93, 223, 153, 561, 1657, 5821, 14181, 1275, 24633, 114787}},
+{12550, 17, 58002, {1, 1, 1, 9, 7, 13, 17, 239, 457, 731, 1811, 3015, 4465, 5865, 2387, 30455, 17405}},
+{12551, 17, 58013, {1, 3, 5, 1, 7, 45, 117, 207, 7, 645, 131, 863, 6443, 14455, 11885, 39257, 126431}},
+{12552, 17, 58023, {1, 1, 3, 5, 17, 23, 3, 27, 475, 731, 431, 1967, 981, 12727, 1301, 17647, 62481}},
+{12553, 17, 58027, {1, 1, 1, 13, 11, 53, 105, 109, 105, 461, 1787, 2851, 1299, 9925, 13055, 58301, 24483}},
+{12554, 17, 58029, {1, 1, 1, 11, 7, 35, 11, 173, 247, 289, 1269, 361, 2059, 5051, 25731, 58085, 21387}},
+{12555, 17, 58032, {1, 3, 1, 5, 9, 31, 59, 151, 435, 519, 1863, 2255, 2585, 10033, 29189, 27189, 25023}},
+{12556, 17, 58041, {1, 1, 5, 5, 25, 17, 53, 189, 187, 847, 369, 3287, 6047, 2385, 26045, 48821, 23335}},
+{12557, 17, 58047, {1, 1, 1, 9, 15, 55, 79, 21, 433, 131, 1677, 3681, 6173, 9189, 15053, 12971, 81135}},
+{12558, 17, 58062, {1, 1, 3, 5, 29, 5, 11, 213, 151, 77, 1493, 3959, 7675, 7689, 10381, 15871, 123463}},
+{12559, 17, 58086, {1, 3, 7, 11, 19, 47, 31, 81, 207, 789, 1945, 2671, 1987, 6363, 26401, 9799, 59531}},
+{12560, 17, 58092, {1, 1, 1, 7, 17, 7, 83, 181, 339, 423, 267, 2251, 1847, 14883, 13423, 27223, 81799}},
+{12561, 17, 58095, {1, 3, 5, 15, 9, 9, 73, 95, 197, 267, 743, 2369, 6417, 3555, 9885, 6373, 87651}},
+{12562, 17, 58097, {1, 1, 3, 13, 21, 29, 57, 59, 395, 631, 993, 17, 2939, 14117, 27521, 61387, 74927}},
+{12563, 17, 58100, {1, 1, 3, 13, 1, 29, 23, 151, 381, 591, 1217, 2295, 4403, 15865, 4325, 31329, 56989}},
+{12564, 17, 58117, {1, 3, 5, 1, 27, 7, 111, 79, 287, 945, 1237, 2857, 1461, 2477, 10929, 17117, 98677}},
+{12565, 17, 58121, {1, 1, 1, 5, 15, 35, 109, 39, 391, 57, 1783, 3133, 5563, 7721, 12651, 3437, 46697}},
+{12566, 17, 58132, {1, 3, 5, 5, 13, 47, 123, 51, 383, 91, 641, 1607, 4461, 7, 6427, 42755, 130097}},
+{12567, 17, 58142, {1, 1, 5, 5, 25, 49, 33, 59, 351, 1003, 301, 2721, 7705, 5447, 21367, 63007, 112465}},
+{12568, 17, 58145, {1, 1, 5, 13, 31, 11, 73, 1, 359, 201, 1465, 187, 7385, 12817, 12911, 17775, 77937}},
+{12569, 17, 58152, {1, 3, 1, 15, 29, 5, 117, 69, 79, 93, 947, 133, 1049, 13907, 3611, 42123, 8041}},
+{12570, 17, 58155, {1, 1, 7, 7, 29, 17, 71, 171, 357, 619, 1199, 3817, 6889, 9607, 19075, 15539, 54939}},
+{12571, 17, 58163, {1, 1, 1, 7, 23, 29, 91, 227, 119, 865, 943, 381, 5289, 189, 15917, 13875, 31095}},
+{12572, 17, 58166, {1, 1, 7, 1, 9, 49, 93, 175, 105, 61, 1285, 3659, 2383, 505, 12337, 43801, 67035}},
+{12573, 17, 58170, {1, 3, 5, 1, 31, 47, 75, 17, 455, 231, 1887, 2295, 2533, 733, 29001, 22001, 119423}},
+{12574, 17, 58175, {1, 3, 7, 3, 5, 5, 69, 205, 459, 805, 1257, 3283, 3305, 6845, 1405, 56051, 63453}},
+{12575, 17, 58184, {1, 3, 3, 3, 19, 57, 65, 149, 175, 683, 1719, 637, 4951, 13645, 30455, 22379, 105369}},
+{12576, 17, 58197, {1, 3, 1, 11, 31, 27, 69, 13, 191, 645, 1563, 3897, 2387, 2269, 12999, 42217, 100853}},
+{12577, 17, 58202, {1, 3, 1, 13, 31, 7, 11, 227, 267, 373, 1249, 2591, 4769, 303, 5865, 59911, 4991}},
+{12578, 17, 58204, {1, 3, 7, 11, 7, 31, 87, 205, 45, 785, 1947, 1965, 5851, 7501, 89, 38897, 91939}},
+{12579, 17, 58208, {1, 3, 5, 9, 21, 37, 79, 181, 163, 355, 1129, 3439, 5103, 15903, 2935, 22505, 97451}},
+{12580, 17, 58213, {1, 1, 3, 9, 7, 37, 107, 255, 69, 133, 551, 1357, 31, 7059, 29195, 30151, 81785}},
+{12581, 17, 58220, {1, 3, 3, 5, 3, 51, 3, 143, 305, 697, 1041, 1267, 7635, 1483, 649, 28275, 65059}},
+{12582, 17, 58226, {1, 3, 1, 7, 11, 13, 113, 81, 159, 993, 797, 3207, 3787, 13005, 29393, 51107, 42709}},
+{12583, 17, 58231, {1, 1, 3, 13, 7, 11, 113, 195, 349, 377, 2033, 197, 147, 13839, 5405, 29577, 64535}},
+{12584, 17, 58235, {1, 3, 1, 9, 1, 1, 77, 73, 383, 463, 1871, 1589, 1805, 2085, 5195, 17805, 33159}},
+{12585, 17, 58254, {1, 1, 1, 9, 25, 37, 123, 119, 507, 515, 1547, 139, 7501, 4725, 30195, 18199, 41145}},
+{12586, 17, 58261, {1, 3, 3, 7, 17, 33, 99, 11, 487, 343, 403, 337, 3831, 6031, 20375, 2071, 39795}},
+{12587, 17, 58271, {1, 1, 5, 1, 13, 57, 59, 11, 391, 953, 597, 1411, 3929, 13963, 15003, 59385, 12293}},
+{12588, 17, 58278, {1, 3, 1, 15, 23, 61, 67, 129, 63, 555, 433, 631, 2725, 317, 10121, 9217, 124371}},
+{12589, 17, 58287, {1, 1, 5, 7, 19, 23, 17, 45, 75, 819, 1879, 2315, 1439, 2643, 26561, 19209, 16081}},
+{12590, 17, 58327, {1, 3, 5, 7, 5, 35, 121, 233, 91, 89, 1741, 3015, 4223, 9605, 22795, 55845, 47167}},
+{12591, 17, 58333, {1, 3, 7, 7, 13, 23, 11, 51, 91, 367, 773, 1303, 2151, 14423, 22263, 28413, 107461}},
+{12592, 17, 58337, {1, 1, 1, 11, 29, 17, 49, 53, 379, 819, 1551, 2907, 5805, 2167, 16123, 9263, 43903}},
+{12593, 17, 58357, {1, 3, 1, 13, 19, 27, 33, 127, 131, 697, 489, 3289, 1895, 3243, 19497, 32419, 55741}},
+{12594, 17, 58362, {1, 3, 1, 15, 7, 51, 91, 45, 251, 829, 2015, 2659, 151, 3327, 25281, 49291, 106343}},
+{12595, 17, 58364, {1, 1, 5, 5, 27, 11, 85, 45, 203, 413, 293, 3067, 4109, 959, 22337, 38767, 75829}},
+{12596, 17, 58375, {1, 1, 3, 5, 21, 35, 65, 173, 315, 423, 171, 3837, 817, 10153, 5517, 18115, 117437}},
+{12597, 17, 58384, {1, 1, 1, 7, 9, 29, 101, 55, 253, 37, 1717, 7, 3181, 1067, 20637, 54773, 106777}},
+{12598, 17, 58387, {1, 3, 7, 11, 13, 11, 87, 83, 83, 969, 589, 3625, 3373, 3921, 24487, 34235, 96289}},
+{12599, 17, 58405, {1, 3, 1, 11, 25, 35, 65, 131, 491, 167, 449, 2949, 5807, 5649, 7569, 37363, 106819}},
+{12600, 17, 58406, {1, 1, 5, 1, 9, 37, 33, 237, 79, 163, 1791, 3499, 4951, 2009, 16183, 10121, 40221}},
+{12601, 17, 58417, {1, 1, 5, 15, 21, 49, 123, 53, 27, 273, 1655, 3713, 5699, 1659, 31985, 6779, 10195}},
+{12602, 17, 58424, {1, 3, 5, 11, 27, 37, 93, 17, 263, 41, 1583, 703, 7689, 6667, 15497, 15255, 67153}},
+{12603, 17, 58435, {1, 1, 5, 9, 19, 13, 121, 39, 321, 177, 711, 3223, 3859, 14775, 19061, 40587, 97199}},
+{12604, 17, 58450, {1, 3, 7, 9, 23, 11, 93, 243, 3, 811, 679, 1103, 7579, 14147, 20255, 22485, 117179}},
+{12605, 17, 58452, {1, 3, 3, 5, 23, 9, 21, 243, 27, 501, 1273, 1501, 5331, 15663, 19483, 10637, 90905}},
+{12606, 17, 58459, {1, 3, 1, 15, 13, 11, 89, 37, 63, 463, 731, 3615, 3923, 4677, 21329, 1069, 57565}},
+{12607, 17, 58461, {1, 1, 1, 13, 19, 39, 63, 59, 389, 367, 1285, 2005, 8103, 4179, 3805, 55475, 126589}},
+{12608, 17, 58466, {1, 3, 5, 11, 27, 57, 27, 63, 365, 171, 665, 2035, 2831, 15955, 11551, 26741, 121059}},
+{12609, 17, 58468, {1, 3, 3, 3, 23, 19, 13, 7, 331, 613, 1783, 733, 7465, 1089, 4683, 15695, 31125}},
+{12610, 17, 58485, {1, 1, 5, 3, 3, 23, 95, 157, 303, 987, 307, 2679, 6173, 6633, 17727, 30901, 76109}},
+{12611, 17, 58489, {1, 1, 1, 1, 11, 21, 111, 81, 31, 727, 1133, 4083, 5811, 2707, 31749, 42939, 92225}},
+{12612, 17, 58492, {1, 3, 1, 11, 29, 21, 31, 115, 351, 213, 201, 3511, 3707, 12821, 8845, 59789, 59721}},
+{12613, 17, 58495, {1, 3, 5, 9, 7, 27, 65, 1, 305, 937, 1201, 2045, 2431, 12275, 24431, 3317, 119671}},
+{12614, 17, 58505, {1, 1, 7, 11, 19, 43, 107, 107, 261, 933, 1125, 1875, 1943, 7477, 20759, 57853, 29459}},
+{12615, 17, 58523, {1, 1, 3, 3, 17, 43, 79, 19, 167, 341, 237, 677, 725, 2353, 12003, 48921, 20707}},
+{12616, 17, 58535, {1, 3, 3, 5, 31, 39, 91, 81, 121, 59, 737, 1767, 4407, 9159, 10237, 25361, 38891}},
+{12617, 17, 58536, {1, 1, 5, 7, 31, 47, 37, 47, 171, 623, 597, 2807, 4875, 15139, 18809, 24279, 36563}},
+{12618, 17, 58549, {1, 3, 5, 3, 3, 7, 31, 135, 81, 777, 1055, 337, 4309, 9575, 11075, 54429, 30097}},
+{12619, 17, 58550, {1, 1, 5, 1, 3, 57, 53, 25, 117, 961, 947, 257, 2645, 6935, 27511, 54051, 129095}},
+{12620, 17, 58561, {1, 1, 1, 15, 23, 45, 11, 173, 407, 373, 1051, 3519, 1875, 1291, 4393, 9047, 102159}},
+{12621, 17, 58562, {1, 1, 3, 5, 9, 51, 23, 253, 261, 339, 505, 3601, 265, 8375, 7241, 40715, 114439}},
+{12622, 17, 58573, {1, 1, 7, 7, 3, 63, 5, 233, 259, 947, 1367, 2699, 6029, 9371, 6567, 39961, 31621}},
+{12623, 17, 58576, {1, 1, 3, 3, 25, 43, 73, 61, 305, 257, 235, 421, 6621, 1025, 18831, 44525, 87665}},
+{12624, 17, 58592, {1, 3, 5, 7, 19, 33, 77, 163, 191, 115, 1275, 3551, 3521, 6767, 30209, 48895, 114185}},
+{12625, 17, 58601, {1, 1, 3, 3, 29, 37, 3, 165, 267, 807, 967, 2893, 3287, 12249, 21411, 19291, 91781}},
+{12626, 17, 58622, {1, 1, 5, 5, 27, 55, 51, 137, 429, 775, 1525, 3911, 5367, 5981, 24373, 16331, 31887}},
+{12627, 17, 58627, {1, 1, 5, 11, 17, 49, 37, 243, 509, 563, 1381, 2013, 7341, 10509, 10049, 29135, 32709}},
+{12628, 17, 58629, {1, 1, 3, 13, 1, 33, 119, 5, 477, 701, 1329, 1023, 2091, 12895, 6443, 1053, 44741}},
+{12629, 17, 58634, {1, 3, 5, 7, 13, 19, 1, 113, 3, 481, 1555, 2857, 3519, 7903, 16153, 62909, 78877}},
+{12630, 17, 58639, {1, 1, 7, 11, 7, 27, 47, 175, 87, 605, 411, 4065, 8059, 5023, 27719, 3111, 62247}},
+{12631, 17, 58641, {1, 3, 1, 15, 27, 37, 71, 77, 297, 647, 1651, 2543, 3925, 4827, 28587, 49663, 56581}},
+{12632, 17, 58644, {1, 3, 5, 1, 19, 49, 63, 9, 43, 243, 931, 3577, 2371, 10513, 13691, 27739, 61011}},
+{12633, 17, 58654, {1, 1, 3, 1, 23, 27, 53, 149, 157, 735, 1087, 1529, 6613, 2493, 4879, 26771, 123711}},
+{12634, 17, 58663, {1, 3, 7, 13, 5, 3, 43, 3, 343, 497, 943, 3443, 4335, 4779, 4033, 25871, 10965}},
+{12635, 17, 58667, {1, 3, 5, 1, 5, 11, 93, 73, 199, 455, 421, 3495, 4381, 717, 21033, 41287, 44743}},
+{12636, 17, 58677, {1, 1, 3, 9, 13, 33, 77, 143, 81, 57, 1061, 3205, 2411, 1347, 23149, 21913, 119331}},
+{12637, 17, 58682, {1, 3, 1, 7, 1, 15, 45, 247, 119, 905, 457, 3939, 4865, 11191, 27705, 46315, 68367}},
+{12638, 17, 58690, {1, 3, 3, 15, 31, 5, 55, 169, 381, 1009, 1893, 2751, 411, 8653, 30367, 54919, 23541}},
+{12639, 17, 58692, {1, 3, 7, 1, 29, 27, 77, 239, 109, 125, 355, 2759, 2229, 3435, 16241, 53309, 613}},
+{12640, 17, 58695, {1, 3, 1, 3, 11, 27, 33, 167, 311, 1003, 1635, 2479, 1831, 6225, 17711, 30185, 87043}},
+{12641, 17, 58710, {1, 3, 7, 13, 7, 61, 3, 243, 55, 259, 461, 3357, 121, 9107, 19393, 3719, 71403}},
+{12642, 17, 58713, {1, 1, 7, 15, 23, 25, 55, 89, 241, 297, 113, 59, 4799, 381, 29127, 811, 91149}},
+{12643, 17, 58723, {1, 1, 3, 3, 13, 35, 43, 163, 69, 69, 1949, 2383, 887, 2349, 12539, 167, 23697}},
+{12644, 17, 58740, {1, 3, 3, 11, 3, 45, 23, 149, 55, 963, 1293, 2715, 1401, 16081, 12821, 2129, 26835}},
+{12645, 17, 58749, {1, 3, 3, 13, 29, 47, 21, 249, 141, 179, 627, 329, 6377, 12049, 11715, 1447, 119359}},
+{12646, 17, 58760, {1, 1, 5, 13, 7, 59, 103, 189, 401, 169, 455, 1197, 1881, 12679, 4533, 25561, 79281}},
+{12647, 17, 58766, {1, 1, 7, 15, 21, 59, 97, 77, 397, 487, 647, 2277, 269, 713, 17741, 37387, 100143}},
+{12648, 17, 58773, {1, 3, 5, 1, 1, 43, 31, 201, 21, 805, 1533, 1407, 4719, 2673, 22757, 7605, 72485}},
+{12649, 17, 58780, {1, 1, 3, 11, 27, 25, 99, 135, 225, 367, 1311, 683, 7193, 8209, 17081, 55709, 3029}},
+{12650, 17, 58787, {1, 3, 5, 5, 17, 9, 59, 27, 153, 353, 647, 2919, 1877, 5359, 19787, 46237, 7}},
+{12651, 17, 58796, {1, 3, 3, 15, 11, 39, 75, 223, 489, 57, 1355, 3941, 6603, 12883, 20909, 24065, 53543}},
+{12652, 17, 58816, {1, 1, 3, 9, 17, 47, 61, 49, 397, 23, 2019, 37, 23, 8967, 10357, 54419, 27279}},
+{12653, 17, 58822, {1, 1, 1, 7, 31, 43, 87, 111, 293, 969, 1431, 2275, 3131, 2915, 24595, 63049, 71517}},
+{12654, 17, 58831, {1, 1, 3, 11, 11, 63, 89, 33, 95, 299, 593, 3353, 7389, 841, 1895, 64835, 19915}},
+{12655, 17, 58839, {1, 1, 1, 3, 13, 63, 51, 3, 327, 401, 1289, 2699, 5599, 5101, 3189, 23415, 53429}},
+{12656, 17, 58849, {1, 1, 7, 13, 27, 15, 57, 201, 365, 643, 171, 2417, 1763, 7567, 5323, 50911, 24281}},
+{12657, 17, 58859, {1, 3, 3, 13, 31, 37, 31, 243, 225, 431, 379, 1565, 1567, 11477, 4641, 58823, 88565}},
+{12658, 17, 58870, {1, 3, 3, 7, 13, 39, 79, 169, 401, 177, 2023, 1703, 5563, 15619, 21445, 59287, 30141}},
+{12659, 17, 58879, {1, 3, 3, 15, 17, 47, 13, 163, 361, 353, 1435, 2083, 4109, 14105, 28585, 1721, 119133}},
+{12660, 17, 58889, {1, 3, 3, 3, 29, 41, 97, 131, 501, 415, 1735, 2315, 6499, 11417, 3879, 3957, 47117}},
+{12661, 17, 58904, {1, 1, 3, 13, 5, 25, 29, 65, 235, 949, 1571, 927, 515, 7519, 23123, 4127, 71019}},
+{12662, 17, 58914, {1, 1, 5, 13, 1, 41, 5, 137, 487, 711, 561, 2495, 5367, 6955, 9453, 54499, 118373}},
+{12663, 17, 58923, {1, 3, 3, 5, 27, 15, 23, 237, 95, 873, 1949, 1579, 7089, 8837, 30463, 9903, 61919}},
+{12664, 17, 58940, {1, 3, 1, 13, 5, 5, 15, 5, 429, 617, 383, 2495, 409, 15541, 11209, 20625, 58493}},
+{12665, 17, 58945, {1, 1, 7, 11, 25, 21, 113, 219, 459, 777, 289, 2435, 6665, 83, 22997, 6561, 82923}},
+{12666, 17, 58952, {1, 1, 1, 7, 19, 53, 37, 249, 273, 639, 2007, 1463, 7819, 9013, 19539, 41235, 58059}},
+{12667, 17, 58960, {1, 1, 3, 11, 13, 51, 97, 55, 237, 159, 1305, 3705, 2527, 13065, 13873, 10275, 3769}},
+{12668, 17, 58965, {1, 1, 5, 7, 13, 49, 41, 13, 301, 461, 1169, 3805, 7163, 4133, 17255, 48283, 87059}},
+{12669, 17, 58986, {1, 3, 7, 15, 9, 19, 45, 195, 445, 145, 543, 2839, 315, 10991, 3317, 46501, 29209}},
+{12670, 17, 59000, {1, 1, 3, 5, 23, 51, 53, 119, 217, 747, 1307, 3039, 5523, 5891, 21035, 56471, 80305}},
+{12671, 17, 59006, {1, 3, 1, 3, 23, 17, 97, 71, 7, 839, 229, 3407, 3025, 1989, 16599, 38755, 11139}},
+{12672, 17, 59027, {1, 1, 7, 7, 7, 19, 67, 43, 293, 191, 1549, 1621, 7083, 11633, 1899, 4515, 89753}},
+{12673, 17, 59034, {1, 3, 7, 11, 1, 23, 17, 63, 265, 709, 453, 1309, 6861, 7257, 17705, 28565, 15231}},
+{12674, 17, 59052, {1, 3, 5, 13, 1, 53, 99, 79, 241, 771, 497, 987, 2353, 6931, 227, 57781, 109583}},
+{12675, 17, 59058, {1, 3, 3, 5, 31, 47, 17, 97, 93, 119, 2045, 3597, 7983, 4993, 30659, 3419, 32803}},
+{12676, 17, 59081, {1, 3, 7, 1, 11, 41, 3, 7, 155, 627, 979, 2405, 7467, 6763, 28523, 56493, 1291}},
+{12677, 17, 59082, {1, 1, 1, 7, 3, 43, 13, 187, 415, 1001, 667, 1371, 8075, 12855, 27215, 9399, 70657}},
+{12678, 17, 59089, {1, 3, 1, 9, 29, 53, 117, 17, 443, 381, 507, 643, 5891, 10725, 20251, 497, 101313}},
+{12679, 17, 59096, {1, 3, 3, 1, 31, 47, 59, 75, 173, 347, 1, 117, 3639, 10231, 863, 56795, 56107}},
+{12680, 17, 59118, {1, 3, 1, 15, 11, 41, 97, 251, 177, 275, 1849, 1281, 3659, 9709, 16239, 7445, 47661}},
+{12681, 17, 59123, {1, 3, 3, 5, 13, 1, 27, 251, 89, 863, 685, 3915, 2201, 4313, 32083, 37171, 120885}},
+{12682, 17, 59126, {1, 3, 3, 3, 3, 11, 77, 135, 147, 475, 505, 611, 4763, 9445, 28639, 51343, 119093}},
+{12683, 17, 59132, {1, 3, 7, 1, 11, 9, 67, 73, 375, 977, 1011, 1621, 6623, 8077, 26321, 7461, 130637}},
+{12684, 17, 59135, {1, 3, 5, 15, 15, 59, 63, 217, 117, 375, 1151, 3451, 5843, 13221, 20673, 10817, 57711}},
+{12685, 17, 59150, {1, 1, 3, 5, 19, 5, 9, 101, 321, 815, 451, 719, 523, 1299, 27823, 48041, 45939}},
+{12686, 17, 59174, {1, 1, 1, 9, 5, 49, 59, 59, 409, 5, 1075, 21, 7837, 4543, 3085, 55473, 89309}},
+{12687, 17, 59177, {1, 3, 3, 13, 9, 31, 93, 181, 153, 795, 713, 933, 6001, 9075, 29781, 14029, 46361}},
+{12688, 17, 59185, {1, 3, 5, 3, 9, 21, 79, 129, 361, 627, 743, 3041, 5381, 3627, 12581, 35183, 83183}},
+{12689, 17, 59195, {1, 3, 3, 3, 29, 29, 93, 187, 341, 727, 181, 133, 6525, 5673, 2739, 23349, 62505}},
+{12690, 17, 59203, {1, 3, 5, 13, 27, 59, 127, 149, 321, 613, 1543, 1537, 2909, 5139, 3755, 49285, 35183}},
+{12691, 17, 59206, {1, 3, 3, 9, 5, 31, 19, 173, 137, 19, 799, 1847, 3897, 15775, 22411, 55405, 95713}},
+{12692, 17, 59234, {1, 3, 5, 5, 31, 1, 87, 97, 481, 797, 459, 793, 4339, 5443, 31717, 6691, 68841}},
+{12693, 17, 59248, {1, 3, 3, 5, 3, 9, 123, 21, 393, 683, 1007, 971, 729, 7113, 2811, 51183, 37093}},
+{12694, 17, 59258, {1, 3, 5, 5, 27, 31, 19, 227, 123, 937, 763, 2117, 3825, 9151, 95, 54963, 62919}},
+{12695, 17, 59260, {1, 3, 1, 3, 23, 21, 21, 7, 7, 165, 99, 3073, 91, 8725, 17613, 47119, 41441}},
+{12696, 17, 59270, {1, 3, 7, 9, 29, 49, 117, 49, 205, 605, 1567, 3323, 1559, 10949, 14349, 34951, 99901}},
+{12697, 17, 59284, {1, 1, 1, 1, 15, 41, 31, 133, 439, 305, 719, 147, 6849, 5947, 31749, 45171, 15265}},
+{12698, 17, 59291, {1, 1, 5, 11, 19, 37, 13, 253, 385, 625, 1801, 1191, 547, 12025, 17971, 54127, 97323}},
+{12699, 17, 59293, {1, 3, 5, 5, 27, 9, 57, 245, 59, 211, 1195, 763, 6743, 6309, 25759, 26633, 27497}},
+{12700, 17, 59297, {1, 3, 5, 5, 9, 51, 49, 29, 213, 855, 305, 3961, 3187, 6815, 19015, 2539, 81705}},
+{12701, 17, 59312, {1, 1, 5, 7, 11, 61, 123, 163, 127, 871, 463, 2279, 5931, 2913, 23215, 40215, 91373}},
+{12702, 17, 59315, {1, 1, 7, 1, 29, 57, 55, 189, 285, 603, 747, 3753, 3359, 10277, 25319, 17569, 80125}},
+{12703, 17, 59327, {1, 3, 1, 9, 7, 53, 9, 55, 117, 495, 2045, 2487, 1625, 775, 17773, 62159, 79537}},
+{12704, 17, 59332, {1, 1, 5, 1, 1, 11, 67, 79, 57, 677, 2045, 3913, 853, 3581, 10509, 35097, 24585}},
+{12705, 17, 59347, {1, 3, 7, 7, 19, 15, 13, 237, 297, 807, 657, 2229, 2931, 10283, 49, 56485, 113889}},
+{12706, 17, 59354, {1, 3, 5, 13, 11, 23, 37, 229, 253, 411, 39, 1069, 3683, 12141, 11087, 64875, 62991}},
+{12707, 17, 59363, {1, 1, 1, 1, 13, 11, 21, 227, 305, 1021, 1039, 3095, 4621, 5723, 31989, 30681, 58487}},
+{12708, 17, 59369, {1, 3, 3, 5, 17, 47, 127, 65, 85, 961, 277, 549, 2111, 4183, 771, 11921, 111489}},
+{12709, 17, 59377, {1, 3, 3, 5, 31, 39, 89, 51, 277, 705, 375, 1603, 2793, 7425, 25065, 44945, 48391}},
+{12710, 17, 59406, {1, 1, 5, 7, 9, 45, 21, 217, 183, 65, 625, 1239, 4241, 8043, 13615, 5611, 82501}},
+{12711, 17, 59413, {1, 1, 7, 13, 15, 51, 29, 35, 73, 601, 233, 3117, 3031, 4229, 4299, 62761, 45291}},
+{12712, 17, 59423, {1, 3, 5, 5, 27, 55, 7, 1, 333, 501, 913, 1939, 5131, 5597, 1271, 30195, 20947}},
+{12713, 17, 59434, {1, 3, 5, 15, 19, 27, 43, 111, 435, 615, 811, 2113, 2503, 7553, 1619, 24773, 40881}},
+{12714, 17, 59441, {1, 3, 5, 11, 11, 31, 21, 147, 151, 141, 527, 1839, 339, 1225, 29621, 19691, 22031}},
+{12715, 17, 59442, {1, 1, 3, 13, 23, 35, 61, 181, 221, 837, 241, 3033, 1849, 12563, 11387, 3027, 33419}},
+{12716, 17, 59456, {1, 3, 3, 7, 1, 39, 125, 249, 231, 575, 1847, 197, 3969, 12945, 10257, 27227, 94097}},
+{12717, 17, 59465, {1, 3, 1, 11, 19, 7, 85, 119, 37, 253, 1575, 447, 6947, 14399, 32095, 15385, 62917}},
+{12718, 17, 59479, {1, 3, 7, 11, 23, 53, 113, 193, 253, 651, 1717, 447, 4055, 13675, 18479, 28375, 66475}},
+{12719, 17, 59501, {1, 1, 7, 3, 17, 27, 13, 209, 67, 271, 121, 1565, 2589, 8033, 3939, 14181, 111787}},
+{12720, 17, 59504, {1, 1, 3, 3, 5, 57, 75, 87, 165, 947, 967, 3353, 2055, 16195, 3701, 62637, 58343}},
+{12721, 17, 59507, {1, 1, 7, 13, 31, 41, 125, 111, 253, 257, 57, 679, 3333, 8259, 26331, 15883, 95023}},
+{12722, 17, 59514, {1, 3, 7, 11, 1, 47, 5, 249, 353, 271, 1121, 1935, 4971, 8447, 9983, 55959, 66179}},
+{12723, 17, 59523, {1, 3, 5, 11, 1, 61, 101, 43, 97, 241, 687, 4027, 4319, 4905, 12357, 51099, 97093}},
+{12724, 17, 59525, {1, 1, 3, 15, 25, 25, 117, 139, 475, 961, 1585, 2795, 2411, 11049, 18209, 15511, 43193}},
+{12725, 17, 59526, {1, 3, 3, 9, 9, 11, 107, 15, 189, 27, 289, 3111, 851, 3401, 31981, 7181, 47533}},
+{12726, 17, 59537, {1, 1, 5, 15, 31, 57, 37, 77, 205, 707, 1505, 1343, 629, 13335, 6719, 35405, 38905}},
+{12727, 17, 59543, {1, 3, 7, 7, 21, 63, 35, 125, 507, 285, 621, 2257, 3009, 13703, 9761, 54927, 16925}},
+{12728, 17, 59560, {1, 1, 1, 11, 11, 53, 37, 17, 167, 663, 1349, 1395, 7721, 9329, 2161, 37093, 52425}},
+{12729, 17, 59563, {1, 1, 7, 9, 1, 15, 113, 53, 87, 133, 131, 847, 609, 14737, 1639, 15511, 46987}},
+{12730, 17, 59566, {1, 1, 7, 7, 25, 21, 125, 149, 201, 791, 1323, 2817, 1141, 289, 14349, 64461, 76575}},
+{12731, 17, 59577, {1, 3, 3, 7, 15, 1, 123, 227, 83, 967, 2039, 3205, 715, 10787, 11235, 50375, 66911}},
+{12732, 17, 59580, {1, 3, 3, 11, 9, 45, 41, 57, 327, 903, 1705, 3947, 3173, 1035, 25529, 15217, 80795}},
+{12733, 17, 59586, {1, 3, 1, 13, 15, 63, 69, 57, 479, 277, 1641, 3465, 2629, 9901, 5781, 55101, 33049}},
+{12734, 17, 59597, {1, 1, 3, 3, 31, 25, 57, 189, 491, 335, 373, 3069, 1623, 10781, 6559, 27057, 111491}},
+{12735, 17, 59612, {1, 3, 3, 15, 19, 57, 67, 225, 343, 93, 315, 1011, 4437, 10371, 27927, 51269, 65653}},
+{12736, 17, 59615, {1, 3, 5, 5, 21, 43, 105, 153, 65, 167, 369, 3167, 785, 7509, 3753, 9035, 29039}},
+{12737, 17, 59622, {1, 1, 7, 3, 17, 9, 113, 21, 175, 967, 13, 2701, 5667, 9761, 20267, 33497, 88819}},
+{12738, 17, 59631, {1, 1, 1, 7, 9, 61, 121, 205, 283, 259, 2027, 2361, 3995, 6787, 26867, 61681, 96149}},
+{12739, 17, 59657, {1, 3, 3, 13, 31, 37, 125, 151, 317, 947, 423, 2907, 6905, 13247, 27997, 4755, 73173}},
+{12740, 17, 59660, {1, 1, 7, 13, 1, 63, 85, 75, 33, 483, 85, 1583, 4783, 14003, 31147, 12643, 99447}},
+{12741, 17, 59665, {1, 1, 1, 7, 31, 5, 93, 179, 213, 857, 3, 1015, 1481, 2413, 28759, 13941, 24851}},
+{12742, 17, 59671, {1, 1, 5, 5, 5, 35, 73, 57, 469, 885, 1951, 3599, 5555, 7259, 22599, 7627, 109227}},
+{12743, 17, 59675, {1, 1, 5, 13, 1, 1, 69, 107, 473, 793, 1851, 887, 2241, 7851, 21821, 25431, 118565}},
+{12744, 17, 59688, {1, 1, 1, 3, 15, 51, 57, 175, 91, 113, 1671, 925, 2187, 1097, 28793, 45819, 41855}},
+{12745, 17, 59706, {1, 1, 3, 3, 15, 51, 99, 177, 379, 713, 1273, 3245, 5515, 14657, 28981, 1197, 29283}},
+{12746, 17, 59708, {1, 3, 3, 15, 13, 27, 29, 7, 17, 373, 779, 1589, 3077, 13673, 31029, 43765, 74339}},
+{12747, 17, 59713, {1, 1, 3, 1, 25, 17, 15, 223, 219, 569, 155, 1307, 7143, 7975, 22581, 53223, 44271}},
+{12748, 17, 59714, {1, 1, 1, 7, 11, 23, 67, 177, 189, 267, 1799, 2453, 2367, 4193, 1827, 10191, 12265}},
+{12749, 17, 59720, {1, 3, 3, 11, 3, 29, 121, 231, 211, 191, 1803, 1171, 6801, 4007, 14111, 42951, 8311}},
+{12750, 17, 59737, {1, 3, 3, 11, 9, 23, 11, 231, 349, 47, 1645, 345, 3681, 12227, 29955, 32131, 391}},
+{12751, 17, 59743, {1, 1, 3, 11, 27, 17, 17, 49, 463, 173, 1993, 2339, 3763, 1931, 29969, 55579, 114805}},
+{12752, 17, 59744, {1, 3, 5, 15, 5, 21, 105, 69, 173, 771, 815, 3807, 577, 12589, 32193, 37601, 23961}},
+{12753, 17, 59749, {1, 1, 3, 9, 21, 63, 57, 213, 327, 765, 333, 2065, 719, 6159, 15769, 49335, 2289}},
+{12754, 17, 59756, {1, 3, 3, 1, 27, 51, 13, 87, 465, 729, 507, 2811, 6721, 14279, 31733, 56165, 78169}},
+{12755, 17, 59783, {1, 1, 1, 9, 25, 1, 47, 37, 407, 623, 1409, 3703, 4491, 3037, 8129, 13547, 50517}},
+{12756, 17, 59784, {1, 3, 5, 13, 5, 51, 127, 225, 215, 377, 1013, 2387, 4237, 1317, 5245, 17535, 100707}},
+{12757, 17, 59787, {1, 3, 5, 13, 31, 25, 123, 243, 317, 505, 483, 1743, 3097, 4139, 4525, 63143, 47665}},
+{12758, 17, 59795, {1, 3, 3, 13, 27, 19, 21, 187, 211, 471, 1931, 2877, 3635, 9233, 12385, 15741, 50843}},
+{12759, 17, 59804, {1, 1, 3, 13, 23, 33, 71, 45, 371, 621, 1057, 1605, 6329, 3763, 8613, 2965, 8141}},
+{12760, 17, 59811, {1, 1, 5, 7, 7, 17, 33, 209, 293, 35, 1665, 3721, 6245, 14567, 15349, 16195, 59757}},
+{12761, 17, 59814, {1, 1, 7, 7, 31, 19, 47, 83, 277, 323, 1225, 969, 2193, 10175, 27657, 50265, 9817}},
+{12762, 17, 59823, {1, 1, 5, 7, 15, 21, 103, 95, 189, 737, 309, 357, 5953, 9701, 15757, 20753, 88647}},
+{12763, 17, 59838, {1, 1, 5, 13, 5, 13, 61, 235, 333, 889, 1559, 1653, 1871, 10631, 18067, 47037, 9507}},
+{12764, 17, 59840, {1, 3, 7, 1, 31, 61, 69, 159, 41, 107, 807, 1517, 3551, 3435, 6151, 50025, 126949}},
+{12765, 17, 59846, {1, 1, 7, 15, 7, 41, 55, 103, 9, 105, 1397, 3955, 7723, 3389, 32435, 36005, 73733}},
+{12766, 17, 59849, {1, 1, 1, 13, 15, 59, 43, 151, 321, 215, 411, 3103, 7455, 14041, 1673, 56425, 59085}},
+{12767, 17, 59855, {1, 1, 1, 1, 5, 39, 81, 183, 509, 455, 753, 3743, 227, 7807, 23747, 42289, 122765}},
+{12768, 17, 59860, {1, 1, 7, 3, 9, 29, 89, 131, 141, 851, 1221, 67, 3117, 1329, 13151, 36827, 34313}},
+{12769, 17, 59867, {1, 3, 1, 5, 9, 29, 11, 189, 389, 79, 1903, 835, 6043, 8953, 18985, 8305, 51939}},
+{12770, 17, 59869, {1, 3, 5, 3, 9, 49, 47, 43, 193, 917, 795, 2719, 5709, 9993, 30637, 26841, 93113}},
+{12771, 17, 59885, {1, 3, 7, 5, 13, 15, 85, 169, 315, 963, 617, 1191, 6739, 11535, 3423, 6695, 2047}},
+{12772, 17, 59888, {1, 3, 1, 3, 5, 49, 41, 255, 131, 255, 825, 1485, 7005, 10107, 3913, 4731, 33199}},
+{12773, 17, 59893, {1, 3, 1, 9, 27, 63, 109, 29, 183, 381, 591, 617, 1187, 4381, 30543, 9933, 109785}},
+{12774, 17, 59904, {1, 3, 7, 7, 13, 29, 125, 105, 353, 677, 623, 1553, 5435, 10853, 16663, 42277, 64333}},
+{12775, 17, 59919, {1, 3, 3, 11, 3, 47, 49, 41, 249, 497, 963, 237, 625, 11303, 6871, 60441, 39559}},
+{12776, 17, 59922, {1, 3, 3, 1, 1, 27, 107, 253, 59, 445, 1761, 2865, 7117, 2363, 4007, 46047, 10811}},
+{12777, 17, 59927, {1, 3, 5, 5, 25, 13, 17, 107, 321, 691, 351, 577, 5001, 9437, 12451, 44997, 42727}},
+{12778, 17, 59937, {1, 3, 1, 9, 1, 31, 87, 117, 111, 379, 1989, 1155, 4777, 8563, 14585, 33375, 66985}},
+{12779, 17, 59940, {1, 3, 5, 5, 9, 51, 79, 135, 89, 929, 277, 763, 5569, 15545, 28393, 56921, 102093}},
+{12780, 17, 59944, {1, 1, 3, 7, 7, 55, 15, 37, 3, 439, 577, 2051, 101, 13655, 11959, 38127, 6639}},
+{12781, 17, 59947, {1, 1, 3, 9, 21, 11, 27, 221, 465, 565, 1313, 1405, 2421, 10543, 18369, 33751, 87785}},
+{12782, 17, 59949, {1, 3, 5, 11, 21, 39, 105, 231, 469, 711, 997, 427, 5797, 3249, 15141, 29413, 66509}},
+{12783, 17, 59961, {1, 3, 7, 5, 25, 31, 111, 37, 229, 773, 193, 553, 673, 4693, 24441, 8713, 121203}},
+{12784, 17, 59975, {1, 3, 1, 9, 23, 27, 103, 7, 183, 549, 1433, 2831, 3383, 13229, 10005, 14135, 15967}},
+{12785, 17, 59981, {1, 3, 3, 11, 11, 59, 11, 251, 373, 399, 255, 1177, 5493, 13559, 29037, 23405, 79495}},
+{12786, 17, 59994, {1, 3, 1, 11, 25, 45, 69, 115, 153, 259, 527, 9, 5807, 6015, 3765, 61621, 8645}},
+{12787, 17, 59999, {1, 3, 3, 9, 19, 5, 113, 191, 345, 655, 429, 3975, 4297, 5723, 5345, 64457, 79031}},
+{12788, 17, 60018, {1, 3, 7, 7, 15, 59, 5, 87, 289, 1005, 931, 2403, 485, 16043, 15623, 39253, 61377}},
+{12789, 17, 60023, {1, 3, 3, 9, 17, 53, 31, 9, 217, 711, 1007, 1375, 2733, 13735, 19825, 59741, 83827}},
+{12790, 17, 60024, {1, 1, 3, 15, 11, 11, 41, 195, 79, 1013, 1353, 1961, 7365, 7533, 13315, 8441, 90705}},
+{12791, 17, 60039, {1, 1, 5, 7, 23, 17, 93, 165, 371, 495, 865, 2753, 15, 10729, 16553, 6039, 96721}},
+{12792, 17, 60043, {1, 3, 3, 3, 25, 25, 67, 119, 485, 63, 75, 2365, 4711, 16129, 5589, 50621, 1203}},
+{12793, 17, 60048, {1, 1, 7, 1, 27, 57, 49, 79, 479, 79, 683, 753, 345, 2007, 18983, 42729, 56369}},
+{12794, 17, 60054, {1, 1, 7, 7, 1, 23, 9, 155, 425, 735, 1625, 2271, 7875, 11219, 12147, 52351, 55845}},
+{12795, 17, 60073, {1, 1, 1, 9, 13, 11, 67, 139, 259, 59, 1593, 1207, 237, 11683, 24719, 27689, 115617}},
+{12796, 17, 60079, {1, 1, 5, 7, 7, 15, 9, 171, 35, 131, 133, 3939, 1401, 6347, 4051, 64235, 68581}},
+{12797, 17, 60082, {1, 3, 3, 1, 27, 21, 29, 119, 201, 527, 763, 203, 1139, 3951, 3341, 17023, 13493}},
+{12798, 17, 60102, {1, 1, 1, 15, 27, 31, 97, 203, 255, 573, 781, 4095, 3381, 363, 32733, 34517, 77973}},
+{12799, 17, 60108, {1, 1, 3, 9, 29, 9, 115, 207, 267, 513, 1071, 3943, 5045, 10071, 6627, 18043, 44289}},
+{12800, 17, 60111, {1, 1, 7, 7, 29, 25, 51, 31, 305, 239, 197, 3825, 2363, 4903, 16237, 37571, 66545}},
+{12801, 17, 60120, {1, 1, 5, 11, 29, 11, 63, 145, 185, 359, 249, 1179, 105, 1745, 28819, 40513, 74525}},
+{12802, 17, 60149, {1, 1, 7, 1, 15, 35, 39, 5, 139, 119, 2047, 3369, 2857, 11037, 30523, 24813, 89209}},
+{12803, 17, 60153, {1, 1, 5, 11, 9, 41, 97, 15, 357, 95, 361, 3, 3227, 8445, 16541, 30661, 84215}},
+{12804, 17, 60161, {1, 1, 7, 5, 11, 55, 77, 19, 331, 621, 893, 577, 1025, 1561, 32331, 59469, 67065}},
+{12805, 17, 60168, {1, 3, 7, 7, 17, 53, 55, 65, 295, 391, 445, 33, 5361, 669, 6447, 3833, 129463}},
+{12806, 17, 60176, {1, 3, 7, 5, 21, 5, 83, 207, 485, 597, 1429, 581, 6831, 2885, 24669, 35211, 69549}},
+{12807, 17, 60182, {1, 3, 3, 1, 3, 33, 69, 199, 427, 893, 1823, 1291, 4533, 11779, 18515, 17597, 79159}},
+{12808, 17, 60185, {1, 3, 1, 1, 17, 41, 91, 21, 509, 875, 777, 639, 4009, 12103, 12947, 58395, 36625}},
+{12809, 17, 60204, {1, 1, 7, 15, 13, 11, 19, 243, 365, 661, 1193, 279, 6055, 13921, 5811, 14337, 105375}},
+{12810, 17, 60212, {1, 3, 7, 3, 3, 51, 101, 175, 83, 921, 523, 3909, 8003, 1295, 4153, 4757, 107881}},
+{12811, 17, 60215, {1, 1, 1, 3, 19, 15, 39, 125, 401, 399, 381, 1123, 2339, 12231, 13387, 50829, 79263}},
+{12812, 17, 60219, {1, 3, 1, 1, 15, 13, 55, 181, 53, 671, 1929, 1003, 521, 15279, 1837, 11877, 79241}},
+{12813, 17, 60222, {1, 3, 3, 9, 23, 45, 21, 37, 1, 701, 1253, 2595, 6261, 4139, 24443, 6655, 109755}},
+{12814, 17, 60229, {1, 3, 7, 1, 1, 13, 57, 41, 95, 985, 1613, 3487, 7509, 213, 32139, 27869, 123589}},
+{12815, 17, 60234, {1, 3, 7, 11, 15, 27, 27, 97, 167, 755, 1331, 3961, 3067, 13827, 8983, 8755, 77847}},
+{12816, 17, 60241, {1, 1, 5, 13, 5, 59, 51, 193, 339, 837, 137, 3807, 2617, 14449, 11035, 16827, 24531}},
+{12817, 17, 60248, {1, 1, 7, 15, 17, 37, 67, 99, 261, 743, 275, 33, 8107, 4959, 9683, 19757, 36471}},
+{12818, 17, 60277, {1, 3, 5, 5, 29, 7, 107, 95, 235, 761, 1205, 3125, 4791, 4645, 25623, 6463, 121887}},
+{12819, 17, 60282, {1, 3, 1, 1, 19, 19, 73, 189, 243, 669, 489, 1927, 1651, 11391, 30699, 64719, 60359}},
+{12820, 17, 60287, {1, 3, 7, 3, 29, 47, 7, 21, 299, 739, 1605, 749, 5755, 11579, 793, 36845, 14695}},
+{12821, 17, 60303, {1, 1, 5, 15, 17, 53, 107, 49, 103, 505, 1191, 2881, 7435, 7515, 24237, 5397, 47003}},
+{12822, 17, 60306, {1, 1, 7, 15, 25, 45, 121, 157, 313, 709, 1519, 2195, 5487, 1789, 32401, 4197, 9329}},
+{12823, 17, 60327, {1, 3, 3, 11, 21, 17, 77, 153, 275, 765, 1943, 3395, 5807, 12809, 29891, 42579, 75565}},
+{12824, 17, 60333, {1, 3, 5, 11, 11, 3, 63, 9, 223, 441, 1047, 441, 867, 3399, 15813, 13, 25293}},
+{12825, 17, 60334, {1, 1, 7, 1, 17, 25, 1, 7, 211, 117, 1417, 1057, 3369, 13211, 11437, 20877, 114867}},
+{12826, 17, 60336, {1, 1, 1, 15, 5, 41, 89, 165, 343, 447, 55, 1013, 8179, 12295, 18615, 23885, 46149}},
+{12827, 17, 60345, {1, 1, 5, 1, 15, 37, 109, 141, 323, 151, 1669, 1365, 3047, 13145, 30355, 12377, 102467}},
+{12828, 17, 60359, {1, 1, 3, 15, 15, 49, 83, 127, 285, 715, 981, 1153, 3019, 11071, 24229, 63807, 16315}},
+{12829, 17, 60368, {1, 1, 3, 1, 23, 35, 21, 179, 83, 929, 1033, 643, 3591, 10363, 7739, 259, 106879}},
+{12830, 17, 60380, {1, 1, 5, 7, 19, 9, 63, 241, 387, 851, 1709, 1161, 7469, 2093, 6169, 6085, 29851}},
+{12831, 17, 60389, {1, 3, 7, 5, 17, 59, 99, 87, 189, 853, 193, 1191, 5683, 15865, 27791, 55575, 13479}},
+{12832, 17, 60390, {1, 3, 3, 3, 25, 51, 81, 129, 365, 319, 179, 2863, 511, 14471, 3689, 59505, 80105}},
+{12833, 17, 60394, {1, 1, 1, 15, 5, 33, 69, 35, 429, 715, 1781, 783, 1089, 8969, 26987, 23519, 34227}},
+{12834, 17, 60407, {1, 3, 5, 9, 1, 51, 9, 121, 325, 945, 2025, 1985, 7337, 10837, 21299, 20591, 76905}},
+{12835, 17, 60414, {1, 3, 7, 3, 15, 51, 19, 109, 297, 491, 15, 1905, 1479, 1997, 18129, 43861, 84925}},
+{12836, 17, 60419, {1, 1, 3, 5, 7, 21, 1, 137, 207, 943, 1171, 2019, 6687, 10683, 20937, 34033, 43907}},
+{12837, 17, 60426, {1, 1, 1, 11, 25, 21, 47, 227, 247, 933, 471, 955, 4299, 5605, 18469, 62357, 98273}},
+{12838, 17, 60428, {1, 1, 5, 13, 21, 39, 41, 23, 493, 311, 1401, 537, 2919, 11519, 12597, 58321, 41401}},
+{12839, 17, 60431, {1, 1, 7, 5, 31, 55, 93, 151, 219, 765, 1247, 2775, 7167, 13413, 17071, 57969, 114069}},
+{12840, 17, 60440, {1, 3, 1, 15, 31, 41, 85, 161, 379, 337, 1639, 933, 3511, 925, 3523, 52379, 18421}},
+{12841, 17, 60450, {1, 3, 3, 11, 17, 17, 71, 11, 291, 305, 1295, 1175, 1803, 6247, 26523, 46467, 126999}},
+{12842, 17, 60469, {1, 1, 1, 13, 9, 43, 113, 7, 1, 443, 719, 3045, 2527, 5233, 13969, 50463, 115629}},
+{12843, 17, 60473, {1, 1, 1, 13, 9, 31, 87, 119, 351, 53, 985, 2017, 1187, 10429, 13719, 41383, 12749}},
+{12844, 17, 60474, {1, 1, 1, 15, 23, 17, 5, 215, 383, 299, 305, 3577, 7707, 6927, 28591, 44287, 65697}},
+{12845, 17, 60484, {1, 1, 5, 7, 23, 61, 89, 235, 97, 463, 237, 2117, 5503, 13693, 28231, 7745, 73631}},
+{12846, 17, 60496, {1, 3, 7, 3, 17, 43, 73, 245, 145, 267, 855, 187, 6167, 3999, 9935, 14347, 57727}},
+{12847, 17, 60502, {1, 1, 7, 3, 25, 47, 11, 221, 425, 527, 1341, 3973, 4635, 16321, 30021, 48547, 109409}},
+{12848, 17, 60508, {1, 3, 1, 13, 5, 11, 41, 191, 121, 219, 1315, 583, 2997, 5883, 31689, 64835, 35351}},
+{12849, 17, 60511, {1, 1, 3, 3, 15, 47, 49, 115, 107, 757, 329, 1653, 4633, 14605, 1579, 62413, 88685}},
+{12850, 17, 60522, {1, 1, 1, 5, 19, 47, 63, 131, 427, 335, 269, 3581, 7613, 15685, 16957, 30487, 94965}},
+{12851, 17, 60529, {1, 1, 3, 15, 31, 11, 77, 115, 467, 249, 247, 651, 3769, 3701, 21627, 36219, 77309}},
+{12852, 17, 60530, {1, 3, 1, 5, 5, 29, 45, 21, 37, 733, 1773, 2467, 2747, 9391, 5449, 23285, 20089}},
+{12853, 17, 60536, {1, 3, 5, 13, 29, 31, 51, 199, 77, 711, 1313, 3303, 2675, 177, 7915, 37129, 123641}},
+{12854, 17, 60551, {1, 3, 7, 15, 17, 17, 99, 43, 9, 699, 491, 669, 1313, 1377, 30015, 59261, 97321}},
+{12855, 17, 60557, {1, 3, 1, 13, 9, 13, 21, 199, 249, 775, 399, 897, 2205, 15357, 17281, 3193, 255}},
+{12856, 17, 60566, {1, 3, 1, 13, 7, 23, 7, 181, 65, 253, 199, 333, 6507, 4409, 13319, 30165, 95191}},
+{12857, 17, 60576, {1, 3, 3, 1, 31, 9, 31, 71, 301, 867, 1655, 2065, 597, 15247, 3019, 31763, 91889}},
+{12858, 17, 60579, {1, 3, 5, 5, 3, 35, 113, 133, 39, 1013, 991, 3521, 5805, 87, 32393, 28619, 34325}},
+{12859, 17, 60585, {1, 3, 1, 9, 15, 27, 45, 85, 61, 99, 1085, 3251, 7085, 4137, 27443, 42581, 94031}},
+{12860, 17, 60588, {1, 1, 5, 7, 11, 49, 97, 129, 339, 259, 821, 165, 833, 11383, 21629, 17473, 2947}},
+{12861, 17, 60600, {1, 3, 3, 3, 11, 7, 27, 231, 169, 847, 1767, 1823, 3855, 14277, 12457, 55825, 14377}},
+{12862, 17, 60613, {1, 1, 7, 3, 27, 5, 47, 193, 207, 747, 271, 3155, 1097, 2229, 4919, 22327, 12659}},
+{12863, 17, 60628, {1, 1, 5, 3, 27, 29, 105, 199, 31, 73, 1741, 2173, 4577, 3917, 31513, 45983, 118015}},
+{12864, 17, 60631, {1, 1, 3, 1, 19, 5, 23, 249, 35, 891, 1105, 1907, 5453, 1877, 1965, 3169, 107091}},
+{12865, 17, 60648, {1, 1, 7, 9, 11, 47, 57, 171, 255, 661, 1925, 2223, 525, 4775, 12327, 8067, 47083}},
+{12866, 17, 60651, {1, 3, 3, 11, 29, 43, 37, 33, 459, 117, 7, 1739, 3585, 7429, 2217, 9533, 95299}},
+{12867, 17, 60653, {1, 1, 5, 11, 23, 3, 33, 13, 45, 201, 467, 597, 4891, 2673, 32407, 56935, 121991}},
+{12868, 17, 60671, {1, 1, 7, 5, 29, 63, 7, 59, 417, 547, 17, 3701, 5775, 1079, 26527, 47187, 14827}},
+{12869, 17, 60673, {1, 1, 5, 3, 27, 11, 85, 129, 377, 497, 1659, 1965, 581, 15075, 31265, 195, 62307}},
+{12870, 17, 60691, {1, 1, 3, 9, 3, 57, 33, 57, 279, 955, 741, 955, 6501, 8069, 27305, 15363, 34715}},
+{12871, 17, 60697, {1, 3, 7, 13, 29, 23, 25, 171, 201, 529, 661, 4089, 5755, 12459, 31269, 9763, 53217}},
+{12872, 17, 60700, {1, 3, 7, 1, 3, 19, 27, 201, 261, 421, 1487, 2907, 547, 15791, 7661, 42871, 116343}},
+{12873, 17, 60714, {1, 3, 7, 9, 5, 59, 51, 91, 7, 399, 2001, 661, 6577, 7473, 5439, 29073, 3391}},
+{12874, 17, 60724, {1, 1, 7, 1, 23, 39, 119, 105, 113, 913, 1097, 2547, 8143, 11409, 23197, 59527, 55677}},
+{12875, 17, 60728, {1, 3, 3, 15, 31, 35, 103, 207, 247, 801, 1821, 1995, 4437, 12891, 659, 15687, 53}},
+{12876, 17, 60733, {1, 3, 3, 5, 13, 5, 45, 187, 231, 661, 1553, 2909, 3715, 4499, 14773, 5957, 24171}},
+{12877, 17, 60736, {1, 1, 1, 11, 3, 53, 93, 29, 379, 713, 299, 445, 2815, 9825, 30941, 22413, 91563}},
+{12878, 17, 60745, {1, 3, 1, 1, 27, 31, 111, 83, 349, 895, 1007, 2649, 7139, 5863, 27739, 53099, 6837}},
+{12879, 17, 60746, {1, 3, 1, 5, 23, 57, 121, 229, 487, 405, 2001, 2761, 3011, 2219, 10711, 31139, 83809}},
+{12880, 17, 60753, {1, 3, 7, 5, 13, 51, 37, 181, 359, 909, 2001, 793, 1143, 9219, 5111, 23021, 126081}},
+{12881, 17, 60754, {1, 3, 1, 13, 27, 27, 99, 25, 189, 129, 1831, 1005, 8119, 2557, 26985, 63447, 89693}},
+{12882, 17, 60782, {1, 1, 7, 5, 1, 21, 79, 33, 99, 7, 433, 1343, 3121, 3705, 477, 41191, 13749}},
+{12883, 17, 60784, {1, 1, 5, 5, 29, 53, 75, 243, 35, 461, 1399, 129, 177, 6533, 22209, 23503, 43819}},
+{12884, 17, 60790, {1, 3, 7, 7, 31, 37, 109, 9, 255, 263, 35, 3451, 7629, 9849, 10387, 3165, 120623}},
+{12885, 17, 60793, {1, 3, 5, 3, 27, 53, 93, 111, 239, 723, 293, 1481, 4427, 13623, 1989, 47705, 122069}},
+{12886, 17, 60805, {1, 3, 7, 7, 31, 37, 37, 213, 191, 627, 1821, 3621, 2875, 15759, 17525, 50969, 35311}},
+{12887, 17, 60830, {1, 3, 5, 5, 11, 41, 87, 233, 79, 251, 25, 1385, 3527, 7853, 5541, 36519, 42779}},
+{12888, 17, 60836, {1, 3, 1, 5, 9, 1, 117, 11, 61, 879, 553, 383, 6237, 15207, 3057, 28051, 59149}},
+{12889, 17, 60846, {1, 1, 1, 15, 15, 7, 37, 133, 81, 815, 893, 2281, 2459, 15325, 20107, 2289, 34535}},
+{12890, 17, 60851, {1, 1, 5, 11, 17, 3, 45, 159, 409, 643, 969, 1289, 4353, 10465, 16233, 55561, 111667}},
+{12891, 17, 60880, {1, 1, 5, 13, 23, 1, 79, 127, 485, 1013, 629, 791, 853, 9247, 26333, 1123, 17313}},
+{12892, 17, 60896, {1, 1, 5, 11, 27, 17, 97, 157, 479, 421, 1739, 3257, 2419, 6673, 2759, 19399, 120305}},
+{12893, 17, 60905, {1, 3, 5, 1, 3, 43, 71, 55, 111, 949, 1957, 3777, 3409, 8229, 26585, 49221, 33639}},
+{12894, 17, 60923, {1, 3, 7, 9, 17, 45, 71, 71, 417, 1007, 213, 1069, 2693, 5065, 23489, 33363, 120459}},
+{12895, 17, 60925, {1, 1, 1, 1, 25, 47, 81, 251, 341, 101, 1941, 1133, 3205, 4141, 26561, 56095, 37193}},
+{12896, 17, 60932, {1, 1, 3, 7, 25, 45, 97, 95, 135, 871, 949, 3489, 7593, 10717, 26163, 12711, 76989}},
+{12897, 17, 60939, {1, 3, 1, 9, 3, 11, 35, 7, 471, 509, 1335, 385, 1297, 11201, 28553, 51609, 45351}},
+{12898, 17, 60942, {1, 1, 5, 11, 21, 23, 105, 31, 125, 5, 1721, 1503, 7807, 13093, 24873, 18467, 30183}},
+{12899, 17, 60953, {1, 3, 7, 15, 15, 57, 61, 213, 79, 655, 517, 1031, 6719, 4807, 12805, 2605, 35407}},
+{12900, 17, 60956, {1, 1, 3, 15, 21, 5, 93, 61, 103, 945, 935, 115, 1281, 7735, 20723, 37211, 50039}},
+{12901, 17, 60959, {1, 3, 3, 15, 19, 51, 79, 187, 127, 205, 121, 701, 6065, 15185, 29343, 58249, 25331}},
+{12902, 17, 60963, {1, 3, 3, 15, 17, 49, 23, 163, 201, 809, 1203, 687, 1777, 695, 18779, 31571, 118383}},
+{12903, 17, 60969, {1, 1, 1, 5, 25, 45, 121, 223, 233, 193, 1459, 1889, 5537, 4421, 13659, 4591, 112563}},
+{12904, 17, 60978, {1, 3, 5, 3, 31, 37, 109, 15, 381, 373, 993, 3633, 641, 4411, 32265, 46481, 49195}},
+{12905, 17, 60980, {1, 3, 3, 11, 19, 21, 39, 67, 447, 829, 1163, 55, 2153, 15045, 6643, 48235, 59261}},
+{12906, 17, 60987, {1, 3, 3, 1, 7, 63, 37, 71, 35, 601, 1719, 447, 8009, 7235, 13225, 44103, 82409}},
+{12907, 17, 61007, {1, 3, 3, 7, 13, 33, 69, 115, 207, 807, 109, 2989, 3727, 9017, 29095, 11377, 122401}},
+{12908, 17, 61012, {1, 1, 3, 15, 9, 9, 57, 197, 115, 73, 1277, 1727, 5275, 11897, 12157, 34763, 58273}},
+{12909, 17, 61015, {1, 1, 3, 15, 19, 19, 127, 105, 289, 663, 877, 1303, 4901, 8897, 4803, 36853, 93361}},
+{12910, 17, 61025, {1, 1, 3, 7, 23, 29, 121, 29, 439, 795, 1469, 523, 7767, 12061, 15613, 57343, 21291}},
+{12911, 17, 61026, {1, 1, 1, 9, 25, 29, 15, 165, 383, 233, 91, 2065, 2741, 7809, 5325, 48581, 65551}},
+{12912, 17, 61038, {1, 1, 5, 15, 29, 19, 103, 143, 283, 597, 1055, 3525, 6115, 11083, 22497, 42893, 86849}},
+{12913, 17, 61040, {1, 1, 1, 15, 13, 43, 75, 157, 267, 519, 1231, 929, 1585, 16137, 1045, 4353, 63473}},
+{12914, 17, 61052, {1, 1, 1, 9, 17, 25, 73, 227, 145, 921, 1845, 2057, 3099, 15523, 8993, 14135, 37811}},
+{12915, 17, 61061, {1, 3, 3, 15, 17, 57, 107, 215, 271, 841, 1543, 2803, 625, 15359, 13341, 36879, 83191}},
+{12916, 17, 61074, {1, 3, 5, 13, 3, 17, 127, 81, 193, 253, 71, 3205, 1157, 1313, 27341, 49657, 96539}},
+{12917, 17, 61083, {1, 3, 1, 5, 27, 43, 1, 111, 23, 963, 1853, 925, 7401, 13999, 29797, 47125, 59955}},
+{12918, 17, 61085, {1, 3, 3, 1, 31, 55, 107, 121, 37, 159, 61, 577, 5711, 6745, 20077, 42333, 37105}},
+{12919, 17, 61086, {1, 1, 5, 3, 31, 11, 1, 7, 295, 515, 203, 707, 2919, 9619, 8877, 45143, 101861}},
+{12920, 17, 61096, {1, 3, 7, 11, 5, 23, 71, 9, 99, 947, 1141, 1651, 1903, 13607, 15433, 55005, 127639}},
+{12921, 17, 61119, {1, 1, 7, 3, 13, 61, 25, 111, 239, 243, 1069, 3551, 3339, 743, 29921, 21313, 54953}},
+{12922, 17, 61124, {1, 1, 3, 3, 23, 7, 21, 47, 367, 871, 1647, 2183, 2615, 2257, 30447, 25761, 110221}},
+{12923, 17, 61127, {1, 3, 7, 15, 13, 51, 115, 19, 277, 463, 475, 3467, 7313, 2477, 10841, 13585, 61449}},
+{12924, 17, 61128, {1, 1, 7, 9, 1, 27, 111, 209, 391, 621, 1047, 549, 2013, 549, 24213, 6369, 68691}},
+{12925, 17, 61133, {1, 1, 1, 11, 19, 59, 11, 107, 79, 1013, 357, 1729, 889, 12823, 6537, 35717, 42761}},
+{12926, 17, 61134, {1, 1, 3, 15, 29, 41, 49, 177, 309, 293, 1035, 1481, 1395, 2009, 7917, 365, 28981}},
+{12927, 17, 61146, {1, 3, 7, 11, 31, 19, 51, 113, 479, 347, 353, 929, 1089, 3373, 2807, 55201, 23137}},
+{12928, 17, 61155, {1, 3, 1, 15, 7, 55, 79, 191, 267, 701, 1885, 1241, 7085, 9835, 24239, 7609, 13967}},
+{12929, 17, 61161, {1, 1, 3, 15, 25, 33, 69, 5, 93, 375, 435, 2401, 1591, 8173, 17293, 20281, 63809}},
+{12930, 17, 61162, {1, 3, 5, 3, 9, 49, 63, 47, 217, 773, 1241, 1131, 7521, 15607, 24341, 20353, 122801}},
+{12931, 17, 61169, {1, 3, 7, 15, 21, 1, 57, 159, 279, 987, 1641, 3883, 1659, 7875, 24857, 33273, 88933}},
+{12932, 17, 61179, {1, 1, 3, 11, 3, 23, 45, 31, 279, 643, 1285, 471, 137, 15871, 13927, 52361, 118901}},
+{12933, 17, 61182, {1, 3, 1, 15, 27, 51, 83, 19, 299, 213, 1001, 897, 2751, 13085, 20841, 24891, 113173}},
+{12934, 17, 61190, {1, 1, 7, 5, 5, 27, 77, 77, 165, 489, 359, 1607, 3903, 16241, 641, 25999, 29279}},
+{12935, 17, 61201, {1, 3, 3, 7, 15, 23, 103, 49, 259, 519, 641, 1577, 3713, 12181, 287, 29483, 58505}},
+{12936, 17, 61208, {1, 1, 7, 13, 11, 29, 125, 45, 45, 167, 261, 2735, 2421, 15457, 5965, 44005, 82141}},
+{12937, 17, 61238, {1, 1, 3, 9, 25, 21, 9, 3, 57, 1017, 1359, 79, 6789, 7805, 20683, 25695, 38893}},
+{12938, 17, 61241, {1, 1, 7, 1, 29, 53, 87, 171, 51, 5, 9, 3033, 787, 10611, 15913, 35703, 70459}},
+{12939, 17, 61247, {1, 1, 3, 5, 1, 33, 111, 139, 477, 33, 1287, 3615, 5235, 15491, 2915, 47821, 55257}},
+{12940, 17, 61259, {1, 1, 1, 13, 5, 23, 55, 225, 303, 587, 1595, 307, 3809, 8093, 13297, 63213, 104317}},
+{12941, 17, 61267, {1, 1, 3, 15, 31, 29, 13, 33, 267, 481, 1039, 3805, 2549, 861, 12483, 61829, 127725}},
+{12942, 17, 61269, {1, 3, 5, 11, 23, 17, 23, 117, 333, 167, 1965, 1387, 5453, 15545, 123, 12991, 36281}},
+{12943, 17, 61295, {1, 3, 5, 1, 3, 9, 25, 55, 497, 951, 1377, 993, 6089, 4801, 32719, 31579, 126663}},
+{12944, 17, 61304, {1, 3, 5, 11, 15, 37, 103, 51, 509, 585, 769, 425, 835, 14027, 30265, 55735, 36655}},
+{12945, 17, 61309, {1, 1, 1, 13, 9, 49, 105, 61, 493, 3, 1663, 815, 8105, 16361, 32477, 30437, 61519}},
+{12946, 17, 61310, {1, 3, 7, 11, 29, 23, 105, 87, 119, 399, 1405, 1515, 7017, 12729, 13769, 29741, 30921}},
+{12947, 17, 61313, {1, 3, 7, 13, 13, 7, 93, 227, 489, 843, 923, 3373, 759, 5105, 9059, 21079, 101335}},
+{12948, 17, 61320, {1, 1, 1, 1, 29, 53, 119, 227, 171, 363, 289, 827, 425, 12827, 25791, 21587, 109567}},
+{12949, 17, 61325, {1, 1, 5, 11, 29, 29, 53, 127, 441, 219, 1049, 275, 525, 5535, 20907, 9299, 76319}},
+{12950, 17, 61334, {1, 3, 7, 15, 3, 53, 109, 61, 275, 391, 1147, 2953, 1439, 4417, 679, 10949, 35101}},
+{12951, 17, 61337, {1, 1, 5, 13, 9, 1, 109, 137, 249, 835, 721, 129, 2883, 13043, 31827, 36741, 107167}},
+{12952, 17, 61386, {1, 1, 5, 9, 27, 17, 117, 121, 111, 433, 743, 1987, 6839, 8439, 2533, 62135, 54281}},
+{12953, 17, 61399, {1, 3, 5, 15, 11, 61, 117, 103, 409, 485, 1047, 469, 2245, 7193, 2541, 9399, 88127}},
+{12954, 17, 61422, {1, 3, 1, 9, 3, 49, 111, 201, 87, 181, 1243, 3261, 1827, 10385, 13045, 58331, 107729}},
+{12955, 17, 61429, {1, 3, 5, 15, 13, 29, 61, 223, 227, 733, 1757, 755, 4231, 13537, 1509, 54623, 120221}},
+{12956, 17, 61436, {1, 1, 1, 15, 13, 9, 7, 233, 391, 689, 355, 1203, 5811, 7759, 2647, 54949, 51891}},
+{12957, 17, 61439, {1, 1, 3, 1, 3, 27, 95, 51, 497, 315, 915, 1055, 2917, 167, 1849, 26591, 102729}},
+{12958, 17, 61466, {1, 3, 7, 13, 1, 51, 3, 113, 437, 449, 1889, 2887, 4735, 5693, 8191, 12847, 52651}},
+{12959, 17, 61477, {1, 1, 7, 13, 1, 45, 41, 221, 403, 185, 1653, 1809, 6405, 9193, 1381, 36677, 43255}},
+{12960, 17, 61478, {1, 1, 5, 1, 25, 51, 109, 245, 291, 809, 1381, 3235, 5933, 10185, 18663, 15589, 39539}},
+{12961, 17, 61490, {1, 3, 3, 1, 27, 29, 3, 227, 275, 705, 489, 681, 323, 7453, 26005, 13791, 115219}},
+{12962, 17, 61495, {1, 3, 5, 1, 3, 51, 101, 75, 157, 529, 45, 3105, 3617, 13081, 21665, 50065, 117823}},
+{12963, 17, 61504, {1, 3, 5, 15, 9, 43, 41, 169, 391, 455, 1375, 253, 1257, 14427, 16325, 11571, 26361}},
+{12964, 17, 61514, {1, 1, 5, 7, 5, 41, 81, 173, 275, 225, 301, 335, 5473, 1509, 20897, 21951, 103967}},
+{12965, 17, 61516, {1, 3, 5, 1, 13, 27, 107, 19, 221, 609, 823, 1193, 665, 4947, 11967, 57373, 21665}},
+{12966, 17, 61521, {1, 3, 7, 13, 7, 11, 109, 59, 193, 103, 943, 595, 5121, 6159, 2103, 52863, 57541}},
+{12967, 17, 61527, {1, 3, 5, 3, 5, 51, 85, 227, 465, 1013, 601, 1687, 7615, 5991, 8635, 64487, 69967}},
+{12968, 17, 61531, {1, 3, 1, 11, 29, 49, 79, 25, 447, 119, 569, 383, 5261, 6209, 21965, 40863, 96593}},
+{12969, 17, 61540, {1, 1, 3, 13, 9, 49, 59, 93, 369, 789, 1373, 425, 3565, 13357, 17783, 46435, 129653}},
+{12970, 17, 61550, {1, 3, 7, 5, 5, 39, 51, 15, 421, 531, 1855, 2105, 5335, 8509, 20841, 44997, 48235}},
+{12971, 17, 61557, {1, 3, 7, 3, 27, 47, 113, 1, 453, 565, 1843, 243, 7663, 10697, 7725, 24485, 49435}},
+{12972, 17, 61562, {1, 1, 1, 11, 25, 25, 47, 1, 475, 831, 1833, 391, 5173, 14873, 14263, 36061, 26781}},
+{12973, 17, 61577, {1, 1, 7, 15, 21, 13, 5, 169, 241, 235, 547, 1565, 2053, 6877, 12811, 22213, 106907}},
+{12974, 17, 61583, {1, 3, 7, 1, 21, 11, 101, 115, 243, 985, 1389, 2189, 563, 12453, 14951, 58889, 48079}},
+{12975, 17, 61597, {1, 1, 5, 7, 9, 37, 33, 241, 337, 453, 1955, 1731, 4445, 8887, 27715, 63975, 95891}},
+{12976, 17, 61602, {1, 1, 5, 1, 23, 21, 95, 237, 241, 991, 1159, 2417, 2279, 8941, 20987, 39773, 79327}},
+{12977, 17, 61604, {1, 3, 3, 1, 19, 39, 73, 253, 137, 1009, 1793, 4007, 2017, 7503, 16689, 29013, 41571}},
+{12978, 17, 61607, {1, 3, 7, 15, 3, 63, 77, 11, 293, 495, 339, 3525, 5747, 1807, 11705, 55807, 54163}},
+{12979, 17, 61622, {1, 3, 7, 3, 25, 41, 127, 23, 113, 807, 387, 3529, 2173, 11217, 21257, 61169, 47749}},
+{12980, 17, 61625, {1, 3, 3, 5, 27, 5, 43, 55, 207, 995, 811, 1473, 481, 4317, 2015, 49161, 94711}},
+{12981, 17, 61633, {1, 3, 1, 9, 21, 61, 41, 147, 425, 353, 1943, 2455, 379, 10729, 3045, 16013, 44527}},
+{12982, 17, 61640, {1, 3, 1, 5, 17, 43, 109, 231, 313, 277, 939, 3491, 5883, 2297, 4763, 33403, 62395}},
+{12983, 17, 61643, {1, 1, 3, 9, 1, 49, 37, 145, 383, 467, 621, 2873, 873, 6163, 16475, 49045, 115599}},
+{12984, 17, 61651, {1, 1, 1, 9, 5, 15, 125, 157, 459, 727, 807, 2769, 5531, 11531, 4277, 42301, 16969}},
+{12985, 17, 61658, {1, 1, 3, 1, 15, 23, 39, 121, 163, 537, 409, 1217, 8007, 5671, 19681, 25371, 69227}},
+{12986, 17, 61670, {1, 3, 7, 9, 23, 1, 93, 41, 267, 995, 1917, 3441, 6237, 7233, 30215, 31945, 33967}},
+{12987, 17, 61674, {1, 1, 1, 15, 7, 5, 123, 53, 359, 677, 1061, 1649, 651, 14079, 30211, 14827, 123175}},
+{12988, 17, 61676, {1, 3, 1, 5, 11, 19, 121, 135, 167, 293, 493, 949, 5459, 11785, 21445, 57161, 129737}},
+{12989, 17, 61679, {1, 1, 3, 13, 19, 39, 43, 55, 149, 549, 479, 925, 341, 1151, 12007, 23473, 10671}},
+{12990, 17, 61688, {1, 3, 5, 9, 7, 41, 37, 103, 381, 373, 1767, 3959, 3001, 7903, 24033, 55123, 93627}},
+{12991, 17, 61693, {1, 3, 3, 3, 31, 27, 93, 175, 393, 575, 703, 3715, 6043, 11763, 7613, 15907, 56821}},
+{12992, 17, 61701, {1, 3, 3, 13, 3, 13, 75, 85, 89, 851, 1171, 3075, 5265, 10293, 14745, 32153, 89877}},
+{12993, 17, 61711, {1, 1, 7, 11, 1, 25, 101, 149, 187, 197, 1485, 1555, 1599, 7413, 23275, 27093, 73483}},
+{12994, 17, 61714, {1, 3, 1, 1, 19, 15, 63, 111, 211, 197, 77, 1683, 3159, 235, 32601, 35715, 59537}},
+{12995, 17, 61723, {1, 3, 5, 11, 23, 61, 91, 135, 403, 669, 267, 2507, 2931, 7813, 5047, 40027, 111705}},
+{12996, 17, 61725, {1, 1, 5, 13, 7, 5, 65, 37, 87, 405, 335, 1095, 3717, 1717, 31551, 28181, 47407}},
+{12997, 17, 61726, {1, 1, 5, 13, 3, 43, 67, 99, 507, 861, 1063, 3003, 6095, 11079, 6919, 41597, 97709}},
+{12998, 17, 61729, {1, 1, 3, 1, 7, 23, 109, 161, 321, 499, 549, 363, 2061, 6519, 1531, 1969, 83845}},
+{12999, 17, 61741, {1, 3, 7, 5, 17, 39, 55, 59, 455, 433, 601, 365, 7987, 2207, 3463, 31755, 94203}},
+{13000, 17, 61761, {1, 3, 5, 5, 29, 61, 79, 101, 125, 1011, 867, 2935, 3269, 13601, 21935, 50355, 65883}},
+{13001, 17, 61779, {1, 1, 1, 5, 3, 41, 101, 107, 299, 125, 81, 2421, 2937, 787, 19479, 25803, 74473}},
+{13002, 17, 61781, {1, 3, 3, 1, 3, 15, 73, 13, 167, 387, 75, 601, 415, 6927, 32277, 16709, 12477}},
+{13003, 17, 61782, {1, 1, 5, 1, 19, 37, 53, 45, 139, 737, 159, 2299, 6219, 11613, 22873, 18303, 56875}},
+{13004, 17, 61797, {1, 1, 3, 9, 23, 15, 17, 37, 373, 445, 1369, 2997, 49, 13901, 13155, 37375, 29063}},
+{13005, 17, 61809, {1, 3, 3, 11, 17, 1, 45, 91, 445, 631, 1297, 1907, 3765, 13893, 29379, 17939, 36573}},
+{13006, 17, 61810, {1, 1, 7, 13, 11, 31, 101, 165, 413, 305, 361, 4019, 3183, 2321, 7819, 49275, 101041}},
+{13007, 17, 61816, {1, 1, 7, 1, 13, 43, 125, 165, 357, 293, 1343, 2219, 4189, 6095, 28509, 27763, 53871}},
+{13008, 17, 61822, {1, 3, 3, 11, 29, 33, 105, 71, 297, 637, 1493, 3797, 5525, 15093, 21647, 57647, 1467}},
+{13009, 17, 61849, {1, 1, 1, 13, 19, 7, 5, 141, 71, 221, 923, 1039, 4777, 9481, 1267, 55345, 116061}},
+{13010, 17, 61876, {1, 1, 7, 11, 19, 43, 57, 243, 21, 217, 1075, 569, 3735, 10477, 18595, 34133, 70391}},
+{13011, 17, 61893, {1, 3, 3, 1, 21, 61, 7, 135, 401, 101, 321, 2959, 7371, 3303, 23023, 28163, 19833}},
+{13012, 17, 61905, {1, 1, 3, 9, 31, 43, 27, 243, 297, 145, 663, 3951, 4283, 10421, 9355, 30381, 68317}},
+{13013, 17, 61908, {1, 3, 7, 13, 29, 53, 101, 253, 49, 129, 831, 513, 5567, 5063, 157, 6465, 90983}},
+{13014, 17, 61911, {1, 1, 5, 15, 27, 29, 3, 231, 503, 173, 913, 3971, 7685, 9679, 32243, 967, 73195}},
+{13015, 17, 61912, {1, 1, 1, 15, 19, 55, 127, 3, 405, 239, 1063, 3473, 7543, 4049, 14509, 22657, 5611}},
+{13016, 17, 61928, {1, 3, 7, 1, 21, 39, 61, 249, 421, 401, 1667, 1981, 5503, 9191, 24027, 35049, 12199}},
+{13017, 17, 61934, {1, 3, 5, 5, 27, 1, 99, 83, 287, 997, 721, 1345, 2197, 6335, 4245, 42575, 102635}},
+{13018, 17, 61957, {1, 3, 3, 1, 31, 7, 103, 107, 387, 273, 951, 2475, 1275, 15607, 2159, 55083, 86107}},
+{13019, 17, 61961, {1, 3, 3, 5, 21, 59, 69, 55, 121, 601, 5, 1871, 7161, 4583, 23867, 7933, 3125}},
+{13020, 17, 61969, {1, 1, 1, 15, 17, 41, 51, 45, 383, 579, 713, 275, 1395, 11665, 30521, 11683, 126493}},
+{13021, 17, 61979, {1, 1, 1, 15, 17, 47, 15, 139, 175, 283, 1377, 827, 5753, 8855, 26437, 59219, 105601}},
+{13022, 17, 61982, {1, 1, 7, 11, 13, 3, 27, 141, 137, 851, 767, 2575, 7685, 11719, 24401, 52547, 127299}},
+{13023, 17, 62003, {1, 3, 3, 9, 11, 41, 75, 69, 167, 897, 1213, 3723, 6773, 12141, 28033, 19695, 128545}},
+{13024, 17, 62006, {1, 1, 5, 13, 7, 61, 55, 131, 465, 169, 1669, 711, 5901, 10769, 11273, 23809, 63625}},
+{13025, 17, 62010, {1, 1, 5, 1, 27, 25, 35, 167, 83, 921, 251, 2571, 6723, 14767, 26715, 21699, 60779}},
+{13026, 17, 62015, {1, 3, 1, 9, 15, 5, 59, 241, 405, 323, 1917, 1161, 6079, 13443, 13079, 58617, 63381}},
+{13027, 17, 62020, {1, 3, 1, 5, 9, 5, 79, 123, 87, 395, 667, 2787, 3711, 3613, 1803, 17885, 78975}},
+{13028, 17, 62024, {1, 3, 3, 5, 17, 45, 61, 107, 485, 163, 33, 1491, 7131, 59, 27327, 8043, 14907}},
+{13029, 17, 62029, {1, 3, 1, 11, 27, 37, 5, 251, 115, 339, 1621, 2013, 3517, 2213, 10145, 47121, 84485}},
+{13030, 17, 62032, {1, 3, 3, 1, 9, 11, 71, 25, 363, 867, 1485, 3897, 3339, 7599, 20777, 52009, 127097}},
+{13031, 17, 62035, {1, 1, 3, 9, 25, 37, 29, 231, 183, 315, 399, 879, 6169, 6355, 3729, 9187, 19405}},
+{13032, 17, 62038, {1, 3, 5, 3, 31, 37, 127, 71, 171, 687, 1237, 151, 7391, 2395, 11979, 23381, 117879}},
+{13033, 17, 62047, {1, 1, 1, 13, 13, 43, 71, 235, 131, 79, 1321, 235, 2221, 1133, 13509, 12205, 44771}},
+{13034, 17, 62068, {1, 3, 7, 5, 29, 51, 125, 191, 153, 35, 1657, 2141, 3701, 7177, 31723, 15189, 55441}},
+{13035, 17, 62071, {1, 1, 5, 1, 5, 35, 13, 165, 461, 255, 1825, 1531, 6195, 7717, 973, 12367, 71747}},
+{13036, 17, 62082, {1, 3, 1, 9, 13, 57, 25, 83, 389, 405, 227, 1037, 3805, 15653, 25365, 47991, 54315}},
+{13037, 17, 62088, {1, 1, 1, 13, 17, 55, 113, 151, 145, 951, 1849, 2205, 6513, 7845, 7947, 59429, 44911}},
+{13038, 17, 62096, {1, 3, 5, 3, 25, 9, 99, 159, 183, 445, 153, 3053, 2537, 1787, 19029, 60047, 128203}},
+{13039, 17, 62108, {1, 1, 5, 5, 31, 37, 13, 11, 271, 491, 1141, 1827, 3751, 9471, 7579, 35969, 95245}},
+{13040, 17, 62124, {1, 3, 3, 15, 1, 43, 9, 109, 13, 991, 345, 1577, 947, 3197, 16747, 8127, 116937}},
+{13041, 17, 62142, {1, 3, 3, 15, 11, 17, 103, 89, 33, 741, 1855, 2879, 3899, 9535, 15119, 56165, 86055}},
+{13042, 17, 62147, {1, 3, 5, 1, 31, 41, 57, 205, 69, 163, 1383, 2087, 6483, 6281, 32079, 40825, 28709}},
+{13043, 17, 62153, {1, 1, 1, 13, 23, 57, 103, 247, 421, 773, 1733, 3249, 6681, 9675, 11669, 51673, 86189}},
+{13044, 17, 62159, {1, 1, 5, 15, 7, 37, 63, 123, 77, 941, 277, 1061, 803, 2135, 15745, 47413, 73843}},
+{13045, 17, 62161, {1, 1, 3, 5, 19, 15, 35, 59, 321, 527, 1669, 2929, 513, 4453, 20521, 19781, 115501}},
+{13046, 17, 62171, {1, 1, 7, 3, 23, 1, 99, 251, 129, 271, 1555, 1191, 2445, 11533, 11921, 19131, 80653}},
+{13047, 17, 62189, {1, 1, 7, 15, 15, 33, 79, 89, 113, 517, 1655, 43, 6255, 15415, 19559, 63309, 16857}},
+{13048, 17, 62207, {1, 3, 5, 1, 13, 61, 87, 159, 65, 875, 163, 663, 7651, 8775, 32505, 39313, 83331}},
+{13049, 17, 62227, {1, 1, 7, 15, 27, 19, 63, 117, 427, 233, 1243, 755, 3201, 5153, 31959, 64545, 69219}},
+{13050, 17, 62230, {1, 1, 5, 3, 3, 27, 15, 11, 427, 431, 107, 2433, 6923, 7503, 31347, 64849, 14541}},
+{13051, 17, 62234, {1, 1, 3, 11, 7, 23, 53, 253, 483, 63, 1749, 2989, 5219, 7361, 6423, 1503, 95431}},
+{13052, 17, 62236, {1, 1, 5, 9, 1, 19, 23, 25, 301, 665, 1457, 2423, 6623, 9771, 2755, 8963, 51037}},
+{13053, 17, 62239, {1, 3, 3, 7, 21, 1, 3, 131, 377, 897, 15, 437, 4075, 7669, 31529, 64123, 101249}},
+{13054, 17, 62257, {1, 3, 5, 3, 31, 41, 99, 27, 397, 393, 1895, 2249, 3925, 6393, 2839, 375, 56721}},
+{13055, 17, 62270, {1, 3, 7, 15, 1, 45, 65, 113, 85, 557, 857, 2281, 1395, 2055, 2405, 34541, 63719}},
+{13056, 17, 62278, {1, 3, 1, 15, 7, 43, 21, 29, 15, 229, 1287, 3005, 339, 5833, 21867, 21643, 37557}},
+{13057, 17, 62287, {1, 3, 7, 3, 3, 51, 67, 119, 423, 539, 1995, 4039, 2999, 2787, 29327, 62687, 11893}},
+{13058, 17, 62295, {1, 3, 7, 3, 25, 23, 85, 11, 105, 523, 889, 2983, 2031, 2049, 16119, 41925, 38345}},
+{13059, 17, 62301, {1, 3, 7, 3, 13, 63, 59, 65, 183, 695, 293, 3301, 7895, 13915, 25847, 22819, 92189}},
+{13060, 17, 62306, {1, 1, 3, 3, 7, 27, 101, 229, 435, 227, 1759, 1275, 5781, 6079, 25125, 64833, 69577}},
+{13061, 17, 62312, {1, 1, 3, 1, 29, 1, 61, 45, 193, 441, 687, 841, 4491, 10683, 13989, 60461, 78071}},
+{13062, 17, 62317, {1, 3, 1, 9, 5, 33, 99, 229, 181, 675, 1629, 1855, 4719, 9585, 8059, 26363, 31161}},
+{13063, 17, 62330, {1, 3, 1, 11, 11, 37, 79, 53, 163, 49, 1173, 1715, 8087, 6535, 14985, 24069, 118597}},
+{13064, 17, 62342, {1, 1, 7, 15, 9, 59, 123, 79, 237, 131, 1693, 2525, 6339, 9843, 24309, 24969, 37645}},
+{13065, 17, 62359, {1, 3, 3, 7, 19, 49, 85, 133, 415, 239, 555, 2581, 6523, 2733, 19665, 19989, 105585}},
+{13066, 17, 62365, {1, 3, 3, 7, 23, 37, 31, 121, 59, 7, 2031, 2893, 6429, 10305, 21221, 20105, 38879}},
+{13067, 17, 62366, {1, 3, 1, 13, 23, 21, 93, 93, 343, 641, 411, 971, 1777, 2135, 22895, 9055, 114457}},
+{13068, 17, 62370, {1, 3, 5, 3, 15, 33, 23, 7, 59, 413, 277, 3551, 7737, 2285, 7951, 5013, 94469}},
+{13069, 17, 62375, {1, 3, 1, 15, 25, 1, 109, 245, 153, 187, 1099, 1071, 145, 6735, 10327, 3921, 62123}},
+{13070, 17, 62376, {1, 1, 7, 11, 11, 53, 51, 123, 277, 281, 1763, 3161, 7639, 14515, 29725, 3919, 5525}},
+{13071, 17, 62387, {1, 3, 3, 15, 27, 47, 109, 121, 317, 221, 187, 617, 1331, 5401, 861, 62465, 9227}},
+{13072, 17, 62404, {1, 3, 3, 15, 27, 25, 101, 111, 469, 85, 1285, 1621, 5393, 1367, 17115, 35141, 126989}},
+{13073, 17, 62411, {1, 3, 5, 1, 15, 23, 25, 249, 69, 17, 1103, 2603, 59, 15637, 22051, 29243, 53113}},
+{13074, 17, 62435, {1, 3, 1, 9, 17, 49, 73, 13, 207, 963, 379, 3561, 6447, 7895, 18651, 8109, 3943}},
+{13075, 17, 62441, {1, 3, 5, 11, 7, 41, 55, 85, 481, 831, 593, 4093, 1151, 12353, 24231, 46091, 80967}},
+{13076, 17, 62442, {1, 3, 7, 7, 5, 39, 47, 187, 427, 1007, 813, 3617, 6063, 12981, 18573, 34061, 85741}},
+{13077, 17, 62452, {1, 3, 3, 11, 9, 17, 29, 141, 341, 485, 1075, 4067, 7247, 11295, 31803, 18347, 54985}},
+{13078, 17, 62459, {1, 1, 3, 7, 17, 25, 7, 29, 355, 35, 1753, 669, 4123, 4293, 22875, 36677, 61201}},
+{13079, 17, 62461, {1, 1, 5, 9, 13, 45, 29, 153, 169, 387, 1275, 3161, 4937, 5331, 16203, 43925, 129231}},
+{13080, 17, 62473, {1, 3, 3, 9, 19, 27, 109, 95, 499, 929, 1627, 3215, 6097, 15837, 5655, 29877, 122513}},
+{13081, 17, 62474, {1, 3, 7, 11, 1, 25, 15, 41, 65, 411, 289, 883, 5069, 8405, 11159, 57357, 114253}},
+{13082, 17, 62493, {1, 1, 3, 11, 31, 57, 39, 89, 77, 321, 1667, 871, 6429, 1005, 18905, 13877, 9305}},
+{13083, 17, 62510, {1, 1, 7, 7, 27, 57, 23, 37, 281, 625, 1871, 565, 5979, 13925, 22591, 2375, 8577}},
+{13084, 17, 62518, {1, 1, 1, 7, 31, 35, 91, 221, 495, 811, 1321, 2235, 4287, 3009, 5745, 35013, 93715}},
+{13085, 17, 62524, {1, 1, 7, 3, 11, 53, 17, 13, 319, 225, 117, 3365, 537, 5249, 14219, 23879, 4321}},
+{13086, 17, 62549, {1, 3, 5, 1, 31, 57, 35, 95, 257, 933, 471, 627, 6733, 8707, 25173, 44291, 105041}},
+{13087, 17, 62556, {1, 1, 3, 3, 31, 53, 69, 19, 277, 669, 497, 3957, 2781, 14107, 27741, 53519, 41057}},
+{13088, 17, 62565, {1, 1, 3, 15, 11, 21, 11, 25, 257, 665, 491, 2119, 3893, 14401, 29147, 3369, 116569}},
+{13089, 17, 62566, {1, 3, 1, 1, 13, 49, 31, 231, 217, 711, 1987, 1487, 7073, 473, 28781, 51283, 86049}},
+{13090, 17, 62580, {1, 1, 1, 5, 23, 31, 119, 115, 381, 179, 1725, 2323, 8013, 15191, 13255, 57813, 95437}},
+{13091, 17, 62584, {1, 1, 3, 15, 15, 37, 83, 223, 259, 605, 2013, 4089, 395, 2063, 11735, 51931, 74677}},
+{13092, 17, 62589, {1, 1, 7, 3, 1, 61, 107, 169, 213, 789, 425, 2309, 225, 1305, 20697, 26281, 60129}},
+{13093, 17, 62596, {1, 1, 5, 15, 27, 15, 69, 169, 289, 931, 1491, 3711, 6875, 7723, 21103, 31795, 53955}},
+{13094, 17, 62608, {1, 1, 1, 3, 3, 43, 49, 205, 247, 817, 2037, 2305, 7935, 255, 18835, 49423, 90727}},
+{13095, 17, 62636, {1, 3, 7, 9, 17, 3, 95, 239, 431, 665, 1271, 3559, 5703, 14607, 9723, 11807, 122937}},
+{13096, 17, 62642, {1, 3, 5, 13, 5, 15, 13, 111, 375, 895, 833, 813, 5451, 13841, 1321, 25273, 25443}},
+{13097, 17, 62651, {1, 1, 3, 1, 11, 49, 3, 97, 467, 631, 51, 3577, 1777, 15965, 6837, 38827, 68627}},
+{13098, 17, 62654, {1, 1, 7, 1, 3, 11, 73, 155, 77, 623, 811, 337, 6837, 10925, 2097, 28325, 97487}},
+{13099, 17, 62659, {1, 1, 1, 3, 29, 35, 9, 215, 415, 143, 1837, 3723, 73, 11305, 23187, 19995, 52987}},
+{13100, 17, 62666, {1, 1, 7, 1, 25, 39, 35, 67, 245, 295, 1143, 2043, 1049, 629, 14111, 62893, 86899}},
+{13101, 17, 62680, {1, 3, 7, 5, 3, 41, 123, 97, 241, 743, 259, 3163, 2289, 6363, 24033, 10789, 44117}},
+{13102, 17, 62692, {1, 3, 1, 7, 25, 33, 33, 17, 359, 567, 901, 3595, 179, 8671, 841, 24787, 4367}},
+{13103, 17, 62701, {1, 3, 1, 13, 5, 13, 57, 185, 321, 727, 789, 3081, 5345, 9721, 32029, 11663, 55695}},
+{13104, 17, 62702, {1, 1, 7, 7, 5, 51, 85, 255, 329, 263, 297, 1687, 6799, 10973, 8265, 19615, 115333}},
+{13105, 17, 62714, {1, 1, 1, 5, 29, 27, 55, 167, 465, 73, 661, 137, 7831, 2571, 15373, 64223, 27335}},
+{13106, 17, 62716, {1, 3, 7, 13, 5, 23, 77, 15, 345, 21, 1729, 3231, 967, 12573, 31415, 24249, 110525}},
+{13107, 17, 62733, {1, 1, 7, 9, 31, 37, 41, 119, 169, 891, 1845, 2139, 1747, 1147, 21983, 11617, 25963}},
+{13108, 17, 62762, {1, 3, 3, 7, 23, 5, 1, 11, 95, 795, 1371, 2631, 3241, 6935, 17353, 25013, 89765}},
+{13109, 17, 62769, {1, 3, 1, 7, 19, 3, 121, 19, 389, 117, 1905, 3135, 7601, 12541, 20855, 38613, 15005}},
+{13110, 17, 62770, {1, 3, 3, 5, 17, 43, 91, 99, 113, 545, 1955, 37, 3411, 15173, 24961, 28761, 15245}},
+{13111, 17, 62787, {1, 3, 3, 13, 25, 9, 83, 17, 17, 271, 1133, 3851, 4607, 11017, 14867, 20677, 42881}},
+{13112, 17, 62794, {1, 1, 5, 15, 5, 9, 99, 179, 263, 623, 441, 2577, 189, 11595, 21505, 27215, 54081}},
+{13113, 17, 62801, {1, 1, 7, 1, 1, 63, 123, 119, 245, 467, 169, 3075, 909, 3581, 14571, 33071, 6261}},
+{13114, 17, 62807, {1, 1, 1, 13, 9, 35, 47, 161, 47, 893, 57, 703, 3373, 4167, 26555, 51265, 1391}},
+{13115, 17, 62808, {1, 3, 1, 13, 9, 61, 9, 5, 47, 259, 579, 113, 355, 14539, 25757, 10119, 96869}},
+{13116, 17, 62813, {1, 1, 5, 11, 3, 5, 61, 231, 291, 21, 1711, 2981, 4727, 14287, 12149, 40275, 51809}},
+{13117, 17, 62817, {1, 3, 5, 3, 21, 5, 87, 251, 373, 679, 949, 1023, 5183, 14549, 4135, 54927, 20369}},
+{13118, 17, 62818, {1, 3, 3, 11, 7, 43, 127, 97, 469, 81, 1843, 3955, 125, 8607, 27185, 50761, 122753}},
+{13119, 17, 62832, {1, 3, 5, 5, 25, 61, 1, 55, 333, 949, 1005, 1051, 6291, 8343, 9627, 37739, 116911}},
+{13120, 17, 62841, {1, 3, 3, 13, 21, 9, 67, 225, 179, 837, 2009, 3171, 217, 5629, 23451, 63171, 53225}},
+{13121, 17, 62857, {1, 3, 7, 1, 23, 15, 91, 163, 351, 883, 579, 3923, 2641, 12735, 24955, 1131, 65119}},
+{13122, 17, 62860, {1, 1, 1, 11, 29, 5, 113, 217, 171, 535, 913, 2419, 3843, 12365, 8287, 27367, 57369}},
+{13123, 17, 62871, {1, 1, 5, 11, 9, 41, 57, 243, 123, 159, 1517, 2653, 4307, 4243, 2801, 43131, 18435}},
+{13124, 17, 62882, {1, 1, 7, 9, 23, 59, 83, 159, 57, 723, 1635, 7, 1463, 121, 541, 7657, 83917}},
+{13125, 17, 62888, {1, 3, 7, 7, 23, 27, 125, 103, 247, 1019, 1063, 3979, 8085, 6449, 12443, 63427, 106235}},
+{13126, 17, 62913, {1, 1, 7, 5, 9, 31, 23, 83, 503, 605, 1731, 3341, 7427, 14571, 5981, 39043, 42965}},
+{13127, 17, 62919, {1, 3, 5, 1, 17, 49, 109, 171, 301, 951, 1879, 1317, 457, 8085, 6803, 62521, 67871}},
+{13128, 17, 62920, {1, 1, 7, 11, 11, 27, 1, 71, 335, 137, 265, 1267, 6399, 14823, 925, 49895, 19731}},
+{13129, 17, 62925, {1, 3, 1, 13, 3, 35, 75, 253, 211, 483, 1495, 3695, 3033, 14643, 1861, 51269, 32655}},
+{13130, 17, 62933, {1, 3, 7, 1, 5, 17, 63, 1, 83, 435, 2007, 2023, 57, 8639, 27067, 4039, 1955}},
+{13131, 17, 62938, {1, 3, 5, 15, 27, 51, 59, 47, 77, 131, 507, 559, 645, 16067, 20989, 15565, 39925}},
+{13132, 17, 62940, {1, 3, 3, 5, 11, 15, 63, 121, 39, 1019, 1027, 2821, 3297, 13769, 18587, 14199, 82251}},
+{13133, 17, 62949, {1, 1, 5, 1, 31, 11, 89, 75, 147, 1007, 917, 3519, 5097, 5695, 15185, 14819, 38597}},
+{13134, 17, 62956, {1, 3, 3, 3, 15, 7, 127, 55, 83, 887, 1901, 75, 639, 713, 13631, 27447, 106707}},
+{13135, 17, 62971, {1, 3, 3, 15, 27, 25, 85, 163, 187, 959, 815, 1403, 6129, 6515, 31597, 28307, 30077}},
+{13136, 17, 62978, {1, 3, 1, 13, 5, 19, 117, 89, 11, 489, 845, 2899, 3695, 3279, 22355, 38759, 85849}},
+{13137, 17, 62990, {1, 3, 1, 7, 25, 59, 109, 185, 87, 591, 825, 1119, 7439, 5451, 17959, 51299, 76693}},
+{13138, 17, 62995, {1, 1, 7, 5, 25, 29, 115, 249, 185, 529, 593, 103, 1739, 4769, 25925, 3317, 102445}},
+{13139, 17, 62997, {1, 1, 3, 1, 3, 35, 19, 255, 279, 295, 1075, 2817, 3513, 7501, 15885, 21653, 113447}},
+{13140, 17, 63004, {1, 3, 1, 5, 27, 1, 21, 137, 303, 981, 631, 2339, 397, 13075, 28815, 50925, 44379}},
+{13141, 17, 63011, {1, 1, 7, 7, 31, 31, 59, 129, 105, 181, 1041, 2685, 1061, 1721, 30365, 6873, 30011}},
+{13142, 17, 63032, {1, 1, 3, 1, 19, 31, 125, 39, 9, 631, 1239, 1061, 6313, 9639, 5991, 27293, 84635}},
+{13143, 17, 63038, {1, 3, 3, 11, 17, 59, 17, 241, 195, 175, 1845, 251, 3323, 13399, 20493, 15241, 69303}},
+{13144, 17, 63067, {1, 1, 5, 3, 9, 19, 59, 25, 49, 359, 263, 4045, 1527, 6703, 555, 26413, 42757}},
+{13145, 17, 63069, {1, 1, 5, 9, 23, 5, 7, 223, 247, 407, 1079, 1069, 3417, 14795, 5015, 2965, 99059}},
+{13146, 17, 63076, {1, 3, 7, 5, 27, 47, 9, 37, 47, 181, 819, 2049, 2643, 9231, 8173, 33495, 91321}},
+{13147, 17, 63083, {1, 3, 5, 11, 5, 27, 5, 237, 349, 653, 1443, 137, 7969, 5961, 24749, 37523, 88921}},
+{13148, 17, 63088, {1, 3, 7, 13, 11, 51, 49, 71, 339, 195, 1239, 3479, 2771, 15217, 23729, 7839, 32633}},
+{13149, 17, 63094, {1, 1, 5, 5, 5, 13, 103, 185, 13, 273, 1793, 761, 5327, 8659, 32599, 38181, 121115}},
+{13150, 17, 63097, {1, 3, 7, 15, 17, 55, 69, 151, 231, 421, 1679, 3657, 8001, 12599, 13761, 13517, 130199}},
+{13151, 17, 63100, {1, 1, 5, 3, 5, 15, 15, 61, 489, 219, 925, 2329, 3415, 10779, 31297, 63805, 13375}},
+{13152, 17, 63104, {1, 1, 7, 9, 7, 11, 87, 45, 39, 885, 87, 1877, 8135, 1247, 25685, 23631, 65579}},
+{13153, 17, 63114, {1, 3, 3, 7, 1, 17, 31, 75, 455, 535, 509, 2151, 1737, 7579, 12727, 25139, 32659}},
+{13154, 17, 63116, {1, 3, 5, 7, 15, 27, 111, 145, 99, 767, 167, 3391, 2155, 7895, 3405, 47451, 65185}},
+{13155, 17, 63122, {1, 1, 1, 3, 23, 31, 15, 53, 59, 787, 431, 2691, 71, 2843, 13469, 54029, 2233}},
+{13156, 17, 63128, {1, 1, 5, 1, 5, 39, 57, 31, 75, 507, 811, 2747, 317, 13545, 7395, 65161, 87987}},
+{13157, 17, 63149, {1, 3, 5, 5, 13, 17, 11, 89, 371, 337, 913, 2775, 27, 4923, 24013, 62955, 65185}},
+{13158, 17, 63150, {1, 3, 3, 7, 9, 27, 91, 187, 17, 443, 807, 853, 6243, 12351, 8123, 4203, 61021}},
+{13159, 17, 63157, {1, 1, 1, 5, 9, 33, 101, 211, 205, 701, 1289, 1253, 653, 8591, 13009, 48525, 77051}},
+{13160, 17, 63167, {1, 3, 5, 11, 5, 19, 1, 67, 259, 355, 15, 2169, 6785, 2019, 8675, 1019, 85903}},
+{13161, 17, 63187, {1, 3, 7, 5, 27, 31, 103, 163, 369, 685, 659, 2009, 5819, 10437, 17311, 35083, 122125}},
+{13162, 17, 63200, {1, 3, 5, 7, 19, 13, 93, 113, 377, 359, 1697, 4063, 4379, 9321, 7335, 25491, 85939}},
+{13163, 17, 63220, {1, 3, 3, 5, 7, 25, 41, 225, 355, 257, 743, 2067, 7627, 14317, 7385, 25187, 63103}},
+{13164, 17, 63223, {1, 1, 7, 7, 17, 43, 75, 1, 95, 547, 1937, 2263, 1709, 5067, 22651, 55733, 44619}},
+{13165, 17, 63229, {1, 1, 7, 3, 5, 27, 45, 23, 107, 547, 1733, 1169, 6709, 861, 4439, 55381, 96447}},
+{13166, 17, 63235, {1, 1, 7, 11, 25, 23, 127, 159, 489, 945, 843, 3715, 5215, 2131, 9681, 35515, 108109}},
+{13167, 17, 63247, {1, 1, 3, 7, 5, 1, 67, 59, 83, 745, 1337, 855, 6087, 14319, 13405, 36261, 49091}},
+{13168, 17, 63252, {1, 3, 1, 1, 13, 27, 41, 155, 463, 709, 1111, 2017, 4701, 8663, 29703, 45311, 113347}},
+{13169, 17, 63255, {1, 1, 7, 5, 1, 11, 83, 101, 283, 505, 893, 705, 2331, 5127, 21793, 28095, 59055}},
+{13170, 17, 63289, {1, 1, 5, 9, 25, 7, 97, 155, 71, 569, 1481, 897, 6177, 13367, 12163, 18171, 24785}},
+{13171, 17, 63298, {1, 3, 5, 11, 19, 25, 7, 15, 511, 369, 957, 1247, 6097, 11181, 17265, 24777, 87377}},
+{13172, 17, 63303, {1, 3, 1, 7, 11, 9, 39, 191, 9, 793, 867, 2779, 3447, 3805, 21025, 64719, 15669}},
+{13173, 17, 63327, {1, 1, 3, 1, 31, 43, 107, 103, 175, 131, 1525, 993, 635, 14383, 26835, 15929, 109977}},
+{13174, 17, 63328, {1, 1, 1, 3, 19, 17, 99, 249, 47, 467, 853, 2805, 3155, 1565, 17291, 18865, 11039}},
+{13175, 17, 63348, {1, 1, 5, 13, 25, 61, 91, 67, 361, 947, 1909, 3403, 945, 3481, 16703, 50227, 43963}},
+{13176, 17, 63355, {1, 3, 1, 3, 19, 27, 31, 219, 185, 579, 1539, 315, 4421, 9473, 30289, 48477, 61365}},
+{13177, 17, 63357, {1, 1, 3, 1, 23, 11, 101, 1, 133, 305, 1107, 1145, 1733, 13275, 221, 5071, 81987}},
+{13178, 17, 63368, {1, 1, 1, 13, 7, 61, 47, 5, 137, 979, 1183, 2049, 5263, 6515, 5585, 6093, 119689}},
+{13179, 17, 63391, {1, 3, 1, 5, 19, 47, 83, 115, 215, 901, 1685, 755, 2327, 13297, 6847, 40329, 19225}},
+{13180, 17, 63402, {1, 1, 3, 3, 3, 13, 31, 127, 199, 655, 55, 2183, 5031, 945, 6073, 54729, 108281}},
+{13181, 17, 63409, {1, 1, 1, 1, 11, 51, 37, 19, 73, 205, 1377, 1881, 3679, 4487, 14693, 41735, 27349}},
+{13182, 17, 63416, {1, 3, 7, 13, 1, 35, 37, 73, 45, 973, 209, 529, 5283, 9765, 26367, 12697, 8685}},
+{13183, 17, 63419, {1, 3, 3, 9, 3, 45, 115, 35, 475, 663, 487, 3613, 4151, 15623, 3057, 31519, 87545}},
+{13184, 17, 63430, {1, 3, 7, 5, 23, 13, 25, 255, 355, 433, 1671, 667, 7463, 14189, 14107, 1531, 11695}},
+{13185, 17, 63442, {1, 1, 7, 3, 15, 25, 37, 127, 265, 493, 1763, 2721, 4335, 13753, 5947, 18375, 29911}},
+{13186, 17, 63457, {1, 1, 3, 15, 1, 55, 25, 69, 335, 157, 1923, 1757, 5689, 6731, 723, 6471, 57415}},
+{13187, 17, 63458, {1, 3, 3, 3, 1, 15, 127, 227, 401, 395, 503, 3783, 1737, 8785, 16287, 34949, 91683}},
+{13188, 17, 63482, {1, 3, 5, 15, 23, 29, 55, 119, 115, 855, 657, 3729, 5309, 14773, 5647, 25953, 67303}},
+{13189, 17, 63487, {1, 3, 5, 13, 23, 25, 1, 187, 67, 389, 359, 619, 2523, 11203, 11049, 60345, 53931}},
+{13190, 17, 63488, {1, 3, 1, 7, 7, 45, 99, 123, 495, 797, 939, 3387, 7563, 16289, 8309, 14917, 99867}},
+{13191, 17, 63500, {1, 3, 5, 11, 29, 49, 89, 205, 447, 541, 1279, 1153, 7277, 5393, 8743, 41057, 100119}},
+{13192, 17, 63511, {1, 1, 1, 9, 1, 7, 43, 165, 259, 311, 993, 1381, 3363, 577, 4023, 443, 101785}},
+{13193, 17, 63517, {1, 1, 7, 9, 25, 55, 93, 63, 423, 787, 549, 1039, 383, 15855, 6013, 51399, 60007}},
+{13194, 17, 63528, {1, 3, 3, 1, 5, 17, 103, 91, 309, 85, 1319, 3869, 559, 3993, 18111, 17753, 66681}},
+{13195, 17, 63531, {1, 3, 7, 9, 1, 11, 87, 151, 311, 597, 811, 3955, 275, 6555, 17005, 26763, 31227}},
+{13196, 17, 63559, {1, 1, 3, 11, 19, 51, 41, 101, 183, 1003, 1635, 2061, 3305, 12925, 7223, 4859, 24433}},
+{13197, 17, 63566, {1, 3, 7, 11, 7, 43, 79, 53, 43, 429, 947, 2533, 7005, 15147, 13435, 33997, 21201}},
+{13198, 17, 63578, {1, 1, 3, 5, 15, 17, 61, 41, 383, 465, 1439, 3503, 3981, 14469, 5075, 25953, 70461}},
+{13199, 17, 63580, {1, 1, 1, 13, 21, 53, 25, 59, 59, 195, 665, 3367, 2777, 9179, 24207, 56729, 94241}},
+{13200, 17, 63584, {1, 3, 7, 15, 27, 13, 41, 147, 415, 351, 961, 3811, 1605, 14231, 31789, 41189, 50265}},
+{13201, 17, 63587, {1, 3, 3, 7, 31, 39, 85, 219, 323, 657, 423, 1579, 3623, 7663, 14631, 47169, 88795}},
+{13202, 17, 63594, {1, 3, 1, 3, 1, 3, 125, 65, 259, 3, 1897, 2203, 347, 4101, 23841, 20217, 117407}},
+{13203, 17, 63607, {1, 1, 3, 7, 29, 1, 75, 255, 413, 237, 1531, 2103, 6847, 10395, 9817, 9383, 60679}},
+{13204, 17, 63611, {1, 3, 5, 3, 7, 63, 17, 83, 375, 835, 1707, 3227, 327, 2205, 25025, 47471, 39967}},
+{13205, 17, 63630, {1, 3, 7, 7, 9, 51, 23, 189, 157, 351, 755, 2695, 3923, 3481, 12159, 1041, 94563}},
+{13206, 17, 63632, {1, 1, 3, 11, 25, 27, 39, 19, 221, 795, 523, 695, 3257, 8045, 2643, 43239, 13291}},
+{13207, 17, 63641, {1, 3, 3, 5, 29, 1, 33, 117, 477, 147, 1117, 1943, 7967, 15999, 10673, 13349, 89471}},
+{13208, 17, 63647, {1, 1, 3, 9, 17, 51, 55, 115, 147, 687, 1751, 3685, 3099, 15369, 371, 55673, 67951}},
+{13209, 17, 63651, {1, 1, 7, 1, 5, 25, 67, 31, 103, 439, 1581, 705, 3855, 15985, 7151, 56511, 23697}},
+{13210, 17, 63666, {1, 3, 5, 3, 21, 7, 11, 123, 121, 1009, 277, 623, 7913, 7525, 4759, 19245, 16735}},
+{13211, 17, 63668, {1, 1, 5, 11, 7, 57, 103, 147, 199, 209, 233, 3665, 4215, 13511, 16393, 37873, 120857}},
+{13212, 17, 63695, {1, 1, 7, 9, 27, 45, 29, 97, 279, 379, 1683, 1965, 1183, 11389, 20445, 38435, 56893}},
+{13213, 17, 63697, {1, 3, 5, 5, 27, 23, 89, 169, 329, 659, 393, 903, 6217, 6459, 27327, 2843, 44889}},
+{13214, 17, 63709, {1, 1, 1, 15, 3, 53, 109, 83, 195, 5, 1865, 729, 3627, 13307, 20761, 50375, 60379}},
+{13215, 17, 63723, {1, 1, 1, 13, 25, 57, 17, 185, 359, 797, 469, 2637, 973, 2731, 25299, 15169, 90187}},
+{13216, 17, 63737, {1, 3, 5, 1, 19, 39, 87, 161, 117, 565, 1737, 3995, 6487, 5067, 18531, 38803, 45453}},
+{13217, 17, 63746, {1, 1, 1, 5, 19, 3, 93, 85, 479, 369, 469, 1407, 475, 7775, 12273, 34417, 65611}},
+{13218, 17, 63752, {1, 1, 3, 15, 31, 11, 105, 19, 281, 711, 713, 3423, 797, 11215, 31409, 44891, 110413}},
+{13219, 17, 63755, {1, 1, 3, 11, 13, 17, 59, 111, 59, 431, 1517, 2159, 1697, 12309, 16293, 2097, 107273}},
+{13220, 17, 63775, {1, 3, 5, 15, 25, 19, 97, 107, 97, 563, 247, 3691, 2775, 10631, 15113, 25721, 12995}},
+{13221, 17, 63781, {1, 1, 5, 3, 31, 25, 47, 201, 231, 123, 1923, 2287, 1711, 12271, 1573, 6605, 72991}},
+{13222, 17, 63794, {1, 1, 5, 5, 27, 17, 109, 125, 423, 1, 819, 3041, 685, 8791, 19697, 13107, 67681}},
+{13223, 17, 63796, {1, 1, 5, 3, 5, 63, 115, 95, 117, 715, 1523, 1231, 8171, 1615, 9819, 14361, 87075}},
+{13224, 17, 63808, {1, 1, 7, 7, 7, 35, 35, 175, 349, 853, 1665, 3101, 6051, 10737, 933, 40591, 9419}},
+{13225, 17, 63817, {1, 1, 1, 3, 23, 49, 65, 23, 103, 837, 403, 3799, 6515, 15363, 28079, 36381, 59523}},
+{13226, 17, 63820, {1, 3, 1, 15, 15, 25, 119, 181, 229, 685, 1047, 2397, 4855, 15393, 2371, 42441, 30151}},
+{13227, 17, 63826, {1, 3, 7, 11, 15, 5, 13, 93, 219, 203, 475, 523, 5827, 6579, 26759, 29795, 108463}},
+{13228, 17, 63838, {1, 1, 7, 13, 25, 53, 75, 195, 443, 1003, 501, 2543, 5453, 3119, 19225, 59631, 16413}},
+{13229, 17, 63848, {1, 1, 7, 13, 13, 25, 93, 211, 191, 1005, 1567, 3057, 3001, 1125, 6237, 35725, 108257}},
+{13230, 17, 63861, {1, 1, 3, 7, 21, 11, 57, 205, 487, 263, 1801, 3235, 1819, 10875, 6063, 26211, 54699}},
+{13231, 17, 63862, {1, 3, 3, 7, 11, 59, 89, 217, 15, 991, 1343, 1247, 277, 13377, 18499, 64987, 26053}},
+{13232, 17, 63866, {1, 3, 3, 1, 15, 51, 111, 69, 137, 817, 1207, 1729, 3877, 9873, 18449, 50749, 57457}},
+{13233, 17, 63878, {1, 3, 3, 5, 3, 39, 97, 147, 327, 257, 1547, 769, 7077, 5221, 13679, 44237, 70053}},
+{13234, 17, 63889, {1, 1, 5, 11, 19, 15, 79, 187, 335, 645, 1235, 4041, 4831, 10847, 28135, 48353, 64921}},
+{13235, 17, 63892, {1, 1, 7, 9, 3, 43, 41, 149, 71, 205, 1513, 2801, 6785, 3187, 25401, 55367, 114491}},
+{13236, 17, 63901, {1, 1, 7, 1, 25, 11, 37, 205, 365, 435, 147, 1303, 587, 14563, 32461, 28983, 86157}},
+{13237, 17, 63915, {1, 1, 7, 1, 31, 11, 51, 37, 401, 343, 1677, 991, 501, 11993, 14781, 37055, 30161}},
+{13238, 17, 63917, {1, 3, 5, 9, 9, 21, 95, 45, 447, 957, 943, 3997, 4033, 8371, 25007, 52827, 50207}},
+{13239, 17, 63926, {1, 1, 7, 1, 9, 45, 3, 255, 297, 341, 215, 3631, 7049, 7625, 4145, 50109, 48615}},
+{13240, 17, 63932, {1, 3, 3, 9, 27, 49, 41, 143, 291, 343, 719, 311, 3819, 7699, 17631, 64785, 49239}},
+{13241, 17, 63937, {1, 1, 7, 3, 27, 35, 61, 183, 153, 781, 979, 1465, 3315, 14893, 29847, 18461, 74949}},
+{13242, 17, 63938, {1, 3, 5, 15, 19, 61, 39, 219, 279, 909, 1295, 1681, 8021, 957, 7675, 14001, 77669}},
+{13243, 17, 63943, {1, 3, 1, 5, 15, 59, 127, 85, 229, 649, 503, 3267, 2465, 5637, 2729, 24831, 44791}},
+{13244, 17, 63944, {1, 3, 7, 11, 23, 55, 61, 191, 345, 255, 105, 1361, 3913, 7655, 8865, 1825, 80619}},
+{13245, 17, 63950, {1, 3, 3, 13, 29, 15, 53, 19, 1, 651, 917, 2043, 2333, 13695, 28225, 16457, 11287}},
+{13246, 17, 63952, {1, 1, 3, 13, 15, 53, 41, 211, 13, 287, 383, 3923, 665, 10343, 4803, 22199, 90521}},
+{13247, 17, 63955, {1, 3, 7, 11, 23, 27, 127, 241, 11, 451, 495, 2779, 319, 13119, 5575, 43043, 11659}},
+{13248, 17, 63957, {1, 1, 1, 7, 17, 53, 55, 39, 233, 273, 1873, 843, 7885, 329, 6809, 33119, 116017}},
+{13249, 17, 63961, {1, 1, 1, 7, 21, 41, 23, 113, 283, 265, 1535, 2371, 3975, 6293, 22497, 65349, 48653}},
+{13250, 17, 63962, {1, 3, 7, 9, 25, 21, 61, 135, 245, 777, 679, 2603, 565, 3251, 32469, 12707, 40297}},
+{13251, 17, 63978, {1, 1, 1, 5, 31, 49, 35, 215, 445, 669, 779, 2231, 5399, 5853, 17941, 33973, 126141}},
+{13252, 17, 63983, {1, 3, 5, 5, 3, 31, 45, 235, 51, 65, 295, 3755, 8101, 821, 28331, 38837, 55235}},
+{13253, 17, 63988, {1, 1, 5, 15, 23, 15, 37, 197, 59, 455, 1875, 1745, 7565, 8039, 15901, 63129, 36095}},
+{13254, 17, 64008, {1, 1, 5, 11, 7, 1, 77, 235, 309, 245, 1539, 1421, 3401, 1477, 12655, 19851, 86147}},
+{13255, 17, 64013, {1, 1, 3, 9, 27, 9, 113, 127, 167, 213, 161, 4065, 1275, 10699, 26111, 26213, 129091}},
+{13256, 17, 64019, {1, 3, 5, 9, 9, 17, 109, 205, 23, 145, 1261, 51, 5855, 7411, 20551, 5801, 47841}},
+{13257, 17, 64026, {1, 1, 3, 3, 15, 1, 1, 39, 431, 601, 177, 525, 6951, 6271, 27031, 37157, 73979}},
+{13258, 17, 64028, {1, 3, 1, 3, 19, 61, 11, 131, 31, 223, 959, 3531, 2433, 15675, 29201, 49277, 43977}},
+{13259, 17, 64032, {1, 1, 5, 9, 5, 27, 57, 3, 503, 755, 1261, 3659, 6685, 10041, 24739, 12201, 19753}},
+{13260, 17, 64042, {1, 1, 7, 3, 31, 27, 7, 191, 7, 415, 1665, 1413, 7493, 2645, 23577, 46331, 9481}},
+{13261, 17, 64044, {1, 1, 5, 1, 29, 59, 99, 231, 33, 613, 1347, 2671, 1767, 15685, 26583, 44699, 73511}},
+{13262, 17, 64055, {1, 1, 3, 3, 9, 47, 93, 87, 45, 549, 219, 2141, 233, 10239, 30325, 14985, 70325}},
+{13263, 17, 64070, {1, 1, 3, 3, 21, 39, 81, 179, 319, 853, 93, 2869, 59, 6675, 22391, 16089, 33949}},
+{13264, 17, 64079, {1, 1, 3, 7, 31, 19, 73, 249, 175, 57, 1717, 3557, 2307, 4595, 22045, 33291, 123003}},
+{13265, 17, 64084, {1, 1, 1, 3, 7, 23, 81, 229, 387, 1001, 1371, 17, 667, 3043, 30507, 44613, 32239}},
+{13266, 17, 64087, {1, 1, 7, 15, 15, 59, 83, 99, 101, 863, 333, 845, 7547, 13345, 7599, 51, 10963}},
+{13267, 17, 64093, {1, 1, 1, 3, 15, 55, 73, 37, 429, 711, 1315, 2911, 5109, 953, 14721, 25551, 33527}},
+{13268, 17, 64100, {1, 1, 5, 9, 11, 57, 75, 107, 449, 293, 1267, 2633, 5291, 9939, 12365, 1975, 75705}},
+{13269, 17, 64104, {1, 3, 3, 7, 19, 51, 111, 233, 369, 873, 1419, 425, 6587, 11371, 29613, 28041, 77405}},
+{13270, 17, 64109, {1, 3, 1, 15, 11, 1, 65, 185, 301, 25, 75, 1353, 6879, 11519, 24093, 65223, 130659}},
+{13271, 17, 64140, {1, 1, 3, 3, 17, 17, 33, 177, 467, 841, 949, 1119, 7869, 5835, 22175, 20439, 98923}},
+{13272, 17, 64148, {1, 3, 1, 9, 1, 19, 1, 9, 487, 425, 1095, 1995, 693, 12661, 27717, 56167, 34829}},
+{13273, 17, 64151, {1, 1, 7, 7, 27, 57, 85, 159, 109, 801, 477, 3953, 3195, 11079, 26885, 59833, 4971}},
+{13274, 17, 64152, {1, 1, 1, 15, 25, 9, 89, 231, 499, 623, 1385, 3753, 4781, 15263, 12721, 17511, 67327}},
+{13275, 17, 64171, {1, 1, 3, 7, 9, 11, 103, 65, 319, 681, 1423, 2355, 6243, 399, 8483, 23697, 107995}},
+{13276, 17, 64179, {1, 1, 1, 1, 5, 7, 63, 117, 151, 905, 163, 3813, 6931, 13161, 15131, 63067, 15649}},
+{13277, 17, 64186, {1, 3, 3, 3, 13, 57, 69, 199, 283, 153, 617, 123, 3125, 3057, 8121, 14483, 28085}},
+{13278, 17, 64203, {1, 3, 7, 15, 25, 45, 25, 179, 91, 457, 681, 537, 243, 4369, 11395, 17565, 47875}},
+{13279, 17, 64206, {1, 3, 1, 13, 29, 51, 101, 23, 143, 715, 1725, 791, 6001, 4283, 10689, 49237, 5231}},
+{13280, 17, 64213, {1, 3, 3, 5, 27, 41, 39, 17, 501, 587, 1067, 1859, 9, 13449, 31257, 17675, 99769}},
+{13281, 17, 64214, {1, 1, 1, 3, 15, 57, 119, 195, 15, 779, 761, 733, 3505, 4815, 23167, 411, 52303}},
+{13282, 17, 64220, {1, 3, 1, 13, 9, 31, 5, 141, 19, 487, 739, 577, 4383, 1951, 24293, 45503, 111923}},
+{13283, 17, 64233, {1, 3, 1, 11, 25, 37, 107, 245, 89, 107, 1969, 1569, 7475, 11795, 6123, 45311, 52251}},
+{13284, 17, 64239, {1, 1, 7, 11, 15, 9, 67, 141, 199, 91, 819, 3721, 6251, 6107, 9393, 14941, 98545}},
+{13285, 17, 64248, {1, 3, 3, 11, 23, 9, 31, 211, 339, 665, 1507, 2255, 3589, 11495, 28393, 2017, 106735}},
+{13286, 17, 64251, {1, 3, 5, 11, 27, 13, 105, 217, 173, 337, 1573, 837, 3771, 8645, 28749, 27501, 45045}},
+{13287, 17, 64259, {1, 1, 5, 1, 11, 43, 99, 217, 131, 545, 1323, 3089, 5689, 785, 9043, 29961, 17855}},
+{13288, 17, 64268, {1, 1, 3, 9, 31, 41, 61, 239, 271, 123, 1583, 397, 4243, 12197, 9847, 12341, 130533}},
+{13289, 17, 64273, {1, 3, 5, 3, 27, 11, 33, 31, 77, 403, 823, 2791, 3475, 4201, 15967, 39149, 107137}},
+{13290, 17, 64279, {1, 3, 1, 11, 9, 5, 103, 145, 85, 341, 1615, 729, 7209, 10289, 20807, 54167, 15613}},
+{13291, 17, 64283, {1, 3, 7, 1, 29, 33, 91, 219, 171, 367, 907, 3645, 1059, 9031, 247, 13231, 14323}},
+{13292, 17, 64292, {1, 1, 1, 7, 19, 15, 65, 61, 221, 941, 1005, 1447, 3513, 8917, 17399, 52471, 64245}},
+{13293, 17, 64296, {1, 1, 5, 7, 5, 35, 15, 253, 325, 313, 2015, 3239, 1633, 9745, 11617, 10575, 35877}},
+{13294, 17, 64301, {1, 3, 5, 3, 13, 1, 115, 207, 227, 637, 1119, 781, 2897, 1573, 16499, 43167, 20631}},
+{13295, 17, 64302, {1, 3, 5, 9, 17, 47, 117, 7, 303, 719, 975, 1167, 2463, 5255, 28237, 33495, 57133}},
+{13296, 17, 64324, {1, 3, 5, 11, 5, 43, 123, 63, 19, 97, 1423, 695, 5985, 5923, 5755, 22721, 5411}},
+{13297, 17, 64331, {1, 3, 1, 9, 9, 25, 87, 197, 325, 827, 1679, 1561, 101, 3951, 17453, 33537, 121431}},
+{13298, 17, 64346, {1, 1, 7, 5, 13, 33, 3, 191, 171, 37, 619, 1917, 7525, 14103, 25807, 25455, 57455}},
+{13299, 17, 64364, {1, 3, 3, 1, 9, 35, 93, 159, 455, 115, 479, 665, 477, 4483, 29751, 45047, 41251}},
+{13300, 17, 64382, {1, 3, 1, 3, 11, 47, 41, 199, 511, 475, 151, 1163, 239, 6731, 4461, 39845, 99555}},
+{13301, 17, 64386, {1, 1, 5, 7, 9, 5, 49, 221, 503, 637, 1323, 3303, 4137, 6675, 17709, 49233, 38325}},
+{13302, 17, 64400, {1, 1, 5, 15, 1, 43, 55, 67, 291, 393, 237, 3555, 4171, 909, 8655, 46309, 61799}},
+{13303, 17, 64409, {1, 3, 5, 3, 3, 37, 125, 249, 509, 611, 983, 4093, 1633, 10063, 10811, 60033, 40999}},
+{13304, 17, 64419, {1, 3, 5, 11, 1, 37, 75, 255, 279, 545, 1999, 833, 2789, 14601, 16707, 64703, 53545}},
+{13305, 17, 64433, {1, 1, 5, 7, 3, 15, 59, 11, 17, 711, 721, 765, 3747, 13549, 28641, 47437, 42261}},
+{13306, 17, 64454, {1, 3, 7, 1, 3, 45, 65, 45, 279, 929, 933, 2215, 7095, 14593, 6047, 40747, 109789}},
+{13307, 17, 64458, {1, 3, 7, 15, 15, 55, 89, 155, 345, 515, 1005, 2921, 1761, 1095, 28463, 20971, 62451}},
+{13308, 17, 64482, {1, 3, 3, 1, 1, 41, 35, 149, 481, 171, 305, 1411, 237, 4515, 32375, 22645, 741}},
+{13309, 17, 64494, {1, 1, 1, 15, 17, 1, 123, 235, 221, 495, 1693, 3109, 6453, 8827, 23775, 9303, 30237}},
+{13310, 17, 64496, {1, 3, 3, 5, 7, 63, 37, 13, 457, 159, 1683, 2207, 1731, 3341, 7415, 21073, 119417}},
+{13311, 17, 64505, {1, 1, 7, 15, 21, 27, 5, 67, 267, 919, 203, 1129, 4029, 3407, 16767, 35485, 66903}},
+{13312, 17, 64514, {1, 1, 1, 5, 15, 29, 99, 5, 219, 677, 443, 3799, 2461, 747, 20885, 32661, 44079}},
+{13313, 17, 64519, {1, 1, 1, 1, 3, 55, 53, 151, 195, 587, 1155, 2439, 3817, 8735, 30849, 54107, 14113}},
+{13314, 17, 64525, {1, 1, 1, 9, 29, 15, 89, 175, 373, 925, 301, 3749, 5439, 2653, 22819, 41201, 77043}},
+{13315, 17, 64528, {1, 1, 1, 1, 25, 49, 29, 129, 331, 539, 1247, 773, 7891, 5905, 19571, 17919, 6815}},
+{13316, 17, 64534, {1, 1, 3, 15, 5, 63, 123, 133, 141, 383, 1893, 573, 629, 3939, 9455, 50433, 111415}},
+{13317, 17, 64561, {1, 1, 7, 9, 15, 33, 119, 159, 17, 511, 1841, 427, 3911, 8609, 4215, 9799, 84397}},
+{13318, 17, 64571, {1, 1, 7, 3, 9, 25, 63, 247, 235, 635, 915, 3423, 5421, 7021, 9203, 18121, 3683}},
+{13319, 17, 64579, {1, 3, 1, 1, 25, 11, 105, 1, 491, 137, 1923, 103, 3371, 3543, 5173, 36777, 23417}},
+{13320, 17, 64591, {1, 3, 3, 13, 19, 37, 93, 191, 101, 193, 351, 839, 7147, 5477, 29225, 45307, 1455}},
+{13321, 17, 64606, {1, 3, 1, 5, 11, 17, 95, 239, 105, 407, 395, 919, 3317, 14825, 23447, 4897, 128363}},
+{13322, 17, 64616, {1, 1, 1, 11, 27, 47, 83, 137, 163, 673, 1291, 3041, 4559, 7217, 23613, 19477, 93805}},
+{13323, 17, 64619, {1, 1, 1, 15, 25, 51, 37, 9, 23, 757, 1921, 2649, 5677, 11421, 10231, 1775, 124709}},
+{13324, 17, 64640, {1, 3, 1, 13, 31, 37, 37, 163, 59, 975, 1203, 1425, 1255, 3259, 16681, 38101, 118165}},
+{13325, 17, 64645, {1, 1, 3, 11, 17, 17, 31, 23, 169, 305, 3, 1631, 6853, 7019, 14539, 57663, 70377}},
+{13326, 17, 64649, {1, 1, 7, 3, 15, 61, 113, 31, 497, 935, 473, 819, 1223, 13907, 5075, 45177, 20255}},
+{13327, 17, 64652, {1, 3, 7, 13, 9, 41, 123, 121, 497, 877, 915, 3323, 4815, 4175, 25979, 38751, 107099}},
+{13328, 17, 64670, {1, 1, 3, 7, 13, 33, 31, 167, 331, 595, 517, 1237, 1947, 1905, 28155, 52431, 93065}},
+{13329, 17, 64673, {1, 3, 1, 1, 11, 51, 7, 151, 323, 211, 523, 2929, 233, 3633, 2785, 6043, 100101}},
+{13330, 17, 64674, {1, 1, 7, 13, 29, 3, 125, 247, 121, 567, 857, 3225, 7461, 15413, 773, 54939, 67443}},
+{13331, 17, 64683, {1, 1, 1, 15, 19, 29, 101, 179, 369, 115, 1777, 3223, 1499, 12487, 41, 50607, 111137}},
+{13332, 17, 64697, {1, 1, 3, 1, 9, 59, 21, 25, 173, 357, 1143, 1353, 3907, 10743, 30325, 39211, 116671}},
+{13333, 17, 64703, {1, 1, 7, 15, 9, 63, 67, 229, 7, 399, 2037, 3531, 6393, 4273, 9365, 52009, 118093}},
+{13334, 17, 64711, {1, 1, 7, 1, 31, 21, 5, 251, 433, 1, 481, 4041, 6179, 825, 8671, 20597, 103257}},
+{13335, 17, 64723, {1, 1, 7, 1, 15, 41, 69, 93, 47, 17, 1901, 2671, 4739, 1883, 30239, 50763, 108295}},
+{13336, 17, 64736, {1, 3, 7, 15, 29, 19, 63, 213, 475, 133, 43, 955, 2001, 555, 10479, 1333, 52807}},
+{13337, 17, 64739, {1, 3, 3, 15, 27, 13, 91, 109, 71, 333, 1971, 3355, 2175, 11457, 31101, 30217, 68263}},
+{13338, 17, 64741, {1, 1, 5, 1, 21, 33, 51, 169, 365, 475, 1015, 985, 7217, 15453, 7727, 49843, 57733}},
+{13339, 17, 64748, {1, 1, 7, 1, 11, 37, 67, 135, 429, 403, 1663, 2037, 7849, 3757, 6373, 38703, 46393}},
+{13340, 17, 64759, {1, 1, 1, 3, 15, 3, 29, 101, 327, 643, 47, 1805, 6873, 1659, 31097, 34847, 46843}},
+{13341, 17, 64768, {1, 3, 1, 15, 9, 45, 7, 189, 175, 955, 45, 3545, 3595, 7443, 2913, 54501, 63279}},
+{13342, 17, 64771, {1, 3, 7, 11, 1, 39, 59, 179, 209, 121, 445, 4077, 4851, 15161, 29133, 13543, 106247}},
+{13343, 17, 64778, {1, 3, 7, 7, 5, 53, 73, 107, 409, 639, 1731, 1921, 999, 14445, 17629, 3667, 74819}},
+{13344, 17, 64792, {1, 3, 3, 9, 23, 41, 117, 195, 497, 425, 627, 1599, 7715, 1401, 7217, 61113, 67135}},
+{13345, 17, 64821, {1, 1, 5, 13, 9, 33, 97, 115, 233, 833, 1041, 1755, 5317, 12703, 25709, 62293, 2569}},
+{13346, 17, 64831, {1, 1, 1, 11, 1, 7, 27, 151, 325, 905, 1279, 4093, 7495, 9803, 17339, 7977, 24009}},
+{13347, 17, 64839, {1, 3, 1, 11, 25, 59, 89, 175, 67, 139, 1507, 411, 7863, 9585, 14869, 46655, 126021}},
+{13348, 17, 64848, {1, 3, 3, 15, 29, 5, 111, 251, 69, 177, 519, 901, 4331, 5341, 22031, 3851, 114369}},
+{13349, 17, 64860, {1, 3, 5, 3, 19, 9, 83, 69, 411, 673, 1549, 3429, 3647, 12601, 17177, 16161, 114561}},
+{13350, 17, 64867, {1, 1, 5, 5, 21, 15, 65, 179, 405, 571, 1245, 3693, 7471, 12109, 20177, 28783, 124339}},
+{13351, 17, 64870, {1, 1, 5, 5, 9, 61, 69, 99, 9, 829, 1823, 3803, 1181, 3073, 10069, 28689, 21347}},
+{13352, 17, 64874, {1, 1, 5, 1, 3, 11, 25, 99, 241, 957, 1137, 7, 3809, 7073, 21217, 49447, 41425}},
+{13353, 17, 64879, {1, 3, 1, 9, 15, 59, 13, 29, 467, 893, 1667, 31, 3269, 12599, 28673, 17101, 81591}},
+{13354, 17, 64887, {1, 3, 7, 3, 15, 55, 79, 177, 1, 891, 217, 2725, 6171, 7779, 16173, 1003, 37093}},
+{13355, 17, 64894, {1, 3, 7, 11, 15, 61, 13, 181, 421, 83, 905, 1089, 4597, 3291, 23243, 53123, 21315}},
+{13356, 17, 64897, {1, 1, 3, 3, 21, 63, 113, 149, 203, 379, 583, 1955, 8087, 9155, 23019, 17757, 1537}},
+{13357, 17, 64898, {1, 3, 5, 9, 27, 41, 61, 207, 213, 253, 693, 273, 1835, 14135, 11519, 40819, 50999}},
+{13358, 17, 64921, {1, 3, 5, 3, 1, 51, 71, 237, 355, 327, 1903, 133, 6075, 4685, 29689, 48723, 67791}},
+{13359, 17, 64933, {1, 3, 5, 9, 21, 13, 101, 23, 95, 369, 1657, 989, 4081, 1373, 29005, 7247, 53923}},
+{13360, 17, 64940, {1, 1, 7, 13, 15, 3, 71, 189, 345, 771, 251, 937, 1041, 3017, 27279, 1635, 32581}},
+{13361, 17, 64957, {1, 1, 5, 7, 23, 63, 99, 43, 237, 189, 1549, 25, 63, 14089, 14387, 51423, 57193}},
+{13362, 17, 64969, {1, 1, 7, 15, 13, 55, 89, 87, 95, 241, 827, 501, 2341, 14357, 831, 27101, 98285}},
+{13363, 17, 64972, {1, 1, 1, 9, 29, 29, 125, 81, 73, 123, 329, 2617, 1259, 4415, 30007, 19467, 117847}},
+{13364, 17, 64978, {1, 3, 1, 11, 15, 63, 85, 121, 409, 885, 1197, 423, 2673, 12107, 1127, 14119, 90541}},
+{13365, 17, 64984, {1, 3, 1, 3, 1, 35, 117, 149, 213, 925, 923, 1013, 3547, 6877, 3467, 47893, 38645}},
+{13366, 17, 64993, {1, 1, 3, 15, 3, 21, 87, 199, 197, 851, 1711, 3449, 1771, 1727, 11651, 51903, 99835}},
+{13367, 17, 64999, {1, 3, 3, 1, 5, 27, 57, 243, 465, 173, 697, 4011, 6177, 3019, 31317, 24699, 53151}},
+{13368, 17, 65000, {1, 3, 5, 7, 7, 51, 61, 177, 489, 381, 493, 1975, 3143, 8003, 7735, 46363, 110705}},
+{13369, 17, 65006, {1, 1, 7, 5, 27, 45, 69, 33, 229, 725, 2033, 3655, 3027, 11795, 2941, 7921, 117605}},
+{13370, 17, 65011, {1, 3, 1, 7, 3, 37, 91, 255, 13, 651, 49, 309, 7425, 11641, 3661, 3929, 94199}},
+{13371, 17, 65014, {1, 3, 7, 5, 7, 47, 121, 203, 297, 941, 1585, 3659, 265, 159, 30729, 31825, 343}},
+{13372, 17, 65036, {1, 3, 5, 9, 3, 25, 95, 215, 125, 105, 37, 943, 4095, 8169, 26763, 20975, 122307}},
+{13373, 17, 65044, {1, 1, 3, 15, 9, 13, 81, 25, 51, 15, 599, 835, 6723, 9487, 25219, 60401, 48749}},
+{13374, 17, 65063, {1, 3, 3, 15, 15, 47, 41, 219, 77, 43, 1705, 2363, 7005, 7137, 17687, 665, 116097}},
+{13375, 17, 65067, {1, 3, 5, 1, 17, 33, 71, 3, 253, 355, 117, 1995, 3339, 11789, 13563, 58889, 18553}},
+{13376, 17, 65075, {1, 3, 5, 1, 21, 33, 89, 177, 9, 951, 1593, 1419, 3295, 9617, 31661, 7841, 119939}},
+{13377, 17, 65077, {1, 3, 3, 1, 31, 35, 25, 9, 379, 271, 923, 2387, 3351, 5869, 4501, 6855, 28273}},
+{13378, 17, 65082, {1, 1, 5, 9, 11, 15, 127, 79, 405, 579, 395, 2469, 5847, 7589, 17577, 61717, 6493}},
+{13379, 17, 65095, {1, 3, 7, 13, 29, 13, 99, 209, 79, 469, 5, 2231, 89, 1557, 5123, 47169, 46529}},
+{13380, 17, 65101, {1, 3, 7, 9, 13, 35, 119, 53, 7, 351, 601, 901, 5407, 13673, 6929, 38311, 2659}},
+{13381, 17, 65104, {1, 3, 7, 9, 13, 23, 61, 255, 113, 331, 367, 2979, 2741, 6971, 26447, 6861, 116267}},
+{13382, 17, 65109, {1, 1, 3, 3, 25, 57, 93, 5, 387, 87, 1765, 1277, 8175, 11185, 4377, 9779, 95569}},
+{13383, 17, 65110, {1, 1, 7, 11, 29, 43, 31, 155, 111, 409, 733, 1919, 2681, 8435, 5877, 35439, 15435}},
+{13384, 17, 65116, {1, 1, 1, 7, 19, 33, 109, 125, 51, 733, 997, 3467, 5081, 8371, 263, 31461, 46117}},
+{13385, 17, 65126, {1, 3, 3, 7, 27, 61, 57, 75, 317, 247, 1535, 3757, 4617, 15627, 11191, 3581, 64475}},
+{13386, 17, 65129, {1, 3, 3, 1, 31, 7, 95, 151, 159, 475, 559, 379, 361, 5953, 5551, 20313, 64015}},
+{13387, 17, 65138, {1, 1, 5, 1, 11, 31, 71, 77, 493, 697, 345, 1809, 611, 14319, 6591, 23657, 44071}},
+{13388, 17, 65160, {1, 1, 1, 13, 5, 1, 9, 233, 229, 397, 1201, 1817, 7409, 11521, 3753, 35611, 123037}},
+{13389, 17, 65171, {1, 3, 7, 15, 9, 15, 85, 163, 99, 867, 265, 1021, 129, 11059, 123, 27185, 68435}},
+{13390, 17, 65173, {1, 3, 1, 11, 25, 43, 105, 165, 291, 977, 463, 2699, 5361, 9951, 29735, 63501, 86235}},
+{13391, 17, 65180, {1, 3, 7, 13, 9, 33, 39, 145, 441, 233, 373, 193, 1451, 7975, 2871, 64431, 43339}},
+{13392, 17, 65189, {1, 1, 7, 13, 15, 25, 45, 27, 319, 719, 1801, 447, 3027, 769, 271, 37227, 26447}},
+{13393, 17, 65193, {1, 1, 5, 1, 29, 1, 59, 59, 121, 251, 387, 55, 5957, 10527, 24227, 38841, 29115}},
+{13394, 17, 65208, {1, 3, 1, 5, 31, 25, 67, 191, 137, 849, 631, 953, 3103, 9737, 28993, 49413, 60709}},
+{13395, 17, 65214, {1, 3, 3, 15, 7, 5, 37, 179, 357, 961, 1649, 441, 5287, 4161, 24013, 39661, 76233}},
+{13396, 17, 65216, {1, 1, 5, 1, 9, 1, 47, 209, 219, 1021, 969, 2343, 5675, 7137, 14247, 50305, 72613}},
+{13397, 17, 65225, {1, 1, 3, 1, 9, 43, 43, 47, 35, 97, 617, 1033, 2387, 14155, 17049, 53333, 108619}},
+{13398, 17, 65236, {1, 3, 1, 3, 1, 45, 11, 171, 349, 65, 909, 1801, 1075, 10905, 7395, 19997, 128205}},
+{13399, 17, 65239, {1, 1, 7, 11, 19, 39, 117, 175, 459, 791, 1383, 3473, 6937, 8447, 10077, 13353, 122063}},
+{13400, 17, 65273, {1, 3, 3, 9, 3, 27, 115, 29, 135, 305, 1023, 2517, 1981, 4969, 18149, 35565, 120785}},
+{13401, 17, 65274, {1, 3, 3, 11, 15, 23, 27, 115, 411, 805, 841, 2205, 5997, 5141, 10679, 25235, 81989}},
+{13402, 17, 65281, {1, 1, 3, 9, 11, 63, 27, 185, 337, 891, 1447, 1397, 8009, 4453, 23077, 37599, 93389}},
+{13403, 17, 65294, {1, 1, 5, 13, 27, 11, 77, 11, 447, 81, 1603, 2317, 6499, 6631, 27305, 51049, 40967}},
+{13404, 17, 65324, {1, 3, 7, 1, 7, 43, 83, 33, 69, 119, 139, 1391, 4879, 3759, 31211, 29203, 110229}},
+{13405, 17, 65335, {1, 3, 7, 15, 31, 59, 53, 97, 135, 233, 1421, 587, 2985, 3627, 7355, 53829, 51581}},
+{13406, 17, 65354, {1, 3, 7, 15, 1, 37, 39, 225, 147, 37, 327, 2819, 6081, 4337, 22063, 21177, 91065}},
+{13407, 17, 65359, {1, 1, 3, 1, 13, 31, 61, 133, 433, 243, 131, 3625, 6389, 335, 24029, 33217, 80833}},
+{13408, 17, 65373, {1, 1, 7, 11, 21, 39, 95, 181, 35, 499, 677, 3935, 1379, 6791, 12633, 13671, 28317}},
+{13409, 17, 65383, {1, 3, 1, 5, 7, 57, 5, 229, 389, 197, 1523, 1221, 609, 10449, 6389, 9279, 53871}},
+{13410, 17, 65387, {1, 3, 5, 7, 1, 39, 69, 131, 387, 839, 1375, 3841, 81, 7395, 5837, 32067, 51183}},
+{13411, 17, 65397, {1, 1, 5, 3, 5, 27, 107, 171, 53, 923, 345, 445, 1101, 11201, 20563, 30889, 72361}},
+{13412, 17, 65411, {1, 3, 7, 11, 19, 7, 99, 219, 485, 403, 293, 3967, 7517, 4765, 11331, 55, 92641}},
+{13413, 17, 65413, {1, 1, 7, 13, 19, 9, 73, 31, 405, 513, 941, 3645, 7075, 8109, 21431, 52791, 120927}},
+{13414, 17, 65418, {1, 1, 1, 15, 29, 33, 75, 65, 479, 47, 35, 4023, 4853, 2793, 29895, 2711, 83779}},
+{13415, 17, 65441, {1, 1, 3, 15, 11, 1, 9, 149, 503, 845, 647, 1233, 4355, 3623, 3197, 36015, 24839}},
+{13416, 17, 65444, {1, 1, 7, 1, 31, 35, 59, 25, 393, 503, 227, 3243, 301, 11121, 32463, 38185, 69969}},
+{13417, 17, 65447, {1, 1, 1, 7, 9, 15, 11, 89, 19, 605, 1657, 3335, 1967, 29, 28619, 42301, 79909}},
+{13418, 17, 65448, {1, 3, 7, 7, 19, 29, 111, 55, 299, 733, 547, 395, 4831, 1991, 7357, 25781, 115129}},
+{13419, 17, 65473, {1, 1, 3, 7, 5, 33, 31, 101, 163, 389, 1163, 1843, 4105, 14209, 29261, 5821, 17929}},
+{13420, 17, 65476, {1, 3, 5, 1, 11, 23, 53, 227, 497, 695, 313, 3305, 6549, 15401, 9339, 40283, 60531}},
+{13421, 17, 65480, {1, 3, 5, 5, 3, 29, 77, 149, 509, 747, 85, 2561, 4435, 14475, 22887, 38177, 24535}},
+{13422, 17, 65494, {1, 1, 7, 1, 1, 33, 7, 77, 153, 369, 689, 3325, 1173, 16203, 1499, 36627, 66915}},
+{13423, 17, 65509, {1, 1, 5, 11, 23, 61, 95, 61, 289, 71, 653, 2817, 365, 7391, 1613, 48901, 57471}},
+{13424, 17, 65519, {1, 3, 3, 7, 15, 29, 65, 133, 15, 921, 1601, 1941, 6917, 10945, 20101, 59809, 9017}},
+{13425, 17, 65527, {1, 3, 3, 15, 7, 51, 95, 53, 87, 1017, 1039, 3405, 1967, 9855, 4905, 4651, 83487}},
+{13426, 18, 19, {1, 3, 5, 13, 23, 27, 31, 179, 121, 597, 829, 4003, 2487, 3977, 3087, 26791, 28305, 138357}},
+{13427, 18, 31, {1, 1, 5, 5, 5, 39, 95, 117, 461, 117, 109, 2571, 7651, 12361, 17921, 555, 33353, 186427}},
+{13428, 18, 38, {1, 1, 3, 13, 23, 47, 89, 125, 271, 609, 215, 3861, 6883, 3217, 2547, 54943, 60565, 215939}},
+{13429, 18, 61, {1, 1, 7, 15, 25, 61, 47, 93, 219, 919, 1551, 1417, 2753, 4353, 9201, 46423, 31227, 150649}},
+{13430, 18, 64, {1, 1, 1, 3, 29, 39, 11, 61, 137, 809, 147, 2715, 5455, 9431, 5725, 46135, 118193, 54099}},
+{13431, 18, 109, {1, 1, 3, 1, 25, 37, 83, 211, 423, 779, 1731, 2827, 883, 10477, 28771, 21723, 114333, 56293}},
+{13432, 18, 115, {1, 1, 5, 5, 27, 17, 21, 125, 495, 655, 1803, 3555, 1997, 15593, 29705, 48537, 53935, 179773}},
+{13433, 18, 118, {1, 1, 7, 5, 19, 63, 55, 15, 469, 769, 967, 3047, 1713, 11655, 15313, 29965, 78857, 223391}},
+{13434, 18, 131, {1, 3, 3, 5, 27, 33, 51, 171, 417, 243, 1203, 3505, 2533, 2695, 219, 57423, 5145, 143165}},
+{13435, 18, 167, {1, 3, 5, 9, 5, 19, 95, 97, 1, 863, 693, 2977, 4839, 6649, 22587, 40745, 113839, 69131}},
+{13436, 18, 200, {1, 3, 5, 1, 31, 39, 53, 85, 509, 5, 359, 1947, 3279, 5433, 21763, 46713, 37289, 35911}},
+{13437, 18, 241, {1, 3, 7, 13, 17, 35, 59, 63, 95, 667, 1775, 2165, 7861, 15731, 12159, 36179, 115457, 184819}},
+{13438, 18, 244, {1, 3, 3, 15, 19, 51, 7, 83, 367, 573, 503, 535, 333, 13041, 7187, 14479, 57473, 242951}},
+{13439, 18, 247, {1, 3, 5, 1, 7, 27, 65, 201, 365, 445, 985, 1175, 6391, 7345, 19935, 29085, 103001, 231855}},
+{13440, 18, 261, {1, 3, 5, 13, 15, 61, 95, 125, 135, 217, 1787, 417, 7641, 11825, 14531, 48497, 125087, 73279}},
+{13441, 18, 265, {1, 1, 5, 13, 7, 25, 77, 99, 341, 447, 1711, 137, 2749, 3465, 26255, 719, 102595, 112825}},
+{13442, 18, 304, {1, 1, 7, 7, 15, 13, 127, 57, 359, 591, 713, 409, 1293, 4979, 7035, 11369, 85255, 207241}},
+{13443, 18, 314, {1, 3, 3, 5, 1, 45, 123, 183, 297, 375, 1269, 1197, 2389, 6269, 24549, 44643, 75893, 161509}},
+{13444, 18, 341, {1, 1, 5, 7, 17, 55, 67, 51, 449, 383, 2037, 871, 1359, 15317, 22055, 4655, 18065, 258271}},
+{13445, 18, 376, {1, 1, 3, 11, 21, 27, 59, 205, 145, 195, 1747, 1121, 1061, 8879, 31455, 56541, 74765, 183047}},
+{13446, 18, 395, {1, 1, 5, 15, 1, 11, 69, 157, 13, 185, 1355, 467, 4383, 13103, 21679, 35169, 33427, 32113}},
+{13447, 18, 405, {1, 3, 1, 3, 29, 41, 15, 209, 313, 61, 1749, 2457, 1897, 15595, 24441, 39913, 40499, 5179}},
+{13448, 18, 406, {1, 3, 7, 15, 25, 41, 87, 125, 239, 73, 207, 2043, 1133, 12845, 8533, 16339, 117913, 118677}},
+{13449, 18, 443, {1, 1, 3, 15, 25, 9, 15, 97, 395, 99, 2017, 1003, 847, 2535, 11753, 54769, 54011, 73541}},
+{13450, 18, 451, {1, 1, 7, 15, 11, 61, 13, 49, 319, 871, 893, 165, 3957, 8683, 31197, 39491, 58705, 213411}},
+{13451, 18, 458, {1, 3, 7, 3, 17, 43, 29, 81, 461, 595, 541, 243, 5587, 13083, 29981, 16187, 124601, 89543}},
+{13452, 18, 460, {1, 1, 5, 11, 7, 5, 61, 43, 445, 115, 1705, 419, 4627, 15063, 16053, 26249, 112243, 208711}},
+{13453, 18, 468, {1, 3, 3, 9, 27, 21, 89, 49, 41, 859, 681, 2043, 7445, 9591, 13443, 36981, 66785, 227899}},
+{13454, 18, 472, {1, 1, 3, 5, 11, 55, 51, 45, 41, 739, 1199, 191, 4563, 4035, 3657, 12189, 52879, 33961}},
+{13455, 18, 482, {1, 1, 1, 3, 17, 59, 47, 217, 389, 783, 1501, 517, 6311, 7903, 1371, 50617, 41723, 116473}},
+{13456, 18, 491, {1, 1, 5, 13, 29, 39, 101, 203, 101, 479, 1337, 2647, 6447, 563, 2593, 16533, 122535, 25587}},
+{13457, 18, 496, {1, 1, 3, 3, 27, 21, 75, 173, 289, 279, 665, 3177, 559, 8539, 10903, 16779, 128219, 125907}},
+{13458, 18, 524, {1, 1, 1, 11, 27, 1, 61, 247, 113, 585, 331, 3443, 5939, 5213, 27289, 57057, 17349, 62359}},
+{13459, 18, 536, {1, 3, 5, 15, 21, 41, 67, 47, 121, 11, 545, 3609, 7745, 3669, 9045, 8377, 97655, 99631}},
+{13460, 18, 542, {1, 3, 5, 9, 11, 15, 111, 61, 67, 775, 579, 3421, 7827, 13607, 32373, 43531, 86149, 238827}},
+{13461, 18, 557, {1, 1, 1, 1, 9, 45, 79, 153, 331, 399, 1777, 3515, 3363, 3499, 13461, 48651, 21731, 220611}},
+{13462, 18, 572, {1, 1, 1, 1, 31, 57, 117, 223, 139, 725, 1115, 3203, 8185, 11983, 20245, 55913, 36803, 68101}},
+{13463, 18, 580, {1, 1, 1, 3, 31, 57, 53, 79, 225, 307, 1645, 3311, 643, 6587, 12037, 12453, 83461, 195503}},
+{13464, 18, 592, {1, 3, 1, 7, 23, 25, 65, 233, 273, 97, 37, 1563, 3635, 9299, 24367, 42761, 55, 128675}},
+{13465, 18, 656, {1, 3, 3, 11, 29, 21, 97, 143, 447, 345, 389, 381, 1403, 685, 309, 11103, 69769, 194441}},
+{13466, 18, 713, {1, 3, 3, 11, 23, 55, 119, 71, 23, 291, 1241, 1723, 5025, 4499, 26617, 22875, 62185, 240321}},
+{13467, 18, 719, {1, 1, 7, 11, 19, 63, 31, 131, 393, 99, 1061, 3805, 7477, 15357, 8269, 26067, 113349, 239333}},
+{13468, 18, 738, {1, 3, 5, 1, 5, 37, 77, 83, 37, 759, 1297, 3067, 5369, 5977, 7531, 49079, 94503, 192765}},
+{13469, 18, 749, {1, 1, 7, 1, 23, 9, 119, 137, 469, 73, 2001, 2629, 2681, 2295, 2055, 44027, 47627, 45283}},
+{13470, 18, 752, {1, 3, 1, 7, 31, 17, 61, 137, 241, 325, 1417, 2383, 4171, 2495, 215, 59593, 98495, 74727}},
+{13471, 18, 767, {1, 1, 7, 13, 7, 5, 59, 189, 131, 865, 1963, 1811, 5629, 16189, 16397, 58069, 72081, 191457}},
+{13472, 18, 772, {1, 1, 7, 15, 23, 33, 93, 247, 395, 643, 693, 3587, 4375, 5519, 9449, 37515, 11455, 218337}},
+{13473, 18, 782, {1, 1, 3, 1, 27, 63, 113, 91, 477, 55, 1461, 1547, 4743, 699, 21639, 1815, 169, 34239}},
+{13474, 18, 789, {1, 1, 5, 15, 29, 37, 19, 19, 247, 771, 695, 319, 1779, 10553, 16165, 60507, 87161, 86967}},
+{13475, 18, 830, {1, 1, 7, 1, 25, 61, 13, 167, 251, 861, 1717, 1533, 7323, 3945, 20879, 37759, 129689, 35901}},
+{13476, 18, 838, {1, 3, 3, 7, 7, 61, 11, 25, 187, 949, 1393, 1743, 745, 16313, 5293, 16921, 17619, 237705}},
+{13477, 18, 916, {1, 3, 5, 11, 7, 27, 11, 107, 299, 711, 149, 1581, 7747, 14285, 6411, 52209, 79043, 61117}},
+{13478, 18, 920, {1, 1, 5, 1, 17, 19, 91, 185, 53, 699, 1185, 4007, 1099, 1965, 20239, 19547, 120859, 234149}},
+{13479, 18, 936, {1, 1, 5, 5, 13, 61, 117, 187, 149, 957, 837, 3549, 6221, 501, 24755, 47975, 67007, 12329}},
+{13480, 18, 991, {1, 1, 3, 15, 21, 41, 55, 81, 397, 403, 1699, 1057, 6125, 11987, 3103, 43361, 21277, 156577}},
+{13481, 18, 998, {1, 1, 5, 11, 5, 27, 5, 177, 387, 859, 809, 3919, 4085, 1535, 6009, 13265, 3065, 217945}},
+{13482, 18, 1016, {1, 3, 1, 13, 15, 57, 107, 81, 437, 305, 879, 1691, 3685, 11415, 3749, 46999, 113933, 10515}},
+{13483, 18, 1024, {1, 1, 7, 13, 9, 43, 59, 223, 189, 329, 829, 2033, 1835, 8255, 8121, 46463, 61433, 86453}},
+{13484, 18, 1053, {1, 3, 1, 9, 11, 49, 63, 125, 11, 987, 2017, 2623, 4753, 13889, 57, 24755, 108489, 175383}},
+{13485, 18, 1081, {1, 1, 1, 3, 25, 33, 39, 151, 405, 657, 1755, 957, 5557, 7611, 25839, 51385, 92713, 64009}},
+{13486, 18, 1090, {1, 3, 7, 9, 17, 17, 115, 89, 225, 715, 1085, 543, 1047, 15053, 14359, 43301, 31455, 156555}},
+{13487, 18, 1125, {1, 1, 7, 11, 11, 21, 115, 5, 371, 1003, 1053, 1713, 5921, 7277, 799, 62483, 28079, 222319}},
+{13488, 18, 1135, {1, 1, 3, 3, 31, 15, 127, 213, 459, 229, 1477, 1863, 1021, 14881, 16299, 5953, 121455, 49659}},
+{13489, 18, 1143, {1, 1, 5, 9, 3, 39, 87, 219, 57, 479, 69, 2777, 8105, 11975, 14743, 26205, 93303, 45311}},
+{13490, 18, 1150, {1, 1, 5, 13, 3, 43, 55, 139, 19, 715, 2035, 2993, 2945, 9075, 6275, 32233, 103127, 49523}},
+{13491, 18, 1154, {1, 3, 1, 13, 19, 31, 109, 211, 261, 231, 697, 383, 2173, 14617, 11877, 37009, 5485, 236549}},
+{13492, 18, 1171, {1, 1, 5, 3, 5, 23, 91, 115, 369, 11, 1021, 519, 655, 4461, 23743, 56981, 51687, 114845}},
+{13493, 18, 1174, {1, 3, 7, 9, 29, 23, 19, 127, 17, 369, 1537, 2705, 4993, 1869, 15447, 28127, 73609, 97683}},
+{13494, 18, 1202, {1, 1, 3, 9, 17, 61, 97, 187, 213, 861, 725, 3205, 103, 12729, 2915, 28389, 83123, 124065}},
+{13495, 18, 1213, {1, 3, 1, 1, 5, 61, 47, 187, 471, 137, 1595, 707, 2449, 14315, 16409, 41467, 37533, 1649}},
+{13496, 18, 1225, {1, 3, 5, 5, 7, 39, 1, 245, 361, 43, 1259, 3149, 3449, 15723, 6225, 27445, 80529, 215349}},
+{13497, 18, 1233, {1, 3, 3, 11, 17, 27, 37, 47, 157, 345, 1437, 3219, 5663, 7299, 23925, 34067, 102379, 42767}},
+{13498, 18, 1234, {1, 3, 5, 13, 21, 59, 43, 189, 17, 303, 1949, 3627, 3495, 7981, 18115, 34221, 43511, 255257}},
+{13499, 18, 1252, {1, 3, 7, 15, 3, 29, 81, 243, 321, 853, 595, 2451, 1713, 11859, 27689, 12849, 24505, 9547}},
+{13500, 18, 1255, {1, 3, 1, 3, 7, 7, 89, 183, 51, 901, 253, 2421, 7453, 15827, 21451, 58653, 51933, 239113}},
+{13501, 18, 1294, {1, 1, 7, 3, 21, 59, 93, 25, 219, 805, 1699, 3777, 3683, 5351, 5481, 44797, 651, 32161}},
+{13502, 18, 1349, {1, 3, 7, 5, 31, 15, 15, 167, 305, 545, 331, 3765, 8191, 5763, 16965, 7239, 73735, 1049}},
+{13503, 18, 1354, {1, 3, 1, 15, 13, 19, 59, 107, 213, 39, 1547, 3413, 6175, 16195, 4635, 8945, 60301, 196697}},
+{13504, 18, 1378, {1, 1, 3, 1, 29, 17, 51, 61, 261, 951, 643, 2329, 2235, 9171, 11265, 3523, 89781, 227125}},
+{13505, 18, 1383, {1, 3, 5, 1, 1, 51, 75, 199, 479, 899, 1425, 3697, 2039, 4503, 11789, 16853, 94607, 236887}},
+{13506, 18, 1387, {1, 3, 1, 9, 19, 43, 111, 41, 385, 677, 1067, 3391, 7819, 13663, 17713, 10155, 124243, 56005}},
+{13507, 18, 1392, {1, 3, 5, 3, 15, 3, 105, 23, 307, 955, 843, 1277, 6697, 11903, 8901, 36129, 51685, 251115}},
+{13508, 18, 1402, {1, 3, 1, 5, 27, 35, 95, 57, 207, 49, 1559, 171, 4703, 511, 4169, 23241, 111447, 173109}},
+{13509, 18, 1420, {1, 3, 1, 13, 23, 5, 31, 15, 223, 673, 1333, 2243, 2479, 7489, 31891, 33909, 96803, 227027}},
+{13510, 18, 1428, {1, 3, 5, 11, 5, 45, 19, 13, 367, 475, 1719, 3947, 5295, 2319, 20697, 181, 16925, 80239}},
+{13511, 18, 1437, {1, 1, 5, 13, 15, 47, 89, 15, 153, 73, 523, 3529, 5401, 15881, 13779, 32123, 82347, 58749}},
+{13512, 18, 1448, {1, 3, 5, 7, 5, 7, 123, 217, 261, 65, 685, 2175, 3289, 7473, 17857, 48335, 94183, 216857}},
+{13513, 18, 1459, {1, 3, 7, 13, 7, 23, 85, 25, 231, 19, 1179, 2705, 6433, 10827, 1969, 51521, 76775, 260291}},
+{13514, 18, 1473, {1, 3, 3, 13, 9, 39, 5, 141, 475, 777, 1809, 1975, 2347, 12611, 28303, 15239, 45429, 170015}},
+{13515, 18, 1507, {1, 1, 7, 7, 31, 31, 39, 19, 317, 897, 739, 275, 2261, 16013, 1123, 33181, 96603, 37563}},
+{13516, 18, 1516, {1, 1, 7, 13, 31, 55, 87, 239, 193, 435, 625, 2153, 3979, 15537, 19937, 50621, 48273, 31381}},
+{13517, 18, 1528, {1, 1, 1, 15, 1, 57, 73, 237, 361, 749, 379, 2511, 501, 10783, 2787, 36983, 12393, 14345}},
+{13518, 18, 1573, {1, 1, 1, 3, 25, 33, 85, 25, 83, 939, 139, 2601, 6385, 16041, 28463, 38977, 28163, 232165}},
+{13519, 18, 1592, {1, 3, 5, 3, 9, 19, 119, 171, 499, 19, 569, 353, 1619, 6235, 24431, 47401, 48125, 168819}},
+{13520, 18, 1597, {1, 1, 1, 3, 9, 27, 121, 137, 411, 391, 1437, 1339, 7475, 3889, 15451, 34809, 69807, 162851}},
+{13521, 18, 1654, {1, 3, 5, 11, 31, 39, 41, 3, 171, 35, 81, 2713, 1077, 10697, 12343, 52133, 52825, 152255}},
+{13522, 18, 1663, {1, 1, 3, 11, 17, 51, 83, 19, 357, 207, 897, 2167, 1333, 4111, 29295, 65371, 73447, 61765}},
+{13523, 18, 1730, {1, 1, 3, 7, 9, 59, 17, 135, 365, 931, 1203, 277, 5531, 4213, 12969, 2617, 591, 154539}},
+{13524, 18, 1739, {1, 3, 7, 11, 1, 53, 31, 49, 135, 603, 227, 911, 7371, 8559, 27195, 33065, 71351, 245255}},
+{13525, 18, 1741, {1, 1, 7, 1, 15, 5, 31, 135, 197, 791, 1531, 2567, 2545, 15515, 25417, 27431, 15571, 176829}},
+{13526, 18, 1753, {1, 3, 1, 1, 15, 7, 89, 217, 505, 859, 1329, 2285, 7921, 11839, 7699, 56867, 112483, 3895}},
+{13527, 18, 1783, {1, 3, 1, 3, 27, 57, 37, 117, 491, 815, 275, 381, 7443, 3297, 1523, 34211, 97589, 232261}},
+{13528, 18, 1804, {1, 1, 3, 3, 29, 63, 69, 153, 297, 423, 1435, 3927, 7265, 13223, 17607, 21201, 57929, 73037}},
+{13529, 18, 1807, {1, 3, 1, 3, 23, 41, 1, 167, 121, 217, 973, 2149, 3807, 9895, 29635, 1625, 99829, 218541}},
+{13530, 18, 1832, {1, 3, 5, 7, 31, 33, 53, 165, 51, 119, 7, 1655, 6521, 5481, 9503, 6833, 80483, 252111}},
+{13531, 18, 1850, {1, 1, 7, 1, 5, 63, 25, 219, 165, 893, 1665, 2789, 1113, 9277, 3151, 12625, 82403, 59749}},
+{13532, 18, 1852, {1, 3, 7, 3, 21, 13, 127, 127, 145, 993, 715, 1947, 7501, 4385, 11759, 2179, 26039, 28027}},
+{13533, 18, 1881, {1, 3, 5, 9, 23, 27, 123, 1, 231, 709, 1615, 1433, 5991, 1045, 16269, 123, 110249, 154819}},
+{13534, 18, 1894, {1, 1, 1, 5, 17, 11, 123, 151, 387, 905, 991, 1571, 4463, 6765, 31905, 59307, 75175, 204571}},
+{13535, 18, 1927, {1, 3, 1, 11, 27, 49, 1, 181, 77, 1023, 807, 3479, 7965, 4633, 17495, 5991, 77081, 249343}},
+{13536, 18, 1952, {1, 3, 1, 1, 13, 53, 105, 79, 269, 173, 1319, 1695, 1215, 3651, 25063, 34949, 77243, 214671}},
+{13537, 18, 1969, {1, 1, 1, 1, 3, 19, 103, 233, 1, 507, 721, 1797, 5025, 405, 13027, 23693, 89963, 25771}},
+{13538, 18, 1999, {1, 3, 5, 9, 21, 53, 1, 241, 405, 707, 1807, 3615, 1199, 11155, 27741, 53931, 55091, 248677}},
+{13539, 18, 2018, {1, 3, 5, 7, 27, 27, 39, 77, 475, 845, 1393, 3779, 5261, 13017, 13517, 18595, 64485, 180577}},
+{13540, 18, 2047, {1, 1, 3, 5, 7, 21, 95, 59, 203, 233, 1167, 3457, 3965, 4321, 14885, 6335, 78353, 39341}},
+{13541, 18, 2066, {1, 1, 7, 13, 27, 19, 27, 133, 419, 507, 945, 3595, 131, 7981, 31451, 62347, 19151, 256127}},
+{13542, 18, 2068, {1, 3, 7, 3, 7, 15, 9, 173, 257, 983, 223, 2881, 6911, 3681, 26183, 38943, 112171, 148627}},
+{13543, 18, 2093, {1, 3, 3, 15, 5, 49, 91, 205, 303, 183, 775, 3841, 4943, 14417, 23013, 59337, 85835, 181771}},
+{13544, 18, 2105, {1, 3, 5, 9, 21, 1, 117, 27, 509, 263, 1215, 893, 6677, 3275, 20831, 5045, 127323, 62589}},
+{13545, 18, 2116, {1, 1, 1, 3, 17, 61, 77, 239, 379, 649, 1151, 2359, 2659, 13853, 30589, 55873, 50359, 184125}},
+{13546, 18, 2149, {1, 1, 7, 5, 17, 33, 95, 111, 245, 873, 1721, 3079, 7753, 12889, 27107, 8267, 119413, 249045}},
+{13547, 18, 2201, {1, 1, 1, 15, 13, 23, 59, 169, 449, 283, 913, 2099, 5337, 4307, 3701, 16395, 112987, 14183}},
+{13548, 18, 2228, {1, 1, 5, 3, 5, 15, 3, 249, 97, 849, 1551, 3437, 1247, 10915, 24073, 53723, 40345, 37215}},
+{13549, 18, 2245, {1, 1, 1, 5, 21, 59, 109, 79, 9, 827, 1329, 405, 3821, 8415, 11239, 1003, 78967, 112627}},
+{13550, 18, 2246, {1, 1, 1, 11, 21, 7, 21, 45, 327, 365, 865, 1409, 1273, 15675, 21425, 45367, 22279, 240943}},
+{13551, 18, 2283, {1, 3, 3, 7, 3, 19, 83, 163, 381, 547, 195, 1537, 7905, 9057, 1309, 41135, 118857, 101725}},
+{13552, 18, 2288, {1, 1, 5, 9, 11, 19, 107, 247, 309, 343, 1697, 699, 7137, 12815, 18405, 42673, 505, 104801}},
+{13553, 18, 2320, {1, 3, 5, 3, 13, 43, 55, 15, 441, 843, 1153, 3739, 67, 11053, 30985, 55329, 57301, 190991}},
+{13554, 18, 2326, {1, 1, 5, 3, 23, 41, 9, 239, 227, 145, 1895, 2645, 945, 6421, 2859, 16173, 97043, 234649}},
+{13555, 18, 2386, {1, 3, 1, 3, 23, 47, 57, 207, 441, 279, 1951, 3041, 2465, 6143, 27669, 41171, 89627, 2489}},
+{13556, 18, 2392, {1, 3, 1, 11, 7, 9, 19, 51, 345, 187, 1699, 1483, 15, 10321, 25277, 34889, 85225, 259071}},
+{13557, 18, 2395, {1, 1, 1, 15, 27, 15, 79, 51, 407, 757, 611, 3955, 1123, 14659, 11273, 56639, 64727, 183077}},
+{13558, 18, 2413, {1, 3, 7, 1, 13, 61, 89, 157, 29, 561, 791, 995, 4233, 11351, 16335, 47041, 108671, 120115}},
+{13559, 18, 2419, {1, 3, 3, 15, 17, 35, 15, 223, 57, 7, 961, 3327, 7287, 5537, 26231, 3289, 106555, 109781}},
+{13560, 18, 2441, {1, 3, 7, 15, 17, 3, 25, 121, 349, 995, 1353, 2991, 3071, 3583, 26173, 42343, 60495, 44035}},
+{13561, 18, 2466, {1, 3, 1, 11, 5, 5, 83, 249, 427, 173, 1733, 45, 3277, 7911, 18091, 61305, 130251, 31849}},
+{13562, 18, 2477, {1, 1, 1, 9, 3, 23, 23, 127, 371, 1011, 573, 1769, 1707, 15351, 30077, 61139, 122963, 203481}},
+{13563, 18, 2485, {1, 1, 1, 13, 27, 41, 97, 29, 461, 207, 1393, 707, 5633, 7155, 13455, 7305, 107539, 136413}},
+{13564, 18, 2492, {1, 1, 1, 9, 3, 13, 61, 115, 297, 333, 1679, 127, 8049, 3129, 31845, 40039, 77087, 6831}},
+{13565, 18, 2495, {1, 3, 3, 11, 27, 25, 49, 29, 423, 193, 1955, 2927, 5679, 3537, 16911, 47065, 126803, 129957}},
+{13566, 18, 2498, {1, 1, 1, 3, 21, 31, 25, 187, 301, 883, 1301, 415, 1515, 14761, 227, 24377, 54415, 64553}},
+{13567, 18, 2504, {1, 3, 7, 7, 3, 5, 69, 221, 357, 587, 1387, 3719, 5355, 10569, 14731, 22515, 107237, 1673}},
+{13568, 18, 2515, {1, 1, 3, 15, 27, 7, 89, 23, 213, 655, 779, 1641, 1793, 1499, 27279, 59423, 56715, 90313}},
+{13569, 18, 2521, {1, 3, 3, 7, 3, 33, 85, 181, 509, 327, 353, 1625, 4995, 15627, 17071, 31885, 122423, 100337}},
+{13570, 18, 2561, {1, 3, 5, 9, 7, 39, 45, 157, 279, 211, 1163, 3283, 4419, 10187, 22397, 42119, 25105, 163925}},
+{13571, 18, 2579, {1, 3, 3, 15, 17, 37, 75, 65, 501, 765, 1171, 2451, 309, 551, 15573, 65497, 106435, 20817}},
+{13572, 18, 2604, {1, 1, 3, 1, 13, 1, 79, 117, 5, 285, 953, 2401, 2479, 15765, 25677, 63611, 91807, 78153}},
+{13573, 18, 2657, {1, 1, 5, 15, 1, 7, 123, 159, 217, 307, 1779, 2625, 101, 13887, 31721, 55769, 94899, 183427}},
+{13574, 18, 2681, {1, 3, 5, 5, 11, 13, 59, 205, 221, 871, 753, 823, 547, 11055, 31621, 54379, 23631, 137027}},
+{13575, 18, 2691, {1, 3, 3, 7, 5, 17, 7, 31, 37, 237, 1633, 969, 4123, 6643, 28499, 3277, 130223, 37465}},
+{13576, 18, 2731, {1, 3, 7, 5, 29, 41, 65, 159, 487, 61, 1217, 4093, 487, 15257, 13379, 46641, 88043, 107425}},
+{13577, 18, 2739, {1, 1, 7, 7, 19, 29, 87, 119, 13, 877, 467, 2661, 7733, 9303, 20069, 8445, 126159, 69421}},
+{13578, 18, 2765, {1, 3, 1, 13, 1, 57, 77, 241, 185, 479, 859, 2397, 1167, 6545, 20715, 50701, 107781, 149965}},
+{13579, 18, 2790, {1, 1, 5, 1, 1, 3, 19, 31, 473, 685, 1455, 1537, 1843, 4051, 17475, 56717, 70257, 112815}},
+{13580, 18, 2802, {1, 3, 7, 15, 9, 21, 19, 201, 13, 551, 1053, 1291, 3793, 7923, 30425, 55513, 30033, 70597}},
+{13581, 18, 2819, {1, 3, 1, 15, 21, 47, 127, 117, 199, 655, 1979, 1291, 8017, 11769, 9071, 12029, 112369, 2529}},
+{13582, 18, 2891, {1, 3, 5, 1, 15, 3, 25, 199, 101, 997, 597, 2485, 6509, 11913, 19573, 13985, 56165, 249}},
+{13583, 18, 2905, {1, 1, 7, 3, 19, 45, 107, 229, 241, 747, 1219, 3133, 3675, 4441, 13933, 64571, 95445, 250713}},
+{13584, 18, 2911, {1, 3, 1, 5, 11, 31, 89, 119, 503, 99, 75, 349, 7479, 15161, 6365, 62461, 39443, 188455}},
+{13585, 18, 2912, {1, 1, 5, 13, 25, 31, 65, 237, 259, 329, 89, 1283, 6033, 4401, 7655, 38837, 62367, 76555}},
+{13586, 18, 2921, {1, 1, 1, 7, 19, 61, 109, 41, 361, 89, 171, 2319, 3625, 8905, 24461, 36135, 28515, 101547}},
+{13587, 18, 2924, {1, 3, 5, 3, 5, 45, 123, 227, 339, 79, 309, 2619, 1621, 1295, 6395, 6717, 119933, 187231}},
+{13588, 18, 2945, {1, 1, 1, 3, 3, 45, 91, 225, 269, 475, 1159, 2599, 5087, 4141, 28375, 22413, 56235, 256559}},
+{13589, 18, 2952, {1, 1, 1, 13, 7, 51, 27, 65, 65, 381, 169, 1759, 4653, 9885, 25839, 19851, 4965, 249097}},
+{13590, 18, 2972, {1, 3, 7, 11, 25, 11, 83, 137, 419, 277, 503, 2823, 2759, 8173, 9405, 23731, 116087, 9735}},
+{13591, 18, 2986, {1, 1, 5, 5, 27, 17, 123, 145, 41, 85, 1099, 1087, 1465, 7063, 8585, 39427, 15479, 243967}},
+{13592, 18, 3000, {1, 1, 7, 3, 21, 53, 105, 185, 101, 763, 593, 2649, 3273, 5655, 12233, 11761, 27093, 121347}},
+{13593, 18, 3008, {1, 1, 1, 5, 11, 55, 107, 167, 179, 681, 741, 1821, 4297, 14677, 9949, 9647, 60465, 36999}},
+{13594, 18, 3011, {1, 1, 1, 7, 25, 43, 95, 71, 161, 517, 1475, 1989, 6273, 13295, 19681, 51773, 93523, 33441}},
+{13595, 18, 3018, {1, 3, 1, 13, 23, 59, 95, 177, 73, 707, 37, 421, 3747, 14207, 17159, 4957, 20161, 26185}},
+{13596, 18, 3047, {1, 1, 7, 13, 13, 1, 19, 153, 445, 429, 1911, 3515, 639, 16015, 833, 54347, 87717, 82175}},
+{13597, 18, 3071, {1, 3, 5, 9, 1, 9, 115, 87, 341, 651, 1583, 807, 559, 13579, 9647, 37277, 125555, 169655}},
+{13598, 18, 3079, {1, 1, 3, 5, 13, 23, 117, 229, 205, 803, 1381, 2773, 7099, 4031, 597, 37135, 11643, 92325}},
+{13599, 18, 3083, {1, 3, 7, 9, 27, 15, 33, 147, 1, 799, 1511, 2609, 1419, 5991, 15571, 56995, 97695, 223969}},
+{13600, 18, 3086, {1, 3, 1, 3, 17, 9, 17, 189, 407, 355, 765, 2545, 1079, 15253, 4785, 5187, 80775, 238775}},
+{13601, 18, 3148, {1, 1, 3, 1, 31, 29, 3, 159, 263, 325, 125, 2221, 6369, 5717, 13985, 33829, 21375, 134249}},
+{13602, 18, 3156, {1, 3, 7, 3, 5, 29, 39, 75, 183, 155, 1017, 637, 921, 9561, 14893, 59695, 38325, 15503}},
+{13603, 18, 3194, {1, 1, 3, 13, 9, 31, 43, 71, 241, 661, 325, 357, 431, 903, 5039, 24535, 94241, 228605}},
+{13604, 18, 3230, {1, 3, 1, 1, 17, 37, 93, 47, 25, 207, 611, 415, 6473, 15979, 2025, 19003, 8941, 248779}},
+{13605, 18, 3233, {1, 1, 7, 15, 19, 17, 81, 201, 121, 11, 1975, 1289, 4405, 7851, 9707, 20057, 33749, 187161}},
+{13606, 18, 3254, {1, 1, 3, 5, 29, 31, 47, 99, 435, 795, 947, 1299, 4011, 8315, 12827, 48071, 86567, 154655}},
+{13607, 18, 3268, {1, 1, 5, 3, 9, 59, 115, 191, 177, 65, 1835, 3989, 1819, 14325, 8939, 25337, 16099, 200577}},
+{13608, 18, 3305, {1, 3, 7, 9, 15, 47, 7, 195, 413, 1013, 1607, 3317, 6979, 13243, 275, 34125, 66069, 90201}},
+{13609, 18, 3323, {1, 1, 3, 3, 29, 3, 51, 137, 341, 393, 897, 351, 1937, 6793, 12551, 18873, 110949, 133925}},
+{13610, 18, 3326, {1, 3, 5, 9, 29, 41, 79, 169, 113, 123, 1229, 1885, 6153, 1549, 31729, 41949, 74083, 41387}},
+{13611, 18, 3343, {1, 3, 1, 15, 31, 49, 7, 233, 305, 435, 1299, 3037, 2387, 15431, 817, 11783, 24067, 116527}},
+{13612, 18, 3345, {1, 3, 5, 13, 7, 17, 49, 33, 133, 45, 689, 2381, 2649, 2433, 27535, 21755, 88611, 200585}},
+{13613, 18, 3382, {1, 1, 5, 11, 1, 61, 87, 97, 91, 433, 313, 2541, 5289, 5769, 17963, 5719, 12165, 146849}},
+{13614, 18, 3413, {1, 3, 7, 13, 17, 21, 37, 191, 489, 847, 841, 3567, 7339, 15233, 23973, 1209, 99741, 243303}},
+{13615, 18, 3420, {1, 3, 1, 1, 5, 21, 11, 39, 69, 751, 1679, 143, 6187, 2963, 695, 45763, 126749, 243841}},
+{13616, 18, 3434, {1, 3, 3, 9, 21, 55, 43, 73, 133, 417, 495, 2899, 5681, 13049, 30241, 44519, 19095, 30673}},
+{13617, 18, 3453, {1, 1, 5, 9, 17, 51, 121, 205, 273, 597, 1325, 3755, 5113, 12287, 21323, 17947, 23807, 20025}},
+{13618, 18, 3472, {1, 1, 7, 7, 21, 11, 25, 33, 207, 13, 1639, 1971, 7401, 11771, 7879, 59027, 111981, 65451}},
+{13619, 18, 3488, {1, 3, 5, 15, 3, 15, 121, 23, 199, 839, 937, 3659, 5379, 2139, 31631, 17215, 65349, 157413}},
+{13620, 18, 3503, {1, 1, 1, 7, 3, 7, 81, 49, 17, 693, 1819, 2737, 7329, 49, 1655, 42317, 31385, 11435}},
+{13621, 18, 3506, {1, 3, 5, 15, 25, 51, 121, 133, 457, 159, 869, 855, 3529, 2691, 147, 58621, 78379, 148519}},
+{13622, 18, 3518, {1, 1, 3, 7, 1, 53, 109, 81, 37, 553, 1921, 3081, 2665, 12665, 13887, 1035, 16987, 48883}},
+{13623, 18, 3532, {1, 1, 5, 1, 19, 1, 121, 97, 143, 871, 1401, 2879, 5657, 5479, 14011, 65131, 56011, 241055}},
+{13624, 18, 3543, {1, 1, 7, 5, 9, 21, 9, 43, 331, 183, 1313, 2495, 6905, 2763, 29567, 7579, 95169, 130937}},
+{13625, 18, 3547, {1, 3, 7, 3, 3, 37, 65, 195, 339, 527, 1383, 3063, 7749, 11109, 8097, 27257, 107615, 134241}},
+{13626, 18, 3573, {1, 1, 1, 5, 25, 25, 63, 179, 135, 65, 169, 2709, 5435, 12119, 21549, 59847, 129639, 220163}},
+{13627, 18, 3574, {1, 3, 5, 1, 3, 17, 87, 181, 9, 923, 731, 3397, 7079, 3281, 10455, 35471, 20439, 206209}},
+{13628, 18, 3587, {1, 1, 1, 5, 31, 25, 15, 89, 381, 675, 1217, 3175, 707, 585, 1695, 57771, 92433, 203523}},
+{13629, 18, 3632, {1, 3, 5, 15, 5, 7, 9, 87, 461, 1017, 869, 1541, 7833, 3117, 24917, 13917, 104797, 149045}},
+{13630, 18, 3664, {1, 1, 7, 15, 13, 49, 9, 89, 165, 827, 657, 1977, 7471, 15437, 25785, 1455, 52803, 198793}},
+{13631, 18, 3713, {1, 3, 1, 15, 3, 39, 27, 205, 325, 345, 965, 1439, 4403, 10717, 9591, 46845, 123983, 76181}},
+{13632, 18, 3726, {1, 3, 1, 1, 25, 23, 97, 135, 367, 179, 1563, 75, 455, 3517, 21539, 59565, 43449, 139495}},
+{13633, 18, 3768, {1, 1, 5, 15, 13, 27, 55, 21, 1, 505, 1349, 409, 2491, 5299, 15771, 59389, 110377, 209275}},
+{13634, 18, 3771, {1, 1, 7, 9, 31, 15, 63, 91, 3, 559, 419, 1237, 1157, 5811, 24335, 19215, 12581, 148813}},
+{13635, 18, 3810, {1, 1, 7, 13, 23, 3, 81, 127, 33, 931, 867, 2905, 1011, 16207, 1543, 54309, 10611, 152733}},
+{13636, 18, 3848, {1, 3, 5, 7, 21, 19, 45, 101, 439, 537, 267, 945, 8007, 9383, 13211, 21867, 5731, 150203}},
+{13637, 18, 3868, {1, 1, 3, 9, 29, 3, 31, 219, 217, 775, 1011, 445, 2663, 1691, 9837, 5727, 116283, 128627}},
+{13638, 18, 3896, {1, 3, 3, 3, 21, 1, 97, 239, 457, 925, 1923, 1693, 1187, 13437, 8529, 22081, 633, 76109}},
+{13639, 18, 3910, {1, 3, 7, 7, 19, 5, 9, 15, 337, 855, 1563, 3159, 2799, 4103, 2013, 47789, 77027, 22425}},
+{13640, 18, 3921, {1, 1, 3, 15, 15, 41, 27, 77, 489, 377, 1953, 305, 5081, 1895, 5117, 51455, 71859, 190289}},
+{13641, 18, 3928, {1, 1, 5, 7, 7, 7, 13, 25, 115, 657, 223, 3185, 5327, 2559, 5147, 22237, 91933, 195429}},
+{13642, 18, 3940, {1, 1, 3, 5, 5, 19, 3, 197, 371, 237, 555, 2873, 3401, 3329, 29165, 4593, 111677, 244025}},
+{13643, 18, 3947, {1, 3, 5, 15, 15, 55, 29, 75, 329, 623, 279, 2831, 4489, 7803, 24119, 12959, 59783, 135213}},
+{13644, 18, 3949, {1, 3, 5, 13, 31, 21, 93, 77, 401, 353, 893, 917, 4813, 8027, 7847, 55315, 60213, 102763}},
+{13645, 18, 4001, {1, 1, 5, 13, 29, 49, 91, 35, 79, 625, 1539, 509, 823, 2239, 30867, 21729, 33195, 38189}},
+{13646, 18, 4004, {1, 3, 3, 3, 19, 11, 39, 145, 5, 329, 1653, 3205, 4431, 9291, 30369, 63173, 72317, 236103}},
+{13647, 18, 4022, {1, 3, 3, 15, 27, 9, 111, 191, 249, 845, 1845, 2097, 6529, 9559, 25757, 29085, 2615, 175759}},
+{13648, 18, 4026, {1, 3, 7, 1, 17, 59, 119, 125, 213, 995, 601, 2517, 1225, 2301, 13031, 40881, 31623, 165799}},
+{13649, 18, 4036, {1, 3, 3, 13, 25, 61, 97, 157, 347, 931, 1731, 3697, 5815, 7309, 30605, 3853, 72395, 103609}},
+{13650, 18, 4073, {1, 1, 7, 5, 23, 13, 51, 117, 495, 683, 777, 1629, 5683, 801, 4907, 24935, 9457, 214131}},
+{13651, 18, 4093, {1, 1, 5, 9, 1, 29, 107, 253, 195, 921, 345, 1451, 2253, 12723, 571, 12009, 34149, 140659}},
+{13652, 18, 4099, {1, 1, 5, 9, 31, 17, 93, 5, 455, 205, 1439, 1199, 7371, 12973, 16455, 675, 60561, 99575}},
+{13653, 18, 4120, {1, 3, 3, 3, 31, 37, 115, 49, 31, 285, 2029, 1369, 3443, 2411, 10367, 44859, 26737, 195703}},
+{13654, 18, 4136, {1, 1, 3, 1, 15, 39, 113, 37, 257, 3, 817, 2901, 4029, 12595, 30475, 34883, 109133, 92159}},
+{13655, 18, 4156, {1, 1, 7, 5, 9, 1, 9, 101, 317, 167, 1975, 411, 6875, 6951, 4401, 59483, 129813, 78289}},
+{13656, 18, 4176, {1, 1, 7, 9, 9, 5, 73, 7, 57, 907, 1887, 2923, 961, 8521, 873, 33791, 114485, 43081}},
+{13657, 18, 4182, {1, 1, 5, 7, 13, 45, 91, 179, 499, 197, 1337, 1321, 5307, 15503, 20449, 60813, 97393, 255741}},
+{13658, 18, 4191, {1, 1, 1, 5, 25, 13, 69, 221, 207, 823, 845, 3845, 6743, 5123, 27447, 2079, 100635, 124157}},
+{13659, 18, 4198, {1, 3, 5, 11, 13, 39, 121, 209, 137, 63, 1479, 323, 5347, 9797, 17785, 55541, 108713, 243347}},
+{13660, 18, 4252, {1, 1, 3, 9, 29, 45, 43, 81, 115, 979, 727, 423, 1133, 8757, 27833, 39907, 104663, 33067}},
+{13661, 18, 4259, {1, 3, 5, 1, 13, 61, 49, 17, 409, 567, 1035, 2299, 3711, 15485, 7767, 27809, 1275, 96455}},
+{13662, 18, 4261, {1, 1, 5, 9, 5, 33, 13, 9, 505, 459, 747, 4079, 4271, 6925, 13933, 31349, 5793, 68381}},
+{13663, 18, 4294, {1, 3, 3, 11, 15, 47, 15, 187, 349, 847, 817, 3551, 6059, 6451, 32615, 1635, 108889, 48003}},
+{13664, 18, 4341, {1, 3, 5, 7, 3, 31, 11, 255, 367, 295, 1079, 2981, 5583, 10771, 25359, 16083, 24163, 111201}},
+{13665, 18, 4348, {1, 3, 5, 5, 7, 5, 127, 19, 343, 849, 287, 1471, 7299, 1209, 31349, 33473, 4989, 229181}},
+{13666, 18, 4356, {1, 1, 3, 9, 25, 61, 7, 65, 77, 745, 1871, 2427, 3669, 8965, 11177, 5531, 115801, 34327}},
+{13667, 18, 4384, {1, 3, 3, 15, 1, 57, 125, 167, 173, 875, 347, 2317, 6687, 4339, 10573, 7841, 16241, 192225}},
+{13668, 18, 4389, {1, 3, 1, 3, 15, 37, 45, 189, 75, 1017, 1919, 3401, 329, 2539, 32697, 60801, 52017, 192611}},
+{13669, 18, 4401, {1, 3, 1, 5, 1, 23, 43, 55, 1, 443, 1769, 1633, 5225, 6855, 5419, 65139, 22237, 17415}},
+{13670, 18, 4428, {1, 3, 5, 15, 25, 7, 107, 209, 325, 367, 373, 1855, 1313, 12899, 30137, 19007, 9911, 11791}},
+{13671, 18, 4431, {1, 3, 7, 13, 3, 57, 123, 93, 279, 469, 1817, 3409, 565, 3997, 14119, 58341, 59691, 163323}},
+{13672, 18, 4445, {1, 1, 3, 9, 3, 3, 69, 109, 47, 487, 1895, 2003, 7309, 9803, 9527, 52211, 31213, 41521}},
+{13673, 18, 4470, {1, 1, 7, 7, 9, 15, 101, 227, 75, 501, 25, 1481, 4847, 13279, 28673, 11069, 61987, 5365}},
+{13674, 18, 4473, {1, 3, 1, 1, 25, 5, 47, 125, 97, 969, 1077, 1185, 6033, 13927, 18149, 34255, 14353, 66323}},
+{13675, 18, 4474, {1, 1, 3, 1, 25, 41, 19, 69, 385, 585, 1049, 3497, 3615, 13211, 18855, 61303, 115739, 42639}},
+{13676, 18, 4490, {1, 3, 7, 7, 13, 15, 13, 133, 497, 265, 1809, 4073, 5673, 7543, 30823, 13505, 76167, 98683}},
+{13677, 18, 4509, {1, 1, 5, 5, 3, 59, 47, 191, 419, 505, 2035, 329, 553, 1561, 27885, 39767, 102611, 12689}},
+{13678, 18, 4510, {1, 3, 7, 3, 27, 49, 27, 133, 305, 537, 385, 335, 2417, 14891, 31299, 26201, 124655, 150545}},
+{13679, 18, 4533, {1, 1, 1, 9, 7, 1, 27, 105, 347, 481, 2043, 1645, 4367, 10335, 16457, 48713, 64699, 63595}},
+{13680, 18, 4548, {1, 1, 3, 3, 7, 57, 125, 209, 299, 525, 591, 1265, 7557, 15113, 19319, 56269, 43919, 215435}},
+{13681, 18, 4558, {1, 1, 1, 11, 29, 59, 119, 245, 63, 919, 1913, 3969, 545, 1033, 20975, 61327, 36783, 124303}},
+{13682, 18, 4594, {1, 1, 7, 7, 11, 63, 45, 135, 405, 931, 753, 2559, 5475, 2107, 6437, 6055, 43497, 133571}},
+{13683, 18, 4596, {1, 3, 1, 13, 31, 39, 39, 141, 231, 83, 69, 473, 1095, 13617, 10909, 49861, 98029, 235003}},
+{13684, 18, 4603, {1, 3, 7, 13, 13, 41, 73, 107, 505, 359, 957, 1599, 7617, 1843, 25531, 63755, 96295, 167955}},
+{13685, 18, 4610, {1, 3, 3, 11, 13, 41, 61, 65, 165, 507, 1007, 1695, 91, 8781, 15017, 12063, 95331, 179853}},
+{13686, 18, 4619, {1, 3, 7, 7, 29, 19, 7, 95, 303, 641, 581, 3539, 4495, 13549, 20195, 20845, 16961, 95053}},
+{13687, 18, 4630, {1, 1, 7, 5, 15, 27, 13, 155, 345, 341, 1583, 2207, 2497, 6509, 24343, 3109, 71431, 184871}},
+{13688, 18, 4652, {1, 1, 3, 15, 31, 35, 37, 249, 71, 1005, 681, 3457, 3387, 13797, 8781, 11789, 16825, 11133}},
+{13689, 18, 4658, {1, 3, 7, 11, 5, 29, 121, 139, 77, 859, 163, 2749, 6401, 16303, 22659, 11817, 61667, 119993}},
+{13690, 18, 4682, {1, 1, 7, 11, 15, 45, 71, 87, 293, 981, 1581, 2789, 4117, 12791, 13611, 489, 74823, 71263}},
+{13691, 18, 4708, {1, 1, 3, 9, 15, 21, 59, 167, 469, 723, 1609, 2111, 6359, 10781, 1043, 51039, 24429, 14605}},
+{13692, 18, 4736, {1, 3, 3, 9, 13, 25, 1, 43, 61, 869, 1919, 601, 8003, 15841, 10141, 33187, 124991, 94205}},
+{13693, 18, 4753, {1, 1, 7, 5, 23, 13, 67, 43, 167, 667, 1743, 2523, 2245, 9287, 8115, 64995, 121371, 188321}},
+{13694, 18, 4760, {1, 1, 1, 9, 13, 19, 45, 249, 21, 751, 239, 4035, 4549, 8905, 9377, 47535, 78135, 210429}},
+{13695, 18, 4781, {1, 1, 3, 7, 5, 43, 13, 227, 75, 785, 631, 205, 3475, 9735, 17867, 61407, 75897, 51151}},
+{13696, 18, 4784, {1, 3, 3, 9, 31, 21, 11, 53, 247, 717, 1505, 3903, 3249, 3185, 29007, 48795, 43413, 158653}},
+{13697, 18, 4799, {1, 1, 5, 11, 19, 9, 37, 159, 183, 521, 743, 2877, 2291, 10317, 1211, 17951, 16335, 66439}},
+{13698, 18, 4807, {1, 1, 3, 7, 3, 41, 15, 113, 125, 391, 201, 3841, 255, 15381, 16801, 47219, 119691, 51811}},
+{13699, 18, 4808, {1, 1, 3, 1, 1, 29, 79, 181, 481, 969, 297, 625, 7449, 5813, 5915, 20011, 44853, 231933}},
+{13700, 18, 4842, {1, 1, 1, 5, 5, 49, 63, 171, 93, 107, 1083, 1277, 121, 4421, 18951, 61155, 66643, 120049}},
+{13701, 18, 4882, {1, 3, 7, 5, 25, 59, 111, 197, 459, 217, 1819, 1603, 5581, 11361, 17721, 57475, 11171, 186577}},
+{13702, 18, 4897, {1, 3, 3, 1, 25, 19, 29, 157, 25, 595, 501, 2145, 7513, 10323, 11107, 13269, 21763, 9427}},
+{13703, 18, 4900, {1, 3, 7, 3, 9, 49, 119, 117, 445, 91, 227, 1203, 6245, 9575, 30653, 65429, 64987, 81249}},
+{13704, 18, 4922, {1, 1, 5, 5, 5, 5, 77, 77, 425, 789, 467, 3931, 4815, 11195, 21939, 59513, 78547, 238035}},
+{13705, 18, 4936, {1, 3, 1, 11, 11, 29, 115, 37, 423, 997, 1231, 3987, 5057, 14533, 18005, 51513, 71851, 258137}},
+{13706, 18, 4960, {1, 3, 1, 1, 27, 31, 7, 223, 23, 59, 1465, 2045, 6677, 15707, 25101, 22269, 46995, 89141}},
+{13707, 18, 4970, {1, 1, 1, 5, 21, 7, 115, 133, 407, 373, 1495, 2551, 6947, 3309, 14903, 5683, 67345, 139381}},
+{13708, 18, 4978, {1, 1, 5, 3, 13, 31, 5, 221, 187, 9, 165, 2295, 1239, 5665, 14543, 3963, 4931, 8269}},
+{13709, 18, 4994, {1, 3, 5, 13, 15, 5, 37, 171, 419, 665, 765, 1619, 1561, 1661, 5873, 25595, 34827, 215599}},
+{13710, 18, 5003, {1, 3, 1, 15, 13, 33, 45, 107, 275, 771, 1105, 2895, 187, 5173, 21179, 35047, 50825, 176775}},
+{13711, 18, 5044, {1, 3, 7, 5, 17, 5, 59, 195, 441, 625, 1205, 207, 4703, 10627, 17123, 61785, 100779, 258597}},
+{13712, 18, 5061, {1, 1, 1, 13, 17, 3, 13, 201, 241, 657, 153, 289, 5213, 2129, 13447, 28807, 25405, 33803}},
+{13713, 18, 5107, {1, 3, 1, 9, 19, 9, 51, 133, 159, 743, 1023, 291, 7137, 6949, 30419, 13449, 111505, 212393}},
+{13714, 18, 5127, {1, 3, 5, 7, 31, 29, 79, 211, 425, 93, 1173, 1957, 6737, 1725, 30703, 43237, 119747, 157395}},
+{13715, 18, 5131, {1, 1, 7, 3, 17, 21, 39, 19, 485, 663, 19, 761, 1525, 11059, 12833, 17567, 61123, 124801}},
+{13716, 18, 5136, {1, 1, 7, 3, 7, 25, 17, 199, 413, 821, 1561, 3855, 1871, 14041, 7525, 19383, 51017, 213357}},
+{13717, 18, 5145, {1, 3, 3, 9, 25, 11, 63, 83, 217, 587, 47, 3775, 767, 9191, 5127, 9133, 97689, 122949}},
+{13718, 18, 5146, {1, 1, 1, 9, 19, 7, 89, 125, 23, 813, 1277, 2965, 1939, 1453, 6349, 53127, 109813, 63767}},
+{13719, 18, 5175, {1, 1, 5, 15, 29, 63, 117, 37, 185, 69, 1823, 2791, 4125, 11757, 14847, 15567, 126141, 185951}},
+{13720, 18, 5218, {1, 3, 7, 1, 23, 11, 15, 113, 209, 785, 229, 3207, 97, 2489, 4587, 14253, 30421, 51027}},
+{13721, 18, 5223, {1, 3, 1, 7, 7, 33, 57, 51, 219, 233, 89, 3781, 2055, 4163, 10935, 51913, 63507, 18645}},
+{13722, 18, 5248, {1, 3, 1, 7, 7, 55, 107, 187, 109, 867, 955, 139, 4979, 8627, 5835, 28761, 72061, 99413}},
+{13723, 18, 5294, {1, 1, 1, 3, 5, 59, 17, 121, 511, 29, 1009, 2875, 2459, 1817, 11741, 13869, 72543, 70485}},
+{13724, 18, 5299, {1, 1, 5, 1, 27, 19, 125, 65, 379, 803, 411, 2403, 719, 10683, 23351, 18113, 66773, 252223}},
+{13725, 18, 5301, {1, 1, 7, 9, 31, 51, 65, 233, 171, 357, 1465, 1609, 4263, 15207, 18825, 48831, 69459, 211321}},
+{13726, 18, 5311, {1, 1, 3, 3, 5, 35, 53, 245, 469, 1011, 759, 455, 4487, 9835, 10349, 61755, 73279, 186049}},
+{13727, 18, 5343, {1, 1, 7, 3, 27, 19, 105, 193, 403, 907, 295, 1445, 1867, 8867, 7821, 45309, 129069, 83953}},
+{13728, 18, 5344, {1, 1, 7, 7, 7, 51, 85, 97, 473, 837, 201, 501, 2929, 9457, 6473, 3653, 126991, 218069}},
+{13729, 18, 5396, {1, 3, 3, 5, 25, 49, 85, 223, 127, 563, 239, 1975, 119, 6029, 19349, 59533, 44173, 142229}},
+{13730, 18, 5406, {1, 1, 3, 7, 23, 11, 27, 49, 467, 701, 2037, 2367, 5829, 12533, 9641, 38629, 90505, 132013}},
+{13731, 18, 5410, {1, 1, 7, 1, 13, 25, 79, 107, 37, 331, 355, 3639, 4875, 6635, 21703, 18289, 36257, 201857}},
+{13732, 18, 5424, {1, 1, 5, 1, 3, 39, 25, 101, 199, 401, 1495, 3683, 5447, 12313, 19707, 20853, 66821, 73959}},
+{13733, 18, 5447, {1, 1, 1, 9, 15, 9, 3, 231, 479, 97, 221, 973, 839, 1757, 8759, 45625, 44691, 139803}},
+{13734, 18, 5461, {1, 1, 7, 15, 9, 51, 23, 233, 311, 83, 287, 4035, 2087, 4245, 25457, 43105, 104903, 132811}},
+{13735, 18, 5468, {1, 1, 1, 9, 5, 13, 33, 167, 363, 67, 601, 2143, 5495, 1277, 14615, 32759, 34935, 158625}},
+{13736, 18, 5475, {1, 1, 5, 11, 5, 63, 35, 49, 183, 705, 377, 2607, 2947, 10119, 15631, 60247, 99309, 25747}},
+{13737, 18, 5478, {1, 3, 7, 5, 7, 3, 127, 109, 165, 767, 1873, 3825, 441, 11957, 2581, 38309, 129623, 77451}},
+{13738, 18, 5523, {1, 3, 1, 7, 19, 53, 101, 117, 505, 363, 1399, 1015, 631, 8309, 17507, 28941, 42585, 116283}},
+{13739, 18, 5530, {1, 1, 7, 7, 9, 27, 127, 195, 499, 225, 153, 517, 3909, 9801, 3787, 32829, 6599, 190807}},
+{13740, 18, 5535, {1, 1, 5, 1, 3, 49, 125, 235, 255, 329, 909, 1685, 759, 2287, 3479, 23491, 71157, 81457}},
+{13741, 18, 5548, {1, 1, 3, 9, 19, 21, 93, 37, 259, 69, 219, 1943, 4747, 13951, 14945, 46099, 87189, 222287}},
+{13742, 18, 5559, {1, 1, 7, 5, 21, 33, 61, 227, 167, 569, 1355, 2997, 4917, 10765, 7015, 54335, 125543, 112867}},
+{13743, 18, 5580, {1, 1, 5, 3, 25, 35, 97, 23, 365, 159, 1211, 1283, 979, 8993, 21323, 6863, 46869, 36169}},
+{13744, 18, 5604, {1, 1, 7, 13, 15, 49, 45, 209, 397, 785, 47, 2307, 4749, 2735, 29525, 54921, 23321, 216197}},
+{13745, 18, 5622, {1, 1, 1, 11, 31, 23, 27, 127, 197, 595, 29, 773, 3291, 6355, 11891, 6635, 99871, 177531}},
+{13746, 18, 5641, {1, 1, 7, 11, 9, 49, 85, 59, 211, 307, 1821, 3947, 4175, 11287, 27889, 107, 46463, 237129}},
+{13747, 18, 5649, {1, 3, 3, 7, 31, 31, 9, 49, 365, 189, 1211, 943, 337, 13809, 16941, 17053, 70125, 149865}},
+{13748, 18, 5656, {1, 3, 1, 13, 9, 21, 67, 1, 365, 77, 1701, 559, 3461, 8961, 13801, 16111, 65239, 157713}},
+{13749, 18, 5671, {1, 3, 7, 13, 19, 49, 29, 233, 361, 1011, 1617, 2989, 2387, 14027, 4021, 28791, 33155, 171449}},
+{13750, 18, 5689, {1, 1, 5, 13, 31, 19, 77, 69, 49, 513, 1411, 77, 4993, 907, 23483, 20129, 29491, 138187}},
+{13751, 18, 5721, {1, 3, 3, 11, 23, 33, 19, 55, 307, 455, 1783, 3997, 6411, 3355, 8815, 39883, 124381, 49667}},
+{13752, 18, 5731, {1, 3, 3, 15, 27, 7, 25, 243, 275, 27, 23, 3039, 6497, 15975, 5877, 58611, 6317, 209119}},
+{13753, 18, 5734, {1, 3, 1, 5, 7, 21, 97, 247, 297, 181, 773, 3095, 2441, 15683, 29609, 50431, 92813, 723}},
+{13754, 18, 5738, {1, 1, 1, 3, 17, 25, 69, 171, 27, 83, 173, 163, 7915, 13547, 5915, 20275, 101613, 225081}},
+{13755, 18, 5740, {1, 1, 7, 15, 19, 13, 53, 95, 171, 889, 131, 1979, 2537, 7749, 77, 49293, 68875, 159125}},
+{13756, 18, 5748, {1, 1, 1, 5, 11, 7, 7, 29, 397, 435, 1495, 2263, 3677, 11121, 1269, 5415, 44427, 249943}},
+{13757, 18, 5791, {1, 3, 1, 5, 23, 21, 13, 185, 231, 757, 1647, 663, 1273, 11641, 25563, 46793, 54231, 113143}},
+{13758, 18, 5801, {1, 3, 3, 7, 11, 21, 83, 109, 409, 923, 1541, 2805, 1781, 6903, 9093, 37327, 60923, 167271}},
+{13759, 18, 5807, {1, 3, 7, 5, 29, 37, 87, 85, 93, 749, 875, 2869, 1023, 13303, 26865, 30971, 40863, 237075}},
+{13760, 18, 5822, {1, 1, 7, 13, 21, 25, 39, 213, 303, 265, 1251, 2963, 3819, 8507, 23239, 52625, 123375, 58553}},
+{13761, 18, 5829, {1, 1, 1, 1, 3, 1, 7, 67, 339, 583, 3, 2489, 5481, 12241, 21695, 31351, 39389, 131925}},
+{13762, 18, 5834, {1, 1, 5, 11, 11, 3, 95, 23, 133, 415, 77, 1891, 4083, 7097, 26455, 28689, 83047, 49759}},
+{13763, 18, 5847, {1, 3, 7, 15, 19, 31, 65, 189, 489, 461, 1255, 1897, 3361, 12223, 9721, 45937, 102695, 113431}},
+{13764, 18, 5854, {1, 3, 1, 5, 9, 57, 3, 225, 241, 769, 1003, 2255, 7655, 4837, 25267, 35845, 49545, 24931}},
+{13765, 18, 5878, {1, 1, 1, 1, 1, 43, 3, 217, 397, 419, 1189, 2037, 5941, 4341, 19851, 13773, 15225, 167581}},
+{13766, 18, 5882, {1, 1, 1, 9, 3, 27, 65, 49, 115, 787, 1637, 1867, 7265, 8541, 1587, 58987, 82161, 19997}},
+{13767, 18, 5919, {1, 3, 7, 11, 17, 17, 93, 103, 309, 159, 781, 3179, 5759, 7661, 5693, 48531, 127375, 141449}},
+{13768, 18, 5947, {1, 3, 7, 5, 13, 39, 79, 241, 7, 137, 219, 523, 541, 4787, 23327, 41665, 111017, 118901}},
+{13769, 18, 5981, {1, 1, 3, 15, 31, 23, 107, 221, 295, 935, 1165, 2463, 1635, 10205, 18057, 28217, 51755, 85579}},
+{13770, 18, 5982, {1, 3, 1, 11, 23, 47, 7, 59, 75, 603, 1237, 2601, 6873, 12735, 32181, 46849, 106363, 171753}},
+{13771, 18, 6025, {1, 1, 7, 13, 15, 31, 3, 113, 355, 955, 919, 1807, 7903, 5485, 1733, 64759, 15817, 93829}},
+{13772, 18, 6028, {1, 1, 3, 15, 11, 33, 95, 67, 511, 971, 343, 41, 2849, 10695, 24487, 8971, 129279, 197635}},
+{13773, 18, 6039, {1, 3, 1, 13, 13, 47, 77, 127, 193, 191, 1185, 3321, 1685, 1421, 28675, 12593, 86689, 186763}},
+{13774, 18, 6056, {1, 3, 7, 13, 1, 11, 123, 91, 287, 751, 11, 2753, 7153, 5253, 21817, 10459, 122225, 105775}},
+{13775, 18, 6064, {1, 3, 3, 13, 1, 17, 121, 13, 391, 253, 1323, 1515, 2067, 8009, 5173, 59543, 109511, 156821}},
+{13776, 18, 6073, {1, 1, 5, 3, 7, 1, 119, 151, 281, 859, 675, 2923, 6627, 16071, 24653, 41325, 118413, 191981}},
+{13777, 18, 6081, {1, 3, 5, 3, 31, 17, 57, 255, 473, 455, 203, 173, 345, 1477, 27939, 39289, 105081, 136179}},
+{13778, 18, 6088, {1, 3, 3, 7, 1, 35, 29, 81, 337, 483, 951, 955, 4343, 14827, 17427, 59919, 81883, 114289}},
+{13779, 18, 6101, {1, 3, 5, 11, 3, 39, 49, 177, 335, 57, 173, 1827, 5729, 2689, 12109, 13247, 117559, 31735}},
+{13780, 18, 6139, {1, 3, 1, 3, 9, 9, 41, 97, 37, 897, 545, 2289, 7917, 5701, 21953, 1863, 33727, 28451}},
+{13781, 18, 6142, {1, 1, 5, 3, 29, 61, 59, 129, 387, 965, 285, 3503, 1651, 10423, 24861, 31853, 38491, 155187}},
+{13782, 18, 6194, {1, 3, 1, 13, 23, 33, 13, 161, 133, 29, 1073, 1491, 3687, 6821, 24153, 3675, 33771, 230087}},
+{13783, 18, 6199, {1, 1, 7, 7, 29, 23, 23, 55, 189, 203, 641, 3391, 1217, 3199, 32531, 43103, 24007, 85613}},
+{13784, 18, 6200, {1, 1, 1, 11, 7, 57, 117, 245, 467, 861, 1265, 2827, 2761, 2817, 15679, 53223, 47245, 139871}},
+{13785, 18, 6203, {1, 1, 3, 15, 25, 1, 125, 237, 489, 1003, 515, 1117, 4427, 4877, 8685, 46211, 19889, 82491}},
+{13786, 18, 6214, {1, 1, 3, 3, 25, 3, 63, 217, 485, 699, 161, 1459, 2973, 15949, 30681, 30991, 13933, 86505}},
+{13787, 18, 6238, {1, 1, 7, 9, 27, 57, 23, 217, 401, 613, 277, 2827, 7111, 2133, 17489, 62059, 7273, 170917}},
+{13788, 18, 6241, {1, 1, 3, 13, 7, 19, 39, 63, 203, 1001, 279, 879, 4293, 10121, 969, 11571, 96427, 218969}},
+{13789, 18, 6244, {1, 3, 7, 7, 5, 21, 113, 203, 77, 971, 1351, 1097, 2581, 7519, 16049, 10565, 5055, 241561}},
+{13790, 18, 6248, {1, 3, 3, 11, 1, 21, 93, 111, 221, 31, 1245, 1499, 2289, 2299, 23457, 49221, 68879, 125029}},
+{13791, 18, 6256, {1, 1, 7, 3, 15, 19, 57, 189, 243, 785, 399, 3147, 6107, 2327, 6275, 9993, 53051, 34053}},
+{13792, 18, 6266, {1, 3, 7, 15, 5, 63, 7, 193, 115, 579, 1987, 765, 7871, 14179, 26383, 61455, 14241, 123515}},
+{13793, 18, 6271, {1, 3, 7, 13, 19, 13, 91, 225, 295, 675, 1995, 1145, 4929, 5163, 1101, 60681, 76777, 146875}},
+{13794, 18, 6275, {1, 3, 7, 15, 21, 37, 57, 89, 297, 143, 717, 4021, 3259, 8869, 21189, 39333, 125045, 94469}},
+{13795, 18, 6295, {1, 1, 5, 9, 27, 35, 69, 121, 433, 39, 889, 915, 4055, 11479, 24757, 53455, 17503, 113295}},
+{13796, 18, 6315, {1, 1, 3, 3, 23, 19, 81, 191, 33, 865, 59, 603, 2819, 4919, 22495, 25089, 73905, 44971}},
+{13797, 18, 6364, {1, 3, 3, 11, 19, 45, 125, 229, 143, 167, 867, 671, 2225, 16099, 14909, 14937, 78063, 135143}},
+{13798, 18, 6368, {1, 1, 7, 11, 21, 55, 73, 247, 211, 895, 1147, 17, 2119, 3261, 19815, 28055, 50139, 178459}},
+{13799, 18, 6377, {1, 1, 3, 1, 19, 3, 37, 221, 243, 459, 1539, 3899, 4597, 5503, 23015, 57019, 62637, 177821}},
+{13800, 18, 6400, {1, 3, 1, 3, 9, 5, 91, 3, 319, 609, 1241, 3953, 5569, 8757, 6453, 8083, 55285, 38297}},
+{13801, 18, 6430, {1, 3, 5, 15, 9, 51, 37, 53, 137, 95, 123, 157, 15, 7421, 22469, 49787, 96245, 199309}},
+{13802, 18, 6477, {1, 3, 1, 1, 29, 61, 85, 211, 437, 1013, 1251, 61, 157, 4325, 24247, 1065, 24875, 31509}},
+{13803, 18, 6480, {1, 3, 1, 13, 7, 43, 13, 171, 53, 567, 77, 3781, 5077, 6691, 32485, 24253, 83919, 159371}},
+{13804, 18, 6490, {1, 1, 1, 13, 15, 15, 19, 53, 325, 309, 53, 1857, 7361, 8831, 31751, 44749, 109265, 227875}},
+{13805, 18, 6526, {1, 3, 7, 3, 31, 19, 113, 253, 361, 697, 1137, 2029, 3673, 10323, 10455, 24935, 7325, 43673}},
+{13806, 18, 6539, {1, 3, 1, 1, 17, 31, 3, 55, 121, 967, 1701, 2171, 4393, 11937, 3987, 5139, 68913, 134233}},
+{13807, 18, 6556, {1, 1, 7, 15, 23, 37, 121, 241, 297, 419, 373, 1219, 739, 4567, 28593, 61267, 95711, 201299}},
+{13808, 18, 6584, {1, 1, 1, 9, 23, 31, 101, 243, 163, 333, 1707, 2553, 5285, 12827, 5051, 14165, 505, 253585}},
+{13809, 18, 6598, {1, 1, 1, 9, 11, 29, 81, 45, 101, 235, 1079, 4091, 1069, 3439, 23599, 6699, 71783, 236943}},
+{13810, 18, 6601, {1, 3, 7, 11, 29, 49, 99, 59, 1, 267, 887, 2941, 6717, 7501, 22549, 53393, 34569, 34671}},
+{13811, 18, 6609, {1, 3, 1, 15, 23, 13, 113, 47, 11, 79, 989, 1025, 35, 10475, 8079, 33121, 32477, 178595}},
+{13812, 18, 6612, {1, 3, 7, 1, 21, 19, 51, 31, 393, 171, 553, 2221, 7017, 8567, 21803, 51803, 83737, 196409}},
+{13813, 18, 6645, {1, 1, 3, 3, 1, 27, 117, 207, 37, 733, 2001, 2575, 4849, 5609, 743, 35987, 109993, 227663}},
+{13814, 18, 6655, {1, 1, 7, 15, 29, 47, 85, 213, 335, 633, 849, 3269, 7723, 4651, 355, 54565, 58829, 22781}},
+{13815, 18, 6679, {1, 3, 7, 5, 5, 3, 91, 243, 17, 85, 1983, 3909, 1839, 10403, 503, 28451, 3221, 215397}},
+{13816, 18, 6683, {1, 1, 1, 15, 13, 3, 9, 25, 249, 113, 1619, 2313, 6461, 2323, 14319, 59635, 9569, 220583}},
+{13817, 18, 6719, {1, 3, 5, 7, 31, 59, 41, 43, 43, 921, 647, 2141, 7011, 2749, 24711, 19067, 107895, 107145}},
+{13818, 18, 6727, {1, 1, 3, 3, 15, 63, 41, 241, 181, 729, 843, 3569, 2645, 2727, 25331, 23067, 115421, 86025}},
+{13819, 18, 6734, {1, 3, 1, 15, 11, 47, 9, 183, 341, 775, 1067, 1317, 6835, 7873, 2653, 33517, 103979, 196761}},
+{13820, 18, 6770, {1, 1, 3, 13, 29, 11, 105, 9, 49, 823, 1343, 759, 1263, 12413, 26047, 54285, 57319, 215387}},
+{13821, 18, 6776, {1, 1, 5, 13, 21, 55, 75, 149, 63, 737, 1305, 929, 4149, 2793, 24505, 11541, 74765, 8207}},
+{13822, 18, 6791, {1, 3, 5, 9, 25, 1, 43, 157, 303, 395, 301, 1561, 5963, 3501, 2259, 59777, 100953, 16051}},
+{13823, 18, 6798, {1, 3, 1, 13, 19, 25, 33, 209, 11, 95, 655, 595, 3081, 10345, 26615, 45129, 84023, 158079}},
+{13824, 18, 6800, {1, 3, 1, 9, 31, 61, 103, 203, 471, 215, 1103, 759, 1197, 3333, 15859, 36103, 31563, 5987}},
+{13825, 18, 6826, {1, 1, 1, 7, 1, 49, 121, 227, 153, 793, 1723, 1033, 6875, 6683, 2503, 57213, 97967, 120383}},
+{13826, 18, 6833, {1, 3, 7, 11, 3, 15, 35, 181, 19, 249, 755, 1385, 3297, 4665, 2761, 22717, 126199, 85065}},
+{13827, 18, 6836, {1, 3, 7, 15, 5, 45, 17, 55, 111, 597, 553, 1203, 7183, 8465, 28523, 50073, 90889, 187205}},
+{13828, 18, 6858, {1, 3, 3, 9, 31, 57, 13, 139, 291, 881, 501, 2051, 617, 5151, 28225, 44777, 31645, 6805}},
+{13829, 18, 6882, {1, 3, 5, 13, 1, 23, 107, 1, 201, 35, 1673, 2281, 7663, 1115, 25061, 59615, 127955, 169685}},
+{13830, 18, 6901, {1, 1, 3, 15, 15, 5, 17, 75, 307, 591, 1661, 855, 4239, 13359, 20027, 51871, 35241, 32769}},
+{13831, 18, 6923, {1, 1, 1, 15, 5, 23, 59, 205, 223, 103, 1889, 141, 6157, 9187, 23571, 15267, 1941, 119173}},
+{13832, 18, 6967, {1, 3, 5, 9, 27, 63, 59, 11, 279, 493, 209, 4087, 1055, 9841, 31753, 37459, 27757, 213151}},
+{13833, 18, 6979, {1, 1, 3, 11, 31, 33, 13, 87, 285, 847, 2005, 3431, 253, 15157, 31359, 45303, 114337, 42541}},
+{13834, 18, 7022, {1, 1, 1, 7, 7, 3, 17, 203, 133, 321, 241, 1323, 5639, 10953, 10069, 4941, 17077, 54493}},
+{13835, 18, 7060, {1, 1, 7, 1, 9, 5, 125, 5, 421, 609, 645, 1927, 3785, 2295, 1491, 23019, 85497, 161231}},
+{13836, 18, 7064, {1, 3, 3, 11, 19, 35, 115, 95, 353, 773, 2025, 2621, 2821, 6361, 29589, 20989, 99645, 90387}},
+{13837, 18, 7083, {1, 3, 1, 15, 23, 3, 71, 253, 467, 307, 1109, 2695, 7175, 15087, 1587, 48229, 104307, 218905}},
+{13838, 18, 7093, {1, 3, 3, 5, 17, 29, 107, 153, 371, 205, 7, 597, 7393, 2345, 20149, 47417, 37983, 200683}},
+{13839, 18, 7094, {1, 1, 7, 1, 3, 55, 113, 117, 241, 923, 1217, 3825, 2635, 8007, 12673, 9533, 7121, 3825}},
+{13840, 18, 7120, {1, 1, 1, 3, 21, 63, 25, 111, 31, 151, 67, 3735, 7833, 749, 28743, 59291, 4989, 93329}},
+{13841, 18, 7125, {1, 3, 5, 13, 31, 5, 91, 153, 235, 1019, 431, 1951, 7501, 8483, 19625, 57789, 13203, 36693}},
+{13842, 18, 7142, {1, 1, 7, 3, 15, 51, 99, 29, 403, 343, 1903, 907, 3255, 4149, 29551, 18885, 74391, 96119}},
+{13843, 18, 7151, {1, 1, 7, 11, 31, 11, 63, 213, 437, 879, 359, 555, 7549, 14269, 31489, 51001, 76857, 237305}},
+{13844, 18, 7165, {1, 1, 1, 15, 23, 21, 31, 227, 311, 273, 253, 2439, 7217, 2191, 31743, 47669, 62279, 201305}},
+{13845, 18, 7173, {1, 3, 5, 11, 3, 43, 97, 121, 363, 91, 201, 1095, 5267, 633, 19111, 36099, 23035, 205655}},
+{13846, 18, 7188, {1, 3, 1, 9, 21, 31, 39, 11, 227, 699, 473, 2109, 2757, 13821, 31181, 40493, 57279, 260085}},
+{13847, 18, 7191, {1, 1, 5, 7, 27, 57, 65, 11, 173, 709, 1139, 3735, 5291, 16053, 32579, 25275, 79865, 196033}},
+{13848, 18, 7202, {1, 1, 1, 9, 19, 35, 83, 153, 287, 207, 593, 2177, 3243, 10433, 24583, 881, 71865, 250223}},
+{13849, 18, 7216, {1, 3, 3, 9, 3, 35, 107, 3, 193, 1011, 463, 1643, 2733, 2157, 6329, 24583, 116901, 226385}},
+{13850, 18, 7219, {1, 3, 1, 11, 3, 47, 39, 33, 495, 137, 1591, 1335, 1347, 4527, 389, 43341, 80163, 5219}},
+{13851, 18, 7267, {1, 3, 3, 5, 19, 51, 121, 135, 93, 891, 13, 1339, 5187, 5005, 12823, 14465, 73845, 119685}},
+{13852, 18, 7358, {1, 3, 7, 7, 19, 1, 57, 193, 325, 49, 813, 5, 4431, 1119, 13625, 43613, 127989, 42669}},
+{13853, 18, 7383, {1, 3, 5, 15, 11, 33, 7, 45, 215, 469, 1059, 4095, 3549, 11839, 5463, 21383, 4831, 188345}},
+{13854, 18, 7387, {1, 1, 1, 13, 5, 61, 7, 161, 99, 623, 1589, 1045, 2385, 8899, 19327, 41373, 109241, 111895}},
+{13855, 18, 7396, {1, 1, 5, 7, 11, 39, 115, 41, 21, 491, 1221, 2805, 4311, 7137, 3151, 1387, 24633, 94679}},
+{13856, 18, 7408, {1, 1, 3, 7, 3, 39, 71, 175, 443, 187, 1727, 2535, 5099, 1881, 21639, 5717, 48589, 95037}},
+{13857, 18, 7432, {1, 1, 1, 11, 25, 21, 37, 227, 407, 73, 721, 3515, 381, 981, 21389, 5205, 31851, 140457}},
+{13858, 18, 7462, {1, 3, 3, 3, 27, 35, 13, 129, 457, 315, 253, 2545, 5469, 6695, 25223, 20115, 38039, 133655}},
+{13859, 18, 7480, {1, 1, 3, 11, 21, 47, 77, 231, 87, 245, 2039, 2515, 2873, 1711, 3361, 62123, 67117, 239047}},
+{13860, 18, 7488, {1, 1, 7, 7, 29, 21, 39, 175, 477, 813, 447, 1109, 7391, 14631, 4437, 42539, 13003, 75403}},
+{13861, 18, 7497, {1, 3, 1, 11, 11, 9, 119, 19, 99, 483, 61, 1883, 3415, 2137, 30415, 34519, 115191, 24437}},
+{13862, 18, 7531, {1, 1, 1, 9, 7, 47, 115, 233, 419, 427, 1605, 3821, 6243, 10861, 28495, 48265, 80811, 147701}},
+{13863, 18, 7561, {1, 3, 5, 5, 11, 61, 51, 155, 279, 463, 31, 1559, 2837, 8795, 4049, 13651, 109227, 52131}},
+{13864, 18, 7582, {1, 1, 7, 9, 25, 33, 97, 79, 477, 83, 923, 3293, 6381, 3063, 23293, 35381, 82867, 233189}},
+{13865, 18, 7591, {1, 1, 1, 9, 11, 39, 109, 189, 219, 1021, 137, 2041, 2719, 1763, 31787, 29377, 96287, 179685}},
+{13866, 18, 7612, {1, 3, 7, 5, 3, 15, 37, 179, 77, 751, 709, 893, 7705, 1563, 7843, 29843, 1107, 35919}},
+{13867, 18, 7677, {1, 3, 3, 3, 29, 17, 123, 201, 275, 487, 1979, 1361, 7523, 13783, 10129, 16877, 127049, 163221}},
+{13868, 18, 7687, {1, 1, 1, 9, 27, 35, 69, 167, 509, 133, 1073, 3773, 265, 8455, 12341, 127, 115075, 94537}},
+{13869, 18, 7701, {1, 3, 7, 9, 13, 35, 57, 83, 123, 211, 739, 253, 3907, 5405, 3229, 46837, 77483, 5915}},
+{13870, 18, 7705, {1, 1, 7, 3, 7, 27, 71, 235, 133, 803, 611, 529, 4449, 16113, 8151, 36519, 34561, 36361}},
+{13871, 18, 7712, {1, 1, 3, 1, 31, 9, 123, 85, 407, 415, 353, 3239, 673, 4641, 25883, 61117, 7669, 240851}},
+{13872, 18, 7721, {1, 1, 5, 11, 29, 9, 49, 31, 3, 249, 1769, 3325, 503, 1397, 30677, 22515, 81279, 90309}},
+{13873, 18, 7736, {1, 3, 5, 3, 15, 63, 121, 253, 421, 279, 497, 3881, 6977, 11061, 5883, 38347, 8351, 118123}},
+{13874, 18, 7756, {1, 1, 1, 13, 1, 27, 3, 91, 281, 563, 1283, 1893, 7593, 12171, 27041, 7769, 95691, 13791}},
+{13875, 18, 7777, {1, 1, 3, 3, 29, 59, 87, 153, 337, 819, 787, 2631, 1889, 13869, 29237, 57097, 91621, 4011}},
+{13876, 18, 7783, {1, 1, 1, 15, 7, 49, 1, 83, 299, 353, 131, 1635, 3723, 16209, 1061, 50669, 68083, 133443}},
+{13877, 18, 7792, {1, 3, 5, 5, 27, 17, 5, 239, 285, 831, 1487, 721, 4891, 4265, 23753, 43921, 116709, 105027}},
+{13878, 18, 7797, {1, 1, 7, 7, 5, 35, 63, 97, 215, 447, 353, 495, 8119, 12537, 9679, 58641, 65057, 21999}},
+{13879, 18, 7802, {1, 3, 7, 5, 23, 43, 69, 115, 59, 603, 493, 1665, 5003, 13607, 28491, 4439, 11855, 228183}},
+{13880, 18, 7808, {1, 3, 3, 3, 15, 35, 19, 63, 241, 357, 979, 2891, 3105, 14085, 10539, 62335, 130903, 163153}},
+{13881, 18, 7866, {1, 3, 5, 3, 23, 51, 23, 193, 129, 171, 1913, 1025, 6397, 15657, 19611, 57455, 87531, 51039}},
+{13882, 18, 7885, {1, 1, 3, 9, 1, 9, 7, 239, 87, 527, 1401, 2703, 4021, 3845, 29269, 48217, 61091, 131949}},
+{13883, 18, 7891, {1, 3, 1, 5, 17, 45, 59, 223, 287, 295, 1959, 3985, 3671, 14605, 18949, 34147, 51251, 10271}},
+{13884, 18, 7913, {1, 3, 5, 9, 5, 49, 63, 105, 43, 157, 1827, 495, 5823, 6323, 6601, 51379, 64411, 204103}},
+{13885, 18, 7936, {1, 1, 7, 1, 11, 31, 117, 9, 13, 965, 177, 1247, 2487, 9849, 20367, 49287, 2193, 235689}},
+{13886, 18, 7946, {1, 1, 3, 11, 19, 31, 23, 215, 489, 657, 801, 3937, 379, 12083, 14969, 37857, 39027, 63985}},
+{13887, 18, 7963, {1, 1, 5, 1, 9, 59, 53, 187, 341, 65, 1251, 767, 4897, 13263, 17439, 26625, 122107, 163653}},
+{13888, 18, 7996, {1, 1, 3, 13, 31, 41, 125, 253, 481, 107, 233, 2305, 3321, 7303, 28585, 12787, 83307, 31497}},
+{13889, 18, 7999, {1, 1, 3, 13, 25, 41, 55, 83, 101, 115, 549, 531, 3085, 9497, 27989, 28257, 121075, 189671}},
+{13890, 18, 8011, {1, 3, 5, 11, 13, 53, 121, 85, 355, 275, 1925, 2117, 1349, 5903, 2041, 20963, 60803, 1121}},
+{13891, 18, 8014, {1, 1, 5, 5, 13, 7, 125, 63, 311, 187, 1127, 643, 6137, 845, 23945, 9403, 451, 53027}},
+{13892, 18, 8028, {1, 1, 3, 7, 19, 31, 27, 239, 337, 61, 641, 1693, 7289, 5675, 30067, 41091, 124607, 36971}},
+{13893, 18, 8047, {1, 3, 1, 13, 25, 61, 11, 81, 165, 129, 241, 711, 5193, 13017, 30821, 35239, 110809, 60909}},
+{13894, 18, 8077, {1, 3, 3, 13, 15, 13, 71, 19, 87, 499, 1395, 1191, 1445, 2687, 4691, 16773, 114269, 186237}},
+{13895, 18, 8101, {1, 3, 3, 15, 1, 49, 33, 109, 241, 5, 431, 461, 3865, 14029, 9827, 54455, 52159, 211585}},
+{13896, 18, 8119, {1, 3, 5, 7, 31, 27, 115, 113, 367, 591, 873, 1447, 6819, 7011, 14095, 55243, 4039, 226985}},
+{13897, 18, 8125, {1, 1, 7, 3, 1, 19, 69, 239, 417, 833, 1867, 3111, 2617, 12781, 5531, 17345, 75717, 139667}},
+{13898, 18, 8140, {1, 1, 5, 11, 11, 63, 23, 141, 221, 897, 1269, 2185, 6057, 8865, 20449, 58255, 27073, 158305}},
+{13899, 18, 8152, {1, 3, 3, 5, 23, 23, 121, 39, 457, 935, 691, 2329, 7055, 2821, 12669, 28713, 82321, 245783}},
+{13900, 18, 8209, {1, 1, 1, 9, 27, 9, 35, 23, 139, 823, 703, 917, 1281, 12155, 11681, 26083, 119445, 181489}},
+{13901, 18, 8212, {1, 1, 3, 7, 27, 21, 35, 243, 17, 633, 1665, 3419, 6301, 16099, 17477, 24983, 128455, 127501}},
+{13902, 18, 8231, {1, 3, 1, 1, 17, 19, 59, 165, 487, 985, 597, 689, 7103, 14475, 6985, 29755, 115977, 105943}},
+{13903, 18, 8258, {1, 1, 5, 5, 23, 41, 67, 175, 3, 571, 1501, 3315, 6111, 1847, 28975, 54117, 66605, 69997}},
+{13904, 18, 8275, {1, 3, 5, 5, 13, 37, 113, 75, 383, 297, 1187, 2055, 3433, 14651, 30393, 29647, 126403, 32265}},
+{13905, 18, 8303, {1, 1, 3, 5, 31, 29, 25, 169, 465, 219, 81, 2019, 4255, 6003, 7425, 53269, 31105, 211937}},
+{13906, 18, 8308, {1, 3, 7, 11, 13, 7, 11, 195, 327, 883, 1295, 3721, 1197, 7585, 5693, 993, 125017, 12007}},
+{13907, 18, 8312, {1, 3, 3, 7, 5, 37, 71, 37, 63, 651, 669, 3445, 3959, 249, 10599, 22329, 107701, 107729}},
+{13908, 18, 8345, {1, 1, 1, 9, 7, 47, 21, 181, 395, 345, 757, 481, 2759, 8157, 19847, 55743, 63137, 224765}},
+{13909, 18, 8346, {1, 3, 5, 9, 29, 3, 61, 35, 271, 157, 549, 843, 2907, 91, 16325, 4241, 94495, 78861}},
+{13910, 18, 8370, {1, 3, 1, 9, 17, 11, 53, 243, 49, 911, 1193, 793, 901, 3727, 21849, 33987, 565, 154171}},
+{13911, 18, 8402, {1, 1, 5, 1, 9, 5, 89, 81, 65, 111, 781, 3775, 591, 4987, 29833, 58159, 7253, 206447}},
+{13912, 18, 8411, {1, 3, 1, 7, 3, 59, 77, 83, 173, 545, 103, 2541, 8095, 10797, 11111, 62351, 88827, 55081}},
+{13913, 18, 8414, {1, 1, 3, 11, 29, 37, 19, 47, 145, 19, 513, 3269, 2205, 5317, 19207, 38051, 5413, 78089}},
+{13914, 18, 8424, {1, 1, 5, 9, 21, 57, 75, 249, 21, 879, 1377, 3407, 6123, 11917, 12493, 44873, 113539, 114717}},
+{13915, 18, 8435, {1, 3, 3, 9, 7, 55, 121, 57, 491, 39, 1561, 2625, 639, 13553, 1159, 43071, 68869, 248837}},
+{13916, 18, 8452, {1, 1, 1, 11, 25, 19, 107, 239, 171, 1001, 69, 4095, 49, 9569, 22613, 59865, 54959, 70031}},
+{13917, 18, 8462, {1, 1, 3, 13, 27, 15, 105, 205, 205, 581, 1965, 1535, 6531, 15935, 7623, 33695, 9317, 44257}},
+{13918, 18, 8479, {1, 1, 1, 3, 3, 51, 115, 185, 315, 763, 211, 339, 7083, 4895, 23277, 14165, 101731, 218903}},
+{13919, 18, 8509, {1, 1, 3, 13, 29, 1, 69, 55, 423, 781, 183, 1417, 151, 14507, 5217, 27757, 52447, 145913}},
+{13920, 18, 8515, {1, 3, 1, 11, 29, 39, 29, 151, 85, 387, 885, 507, 133, 9819, 12627, 30951, 79839, 206267}},
+{13921, 18, 8522, {1, 3, 3, 7, 1, 53, 99, 141, 91, 51, 143, 1751, 3989, 6811, 7339, 52141, 43473, 18615}},
+{13922, 18, 8541, {1, 3, 3, 15, 27, 11, 29, 37, 387, 655, 2019, 1135, 3619, 12995, 12755, 26063, 109419, 103875}},
+{13923, 18, 8560, {1, 3, 3, 13, 31, 15, 93, 231, 195, 261, 1055, 2363, 1123, 3927, 6907, 365, 27043, 157049}},
+{13924, 18, 8563, {1, 1, 1, 15, 7, 29, 105, 199, 507, 437, 117, 2963, 7801, 6291, 19261, 30377, 92205, 20723}},
+{13925, 18, 8585, {1, 1, 1, 9, 29, 19, 75, 189, 3, 387, 1491, 2291, 7739, 12993, 11835, 10873, 54583, 207963}},
+{13926, 18, 8594, {1, 3, 7, 3, 23, 11, 25, 105, 57, 713, 1291, 3293, 4693, 13859, 27541, 31529, 65929, 245143}},
+{13927, 18, 8596, {1, 1, 7, 7, 19, 13, 19, 189, 253, 337, 351, 1751, 6173, 12207, 24483, 31381, 82035, 157143}},
+{13928, 18, 8603, {1, 3, 3, 11, 11, 49, 117, 177, 301, 417, 855, 2433, 5619, 7339, 30361, 29251, 20411, 184981}},
+{13929, 18, 8610, {1, 1, 1, 1, 11, 55, 77, 99, 209, 781, 1193, 2841, 783, 1485, 19413, 52255, 19529, 253927}},
+{13930, 18, 8647, {1, 3, 1, 3, 15, 49, 85, 191, 389, 411, 479, 341, 4985, 6193, 19099, 11497, 103285, 162333}},
+{13931, 18, 8661, {1, 3, 1, 3, 11, 31, 71, 91, 357, 615, 2007, 3601, 5393, 8079, 16811, 54127, 26049, 116341}},
+{13932, 18, 8662, {1, 1, 3, 15, 9, 39, 121, 53, 43, 617, 905, 3629, 6327, 13453, 1435, 24113, 7523, 228523}},
+{13933, 18, 8672, {1, 3, 5, 11, 21, 51, 11, 125, 33, 935, 1069, 2807, 4951, 13261, 17611, 38779, 62203, 135759}},
+{13934, 18, 8690, {1, 1, 1, 13, 29, 59, 53, 245, 219, 423, 809, 1109, 7255, 14679, 25247, 43235, 129565, 72649}},
+{13935, 18, 8696, {1, 3, 5, 7, 27, 29, 119, 91, 297, 407, 187, 2829, 5637, 13851, 14073, 461, 64081, 33971}},
+{13936, 18, 8739, {1, 1, 5, 11, 15, 27, 29, 233, 487, 859, 1021, 3117, 1439, 16021, 31315, 35775, 117363, 131635}},
+{13937, 18, 8783, {1, 1, 5, 3, 3, 1, 91, 229, 327, 777, 393, 3853, 3455, 1785, 13749, 25173, 51575, 167237}},
+{13938, 18, 8811, {1, 3, 7, 9, 27, 7, 15, 71, 283, 71, 1783, 1357, 5581, 3143, 26075, 47751, 71001, 157107}},
+{13939, 18, 8813, {1, 3, 3, 7, 23, 9, 69, 21, 333, 223, 1735, 1057, 8091, 1927, 8507, 40901, 40233, 164115}},
+{13940, 18, 8821, {1, 3, 7, 3, 11, 49, 29, 81, 215, 289, 1137, 765, 6385, 5935, 3435, 11991, 30867, 60745}},
+{13941, 18, 8856, {1, 1, 1, 1, 7, 39, 33, 173, 225, 533, 1927, 3607, 1059, 8779, 2649, 6801, 103963, 167471}},
+{13942, 18, 8877, {1, 3, 3, 15, 27, 51, 107, 3, 195, 87, 739, 1425, 747, 1501, 22245, 59233, 124867, 79753}},
+{13943, 18, 8885, {1, 1, 3, 3, 13, 41, 125, 101, 225, 749, 221, 2735, 6441, 11353, 3943, 35329, 53437, 149063}},
+{13944, 18, 8897, {1, 3, 3, 15, 3, 53, 75, 77, 1, 907, 573, 1909, 363, 6913, 559, 58489, 1053, 25513}},
+{13945, 18, 8898, {1, 1, 7, 11, 7, 15, 91, 155, 447, 555, 473, 3625, 7529, 16307, 32241, 64077, 46943, 85717}},
+{13946, 18, 8934, {1, 1, 1, 13, 9, 61, 91, 41, 101, 107, 1081, 2511, 2881, 14095, 3861, 22771, 32687, 77287}},
+{13947, 18, 8955, {1, 3, 3, 7, 21, 3, 51, 177, 203, 861, 1507, 1177, 2369, 11735, 1667, 28607, 97671, 123263}},
+{13948, 18, 8972, {1, 1, 1, 3, 5, 57, 13, 127, 353, 65, 663, 3849, 3579, 5521, 11765, 63427, 76349, 102517}},
+{13949, 18, 8977, {1, 1, 7, 11, 27, 55, 79, 249, 397, 77, 1543, 3787, 4889, 11145, 18691, 62899, 66425, 116195}},
+{13950, 18, 9038, {1, 1, 1, 3, 5, 3, 1, 143, 73, 999, 2013, 2001, 4001, 6563, 30811, 61445, 2645, 203631}},
+{13951, 18, 9045, {1, 1, 1, 15, 1, 49, 35, 61, 493, 101, 1407, 2211, 7467, 12321, 15901, 15479, 62939, 14643}},
+{13952, 18, 9071, {1, 1, 3, 11, 21, 33, 123, 95, 449, 355, 1501, 1627, 1411, 6183, 17457, 2199, 96313, 25023}},
+{13953, 18, 9085, {1, 1, 5, 5, 13, 49, 73, 203, 83, 3, 137, 119, 3001, 10685, 18231, 60727, 31785, 158605}},
+{13954, 18, 9110, {1, 3, 1, 11, 23, 19, 123, 9, 269, 501, 2005, 3695, 3327, 5353, 12619, 12987, 18213, 29355}},
+{13955, 18, 9120, {1, 3, 1, 5, 1, 25, 99, 197, 327, 575, 773, 2009, 6653, 1807, 20381, 55725, 124359, 176893}},
+{13956, 18, 9157, {1, 1, 7, 15, 27, 9, 81, 175, 73, 727, 1907, 1237, 4983, 16123, 16479, 2283, 57805, 13593}},
+{13957, 18, 9164, {1, 1, 3, 13, 7, 13, 13, 139, 283, 721, 487, 1821, 4257, 5105, 8057, 27193, 46857, 169927}},
+{13958, 18, 9185, {1, 1, 5, 5, 29, 5, 81, 211, 441, 685, 981, 3097, 6253, 10673, 12253, 54943, 69401, 147769}},
+{13959, 18, 9203, {1, 3, 3, 1, 13, 35, 73, 145, 139, 781, 37, 803, 3607, 4327, 1153, 11325, 131025, 168729}},
+{13960, 18, 9235, {1, 3, 1, 13, 17, 41, 19, 59, 23, 561, 315, 719, 3325, 275, 12715, 59843, 16597, 81691}},
+{13961, 18, 9278, {1, 3, 1, 11, 1, 53, 11, 237, 363, 345, 331, 129, 6885, 3105, 12487, 53803, 8897, 193777}},
+{13962, 18, 9290, {1, 3, 7, 15, 3, 53, 55, 101, 389, 839, 413, 2851, 3989, 12857, 25723, 16595, 94145, 193049}},
+{13963, 18, 9292, {1, 3, 1, 7, 15, 31, 3, 115, 197, 753, 1035, 1369, 4925, 4497, 1641, 63743, 127089, 114097}},
+{13964, 18, 9319, {1, 3, 5, 5, 23, 1, 35, 99, 277, 769, 895, 581, 6969, 15339, 10309, 27101, 22611, 86179}},
+{13965, 18, 9334, {1, 1, 1, 11, 19, 17, 45, 35, 257, 313, 815, 1469, 3651, 15101, 22775, 51729, 75401, 123653}},
+{13966, 18, 9362, {1, 3, 1, 15, 5, 11, 83, 141, 373, 935, 1123, 1849, 1267, 15427, 10615, 63303, 109771, 188601}},
+{13967, 18, 9387, {1, 3, 5, 3, 29, 23, 79, 193, 261, 29, 1857, 789, 4359, 14211, 22181, 64901, 129089, 65587}},
+{13968, 18, 9404, {1, 3, 1, 3, 29, 15, 19, 239, 497, 771, 239, 2853, 2391, 8153, 31899, 53759, 127219, 78833}},
+{13969, 18, 9407, {1, 1, 7, 7, 5, 57, 9, 93, 69, 993, 193, 3629, 5761, 9339, 28073, 50035, 81635, 83119}},
+{13970, 18, 9410, {1, 1, 5, 13, 7, 35, 79, 247, 43, 1011, 1189, 2881, 1963, 8889, 9929, 50043, 112581, 224139}},
+{13971, 18, 9422, {1, 3, 3, 7, 15, 63, 85, 33, 107, 37, 45, 1271, 4735, 1151, 19793, 6589, 50875, 185061}},
+{13972, 18, 9478, {1, 3, 1, 15, 1, 63, 1, 201, 207, 179, 67, 3703, 2629, 10517, 1, 39645, 119733, 6449}},
+{13973, 18, 9512, {1, 3, 5, 1, 3, 7, 97, 101, 233, 71, 255, 3767, 8127, 8041, 25001, 7601, 129595, 131657}},
+{13974, 18, 9535, {1, 1, 7, 1, 25, 29, 105, 25, 267, 191, 267, 3141, 4445, 5043, 25203, 32055, 11035, 229031}},
+{13975, 18, 9604, {1, 1, 1, 13, 3, 1, 1, 147, 63, 259, 1171, 401, 6289, 13577, 28129, 1349, 85027, 178123}},
+{13976, 18, 9616, {1, 1, 1, 13, 1, 59, 109, 95, 49, 309, 1141, 1355, 3415, 11237, 21619, 12039, 1795, 57775}},
+{13977, 18, 9622, {1, 3, 1, 11, 19, 3, 51, 227, 277, 49, 703, 2701, 515, 8893, 20163, 65297, 114781, 225687}},
+{13978, 18, 9631, {1, 3, 7, 11, 19, 47, 121, 199, 173, 905, 1903, 1781, 2425, 13381, 25843, 23279, 87701, 10723}},
+{13979, 18, 9656, {1, 3, 1, 13, 7, 21, 17, 15, 85, 241, 119, 2361, 7921, 6077, 955, 34221, 78179, 35511}},
+{13980, 18, 9710, {1, 1, 7, 11, 9, 1, 1, 29, 445, 557, 241, 959, 6077, 3547, 30987, 48129, 79699, 236611}},
+{13981, 18, 9721, {1, 3, 1, 15, 13, 29, 57, 117, 347, 719, 1435, 307, 5209, 4009, 10517, 3373, 67667, 260101}},
+{13982, 18, 9728, {1, 1, 7, 13, 11, 41, 17, 143, 467, 993, 779, 3991, 623, 8915, 21615, 56477, 59721, 164241}},
+{13983, 18, 9733, {1, 1, 3, 7, 15, 37, 53, 33, 395, 547, 1815, 2517, 6575, 14035, 1, 10919, 25467, 117521}},
+{13984, 18, 9738, {1, 1, 3, 9, 17, 47, 45, 3, 509, 53, 1245, 883, 7917, 15445, 4169, 49637, 90933, 109469}},
+{13985, 18, 9774, {1, 3, 1, 3, 27, 37, 3, 95, 31, 665, 701, 1979, 3735, 3257, 18943, 41201, 95721, 69451}},
+{13986, 18, 9791, {1, 1, 1, 15, 19, 49, 61, 5, 115, 801, 805, 2723, 1387, 13165, 20717, 40767, 88857, 28207}},
+{13987, 18, 9803, {1, 1, 5, 9, 21, 25, 23, 179, 59, 29, 547, 1829, 4411, 6689, 22363, 43975, 52259, 187563}},
+{13988, 18, 9805, {1, 1, 5, 11, 13, 31, 97, 131, 135, 415, 53, 4015, 3629, 6613, 25541, 47221, 66483, 224545}},
+{13989, 18, 9817, {1, 3, 1, 11, 19, 13, 65, 95, 381, 759, 1319, 2997, 6321, 9203, 24483, 9925, 10799, 117119}},
+{13990, 18, 9823, {1, 3, 5, 13, 27, 17, 39, 225, 199, 125, 1125, 2673, 6787, 8861, 13139, 13849, 65459, 40183}},
+{13991, 18, 9839, {1, 1, 5, 3, 17, 55, 23, 75, 457, 959, 1507, 1267, 6857, 16141, 1889, 10779, 41331, 166075}},
+{13992, 18, 9847, {1, 3, 1, 15, 7, 55, 109, 59, 241, 431, 1281, 183, 1029, 14617, 4003, 41871, 36007, 129617}},
+{13993, 18, 9854, {1, 3, 1, 1, 27, 61, 79, 93, 217, 251, 671, 989, 7031, 10035, 15455, 13685, 95471, 997}},
+{13994, 18, 9863, {1, 1, 3, 13, 1, 5, 125, 179, 357, 537, 1303, 2653, 7319, 2075, 3861, 11743, 89659, 221705}},
+{13995, 18, 9872, {1, 1, 1, 7, 3, 55, 5, 201, 153, 639, 835, 1913, 3331, 10727, 30365, 15133, 67911, 17851}},
+{13996, 18, 9884, {1, 1, 3, 13, 21, 1, 67, 71, 265, 43, 279, 2009, 873, 4447, 32001, 50783, 76613, 63919}},
+{13997, 18, 9935, {1, 1, 3, 11, 17, 43, 19, 195, 233, 17, 1855, 1227, 3435, 4313, 6417, 51019, 130091, 124947}},
+{13998, 18, 9937, {1, 1, 7, 9, 19, 9, 95, 87, 297, 817, 1217, 3637, 2371, 7073, 387, 62121, 43507, 93927}},
+{13999, 18, 9974, {1, 3, 5, 13, 1, 15, 29, 123, 137, 425, 531, 2659, 2077, 1345, 2803, 49469, 29031, 170825}},
+{14000, 18, 9980, {1, 1, 5, 7, 15, 13, 119, 231, 139, 673, 1105, 2355, 3023, 4437, 17491, 47367, 12751, 183319}},
+{14001, 18, 10003, {1, 1, 5, 15, 19, 5, 125, 121, 509, 539, 473, 2087, 4421, 4205, 23457, 34481, 111231, 145035}},
+{14002, 18, 10015, {1, 3, 7, 5, 23, 21, 85, 23, 415, 715, 1579, 3447, 2373, 233, 19401, 54869, 15977, 138119}},
+{14003, 18, 10016, {1, 1, 3, 11, 21, 1, 37, 127, 101, 943, 79, 2119, 5679, 10749, 16209, 16715, 29421, 259735}},
+{14004, 18, 10066, {1, 3, 7, 7, 23, 25, 1, 73, 505, 979, 535, 87, 4165, 9353, 20075, 57597, 74651, 22133}},
+{14005, 18, 10093, {1, 1, 7, 3, 11, 19, 75, 213, 293, 15, 1981, 1259, 5455, 2897, 18861, 6317, 10339, 123967}},
+{14006, 18, 10118, {1, 3, 1, 3, 29, 5, 93, 169, 51, 519, 1649, 2789, 1251, 8359, 11489, 62443, 91549, 148357}},
+{14007, 18, 10132, {1, 3, 3, 13, 5, 47, 39, 163, 341, 755, 737, 2335, 2389, 8351, 26193, 58111, 18425, 129313}},
+{14008, 18, 10135, {1, 1, 3, 1, 31, 49, 101, 69, 345, 291, 1257, 1801, 1613, 1479, 4403, 21307, 44947, 68591}},
+{14009, 18, 10151, {1, 3, 3, 9, 5, 23, 65, 65, 187, 709, 883, 2199, 1037, 8679, 31527, 23561, 92225, 254215}},
+{14010, 18, 10158, {1, 3, 7, 7, 23, 13, 87, 209, 163, 705, 1199, 3007, 5469, 2453, 2691, 17841, 97045, 174149}},
+{14011, 18, 10169, {1, 1, 1, 9, 5, 35, 21, 91, 145, 559, 131, 3911, 1777, 8225, 6077, 58223, 100827, 3641}},
+{14012, 18, 10172, {1, 1, 5, 5, 7, 5, 31, 189, 117, 785, 1493, 3899, 471, 10971, 4607, 21063, 67225, 195367}},
+{14013, 18, 10180, {1, 1, 7, 5, 31, 61, 63, 163, 417, 655, 2033, 1255, 1139, 6867, 28655, 55295, 100519, 166629}},
+{14014, 18, 10187, {1, 3, 3, 3, 7, 35, 83, 55, 7, 607, 253, 915, 6801, 7505, 15929, 16829, 78469, 150947}},
+{14015, 18, 10189, {1, 3, 3, 9, 29, 3, 127, 235, 347, 3, 193, 1547, 8073, 14963, 20351, 28951, 53855, 261375}},
+{14016, 18, 10192, {1, 1, 7, 3, 31, 19, 75, 87, 23, 419, 75, 1677, 2371, 8875, 31993, 4465, 76085, 86499}},
+{14017, 18, 10197, {1, 3, 5, 7, 1, 51, 47, 161, 415, 521, 1099, 1295, 2545, 15167, 13983, 7347, 60631, 4089}},
+{14018, 18, 10211, {1, 1, 1, 9, 7, 59, 71, 187, 441, 273, 769, 2649, 3261, 12661, 23045, 32035, 104573, 120589}},
+{14019, 18, 10214, {1, 3, 7, 13, 23, 51, 113, 205, 443, 291, 475, 2961, 7615, 105, 22099, 6045, 22667, 65515}},
+{14020, 18, 10256, {1, 1, 5, 11, 1, 1, 23, 231, 413, 371, 1285, 2695, 2751, 4235, 15779, 1903, 24469, 259157}},
+{14021, 18, 10278, {1, 3, 3, 7, 7, 47, 87, 105, 311, 251, 573, 3221, 5757, 11107, 11161, 8809, 14467, 33153}},
+{14022, 18, 10290, {1, 1, 7, 1, 31, 49, 51, 31, 305, 315, 547, 1159, 2741, 3773, 13299, 40115, 62523, 108487}},
+{14023, 18, 10301, {1, 3, 1, 11, 11, 43, 33, 213, 107, 467, 1509, 4081, 4723, 2409, 1447, 42759, 64717, 161991}},
+{14024, 18, 10310, {1, 3, 7, 3, 31, 23, 25, 159, 95, 721, 1981, 3659, 4819, 10119, 25451, 10165, 31281, 238319}},
+{14025, 18, 10344, {1, 3, 1, 5, 19, 27, 67, 125, 481, 585, 43, 3697, 4997, 581, 6439, 33477, 115023, 51759}},
+{14026, 18, 10473, {1, 3, 7, 7, 15, 53, 89, 173, 369, 365, 91, 1583, 4611, 7189, 30383, 47397, 73657, 158695}},
+{14027, 18, 10474, {1, 1, 1, 15, 1, 21, 125, 13, 243, 729, 1397, 2451, 3233, 15593, 2815, 56215, 22685, 167343}},
+{14028, 18, 10482, {1, 3, 1, 13, 13, 29, 119, 223, 51, 695, 273, 2381, 4431, 4891, 29875, 49511, 111003, 174413}},
+{14029, 18, 10499, {1, 3, 3, 15, 9, 13, 19, 177, 371, 957, 255, 115, 4701, 6089, 7237, 17077, 87949, 3111}},
+{14030, 18, 10525, {1, 1, 7, 11, 29, 49, 59, 201, 145, 219, 1159, 3863, 715, 10489, 25883, 56445, 122103, 149877}},
+{14031, 18, 10532, {1, 3, 1, 13, 15, 51, 91, 109, 433, 45, 2045, 3121, 1109, 14713, 2667, 40463, 52185, 64743}},
+{14032, 18, 10535, {1, 3, 3, 7, 21, 31, 7, 155, 347, 305, 1557, 1311, 3315, 1363, 403, 62063, 114195, 44623}},
+{14033, 18, 10556, {1, 3, 5, 11, 9, 11, 11, 245, 49, 21, 239, 3043, 3525, 1055, 21891, 19153, 123689, 170195}},
+{14034, 18, 10568, {1, 1, 1, 11, 17, 51, 83, 249, 483, 489, 1063, 469, 6153, 15551, 13783, 27945, 103775, 68175}},
+{14035, 18, 10579, {1, 3, 3, 13, 11, 61, 107, 113, 503, 819, 1593, 2851, 6711, 14623, 3709, 10931, 8743, 62321}},
+{14036, 18, 10586, {1, 1, 5, 15, 5, 37, 23, 131, 329, 499, 1765, 1273, 819, 11573, 3307, 46933, 22087, 173459}},
+{14037, 18, 10609, {1, 1, 1, 3, 31, 5, 49, 57, 239, 981, 1863, 3233, 2727, 7389, 7923, 63259, 62873, 113607}},
+{14038, 18, 10612, {1, 1, 7, 7, 11, 27, 119, 137, 115, 211, 1239, 2153, 2579, 11501, 747, 31141, 129793, 151589}},
+{14039, 18, 10650, {1, 3, 3, 9, 9, 55, 121, 199, 91, 835, 521, 2433, 8123, 2045, 32553, 48993, 9935, 220537}},
+{14040, 18, 10665, {1, 3, 7, 11, 15, 57, 53, 145, 299, 623, 691, 1557, 785, 15851, 27075, 5983, 18043, 22241}},
+{14041, 18, 10685, {1, 1, 3, 1, 1, 57, 57, 195, 381, 913, 167, 333, 5541, 2323, 17001, 34817, 30795, 144051}},
+{14042, 18, 10686, {1, 3, 3, 3, 31, 1, 83, 31, 91, 855, 195, 3449, 8057, 11061, 29089, 1597, 127581, 189033}},
+{14043, 18, 10688, {1, 3, 1, 1, 21, 59, 113, 179, 13, 523, 629, 3693, 7155, 893, 17449, 46535, 18051, 9191}},
+{14044, 18, 10711, {1, 1, 1, 3, 27, 19, 75, 229, 181, 653, 1849, 501, 5871, 14769, 27461, 59193, 115013, 72227}},
+{14045, 18, 10728, {1, 3, 3, 13, 17, 41, 111, 107, 453, 299, 1699, 2871, 2955, 4215, 13919, 19785, 30339, 148445}},
+{14046, 18, 10748, {1, 3, 3, 11, 5, 19, 21, 87, 173, 439, 1651, 2393, 4137, 16285, 16093, 22953, 105663, 226575}},
+{14047, 18, 10751, {1, 3, 5, 7, 19, 61, 101, 251, 295, 89, 1695, 1359, 5797, 8587, 18753, 65223, 51079, 96169}},
+{14048, 18, 10781, {1, 1, 1, 5, 3, 1, 79, 63, 221, 601, 1385, 1963, 4601, 15217, 4861, 58295, 61043, 88523}},
+{14049, 18, 10805, {1, 3, 3, 7, 31, 63, 73, 177, 455, 487, 1009, 2103, 4753, 3143, 10121, 36509, 24753, 230869}},
+{14050, 18, 10823, {1, 1, 5, 1, 17, 27, 103, 63, 475, 665, 1189, 3513, 89, 2669, 1227, 20635, 121549, 248851}},
+{14051, 18, 10838, {1, 1, 3, 7, 25, 19, 117, 243, 337, 207, 903, 3751, 3309, 11955, 12651, 25359, 83419, 19701}},
+{14052, 18, 10857, {1, 1, 7, 15, 19, 21, 3, 235, 289, 185, 1175, 2291, 4003, 7753, 4775, 65321, 48957, 220261}},
+{14053, 18, 10865, {1, 3, 5, 11, 23, 21, 107, 65, 117, 329, 1085, 3555, 1183, 15241, 32663, 50985, 66753, 38023}},
+{14054, 18, 10872, {1, 1, 7, 9, 11, 49, 65, 17, 291, 435, 1221, 3829, 5467, 5181, 19891, 7091, 80673, 90495}},
+{14055, 18, 10893, {1, 1, 1, 15, 17, 47, 119, 173, 297, 477, 859, 3661, 8081, 8257, 20841, 55123, 11231, 193669}},
+{14056, 18, 10899, {1, 1, 7, 7, 27, 11, 119, 109, 199, 727, 1569, 3749, 4067, 11675, 30213, 58091, 64303, 92785}},
+{14057, 18, 10917, {1, 3, 7, 15, 15, 39, 101, 149, 299, 449, 1017, 723, 7731, 7929, 22465, 61583, 69851, 150507}},
+{14058, 18, 10935, {1, 3, 5, 15, 5, 13, 97, 127, 21, 673, 353, 3885, 5761, 11443, 10089, 23701, 85879, 42217}},
+{14059, 18, 11001, {1, 3, 1, 5, 27, 55, 31, 167, 69, 453, 925, 555, 5135, 2759, 27077, 14497, 94333, 108729}},
+{14060, 18, 11072, {1, 1, 7, 15, 11, 55, 9, 241, 55, 611, 149, 2605, 653, 1631, 15059, 6349, 12321, 124561}},
+{14061, 18, 11089, {1, 1, 1, 9, 3, 11, 95, 67, 443, 103, 1687, 2667, 4567, 4271, 15601, 27859, 4757, 53289}},
+{14062, 18, 11090, {1, 1, 5, 9, 23, 21, 1, 125, 105, 975, 1879, 1821, 5273, 7079, 25009, 10471, 29119, 73249}},
+{14063, 18, 11108, {1, 1, 7, 1, 31, 61, 17, 23, 485, 565, 1325, 1559, 4131, 751, 2071, 4719, 15925, 101207}},
+{14064, 18, 11117, {1, 1, 5, 5, 13, 53, 13, 93, 149, 139, 1429, 3605, 3545, 11193, 14139, 6093, 115727, 183105}},
+{14065, 18, 11136, {1, 1, 1, 7, 15, 37, 51, 77, 177, 967, 405, 563, 3047, 8499, 26787, 27609, 23613, 239679}},
+{14066, 18, 11148, {1, 1, 1, 5, 27, 37, 1, 129, 197, 133, 1329, 3673, 3143, 1059, 19209, 39027, 43787, 42821}},
+{14067, 18, 11153, {1, 3, 7, 5, 5, 47, 105, 121, 219, 777, 1569, 1359, 1955, 13207, 14895, 7829, 40499, 182911}},
+{14068, 18, 11181, {1, 3, 5, 7, 11, 41, 41, 155, 245, 383, 405, 2415, 5809, 5117, 31523, 16927, 76785, 113731}},
+{14069, 18, 11190, {1, 3, 3, 9, 9, 21, 13, 197, 409, 931, 305, 1129, 865, 12961, 5239, 35823, 82565, 226765}},
+{14070, 18, 11201, {1, 1, 5, 3, 17, 27, 59, 79, 359, 601, 979, 1355, 1657, 10479, 4741, 36391, 111527, 105139}},
+{14071, 18, 11204, {1, 3, 5, 9, 13, 43, 31, 1, 309, 723, 1049, 803, 1653, 2551, 26317, 49731, 67799, 129225}},
+{14072, 18, 11216, {1, 1, 5, 3, 1, 39, 95, 243, 499, 809, 1515, 981, 585, 7907, 16801, 43381, 117537, 99787}},
+{14073, 18, 11237, {1, 1, 5, 5, 25, 23, 15, 127, 33, 799, 647, 2923, 7805, 2681, 14773, 42751, 106861, 119657}},
+{14074, 18, 11259, {1, 3, 1, 1, 1, 47, 11, 179, 179, 659, 1061, 2511, 3601, 7107, 27887, 48427, 40559, 106043}},
+{14075, 18, 11279, {1, 1, 7, 11, 5, 33, 115, 195, 431, 383, 1571, 3485, 5741, 5775, 14891, 26389, 71723, 198861}},
+{14076, 18, 11282, {1, 1, 5, 5, 11, 55, 37, 57, 381, 607, 2017, 1981, 6113, 3771, 8827, 13335, 88587, 102791}},
+{14077, 18, 11304, {1, 1, 1, 11, 29, 23, 73, 149, 405, 581, 721, 281, 5315, 4675, 13013, 39003, 20335, 109855}},
+{14078, 18, 11312, {1, 1, 7, 15, 17, 57, 39, 51, 403, 979, 1543, 1235, 797, 5949, 26647, 15125, 33255, 152861}},
+{14079, 18, 11332, {1, 1, 5, 3, 25, 27, 7, 147, 257, 163, 1297, 2289, 693, 7771, 6341, 22323, 1653, 177669}},
+{14080, 18, 11341, {1, 1, 3, 9, 1, 39, 47, 231, 15, 705, 897, 3943, 6281, 6679, 21695, 29553, 39509, 83135}},
+{14081, 18, 11354, {1, 3, 3, 15, 17, 43, 15, 195, 31, 501, 529, 3117, 6031, 12101, 30687, 52465, 66171, 149591}},
+{14082, 18, 11356, {1, 1, 3, 5, 13, 17, 63, 41, 303, 671, 1225, 1761, 6159, 3203, 23611, 18309, 115027, 116325}},
+{14083, 18, 11365, {1, 1, 5, 13, 17, 5, 97, 155, 479, 525, 1403, 4063, 8167, 6443, 20627, 41399, 26897, 102841}},
+{14084, 18, 11377, {1, 3, 5, 9, 9, 27, 59, 177, 453, 659, 765, 431, 4209, 12679, 10719, 22473, 81597, 20057}},
+{14085, 18, 11417, {1, 3, 3, 1, 3, 37, 91, 97, 159, 845, 519, 2603, 6979, 6711, 29781, 53639, 103357, 111671}},
+{14086, 18, 11427, {1, 1, 3, 3, 25, 15, 27, 9, 503, 719, 153, 3071, 281, 5341, 32595, 13069, 6461, 160319}},
+{14087, 18, 11433, {1, 3, 3, 5, 29, 7, 119, 229, 117, 925, 465, 1703, 7277, 10631, 9429, 41011, 45181, 229239}},
+{14088, 18, 11434, {1, 1, 7, 7, 31, 63, 67, 55, 445, 39, 1363, 1369, 1061, 8555, 29263, 47341, 49563, 80445}},
+{14089, 18, 11439, {1, 1, 7, 1, 23, 23, 49, 205, 371, 101, 1963, 2763, 3475, 835, 20371, 51343, 9771, 69713}},
+{14090, 18, 11444, {1, 3, 3, 7, 3, 29, 7, 185, 511, 93, 1077, 3971, 2981, 16367, 12703, 36179, 47755, 42767}},
+{14091, 18, 11448, {1, 1, 1, 11, 27, 47, 43, 39, 129, 337, 1249, 3557, 2871, 13565, 19525, 46263, 49203, 148235}},
+{14092, 18, 11461, {1, 3, 5, 11, 19, 3, 83, 151, 425, 199, 847, 3751, 1729, 12457, 21819, 295, 53627, 17555}},
+{14093, 18, 11466, {1, 1, 3, 5, 7, 43, 21, 221, 93, 785, 1851, 3891, 2103, 5219, 31845, 58943, 42461, 160149}},
+{14094, 18, 11468, {1, 3, 5, 9, 25, 11, 43, 171, 445, 335, 1907, 3401, 815, 10341, 17779, 24895, 7727, 168143}},
+{14095, 18, 11473, {1, 3, 1, 5, 27, 25, 41, 13, 239, 233, 1861, 3409, 4325, 2227, 30197, 59329, 48501, 168799}},
+{14096, 18, 11489, {1, 3, 5, 13, 9, 55, 83, 185, 287, 83, 1545, 2803, 2177, 6195, 14455, 30541, 75731, 98915}},
+{14097, 18, 11499, {1, 3, 3, 5, 25, 19, 5, 203, 303, 703, 1861, 3867, 2683, 8223, 11107, 54785, 106053, 135543}},
+{14098, 18, 11516, {1, 1, 1, 13, 19, 7, 11, 197, 303, 541, 977, 2083, 4739, 7971, 2245, 11029, 77333, 16573}},
+{14099, 18, 11531, {1, 1, 1, 3, 11, 33, 77, 59, 283, 791, 365, 4027, 487, 10559, 4543, 58111, 91861, 102905}},
+{14100, 18, 11533, {1, 3, 7, 7, 15, 3, 19, 51, 339, 377, 929, 693, 1617, 14057, 7107, 27181, 7411, 202843}},
+{14101, 18, 11557, {1, 3, 3, 9, 19, 9, 73, 109, 333, 917, 1227, 2871, 4893, 11029, 5619, 27091, 9381, 213403}},
+{14102, 18, 11572, {1, 1, 1, 9, 9, 13, 77, 131, 163, 619, 169, 315, 1277, 13705, 16853, 1179, 86433, 135427}},
+{14103, 18, 11608, {1, 3, 5, 9, 15, 47, 57, 119, 325, 529, 893, 2395, 5159, 5481, 18689, 6457, 114733, 159999}},
+{14104, 18, 11635, {1, 3, 7, 5, 15, 9, 113, 235, 475, 93, 495, 2983, 2769, 5209, 7481, 49699, 46961, 246393}},
+{14105, 18, 11638, {1, 1, 7, 1, 5, 31, 113, 27, 359, 635, 955, 2795, 6289, 11621, 11059, 2259, 57443, 243143}},
+{14106, 18, 11644, {1, 3, 3, 13, 19, 33, 53, 141, 437, 415, 919, 1375, 2703, 13731, 31559, 14115, 50101, 85199}},
+{14107, 18, 11684, {1, 1, 7, 13, 27, 57, 111, 89, 89, 313, 1107, 4049, 2485, 269, 10197, 36995, 71381, 112795}},
+{14108, 18, 11702, {1, 1, 3, 7, 17, 23, 119, 123, 145, 213, 1273, 1707, 4005, 13815, 23495, 36359, 14391, 94287}},
+{14109, 18, 11740, {1, 1, 7, 1, 5, 49, 81, 193, 105, 1003, 413, 2975, 1725, 5647, 25447, 43501, 4431, 115489}},
+{14110, 18, 11749, {1, 3, 1, 5, 29, 13, 47, 37, 441, 955, 611, 853, 7225, 4959, 8739, 31703, 48095, 124085}},
+{14111, 18, 11754, {1, 1, 5, 15, 31, 9, 125, 53, 229, 631, 1031, 3923, 4417, 12637, 22093, 46985, 103417, 193443}},
+{14112, 18, 11764, {1, 1, 7, 1, 7, 9, 77, 11, 451, 615, 1259, 3097, 1513, 13641, 26845, 17399, 63661, 9231}},
+{14113, 18, 11767, {1, 1, 7, 13, 25, 47, 125, 1, 333, 599, 1133, 3527, 7451, 2849, 27227, 40015, 118185, 24737}},
+{14114, 18, 11784, {1, 1, 5, 5, 31, 15, 85, 37, 121, 677, 593, 2757, 739, 839, 3939, 36339, 116663, 955}},
+{14115, 18, 11789, {1, 3, 1, 11, 19, 13, 87, 109, 149, 215, 1811, 3813, 7699, 16189, 12841, 52081, 104545, 245819}},
+{14116, 18, 11795, {1, 1, 7, 3, 31, 17, 99, 23, 377, 131, 821, 1167, 4437, 15727, 20753, 8163, 43719, 7243}},
+{14117, 18, 11798, {1, 3, 7, 13, 21, 5, 5, 167, 9, 1009, 1013, 797, 6145, 2855, 19969, 59887, 3419, 238661}},
+{14118, 18, 11804, {1, 1, 7, 1, 5, 39, 47, 91, 185, 139, 959, 3149, 3423, 8909, 2045, 18187, 71935, 238605}},
+{14119, 18, 11818, {1, 3, 5, 11, 29, 63, 105, 43, 27, 221, 879, 181, 1499, 10343, 27135, 823, 4893, 101707}},
+{14120, 18, 11820, {1, 3, 5, 11, 5, 13, 59, 83, 315, 999, 1205, 939, 3661, 3081, 15551, 13791, 49027, 26843}},
+{14121, 18, 11860, {1, 1, 1, 5, 3, 57, 105, 169, 123, 463, 1471, 445, 743, 13353, 17661, 23437, 35451, 115919}},
+{14122, 18, 11869, {1, 1, 5, 11, 9, 3, 41, 63, 501, 861, 153, 1591, 1379, 5189, 24483, 8073, 43319, 248959}},
+{14123, 18, 11874, {1, 1, 7, 3, 29, 45, 51, 177, 1, 961, 1493, 2179, 3723, 1923, 1517, 44823, 81613, 194641}},
+{14124, 18, 11903, {1, 1, 5, 11, 17, 17, 61, 141, 5, 529, 379, 2509, 1487, 13141, 10877, 18603, 40569, 69639}},
+{14125, 18, 11916, {1, 1, 5, 15, 1, 15, 33, 219, 269, 557, 7, 3627, 183, 6975, 4627, 15235, 51863, 172393}},
+{14126, 18, 11927, {1, 3, 7, 9, 1, 37, 13, 75, 151, 153, 1693, 2835, 3093, 8847, 6721, 44135, 128931, 230745}},
+{14127, 18, 11933, {1, 1, 3, 13, 29, 63, 33, 153, 503, 137, 401, 2315, 2223, 10843, 4235, 37295, 103249, 183899}},
+{14128, 18, 11962, {1, 1, 7, 11, 15, 25, 49, 55, 39, 13, 269, 3119, 3445, 8265, 16781, 57239, 97489, 204841}},
+{14129, 18, 12009, {1, 1, 1, 1, 25, 57, 117, 199, 41, 351, 477, 1891, 7913, 14439, 25305, 64811, 57731, 184265}},
+{14130, 18, 12020, {1, 3, 3, 1, 13, 41, 33, 53, 381, 31, 1861, 2207, 1497, 15539, 23589, 53215, 36887, 134007}},
+{14131, 18, 12035, {1, 1, 5, 7, 15, 37, 13, 99, 17, 325, 643, 2943, 7967, 11531, 21301, 5125, 63201, 101203}},
+{14132, 18, 12041, {1, 1, 7, 11, 23, 21, 119, 151, 457, 929, 1917, 3123, 1133, 11861, 27889, 40421, 90949, 113237}},
+{14133, 18, 12049, {1, 3, 5, 9, 13, 35, 111, 83, 371, 589, 1507, 3559, 773, 5895, 31453, 40865, 124103, 250473}},
+{14134, 18, 12065, {1, 3, 3, 15, 11, 7, 93, 163, 285, 763, 2023, 1047, 3349, 13575, 22571, 21513, 56081, 204765}},
+{14135, 18, 12072, {1, 3, 3, 5, 19, 19, 47, 25, 49, 717, 1155, 3901, 407, 2699, 30961, 55647, 96043, 185559}},
+{14136, 18, 12098, {1, 1, 1, 7, 29, 1, 49, 87, 311, 435, 1235, 1041, 6595, 1639, 32495, 44245, 6593, 236331}},
+{14137, 18, 12100, {1, 3, 7, 9, 27, 13, 1, 41, 75, 953, 1635, 101, 7231, 13019, 14773, 17315, 120993, 111215}},
+{14138, 18, 12107, {1, 1, 5, 9, 23, 31, 87, 47, 83, 791, 1239, 1453, 5459, 4847, 7285, 32667, 45991, 103593}},
+{14139, 18, 12167, {1, 3, 1, 3, 27, 47, 97, 191, 5, 961, 1191, 3897, 6821, 4257, 22047, 31557, 52603, 251405}},
+{14140, 18, 12202, {1, 1, 5, 3, 23, 45, 103, 115, 287, 47, 93, 2761, 6467, 14031, 21881, 31631, 47605, 237635}},
+{14141, 18, 12207, {1, 3, 7, 15, 23, 41, 63, 239, 115, 655, 1949, 1969, 3145, 91, 16735, 49295, 117995, 40537}},
+{14142, 18, 12233, {1, 1, 7, 11, 5, 25, 99, 247, 11, 707, 1497, 785, 6055, 8521, 12179, 56363, 110131, 55449}},
+{14143, 18, 12269, {1, 1, 1, 7, 5, 31, 99, 7, 285, 281, 1207, 1173, 7637, 9595, 31413, 16597, 96157, 39059}},
+{14144, 18, 12290, {1, 3, 7, 7, 3, 49, 79, 69, 57, 523, 65, 2785, 2907, 11295, 16199, 25845, 51801, 67417}},
+{14145, 18, 12304, {1, 1, 3, 1, 1, 53, 57, 117, 1, 927, 1787, 3059, 7441, 14663, 10881, 2225, 29375, 93717}},
+{14146, 18, 12314, {1, 1, 5, 5, 29, 17, 67, 35, 475, 367, 155, 3463, 2339, 6239, 31073, 56169, 130309, 28981}},
+{14147, 18, 12340, {1, 1, 1, 5, 7, 53, 61, 105, 355, 817, 869, 2863, 6041, 11459, 4151, 61115, 100689, 32917}},
+{14148, 18, 12416, {1, 3, 5, 11, 31, 11, 33, 105, 437, 767, 101, 2979, 3911, 4859, 15551, 23545, 10705, 6271}},
+{14149, 18, 12425, {1, 1, 7, 5, 1, 17, 109, 205, 409, 893, 889, 2181, 6167, 14273, 25389, 50279, 5497, 191755}},
+{14150, 18, 12428, {1, 3, 7, 15, 29, 11, 79, 101, 123, 399, 1159, 1263, 3513, 13169, 2199, 41057, 98639, 227107}},
+{14151, 18, 12446, {1, 1, 3, 11, 13, 31, 51, 119, 257, 829, 337, 3267, 7673, 15459, 26681, 4041, 89429, 198607}},
+{14152, 18, 12462, {1, 3, 7, 11, 23, 29, 49, 159, 327, 415, 857, 2411, 2429, 11839, 20263, 61813, 31811, 225443}},
+{14153, 18, 12476, {1, 1, 3, 11, 7, 61, 61, 119, 431, 299, 1815, 2857, 7605, 7517, 15137, 13727, 73021, 199325}},
+{14154, 18, 12496, {1, 1, 7, 3, 5, 19, 51, 19, 59, 637, 591, 2999, 5997, 13487, 807, 4887, 112189, 226597}},
+{14155, 18, 12511, {1, 1, 1, 13, 21, 5, 55, 167, 463, 679, 891, 3597, 785, 7717, 17495, 51681, 55957, 48561}},
+{14156, 18, 12518, {1, 1, 5, 5, 9, 55, 55, 143, 193, 839, 785, 1713, 7457, 11591, 15803, 2479, 124663, 72631}},
+{14157, 18, 12530, {1, 3, 5, 9, 21, 27, 109, 91, 483, 905, 1369, 2573, 7173, 13977, 20131, 17637, 127477, 66457}},
+{14158, 18, 12532, {1, 1, 5, 7, 31, 17, 43, 153, 505, 413, 867, 769, 6947, 10815, 18805, 5957, 27715, 24529}},
+{14159, 18, 12539, {1, 3, 5, 9, 13, 41, 107, 199, 69, 1019, 2037, 3221, 1081, 15051, 6713, 46379, 17223, 85453}},
+{14160, 18, 12567, {1, 3, 3, 7, 23, 51, 45, 133, 227, 373, 1815, 3795, 5567, 7153, 25003, 64951, 75377, 174115}},
+{14161, 18, 12597, {1, 1, 7, 15, 7, 51, 33, 239, 113, 133, 1213, 327, 4841, 11297, 1093, 40013, 60843, 99845}},
+{14162, 18, 12601, {1, 1, 1, 11, 3, 37, 33, 107, 275, 747, 1451, 1787, 5029, 3101, 11575, 36555, 46181, 221643}},
+{14163, 18, 12602, {1, 1, 3, 3, 29, 53, 57, 67, 209, 153, 345, 2897, 5657, 8907, 14159, 9899, 102487, 237721}},
+{14164, 18, 12622, {1, 3, 1, 7, 7, 59, 17, 151, 423, 903, 2035, 861, 1057, 2399, 28547, 3659, 29583, 100651}},
+{14165, 18, 12693, {1, 1, 5, 15, 27, 53, 101, 17, 405, 869, 1253, 1923, 999, 7787, 23621, 4351, 48611, 47129}},
+{14166, 18, 12707, {1, 3, 7, 11, 13, 43, 61, 161, 43, 831, 2021, 579, 5353, 12451, 32261, 39885, 90051, 34407}},
+{14167, 18, 12713, {1, 1, 1, 5, 25, 19, 37, 33, 37, 59, 1399, 1587, 1517, 4261, 31215, 33777, 50447, 87049}},
+{14168, 18, 12716, {1, 1, 3, 1, 19, 17, 113, 31, 385, 135, 143, 3997, 1365, 2625, 22591, 8887, 31353, 240603}},
+{14169, 18, 12734, {1, 3, 7, 11, 21, 7, 55, 171, 233, 1007, 1321, 2903, 2457, 3941, 19667, 49115, 99119, 185989}},
+{14170, 18, 12763, {1, 3, 7, 9, 3, 31, 83, 99, 303, 443, 99, 2285, 1491, 15897, 21735, 1575, 74449, 59615}},
+{14171, 18, 12765, {1, 3, 1, 5, 29, 37, 125, 213, 277, 115, 255, 137, 6071, 13561, 23871, 48129, 120211, 168603}},
+{14172, 18, 12799, {1, 1, 7, 3, 9, 21, 93, 239, 399, 21, 9, 409, 3403, 9517, 6421, 17121, 65697, 251985}},
+{14173, 18, 12843, {1, 1, 1, 15, 27, 35, 17, 113, 471, 357, 1703, 871, 1803, 3495, 27437, 48343, 86425, 155245}},
+{14174, 18, 12853, {1, 3, 7, 11, 19, 45, 51, 195, 345, 77, 1403, 2527, 3405, 14057, 31965, 17375, 35107, 246545}},
+{14175, 18, 12865, {1, 3, 5, 7, 7, 5, 115, 39, 51, 261, 1883, 1793, 3423, 3613, 20399, 27267, 99875, 119719}},
+{14176, 18, 12866, {1, 3, 3, 9, 21, 23, 65, 69, 261, 79, 151, 3387, 7789, 13275, 30135, 52229, 40787, 181297}},
+{14177, 18, 12919, {1, 1, 5, 13, 19, 49, 111, 125, 433, 99, 1673, 2091, 5447, 9377, 9085, 4659, 75121, 105809}},
+{14178, 18, 12926, {1, 3, 7, 1, 3, 27, 107, 109, 245, 431, 1727, 3269, 2099, 10777, 21843, 63377, 47343, 126269}},
+{14179, 18, 12936, {1, 3, 1, 15, 7, 17, 107, 153, 37, 287, 1873, 573, 5025, 3735, 32545, 35693, 38083, 89569}},
+{14180, 18, 12944, {1, 3, 1, 3, 9, 51, 99, 247, 45, 703, 1231, 1895, 6309, 12137, 14697, 25441, 129701, 198811}},
+{14181, 18, 12959, {1, 3, 3, 11, 5, 43, 1, 31, 359, 563, 1013, 3475, 3935, 7855, 10085, 15279, 25109, 225643}},
+{14182, 18, 12965, {1, 3, 3, 3, 9, 47, 49, 193, 223, 23, 391, 847, 7233, 14955, 10645, 50535, 5415, 119791}},
+{14183, 18, 12980, {1, 3, 1, 7, 3, 7, 57, 189, 219, 287, 401, 1767, 5585, 13983, 18485, 56725, 71905, 33779}},
+{14184, 18, 13004, {1, 3, 5, 15, 23, 17, 115, 223, 35, 263, 345, 3459, 857, 1467, 30255, 50127, 72985, 62509}},
+{14185, 18, 13016, {1, 3, 1, 9, 3, 27, 125, 43, 47, 183, 1421, 319, 4273, 10701, 21761, 23947, 22531, 10855}},
+{14186, 18, 13019, {1, 1, 3, 15, 13, 55, 77, 1, 295, 841, 1115, 4093, 7993, 13309, 24851, 35411, 105201, 188543}},
+{14187, 18, 13037, {1, 3, 3, 5, 19, 39, 101, 19, 225, 997, 1999, 407, 3147, 15393, 30379, 26221, 21685, 114167}},
+{14188, 18, 13055, {1, 3, 3, 3, 23, 15, 3, 57, 45, 381, 47, 1839, 5491, 6775, 18477, 51443, 757, 183111}},
+{14189, 18, 13063, {1, 3, 3, 7, 31, 27, 107, 229, 1, 977, 125, 1137, 4873, 14381, 8705, 64641, 38447, 239887}},
+{14190, 18, 13098, {1, 1, 3, 13, 9, 35, 49, 187, 459, 407, 1677, 2007, 1091, 12385, 8911, 38221, 108681, 171641}},
+{14191, 18, 13103, {1, 1, 3, 5, 7, 61, 115, 155, 437, 829, 1041, 2191, 1489, 1269, 27613, 48713, 40095, 206057}},
+{14192, 18, 13106, {1, 3, 7, 1, 23, 1, 17, 215, 363, 119, 845, 987, 5619, 5857, 11307, 63171, 76921, 201767}},
+{14193, 18, 13115, {1, 1, 7, 9, 29, 23, 63, 247, 37, 199, 103, 1215, 913, 12865, 24089, 35101, 117677, 261393}},
+{14194, 18, 13143, {1, 1, 1, 1, 3, 19, 7, 159, 183, 275, 467, 3629, 6575, 3351, 26955, 29247, 119007, 67895}},
+{14195, 18, 13144, {1, 1, 7, 13, 1, 33, 31, 211, 103, 495, 417, 817, 7129, 10169, 11445, 41511, 73101, 185357}},
+{14196, 18, 13153, {1, 1, 3, 5, 3, 27, 99, 1, 425, 295, 131, 835, 1833, 4547, 8777, 29489, 60303, 191437}},
+{14197, 18, 13171, {1, 1, 5, 5, 31, 63, 71, 189, 317, 61, 385, 891, 2257, 8281, 17325, 12207, 125847, 28259}},
+{14198, 18, 13184, {1, 1, 3, 3, 19, 19, 97, 83, 495, 551, 1339, 1699, 3047, 13623, 27731, 28999, 101225, 146139}},
+{14199, 18, 13193, {1, 3, 5, 7, 25, 9, 37, 73, 239, 47, 583, 3337, 1329, 79, 30109, 12451, 10163, 62943}},
+{14200, 18, 13199, {1, 1, 3, 1, 9, 1, 31, 181, 231, 441, 1241, 233, 6049, 2401, 9867, 58911, 20599, 26321}},
+{14201, 18, 13207, {1, 3, 1, 15, 21, 43, 21, 43, 273, 865, 79, 2069, 3375, 16069, 12355, 56355, 9735, 243719}},
+{14202, 18, 13217, {1, 3, 5, 11, 13, 21, 5, 73, 423, 761, 1947, 2935, 3931, 5573, 83, 58251, 113115, 245767}},
+{14203, 18, 13227, {1, 3, 7, 7, 15, 49, 73, 211, 309, 635, 1257, 2185, 7151, 11959, 26885, 45955, 103503, 161709}},
+{14204, 18, 13232, {1, 3, 1, 15, 31, 53, 29, 35, 343, 87, 1833, 2483, 1847, 4709, 6105, 21961, 106541, 46741}},
+{14205, 18, 13276, {1, 1, 7, 7, 21, 43, 41, 51, 29, 521, 713, 3693, 483, 11777, 10453, 43691, 97585, 133193}},
+{14206, 18, 13283, {1, 3, 3, 11, 5, 45, 3, 179, 183, 255, 1291, 1795, 5721, 10911, 18395, 64349, 23141, 99481}},
+{14207, 18, 13307, {1, 1, 1, 5, 5, 25, 61, 169, 475, 953, 617, 559, 5945, 16377, 30063, 30079, 83305, 81745}},
+{14208, 18, 13317, {1, 1, 5, 11, 29, 59, 113, 37, 153, 807, 135, 2639, 4535, 7079, 6387, 63523, 89669, 198803}},
+{14209, 18, 13330, {1, 1, 7, 7, 19, 23, 71, 51, 165, 733, 1427, 2473, 331, 5027, 9299, 20617, 126775, 91619}},
+{14210, 18, 13345, {1, 3, 5, 7, 31, 35, 117, 235, 29, 677, 1243, 281, 6287, 535, 4783, 37781, 130929, 14193}},
+{14211, 18, 13363, {1, 1, 5, 3, 25, 1, 29, 109, 289, 631, 41, 361, 5537, 9657, 7475, 63749, 50325, 169791}},
+{14212, 18, 13387, {1, 3, 3, 15, 21, 53, 85, 43, 341, 907, 475, 3257, 2541, 10397, 30847, 63681, 121427, 192135}},
+{14213, 18, 13426, {1, 1, 1, 1, 9, 59, 59, 233, 335, 345, 1749, 4007, 1833, 7789, 21015, 48939, 15967, 201321}},
+{14214, 18, 13428, {1, 1, 1, 5, 11, 9, 101, 243, 391, 1003, 1019, 311, 3707, 10223, 21627, 8237, 53861, 159785}},
+{14215, 18, 13431, {1, 3, 7, 15, 5, 3, 109, 197, 507, 947, 833, 1161, 4021, 5575, 8081, 45381, 112597, 70407}},
+{14216, 18, 13489, {1, 1, 3, 1, 7, 63, 63, 53, 481, 1003, 43, 2503, 2303, 12593, 21403, 2965, 5377, 91491}},
+{14217, 18, 13501, {1, 1, 1, 1, 29, 45, 49, 73, 253, 197, 1245, 1509, 4747, 6207, 28321, 59193, 112687, 83719}},
+{14218, 18, 13533, {1, 1, 7, 3, 11, 51, 23, 83, 185, 643, 1427, 227, 2261, 12521, 27033, 5129, 53111, 34975}},
+{14219, 18, 13589, {1, 1, 7, 3, 5, 41, 55, 175, 447, 603, 723, 2141, 1189, 4921, 16905, 2463, 83641, 247241}},
+{14220, 18, 13600, {1, 3, 3, 13, 5, 11, 95, 59, 391, 319, 1675, 329, 7559, 11585, 28905, 27843, 106667, 15531}},
+{14221, 18, 13603, {1, 3, 3, 3, 27, 17, 103, 115, 447, 657, 267, 2541, 665, 7819, 4155, 32191, 60999, 48737}},
+{14222, 18, 13623, {1, 1, 5, 7, 7, 49, 87, 171, 457, 149, 1699, 4081, 3913, 7889, 29517, 3339, 33139, 8925}},
+{14223, 18, 13665, {1, 1, 1, 9, 11, 51, 87, 115, 429, 505, 1665, 2361, 5811, 1621, 12727, 33703, 52255, 93835}},
+{14224, 18, 13672, {1, 3, 3, 5, 27, 11, 35, 49, 281, 607, 1791, 4065, 5103, 5253, 975, 20353, 38253, 139363}},
+{14225, 18, 13675, {1, 1, 5, 9, 29, 15, 37, 141, 445, 751, 1219, 2217, 7207, 14981, 21113, 3313, 107127, 135567}},
+{14226, 18, 13708, {1, 3, 3, 15, 1, 41, 23, 27, 167, 609, 913, 631, 923, 6939, 9793, 57869, 126577, 145271}},
+{14227, 18, 13713, {1, 1, 3, 7, 27, 47, 127, 5, 213, 575, 559, 2541, 3457, 2903, 19529, 53395, 105353, 212607}},
+{14228, 18, 13720, {1, 3, 1, 13, 27, 41, 31, 111, 371, 1019, 241, 2075, 2571, 10739, 28163, 16093, 41127, 69783}},
+{14229, 18, 13730, {1, 1, 5, 1, 21, 9, 15, 141, 287, 675, 1721, 2291, 6587, 7503, 6363, 9109, 33547, 259627}},
+{14230, 18, 13735, {1, 3, 7, 3, 3, 53, 7, 153, 183, 761, 191, 3735, 2619, 11153, 19601, 33855, 82345, 72755}},
+{14231, 18, 13767, {1, 3, 1, 9, 19, 21, 41, 105, 281, 833, 981, 2733, 7179, 14691, 18365, 56283, 53719, 191601}},
+{14232, 18, 13773, {1, 1, 7, 11, 23, 1, 55, 213, 105, 517, 809, 4087, 825, 7011, 15701, 54047, 123831, 49833}},
+{14233, 18, 13792, {1, 1, 7, 13, 27, 9, 111, 57, 357, 95, 1489, 887, 5273, 2833, 8757, 9371, 44637, 94939}},
+{14234, 18, 13843, {1, 1, 3, 5, 1, 17, 43, 31, 509, 353, 401, 1077, 7567, 9657, 15065, 32017, 8491, 214477}},
+{14235, 18, 13891, {1, 1, 1, 15, 7, 59, 41, 99, 101, 845, 1479, 2153, 4281, 12839, 237, 54095, 125873, 57165}},
+{14236, 18, 13946, {1, 3, 7, 13, 5, 17, 1, 249, 309, 351, 709, 3943, 7775, 6449, 26611, 54019, 121015, 213535}},
+{14237, 18, 13967, {1, 1, 1, 5, 7, 25, 33, 149, 291, 777, 161, 2729, 117, 4999, 16781, 23383, 85161, 71689}},
+{14238, 18, 13976, {1, 1, 3, 11, 5, 63, 119, 165, 45, 135, 1723, 811, 1259, 11055, 28625, 37559, 128401, 100715}},
+{14239, 18, 14017, {1, 3, 7, 1, 1, 39, 11, 255, 423, 289, 1359, 2827, 4637, 4089, 26659, 58701, 117403, 133971}},
+{14240, 18, 14030, {1, 1, 7, 1, 25, 9, 127, 121, 147, 831, 17, 3521, 1535, 10931, 17305, 56671, 22425, 157341}},
+{14241, 18, 14041, {1, 3, 1, 15, 5, 55, 95, 95, 169, 497, 739, 2031, 339, 13461, 20619, 24553, 81805, 90789}},
+{14242, 18, 14054, {1, 1, 7, 7, 7, 19, 15, 203, 287, 673, 1033, 3857, 2761, 10835, 11039, 62329, 37893, 6119}},
+{14243, 18, 14058, {1, 1, 3, 11, 19, 35, 55, 9, 399, 443, 583, 89, 2387, 747, 9551, 9907, 96871, 175457}},
+{14244, 18, 14060, {1, 1, 3, 1, 11, 57, 121, 89, 491, 133, 545, 683, 5751, 839, 25975, 44725, 59863, 142671}},
+{14245, 18, 14063, {1, 1, 3, 1, 23, 1, 111, 177, 1, 103, 1933, 2783, 6857, 51, 14547, 5945, 14757, 39783}},
+{14246, 18, 14078, {1, 3, 7, 13, 25, 13, 51, 247, 325, 361, 1225, 15, 1929, 1729, 25293, 59495, 82111, 101809}},
+{14247, 18, 14080, {1, 3, 3, 1, 19, 37, 67, 85, 105, 589, 1273, 2995, 8017, 1613, 22189, 2549, 22671, 72813}},
+{14248, 18, 14089, {1, 3, 7, 9, 15, 41, 25, 43, 411, 663, 387, 2861, 3627, 5839, 733, 53479, 76241, 116763}},
+{14249, 18, 14131, {1, 3, 3, 3, 17, 5, 73, 153, 133, 247, 881, 2853, 6059, 2259, 10181, 63251, 107089, 22579}},
+{14250, 18, 14134, {1, 3, 1, 5, 11, 15, 17, 235, 23, 15, 521, 235, 4137, 12705, 24775, 18197, 56295, 28035}},
+{14251, 18, 14137, {1, 3, 5, 5, 13, 9, 77, 69, 19, 755, 1663, 1499, 1049, 12935, 28835, 55413, 71511, 221223}},
+{14252, 18, 14188, {1, 1, 1, 1, 27, 31, 21, 39, 197, 519, 1621, 3703, 2541, 8865, 21947, 53605, 114551, 205697}},
+{14253, 18, 14215, {1, 1, 1, 13, 11, 53, 41, 245, 495, 275, 385, 3071, 1913, 11135, 8571, 58551, 39049, 5459}},
+{14254, 18, 14222, {1, 3, 5, 5, 11, 63, 25, 173, 57, 441, 1749, 79, 3191, 7733, 13111, 23453, 118399, 101845}},
+{14255, 18, 14249, {1, 1, 3, 11, 29, 25, 119, 39, 65, 623, 517, 1325, 5981, 8381, 32031, 25585, 105537, 214241}},
+{14256, 18, 14292, {1, 3, 5, 9, 21, 43, 13, 69, 109, 311, 1893, 1941, 2491, 7815, 4067, 56749, 33761, 191145}},
+{14257, 18, 14320, {1, 1, 1, 7, 9, 5, 123, 149, 65, 729, 1967, 3089, 3757, 2333, 24587, 36047, 118105, 146277}},
+{14258, 18, 14339, {1, 3, 7, 13, 9, 35, 39, 219, 161, 93, 275, 3619, 353, 14595, 24673, 54753, 117175, 81891}},
+{14259, 18, 14346, {1, 3, 3, 13, 15, 61, 95, 135, 271, 595, 1103, 877, 747, 2535, 7733, 25509, 65673, 62089}},
+{14260, 18, 14353, {1, 3, 3, 5, 21, 21, 67, 5, 373, 377, 61, 2337, 489, 5801, 23203, 42377, 7801, 178095}},
+{14261, 18, 14365, {1, 1, 7, 5, 25, 17, 61, 133, 181, 261, 1627, 1615, 6851, 4763, 30353, 53349, 7545, 66733}},
+{14262, 18, 14384, {1, 3, 5, 7, 29, 3, 85, 231, 121, 669, 1925, 403, 777, 10605, 24125, 60819, 8253, 81209}},
+{14263, 18, 14414, {1, 1, 5, 3, 5, 5, 1, 53, 9, 445, 1339, 2643, 5527, 13757, 9409, 31993, 80845, 97863}},
+{14264, 18, 14428, {1, 1, 7, 13, 29, 49, 97, 89, 319, 349, 1739, 3615, 1113, 11791, 17429, 37195, 1159, 32211}},
+{14265, 18, 14435, {1, 3, 5, 11, 9, 61, 109, 167, 119, 499, 1157, 3615, 5773, 8839, 27915, 47837, 14945, 187225}},
+{14266, 18, 14483, {1, 1, 5, 1, 9, 3, 7, 179, 323, 279, 43, 1337, 4813, 9917, 2033, 34657, 130769, 208089}},
+{14267, 18, 14486, {1, 1, 3, 1, 31, 57, 57, 73, 21, 661, 1861, 1661, 7619, 12155, 23123, 49751, 130697, 74143}},
+{14268, 18, 14506, {1, 3, 3, 13, 11, 61, 95, 75, 227, 491, 463, 597, 2721, 12323, 26195, 53657, 44413, 68965}},
+{14269, 18, 14513, {1, 1, 7, 11, 5, 51, 103, 123, 203, 911, 203, 1641, 7009, 9479, 303, 37649, 32751, 172777}},
+{14270, 18, 14520, {1, 1, 3, 7, 11, 59, 111, 5, 271, 863, 269, 3457, 489, 10877, 8645, 62567, 24893, 201587}},
+{14271, 18, 14526, {1, 1, 5, 7, 29, 23, 127, 151, 371, 121, 1103, 3951, 3107, 15563, 6243, 1631, 75065, 107681}},
+{14272, 18, 14528, {1, 1, 7, 15, 27, 45, 43, 83, 461, 673, 715, 3245, 313, 13731, 21981, 58853, 46569, 165463}},
+{14273, 18, 14533, {1, 1, 1, 9, 7, 53, 63, 43, 3, 187, 1325, 447, 5113, 4993, 21807, 24329, 4499, 30067}},
+{14274, 18, 14576, {1, 3, 1, 9, 21, 45, 111, 231, 407, 213, 1977, 2269, 2323, 4595, 30427, 54753, 95049, 195409}},
+{14275, 18, 14599, {1, 1, 1, 9, 29, 43, 89, 201, 499, 329, 847, 3831, 5403, 13001, 6037, 14371, 25805, 169237}},
+{14276, 18, 14613, {1, 1, 1, 11, 29, 61, 61, 203, 91, 189, 1603, 939, 6575, 3195, 4731, 44923, 33627, 21683}},
+{14277, 18, 14639, {1, 3, 3, 11, 7, 57, 93, 181, 479, 99, 681, 2875, 7649, 5555, 27087, 6841, 69859, 153689}},
+{14278, 18, 14644, {1, 1, 1, 9, 17, 45, 97, 47, 91, 879, 1463, 3041, 2917, 769, 13675, 26489, 88559, 120991}},
+{14279, 18, 14653, {1, 3, 7, 1, 11, 13, 43, 9, 483, 399, 793, 3965, 2375, 4957, 17747, 50905, 56987, 231265}},
+{14280, 18, 14662, {1, 3, 3, 13, 23, 45, 69, 67, 397, 437, 1993, 2569, 8035, 8531, 27623, 53567, 123189, 242515}},
+{14281, 18, 14695, {1, 1, 1, 3, 5, 9, 21, 227, 499, 205, 431, 3711, 5307, 15773, 11337, 6349, 123507, 95941}},
+{14282, 18, 14704, {1, 3, 7, 1, 13, 15, 101, 91, 209, 611, 537, 1427, 101, 2619, 10513, 44323, 92745, 249127}},
+{14283, 18, 14713, {1, 3, 3, 1, 21, 7, 79, 241, 273, 567, 605, 2371, 5427, 15147, 20139, 40987, 75551, 236213}},
+{14284, 18, 14725, {1, 1, 7, 11, 25, 19, 77, 209, 313, 663, 115, 3697, 3641, 12461, 9877, 18331, 70809, 78923}},
+{14285, 18, 14783, {1, 1, 5, 5, 29, 45, 7, 207, 1, 357, 1089, 3861, 4161, 3209, 27845, 20947, 68909, 125179}},
+{14286, 18, 14810, {1, 3, 1, 13, 17, 11, 27, 165, 179, 489, 1611, 2801, 2385, 2971, 6777, 16149, 59811, 151043}},
+{14287, 18, 14816, {1, 1, 3, 3, 17, 53, 121, 227, 7, 71, 1855, 639, 5135, 6349, 7163, 22997, 112551, 44167}},
+{14288, 18, 14822, {1, 3, 1, 11, 15, 9, 125, 213, 485, 291, 1781, 3621, 7529, 13353, 13903, 24151, 130253, 187097}},
+{14289, 18, 14828, {1, 3, 1, 3, 1, 61, 39, 157, 455, 945, 739, 589, 7259, 7149, 16455, 12649, 72003, 152419}},
+{14290, 18, 14883, {1, 1, 3, 3, 31, 23, 17, 255, 319, 907, 563, 2571, 2149, 15323, 20289, 46061, 32769, 184353}},
+{14291, 18, 14889, {1, 3, 7, 9, 21, 51, 27, 13, 495, 909, 2039, 1435, 4791, 10037, 30119, 3405, 22535, 42247}},
+{14292, 18, 14904, {1, 1, 3, 15, 11, 25, 123, 149, 185, 635, 473, 527, 433, 10373, 18205, 853, 94619, 202507}},
+{14293, 18, 14917, {1, 1, 7, 15, 7, 39, 7, 69, 157, 533, 369, 4031, 1335, 4279, 8049, 28491, 103753, 257477}},
+{14294, 18, 14927, {1, 3, 1, 15, 29, 51, 113, 77, 5, 961, 1863, 1477, 5009, 9519, 32029, 2367, 55705, 149597}},
+{14295, 18, 14941, {1, 3, 1, 5, 19, 43, 49, 107, 59, 693, 867, 3011, 2703, 3633, 24567, 52621, 35839, 134823}},
+{14296, 18, 14946, {1, 3, 3, 7, 19, 15, 81, 105, 23, 375, 451, 3017, 1263, 7589, 24453, 21885, 57651, 52613}},
+{14297, 18, 14952, {1, 1, 3, 7, 3, 59, 19, 1, 3, 243, 1891, 2041, 4707, 15557, 28885, 5959, 22517, 237131}},
+{14298, 18, 15010, {1, 3, 7, 11, 25, 33, 105, 15, 245, 247, 1357, 1255, 7463, 4815, 13727, 41687, 112425, 58827}},
+{14299, 18, 15012, {1, 1, 7, 1, 19, 31, 37, 201, 217, 127, 927, 763, 6359, 9951, 2581, 49171, 104305, 215923}},
+{14300, 18, 15033, {1, 1, 7, 7, 13, 9, 9, 139, 363, 85, 1703, 3615, 2545, 15991, 20677, 12109, 54951, 2171}},
+{14301, 18, 15041, {1, 3, 1, 13, 27, 3, 37, 195, 185, 829, 815, 1621, 2917, 8643, 29071, 45523, 38475, 243505}},
+{14302, 18, 15047, {1, 1, 7, 3, 19, 29, 91, 85, 331, 231, 1609, 2583, 1091, 4191, 29929, 55377, 105077, 168425}},
+{14303, 18, 15066, {1, 1, 5, 3, 29, 35, 3, 61, 389, 339, 705, 473, 2075, 7373, 9699, 38809, 60415, 66423}},
+{14304, 18, 15068, {1, 3, 1, 5, 17, 25, 17, 37, 335, 787, 1891, 1861, 4325, 12721, 9675, 13671, 18655, 235443}},
+{14305, 18, 15072, {1, 3, 3, 5, 23, 13, 83, 191, 263, 325, 1847, 1717, 7089, 15709, 26567, 44489, 66523, 3107}},
+{14306, 18, 15095, {1, 3, 7, 7, 25, 29, 63, 55, 9, 481, 899, 669, 5481, 11227, 1637, 17017, 124509, 102775}},
+{14307, 18, 15150, {1, 1, 1, 5, 21, 41, 101, 93, 129, 1023, 561, 2969, 1525, 2929, 32729, 54513, 4359, 28745}},
+{14308, 18, 15152, {1, 1, 5, 13, 15, 13, 79, 9, 257, 535, 861, 2703, 6161, 6659, 10369, 7, 117467, 146651}},
+{14309, 18, 15175, {1, 1, 3, 13, 31, 11, 43, 95, 441, 921, 1323, 343, 5339, 13149, 19643, 24253, 32055, 180327}},
+{14310, 18, 15176, {1, 1, 5, 15, 11, 27, 109, 149, 255, 1021, 249, 1913, 5213, 301, 9939, 49779, 26097, 66007}},
+{14311, 18, 15210, {1, 3, 1, 11, 15, 33, 53, 159, 433, 167, 1107, 3577, 6231, 8309, 28125, 55381, 127309, 14459}},
+{14312, 18, 15245, {1, 3, 5, 9, 7, 3, 45, 139, 133, 359, 537, 805, 3931, 5181, 915, 63317, 86227, 231573}},
+{14313, 18, 15258, {1, 1, 1, 3, 11, 31, 97, 127, 117, 151, 711, 2457, 2777, 3855, 21829, 7913, 30785, 141449}},
+{14314, 18, 15263, {1, 3, 7, 13, 11, 17, 65, 63, 289, 851, 1929, 4021, 105, 5207, 17085, 64119, 48659, 31687}},
+{14315, 18, 15264, {1, 1, 7, 11, 31, 57, 63, 251, 341, 727, 505, 1851, 783, 16191, 9335, 39421, 14793, 238215}},
+{14316, 18, 15279, {1, 3, 3, 11, 23, 13, 119, 195, 117, 579, 693, 3059, 2967, 12791, 26905, 28527, 13393, 11869}},
+{14317, 18, 15301, {1, 3, 7, 11, 23, 7, 61, 143, 409, 309, 651, 3321, 4027, 1351, 10339, 18451, 18447, 235665}},
+{14318, 18, 15306, {1, 1, 1, 9, 13, 21, 7, 65, 103, 789, 973, 475, 2831, 13337, 18989, 40573, 105375, 2221}},
+{14319, 18, 15313, {1, 3, 5, 15, 3, 59, 115, 61, 365, 653, 523, 3927, 8175, 6751, 32561, 55919, 64903, 139005}},
+{14320, 18, 15329, {1, 3, 3, 13, 1, 7, 51, 63, 179, 525, 1899, 373, 3797, 6329, 5539, 32669, 65903, 154993}},
+{14321, 18, 15341, {1, 3, 1, 1, 31, 53, 87, 39, 317, 71, 1899, 925, 4719, 11645, 27125, 50391, 116491, 219271}},
+{14322, 18, 15367, {1, 3, 7, 13, 7, 23, 1, 57, 333, 277, 893, 3245, 1417, 13115, 21835, 25879, 91305, 54691}},
+{14323, 18, 15368, {1, 3, 1, 11, 27, 5, 109, 69, 221, 453, 299, 517, 609, 11959, 27789, 33107, 46559, 121673}},
+{14324, 18, 15386, {1, 3, 5, 7, 27, 7, 119, 169, 129, 643, 173, 2479, 6163, 11159, 11897, 57153, 11347, 135337}},
+{14325, 18, 15404, {1, 1, 5, 13, 13, 59, 21, 13, 429, 601, 267, 1635, 2579, 12053, 31583, 14847, 78187, 217099}},
+{14326, 18, 15422, {1, 3, 5, 9, 5, 3, 125, 159, 411, 15, 479, 933, 6307, 9707, 23491, 6501, 70993, 161365}},
+{14327, 18, 15436, {1, 1, 7, 7, 3, 33, 87, 177, 283, 825, 1935, 1545, 7071, 9975, 1795, 48277, 115725, 173439}},
+{14328, 18, 15444, {1, 3, 3, 9, 19, 63, 17, 119, 13, 337, 2021, 2221, 3237, 3253, 18661, 15479, 59377, 76095}},
+{14329, 18, 15467, {1, 1, 1, 11, 17, 15, 93, 249, 333, 171, 575, 3251, 5413, 3587, 22807, 29273, 56461, 97801}},
+{14330, 18, 15498, {1, 3, 3, 11, 13, 7, 27, 167, 389, 693, 1473, 555, 1603, 3167, 3985, 3841, 100283, 195253}},
+{14331, 18, 15503, {1, 3, 7, 1, 23, 7, 89, 231, 85, 797, 1935, 2557, 4365, 2221, 21069, 44055, 77723, 226547}},
+{14332, 18, 15528, {1, 3, 1, 5, 5, 49, 47, 187, 71, 903, 1279, 3219, 8041, 10915, 5249, 17755, 80077, 3479}},
+{14333, 18, 15534, {1, 1, 3, 13, 5, 53, 35, 25, 183, 791, 1651, 1041, 1221, 2171, 26221, 20649, 126851, 163047}},
+{14334, 18, 15536, {1, 1, 5, 9, 29, 3, 75, 31, 385, 293, 171, 3023, 2075, 14541, 30879, 13895, 67637, 87831}},
+{14335, 18, 15559, {1, 3, 5, 7, 3, 41, 115, 213, 23, 895, 361, 27, 5839, 12447, 13829, 29183, 106539, 134891}},
+{14336, 18, 15565, {1, 3, 7, 7, 11, 39, 99, 229, 195, 633, 837, 3697, 1161, 15119, 20831, 27371, 92195, 26993}},
+{14337, 18, 15583, {1, 1, 5, 9, 25, 17, 5, 169, 475, 73, 1451, 2057, 3671, 12801, 9671, 57427, 25321, 154969}},
+{14338, 18, 15599, {1, 3, 5, 11, 25, 23, 9, 145, 341, 339, 1855, 981, 8041, 569, 19851, 29521, 21767, 136505}},
+{14339, 18, 15602, {1, 1, 1, 1, 3, 9, 101, 253, 475, 529, 387, 1893, 5509, 5763, 29555, 13307, 30001, 105057}},
+{14340, 18, 15616, {1, 3, 3, 5, 17, 23, 127, 161, 375, 817, 1229, 1197, 1097, 3053, 14351, 21213, 12501, 137397}},
+{14341, 18, 15626, {1, 1, 1, 9, 7, 1, 57, 185, 281, 65, 181, 2483, 4739, 4353, 29837, 40613, 32489, 23317}},
+{14342, 18, 15667, {1, 1, 3, 9, 5, 35, 43, 191, 409, 95, 537, 2465, 515, 1633, 20887, 32535, 43863, 199885}},
+{14343, 18, 15684, {1, 3, 3, 13, 19, 49, 41, 51, 3, 979, 1623, 3323, 7711, 3707, 29417, 58011, 114467, 227499}},
+{14344, 18, 15711, {1, 1, 1, 11, 21, 7, 23, 51, 39, 25, 1971, 213, 369, 9149, 12845, 57631, 16597, 22031}},
+{14345, 18, 15745, {1, 3, 3, 11, 27, 59, 71, 37, 461, 353, 2041, 1961, 4643, 6953, 18129, 60337, 82769, 20819}},
+{14346, 18, 15763, {1, 1, 3, 11, 25, 19, 17, 5, 503, 227, 2021, 733, 2867, 201, 25779, 49811, 81167, 95437}},
+{14347, 18, 15779, {1, 3, 3, 15, 7, 53, 35, 143, 27, 937, 215, 3249, 4151, 1933, 25267, 18047, 35131, 25903}},
+{14348, 18, 15811, {1, 1, 1, 3, 3, 39, 71, 99, 291, 97, 1389, 3803, 2881, 9765, 11277, 20071, 15133, 37349}},
+{14349, 18, 15814, {1, 1, 7, 11, 9, 55, 1, 241, 391, 935, 1555, 3585, 1807, 10057, 2633, 14023, 14409, 199643}},
+{14350, 18, 15817, {1, 3, 3, 3, 19, 9, 57, 237, 107, 869, 147, 2673, 5271, 8999, 20723, 63017, 75989, 20131}},
+{14351, 18, 15853, {1, 3, 3, 3, 25, 11, 61, 77, 119, 657, 2011, 3489, 7835, 4473, 2531, 65231, 104797, 161443}},
+{14352, 18, 15881, {1, 1, 5, 5, 11, 63, 25, 93, 181, 797, 367, 3357, 5291, 5087, 28661, 34093, 75195, 165345}},
+{14353, 18, 15890, {1, 1, 1, 7, 17, 1, 77, 149, 59, 633, 1551, 1305, 7677, 8671, 17457, 64037, 104451, 112387}},
+{14354, 18, 15899, {1, 3, 1, 1, 15, 33, 37, 187, 247, 261, 1101, 3451, 7747, 12197, 22465, 30589, 12573, 204517}},
+{14355, 18, 15905, {1, 3, 3, 11, 3, 39, 71, 139, 145, 139, 101, 2815, 3457, 14033, 4531, 42133, 54147, 71259}},
+{14356, 18, 15915, {1, 3, 1, 1, 23, 37, 19, 113, 443, 57, 439, 2929, 3835, 5431, 11189, 4539, 72531, 124453}},
+{14357, 18, 15937, {1, 3, 3, 5, 3, 17, 21, 217, 41, 665, 1565, 3753, 5289, 9789, 29205, 16453, 88979, 171387}},
+{14358, 18, 15950, {1, 3, 3, 13, 27, 15, 15, 223, 231, 311, 311, 1143, 8113, 13863, 3191, 51103, 109437, 245557}},
+{14359, 18, 16002, {1, 1, 3, 13, 11, 59, 7, 191, 477, 683, 353, 2845, 7623, 9035, 453, 48429, 40111, 162859}},
+{14360, 18, 16041, {1, 3, 7, 5, 29, 37, 55, 59, 259, 851, 861, 1951, 7847, 8537, 30107, 2999, 59137, 155615}},
+{14361, 18, 16042, {1, 3, 7, 11, 3, 13, 73, 147, 393, 327, 1289, 37, 795, 1413, 19215, 28345, 124301, 23135}},
+{14362, 18, 16052, {1, 1, 5, 11, 29, 17, 107, 69, 433, 845, 1351, 2551, 807, 15315, 15511, 39475, 84879, 129405}},
+{14363, 18, 16121, {1, 3, 3, 9, 15, 3, 23, 5, 211, 871, 689, 2319, 39, 2215, 25171, 43169, 113715, 186049}},
+{14364, 18, 16132, {1, 1, 3, 7, 3, 37, 23, 9, 453, 649, 373, 1273, 1539, 6221, 27469, 44675, 13513, 131179}},
+{14365, 18, 16136, {1, 3, 1, 5, 29, 41, 119, 133, 37, 761, 1193, 2311, 4945, 7337, 17027, 12873, 51489, 160633}},
+{14366, 18, 16150, {1, 3, 1, 3, 21, 63, 75, 115, 105, 223, 933, 445, 5789, 4611, 13609, 2873, 16679, 222895}},
+{14367, 18, 16153, {1, 1, 7, 5, 17, 13, 15, 217, 193, 863, 1319, 2337, 3055, 14879, 8669, 5705, 42965, 166443}},
+{14368, 18, 16180, {1, 1, 7, 11, 3, 55, 57, 131, 289, 843, 1693, 881, 6737, 5557, 18365, 12393, 38479, 189177}},
+{14369, 18, 16190, {1, 1, 3, 5, 3, 59, 13, 123, 397, 479, 79, 569, 535, 2529, 26225, 43475, 76925, 187763}},
+{14370, 18, 16192, {1, 1, 5, 15, 15, 37, 1, 97, 489, 331, 1499, 1759, 3621, 5373, 1425, 6477, 45805, 235511}},
+{14371, 18, 16195, {1, 3, 1, 3, 7, 51, 55, 157, 61, 751, 1881, 4093, 2557, 11129, 23239, 16335, 8949, 205007}},
+{14372, 18, 16210, {1, 1, 1, 1, 13, 21, 67, 141, 85, 1023, 223, 747, 1951, 10279, 6399, 49887, 100437, 76757}},
+{14373, 18, 16225, {1, 1, 3, 11, 1, 51, 29, 33, 173, 769, 879, 2883, 417, 15031, 13377, 63919, 118803, 87969}},
+{14374, 18, 16256, {1, 1, 1, 5, 1, 1, 17, 153, 81, 691, 961, 3399, 5005, 10617, 18467, 13775, 34905, 241349}},
+{14375, 18, 16266, {1, 1, 1, 13, 7, 37, 57, 187, 389, 575, 1827, 2017, 4541, 10513, 23409, 30945, 126855, 239657}},
+{14376, 18, 16274, {1, 1, 5, 5, 17, 41, 83, 177, 285, 695, 29, 1653, 953, 6377, 13571, 58663, 9265, 100759}},
+{14377, 18, 16302, {1, 3, 5, 3, 5, 13, 27, 153, 207, 699, 1805, 947, 979, 2719, 389, 61953, 16991, 160073}},
+{14378, 18, 16310, {1, 1, 7, 13, 17, 37, 113, 185, 239, 455, 1557, 3201, 1111, 4875, 23197, 41883, 70507, 255047}},
+{14379, 18, 16322, {1, 3, 5, 11, 9, 51, 47, 137, 413, 1015, 259, 1829, 6043, 11757, 22317, 15155, 107827, 171003}},
+{14380, 18, 16339, {1, 1, 1, 13, 27, 7, 49, 91, 285, 13, 2007, 3469, 1223, 2483, 16155, 8413, 10529, 224195}},
+{14381, 18, 16345, {1, 1, 7, 3, 9, 49, 119, 81, 331, 187, 1695, 1729, 533, 6359, 7053, 34665, 37541, 100225}},
+{14382, 18, 16348, {1, 3, 7, 1, 7, 35, 115, 91, 479, 515, 1249, 121, 2885, 16383, 1777, 44205, 86459, 255885}},
+{14383, 18, 16357, {1, 1, 7, 13, 13, 27, 11, 49, 221, 829, 1787, 2889, 3875, 1679, 25333, 1323, 9813, 189373}},
+{14384, 18, 16382, {1, 3, 7, 5, 31, 5, 117, 77, 209, 619, 191, 2969, 2221, 15339, 11461, 64201, 130461, 204467}},
+{14385, 18, 16402, {1, 3, 1, 1, 29, 5, 91, 31, 313, 901, 1501, 2837, 3615, 7765, 341, 13873, 21663, 260637}},
+{14386, 18, 16461, {1, 1, 1, 9, 1, 41, 97, 15, 141, 901, 1309, 3341, 4871, 16033, 12343, 1555, 94989, 78295}},
+{14387, 18, 16469, {1, 1, 7, 3, 3, 15, 1, 29, 445, 59, 475, 3033, 4227, 3219, 6093, 58953, 92179, 49343}},
+{14388, 18, 16474, {1, 1, 5, 3, 27, 25, 109, 13, 219, 983, 131, 2517, 1161, 16063, 32737, 6077, 91183, 37457}},
+{14389, 18, 16483, {1, 3, 3, 1, 3, 1, 85, 147, 17, 543, 1475, 3873, 3719, 2737, 30977, 15953, 66077, 258979}},
+{14390, 18, 16497, {1, 3, 5, 1, 29, 9, 21, 51, 5, 985, 1177, 3287, 2183, 7301, 13713, 53403, 38439, 195863}},
+{14391, 18, 16523, {1, 1, 7, 15, 31, 53, 47, 173, 477, 439, 751, 1019, 3371, 9319, 17995, 29029, 90657, 209277}},
+{14392, 18, 16534, {1, 1, 5, 5, 17, 5, 59, 115, 375, 231, 1891, 1321, 3639, 16117, 32639, 28793, 68213, 41091}},
+{14393, 18, 16550, {1, 3, 5, 11, 17, 15, 13, 11, 459, 767, 849, 1407, 6611, 6409, 21515, 63175, 127155, 171959}},
+{14394, 18, 16564, {1, 1, 5, 1, 17, 49, 61, 161, 399, 137, 845, 2673, 2431, 15343, 389, 42337, 23031, 94811}},
+{14395, 18, 16582, {1, 1, 1, 9, 21, 23, 75, 177, 351, 197, 1619, 2443, 6829, 3773, 16399, 31949, 44975, 221363}},
+{14396, 18, 16591, {1, 1, 3, 1, 11, 19, 103, 61, 135, 863, 1427, 2657, 4553, 1277, 20249, 3973, 25467, 18847}},
+{14397, 18, 16609, {1, 3, 3, 13, 17, 31, 19, 163, 323, 195, 603, 4069, 3181, 12069, 22117, 44229, 23585, 202785}},
+{14398, 18, 16642, {1, 1, 7, 5, 17, 3, 77, 111, 491, 829, 1375, 2829, 5599, 14057, 21387, 52345, 108281, 211285}},
+{14399, 18, 16648, {1, 3, 3, 1, 17, 43, 71, 13, 321, 393, 1803, 727, 5101, 13485, 8693, 60505, 13893, 3467}},
+{14400, 18, 16656, {1, 1, 5, 1, 23, 31, 121, 15, 215, 215, 1113, 3335, 7431, 4863, 31429, 49903, 59403, 60797}},
+{14401, 18, 16662, {1, 3, 3, 9, 21, 43, 61, 171, 361, 323, 1895, 3647, 729, 8809, 9351, 14573, 93593, 17485}},
+{14402, 18, 16665, {1, 3, 3, 7, 7, 19, 45, 247, 203, 757, 1941, 3753, 5317, 13239, 18945, 26173, 43929, 66889}},
+{14403, 18, 16678, {1, 1, 1, 15, 5, 17, 11, 21, 193, 941, 517, 191, 6067, 8403, 27339, 31035, 34767, 28675}},
+{14404, 18, 16701, {1, 3, 1, 7, 27, 59, 27, 7, 491, 551, 867, 3693, 391, 9799, 11051, 28347, 57555, 23079}},
+{14405, 18, 16713, {1, 3, 3, 1, 25, 21, 63, 253, 459, 603, 107, 1229, 1433, 4263, 24341, 20493, 40165, 254725}},
+{14406, 18, 16716, {1, 3, 5, 3, 9, 7, 63, 195, 19, 973, 47, 811, 2207, 3613, 8911, 17495, 62403, 77951}},
+{14407, 18, 16758, {1, 3, 5, 11, 5, 13, 83, 125, 467, 111, 1819, 3807, 4259, 2885, 29577, 13539, 69859, 97379}},
+{14408, 18, 16768, {1, 1, 5, 15, 5, 33, 109, 203, 129, 587, 9, 3025, 2839, 11405, 11257, 7779, 30311, 14015}},
+{14409, 18, 16797, {1, 1, 7, 15, 5, 47, 103, 199, 391, 61, 129, 3511, 1295, 15067, 23919, 2941, 120463, 21665}},
+{14410, 18, 16804, {1, 1, 5, 5, 7, 7, 125, 153, 365, 815, 1423, 4053, 875, 2405, 21291, 26785, 31371, 211045}},
+{14411, 18, 16811, {1, 3, 3, 9, 31, 47, 1, 247, 197, 1019, 985, 2277, 875, 3969, 15093, 15561, 110101, 156547}},
+{14412, 18, 16813, {1, 1, 3, 1, 9, 47, 71, 125, 17, 501, 1783, 2337, 483, 12719, 22453, 16701, 102639, 152955}},
+{14413, 18, 16881, {1, 1, 3, 11, 13, 31, 9, 63, 261, 257, 319, 1443, 5011, 9799, 18639, 53081, 56879, 102335}},
+{14414, 18, 16888, {1, 3, 3, 1, 5, 59, 127, 163, 323, 997, 1755, 1445, 2285, 4935, 22123, 815, 115131, 1009}},
+{14415, 18, 16893, {1, 1, 3, 11, 11, 43, 65, 127, 137, 583, 173, 2601, 5809, 15773, 16129, 2543, 68281, 96107}},
+{14416, 18, 16922, {1, 3, 5, 9, 25, 25, 95, 73, 313, 893, 1805, 2301, 5917, 15159, 8637, 25505, 66053, 31627}},
+{14417, 18, 16937, {1, 1, 3, 7, 25, 59, 55, 13, 297, 849, 187, 359, 3745, 12655, 29293, 58581, 89799, 195867}},
+{14418, 18, 16958, {1, 1, 5, 13, 19, 5, 51, 85, 259, 59, 1003, 2991, 6605, 8405, 5221, 45607, 130729, 99641}},
+{14419, 18, 16965, {1, 3, 5, 5, 25, 61, 51, 211, 143, 233, 1465, 1165, 1769, 3021, 9491, 30335, 34787, 142605}},
+{14420, 18, 16978, {1, 3, 5, 13, 23, 9, 89, 249, 71, 179, 841, 3375, 21, 6757, 27495, 7531, 123725, 253855}},
+{14421, 18, 16980, {1, 3, 7, 13, 9, 33, 109, 103, 475, 781, 493, 2079, 6529, 13443, 2181, 26925, 31345, 142863}},
+{14422, 18, 16989, {1, 1, 7, 9, 15, 41, 17, 85, 503, 839, 533, 731, 2735, 12949, 11395, 22539, 130147, 40045}},
+{14423, 18, 17011, {1, 1, 5, 9, 25, 21, 29, 79, 405, 383, 1271, 385, 7629, 3889, 5319, 57739, 51411, 50895}},
+{14424, 18, 17014, {1, 3, 7, 5, 13, 35, 17, 97, 261, 437, 951, 1403, 2407, 11447, 13565, 10165, 100001, 253093}},
+{14425, 18, 17023, {1, 3, 1, 3, 11, 39, 31, 187, 473, 565, 351, 4007, 2621, 14463, 9009, 40679, 81069, 51131}},
+{14426, 18, 17063, {1, 3, 5, 5, 9, 17, 11, 151, 59, 249, 281, 203, 6423, 4977, 18557, 65383, 88361, 87437}},
+{14427, 18, 17081, {1, 3, 5, 7, 15, 25, 3, 157, 179, 439, 1627, 3493, 6641, 6403, 2361, 3613, 33817, 22585}},
+{14428, 18, 17084, {1, 3, 5, 1, 13, 63, 77, 195, 233, 175, 631, 1021, 637, 13231, 26187, 131, 127379, 256183}},
+{14429, 18, 17099, {1, 1, 7, 9, 5, 13, 15, 187, 55, 37, 1113, 2191, 3439, 1073, 26239, 3049, 19807, 250869}},
+{14430, 18, 17126, {1, 1, 7, 3, 13, 15, 77, 47, 317, 285, 753, 2419, 7795, 11423, 6043, 2913, 42819, 50603}},
+{14431, 18, 17129, {1, 3, 7, 15, 21, 17, 63, 71, 97, 535, 1085, 1531, 5165, 13717, 1537, 26797, 111787, 189403}},
+{14432, 18, 17138, {1, 1, 1, 7, 9, 3, 43, 209, 385, 851, 1411, 4039, 3259, 13387, 24505, 33325, 83741, 241255}},
+{14433, 18, 17164, {1, 1, 1, 1, 3, 41, 13, 43, 303, 445, 1097, 3517, 7753, 8459, 3017, 16385, 13775, 248655}},
+{14434, 18, 17170, {1, 3, 5, 15, 5, 61, 31, 57, 269, 931, 1071, 1137, 6181, 13005, 18493, 1345, 105203, 117309}},
+{14435, 18, 17203, {1, 1, 3, 13, 21, 29, 3, 179, 367, 155, 993, 117, 5849, 10181, 1175, 55769, 16025, 67669}},
+{14436, 18, 17206, {1, 1, 3, 9, 11, 9, 33, 131, 181, 1003, 253, 2759, 1877, 11851, 22959, 37823, 82737, 110329}},
+{14437, 18, 17224, {1, 1, 1, 5, 7, 5, 107, 191, 385, 129, 567, 2585, 7295, 3005, 28185, 7095, 54851, 257587}},
+{14438, 18, 17305, {1, 3, 7, 9, 21, 61, 103, 155, 503, 307, 993, 683, 1491, 14895, 9213, 34535, 17765, 12457}},
+{14439, 18, 17322, {1, 3, 3, 1, 7, 47, 27, 173, 97, 889, 853, 3995, 4943, 71, 20479, 16741, 35479, 35307}},
+{14440, 18, 17327, {1, 1, 5, 3, 15, 35, 29, 207, 117, 267, 1835, 2565, 1199, 3813, 13999, 10537, 129915, 210651}},
+{14441, 18, 17332, {1, 3, 3, 13, 5, 57, 77, 193, 11, 279, 745, 2511, 5775, 13527, 26329, 16303, 111511, 70025}},
+{14442, 18, 17342, {1, 3, 7, 9, 17, 1, 73, 1, 125, 939, 863, 2763, 1951, 3191, 5567, 59729, 32149, 149417}},
+{14443, 18, 17387, {1, 3, 3, 1, 19, 25, 119, 63, 101, 33, 77, 3587, 6367, 8275, 24957, 32087, 7031, 217291}},
+{14444, 18, 17410, {1, 1, 1, 13, 7, 25, 75, 161, 143, 353, 973, 2957, 749, 13519, 11295, 34287, 60727, 83731}},
+{14445, 18, 17419, {1, 3, 7, 7, 17, 9, 59, 45, 97, 619, 895, 1955, 8143, 2507, 4673, 39425, 35679, 152069}},
+{14446, 18, 17429, {1, 1, 5, 9, 31, 19, 115, 177, 349, 877, 525, 305, 2187, 12195, 13529, 61641, 102293, 69941}},
+{14447, 18, 17439, {1, 3, 7, 11, 23, 59, 15, 243, 511, 465, 905, 1979, 2263, 2105, 9009, 3691, 22241, 97765}},
+{14448, 18, 17440, {1, 1, 7, 9, 29, 13, 3, 207, 51, 405, 1703, 1923, 1781, 14723, 8103, 10707, 64799, 99349}},
+{14449, 18, 17457, {1, 1, 7, 5, 23, 29, 51, 63, 489, 273, 1577, 2807, 5427, 9949, 1929, 19791, 109405, 241465}},
+{14450, 18, 17458, {1, 3, 3, 7, 29, 61, 103, 55, 29, 17, 1081, 21, 5791, 9803, 19385, 45091, 118069, 61383}},
+{14451, 18, 17469, {1, 3, 1, 7, 3, 15, 75, 47, 475, 87, 1541, 3933, 1081, 12361, 29213, 64333, 7229, 226909}},
+{14452, 18, 17477, {1, 1, 5, 7, 21, 45, 19, 137, 351, 229, 1773, 1829, 5025, 12661, 18745, 54917, 10419, 176667}},
+{14453, 18, 17512, {1, 1, 1, 3, 9, 37, 81, 25, 11, 327, 1653, 2751, 2823, 12575, 30287, 46265, 17299, 93595}},
+{14454, 18, 17518, {1, 1, 1, 3, 15, 17, 43, 163, 223, 731, 631, 2813, 1723, 6089, 14245, 64339, 114291, 40331}},
+{14455, 18, 17532, {1, 3, 7, 5, 21, 45, 41, 17, 495, 61, 1369, 369, 4493, 12071, 3813, 41455, 62561, 174399}},
+{14456, 18, 17536, {1, 1, 1, 5, 9, 41, 95, 113, 109, 519, 1683, 2265, 2875, 12649, 15575, 53511, 100707, 224035}},
+{14457, 18, 17559, {1, 3, 7, 9, 29, 7, 109, 109, 283, 111, 1167, 3679, 369, 11597, 19459, 759, 128667, 172427}},
+{14458, 18, 17569, {1, 1, 1, 3, 13, 31, 97, 31, 477, 507, 835, 465, 7501, 2485, 19485, 51055, 56363, 229341}},
+{14459, 18, 17641, {1, 3, 5, 11, 3, 23, 67, 173, 99, 963, 977, 1949, 1263, 2427, 15181, 23571, 23509, 26481}},
+{14460, 18, 17667, {1, 3, 3, 1, 29, 3, 35, 191, 197, 277, 397, 205, 5945, 1069, 31789, 3551, 101901, 222609}},
+{14461, 18, 17674, {1, 1, 5, 9, 11, 23, 109, 81, 295, 7, 755, 2345, 2823, 11133, 22623, 14515, 57059, 231099}},
+{14462, 18, 17693, {1, 3, 1, 3, 21, 29, 37, 71, 111, 737, 1881, 871, 5843, 5889, 14615, 49909, 7105, 48335}},
+{14463, 18, 17710, {1, 3, 1, 15, 23, 31, 87, 181, 483, 225, 2003, 365, 1569, 11153, 14673, 30085, 56497, 203723}},
+{14464, 18, 17729, {1, 1, 3, 15, 17, 47, 99, 167, 485, 431, 1481, 2225, 1537, 8513, 19407, 34165, 27289, 84393}},
+{14465, 18, 17754, {1, 3, 7, 3, 11, 17, 115, 205, 403, 831, 1869, 3623, 5215, 15511, 11297, 25181, 127491, 155887}},
+{14466, 18, 17763, {1, 1, 7, 5, 31, 37, 23, 21, 403, 529, 1185, 3363, 6319, 2435, 2687, 39407, 121891, 133047}},
+{14467, 18, 17780, {1, 3, 7, 1, 21, 31, 43, 61, 371, 987, 1783, 3811, 6227, 13199, 31799, 28863, 49329, 73947}},
+{14468, 18, 17784, {1, 3, 1, 1, 13, 1, 5, 99, 35, 793, 483, 2573, 2249, 6345, 12793, 61917, 49419, 58011}},
+{14469, 18, 17790, {1, 3, 1, 15, 3, 45, 35, 189, 67, 447, 1455, 3575, 8191, 7907, 21559, 38211, 26945, 240679}},
+{14470, 18, 17830, {1, 1, 3, 11, 27, 49, 9, 109, 93, 473, 1465, 271, 7389, 47, 8101, 6219, 17437, 220461}},
+{14471, 18, 17851, {1, 1, 7, 3, 23, 31, 75, 61, 375, 901, 1329, 2603, 3469, 12957, 23949, 62183, 126763, 68965}},
+{14472, 18, 17868, {1, 1, 7, 9, 13, 59, 75, 233, 339, 29, 1117, 1693, 593, 15317, 29753, 3079, 43583, 79939}},
+{14473, 18, 17879, {1, 1, 5, 1, 17, 57, 81, 123, 101, 765, 1941, 3143, 7403, 9105, 23197, 28983, 128059, 5931}},
+{14474, 18, 17896, {1, 3, 5, 11, 19, 31, 89, 165, 213, 251, 965, 3203, 1621, 4323, 26877, 17109, 18321, 162413}},
+{14475, 18, 17901, {1, 3, 3, 9, 11, 59, 123, 213, 335, 267, 1767, 3317, 5189, 10149, 27921, 19331, 71541, 170501}},
+{14476, 18, 17916, {1, 3, 3, 15, 3, 3, 115, 235, 305, 219, 265, 1535, 4925, 5597, 20857, 32381, 117237, 197533}},
+{14477, 18, 17935, {1, 3, 5, 13, 13, 59, 93, 85, 419, 337, 513, 2131, 5665, 12229, 1389, 34355, 65485, 81141}},
+{14478, 18, 17953, {1, 3, 7, 7, 11, 59, 111, 219, 293, 289, 325, 623, 3853, 3775, 14771, 5945, 119451, 162861}},
+{14479, 18, 17991, {1, 3, 1, 11, 19, 33, 119, 239, 431, 803, 1119, 2445, 3203, 7219, 31963, 34519, 104953, 254491}},
+{14480, 18, 18009, {1, 3, 7, 9, 21, 53, 21, 115, 365, 419, 11, 3803, 4283, 417, 8937, 64533, 56433, 166025}},
+{14481, 18, 18016, {1, 1, 7, 3, 17, 5, 99, 143, 485, 309, 1255, 2641, 3427, 1681, 3301, 64531, 38629, 20945}},
+{14482, 18, 18034, {1, 1, 5, 1, 31, 3, 115, 217, 451, 5, 1447, 2317, 1725, 12931, 25799, 23569, 51747, 28821}},
+{14483, 18, 18061, {1, 3, 7, 3, 31, 55, 109, 107, 211, 381, 1067, 3973, 5007, 8939, 8605, 55221, 124603, 47115}},
+{14484, 18, 18070, {1, 1, 1, 11, 19, 13, 99, 241, 103, 711, 1823, 2671, 653, 10217, 14195, 39735, 54807, 105599}},
+{14485, 18, 18079, {1, 3, 3, 7, 9, 33, 43, 131, 493, 141, 827, 2909, 2847, 12879, 7879, 6263, 25981, 57323}},
+{14486, 18, 18132, {1, 1, 1, 1, 1, 41, 55, 175, 479, 725, 157, 3403, 5809, 10685, 20433, 21729, 9493, 205685}},
+{14487, 18, 18145, {1, 1, 7, 5, 1, 33, 31, 245, 109, 711, 1047, 941, 449, 1055, 16249, 45211, 48311, 171339}},
+{14488, 18, 18169, {1, 3, 3, 9, 27, 9, 113, 69, 269, 643, 1371, 3521, 4969, 5373, 11133, 63109, 42725, 126969}},
+{14489, 18, 18170, {1, 1, 5, 15, 9, 21, 1, 195, 421, 429, 1103, 2727, 463, 9801, 8955, 62841, 94687, 114509}},
+{14490, 18, 18190, {1, 1, 5, 5, 5, 47, 9, 221, 59, 115, 359, 1147, 749, 1009, 23129, 641, 39471, 23073}},
+{14491, 18, 18192, {1, 3, 5, 13, 27, 29, 19, 3, 121, 773, 625, 2757, 6377, 15867, 14563, 40391, 4351, 21153}},
+{14492, 18, 18201, {1, 1, 5, 9, 11, 25, 51, 101, 273, 541, 1761, 593, 7111, 4369, 30095, 34867, 103989, 19855}},
+{14493, 18, 18228, {1, 1, 3, 13, 27, 55, 79, 115, 105, 855, 627, 2227, 2927, 8757, 8713, 54607, 43671, 130153}},
+{14494, 18, 18243, {1, 1, 3, 5, 7, 45, 21, 71, 157, 773, 1265, 841, 2463, 2217, 6087, 28683, 21251, 72377}},
+{14495, 18, 18260, {1, 1, 3, 1, 15, 11, 117, 211, 223, 713, 545, 907, 6907, 41, 17039, 23079, 86657, 5765}},
+{14496, 18, 18279, {1, 1, 5, 3, 27, 33, 77, 137, 401, 585, 911, 1189, 2749, 3427, 2701, 2453, 84857, 176585}},
+{14497, 18, 18285, {1, 1, 1, 3, 7, 39, 73, 143, 29, 569, 939, 301, 7827, 7691, 11513, 64517, 113679, 234165}},
+{14498, 18, 18297, {1, 3, 1, 11, 29, 57, 127, 181, 175, 973, 1537, 761, 5205, 13641, 32649, 8621, 77509, 261235}},
+{14499, 18, 18300, {1, 3, 5, 5, 13, 19, 117, 225, 477, 297, 1807, 2357, 5653, 3791, 6325, 54877, 120659, 91013}},
+{14500, 18, 18321, {1, 3, 1, 1, 3, 55, 19, 99, 321, 877, 541, 511, 141, 15047, 26377, 9, 2765, 223533}},
+{14501, 18, 18344, {1, 1, 1, 11, 13, 59, 121, 147, 215, 117, 1047, 3055, 2129, 15191, 14425, 28327, 108541, 114275}},
+{14502, 18, 18358, {1, 1, 1, 15, 3, 21, 105, 61, 501, 899, 195, 2745, 5989, 4433, 19525, 35477, 22997, 241657}},
+{14503, 18, 18364, {1, 1, 3, 5, 19, 47, 77, 247, 413, 317, 1255, 2087, 4493, 2211, 9003, 22145, 94001, 50579}},
+{14504, 18, 18376, {1, 3, 7, 11, 31, 47, 25, 191, 65, 409, 1349, 2481, 7619, 223, 18051, 63609, 77187, 75483}},
+{14505, 18, 18390, {1, 1, 1, 9, 21, 59, 115, 251, 401, 91, 627, 3273, 2393, 2949, 11475, 23669, 16171, 77507}},
+{14506, 18, 18399, {1, 3, 5, 1, 19, 7, 65, 253, 217, 493, 227, 3269, 4261, 2295, 32037, 5773, 12925, 41821}},
+{14507, 18, 18400, {1, 1, 5, 11, 5, 31, 71, 205, 285, 37, 1863, 1873, 191, 16137, 2955, 51993, 91401, 206967}},
+{14508, 18, 18427, {1, 3, 1, 7, 23, 31, 21, 81, 37, 903, 817, 3447, 8067, 3087, 25831, 46247, 77255, 68365}},
+{14509, 18, 18443, {1, 1, 7, 11, 7, 43, 21, 243, 431, 633, 2047, 577, 7297, 8151, 15951, 30313, 121569, 241687}},
+{14510, 18, 18487, {1, 1, 3, 5, 7, 45, 35, 189, 381, 849, 1869, 1193, 6815, 9017, 29053, 63605, 113623, 249097}},
+{14511, 18, 18493, {1, 3, 3, 11, 13, 1, 73, 151, 197, 591, 1101, 2437, 6695, 8337, 26539, 40147, 45673, 57727}},
+{14512, 18, 18508, {1, 1, 5, 1, 19, 15, 61, 151, 37, 893, 1819, 2317, 6299, 13097, 5109, 32613, 123685, 128173}},
+{14513, 18, 18532, {1, 1, 1, 7, 25, 29, 29, 203, 179, 211, 1483, 3315, 7125, 6931, 609, 849, 117571, 26829}},
+{14514, 18, 18535, {1, 3, 3, 11, 11, 47, 33, 101, 181, 431, 183, 2777, 5269, 4177, 15727, 717, 111243, 34825}},
+{14515, 18, 18580, {1, 3, 5, 11, 17, 19, 19, 143, 137, 537, 1249, 2889, 1911, 3895, 15433, 60165, 83815, 205569}},
+{14516, 18, 18587, {1, 3, 3, 7, 9, 59, 13, 159, 307, 625, 1, 2887, 3307, 16371, 4269, 56253, 71171, 55543}},
+{14517, 18, 18606, {1, 1, 1, 11, 7, 63, 15, 53, 409, 7, 1317, 473, 7481, 10321, 27941, 4941, 40003, 194153}},
+{14518, 18, 18659, {1, 1, 1, 1, 11, 53, 93, 157, 289, 231, 31, 273, 8131, 7861, 31041, 55221, 58305, 203403}},
+{14519, 18, 18662, {1, 1, 5, 11, 15, 53, 103, 41, 439, 601, 1949, 1087, 4275, 4675, 31879, 40909, 22365, 124781}},
+{14520, 18, 18679, {1, 3, 5, 9, 1, 47, 81, 47, 197, 499, 329, 2387, 5455, 15571, 2289, 44121, 12105, 11883}},
+{14521, 18, 18694, {1, 1, 3, 3, 7, 47, 93, 33, 265, 149, 845, 723, 7783, 6651, 22939, 58027, 66959, 3991}},
+{14522, 18, 18697, {1, 1, 5, 11, 23, 35, 123, 143, 35, 981, 1269, 2853, 4547, 7877, 16181, 17155, 57605, 11589}},
+{14523, 18, 18706, {1, 1, 7, 11, 9, 57, 87, 151, 333, 743, 1939, 3273, 1047, 5033, 16061, 37237, 12013, 17669}},
+{14524, 18, 18708, {1, 3, 7, 5, 29, 15, 109, 185, 51, 159, 1353, 3041, 7821, 14053, 13643, 62045, 78475, 43603}},
+{14525, 18, 18728, {1, 3, 1, 9, 29, 25, 121, 49, 415, 561, 325, 1139, 1993, 6437, 6025, 25225, 20761, 250589}},
+{14526, 18, 18731, {1, 3, 5, 3, 15, 39, 33, 43, 437, 605, 1081, 2397, 3821, 10961, 4853, 19517, 95817, 142023}},
+{14527, 18, 18733, {1, 1, 3, 11, 23, 51, 119, 13, 227, 981, 2017, 3265, 1215, 8737, 10719, 48027, 43239, 19425}},
+{14528, 18, 18751, {1, 3, 1, 15, 5, 5, 33, 175, 509, 611, 451, 2653, 1553, 1941, 25221, 31259, 6027, 159847}},
+{14529, 18, 18766, {1, 3, 7, 11, 7, 25, 71, 61, 89, 775, 609, 2363, 4261, 10677, 1243, 44895, 49113, 209603}},
+{14530, 18, 18773, {1, 3, 5, 15, 23, 23, 3, 15, 489, 455, 1303, 745, 5311, 1639, 18317, 33729, 119303, 255359}},
+{14531, 18, 18796, {1, 3, 7, 5, 13, 53, 29, 127, 159, 67, 469, 1735, 3497, 6985, 24735, 32957, 1225, 24447}},
+{14532, 18, 18811, {1, 3, 5, 5, 9, 13, 119, 83, 387, 777, 361, 3183, 6351, 9071, 13699, 53873, 54663, 67453}},
+{14533, 18, 18823, {1, 1, 5, 9, 17, 33, 9, 159, 143, 193, 1055, 2903, 2719, 12521, 5231, 37639, 94963, 105673}},
+{14534, 18, 18832, {1, 3, 3, 1, 27, 53, 87, 49, 465, 517, 1333, 411, 4089, 9985, 12989, 59511, 49939, 223481}},
+{14535, 18, 18854, {1, 1, 5, 9, 27, 59, 35, 125, 393, 271, 1565, 2847, 8139, 15627, 16059, 55319, 11131, 35141}},
+{14536, 18, 18858, {1, 1, 1, 1, 25, 1, 27, 195, 113, 539, 1281, 2273, 4793, 695, 25599, 41145, 107431, 160137}},
+{14537, 18, 18883, {1, 3, 3, 7, 13, 7, 35, 137, 83, 995, 1671, 1701, 3157, 15583, 7637, 18947, 59675, 9421}},
+{14538, 18, 18900, {1, 1, 7, 15, 23, 37, 109, 93, 377, 885, 1843, 1867, 2013, 10535, 5717, 55463, 18307, 125537}},
+{14539, 18, 18967, {1, 3, 7, 11, 25, 33, 91, 213, 109, 599, 131, 1879, 1375, 2911, 4649, 8809, 41199, 61629}},
+{14540, 18, 18974, {1, 3, 1, 1, 11, 17, 117, 243, 427, 913, 495, 527, 4277, 8867, 3131, 14143, 81677, 177369}},
+{14541, 18, 18990, {1, 3, 7, 11, 11, 37, 71, 185, 487, 161, 1773, 837, 243, 14105, 6881, 2155, 63679, 220387}},
+{14542, 18, 19009, {1, 1, 5, 3, 11, 41, 33, 99, 495, 757, 1083, 1987, 1997, 11057, 18445, 61903, 78163, 121701}},
+{14543, 18, 19055, {1, 1, 1, 1, 23, 37, 9, 19, 411, 11, 1487, 1279, 2129, 7449, 29631, 34559, 129753, 112627}},
+{14544, 18, 19058, {1, 1, 3, 11, 31, 39, 41, 207, 141, 383, 723, 3053, 743, 4479, 12395, 56659, 130303, 152005}},
+{14545, 18, 19074, {1, 3, 1, 7, 27, 25, 19, 37, 29, 781, 1115, 2569, 4113, 14033, 18653, 1055, 50639, 70413}},
+{14546, 18, 19079, {1, 1, 3, 1, 9, 15, 109, 7, 221, 161, 569, 2915, 2717, 2439, 4257, 61851, 113183, 63139}},
+{14547, 18, 19086, {1, 3, 5, 1, 17, 45, 3, 147, 207, 769, 321, 11, 2747, 7189, 8067, 34951, 50851, 42625}},
+{14548, 18, 19128, {1, 1, 7, 11, 15, 53, 117, 161, 219, 937, 1661, 3767, 959, 10351, 26685, 40095, 109821, 140139}},
+{14549, 18, 19145, {1, 3, 3, 9, 15, 47, 61, 35, 289, 743, 1723, 2189, 749, 13499, 22897, 55385, 114953, 67191}},
+{14550, 18, 19163, {1, 3, 7, 3, 23, 19, 123, 217, 393, 889, 1665, 13, 5663, 8695, 29767, 13433, 65133, 226713}},
+{14551, 18, 19175, {1, 1, 7, 11, 5, 57, 59, 171, 321, 519, 1333, 1975, 5331, 2383, 26863, 8989, 82167, 6915}},
+{14552, 18, 19189, {1, 1, 3, 3, 7, 17, 105, 79, 7, 827, 1277, 3805, 5943, 3161, 28953, 15657, 615, 149131}},
+{14553, 18, 19196, {1, 1, 5, 1, 5, 7, 99, 65, 295, 933, 365, 1867, 1959, 10733, 26947, 29659, 121889, 200379}},
+{14554, 18, 19204, {1, 3, 1, 13, 25, 21, 89, 247, 251, 43, 1539, 1317, 1875, 9237, 20693, 58433, 16757, 25451}},
+{14555, 18, 19213, {1, 3, 3, 13, 11, 47, 73, 21, 467, 337, 1881, 2723, 7023, 2767, 12553, 65533, 20517, 203749}},
+{14556, 18, 19237, {1, 1, 1, 1, 1, 17, 85, 133, 369, 577, 71, 859, 8151, 919, 10843, 44017, 10097, 199893}},
+{14557, 18, 19276, {1, 3, 5, 5, 23, 19, 21, 233, 475, 123, 621, 687, 6945, 2373, 6447, 31243, 3525, 256545}},
+{14558, 18, 19287, {1, 1, 7, 5, 9, 5, 35, 21, 33, 353, 1429, 3249, 6159, 8757, 6213, 855, 75863, 74507}},
+{14559, 18, 19291, {1, 1, 5, 11, 29, 21, 45, 155, 369, 769, 1041, 3929, 7377, 1621, 5285, 55213, 66143, 110251}},
+{14560, 18, 19293, {1, 3, 7, 11, 13, 57, 45, 207, 259, 907, 573, 663, 7727, 12677, 5949, 57625, 42183, 217491}},
+{14561, 18, 19304, {1, 3, 5, 3, 21, 63, 113, 159, 87, 551, 1405, 2867, 239, 10941, 27633, 13947, 69689, 225771}},
+{14562, 18, 19371, {1, 1, 3, 1, 1, 59, 5, 41, 125, 707, 1457, 1, 4263, 5519, 26101, 46339, 44949, 63689}},
+{14563, 18, 19379, {1, 1, 1, 1, 11, 9, 65, 155, 3, 85, 273, 2287, 6059, 3289, 19045, 14705, 112465, 202019}},
+{14564, 18, 19381, {1, 3, 3, 3, 21, 49, 95, 75, 479, 519, 1511, 1609, 2421, 14435, 11749, 49627, 16221, 98351}},
+{14565, 18, 19405, {1, 1, 3, 5, 25, 57, 1, 39, 377, 523, 529, 701, 6749, 10109, 15845, 53301, 70979, 210997}},
+{14566, 18, 19417, {1, 3, 1, 3, 27, 29, 101, 87, 361, 1, 229, 2653, 769, 16121, 18221, 31937, 12187, 63801}},
+{14567, 18, 19420, {1, 3, 3, 1, 25, 27, 49, 235, 309, 23, 1625, 589, 1251, 10305, 26943, 38949, 82539, 135491}},
+{14568, 18, 19424, {1, 1, 7, 7, 13, 13, 13, 61, 509, 73, 201, 2309, 1601, 3145, 19867, 5623, 117455, 180681}},
+{14569, 18, 19462, {1, 3, 3, 13, 13, 47, 71, 9, 123, 719, 701, 353, 1877, 3103, 20017, 64731, 72729, 147631}},
+{14570, 18, 19474, {1, 3, 1, 7, 29, 29, 53, 97, 409, 67, 1033, 2403, 2471, 10869, 2837, 43459, 117415, 213371}},
+{14571, 18, 19492, {1, 1, 7, 1, 7, 23, 103, 157, 315, 335, 375, 3493, 4095, 5331, 7773, 64173, 23167, 21259}},
+{14572, 18, 19501, {1, 3, 5, 13, 13, 55, 107, 147, 447, 281, 401, 1897, 7887, 15005, 21645, 26007, 19673, 238931}},
+{14573, 18, 19504, {1, 3, 1, 7, 17, 39, 109, 113, 143, 59, 1095, 225, 1455, 5021, 5011, 2039, 4381, 219847}},
+{14574, 18, 19516, {1, 3, 3, 7, 1, 35, 121, 145, 297, 251, 1153, 1955, 7881, 15461, 26961, 915, 30253, 15289}},
+{14575, 18, 19519, {1, 3, 5, 15, 5, 57, 43, 157, 49, 17, 993, 4085, 5639, 9405, 28661, 30191, 73291, 76913}},
+{14576, 18, 19534, {1, 1, 7, 1, 25, 63, 117, 55, 63, 649, 1635, 2505, 2765, 2715, 30241, 62699, 19567, 65953}},
+{14577, 18, 19555, {1, 3, 5, 13, 21, 49, 111, 127, 179, 819, 1737, 2519, 815, 10541, 15821, 54203, 71767, 7091}},
+{14578, 18, 19597, {1, 1, 1, 3, 27, 41, 101, 139, 39, 995, 819, 319, 1481, 15265, 20611, 22445, 53733, 82871}},
+{14579, 18, 19600, {1, 3, 3, 13, 7, 61, 103, 203, 353, 205, 1927, 2665, 757, 12277, 31217, 22247, 14527, 26385}},
+{14580, 18, 19615, {1, 1, 7, 3, 5, 35, 87, 235, 139, 785, 417, 3975, 6753, 4267, 15201, 8747, 12491, 159979}},
+{14581, 18, 19621, {1, 3, 1, 9, 9, 11, 117, 231, 503, 933, 1461, 2657, 7771, 2161, 26723, 4853, 23215, 162315}},
+{14582, 18, 19646, {1, 1, 7, 15, 27, 25, 115, 9, 257, 89, 571, 41, 2169, 10619, 2695, 2107, 64747, 40489}},
+{14583, 18, 19651, {1, 3, 7, 9, 29, 61, 91, 117, 279, 721, 233, 177, 5509, 7599, 2379, 20297, 75425, 25051}},
+{14584, 18, 19693, {1, 1, 1, 15, 31, 41, 3, 57, 59, 47, 963, 2831, 1885, 1989, 26803, 48243, 112065, 27753}},
+{14585, 18, 19702, {1, 1, 5, 15, 9, 57, 41, 255, 179, 719, 1463, 2857, 285, 9623, 13111, 20415, 28819, 149441}},
+{14586, 18, 19726, {1, 3, 1, 9, 17, 63, 21, 79, 473, 525, 1557, 3205, 7097, 14379, 28039, 30731, 62383, 247429}},
+{14587, 18, 19754, {1, 3, 3, 13, 25, 45, 97, 213, 11, 801, 1519, 1085, 6167, 13701, 6707, 47223, 69923, 66239}},
+{14588, 18, 19759, {1, 1, 1, 13, 1, 1, 9, 21, 363, 729, 1715, 1249, 5299, 11357, 20627, 33559, 84255, 133743}},
+{14589, 18, 19764, {1, 3, 3, 13, 17, 33, 23, 255, 309, 605, 1177, 1305, 2717, 6561, 29193, 7971, 117525, 79139}},
+{14590, 18, 19788, {1, 3, 1, 1, 7, 15, 73, 171, 11, 791, 241, 2641, 5397, 10403, 22207, 64123, 124507, 63855}},
+{14591, 18, 19793, {1, 3, 1, 11, 11, 7, 109, 103, 321, 1009, 1237, 3347, 287, 2389, 16529, 7789, 3347, 97827}},
+{14592, 18, 19836, {1, 3, 3, 3, 1, 27, 17, 9, 223, 755, 559, 3811, 2997, 1543, 23197, 42371, 5837, 13809}},
+{14593, 18, 19855, {1, 3, 1, 3, 7, 57, 31, 23, 35, 329, 1155, 2525, 3029, 5495, 12005, 18045, 4539, 75789}},
+{14594, 18, 19858, {1, 1, 5, 13, 3, 31, 121, 161, 325, 869, 715, 851, 1273, 1871, 22711, 61499, 36291, 11663}},
+{14595, 18, 19880, {1, 1, 5, 11, 7, 39, 23, 139, 197, 47, 513, 373, 6859, 11217, 17725, 60949, 19299, 91425}},
+{14596, 18, 19883, {1, 1, 3, 7, 15, 63, 123, 11, 109, 829, 231, 2591, 7997, 9061, 18647, 3209, 38509, 211219}},
+{14597, 18, 19917, {1, 1, 1, 11, 13, 35, 73, 223, 325, 49, 1317, 4063, 4127, 2755, 555, 51057, 44909, 205723}},
+{14598, 18, 19918, {1, 3, 3, 13, 17, 41, 115, 141, 503, 525, 63, 2487, 3225, 959, 10623, 28577, 89127, 157269}},
+{14599, 18, 19936, {1, 3, 1, 9, 25, 9, 43, 43, 279, 111, 1141, 3033, 7229, 5725, 8277, 59141, 116811, 127945}},
+{14600, 18, 19946, {1, 3, 7, 11, 27, 27, 93, 243, 135, 333, 1475, 1259, 1583, 7191, 6831, 53485, 128819, 174211}},
+{14601, 18, 19954, {1, 3, 3, 3, 17, 17, 43, 251, 433, 1011, 1817, 2835, 7721, 2449, 9463, 23779, 31427, 88127}},
+{14602, 18, 19979, {1, 1, 3, 3, 11, 49, 61, 41, 211, 559, 1761, 1303, 2119, 5743, 25515, 60705, 54405, 241063}},
+{14603, 18, 19993, {1, 1, 3, 11, 7, 61, 15, 115, 29, 35, 187, 3137, 6177, 1449, 32723, 15917, 107851, 101077}},
+{14604, 18, 19994, {1, 3, 5, 13, 21, 7, 11, 231, 417, 73, 1175, 735, 627, 7393, 7233, 39883, 129481, 106733}},
+{14605, 18, 20006, {1, 3, 1, 15, 27, 61, 63, 201, 27, 431, 1127, 1555, 1953, 13051, 18701, 30097, 95549, 198465}},
+{14606, 18, 20017, {1, 1, 3, 1, 23, 25, 43, 85, 291, 85, 1861, 675, 7451, 14701, 3929, 10835, 25569, 154687}},
+{14607, 18, 20032, {1, 3, 7, 15, 5, 43, 91, 225, 283, 259, 1311, 3977, 585, 14803, 14117, 2121, 106981, 157577}},
+{14608, 18, 20038, {1, 1, 1, 11, 7, 51, 49, 115, 477, 861, 1115, 743, 5109, 959, 7105, 9245, 66297, 188751}},
+{14609, 18, 20050, {1, 3, 3, 11, 23, 1, 11, 111, 163, 643, 1907, 3613, 2967, 10071, 6023, 1307, 62341, 241025}},
+{14610, 18, 20080, {1, 3, 5, 5, 15, 29, 31, 43, 445, 219, 1261, 421, 6035, 6461, 25583, 817, 100509, 239637}},
+{14611, 18, 20135, {1, 1, 7, 3, 27, 51, 121, 93, 349, 125, 2013, 1671, 8049, 7807, 7291, 64413, 93625, 245611}},
+{14612, 18, 20142, {1, 3, 3, 9, 11, 1, 91, 137, 501, 617, 1513, 799, 1705, 15737, 14989, 53611, 48781, 64481}},
+{14613, 18, 20159, {1, 3, 3, 1, 21, 55, 95, 79, 383, 617, 1589, 2671, 4057, 13525, 9269, 23539, 13317, 87701}},
+{14614, 18, 20173, {1, 1, 3, 1, 29, 17, 121, 45, 91, 215, 325, 2853, 1213, 10221, 7233, 34063, 21887, 142943}},
+{14615, 18, 20186, {1, 3, 3, 11, 27, 53, 55, 149, 107, 379, 441, 585, 5697, 16353, 5613, 4323, 55315, 197603}},
+{14616, 18, 20229, {1, 3, 7, 3, 31, 9, 71, 175, 485, 35, 675, 2091, 2351, 7985, 14207, 52687, 8559, 1067}},
+{14617, 18, 20234, {1, 1, 5, 15, 29, 37, 9, 73, 357, 961, 489, 875, 7465, 3231, 27821, 42499, 127837, 117215}},
+{14618, 18, 20263, {1, 3, 7, 7, 19, 43, 75, 153, 27, 291, 2039, 2661, 5513, 13429, 27307, 5305, 44771, 200621}},
+{14619, 18, 20270, {1, 1, 1, 15, 5, 39, 61, 107, 201, 485, 319, 335, 5537, 14195, 31861, 63637, 68497, 45637}},
+{14620, 18, 20299, {1, 3, 7, 7, 23, 49, 95, 225, 25, 933, 667, 2993, 2181, 15659, 31343, 20249, 57039, 43399}},
+{14621, 18, 20304, {1, 3, 3, 7, 17, 25, 29, 243, 511, 91, 1409, 203, 2749, 7067, 12471, 41737, 32761, 7535}},
+{14622, 18, 20319, {1, 1, 7, 9, 27, 43, 63, 65, 325, 817, 1127, 2039, 6171, 5867, 10593, 17205, 95913, 207417}},
+{14623, 18, 20329, {1, 1, 7, 3, 3, 51, 107, 153, 193, 579, 593, 2915, 7641, 5157, 1131, 29793, 66579, 81903}},
+{14624, 18, 20337, {1, 1, 5, 15, 19, 61, 125, 107, 235, 513, 1897, 875, 6341, 1817, 10631, 63905, 42993, 150699}},
+{14625, 18, 20353, {1, 1, 3, 11, 27, 1, 93, 107, 325, 459, 1733, 2527, 4557, 2277, 19345, 8205, 67337, 242559}},
+{14626, 18, 20401, {1, 1, 7, 3, 3, 45, 27, 227, 201, 99, 589, 1665, 4851, 2655, 9915, 41321, 59865, 71501}},
+{14627, 18, 20434, {1, 3, 1, 9, 3, 25, 117, 199, 125, 849, 135, 1771, 4743, 13475, 23711, 17389, 52711, 200143}},
+{14628, 18, 20436, {1, 3, 1, 3, 11, 23, 67, 155, 133, 557, 1933, 3169, 1707, 16045, 11039, 13889, 71045, 245885}},
+{14629, 18, 20473, {1, 1, 5, 9, 1, 7, 99, 13, 315, 251, 1289, 225, 2847, 8451, 3139, 46829, 124745, 64825}},
+{14630, 18, 20488, {1, 3, 7, 13, 19, 45, 87, 161, 271, 401, 1995, 935, 1803, 4051, 11709, 26993, 120139, 147895}},
+{14631, 18, 20512, {1, 1, 7, 5, 15, 11, 47, 215, 51, 1019, 2039, 3767, 929, 3845, 3939, 64077, 48115, 61845}},
+{14632, 18, 20515, {1, 1, 1, 5, 1, 39, 15, 77, 179, 13, 1099, 203, 3363, 9071, 12033, 49159, 71137, 124177}},
+{14633, 18, 20517, {1, 3, 5, 5, 1, 31, 83, 219, 387, 347, 1099, 925, 4423, 5081, 15981, 35881, 79131, 248301}},
+{14634, 18, 20530, {1, 3, 7, 3, 25, 19, 53, 43, 347, 845, 1735, 3237, 2795, 2253, 2997, 43729, 122833, 124869}},
+{14635, 18, 20571, {1, 3, 5, 11, 5, 19, 93, 55, 297, 231, 239, 3335, 253, 13607, 16769, 48879, 61439, 54827}},
+{14636, 18, 20574, {1, 3, 7, 11, 11, 55, 121, 73, 19, 1017, 727, 579, 8011, 9559, 15051, 7895, 17609, 103061}},
+{14637, 18, 20589, {1, 1, 7, 5, 19, 47, 85, 195, 75, 1003, 439, 3069, 2107, 12751, 26729, 2329, 1191, 86547}},
+{14638, 18, 20592, {1, 3, 3, 9, 5, 31, 63, 227, 481, 793, 1853, 1491, 2109, 4199, 32149, 45229, 54685, 124819}},
+{14639, 18, 20611, {1, 1, 1, 3, 15, 15, 41, 45, 153, 429, 1691, 1897, 7253, 7239, 26133, 36527, 90319, 186097}},
+{14640, 18, 20613, {1, 3, 1, 13, 15, 33, 103, 113, 121, 387, 177, 1943, 3181, 5483, 18515, 38807, 22655, 59787}},
+{14641, 18, 20628, {1, 1, 5, 7, 15, 3, 53, 155, 99, 133, 579, 2129, 6881, 11091, 26715, 15485, 108071, 230881}},
+{14642, 18, 20637, {1, 1, 3, 13, 25, 61, 91, 81, 9, 1011, 1993, 2485, 3707, 11127, 21279, 15853, 104081, 203769}},
+{14643, 18, 20638, {1, 1, 7, 3, 17, 23, 37, 171, 315, 247, 275, 3215, 7139, 11739, 25859, 34803, 124601, 9169}},
+{14644, 18, 20719, {1, 3, 7, 9, 21, 29, 97, 213, 309, 865, 597, 1811, 5547, 3741, 31927, 53379, 43293, 23589}},
+{14645, 18, 20724, {1, 3, 7, 9, 7, 43, 107, 187, 485, 977, 1329, 3037, 3701, 9667, 13581, 6283, 39221, 63841}},
+{14646, 18, 20772, {1, 1, 3, 11, 3, 51, 117, 45, 293, 409, 689, 153, 1163, 10921, 22709, 30415, 120475, 120751}},
+{14647, 18, 20796, {1, 3, 5, 15, 31, 59, 57, 63, 249, 763, 1627, 3039, 4309, 14115, 25489, 35009, 126609, 146041}},
+{14648, 18, 20799, {1, 1, 1, 9, 3, 47, 21, 183, 495, 361, 1439, 407, 5757, 12645, 11425, 1923, 94511, 205127}},
+{14649, 18, 20816, {1, 3, 1, 9, 15, 5, 101, 107, 385, 175, 791, 901, 4427, 10415, 8163, 14417, 62997, 139309}},
+{14650, 18, 20841, {1, 3, 5, 3, 13, 57, 9, 99, 77, 123, 1607, 3643, 3879, 503, 6021, 60211, 106471, 221801}},
+{14651, 18, 20844, {1, 1, 7, 5, 27, 35, 11, 33, 415, 387, 1461, 741, 55, 15095, 21177, 5715, 109893, 204843}},
+{14652, 18, 20862, {1, 1, 1, 15, 7, 49, 51, 81, 157, 421, 279, 1951, 6847, 10259, 31925, 60761, 12395, 49511}},
+{14653, 18, 20865, {1, 3, 7, 11, 5, 33, 27, 135, 247, 813, 1889, 2547, 2359, 9535, 4141, 59713, 88685, 214641}},
+{14654, 18, 20902, {1, 1, 5, 15, 17, 61, 99, 103, 39, 151, 1033, 2743, 6639, 5271, 22059, 12681, 22763, 88255}},
+{14655, 18, 20938, {1, 1, 7, 13, 5, 11, 39, 139, 353, 989, 1391, 169, 3709, 735, 22965, 227, 103623, 153893}},
+{14656, 18, 20957, {1, 1, 7, 3, 9, 51, 53, 87, 411, 617, 671, 681, 5057, 6003, 23137, 30881, 2289, 187133}},
+{14657, 18, 20971, {1, 1, 7, 7, 17, 59, 77, 219, 25, 53, 145, 129, 4289, 14257, 7159, 44833, 22131, 53393}},
+{14658, 18, 20973, {1, 3, 7, 1, 9, 59, 79, 177, 149, 637, 1641, 3713, 2709, 12321, 5691, 18239, 8617, 225979}},
+{14659, 18, 20981, {1, 1, 7, 5, 9, 9, 67, 51, 451, 815, 295, 813, 1257, 179, 28769, 57241, 51753, 164873}},
+{14660, 18, 20982, {1, 3, 1, 9, 19, 61, 53, 65, 29, 503, 715, 1837, 7487, 16187, 27303, 54681, 98753, 100471}},
+{14661, 18, 20985, {1, 1, 3, 1, 15, 51, 1, 79, 179, 367, 841, 1313, 797, 4777, 1369, 13317, 65059, 204877}},
+{14662, 18, 20991, {1, 3, 5, 9, 15, 19, 109, 45, 473, 517, 1139, 15, 1997, 4245, 11169, 56417, 75017, 37957}},
+{14663, 18, 21012, {1, 1, 7, 1, 3, 41, 75, 95, 59, 503, 1439, 2633, 3527, 5363, 24357, 43659, 10387, 208319}},
+{14664, 18, 21022, {1, 1, 5, 1, 31, 7, 71, 231, 505, 241, 1579, 3517, 3995, 8269, 6793, 15883, 102779, 75589}},
+{14665, 18, 21026, {1, 3, 5, 1, 13, 61, 87, 213, 501, 307, 1629, 2715, 7245, 747, 20601, 28105, 79249, 76231}},
+{14666, 18, 21028, {1, 1, 7, 11, 5, 13, 69, 221, 485, 59, 2027, 483, 6851, 11719, 16787, 54111, 47579, 49959}},
+{14667, 18, 21050, {1, 1, 3, 15, 3, 33, 57, 75, 375, 45, 851, 1673, 8167, 867, 32087, 34157, 96701, 72893}},
+{14668, 18, 21075, {1, 1, 3, 1, 21, 31, 65, 85, 181, 453, 815, 3139, 205, 429, 7451, 50855, 41085, 137927}},
+{14669, 18, 21077, {1, 3, 1, 9, 3, 57, 99, 183, 305, 991, 809, 4021, 3131, 4459, 5839, 32493, 116541, 59329}},
+{14670, 18, 21078, {1, 3, 7, 1, 5, 19, 3, 91, 297, 715, 1081, 445, 393, 12685, 4457, 61437, 103701, 75917}},
+{14671, 18, 21106, {1, 1, 7, 15, 17, 39, 19, 255, 247, 391, 1055, 1241, 4515, 10217, 23363, 40301, 115053, 234349}},
+{14672, 18, 21122, {1, 3, 5, 1, 21, 9, 33, 243, 501, 793, 219, 3595, 2585, 5083, 15377, 35761, 90609, 93761}},
+{14673, 18, 21127, {1, 1, 5, 13, 3, 1, 5, 77, 265, 525, 1107, 1879, 1119, 2277, 30557, 43547, 81947, 134075}},
+{14674, 18, 21155, {1, 1, 7, 5, 11, 47, 71, 83, 255, 183, 515, 2591, 3933, 16025, 16727, 43421, 18725, 106675}},
+{14675, 18, 21167, {1, 3, 1, 1, 5, 17, 57, 209, 509, 421, 1247, 3153, 1835, 8777, 13285, 27699, 34001, 186553}},
+{14676, 18, 21169, {1, 1, 3, 11, 27, 19, 73, 65, 179, 115, 845, 2507, 7673, 14429, 10553, 4999, 82323, 247379}},
+{14677, 18, 21204, {1, 3, 7, 7, 17, 59, 97, 183, 407, 697, 1423, 123, 6479, 3997, 729, 31587, 114383, 61673}},
+{14678, 18, 21230, {1, 1, 5, 9, 21, 23, 21, 153, 187, 255, 125, 1469, 2639, 8099, 29689, 36415, 103959, 231621}},
+{14679, 18, 21256, {1, 1, 3, 11, 19, 59, 115, 205, 123, 133, 1953, 3471, 2495, 329, 32385, 21931, 9691, 51405}},
+{14680, 18, 21285, {1, 3, 3, 13, 7, 7, 115, 65, 301, 621, 1091, 2137, 5729, 5027, 21331, 24803, 114789, 142039}},
+{14681, 18, 21312, {1, 1, 7, 5, 31, 19, 103, 69, 503, 663, 1497, 2867, 5295, 893, 15927, 37513, 94553, 72369}},
+{14682, 18, 21329, {1, 3, 3, 15, 17, 33, 99, 249, 277, 259, 9, 99, 3073, 12017, 14847, 7685, 102499, 26489}},
+{14683, 18, 21351, {1, 1, 1, 1, 5, 23, 31, 45, 29, 483, 1977, 1129, 6925, 2273, 16573, 53039, 90251, 137191}},
+{14684, 18, 21372, {1, 3, 1, 13, 27, 47, 29, 51, 473, 895, 671, 3917, 6905, 15769, 9019, 28879, 120591, 220753}},
+{14685, 18, 21376, {1, 3, 1, 13, 27, 29, 53, 255, 507, 819, 1251, 2463, 1717, 14461, 31997, 30829, 8803, 115539}},
+{14686, 18, 21424, {1, 3, 3, 15, 27, 1, 109, 225, 451, 409, 2025, 2701, 4121, 9949, 1551, 13625, 73577, 211549}},
+{14687, 18, 21448, {1, 1, 1, 3, 23, 57, 49, 35, 365, 711, 2001, 997, 1853, 2913, 15667, 30255, 19535, 2171}},
+{14688, 18, 21465, {1, 1, 7, 1, 21, 37, 127, 3, 117, 449, 1689, 1391, 1427, 12641, 15199, 23769, 66553, 34669}},
+{14689, 18, 21495, {1, 3, 7, 9, 31, 45, 51, 137, 181, 469, 573, 89, 7257, 10991, 30705, 37827, 75071, 152885}},
+{14690, 18, 21509, {1, 3, 1, 1, 19, 13, 55, 223, 261, 353, 1497, 183, 8173, 14421, 9977, 24095, 47215, 155189}},
+{14691, 18, 21550, {1, 1, 3, 15, 15, 41, 31, 105, 459, 27, 299, 159, 2167, 14809, 9983, 2755, 121715, 35921}},
+{14692, 18, 21562, {1, 1, 3, 7, 31, 5, 85, 137, 431, 849, 1479, 2681, 167, 5727, 3211, 30765, 63295, 39509}},
+{14693, 18, 21575, {1, 1, 5, 7, 5, 51, 21, 103, 175, 927, 1115, 1507, 505, 8093, 25831, 54303, 40397, 61249}},
+{14694, 18, 21579, {1, 1, 7, 3, 23, 53, 49, 225, 7, 425, 403, 3949, 1081, 15335, 21737, 647, 107875, 236183}},
+{14695, 18, 21582, {1, 1, 5, 7, 17, 21, 85, 229, 325, 57, 601, 2785, 6417, 5135, 17917, 12861, 97675, 115457}},
+{14696, 18, 21600, {1, 1, 3, 3, 13, 23, 73, 111, 385, 47, 605, 1169, 1729, 2335, 18739, 61293, 41915, 237645}},
+{14697, 18, 21615, {1, 1, 1, 5, 31, 11, 123, 13, 465, 755, 1073, 1885, 2105, 5971, 2347, 10911, 125823, 156037}},
+{14698, 18, 21617, {1, 3, 7, 11, 17, 47, 3, 165, 227, 355, 87, 839, 7741, 12275, 28579, 25337, 87671, 224847}},
+{14699, 18, 21624, {1, 1, 5, 15, 23, 33, 9, 1, 257, 121, 1049, 1009, 187, 9935, 26093, 21921, 130247, 240291}},
+{14700, 18, 21633, {1, 1, 3, 13, 13, 27, 87, 221, 27, 117, 551, 2533, 7611, 5333, 14635, 9911, 37555, 250621}},
+{14701, 18, 21636, {1, 3, 7, 15, 29, 39, 33, 1, 495, 889, 1397, 3415, 7193, 11533, 27379, 36425, 13739, 146635}},
+{14702, 18, 21645, {1, 1, 7, 11, 1, 23, 85, 127, 79, 989, 321, 1913, 7571, 9889, 11803, 1307, 120513, 218077}},
+{14703, 18, 21654, {1, 1, 7, 5, 5, 15, 35, 9, 351, 973, 1455, 2043, 5527, 9431, 16059, 53915, 105785, 180579}},
+{14704, 18, 21660, {1, 1, 1, 13, 13, 45, 15, 41, 131, 463, 1011, 3559, 6393, 4737, 6041, 33073, 60989, 56761}},
+{14705, 18, 21667, {1, 1, 3, 9, 31, 35, 23, 133, 33, 233, 543, 957, 4913, 12441, 10293, 31611, 83383, 154551}},
+{14706, 18, 21702, {1, 3, 3, 1, 29, 37, 117, 247, 345, 197, 1617, 3333, 7901, 8343, 55, 16529, 34627, 172703}},
+{14707, 18, 21714, {1, 1, 1, 13, 23, 51, 7, 219, 503, 215, 375, 2275, 5467, 13953, 13987, 22735, 67505, 185977}},
+{14708, 18, 21719, {1, 3, 5, 5, 29, 53, 85, 147, 167, 409, 853, 667, 4431, 5227, 15535, 34375, 107135, 220637}},
+{14709, 18, 21736, {1, 3, 7, 7, 19, 3, 73, 123, 455, 539, 1735, 1423, 5337, 16311, 15469, 36071, 126437, 219249}},
+{14710, 18, 21767, {1, 1, 1, 3, 19, 49, 17, 133, 101, 1013, 683, 869, 6267, 409, 31379, 2535, 8039, 63205}},
+{14711, 18, 21781, {1, 1, 1, 13, 13, 53, 25, 31, 501, 629, 645, 1811, 3675, 13317, 17009, 7359, 85475, 249823}},
+{14712, 18, 21795, {1, 1, 3, 11, 5, 1, 41, 17, 159, 361, 1439, 2083, 1425, 7221, 9117, 59543, 59285, 188615}},
+{14713, 18, 21841, {1, 3, 7, 1, 11, 27, 71, 121, 471, 749, 1983, 3715, 6463, 5793, 1063, 18201, 189, 243751}},
+{14714, 18, 21853, {1, 3, 3, 11, 19, 17, 15, 175, 379, 683, 1491, 2385, 6981, 1183, 16829, 2103, 9309, 46119}},
+{14715, 18, 21867, {1, 1, 7, 5, 17, 39, 109, 9, 279, 309, 1, 1523, 4551, 3855, 13277, 36125, 54191, 45085}},
+{14716, 18, 21878, {1, 3, 5, 3, 9, 59, 51, 5, 431, 657, 161, 2725, 2401, 9743, 12925, 43501, 51551, 163737}},
+{14717, 18, 21891, {1, 1, 5, 3, 9, 13, 7, 177, 121, 795, 1169, 3169, 3793, 3995, 29027, 32967, 82273, 207939}},
+{14718, 18, 21897, {1, 3, 7, 13, 1, 1, 31, 91, 245, 775, 1589, 2263, 6303, 15787, 3111, 52553, 52507, 183971}},
+{14719, 18, 21954, {1, 3, 5, 11, 15, 49, 73, 191, 67, 449, 1245, 2445, 5617, 8625, 27971, 35939, 76907, 76207}},
+{14720, 18, 21956, {1, 3, 1, 11, 15, 47, 29, 91, 437, 895, 1941, 249, 2739, 15479, 29699, 7257, 39897, 65985}},
+{14721, 18, 21965, {1, 3, 5, 7, 13, 23, 45, 113, 297, 373, 1505, 2317, 7509, 12059, 13737, 29081, 87337, 221917}},
+{14722, 18, 21977, {1, 3, 3, 3, 1, 5, 13, 215, 221, 461, 1337, 3569, 2257, 12135, 14685, 39721, 16723, 234791}},
+{14723, 18, 21978, {1, 1, 7, 5, 11, 25, 71, 103, 87, 533, 779, 379, 6695, 13451, 24801, 49235, 35109, 100865}},
+{14724, 18, 21983, {1, 3, 3, 15, 13, 51, 27, 11, 279, 847, 135, 1119, 2765, 3805, 20273, 29089, 83379, 190353}},
+{14725, 18, 22002, {1, 3, 7, 5, 17, 29, 111, 35, 189, 273, 503, 541, 6691, 9051, 10403, 7559, 54787, 25403}},
+{14726, 18, 22013, {1, 3, 5, 9, 21, 29, 85, 235, 223, 677, 71, 1313, 6587, 10983, 199, 27721, 78627, 105505}},
+{14727, 18, 22014, {1, 3, 1, 3, 13, 3, 123, 115, 173, 907, 1555, 1489, 2745, 6451, 25347, 24105, 66471, 181009}},
+{14728, 18, 22054, {1, 1, 7, 1, 31, 15, 13, 97, 511, 827, 1193, 3081, 1517, 13511, 24887, 39239, 85175, 150213}},
+{14729, 18, 22058, {1, 1, 1, 5, 17, 39, 121, 67, 207, 877, 1885, 171, 2687, 13081, 27267, 58699, 118575, 213025}},
+{14730, 18, 22066, {1, 1, 3, 9, 9, 27, 101, 215, 31, 37, 1629, 3631, 3225, 9667, 31547, 41939, 38683, 150805}},
+{14731, 18, 22085, {1, 3, 1, 11, 11, 59, 17, 15, 187, 667, 747, 2193, 6749, 6019, 31805, 52433, 4141, 52613}},
+{14732, 18, 22103, {1, 3, 3, 13, 9, 1, 51, 101, 213, 881, 899, 2197, 3017, 1591, 9271, 44017, 99893, 192005}},
+{14733, 18, 22138, {1, 3, 7, 13, 23, 41, 79, 83, 123, 585, 49, 849, 2133, 12473, 6907, 15487, 45783, 46609}},
+{14734, 18, 22140, {1, 3, 7, 13, 27, 23, 71, 13, 319, 903, 1123, 933, 2603, 11631, 19953, 47001, 127751, 84547}},
+{14735, 18, 22153, {1, 1, 1, 15, 3, 61, 79, 231, 43, 217, 801, 997, 6545, 13657, 25589, 30435, 49497, 1037}},
+{14736, 18, 22164, {1, 3, 3, 3, 21, 29, 121, 35, 129, 239, 1645, 3147, 7647, 1201, 19287, 7075, 67961, 62481}},
+{14737, 18, 22167, {1, 3, 7, 7, 3, 23, 45, 177, 469, 897, 359, 2521, 2079, 985, 14993, 56813, 20667, 187341}},
+{14738, 18, 22189, {1, 3, 5, 7, 23, 53, 15, 45, 297, 93, 247, 1165, 2683, 5899, 7113, 14859, 22733, 173835}},
+{14739, 18, 22202, {1, 1, 3, 15, 23, 17, 43, 179, 103, 197, 1857, 323, 267, 12417, 2343, 41527, 12243, 112023}},
+{14740, 18, 22212, {1, 3, 7, 13, 7, 43, 75, 19, 169, 621, 735, 141, 3087, 765, 5901, 34029, 117603, 5137}},
+{14741, 18, 22234, {1, 1, 3, 5, 15, 17, 67, 177, 371, 249, 99, 1651, 3701, 343, 435, 50307, 33915, 115391}},
+{14742, 18, 22239, {1, 1, 3, 13, 19, 53, 69, 1, 435, 71, 339, 2289, 1591, 8783, 8087, 25855, 115311, 191115}},
+{14743, 18, 22245, {1, 3, 5, 11, 1, 55, 59, 7, 101, 655, 353, 483, 5681, 12721, 15973, 51377, 94921, 246365}},
+{14744, 18, 22272, {1, 3, 5, 3, 25, 23, 99, 145, 277, 741, 595, 2653, 1393, 2867, 271, 49131, 111973, 118869}},
+{14745, 18, 22308, {1, 1, 7, 13, 11, 51, 127, 27, 305, 265, 1755, 3189, 4679, 9721, 24409, 46941, 94353, 95643}},
+{14746, 18, 22318, {1, 1, 5, 11, 1, 63, 53, 149, 459, 155, 1431, 3969, 3417, 12121, 14535, 52089, 110745, 57}},
+{14747, 18, 22320, {1, 1, 5, 9, 23, 33, 17, 175, 313, 185, 101, 531, 2941, 14999, 31413, 12103, 33709, 260555}},
+{14748, 18, 22338, {1, 1, 3, 13, 3, 11, 67, 95, 211, 673, 23, 2379, 6985, 12101, 13021, 9255, 116437, 228877}},
+{14749, 18, 22350, {1, 1, 3, 15, 7, 51, 25, 109, 45, 691, 869, 485, 111, 11465, 27953, 54375, 10805, 221023}},
+{14750, 18, 22374, {1, 3, 7, 7, 17, 53, 59, 101, 221, 593, 587, 873, 931, 14617, 12067, 58655, 102437, 31675}},
+{14751, 18, 22388, {1, 1, 3, 15, 25, 57, 35, 231, 491, 671, 933, 3525, 1237, 10155, 27501, 50781, 23183, 108283}},
+{14752, 18, 22391, {1, 3, 5, 5, 31, 63, 117, 205, 199, 841, 1455, 3901, 2127, 13573, 20667, 49489, 60217, 197421}},
+{14753, 18, 22422, {1, 1, 3, 7, 15, 21, 73, 211, 421, 873, 607, 709, 9, 10985, 28653, 64579, 118145, 3095}},
+{14754, 18, 22426, {1, 1, 1, 13, 17, 53, 27, 105, 201, 399, 737, 3235, 1287, 13859, 6049, 62249, 88259, 52991}},
+{14755, 18, 22441, {1, 3, 7, 7, 25, 45, 67, 147, 275, 315, 1675, 2289, 4611, 6325, 26617, 38079, 125219, 23569}},
+{14756, 18, 22481, {1, 1, 7, 7, 9, 61, 115, 251, 297, 691, 1881, 1815, 7229, 10859, 8257, 38097, 87927, 162845}},
+{14757, 18, 22488, {1, 3, 3, 9, 9, 59, 17, 207, 433, 825, 93, 697, 7263, 15983, 14829, 47471, 17579, 151519}},
+{14758, 18, 22500, {1, 1, 1, 11, 21, 31, 7, 41, 383, 731, 2033, 3417, 4187, 5515, 10093, 15875, 78551, 2057}},
+{14759, 18, 22517, {1, 3, 7, 15, 5, 29, 7, 171, 129, 727, 1815, 1361, 6137, 10333, 22203, 361, 92437, 6545}},
+{14760, 18, 22531, {1, 1, 3, 13, 25, 45, 111, 69, 333, 365, 765, 2755, 3485, 2729, 23467, 64809, 120755, 169279}},
+{14761, 18, 22552, {1, 1, 3, 1, 19, 13, 33, 165, 157, 429, 1175, 3435, 7523, 5055, 12295, 34309, 36933, 164037}},
+{14762, 18, 22574, {1, 1, 3, 11, 31, 49, 37, 161, 465, 311, 1839, 689, 6837, 13473, 29883, 61587, 86077, 156921}},
+{14763, 18, 22579, {1, 3, 3, 1, 3, 23, 69, 159, 501, 303, 1495, 9, 6055, 545, 12247, 23413, 67247, 38137}},
+{14764, 18, 22582, {1, 1, 5, 15, 5, 39, 107, 121, 295, 167, 1055, 2703, 147, 7291, 3981, 51989, 92953, 225987}},
+{14765, 18, 22586, {1, 3, 1, 1, 21, 5, 91, 129, 57, 53, 365, 2497, 5017, 13535, 19305, 60447, 115467, 225317}},
+{14766, 18, 22594, {1, 3, 1, 7, 25, 17, 51, 15, 119, 1013, 719, 991, 2655, 12587, 15749, 11723, 18461, 155937}},
+{14767, 18, 22611, {1, 3, 7, 3, 25, 33, 59, 135, 501, 813, 235, 3775, 2781, 13137, 32673, 31643, 78881, 207651}},
+{14768, 18, 22614, {1, 1, 7, 13, 27, 51, 99, 189, 187, 577, 941, 1275, 7297, 14731, 12599, 49049, 96439, 35093}},
+{14769, 18, 22700, {1, 3, 1, 15, 9, 45, 1, 149, 305, 231, 935, 1377, 6345, 14795, 20969, 26263, 5711, 146949}},
+{14770, 18, 22711, {1, 1, 5, 9, 5, 9, 47, 127, 105, 517, 671, 67, 4639, 2477, 23109, 56707, 72131, 100709}},
+{14771, 18, 22749, {1, 3, 5, 3, 21, 23, 7, 193, 491, 197, 319, 3207, 2183, 2133, 3127, 34555, 53707, 170875}},
+{14772, 18, 22759, {1, 1, 3, 9, 5, 23, 109, 91, 359, 913, 179, 1031, 3617, 12497, 23299, 53293, 114603, 9931}},
+{14773, 18, 22774, {1, 3, 1, 5, 1, 47, 73, 103, 333, 483, 1015, 3085, 5229, 3171, 16539, 13493, 68957, 177645}},
+{14774, 18, 22777, {1, 1, 1, 9, 27, 15, 25, 255, 383, 501, 831, 2463, 237, 16065, 6991, 56503, 117303, 140573}},
+{14775, 18, 22780, {1, 1, 3, 5, 9, 25, 15, 179, 415, 729, 1163, 2649, 2907, 9591, 29129, 42775, 80537, 139897}},
+{14776, 18, 22783, {1, 1, 3, 7, 31, 15, 113, 1, 263, 685, 1953, 1479, 5143, 8585, 9057, 61479, 122065, 191541}},
+{14777, 18, 22785, {1, 3, 1, 11, 25, 47, 25, 229, 463, 197, 1123, 2665, 2345, 11701, 10435, 15205, 35437, 137619}},
+{14778, 18, 22840, {1, 3, 3, 5, 19, 57, 89, 101, 373, 283, 57, 1701, 5025, 6677, 20321, 58459, 9319, 161501}},
+{14779, 18, 22878, {1, 1, 1, 13, 3, 51, 111, 23, 325, 813, 441, 2371, 1993, 6839, 359, 9873, 33719, 208163}},
+{14780, 18, 22884, {1, 3, 1, 11, 23, 53, 35, 89, 91, 601, 433, 1671, 1919, 2115, 6355, 10639, 87305, 194185}},
+{14781, 18, 22888, {1, 1, 5, 9, 29, 31, 43, 153, 209, 835, 865, 2431, 1085, 9771, 14483, 19551, 98673, 146881}},
+{14782, 18, 22927, {1, 1, 7, 3, 7, 33, 49, 111, 111, 843, 479, 2113, 4575, 14911, 5161, 7153, 37525, 217887}},
+{14783, 18, 22941, {1, 1, 7, 9, 27, 5, 23, 217, 11, 79, 1637, 2047, 6697, 5601, 2877, 63497, 100127, 157833}},
+{14784, 18, 22951, {1, 1, 7, 11, 31, 41, 91, 39, 207, 185, 1163, 2115, 2963, 7605, 12597, 54175, 7221, 117129}},
+{14785, 18, 22958, {1, 3, 7, 13, 9, 15, 3, 47, 281, 451, 1111, 3585, 4505, 9465, 8047, 45893, 27179, 124373}},
+{14786, 18, 22980, {1, 3, 5, 11, 27, 29, 11, 221, 483, 29, 17, 1067, 6761, 39, 13419, 7263, 127547, 178951}},
+{14787, 18, 23007, {1, 3, 5, 5, 19, 3, 51, 155, 41, 251, 851, 1191, 4445, 8337, 25339, 32931, 4743, 31883}},
+{14788, 18, 23032, {1, 3, 7, 15, 9, 3, 113, 151, 239, 611, 381, 1141, 2865, 3071, 7293, 61997, 2891, 14533}},
+{14789, 18, 23041, {1, 3, 5, 3, 15, 59, 3, 37, 385, 587, 837, 2483, 5493, 10571, 26129, 44835, 63425, 246953}},
+{14790, 18, 23044, {1, 3, 5, 13, 9, 9, 93, 11, 139, 619, 581, 2859, 5481, 11941, 20661, 37463, 95369, 177009}},
+{14791, 18, 23059, {1, 1, 7, 11, 7, 17, 89, 7, 479, 377, 1631, 509, 7429, 13733, 24011, 24191, 98409, 180761}},
+{14792, 18, 23065, {1, 3, 7, 1, 5, 17, 51, 113, 181, 75, 1787, 2221, 6181, 16069, 3031, 32531, 107833, 239907}},
+{14793, 18, 23072, {1, 1, 5, 11, 3, 25, 13, 35, 311, 865, 873, 1811, 3101, 4445, 18155, 18647, 55693, 144963}},
+{14794, 18, 23137, {1, 3, 7, 13, 1, 9, 73, 189, 255, 301, 1579, 597, 6027, 15621, 27287, 14615, 76051, 143445}},
+{14795, 18, 23144, {1, 3, 1, 13, 19, 59, 11, 97, 501, 857, 1071, 3633, 8059, 2469, 16803, 49395, 73631, 114297}},
+{14796, 18, 23155, {1, 1, 1, 5, 19, 3, 59, 179, 343, 745, 497, 2965, 3841, 3119, 17707, 31577, 39801, 108819}},
+{14797, 18, 23162, {1, 3, 3, 9, 11, 17, 19, 199, 283, 229, 493, 631, 8133, 1531, 25271, 11353, 114759, 70655}},
+{14798, 18, 23167, {1, 1, 7, 7, 3, 11, 1, 95, 167, 863, 1009, 1695, 2773, 11667, 23515, 12927, 87883, 28773}},
+{14799, 18, 23183, {1, 3, 1, 15, 9, 1, 31, 243, 57, 349, 483, 659, 1971, 7971, 23797, 4403, 83837, 239261}},
+{14800, 18, 23192, {1, 3, 7, 5, 11, 17, 55, 5, 209, 233, 1969, 925, 695, 1321, 11965, 29849, 120519, 195105}},
+{14801, 18, 23197, {1, 3, 7, 11, 9, 45, 27, 9, 57, 649, 1801, 2653, 1535, 45, 8901, 28755, 26475, 112341}},
+{14802, 18, 23216, {1, 1, 3, 13, 11, 57, 103, 213, 193, 779, 541, 3685, 4191, 6105, 7199, 63659, 49673, 208361}},
+{14803, 18, 23221, {1, 3, 3, 7, 15, 15, 9, 207, 387, 429, 1213, 1703, 5753, 10261, 8705, 62783, 9643, 248591}},
+{14804, 18, 23228, {1, 3, 3, 15, 23, 17, 5, 83, 295, 685, 2003, 1723, 2799, 14699, 25171, 20275, 45597, 214107}},
+{14805, 18, 23233, {1, 1, 1, 15, 13, 33, 111, 69, 329, 273, 1303, 3377, 4151, 12547, 20411, 54845, 7839, 173939}},
+{14806, 18, 23234, {1, 1, 5, 15, 25, 31, 11, 75, 69, 501, 1485, 3659, 3889, 9715, 9633, 45313, 112377, 27799}},
+{14807, 18, 23251, {1, 1, 3, 11, 31, 27, 7, 25, 315, 593, 315, 275, 1453, 9429, 10023, 17939, 37651, 217435}},
+{14808, 18, 23257, {1, 3, 7, 7, 27, 41, 69, 95, 19, 763, 1733, 2097, 6723, 7051, 15209, 53047, 56117, 87639}},
+{14809, 18, 23258, {1, 3, 7, 5, 15, 61, 31, 19, 361, 571, 727, 405, 835, 4847, 26777, 50311, 104125, 127197}},
+{14810, 18, 23288, {1, 1, 1, 11, 11, 61, 59, 63, 409, 219, 1135, 3385, 5583, 16143, 22709, 31247, 19871, 68557}},
+{14811, 18, 23302, {1, 3, 7, 1, 11, 3, 121, 41, 135, 427, 1267, 2169, 507, 757, 12411, 50655, 75625, 1199}},
+{14812, 18, 23341, {1, 1, 7, 5, 17, 21, 89, 119, 55, 395, 979, 909, 1711, 3289, 8433, 9, 12743, 109027}},
+{14813, 18, 23373, {1, 1, 1, 13, 5, 11, 93, 35, 437, 173, 1157, 2749, 6855, 8307, 26145, 22593, 125415, 65509}},
+{14814, 18, 23402, {1, 1, 5, 3, 25, 27, 1, 173, 113, 373, 1769, 2941, 1895, 3399, 27665, 50613, 20747, 31903}},
+{14815, 18, 23409, {1, 1, 1, 1, 9, 7, 53, 73, 465, 725, 1537, 579, 83, 925, 15507, 13595, 16927, 205087}},
+{14816, 18, 23428, {1, 1, 3, 7, 7, 23, 31, 127, 27, 727, 1305, 3879, 817, 15995, 28607, 22695, 6367, 161587}},
+{14817, 18, 23435, {1, 3, 1, 7, 29, 23, 27, 117, 279, 917, 1105, 2061, 7719, 13633, 16501, 33739, 71939, 143115}},
+{14818, 18, 23440, {1, 3, 7, 11, 7, 27, 65, 133, 411, 441, 925, 1485, 2035, 3067, 14511, 58511, 120773, 228731}},
+{14819, 18, 23449, {1, 1, 3, 9, 21, 55, 27, 73, 175, 395, 1201, 2599, 3839, 11163, 5057, 3385, 43265, 105211}},
+{14820, 18, 23459, {1, 1, 1, 3, 7, 63, 91, 197, 417, 763, 1391, 3729, 2791, 1975, 23655, 50611, 110315, 86879}},
+{14821, 18, 23473, {1, 3, 3, 5, 31, 35, 67, 67, 89, 933, 1005, 1837, 5947, 2559, 27731, 25151, 102959, 81557}},
+{14822, 18, 23500, {1, 3, 3, 1, 3, 39, 57, 199, 87, 91, 1641, 3407, 2823, 10441, 26357, 56677, 17647, 86831}},
+{14823, 18, 23511, {1, 3, 5, 7, 15, 5, 49, 227, 395, 837, 1707, 1677, 1907, 13101, 1929, 61701, 1479, 80671}},
+{14824, 18, 23548, {1, 1, 1, 11, 17, 57, 37, 151, 61, 709, 2027, 2239, 3283, 5467, 17221, 40759, 91637, 258167}},
+{14825, 18, 23560, {1, 3, 5, 11, 27, 29, 121, 181, 503, 705, 225, 1111, 7183, 3219, 3233, 2085, 113619, 32959}},
+{14826, 18, 23563, {1, 1, 7, 5, 29, 31, 93, 113, 457, 161, 337, 2003, 1865, 13357, 19961, 51485, 62751, 111285}},
+{14827, 18, 23594, {1, 3, 1, 1, 23, 25, 65, 99, 11, 835, 661, 3291, 2655, 1135, 19957, 5029, 110483, 2499}},
+{14828, 18, 23601, {1, 1, 1, 1, 25, 21, 59, 203, 471, 697, 455, 1561, 3215, 609, 5097, 8715, 115705, 21441}},
+{14829, 18, 23625, {1, 1, 5, 13, 27, 37, 15, 175, 191, 975, 977, 401, 7053, 14291, 14621, 48989, 113033, 172569}},
+{14830, 18, 23640, {1, 3, 1, 1, 19, 11, 125, 53, 307, 421, 93, 2487, 5907, 2195, 30569, 21009, 20759, 246937}},
+{14831, 18, 23650, {1, 3, 7, 3, 23, 21, 103, 115, 453, 537, 473, 1069, 3007, 15111, 3477, 5635, 46423, 68633}},
+{14832, 18, 23662, {1, 3, 3, 1, 21, 1, 49, 197, 173, 775, 1877, 1309, 729, 3555, 5981, 32539, 22765, 171077}},
+{14833, 18, 23692, {1, 1, 3, 13, 19, 5, 75, 149, 441, 665, 1567, 2433, 8173, 12639, 27479, 47221, 66203, 89017}},
+{14834, 18, 23726, {1, 1, 1, 11, 1, 55, 99, 119, 491, 621, 619, 2521, 905, 11601, 26481, 2023, 127413, 220387}},
+{14835, 18, 23738, {1, 1, 7, 11, 9, 21, 57, 93, 243, 229, 1445, 997, 1317, 2327, 14141, 45787, 82295, 72823}},
+{14836, 18, 23743, {1, 3, 7, 3, 11, 7, 115, 143, 349, 507, 1047, 2573, 2491, 13351, 19019, 4857, 62781, 261261}},
+{14837, 18, 23755, {1, 1, 3, 1, 1, 13, 45, 227, 41, 947, 693, 2853, 7459, 1485, 22087, 61195, 111771, 136389}},
+{14838, 18, 23760, {1, 1, 3, 11, 13, 53, 49, 15, 425, 29, 681, 1493, 1385, 9555, 13291, 36735, 12351, 29293}},
+{14839, 18, 23799, {1, 1, 3, 1, 5, 19, 37, 45, 69, 209, 365, 3949, 6163, 5207, 9297, 21147, 71437, 40487}},
+{14840, 18, 23848, {1, 3, 3, 13, 31, 21, 9, 177, 95, 285, 1953, 1969, 7367, 7401, 12017, 9939, 11895, 213133}},
+{14841, 18, 23859, {1, 1, 7, 1, 1, 63, 103, 141, 39, 679, 123, 2941, 4335, 199, 12237, 6599, 48641, 140063}},
+{14842, 18, 23876, {1, 3, 7, 3, 31, 17, 21, 77, 65, 979, 109, 3325, 1781, 6983, 31477, 23149, 33943, 96137}},
+{14843, 18, 23897, {1, 3, 3, 5, 21, 5, 125, 117, 427, 381, 511, 2643, 409, 4945, 3167, 45879, 1469, 56077}},
+{14844, 18, 23907, {1, 3, 1, 5, 27, 43, 83, 31, 65, 645, 1205, 1387, 723, 15359, 13517, 23601, 61717, 47079}},
+{14845, 18, 23919, {1, 3, 3, 13, 15, 37, 101, 175, 225, 513, 483, 1291, 669, 5335, 16023, 287, 51819, 239803}},
+{14846, 18, 23921, {1, 3, 3, 3, 3, 1, 75, 175, 185, 949, 673, 2239, 4355, 10687, 27093, 37409, 23193, 211819}},
+{14847, 18, 23931, {1, 1, 3, 13, 21, 3, 41, 55, 243, 501, 285, 7, 6291, 7725, 17051, 45753, 115117, 14323}},
+{14848, 18, 23933, {1, 1, 1, 5, 13, 11, 51, 175, 435, 673, 67, 1525, 323, 5739, 19977, 62317, 97511, 130883}},
+{14849, 18, 23943, {1, 3, 5, 11, 7, 11, 97, 59, 295, 409, 453, 2439, 5217, 10315, 469, 31187, 17325, 158079}},
+{14850, 18, 23957, {1, 1, 3, 5, 31, 9, 15, 63, 411, 427, 277, 2687, 5021, 1507, 22453, 35559, 122081, 121669}},
+{14851, 18, 23986, {1, 3, 5, 13, 3, 21, 69, 51, 27, 571, 1981, 2729, 5733, 1225, 26821, 43763, 57355, 169279}},
+{14852, 18, 24020, {1, 1, 1, 13, 31, 37, 33, 19, 313, 341, 1141, 1689, 4511, 789, 15317, 61263, 79371, 65157}},
+{14853, 18, 24043, {1, 3, 3, 15, 27, 41, 107, 23, 499, 339, 273, 1937, 2743, 10879, 27127, 64817, 1217, 45863}},
+{14854, 18, 24064, {1, 1, 5, 9, 19, 43, 125, 223, 473, 489, 1999, 1513, 6479, 9511, 12503, 29419, 22559, 209499}},
+{14855, 18, 24082, {1, 3, 1, 13, 25, 55, 53, 61, 303, 337, 1325, 2525, 6503, 1155, 6841, 58167, 8175, 183949}},
+{14856, 18, 24084, {1, 3, 3, 11, 3, 15, 55, 105, 497, 527, 1007, 3545, 4187, 8723, 12761, 20751, 101583, 225373}},
+{14857, 18, 24088, {1, 3, 3, 9, 19, 59, 57, 215, 313, 871, 407, 2475, 879, 15147, 31945, 23939, 104073, 217619}},
+{14858, 18, 24117, {1, 1, 3, 1, 27, 23, 3, 43, 471, 757, 1525, 3003, 2779, 6731, 12423, 59621, 72935, 192283}},
+{14859, 18, 24149, {1, 3, 1, 7, 13, 23, 13, 91, 95, 745, 639, 2627, 4595, 11735, 4143, 23573, 98647, 171201}},
+{14860, 18, 24165, {1, 1, 1, 15, 3, 61, 33, 181, 351, 777, 1365, 1691, 2465, 5289, 24567, 8059, 95301, 75855}},
+{14861, 18, 24223, {1, 3, 5, 13, 1, 57, 57, 187, 1, 601, 563, 1703, 1307, 14673, 7793, 44589, 7629, 254071}},
+{14862, 18, 24247, {1, 1, 5, 13, 29, 17, 61, 233, 371, 909, 529, 185, 127, 15773, 19529, 49271, 26749, 70869}},
+{14863, 18, 24259, {1, 1, 3, 9, 21, 41, 37, 71, 505, 969, 301, 1667, 5879, 13187, 2461, 17301, 103673, 235133}},
+{14864, 18, 24283, {1, 3, 1, 3, 9, 13, 75, 63, 313, 273, 1061, 3821, 539, 9887, 19775, 17259, 93133, 217245}},
+{14865, 18, 24296, {1, 3, 5, 5, 21, 27, 9, 11, 461, 575, 507, 577, 4559, 9995, 13953, 61023, 121941, 195419}},
+{14866, 18, 24336, {1, 3, 3, 7, 17, 17, 45, 193, 271, 571, 1337, 2107, 1923, 4791, 23773, 60923, 58085, 81219}},
+{14867, 18, 24342, {1, 3, 1, 7, 11, 7, 85, 33, 231, 307, 993, 1509, 1427, 9545, 7919, 39775, 81145, 79139}},
+{14868, 18, 24389, {1, 3, 5, 3, 9, 57, 117, 187, 57, 719, 1635, 2499, 6747, 6649, 22643, 16429, 83233, 122057}},
+{14869, 18, 24394, {1, 1, 3, 11, 7, 39, 103, 221, 167, 181, 1355, 989, 3399, 9471, 10493, 57267, 106551, 158599}},
+{14870, 18, 24414, {1, 3, 1, 15, 23, 19, 29, 11, 355, 923, 1401, 509, 3647, 5663, 2353, 53217, 70687, 145613}},
+{14871, 18, 24424, {1, 3, 3, 11, 11, 5, 21, 107, 177, 429, 119, 1029, 5931, 7543, 15455, 62797, 118095, 35387}},
+{14872, 18, 24441, {1, 3, 5, 15, 19, 53, 17, 215, 279, 497, 1157, 2235, 5541, 5899, 20711, 20843, 113821, 164231}},
+{14873, 18, 24491, {1, 1, 1, 15, 21, 33, 67, 247, 55, 573, 1863, 2703, 5267, 4071, 18235, 44659, 102379, 171529}},
+{14874, 18, 24502, {1, 3, 1, 15, 5, 59, 69, 189, 313, 243, 339, 3097, 4999, 5909, 1903, 56143, 76209, 83073}},
+{14875, 18, 24534, {1, 3, 5, 15, 11, 41, 65, 207, 95, 115, 1203, 3731, 6845, 11173, 8281, 40623, 97119, 218455}},
+{14876, 18, 24540, {1, 3, 7, 13, 29, 57, 5, 31, 255, 539, 107, 953, 3707, 9233, 20295, 17459, 2005, 56193}},
+{14877, 18, 24543, {1, 1, 1, 15, 5, 31, 83, 165, 211, 433, 1411, 2949, 4817, 1645, 1693, 9877, 118493, 142923}},
+{14878, 18, 24549, {1, 3, 1, 11, 19, 61, 35, 21, 159, 159, 1717, 3227, 3351, 8641, 20575, 13721, 114649, 129201}},
+{14879, 18, 24567, {1, 3, 1, 13, 9, 41, 17, 7, 209, 501, 445, 23, 7911, 5867, 30129, 643, 36363, 52037}},
+{14880, 18, 24583, {1, 3, 5, 11, 31, 55, 27, 81, 413, 167, 599, 2231, 7055, 4013, 26729, 63927, 12075, 208123}},
+{14881, 18, 24693, {1, 1, 7, 9, 11, 39, 99, 187, 169, 999, 609, 3647, 2497, 8969, 30919, 29145, 67699, 51601}},
+{14882, 18, 24704, {1, 3, 1, 1, 11, 11, 69, 29, 197, 979, 1135, 869, 5435, 5151, 26349, 55911, 68051, 131849}},
+{14883, 18, 24719, {1, 1, 1, 5, 27, 1, 85, 145, 439, 585, 1713, 677, 1833, 14139, 5547, 31265, 82223, 47605}},
+{14884, 18, 24749, {1, 3, 5, 9, 17, 23, 31, 199, 447, 551, 683, 2977, 7839, 8681, 15923, 61057, 89875, 52945}},
+{14885, 18, 24799, {1, 1, 3, 11, 9, 17, 29, 125, 195, 123, 1259, 2729, 3099, 2229, 9683, 13121, 105399, 111833}},
+{14886, 18, 24830, {1, 3, 1, 3, 1, 47, 93, 117, 461, 633, 1641, 933, 7927, 13569, 483, 28159, 121561, 164325}},
+{14887, 18, 24835, {1, 3, 1, 5, 21, 19, 79, 183, 395, 23, 767, 519, 4857, 10385, 12425, 26207, 114623, 37125}},
+{14888, 18, 24907, {1, 1, 5, 5, 9, 47, 67, 217, 499, 843, 1539, 301, 1485, 3157, 22375, 47199, 26215, 182785}},
+{14889, 18, 24917, {1, 1, 1, 13, 9, 37, 87, 49, 445, 681, 1097, 1049, 4093, 13167, 18447, 58243, 41797, 217929}},
+{14890, 18, 24940, {1, 1, 5, 13, 13, 49, 21, 149, 79, 113, 1217, 921, 6321, 9345, 27987, 21723, 49249, 18813}},
+{14891, 18, 24943, {1, 3, 1, 3, 15, 27, 67, 69, 131, 713, 1741, 1955, 5665, 8749, 11971, 11257, 13999, 124535}},
+{14892, 18, 24958, {1, 3, 1, 3, 3, 11, 21, 167, 441, 557, 593, 3261, 3099, 2801, 21725, 23247, 106891, 129187}},
+{14893, 18, 24962, {1, 1, 1, 11, 5, 55, 33, 71, 505, 85, 1609, 521, 5459, 12777, 13007, 255, 67537, 2877}},
+{14894, 18, 24964, {1, 1, 1, 3, 31, 47, 49, 119, 351, 797, 1407, 4089, 2381, 12409, 12849, 23489, 53631, 119387}},
+{14895, 18, 24968, {1, 3, 5, 11, 25, 11, 25, 185, 85, 849, 141, 385, 3663, 13133, 8451, 61463, 35129, 149933}},
+{14896, 18, 25015, {1, 3, 7, 9, 23, 17, 21, 197, 15, 893, 939, 707, 5491, 7249, 14009, 18973, 111545, 36809}},
+{14897, 18, 25024, {1, 3, 3, 13, 23, 15, 19, 193, 223, 627, 1529, 1963, 1003, 7199, 15361, 25233, 110281, 221761}},
+{14898, 18, 25027, {1, 3, 3, 1, 17, 51, 61, 215, 311, 919, 349, 59, 2897, 12137, 5931, 37611, 124387, 83503}},
+{14899, 18, 25033, {1, 3, 7, 9, 13, 47, 53, 139, 481, 733, 389, 1209, 3281, 593, 29103, 61521, 41445, 11015}},
+{14900, 18, 25041, {1, 1, 1, 13, 3, 31, 19, 47, 151, 883, 1707, 827, 2129, 4333, 871, 42967, 79701, 192211}},
+{14901, 18, 25047, {1, 3, 3, 11, 11, 51, 121, 241, 199, 881, 1493, 2381, 5161, 13287, 8155, 52481, 120307, 206203}},
+{14902, 18, 25057, {1, 1, 1, 13, 15, 37, 27, 151, 17, 851, 1343, 1447, 43, 10267, 18267, 21347, 129277, 83987}},
+{14903, 18, 25082, {1, 1, 3, 3, 13, 17, 53, 217, 253, 853, 1461, 1953, 617, 4209, 9925, 377, 42789, 150415}},
+{14904, 18, 25093, {1, 3, 7, 11, 13, 23, 83, 235, 39, 701, 1091, 25, 1807, 15431, 2169, 5339, 123679, 117053}},
+{14905, 18, 25105, {1, 3, 7, 13, 3, 29, 43, 149, 33, 873, 1177, 1961, 7943, 11317, 30725, 55765, 50929, 12335}},
+{14906, 18, 25112, {1, 1, 3, 5, 25, 1, 91, 121, 295, 25, 1743, 2125, 2643, 11175, 15089, 44979, 28355, 543}},
+{14907, 18, 25117, {1, 1, 1, 13, 27, 27, 43, 195, 377, 821, 437, 3445, 2673, 15221, 15101, 25143, 22347, 218549}},
+{14908, 18, 25131, {1, 1, 3, 7, 9, 51, 121, 231, 91, 913, 1325, 167, 8067, 8119, 9307, 33551, 58069, 170567}},
+{14909, 18, 25139, {1, 3, 7, 7, 15, 7, 85, 51, 11, 353, 1117, 2479, 3091, 2377, 23589, 38537, 113047, 261285}},
+{14910, 18, 25194, {1, 1, 3, 5, 15, 33, 61, 145, 147, 815, 767, 9, 2059, 11463, 1883, 8565, 101043, 117565}},
+{14911, 18, 25204, {1, 3, 5, 3, 5, 49, 5, 33, 15, 13, 895, 3973, 7963, 3831, 26817, 10799, 111409, 90679}},
+{14912, 18, 25244, {1, 1, 5, 7, 5, 51, 35, 237, 217, 531, 719, 2711, 1937, 16071, 23233, 22799, 66023, 145739}},
+{14913, 18, 25247, {1, 3, 5, 1, 5, 63, 1, 163, 9, 697, 1379, 2989, 7113, 9821, 15941, 6495, 7825, 29715}},
+{14914, 18, 25253, {1, 3, 5, 7, 9, 41, 113, 173, 151, 963, 2019, 3531, 1133, 4287, 16917, 16929, 12345, 31201}},
+{14915, 18, 25258, {1, 3, 7, 1, 25, 9, 5, 195, 175, 297, 717, 3725, 33, 5155, 4405, 56171, 105597, 132407}},
+{14916, 18, 25275, {1, 1, 7, 7, 3, 59, 115, 95, 227, 951, 843, 619, 7791, 10981, 11773, 57651, 108391, 179561}},
+{14917, 18, 25320, {1, 3, 3, 1, 9, 3, 59, 161, 417, 413, 1933, 1027, 4575, 10427, 15643, 16049, 120089, 176607}},
+{14918, 18, 25338, {1, 3, 3, 3, 15, 1, 83, 195, 59, 859, 1669, 1063, 2069, 15875, 16459, 53741, 114521, 37641}},
+{14919, 18, 25343, {1, 1, 1, 11, 11, 45, 47, 143, 11, 239, 1329, 865, 2693, 899, 26265, 43255, 125679, 130099}},
+{14920, 18, 25351, {1, 3, 5, 3, 31, 51, 95, 127, 79, 167, 117, 3177, 5875, 14039, 20341, 47815, 118799, 211871}},
+{14921, 18, 25358, {1, 1, 1, 1, 3, 21, 65, 203, 11, 565, 537, 1307, 8189, 11423, 7745, 56117, 110959, 95361}},
+{14922, 18, 25372, {1, 1, 7, 7, 21, 63, 63, 231, 441, 127, 1943, 13, 4813, 10607, 23867, 43891, 15801, 173245}},
+{14923, 18, 25399, {1, 3, 3, 5, 25, 23, 123, 133, 129, 303, 1993, 1453, 1109, 4649, 30315, 62399, 121575, 60069}},
+{14924, 18, 25408, {1, 3, 5, 3, 29, 23, 69, 141, 137, 1017, 1915, 35, 3817, 6249, 22427, 7281, 88473, 230167}},
+{14925, 18, 25432, {1, 3, 7, 7, 19, 37, 93, 217, 287, 731, 583, 3377, 2879, 4873, 5549, 52949, 127285, 211173}},
+{14926, 18, 25442, {1, 1, 5, 7, 23, 41, 49, 145, 277, 571, 1225, 455, 2133, 1229, 25421, 20179, 70919, 242825}},
+{14927, 18, 25462, {1, 3, 5, 5, 29, 3, 1, 89, 413, 901, 1343, 3963, 6969, 14649, 18331, 4573, 82077, 100693}},
+{14928, 18, 25465, {1, 1, 1, 13, 31, 53, 107, 95, 151, 539, 1593, 3763, 1007, 8959, 25235, 16461, 121819, 106143}},
+{14929, 18, 25468, {1, 1, 1, 3, 11, 15, 5, 157, 347, 81, 2013, 2025, 6541, 12287, 1315, 23285, 23539, 75027}},
+{14930, 18, 25482, {1, 1, 5, 7, 17, 11, 65, 157, 93, 607, 1445, 4089, 3139, 4699, 1225, 58935, 93673, 146467}},
+{14931, 18, 25489, {1, 3, 3, 13, 29, 59, 69, 141, 257, 463, 93, 649, 8179, 15205, 6943, 45317, 31269, 70825}},
+{14932, 18, 25490, {1, 3, 5, 9, 23, 39, 113, 61, 315, 463, 1739, 149, 6007, 2789, 12021, 969, 18551, 153669}},
+{14933, 18, 25505, {1, 1, 3, 15, 19, 9, 23, 211, 265, 877, 325, 2635, 8131, 4957, 24371, 60975, 3887, 198927}},
+{14934, 18, 25511, {1, 1, 3, 11, 29, 31, 5, 105, 157, 573, 2009, 1701, 1549, 1641, 17429, 13587, 48421, 8675}},
+{14935, 18, 25512, {1, 1, 5, 13, 3, 13, 17, 55, 101, 369, 705, 3635, 5195, 10439, 12881, 21565, 1671, 75489}},
+{14936, 18, 25552, {1, 3, 3, 1, 1, 23, 85, 189, 347, 205, 5, 3465, 3269, 3347, 10163, 26921, 86555, 9387}},
+{14937, 18, 25555, {1, 3, 7, 15, 27, 21, 79, 151, 279, 627, 1093, 1929, 5549, 12141, 5245, 55747, 65939, 193759}},
+{14938, 18, 25595, {1, 1, 1, 5, 5, 23, 57, 235, 143, 129, 795, 35, 4375, 12577, 871, 20879, 82811, 52279}},
+{14939, 18, 25636, {1, 3, 1, 5, 11, 1, 125, 99, 89, 629, 857, 2631, 393, 15075, 27473, 42695, 61505, 239651}},
+{14940, 18, 25672, {1, 1, 5, 1, 9, 11, 55, 203, 453, 677, 259, 1979, 4101, 16067, 26783, 17907, 75349, 62797}},
+{14941, 18, 25685, {1, 3, 7, 5, 5, 19, 85, 165, 341, 405, 1779, 87, 889, 265, 9851, 36175, 69697, 123769}},
+{14942, 18, 25696, {1, 3, 7, 1, 7, 49, 93, 57, 85, 597, 183, 3253, 6301, 9307, 8753, 38133, 58743, 19621}},
+{14943, 18, 25720, {1, 1, 3, 9, 1, 15, 125, 215, 391, 141, 87, 37, 4333, 5033, 30549, 64281, 18577, 156093}},
+{14944, 18, 25730, {1, 3, 3, 15, 17, 25, 29, 81, 339, 865, 1619, 773, 901, 8163, 22275, 57159, 119951, 137451}},
+{14945, 18, 25735, {1, 3, 5, 15, 7, 57, 113, 221, 13, 49, 1653, 3695, 4423, 4383, 28669, 64175, 130355, 202543}},
+{14946, 18, 25753, {1, 1, 3, 9, 29, 21, 19, 119, 409, 717, 1853, 3981, 4489, 3985, 31205, 10423, 13223, 131973}},
+{14947, 18, 25756, {1, 1, 3, 15, 29, 7, 1, 85, 133, 345, 317, 2363, 7803, 4975, 19441, 10497, 42059, 131531}},
+{14948, 18, 25769, {1, 1, 7, 13, 3, 53, 49, 27, 487, 901, 801, 335, 6317, 14205, 26655, 52747, 102659, 231359}},
+{14949, 18, 25821, {1, 3, 3, 3, 13, 33, 113, 107, 407, 499, 903, 3059, 1343, 11859, 6315, 23071, 73627, 44239}},
+{14950, 18, 25825, {1, 3, 5, 15, 1, 53, 59, 247, 213, 981, 443, 3, 615, 12067, 3881, 61759, 101219, 110407}},
+{14951, 18, 25840, {1, 3, 5, 13, 7, 31, 87, 161, 61, 1023, 147, 2075, 7245, 9025, 7229, 60935, 104481, 169561}},
+{14952, 18, 25860, {1, 3, 1, 15, 25, 17, 53, 107, 311, 621, 1493, 2443, 4635, 12163, 12543, 43031, 90843, 139645}},
+{14953, 18, 25869, {1, 3, 5, 11, 7, 49, 91, 165, 91, 329, 493, 3533, 7429, 7047, 14767, 31641, 62005, 77267}},
+{14954, 18, 25872, {1, 1, 3, 9, 31, 21, 19, 167, 185, 199, 1989, 1093, 4213, 4769, 21659, 19685, 122123, 215233}},
+{14955, 18, 25956, {1, 3, 3, 7, 27, 23, 99, 205, 365, 689, 1281, 419, 4207, 5355, 20245, 25029, 123029, 61499}},
+{14956, 18, 25973, {1, 3, 3, 7, 19, 15, 29, 185, 165, 203, 1859, 2895, 6361, 6331, 13641, 42577, 33757, 41305}},
+{14957, 18, 25994, {1, 3, 5, 11, 21, 43, 15, 11, 425, 125, 1597, 1109, 3335, 7009, 20799, 41261, 127813, 181261}},
+{14958, 18, 26002, {1, 1, 5, 5, 27, 35, 35, 159, 111, 1011, 1487, 813, 4985, 2555, 23741, 44675, 97159, 250477}},
+{14959, 18, 26020, {1, 3, 3, 7, 17, 41, 81, 187, 367, 767, 1345, 205, 5797, 9129, 21973, 39911, 130131, 96891}},
+{14960, 18, 26023, {1, 3, 5, 1, 1, 47, 57, 177, 127, 791, 1427, 1895, 5995, 12569, 32711, 58599, 55641, 80405}},
+{14961, 18, 26041, {1, 3, 3, 1, 23, 13, 115, 81, 511, 677, 775, 3143, 4963, 7093, 15963, 59893, 22609, 137601}},
+{14962, 18, 26044, {1, 1, 5, 9, 17, 17, 115, 127, 397, 139, 1171, 207, 3485, 15869, 465, 26267, 29957, 205459}},
+{14963, 18, 26069, {1, 3, 7, 3, 9, 29, 23, 189, 447, 481, 753, 2415, 2669, 6007, 15201, 7317, 18861, 173759}},
+{14964, 18, 26097, {1, 3, 5, 7, 13, 43, 13, 163, 363, 683, 1869, 1237, 2523, 3661, 13887, 5593, 91513, 220177}},
+{14965, 18, 26113, {1, 1, 1, 11, 7, 11, 43, 39, 319, 793, 375, 3159, 7621, 8965, 25743, 351, 31873, 18115}},
+{14966, 18, 26138, {1, 1, 5, 5, 11, 57, 79, 147, 55, 553, 417, 1365, 3979, 9789, 22677, 58645, 104549, 9019}},
+{14967, 18, 26167, {1, 1, 3, 11, 17, 37, 127, 5, 165, 867, 79, 2259, 197, 4789, 28109, 46721, 3431, 118939}},
+{14968, 18, 26216, {1, 1, 5, 13, 19, 45, 113, 11, 125, 351, 1753, 3201, 1697, 2567, 9717, 22247, 84309, 248583}},
+{14969, 18, 26230, {1, 1, 5, 9, 5, 37, 65, 47, 261, 855, 1573, 2267, 7977, 13029, 32527, 59805, 103591, 180041}},
+{14970, 18, 26243, {1, 3, 3, 9, 31, 5, 115, 159, 111, 899, 1907, 2671, 1575, 7021, 10281, 34905, 641, 63549}},
+{14971, 18, 26245, {1, 3, 5, 1, 17, 61, 45, 9, 375, 761, 117, 1767, 4657, 12217, 12067, 42807, 118587, 72715}},
+{14972, 18, 26263, {1, 1, 1, 13, 3, 3, 93, 3, 351, 97, 119, 1743, 81, 12761, 22529, 47191, 111315, 256501}},
+{14973, 18, 26264, {1, 1, 5, 7, 29, 23, 41, 9, 231, 567, 1565, 3539, 7241, 11535, 7375, 10391, 127045, 9371}},
+{14974, 18, 26269, {1, 1, 1, 15, 23, 47, 39, 57, 73, 809, 513, 3233, 8071, 8595, 13817, 821, 89091, 107173}},
+{14975, 18, 26311, {1, 1, 1, 13, 13, 43, 75, 239, 487, 175, 1561, 3925, 3743, 14247, 15713, 55005, 116135, 199827}},
+{14976, 18, 26346, {1, 1, 3, 7, 13, 15, 67, 147, 77, 241, 1763, 651, 1107, 4943, 15651, 23259, 45931, 34717}},
+{14977, 18, 26354, {1, 1, 3, 5, 15, 15, 67, 153, 163, 179, 1567, 685, 3245, 2205, 8373, 56567, 32091, 23313}},
+{14978, 18, 26365, {1, 1, 7, 9, 1, 27, 79, 209, 263, 517, 635, 3, 103, 2173, 22659, 11319, 103757, 144449}},
+{14979, 18, 26368, {1, 1, 1, 5, 11, 63, 21, 89, 443, 775, 327, 1559, 1421, 2309, 18597, 46385, 16547, 186813}},
+{14980, 18, 26398, {1, 1, 7, 9, 27, 37, 43, 7, 305, 117, 1103, 1801, 3349, 12225, 28215, 8857, 118677, 88909}},
+{14981, 18, 26401, {1, 3, 3, 7, 15, 59, 21, 19, 371, 81, 755, 1565, 4823, 16363, 20301, 33571, 74423, 177205}},
+{14982, 18, 26426, {1, 1, 3, 9, 15, 33, 23, 31, 171, 713, 271, 2437, 3609, 4271, 24355, 46283, 121767, 188501}},
+{14983, 18, 26436, {1, 1, 1, 1, 21, 3, 3, 241, 339, 211, 443, 1577, 343, 2625, 1077, 29933, 106401, 51439}},
+{14984, 18, 26443, {1, 3, 5, 15, 13, 31, 11, 167, 15, 101, 373, 2095, 3017, 1347, 15029, 6579, 21233, 87589}},
+{14985, 18, 26448, {1, 3, 1, 3, 15, 1, 61, 239, 13, 867, 1621, 2275, 5757, 8275, 7923, 44469, 113513, 84927}},
+{14986, 18, 26458, {1, 1, 1, 13, 23, 27, 101, 25, 459, 517, 127, 1131, 669, 13209, 23671, 3379, 66091, 72919}},
+{14987, 18, 26464, {1, 3, 5, 7, 29, 53, 25, 185, 101, 707, 281, 183, 2823, 7241, 3127, 48093, 20195, 208349}},
+{14988, 18, 26476, {1, 3, 3, 15, 31, 11, 3, 165, 453, 609, 1053, 3937, 1989, 13887, 13415, 8005, 103537, 17853}},
+{14989, 18, 26503, {1, 1, 3, 7, 3, 41, 13, 67, 227, 265, 767, 391, 1835, 8827, 13131, 42605, 117089, 12475}},
+{14990, 18, 26504, {1, 1, 7, 3, 15, 31, 45, 157, 261, 207, 1109, 1587, 5389, 13239, 31697, 35969, 79839, 209633}},
+{14991, 18, 26515, {1, 1, 5, 9, 31, 3, 35, 187, 5, 945, 633, 2645, 171, 2221, 18369, 41765, 82373, 8007}},
+{14992, 18, 26531, {1, 1, 7, 7, 3, 57, 73, 103, 245, 811, 1637, 101, 6335, 9911, 663, 21779, 31681, 119141}},
+{14993, 18, 26548, {1, 1, 5, 13, 27, 25, 5, 203, 183, 251, 1803, 665, 6295, 965, 5269, 379, 78455, 7097}},
+{14994, 18, 26570, {1, 1, 5, 3, 19, 55, 45, 161, 481, 737, 1903, 1093, 3313, 4427, 7959, 6231, 94769, 123827}},
+{14995, 18, 26589, {1, 1, 7, 11, 29, 41, 77, 165, 49, 875, 137, 2003, 8093, 1941, 25979, 10765, 99241, 71275}},
+{14996, 18, 26594, {1, 3, 5, 3, 23, 1, 89, 163, 293, 701, 29, 2543, 4487, 14873, 28123, 48643, 31633, 74179}},
+{14997, 18, 26608, {1, 1, 7, 1, 13, 33, 33, 173, 111, 959, 205, 1633, 3127, 3963, 6455, 41809, 60655, 247121}},
+{14998, 18, 26623, {1, 3, 5, 13, 1, 49, 87, 217, 381, 125, 823, 837, 3967, 8157, 11097, 35721, 93591, 3939}},
+{14999, 18, 26678, {1, 3, 7, 1, 7, 27, 29, 21, 295, 127, 823, 2409, 1873, 2417, 27961, 39211, 14785, 71557}},
+{15000, 18, 26690, {1, 3, 1, 5, 31, 59, 43, 121, 217, 417, 2029, 3983, 5629, 10447, 1073, 57515, 58849, 178927}},
+{15001, 18, 26709, {1, 3, 3, 11, 5, 59, 45, 39, 269, 483, 757, 3245, 4383, 11127, 26535, 17395, 60953, 259333}},
+{15002, 18, 26725, {1, 1, 1, 5, 5, 49, 81, 241, 371, 353, 1293, 3375, 6725, 11891, 5973, 13901, 37999, 17751}},
+{15003, 18, 26744, {1, 3, 3, 7, 31, 21, 45, 107, 33, 911, 1869, 2643, 2655, 3979, 5509, 33065, 128463, 246937}},
+{15004, 18, 26763, {1, 1, 1, 1, 31, 33, 99, 29, 485, 11, 1423, 1775, 2045, 741, 30691, 53957, 13891, 57303}},
+{15005, 18, 26765, {1, 1, 7, 13, 7, 37, 117, 121, 51, 743, 887, 1769, 1049, 12859, 1663, 27763, 90969, 38935}},
+{15006, 18, 26768, {1, 3, 5, 7, 3, 41, 121, 89, 461, 979, 457, 2973, 8109, 13819, 30237, 54671, 66967, 135233}},
+{15007, 18, 26784, {1, 1, 7, 13, 13, 47, 51, 121, 295, 847, 681, 1163, 8123, 14179, 26561, 54057, 74043, 146155}},
+{15008, 18, 26802, {1, 3, 3, 11, 21, 15, 9, 85, 445, 11, 1525, 3165, 5929, 12481, 10769, 31885, 51487, 248933}},
+{15009, 18, 26814, {1, 3, 1, 9, 25, 41, 59, 139, 293, 1021, 2043, 967, 3949, 7309, 6545, 62761, 37761, 22395}},
+{15010, 18, 26856, {1, 3, 7, 15, 25, 45, 29, 75, 283, 845, 687, 3285, 7263, 10237, 5343, 58635, 85137, 2387}},
+{15011, 18, 26861, {1, 1, 3, 15, 29, 33, 111, 175, 251, 181, 709, 1373, 1661, 1155, 30479, 57823, 28809, 74117}},
+{15012, 18, 26862, {1, 3, 3, 5, 11, 37, 55, 155, 439, 173, 1861, 1713, 1675, 12119, 12531, 50995, 124657, 58321}},
+{15013, 18, 26894, {1, 1, 5, 13, 1, 23, 27, 141, 3, 985, 1439, 781, 7381, 2223, 26673, 46607, 54953, 24547}},
+{15014, 18, 26908, {1, 1, 5, 7, 5, 3, 41, 115, 503, 731, 633, 3631, 3455, 15937, 22639, 41163, 65243, 233749}},
+{15015, 18, 26915, {1, 3, 1, 1, 5, 57, 89, 35, 53, 653, 1763, 1247, 6999, 1811, 28191, 52327, 129421, 191093}},
+{15016, 18, 26929, {1, 3, 3, 9, 3, 27, 107, 13, 475, 409, 1623, 483, 3127, 12841, 4777, 36157, 24967, 89795}},
+{15017, 18, 26930, {1, 1, 3, 5, 7, 29, 15, 225, 257, 923, 251, 21, 4559, 3571, 9351, 1739, 37393, 170789}},
+{15018, 18, 26939, {1, 3, 7, 5, 11, 7, 107, 237, 343, 665, 767, 2293, 4781, 4811, 11227, 25045, 3951, 44307}},
+{15019, 18, 26941, {1, 3, 7, 7, 13, 31, 47, 9, 121, 441, 1011, 2015, 8053, 355, 13441, 23213, 60675, 259761}},
+{15020, 18, 26987, {1, 1, 5, 9, 21, 61, 85, 141, 271, 577, 17, 243, 3049, 2479, 28947, 53351, 67379, 211133}},
+{15021, 18, 27023, {1, 1, 1, 15, 23, 1, 119, 141, 311, 543, 1463, 3633, 8111, 9439, 4147, 64913, 28261, 197217}},
+{15022, 18, 27066, {1, 3, 1, 15, 15, 33, 125, 231, 225, 797, 605, 259, 3673, 10423, 7541, 26289, 61681, 136463}},
+{15023, 18, 27079, {1, 3, 1, 13, 23, 15, 15, 151, 289, 657, 1883, 2923, 6861, 1411, 17159, 9353, 79463, 135813}},
+{15024, 18, 27086, {1, 3, 7, 11, 5, 59, 101, 167, 291, 63, 753, 1105, 8173, 2389, 22097, 7207, 110377, 15797}},
+{15025, 18, 27091, {1, 3, 7, 15, 7, 9, 7, 135, 303, 675, 1803, 2827, 1711, 9543, 16567, 24075, 17065, 22193}},
+{15026, 18, 27113, {1, 3, 5, 7, 17, 7, 125, 57, 423, 733, 1813, 4031, 713, 10687, 27315, 37599, 78807, 103429}},
+{15027, 18, 27157, {1, 1, 5, 15, 21, 11, 87, 21, 415, 571, 1169, 2561, 7071, 12499, 195, 20111, 116757, 157731}},
+{15028, 18, 27174, {1, 3, 3, 15, 7, 33, 11, 241, 23, 189, 599, 2891, 2829, 13327, 21777, 57733, 38583, 162161}},
+{15029, 18, 27188, {1, 1, 1, 15, 3, 49, 7, 143, 291, 301, 1439, 793, 3447, 1167, 2815, 24875, 117437, 112561}},
+{15030, 18, 27191, {1, 3, 5, 13, 29, 11, 51, 255, 365, 741, 1919, 2091, 2865, 12721, 4329, 37281, 128703, 739}},
+{15031, 18, 27197, {1, 1, 1, 13, 19, 31, 39, 141, 81, 133, 297, 3837, 7537, 16043, 11755, 10289, 74399, 95371}},
+{15032, 18, 27206, {1, 1, 7, 5, 21, 35, 125, 109, 241, 217, 1219, 2617, 1925, 9573, 19305, 44689, 89365, 248869}},
+{15033, 18, 27210, {1, 3, 5, 5, 13, 33, 43, 221, 325, 267, 837, 809, 6025, 9847, 9267, 13465, 45937, 204339}},
+{15034, 18, 27245, {1, 3, 1, 3, 25, 53, 85, 249, 105, 619, 917, 1213, 5365, 6197, 22929, 27529, 71011, 141651}},
+{15035, 18, 27254, {1, 1, 5, 1, 29, 9, 27, 161, 269, 775, 1043, 303, 4503, 5059, 479, 17237, 51383, 152495}},
+{15036, 18, 27383, {1, 3, 1, 5, 19, 5, 127, 139, 1, 461, 943, 593, 7457, 3357, 1909, 64633, 91811, 92703}},
+{15037, 18, 27387, {1, 1, 5, 7, 1, 21, 83, 29, 123, 83, 1085, 2727, 651, 15801, 20561, 34821, 17671, 162227}},
+{15038, 18, 27416, {1, 3, 7, 1, 19, 59, 33, 195, 81, 69, 51, 1473, 3873, 4247, 3587, 4293, 30831, 245345}},
+{15039, 18, 27422, {1, 3, 1, 3, 23, 27, 19, 115, 275, 293, 705, 131, 1001, 8881, 30165, 25149, 38679, 175167}},
+{15040, 18, 27472, {1, 1, 3, 15, 11, 11, 79, 55, 323, 217, 859, 897, 6567, 12529, 3161, 13009, 100787, 3501}},
+{15041, 18, 27478, {1, 3, 1, 15, 17, 63, 51, 71, 55, 207, 1095, 2527, 611, 9281, 7375, 14553, 16021, 88537}},
+{15042, 18, 27548, {1, 1, 7, 9, 11, 23, 95, 25, 327, 873, 575, 3583, 6587, 137, 23737, 59341, 83281, 93541}},
+{15043, 18, 27579, {1, 1, 5, 7, 15, 37, 89, 105, 471, 757, 103, 3747, 3565, 4957, 23537, 16193, 84843, 256757}},
+{15044, 18, 27582, {1, 3, 5, 1, 15, 17, 119, 231, 387, 715, 797, 3807, 4985, 8335, 4885, 45541, 69597, 238599}},
+{15045, 18, 27589, {1, 1, 3, 1, 7, 21, 87, 205, 39, 503, 433, 3643, 4719, 2051, 10049, 28997, 75981, 253647}},
+{15046, 18, 27593, {1, 3, 1, 13, 9, 21, 103, 63, 27, 267, 185, 3507, 3009, 5183, 2261, 40249, 33733, 70493}},
+{15047, 18, 27613, {1, 1, 3, 13, 7, 7, 79, 13, 141, 327, 1035, 1699, 6273, 5621, 13877, 57607, 50207, 184643}},
+{15048, 18, 27649, {1, 1, 3, 1, 9, 19, 75, 99, 115, 469, 1025, 1999, 1985, 9975, 11069, 59113, 80877, 124153}},
+{15049, 18, 27717, {1, 3, 5, 7, 19, 27, 47, 3, 313, 575, 107, 991, 2575, 11001, 12323, 21443, 126245, 219649}},
+{15050, 18, 27729, {1, 1, 1, 5, 19, 33, 13, 1, 357, 225, 1355, 1827, 7127, 6387, 19299, 24935, 26847, 251433}},
+{15051, 18, 27751, {1, 1, 1, 5, 3, 3, 113, 19, 425, 209, 159, 347, 1349, 6771, 13125, 8393, 21435, 186369}},
+{15052, 18, 27757, {1, 1, 5, 11, 5, 39, 95, 3, 193, 741, 1755, 3361, 1927, 12909, 5413, 29111, 123429, 109191}},
+{15053, 18, 27766, {1, 1, 1, 13, 31, 23, 43, 163, 421, 719, 457, 3149, 7741, 1465, 15719, 42831, 99051, 164675}},
+{15054, 18, 27791, {1, 1, 1, 7, 15, 1, 29, 15, 9, 577, 269, 31, 4361, 5081, 32185, 54869, 115105, 151233}},
+{15055, 18, 27794, {1, 1, 1, 11, 19, 3, 67, 3, 377, 487, 1287, 3463, 6523, 15237, 3171, 38673, 7359, 29739}},
+{15056, 18, 27854, {1, 3, 5, 11, 9, 13, 47, 191, 97, 641, 807, 1085, 1537, 2855, 24615, 32383, 66425, 53713}},
+{15057, 18, 27856, {1, 1, 5, 7, 19, 25, 93, 1, 21, 853, 813, 2535, 4291, 9051, 3385, 507, 73889, 85397}},
+{15058, 18, 27866, {1, 1, 3, 13, 7, 15, 103, 199, 83, 585, 1859, 2089, 839, 8923, 14615, 3399, 7703, 229937}},
+{15059, 18, 27875, {1, 1, 3, 3, 11, 23, 125, 135, 475, 613, 327, 339, 3081, 13221, 4889, 41233, 36547, 195357}},
+{15060, 18, 27902, {1, 3, 7, 7, 19, 23, 85, 217, 501, 447, 1873, 2175, 6753, 2825, 5171, 47561, 13321, 59583}},
+{15061, 18, 27916, {1, 1, 5, 13, 23, 59, 109, 195, 487, 785, 21, 1595, 5641, 10103, 8115, 60647, 78425, 237379}},
+{15062, 18, 27924, {1, 1, 3, 15, 21, 17, 85, 51, 369, 475, 1021, 1129, 7233, 6593, 12467, 55399, 128157, 80539}},
+{15063, 18, 27933, {1, 3, 3, 9, 31, 27, 69, 145, 489, 251, 1997, 1157, 2027, 16109, 4085, 24859, 63561, 79591}},
+{15064, 18, 27940, {1, 3, 3, 5, 29, 49, 41, 185, 405, 471, 431, 3539, 6593, 1185, 24383, 17009, 111215, 79839}},
+{15065, 18, 27947, {1, 1, 7, 3, 3, 15, 97, 157, 301, 227, 717, 3291, 2471, 11515, 30657, 30745, 72147, 98653}},
+{15066, 18, 27969, {1, 3, 5, 1, 23, 21, 67, 223, 185, 385, 137, 2897, 2423, 6119, 28471, 52269, 95725, 9105}},
+{15067, 18, 27981, {1, 3, 3, 11, 19, 1, 111, 131, 293, 495, 1043, 631, 1375, 15347, 22029, 29163, 120025, 81631}},
+{15068, 18, 27996, {1, 1, 7, 5, 17, 55, 47, 183, 367, 81, 555, 2857, 4787, 5605, 32053, 11815, 81771, 234993}},
+{15069, 18, 28005, {1, 3, 7, 15, 15, 49, 45, 221, 49, 299, 887, 3991, 2097, 10819, 23297, 1823, 11319, 205273}},
+{15070, 18, 28030, {1, 1, 1, 1, 1, 15, 91, 253, 213, 849, 501, 1073, 5503, 1379, 28887, 51811, 109763, 226149}},
+{15071, 18, 28064, {1, 1, 1, 7, 27, 39, 17, 29, 359, 655, 1695, 1781, 1203, 1125, 8983, 3477, 13925, 218399}},
+{15072, 18, 28102, {1, 3, 7, 13, 1, 25, 33, 185, 87, 19, 151, 371, 1221, 4859, 20103, 11435, 104263, 218515}},
+{15073, 18, 28108, {1, 1, 3, 5, 17, 43, 29, 149, 207, 39, 1539, 2933, 6825, 12391, 18163, 24543, 35305, 196295}},
+{15074, 18, 28120, {1, 3, 7, 9, 21, 61, 69, 231, 401, 95, 1757, 839, 3395, 7573, 6583, 34621, 119303, 20767}},
+{15075, 18, 28125, {1, 1, 7, 1, 25, 53, 63, 105, 241, 591, 23, 3219, 2387, 13945, 3047, 30939, 63243, 60941}},
+{15076, 18, 28130, {1, 1, 5, 7, 25, 47, 7, 227, 57, 279, 81, 4017, 3117, 6229, 20029, 30031, 25049, 102291}},
+{15077, 18, 28142, {1, 3, 3, 1, 21, 15, 69, 57, 311, 9, 853, 3377, 2949, 4781, 15419, 54741, 11603, 136821}},
+{15078, 18, 28149, {1, 3, 3, 13, 13, 5, 103, 253, 27, 449, 821, 3241, 41, 6643, 15217, 61691, 58463, 46117}},
+{15079, 18, 28165, {1, 1, 7, 7, 27, 51, 1, 239, 71, 955, 145, 1059, 5645, 7025, 4839, 11459, 3051, 235989}},
+{15080, 18, 28169, {1, 1, 5, 15, 15, 13, 33, 21, 209, 681, 1163, 3109, 1441, 6895, 20829, 48769, 35373, 195171}},
+{15081, 18, 28177, {1, 1, 7, 3, 11, 7, 25, 27, 463, 77, 1293, 1977, 4931, 8089, 11079, 14793, 123049, 32259}},
+{15082, 18, 28211, {1, 3, 1, 15, 11, 49, 7, 103, 79, 773, 235, 1653, 6477, 8835, 26627, 61101, 40633, 98155}},
+{15083, 18, 28213, {1, 3, 5, 7, 3, 53, 77, 197, 49, 57, 1533, 3485, 6603, 1131, 9073, 37023, 85293, 170883}},
+{15084, 18, 28220, {1, 3, 7, 15, 23, 5, 125, 75, 413, 521, 1897, 1099, 35, 2013, 687, 51511, 21359, 19995}},
+{15085, 18, 28261, {1, 3, 1, 11, 19, 13, 91, 181, 39, 613, 1917, 3149, 669, 9927, 20967, 38313, 13537, 181873}},
+{15086, 18, 28271, {1, 3, 5, 7, 5, 23, 25, 145, 189, 679, 483, 2689, 2855, 9631, 8863, 34841, 83311, 211507}},
+{15087, 18, 28299, {1, 3, 5, 15, 15, 15, 87, 53, 309, 807, 1405, 259, 3181, 12187, 31529, 8861, 70557, 247787}},
+{15088, 18, 28326, {1, 1, 7, 13, 7, 15, 1, 205, 91, 325, 1371, 531, 4917, 10291, 30827, 32491, 34497, 250301}},
+{15089, 18, 28330, {1, 3, 1, 11, 29, 17, 97, 37, 259, 1021, 1705, 4001, 4385, 7047, 14593, 63443, 3283, 18195}},
+{15090, 18, 28350, {1, 1, 7, 9, 9, 55, 11, 113, 351, 513, 197, 873, 1595, 11331, 27711, 419, 73097, 144357}},
+{15091, 18, 28355, {1, 3, 7, 15, 29, 31, 37, 15, 233, 573, 1457, 293, 5437, 15909, 3087, 24535, 6507, 173555}},
+{15092, 18, 28367, {1, 1, 1, 7, 7, 47, 81, 241, 257, 389, 233, 3275, 919, 14911, 14473, 58457, 78195, 121421}},
+{15093, 18, 28376, {1, 3, 7, 13, 1, 63, 9, 233, 231, 771, 1851, 3829, 7089, 4573, 13297, 58963, 2065, 8365}},
+{15094, 18, 28379, {1, 1, 5, 1, 31, 45, 45, 209, 77, 977, 159, 1521, 969, 10115, 32387, 52821, 124209, 51841}},
+{15095, 18, 28381, {1, 3, 5, 5, 13, 27, 53, 171, 91, 743, 217, 3805, 7721, 15127, 20679, 57459, 53649, 16381}},
+{15096, 18, 28447, {1, 3, 1, 15, 23, 43, 105, 169, 143, 759, 463, 1237, 3311, 2919, 16675, 53049, 12403, 153651}},
+{15097, 18, 28465, {1, 3, 3, 11, 5, 27, 1, 135, 17, 683, 679, 2591, 2929, 12417, 18379, 61903, 81991, 25231}},
+{15098, 18, 28471, {1, 1, 1, 5, 13, 59, 73, 119, 369, 445, 553, 243, 7523, 1105, 20349, 8417, 87535, 148857}},
+{15099, 18, 28472, {1, 3, 7, 15, 29, 3, 49, 49, 7, 753, 1597, 1427, 7485, 9119, 17427, 24961, 114897, 62841}},
+{15100, 18, 28478, {1, 1, 7, 7, 17, 35, 49, 225, 267, 801, 1359, 2131, 6093, 3859, 11305, 6287, 106459, 31093}},
+{15101, 18, 28480, {1, 1, 5, 3, 1, 45, 19, 89, 145, 23, 1071, 3053, 3463, 6781, 8635, 1961, 54403, 183401}},
+{15102, 18, 28489, {1, 3, 1, 13, 17, 35, 105, 155, 145, 597, 1169, 3731, 725, 2185, 23365, 31849, 113717, 185413}},
+{15103, 18, 28514, {1, 3, 3, 5, 3, 5, 13, 119, 39, 383, 1595, 63, 7003, 6465, 19847, 37213, 42921, 254479}},
+{15104, 18, 28525, {1, 3, 3, 1, 3, 33, 43, 255, 227, 151, 1911, 2657, 6529, 3855, 24411, 8485, 30385, 193265}},
+{15105, 18, 28537, {1, 1, 7, 7, 21, 53, 101, 37, 193, 107, 1095, 369, 6423, 3491, 1219, 53385, 31041, 122587}},
+{15106, 18, 28550, {1, 1, 7, 3, 13, 39, 101, 109, 113, 201, 619, 2489, 4545, 5017, 25519, 44281, 128605, 128595}},
+{15107, 18, 28559, {1, 1, 3, 13, 25, 7, 99, 141, 465, 625, 667, 1633, 6719, 16195, 365, 34355, 65025, 128025}},
+{15108, 18, 28595, {1, 1, 1, 7, 15, 51, 43, 159, 223, 493, 411, 65, 5753, 10219, 21885, 33267, 116643, 76777}},
+{15109, 18, 28601, {1, 3, 5, 13, 25, 39, 97, 31, 245, 367, 685, 103, 4093, 10449, 3849, 52659, 63355, 262059}},
+{15110, 18, 28629, {1, 3, 3, 1, 9, 49, 25, 157, 107, 821, 265, 2939, 6365, 7539, 17935, 50147, 88907, 214317}},
+{15111, 18, 28657, {1, 1, 1, 13, 17, 5, 55, 217, 137, 915, 121, 3187, 3111, 7145, 30477, 20023, 71969, 179417}},
+{15112, 18, 28667, {1, 1, 1, 5, 7, 15, 47, 71, 197, 725, 523, 2207, 5729, 741, 8595, 39125, 25431, 101093}},
+{15113, 18, 28711, {1, 3, 1, 7, 19, 37, 117, 235, 353, 459, 207, 953, 4955, 14979, 22897, 53911, 7783, 203667}},
+{15114, 18, 28718, {1, 1, 5, 13, 9, 17, 21, 95, 37, 751, 1463, 2491, 791, 1569, 32055, 61415, 113885, 259285}},
+{15115, 18, 28730, {1, 1, 3, 11, 1, 23, 5, 73, 61, 719, 215, 469, 3267, 12003, 16535, 46913, 58321, 2407}},
+{15116, 18, 28732, {1, 1, 5, 11, 5, 9, 81, 1, 275, 877, 791, 1591, 2109, 9983, 29085, 15069, 44757, 17887}},
+{15117, 18, 28777, {1, 3, 7, 11, 23, 47, 121, 53, 55, 677, 1239, 2591, 579, 11321, 14231, 53701, 71947, 56793}},
+{15118, 18, 28801, {1, 1, 5, 1, 7, 31, 39, 205, 231, 843, 159, 2301, 7765, 3317, 8935, 60647, 110545, 142543}},
+{15119, 18, 28822, {1, 3, 3, 11, 25, 39, 9, 131, 145, 373, 41, 1687, 417, 9427, 8657, 18315, 18505, 144055}},
+{15120, 18, 28855, {1, 3, 7, 3, 1, 51, 61, 223, 409, 607, 1281, 1767, 4719, 10741, 21537, 17307, 5473, 76127}},
+{15121, 18, 28859, {1, 1, 1, 1, 1, 43, 35, 157, 183, 835, 1141, 3235, 1383, 11381, 4503, 20435, 73125, 196955}},
+{15122, 18, 28869, {1, 1, 5, 7, 13, 47, 9, 191, 349, 587, 1887, 3667, 619, 9443, 28781, 7759, 6023, 81595}},
+{15123, 18, 28893, {1, 3, 5, 9, 31, 27, 77, 47, 375, 229, 989, 1241, 4937, 5881, 18797, 21743, 49947, 246165}},
+{15124, 18, 28904, {1, 1, 5, 1, 29, 23, 43, 237, 293, 391, 243, 3471, 5205, 9951, 29329, 19873, 114325, 19239}},
+{15125, 18, 28922, {1, 3, 3, 5, 19, 49, 23, 149, 419, 23, 21, 515, 3321, 3157, 28559, 8521, 11119, 192881}},
+{15126, 18, 28930, {1, 3, 1, 9, 29, 17, 15, 13, 171, 57, 1849, 3815, 7361, 7723, 23657, 60883, 54953, 159861}},
+{15127, 18, 28949, {1, 1, 3, 5, 13, 57, 35, 227, 143, 725, 2023, 2583, 2277, 4721, 4395, 61479, 112487, 211861}},
+{15128, 18, 28972, {1, 1, 5, 7, 7, 25, 83, 95, 281, 931, 415, 1661, 1543, 5313, 13317, 21203, 23965, 60891}},
+{15129, 18, 29002, {1, 3, 3, 1, 25, 51, 65, 147, 7, 521, 235, 2165, 6219, 14247, 30621, 43245, 8133, 49481}},
+{15130, 18, 29009, {1, 1, 5, 11, 13, 27, 39, 51, 213, 811, 151, 1157, 7821, 6481, 32097, 12319, 52005, 33291}},
+{15131, 18, 29061, {1, 1, 1, 13, 19, 15, 39, 205, 481, 253, 1643, 2969, 3181, 13995, 29877, 1307, 101721, 119111}},
+{15132, 18, 29068, {1, 1, 1, 11, 5, 63, 57, 53, 187, 315, 1521, 847, 5955, 3179, 21459, 25937, 83215, 181599}},
+{15133, 18, 29107, {1, 1, 7, 13, 17, 35, 113, 73, 105, 497, 1183, 3397, 4443, 14697, 29201, 40737, 40943, 3529}},
+{15134, 18, 29119, {1, 3, 5, 5, 3, 53, 101, 125, 173, 137, 333, 381, 1143, 1165, 789, 50013, 23595, 50235}},
+{15135, 18, 29142, {1, 1, 3, 1, 23, 3, 21, 143, 475, 337, 1693, 2341, 6509, 4167, 21031, 13887, 83191, 85187}},
+{15136, 18, 29146, {1, 1, 3, 1, 29, 59, 39, 217, 77, 943, 1531, 383, 6535, 2593, 8601, 61865, 26629, 57313}},
+{15137, 18, 29152, {1, 3, 5, 15, 17, 15, 19, 31, 273, 507, 1193, 2501, 4677, 13355, 5287, 1155, 102959, 185219}},
+{15138, 18, 29200, {1, 1, 1, 9, 3, 3, 5, 111, 159, 913, 331, 303, 3673, 12227, 5245, 63749, 107123, 26315}},
+{15139, 18, 29206, {1, 3, 5, 11, 13, 13, 115, 237, 481, 793, 1783, 1107, 4811, 3965, 29571, 63237, 15013, 176925}},
+{15140, 18, 29245, {1, 1, 7, 1, 13, 57, 85, 15, 19, 889, 1637, 1721, 6299, 6659, 5541, 24365, 38363, 67749}},
+{15141, 18, 29254, {1, 1, 3, 1, 9, 39, 15, 183, 133, 821, 1361, 2617, 7197, 8251, 12599, 60549, 42947, 72519}},
+{15142, 18, 29258, {1, 3, 1, 5, 19, 17, 69, 189, 309, 33, 2003, 569, 6189, 7845, 22351, 14623, 35287, 160511}},
+{15143, 18, 29260, {1, 1, 7, 13, 25, 3, 1, 203, 163, 661, 513, 3513, 741, 16259, 29817, 6059, 23823, 51869}},
+{15144, 18, 29268, {1, 3, 3, 1, 9, 43, 59, 77, 465, 223, 2007, 2187, 1499, 9373, 10535, 22207, 111689, 108485}},
+{15145, 18, 29281, {1, 1, 5, 15, 1, 21, 87, 163, 177, 751, 115, 3981, 4257, 5345, 31211, 44075, 16983, 69783}},
+{15146, 18, 29306, {1, 1, 1, 3, 29, 31, 7, 41, 181, 979, 1661, 1403, 2577, 983, 545, 6205, 20183, 44735}},
+{15147, 18, 29317, {1, 3, 3, 15, 5, 1, 85, 243, 59, 161, 1053, 803, 1813, 13583, 2559, 62761, 105337, 83209}},
+{15148, 18, 29324, {1, 3, 3, 3, 5, 21, 101, 61, 379, 369, 1865, 3289, 2643, 951, 26493, 17915, 8185, 42387}},
+{15149, 18, 29342, {1, 3, 5, 15, 15, 13, 119, 103, 141, 735, 1317, 3345, 2885, 4145, 30719, 965, 10819, 90295}},
+{15150, 18, 29375, {1, 3, 7, 13, 15, 11, 19, 163, 495, 369, 1285, 609, 1559, 9965, 31123, 55101, 76743, 104435}},
+{15151, 18, 29384, {1, 1, 5, 1, 25, 5, 5, 139, 441, 447, 353, 1369, 959, 14593, 30991, 20651, 126945, 2219}},
+{15152, 18, 29389, {1, 3, 5, 9, 21, 9, 113, 83, 115, 15, 161, 1559, 3095, 1447, 10253, 51481, 114541, 248375}},
+{15153, 18, 29411, {1, 3, 3, 1, 31, 61, 111, 69, 495, 195, 1153, 2605, 5061, 15509, 8253, 41909, 126033, 51173}},
+{15154, 18, 29413, {1, 1, 7, 15, 15, 41, 121, 75, 471, 539, 341, 441, 5357, 11509, 32525, 65477, 101251, 164835}},
+{15155, 18, 29446, {1, 1, 5, 7, 3, 63, 13, 123, 285, 499, 1023, 3533, 483, 13747, 26515, 52381, 9073, 256319}},
+{15156, 18, 29457, {1, 3, 1, 13, 29, 41, 75, 43, 229, 557, 1775, 1933, 5567, 11439, 22045, 10571, 96761, 98559}},
+{15157, 18, 29458, {1, 1, 3, 11, 19, 39, 3, 93, 435, 433, 2005, 1561, 385, 15865, 19763, 44105, 48107, 163063}},
+{15158, 18, 29483, {1, 1, 7, 5, 29, 37, 53, 19, 335, 325, 133, 2055, 3029, 14573, 30395, 38599, 97637, 203443}},
+{15159, 18, 29488, {1, 1, 7, 15, 29, 51, 7, 145, 21, 955, 1013, 579, 4971, 4849, 11691, 23725, 71079, 102641}},
+{15160, 18, 29494, {1, 1, 7, 3, 9, 49, 79, 187, 237, 823, 1951, 2947, 3633, 9119, 14393, 52969, 44703, 222389}},
+{15161, 18, 29506, {1, 3, 5, 11, 13, 9, 13, 245, 499, 661, 1899, 1313, 6907, 12259, 4577, 38547, 79687, 17555}},
+{15162, 18, 29553, {1, 3, 3, 1, 5, 59, 123, 197, 293, 247, 687, 695, 7493, 3115, 28535, 44335, 31905, 81607}},
+{15163, 18, 29569, {1, 3, 1, 3, 19, 5, 45, 101, 457, 395, 565, 3155, 8081, 4863, 1199, 32133, 73087, 27025}},
+{15164, 18, 29587, {1, 3, 7, 1, 31, 35, 111, 95, 379, 663, 731, 1813, 4551, 13105, 18275, 19729, 121971, 139959}},
+{15165, 18, 29590, {1, 1, 7, 3, 23, 47, 11, 117, 323, 943, 183, 2169, 4625, 12931, 1305, 23345, 119521, 67911}},
+{15166, 18, 29600, {1, 1, 1, 13, 19, 45, 37, 77, 301, 741, 747, 241, 5865, 11141, 7961, 10609, 97833, 256555}},
+{15167, 18, 29612, {1, 1, 1, 11, 27, 21, 119, 103, 277, 761, 201, 2063, 1043, 13303, 6535, 15553, 57695, 124187}},
+{15168, 18, 29665, {1, 3, 7, 3, 1, 11, 79, 143, 345, 237, 1421, 193, 1889, 2515, 11729, 559, 35227, 9393}},
+{15169, 18, 29722, {1, 3, 1, 1, 27, 27, 117, 159, 183, 871, 47, 989, 999, 303, 30833, 8229, 116301, 199439}},
+{15170, 18, 29745, {1, 1, 1, 1, 31, 27, 41, 83, 435, 409, 999, 2275, 4489, 1985, 21455, 23275, 125039, 192979}},
+{15171, 18, 29746, {1, 3, 7, 3, 19, 49, 27, 185, 9, 385, 191, 735, 3439, 16307, 21181, 58749, 128393, 140383}},
+{15172, 18, 29752, {1, 3, 7, 3, 15, 5, 65, 89, 11, 915, 673, 947, 3847, 6833, 10095, 34261, 101645, 42131}},
+{15173, 18, 29775, {1, 3, 5, 11, 11, 25, 79, 225, 495, 951, 1033, 5, 699, 9621, 1791, 48221, 59275, 49875}},
+{15174, 18, 29778, {1, 3, 7, 13, 29, 59, 105, 101, 233, 901, 863, 413, 2087, 16209, 445, 27463, 61465, 121795}},
+{15175, 18, 29800, {1, 1, 1, 11, 5, 19, 11, 51, 503, 313, 195, 3, 7249, 4919, 11931, 15569, 118297, 115989}},
+{15176, 18, 29829, {1, 3, 3, 13, 13, 61, 63, 57, 429, 487, 2033, 847, 7539, 1469, 3197, 1307, 124557, 211999}},
+{15177, 18, 29830, {1, 3, 7, 13, 25, 27, 39, 103, 165, 39, 1587, 3103, 1745, 12593, 10779, 37105, 29059, 256739}},
+{15178, 18, 29877, {1, 3, 3, 9, 25, 51, 105, 109, 99, 267, 623, 1351, 3837, 793, 28609, 52199, 15621, 77873}},
+{15179, 18, 29881, {1, 1, 3, 7, 29, 61, 45, 237, 431, 791, 91, 1259, 8071, 11103, 27257, 10153, 18639, 248949}},
+{15180, 18, 29884, {1, 1, 1, 9, 15, 47, 113, 189, 291, 837, 1317, 2263, 7183, 6669, 17241, 35275, 9087, 241577}},
+{15181, 18, 29895, {1, 1, 3, 1, 15, 59, 85, 21, 69, 569, 1473, 2735, 713, 3817, 14677, 26897, 75291, 251255}},
+{15182, 18, 29899, {1, 1, 1, 7, 17, 21, 105, 77, 367, 905, 513, 1807, 5571, 14627, 10349, 47821, 34395, 51143}},
+{15183, 18, 29916, {1, 3, 7, 13, 27, 19, 123, 145, 371, 857, 1699, 2231, 373, 781, 28713, 21441, 64059, 10689}},
+{15184, 18, 29923, {1, 1, 1, 7, 19, 57, 81, 223, 87, 315, 1253, 421, 1371, 1547, 1411, 6809, 23889, 213385}},
+{15185, 18, 29935, {1, 3, 1, 5, 23, 57, 89, 15, 227, 965, 1247, 3861, 7723, 15621, 7151, 53961, 47167, 73679}},
+{15186, 18, 29955, {1, 3, 7, 15, 31, 21, 9, 79, 87, 561, 1001, 3395, 2095, 15381, 30725, 48111, 68031, 121687}},
+{15187, 18, 29962, {1, 3, 1, 9, 15, 29, 83, 87, 377, 331, 2035, 93, 2319, 3637, 4809, 40091, 93141, 39881}},
+{15188, 18, 29969, {1, 3, 3, 11, 21, 39, 27, 159, 161, 439, 1417, 595, 4873, 15703, 32743, 56603, 35881, 160727}},
+{15189, 18, 29997, {1, 1, 3, 5, 21, 37, 55, 159, 497, 425, 469, 1185, 5015, 7045, 7179, 65325, 97167, 75723}},
+{15190, 18, 30032, {1, 3, 1, 7, 31, 21, 125, 223, 479, 765, 1115, 33, 2765, 12781, 22923, 36051, 103749, 33703}},
+{15191, 18, 30041, {1, 1, 7, 1, 9, 3, 29, 125, 337, 973, 253, 3179, 3269, 8801, 19369, 20693, 17331, 190295}},
+{15192, 18, 30048, {1, 1, 3, 3, 13, 5, 115, 31, 481, 45, 855, 81, 3663, 10443, 13853, 29847, 99471, 249943}},
+{15193, 18, 30060, {1, 1, 3, 7, 3, 1, 47, 31, 169, 625, 201, 2257, 4617, 1633, 26681, 53793, 78257, 8955}},
+{15194, 18, 30063, {1, 1, 5, 1, 23, 3, 95, 89, 429, 559, 119, 2619, 1235, 7609, 21905, 45495, 19461, 189091}},
+{15195, 18, 30105, {1, 3, 5, 5, 11, 33, 123, 45, 89, 899, 1607, 3717, 6745, 15199, 22955, 15891, 50411, 148201}},
+{15196, 18, 30122, {1, 3, 5, 9, 19, 23, 87, 21, 39, 117, 603, 823, 3015, 14853, 4341, 49029, 97183, 218713}},
+{15197, 18, 30141, {1, 1, 3, 7, 11, 55, 31, 255, 399, 861, 745, 1013, 4583, 15871, 32453, 25357, 90645, 100835}},
+{15198, 18, 30142, {1, 1, 1, 11, 13, 27, 57, 233, 45, 339, 305, 3689, 5273, 11801, 29109, 44139, 83171, 250559}},
+{15199, 18, 30153, {1, 3, 7, 13, 19, 1, 29, 113, 207, 313, 1465, 3563, 2535, 3307, 14921, 1923, 31429, 59815}},
+{15200, 18, 30171, {1, 3, 1, 5, 29, 25, 59, 95, 177, 795, 353, 3973, 8029, 1687, 5045, 16157, 30361, 218479}},
+{15201, 18, 30192, {1, 3, 5, 3, 5, 27, 109, 239, 121, 347, 93, 1645, 3293, 13181, 23793, 42935, 98659, 85385}},
+{15202, 18, 30197, {1, 1, 7, 9, 9, 37, 127, 211, 77, 557, 177, 2465, 7895, 5523, 26665, 23463, 71715, 126673}},
+{15203, 18, 30223, {1, 3, 7, 1, 27, 55, 125, 85, 47, 739, 1513, 3763, 5335, 3135, 11913, 22405, 90785, 88845}},
+{15204, 18, 30235, {1, 3, 3, 9, 29, 21, 123, 211, 491, 83, 697, 929, 3507, 7139, 30569, 16365, 122657, 77523}},
+{15205, 18, 30241, {1, 3, 5, 5, 27, 21, 41, 129, 67, 503, 877, 1893, 6055, 12709, 24613, 43831, 124035, 62631}},
+{15206, 18, 30256, {1, 3, 3, 1, 21, 15, 59, 185, 405, 487, 627, 3737, 345, 14751, 2947, 15815, 55047, 207137}},
+{15207, 18, 30291, {1, 1, 1, 9, 15, 29, 19, 155, 101, 405, 597, 329, 2977, 4333, 5465, 43863, 6009, 229481}},
+{15208, 18, 30293, {1, 1, 1, 11, 7, 27, 93, 207, 43, 599, 1899, 3979, 4219, 10199, 2901, 34261, 19435, 58317}},
+{15209, 18, 30300, {1, 1, 7, 15, 9, 47, 33, 209, 235, 655, 253, 3507, 3355, 1685, 7045, 58907, 41791, 175835}},
+{15210, 18, 30331, {1, 3, 3, 11, 11, 43, 21, 255, 45, 831, 1051, 1271, 7945, 9793, 11125, 17709, 118267, 169981}},
+{15211, 18, 30349, {1, 3, 7, 13, 27, 37, 45, 221, 243, 37, 1493, 2773, 6655, 7451, 22609, 56559, 12063, 221143}},
+{15212, 18, 30361, {1, 3, 1, 1, 9, 15, 97, 61, 241, 825, 735, 3953, 5331, 16373, 19403, 28933, 31881, 111545}},
+{15213, 18, 30367, {1, 1, 1, 15, 29, 1, 127, 111, 329, 741, 1589, 1653, 5949, 8703, 27617, 65285, 122167, 11895}},
+{15214, 18, 30392, {1, 1, 3, 3, 17, 31, 91, 197, 421, 865, 1901, 897, 6917, 15943, 12823, 15325, 17011, 110783}},
+{15215, 18, 30405, {1, 1, 3, 15, 21, 57, 29, 179, 503, 929, 1513, 205, 6083, 4015, 32517, 26921, 54229, 147789}},
+{15216, 18, 30410, {1, 1, 7, 15, 27, 21, 95, 59, 193, 97, 1235, 819, 4435, 371, 627, 24673, 1775, 261041}},
+{15217, 18, 30415, {1, 1, 7, 15, 3, 37, 99, 85, 505, 1011, 19, 1241, 5299, 15661, 27323, 44625, 12683, 225687}},
+{15218, 18, 30439, {1, 1, 7, 3, 25, 37, 111, 121, 217, 659, 365, 2627, 5499, 12911, 951, 54317, 51927, 235327}},
+{15219, 18, 30446, {1, 1, 3, 9, 29, 31, 99, 195, 427, 735, 1817, 3675, 4269, 1579, 12593, 39285, 74909, 230613}},
+{15220, 18, 30501, {1, 3, 1, 13, 7, 21, 37, 101, 111, 931, 1581, 465, 4753, 15607, 14515, 29769, 107711, 32703}},
+{15221, 18, 30526, {1, 1, 7, 15, 25, 57, 117, 119, 309, 345, 491, 3647, 2933, 5409, 15431, 43731, 25537, 17269}},
+{15222, 18, 30531, {1, 1, 5, 3, 15, 9, 83, 221, 501, 675, 1441, 129, 213, 5587, 22361, 16739, 118845, 192835}},
+{15223, 18, 30537, {1, 3, 7, 13, 1, 31, 75, 23, 13, 447, 687, 2711, 7577, 8275, 5051, 61835, 22159, 56477}},
+{15224, 18, 30546, {1, 1, 3, 1, 23, 19, 111, 45, 395, 841, 1665, 21, 7435, 12457, 11065, 20007, 48785, 15115}},
+{15225, 18, 30568, {1, 3, 7, 7, 21, 3, 117, 35, 117, 433, 561, 3045, 2169, 3255, 18015, 41093, 99699, 3479}},
+{15226, 18, 30581, {1, 1, 3, 7, 9, 59, 65, 143, 315, 63, 29, 3817, 1259, 7119, 20847, 44407, 80015, 37851}},
+{15227, 18, 30588, {1, 3, 7, 13, 13, 33, 85, 75, 39, 163, 1759, 1197, 5971, 8815, 8745, 45625, 121873, 246197}},
+{15228, 18, 30598, {1, 1, 1, 13, 31, 41, 61, 7, 145, 113, 943, 3757, 2141, 3523, 22351, 14143, 107683, 105579}},
+{15229, 18, 30607, {1, 1, 5, 5, 23, 27, 75, 77, 25, 901, 1295, 3091, 981, 10109, 12649, 15123, 102433, 145557}},
+{15230, 18, 30609, {1, 1, 7, 5, 9, 11, 19, 229, 301, 835, 1577, 3365, 425, 2271, 15647, 11685, 57315, 131043}},
+{15231, 18, 30616, {1, 3, 1, 13, 31, 3, 113, 7, 473, 395, 1979, 61, 4205, 2031, 28007, 34789, 54463, 94741}},
+{15232, 18, 30626, {1, 1, 3, 5, 7, 13, 35, 151, 461, 621, 185, 2645, 907, 9151, 25953, 26363, 105531, 235555}},
+{15233, 18, 30628, {1, 3, 3, 13, 21, 5, 43, 183, 149, 607, 509, 777, 4089, 16365, 32201, 60431, 58773, 92719}},
+{15234, 18, 30638, {1, 3, 3, 11, 25, 53, 103, 203, 269, 1017, 77, 3537, 4839, 15991, 29223, 57397, 122735, 67299}},
+{15235, 18, 30658, {1, 3, 3, 1, 29, 45, 85, 171, 307, 455, 1399, 2367, 5991, 5751, 27957, 36649, 9251, 38581}},
+{15236, 18, 30663, {1, 1, 5, 13, 29, 15, 127, 1, 175, 921, 671, 2469, 3137, 3679, 32521, 5321, 92505, 45901}},
+{15237, 18, 30675, {1, 3, 3, 11, 23, 23, 113, 255, 443, 609, 1085, 133, 5369, 885, 17043, 20961, 36137, 260457}},
+{15238, 18, 30698, {1, 3, 3, 9, 13, 55, 117, 19, 111, 323, 275, 495, 6679, 2217, 12015, 3053, 32745, 189413}},
+{15239, 18, 30708, {1, 3, 5, 13, 31, 43, 37, 225, 67, 755, 1427, 3967, 6497, 9987, 28145, 50583, 59457, 213217}},
+{15240, 18, 30712, {1, 3, 1, 15, 1, 5, 121, 249, 293, 695, 1697, 313, 61, 4037, 11757, 53739, 5693, 106225}},
+{15241, 18, 30727, {1, 1, 7, 1, 23, 9, 111, 211, 303, 147, 1291, 3807, 1969, 4115, 7473, 50077, 60745, 41605}},
+{15242, 18, 30736, {1, 3, 3, 15, 21, 51, 63, 171, 197, 403, 1327, 1851, 6991, 9069, 19221, 45765, 55489, 34853}},
+{15243, 18, 30748, {1, 1, 5, 3, 5, 53, 87, 241, 255, 309, 1319, 3727, 3189, 10887, 13401, 32371, 24479, 170571}},
+{15244, 18, 30758, {1, 1, 7, 11, 5, 5, 59, 177, 317, 835, 527, 165, 2137, 9597, 30181, 1779, 75407, 185827}},
+{15245, 18, 30775, {1, 3, 3, 7, 25, 15, 15, 183, 235, 955, 27, 2223, 5587, 11301, 17653, 56697, 70787, 198347}},
+{15246, 18, 30793, {1, 3, 5, 5, 11, 63, 123, 41, 169, 975, 1709, 2965, 7491, 4183, 15217, 41343, 36139, 9649}},
+{15247, 18, 30802, {1, 1, 3, 7, 5, 37, 87, 247, 379, 603, 781, 463, 8063, 13681, 32005, 43485, 107401, 42303}},
+{15248, 18, 30820, {1, 3, 5, 9, 19, 53, 61, 219, 217, 361, 769, 1687, 5643, 3145, 12885, 40303, 86377, 255051}},
+{15249, 18, 30823, {1, 1, 7, 11, 15, 49, 127, 99, 127, 515, 647, 1725, 1605, 2357, 2069, 31803, 14179, 180367}},
+{15250, 18, 30827, {1, 3, 5, 15, 9, 7, 41, 3, 49, 485, 1471, 207, 6477, 4463, 12255, 53481, 110785, 909}},
+{15251, 18, 30848, {1, 1, 5, 9, 23, 51, 107, 227, 205, 987, 1525, 2739, 6761, 12343, 32311, 12523, 93351, 29663}},
+{15252, 18, 30893, {1, 3, 5, 11, 21, 19, 53, 169, 197, 21, 825, 4029, 6733, 8943, 13475, 60677, 31001, 242291}},
+{15253, 18, 30906, {1, 3, 7, 13, 9, 27, 87, 37, 265, 877, 735, 2249, 4801, 2365, 16923, 40451, 29693, 222483}},
+{15254, 18, 30950, {1, 1, 3, 9, 31, 61, 71, 103, 215, 421, 193, 3451, 6181, 4271, 30875, 59573, 80773, 100369}},
+{15255, 18, 30956, {1, 1, 3, 13, 17, 55, 73, 191, 233, 821, 961, 1637, 2393, 3453, 25959, 5069, 114585, 186001}},
+{15256, 18, 30996, {1, 1, 7, 5, 15, 27, 39, 23, 69, 811, 709, 2349, 6011, 803, 12497, 7387, 62023, 247875}},
+{15257, 18, 31015, {1, 1, 5, 13, 29, 55, 51, 41, 121, 599, 1633, 3813, 1913, 3803, 26097, 53799, 30997, 261965}},
+{15258, 18, 31016, {1, 1, 1, 11, 31, 25, 19, 195, 87, 657, 1005, 3853, 61, 6585, 24665, 38283, 5495, 257201}},
+{15259, 18, 31034, {1, 1, 1, 11, 23, 43, 91, 121, 49, 491, 1443, 1873, 7689, 15957, 30463, 64079, 100003, 325}},
+{15260, 18, 31099, {1, 1, 7, 1, 25, 51, 27, 105, 119, 233, 513, 3403, 2647, 2847, 12687, 15619, 71225, 243759}},
+{15261, 18, 31123, {1, 1, 7, 3, 17, 49, 19, 123, 307, 463, 1619, 1853, 7019, 2605, 17351, 7971, 20675, 235929}},
+{15262, 18, 31145, {1, 1, 5, 3, 17, 29, 71, 215, 365, 955, 1631, 3549, 1379, 13881, 25409, 55703, 29863, 135401}},
+{15263, 18, 31166, {1, 3, 7, 15, 3, 27, 107, 149, 65, 681, 505, 3957, 6697, 11203, 9321, 63323, 98587, 199241}},
+{15264, 18, 31168, {1, 1, 1, 13, 27, 41, 59, 223, 431, 339, 1805, 899, 639, 6559, 13233, 4773, 37415, 110477}},
+{15265, 18, 31174, {1, 3, 7, 9, 1, 59, 79, 161, 311, 905, 1755, 3915, 6259, 8955, 14187, 11331, 86185, 209805}},
+{15266, 18, 31216, {1, 1, 7, 9, 5, 27, 75, 93, 285, 89, 891, 3341, 1157, 11219, 8883, 8093, 68949, 189643}},
+{15267, 18, 31219, {1, 3, 1, 5, 1, 43, 97, 71, 67, 605, 739, 1641, 4415, 4487, 13437, 12755, 121595, 55761}},
+{15268, 18, 31238, {1, 1, 1, 3, 1, 13, 61, 77, 297, 507, 1527, 3585, 4515, 13913, 7679, 28461, 61807, 196517}},
+{15269, 18, 31256, {1, 1, 1, 3, 21, 23, 101, 135, 59, 485, 1601, 3713, 7409, 349, 16543, 18897, 97253, 149055}},
+{15270, 18, 31304, {1, 1, 1, 13, 5, 37, 15, 37, 109, 1005, 363, 1925, 2701, 13169, 17027, 58453, 27667, 234027}},
+{15271, 18, 31315, {1, 1, 7, 1, 1, 41, 67, 231, 143, 951, 2023, 3465, 1717, 645, 17353, 9037, 129127, 199467}},
+{15272, 18, 31324, {1, 1, 1, 11, 27, 29, 65, 139, 425, 947, 141, 2601, 7339, 4451, 25065, 62691, 62355, 91819}},
+{15273, 18, 31364, {1, 3, 7, 15, 29, 29, 93, 25, 139, 267, 1319, 3839, 7295, 11855, 17775, 30199, 44127, 150875}},
+{15274, 18, 31379, {1, 3, 5, 1, 3, 55, 23, 191, 199, 583, 1167, 1357, 6477, 11827, 15581, 56541, 16603, 120139}},
+{15275, 18, 31382, {1, 1, 1, 3, 5, 47, 103, 211, 443, 491, 1043, 4001, 121, 1637, 5685, 42675, 13009, 22979}},
+{15276, 18, 31412, {1, 1, 1, 9, 21, 7, 77, 17, 303, 955, 51, 2389, 3573, 8817, 28053, 40269, 35457, 211023}},
+{15277, 18, 31451, {1, 3, 5, 15, 3, 39, 17, 75, 223, 37, 1231, 2127, 3575, 9085, 10715, 41871, 103703, 154181}},
+{15278, 18, 31487, {1, 3, 3, 15, 25, 31, 31, 223, 473, 267, 1519, 3205, 7029, 10753, 24757, 28187, 117921, 26783}},
+{15279, 18, 31509, {1, 3, 7, 1, 5, 21, 105, 191, 55, 115, 1813, 3701, 1673, 4199, 2441, 19737, 46913, 208725}},
+{15280, 18, 31510, {1, 1, 5, 5, 19, 63, 89, 141, 143, 783, 545, 883, 2979, 9219, 24983, 41793, 88441, 207095}},
+{15281, 18, 31520, {1, 1, 1, 9, 21, 21, 93, 161, 93, 733, 417, 3133, 8155, 12415, 16343, 11727, 82877, 94469}},
+{15282, 18, 31535, {1, 1, 5, 15, 5, 39, 33, 203, 213, 731, 1849, 1675, 6029, 2743, 1529, 16345, 13955, 54929}},
+{15283, 18, 31564, {1, 1, 7, 7, 23, 47, 121, 211, 271, 737, 1015, 1021, 5641, 12659, 27545, 52363, 104761, 150143}},
+{15284, 18, 31585, {1, 3, 1, 11, 11, 51, 79, 141, 255, 1007, 481, 3221, 7741, 6861, 24943, 63091, 46741, 33359}},
+{15285, 18, 31586, {1, 1, 3, 3, 27, 47, 85, 27, 423, 811, 75, 3911, 1951, 10821, 7487, 18971, 83355, 197479}},
+{15286, 18, 31600, {1, 1, 5, 5, 1, 63, 125, 251, 457, 795, 557, 217, 2335, 5659, 18375, 52183, 9789, 31417}},
+{15287, 18, 31643, {1, 3, 3, 3, 19, 61, 41, 129, 345, 361, 187, 3881, 43, 7197, 7673, 25011, 115155, 16375}},
+{15288, 18, 31646, {1, 3, 3, 7, 13, 7, 55, 91, 153, 341, 2003, 2013, 6891, 2411, 14825, 39555, 50267, 61405}},
+{15289, 18, 31649, {1, 3, 5, 7, 13, 57, 21, 91, 331, 615, 1297, 2881, 2011, 1907, 16489, 43061, 75731, 76675}},
+{15290, 18, 31650, {1, 1, 5, 5, 25, 15, 77, 175, 101, 885, 835, 529, 2787, 547, 20191, 50457, 58557, 61807}},
+{15291, 18, 31674, {1, 3, 7, 1, 13, 47, 101, 117, 179, 245, 861, 611, 4377, 5257, 12807, 26667, 19889, 112485}},
+{15292, 18, 31679, {1, 3, 7, 1, 27, 3, 23, 109, 197, 187, 963, 1827, 5741, 11921, 6359, 3989, 108939, 5761}},
+{15293, 18, 31684, {1, 1, 7, 5, 27, 7, 119, 159, 53, 969, 557, 597, 7821, 7121, 17341, 11233, 10811, 23969}},
+{15294, 18, 31688, {1, 1, 3, 13, 23, 55, 75, 131, 339, 917, 317, 2645, 5973, 9939, 26375, 29261, 80883, 229897}},
+{15295, 18, 31706, {1, 1, 5, 13, 3, 63, 41, 191, 315, 191, 649, 2119, 317, 14699, 4097, 19557, 97015, 124557}},
+{15296, 18, 31735, {1, 3, 7, 15, 13, 29, 29, 43, 47, 37, 729, 185, 4477, 15091, 13991, 18701, 56785, 218823}},
+{15297, 18, 31754, {1, 3, 7, 15, 31, 39, 17, 133, 469, 509, 995, 1683, 391, 1775, 15431, 63489, 7405, 122125}},
+{15298, 18, 31761, {1, 3, 7, 5, 15, 63, 5, 235, 193, 411, 1493, 3967, 3279, 6421, 13359, 20949, 68097, 69469}},
+{15299, 18, 31774, {1, 3, 3, 13, 7, 37, 7, 207, 399, 553, 1629, 1903, 329, 7577, 5813, 17151, 40889, 174811}},
+{15300, 18, 31807, {1, 3, 1, 13, 7, 39, 119, 109, 323, 61, 749, 1377, 911, 8195, 19753, 6265, 60783, 182339}},
+{15301, 18, 31812, {1, 1, 5, 11, 3, 21, 89, 61, 243, 273, 1317, 3443, 117, 6205, 13907, 12903, 95485, 103355}},
+{15302, 18, 31821, {1, 3, 7, 13, 19, 27, 45, 251, 405, 289, 121, 1501, 2599, 8111, 5163, 17437, 75095, 165847}},
+{15303, 18, 31855, {1, 3, 3, 5, 23, 13, 29, 145, 333, 573, 1939, 2133, 5797, 5263, 18835, 11945, 42161, 103123}},
+{15304, 18, 31919, {1, 3, 5, 13, 9, 31, 45, 17, 181, 111, 219, 3451, 1591, 5823, 20307, 41207, 77047, 173401}},
+{15305, 18, 31934, {1, 3, 1, 9, 19, 63, 73, 111, 377, 875, 1749, 2887, 7035, 14209, 1805, 20527, 93839, 225185}},
+{15306, 18, 31956, {1, 3, 1, 9, 15, 45, 97, 235, 11, 803, 899, 427, 3353, 7363, 26687, 1307, 5451, 176233}},
+{15307, 18, 31965, {1, 3, 7, 5, 7, 51, 59, 53, 3, 263, 159, 1005, 6079, 7237, 17419, 56653, 61091, 182209}},
+{15308, 18, 31975, {1, 1, 3, 15, 19, 47, 17, 185, 167, 219, 233, 2921, 5755, 1277, 27281, 33671, 3191, 169477}},
+{15309, 18, 31981, {1, 3, 7, 1, 25, 27, 99, 81, 57, 969, 821, 2397, 2947, 5913, 15247, 47651, 449, 183295}},
+{15310, 18, 31999, {1, 3, 1, 15, 3, 63, 83, 75, 41, 959, 1005, 153, 97, 15381, 6901, 55141, 90215, 161321}},
+{15311, 18, 32014, {1, 3, 1, 9, 1, 1, 29, 191, 43, 241, 607, 667, 1189, 4389, 31335, 14133, 104049, 100925}},
+{15312, 18, 32022, {1, 1, 3, 1, 1, 61, 109, 23, 325, 27, 1601, 3957, 7181, 8375, 9823, 50533, 114895, 73825}},
+{15313, 18, 32049, {1, 1, 7, 7, 1, 25, 51, 19, 383, 955, 1717, 2953, 5431, 7883, 14451, 18619, 9601, 153151}},
+{15314, 18, 32055, {1, 3, 1, 5, 1, 1, 35, 3, 141, 37, 1531, 1855, 7905, 6509, 6223, 45911, 54267, 172275}},
+{15315, 18, 32082, {1, 1, 3, 15, 23, 39, 109, 145, 215, 147, 1191, 2425, 301, 5543, 997, 31071, 101697, 169677}},
+{15316, 18, 32087, {1, 1, 3, 5, 17, 23, 41, 191, 367, 967, 1625, 3669, 769, 7599, 111, 4399, 64121, 232275}},
+{15317, 18, 32100, {1, 3, 5, 1, 25, 61, 47, 247, 413, 605, 399, 1233, 2789, 9775, 7111, 42853, 2305, 87423}},
+{15318, 18, 32104, {1, 3, 7, 3, 1, 25, 73, 247, 221, 235, 169, 889, 5635, 4325, 27015, 39549, 107545, 80885}},
+{15319, 18, 32109, {1, 1, 7, 11, 15, 55, 61, 103, 179, 157, 481, 3089, 4539, 375, 25425, 14995, 60119, 31031}},
+{15320, 18, 32138, {1, 3, 3, 1, 31, 17, 87, 123, 27, 309, 1693, 3871, 7319, 15615, 20113, 18239, 86407, 172381}},
+{15321, 18, 32140, {1, 1, 1, 13, 17, 31, 83, 149, 451, 305, 847, 223, 5705, 9697, 4967, 34273, 4041, 252891}},
+{15322, 18, 32148, {1, 3, 3, 15, 7, 27, 105, 207, 443, 825, 701, 1159, 5267, 14085, 28295, 41757, 47799, 14835}},
+{15323, 18, 32161, {1, 3, 7, 3, 1, 31, 77, 219, 139, 497, 1575, 905, 4341, 4611, 27861, 59871, 45525, 21735}},
+{15324, 18, 32162, {1, 3, 3, 3, 7, 17, 65, 183, 231, 955, 1111, 1899, 1677, 13685, 29395, 10449, 62505, 125643}},
+{15325, 18, 32174, {1, 3, 5, 7, 27, 57, 81, 165, 279, 989, 1569, 573, 7593, 10067, 1343, 12039, 117175, 225125}},
+{15326, 18, 32196, {1, 3, 3, 15, 19, 37, 47, 175, 87, 153, 1137, 1985, 2473, 14767, 19587, 41751, 98937, 66667}},
+{15327, 18, 32220, {1, 3, 5, 3, 19, 51, 25, 155, 37, 597, 719, 1039, 165, 1871, 15677, 59891, 29899, 231979}},
+{15328, 18, 32223, {1, 3, 5, 13, 15, 39, 17, 21, 73, 695, 1813, 2463, 3549, 3081, 14037, 13077, 40417, 258995}},
+{15329, 18, 32267, {1, 1, 5, 9, 29, 5, 105, 75, 97, 937, 1767, 975, 637, 9419, 30673, 33537, 979, 45381}},
+{15330, 18, 32272, {1, 1, 5, 9, 3, 31, 91, 193, 171, 163, 925, 3519, 3621, 4943, 14093, 22881, 18459, 110155}},
+{15331, 18, 32308, {1, 1, 3, 7, 29, 1, 39, 107, 359, 805, 91, 2911, 4741, 3099, 16967, 45849, 95255, 63225}},
+{15332, 18, 32315, {1, 1, 5, 13, 25, 41, 49, 145, 345, 823, 1571, 341, 6323, 9679, 14855, 19965, 108367, 99833}},
+{15333, 18, 32317, {1, 3, 5, 3, 27, 35, 87, 83, 373, 425, 281, 1313, 5153, 6301, 2745, 12677, 34603, 181835}},
+{15334, 18, 32347, {1, 1, 7, 7, 13, 17, 83, 101, 141, 789, 1403, 2777, 2749, 1551, 9009, 9909, 48443, 176679}},
+{15335, 18, 32360, {1, 3, 5, 9, 7, 25, 125, 109, 155, 357, 1111, 3057, 771, 11253, 25811, 60333, 68505, 146987}},
+{15336, 18, 32394, {1, 3, 7, 7, 29, 19, 69, 115, 411, 793, 51, 715, 3035, 11577, 14237, 23963, 13915, 196771}},
+{15337, 18, 32411, {1, 1, 3, 3, 27, 37, 61, 163, 131, 749, 37, 1333, 47, 2519, 25473, 40851, 55861, 113961}},
+{15338, 18, 32420, {1, 3, 5, 1, 3, 49, 19, 251, 125, 387, 1887, 3571, 1465, 4831, 3859, 43357, 20859, 225835}},
+{15339, 18, 32423, {1, 3, 5, 9, 27, 53, 53, 143, 383, 781, 819, 2921, 3499, 11551, 18761, 14453, 58209, 181763}},
+{15340, 18, 32455, {1, 3, 7, 9, 17, 17, 79, 61, 145, 413, 541, 895, 2077, 6957, 28681, 44821, 30609, 131705}},
+{15341, 18, 32456, {1, 1, 3, 15, 1, 57, 17, 125, 11, 43, 1079, 1023, 5391, 67, 31701, 5737, 429, 75411}},
+{15342, 18, 32510, {1, 1, 7, 7, 21, 45, 65, 127, 447, 793, 161, 333, 637, 7403, 12861, 30173, 125121, 254687}},
+{15343, 18, 32517, {1, 1, 3, 9, 27, 53, 85, 223, 297, 455, 919, 2371, 7049, 7167, 18075, 22815, 10265, 14765}},
+{15344, 18, 32541, {1, 1, 3, 7, 1, 53, 91, 181, 471, 101, 771, 4043, 3039, 1215, 19289, 15941, 55187, 147355}},
+{15345, 18, 32552, {1, 3, 1, 1, 13, 19, 13, 47, 159, 965, 1383, 297, 4299, 7181, 1271, 17057, 114847, 180883}},
+{15346, 18, 32555, {1, 3, 1, 15, 29, 55, 113, 243, 215, 665, 641, 1975, 5907, 2617, 17077, 43697, 61101, 70007}},
+{15347, 18, 32580, {1, 3, 1, 11, 5, 55, 109, 145, 307, 663, 1327, 1247, 8033, 15425, 18539, 57027, 72161, 181655}},
+{15348, 18, 32598, {1, 3, 5, 9, 25, 17, 3, 57, 7, 449, 1049, 3423, 5769, 12713, 29849, 1017, 92579, 131255}},
+{15349, 18, 32654, {1, 1, 7, 13, 25, 13, 55, 217, 461, 595, 931, 1883, 2645, 9625, 20467, 45825, 72027, 163767}},
+{15350, 18, 32662, {1, 3, 5, 15, 29, 49, 23, 47, 45, 645, 973, 3837, 621, 7373, 3585, 16083, 93823, 184593}},
+{15351, 18, 32665, {1, 3, 7, 11, 27, 19, 59, 125, 447, 33, 541, 1067, 6983, 3779, 27275, 34269, 106937, 65085}},
+{15352, 18, 32678, {1, 3, 1, 9, 23, 23, 51, 43, 475, 861, 1759, 2559, 3059, 1175, 31555, 27671, 117653, 162735}},
+{15353, 18, 32682, {1, 1, 7, 13, 7, 61, 33, 49, 23, 737, 949, 1785, 2921, 873, 26631, 61941, 14467, 76225}},
+{15354, 18, 32687, {1, 3, 7, 5, 31, 11, 49, 149, 7, 85, 1929, 1001, 4185, 221, 23719, 52265, 52973, 67967}},
+{15355, 18, 32692, {1, 3, 1, 13, 17, 31, 35, 191, 65, 527, 51, 1093, 3673, 11167, 29985, 59739, 43567, 109817}},
+{15356, 18, 32710, {1, 1, 1, 11, 23, 39, 95, 121, 501, 355, 1043, 993, 7533, 15763, 18399, 31601, 49373, 243209}},
+{15357, 18, 32791, {1, 1, 3, 3, 15, 37, 57, 183, 27, 981, 153, 1481, 549, 7847, 2689, 57401, 46359, 175401}},
+{15358, 18, 32792, {1, 3, 5, 9, 31, 19, 83, 79, 413, 597, 1957, 3027, 4751, 1437, 11255, 39513, 56927, 166841}},
+{15359, 18, 32813, {1, 3, 7, 5, 27, 61, 69, 65, 143, 321, 1129, 2521, 4467, 4369, 11727, 35643, 80155, 184241}},
+{15360, 18, 32826, {1, 3, 7, 1, 25, 27, 107, 219, 481, 457, 2027, 1057, 6409, 5641, 19711, 11009, 44295, 28171}},
+{15361, 18, 32831, {1, 3, 3, 9, 3, 17, 85, 5, 341, 107, 2037, 93, 741, 5279, 20093, 28637, 80823, 210279}},
+{15362, 18, 32836, {1, 1, 7, 15, 5, 9, 33, 167, 451, 463, 1951, 2395, 3821, 2915, 15195, 34517, 113545, 22173}},
+{15363, 18, 32843, {1, 1, 3, 1, 23, 55, 113, 159, 139, 795, 69, 2021, 6769, 10807, 18605, 54161, 39501, 233797}},
+{15364, 18, 32854, {1, 1, 7, 11, 17, 53, 103, 131, 385, 909, 629, 3127, 6117, 11457, 31115, 8255, 33227, 170877}},
+{15365, 18, 32893, {1, 1, 3, 9, 23, 19, 99, 221, 141, 731, 311, 2617, 2763, 375, 26763, 56473, 6613, 60519}},
+{15366, 18, 32897, {1, 3, 1, 9, 7, 29, 15, 105, 243, 159, 1755, 3999, 5861, 12009, 30111, 48269, 70427, 187173}},
+{15367, 18, 32912, {1, 1, 3, 13, 1, 35, 39, 121, 409, 571, 1835, 1535, 4671, 12671, 4503, 4783, 48009, 216837}},
+{15368, 18, 32951, {1, 1, 1, 9, 25, 61, 87, 109, 489, 107, 1741, 859, 237, 7161, 27117, 58587, 55445, 155763}},
+{15369, 18, 32963, {1, 1, 7, 15, 9, 21, 61, 159, 301, 863, 1823, 11, 419, 6717, 28199, 24129, 58419, 22147}},
+{15370, 18, 32970, {1, 3, 1, 5, 9, 7, 13, 205, 185, 759, 777, 2877, 5991, 14555, 18793, 51485, 6373, 232105}},
+{15371, 18, 32975, {1, 1, 3, 5, 7, 25, 51, 79, 227, 447, 867, 2709, 2677, 15249, 22957, 45577, 39011, 16839}},
+{15372, 18, 33028, {1, 1, 1, 3, 5, 51, 69, 135, 395, 339, 685, 3657, 3789, 16345, 2911, 51737, 97471, 126605}},
+{15373, 18, 33052, {1, 3, 7, 15, 15, 5, 85, 153, 507, 347, 1457, 527, 1055, 7773, 4161, 10487, 92373, 256535}},
+{15374, 18, 33061, {1, 3, 3, 3, 1, 9, 25, 1, 155, 321, 1739, 555, 7719, 10501, 19075, 12529, 75975, 229905}},
+{15375, 18, 33083, {1, 1, 1, 3, 29, 31, 89, 23, 283, 875, 1653, 855, 7613, 15277, 23845, 47443, 287, 217441}},
+{15376, 18, 33103, {1, 3, 3, 1, 25, 7, 75, 119, 493, 131, 231, 3063, 7171, 5437, 16385, 50347, 87427, 53603}},
+{15377, 18, 33117, {1, 3, 7, 7, 27, 55, 103, 223, 219, 103, 733, 1233, 1931, 2119, 19333, 59839, 100421, 256811}},
+{15378, 18, 33139, {1, 3, 7, 15, 23, 63, 77, 151, 285, 701, 1403, 1267, 6975, 11421, 24943, 51647, 75651, 191675}},
+{15379, 18, 33151, {1, 1, 5, 7, 25, 23, 25, 7, 503, 759, 997, 1711, 1439, 12483, 30117, 55205, 8813, 221589}},
+{15380, 18, 33162, {1, 3, 7, 5, 21, 3, 117, 65, 461, 851, 915, 575, 3061, 1055, 11999, 8375, 128677, 98005}},
+{15381, 18, 33209, {1, 3, 7, 7, 19, 13, 123, 23, 41, 293, 79, 1435, 1175, 7399, 14907, 4671, 88029, 220627}},
+{15382, 18, 33210, {1, 3, 3, 13, 11, 17, 65, 21, 143, 257, 1001, 2423, 5659, 11681, 23605, 40649, 49797, 55497}},
+{15383, 18, 33223, {1, 3, 5, 5, 29, 15, 125, 83, 139, 381, 1435, 2129, 1699, 10725, 531, 767, 112477, 134223}},
+{15384, 18, 33227, {1, 3, 7, 9, 9, 23, 35, 1, 127, 143, 707, 1475, 4705, 8921, 14919, 50909, 64425, 33381}},
+{15385, 18, 33241, {1, 1, 1, 15, 11, 63, 87, 101, 243, 833, 707, 4095, 201, 4877, 10219, 39019, 129779, 229857}},
+{15386, 18, 33263, {1, 1, 1, 11, 5, 9, 35, 177, 303, 545, 917, 1037, 1789, 12147, 29095, 27391, 112833, 104713}},
+{15387, 18, 33341, {1, 1, 1, 5, 27, 23, 111, 219, 439, 445, 967, 3527, 6203, 1829, 19657, 48965, 85213, 58719}},
+{15388, 18, 33344, {1, 3, 7, 11, 15, 7, 95, 113, 317, 225, 1229, 3033, 5777, 4075, 24093, 3539, 19333, 212757}},
+{15389, 18, 33356, {1, 3, 7, 7, 1, 35, 35, 67, 459, 769, 1675, 3509, 7393, 10433, 12003, 7385, 4425, 188989}},
+{15390, 18, 33390, {1, 1, 7, 9, 5, 45, 35, 27, 443, 301, 533, 2803, 99, 17, 20749, 58353, 93067, 118763}},
+{15391, 18, 33398, {1, 1, 3, 3, 13, 51, 61, 181, 81, 859, 1461, 3455, 2277, 13769, 1251, 4313, 119973, 30693}},
+{15392, 18, 33423, {1, 1, 3, 7, 15, 29, 23, 207, 239, 65, 1889, 151, 7793, 2657, 13673, 29033, 74477, 215027}},
+{15393, 18, 33428, {1, 1, 5, 1, 19, 35, 19, 71, 187, 783, 543, 505, 347, 3191, 1087, 49735, 54109, 27979}},
+{15394, 18, 33444, {1, 3, 3, 3, 3, 61, 67, 59, 207, 957, 1709, 1567, 7973, 5921, 29841, 8311, 81165, 91965}},
+{15395, 18, 33454, {1, 1, 1, 7, 23, 47, 109, 189, 447, 861, 1615, 3283, 3059, 749, 28729, 8713, 38743, 211019}},
+{15396, 18, 33479, {1, 3, 5, 1, 17, 51, 127, 181, 355, 515, 603, 465, 1825, 9281, 31971, 42793, 22467, 175777}},
+{15397, 18, 33510, {1, 3, 1, 5, 3, 29, 111, 91, 99, 15, 535, 3047, 1083, 7181, 28003, 60719, 71825, 12293}},
+{15398, 18, 33514, {1, 3, 5, 7, 1, 43, 83, 117, 221, 353, 139, 647, 6017, 4655, 31823, 22097, 118537, 71803}},
+{15399, 18, 33528, {1, 1, 3, 3, 27, 11, 35, 169, 215, 883, 1195, 2983, 4651, 15893, 24051, 313, 103947, 5227}},
+{15400, 18, 33548, {1, 3, 5, 13, 3, 51, 33, 159, 499, 763, 845, 1541, 3837, 9397, 855, 4187, 112167, 243817}},
+{15401, 18, 33566, {1, 1, 7, 9, 1, 15, 19, 239, 227, 561, 1685, 2841, 53, 9753, 15105, 34277, 128859, 100085}},
+{15402, 18, 33570, {1, 3, 5, 13, 15, 7, 57, 9, 415, 1005, 583, 1347, 4349, 3603, 9125, 15019, 77735, 237011}},
+{15403, 18, 33593, {1, 1, 1, 13, 27, 21, 105, 17, 235, 605, 1417, 2053, 3233, 11617, 28651, 43161, 71663, 98373}},
+{15404, 18, 33599, {1, 3, 5, 13, 29, 17, 123, 105, 477, 359, 613, 1699, 2581, 3007, 8507, 14391, 95487, 633}},
+{15405, 18, 33619, {1, 1, 7, 7, 13, 55, 107, 211, 71, 339, 1169, 2629, 165, 16207, 25523, 7101, 47553, 261131}},
+{15406, 18, 33635, {1, 3, 5, 15, 11, 7, 45, 207, 39, 41, 781, 3347, 2529, 4475, 9665, 31499, 119837, 128755}},
+{15407, 18, 33659, {1, 3, 1, 15, 23, 59, 59, 17, 89, 823, 59, 3991, 305, 14893, 1411, 8015, 92193, 66935}},
+{15408, 18, 33680, {1, 1, 7, 15, 19, 29, 11, 207, 429, 851, 1661, 2903, 4413, 447, 29447, 39243, 70435, 160451}},
+{15409, 18, 33699, {1, 1, 3, 13, 17, 5, 93, 89, 455, 67, 33, 65, 7957, 14383, 28525, 56983, 71899, 4881}},
+{15410, 18, 33713, {1, 3, 3, 5, 11, 7, 47, 233, 433, 791, 47, 2561, 6539, 1151, 2083, 12309, 62353, 69507}},
+{15411, 18, 33758, {1, 3, 5, 11, 15, 55, 101, 251, 41, 39, 383, 3481, 1817, 3447, 6205, 38169, 98267, 157091}},
+{15412, 18, 33771, {1, 3, 5, 7, 9, 47, 113, 55, 421, 703, 849, 2251, 129, 9257, 28097, 33475, 98933, 32041}},
+{15413, 18, 33779, {1, 3, 3, 11, 9, 59, 1, 211, 277, 969, 977, 3079, 4707, 3341, 17679, 9469, 52859, 125883}},
+{15414, 18, 33800, {1, 1, 7, 13, 29, 19, 49, 149, 259, 573, 1137, 2571, 2661, 12865, 24993, 10721, 96921, 85931}},
+{15415, 18, 33829, {1, 3, 1, 9, 15, 27, 91, 127, 305, 159, 523, 2539, 1969, 4325, 595, 37077, 79919, 26889}},
+{15416, 18, 33836, {1, 3, 1, 11, 1, 5, 65, 75, 317, 909, 1601, 2713, 6891, 4927, 28427, 5791, 82285, 35209}},
+{15417, 18, 33844, {1, 3, 7, 7, 9, 5, 111, 167, 477, 437, 1133, 2715, 6189, 5051, 4765, 26267, 99819, 70419}},
+{15418, 18, 33856, {1, 1, 3, 9, 27, 57, 23, 233, 423, 191, 1159, 1539, 6397, 16041, 8803, 19787, 114447, 17029}},
+{15419, 18, 33859, {1, 1, 5, 1, 11, 3, 111, 125, 287, 487, 1663, 1953, 3771, 2011, 18167, 47471, 94041, 87569}},
+{15420, 18, 33873, {1, 3, 1, 11, 5, 9, 75, 153, 37, 803, 971, 1667, 4631, 9183, 20179, 6905, 80949, 54443}},
+{15421, 18, 33874, {1, 1, 1, 5, 13, 29, 91, 201, 49, 739, 1569, 2725, 257, 5505, 5289, 40731, 27843, 16565}},
+{15422, 18, 33929, {1, 1, 7, 13, 27, 41, 81, 199, 99, 43, 1331, 3237, 6493, 3839, 19329, 44371, 19715, 60553}},
+{15423, 18, 33944, {1, 1, 5, 7, 29, 41, 67, 163, 467, 93, 1977, 2625, 6967, 6655, 19835, 39517, 10259, 200487}},
+{15424, 18, 33965, {1, 1, 3, 15, 23, 35, 31, 171, 175, 883, 593, 245, 6209, 7381, 5555, 54507, 66159, 40771}},
+{15425, 18, 33978, {1, 3, 3, 11, 3, 63, 75, 177, 239, 77, 1543, 875, 7951, 7571, 961, 9909, 101781, 160399}},
+{15426, 18, 33986, {1, 3, 1, 3, 3, 37, 71, 231, 373, 443, 835, 1321, 2107, 2929, 7527, 47969, 15329, 94537}},
+{15427, 18, 34006, {1, 3, 3, 15, 7, 5, 127, 121, 159, 25, 399, 3009, 4401, 9649, 4311, 18045, 22557, 135177}},
+{15428, 18, 34025, {1, 1, 1, 3, 29, 57, 75, 73, 261, 493, 1417, 1351, 3407, 8553, 4893, 10325, 123149, 161435}},
+{15429, 18, 34106, {1, 3, 3, 11, 15, 5, 87, 115, 337, 213, 949, 1925, 5057, 5831, 6837, 51167, 25291, 182197}},
+{15430, 18, 34126, {1, 3, 1, 11, 25, 49, 27, 101, 403, 989, 1129, 3933, 1147, 13091, 11965, 38075, 68251, 103293}},
+{15431, 18, 34171, {1, 1, 7, 5, 7, 49, 1, 189, 275, 63, 149, 3255, 1175, 7811, 24845, 20755, 99391, 140673}},
+{15432, 18, 34189, {1, 3, 1, 13, 17, 35, 37, 37, 415, 125, 643, 443, 6215, 299, 31237, 45687, 78535, 102123}},
+{15433, 18, 34204, {1, 3, 5, 3, 27, 41, 85, 215, 47, 21, 725, 1967, 2317, 121, 7827, 48229, 82027, 60271}},
+{15434, 18, 34260, {1, 3, 5, 1, 1, 55, 37, 183, 117, 421, 383, 3883, 5519, 6161, 6823, 18423, 77747, 215969}},
+{15435, 18, 34270, {1, 3, 5, 13, 31, 3, 117, 59, 375, 797, 1129, 1283, 3245, 12775, 30353, 3837, 130273, 228899}},
+{15436, 18, 34280, {1, 3, 5, 1, 7, 33, 17, 153, 179, 255, 537, 2911, 1223, 367, 18131, 25903, 33509, 220031}},
+{15437, 18, 34298, {1, 3, 7, 5, 5, 7, 103, 233, 309, 947, 1835, 3509, 4267, 15619, 5895, 30707, 81841, 191899}},
+{15438, 18, 34313, {1, 1, 5, 11, 3, 15, 91, 83, 319, 765, 895, 2565, 6833, 1719, 2971, 37483, 21709, 23193}},
+{15439, 18, 34321, {1, 1, 3, 11, 31, 57, 83, 233, 439, 161, 1503, 749, 6347, 15379, 2317, 24671, 93399, 239585}},
+{15440, 18, 34333, {1, 1, 3, 9, 29, 45, 19, 107, 295, 153, 189, 2521, 5465, 7321, 6143, 229, 100553, 258911}},
+{15441, 18, 34370, {1, 3, 7, 11, 31, 27, 95, 21, 249, 981, 1725, 1481, 1025, 9301, 11809, 53109, 29007, 127683}},
+{15442, 18, 34376, {1, 3, 1, 3, 1, 23, 97, 137, 5, 471, 1887, 1035, 2681, 5143, 3145, 1517, 88107, 245245}},
+{15443, 18, 34387, {1, 1, 1, 1, 15, 11, 13, 9, 405, 607, 403, 1693, 4363, 9365, 6425, 48121, 78969, 87341}},
+{15444, 18, 34389, {1, 1, 7, 15, 3, 17, 7, 51, 111, 1023, 9, 465, 1909, 16283, 4763, 50939, 119029, 198257}},
+{15445, 18, 34417, {1, 3, 3, 1, 31, 11, 113, 13, 499, 433, 1941, 991, 5439, 3123, 24591, 16171, 55099, 206015}},
+{15446, 18, 34429, {1, 3, 5, 15, 25, 49, 125, 101, 251, 619, 1895, 4063, 3065, 14965, 20081, 11233, 58253, 69633}},
+{15447, 18, 34440, {1, 1, 1, 5, 21, 35, 29, 241, 359, 553, 1001, 1865, 5183, 5233, 16371, 55277, 102091, 143275}},
+{15448, 18, 34443, {1, 1, 1, 3, 29, 37, 3, 191, 239, 961, 2031, 1337, 1169, 5229, 22861, 38257, 55027, 153703}},
+{15449, 18, 34451, {1, 3, 5, 7, 7, 35, 49, 139, 509, 381, 1267, 2641, 747, 16239, 23133, 32111, 70471, 128427}},
+{15450, 18, 34470, {1, 1, 1, 9, 23, 25, 117, 125, 369, 891, 103, 2215, 3571, 1291, 9001, 35671, 67119, 198847}},
+{15451, 18, 34484, {1, 1, 5, 9, 17, 19, 27, 7, 207, 55, 1099, 2117, 7511, 14999, 7761, 32215, 103401, 68599}},
+{15452, 18, 34493, {1, 1, 7, 9, 1, 59, 41, 91, 9, 225, 457, 3241, 4713, 2923, 11973, 2867, 130583, 202007}},
+{15453, 18, 34496, {1, 3, 1, 9, 31, 47, 63, 49, 457, 757, 885, 937, 2973, 12147, 2607, 52907, 126047, 83275}},
+{15454, 18, 34514, {1, 3, 5, 11, 17, 1, 79, 123, 505, 203, 1779, 71, 4357, 2285, 31625, 15225, 86519, 2021}},
+{15455, 18, 34526, {1, 3, 1, 11, 21, 17, 41, 169, 125, 995, 351, 1235, 25, 7463, 2099, 18917, 71355, 26983}},
+{15456, 18, 34535, {1, 1, 7, 1, 21, 23, 41, 5, 415, 405, 1235, 1245, 151, 11283, 25293, 45147, 12597, 39501}},
+{15457, 18, 34585, {1, 1, 1, 5, 29, 29, 15, 165, 259, 179, 1479, 3535, 779, 6583, 885, 34331, 71193, 154417}},
+{15458, 18, 34591, {1, 1, 1, 5, 3, 1, 13, 181, 507, 339, 333, 4059, 7963, 15649, 15507, 16913, 34741, 202039}},
+{15459, 18, 34592, {1, 3, 7, 1, 1, 9, 17, 119, 77, 583, 259, 883, 4011, 4275, 9599, 58663, 73237, 202783}},
+{15460, 18, 34602, {1, 1, 5, 11, 23, 27, 19, 171, 373, 779, 661, 1701, 3363, 13095, 897, 51233, 1319, 41093}},
+{15461, 18, 34607, {1, 3, 3, 3, 29, 21, 105, 29, 429, 657, 1735, 1279, 809, 14963, 9735, 23251, 44879, 159371}},
+{15462, 18, 34644, {1, 1, 5, 11, 17, 27, 117, 65, 193, 539, 1095, 439, 1687, 11277, 513, 30611, 88885, 69145}},
+{15463, 18, 34657, {1, 3, 1, 7, 11, 1, 27, 41, 63, 501, 917, 2397, 6839, 10835, 26437, 56169, 46631, 64095}},
+{15464, 18, 34675, {1, 1, 7, 15, 29, 5, 17, 217, 333, 389, 403, 3167, 3599, 12055, 30669, 44821, 109811, 237393}},
+{15465, 18, 34681, {1, 3, 5, 13, 1, 39, 51, 233, 159, 135, 763, 2499, 7741, 13099, 8639, 8043, 39827, 5989}},
+{15466, 18, 34693, {1, 1, 7, 3, 1, 61, 41, 37, 37, 67, 867, 2631, 6265, 5551, 161, 56643, 126087, 126829}},
+{15467, 18, 34706, {1, 1, 7, 1, 21, 39, 101, 225, 489, 123, 661, 2489, 1865, 6809, 21663, 59405, 45579, 51257}},
+{15468, 18, 34745, {1, 3, 7, 9, 27, 53, 11, 97, 369, 389, 1933, 3321, 543, 12331, 11571, 10685, 49049, 244027}},
+{15469, 18, 34759, {1, 3, 5, 3, 7, 15, 21, 165, 181, 877, 1161, 1815, 2097, 449, 32411, 22843, 12467, 55397}},
+{15470, 18, 34765, {1, 3, 1, 3, 11, 45, 23, 193, 287, 137, 333, 1831, 457, 583, 23081, 4525, 4781, 249509}},
+{15471, 18, 34774, {1, 3, 5, 5, 15, 13, 27, 199, 267, 297, 923, 3861, 4949, 7945, 25291, 45407, 47529, 127287}},
+{15472, 18, 34780, {1, 1, 5, 7, 19, 29, 113, 51, 503, 487, 699, 2097, 2957, 6519, 19487, 46873, 38871, 89997}},
+{15473, 18, 34794, {1, 1, 5, 13, 17, 31, 57, 127, 335, 223, 1545, 3749, 1539, 3293, 21159, 13019, 48343, 190895}},
+{15474, 18, 34807, {1, 1, 7, 9, 25, 19, 75, 41, 511, 269, 819, 3313, 6805, 15051, 4349, 1809, 34841, 190641}},
+{15475, 18, 34808, {1, 3, 5, 9, 27, 7, 91, 187, 123, 519, 477, 2719, 211, 1225, 22689, 37043, 66291, 205441}},
+{15476, 18, 34835, {1, 1, 5, 13, 5, 41, 95, 49, 187, 239, 1213, 2363, 8075, 12423, 6361, 42471, 70047, 188063}},
+{15477, 18, 34842, {1, 3, 7, 3, 27, 23, 21, 217, 65, 143, 1171, 1441, 1603, 2235, 20923, 32611, 111903, 132771}},
+{15478, 18, 34865, {1, 1, 7, 9, 3, 29, 33, 203, 497, 179, 1253, 2083, 7407, 12551, 8371, 62167, 93875, 193017}},
+{15479, 18, 34907, {1, 1, 1, 13, 7, 61, 43, 107, 417, 757, 1701, 3187, 5489, 11359, 20469, 20249, 93581, 207969}},
+{15480, 18, 34928, {1, 1, 7, 3, 31, 51, 51, 183, 483, 885, 1627, 3605, 6687, 1271, 27013, 40409, 103807, 189805}},
+{15481, 18, 34949, {1, 1, 3, 1, 21, 21, 107, 185, 267, 981, 147, 1873, 1085, 15829, 10315, 21673, 7713, 120087}},
+{15482, 18, 34961, {1, 1, 5, 3, 7, 27, 73, 131, 287, 657, 1351, 547, 3655, 2433, 6753, 2465, 110299, 194587}},
+{15483, 18, 34964, {1, 1, 7, 7, 17, 55, 29, 223, 411, 775, 745, 3515, 4573, 4289, 7411, 55999, 22021, 110567}},
+{15484, 18, 34987, {1, 3, 1, 3, 29, 55, 7, 183, 507, 773, 1299, 3653, 7693, 3773, 29549, 4171, 123039, 137495}},
+{15485, 18, 34990, {1, 1, 1, 7, 5, 25, 53, 85, 41, 837, 587, 2997, 7281, 6821, 15609, 47855, 49017, 108557}},
+{15486, 18, 35019, {1, 1, 5, 5, 1, 17, 109, 231, 295, 825, 1909, 683, 2197, 1895, 8641, 37917, 36347, 38683}},
+{15487, 18, 35069, {1, 3, 7, 3, 23, 39, 91, 121, 223, 505, 127, 3439, 7779, 12917, 17351, 33063, 84019, 40077}},
+{15488, 18, 35077, {1, 3, 3, 1, 19, 1, 125, 99, 143, 549, 709, 3605, 2377, 761, 14369, 52191, 80811, 214877}},
+{15489, 18, 35090, {1, 1, 7, 9, 13, 57, 39, 91, 505, 299, 1241, 1697, 5821, 5327, 22439, 42321, 120941, 40009}},
+{15490, 18, 35152, {1, 1, 3, 13, 15, 59, 15, 129, 265, 841, 1255, 1915, 4645, 5991, 26801, 7839, 66961, 59045}},
+{15491, 18, 35173, {1, 3, 7, 15, 17, 57, 61, 173, 391, 1001, 1815, 2565, 1445, 13237, 2273, 61683, 62327, 180255}},
+{15492, 18, 35174, {1, 1, 3, 3, 23, 29, 115, 185, 333, 103, 1807, 3271, 4803, 9743, 3031, 25263, 30761, 1899}},
+{15493, 18, 35202, {1, 1, 1, 7, 1, 13, 63, 113, 467, 17, 1803, 3141, 7069, 8895, 25823, 40347, 11211, 88769}},
+{15494, 18, 35214, {1, 3, 5, 1, 3, 3, 29, 101, 315, 915, 341, 287, 4167, 7579, 19797, 18287, 19079, 52805}},
+{15495, 18, 35219, {1, 3, 7, 15, 31, 61, 27, 153, 387, 273, 343, 881, 2273, 6621, 19391, 41735, 123899, 117851}},
+{15496, 18, 35226, {1, 1, 7, 11, 5, 49, 83, 223, 87, 341, 1023, 2785, 3635, 2651, 5179, 25907, 115249, 74001}},
+{15497, 18, 35235, {1, 3, 3, 7, 31, 37, 123, 79, 365, 455, 639, 691, 2659, 12215, 26785, 48785, 120175, 155501}},
+{15498, 18, 35255, {1, 3, 3, 11, 19, 49, 81, 97, 429, 317, 257, 663, 5009, 2855, 22721, 51553, 32511, 188977}},
+{15499, 18, 35310, {1, 1, 7, 11, 5, 37, 1, 123, 477, 747, 839, 3975, 6347, 489, 31387, 56037, 62935, 177587}},
+{15500, 18, 35318, {1, 1, 1, 1, 29, 7, 119, 233, 255, 25, 127, 1377, 991, 12151, 31259, 64863, 34733, 86101}},
+{15501, 18, 35321, {1, 3, 7, 5, 19, 57, 67, 1, 81, 719, 891, 2485, 3817, 1055, 437, 9779, 23823, 173219}},
+{15502, 18, 35333, {1, 1, 1, 5, 1, 63, 87, 163, 135, 809, 637, 1233, 5245, 481, 11011, 23477, 114963, 96051}},
+{15503, 18, 35337, {1, 1, 7, 5, 25, 39, 57, 129, 311, 525, 1555, 179, 639, 4949, 8809, 31215, 95975, 79407}},
+{15504, 18, 35346, {1, 3, 1, 1, 15, 59, 77, 87, 479, 889, 1619, 331, 4781, 10597, 935, 28105, 83861, 134273}},
+{15505, 18, 35373, {1, 3, 5, 15, 21, 55, 61, 105, 373, 185, 1579, 3487, 2621, 8993, 6443, 31709, 57329, 128165}},
+{15506, 18, 35414, {1, 3, 3, 3, 7, 21, 117, 159, 177, 927, 1873, 1865, 3219, 1693, 1173, 34365, 107053, 113949}},
+{15507, 18, 35478, {1, 3, 7, 1, 17, 37, 35, 101, 305, 141, 1681, 1949, 47, 11351, 989, 13887, 127429, 13059}},
+{15508, 18, 35497, {1, 1, 3, 7, 13, 41, 125, 115, 65, 621, 1401, 631, 5875, 8589, 17185, 22757, 83625, 92907}},
+{15509, 18, 35503, {1, 3, 1, 5, 25, 37, 73, 39, 495, 645, 265, 2685, 5875, 5919, 23223, 44593, 26207, 49921}},
+{15510, 18, 35512, {1, 3, 1, 13, 25, 31, 39, 15, 179, 791, 1817, 3617, 2139, 1827, 21215, 21767, 15009, 239443}},
+{15511, 18, 35515, {1, 1, 3, 7, 17, 9, 33, 121, 235, 535, 1537, 3307, 2881, 4351, 4721, 34131, 129619, 137993}},
+{15512, 18, 35526, {1, 1, 3, 1, 3, 51, 79, 213, 205, 323, 1749, 2563, 2013, 6519, 18923, 25937, 74445, 252283}},
+{15513, 18, 35577, {1, 3, 5, 11, 3, 53, 17, 195, 305, 543, 1937, 2997, 4593, 7801, 15307, 46359, 39365, 59537}},
+{15514, 18, 35585, {1, 1, 1, 13, 31, 53, 111, 163, 139, 163, 999, 83, 5125, 10047, 11143, 51407, 13627, 3621}},
+{15515, 18, 35592, {1, 1, 3, 9, 5, 1, 125, 95, 281, 939, 913, 1441, 1209, 12983, 27759, 22393, 75985, 178997}},
+{15516, 18, 35615, {1, 3, 5, 3, 5, 27, 91, 41, 51, 447, 491, 3405, 497, 2873, 17865, 30651, 104197, 71751}},
+{15517, 18, 35616, {1, 3, 7, 1, 29, 61, 73, 31, 423, 933, 1327, 809, 1461, 269, 15121, 18649, 36095, 139429}},
+{15518, 18, 35622, {1, 1, 7, 7, 19, 49, 51, 173, 297, 411, 1255, 1093, 2821, 6743, 1927, 27563, 68459, 261411}},
+{15519, 18, 35634, {1, 3, 5, 1, 5, 33, 27, 119, 103, 615, 149, 2299, 6801, 15615, 7361, 31045, 87719, 9557}},
+{15520, 18, 35657, {1, 1, 3, 9, 17, 23, 89, 35, 151, 385, 319, 2065, 1897, 1987, 15159, 34855, 5395, 110751}},
+{15521, 18, 35672, {1, 3, 1, 13, 7, 47, 19, 185, 207, 787, 1179, 1073, 1463, 6277, 6129, 25031, 91969, 123235}},
+{15522, 18, 35708, {1, 1, 7, 3, 19, 63, 97, 1, 381, 71, 1169, 339, 6585, 3629, 31357, 59451, 102735, 253667}},
+{15523, 18, 35772, {1, 3, 3, 13, 9, 27, 69, 17, 509, 599, 1247, 2267, 3309, 1905, 17995, 41263, 5947, 51607}},
+{15524, 18, 35790, {1, 3, 1, 9, 31, 45, 69, 243, 171, 555, 61, 1135, 1993, 8615, 18363, 19545, 64015, 81391}},
+{15525, 18, 35804, {1, 1, 1, 1, 19, 49, 31, 65, 53, 123, 271, 3007, 4509, 9465, 3855, 12673, 19457, 14677}},
+{15526, 18, 35811, {1, 3, 5, 13, 29, 53, 91, 145, 115, 53, 839, 1911, 2887, 6053, 18437, 42273, 63093, 70937}},
+{15527, 18, 35814, {1, 1, 5, 5, 27, 13, 87, 175, 485, 699, 463, 811, 4991, 15303, 23007, 10021, 59125, 39997}},
+{15528, 18, 35837, {1, 1, 5, 5, 27, 21, 89, 61, 109, 555, 953, 2811, 3015, 3249, 16085, 64413, 84605, 177333}},
+{15529, 18, 35846, {1, 1, 7, 3, 1, 29, 83, 143, 67, 577, 971, 2339, 6521, 6341, 27141, 37149, 99813, 37579}},
+{15530, 18, 35873, {1, 3, 3, 7, 23, 29, 117, 5, 287, 559, 667, 2349, 7481, 679, 9633, 40857, 89841, 98125}},
+{15531, 18, 35883, {1, 1, 1, 3, 31, 31, 83, 117, 213, 213, 23, 3803, 5967, 7759, 19521, 13229, 62231, 150687}},
+{15532, 18, 35918, {1, 3, 7, 9, 1, 15, 37, 191, 19, 107, 1723, 3517, 3477, 3777, 4359, 45815, 58661, 33217}},
+{15533, 18, 35920, {1, 1, 5, 1, 17, 3, 3, 255, 501, 1021, 1731, 481, 6145, 3475, 3417, 11847, 92203, 75109}},
+{15534, 18, 35925, {1, 1, 5, 1, 1, 61, 89, 107, 503, 627, 931, 1355, 2067, 12487, 20665, 61543, 15501, 103843}},
+{15535, 18, 35926, {1, 1, 5, 9, 25, 17, 7, 255, 251, 939, 851, 2241, 939, 15331, 29357, 2485, 80791, 152601}},
+{15536, 18, 35945, {1, 1, 5, 3, 13, 25, 35, 113, 83, 765, 1317, 1409, 369, 2215, 5659, 3581, 13925, 108673}},
+{15537, 18, 35956, {1, 1, 1, 1, 13, 13, 83, 27, 5, 563, 723, 2733, 3155, 6567, 24595, 45569, 37587, 144401}},
+{15538, 18, 36003, {1, 1, 1, 9, 31, 51, 73, 105, 299, 857, 669, 963, 4115, 14939, 11669, 46215, 92707, 149249}},
+{15539, 18, 36023, {1, 1, 3, 5, 7, 41, 105, 213, 3, 999, 93, 1497, 6783, 1559, 20047, 40761, 88219, 64769}},
+{15540, 18, 36024, {1, 3, 1, 5, 13, 17, 79, 29, 453, 75, 1095, 623, 7401, 4225, 30467, 60795, 130045, 154767}},
+{15541, 18, 36059, {1, 1, 5, 3, 31, 59, 33, 129, 505, 277, 1623, 3531, 6841, 12903, 7231, 5801, 92405, 260195}},
+{15542, 18, 36061, {1, 1, 3, 5, 27, 23, 63, 219, 225, 547, 1163, 1899, 4191, 9725, 30077, 30157, 73395, 38195}},
+{15543, 18, 36072, {1, 1, 1, 11, 17, 27, 63, 127, 95, 205, 1753, 2023, 6803, 4355, 28169, 16691, 25105, 8969}},
+{15544, 18, 36075, {1, 1, 5, 3, 23, 23, 89, 115, 231, 647, 513, 3161, 3175, 5061, 5797, 35387, 109827, 19511}},
+{15545, 18, 36103, {1, 3, 5, 5, 11, 9, 39, 251, 367, 253, 2031, 3909, 1057, 12545, 25397, 51571, 91229, 83721}},
+{15546, 18, 36110, {1, 3, 5, 7, 5, 35, 57, 153, 111, 789, 177, 2237, 1333, 13185, 993, 22099, 62113, 211815}},
+{15547, 18, 36131, {1, 1, 5, 15, 19, 37, 123, 221, 375, 605, 791, 1663, 7537, 7193, 20149, 58077, 113129, 185493}},
+{15548, 18, 36151, {1, 1, 1, 1, 1, 53, 117, 227, 441, 851, 1171, 4031, 2313, 2847, 25533, 31767, 18197, 153101}},
+{15549, 18, 36160, {1, 1, 3, 3, 13, 9, 65, 225, 71, 763, 1507, 3795, 4321, 399, 12515, 4527, 89193, 236161}},
+{15550, 18, 36199, {1, 1, 3, 11, 21, 63, 73, 125, 369, 309, 953, 3525, 3925, 13609, 26061, 21739, 112867, 112985}},
+{15551, 18, 36223, {1, 1, 7, 1, 27, 25, 3, 129, 321, 193, 1871, 233, 837, 11163, 14861, 42721, 72849, 206739}},
+{15552, 18, 36227, {1, 3, 7, 3, 5, 51, 43, 177, 167, 11, 1297, 1805, 515, 6485, 8253, 271, 47435, 252291}},
+{15553, 18, 36234, {1, 3, 3, 3, 19, 47, 47, 47, 299, 101, 1535, 3593, 4669, 10367, 19219, 16579, 85269, 36115}},
+{15554, 18, 36236, {1, 1, 7, 15, 7, 51, 53, 181, 379, 267, 985, 3401, 2189, 10197, 14183, 413, 76797, 24751}},
+{15555, 18, 36284, {1, 1, 5, 7, 13, 27, 65, 119, 235, 131, 1921, 3411, 1511, 11221, 30315, 11799, 127563, 203533}},
+{15556, 18, 36319, {1, 3, 1, 3, 13, 55, 101, 189, 483, 261, 467, 645, 417, 6203, 9221, 19671, 102331, 259335}},
+{15557, 18, 36332, {1, 1, 5, 15, 19, 7, 81, 1, 371, 119, 1433, 1211, 303, 14393, 27107, 45295, 109211, 224661}},
+{15558, 18, 36343, {1, 3, 7, 9, 19, 53, 31, 55, 103, 351, 1511, 377, 981, 6709, 19553, 53579, 55043, 170489}},
+{15559, 18, 36373, {1, 3, 3, 15, 31, 49, 1, 251, 187, 73, 119, 3041, 5455, 5355, 22245, 7735, 14661, 258447}},
+{15560, 18, 36401, {1, 3, 7, 11, 13, 1, 61, 97, 179, 975, 1653, 3301, 4303, 2271, 30171, 63287, 51271, 21909}},
+{15561, 18, 36413, {1, 1, 5, 11, 21, 45, 101, 131, 121, 881, 1205, 1849, 4337, 5687, 31967, 22559, 98017, 202557}},
+{15562, 18, 36433, {1, 3, 3, 7, 1, 49, 11, 35, 141, 309, 651, 3319, 4313, 3675, 27699, 49429, 109805, 167089}},
+{15563, 18, 36459, {1, 1, 3, 13, 13, 15, 61, 251, 335, 365, 677, 2183, 6291, 8857, 15231, 551, 63149, 76729}},
+{15564, 18, 36480, {1, 3, 3, 13, 1, 59, 85, 127, 409, 1007, 1947, 3495, 6227, 11447, 14329, 3769, 109619, 59063}},
+{15565, 18, 36485, {1, 3, 5, 11, 11, 59, 67, 209, 491, 757, 1137, 1977, 3155, 9339, 11219, 20303, 66417, 187911}},
+{15566, 18, 36510, {1, 1, 5, 9, 27, 51, 87, 249, 327, 867, 29, 3811, 4769, 12353, 24803, 35747, 84101, 210975}},
+{15567, 18, 36513, {1, 3, 7, 7, 23, 37, 23, 55, 237, 543, 779, 1305, 1535, 13333, 1403, 10903, 113135, 195799}},
+{15568, 18, 36523, {1, 1, 3, 11, 1, 1, 3, 153, 401, 35, 981, 79, 4227, 9203, 8179, 29325, 104809, 140613}},
+{15569, 18, 36528, {1, 3, 5, 9, 13, 39, 101, 181, 507, 307, 1411, 1443, 6855, 8747, 22709, 37869, 102303, 577}},
+{15570, 18, 36537, {1, 3, 5, 1, 25, 41, 3, 239, 195, 1, 1277, 2085, 4253, 14683, 24171, 56733, 82795, 213291}},
+{15571, 18, 36558, {1, 1, 3, 5, 25, 55, 31, 55, 215, 149, 1813, 3775, 779, 6137, 10561, 41671, 96883, 177435}},
+{15572, 18, 36563, {1, 1, 5, 11, 15, 5, 1, 237, 131, 13, 229, 3203, 2431, 1829, 31983, 59535, 31381, 175455}},
+{15573, 18, 36576, {1, 3, 3, 7, 5, 19, 61, 253, 223, 609, 1395, 2495, 5501, 6571, 12989, 889, 49435, 200251}},
+{15574, 18, 36608, {1, 1, 7, 13, 25, 49, 33, 157, 457, 259, 1935, 2249, 7419, 12685, 30509, 32187, 108839, 178963}},
+{15575, 18, 36611, {1, 3, 3, 15, 19, 27, 91, 133, 369, 931, 359, 759, 2647, 13643, 14877, 14031, 115367, 201745}},
+{15576, 18, 36617, {1, 1, 5, 3, 9, 23, 87, 27, 203, 995, 1759, 999, 949, 2733, 29053, 46581, 129003, 42585}},
+{15577, 18, 36653, {1, 1, 3, 1, 1, 21, 63, 243, 257, 741, 681, 2471, 2455, 15145, 31739, 8751, 15963, 165405}},
+{15578, 18, 36716, {1, 3, 3, 1, 25, 21, 69, 213, 219, 9, 199, 487, 4103, 141, 18177, 58797, 60415, 6313}},
+{15579, 18, 36721, {1, 3, 1, 5, 23, 43, 61, 121, 123, 89, 283, 1313, 2707, 10199, 7699, 17437, 130995, 140327}},
+{15580, 18, 36733, {1, 3, 5, 13, 31, 41, 111, 39, 403, 5, 1125, 2867, 3143, 7051, 9891, 43349, 20751, 88465}},
+{15581, 18, 36761, {1, 1, 3, 1, 19, 53, 83, 207, 285, 789, 1515, 3455, 4057, 15777, 27879, 46971, 122661, 143407}},
+{15582, 18, 36783, {1, 3, 3, 11, 25, 21, 127, 191, 313, 357, 1625, 1323, 1151, 12509, 22275, 23517, 12221, 258709}},
+{15583, 18, 36786, {1, 1, 5, 7, 1, 47, 1, 107, 387, 965, 1319, 2911, 2121, 8595, 9, 21587, 81187, 2803}},
+{15584, 18, 36795, {1, 3, 3, 5, 19, 55, 37, 213, 23, 767, 1493, 635, 4289, 2503, 16835, 47851, 77335, 60565}},
+{15585, 18, 36800, {1, 1, 1, 7, 23, 9, 101, 145, 457, 691, 1895, 2145, 7527, 7687, 20781, 10957, 24859, 79137}},
+{15586, 18, 36810, {1, 3, 7, 15, 9, 9, 15, 195, 493, 859, 687, 1445, 429, 8599, 24591, 40709, 118361, 148163}},
+{15587, 18, 36812, {1, 1, 1, 3, 7, 51, 45, 143, 339, 475, 1177, 2829, 785, 10141, 4923, 29135, 22603, 119973}},
+{15588, 18, 36817, {1, 3, 5, 15, 25, 37, 1, 13, 351, 127, 143, 2637, 1215, 14577, 12465, 10575, 67997, 21877}},
+{15589, 18, 36818, {1, 3, 7, 3, 27, 19, 59, 241, 327, 307, 731, 3471, 6123, 13607, 8793, 14825, 110681, 83259}},
+{15590, 18, 36851, {1, 1, 1, 11, 25, 5, 59, 85, 335, 189, 499, 1305, 5801, 7259, 2397, 14045, 55585, 258579}},
+{15591, 18, 36853, {1, 1, 3, 5, 21, 49, 49, 63, 261, 657, 1453, 55, 1325, 15513, 14891, 60689, 15381, 252641}},
+{15592, 18, 36868, {1, 1, 7, 15, 25, 3, 85, 33, 495, 867, 903, 1813, 2871, 365, 17399, 45695, 102851, 225873}},
+{15593, 18, 36889, {1, 1, 1, 13, 13, 63, 29, 35, 325, 893, 1313, 133, 8169, 7791, 9271, 36759, 92275, 169717}},
+{15594, 18, 36890, {1, 1, 7, 3, 21, 45, 7, 151, 387, 891, 1921, 1701, 307, 5323, 16321, 51229, 79369, 21513}},
+{15595, 18, 36896, {1, 1, 1, 11, 7, 27, 17, 75, 161, 649, 337, 1731, 2905, 4589, 17387, 10455, 70673, 228373}},
+{15596, 18, 36905, {1, 1, 3, 15, 17, 35, 45, 131, 469, 629, 1771, 1965, 5065, 6249, 29041, 52791, 55619, 154531}},
+{15597, 18, 36919, {1, 1, 7, 3, 25, 53, 85, 233, 161, 163, 1155, 3159, 1551, 13099, 25647, 26777, 91647, 162755}},
+{15598, 18, 36938, {1, 1, 3, 9, 17, 11, 39, 63, 503, 927, 1621, 3425, 4835, 7083, 16449, 47913, 127905, 165567}},
+{15599, 18, 36946, {1, 1, 7, 1, 29, 9, 1, 111, 285, 1009, 1427, 3071, 205, 12269, 31337, 14501, 10923, 14277}},
+{15600, 18, 36951, {1, 1, 5, 5, 1, 3, 51, 205, 477, 661, 1555, 2113, 6487, 4755, 13633, 16391, 35775, 52623}},
+{15601, 18, 36952, {1, 3, 3, 3, 27, 23, 109, 49, 71, 19, 733, 1361, 4369, 14527, 20443, 10507, 120183, 246115}},
+{15602, 18, 36964, {1, 3, 3, 5, 7, 47, 51, 197, 97, 471, 1631, 3317, 5857, 9405, 30359, 7741, 45079, 175929}},
+{15603, 18, 36968, {1, 1, 3, 3, 13, 63, 39, 173, 511, 525, 1687, 1735, 6877, 7383, 27971, 26503, 6189, 232251}},
+{15604, 18, 36979, {1, 1, 5, 3, 5, 31, 101, 99, 51, 987, 1627, 3899, 6321, 9441, 4983, 64001, 30923, 199495}},
+{15605, 18, 36981, {1, 3, 1, 1, 11, 39, 119, 123, 33, 1017, 1477, 283, 4939, 453, 16445, 25599, 106857, 257811}},
+{15606, 18, 37021, {1, 3, 1, 11, 13, 1, 3, 101, 275, 75, 1795, 1449, 2503, 11765, 19299, 14237, 157, 244825}},
+{15607, 18, 37026, {1, 3, 7, 15, 23, 1, 85, 65, 55, 103, 1523, 1443, 1021, 5733, 3297, 10889, 22487, 82503}},
+{15608, 18, 37075, {1, 1, 7, 3, 17, 59, 109, 113, 17, 173, 1709, 273, 5327, 3243, 10751, 58361, 42303, 78391}},
+{15609, 18, 37077, {1, 1, 5, 15, 25, 11, 101, 133, 193, 131, 1671, 3045, 7111, 14331, 15665, 56407, 31561, 154555}},
+{15610, 18, 37108, {1, 3, 3, 5, 15, 41, 105, 65, 81, 293, 389, 2653, 1883, 14741, 23553, 33349, 39665, 154233}},
+{15611, 18, 37112, {1, 1, 5, 15, 31, 19, 121, 41, 261, 511, 1679, 957, 1647, 12647, 12285, 30291, 122483, 187911}},
+{15612, 18, 37150, {1, 3, 1, 5, 27, 25, 17, 45, 303, 947, 1123, 2729, 281, 12389, 27987, 42667, 16089, 17129}},
+{15613, 18, 37154, {1, 3, 7, 15, 13, 17, 25, 223, 125, 837, 159, 253, 2599, 11381, 639, 32545, 50633, 139025}},
+{15614, 18, 37156, {1, 3, 1, 13, 23, 43, 25, 83, 507, 47, 99, 697, 4453, 2139, 17151, 50709, 37099, 212957}},
+{15615, 18, 37163, {1, 1, 7, 7, 29, 7, 63, 141, 475, 853, 1073, 143, 6979, 5663, 29691, 59489, 89689, 223047}},
+{15616, 18, 37178, {1, 1, 1, 1, 13, 27, 101, 61, 27, 735, 207, 2065, 5811, 5461, 21493, 15481, 103727, 80017}},
+{15617, 18, 37183, {1, 3, 1, 11, 9, 9, 35, 251, 147, 841, 1891, 1909, 5053, 5103, 11751, 16209, 110475, 114875}},
+{15618, 18, 37185, {1, 3, 3, 11, 13, 55, 117, 205, 71, 159, 1797, 989, 2221, 16087, 18287, 8355, 96403, 146613}},
+{15619, 18, 37191, {1, 1, 5, 5, 29, 25, 73, 63, 299, 839, 1225, 3583, 5641, 1341, 29431, 7035, 99107, 13493}},
+{15620, 18, 37198, {1, 1, 3, 5, 27, 53, 9, 51, 79, 701, 667, 1469, 4455, 13761, 18607, 39429, 7687, 201115}},
+{15621, 18, 37203, {1, 3, 7, 11, 23, 35, 101, 129, 491, 369, 565, 2557, 2529, 1003, 16003, 33873, 52155, 861}},
+{15622, 18, 37225, {1, 1, 1, 15, 27, 63, 1, 55, 331, 853, 899, 1027, 7389, 8935, 12559, 27315, 101753, 255331}},
+{15623, 18, 37243, {1, 3, 3, 15, 5, 41, 93, 39, 473, 887, 1667, 847, 7619, 8407, 6539, 31989, 63807, 21861}},
+{15624, 18, 37252, {1, 1, 5, 11, 27, 57, 73, 249, 331, 653, 21, 2937, 4403, 16195, 18785, 30375, 22939, 235291}},
+{15625, 18, 37262, {1, 1, 7, 1, 7, 41, 59, 161, 295, 503, 595, 3021, 455, 3991, 8617, 65361, 107239, 83205}},
+{15626, 18, 37264, {1, 3, 3, 15, 17, 41, 61, 229, 273, 687, 657, 1969, 2817, 2367, 29183, 41199, 24123, 184081}},
+{15627, 18, 37276, {1, 3, 7, 5, 25, 63, 43, 65, 443, 423, 549, 2031, 3353, 7041, 6563, 18819, 46047, 239823}},
+{15628, 18, 37327, {1, 3, 3, 3, 3, 17, 13, 115, 377, 623, 1959, 127, 5125, 13209, 24731, 23151, 21303, 7213}},
+{15629, 18, 37355, {1, 1, 7, 1, 21, 11, 21, 41, 491, 37, 1759, 2771, 1301, 12995, 17621, 30907, 75511, 82321}},
+{15630, 18, 37403, {1, 3, 3, 13, 13, 23, 77, 211, 215, 711, 427, 2213, 8041, 1595, 26105, 39051, 105407, 242141}},
+{15631, 18, 37415, {1, 3, 3, 9, 13, 35, 117, 207, 75, 395, 723, 3321, 6643, 2429, 10043, 10585, 3529, 64067}},
+{15632, 18, 37422, {1, 1, 1, 7, 3, 1, 83, 93, 311, 157, 891, 1717, 7669, 16067, 11775, 27693, 11757, 94471}},
+{15633, 18, 37448, {1, 3, 3, 5, 17, 63, 23, 177, 289, 921, 315, 3083, 5903, 8697, 22425, 37845, 31171, 49237}},
+{15634, 18, 37451, {1, 1, 7, 9, 21, 63, 29, 227, 427, 271, 525, 2071, 7103, 8389, 29185, 51601, 110737, 16949}},
+{15635, 18, 37478, {1, 3, 3, 3, 3, 49, 25, 173, 79, 343, 509, 1939, 6389, 15501, 20135, 54365, 69931, 135269}},
+{15636, 18, 37484, {1, 1, 3, 3, 21, 23, 41, 71, 169, 947, 1027, 2345, 3397, 12181, 15409, 31725, 41223, 58837}},
+{15637, 18, 37525, {1, 3, 7, 1, 19, 23, 57, 201, 27, 449, 1479, 921, 4703, 10949, 14369, 27929, 45399, 46055}},
+{15638, 18, 37553, {1, 1, 3, 9, 13, 17, 125, 17, 393, 295, 497, 3089, 6589, 4003, 8687, 48145, 2683, 175521}},
+{15639, 18, 37640, {1, 3, 3, 15, 15, 13, 3, 31, 51, 101, 973, 101, 3709, 13437, 51, 14293, 21561, 136497}},
+{15640, 18, 37645, {1, 1, 5, 11, 17, 27, 51, 45, 77, 539, 225, 2029, 533, 153, 26085, 33611, 28153, 75671}},
+{15641, 18, 37658, {1, 1, 1, 15, 3, 59, 59, 123, 475, 225, 1613, 3121, 2865, 4647, 14553, 35449, 121657, 37457}},
+{15642, 18, 37667, {1, 1, 5, 1, 27, 33, 121, 225, 57, 619, 1293, 3813, 2121, 3525, 21995, 47253, 33095, 257451}},
+{15643, 18, 37708, {1, 3, 1, 11, 11, 43, 115, 233, 335, 185, 989, 3567, 4135, 2357, 20559, 43325, 43015, 51695}},
+{15644, 18, 37723, {1, 1, 5, 9, 11, 49, 45, 187, 93, 967, 1609, 2511, 1549, 4045, 21309, 16341, 13495, 214827}},
+{15645, 18, 37732, {1, 1, 1, 13, 21, 23, 81, 7, 259, 483, 1059, 773, 5297, 10123, 9857, 61187, 47355, 76307}},
+{15646, 18, 37747, {1, 3, 7, 9, 29, 51, 113, 255, 223, 853, 1173, 1019, 1587, 9629, 22373, 32731, 125179, 193271}},
+{15647, 18, 37753, {1, 1, 5, 11, 3, 55, 25, 145, 347, 451, 1447, 3399, 5873, 11579, 11107, 64707, 10161, 142003}},
+{15648, 18, 37772, {1, 1, 1, 7, 15, 49, 109, 93, 267, 919, 177, 2247, 8129, 8039, 15629, 63767, 98153, 143255}},
+{15649, 18, 37789, {1, 1, 5, 3, 3, 27, 47, 151, 231, 35, 155, 2745, 7349, 6543, 14117, 19549, 54927, 10819}},
+{15650, 18, 37817, {1, 3, 7, 15, 31, 29, 17, 203, 249, 169, 1071, 3069, 6269, 3455, 27177, 33761, 111003, 4527}},
+{15651, 18, 37826, {1, 3, 1, 5, 31, 15, 65, 189, 3, 917, 857, 1221, 3553, 2883, 3631, 32971, 68057, 109081}},
+{15652, 18, 37831, {1, 3, 1, 9, 3, 55, 127, 57, 125, 463, 199, 317, 3373, 967, 5569, 55997, 17167, 33585}},
+{15653, 18, 37845, {1, 3, 5, 1, 9, 57, 15, 89, 335, 119, 1445, 1931, 4177, 2495, 27507, 8209, 60003, 29657}},
+{15654, 18, 37855, {1, 3, 5, 7, 15, 43, 83, 117, 283, 131, 653, 57, 6789, 7633, 30525, 64131, 101981, 122017}},
+{15655, 18, 37859, {1, 3, 7, 11, 3, 17, 115, 217, 391, 825, 1633, 885, 7787, 5595, 12235, 30233, 53587, 62985}},
+{15656, 18, 37866, {1, 1, 5, 3, 5, 13, 99, 1, 75, 329, 1247, 107, 2337, 4201, 6217, 12273, 41585, 46563}},
+{15657, 18, 37880, {1, 3, 1, 15, 25, 53, 33, 125, 311, 955, 161, 3631, 581, 11915, 4223, 63207, 16517, 201665}},
+{15658, 18, 37885, {1, 1, 5, 1, 27, 23, 93, 211, 483, 691, 949, 1825, 391, 12111, 13639, 61009, 88503, 104823}},
+{15659, 18, 37897, {1, 3, 1, 13, 3, 9, 51, 133, 259, 977, 697, 661, 7661, 3987, 8327, 50155, 112235, 236135}},
+{15660, 18, 37906, {1, 1, 3, 13, 7, 39, 121, 37, 151, 973, 1275, 2699, 3345, 7167, 19245, 55535, 12305, 33567}},
+{15661, 18, 37948, {1, 1, 1, 1, 27, 5, 91, 63, 409, 579, 459, 2335, 4721, 3305, 11293, 15405, 74513, 157863}},
+{15662, 18, 37954, {1, 1, 5, 1, 21, 45, 55, 111, 475, 381, 659, 1131, 3575, 5165, 27221, 46757, 53587, 90741}},
+{15663, 18, 37978, {1, 1, 5, 15, 11, 31, 121, 209, 69, 389, 779, 2833, 4519, 1801, 4363, 24723, 105849, 54475}},
+{15664, 18, 37980, {1, 1, 3, 9, 7, 19, 11, 75, 275, 77, 1997, 1661, 6139, 13165, 30653, 49469, 67053, 3811}},
+{15665, 18, 37990, {1, 1, 3, 9, 5, 11, 5, 151, 395, 715, 1381, 3011, 5939, 1805, 8063, 62877, 99749, 112951}},
+{15666, 18, 38001, {1, 1, 5, 13, 19, 15, 113, 47, 455, 173, 1897, 701, 6093, 2089, 3977, 20599, 60947, 23671}},
+{15667, 18, 38020, {1, 1, 1, 13, 23, 19, 13, 117, 275, 313, 1683, 2975, 179, 3949, 4361, 60211, 91999, 211219}},
+{15668, 18, 38029, {1, 3, 5, 15, 13, 53, 83, 161, 491, 1001, 1773, 1227, 1965, 14479, 17677, 24399, 86431, 203303}},
+{15669, 18, 38047, {1, 1, 7, 15, 5, 51, 103, 131, 351, 747, 1227, 2859, 6693, 10615, 29485, 6619, 106239, 148739}},
+{15670, 18, 38063, {1, 3, 5, 1, 9, 43, 91, 173, 223, 393, 1181, 3785, 6589, 1299, 10217, 20891, 64125, 63409}},
+{15671, 18, 38077, {1, 1, 5, 7, 11, 23, 45, 57, 397, 771, 511, 1849, 343, 14139, 26271, 56241, 52581, 163187}},
+{15672, 18, 38110, {1, 3, 7, 5, 15, 59, 89, 151, 255, 247, 291, 219, 995, 10821, 1445, 35581, 88767, 16871}},
+{15673, 18, 38116, {1, 1, 7, 11, 7, 25, 3, 175, 253, 193, 1641, 1669, 7095, 11871, 10801, 42567, 120663, 109347}},
+{15674, 18, 38119, {1, 3, 5, 7, 31, 41, 119, 39, 149, 653, 153, 2783, 1377, 5223, 17915, 3127, 41869, 193477}},
+{15675, 18, 38176, {1, 3, 3, 13, 23, 19, 47, 85, 487, 103, 237, 2363, 4451, 5077, 23749, 17011, 73561, 169165}},
+{15676, 18, 38186, {1, 1, 3, 9, 21, 25, 77, 235, 53, 681, 1463, 2093, 1525, 12797, 5469, 54277, 15587, 68395}},
+{15677, 18, 38194, {1, 1, 1, 15, 23, 63, 63, 225, 239, 143, 1073, 199, 3231, 1371, 11215, 5999, 100705, 174681}},
+{15678, 18, 38218, {1, 1, 1, 3, 17, 25, 69, 179, 445, 695, 281, 379, 8115, 9443, 13221, 50669, 37369, 62151}},
+{15679, 18, 38241, {1, 3, 3, 9, 11, 29, 21, 89, 441, 353, 401, 1139, 5003, 8087, 24457, 50237, 110993, 117233}},
+{15680, 18, 38247, {1, 3, 3, 1, 13, 45, 31, 249, 295, 149, 591, 2071, 3611, 931, 16261, 8239, 82767, 195665}},
+{15681, 18, 38261, {1, 3, 3, 9, 19, 47, 69, 177, 493, 231, 431, 1359, 6867, 7641, 15661, 25285, 65477, 212643}},
+{15682, 18, 38268, {1, 3, 3, 13, 19, 63, 83, 153, 367, 407, 547, 661, 7743, 5473, 2993, 62937, 33811, 101313}},
+{15683, 18, 38277, {1, 3, 5, 3, 29, 17, 19, 203, 79, 279, 1333, 1851, 51, 9793, 12955, 17383, 73437, 121743}},
+{15684, 18, 38287, {1, 1, 1, 11, 11, 43, 31, 187, 463, 827, 1511, 225, 845, 8963, 1553, 61269, 122033, 245633}},
+{15685, 18, 38295, {1, 1, 3, 3, 31, 23, 9, 241, 377, 317, 655, 2197, 2461, 13239, 15649, 7879, 55085, 129855}},
+{15686, 18, 38299, {1, 3, 5, 7, 9, 37, 1, 191, 185, 145, 1567, 3423, 1127, 1991, 10741, 38407, 22915, 222845}},
+{15687, 18, 38301, {1, 1, 5, 3, 27, 31, 11, 227, 307, 973, 745, 1079, 7479, 10065, 31389, 19195, 114775, 246615}},
+{15688, 18, 38305, {1, 3, 1, 11, 29, 27, 11, 83, 205, 399, 1489, 739, 715, 7955, 16473, 21127, 62379, 260399}},
+{15689, 18, 38312, {1, 3, 3, 3, 25, 25, 123, 163, 399, 841, 963, 2089, 4949, 13085, 19831, 15345, 60377, 164235}},
+{15690, 18, 38315, {1, 1, 1, 9, 3, 21, 101, 105, 397, 23, 1505, 3201, 547, 295, 23247, 18823, 115243, 151073}},
+{15691, 18, 38317, {1, 3, 7, 1, 31, 27, 111, 23, 205, 709, 1625, 3921, 6225, 11039, 29549, 51239, 119003, 133663}},
+{15692, 18, 38343, {1, 3, 3, 11, 21, 49, 111, 195, 25, 833, 1991, 563, 7031, 15429, 5707, 12351, 32221, 16599}},
+{15693, 18, 38344, {1, 1, 5, 7, 5, 7, 39, 171, 39, 921, 385, 2343, 625, 15355, 4923, 36597, 56901, 148377}},
+{15694, 18, 38350, {1, 1, 3, 15, 7, 43, 89, 217, 67, 271, 853, 147, 6767, 3183, 341, 40769, 116767, 22351}},
+{15695, 18, 38358, {1, 3, 5, 7, 7, 3, 105, 27, 183, 59, 953, 4027, 1277, 10323, 29437, 56085, 32677, 198067}},
+{15696, 18, 38364, {1, 1, 1, 15, 23, 29, 51, 209, 13, 177, 1103, 1723, 2877, 9199, 25601, 15537, 8599, 230819}},
+{15697, 18, 38371, {1, 1, 7, 1, 29, 39, 41, 217, 467, 423, 431, 2707, 2017, 11865, 11989, 12045, 71349, 6311}},
+{15698, 18, 38373, {1, 1, 1, 13, 15, 25, 3, 55, 403, 833, 1843, 1159, 1703, 2221, 15379, 65027, 18327, 108881}},
+{15699, 18, 38377, {1, 3, 7, 13, 3, 27, 13, 227, 215, 873, 1073, 1117, 7941, 13607, 7571, 6957, 44991, 239761}},
+{15700, 18, 38392, {1, 3, 7, 11, 23, 1, 95, 235, 283, 977, 1443, 161, 5937, 4351, 30835, 35569, 57509, 1835}},
+{15701, 18, 38407, {1, 3, 3, 13, 11, 1, 85, 75, 261, 543, 9, 899, 5821, 5465, 9771, 53707, 101003, 219215}},
+{15702, 18, 38408, {1, 3, 1, 7, 21, 49, 35, 19, 35, 759, 1467, 1423, 6355, 8415, 563, 24157, 121029, 87309}},
+{15703, 18, 38421, {1, 1, 7, 1, 9, 13, 65, 85, 209, 583, 387, 1743, 2665, 12021, 7525, 27665, 45885, 135039}},
+{15704, 18, 38438, {1, 1, 7, 11, 29, 41, 91, 17, 291, 211, 1801, 493, 899, 14491, 1741, 28971, 35205, 131417}},
+{15705, 18, 38442, {1, 1, 5, 13, 23, 55, 119, 165, 61, 653, 1375, 3575, 5081, 7767, 19963, 61583, 107149, 240639}},
+{15706, 18, 38464, {1, 3, 5, 15, 25, 3, 51, 27, 127, 259, 55, 2221, 3951, 6243, 15825, 42881, 37009, 254401}},
+{15707, 18, 38473, {1, 3, 5, 11, 25, 63, 13, 105, 111, 677, 1545, 2399, 4419, 10853, 7213, 17183, 103411, 67459}},
+{15708, 18, 38484, {1, 1, 1, 11, 11, 31, 73, 125, 155, 545, 1857, 2749, 6389, 4083, 16239, 23651, 68881, 43455}},
+{15709, 18, 38491, {1, 3, 7, 7, 21, 3, 117, 237, 431, 17, 687, 2613, 7483, 3253, 30511, 53833, 33077, 157055}},
+{15710, 18, 38510, {1, 1, 1, 1, 1, 57, 65, 97, 415, 477, 1003, 1415, 1493, 12993, 30965, 24809, 1467, 213021}},
+{15711, 18, 38518, {1, 1, 3, 7, 25, 33, 45, 25, 511, 733, 1077, 2483, 5899, 14295, 11631, 50609, 128989, 45177}},
+{15712, 18, 38531, {1, 1, 3, 3, 25, 17, 115, 31, 115, 191, 293, 3991, 3039, 6751, 16217, 16517, 21121, 193641}},
+{15713, 18, 38537, {1, 3, 3, 13, 25, 23, 7, 51, 363, 641, 333, 2533, 605, 1105, 12941, 4195, 129571, 13253}},
+{15714, 18, 38538, {1, 3, 1, 11, 17, 21, 7, 205, 293, 159, 9, 441, 3287, 10247, 2115, 54099, 128109, 8137}},
+{15715, 18, 38567, {1, 1, 7, 5, 21, 17, 43, 87, 117, 737, 149, 3175, 343, 8509, 12147, 22041, 80037, 23277}},
+{15716, 18, 38594, {1, 3, 3, 1, 3, 7, 101, 245, 11, 1003, 175, 2323, 7807, 15611, 5161, 10277, 37009, 83231}},
+{15717, 18, 38647, {1, 3, 1, 5, 13, 17, 113, 75, 315, 237, 77, 587, 5409, 2053, 22551, 15205, 82545, 18531}},
+{15718, 18, 38651, {1, 3, 5, 11, 9, 57, 61, 117, 281, 111, 369, 2411, 1691, 3391, 5379, 8237, 87329, 4253}},
+{15719, 18, 38654, {1, 3, 3, 3, 19, 25, 101, 1, 495, 25, 1317, 2333, 6183, 12215, 27879, 56403, 37169, 71635}},
+{15720, 18, 38686, {1, 1, 3, 5, 17, 63, 49, 127, 171, 405, 1763, 3697, 405, 2233, 4137, 28787, 108319, 53133}},
+{15721, 18, 38702, {1, 1, 5, 7, 23, 43, 87, 189, 97, 239, 1459, 2115, 7517, 7799, 28957, 37105, 71835, 199195}},
+{15722, 18, 38751, {1, 3, 1, 3, 25, 25, 23, 61, 369, 717, 1711, 1103, 7535, 9871, 25, 26849, 55955, 113389}},
+{15723, 18, 38821, {1, 1, 1, 11, 25, 57, 33, 175, 127, 541, 1031, 2847, 2069, 4033, 25593, 10615, 50097, 122955}},
+{15724, 18, 38825, {1, 3, 3, 13, 11, 27, 97, 171, 245, 33, 213, 4069, 753, 3535, 11727, 34941, 100543, 220789}},
+{15725, 18, 38853, {1, 3, 3, 9, 3, 17, 13, 237, 477, 507, 1751, 3191, 3385, 13977, 23355, 57355, 64341, 37683}},
+{15726, 18, 38863, {1, 1, 7, 13, 13, 43, 7, 153, 209, 7, 63, 585, 1715, 13313, 25355, 46759, 71893, 29755}},
+{15727, 18, 38882, {1, 3, 3, 3, 11, 23, 11, 147, 135, 1011, 1105, 3931, 3861, 13589, 32183, 30727, 37685, 67123}},
+{15728, 18, 38884, {1, 3, 7, 1, 11, 13, 25, 229, 147, 843, 329, 3337, 7559, 13193, 3011, 31549, 102461, 46195}},
+{15729, 18, 38932, {1, 1, 5, 11, 5, 47, 127, 89, 53, 663, 261, 541, 7743, 13037, 9013, 23079, 81225, 239875}},
+{15730, 18, 38941, {1, 1, 7, 3, 5, 39, 15, 177, 357, 357, 1959, 1721, 6703, 11829, 1195, 42113, 88699, 244347}},
+{15731, 18, 38952, {1, 1, 5, 15, 25, 19, 7, 3, 225, 773, 1535, 99, 6555, 4105, 19137, 56155, 109141, 161015}},
+{15732, 18, 38960, {1, 1, 5, 15, 5, 59, 41, 53, 203, 459, 1063, 3015, 5397, 1559, 20835, 57773, 67687, 206189}},
+{15733, 18, 38980, {1, 3, 1, 11, 17, 25, 61, 221, 37, 809, 1461, 1961, 7697, 1777, 23179, 54761, 7787, 177737}},
+{15734, 18, 38995, {1, 3, 7, 15, 27, 21, 49, 107, 353, 677, 461, 239, 5871, 1059, 3011, 32397, 13149, 103973}},
+{15735, 18, 39004, {1, 1, 5, 3, 11, 53, 61, 239, 479, 913, 479, 3435, 4979, 7931, 16841, 60077, 26667, 212601}},
+{15736, 18, 39013, {1, 1, 3, 5, 3, 19, 43, 143, 353, 507, 871, 2547, 7321, 6163, 9425, 62911, 86153, 239011}},
+{15737, 18, 39017, {1, 1, 1, 3, 15, 7, 115, 43, 69, 299, 1235, 1511, 3111, 7465, 769, 46981, 127707, 195839}},
+{15738, 18, 39026, {1, 1, 1, 5, 23, 27, 19, 21, 273, 291, 953, 3577, 3147, 3863, 18625, 53505, 33699, 123305}},
+{15739, 18, 39056, {1, 3, 5, 9, 3, 11, 89, 27, 447, 119, 493, 2605, 8175, 8837, 27555, 2319, 99101, 79121}},
+{15740, 18, 39121, {1, 1, 7, 11, 1, 11, 77, 129, 97, 261, 1241, 3117, 1627, 5397, 6495, 52339, 52711, 206237}},
+{15741, 18, 39124, {1, 3, 7, 9, 27, 57, 77, 147, 35, 845, 1417, 1615, 6097, 12559, 10765, 19027, 91693, 204339}},
+{15742, 18, 39133, {1, 1, 3, 5, 25, 47, 17, 145, 7, 969, 1981, 733, 4303, 7785, 4241, 39733, 82569, 78061}},
+{15743, 18, 39157, {1, 1, 5, 1, 5, 47, 45, 111, 405, 943, 1911, 1613, 3817, 10483, 17729, 7201, 88033, 261701}},
+{15744, 18, 39181, {1, 3, 3, 13, 9, 3, 87, 39, 277, 769, 57, 2503, 7803, 11041, 20945, 19623, 32617, 110027}},
+{15745, 18, 39187, {1, 1, 3, 3, 27, 57, 1, 103, 427, 935, 1617, 665, 837, 8001, 13543, 44771, 64033, 65239}},
+{15746, 18, 39212, {1, 1, 5, 3, 13, 21, 31, 59, 225, 945, 1825, 1511, 3273, 3171, 30347, 21993, 40203, 143297}},
+{15747, 18, 39223, {1, 3, 5, 7, 11, 3, 3, 217, 167, 885, 975, 3249, 7909, 13621, 18697, 61021, 31497, 198033}},
+{15748, 18, 39250, {1, 3, 5, 9, 11, 5, 87, 33, 117, 471, 267, 529, 5879, 13969, 5731, 52613, 106411, 74341}},
+{15749, 18, 39265, {1, 1, 7, 11, 5, 31, 25, 55, 135, 779, 717, 1953, 7929, 11011, 6133, 14099, 106975, 178337}},
+{15750, 18, 39320, {1, 3, 1, 1, 29, 17, 125, 7, 445, 299, 1897, 3235, 8189, 14339, 14725, 63185, 126751, 88747}},
+{15751, 18, 39330, {1, 1, 5, 3, 1, 11, 65, 161, 243, 605, 1945, 3141, 6443, 9703, 13331, 2239, 6315, 247595}},
+{15752, 18, 39335, {1, 3, 1, 7, 15, 23, 83, 215, 331, 631, 453, 879, 4109, 4897, 16535, 55749, 90799, 147287}},
+{15753, 18, 39353, {1, 3, 5, 13, 25, 1, 109, 205, 49, 471, 1735, 973, 1279, 9917, 18225, 44921, 98519, 211541}},
+{15754, 18, 39371, {1, 1, 5, 11, 29, 41, 113, 187, 75, 479, 1633, 841, 6259, 8919, 27751, 25179, 115369, 166567}},
+{15755, 18, 39385, {1, 3, 5, 11, 17, 31, 107, 41, 435, 647, 811, 2937, 5819, 3483, 3835, 57033, 53543, 61973}},
+{15756, 18, 39421, {1, 3, 3, 11, 15, 45, 33, 103, 505, 67, 463, 1275, 2449, 15261, 22867, 25215, 38793, 189309}},
+{15757, 18, 39432, {1, 1, 1, 5, 19, 45, 35, 173, 365, 39, 1599, 3623, 2231, 12141, 19437, 27053, 15869, 104719}},
+{15758, 18, 39443, {1, 3, 7, 7, 9, 17, 87, 151, 249, 81, 1109, 1951, 7475, 1699, 17847, 64149, 50285, 242793}},
+{15759, 18, 39450, {1, 3, 5, 13, 15, 51, 35, 105, 479, 763, 1945, 2349, 2987, 621, 283, 20411, 65799, 86517}},
+{15760, 18, 39455, {1, 3, 3, 1, 19, 31, 49, 229, 249, 689, 737, 4027, 5405, 15211, 26785, 39143, 93163, 190421}},
+{15761, 18, 39468, {1, 3, 7, 5, 1, 21, 63, 97, 347, 73, 745, 3455, 2347, 3821, 31385, 6545, 91803, 72895}},
+{15762, 18, 39473, {1, 1, 1, 15, 23, 11, 107, 47, 183, 235, 1985, 3277, 933, 8491, 14423, 24293, 6783, 162199}},
+{15763, 18, 39488, {1, 3, 3, 9, 17, 3, 123, 59, 277, 773, 1617, 2979, 1555, 9753, 10947, 24745, 89043, 45185}},
+{15764, 18, 39497, {1, 3, 7, 3, 25, 17, 79, 43, 311, 415, 1045, 1289, 7451, 11413, 11319, 37177, 101327, 147453}},
+{15765, 18, 39521, {1, 3, 7, 7, 17, 45, 49, 33, 313, 613, 1773, 773, 161, 13579, 1207, 5681, 120597, 178639}},
+{15766, 18, 39531, {1, 3, 5, 5, 17, 43, 65, 243, 287, 223, 253, 687, 887, 14887, 1077, 53337, 62381, 43531}},
+{15767, 18, 39542, {1, 3, 5, 1, 21, 3, 39, 149, 497, 939, 1537, 437, 5345, 10321, 25151, 48785, 49879, 90945}},
+{15768, 18, 39585, {1, 1, 7, 11, 1, 61, 113, 63, 285, 615, 343, 2897, 1939, 7911, 16387, 10781, 92769, 27995}},
+{15769, 18, 39605, {1, 1, 3, 3, 19, 29, 85, 227, 355, 857, 883, 1853, 5065, 13795, 5749, 59107, 57947, 35775}},
+{15770, 18, 39658, {1, 3, 5, 9, 23, 37, 119, 161, 23, 511, 81, 973, 4769, 10821, 32607, 61731, 64907, 99055}},
+{15771, 18, 39677, {1, 3, 1, 3, 11, 17, 109, 241, 349, 887, 1651, 3865, 2045, 15893, 4597, 11557, 53313, 48489}},
+{15772, 18, 39703, {1, 1, 5, 9, 31, 43, 49, 193, 171, 477, 363, 735, 1379, 8977, 9759, 56477, 99495, 170433}},
+{15773, 18, 39726, {1, 1, 3, 7, 25, 25, 77, 31, 21, 1001, 1527, 1725, 6479, 8927, 11249, 63969, 86291, 74391}},
+{15774, 18, 39731, {1, 3, 5, 13, 1, 43, 27, 7, 507, 569, 251, 2199, 3895, 7845, 13641, 1655, 112949, 119493}},
+{15775, 18, 39745, {1, 3, 7, 15, 7, 1, 123, 27, 121, 261, 201, 1469, 4229, 2933, 25157, 1919, 127937, 21607}},
+{15776, 18, 39776, {1, 1, 3, 9, 29, 59, 47, 81, 293, 191, 401, 849, 4355, 1643, 23533, 8469, 389, 97891}},
+{15777, 18, 39796, {1, 3, 5, 5, 9, 55, 37, 175, 203, 179, 901, 3473, 1489, 1009, 24623, 54895, 8711, 190271}},
+{15778, 18, 39809, {1, 1, 7, 1, 13, 39, 49, 105, 385, 189, 1079, 2799, 5901, 2511, 23199, 58925, 111727, 131193}},
+{15779, 18, 39833, {1, 1, 1, 7, 31, 63, 37, 181, 493, 745, 1131, 223, 8055, 9507, 26667, 22163, 26495, 200945}},
+{15780, 18, 39850, {1, 3, 7, 1, 25, 15, 127, 71, 445, 935, 1439, 1167, 3751, 799, 27253, 46209, 33413, 38553}},
+{15781, 18, 39869, {1, 3, 3, 11, 29, 35, 125, 77, 129, 851, 731, 3259, 4651, 4137, 20921, 19779, 119261, 141507}},
+{15782, 18, 39882, {1, 3, 1, 9, 11, 13, 31, 211, 87, 377, 547, 113, 1071, 7167, 28377, 52943, 50669, 156915}},
+{15783, 18, 39906, {1, 1, 3, 7, 29, 55, 89, 215, 425, 513, 175, 1145, 6995, 1929, 14253, 20563, 118543, 104403}},
+{15784, 18, 39918, {1, 1, 1, 5, 23, 25, 1, 23, 175, 571, 1597, 3801, 1411, 1783, 13045, 37499, 86831, 139101}},
+{15785, 18, 39929, {1, 3, 3, 13, 15, 19, 35, 139, 483, 17, 1555, 3431, 3417, 13695, 15985, 65243, 96659, 76027}},
+{15786, 18, 39947, {1, 3, 7, 9, 23, 7, 17, 89, 33, 353, 1999, 2561, 331, 15661, 25757, 63389, 112913, 131757}},
+{15787, 18, 39985, {1, 3, 1, 11, 27, 59, 37, 75, 121, 429, 1833, 3243, 2029, 2601, 5013, 29433, 123565, 234803}},
+{15788, 18, 39986, {1, 3, 1, 7, 31, 13, 33, 25, 459, 803, 267, 1573, 5579, 4575, 8125, 7491, 72681, 239409}},
+{15789, 18, 40023, {1, 1, 3, 7, 31, 43, 93, 191, 237, 75, 1809, 3257, 4131, 1983, 29153, 23205, 38393, 197859}},
+{15790, 18, 40024, {1, 3, 5, 5, 17, 47, 17, 153, 499, 529, 1515, 1587, 2951, 12431, 12787, 13245, 54117, 82663}},
+{15791, 18, 40039, {1, 1, 1, 13, 7, 23, 23, 7, 441, 991, 641, 2713, 151, 1863, 6065, 47381, 60493, 136325}},
+{15792, 18, 40053, {1, 3, 3, 11, 11, 15, 31, 137, 285, 439, 835, 3033, 6083, 7883, 3405, 35803, 65059, 150143}},
+{15793, 18, 40079, {1, 1, 7, 3, 19, 47, 61, 163, 313, 813, 1315, 2995, 2805, 14397, 6589, 62123, 46229, 206697}},
+{15794, 18, 40084, {1, 3, 5, 5, 27, 51, 25, 99, 241, 571, 1411, 1191, 7095, 8639, 29195, 53733, 53219, 42851}},
+{15795, 18, 40087, {1, 3, 1, 5, 11, 29, 1, 49, 61, 149, 1931, 29, 7163, 3717, 525, 42375, 71451, 8345}},
+{15796, 18, 40094, {1, 3, 3, 3, 13, 19, 97, 249, 265, 509, 1347, 3081, 6535, 7941, 31565, 59897, 91909, 171789}},
+{15797, 18, 40100, {1, 3, 3, 1, 25, 17, 75, 169, 251, 607, 73, 549, 1397, 10661, 1743, 9615, 41327, 243207}},
+{15798, 18, 40112, {1, 3, 1, 11, 7, 7, 15, 181, 385, 883, 651, 2939, 5457, 15309, 9807, 22221, 72893, 146331}},
+{15799, 18, 40129, {1, 3, 3, 5, 7, 7, 53, 75, 139, 459, 1861, 917, 4101, 10379, 18555, 12633, 70023, 254761}},
+{15800, 18, 40132, {1, 3, 3, 1, 17, 51, 5, 109, 471, 3, 1555, 3731, 6711, 9791, 63, 61931, 75269, 138697}},
+{15801, 18, 40142, {1, 1, 7, 15, 11, 1, 53, 141, 423, 567, 1937, 849, 5657, 7437, 32657, 16253, 115219, 106027}},
+{15802, 18, 40154, {1, 3, 5, 1, 17, 29, 65, 213, 443, 541, 697, 3859, 1463, 16081, 23299, 7645, 19475, 77857}},
+{15803, 18, 40177, {1, 1, 7, 3, 21, 43, 99, 101, 329, 755, 1123, 1277, 1381, 7017, 21763, 28243, 109995, 178377}},
+{15804, 18, 40178, {1, 3, 5, 7, 9, 31, 103, 123, 43, 895, 1925, 3383, 3539, 13669, 873, 57361, 45281, 256517}},
+{15805, 18, 40202, {1, 1, 1, 13, 1, 37, 115, 55, 415, 703, 1217, 939, 1145, 4015, 7233, 44799, 79711, 164725}},
+{15806, 18, 40219, {1, 1, 7, 1, 29, 17, 101, 15, 205, 281, 1059, 301, 753, 11953, 10533, 31881, 67741, 12683}},
+{15807, 18, 40303, {1, 1, 7, 13, 9, 23, 31, 237, 181, 813, 1765, 2237, 4897, 9955, 2139, 13113, 123423, 227629}},
+{15808, 18, 40305, {1, 1, 7, 15, 27, 57, 37, 75, 405, 185, 1671, 2245, 7151, 10531, 13161, 15695, 107547, 47689}},
+{15809, 18, 40311, {1, 1, 5, 15, 17, 53, 75, 251, 277, 1001, 179, 589, 1401, 4937, 11601, 47113, 36677, 39263}},
+{15810, 18, 40336, {1, 3, 5, 15, 23, 47, 53, 81, 115, 547, 1363, 2457, 4407, 10861, 25649, 64013, 44747, 97949}},
+{15811, 18, 40342, {1, 1, 3, 1, 25, 29, 121, 43, 205, 591, 211, 1899, 5835, 739, 19627, 60387, 127369, 11255}},
+{15812, 18, 40358, {1, 1, 3, 15, 31, 11, 93, 227, 501, 731, 1355, 3963, 347, 83, 12595, 56431, 80049, 42103}},
+{15813, 18, 40381, {1, 3, 1, 11, 13, 17, 51, 165, 311, 67, 1873, 1493, 3815, 13209, 11637, 5809, 94219, 118077}},
+{15814, 18, 40417, {1, 1, 7, 15, 19, 17, 13, 73, 365, 413, 1215, 2265, 2173, 8725, 4725, 1373, 76733, 95379}},
+{15815, 18, 40438, {1, 3, 1, 7, 7, 61, 13, 145, 205, 113, 1579, 3851, 7515, 10659, 28665, 5277, 65925, 10141}},
+{15816, 18, 40463, {1, 3, 7, 1, 9, 63, 11, 83, 197, 797, 1065, 1521, 1751, 7423, 7473, 4371, 29533, 225167}},
+{15817, 18, 40471, {1, 3, 7, 7, 3, 63, 71, 177, 53, 279, 1837, 2609, 7819, 7285, 11059, 65247, 102869, 24429}},
+{15818, 18, 40472, {1, 3, 3, 13, 9, 21, 123, 125, 367, 85, 85, 1009, 1009, 7779, 3375, 30999, 5035, 215107}},
+{15819, 18, 40488, {1, 3, 3, 9, 31, 53, 5, 43, 483, 483, 1359, 2605, 377, 4243, 13291, 50211, 118603, 259865}},
+{15820, 18, 40491, {1, 1, 1, 5, 19, 37, 109, 139, 373, 79, 1951, 3379, 5679, 6445, 29127, 56229, 97369, 232561}},
+{15821, 18, 40525, {1, 1, 3, 5, 19, 37, 61, 225, 321, 573, 1831, 971, 6507, 10005, 6837, 16433, 70913, 170873}},
+{15822, 18, 40526, {1, 1, 5, 11, 31, 17, 21, 29, 329, 679, 869, 389, 5121, 1819, 3539, 43793, 31617, 204983}},
+{15823, 18, 40550, {1, 1, 7, 7, 21, 11, 83, 97, 297, 275, 1559, 1899, 4957, 11463, 25647, 21095, 70121, 113395}},
+{15824, 18, 40553, {1, 3, 5, 11, 19, 57, 39, 37, 441, 715, 383, 4083, 1937, 12263, 6989, 36159, 118135, 238475}},
+{15825, 18, 40562, {1, 1, 1, 3, 9, 53, 85, 201, 357, 807, 865, 1621, 1993, 7623, 3165, 1005, 93343, 227765}},
+{15826, 18, 40568, {1, 1, 7, 7, 21, 29, 123, 175, 319, 621, 303, 117, 5589, 12511, 26053, 41603, 78439, 71819}},
+{15827, 18, 40580, {1, 1, 7, 15, 31, 47, 75, 225, 295, 67, 1349, 1749, 1363, 8763, 9153, 4059, 72015, 3155}},
+{15828, 18, 40608, {1, 3, 5, 13, 19, 23, 79, 25, 319, 475, 1517, 2757, 4009, 12663, 535, 51617, 55695, 64399}},
+{15829, 18, 40613, {1, 3, 7, 13, 19, 39, 61, 235, 369, 951, 111, 2169, 353, 15371, 8611, 42477, 130981, 97419}},
+{15830, 18, 40652, {1, 1, 3, 13, 27, 31, 115, 201, 3, 291, 793, 237, 3593, 2307, 12745, 54603, 96451, 80853}},
+{15831, 18, 40703, {1, 3, 3, 11, 11, 35, 43, 1, 35, 415, 1307, 2303, 5407, 6883, 29023, 31271, 119721, 90599}},
+{15832, 18, 40712, {1, 1, 5, 9, 21, 23, 3, 1, 333, 463, 1277, 1165, 6521, 4887, 16029, 32537, 43681, 21633}},
+{15833, 18, 40720, {1, 1, 1, 13, 1, 35, 45, 57, 293, 435, 1113, 2477, 6641, 14083, 28489, 26189, 44695, 220481}},
+{15834, 18, 40723, {1, 3, 5, 5, 5, 31, 75, 149, 309, 921, 941, 1063, 7041, 12651, 29533, 46955, 88133, 89989}},
+{15835, 18, 40746, {1, 1, 3, 5, 15, 23, 127, 143, 193, 739, 281, 991, 3731, 16243, 25483, 24979, 102317, 186657}},
+{15836, 18, 40759, {1, 1, 3, 13, 3, 63, 23, 69, 181, 163, 1733, 893, 5513, 1525, 31483, 15033, 108021, 167875}},
+{15837, 18, 40765, {1, 1, 5, 15, 15, 51, 79, 59, 55, 243, 565, 159, 7925, 8393, 20059, 35011, 53779, 166241}},
+{15838, 18, 40771, {1, 1, 3, 5, 11, 57, 85, 175, 495, 999, 1577, 2377, 715, 2473, 16979, 5949, 87691, 195607}},
+{15839, 18, 40778, {1, 1, 1, 13, 17, 21, 53, 73, 187, 63, 335, 3251, 4439, 5701, 13469, 23567, 70125, 68931}},
+{15840, 18, 40788, {1, 1, 1, 13, 23, 11, 55, 75, 37, 845, 745, 2193, 7113, 5657, 29449, 41153, 115547, 87261}},
+{15841, 18, 40804, {1, 3, 3, 9, 21, 39, 47, 145, 301, 883, 625, 2479, 1089, 3393, 23265, 49577, 81027, 186485}},
+{15842, 18, 40835, {1, 1, 3, 7, 3, 11, 37, 117, 79, 905, 493, 265, 1819, 12179, 12361, 27457, 14459, 231837}},
+{15843, 18, 40841, {1, 3, 5, 11, 19, 45, 99, 5, 455, 497, 1851, 2349, 5213, 3671, 5871, 43187, 59011, 211167}},
+{15844, 18, 40907, {1, 3, 7, 5, 23, 61, 63, 97, 413, 575, 1073, 2587, 573, 1805, 32307, 58463, 84927, 15065}},
+{15845, 18, 40934, {1, 3, 1, 13, 23, 9, 39, 1, 53, 383, 1277, 3599, 7719, 16175, 4443, 53143, 24345, 111899}},
+{15846, 18, 40955, {1, 1, 7, 1, 19, 37, 103, 245, 253, 5, 1367, 3127, 4689, 5089, 30697, 45513, 111291, 26599}},
+{15847, 18, 40986, {1, 3, 3, 7, 31, 31, 107, 163, 1, 855, 163, 875, 7481, 5325, 30107, 19377, 3167, 5613}},
+{15848, 18, 41007, {1, 1, 5, 13, 21, 17, 115, 203, 233, 333, 441, 3185, 3197, 3397, 8515, 61879, 11163, 233277}},
+{15849, 18, 41016, {1, 3, 5, 3, 17, 53, 93, 233, 465, 573, 1075, 1905, 1141, 4965, 13469, 24901, 23653, 225233}},
+{15850, 18, 41034, {1, 3, 7, 11, 11, 1, 95, 47, 85, 65, 9, 2413, 7347, 2127, 305, 4673, 79281, 188081}},
+{15851, 18, 41041, {1, 1, 7, 5, 9, 5, 27, 23, 393, 201, 467, 3677, 2641, 4671, 24627, 18927, 45137, 74167}},
+{15852, 18, 41063, {1, 3, 5, 11, 11, 9, 19, 247, 423, 693, 1885, 1129, 7459, 8411, 2573, 54111, 98919, 160075}},
+{15853, 18, 41084, {1, 3, 3, 3, 1, 3, 67, 131, 317, 915, 151, 3609, 4083, 6395, 12877, 44017, 28877, 244165}},
+{15854, 18, 41093, {1, 3, 1, 3, 1, 33, 29, 23, 19, 323, 873, 115, 2439, 4699, 5449, 51637, 68889, 105197}},
+{15855, 18, 41097, {1, 1, 7, 1, 19, 55, 37, 241, 53, 695, 729, 1565, 19, 12875, 26993, 18511, 35615, 169281}},
+{15856, 18, 41111, {1, 3, 3, 1, 1, 7, 121, 49, 345, 883, 1001, 657, 2647, 15387, 30633, 18107, 13745, 217735}},
+{15857, 18, 41118, {1, 3, 5, 15, 11, 45, 73, 77, 307, 373, 1723, 335, 473, 5735, 11747, 39257, 87199, 47663}},
+{15858, 18, 41121, {1, 1, 7, 7, 27, 21, 121, 169, 427, 605, 1593, 3147, 1001, 3773, 31505, 22823, 21543, 82931}},
+{15859, 18, 41141, {1, 1, 1, 9, 11, 59, 91, 165, 249, 859, 483, 3133, 5729, 12675, 7761, 6475, 116823, 224187}},
+{15860, 18, 41160, {1, 1, 3, 3, 27, 31, 51, 1, 429, 517, 1439, 3959, 2343, 6709, 5287, 24039, 52409, 20749}},
+{15861, 18, 41207, {1, 3, 7, 7, 11, 31, 83, 111, 391, 729, 721, 1675, 5679, 14637, 22065, 49903, 113759, 40881}},
+{15862, 18, 41214, {1, 3, 7, 1, 25, 15, 91, 59, 87, 313, 155, 1439, 2419, 2099, 22709, 10289, 40655, 17351}},
+{15863, 18, 41255, {1, 3, 5, 1, 15, 5, 11, 21, 261, 227, 1563, 1177, 4731, 3487, 1607, 46599, 105599, 193425}},
+{15864, 18, 41284, {1, 1, 5, 5, 5, 45, 77, 181, 431, 27, 1985, 881, 2555, 7589, 16199, 31041, 66683, 52499}},
+{15865, 18, 41287, {1, 1, 1, 15, 5, 29, 111, 209, 335, 747, 93, 3551, 5951, 14995, 18451, 33329, 9117, 167455}},
+{15866, 18, 41308, {1, 3, 1, 7, 25, 9, 113, 123, 387, 87, 267, 2251, 3509, 10829, 32733, 48025, 58267, 143553}},
+{15867, 18, 41330, {1, 3, 5, 15, 17, 17, 65, 107, 175, 427, 733, 797, 3837, 12773, 27865, 29481, 4557, 196163}},
+{15868, 18, 41336, {1, 3, 1, 3, 1, 53, 93, 175, 509, 351, 1093, 1039, 6931, 2691, 14957, 44395, 84383, 58915}},
+{15869, 18, 41437, {1, 1, 1, 11, 1, 43, 61, 123, 377, 813, 1335, 1597, 147, 13663, 30781, 47635, 24111, 64307}},
+{15870, 18, 41444, {1, 1, 3, 11, 25, 27, 15, 215, 125, 679, 1491, 3203, 5403, 4531, 11839, 44227, 49239, 110439}},
+{15871, 18, 41456, {1, 1, 3, 13, 9, 35, 71, 127, 127, 629, 1363, 585, 6713, 10637, 6803, 20963, 47157, 157781}},
+{15872, 18, 41481, {1, 1, 3, 11, 13, 21, 117, 241, 365, 175, 1397, 1279, 4117, 5427, 24007, 50711, 465, 225003}},
+{15873, 18, 41489, {1, 1, 1, 9, 13, 63, 49, 189, 113, 61, 353, 2221, 7541, 4075, 5283, 5505, 51035, 35191}},
+{15874, 18, 41499, {1, 1, 7, 9, 11, 37, 123, 63, 331, 691, 1299, 1661, 3769, 7827, 32127, 32149, 7271, 150363}},
+{15875, 18, 41555, {1, 1, 1, 5, 25, 5, 127, 195, 413, 657, 479, 879, 6743, 8959, 791, 22425, 77119, 180721}},
+{15876, 18, 41561, {1, 1, 7, 3, 13, 57, 123, 125, 135, 69, 455, 3363, 1783, 1557, 20401, 26707, 130345, 195881}},
+{15877, 18, 41562, {1, 3, 3, 7, 27, 19, 125, 71, 201, 1017, 1285, 3955, 5255, 14375, 18163, 28537, 76157, 247193}},
+{15878, 18, 41571, {1, 1, 3, 1, 27, 33, 123, 137, 189, 655, 1891, 2419, 5195, 97, 32565, 38581, 62715, 164697}},
+{15879, 18, 41592, {1, 1, 1, 15, 9, 47, 23, 147, 197, 503, 1803, 2953, 2961, 13787, 10545, 35465, 53997, 198655}},
+{15880, 18, 41631, {1, 3, 1, 9, 9, 43, 65, 237, 119, 621, 1517, 3479, 4165, 12797, 14731, 53131, 105501, 112845}},
+{15881, 18, 41661, {1, 3, 3, 15, 3, 23, 47, 163, 469, 363, 1813, 3107, 6167, 8987, 26829, 33099, 6821, 203017}},
+{15882, 18, 41682, {1, 1, 1, 9, 1, 11, 85, 11, 251, 907, 395, 3935, 3403, 229, 16825, 48337, 103647, 91425}},
+{15883, 18, 41710, {1, 3, 1, 5, 17, 57, 21, 181, 31, 27, 235, 4041, 4927, 8319, 29765, 61603, 19081, 75879}},
+{15884, 18, 41724, {1, 1, 5, 15, 11, 3, 7, 225, 247, 221, 251, 1979, 1151, 10829, 26491, 39705, 41587, 99063}},
+{15885, 18, 41727, {1, 3, 5, 5, 19, 23, 57, 127, 467, 409, 43, 829, 3883, 10767, 24351, 31365, 115943, 209231}},
+{15886, 18, 41730, {1, 1, 7, 15, 3, 51, 17, 251, 219, 33, 1511, 2027, 4995, 12277, 7639, 59895, 85267, 87735}},
+{15887, 18, 41744, {1, 3, 7, 3, 7, 29, 93, 57, 427, 235, 1591, 3475, 1159, 2387, 851, 43307, 87081, 151543}},
+{15888, 18, 41769, {1, 3, 7, 7, 1, 9, 21, 167, 73, 439, 2035, 2091, 4563, 4819, 5591, 57123, 78739, 63235}},
+{15889, 18, 41795, {1, 1, 3, 13, 19, 35, 63, 17, 425, 277, 1669, 931, 597, 5621, 22367, 1155, 109099, 169965}},
+{15890, 18, 41798, {1, 3, 7, 5, 11, 11, 41, 71, 35, 183, 555, 2631, 5199, 16381, 16319, 1851, 121551, 141711}},
+{15891, 18, 41804, {1, 3, 5, 5, 21, 17, 3, 95, 47, 1011, 1757, 3295, 1111, 16043, 6377, 16257, 37941, 206637}},
+{15892, 18, 41826, {1, 3, 1, 5, 25, 19, 19, 69, 395, 589, 1311, 1075, 5763, 12475, 3633, 40647, 54487, 97459}},
+{15893, 18, 41852, {1, 3, 5, 7, 13, 23, 83, 91, 419, 415, 685, 1685, 2893, 12953, 30641, 43565, 11851, 187837}},
+{15894, 18, 41868, {1, 1, 5, 11, 27, 1, 61, 155, 279, 737, 215, 2909, 969, 57, 17979, 34537, 41861, 243717}},
+{15895, 18, 41910, {1, 1, 5, 1, 17, 61, 57, 199, 127, 569, 1109, 3057, 7301, 16097, 17579, 25753, 82653, 237273}},
+{15896, 18, 41914, {1, 1, 7, 15, 17, 45, 19, 53, 153, 785, 51, 291, 5261, 1317, 21163, 44393, 108131, 254373}},
+{15897, 18, 41942, {1, 1, 3, 11, 5, 19, 61, 125, 127, 961, 2019, 1725, 855, 677, 20853, 38845, 3239, 95697}},
+{15898, 18, 41969, {1, 1, 3, 15, 3, 3, 117, 17, 61, 201, 241, 1759, 4465, 3985, 6985, 47703, 58657, 52633}},
+{15899, 18, 41975, {1, 3, 3, 11, 31, 39, 107, 171, 19, 825, 1309, 807, 7787, 10761, 20215, 9287, 21553, 179599}},
+{15900, 18, 41976, {1, 3, 7, 9, 5, 7, 121, 15, 3, 199, 97, 3177, 5461, 15713, 27609, 54349, 24963, 186279}},
+{15901, 18, 41994, {1, 3, 1, 15, 11, 9, 123, 187, 363, 5, 837, 451, 1601, 6597, 10857, 46893, 83729, 20409}},
+{15902, 18, 42002, {1, 3, 1, 9, 1, 53, 71, 191, 217, 165, 1709, 1827, 1977, 10073, 11373, 35311, 26637, 134519}},
+{15903, 18, 42037, {1, 3, 5, 11, 31, 55, 101, 189, 277, 347, 629, 223, 785, 5739, 25505, 55601, 55017, 212837}},
+{15904, 18, 42056, {1, 1, 5, 11, 3, 13, 45, 235, 65, 459, 621, 587, 7105, 6181, 13193, 5683, 42935, 198585}},
+{15905, 18, 42079, {1, 1, 3, 1, 3, 17, 27, 109, 261, 979, 903, 1499, 4799, 11759, 10591, 65429, 74587, 16629}},
+{15906, 18, 42085, {1, 1, 5, 1, 13, 63, 29, 11, 441, 151, 611, 4073, 3933, 6793, 28845, 39223, 120823, 49397}},
+{15907, 18, 42089, {1, 3, 3, 5, 21, 13, 23, 53, 357, 197, 1327, 1773, 2961, 11509, 16585, 10201, 28451, 45109}},
+{15908, 18, 42123, {1, 3, 5, 7, 19, 17, 97, 63, 295, 111, 85, 2981, 6719, 9193, 15197, 12117, 2553, 59909}},
+{15909, 18, 42128, {1, 1, 5, 5, 15, 3, 9, 85, 333, 379, 1409, 1445, 4173, 3953, 833, 48089, 120249, 122703}},
+{15910, 18, 42140, {1, 3, 7, 7, 29, 13, 57, 19, 141, 979, 1991, 4011, 8125, 3915, 15753, 1371, 113771, 117273}},
+{15911, 18, 42149, {1, 3, 3, 13, 21, 53, 115, 187, 279, 29, 1355, 1843, 253, 3531, 8193, 54731, 6213, 123467}},
+{15912, 18, 42156, {1, 3, 3, 1, 25, 29, 109, 19, 37, 385, 901, 3737, 6247, 9941, 13185, 2895, 88819, 53029}},
+{15913, 18, 42186, {1, 1, 1, 1, 3, 31, 89, 157, 483, 657, 1833, 2975, 3187, 631, 28685, 7277, 4915, 115955}},
+{15914, 18, 42191, {1, 3, 3, 1, 25, 41, 13, 99, 385, 303, 297, 419, 7919, 12411, 757, 9227, 47867, 120175}},
+{15915, 18, 42205, {1, 3, 5, 11, 23, 15, 21, 157, 177, 301, 789, 2791, 5769, 7809, 2369, 26123, 116465, 22595}},
+{15916, 18, 42221, {1, 1, 5, 9, 17, 63, 45, 239, 465, 811, 1157, 1443, 8137, 12587, 26209, 62057, 59299, 167171}},
+{15917, 18, 42222, {1, 3, 3, 7, 3, 45, 41, 17, 341, 461, 571, 541, 989, 4069, 17531, 46729, 107915, 47871}},
+{15918, 18, 42230, {1, 1, 7, 1, 1, 23, 45, 213, 125, 799, 5, 3443, 2535, 12983, 2133, 63411, 93027, 89831}},
+{15919, 18, 42233, {1, 1, 1, 15, 7, 31, 49, 181, 213, 923, 281, 2059, 861, 6951, 25659, 32209, 66423, 225885}},
+{15920, 18, 42241, {1, 3, 3, 7, 9, 39, 107, 197, 383, 179, 27, 1395, 6397, 16139, 32049, 33567, 43977, 203939}},
+{15921, 18, 42247, {1, 1, 3, 5, 13, 37, 13, 31, 339, 527, 641, 181, 1413, 8145, 341, 57605, 108031, 109311}},
+{15922, 18, 42248, {1, 1, 1, 1, 21, 35, 87, 15, 279, 967, 1003, 813, 5075, 10595, 5609, 33901, 86443, 150007}},
+{15923, 18, 42254, {1, 3, 1, 5, 27, 9, 75, 199, 377, 889, 545, 1987, 6277, 361, 12563, 35699, 27105, 187995}},
+{15924, 18, 42259, {1, 3, 7, 1, 11, 3, 41, 215, 273, 61, 821, 1207, 2809, 8731, 26409, 50323, 22355, 16521}},
+{15925, 18, 42268, {1, 1, 7, 5, 29, 13, 99, 133, 15, 673, 215, 445, 4051, 2187, 9395, 62491, 58685, 224707}},
+{15926, 18, 42295, {1, 3, 3, 13, 21, 59, 17, 1, 271, 613, 939, 1881, 2379, 16325, 3275, 63707, 59961, 106937}},
+{15927, 18, 42304, {1, 3, 3, 1, 23, 53, 51, 181, 391, 375, 767, 239, 373, 4593, 25211, 37173, 70409, 252345}},
+{15928, 18, 42322, {1, 3, 3, 11, 15, 17, 37, 145, 41, 107, 151, 1351, 3457, 14727, 755, 36321, 99397, 73359}},
+{15929, 18, 42334, {1, 3, 5, 7, 25, 31, 39, 185, 341, 721, 1799, 1803, 5985, 10587, 11605, 9937, 23905, 56485}},
+{15930, 18, 42355, {1, 3, 1, 3, 19, 35, 25, 71, 109, 209, 1675, 4043, 2053, 6285, 25317, 50171, 68293, 124385}},
+{15931, 18, 42361, {1, 1, 1, 1, 21, 11, 63, 137, 361, 157, 1985, 2161, 7239, 1795, 10459, 38511, 36817, 253347}},
+{15932, 18, 42373, {1, 1, 1, 5, 31, 3, 13, 83, 185, 175, 567, 295, 459, 11453, 3765, 9841, 30333, 201377}},
+{15933, 18, 42374, {1, 1, 3, 13, 5, 57, 99, 125, 371, 903, 2001, 285, 2005, 8475, 31617, 58265, 641, 115507}},
+{15934, 18, 42398, {1, 3, 5, 9, 11, 17, 123, 67, 77, 803, 815, 3173, 4795, 11917, 1187, 32389, 102289, 248359}},
+{15935, 18, 42411, {1, 1, 5, 5, 27, 19, 59, 145, 361, 821, 33, 1465, 7643, 11101, 145, 21705, 55105, 181245}},
+{15936, 18, 42443, {1, 3, 7, 5, 15, 55, 127, 133, 157, 989, 1211, 3573, 4021, 2967, 2941, 38657, 97681, 114505}},
+{15937, 18, 42446, {1, 1, 7, 7, 23, 17, 39, 209, 117, 195, 931, 5, 7509, 9187, 6011, 10297, 13727, 258007}},
+{15938, 18, 42463, {1, 3, 1, 13, 3, 17, 105, 69, 9, 163, 1615, 241, 5207, 13173, 28521, 51417, 130645, 106787}},
+{15939, 18, 42479, {1, 1, 7, 13, 15, 3, 5, 187, 5, 239, 1799, 3083, 7801, 12781, 24817, 59341, 73867, 175273}},
+{15940, 18, 42482, {1, 1, 3, 11, 11, 1, 89, 17, 497, 217, 1565, 2933, 6449, 7687, 6561, 57903, 92751, 261371}},
+{15941, 18, 42484, {1, 1, 1, 1, 15, 39, 47, 249, 39, 765, 249, 2785, 4401, 16033, 11463, 127, 120109, 83133}},
+{15942, 18, 42498, {1, 1, 3, 3, 19, 59, 47, 153, 505, 1009, 413, 1177, 5999, 6841, 12013, 40295, 115641, 189241}},
+{15943, 18, 42534, {1, 3, 3, 11, 17, 51, 45, 101, 459, 971, 1133, 3467, 4945, 12445, 1267, 41783, 66825, 130167}},
+{15944, 18, 42537, {1, 3, 1, 7, 17, 45, 77, 211, 387, 23, 1903, 2309, 2681, 6897, 6959, 30981, 113537, 207415}},
+{15945, 18, 42557, {1, 1, 3, 1, 19, 9, 103, 89, 461, 881, 71, 2019, 6475, 13563, 18835, 2375, 34807, 1373}},
+{15946, 18, 42570, {1, 1, 7, 11, 3, 31, 125, 121, 43, 737, 1995, 3043, 811, 8883, 8169, 22131, 29295, 194963}},
+{15947, 18, 42599, {1, 3, 7, 11, 7, 45, 125, 149, 427, 187, 1361, 2405, 2815, 8877, 15255, 36867, 95517, 261969}},
+{15948, 18, 42600, {1, 1, 7, 11, 9, 29, 89, 175, 467, 997, 937, 3869, 7843, 12629, 8701, 60717, 30443, 193427}},
+{15949, 18, 42633, {1, 1, 5, 7, 3, 3, 57, 199, 315, 477, 189, 2029, 2059, 3473, 27411, 30419, 26465, 187807}},
+{15950, 18, 42639, {1, 3, 1, 15, 3, 3, 11, 55, 233, 603, 1749, 1737, 5709, 4559, 13427, 39137, 44885, 61611}},
+{15951, 18, 42672, {1, 1, 7, 1, 25, 15, 61, 199, 107, 737, 909, 3229, 1799, 5129, 27655, 45937, 919, 36161}},
+{15952, 18, 42681, {1, 1, 3, 5, 31, 27, 99, 247, 425, 689, 1335, 1661, 625, 15817, 22601, 33293, 113927, 261931}},
+{15953, 18, 42687, {1, 1, 1, 9, 5, 57, 117, 121, 465, 859, 335, 879, 665, 12787, 21313, 46387, 16437, 53769}},
+{15954, 18, 42704, {1, 1, 3, 1, 11, 11, 75, 145, 307, 621, 833, 235, 3907, 11331, 6633, 51905, 72581, 129613}},
+{15955, 18, 42713, {1, 1, 3, 13, 17, 13, 81, 125, 377, 499, 1597, 3437, 4323, 789, 23825, 46609, 105997, 159709}},
+{15956, 18, 42714, {1, 3, 3, 9, 5, 29, 113, 51, 23, 957, 1981, 3205, 2549, 9771, 2555, 44289, 103893, 170241}},
+{15957, 18, 42716, {1, 1, 5, 15, 13, 17, 101, 67, 71, 7, 185, 3775, 5399, 5213, 13095, 26045, 59467, 95547}},
+{15958, 18, 42726, {1, 1, 5, 5, 31, 11, 77, 169, 3, 1007, 1853, 2245, 509, 13489, 2807, 55227, 67541, 242835}},
+{15959, 18, 42730, {1, 3, 7, 15, 11, 63, 39, 97, 1, 219, 1827, 2343, 6009, 4909, 4327, 21853, 46079, 87719}},
+{15960, 18, 42737, {1, 3, 1, 9, 17, 51, 119, 93, 179, 607, 1051, 2381, 619, 11215, 10839, 44771, 20555, 12721}},
+{15961, 18, 42752, {1, 3, 3, 5, 21, 47, 35, 133, 61, 937, 1561, 1655, 6527, 5085, 4141, 60811, 59971, 6309}},
+{15962, 18, 42757, {1, 3, 1, 7, 5, 63, 7, 235, 489, 675, 945, 943, 7107, 6005, 32695, 27655, 113219, 132963}},
+{15963, 18, 42772, {1, 1, 1, 7, 7, 5, 81, 237, 365, 1, 811, 3075, 1771, 5223, 7337, 24601, 68383, 156975}},
+{15964, 18, 42809, {1, 3, 1, 15, 5, 35, 39, 91, 301, 387, 805, 3537, 737, 7453, 4655, 16349, 108261, 123697}},
+{15965, 18, 42853, {1, 3, 5, 3, 9, 59, 95, 187, 155, 183, 589, 2107, 967, 1095, 4875, 46131, 100699, 212797}},
+{15966, 18, 42857, {1, 3, 1, 7, 27, 29, 77, 133, 397, 445, 933, 1483, 5027, 12569, 22163, 58989, 16657, 195347}},
+{15967, 18, 42902, {1, 3, 5, 15, 21, 51, 97, 135, 165, 311, 525, 171, 4785, 7947, 14649, 40837, 58875, 222303}},
+{15968, 18, 42912, {1, 3, 3, 5, 23, 47, 41, 23, 321, 709, 1555, 1139, 3775, 11617, 13001, 18235, 51803, 197863}},
+{15969, 18, 42930, {1, 3, 5, 3, 3, 41, 91, 157, 29, 1005, 945, 3471, 2563, 8493, 24961, 44759, 103079, 50841}},
+{15970, 18, 42936, {1, 1, 5, 11, 23, 19, 91, 115, 165, 291, 1653, 1061, 1067, 6171, 18441, 26067, 3569, 117329}},
+{15971, 18, 42956, {1, 3, 7, 15, 17, 19, 89, 23, 103, 389, 623, 1071, 203, 9545, 21259, 36155, 55395, 141741}},
+{15972, 18, 42959, {1, 3, 5, 11, 27, 43, 31, 193, 55, 489, 353, 1615, 7461, 13977, 31901, 64051, 82667, 258825}},
+{15973, 18, 42978, {1, 1, 3, 7, 5, 39, 7, 245, 241, 843, 1545, 3499, 8117, 15057, 14153, 2665, 107401, 66059}},
+{15974, 18, 43001, {1, 3, 5, 11, 9, 11, 41, 171, 255, 153, 1973, 759, 51, 15601, 327, 25889, 110861, 20555}},
+{15975, 18, 43011, {1, 3, 5, 7, 5, 15, 41, 77, 87, 143, 1141, 3975, 2675, 7131, 5549, 52397, 42073, 27585}},
+{15976, 18, 43047, {1, 1, 3, 7, 29, 5, 79, 243, 359, 817, 1053, 3509, 3347, 6207, 5147, 31063, 116851, 132627}},
+{15977, 18, 43059, {1, 3, 7, 3, 27, 51, 39, 7, 95, 239, 263, 3497, 867, 1869, 16773, 46947, 59193, 37523}},
+{15978, 18, 43094, {1, 3, 1, 1, 25, 31, 113, 127, 187, 77, 675, 3307, 999, 12255, 26441, 30933, 122761, 116783}},
+{15979, 18, 43124, {1, 1, 5, 7, 7, 11, 87, 59, 437, 485, 685, 3159, 7259, 16271, 24899, 17919, 130271, 52953}},
+{15980, 18, 43218, {1, 1, 3, 11, 7, 13, 61, 157, 149, 1001, 285, 3631, 1923, 16013, 19507, 64447, 8073, 261171}},
+{15981, 18, 43220, {1, 3, 7, 9, 7, 13, 45, 7, 225, 671, 287, 1059, 5223, 2077, 7551, 58385, 92955, 162725}},
+{15982, 18, 43240, {1, 1, 5, 11, 11, 21, 17, 145, 97, 633, 475, 2639, 2069, 9663, 23633, 50949, 109941, 119865}},
+{15983, 18, 43258, {1, 1, 5, 13, 9, 49, 127, 171, 199, 413, 1315, 645, 305, 12123, 9559, 38319, 99945, 103313}},
+{15984, 18, 43263, {1, 3, 5, 3, 19, 21, 119, 17, 301, 611, 1785, 2081, 2245, 8761, 4755, 9507, 23133, 144575}},
+{15985, 18, 43265, {1, 3, 7, 11, 17, 25, 101, 59, 397, 249, 687, 715, 1151, 15941, 20525, 5171, 24073, 46257}},
+{15986, 18, 43290, {1, 1, 3, 15, 11, 45, 9, 201, 421, 867, 389, 3615, 5965, 10561, 18309, 17143, 52771, 230743}},
+{15987, 18, 43346, {1, 1, 3, 5, 9, 1, 109, 233, 431, 849, 421, 475, 1331, 9903, 20649, 34759, 118611, 38541}},
+{15988, 18, 43364, {1, 3, 5, 15, 9, 55, 113, 217, 83, 409, 1449, 2325, 4825, 11311, 14565, 65075, 124399, 3591}},
+{15989, 18, 43373, {1, 3, 3, 9, 27, 13, 101, 181, 255, 313, 693, 951, 1153, 13941, 14097, 8325, 4589, 102883}},
+{15990, 18, 43401, {1, 3, 7, 3, 3, 1, 43, 65, 321, 623, 1389, 57, 3461, 9965, 6743, 34843, 91673, 249573}},
+{15991, 18, 43416, {1, 3, 5, 5, 11, 29, 101, 79, 275, 685, 569, 59, 6921, 16065, 30625, 53339, 32283, 93401}},
+{15992, 18, 43443, {1, 3, 1, 11, 29, 33, 103, 145, 431, 289, 1845, 1915, 23, 699, 5475, 18413, 127185, 162637}},
+{15993, 18, 43458, {1, 3, 1, 11, 27, 23, 71, 63, 45, 579, 1187, 1189, 1781, 5595, 9043, 10155, 33321, 36487}},
+{15994, 18, 43497, {1, 3, 3, 15, 17, 19, 85, 233, 293, 833, 1711, 857, 7573, 393, 23141, 58713, 21399, 228381}},
+{15995, 18, 43506, {1, 3, 3, 15, 3, 35, 33, 35, 403, 123, 575, 3509, 6303, 13203, 17997, 15649, 64331, 124101}},
+{15996, 18, 43545, {1, 1, 3, 9, 23, 25, 39, 53, 119, 879, 573, 3225, 5069, 15489, 21887, 11773, 37783, 169523}},
+{15997, 18, 43558, {1, 3, 5, 5, 5, 25, 29, 189, 145, 863, 661, 3939, 1059, 11993, 1487, 3157, 118287, 69835}},
+{15998, 18, 43576, {1, 3, 7, 3, 15, 9, 85, 107, 17, 965, 1097, 2087, 1947, 14649, 4099, 50941, 64511, 209153}},
+{15999, 18, 43579, {1, 3, 5, 15, 19, 21, 127, 71, 429, 97, 1989, 835, 743, 11973, 14635, 45371, 114657, 208085}},
+{16000, 18, 43624, {1, 3, 5, 7, 23, 61, 99, 133, 235, 237, 435, 2681, 331, 7859, 20859, 3573, 102901, 775}},
+{16001, 18, 43630, {1, 3, 3, 9, 7, 57, 29, 15, 53, 569, 871, 1703, 2573, 10791, 719, 3487, 105709, 89573}},
+{16002, 18, 43637, {1, 1, 1, 9, 7, 21, 21, 207, 459, 621, 737, 635, 5101, 4343, 4961, 32067, 64017, 73675}},
+{16003, 18, 43654, {1, 1, 3, 9, 25, 27, 77, 69, 251, 327, 921, 3759, 1715, 14537, 21399, 10937, 9085, 241329}},
+{16004, 18, 43660, {1, 1, 5, 1, 23, 13, 63, 117, 81, 427, 1063, 1987, 2433, 14837, 13473, 28623, 44799, 202223}},
+{16005, 18, 43696, {1, 3, 1, 11, 17, 55, 89, 89, 455, 255, 1009, 1891, 2197, 9045, 23543, 48783, 22871, 58613}},
+{16006, 18, 43706, {1, 3, 7, 15, 25, 5, 11, 71, 399, 23, 239, 93, 6681, 11311, 23403, 58131, 59549, 38917}},
+{16007, 18, 43725, {1, 1, 1, 1, 19, 63, 73, 31, 69, 145, 921, 2475, 3505, 4797, 23805, 28621, 101153, 98895}},
+{16008, 18, 43733, {1, 3, 3, 3, 9, 1, 113, 111, 275, 851, 519, 1607, 635, 13287, 6191, 24545, 112039, 114383}},
+{16009, 18, 43753, {1, 3, 7, 9, 13, 13, 107, 97, 37, 133, 21, 1059, 4201, 6777, 2843, 43503, 23761, 13247}},
+{16010, 18, 43756, {1, 1, 7, 9, 25, 23, 101, 135, 471, 901, 539, 4083, 1765, 15553, 5879, 10787, 67543, 104543}},
+{16011, 18, 43761, {1, 3, 3, 13, 25, 63, 1, 49, 287, 357, 1701, 3689, 3895, 16313, 22619, 20203, 8195, 93127}},
+{16012, 18, 43768, {1, 1, 1, 11, 15, 37, 75, 43, 311, 443, 1639, 549, 4707, 3099, 677, 59115, 11709, 71013}},
+{16013, 18, 43812, {1, 1, 5, 11, 17, 43, 23, 21, 421, 613, 199, 1029, 5255, 271, 12911, 63431, 108889, 253379}},
+{16014, 18, 43822, {1, 3, 7, 11, 27, 45, 9, 89, 65, 25, 1183, 3497, 8123, 2389, 215, 16819, 63777, 163423}},
+{16015, 18, 43841, {1, 1, 5, 5, 29, 43, 65, 201, 391, 861, 1133, 3985, 983, 13039, 15545, 13695, 91467, 963}},
+{16016, 18, 43861, {1, 3, 7, 3, 9, 55, 73, 205, 287, 765, 941, 353, 7379, 2511, 555, 64399, 77605, 121959}},
+{16017, 18, 43868, {1, 3, 1, 11, 25, 15, 109, 35, 351, 675, 1219, 3791, 233, 15133, 30733, 24477, 86077, 85857}},
+{16018, 18, 43877, {1, 1, 1, 7, 13, 33, 63, 45, 503, 525, 781, 517, 2187, 1587, 17297, 26147, 35421, 61269}},
+{16019, 18, 43878, {1, 3, 1, 9, 9, 35, 69, 79, 447, 675, 803, 2793, 5793, 4433, 29227, 5437, 103347, 37713}},
+{16020, 18, 43908, {1, 3, 1, 9, 27, 31, 65, 167, 327, 231, 1959, 657, 3141, 8659, 11055, 23923, 73597, 187139}},
+{16021, 18, 43917, {1, 1, 5, 9, 29, 5, 37, 3, 281, 693, 133, 2139, 5867, 12073, 23669, 11427, 80627, 249003}},
+{16022, 18, 43936, {1, 1, 1, 13, 9, 35, 89, 203, 381, 281, 535, 1061, 7417, 13373, 12149, 37943, 113133, 110797}},
+{16023, 18, 43954, {1, 1, 7, 5, 7, 17, 71, 65, 385, 851, 1357, 3435, 4441, 6999, 27065, 32753, 129531, 52447}},
+{16024, 18, 43963, {1, 3, 7, 1, 3, 21, 25, 113, 361, 219, 1345, 2193, 5711, 3331, 14343, 23075, 39955, 71223}},
+{16025, 18, 43977, {1, 1, 7, 9, 15, 9, 101, 183, 59, 861, 931, 3385, 6517, 12067, 7753, 37997, 128361, 4591}},
+{16026, 18, 44008, {1, 3, 5, 3, 23, 5, 37, 217, 203, 749, 993, 2537, 2425, 13949, 17235, 15461, 21275, 141815}},
+{16027, 18, 44013, {1, 3, 5, 1, 19, 59, 63, 241, 211, 285, 2033, 1111, 2859, 14801, 9491, 14557, 12973, 223089}},
+{16028, 18, 44026, {1, 1, 1, 11, 15, 41, 57, 59, 233, 897, 1193, 381, 2237, 5309, 19237, 57607, 97941, 116573}},
+{16029, 18, 44028, {1, 1, 3, 9, 15, 17, 75, 15, 385, 129, 495, 887, 4933, 15113, 7449, 56213, 15841, 248029}},
+{16030, 18, 44045, {1, 3, 1, 1, 29, 37, 19, 221, 47, 185, 1105, 3297, 5235, 6917, 12041, 10815, 54747, 132329}},
+{16031, 18, 44046, {1, 3, 1, 5, 3, 17, 33, 35, 395, 491, 1157, 2563, 6257, 1025, 18295, 5293, 77851, 140157}},
+{16032, 18, 44053, {1, 3, 1, 13, 7, 31, 95, 21, 347, 409, 1485, 925, 327, 11497, 7305, 6503, 111175, 70989}},
+{16033, 18, 44091, {1, 3, 3, 1, 11, 41, 127, 93, 367, 649, 1585, 3379, 7269, 5537, 26077, 28541, 55379, 22989}},
+{16034, 18, 44101, {1, 1, 1, 5, 27, 11, 35, 49, 7, 113, 1477, 3615, 7567, 505, 13915, 51023, 50783, 45031}},
+{16035, 18, 44129, {1, 1, 7, 5, 25, 1, 35, 59, 269, 427, 791, 3179, 1423, 9801, 17717, 23631, 97947, 126861}},
+{16036, 18, 44139, {1, 3, 5, 7, 1, 51, 77, 97, 19, 287, 303, 791, 307, 4939, 13615, 61225, 98127, 114693}},
+{16037, 18, 44172, {1, 3, 3, 15, 5, 5, 93, 119, 429, 977, 1763, 3727, 1761, 3597, 16489, 71, 44103, 257929}},
+{16038, 18, 44203, {1, 1, 5, 1, 15, 29, 79, 33, 335, 381, 1233, 47, 6741, 4953, 29689, 11223, 129185, 182487}},
+{16039, 18, 44211, {1, 1, 1, 11, 29, 27, 27, 189, 507, 523, 1949, 2567, 4105, 1227, 16631, 34187, 28521, 265}},
+{16040, 18, 44240, {1, 3, 3, 7, 3, 7, 39, 155, 315, 439, 1953, 1227, 6135, 16291, 453, 50929, 67507, 166981}},
+{16041, 18, 44259, {1, 3, 1, 5, 7, 55, 121, 119, 87, 869, 1049, 575, 3675, 13505, 15661, 43899, 106877, 141691}},
+{16042, 18, 44305, {1, 3, 1, 11, 23, 9, 117, 243, 329, 767, 335, 2951, 2887, 13441, 27579, 15437, 31699, 165177}},
+{16043, 18, 44383, {1, 3, 7, 11, 5, 49, 47, 125, 431, 511, 299, 3215, 3287, 7029, 9737, 28317, 34355, 232365}},
+{16044, 18, 44384, {1, 3, 7, 3, 17, 9, 29, 255, 509, 393, 1583, 1979, 6735, 941, 4393, 35741, 82019, 109633}},
+{16045, 18, 44389, {1, 1, 5, 1, 13, 31, 95, 133, 117, 257, 993, 1513, 4669, 12239, 7841, 751, 79567, 23289}},
+{16046, 18, 44390, {1, 1, 7, 9, 25, 33, 127, 181, 61, 333, 1087, 1661, 2715, 2569, 30041, 4937, 36053, 3435}},
+{16047, 18, 44432, {1, 3, 1, 13, 15, 27, 123, 73, 377, 85, 435, 3435, 2079, 9271, 28685, 30089, 38799, 210247}},
+{16048, 18, 44435, {1, 1, 5, 3, 5, 17, 93, 181, 313, 837, 1115, 3099, 3603, 3483, 23185, 9933, 53127, 123245}},
+{16049, 18, 44468, {1, 1, 1, 13, 3, 57, 11, 67, 41, 273, 1005, 2313, 505, 6593, 27287, 47359, 104597, 45475}},
+{16050, 18, 44472, {1, 1, 1, 5, 13, 41, 97, 251, 317, 483, 163, 1493, 6629, 11995, 31293, 4715, 98569, 178419}},
+{16051, 18, 44483, {1, 3, 5, 5, 21, 7, 69, 169, 223, 953, 1573, 1137, 8075, 7733, 23031, 14589, 6453, 228883}},
+{16052, 18, 44497, {1, 1, 7, 9, 27, 37, 3, 183, 41, 99, 111, 1713, 1291, 8263, 6373, 39549, 3099, 156793}},
+{16053, 18, 44550, {1, 1, 3, 1, 23, 43, 15, 27, 223, 173, 1601, 2159, 3595, 15143, 31065, 35799, 77339, 141397}},
+{16054, 18, 44577, {1, 1, 5, 13, 9, 35, 27, 93, 23, 999, 593, 563, 5333, 8825, 27277, 46381, 3171, 6311}},
+{16055, 18, 44584, {1, 3, 7, 15, 25, 17, 7, 237, 379, 649, 1879, 2643, 5951, 4227, 4937, 24549, 43577, 116327}},
+{16056, 18, 44601, {1, 1, 3, 9, 29, 35, 101, 105, 19, 151, 1135, 897, 2427, 15779, 31851, 29183, 44471, 187817}},
+{16057, 18, 44674, {1, 3, 7, 11, 9, 55, 19, 115, 395, 559, 1883, 409, 2459, 201, 18975, 339, 108251, 19429}},
+{16058, 18, 44683, {1, 3, 1, 13, 1, 11, 67, 45, 407, 169, 1401, 381, 3913, 6491, 28133, 63857, 52095, 115749}},
+{16059, 18, 44688, {1, 1, 1, 11, 21, 45, 65, 253, 511, 51, 893, 3533, 2101, 4779, 23941, 22449, 82457, 44447}},
+{16060, 18, 44694, {1, 1, 7, 11, 19, 33, 101, 241, 493, 111, 1967, 469, 6575, 10445, 733, 56467, 27403, 25863}},
+{16061, 18, 44703, {1, 3, 1, 1, 5, 49, 21, 79, 53, 621, 43, 1183, 1385, 9129, 21727, 35559, 35269, 211383}},
+{16062, 18, 44713, {1, 1, 1, 13, 23, 43, 53, 145, 149, 611, 745, 899, 7095, 3243, 1993, 35807, 110783, 246199}},
+{16063, 18, 44721, {1, 1, 7, 9, 25, 37, 71, 233, 407, 1, 1749, 759, 7689, 15573, 7351, 33505, 22631, 49125}},
+{16064, 18, 44722, {1, 3, 1, 13, 31, 49, 105, 13, 257, 843, 1171, 2819, 621, 12567, 24339, 6689, 127413, 249671}},
+{16065, 18, 44733, {1, 1, 5, 11, 5, 1, 93, 21, 317, 789, 571, 2493, 7255, 6459, 14737, 13989, 47003, 246561}},
+{16066, 18, 44746, {1, 3, 5, 7, 9, 11, 69, 143, 175, 581, 825, 2219, 1165, 9061, 6073, 57169, 18135, 94943}},
+{16067, 18, 44748, {1, 1, 5, 7, 7, 55, 121, 107, 395, 939, 1291, 2497, 3757, 1361, 31823, 19375, 22551, 224653}},
+{16068, 18, 44760, {1, 1, 7, 15, 15, 1, 47, 225, 223, 589, 1539, 173, 6257, 5461, 11197, 9801, 80687, 84279}},
+{16069, 18, 44765, {1, 3, 7, 11, 23, 47, 83, 119, 367, 895, 431, 1949, 565, 1397, 24911, 29661, 67861, 74621}},
+{16070, 18, 44766, {1, 3, 3, 9, 17, 29, 15, 65, 157, 255, 303, 1467, 3279, 8873, 31279, 431, 8497, 7209}},
+{16071, 18, 44775, {1, 1, 5, 13, 9, 39, 85, 133, 427, 897, 1665, 2109, 2865, 15573, 27729, 59905, 2241, 83099}},
+{16072, 18, 44794, {1, 3, 1, 13, 1, 45, 65, 65, 249, 79, 1515, 503, 953, 9859, 13307, 27419, 102209, 107529}},
+{16073, 18, 44822, {1, 3, 7, 9, 17, 13, 79, 93, 231, 5, 1811, 557, 1837, 8077, 8109, 3497, 79985, 134375}},
+{16074, 18, 44841, {1, 1, 5, 9, 15, 3, 23, 27, 491, 9, 1657, 3877, 3783, 12645, 2599, 10673, 40035, 197681}},
+{16075, 18, 44859, {1, 1, 5, 3, 5, 13, 121, 145, 291, 621, 1731, 145, 2033, 341, 3667, 4139, 52035, 115865}},
+{16076, 18, 44894, {1, 3, 5, 5, 3, 29, 115, 227, 339, 23, 1659, 2367, 1079, 10757, 30709, 41473, 55847, 228761}},
+{16077, 18, 44900, {1, 3, 5, 7, 7, 61, 103, 57, 197, 31, 237, 2507, 5247, 10529, 13823, 47845, 129031, 47029}},
+{16078, 18, 44904, {1, 3, 7, 5, 3, 17, 91, 31, 277, 977, 1905, 3991, 3657, 12197, 14535, 43263, 109629, 31665}},
+{16079, 18, 44946, {1, 1, 5, 15, 29, 43, 121, 113, 159, 929, 669, 2067, 4999, 6847, 12369, 61795, 98525, 78051}},
+{16080, 18, 44967, {1, 1, 3, 7, 25, 61, 65, 79, 373, 683, 113, 1495, 5447, 15507, 16731, 53959, 62905, 252173}},
+{16081, 18, 44994, {1, 3, 1, 11, 1, 15, 101, 55, 477, 357, 333, 3243, 3325, 5885, 11385, 685, 90575, 23015}},
+{16082, 18, 44999, {1, 3, 1, 7, 15, 13, 91, 141, 209, 865, 2035, 2791, 367, 9953, 29547, 36731, 13649, 192911}},
+{16083, 18, 45013, {1, 1, 5, 15, 9, 59, 37, 131, 3, 299, 897, 119, 7515, 5271, 2207, 18187, 62613, 210345}},
+{16084, 18, 45017, {1, 3, 1, 7, 29, 53, 95, 185, 327, 473, 1525, 3751, 915, 5883, 4137, 46343, 104917, 182895}},
+{16085, 18, 45020, {1, 1, 7, 3, 31, 57, 53, 169, 215, 607, 541, 1081, 5265, 2509, 28379, 41767, 19435, 143693}},
+{16086, 18, 45027, {1, 1, 7, 7, 31, 57, 19, 203, 467, 57, 1305, 1513, 6069, 15595, 31717, 44687, 65335, 159315}},
+{16087, 18, 45029, {1, 1, 1, 1, 13, 1, 41, 39, 489, 465, 1645, 2847, 6193, 11025, 11297, 55945, 92085, 243061}},
+{16088, 18, 45066, {1, 3, 3, 13, 15, 47, 87, 77, 321, 903, 181, 2093, 1673, 5375, 17969, 48467, 83441, 120867}},
+{16089, 18, 45074, {1, 3, 3, 13, 13, 17, 65, 181, 283, 471, 745, 1091, 7255, 5987, 29423, 27579, 96201, 218157}},
+{16090, 18, 45080, {1, 1, 1, 7, 13, 5, 101, 131, 309, 401, 99, 2353, 55, 2377, 6059, 64777, 33401, 225605}},
+{16091, 18, 45090, {1, 3, 1, 15, 9, 35, 37, 197, 65, 593, 411, 2233, 1485, 9599, 9581, 31935, 115145, 76867}},
+{16092, 18, 45101, {1, 3, 7, 9, 3, 41, 103, 237, 453, 335, 1831, 3947, 7573, 3859, 12495, 60617, 20715, 163119}},
+{16093, 18, 45110, {1, 3, 5, 7, 9, 9, 25, 79, 421, 267, 585, 1093, 2237, 8881, 7311, 39417, 110901, 8969}},
+{16094, 18, 45113, {1, 3, 3, 15, 1, 29, 75, 159, 89, 965, 457, 1645, 1485, 729, 30547, 2275, 79633, 126089}},
+{16095, 18, 45134, {1, 3, 7, 7, 19, 47, 55, 115, 287, 477, 719, 3311, 2455, 12033, 13811, 34011, 45153, 126991}},
+{16096, 18, 45136, {1, 3, 7, 5, 9, 33, 27, 215, 7, 113, 1027, 415, 1057, 13011, 1547, 7955, 21347, 79427}},
+{16097, 18, 45148, {1, 3, 1, 11, 1, 41, 27, 29, 255, 763, 219, 897, 915, 453, 9417, 22845, 31655, 228869}},
+{16098, 18, 45158, {1, 1, 7, 13, 7, 49, 105, 111, 53, 219, 171, 841, 5027, 5311, 28171, 58719, 32241, 170921}},
+{16099, 18, 45176, {1, 3, 5, 7, 21, 53, 11, 169, 45, 429, 1727, 1953, 8119, 14955, 19997, 62665, 31345, 135715}},
+{16100, 18, 45181, {1, 1, 5, 13, 17, 13, 125, 247, 411, 663, 1725, 2515, 7995, 8963, 5797, 32871, 66603, 137997}},
+{16101, 18, 45185, {1, 1, 5, 5, 23, 37, 15, 63, 35, 817, 463, 1413, 1203, 8031, 4169, 45755, 93511, 134751}},
+{16102, 18, 45188, {1, 1, 1, 1, 31, 17, 15, 125, 199, 57, 1499, 1567, 6113, 6503, 515, 57841, 49885, 213881}},
+{16103, 18, 45203, {1, 1, 7, 7, 15, 1, 67, 213, 197, 471, 577, 27, 1533, 13009, 31861, 62435, 113139, 77057}},
+{16104, 18, 45209, {1, 3, 7, 1, 29, 21, 99, 173, 137, 19, 1727, 1157, 5215, 4367, 28803, 26031, 120195, 60111}},
+{16105, 18, 45231, {1, 1, 5, 9, 25, 55, 27, 45, 231, 693, 765, 429, 2897, 6045, 19705, 61903, 5385, 172967}},
+{16106, 18, 45234, {1, 3, 1, 5, 9, 17, 35, 151, 91, 41, 89, 3751, 27, 5721, 26117, 6105, 31609, 79569}},
+{16107, 18, 45239, {1, 3, 5, 11, 15, 3, 25, 73, 383, 765, 729, 51, 4245, 6215, 9435, 45223, 68071, 68453}},
+{16108, 18, 45246, {1, 1, 7, 5, 31, 61, 19, 153, 331, 233, 11, 3047, 3939, 11959, 897, 4437, 2941, 174493}},
+{16109, 18, 45260, {1, 1, 7, 11, 27, 11, 83, 33, 7, 761, 805, 2327, 2997, 12269, 18707, 10615, 114357, 54951}},
+{16110, 18, 45284, {1, 3, 5, 9, 3, 45, 65, 193, 347, 771, 663, 2901, 6467, 14109, 5169, 38021, 39605, 216877}},
+{16111, 18, 45301, {1, 1, 7, 1, 1, 13, 109, 179, 499, 325, 1763, 1923, 7429, 259, 20589, 48473, 49605, 124709}},
+{16112, 18, 45333, {1, 3, 1, 3, 5, 27, 25, 127, 313, 541, 589, 751, 5959, 5801, 32467, 40597, 75625, 24827}},
+{16113, 18, 45350, {1, 1, 1, 3, 13, 35, 71, 223, 281, 767, 447, 1253, 2227, 7305, 23125, 62847, 16783, 76145}},
+{16114, 18, 45354, {1, 1, 5, 5, 11, 1, 95, 215, 351, 915, 1471, 143, 4011, 3373, 19019, 31797, 85891, 33871}},
+{16115, 18, 45446, {1, 1, 3, 9, 15, 39, 125, 29, 85, 625, 1155, 753, 6679, 14239, 14597, 32715, 97313, 162291}},
+{16116, 18, 45458, {1, 1, 1, 7, 13, 47, 127, 69, 199, 145, 123, 3207, 7673, 9991, 27501, 29189, 93027, 136881}},
+{16117, 18, 45518, {1, 3, 1, 15, 9, 21, 121, 23, 457, 315, 437, 1919, 5531, 13817, 8883, 4421, 19487, 88591}},
+{16118, 18, 45566, {1, 3, 1, 9, 15, 49, 101, 27, 11, 283, 1277, 971, 7697, 5915, 12709, 38251, 88165, 261609}},
+{16119, 18, 45569, {1, 1, 3, 9, 17, 19, 53, 131, 327, 917, 603, 2451, 3597, 14731, 9223, 29719, 113507, 69875}},
+{16120, 18, 45575, {1, 1, 5, 7, 1, 3, 77, 71, 149, 901, 283, 1599, 1053, 16305, 9937, 20907, 4133, 29623}},
+{16121, 18, 45576, {1, 1, 3, 9, 25, 63, 101, 255, 397, 233, 1111, 1583, 3431, 5245, 30209, 33201, 63859, 16551}},
+{16122, 18, 45587, {1, 1, 7, 5, 19, 25, 9, 137, 105, 363, 867, 811, 5829, 12595, 18867, 61021, 19425, 99399}},
+{16123, 18, 45615, {1, 1, 3, 7, 11, 1, 119, 95, 367, 239, 1677, 67, 283, 5701, 3635, 26917, 112895, 224049}},
+{16124, 18, 45661, {1, 3, 5, 11, 13, 33, 11, 191, 305, 551, 159, 1953, 4231, 811, 8711, 41291, 110917, 176177}},
+{16125, 18, 45798, {1, 3, 5, 9, 15, 3, 27, 29, 77, 881, 849, 1113, 7151, 3433, 11199, 38409, 98173, 21373}},
+{16126, 18, 45829, {1, 1, 5, 13, 25, 57, 81, 169, 215, 379, 1707, 493, 1071, 4869, 19149, 24585, 61803, 149305}},
+{16127, 18, 45847, {1, 1, 5, 11, 13, 11, 9, 45, 207, 347, 1203, 185, 3919, 3119, 27879, 50793, 18499, 109239}},
+{16128, 18, 45858, {1, 1, 1, 5, 3, 23, 123, 175, 445, 439, 215, 1883, 6857, 14837, 29411, 33633, 96241, 68361}},
+{16129, 18, 45864, {1, 1, 5, 7, 31, 53, 19, 41, 477, 203, 1133, 1471, 5067, 3875, 30655, 9207, 24835, 22019}},
+{16130, 18, 45899, {1, 3, 1, 11, 19, 9, 91, 217, 135, 169, 489, 727, 5471, 2125, 20867, 19689, 78859, 222433}},
+{16131, 18, 45904, {1, 1, 1, 13, 5, 37, 37, 39, 397, 527, 789, 1447, 7123, 6099, 16849, 48895, 95543, 56135}},
+{16132, 18, 45919, {1, 3, 7, 7, 15, 31, 81, 165, 31, 867, 1879, 1161, 3651, 5167, 12855, 60195, 85611, 191791}},
+{16133, 18, 45974, {1, 1, 1, 9, 31, 35, 19, 123, 281, 445, 63, 2683, 7073, 1489, 9791, 40125, 43723, 103765}},
+{16134, 18, 45987, {1, 3, 3, 9, 23, 31, 113, 241, 149, 463, 1047, 3737, 8105, 16295, 4565, 8095, 16617, 87455}},
+{16135, 18, 45989, {1, 3, 5, 15, 1, 47, 29, 77, 27, 1013, 1091, 3657, 835, 563, 7139, 58839, 92697, 114523}},
+{16136, 18, 46008, {1, 3, 1, 1, 5, 49, 87, 251, 473, 583, 2033, 809, 5341, 15835, 691, 57133, 75751, 127717}},
+{16137, 18, 46036, {1, 3, 1, 11, 23, 51, 95, 167, 73, 739, 573, 1113, 7585, 5457, 25767, 5583, 29583, 48263}},
+{16138, 18, 46039, {1, 1, 3, 5, 9, 59, 1, 235, 17, 973, 1987, 3629, 1739, 6419, 29943, 44963, 63943, 18571}},
+{16139, 18, 46043, {1, 3, 7, 11, 9, 37, 25, 253, 307, 411, 891, 1977, 6979, 11287, 12619, 50327, 25831, 135673}},
+{16140, 18, 46045, {1, 1, 5, 15, 23, 27, 83, 157, 253, 559, 1989, 2431, 4821, 6617, 4295, 16143, 249, 109855}},
+{16141, 18, 46079, {1, 1, 3, 9, 31, 59, 117, 139, 379, 703, 49, 3013, 6383, 4019, 7289, 4567, 34931, 224967}},
+{16142, 18, 46084, {1, 1, 1, 3, 3, 33, 49, 127, 177, 417, 723, 3259, 1547, 3297, 19733, 59465, 122179, 13209}},
+{16143, 18, 46091, {1, 3, 3, 1, 3, 61, 23, 177, 77, 579, 1739, 2707, 5319, 13291, 10223, 45395, 62797, 124675}},
+{16144, 18, 46105, {1, 1, 3, 15, 25, 47, 79, 111, 245, 853, 1103, 3741, 5783, 2075, 26371, 28801, 117831, 111735}},
+{16145, 18, 46117, {1, 1, 5, 11, 3, 47, 43, 61, 75, 963, 1507, 3491, 6031, 14171, 32557, 23779, 44815, 168409}},
+{16146, 18, 46141, {1, 3, 3, 7, 21, 39, 61, 109, 13, 833, 373, 4021, 4035, 7987, 18957, 10423, 82823, 8763}},
+{16147, 18, 46147, {1, 1, 7, 3, 3, 33, 113, 77, 447, 127, 213, 1605, 3873, 12345, 7847, 63903, 80665, 6647}},
+{16148, 18, 46162, {1, 3, 1, 5, 25, 11, 49, 233, 377, 791, 43, 195, 393, 1403, 27567, 29673, 11327, 190513}},
+{16149, 18, 46184, {1, 3, 1, 15, 21, 3, 21, 169, 221, 495, 1045, 3715, 4923, 2437, 23203, 59905, 70285, 258455}},
+{16150, 18, 46197, {1, 1, 7, 13, 29, 33, 91, 153, 31, 359, 25, 3947, 1699, 4081, 20907, 24953, 64977, 88115}},
+{16151, 18, 46207, {1, 1, 5, 11, 17, 7, 17, 129, 91, 835, 139, 3823, 1827, 6787, 27367, 26801, 61513, 189677}},
+{16152, 18, 46214, {1, 3, 3, 9, 23, 21, 97, 103, 481, 859, 413, 893, 4021, 8111, 23703, 18791, 102735, 82735}},
+{16153, 18, 46218, {1, 1, 1, 7, 11, 53, 61, 3, 347, 633, 191, 3605, 41, 12605, 14381, 60403, 126223, 186157}},
+{16154, 18, 46237, {1, 3, 5, 1, 11, 33, 61, 235, 245, 623, 2019, 3289, 5761, 15557, 1685, 2173, 104825, 245139}},
+{16155, 18, 46247, {1, 1, 3, 7, 19, 55, 75, 219, 11, 75, 1765, 1833, 263, 6605, 26297, 24969, 17721, 109495}},
+{16156, 18, 46251, {1, 1, 7, 5, 7, 33, 23, 109, 207, 137, 385, 3233, 6765, 3517, 31389, 57049, 25645, 176257}},
+{16157, 18, 46327, {1, 1, 5, 5, 27, 63, 65, 23, 93, 721, 1665, 3805, 3611, 7543, 21119, 38565, 99921, 72773}},
+{16158, 18, 46333, {1, 1, 1, 13, 13, 19, 23, 5, 425, 727, 1469, 1261, 6597, 725, 27129, 36953, 25781, 191581}},
+{16159, 18, 46342, {1, 3, 3, 1, 3, 29, 25, 109, 237, 135, 409, 2239, 5033, 11007, 31861, 55171, 76313, 216271}},
+{16160, 18, 46366, {1, 3, 7, 13, 31, 33, 11, 31, 179, 67, 755, 2513, 37, 12863, 24053, 12315, 45009, 166643}},
+{16161, 18, 46376, {1, 1, 5, 13, 13, 37, 19, 223, 409, 387, 139, 3283, 243, 15573, 24173, 63271, 91561, 168665}},
+{16162, 18, 46384, {1, 3, 5, 7, 17, 25, 63, 231, 23, 965, 1873, 1021, 7927, 11127, 19553, 9883, 83009, 258991}},
+{16163, 18, 46404, {1, 3, 1, 7, 17, 21, 71, 65, 165, 845, 1739, 2395, 5959, 14803, 17333, 59003, 36477, 202511}},
+{16164, 18, 46478, {1, 3, 5, 13, 15, 57, 59, 205, 507, 41, 703, 195, 4373, 4023, 13399, 62061, 43645, 204899}},
+{16165, 18, 46511, {1, 3, 5, 11, 13, 13, 43, 19, 497, 599, 1345, 2001, 407, 2731, 16283, 55161, 130887, 189201}},
+{16166, 18, 46540, {1, 1, 7, 5, 13, 3, 105, 83, 235, 363, 869, 1715, 4031, 3419, 15149, 10627, 47787, 226107}},
+{16167, 18, 46638, {1, 3, 3, 3, 9, 49, 99, 161, 413, 739, 195, 2815, 1157, 9069, 15591, 4509, 30765, 184013}},
+{16168, 18, 46700, {1, 3, 7, 5, 25, 63, 23, 91, 507, 647, 1249, 2035, 4341, 8811, 8345, 49463, 69023, 195775}},
+{16169, 18, 46706, {1, 3, 5, 5, 5, 21, 117, 1, 321, 495, 251, 1961, 8043, 6593, 11017, 6167, 56607, 144009}},
+{16170, 18, 46745, {1, 1, 3, 3, 15, 63, 41, 177, 403, 375, 1771, 3, 7481, 4887, 799, 59283, 106319, 32155}},
+{16171, 18, 46757, {1, 1, 1, 7, 19, 57, 97, 91, 489, 561, 335, 3809, 3167, 8879, 1789, 22329, 58851, 84461}},
+{16172, 18, 46772, {1, 3, 3, 11, 3, 23, 79, 25, 187, 497, 1343, 543, 4495, 14599, 29365, 14795, 26341, 26923}},
+{16173, 18, 46776, {1, 3, 1, 13, 21, 35, 9, 227, 423, 761, 439, 3099, 5167, 12955, 12877, 5591, 123511, 74227}},
+{16174, 18, 46790, {1, 1, 3, 7, 1, 49, 115, 95, 481, 659, 183, 2337, 39, 235, 30869, 10223, 59673, 65293}},
+{16175, 18, 46794, {1, 1, 1, 13, 11, 29, 113, 37, 153, 993, 1195, 1695, 4741, 13671, 29097, 65023, 78281, 156235}},
+{16176, 18, 46804, {1, 3, 5, 11, 19, 17, 47, 243, 273, 679, 393, 4059, 705, 12473, 1867, 13783, 86821, 240545}},
+{16177, 18, 46820, {1, 3, 1, 11, 23, 35, 15, 31, 275, 261, 427, 909, 7925, 4737, 22825, 34859, 28593, 20071}},
+{16178, 18, 46849, {1, 3, 1, 1, 13, 1, 115, 115, 103, 63, 1023, 815, 7007, 6063, 13329, 28051, 29807, 109861}},
+{16179, 18, 46870, {1, 1, 1, 11, 19, 57, 49, 169, 33, 59, 579, 2409, 89, 9655, 18091, 57771, 34509, 175991}},
+{16180, 18, 46876, {1, 1, 5, 9, 27, 19, 41, 217, 313, 359, 1745, 3887, 589, 3103, 10087, 30615, 56793, 102515}},
+{16181, 18, 46903, {1, 3, 7, 11, 25, 43, 101, 245, 67, 1003, 1379, 2141, 8025, 15231, 20705, 45513, 82251, 147295}},
+{16182, 18, 46904, {1, 3, 5, 5, 5, 47, 19, 33, 107, 773, 627, 4077, 5829, 6483, 25791, 35079, 103073, 201657}},
+{16183, 18, 46907, {1, 1, 5, 15, 1, 37, 115, 15, 61, 987, 1029, 2125, 5357, 10233, 14907, 12077, 92143, 207301}},
+{16184, 18, 46932, {1, 1, 7, 7, 3, 15, 95, 3, 393, 535, 819, 743, 3613, 11459, 2269, 17083, 65547, 74813}},
+{16185, 18, 46955, {1, 1, 7, 5, 11, 27, 117, 65, 55, 87, 105, 3219, 1587, 383, 25349, 54561, 11935, 101203}},
+{16186, 18, 46963, {1, 1, 5, 15, 23, 53, 37, 149, 191, 963, 1407, 4091, 1647, 9537, 30247, 23501, 123745, 76301}},
+{16187, 18, 46991, {1, 3, 1, 1, 21, 31, 11, 107, 55, 823, 805, 141, 7177, 15883, 3307, 52245, 115171, 260589}},
+{16188, 18, 47029, {1, 3, 7, 13, 25, 15, 5, 221, 347, 83, 51, 1227, 4591, 851, 10173, 37777, 82441, 175219}},
+{16189, 18, 47036, {1, 1, 7, 15, 17, 41, 121, 215, 111, 999, 367, 1961, 3207, 10145, 10395, 24381, 95937, 12693}},
+{16190, 18, 47054, {1, 1, 1, 11, 23, 27, 117, 255, 87, 519, 599, 3471, 3983, 2797, 13477, 56479, 27321, 101585}},
+{16191, 18, 47099, {1, 1, 5, 9, 1, 3, 35, 15, 457, 209, 141, 1295, 1631, 9745, 30247, 44865, 78113, 13207}},
+{16192, 18, 47106, {1, 3, 3, 1, 27, 63, 29, 31, 277, 173, 1321, 3847, 4127, 8713, 10507, 8697, 97025, 105995}},
+{16193, 18, 47132, {1, 1, 5, 13, 13, 47, 33, 69, 113, 369, 539, 4075, 1013, 9733, 9291, 33377, 130567, 238331}},
+{16194, 18, 47145, {1, 3, 7, 13, 15, 15, 125, 219, 205, 763, 1233, 1911, 7733, 7623, 27305, 6067, 16169, 238805}},
+{16195, 18, 47151, {1, 3, 1, 9, 23, 17, 35, 175, 157, 627, 1045, 1791, 1675, 11699, 2151, 28293, 14529, 30523}},
+{16196, 18, 47156, {1, 1, 5, 9, 5, 1, 23, 151, 295, 949, 371, 3317, 2557, 5815, 9699, 48379, 104561, 103747}},
+{16197, 18, 47171, {1, 3, 5, 5, 11, 57, 125, 247, 29, 257, 979, 2437, 4391, 8229, 11231, 30145, 111165, 92347}},
+{16198, 18, 47188, {1, 1, 3, 3, 27, 17, 71, 71, 357, 367, 1213, 2549, 6049, 15299, 2891, 21839, 109889, 34643}},
+{16199, 18, 47201, {1, 1, 1, 11, 7, 21, 41, 77, 249, 567, 1947, 2989, 875, 12975, 23599, 49313, 67213, 98415}},
+{16200, 18, 47219, {1, 1, 7, 7, 27, 51, 103, 221, 295, 247, 1579, 2435, 67, 3087, 9421, 59573, 111143, 42363}},
+{16201, 18, 47226, {1, 1, 1, 13, 27, 27, 75, 33, 81, 841, 1295, 2823, 997, 16329, 6117, 43361, 63727, 113347}},
+{16202, 18, 47241, {1, 1, 1, 3, 19, 7, 43, 93, 397, 293, 803, 3021, 3915, 1417, 22255, 38529, 53737, 133705}},
+{16203, 18, 47252, {1, 3, 3, 13, 1, 33, 1, 235, 255, 345, 1621, 315, 2685, 6451, 7133, 239, 103075, 175033}},
+{16204, 18, 47261, {1, 3, 1, 11, 29, 47, 61, 115, 395, 633, 1913, 2983, 4581, 3729, 22511, 16479, 80607, 232859}},
+{16205, 18, 47295, {1, 3, 7, 7, 27, 25, 29, 121, 511, 533, 1791, 3349, 4915, 8213, 13913, 6595, 2353, 207495}},
+{16206, 18, 47297, {1, 3, 7, 5, 21, 25, 77, 189, 473, 1015, 1455, 1923, 3281, 15163, 2329, 58529, 55369, 195007}},
+{16207, 18, 47333, {1, 3, 1, 1, 25, 37, 117, 41, 207, 413, 143, 1707, 7463, 15399, 3013, 4141, 37669, 70953}},
+{16208, 18, 47337, {1, 3, 5, 3, 31, 61, 41, 157, 141, 387, 1705, 1661, 3607, 6905, 3305, 63235, 7977, 253707}},
+{16209, 18, 47360, {1, 1, 5, 11, 29, 15, 61, 127, 417, 795, 171, 415, 7935, 4553, 29979, 21153, 108811, 219959}},
+{16210, 18, 47377, {1, 1, 5, 11, 17, 61, 3, 9, 297, 53, 933, 341, 507, 2683, 15313, 24113, 78617, 191127}},
+{16211, 18, 47378, {1, 1, 7, 15, 5, 57, 65, 187, 15, 541, 1843, 731, 7331, 2479, 26259, 32685, 125259, 108693}},
+{16212, 18, 47384, {1, 1, 7, 7, 11, 15, 33, 183, 225, 609, 1755, 3531, 2767, 6267, 30823, 36797, 59699, 136769}},
+{16213, 18, 47389, {1, 3, 5, 13, 15, 19, 77, 239, 307, 691, 1165, 1327, 7901, 9299, 7777, 39151, 96261, 79791}},
+{16214, 18, 47417, {1, 1, 3, 5, 29, 31, 85, 109, 381, 243, 955, 193, 3461, 5163, 18607, 51143, 74457, 84685}},
+{16215, 18, 47420, {1, 1, 5, 9, 11, 23, 77, 247, 149, 759, 1153, 1781, 4107, 16315, 15513, 48545, 55607, 163947}},
+{16216, 18, 47426, {1, 3, 3, 5, 21, 27, 57, 61, 75, 943, 97, 1507, 4091, 671, 23023, 49095, 61649, 222401}},
+{16217, 18, 47443, {1, 1, 3, 13, 1, 3, 15, 105, 285, 255, 577, 1347, 2917, 10257, 21607, 63041, 79823, 6447}},
+{16218, 18, 47504, {1, 1, 3, 1, 17, 25, 109, 47, 445, 225, 1729, 2835, 4569, 8755, 21847, 25839, 43503, 173599}},
+{16219, 18, 47507, {1, 1, 5, 15, 19, 1, 121, 119, 33, 77, 1147, 359, 5747, 2785, 15567, 5409, 125979, 199183}},
+{16220, 18, 47510, {1, 3, 1, 9, 17, 45, 85, 83, 427, 223, 531, 1681, 2343, 14959, 27297, 54607, 70889, 45529}},
+{16221, 18, 47526, {1, 1, 5, 11, 31, 61, 109, 195, 505, 197, 159, 2799, 4517, 11549, 10297, 17415, 58277, 206577}},
+{16222, 18, 47550, {1, 1, 3, 5, 17, 43, 107, 207, 453, 161, 1775, 1287, 5775, 12417, 14201, 48187, 75073, 121099}},
+{16223, 18, 47552, {1, 1, 5, 7, 31, 27, 67, 251, 127, 443, 263, 895, 8081, 14053, 32023, 54743, 14723, 221285}},
+{16224, 18, 47557, {1, 3, 3, 13, 27, 45, 51, 47, 243, 15, 1283, 2291, 3613, 14733, 8777, 3959, 36769, 104789}},
+{16225, 18, 47564, {1, 3, 5, 1, 5, 31, 1, 139, 411, 79, 959, 1431, 2329, 3595, 19231, 55747, 18923, 223709}},
+{16226, 18, 47591, {1, 3, 1, 1, 7, 9, 69, 201, 305, 411, 459, 3201, 2525, 6977, 16249, 17777, 114321, 243831}},
+{16227, 18, 47610, {1, 3, 3, 5, 13, 7, 3, 27, 201, 279, 1253, 1725, 1481, 8885, 1233, 40699, 7267, 189095}},
+{16228, 18, 47621, {1, 3, 5, 5, 31, 61, 53, 231, 93, 597, 2027, 2179, 4517, 565, 27807, 5447, 130341, 10411}},
+{16229, 18, 47639, {1, 1, 7, 1, 9, 17, 63, 245, 405, 23, 1647, 285, 6625, 8935, 959, 29095, 657, 185511}},
+{16230, 18, 47646, {1, 1, 7, 7, 5, 15, 49, 69, 479, 585, 437, 1097, 5933, 1709, 26169, 36895, 16981, 147033}},
+{16231, 18, 47676, {1, 3, 7, 13, 29, 19, 89, 249, 195, 687, 379, 1291, 4791, 9039, 6381, 12965, 99995, 105107}},
+{16232, 18, 47682, {1, 1, 5, 7, 13, 49, 101, 217, 205, 635, 577, 3301, 911, 1793, 22285, 20163, 22593, 45701}},
+{16233, 18, 47732, {1, 3, 7, 9, 3, 21, 55, 123, 205, 309, 59, 3739, 1625, 839, 26733, 27443, 6699, 244287}},
+{16234, 18, 47741, {1, 1, 1, 11, 29, 3, 33, 57, 481, 691, 1401, 3595, 5435, 571, 6945, 10911, 94721, 89751}},
+{16235, 18, 47751, {1, 1, 3, 5, 21, 19, 23, 169, 263, 137, 771, 1995, 2211, 6287, 18691, 14219, 65647, 89885}},
+{16236, 18, 47757, {1, 1, 3, 7, 7, 53, 9, 155, 327, 325, 301, 3703, 1069, 15573, 14873, 15665, 71617, 5079}},
+{16237, 18, 47786, {1, 3, 1, 3, 27, 15, 1, 203, 465, 629, 71, 1093, 2071, 7743, 22441, 42997, 35249, 113329}},
+{16238, 18, 47803, {1, 3, 5, 3, 21, 35, 107, 73, 247, 575, 719, 3215, 3181, 5861, 25169, 6503, 12347, 196371}},
+{16239, 18, 47828, {1, 3, 1, 3, 7, 29, 117, 115, 221, 345, 165, 1367, 1491, 15791, 12647, 34679, 1043, 219311}},
+{16240, 18, 47848, {1, 3, 5, 7, 19, 47, 65, 65, 101, 323, 1209, 3185, 3803, 1077, 18933, 17081, 7475, 165133}},
+{16241, 18, 47853, {1, 1, 7, 1, 25, 9, 61, 245, 175, 201, 1837, 2119, 943, 14043, 14343, 46299, 81151, 5587}},
+{16242, 18, 47856, {1, 1, 1, 1, 31, 27, 49, 89, 387, 975, 1203, 2995, 2969, 1465, 925, 39611, 38101, 126043}},
+{16243, 18, 47862, {1, 3, 7, 13, 21, 17, 45, 139, 359, 11, 335, 79, 6629, 6137, 7879, 62735, 99493, 138943}},
+{16244, 18, 47874, {1, 3, 5, 5, 9, 23, 91, 195, 89, 195, 1931, 3855, 387, 3491, 29643, 59939, 32347, 171539}},
+{16245, 18, 47883, {1, 3, 3, 15, 21, 55, 5, 13, 139, 125, 1731, 3131, 1927, 16051, 8351, 18625, 32465, 255813}},
+{16246, 18, 47916, {1, 3, 7, 11, 21, 45, 53, 225, 33, 733, 115, 639, 4801, 5529, 11041, 3557, 83521, 37525}},
+{16247, 18, 47934, {1, 3, 7, 15, 3, 37, 111, 127, 463, 565, 543, 2593, 2203, 5719, 11667, 63735, 16481, 155613}},
+{16248, 18, 47951, {1, 1, 3, 13, 31, 1, 17, 53, 479, 629, 1517, 89, 3377, 4831, 9213, 55029, 69547, 52363}},
+{16249, 18, 47979, {1, 1, 7, 1, 5, 47, 115, 73, 59, 407, 1227, 2955, 5249, 7921, 4713, 28699, 41455, 1161}},
+{16250, 18, 48010, {1, 1, 7, 7, 5, 7, 39, 7, 97, 867, 247, 639, 3125, 14961, 19737, 52589, 59821, 96095}},
+{16251, 18, 48027, {1, 1, 7, 5, 11, 51, 63, 245, 385, 1003, 189, 4039, 6137, 3621, 13241, 55753, 14855, 50221}},
+{16252, 18, 48046, {1, 3, 5, 3, 9, 61, 83, 209, 301, 917, 259, 187, 6253, 1579, 28285, 16571, 100945, 158067}},
+{16253, 18, 48060, {1, 3, 5, 11, 5, 47, 123, 173, 253, 183, 1823, 459, 4719, 13639, 8455, 12217, 88779, 134863}},
+{16254, 18, 48065, {1, 1, 1, 5, 1, 45, 43, 163, 371, 427, 1791, 1073, 1615, 14473, 15895, 4971, 105269, 109201}},
+{16255, 18, 48075, {1, 3, 1, 15, 11, 9, 99, 99, 25, 21, 1499, 83, 6967, 12923, 13623, 27423, 4707, 477}},
+{16256, 18, 48096, {1, 1, 3, 5, 15, 49, 45, 27, 51, 391, 1849, 347, 6841, 2831, 4425, 40701, 61135, 116945}},
+{16257, 18, 48119, {1, 1, 3, 7, 21, 23, 15, 223, 403, 395, 1997, 3247, 6345, 11739, 6511, 44323, 86667, 213287}},
+{16258, 18, 48173, {1, 3, 7, 11, 31, 21, 75, 129, 427, 777, 1787, 4031, 1493, 2279, 10681, 36675, 25527, 123533}},
+{16259, 18, 48176, {1, 3, 5, 15, 9, 5, 117, 147, 259, 265, 1817, 583, 5341, 12115, 2369, 4023, 123479, 218877}},
+{16260, 18, 48186, {1, 1, 1, 15, 5, 21, 87, 57, 487, 529, 1129, 2989, 39, 5995, 28779, 35813, 97425, 5227}},
+{16261, 18, 48213, {1, 1, 7, 3, 7, 1, 41, 231, 195, 205, 1663, 3149, 4439, 8241, 3085, 43965, 58833, 216779}},
+{16262, 18, 48223, {1, 1, 3, 1, 23, 45, 65, 3, 55, 653, 131, 2425, 5653, 9105, 16921, 55221, 29241, 220927}},
+{16263, 18, 48224, {1, 3, 1, 3, 5, 47, 107, 49, 175, 957, 1287, 1299, 5215, 4141, 31697, 9371, 43339, 133933}},
+{16264, 18, 48229, {1, 3, 1, 7, 13, 55, 33, 163, 361, 793, 101, 2159, 3457, 12893, 11627, 27115, 95201, 2945}},
+{16265, 18, 48241, {1, 1, 7, 15, 11, 39, 79, 113, 385, 41, 1715, 3887, 1347, 8141, 6121, 18653, 50867, 55745}},
+{16266, 18, 48281, {1, 1, 7, 13, 3, 5, 23, 59, 223, 665, 1823, 2989, 1069, 15161, 8917, 5539, 47437, 240933}},
+{16267, 18, 48284, {1, 3, 7, 13, 13, 19, 73, 25, 413, 211, 439, 339, 1159, 16063, 9589, 33451, 28789, 118883}},
+{16268, 18, 48291, {1, 1, 5, 11, 13, 61, 81, 63, 197, 569, 961, 253, 2065, 8969, 24045, 52811, 26929, 111329}},
+{16269, 18, 48308, {1, 3, 7, 5, 19, 23, 27, 163, 37, 103, 1737, 175, 1853, 597, 14147, 46159, 26385, 69427}},
+{16270, 18, 48340, {1, 3, 7, 9, 27, 43, 45, 209, 61, 115, 645, 1149, 1473, 10557, 8541, 51703, 29207, 92059}},
+{16271, 18, 48344, {1, 1, 5, 5, 25, 53, 123, 243, 493, 403, 485, 1505, 6879, 1921, 13569, 28271, 24407, 73057}},
+{16272, 18, 48368, {1, 1, 3, 11, 15, 31, 99, 29, 503, 819, 55, 773, 2993, 15341, 7625, 12835, 28555, 200609}},
+{16273, 18, 48400, {1, 1, 7, 9, 21, 49, 47, 207, 13, 571, 57, 1727, 7441, 1703, 4253, 64851, 113, 180273}},
+{16274, 18, 48406, {1, 3, 3, 9, 23, 1, 1, 53, 195, 569, 925, 1969, 3031, 14371, 17673, 39163, 11819, 117573}},
+{16275, 18, 48409, {1, 1, 1, 11, 5, 3, 103, 133, 447, 1015, 1049, 3283, 7507, 233, 13721, 50721, 75511, 227561}},
+{16276, 18, 48421, {1, 3, 1, 1, 17, 59, 79, 105, 503, 173, 1575, 1563, 5807, 12841, 7983, 28209, 27527, 229919}},
+{16277, 18, 48448, {1, 1, 3, 9, 3, 41, 125, 213, 361, 939, 161, 2235, 2575, 13519, 7957, 21527, 40693, 51055}},
+{16278, 18, 48453, {1, 3, 7, 11, 11, 7, 117, 21, 7, 745, 1109, 3393, 953, 5163, 19909, 49121, 85061, 209555}},
+{16279, 18, 48457, {1, 1, 7, 5, 27, 59, 127, 199, 119, 461, 653, 497, 5867, 767, 16373, 21201, 87589, 171491}},
+{16280, 18, 48478, {1, 1, 7, 11, 7, 21, 121, 97, 17, 827, 1191, 113, 6527, 14977, 32567, 15191, 104541, 140359}},
+{16281, 18, 48493, {1, 1, 7, 13, 19, 29, 127, 207, 233, 511, 43, 3177, 7963, 5559, 24185, 13373, 37853, 150537}},
+{16282, 18, 48527, {1, 3, 3, 9, 15, 17, 119, 201, 443, 51, 17, 605, 4191, 5251, 28903, 4861, 92571, 143499}},
+{16283, 18, 48583, {1, 1, 5, 11, 21, 45, 111, 245, 115, 705, 1267, 3013, 7907, 14973, 30499, 44117, 118229, 136571}},
+{16284, 18, 48597, {1, 3, 7, 7, 31, 35, 69, 143, 269, 27, 1365, 775, 6067, 11477, 28475, 54573, 92827, 226459}},
+{16285, 18, 48641, {1, 1, 5, 1, 1, 29, 41, 189, 423, 245, 1031, 1667, 3465, 1491, 26787, 53851, 26189, 215443}},
+{16286, 18, 48668, {1, 3, 3, 5, 23, 29, 97, 141, 135, 249, 767, 3627, 7867, 9311, 25411, 38325, 118643, 128453}},
+{16287, 18, 48671, {1, 3, 7, 13, 3, 25, 61, 121, 285, 401, 1099, 2327, 5509, 16127, 2363, 52395, 114233, 216013}},
+{16288, 18, 48682, {1, 1, 1, 13, 7, 37, 83, 151, 447, 605, 289, 2941, 6273, 5945, 7493, 29805, 34935, 101177}},
+{16289, 18, 48709, {1, 1, 7, 13, 31, 51, 125, 9, 321, 293, 489, 4023, 2425, 7645, 2927, 20973, 111223, 71255}},
+{16290, 18, 48719, {1, 1, 7, 3, 27, 9, 59, 143, 307, 543, 1995, 111, 5807, 4641, 3581, 2421, 64213, 187567}},
+{16291, 18, 48731, {1, 3, 3, 9, 23, 33, 47, 81, 441, 995, 213, 3501, 1003, 9885, 24101, 58767, 49507, 30525}},
+{16292, 18, 48780, {1, 3, 1, 3, 19, 51, 117, 53, 49, 167, 1799, 1421, 2473, 3183, 14421, 58621, 130703, 48095}},
+{16293, 18, 48791, {1, 1, 7, 7, 5, 25, 33, 237, 447, 377, 517, 2047, 4357, 2747, 16491, 23935, 21655, 144151}},
+{16294, 18, 48797, {1, 1, 7, 7, 17, 5, 57, 67, 89, 897, 1163, 3517, 1651, 6745, 23449, 2853, 43829, 50707}},
+{16295, 18, 48807, {1, 1, 1, 13, 5, 45, 87, 139, 339, 1021, 649, 2957, 7887, 11957, 11235, 11063, 77329, 93121}},
+{16296, 18, 48811, {1, 1, 1, 7, 11, 35, 73, 241, 11, 287, 551, 207, 4701, 2031, 27191, 44337, 35577, 226387}},
+{16297, 18, 48814, {1, 3, 5, 11, 19, 3, 41, 211, 29, 913, 1455, 2525, 3935, 5581, 8043, 12033, 97479, 73521}},
+{16298, 18, 48821, {1, 3, 5, 7, 15, 49, 53, 185, 229, 161, 121, 3407, 903, 7257, 19535, 42197, 3983, 222077}},
+{16299, 18, 48836, {1, 1, 5, 7, 17, 33, 61, 121, 343, 111, 151, 1147, 3743, 2423, 24151, 42307, 50711, 140317}},
+{16300, 18, 48846, {1, 3, 3, 7, 27, 1, 119, 209, 243, 185, 1253, 2307, 7659, 7839, 9697, 16799, 5189, 130005}},
+{16301, 18, 48848, {1, 3, 3, 1, 27, 21, 115, 175, 157, 735, 1233, 1133, 1763, 1125, 4667, 42569, 125185, 218417}},
+{16302, 18, 48854, {1, 3, 5, 9, 5, 37, 97, 165, 87, 447, 1491, 3141, 597, 10651, 9727, 65163, 2469, 141859}},
+{16303, 18, 48874, {1, 1, 5, 13, 11, 53, 111, 123, 423, 413, 1519, 3715, 6623, 15415, 24085, 20925, 1529, 85183}},
+{16304, 18, 48908, {1, 3, 7, 1, 31, 45, 93, 45, 363, 779, 443, 3687, 6051, 11683, 31733, 57251, 55087, 240877}},
+{16305, 18, 48929, {1, 1, 1, 15, 1, 17, 53, 237, 131, 673, 1919, 1531, 7455, 5043, 1709, 23375, 75657, 194393}},
+{16306, 18, 48941, {1, 3, 5, 9, 21, 3, 101, 141, 387, 887, 1329, 2627, 2865, 2685, 20273, 18901, 43805, 181049}},
+{16307, 18, 48954, {1, 3, 5, 5, 7, 49, 55, 243, 311, 653, 959, 3157, 4891, 8777, 14381, 28105, 119323, 181129}},
+{16308, 18, 48961, {1, 1, 1, 9, 17, 33, 97, 123, 71, 5, 793, 2829, 4385, 8577, 9927, 26213, 53287, 203555}},
+{16309, 18, 48962, {1, 1, 1, 9, 15, 61, 51, 31, 195, 1003, 1915, 2349, 5319, 13411, 15265, 36321, 76157, 200437}},
+{16310, 18, 48985, {1, 3, 1, 13, 19, 41, 11, 227, 447, 395, 1885, 2953, 3537, 3855, 21611, 14547, 106573, 233205}},
+{16311, 18, 49001, {1, 3, 1, 11, 1, 1, 7, 61, 69, 631, 1687, 1131, 6901, 5801, 14431, 17807, 35777, 253941}},
+{16312, 18, 49007, {1, 3, 5, 9, 15, 47, 71, 145, 419, 401, 1781, 2031, 3157, 14483, 2393, 4061, 122053, 81701}},
+{16313, 18, 49015, {1, 3, 7, 13, 23, 21, 67, 147, 137, 277, 259, 3119, 4785, 5349, 3193, 21805, 108265, 231111}},
+{16314, 18, 49035, {1, 1, 3, 9, 23, 63, 77, 153, 75, 643, 1341, 3607, 6001, 3387, 17485, 17893, 124699, 99515}},
+{16315, 18, 49062, {1, 1, 7, 11, 9, 51, 79, 255, 255, 723, 1797, 2805, 2505, 3437, 4835, 30731, 73741, 8051}},
+{16316, 18, 49066, {1, 1, 5, 7, 5, 19, 73, 75, 19, 889, 1443, 2263, 5773, 9997, 329, 46679, 82313, 130897}},
+{16317, 18, 49085, {1, 3, 3, 9, 7, 53, 69, 11, 287, 861, 1367, 1433, 2693, 16255, 6785, 24705, 77463, 231247}},
+{16318, 18, 49091, {1, 1, 3, 7, 21, 15, 115, 131, 169, 447, 1731, 2873, 119, 643, 31719, 22193, 17959, 150567}},
+{16319, 18, 49094, {1, 3, 3, 9, 23, 21, 7, 39, 185, 837, 379, 3687, 3751, 14801, 15231, 7239, 77521, 80135}},
+{16320, 18, 49127, {1, 1, 1, 1, 7, 33, 93, 247, 487, 873, 1951, 3273, 551, 3735, 29477, 62387, 30361, 145613}},
+{16321, 18, 49134, {1, 1, 3, 7, 5, 47, 17, 31, 93, 517, 1175, 1033, 7421, 75, 541, 1967, 13059, 104751}},
+{16322, 18, 49183, {1, 3, 5, 3, 19, 23, 123, 115, 99, 747, 655, 2885, 2991, 7497, 5989, 33419, 54363, 224947}},
+{16323, 18, 49221, {1, 3, 3, 1, 15, 9, 51, 3, 307, 879, 1065, 1835, 2267, 11299, 21995, 2997, 102207, 39}},
+{16324, 18, 49231, {1, 3, 5, 3, 9, 19, 19, 79, 499, 121, 951, 1151, 379, 5299, 13727, 49061, 32605, 208683}},
+{16325, 18, 49250, {1, 3, 7, 7, 23, 41, 71, 23, 493, 969, 271, 3729, 6199, 14693, 17625, 52509, 121257, 151175}},
+{16326, 18, 49252, {1, 1, 7, 15, 9, 51, 61, 9, 147, 527, 803, 3255, 723, 3241, 23961, 17497, 122569, 50863}},
+{16327, 18, 49270, {1, 3, 5, 1, 19, 19, 31, 31, 95, 667, 377, 1193, 6759, 8583, 29801, 7989, 113899, 43481}},
+{16328, 18, 49297, {1, 3, 7, 5, 17, 47, 1, 7, 305, 489, 1035, 1335, 5901, 9635, 10433, 4235, 108577, 52661}},
+{16329, 18, 49313, {1, 1, 7, 3, 15, 7, 105, 189, 429, 287, 679, 111, 2087, 8479, 3053, 21763, 65655, 16207}},
+{16330, 18, 49340, {1, 3, 5, 13, 19, 41, 45, 115, 311, 653, 1301, 3797, 6183, 7203, 9829, 13263, 71649, 255611}},
+{16331, 18, 49365, {1, 3, 1, 9, 21, 33, 19, 233, 83, 423, 1701, 347, 3999, 11885, 19699, 61931, 63895, 59615}},
+{16332, 18, 49379, {1, 1, 7, 7, 15, 19, 61, 43, 183, 223, 1135, 3099, 3137, 16181, 31019, 20151, 30169, 13125}},
+{16333, 18, 49386, {1, 1, 1, 11, 9, 11, 3, 157, 495, 207, 603, 1919, 3565, 7639, 4281, 49179, 2465, 224033}},
+{16334, 18, 49391, {1, 3, 1, 13, 13, 19, 127, 81, 475, 659, 1053, 3153, 5223, 12567, 30945, 47109, 98253, 41571}},
+{16335, 18, 49417, {1, 1, 5, 11, 19, 1, 9, 67, 501, 149, 1695, 1265, 6467, 5285, 29865, 46777, 97581, 209395}},
+{16336, 18, 49438, {1, 1, 1, 11, 21, 23, 123, 103, 419, 787, 111, 3327, 673, 3425, 8097, 2411, 107353, 121379}},
+{16337, 18, 49444, {1, 1, 3, 3, 17, 7, 87, 35, 501, 973, 351, 751, 4813, 12245, 3053, 38633, 44995, 37151}},
+{16338, 18, 49453, {1, 3, 5, 15, 7, 57, 99, 53, 3, 355, 153, 3897, 6923, 2075, 10821, 41819, 75665, 21237}},
+{16339, 18, 49454, {1, 3, 5, 9, 3, 29, 85, 115, 191, 977, 1067, 1539, 5287, 3589, 18017, 35571, 41633, 148565}},
+{16340, 18, 49480, {1, 1, 3, 9, 9, 57, 1, 63, 333, 107, 1173, 3377, 3599, 277, 20643, 19295, 91169, 168891}},
+{16341, 18, 49485, {1, 1, 5, 13, 21, 7, 55, 15, 79, 995, 1553, 949, 6357, 8137, 9539, 861, 95635, 63021}},
+{16342, 18, 49498, {1, 1, 5, 13, 31, 59, 11, 55, 159, 449, 307, 2725, 2305, 8259, 13823, 51225, 44775, 54253}},
+{16343, 18, 49513, {1, 3, 3, 15, 19, 61, 105, 19, 211, 693, 835, 3607, 3703, 14007, 24597, 47109, 49855, 166115}},
+{16344, 18, 49527, {1, 3, 1, 9, 27, 33, 81, 229, 445, 171, 247, 2019, 5227, 8759, 30155, 1851, 26909, 47145}},
+{16345, 18, 49531, {1, 1, 3, 5, 23, 1, 57, 49, 177, 451, 1283, 3859, 4719, 13507, 29439, 9155, 129585, 94713}},
+{16346, 18, 49564, {1, 3, 3, 5, 1, 9, 37, 23, 423, 611, 113, 119, 4307, 11747, 93, 51213, 5479, 172061}},
+{16347, 18, 49588, {1, 3, 3, 15, 5, 35, 9, 43, 423, 877, 1563, 3411, 4233, 6961, 22421, 7347, 39553, 199745}},
+{16348, 18, 49609, {1, 3, 1, 9, 15, 35, 85, 57, 151, 323, 1627, 27, 3603, 11475, 6561, 6091, 72099, 185321}},
+{16349, 18, 49617, {1, 1, 3, 15, 17, 21, 3, 119, 455, 147, 1077, 3955, 1355, 3083, 28217, 50745, 114445, 46563}},
+{16350, 18, 49645, {1, 1, 5, 3, 13, 11, 35, 185, 357, 447, 649, 139, 2847, 12011, 7753, 671, 113693, 236281}},
+{16351, 18, 49646, {1, 3, 5, 1, 19, 27, 117, 195, 67, 259, 1073, 81, 5527, 6829, 26675, 60029, 8159, 13553}},
+{16352, 18, 49654, {1, 3, 3, 7, 27, 63, 115, 191, 431, 191, 1547, 2261, 6527, 13459, 12773, 37485, 114847, 61709}},
+{16353, 18, 49697, {1, 1, 3, 1, 29, 63, 47, 77, 415, 191, 325, 2487, 7457, 13721, 1573, 15037, 31941, 226651}},
+{16354, 18, 49718, {1, 1, 5, 11, 29, 59, 49, 209, 195, 901, 691, 3167, 7471, 11609, 30135, 22067, 71395, 248151}},
+{16355, 18, 49741, {1, 3, 7, 11, 7, 43, 55, 69, 289, 735, 1479, 139, 1395, 6463, 19827, 52151, 18963, 103367}},
+{16356, 18, 49754, {1, 3, 5, 5, 27, 45, 77, 79, 89, 79, 913, 1437, 3337, 8861, 5477, 46195, 105869, 242599}},
+{16357, 18, 49756, {1, 3, 5, 3, 3, 27, 103, 207, 233, 995, 1173, 1143, 3517, 3207, 8373, 45145, 79687, 150107}},
+{16358, 18, 49833, {1, 3, 7, 3, 7, 37, 1, 137, 45, 479, 861, 3863, 4249, 3075, 23639, 12531, 118473, 255805}},
+{16359, 18, 49834, {1, 1, 1, 9, 7, 23, 125, 57, 347, 215, 1749, 3029, 97, 14715, 16213, 29291, 104725, 92043}},
+{16360, 18, 49879, {1, 3, 3, 15, 31, 39, 111, 97, 369, 675, 1471, 3889, 6437, 1499, 13325, 46141, 121087, 202493}},
+{16361, 18, 49942, {1, 1, 1, 15, 15, 21, 3, 167, 251, 793, 1291, 427, 6407, 15521, 15441, 20071, 54513, 200485}},
+{16362, 18, 49946, {1, 1, 7, 11, 27, 47, 123, 195, 241, 385, 609, 2323, 1221, 815, 279, 28553, 17663, 180977}},
+{16363, 18, 49982, {1, 1, 3, 15, 23, 53, 21, 19, 329, 903, 561, 1539, 2829, 13037, 29867, 27825, 84005, 14853}},
+{16364, 18, 49994, {1, 1, 5, 1, 21, 27, 103, 99, 31, 829, 515, 3949, 3635, 935, 2127, 56659, 123477, 47003}},
+{16365, 18, 50001, {1, 3, 1, 11, 17, 63, 51, 15, 319, 539, 55, 2561, 1109, 16115, 23387, 20051, 120867, 4019}},
+{16366, 18, 50023, {1, 3, 3, 7, 31, 11, 45, 251, 209, 21, 553, 887, 393, 15183, 14735, 13163, 123681, 15013}},
+{16367, 18, 50047, {1, 3, 1, 7, 21, 41, 105, 39, 213, 477, 985, 2375, 937, 7099, 8867, 36519, 60503, 143225}},
+{16368, 18, 50120, {1, 3, 1, 1, 19, 55, 73, 171, 379, 271, 791, 2477, 5381, 1703, 3805, 37227, 55553, 34549}},
+{16369, 18, 50133, {1, 1, 5, 5, 29, 51, 127, 111, 209, 663, 975, 2293, 8155, 11263, 7891, 15463, 74889, 227403}},
+{16370, 18, 50137, {1, 3, 5, 1, 15, 1, 115, 221, 23, 247, 1597, 87, 7513, 3329, 14491, 8961, 78147, 89499}},
+{16371, 18, 50140, {1, 3, 5, 15, 25, 23, 99, 85, 189, 487, 1559, 427, 6179, 5291, 27279, 65507, 77347, 177073}},
+{16372, 18, 50156, {1, 3, 7, 1, 23, 35, 7, 89, 455, 659, 2039, 3115, 4057, 139, 1269, 62319, 13629, 201571}},
+{16373, 18, 50199, {1, 1, 1, 5, 9, 47, 55, 171, 213, 813, 135, 1545, 1421, 4055, 26697, 18889, 57653, 201369}},
+{16374, 18, 50205, {1, 3, 1, 11, 9, 45, 5, 69, 261, 907, 1229, 1371, 1867, 1771, 17309, 41759, 119129, 43521}},
+{16375, 18, 50215, {1, 1, 7, 5, 11, 27, 9, 237, 405, 53, 1359, 3665, 169, 3547, 23331, 14353, 106627, 219711}},
+{16376, 18, 50216, {1, 3, 3, 5, 17, 23, 9, 41, 81, 601, 1447, 3225, 6721, 161, 16109, 54331, 111273, 81061}},
+{16377, 18, 50224, {1, 1, 5, 7, 7, 37, 71, 13, 505, 671, 425, 2771, 1131, 1259, 13715, 45779, 114839, 217499}},
+{16378, 18, 50229, {1, 1, 1, 5, 9, 51, 85, 223, 117, 403, 1117, 723, 2465, 11947, 7495, 62991, 17825, 169147}},
+{16379, 18, 50233, {1, 1, 3, 13, 5, 57, 47, 35, 313, 901, 365, 1265, 137, 6335, 31419, 38497, 93285, 177187}},
+{16380, 18, 50251, {1, 3, 5, 5, 7, 9, 21, 109, 47, 557, 1449, 3459, 5175, 5135, 727, 55425, 60593, 86571}},
+{16381, 18, 50281, {1, 3, 7, 5, 1, 17, 119, 239, 347, 75, 1345, 2765, 1491, 16297, 25233, 60401, 85433, 59287}},
+{16382, 18, 50326, {1, 1, 5, 5, 19, 57, 41, 53, 161, 475, 1791, 3617, 1651, 15227, 30357, 63547, 69937, 246473}},
+{16383, 18, 50332, {1, 3, 7, 11, 11, 43, 79, 79, 195, 437, 39, 1259, 6041, 14989, 6615, 58747, 43583, 246979}},
+{16384, 18, 50348, {1, 1, 7, 9, 11, 13, 49, 133, 365, 931, 1089, 713, 5997, 8759, 5789, 61329, 22639, 149845}},
+{16385, 18, 50359, {1, 3, 7, 13, 9, 3, 11, 253, 339, 883, 1933, 443, 4265, 14165, 15845, 12625, 1453, 70961}},
+{16386, 18, 50374, {1, 1, 7, 13, 21, 35, 113, 83, 473, 719, 1601, 1727, 3715, 631, 28075, 17725, 11393, 116883}},
+{16387, 18, 50404, {1, 3, 7, 7, 7, 13, 117, 83, 365, 529, 1297, 3903, 2633, 9617, 15819, 38137, 49065, 189445}},
+{16388, 18, 50443, {1, 1, 1, 7, 11, 41, 107, 33, 381, 395, 1993, 2819, 3301, 7543, 6787, 27437, 113681, 132403}},
+{16389, 18, 50488, {1, 1, 1, 1, 3, 59, 91, 235, 67, 987, 1587, 1119, 5851, 13201, 1125, 49709, 381, 183295}},
+{16390, 18, 50493, {1, 3, 5, 9, 3, 33, 45, 187, 455, 151, 823, 565, 5725, 1927, 25387, 61785, 130271, 134083}},
+{16391, 18, 50505, {1, 1, 7, 5, 15, 25, 63, 231, 133, 401, 307, 2961, 4249, 2639, 10207, 8349, 8203, 72783}},
+{16392, 18, 50511, {1, 1, 5, 13, 19, 27, 43, 153, 165, 815, 1385, 3041, 853, 7683, 1035, 13255, 69779, 128765}},
+{16393, 18, 50525, {1, 1, 1, 3, 31, 61, 97, 15, 327, 717, 841, 643, 4781, 11609, 14181, 14625, 75369, 251015}},
+{16394, 18, 50542, {1, 1, 5, 11, 17, 33, 9, 45, 111, 91, 1923, 967, 5649, 13647, 30497, 2925, 18395, 255089}},
+{16395, 18, 50550, {1, 3, 3, 1, 3, 55, 33, 29, 101, 211, 1731, 2351, 7389, 14935, 29703, 60031, 122305, 174323}},
+{16396, 18, 50560, {1, 1, 1, 3, 13, 23, 79, 117, 367, 267, 143, 1537, 3159, 2303, 9653, 12029, 2841, 226971}},
+{16397, 18, 50570, {1, 1, 1, 13, 19, 57, 103, 159, 315, 895, 1879, 2153, 1901, 7635, 14145, 56495, 6203, 151203}},
+{16398, 18, 50587, {1, 3, 3, 11, 31, 11, 75, 5, 419, 963, 1809, 3751, 7291, 12697, 2841, 17965, 91707, 80361}},
+{16399, 18, 50593, {1, 1, 7, 7, 5, 23, 29, 199, 413, 501, 19, 697, 6523, 3997, 4945, 59817, 127613, 220399}},
+{16400, 18, 50611, {1, 1, 7, 5, 1, 17, 51, 9, 183, 689, 325, 2391, 2095, 1907, 10325, 51045, 20097, 33719}},
+{16401, 18, 50649, {1, 3, 5, 11, 3, 33, 45, 221, 325, 7, 253, 1323, 4959, 14067, 10035, 39463, 123171, 194581}},
+{16402, 18, 50656, {1, 1, 3, 3, 15, 45, 25, 57, 357, 907, 1249, 3279, 2631, 9209, 7857, 58233, 29049, 173859}},
+{16403, 18, 50685, {1, 3, 3, 9, 29, 39, 105, 55, 295, 583, 825, 1777, 2403, 9489, 9079, 24855, 18155, 252733}},
+{16404, 18, 50686, {1, 1, 5, 15, 5, 63, 77, 215, 287, 743, 1937, 2103, 2673, 15487, 27855, 46683, 120215, 89721}},
+{16405, 18, 50692, {1, 3, 3, 5, 27, 1, 45, 19, 309, 679, 1405, 415, 6107, 13567, 5803, 61941, 130285, 51847}},
+{16406, 18, 50702, {1, 3, 1, 15, 23, 49, 47, 113, 401, 825, 1299, 2711, 6509, 12225, 16147, 20615, 121305, 121937}},
+{16407, 18, 50704, {1, 3, 5, 5, 31, 41, 31, 57, 385, 919, 593, 1371, 6773, 12099, 23767, 17663, 128321, 188921}},
+{16408, 18, 50709, {1, 1, 3, 15, 5, 41, 17, 7, 479, 143, 549, 1827, 8107, 14775, 28817, 12297, 119893, 191297}},
+{16409, 18, 50720, {1, 3, 7, 5, 29, 61, 27, 123, 269, 223, 121, 1745, 3513, 1989, 9759, 8129, 78933, 40085}},
+{16410, 18, 50726, {1, 1, 5, 13, 23, 49, 125, 225, 479, 123, 41, 2359, 4443, 4729, 31717, 3139, 3869, 118803}},
+{16411, 18, 50729, {1, 3, 3, 3, 15, 7, 7, 87, 415, 95, 1799, 2009, 4711, 15635, 21997, 47201, 16815, 99815}},
+{16412, 18, 50737, {1, 3, 3, 1, 31, 57, 73, 31, 423, 363, 1469, 2411, 6449, 15275, 14189, 51079, 130201, 130181}},
+{16413, 18, 50758, {1, 1, 5, 3, 3, 31, 107, 11, 355, 647, 1463, 3019, 3263, 13727, 10461, 26577, 4439, 132737}},
+{16414, 18, 50772, {1, 1, 1, 7, 13, 55, 31, 227, 71, 563, 1467, 3733, 725, 3443, 19279, 4111, 35749, 62275}},
+{16415, 18, 50849, {1, 3, 3, 15, 9, 17, 61, 95, 43, 583, 1381, 1285, 2655, 9213, 27551, 16237, 29569, 216879}},
+{16416, 18, 50850, {1, 1, 1, 3, 29, 3, 87, 193, 53, 599, 1581, 907, 4381, 8697, 27299, 40259, 122653, 43559}},
+{16417, 18, 50881, {1, 3, 5, 3, 15, 49, 21, 27, 35, 353, 1281, 3253, 7339, 9333, 25253, 35035, 30379, 87387}},
+{16418, 18, 50901, {1, 1, 1, 15, 7, 27, 69, 41, 45, 729, 1005, 3495, 1445, 7421, 27443, 29609, 70105, 93883}},
+{16419, 18, 50906, {1, 1, 7, 7, 1, 41, 15, 149, 107, 121, 639, 3703, 3397, 1727, 14165, 2845, 78531, 175767}},
+{16420, 18, 50915, {1, 3, 7, 15, 27, 17, 121, 175, 399, 551, 1889, 2283, 4343, 3633, 653, 3267, 101901, 162157}},
+{16421, 18, 50961, {1, 3, 3, 15, 23, 41, 97, 251, 435, 955, 69, 509, 8001, 11783, 7397, 7587, 127089, 15391}},
+{16422, 18, 50992, {1, 3, 5, 5, 25, 25, 63, 25, 203, 655, 2039, 2545, 5405, 1377, 30543, 65531, 122825, 6853}},
+{16423, 18, 50997, {1, 1, 7, 9, 9, 43, 73, 195, 465, 497, 1085, 3821, 7115, 7513, 21913, 32499, 96467, 181905}},
+{16424, 18, 51001, {1, 1, 3, 7, 29, 29, 63, 131, 409, 423, 687, 2549, 7367, 6867, 2685, 29137, 61845, 194409}},
+{16425, 18, 51004, {1, 3, 7, 7, 3, 23, 47, 31, 121, 629, 1771, 2387, 861, 2269, 29565, 19599, 18051, 121531}},
+{16426, 18, 51033, {1, 1, 1, 3, 21, 13, 109, 105, 163, 433, 521, 3467, 6225, 3705, 30605, 3265, 119313, 2535}},
+{16427, 18, 51045, {1, 3, 5, 3, 25, 25, 89, 177, 415, 67, 361, 3317, 6411, 4857, 23249, 41959, 59931, 35797}},
+{16428, 18, 51052, {1, 3, 7, 15, 5, 37, 37, 65, 71, 13, 1621, 2217, 3723, 2113, 23755, 46521, 48091, 44307}},
+{16429, 18, 51064, {1, 1, 5, 13, 5, 5, 63, 75, 61, 443, 1663, 3239, 7717, 2623, 5723, 42673, 8519, 58773}},
+{16430, 18, 51085, {1, 1, 3, 1, 29, 13, 35, 61, 391, 517, 1007, 17, 2519, 7121, 20095, 33449, 21397, 103787}},
+{16431, 18, 51127, {1, 1, 5, 1, 9, 45, 49, 151, 39, 347, 1821, 2687, 1551, 12117, 29429, 40963, 77795, 20941}},
+{16432, 18, 51139, {1, 1, 5, 3, 13, 49, 107, 105, 201, 601, 1335, 2389, 6837, 11123, 22985, 62705, 59057, 128333}},
+{16433, 18, 51153, {1, 3, 3, 13, 5, 3, 21, 103, 481, 621, 2037, 2963, 425, 4685, 27475, 24363, 116419, 171743}},
+{16434, 18, 51181, {1, 3, 3, 5, 27, 27, 5, 91, 245, 421, 795, 1869, 6455, 4463, 23467, 24039, 69681, 262127}},
+{16435, 18, 51182, {1, 3, 1, 11, 11, 5, 31, 253, 469, 593, 877, 2041, 4615, 1541, 11823, 58525, 128689, 95985}},
+{16436, 18, 51194, {1, 3, 5, 13, 31, 35, 115, 73, 97, 213, 1499, 1371, 4239, 7897, 3987, 4833, 115043, 222743}},
+{16437, 18, 51196, {1, 3, 3, 5, 31, 15, 17, 233, 137, 521, 1721, 1913, 1881, 13457, 10733, 61527, 19825, 192601}},
+{16438, 18, 51200, {1, 3, 1, 3, 11, 21, 81, 77, 377, 915, 321, 3925, 867, 5491, 4707, 37307, 52141, 29155}},
+{16439, 18, 51239, {1, 1, 5, 1, 13, 51, 97, 161, 295, 159, 1717, 3817, 4687, 1907, 2655, 60577, 73867, 161851}},
+{16440, 18, 51240, {1, 1, 3, 13, 21, 31, 33, 145, 375, 377, 1429, 1981, 4851, 9047, 2685, 49037, 67399, 124243}},
+{16441, 18, 51254, {1, 1, 7, 13, 1, 55, 65, 147, 471, 277, 1585, 3949, 1885, 1635, 15687, 46367, 120931, 192097}},
+{16442, 18, 51260, {1, 1, 7, 9, 13, 27, 33, 41, 377, 863, 1297, 181, 2685, 11285, 3961, 63201, 59757, 70231}},
+{16443, 18, 51342, {1, 1, 3, 15, 29, 3, 79, 25, 147, 683, 1563, 805, 5891, 3355, 20113, 48261, 38195, 14589}},
+{16444, 18, 51370, {1, 1, 7, 11, 9, 15, 21, 33, 47, 923, 1291, 4001, 203, 305, 21575, 41915, 74769, 114921}},
+{16445, 18, 51372, {1, 3, 7, 11, 15, 1, 75, 173, 473, 493, 291, 811, 931, 10731, 9855, 57891, 81575, 250565}},
+{16446, 18, 51377, {1, 3, 3, 3, 31, 31, 71, 141, 389, 661, 71, 3245, 6827, 9219, 26607, 50511, 94783, 130785}},
+{16447, 18, 51398, {1, 1, 7, 3, 9, 15, 67, 141, 293, 779, 3, 3311, 7063, 13709, 29715, 55227, 11043, 150343}},
+{16448, 18, 51402, {1, 3, 3, 3, 21, 9, 45, 111, 207, 715, 345, 1345, 3079, 3851, 23709, 33919, 108213, 25353}},
+{16449, 18, 51407, {1, 3, 5, 13, 7, 3, 35, 95, 397, 397, 1159, 2759, 5233, 16237, 12469, 29543, 39133, 64429}},
+{16450, 18, 51410, {1, 1, 5, 13, 19, 35, 9, 7, 153, 843, 2025, 1379, 3361, 15889, 7411, 26399, 106295, 19851}},
+{16451, 18, 51412, {1, 3, 1, 1, 21, 15, 71, 143, 279, 431, 487, 967, 4445, 11969, 16671, 48891, 59605, 230607}},
+{16452, 18, 51419, {1, 3, 5, 1, 25, 63, 23, 143, 221, 805, 377, 1441, 1971, 1985, 10055, 35991, 115873, 223455}},
+{16453, 18, 51428, {1, 3, 1, 7, 21, 57, 1, 185, 117, 75, 1623, 3805, 2385, 10245, 29009, 59149, 130219, 114763}},
+{16454, 18, 51431, {1, 3, 1, 13, 19, 13, 105, 241, 47, 597, 1725, 2579, 3785, 1667, 12427, 62623, 60883, 189977}},
+{16455, 18, 51460, {1, 3, 5, 13, 1, 55, 59, 133, 263, 415, 1013, 139, 3037, 13661, 15303, 27279, 84095, 184807}},
+{16456, 18, 51475, {1, 3, 1, 11, 7, 45, 3, 179, 315, 639, 875, 3299, 5221, 8463, 17507, 59673, 73865, 98867}},
+{16457, 18, 51477, {1, 3, 7, 7, 3, 3, 53, 233, 219, 519, 585, 3029, 3623, 9559, 2251, 43735, 121513, 208007}},
+{16458, 18, 51478, {1, 3, 1, 3, 17, 47, 47, 145, 445, 541, 163, 2653, 165, 7213, 3311, 57335, 43967, 191841}},
+{16459, 18, 51482, {1, 3, 5, 5, 7, 47, 39, 119, 13, 727, 887, 3743, 3807, 15267, 3977, 52833, 14851, 61851}},
+{16460, 18, 51511, {1, 1, 3, 5, 9, 9, 107, 119, 501, 723, 1965, 3093, 6947, 1783, 11287, 24243, 14005, 106677}},
+{16461, 18, 51518, {1, 3, 3, 11, 11, 29, 85, 243, 359, 195, 221, 1767, 6969, 15275, 20853, 26921, 40903, 29849}},
+{16462, 18, 51568, {1, 3, 1, 5, 31, 3, 11, 247, 371, 339, 1263, 119, 791, 7425, 18879, 11333, 34359, 178929}},
+{16463, 18, 51607, {1, 1, 3, 7, 23, 15, 121, 203, 441, 499, 779, 1971, 339, 8737, 6859, 32417, 97073, 256143}},
+{16464, 18, 51618, {1, 1, 5, 11, 3, 23, 25, 51, 407, 677, 97, 281, 427, 3671, 7939, 54485, 3967, 210199}},
+{16465, 18, 51630, {1, 1, 5, 9, 5, 45, 23, 171, 255, 967, 313, 3881, 6039, 10545, 3591, 51985, 37145, 99291}},
+{16466, 18, 51655, {1, 1, 5, 7, 3, 13, 55, 147, 83, 369, 1707, 1919, 491, 11507, 29559, 29169, 65897, 80587}},
+{16467, 18, 51673, {1, 1, 3, 13, 31, 41, 41, 237, 245, 109, 969, 1797, 8169, 6351, 3657, 9655, 109201, 245117}},
+{16468, 18, 51683, {1, 3, 7, 5, 17, 23, 17, 219, 473, 1, 865, 1949, 7589, 10107, 3035, 19903, 79579, 138695}},
+{16469, 18, 51709, {1, 3, 1, 15, 13, 57, 109, 117, 277, 773, 31, 3807, 7615, 2453, 22655, 51513, 108367, 248473}},
+{16470, 18, 51716, {1, 1, 7, 11, 17, 59, 27, 167, 63, 931, 13, 3721, 1789, 7621, 31093, 27541, 37283, 35193}},
+{16471, 18, 51774, {1, 3, 3, 11, 13, 9, 7, 85, 45, 151, 1865, 4049, 4433, 9517, 231, 30733, 93701, 126585}},
+{16472, 18, 51829, {1, 3, 1, 13, 21, 33, 19, 87, 77, 425, 351, 1163, 7453, 12567, 24615, 35563, 127643, 28625}},
+{16473, 18, 51830, {1, 1, 3, 11, 7, 35, 27, 47, 465, 595, 985, 573, 2541, 7841, 14749, 43761, 26699, 135895}},
+{16474, 18, 51839, {1, 1, 1, 7, 25, 51, 93, 237, 355, 575, 1, 443, 5697, 1997, 28801, 11621, 62531, 88449}},
+{16475, 18, 51849, {1, 1, 1, 9, 23, 35, 23, 91, 161, 601, 1401, 2187, 6283, 10711, 21277, 47771, 12589, 176625}},
+{16476, 18, 51869, {1, 3, 3, 5, 13, 23, 33, 65, 213, 835, 539, 2487, 273, 6113, 18327, 52493, 17571, 160909}},
+{16477, 18, 51886, {1, 3, 1, 5, 25, 9, 117, 201, 457, 331, 1455, 439, 4891, 5515, 21701, 9343, 29085, 120299}},
+{16478, 18, 51905, {1, 1, 1, 5, 29, 7, 43, 125, 155, 43, 1949, 2901, 7293, 13683, 18289, 16873, 27899, 168631}},
+{16479, 18, 51906, {1, 1, 7, 3, 29, 33, 53, 137, 301, 27, 1101, 837, 5843, 13167, 6073, 49083, 120031, 45065}},
+{16480, 18, 51915, {1, 3, 5, 1, 31, 47, 127, 185, 279, 603, 1699, 1693, 3263, 9055, 3525, 46065, 79305, 19949}},
+{16481, 18, 51948, {1, 3, 7, 9, 17, 47, 25, 191, 369, 877, 1477, 3041, 5123, 1393, 5061, 1755, 61051, 55299}},
+{16482, 18, 51988, {1, 1, 5, 13, 13, 7, 89, 141, 251, 321, 1515, 2677, 5103, 12901, 29875, 165, 15073, 47795}},
+{16483, 18, 51998, {1, 3, 1, 7, 1, 37, 55, 173, 191, 981, 685, 4003, 6319, 3037, 30637, 11955, 81015, 89239}},
+{16484, 18, 52004, {1, 3, 5, 5, 1, 5, 55, 251, 229, 153, 425, 2793, 6779, 15797, 10087, 7573, 121789, 115479}},
+{16485, 18, 52026, {1, 3, 7, 13, 23, 39, 23, 21, 55, 543, 1539, 3055, 7825, 2865, 8967, 56719, 117219, 142137}},
+{16486, 18, 52036, {1, 1, 5, 13, 1, 29, 81, 11, 509, 61, 1681, 1911, 829, 10583, 7105, 42047, 128579, 48891}},
+{16487, 18, 52082, {1, 1, 3, 13, 7, 27, 81, 89, 129, 239, 309, 1353, 5265, 12255, 29391, 1659, 114857, 43551}},
+{16488, 18, 52127, {1, 1, 7, 13, 23, 15, 9, 93, 35, 839, 549, 1793, 4693, 13295, 10603, 18179, 33141, 239555}},
+{16489, 18, 52145, {1, 3, 1, 7, 17, 5, 11, 193, 143, 579, 1199, 1239, 4503, 15855, 23345, 34789, 59427, 235319}},
+{16490, 18, 52157, {1, 3, 5, 3, 25, 63, 11, 203, 415, 135, 261, 1843, 3409, 4605, 15213, 28537, 75787, 100007}},
+{16491, 18, 52165, {1, 1, 1, 5, 3, 37, 29, 157, 213, 235, 959, 1087, 2843, 10265, 28233, 14281, 25867, 204031}},
+{16492, 18, 52193, {1, 3, 3, 7, 19, 49, 55, 111, 253, 823, 533, 941, 2509, 5595, 9267, 28457, 84301, 165385}},
+{16493, 18, 52211, {1, 3, 5, 9, 5, 59, 13, 85, 339, 889, 597, 3517, 7001, 5525, 25451, 13855, 19033, 182677}},
+{16494, 18, 52213, {1, 3, 1, 15, 23, 29, 31, 105, 353, 825, 1977, 2013, 131, 1969, 427, 16465, 90817, 257931}},
+{16495, 18, 52218, {1, 3, 1, 3, 29, 9, 109, 243, 321, 15, 1479, 787, 4667, 13925, 7347, 7977, 105585, 143959}},
+{16496, 18, 52220, {1, 1, 7, 15, 5, 45, 11, 95, 215, 719, 827, 77, 7263, 5705, 26971, 26845, 82127, 2849}},
+{16497, 18, 52238, {1, 1, 7, 9, 5, 43, 103, 133, 203, 127, 2021, 3609, 6971, 13447, 27089, 62287, 104391, 147901}},
+{16498, 18, 52240, {1, 3, 1, 3, 3, 41, 61, 101, 381, 985, 1795, 2465, 2899, 13517, 23953, 38831, 43569, 128643}},
+{16499, 18, 52243, {1, 3, 5, 5, 9, 49, 13, 7, 215, 85, 1203, 647, 6627, 1861, 17901, 40203, 13007, 84975}},
+{16500, 18, 52250, {1, 3, 5, 15, 31, 13, 55, 89, 397, 641, 1599, 3379, 3401, 4173, 5757, 42945, 59269, 106891}},
+{16501, 18, 52279, {1, 1, 5, 13, 25, 17, 45, 27, 151, 725, 819, 581, 3675, 3983, 9499, 47511, 128039, 56825}},
+{16502, 18, 52285, {1, 1, 5, 1, 7, 11, 65, 63, 301, 927, 409, 3729, 7227, 12849, 17855, 36527, 2907, 66819}},
+{16503, 18, 52306, {1, 3, 3, 3, 29, 35, 39, 1, 349, 429, 805, 3639, 3909, 4211, 10393, 36223, 72543, 136375}},
+{16504, 18, 52370, {1, 1, 1, 9, 23, 27, 25, 213, 195, 455, 883, 3357, 7277, 9061, 14103, 6005, 35031, 72703}},
+{16505, 18, 52432, {1, 1, 3, 3, 11, 17, 19, 181, 25, 775, 897, 3809, 2031, 13017, 7505, 37469, 107335, 174309}},
+{16506, 18, 52457, {1, 1, 7, 13, 7, 1, 57, 27, 159, 465, 533, 3409, 3863, 14001, 8011, 25873, 14971, 67243}},
+{16507, 18, 52466, {1, 1, 3, 11, 19, 5, 11, 19, 75, 489, 1879, 1539, 6563, 4729, 15605, 35203, 47993, 110139}},
+{16508, 18, 52514, {1, 3, 5, 9, 23, 17, 67, 89, 379, 849, 1667, 955, 1537, 11781, 9791, 46959, 79481, 237335}},
+{16509, 18, 52557, {1, 1, 7, 9, 3, 31, 127, 145, 29, 35, 463, 4009, 4427, 16215, 12093, 50085, 51259, 45091}},
+{16510, 18, 52560, {1, 1, 5, 9, 25, 3, 1, 131, 221, 951, 117, 3227, 797, 7617, 13243, 50139, 26737, 105875}},
+{16511, 18, 52585, {1, 1, 5, 3, 11, 5, 7, 155, 211, 865, 27, 3943, 7923, 9973, 23233, 37399, 89951, 106555}},
+{16512, 18, 52586, {1, 1, 3, 13, 21, 61, 77, 121, 227, 527, 1641, 3535, 3801, 7221, 6423, 9179, 114935, 33373}},
+{16513, 18, 52603, {1, 3, 7, 5, 31, 7, 123, 159, 367, 369, 1905, 1689, 6773, 675, 30289, 54149, 71469, 232835}},
+{16514, 18, 52650, {1, 1, 1, 13, 9, 23, 83, 237, 251, 941, 781, 1489, 6037, 6001, 15909, 50527, 60143, 238499}},
+{16515, 18, 52672, {1, 3, 1, 11, 5, 7, 103, 43, 413, 247, 535, 2107, 1801, 16381, 32529, 2355, 39143, 71281}},
+{16516, 18, 52681, {1, 1, 7, 5, 5, 31, 19, 11, 191, 643, 923, 1661, 2215, 11817, 23937, 62907, 128301, 21459}},
+{16517, 18, 52692, {1, 3, 7, 15, 1, 51, 123, 61, 99, 751, 1819, 1191, 3865, 8765, 7131, 33965, 55697, 87059}},
+{16518, 18, 52735, {1, 1, 5, 13, 5, 57, 41, 103, 135, 207, 517, 3995, 2537, 15705, 9123, 26193, 30653, 190549}},
+{16519, 18, 52760, {1, 1, 3, 1, 23, 5, 109, 209, 407, 143, 943, 2325, 8087, 559, 23675, 31815, 43805, 67497}},
+{16520, 18, 52772, {1, 1, 5, 9, 25, 33, 13, 21, 93, 357, 1551, 739, 5595, 16285, 30761, 54075, 75505, 177333}},
+{16521, 18, 52781, {1, 3, 5, 11, 17, 59, 31, 249, 95, 561, 1849, 4061, 5577, 2607, 30083, 59033, 56697, 89761}},
+{16522, 18, 52793, {1, 1, 3, 13, 27, 57, 9, 17, 323, 813, 1197, 2775, 3443, 9523, 24509, 12129, 89697, 169043}},
+{16523, 18, 52796, {1, 3, 5, 13, 17, 51, 91, 1, 105, 345, 829, 1365, 2755, 7197, 26655, 1303, 52223, 133893}},
+{16524, 18, 52807, {1, 1, 7, 1, 31, 3, 51, 21, 327, 851, 153, 3329, 3393, 8489, 5879, 25035, 124403, 172657}},
+{16525, 18, 52821, {1, 1, 1, 5, 3, 21, 61, 29, 99, 343, 621, 3163, 3763, 9347, 7691, 34667, 24555, 125819}},
+{16526, 18, 52849, {1, 1, 1, 1, 3, 17, 83, 191, 83, 315, 1091, 589, 5081, 4611, 15521, 25791, 9103, 13741}},
+{16527, 18, 52866, {1, 3, 5, 3, 7, 53, 9, 227, 399, 857, 673, 3027, 5045, 5573, 7467, 4813, 99659, 142845}},
+{16528, 18, 52868, {1, 1, 5, 11, 23, 37, 71, 151, 279, 879, 601, 2391, 7091, 12669, 10203, 11747, 9613, 248261}},
+{16529, 18, 52872, {1, 1, 3, 3, 29, 25, 33, 25, 1, 683, 1475, 457, 3641, 14219, 20105, 21449, 6903, 43819}},
+{16530, 18, 52875, {1, 1, 7, 7, 5, 1, 73, 79, 357, 971, 699, 1105, 1683, 1687, 32677, 62467, 47671, 88149}},
+{16531, 18, 52886, {1, 3, 1, 15, 23, 13, 93, 75, 307, 81, 1607, 1333, 6969, 7747, 27135, 58941, 26355, 5565}},
+{16532, 18, 52890, {1, 1, 7, 3, 27, 35, 85, 195, 421, 999, 1721, 2029, 283, 13995, 21649, 7519, 73357, 193171}},
+{16533, 18, 52896, {1, 3, 7, 15, 17, 63, 21, 187, 475, 671, 1681, 2731, 8169, 3327, 19789, 53295, 43219, 6949}},
+{16534, 18, 52925, {1, 1, 7, 13, 9, 33, 47, 115, 295, 123, 1293, 1627, 4261, 4503, 15925, 16521, 81759, 247089}},
+{16535, 18, 52931, {1, 3, 1, 13, 11, 15, 83, 129, 409, 465, 873, 1333, 7939, 973, 2753, 33727, 128975, 43333}},
+{16536, 18, 52937, {1, 3, 3, 3, 27, 59, 1, 137, 145, 29, 1189, 2615, 3249, 11197, 17165, 32313, 14065, 44199}},
+{16537, 18, 52938, {1, 3, 3, 11, 17, 49, 107, 111, 45, 963, 1129, 1775, 7671, 1495, 14531, 49743, 63321, 159841}},
+{16538, 18, 52952, {1, 1, 5, 9, 5, 11, 79, 99, 155, 347, 1777, 3793, 1765, 2319, 3135, 30237, 100845, 52689}},
+{16539, 18, 52979, {1, 3, 7, 13, 21, 57, 71, 207, 149, 161, 265, 991, 6967, 8905, 21581, 13921, 79201, 95667}},
+{16540, 18, 53013, {1, 3, 5, 15, 13, 53, 95, 81, 443, 161, 1071, 2749, 6637, 837, 15015, 62397, 33295, 112005}},
+{16541, 18, 53023, {1, 3, 1, 1, 31, 25, 37, 111, 79, 293, 249, 1523, 1509, 1993, 17167, 62939, 118281, 62699}},
+{16542, 18, 53027, {1, 3, 7, 7, 5, 33, 61, 179, 265, 405, 287, 1899, 437, 1609, 19617, 41093, 36341, 176593}},
+{16543, 18, 53033, {1, 1, 5, 3, 9, 33, 97, 45, 23, 807, 1575, 627, 7465, 4805, 11191, 35439, 69433, 47275}},
+{16544, 18, 53039, {1, 1, 1, 5, 1, 51, 51, 247, 453, 449, 1487, 141, 2501, 8039, 14749, 63733, 91963, 232951}},
+{16545, 18, 53041, {1, 3, 3, 13, 15, 7, 81, 211, 445, 15, 899, 835, 5163, 3403, 7367, 29963, 80413, 87209}},
+{16546, 18, 53048, {1, 3, 1, 11, 25, 43, 113, 139, 381, 391, 485, 1503, 4195, 10109, 13771, 35865, 50909, 224887}},
+{16547, 18, 53073, {1, 1, 7, 9, 9, 51, 21, 85, 137, 765, 951, 2453, 227, 9177, 1457, 47937, 84203, 118987}},
+{16548, 18, 53095, {1, 3, 5, 9, 1, 1, 21, 41, 133, 317, 519, 2249, 3453, 2957, 2029, 54737, 42515, 176017}},
+{16549, 18, 53099, {1, 3, 1, 7, 9, 27, 79, 193, 209, 281, 267, 1267, 7013, 13667, 13331, 32863, 5289, 15077}},
+{16550, 18, 53120, {1, 1, 5, 11, 29, 3, 3, 177, 75, 485, 1735, 3955, 4349, 7893, 13075, 58735, 8629, 78143}},
+{16551, 18, 53154, {1, 1, 7, 13, 3, 15, 15, 77, 7, 843, 1561, 461, 6817, 4363, 7861, 45697, 115663, 93789}},
+{16552, 18, 53168, {1, 1, 1, 7, 5, 35, 83, 213, 229, 383, 747, 337, 2589, 683, 18575, 42415, 74889, 227331}},
+{16553, 18, 53192, {1, 3, 5, 3, 17, 35, 57, 213, 247, 273, 689, 1889, 5667, 357, 4267, 11611, 20621, 159039}},
+{16554, 18, 53205, {1, 3, 3, 15, 7, 55, 25, 83, 293, 939, 1169, 2507, 3939, 7537, 2959, 40231, 124511, 181091}},
+{16555, 18, 53206, {1, 1, 5, 9, 31, 51, 67, 149, 509, 695, 449, 2761, 6597, 4741, 4205, 49177, 45599, 167807}},
+{16556, 18, 53234, {1, 1, 7, 15, 3, 7, 113, 71, 279, 885, 251, 2831, 855, 6673, 6511, 63861, 41109, 177119}},
+{16557, 18, 53246, {1, 1, 5, 3, 7, 23, 125, 11, 217, 1023, 549, 529, 3891, 10595, 13751, 37729, 113469, 110549}},
+{16558, 18, 53253, {1, 1, 3, 15, 21, 9, 13, 63, 93, 635, 659, 2837, 6303, 10083, 10107, 27859, 33891, 181229}},
+{16559, 18, 53263, {1, 1, 7, 3, 3, 43, 5, 149, 353, 353, 565, 2441, 7113, 6493, 30355, 17887, 110787, 187199}},
+{16560, 18, 53275, {1, 1, 3, 7, 19, 43, 99, 63, 169, 743, 185, 3817, 6677, 5549, 1609, 24701, 98669, 233701}},
+{16561, 18, 53313, {1, 1, 1, 1, 21, 49, 73, 169, 223, 551, 553, 917, 4705, 14951, 14031, 19753, 96205, 131755}},
+{16562, 18, 53331, {1, 1, 3, 3, 17, 49, 51, 249, 293, 921, 435, 2915, 3125, 3487, 11417, 35043, 29543, 35933}},
+{16563, 18, 53349, {1, 1, 3, 9, 23, 43, 73, 151, 379, 911, 671, 151, 955, 11885, 28795, 23967, 117135, 137985}},
+{16564, 18, 53367, {1, 1, 3, 7, 29, 3, 51, 231, 59, 227, 443, 3533, 7785, 12535, 25725, 7451, 9391, 239281}},
+{16565, 18, 53383, {1, 3, 3, 9, 17, 37, 91, 195, 5, 843, 313, 1417, 1207, 3225, 15949, 34023, 1275, 221057}},
+{16566, 18, 53392, {1, 1, 3, 15, 3, 51, 111, 135, 63, 495, 1967, 2151, 197, 10913, 20705, 1021, 68431, 67119}},
+{16567, 18, 53404, {1, 1, 5, 3, 7, 29, 87, 219, 273, 267, 1317, 797, 6723, 947, 29867, 32571, 12337, 234715}},
+{16568, 18, 53407, {1, 3, 5, 15, 1, 9, 91, 63, 97, 107, 451, 4025, 233, 7803, 17031, 7669, 49417, 256611}},
+{16569, 18, 53411, {1, 1, 7, 3, 17, 17, 45, 197, 227, 133, 799, 411, 6739, 8037, 19553, 53009, 25201, 107625}},
+{16570, 18, 53417, {1, 3, 5, 7, 3, 39, 25, 95, 197, 127, 45, 173, 3305, 6575, 19633, 54919, 35373, 59509}},
+{16571, 18, 53425, {1, 3, 3, 3, 9, 1, 107, 211, 217, 715, 311, 3641, 8055, 1, 9017, 29329, 128467, 46911}},
+{16572, 18, 53443, {1, 1, 1, 7, 1, 13, 13, 79, 259, 533, 1761, 449, 3363, 3061, 26227, 50407, 122951, 261425}},
+{16573, 18, 53469, {1, 3, 5, 5, 29, 19, 41, 7, 25, 203, 587, 3321, 655, 15877, 10423, 41481, 70325, 165527}},
+{16574, 18, 53480, {1, 3, 5, 9, 11, 45, 91, 253, 7, 137, 795, 2379, 4527, 1677, 5081, 6523, 97245, 3691}},
+{16575, 18, 53508, {1, 3, 7, 9, 25, 43, 125, 243, 391, 785, 651, 3245, 7979, 14689, 15443, 40501, 5519, 96551}},
+{16576, 18, 53535, {1, 1, 1, 3, 25, 53, 45, 159, 47, 701, 1655, 2019, 2355, 11213, 12403, 42291, 44925, 72689}},
+{16577, 18, 53536, {1, 1, 1, 5, 21, 19, 77, 31, 3, 161, 149, 3759, 6331, 12311, 7021, 1117, 12459, 134821}},
+{16578, 18, 53542, {1, 1, 3, 9, 9, 59, 23, 255, 437, 625, 719, 3727, 7157, 1889, 31523, 59127, 114143, 174179}},
+{16579, 18, 53563, {1, 1, 1, 15, 23, 7, 47, 137, 77, 519, 1681, 1159, 6121, 14789, 21343, 43101, 44709, 179863}},
+{16580, 18, 53577, {1, 3, 1, 3, 17, 27, 103, 11, 327, 735, 1949, 3719, 811, 2267, 13187, 29747, 98433, 242021}},
+{16581, 18, 53591, {1, 1, 7, 15, 15, 63, 25, 203, 109, 585, 409, 4093, 6669, 2381, 30721, 58975, 17235, 257959}},
+{16582, 18, 53607, {1, 3, 3, 5, 5, 19, 27, 69, 69, 193, 693, 1169, 6321, 3425, 9285, 28019, 128343, 185165}},
+{16583, 18, 53626, {1, 1, 3, 9, 7, 51, 113, 93, 81, 385, 1811, 2601, 2065, 1029, 24515, 7199, 26425, 174283}},
+{16584, 18, 53628, {1, 1, 1, 5, 29, 55, 93, 219, 281, 887, 891, 2763, 6083, 9627, 18559, 21329, 73887, 83699}},
+{16585, 18, 53638, {1, 1, 1, 3, 21, 31, 49, 173, 15, 177, 1001, 3453, 5623, 14107, 8837, 10163, 26817, 41947}},
+{16586, 18, 53675, {1, 1, 3, 5, 27, 63, 117, 49, 405, 281, 981, 2363, 1525, 9685, 29089, 16739, 66509, 125823}},
+{16587, 18, 53685, {1, 3, 7, 13, 27, 29, 57, 189, 345, 135, 753, 463, 731, 4823, 14335, 33299, 105229, 54705}},
+{16588, 18, 53692, {1, 3, 1, 1, 9, 43, 51, 25, 371, 261, 1409, 3493, 2811, 12915, 16075, 62159, 125945, 108453}},
+{16589, 18, 53703, {1, 3, 7, 15, 13, 33, 47, 53, 263, 669, 1383, 3059, 4043, 4777, 14679, 2077, 11019, 5803}},
+{16590, 18, 53722, {1, 1, 3, 11, 21, 7, 39, 71, 215, 79, 1849, 1261, 45, 1273, 27591, 4653, 25119, 30445}},
+{16591, 18, 53738, {1, 3, 5, 9, 21, 3, 17, 207, 417, 777, 37, 3349, 2761, 4469, 3457, 15593, 87251, 38601}},
+{16592, 18, 53748, {1, 1, 7, 13, 29, 29, 101, 103, 487, 87, 1129, 2497, 5501, 4813, 8623, 25077, 50487, 94053}},
+{16593, 18, 53752, {1, 3, 3, 11, 7, 23, 95, 245, 127, 55, 431, 2707, 4955, 15871, 29589, 60023, 1921, 227623}},
+{16594, 18, 53764, {1, 1, 3, 11, 17, 61, 103, 59, 477, 99, 1203, 157, 203, 557, 22921, 47363, 12853, 144067}},
+{16595, 18, 53781, {1, 3, 1, 13, 15, 23, 51, 109, 499, 841, 1779, 2515, 2519, 4945, 20061, 12395, 9223, 157901}},
+{16596, 18, 53788, {1, 3, 7, 9, 9, 15, 57, 223, 223, 463, 427, 2145, 1219, 12639, 28361, 46019, 128101, 198479}},
+{16597, 18, 53791, {1, 3, 7, 7, 1, 1, 99, 101, 135, 169, 1885, 3979, 3051, 13649, 26607, 45067, 4503, 74087}},
+{16598, 18, 53816, {1, 3, 7, 5, 17, 63, 27, 45, 447, 759, 1099, 3407, 489, 2719, 31577, 10355, 126835, 203439}},
+{16599, 18, 53824, {1, 1, 5, 1, 21, 19, 1, 239, 433, 531, 1181, 2021, 423, 3235, 8457, 44459, 117401, 63545}},
+{16600, 18, 53830, {1, 3, 7, 13, 21, 39, 25, 65, 405, 785, 137, 2899, 3255, 11165, 7827, 46425, 89063, 102787}},
+{16601, 18, 53839, {1, 1, 1, 11, 25, 3, 39, 61, 395, 35, 2001, 3201, 2233, 9625, 26489, 54167, 88495, 127441}},
+{16602, 18, 53844, {1, 1, 7, 7, 3, 27, 11, 49, 117, 711, 1881, 1457, 6759, 10517, 12733, 47435, 103111, 237237}},
+{16603, 18, 53875, {1, 1, 5, 5, 1, 61, 121, 155, 223, 733, 1349, 2825, 2093, 4481, 21389, 40227, 20453, 116907}},
+{16604, 18, 53921, {1, 3, 7, 7, 5, 11, 85, 131, 345, 723, 853, 3679, 7859, 11923, 16619, 63169, 127261, 155665}},
+{16605, 18, 53922, {1, 1, 5, 1, 3, 51, 93, 225, 197, 893, 555, 2611, 6225, 7819, 31655, 12235, 24919, 31451}},
+{16606, 18, 53927, {1, 1, 3, 3, 11, 23, 95, 205, 85, 705, 545, 155, 5533, 14837, 8341, 42473, 96891, 70695}},
+{16607, 18, 53948, {1, 3, 3, 5, 17, 31, 99, 187, 219, 275, 685, 2933, 4535, 13495, 20351, 60667, 95211, 129233}},
+{16608, 18, 53956, {1, 1, 1, 11, 9, 11, 123, 231, 127, 199, 733, 2495, 2601, 10565, 3155, 45251, 128319, 187457}},
+{16609, 18, 53990, {1, 3, 1, 9, 3, 33, 41, 109, 279, 851, 1115, 3773, 2383, 1885, 6993, 59693, 69863, 88081}},
+{16610, 18, 53994, {1, 1, 7, 13, 3, 27, 27, 203, 337, 965, 959, 1125, 2897, 8653, 15827, 51187, 12121, 4665}},
+{16611, 18, 54001, {1, 3, 1, 9, 19, 7, 23, 113, 257, 671, 571, 1061, 4353, 217, 13603, 27961, 68431, 147187}},
+{16612, 18, 54016, {1, 3, 5, 9, 25, 61, 7, 139, 237, 859, 761, 2005, 5981, 153, 6553, 53005, 72653, 33571}},
+{16613, 18, 54019, {1, 3, 5, 5, 9, 35, 63, 149, 427, 65, 635, 1955, 1845, 13781, 9761, 36147, 91479, 141305}},
+{16614, 18, 54070, {1, 1, 3, 5, 13, 39, 53, 113, 481, 933, 239, 3713, 7453, 12363, 14763, 46955, 108545, 74349}},
+{16615, 18, 54074, {1, 3, 1, 7, 13, 41, 57, 225, 213, 617, 1947, 2855, 4885, 8553, 20259, 57125, 59369, 178553}},
+{16616, 18, 54088, {1, 3, 5, 15, 31, 31, 19, 87, 461, 403, 1193, 2123, 4991, 14551, 17153, 14171, 17157, 194879}},
+{16617, 18, 54102, {1, 1, 5, 11, 5, 27, 119, 65, 111, 455, 1949, 3441, 6951, 6819, 12839, 6913, 57695, 145925}},
+{16618, 18, 54111, {1, 1, 1, 15, 19, 41, 55, 45, 33, 559, 589, 3773, 745, 8515, 32389, 47797, 145, 105503}},
+{16619, 18, 54130, {1, 1, 3, 15, 13, 53, 35, 223, 247, 893, 149, 553, 829, 5129, 26417, 15769, 95411, 6595}},
+{16620, 18, 54152, {1, 1, 5, 3, 3, 59, 35, 187, 387, 3, 847, 3579, 7869, 481, 23955, 22191, 21041, 230449}},
+{16621, 18, 54170, {1, 1, 3, 15, 23, 11, 97, 199, 11, 647, 803, 2391, 5791, 2223, 22187, 49675, 87775, 196871}},
+{16622, 18, 54172, {1, 3, 7, 5, 25, 63, 107, 227, 133, 337, 1767, 2459, 2987, 10463, 25001, 17047, 79901, 222877}},
+{16623, 18, 54211, {1, 3, 1, 13, 25, 5, 47, 109, 473, 389, 1743, 3951, 4231, 827, 4189, 29903, 106909, 152835}},
+{16624, 18, 54218, {1, 1, 5, 3, 7, 61, 121, 189, 303, 21, 957, 545, 7893, 3217, 25847, 29371, 100569, 132393}},
+{16625, 18, 54228, {1, 1, 1, 15, 29, 17, 59, 37, 449, 149, 845, 555, 7603, 11911, 18477, 23279, 107167, 160339}},
+{16626, 18, 54251, {1, 1, 7, 5, 13, 27, 43, 167, 443, 445, 2011, 2179, 2785, 13663, 21957, 2455, 18217, 19303}},
+{16627, 18, 54253, {1, 1, 1, 5, 19, 45, 71, 39, 21, 791, 1467, 855, 3101, 8267, 15529, 919, 105313, 75627}},
+{16628, 18, 54268, {1, 3, 1, 11, 31, 25, 57, 177, 211, 327, 679, 771, 7725, 6123, 23931, 48223, 9063, 133319}},
+{16629, 18, 54271, {1, 3, 5, 3, 1, 11, 19, 153, 177, 563, 1919, 117, 5583, 1519, 16623, 10871, 15511, 66113}},
+{16630, 18, 54274, {1, 1, 7, 7, 9, 45, 63, 253, 415, 347, 81, 2991, 2691, 2383, 15573, 33783, 12445, 224107}},
+{16631, 18, 54288, {1, 3, 5, 5, 7, 17, 99, 231, 439, 1009, 623, 833, 685, 6419, 30313, 56197, 73239, 260007}},
+{16632, 18, 54314, {1, 1, 5, 5, 5, 51, 97, 239, 267, 629, 1211, 2175, 5681, 3107, 11381, 57047, 120175, 131285}},
+{16633, 18, 54319, {1, 1, 7, 7, 29, 11, 21, 49, 481, 279, 1795, 1295, 453, 15985, 19941, 51853, 15115, 107271}},
+{16634, 18, 54321, {1, 1, 5, 1, 23, 61, 33, 21, 409, 57, 903, 557, 1673, 2759, 23705, 4109, 58865, 233081}},
+{16635, 18, 54324, {1, 1, 1, 5, 11, 37, 79, 15, 213, 485, 1477, 3925, 3205, 9267, 22043, 54197, 57101, 66185}},
+{16636, 18, 54341, {1, 1, 7, 13, 31, 27, 95, 141, 131, 43, 2039, 2257, 17, 14427, 5699, 22263, 86851, 226283}},
+{16637, 18, 54353, {1, 3, 5, 5, 11, 5, 5, 217, 363, 163, 1241, 3683, 1409, 1731, 20973, 63849, 35041, 94859}},
+{16638, 18, 54366, {1, 1, 7, 1, 25, 61, 67, 239, 369, 319, 1157, 2435, 2147, 12057, 4451, 3005, 31787, 199653}},
+{16639, 18, 54370, {1, 3, 5, 1, 11, 57, 1, 163, 433, 11, 1299, 1711, 1601, 4677, 16481, 25175, 63893, 41853}},
+{16640, 18, 54420, {1, 1, 3, 1, 29, 49, 91, 15, 313, 533, 115, 4005, 3157, 10615, 27915, 52613, 64447, 93091}},
+{16641, 18, 54423, {1, 3, 7, 3, 7, 17, 103, 67, 237, 595, 1571, 3421, 3971, 11123, 145, 52087, 59273, 21417}},
+{16642, 18, 54434, {1, 3, 5, 11, 31, 37, 105, 205, 377, 243, 841, 3153, 6847, 14171, 19947, 61561, 35, 261753}},
+{16643, 18, 54440, {1, 3, 5, 9, 29, 21, 103, 219, 107, 427, 1841, 2015, 2919, 5721, 8631, 48841, 33281, 35835}},
+{16644, 18, 54454, {1, 1, 3, 5, 25, 27, 67, 65, 305, 677, 1975, 1049, 7277, 15279, 30181, 48941, 119087, 130265}},
+{16645, 18, 54495, {1, 1, 3, 9, 29, 27, 109, 167, 351, 463, 663, 3155, 919, 10627, 30163, 62233, 32927, 210775}},
+{16646, 18, 54501, {1, 3, 5, 5, 19, 9, 17, 93, 33, 999, 1537, 3045, 3735, 4625, 31363, 46075, 80985, 108331}},
+{16647, 18, 54526, {1, 3, 7, 7, 11, 63, 83, 157, 205, 505, 657, 1901, 1405, 8349, 16473, 29397, 130379, 167963}},
+{16648, 18, 54639, {1, 3, 1, 15, 25, 49, 65, 189, 461, 923, 1839, 2597, 2471, 14103, 2915, 48429, 74387, 243465}},
+{16649, 18, 54653, {1, 3, 7, 11, 31, 47, 109, 21, 205, 343, 1999, 315, 8119, 15937, 8761, 55257, 99983, 131641}},
+{16650, 18, 54667, {1, 1, 3, 11, 3, 23, 73, 125, 17, 967, 1811, 1413, 4783, 8303, 25301, 26859, 90583, 140721}},
+{16651, 18, 54678, {1, 1, 5, 5, 25, 41, 49, 127, 391, 381, 1575, 1697, 5205, 12805, 24365, 20275, 58819, 167845}},
+{16652, 18, 54700, {1, 1, 7, 11, 17, 53, 51, 35, 383, 931, 359, 2863, 119, 6683, 26247, 14281, 49205, 256869}},
+{16653, 18, 54717, {1, 1, 7, 9, 23, 5, 69, 97, 407, 15, 579, 2905, 47, 6227, 23997, 42459, 26569, 225467}},
+{16654, 18, 54780, {1, 3, 3, 11, 7, 3, 125, 87, 347, 79, 1571, 1513, 285, 12101, 1731, 27887, 42009, 173243}},
+{16655, 18, 54801, {1, 3, 7, 13, 3, 5, 99, 29, 77, 873, 1111, 1451, 5493, 10669, 22597, 54437, 55521, 101617}},
+{16656, 18, 54813, {1, 3, 1, 3, 3, 17, 41, 215, 207, 71, 683, 1979, 4849, 2437, 5717, 28999, 55005, 233929}},
+{16657, 18, 54814, {1, 1, 1, 1, 23, 21, 105, 223, 5, 235, 1533, 3715, 2689, 13937, 12125, 63879, 111537, 39817}},
+{16658, 18, 54850, {1, 3, 3, 15, 25, 47, 71, 229, 21, 563, 1851, 2423, 131, 4431, 31567, 8883, 1311, 227893}},
+{16659, 18, 54883, {1, 3, 5, 11, 7, 23, 19, 59, 397, 315, 1149, 3595, 5973, 11027, 5233, 55237, 102777, 137421}},
+{16660, 18, 54907, {1, 1, 7, 9, 17, 61, 45, 235, 387, 171, 1079, 3119, 6933, 3591, 751, 35495, 49969, 204611}},
+{16661, 18, 54919, {1, 1, 7, 7, 21, 7, 105, 79, 81, 245, 1229, 409, 5159, 9815, 6713, 4687, 120541, 246133}},
+{16662, 18, 54931, {1, 3, 7, 13, 23, 31, 85, 97, 481, 497, 581, 1179, 243, 1767, 11855, 11599, 3141, 104741}},
+{16663, 18, 54933, {1, 3, 7, 3, 3, 45, 15, 29, 413, 631, 273, 1007, 2979, 11307, 24535, 9305, 83591, 77121}},
+{16664, 18, 54991, {1, 3, 7, 15, 21, 55, 11, 169, 417, 631, 141, 1489, 3371, 16073, 11215, 15479, 125341, 131731}},
+{16665, 18, 55003, {1, 1, 7, 5, 13, 33, 7, 121, 295, 191, 497, 2233, 997, 13833, 14503, 38357, 79007, 53985}},
+{16666, 18, 55009, {1, 3, 3, 3, 29, 63, 97, 27, 449, 643, 317, 1989, 1481, 2873, 21247, 35989, 61295, 101829}},
+{16667, 18, 55030, {1, 3, 1, 7, 13, 49, 27, 227, 21, 983, 179, 2761, 2859, 2851, 26447, 33295, 126963, 41441}},
+{16668, 18, 55034, {1, 1, 5, 13, 27, 1, 61, 115, 185, 867, 2017, 2257, 5035, 7855, 25849, 48189, 28287, 133261}},
+{16669, 18, 55039, {1, 1, 7, 13, 27, 17, 13, 205, 379, 717, 247, 3341, 2841, 10845, 26979, 5589, 1935, 48371}},
+{16670, 18, 55048, {1, 3, 1, 11, 9, 51, 25, 185, 65, 643, 1867, 3825, 3395, 8883, 29239, 20019, 19071, 3377}},
+{16671, 18, 55059, {1, 1, 1, 1, 11, 57, 61, 113, 419, 249, 153, 2883, 87, 7919, 11941, 46725, 38701, 73715}},
+{16672, 18, 55061, {1, 3, 3, 11, 3, 15, 19, 87, 27, 839, 463, 1757, 3137, 10821, 2857, 58101, 91983, 137045}},
+{16673, 18, 55068, {1, 3, 3, 1, 25, 25, 15, 93, 359, 5, 53, 647, 6245, 1957, 4651, 14697, 12193, 231303}},
+{16674, 18, 55077, {1, 1, 5, 9, 31, 49, 69, 223, 133, 595, 777, 1281, 727, 6671, 21453, 14193, 51769, 258301}},
+{16675, 18, 55122, {1, 3, 5, 11, 29, 37, 75, 17, 229, 121, 313, 2873, 5233, 13231, 7589, 40075, 42101, 137697}},
+{16676, 18, 55149, {1, 1, 7, 1, 31, 9, 15, 63, 149, 5, 1785, 21, 2619, 15071, 3243, 58023, 20697, 205181}},
+{16677, 18, 55157, {1, 3, 7, 7, 25, 61, 59, 157, 251, 303, 1905, 2389, 1681, 319, 14155, 49089, 45381, 124447}},
+{16678, 18, 55158, {1, 3, 5, 5, 25, 27, 41, 125, 105, 867, 365, 117, 7215, 2887, 28499, 9597, 105999, 150189}},
+{16679, 18, 55178, {1, 1, 5, 13, 5, 33, 47, 221, 207, 641, 525, 3215, 5293, 16343, 16169, 44393, 26305, 194411}},
+{16680, 18, 55222, {1, 3, 5, 13, 29, 17, 31, 77, 511, 465, 1141, 597, 5111, 6629, 14557, 13057, 11643, 250925}},
+{16681, 18, 55234, {1, 1, 7, 11, 1, 5, 65, 139, 471, 265, 1145, 965, 47, 10971, 15615, 62031, 58523, 175593}},
+{16682, 18, 55236, {1, 1, 5, 1, 23, 61, 57, 139, 377, 843, 79, 2873, 1823, 7551, 26741, 63031, 124879, 115295}},
+{16683, 18, 55251, {1, 1, 5, 13, 9, 19, 1, 61, 331, 1015, 1035, 1691, 4057, 6071, 24929, 39569, 95695, 39307}},
+{16684, 18, 55269, {1, 3, 3, 5, 23, 17, 13, 65, 381, 893, 1879, 3735, 1547, 6735, 30251, 11471, 102997, 126429}},
+{16685, 18, 55270, {1, 1, 5, 13, 1, 43, 15, 1, 155, 221, 1463, 3793, 6467, 7221, 28027, 55357, 69397, 87565}},
+{16686, 18, 55284, {1, 1, 7, 3, 17, 9, 71, 75, 77, 639, 1251, 701, 473, 12337, 1893, 6349, 10837, 27797}},
+{16687, 18, 55309, {1, 3, 5, 11, 11, 11, 125, 23, 161, 937, 707, 2487, 695, 8495, 16219, 33671, 109463, 248305}},
+{16688, 18, 55322, {1, 1, 1, 11, 5, 49, 15, 47, 393, 407, 39, 1867, 7727, 12701, 7805, 119, 77401, 186421}},
+{16689, 18, 55334, {1, 1, 5, 5, 19, 21, 77, 187, 387, 51, 1497, 1225, 3101, 791, 529, 4321, 118435, 112889}},
+{16690, 18, 55340, {1, 3, 1, 13, 27, 17, 11, 63, 201, 909, 1549, 3243, 1803, 9461, 20985, 24637, 100993, 200473}},
+{16691, 18, 55348, {1, 3, 7, 13, 11, 35, 97, 213, 415, 467, 2013, 2159, 7017, 7895, 18235, 50659, 113169, 141887}},
+{16692, 18, 55377, {1, 1, 3, 7, 13, 21, 119, 109, 471, 323, 277, 1685, 2399, 14777, 2643, 5879, 113043, 45223}},
+{16693, 18, 55430, {1, 3, 1, 13, 19, 5, 1, 75, 499, 297, 1897, 591, 3223, 12939, 30593, 4053, 122207, 215171}},
+{16694, 18, 55433, {1, 3, 3, 9, 21, 11, 29, 205, 13, 381, 569, 599, 7089, 8145, 18531, 34477, 101057, 64269}},
+{16695, 18, 55441, {1, 1, 5, 15, 1, 19, 37, 131, 325, 441, 3, 4001, 6937, 9207, 27543, 30321, 37083, 241019}},
+{16696, 18, 55470, {1, 3, 7, 13, 7, 15, 9, 159, 97, 905, 557, 1913, 7325, 4057, 19461, 14277, 36873, 25619}},
+{16697, 18, 55535, {1, 3, 5, 7, 3, 51, 99, 9, 185, 227, 2041, 331, 3925, 12481, 17485, 37137, 3753, 125269}},
+{16698, 18, 55561, {1, 1, 7, 11, 31, 49, 89, 37, 49, 863, 833, 3263, 351, 6277, 23055, 49727, 25005, 161585}},
+{16699, 18, 55567, {1, 3, 5, 1, 9, 35, 89, 101, 117, 365, 1015, 1159, 4623, 4541, 6831, 28091, 10647, 221415}},
+{16700, 18, 55597, {1, 1, 5, 5, 13, 47, 125, 209, 199, 885, 927, 1411, 795, 8835, 28589, 48753, 27191, 53455}},
+{16701, 18, 55630, {1, 1, 5, 9, 7, 19, 3, 87, 157, 121, 1433, 1463, 3241, 5969, 203, 36723, 14779, 63949}},
+{16702, 18, 55648, {1, 1, 3, 9, 1, 47, 71, 113, 405, 561, 1149, 3599, 4173, 6819, 5493, 45987, 41521, 221503}},
+{16703, 18, 55653, {1, 3, 3, 1, 3, 55, 101, 103, 161, 549, 457, 2529, 2043, 8843, 5677, 7449, 45185, 178289}},
+{16704, 18, 55657, {1, 1, 1, 3, 31, 25, 1, 161, 7, 503, 641, 2221, 749, 1521, 6151, 19245, 55913, 80141}},
+{16705, 18, 55665, {1, 1, 1, 9, 3, 45, 73, 217, 249, 929, 163, 2139, 3921, 11223, 11161, 52697, 89633, 14243}},
+{16706, 18, 55678, {1, 1, 7, 15, 17, 41, 5, 119, 211, 53, 985, 2679, 679, 9349, 25577, 26947, 35141, 93999}},
+{16707, 18, 55684, {1, 3, 1, 15, 17, 43, 51, 15, 363, 615, 889, 195, 6279, 15477, 31545, 50941, 119711, 66535}},
+{16708, 18, 55691, {1, 1, 1, 13, 7, 11, 17, 127, 131, 759, 739, 161, 5937, 13611, 31757, 10681, 101357, 82873}},
+{16709, 18, 55693, {1, 3, 5, 7, 21, 63, 75, 33, 233, 981, 589, 3409, 3523, 1871, 8919, 38513, 32825, 56935}},
+{16710, 18, 55702, {1, 3, 5, 3, 9, 9, 85, 221, 203, 727, 1035, 1069, 2409, 2687, 235, 23395, 64163, 193235}},
+{16711, 18, 55708, {1, 3, 3, 7, 1, 35, 119, 175, 203, 819, 207, 2283, 4175, 3581, 11647, 43073, 104573, 86607}},
+{16712, 18, 55715, {1, 3, 3, 15, 11, 63, 59, 153, 279, 779, 261, 3317, 7671, 11727, 19381, 33227, 79331, 187227}},
+{16713, 18, 55739, {1, 1, 3, 1, 7, 1, 115, 15, 235, 9, 1877, 1911, 1089, 9939, 9537, 39563, 95327, 70323}},
+{16714, 18, 55761, {1, 1, 5, 7, 25, 61, 63, 145, 425, 617, 1813, 3255, 6797, 16019, 18849, 44191, 69877, 179933}},
+{16715, 18, 55767, {1, 1, 3, 13, 17, 45, 69, 247, 27, 367, 871, 1185, 895, 7991, 8145, 22869, 97609, 14673}},
+{16716, 18, 55768, {1, 3, 3, 11, 19, 41, 99, 213, 159, 803, 121, 1197, 2849, 15191, 15603, 52445, 105077, 128231}},
+{16717, 18, 55774, {1, 3, 1, 11, 21, 61, 117, 167, 437, 447, 419, 1673, 755, 15331, 29819, 16099, 130773, 177547}},
+{16718, 18, 55787, {1, 3, 7, 7, 1, 15, 79, 109, 351, 71, 985, 89, 7517, 4175, 30533, 52125, 100863, 186477}},
+{16719, 18, 55811, {1, 1, 3, 1, 15, 1, 103, 65, 511, 241, 1279, 3233, 7141, 255, 10925, 28271, 56151, 252121}},
+{16720, 18, 55835, {1, 1, 1, 13, 17, 49, 59, 93, 19, 343, 979, 865, 3447, 4595, 3067, 26807, 98915, 126237}},
+{16721, 18, 55894, {1, 3, 3, 5, 17, 5, 91, 199, 191, 775, 233, 919, 277, 3485, 9231, 37025, 23493, 186745}},
+{16722, 18, 55897, {1, 3, 1, 1, 11, 5, 103, 187, 85, 47, 1111, 883, 6155, 15315, 9041, 58275, 75037, 7773}},
+{16723, 18, 55904, {1, 3, 1, 3, 19, 5, 7, 211, 481, 713, 383, 1203, 6089, 15817, 31577, 7283, 25457, 101455}},
+{16724, 18, 55931, {1, 3, 5, 7, 21, 9, 59, 127, 375, 477, 721, 3931, 7089, 9079, 5015, 62019, 113747, 36055}},
+{16725, 18, 55950, {1, 3, 7, 13, 3, 17, 47, 177, 103, 535, 1787, 509, 5253, 2857, 13421, 19875, 37397, 251353}},
+{16726, 18, 55961, {1, 1, 5, 7, 19, 31, 41, 93, 301, 45, 251, 2691, 4657, 2627, 17321, 24627, 80221, 117191}},
+{16727, 18, 55973, {1, 3, 5, 7, 5, 31, 27, 3, 463, 549, 1669, 499, 815, 4091, 7049, 60957, 102849, 235617}},
+{16728, 18, 56078, {1, 3, 5, 1, 21, 31, 57, 201, 503, 977, 893, 3927, 1605, 8265, 5137, 51009, 89375, 237909}},
+{16729, 18, 56099, {1, 3, 3, 1, 27, 5, 11, 81, 445, 229, 5, 543, 3397, 12961, 31911, 36945, 59485, 305}},
+{16730, 18, 56105, {1, 1, 5, 13, 31, 63, 39, 171, 243, 39, 1147, 459, 7215, 14603, 20625, 47369, 121495, 237741}},
+{16731, 18, 56119, {1, 3, 3, 13, 15, 63, 39, 23, 305, 685, 1885, 571, 2657, 16031, 24759, 10639, 25619, 246137}},
+{16732, 18, 56133, {1, 1, 1, 5, 19, 33, 5, 187, 167, 725, 1405, 511, 701, 13283, 3513, 16495, 8755, 221751}},
+{16733, 18, 56168, {1, 1, 7, 11, 3, 27, 27, 237, 495, 637, 479, 3247, 3825, 2567, 12853, 52881, 34807, 161483}},
+{16734, 18, 56191, {1, 3, 3, 9, 23, 43, 101, 175, 19, 443, 787, 1053, 4113, 12777, 4615, 53115, 2873, 117383}},
+{16735, 18, 56202, {1, 3, 1, 13, 3, 23, 33, 93, 145, 937, 957, 2463, 827, 383, 16749, 61567, 10029, 188159}},
+{16736, 18, 56209, {1, 1, 7, 15, 21, 23, 3, 71, 323, 995, 645, 1189, 1029, 519, 3479, 13587, 95641, 215337}},
+{16737, 18, 56215, {1, 3, 7, 11, 9, 17, 101, 59, 421, 417, 797, 3089, 773, 15959, 18127, 13681, 104667, 217433}},
+{16738, 18, 56232, {1, 3, 5, 7, 31, 21, 9, 7, 377, 589, 1497, 939, 5389, 10997, 22291, 19639, 72187, 66193}},
+{16739, 18, 56240, {1, 1, 1, 13, 19, 1, 127, 185, 251, 167, 1289, 2715, 5885, 12715, 18261, 36861, 102721, 246917}},
+{16740, 18, 56260, {1, 1, 7, 1, 23, 41, 19, 151, 125, 465, 813, 1711, 7933, 13561, 29737, 59207, 62533, 124149}},
+{16741, 18, 56270, {1, 3, 5, 9, 7, 13, 17, 119, 425, 877, 1207, 2211, 2943, 13921, 28251, 44143, 112149, 152341}},
+{16742, 18, 56278, {1, 3, 5, 9, 15, 21, 87, 83, 77, 731, 91, 3091, 5687, 9647, 2037, 39031, 106583, 66533}},
+{16743, 18, 56281, {1, 1, 7, 9, 31, 49, 7, 119, 147, 599, 1191, 297, 1597, 10723, 16893, 47387, 106995, 165409}},
+{16744, 18, 56288, {1, 3, 3, 3, 3, 63, 11, 193, 241, 63, 1671, 2139, 5689, 13967, 9239, 7535, 34237, 140283}},
+{16745, 18, 56303, {1, 3, 5, 13, 9, 23, 65, 247, 473, 825, 109, 1897, 245, 10517, 8147, 25989, 96447, 118689}},
+{16746, 18, 56308, {1, 1, 3, 5, 27, 35, 65, 23, 159, 729, 189, 2661, 4245, 14377, 21043, 15551, 2717, 146949}},
+{16747, 18, 56312, {1, 1, 3, 13, 23, 5, 35, 63, 293, 347, 883, 149, 5145, 10821, 5813, 24183, 94711, 64787}},
+{16748, 18, 56320, {1, 1, 5, 3, 27, 3, 127, 141, 237, 535, 1509, 2755, 5843, 2379, 19413, 52345, 100247, 42571}},
+{16749, 18, 56326, {1, 3, 3, 9, 1, 55, 61, 105, 29, 1021, 1215, 2157, 7453, 4643, 26793, 33553, 2959, 51485}},
+{16750, 18, 56392, {1, 1, 3, 7, 31, 51, 59, 49, 321, 207, 415, 2115, 219, 5045, 31133, 17961, 130779, 28255}},
+{16751, 18, 56395, {1, 3, 7, 15, 9, 29, 31, 185, 111, 959, 7, 827, 7891, 5449, 22221, 49933, 2091, 194683}},
+{16752, 18, 56403, {1, 3, 7, 1, 11, 59, 75, 255, 387, 913, 423, 2915, 5079, 6363, 5175, 57977, 5559, 13257}},
+{16753, 18, 56419, {1, 1, 7, 1, 21, 3, 21, 13, 157, 3, 715, 3525, 7769, 5333, 25345, 53473, 44323, 203167}},
+{16754, 18, 56428, {1, 1, 7, 11, 31, 25, 55, 5, 169, 695, 1599, 2357, 1427, 14469, 15223, 34275, 42605, 23005}},
+{16755, 18, 56450, {1, 1, 1, 15, 19, 51, 117, 135, 297, 831, 329, 3793, 4673, 3795, 24185, 52971, 30423, 68771}},
+{16756, 18, 56452, {1, 1, 7, 5, 19, 33, 79, 77, 315, 29, 307, 1709, 3489, 14515, 12477, 58939, 53753, 165031}},
+{16757, 18, 56485, {1, 1, 7, 1, 27, 57, 119, 207, 355, 279, 1371, 3917, 2821, 5285, 12673, 28973, 54957, 94001}},
+{16758, 18, 56486, {1, 3, 7, 3, 19, 57, 53, 199, 485, 805, 301, 1337, 5993, 2187, 30573, 12045, 101205, 129841}},
+{16759, 18, 56492, {1, 1, 3, 9, 15, 45, 71, 119, 445, 759, 1361, 1299, 2927, 2343, 22085, 53733, 21241, 1553}},
+{16760, 18, 56498, {1, 3, 5, 3, 27, 11, 1, 239, 497, 343, 1989, 1463, 2473, 5191, 6271, 14129, 124453, 96817}},
+{16761, 18, 56510, {1, 3, 5, 7, 27, 19, 123, 27, 483, 557, 1545, 1871, 1297, 587, 1067, 51259, 119231, 173659}},
+{16762, 18, 56512, {1, 3, 1, 1, 27, 45, 41, 113, 453, 553, 2019, 2039, 1709, 13017, 5497, 34459, 60295, 229405}},
+{16763, 18, 56524, {1, 3, 1, 11, 1, 57, 51, 125, 261, 915, 1673, 25, 529, 653, 17247, 64225, 98991, 248143}},
+{16764, 18, 56530, {1, 3, 5, 15, 25, 27, 31, 1, 463, 249, 113, 1955, 2223, 5463, 12281, 20843, 26495, 256759}},
+{16765, 18, 56545, {1, 1, 3, 11, 27, 33, 57, 205, 89, 435, 1983, 1165, 3843, 127, 30179, 63971, 10211, 105403}},
+{16766, 18, 56551, {1, 3, 3, 5, 21, 49, 35, 161, 273, 205, 41, 1881, 2013, 12549, 24859, 55711, 98235, 237281}},
+{16767, 18, 56565, {1, 3, 3, 1, 15, 35, 95, 1, 221, 675, 385, 2257, 2531, 2129, 12895, 11565, 125977, 51973}},
+{16768, 18, 56580, {1, 1, 1, 15, 19, 61, 35, 55, 9, 721, 499, 2577, 3001, 14861, 22293, 56195, 72855, 166703}},
+{16769, 18, 56587, {1, 1, 1, 7, 5, 25, 59, 175, 81, 989, 935, 2579, 8183, 1109, 4645, 53753, 115795, 105091}},
+{16770, 18, 56589, {1, 3, 3, 13, 7, 55, 7, 113, 197, 763, 1747, 3291, 1109, 4391, 18257, 28563, 97413, 5847}},
+{16771, 18, 56592, {1, 1, 1, 7, 23, 55, 91, 83, 479, 305, 843, 2055, 3405, 15243, 31551, 5275, 8651, 66915}},
+{16772, 18, 56611, {1, 3, 7, 9, 3, 19, 83, 229, 235, 903, 1495, 1033, 2729, 14927, 11847, 22979, 13905, 84413}},
+{16773, 18, 56623, {1, 3, 3, 13, 27, 37, 83, 193, 475, 439, 745, 757, 7359, 6683, 5839, 50765, 6933, 117411}},
+{16774, 18, 56635, {1, 3, 5, 11, 31, 25, 33, 77, 113, 815, 123, 2721, 2133, 8995, 15237, 54565, 5155, 51235}},
+{16775, 18, 56646, {1, 3, 3, 7, 15, 31, 73, 91, 379, 39, 913, 53, 41, 1059, 25883, 11769, 63015, 48125}},
+{16776, 18, 56660, {1, 1, 5, 5, 5, 13, 81, 169, 71, 529, 1429, 2101, 4069, 5509, 30283, 40625, 103673, 183243}},
+{16777, 18, 56680, {1, 3, 3, 5, 23, 39, 39, 237, 445, 567, 343, 2521, 2287, 1851, 2315, 59979, 5015, 243349}},
+{16778, 18, 56686, {1, 1, 7, 1, 1, 51, 89, 229, 187, 207, 245, 3521, 2987, 4347, 6997, 62565, 54397, 140473}},
+{16779, 18, 56716, {1, 3, 1, 5, 7, 59, 45, 161, 457, 655, 1591, 215, 2213, 15101, 14791, 40397, 95811, 126291}},
+{16780, 18, 56749, {1, 1, 3, 1, 5, 23, 7, 199, 143, 561, 1669, 17, 8109, 11003, 4535, 8593, 112021, 223153}},
+{16781, 18, 56790, {1, 3, 5, 9, 3, 37, 111, 15, 235, 697, 385, 2197, 909, 1247, 26199, 50661, 100643, 122577}},
+{16782, 18, 56809, {1, 3, 5, 11, 23, 53, 95, 75, 463, 137, 1511, 3373, 3071, 547, 22399, 51891, 9123, 240925}},
+{16783, 18, 56869, {1, 3, 7, 3, 21, 35, 69, 197, 371, 15, 185, 3539, 29, 15071, 17069, 34669, 37023, 189385}},
+{16784, 18, 56884, {1, 1, 1, 15, 5, 21, 7, 5, 201, 881, 841, 827, 503, 3545, 17771, 64481, 65105, 209947}},
+{16785, 18, 56887, {1, 1, 1, 5, 3, 31, 83, 201, 455, 169, 1797, 1769, 1999, 8629, 14313, 16851, 64955, 180631}},
+{16786, 18, 56893, {1, 1, 5, 5, 1, 35, 49, 61, 499, 619, 1509, 3015, 237, 8979, 3471, 11513, 80193, 24135}},
+{16787, 18, 56906, {1, 3, 3, 9, 25, 29, 111, 19, 339, 739, 1751, 2671, 5399, 5965, 3943, 45577, 70605, 203117}},
+{16788, 18, 56932, {1, 3, 3, 7, 3, 9, 15, 147, 177, 545, 161, 2211, 4653, 15891, 15939, 19153, 77827, 245787}},
+{16789, 18, 56959, {1, 1, 1, 1, 25, 47, 37, 159, 273, 825, 1037, 2047, 7149, 5517, 699, 49687, 110115, 159475}},
+{16790, 18, 56965, {1, 3, 1, 7, 7, 55, 77, 231, 197, 381, 2013, 2421, 7551, 9955, 21031, 11365, 48271, 190147}},
+{16791, 18, 56983, {1, 1, 5, 9, 25, 1, 81, 145, 215, 427, 905, 2307, 6149, 12777, 131, 57091, 106137, 24625}},
+{16792, 18, 57018, {1, 3, 1, 13, 13, 63, 103, 245, 275, 745, 841, 2993, 2083, 8903, 4499, 55979, 22323, 244447}},
+{16793, 18, 57023, {1, 1, 5, 5, 15, 11, 59, 181, 191, 219, 599, 59, 1079, 4445, 16537, 31127, 103257, 233855}},
+{16794, 18, 57025, {1, 3, 7, 9, 9, 37, 109, 41, 145, 1001, 609, 551, 6843, 13791, 15103, 27851, 7693, 145207}},
+{16795, 18, 57032, {1, 3, 1, 9, 3, 35, 63, 219, 49, 567, 1537, 1327, 6487, 16039, 26019, 13851, 116929, 175121}},
+{16796, 18, 57040, {1, 3, 7, 15, 17, 31, 27, 91, 241, 229, 485, 2601, 3859, 12609, 19847, 31939, 50815, 235529}},
+{16797, 18, 57046, {1, 1, 5, 15, 27, 31, 3, 47, 69, 427, 95, 1445, 1223, 2953, 32343, 6841, 67851, 79561}},
+{16798, 18, 57071, {1, 3, 5, 13, 13, 37, 19, 127, 259, 139, 1597, 651, 4845, 6413, 18205, 56005, 32107, 140783}},
+{16799, 18, 57091, {1, 1, 7, 5, 15, 23, 81, 195, 127, 113, 499, 733, 5907, 12107, 18105, 28113, 16111, 152327}},
+{16800, 18, 57094, {1, 1, 5, 15, 9, 49, 109, 181, 187, 591, 1625, 3641, 313, 1225, 11725, 9047, 30351, 124301}},
+{16801, 18, 57108, {1, 3, 1, 1, 9, 45, 103, 219, 155, 805, 1775, 759, 1687, 11415, 21623, 37831, 18995, 21667}},
+{16802, 18, 57122, {1, 3, 3, 5, 25, 13, 11, 37, 489, 935, 373, 811, 5045, 3615, 2111, 22909, 117155, 69483}},
+{16803, 18, 57127, {1, 3, 3, 5, 9, 45, 71, 87, 265, 93, 161, 2983, 1023, 3633, 5965, 9499, 35653, 219257}},
+{16804, 18, 57168, {1, 1, 5, 13, 21, 27, 101, 231, 85, 469, 1023, 3735, 5093, 253, 22585, 61975, 81041, 4175}},
+{16805, 18, 57183, {1, 3, 1, 7, 5, 41, 105, 153, 391, 5, 1917, 331, 7679, 14359, 13177, 40755, 78669, 133527}},
+{16806, 18, 57184, {1, 3, 3, 15, 21, 61, 87, 63, 227, 195, 1095, 1629, 7787, 5887, 20855, 30203, 61973, 30627}},
+{16807, 18, 57193, {1, 3, 1, 15, 31, 41, 125, 223, 201, 717, 1309, 595, 5333, 10585, 32525, 8597, 92637, 111073}},
+{16808, 18, 57202, {1, 3, 5, 3, 21, 29, 39, 105, 275, 515, 503, 79, 6715, 14203, 14035, 20871, 122417, 243167}},
+{16809, 18, 57235, {1, 3, 7, 5, 29, 41, 3, 89, 165, 879, 773, 3989, 3945, 4771, 2809, 59105, 37177, 193887}},
+{16810, 18, 57237, {1, 3, 3, 3, 27, 1, 91, 191, 135, 257, 527, 2971, 7117, 6013, 8735, 52363, 110617, 96959}},
+{16811, 18, 57251, {1, 3, 7, 9, 3, 63, 67, 67, 231, 23, 1539, 771, 1485, 4331, 19231, 50539, 15081, 75945}},
+{16812, 18, 57289, {1, 3, 3, 11, 29, 11, 77, 67, 497, 861, 21, 2939, 2463, 14435, 27399, 19733, 118207, 60909}},
+{16813, 18, 57349, {1, 1, 5, 5, 1, 11, 117, 55, 485, 877, 1213, 2231, 2613, 14027, 18491, 45431, 113303, 28457}},
+{16814, 18, 57359, {1, 3, 7, 1, 13, 49, 77, 59, 455, 251, 1033, 3451, 7641, 389, 3987, 62361, 90125, 94569}},
+{16815, 18, 57374, {1, 1, 7, 15, 3, 5, 45, 173, 343, 445, 1871, 2505, 1385, 2641, 21299, 35139, 61781, 101195}},
+{16816, 18, 57377, {1, 3, 1, 9, 25, 27, 89, 123, 473, 901, 1513, 2585, 5641, 13123, 22653, 32985, 15763, 9161}},
+{16817, 18, 57387, {1, 3, 3, 9, 29, 41, 5, 127, 489, 715, 1981, 3953, 3557, 10081, 31913, 52191, 118727, 4443}},
+{16818, 18, 57415, {1, 1, 5, 1, 19, 57, 125, 33, 253, 297, 265, 2249, 6859, 14971, 3519, 24783, 127491, 210441}},
+{16819, 18, 57440, {1, 1, 7, 7, 31, 1, 47, 175, 305, 933, 679, 317, 7511, 13219, 9509, 61183, 58907, 72905}},
+{16820, 18, 57446, {1, 1, 1, 7, 13, 49, 75, 85, 341, 911, 1217, 3631, 1849, 9715, 23193, 947, 106647, 180455}},
+{16821, 18, 57450, {1, 1, 7, 7, 1, 49, 91, 195, 329, 771, 607, 1707, 2723, 291, 21393, 6549, 31645, 151431}},
+{16822, 18, 57469, {1, 3, 7, 5, 17, 57, 7, 231, 247, 217, 1729, 3231, 7515, 15341, 18681, 21733, 28723, 228187}},
+{16823, 18, 57491, {1, 1, 5, 9, 5, 19, 121, 251, 43, 951, 957, 173, 4863, 5027, 6781, 29421, 4877, 47749}},
+{16824, 18, 57503, {1, 3, 7, 7, 11, 33, 107, 233, 329, 589, 869, 913, 7687, 13223, 27577, 24379, 13037, 214713}},
+{16825, 18, 57507, {1, 3, 7, 13, 1, 13, 121, 103, 387, 193, 543, 3085, 4323, 9885, 24499, 34985, 45763, 13107}},
+{16826, 18, 57542, {1, 1, 3, 15, 25, 63, 85, 41, 457, 779, 1199, 2235, 309, 2549, 3341, 36265, 17873, 32361}},
+{16827, 18, 57569, {1, 3, 3, 3, 15, 31, 11, 57, 499, 415, 1625, 1195, 6863, 6073, 25083, 57705, 76203, 130993}},
+{16828, 18, 57599, {1, 3, 5, 5, 21, 13, 43, 161, 255, 31, 1901, 3325, 3209, 9809, 8227, 9005, 57263, 95095}},
+{16829, 18, 57601, {1, 1, 3, 15, 13, 33, 5, 123, 291, 579, 1747, 3319, 7351, 1679, 11365, 26909, 74445, 139017}},
+{16830, 18, 57607, {1, 1, 3, 13, 17, 39, 1, 253, 487, 935, 1711, 1397, 503, 7817, 28509, 20665, 78551, 204319}},
+{16831, 18, 57608, {1, 1, 3, 1, 5, 39, 123, 105, 305, 77, 63, 3285, 7463, 11199, 647, 37757, 91083, 108325}},
+{16832, 18, 57625, {1, 1, 7, 5, 9, 49, 121, 155, 389, 119, 1327, 3583, 7715, 2705, 20047, 19151, 101455, 205263}},
+{16833, 18, 57644, {1, 1, 5, 7, 31, 23, 13, 109, 103, 41, 433, 3609, 4973, 11481, 8381, 4725, 113633, 134651}},
+{16834, 18, 57662, {1, 3, 7, 7, 25, 25, 107, 189, 89, 625, 187, 2185, 713, 10107, 11139, 63681, 97005, 79329}},
+{16835, 18, 57664, {1, 3, 1, 11, 3, 41, 43, 161, 337, 955, 1035, 451, 5989, 3593, 18087, 22667, 110213, 128545}},
+{16836, 18, 57674, {1, 1, 5, 1, 25, 31, 95, 113, 205, 565, 557, 3885, 7163, 10703, 27159, 11395, 117459, 52439}},
+{16837, 18, 57698, {1, 1, 1, 5, 27, 31, 39, 61, 323, 983, 1361, 2387, 5401, 8287, 17855, 49783, 65327, 202861}},
+{16838, 18, 57700, {1, 3, 5, 3, 31, 39, 105, 113, 183, 311, 667, 945, 3677, 14623, 27907, 16673, 77899, 182863}},
+{16839, 18, 57709, {1, 1, 5, 3, 17, 27, 99, 93, 81, 805, 1799, 2855, 6859, 3917, 26177, 22307, 59213, 210123}},
+{16840, 18, 57724, {1, 3, 5, 1, 19, 37, 51, 65, 495, 229, 229, 1283, 2967, 5329, 24339, 58739, 23145, 7033}},
+{16841, 18, 57728, {1, 3, 3, 15, 11, 51, 121, 41, 75, 845, 1771, 3625, 6137, 3463, 11767, 45181, 70907, 42771}},
+{16842, 18, 57740, {1, 3, 7, 9, 15, 25, 55, 219, 265, 655, 167, 1247, 5409, 5623, 21045, 12333, 25799, 218601}},
+{16843, 18, 57745, {1, 3, 3, 13, 31, 39, 77, 155, 471, 969, 755, 2745, 3057, 3621, 32423, 48687, 9409, 90997}},
+{16844, 18, 57751, {1, 1, 3, 15, 27, 1, 77, 231, 147, 235, 2027, 4045, 7431, 14655, 6361, 43155, 9839, 161713}},
+{16845, 18, 57774, {1, 3, 7, 5, 25, 19, 25, 75, 415, 931, 457, 3691, 687, 4849, 15469, 42871, 37949, 74163}},
+{16846, 18, 57782, {1, 3, 5, 9, 17, 19, 29, 117, 387, 1021, 1159, 2467, 2585, 2563, 9155, 44763, 93319, 6321}},
+{16847, 18, 57796, {1, 3, 5, 7, 25, 33, 127, 175, 143, 705, 539, 2563, 945, 11369, 19971, 19019, 116195, 84121}},
+{16848, 18, 57803, {1, 3, 7, 7, 5, 55, 29, 1, 419, 715, 1275, 2983, 7853, 12245, 32109, 27371, 123547, 82723}},
+{16849, 18, 57823, {1, 1, 1, 13, 3, 29, 31, 213, 195, 609, 1465, 1711, 6747, 13309, 1131, 3151, 48779, 91571}},
+{16850, 18, 57863, {1, 1, 5, 3, 17, 7, 103, 7, 217, 87, 1641, 833, 4551, 14205, 15119, 6711, 111273, 200545}},
+{16851, 18, 57894, {1, 3, 1, 5, 3, 39, 99, 15, 433, 895, 165, 4049, 3183, 4385, 24695, 40009, 67151, 156643}},
+{16852, 18, 57925, {1, 1, 7, 3, 29, 9, 15, 27, 109, 1019, 327, 2837, 5297, 12455, 2355, 37703, 122995, 177871}},
+{16853, 18, 57971, {1, 1, 5, 15, 29, 5, 121, 117, 31, 155, 1027, 1105, 8057, 8677, 9523, 3019, 98801, 15539}},
+{16854, 18, 58013, {1, 3, 7, 3, 1, 1, 37, 67, 471, 317, 1571, 2801, 7383, 4339, 8095, 45685, 95885, 39577}},
+{16855, 18, 58020, {1, 3, 7, 13, 17, 13, 91, 79, 49, 321, 1235, 311, 129, 6537, 6643, 25813, 48251, 138823}},
+{16856, 18, 58032, {1, 1, 5, 3, 21, 19, 67, 61, 153, 611, 1819, 3755, 5959, 3419, 6117, 1159, 68925, 146199}},
+{16857, 18, 58038, {1, 1, 7, 9, 23, 3, 7, 13, 429, 463, 653, 3461, 6337, 4511, 18097, 44837, 99845, 37101}},
+{16858, 18, 58061, {1, 3, 5, 13, 9, 5, 123, 199, 83, 409, 1391, 1567, 7327, 8173, 30971, 18241, 7755, 185375}},
+{16859, 18, 58069, {1, 3, 1, 7, 19, 51, 51, 23, 85, 923, 1969, 2329, 7343, 12489, 16135, 64783, 117063, 141071}},
+{16860, 18, 58080, {1, 3, 1, 3, 23, 29, 5, 77, 207, 351, 367, 2097, 2639, 9255, 21971, 64167, 98069, 81153}},
+{16861, 18, 58089, {1, 1, 7, 15, 27, 1, 83, 255, 47, 935, 567, 3573, 3629, 5833, 483, 1001, 9337, 119847}},
+{16862, 18, 58107, {1, 3, 7, 11, 31, 53, 25, 35, 463, 51, 401, 3279, 7709, 11265, 17905, 40423, 26277, 43355}},
+{16863, 18, 58121, {1, 1, 7, 5, 9, 15, 73, 217, 239, 405, 1651, 2131, 6791, 11241, 21717, 7393, 77251, 28131}},
+{16864, 18, 58130, {1, 3, 5, 3, 13, 43, 115, 159, 215, 811, 1349, 2941, 2073, 1821, 6891, 17285, 72027, 137849}},
+{16865, 18, 58146, {1, 3, 3, 3, 15, 11, 29, 53, 307, 409, 1069, 3713, 3205, 6185, 2565, 14973, 46149, 162527}},
+{16866, 18, 58190, {1, 1, 3, 15, 21, 39, 61, 209, 211, 123, 697, 2285, 859, 2501, 5847, 56449, 106575, 261069}},
+{16867, 18, 58195, {1, 3, 3, 5, 25, 21, 39, 131, 189, 747, 1499, 1865, 3369, 9161, 12543, 63155, 70083, 69441}},
+{16868, 18, 58202, {1, 3, 1, 15, 31, 43, 127, 57, 169, 109, 979, 1399, 3065, 5865, 16891, 56003, 14319, 94109}},
+{16869, 18, 58237, {1, 1, 1, 13, 23, 57, 13, 239, 139, 41, 1959, 429, 209, 543, 21297, 15343, 16521, 52305}},
+{16870, 18, 58253, {1, 1, 7, 1, 17, 1, 115, 139, 93, 123, 867, 3257, 8135, 12089, 1503, 33287, 79283, 151419}},
+{16871, 18, 58299, {1, 3, 7, 7, 27, 17, 15, 253, 89, 959, 597, 2193, 3505, 13865, 2179, 58711, 114615, 15227}},
+{16872, 18, 58302, {1, 3, 7, 5, 1, 5, 105, 241, 361, 229, 1069, 3815, 1409, 4909, 31785, 46555, 123523, 53259}},
+{16873, 18, 58327, {1, 1, 5, 5, 15, 49, 13, 195, 467, 285, 1405, 3011, 2069, 8331, 13953, 31107, 46581, 154615}},
+{16874, 18, 58328, {1, 3, 5, 7, 21, 23, 17, 17, 345, 369, 1521, 3755, 2165, 15387, 2851, 11115, 60483, 236049}},
+{16875, 18, 58364, {1, 3, 3, 1, 5, 41, 53, 239, 127, 237, 609, 927, 3787, 5059, 1865, 52991, 56229, 102093}},
+{16876, 18, 58367, {1, 1, 7, 5, 23, 7, 15, 199, 325, 695, 1525, 3435, 3997, 11577, 22985, 57713, 94309, 218433}},
+{16877, 18, 58375, {1, 3, 3, 5, 25, 25, 61, 99, 237, 447, 1905, 783, 5239, 11415, 16833, 27815, 115539, 161111}},
+{16878, 18, 58394, {1, 1, 5, 9, 31, 49, 55, 199, 159, 751, 849, 1045, 5485, 8883, 8549, 11735, 35983, 161067}},
+{16879, 18, 58405, {1, 1, 5, 9, 23, 51, 79, 171, 87, 493, 1911, 3867, 3435, 493, 16639, 64085, 97797, 244959}},
+{16880, 18, 58417, {1, 1, 5, 11, 29, 33, 15, 107, 283, 545, 1995, 995, 7181, 3581, 8621, 42391, 117997, 397}},
+{16881, 18, 58424, {1, 3, 7, 13, 31, 25, 91, 75, 123, 451, 1023, 375, 4505, 13235, 8913, 34389, 77385, 168659}},
+{16882, 18, 58430, {1, 1, 3, 3, 3, 3, 85, 143, 173, 709, 1313, 593, 6931, 14609, 13803, 30305, 109089, 11473}},
+{16883, 18, 58452, {1, 3, 7, 5, 25, 45, 25, 223, 407, 597, 83, 2543, 3823, 13959, 9089, 28325, 29237, 57147}},
+{16884, 18, 58466, {1, 1, 1, 3, 25, 53, 57, 255, 231, 361, 109, 113, 6091, 13043, 28399, 29111, 57987, 137709}},
+{16885, 18, 58468, {1, 1, 1, 5, 11, 25, 53, 141, 275, 237, 1427, 1691, 6043, 8951, 10683, 17477, 117645, 89007}},
+{16886, 18, 58495, {1, 3, 3, 13, 7, 23, 73, 213, 285, 667, 1765, 1545, 1401, 12483, 6349, 47205, 25791, 16749}},
+{16887, 18, 58501, {1, 1, 1, 15, 31, 45, 105, 249, 385, 607, 723, 745, 7037, 15735, 3637, 29013, 127315, 165507}},
+{16888, 18, 58544, {1, 1, 7, 5, 21, 63, 95, 247, 161, 839, 939, 931, 4277, 7363, 8289, 55183, 122413, 152997}},
+{16889, 18, 58571, {1, 3, 7, 11, 15, 59, 91, 5, 209, 31, 1581, 979, 6289, 11443, 26641, 20183, 106907, 128647}},
+{16890, 18, 58609, {1, 1, 3, 15, 21, 33, 117, 89, 457, 405, 1971, 2211, 4379, 16189, 7933, 39351, 79813, 56373}},
+{16891, 18, 58610, {1, 3, 3, 9, 5, 9, 93, 75, 55, 271, 321, 3143, 3893, 2601, 26169, 35179, 43063, 156635}},
+{16892, 18, 58616, {1, 3, 3, 11, 29, 37, 95, 249, 221, 965, 423, 1637, 4663, 14839, 16757, 4261, 128453, 165593}},
+{16893, 18, 58619, {1, 3, 3, 7, 1, 55, 31, 235, 447, 839, 721, 1125, 6503, 4019, 23351, 37057, 96103, 143805}},
+{16894, 18, 58641, {1, 3, 7, 5, 31, 39, 7, 157, 469, 719, 1613, 395, 8133, 9753, 17323, 13849, 45409, 7601}},
+{16895, 18, 58642, {1, 3, 7, 7, 31, 37, 89, 215, 453, 659, 605, 3325, 987, 4611, 29667, 23229, 4201, 229675}},
+{16896, 18, 58648, {1, 1, 5, 5, 3, 3, 21, 249, 377, 343, 1751, 891, 5275, 14853, 32703, 51001, 6759, 162991}},
+{16897, 18, 58660, {1, 3, 1, 13, 11, 21, 55, 17, 495, 481, 1817, 919, 2495, 16367, 3343, 16997, 83437, 127791}},
+{16898, 18, 58675, {1, 3, 1, 1, 5, 57, 65, 223, 33, 491, 1953, 1521, 4903, 5007, 14583, 17321, 82231, 206299}},
+{16899, 18, 58678, {1, 3, 7, 11, 21, 45, 55, 141, 185, 379, 851, 885, 3385, 10311, 701, 2983, 71045, 171525}},
+{16900, 18, 58690, {1, 3, 7, 3, 29, 1, 53, 139, 7, 985, 291, 3949, 1163, 14637, 363, 59679, 121571, 121081}},
+{16901, 18, 58735, {1, 3, 7, 1, 31, 1, 111, 19, 421, 917, 1529, 1361, 4461, 12457, 9791, 19985, 77283, 117059}},
+{16902, 18, 58760, {1, 3, 1, 5, 7, 55, 93, 243, 477, 193, 1983, 489, 3735, 1391, 24035, 36395, 49101, 175861}},
+{16903, 18, 58766, {1, 1, 1, 11, 3, 25, 69, 167, 351, 193, 1299, 617, 7455, 2545, 18359, 9951, 119513, 128139}},
+{16904, 18, 58799, {1, 3, 3, 7, 5, 23, 101, 47, 385, 591, 345, 3501, 531, 3277, 28945, 18695, 58587, 87221}},
+{16905, 18, 58825, {1, 1, 3, 3, 29, 47, 5, 91, 365, 1, 2015, 323, 1601, 10615, 28975, 60263, 4813, 143351}},
+{16906, 18, 58836, {1, 3, 1, 7, 25, 43, 65, 211, 91, 759, 985, 3675, 5701, 4373, 27781, 51949, 40667, 102665}},
+{16907, 18, 58855, {1, 3, 3, 5, 3, 43, 91, 33, 247, 593, 849, 1955, 7769, 2307, 2877, 26037, 28907, 211021}},
+{16908, 18, 58864, {1, 3, 5, 15, 29, 29, 85, 97, 99, 979, 2033, 1415, 2955, 15733, 5567, 6241, 100195, 89077}},
+{16909, 18, 58910, {1, 3, 7, 13, 13, 19, 121, 211, 381, 73, 1131, 1881, 1693, 7873, 27557, 201, 24997, 202471}},
+{16910, 18, 58937, {1, 3, 1, 15, 15, 33, 11, 99, 479, 271, 1873, 1117, 3559, 6605, 15995, 44805, 12465, 71933}},
+{16911, 18, 58943, {1, 3, 5, 3, 19, 61, 15, 55, 423, 431, 1321, 3345, 1633, 4587, 24909, 54985, 31831, 181083}},
+{16912, 18, 58952, {1, 1, 3, 5, 29, 43, 49, 205, 415, 907, 1651, 57, 3043, 10763, 16255, 9567, 59453, 135637}},
+{16913, 18, 58965, {1, 3, 3, 1, 17, 11, 29, 33, 293, 203, 1687, 1565, 6131, 5435, 29023, 28425, 102151, 251913}},
+{16914, 18, 58988, {1, 1, 5, 7, 9, 9, 43, 191, 269, 681, 607, 3045, 2799, 14919, 8083, 57781, 19345, 49365}},
+{16915, 18, 58994, {1, 1, 5, 13, 11, 53, 67, 127, 117, 395, 575, 1651, 2601, 15019, 21413, 34433, 66847, 84159}},
+{16916, 18, 58999, {1, 3, 5, 5, 15, 59, 33, 41, 301, 699, 1479, 2285, 1813, 2459, 4775, 53213, 26039, 223155}},
+{16917, 18, 59006, {1, 3, 1, 15, 17, 57, 5, 211, 357, 175, 945, 3625, 3943, 12871, 26805, 29305, 8839, 107837}},
+{16918, 18, 59029, {1, 3, 5, 15, 21, 41, 105, 229, 265, 777, 2047, 767, 2901, 8873, 7631, 18545, 86697, 252965}},
+{16919, 18, 59033, {1, 1, 5, 11, 31, 63, 115, 119, 271, 921, 1221, 3341, 6083, 4293, 28581, 57323, 33889, 112577}},
+{16920, 18, 59069, {1, 1, 5, 5, 31, 21, 119, 93, 287, 139, 451, 2535, 3925, 10671, 21279, 55071, 76127, 248203}},
+{16921, 18, 59096, {1, 3, 7, 11, 19, 61, 61, 53, 203, 181, 963, 3581, 519, 14679, 7717, 31981, 128709, 197269}},
+{16922, 18, 59106, {1, 1, 1, 13, 25, 23, 89, 95, 221, 803, 1433, 3617, 3217, 2033, 7859, 14279, 107239, 5139}},
+{16923, 18, 59123, {1, 3, 7, 3, 29, 41, 87, 21, 71, 959, 1149, 2961, 7471, 11665, 16037, 5791, 110155, 35365}},
+{16924, 18, 59130, {1, 1, 1, 11, 21, 49, 101, 45, 311, 529, 1301, 1377, 983, 3937, 6967, 8413, 33511, 9617}},
+{16925, 18, 59152, {1, 3, 3, 5, 15, 41, 107, 49, 409, 537, 289, 3351, 5307, 16221, 907, 39847, 61579, 161487}},
+{16926, 18, 59162, {1, 1, 3, 11, 5, 49, 71, 107, 431, 469, 453, 1367, 7811, 10485, 3861, 62797, 82025, 253785}},
+{16927, 18, 59180, {1, 1, 3, 3, 27, 19, 89, 13, 445, 915, 1259, 1423, 3987, 3661, 18183, 18521, 18831, 191447}},
+{16928, 18, 59183, {1, 1, 7, 5, 13, 15, 9, 89, 129, 949, 1733, 245, 6815, 8477, 1273, 34737, 33027, 191415}},
+{16929, 18, 59195, {1, 1, 7, 15, 25, 63, 83, 195, 319, 987, 1395, 3559, 6287, 5139, 25967, 48711, 58467, 110983}},
+{16930, 18, 59205, {1, 1, 3, 9, 5, 3, 35, 171, 15, 883, 915, 2451, 871, 11741, 32715, 33475, 81711, 259157}},
+{16931, 18, 59210, {1, 1, 7, 13, 23, 63, 33, 11, 117, 351, 1701, 671, 6753, 5, 9477, 54701, 65507, 242621}},
+{16932, 18, 59217, {1, 3, 7, 11, 21, 37, 127, 143, 369, 819, 1369, 93, 7009, 3773, 30153, 30181, 120783, 137857}},
+{16933, 18, 59218, {1, 3, 3, 7, 27, 61, 15, 141, 67, 815, 1449, 1129, 4703, 3811, 3067, 61697, 8881, 110957}},
+{16934, 18, 59236, {1, 1, 7, 13, 31, 21, 59, 75, 335, 851, 503, 251, 4869, 11789, 30871, 14641, 19319, 156843}},
+{16935, 18, 59267, {1, 3, 5, 5, 9, 41, 11, 67, 231, 945, 37, 2925, 5723, 9053, 13477, 59735, 75181, 60335}},
+{16936, 18, 59298, {1, 1, 5, 1, 13, 39, 81, 43, 363, 611, 1661, 3833, 7387, 10531, 21319, 55579, 102705, 103009}},
+{16937, 18, 59318, {1, 3, 1, 7, 23, 25, 67, 179, 327, 401, 1693, 1453, 4773, 6363, 27169, 49747, 29055, 49145}},
+{16938, 18, 59321, {1, 3, 5, 7, 13, 47, 5, 175, 369, 921, 507, 113, 6069, 10919, 11099, 19795, 95819, 52419}},
+{16939, 18, 59327, {1, 1, 1, 5, 5, 53, 93, 47, 75, 837, 109, 3691, 6961, 10715, 14269, 63791, 1941, 136899}},
+{16940, 18, 59354, {1, 1, 1, 3, 1, 63, 57, 117, 157, 327, 879, 2411, 3987, 15393, 8503, 29829, 77795, 121307}},
+{16941, 18, 59363, {1, 3, 5, 1, 25, 5, 47, 45, 433, 121, 607, 1233, 6433, 3031, 16369, 58589, 79357, 151353}},
+{16942, 18, 59377, {1, 1, 1, 1, 9, 15, 77, 163, 225, 445, 1479, 1267, 2571, 2661, 21489, 5433, 123969, 191967}},
+{16943, 18, 59389, {1, 1, 7, 1, 9, 49, 17, 19, 449, 113, 1289, 2335, 3309, 2595, 17819, 18481, 86605, 125911}},
+{16944, 18, 59403, {1, 1, 5, 11, 11, 23, 65, 147, 257, 625, 1901, 913, 5711, 8159, 16237, 25133, 100059, 11395}},
+{16945, 18, 59420, {1, 3, 7, 13, 5, 33, 89, 189, 171, 185, 751, 2915, 5025, 15981, 14853, 12229, 52829, 59953}},
+{16946, 18, 59444, {1, 3, 1, 13, 3, 37, 15, 87, 463, 655, 1927, 2705, 1885, 14801, 3491, 52835, 81761, 90273}},
+{16947, 18, 59471, {1, 1, 7, 3, 5, 15, 29, 255, 199, 225, 647, 3215, 6795, 3821, 31763, 31059, 65495, 89981}},
+{16948, 18, 59476, {1, 1, 7, 7, 9, 25, 11, 85, 111, 283, 507, 2077, 2993, 5415, 31785, 16495, 82361, 122105}},
+{16949, 18, 59483, {1, 1, 3, 11, 27, 21, 127, 175, 397, 419, 1115, 2285, 223, 3881, 4187, 53759, 115035, 181647}},
+{16950, 18, 59502, {1, 3, 7, 11, 27, 31, 29, 233, 137, 827, 1009, 3879, 7595, 12989, 27655, 8517, 28083, 214985}},
+{16951, 18, 59509, {1, 3, 5, 9, 25, 23, 85, 191, 475, 445, 621, 1341, 4045, 4299, 24933, 32765, 20219, 86949}},
+{16952, 18, 59538, {1, 3, 1, 5, 25, 35, 121, 33, 199, 405, 163, 3487, 1087, 743, 21989, 47273, 49221, 124831}},
+{16953, 18, 59556, {1, 1, 5, 1, 7, 3, 91, 15, 335, 351, 1311, 777, 4303, 7203, 19465, 9135, 32251, 69805}},
+{16954, 18, 59571, {1, 3, 3, 7, 23, 55, 73, 77, 189, 801, 1877, 1901, 2675, 1015, 3041, 35925, 125903, 126227}},
+{16955, 18, 59592, {1, 3, 3, 1, 1, 23, 105, 75, 435, 743, 651, 1045, 579, 13637, 14821, 62683, 95229, 156475}},
+{16956, 18, 59610, {1, 3, 3, 5, 1, 53, 89, 239, 439, 195, 189, 731, 1805, 15123, 23315, 47737, 29167, 112081}},
+{16957, 18, 59654, {1, 1, 5, 7, 31, 11, 119, 191, 155, 61, 247, 915, 5813, 995, 20093, 23379, 118969, 65001}},
+{16958, 18, 59677, {1, 3, 7, 3, 1, 61, 45, 85, 295, 269, 539, 1787, 6639, 11093, 11303, 18509, 77637, 200743}},
+{16959, 18, 59699, {1, 3, 1, 1, 13, 17, 75, 51, 199, 151, 1529, 1443, 4983, 6723, 6071, 34711, 39159, 5441}},
+{16960, 18, 59716, {1, 3, 3, 3, 31, 15, 91, 125, 261, 683, 1769, 1697, 2761, 11373, 13607, 24933, 19079, 55497}},
+{16961, 18, 59719, {1, 1, 1, 15, 21, 49, 117, 99, 29, 969, 463, 3869, 1251, 8815, 16443, 46861, 82839, 233325}},
+{16962, 18, 59737, {1, 3, 5, 3, 27, 39, 89, 225, 161, 63, 61, 2875, 4037, 10413, 5067, 27893, 78825, 250207}},
+{16963, 18, 59747, {1, 1, 1, 9, 13, 49, 93, 11, 23, 25, 2003, 57, 3065, 11241, 13935, 2969, 44235, 39287}},
+{16964, 18, 59789, {1, 3, 3, 9, 21, 5, 55, 247, 193, 523, 575, 1235, 3277, 5253, 5293, 7919, 7573, 168809}},
+{16965, 18, 59807, {1, 3, 1, 13, 29, 39, 43, 21, 511, 205, 303, 703, 3861, 2467, 3909, 31597, 51081, 9863}},
+{16966, 18, 59811, {1, 3, 7, 1, 25, 55, 11, 131, 5, 49, 371, 1683, 1907, 5661, 1015, 15171, 101477, 11221}},
+{16967, 18, 59818, {1, 3, 5, 5, 9, 15, 93, 245, 357, 703, 701, 3675, 4527, 9225, 16137, 55433, 81887, 99153}},
+{16968, 18, 59825, {1, 1, 3, 3, 11, 1, 39, 251, 291, 599, 643, 231, 4031, 7055, 99, 14039, 81811, 184251}},
+{16969, 18, 59826, {1, 3, 5, 13, 29, 55, 11, 117, 325, 401, 2013, 3235, 995, 9255, 2741, 8211, 71451, 180619}},
+{16970, 18, 59832, {1, 1, 1, 5, 31, 41, 41, 175, 247, 3, 739, 1391, 3311, 5975, 16921, 4291, 75065, 161745}},
+{16971, 18, 59858, {1, 1, 7, 13, 23, 19, 13, 149, 203, 351, 2033, 1867, 3871, 14437, 3793, 17399, 99577, 171605}},
+{16972, 18, 59860, {1, 1, 5, 11, 7, 9, 1, 195, 261, 977, 315, 3771, 1179, 16281, 20747, 56309, 108609, 209205}},
+{16973, 18, 59873, {1, 3, 3, 5, 19, 15, 123, 153, 325, 601, 393, 753, 93, 4803, 24343, 42645, 128209, 45773}},
+{16974, 18, 59876, {1, 3, 1, 13, 3, 29, 97, 95, 115, 539, 155, 2789, 1277, 13127, 20383, 52807, 97295, 54589}},
+{16975, 18, 59907, {1, 1, 1, 3, 25, 59, 27, 149, 365, 317, 773, 3379, 5931, 14637, 19881, 37283, 118027, 21557}},
+{16976, 18, 59928, {1, 3, 5, 3, 25, 11, 101, 221, 199, 689, 515, 2255, 6107, 6259, 2853, 19039, 117089, 107181}},
+{16977, 18, 59933, {1, 3, 5, 7, 29, 63, 19, 113, 249, 147, 737, 3959, 209, 7001, 24263, 20443, 99923, 145709}},
+{16978, 18, 59938, {1, 1, 5, 9, 25, 37, 69, 41, 87, 369, 1913, 2255, 7581, 5301, 25751, 24981, 1183, 171969}},
+{16979, 18, 59940, {1, 3, 3, 1, 9, 25, 55, 5, 267, 295, 43, 819, 4569, 7065, 31527, 57811, 48721, 107707}},
+{16980, 18, 59958, {1, 1, 7, 9, 19, 19, 1, 199, 371, 1003, 597, 2097, 4071, 6185, 879, 13545, 30033, 120313}},
+{16981, 18, 59984, {1, 1, 1, 7, 9, 11, 51, 155, 309, 493, 899, 3121, 2085, 10541, 21979, 4725, 70381, 69643}},
+{16982, 18, 60020, {1, 1, 1, 1, 13, 45, 123, 119, 459, 295, 1005, 4093, 393, 11063, 27235, 28209, 1671, 215619}},
+{16983, 18, 60024, {1, 1, 7, 13, 19, 25, 125, 255, 509, 529, 1577, 3221, 4051, 7697, 2065, 42597, 86295, 131719}},
+{16984, 18, 60033, {1, 3, 3, 9, 19, 13, 21, 199, 97, 949, 1297, 379, 1801, 13247, 22563, 49517, 22757, 87371}},
+{16985, 18, 60034, {1, 3, 3, 1, 17, 63, 109, 175, 301, 565, 1181, 465, 3457, 7175, 21225, 33149, 122169, 148043}},
+{16986, 18, 60063, {1, 1, 1, 1, 5, 7, 21, 251, 53, 369, 955, 583, 4703, 9729, 15853, 55701, 29317, 27}},
+{16987, 18, 60070, {1, 3, 3, 1, 31, 3, 53, 57, 231, 441, 109, 149, 8107, 2303, 29729, 42279, 46909, 209877}},
+{16988, 18, 60087, {1, 1, 1, 11, 23, 57, 63, 189, 259, 657, 1653, 1155, 2885, 3317, 22559, 3145, 19151, 172507}},
+{16989, 18, 60091, {1, 3, 7, 5, 31, 63, 103, 147, 287, 685, 1197, 99, 4907, 12335, 12001, 20303, 75503, 231259}},
+{16990, 18, 60105, {1, 3, 3, 13, 15, 33, 63, 11, 99, 299, 97, 2669, 3635, 9969, 1525, 36555, 85215, 86915}},
+{16991, 18, 60126, {1, 3, 7, 5, 25, 47, 25, 61, 227, 939, 1719, 245, 2389, 14663, 30671, 22667, 38873, 245509}},
+{16992, 18, 60132, {1, 1, 3, 5, 25, 15, 105, 203, 57, 961, 1941, 1241, 3163, 6203, 19631, 10383, 19235, 57569}},
+{16993, 18, 60154, {1, 1, 3, 9, 1, 35, 41, 3, 449, 87, 641, 269, 1529, 14559, 16571, 4863, 21625, 921}},
+{16994, 18, 60174, {1, 1, 7, 11, 25, 53, 85, 209, 181, 417, 1657, 2117, 4581, 7069, 15533, 64475, 82381, 146943}},
+{16995, 18, 60181, {1, 3, 1, 7, 17, 53, 5, 199, 347, 887, 1041, 595, 1843, 10931, 30559, 42849, 73723, 220473}},
+{16996, 18, 60198, {1, 3, 7, 7, 21, 53, 105, 21, 141, 575, 1965, 2187, 7293, 13675, 2471, 1259, 42485, 62911}},
+{16997, 18, 60212, {1, 1, 3, 9, 5, 27, 21, 101, 101, 71, 1215, 3235, 2451, 14835, 27817, 30079, 124301, 253691}},
+{16998, 18, 60247, {1, 1, 7, 1, 11, 37, 105, 127, 115, 157, 279, 2425, 2139, 131, 22717, 40803, 74867, 86021}},
+{16999, 18, 60254, {1, 1, 1, 7, 11, 59, 95, 61, 255, 523, 501, 2895, 7531, 8151, 18393, 42069, 120809, 236537}},
+{17000, 18, 60275, {1, 1, 1, 7, 17, 23, 31, 59, 377, 187, 873, 1565, 3459, 2975, 11633, 13247, 13095, 193803}},
+{17001, 18, 60284, {1, 3, 7, 1, 25, 3, 85, 5, 485, 451, 1385, 1663, 4825, 14019, 29437, 33717, 105343, 161335}},
+{17002, 18, 60317, {1, 1, 1, 3, 27, 43, 71, 167, 425, 579, 1739, 3557, 7403, 2023, 6533, 61177, 119273, 85229}},
+{17003, 18, 60318, {1, 1, 7, 3, 31, 37, 19, 213, 373, 505, 97, 3669, 7005, 2205, 26519, 61999, 18395, 25967}},
+{17004, 18, 60346, {1, 3, 3, 7, 29, 17, 9, 137, 265, 875, 887, 3029, 3295, 11619, 8357, 46241, 23543, 43191}},
+{17005, 18, 60360, {1, 1, 5, 1, 25, 43, 33, 133, 65, 7, 1581, 3577, 5997, 6129, 30649, 18923, 56459, 227869}},
+{17006, 18, 60380, {1, 1, 5, 13, 27, 45, 27, 111, 429, 565, 1449, 1475, 6613, 4469, 16083, 42349, 66843, 214875}},
+{17007, 18, 60389, {1, 3, 1, 1, 21, 21, 107, 7, 15, 675, 233, 4021, 1097, 1393, 6445, 3323, 102435, 249355}},
+{17008, 18, 60393, {1, 1, 5, 15, 17, 51, 99, 249, 437, 667, 1921, 2371, 3813, 10543, 19, 39079, 116825, 242821}},
+{17009, 18, 60401, {1, 1, 1, 1, 7, 15, 27, 29, 161, 37, 1847, 287, 4379, 1399, 24547, 60361, 68131, 232883}},
+{17010, 18, 60407, {1, 1, 3, 9, 17, 21, 41, 169, 61, 771, 241, 1435, 4151, 1789, 12195, 27239, 62371, 165145}},
+{17011, 18, 60408, {1, 3, 5, 15, 31, 19, 127, 181, 463, 183, 749, 253, 2403, 1363, 3965, 7953, 124025, 226691}},
+{17012, 18, 60462, {1, 1, 3, 7, 17, 57, 85, 89, 17, 33, 819, 2191, 1525, 15651, 23483, 26027, 86379, 40191}},
+{17013, 18, 60484, {1, 1, 5, 1, 9, 45, 65, 65, 359, 5, 531, 2581, 6313, 13219, 6005, 36215, 16275, 208253}},
+{17014, 18, 60505, {1, 3, 1, 1, 23, 15, 51, 43, 85, 461, 773, 219, 2681, 3377, 9797, 54469, 112871, 231533}},
+{17015, 18, 60521, {1, 3, 7, 7, 15, 9, 97, 115, 301, 493, 1085, 2021, 2305, 15003, 11381, 9339, 63015, 179115}},
+{17016, 18, 60527, {1, 3, 5, 3, 3, 61, 111, 103, 283, 7, 143, 353, 7815, 7901, 25795, 7577, 92991, 228315}},
+{17017, 18, 60532, {1, 1, 7, 13, 29, 3, 53, 105, 83, 531, 497, 729, 1375, 7063, 18655, 35219, 9671, 102913}},
+{17018, 18, 60545, {1, 1, 5, 15, 11, 7, 65, 31, 15, 921, 743, 1469, 5669, 5437, 20019, 28123, 5717, 6181}},
+{17019, 18, 60546, {1, 3, 3, 15, 19, 1, 3, 183, 315, 595, 1033, 3259, 7815, 8281, 32103, 8699, 59149, 56657}},
+{17020, 18, 60555, {1, 1, 1, 7, 9, 1, 87, 81, 267, 637, 1617, 2113, 487, 23, 11213, 29211, 92715, 177767}},
+{17021, 18, 60563, {1, 3, 5, 13, 29, 37, 31, 55, 343, 759, 813, 2945, 7189, 4821, 30661, 38373, 2793, 98683}},
+{17022, 18, 60586, {1, 3, 5, 7, 9, 43, 113, 145, 103, 303, 1065, 3781, 3527, 9449, 17355, 38301, 74859, 30735}},
+{17023, 18, 60626, {1, 1, 1, 1, 3, 53, 53, 27, 119, 701, 1777, 3959, 5911, 8473, 24997, 17557, 11593, 201381}},
+{17024, 18, 60637, {1, 3, 3, 9, 3, 3, 107, 115, 423, 531, 735, 931, 8053, 4661, 1919, 29551, 62515, 210255}},
+{17025, 18, 60665, {1, 1, 3, 9, 21, 21, 117, 67, 301, 49, 2025, 781, 7951, 15719, 27287, 34551, 115241, 243981}},
+{17026, 18, 60673, {1, 1, 7, 9, 9, 25, 87, 229, 375, 353, 445, 3169, 1865, 7305, 11175, 47081, 28609, 107301}},
+{17027, 18, 60685, {1, 3, 3, 11, 7, 31, 19, 177, 17, 535, 1353, 2587, 7723, 8039, 13607, 5017, 104937, 207761}},
+{17028, 18, 60703, {1, 1, 5, 3, 11, 27, 29, 193, 235, 435, 1451, 3487, 5749, 4825, 9487, 53933, 92061, 223305}},
+{17029, 18, 60734, {1, 3, 3, 3, 5, 5, 99, 237, 91, 945, 1373, 3303, 3079, 5345, 6843, 34131, 62851, 259561}},
+{17030, 18, 60742, {1, 1, 3, 7, 7, 25, 11, 27, 329, 37, 307, 771, 659, 13045, 25767, 18887, 54407, 251313}},
+{17031, 18, 60790, {1, 1, 1, 11, 29, 59, 37, 121, 281, 55, 495, 159, 3925, 4447, 14825, 24831, 103147, 211951}},
+{17032, 18, 60830, {1, 3, 3, 7, 23, 31, 59, 67, 303, 383, 1179, 2347, 4001, 14797, 14579, 55365, 112239, 65309}},
+{17033, 18, 60848, {1, 3, 3, 9, 15, 17, 61, 123, 339, 319, 765, 1517, 1269, 69, 9065, 32347, 21377, 38449}},
+{17034, 18, 60857, {1, 3, 5, 3, 7, 35, 71, 63, 251, 457, 351, 385, 4041, 11489, 14511, 11875, 45307, 205041}},
+{17035, 18, 60871, {1, 1, 1, 7, 1, 25, 115, 195, 41, 1001, 835, 767, 7991, 7475, 22397, 36899, 77255, 194827}},
+{17036, 18, 60875, {1, 3, 3, 11, 7, 49, 45, 13, 373, 167, 741, 2569, 3781, 1131, 2909, 40387, 77877, 201859}},
+{17037, 18, 60913, {1, 3, 5, 3, 17, 11, 123, 137, 65, 835, 1385, 1157, 7387, 12301, 5759, 13137, 30595, 50923}},
+{17038, 18, 60923, {1, 1, 5, 7, 1, 55, 57, 97, 377, 223, 115, 2515, 2565, 14965, 10485, 23957, 108239, 160707}},
+{17039, 18, 60972, {1, 3, 1, 9, 15, 17, 81, 65, 387, 275, 997, 1485, 4129, 999, 4915, 55867, 103799, 191829}},
+{17040, 18, 60989, {1, 1, 1, 5, 15, 5, 35, 167, 249, 419, 267, 503, 469, 3163, 19939, 65501, 88573, 11621}},
+{17041, 18, 61001, {1, 3, 3, 13, 7, 9, 101, 125, 371, 97, 1855, 1755, 4103, 12283, 18655, 5965, 17743, 254779}},
+{17042, 18, 61002, {1, 1, 3, 7, 13, 15, 119, 227, 451, 863, 1005, 491, 6515, 717, 12783, 14161, 106249, 185297}},
+{17043, 18, 61019, {1, 1, 7, 13, 17, 23, 95, 143, 133, 219, 897, 2291, 7469, 923, 22323, 60583, 2457, 197231}},
+{17044, 18, 61022, {1, 1, 1, 11, 3, 25, 115, 187, 319, 999, 867, 1725, 6969, 239, 2527, 55283, 91099, 252153}},
+{17045, 18, 61059, {1, 1, 7, 9, 3, 37, 107, 25, 425, 95, 631, 2831, 1265, 11509, 18865, 39791, 22281, 220517}},
+{17046, 18, 61065, {1, 3, 5, 1, 1, 47, 121, 173, 489, 241, 3, 3707, 7081, 5341, 23143, 7321, 30605, 191665}},
+{17047, 18, 61066, {1, 1, 7, 7, 7, 27, 23, 43, 145, 11, 1155, 691, 6993, 9509, 5991, 40705, 58215, 202915}},
+{17048, 18, 61071, {1, 3, 5, 1, 31, 1, 7, 189, 379, 431, 417, 3843, 3885, 3263, 16333, 58123, 68307, 33795}},
+{17049, 18, 61076, {1, 1, 5, 5, 19, 27, 19, 217, 509, 535, 287, 1637, 4829, 2665, 15393, 35185, 125335, 10909}},
+{17050, 18, 61141, {1, 3, 5, 7, 25, 13, 67, 243, 255, 1021, 1203, 821, 7811, 149, 26731, 12913, 18171, 101385}},
+{17051, 18, 61148, {1, 1, 1, 3, 25, 61, 59, 207, 449, 789, 1831, 1731, 513, 10099, 291, 1963, 100233, 21847}},
+{17052, 18, 61167, {1, 1, 7, 1, 27, 19, 45, 81, 479, 31, 707, 2669, 3589, 15411, 12089, 38235, 60897, 135451}},
+{17053, 18, 61190, {1, 3, 5, 15, 11, 3, 113, 169, 171, 21, 1291, 2031, 2023, 5783, 6137, 54637, 50247, 233753}},
+{17054, 18, 61218, {1, 1, 5, 1, 11, 13, 73, 97, 269, 801, 1015, 1329, 1779, 15225, 24251, 35191, 8619, 130993}},
+{17055, 18, 61247, {1, 1, 7, 9, 9, 19, 35, 255, 505, 513, 547, 405, 3065, 4965, 30877, 50091, 81319, 29273}},
+{17056, 18, 61256, {1, 1, 1, 9, 7, 61, 45, 75, 343, 911, 1683, 453, 1225, 10939, 19901, 63685, 123507, 252027}},
+{17057, 18, 61289, {1, 1, 5, 11, 21, 55, 37, 161, 143, 463, 1937, 3349, 2953, 14827, 7893, 26581, 128459, 72325}},
+{17058, 18, 61292, {1, 3, 5, 9, 31, 57, 115, 77, 225, 859, 621, 731, 5677, 759, 20773, 52285, 65555, 4303}},
+{17059, 18, 61307, {1, 1, 3, 15, 23, 15, 49, 171, 137, 449, 855, 565, 5579, 5957, 13643, 8979, 90327, 116349}},
+{17060, 18, 61319, {1, 1, 3, 5, 9, 13, 27, 43, 391, 595, 731, 101, 7121, 13555, 29181, 38273, 42309, 175297}},
+{17061, 18, 61353, {1, 1, 3, 11, 3, 59, 17, 143, 251, 47, 1391, 1297, 23, 15871, 13153, 44081, 65423, 54875}},
+{17062, 18, 61362, {1, 3, 7, 11, 25, 43, 3, 163, 273, 277, 755, 2743, 5909, 10841, 31331, 64131, 13945, 91557}},
+{17063, 18, 61379, {1, 3, 1, 13, 31, 35, 5, 165, 417, 623, 1083, 1221, 1051, 8917, 6725, 11385, 76315, 119837}},
+{17064, 18, 61382, {1, 1, 5, 3, 21, 53, 47, 247, 471, 877, 709, 2425, 3, 1963, 24331, 52151, 98859, 119033}},
+{17065, 18, 61433, {1, 1, 7, 3, 29, 29, 43, 59, 503, 891, 763, 2927, 1613, 9091, 10393, 36003, 61147, 3437}},
+{17066, 18, 61434, {1, 1, 5, 15, 27, 59, 73, 163, 425, 855, 349, 3451, 5779, 10523, 9103, 46477, 129873, 39091}},
+{17067, 18, 61454, {1, 3, 7, 15, 25, 45, 77, 171, 467, 1017, 1553, 1877, 5507, 3909, 12157, 60441, 98261, 37781}},
+{17068, 18, 61461, {1, 1, 7, 13, 13, 39, 99, 51, 197, 327, 1101, 2679, 8025, 11853, 7763, 62537, 96999, 88673}},
+{17069, 18, 61475, {1, 3, 1, 11, 5, 61, 29, 219, 471, 387, 319, 433, 5383, 3933, 27603, 61171, 104711, 233295}},
+{17070, 18, 61481, {1, 3, 5, 11, 15, 23, 91, 119, 207, 717, 1333, 783, 437, 13073, 10923, 27049, 87233, 174899}},
+{17071, 18, 61534, {1, 1, 1, 1, 13, 19, 109, 139, 183, 299, 1023, 3265, 5153, 6307, 27879, 55311, 95201, 19481}},
+{17072, 18, 61547, {1, 1, 5, 11, 13, 61, 81, 115, 53, 483, 693, 3527, 5033, 8527, 31345, 46155, 12403, 126815}},
+{17073, 18, 61564, {1, 3, 7, 3, 27, 7, 73, 227, 269, 683, 719, 763, 5417, 9523, 13625, 6945, 116225, 223093}},
+{17074, 18, 61568, {1, 3, 5, 9, 21, 51, 111, 157, 451, 247, 1375, 1631, 2783, 3371, 22713, 34153, 41949, 141351}},
+{17075, 18, 61588, {1, 1, 5, 1, 21, 19, 45, 69, 41, 453, 523, 3163, 7351, 4467, 18865, 35371, 129577, 78039}},
+{17076, 18, 61604, {1, 3, 5, 1, 29, 33, 13, 19, 341, 321, 117, 1187, 7021, 5785, 5553, 58055, 113557, 46957}},
+{17077, 18, 61626, {1, 1, 5, 5, 13, 59, 47, 59, 69, 125, 1491, 2813, 5005, 5973, 3145, 27579, 7763, 129949}},
+{17078, 18, 61645, {1, 1, 7, 11, 11, 7, 117, 235, 407, 749, 1925, 1735, 4499, 13027, 19355, 1981, 105657, 242853}},
+{17079, 18, 61646, {1, 1, 7, 1, 15, 19, 5, 247, 203, 707, 809, 2085, 5801, 9947, 569, 9883, 109861, 156751}},
+{17080, 18, 61654, {1, 3, 5, 3, 13, 59, 67, 181, 261, 873, 1589, 2249, 7213, 14625, 28403, 41101, 73439, 46873}},
+{17081, 18, 61663, {1, 1, 5, 7, 3, 63, 79, 115, 123, 485, 1373, 3781, 4315, 4627, 29003, 64101, 67521, 184053}},
+{17082, 18, 61669, {1, 1, 3, 9, 11, 57, 93, 243, 505, 189, 449, 643, 5267, 7447, 32265, 44095, 63015, 36905}},
+{17083, 18, 61702, {1, 3, 7, 13, 25, 59, 31, 93, 401, 41, 183, 759, 2473, 8705, 8211, 13543, 59749, 235217}},
+{17084, 18, 61705, {1, 1, 5, 5, 29, 3, 65, 133, 325, 239, 649, 3225, 4095, 11691, 4479, 15419, 100551, 261981}},
+{17085, 18, 61714, {1, 3, 7, 1, 17, 11, 63, 97, 431, 161, 1437, 3679, 1643, 10583, 20731, 45919, 94093, 147067}},
+{17086, 18, 61739, {1, 1, 7, 1, 25, 13, 63, 155, 221, 345, 189, 1199, 5465, 14767, 26263, 54093, 23697, 71231}},
+{17087, 18, 61744, {1, 1, 7, 3, 3, 19, 23, 75, 381, 339, 1989, 1137, 6449, 1437, 32279, 17195, 117423, 259311}},
+{17088, 18, 61749, {1, 3, 5, 3, 27, 45, 117, 113, 129, 585, 2019, 807, 5573, 7407, 9957, 8741, 52333, 115607}},
+{17089, 18, 61776, {1, 1, 3, 7, 9, 5, 77, 9, 417, 725, 429, 1657, 5445, 1901, 28745, 26807, 111743, 169739}},
+{17090, 18, 61786, {1, 3, 1, 5, 7, 63, 51, 183, 117, 383, 435, 755, 7849, 5997, 32697, 5789, 5189, 80645}},
+{17091, 18, 61822, {1, 1, 3, 15, 5, 47, 105, 175, 41, 275, 1441, 3183, 3651, 9561, 5749, 20431, 45969, 59473}},
+{17092, 18, 61826, {1, 1, 1, 11, 13, 35, 19, 129, 125, 35, 339, 3099, 5337, 15605, 10213, 1171, 61869, 216681}},
+{17093, 18, 61862, {1, 3, 7, 1, 7, 25, 23, 9, 431, 73, 1803, 3969, 7853, 12845, 8075, 14553, 124825, 50561}},
+{17094, 18, 61865, {1, 1, 1, 7, 29, 21, 79, 247, 313, 143, 59, 2689, 5643, 827, 26597, 56423, 107903, 180809}},
+{17095, 18, 61868, {1, 3, 7, 1, 3, 3, 25, 39, 269, 529, 67, 3703, 2163, 12417, 6307, 29883, 40303, 171831}},
+{17096, 18, 61879, {1, 3, 7, 13, 1, 19, 71, 245, 267, 105, 749, 1203, 7953, 1881, 9273, 4629, 71793, 195393}},
+{17097, 18, 61885, {1, 1, 1, 15, 3, 49, 53, 145, 47, 959, 1107, 1361, 4517, 16055, 32119, 58433, 110123, 81487}},
+{17098, 18, 61900, {1, 3, 1, 1, 5, 3, 99, 93, 257, 659, 19, 3789, 203, 6183, 11571, 54845, 80591, 243303}},
+{17099, 18, 61905, {1, 3, 7, 1, 1, 7, 27, 11, 255, 261, 769, 2877, 6013, 8431, 25669, 43591, 122501, 208947}},
+{17100, 18, 61906, {1, 1, 7, 7, 3, 25, 117, 19, 15, 843, 401, 613, 801, 10579, 129, 12249, 107465, 95953}},
+{17101, 18, 61962, {1, 1, 3, 5, 1, 35, 95, 93, 243, 937, 1543, 3443, 175, 2199, 12521, 2521, 87225, 38631}},
+{17102, 18, 61967, {1, 3, 7, 13, 21, 29, 81, 139, 247, 937, 1835, 3887, 6917, 15709, 20947, 3341, 125521, 247195}},
+{17103, 18, 61972, {1, 1, 5, 11, 31, 19, 111, 215, 191, 347, 1215, 1757, 6751, 3099, 755, 43753, 2813, 159123}},
+{17104, 18, 61976, {1, 3, 3, 3, 31, 5, 35, 87, 293, 581, 1501, 3255, 7041, 5233, 2053, 63403, 37943, 12115}},
+{17105, 18, 62027, {1, 1, 7, 15, 11, 31, 5, 123, 225, 703, 733, 635, 2193, 3059, 30933, 43149, 79409, 106995}},
+{17106, 18, 62048, {1, 3, 1, 7, 11, 21, 45, 135, 99, 883, 85, 3861, 6617, 7169, 29887, 329, 42487, 129001}},
+{17107, 18, 62051, {1, 1, 1, 3, 11, 53, 31, 245, 141, 667, 1615, 3311, 1475, 12785, 3509, 47153, 105747, 141275}},
+{17108, 18, 62066, {1, 1, 3, 15, 7, 15, 55, 13, 465, 707, 1299, 1393, 399, 9229, 4897, 50313, 1275, 131811}},
+{17109, 18, 62081, {1, 1, 3, 15, 5, 57, 43, 19, 335, 929, 459, 327, 5715, 7173, 27643, 535, 46221, 144619}},
+{17110, 18, 62108, {1, 3, 5, 1, 9, 1, 63, 187, 71, 899, 969, 1349, 1553, 15593, 22783, 211, 41643, 163981}},
+{17111, 18, 62178, {1, 1, 1, 13, 3, 63, 35, 37, 311, 253, 1393, 629, 5299, 14837, 15053, 28041, 81541, 149037}},
+{17112, 18, 62189, {1, 3, 3, 11, 13, 45, 17, 165, 497, 751, 635, 2939, 6891, 14877, 32763, 20671, 106845, 258033}},
+{17113, 18, 62224, {1, 1, 3, 11, 21, 7, 3, 247, 243, 219, 1651, 929, 2737, 9507, 31819, 61389, 14593, 137207}},
+{17114, 18, 62229, {1, 1, 7, 5, 15, 33, 31, 29, 467, 75, 523, 1067, 7313, 11715, 26581, 47037, 106385, 199859}},
+{17115, 18, 62282, {1, 3, 1, 7, 19, 59, 35, 35, 3, 899, 799, 1379, 5113, 7653, 17977, 42197, 52397, 179705}},
+{17116, 18, 62318, {1, 1, 7, 5, 13, 13, 67, 157, 181, 633, 21, 3107, 6301, 7523, 23981, 9079, 88875, 195869}},
+{17117, 18, 62320, {1, 3, 7, 9, 7, 9, 115, 49, 293, 691, 1729, 4087, 6353, 963, 12433, 22135, 96383, 127745}},
+{17118, 18, 62329, {1, 3, 7, 7, 21, 5, 43, 247, 89, 275, 1219, 311, 5677, 7161, 13853, 38613, 84935, 223563}},
+{17119, 18, 62341, {1, 3, 1, 5, 29, 61, 17, 235, 127, 979, 973, 1463, 371, 5567, 6949, 34165, 3075, 169347}},
+{17120, 18, 62353, {1, 3, 3, 15, 25, 51, 43, 73, 7, 123, 1761, 1461, 5291, 14271, 19335, 45379, 123469, 190439}},
+{17121, 18, 62359, {1, 3, 3, 13, 19, 57, 25, 161, 351, 703, 819, 753, 3101, 9043, 19179, 22665, 118533, 45817}},
+{17122, 18, 62382, {1, 3, 5, 15, 3, 33, 15, 63, 251, 87, 611, 1187, 2639, 6001, 16135, 27505, 71077, 34101}},
+{17123, 18, 62389, {1, 1, 5, 3, 31, 5, 13, 239, 119, 803, 1881, 3479, 1933, 6421, 21411, 62923, 76851, 211029}},
+{17124, 18, 62396, {1, 3, 1, 11, 13, 59, 13, 77, 87, 343, 1733, 3493, 5937, 15733, 7763, 12839, 68639, 70965}},
+{17125, 18, 62425, {1, 1, 1, 3, 5, 19, 73, 109, 197, 1007, 1369, 623, 3249, 9263, 12463, 37105, 40599, 115323}},
+{17126, 18, 62455, {1, 1, 7, 1, 21, 23, 27, 221, 117, 27, 1811, 837, 7355, 8083, 12657, 34137, 102025, 6511}},
+{17127, 18, 62484, {1, 3, 7, 13, 13, 29, 7, 103, 511, 449, 1443, 775, 3503, 1057, 8809, 48583, 27649, 206219}},
+{17128, 18, 62494, {1, 1, 7, 1, 15, 37, 53, 205, 393, 691, 989, 3493, 7813, 12371, 18125, 62569, 57075, 100625}},
+{17129, 18, 62507, {1, 3, 5, 7, 11, 11, 55, 7, 487, 861, 1589, 1003, 607, 10031, 22481, 41905, 67791, 168167}},
+{17130, 18, 62512, {1, 3, 1, 9, 21, 31, 25, 187, 315, 379, 961, 2721, 3395, 12321, 21693, 56977, 73197, 160023}},
+{17131, 18, 62550, {1, 3, 3, 7, 9, 25, 103, 1, 13, 1021, 1777, 1015, 2269, 2131, 191, 2561, 74755, 27131}},
+{17132, 18, 62577, {1, 1, 3, 13, 21, 29, 97, 153, 499, 207, 719, 585, 8155, 2873, 22073, 45933, 92875, 19205}},
+{17133, 18, 62590, {1, 3, 7, 15, 13, 31, 43, 223, 405, 839, 1241, 2219, 6911, 9469, 24477, 63157, 95503, 128431}},
+{17134, 18, 62599, {1, 3, 5, 15, 5, 11, 79, 129, 235, 171, 289, 1791, 6061, 9107, 13859, 55923, 30197, 111025}},
+{17135, 18, 62617, {1, 1, 7, 11, 13, 23, 51, 139, 219, 467, 1923, 2847, 1977, 1503, 1939, 55579, 65357, 50047}},
+{17136, 18, 62679, {1, 3, 7, 11, 27, 25, 91, 95, 73, 189, 1537, 273, 725, 1215, 15255, 18847, 67419, 162153}},
+{17137, 18, 62702, {1, 3, 3, 11, 3, 63, 49, 131, 219, 285, 819, 2801, 2645, 2943, 15055, 15659, 130641, 82913}},
+{17138, 18, 62745, {1, 1, 3, 7, 17, 19, 37, 59, 391, 1009, 1569, 2569, 2519, 33, 18827, 23277, 94797, 103673}},
+{17139, 18, 62772, {1, 3, 5, 9, 27, 57, 69, 185, 49, 829, 29, 1247, 6129, 14935, 8005, 48343, 55789, 170099}},
+{17140, 18, 62794, {1, 3, 3, 7, 19, 55, 77, 231, 79, 787, 1597, 2701, 4999, 4247, 31849, 7797, 118993, 77871}},
+{17141, 18, 62835, {1, 1, 7, 13, 5, 45, 105, 137, 239, 923, 593, 3227, 3603, 15463, 15533, 55285, 95295, 141951}},
+{17142, 18, 62842, {1, 3, 1, 5, 29, 3, 113, 241, 255, 181, 1933, 2579, 1865, 11083, 8023, 34271, 78603, 240781}},
+{17143, 18, 62847, {1, 1, 3, 7, 17, 21, 123, 75, 305, 485, 9, 3037, 677, 8001, 16803, 25851, 121773, 77729}},
+{17144, 18, 62857, {1, 3, 1, 5, 23, 7, 39, 25, 381, 1003, 361, 995, 1751, 9599, 6399, 9627, 19303, 249899}},
+{17145, 18, 62894, {1, 3, 5, 5, 13, 39, 65, 145, 351, 135, 981, 3657, 4711, 13649, 17253, 46443, 99187, 176683}},
+{17146, 18, 62911, {1, 3, 1, 9, 9, 41, 79, 237, 445, 507, 1947, 2905, 8161, 715, 24499, 62397, 26393, 197221}},
+{17147, 18, 62928, {1, 3, 5, 3, 23, 9, 107, 121, 59, 265, 177, 3495, 391, 4537, 32099, 45217, 128285, 259285}},
+{17148, 18, 62954, {1, 3, 3, 15, 5, 61, 87, 209, 139, 461, 485, 3261, 7425, 6193, 22221, 22145, 93989, 101459}},
+{17149, 18, 62964, {1, 3, 1, 1, 15, 51, 29, 145, 385, 695, 375, 3743, 1387, 15385, 7995, 22993, 64115, 239897}},
+{17150, 18, 62977, {1, 1, 5, 15, 9, 11, 73, 219, 293, 941, 477, 3935, 2717, 9559, 20537, 6935, 39711, 13623}},
+{17151, 18, 62984, {1, 3, 3, 11, 3, 23, 127, 21, 61, 59, 1685, 507, 3883, 6587, 6355, 65407, 54311, 228555}},
+{17152, 18, 63007, {1, 3, 1, 1, 25, 47, 51, 111, 77, 871, 1045, 4017, 7683, 7729, 24155, 3481, 31749, 245155}},
+{17153, 18, 63017, {1, 3, 5, 1, 25, 29, 119, 131, 475, 763, 1639, 1937, 7387, 2307, 24081, 34797, 91785, 52055}},
+{17154, 18, 63058, {1, 1, 5, 1, 29, 19, 119, 111, 119, 751, 1079, 1911, 4085, 8909, 4351, 30037, 37691, 57175}},
+{17155, 18, 63067, {1, 1, 7, 7, 27, 33, 71, 189, 105, 821, 1543, 2939, 3829, 6485, 22235, 7097, 76987, 207121}},
+{17156, 18, 63085, {1, 1, 3, 3, 7, 7, 65, 121, 355, 405, 1019, 1779, 7301, 10609, 25927, 16501, 37287, 133383}},
+{17157, 18, 63150, {1, 1, 3, 11, 31, 57, 109, 197, 165, 711, 271, 653, 5835, 14905, 26065, 52287, 106215, 225075}},
+{17158, 18, 63170, {1, 1, 3, 3, 1, 41, 5, 169, 15, 49, 1311, 2715, 579, 1693, 28001, 17935, 18585, 123531}},
+{17159, 18, 63184, {1, 1, 7, 7, 1, 49, 59, 75, 173, 361, 1947, 2707, 1835, 12025, 24051, 24359, 121841, 215797}},
+{17160, 18, 63210, {1, 1, 5, 13, 7, 49, 15, 181, 409, 1005, 383, 3449, 2987, 13051, 7097, 34571, 55495, 65251}},
+{17161, 18, 63215, {1, 1, 3, 11, 5, 9, 67, 41, 9, 79, 401, 379, 4107, 5231, 519, 47877, 17273, 137479}},
+{17162, 18, 63217, {1, 1, 3, 13, 25, 7, 9, 165, 103, 37, 1369, 933, 1119, 1025, 19767, 25765, 55487, 249709}},
+{17163, 18, 63229, {1, 3, 5, 5, 19, 53, 105, 135, 245, 957, 185, 2901, 1741, 10429, 747, 23365, 49363, 84095}},
+{17164, 18, 63237, {1, 1, 1, 15, 29, 17, 107, 193, 17, 447, 1261, 1935, 5749, 2303, 23287, 59883, 28655, 188055}},
+{17165, 18, 63259, {1, 1, 5, 9, 13, 27, 99, 253, 299, 481, 89, 3041, 1549, 15417, 30495, 2063, 53649, 219883}},
+{17166, 18, 63265, {1, 3, 3, 15, 19, 19, 7, 149, 67, 349, 789, 129, 2783, 2887, 28631, 26001, 62407, 151767}},
+{17167, 18, 63271, {1, 3, 3, 13, 7, 29, 65, 25, 93, 627, 301, 721, 7249, 13295, 19995, 33715, 36441, 157625}},
+{17168, 18, 63286, {1, 1, 1, 3, 29, 63, 85, 27, 507, 543, 1887, 3169, 4239, 4455, 22047, 15369, 48913, 192071}},
+{17169, 18, 63298, {1, 3, 7, 5, 9, 33, 125, 41, 7, 723, 1091, 3311, 8173, 3861, 31507, 42669, 68853, 60043}},
+{17170, 18, 63343, {1, 3, 1, 13, 13, 7, 121, 41, 181, 913, 371, 163, 7061, 8779, 18345, 41915, 1785, 107113}},
+{17171, 18, 63355, {1, 1, 1, 9, 13, 41, 23, 35, 157, 247, 1243, 1101, 5193, 4027, 29917, 44099, 46211, 162059}},
+{17172, 18, 63361, {1, 3, 1, 5, 15, 51, 3, 241, 131, 741, 1885, 2397, 5673, 9097, 9319, 15381, 55655, 207569}},
+{17173, 18, 63362, {1, 1, 3, 15, 25, 15, 69, 55, 435, 727, 1007, 375, 7871, 10437, 11011, 36711, 11269, 105159}},
+{17174, 18, 63379, {1, 3, 3, 13, 17, 1, 101, 189, 295, 185, 1715, 2609, 6767, 11751, 11469, 3951, 80743, 114439}},
+{17175, 18, 63397, {1, 3, 1, 7, 21, 41, 93, 39, 433, 917, 279, 161, 267, 10201, 26583, 30363, 110187, 46501}},
+{17176, 18, 63415, {1, 1, 7, 7, 13, 15, 89, 167, 365, 925, 107, 3537, 6815, 15251, 23149, 61821, 66569, 135353}},
+{17177, 18, 63421, {1, 1, 1, 3, 13, 59, 21, 255, 111, 603, 547, 465, 3001, 16055, 26389, 64301, 112751, 219279}},
+{17178, 18, 63463, {1, 1, 1, 15, 17, 3, 21, 49, 327, 349, 489, 957, 807, 11685, 23975, 34729, 100773, 223551}},
+{17179, 18, 63491, {1, 3, 5, 15, 19, 59, 63, 71, 233, 767, 1789, 3609, 5911, 3405, 7519, 3611, 92015, 126669}},
+{17180, 18, 63527, {1, 1, 1, 11, 7, 31, 79, 57, 115, 763, 1643, 3329, 7209, 1385, 15565, 64353, 60637, 59445}},
+{17181, 18, 63545, {1, 1, 3, 1, 13, 3, 47, 89, 507, 523, 1, 1391, 6973, 7267, 32527, 52631, 20775, 234503}},
+{17182, 18, 63553, {1, 3, 1, 9, 23, 23, 95, 57, 295, 857, 213, 1211, 3503, 3043, 24843, 16149, 118719, 171585}},
+{17183, 18, 63560, {1, 3, 1, 5, 1, 13, 63, 167, 305, 711, 759, 2521, 5051, 9125, 22917, 24647, 100777, 261137}},
+{17184, 18, 63563, {1, 1, 5, 9, 25, 19, 5, 225, 511, 543, 685, 733, 7249, 10447, 11115, 25927, 104327, 92861}},
+{17185, 18, 63566, {1, 3, 1, 7, 15, 7, 15, 83, 379, 461, 943, 317, 7735, 12655, 7549, 6371, 20901, 170331}},
+{17186, 18, 63589, {1, 1, 1, 13, 7, 17, 41, 51, 47, 15, 477, 1203, 819, 1615, 13805, 40147, 3967, 192647}},
+{17187, 18, 63599, {1, 3, 7, 11, 9, 11, 111, 75, 171, 833, 1503, 2325, 7279, 2687, 16499, 11547, 99409, 186429}},
+{17188, 18, 63601, {1, 1, 5, 3, 13, 21, 75, 17, 447, 647, 1309, 2297, 7911, 12093, 16237, 50831, 96123, 134479}},
+{17189, 18, 63608, {1, 1, 5, 15, 19, 29, 35, 255, 291, 437, 85, 2143, 3281, 3629, 29339, 28169, 46561, 236595}},
+{17190, 18, 63620, {1, 3, 7, 1, 31, 57, 125, 109, 317, 461, 681, 1379, 6387, 14971, 8451, 17655, 87619, 51721}},
+{17191, 18, 63654, {1, 3, 7, 1, 23, 33, 45, 149, 43, 465, 997, 601, 693, 6273, 12867, 25885, 81353, 60437}},
+{17192, 18, 63703, {1, 1, 7, 7, 31, 25, 113, 205, 481, 141, 1757, 587, 2981, 7637, 3869, 4151, 69541, 68587}},
+{17193, 18, 63719, {1, 1, 7, 13, 17, 31, 69, 247, 137, 79, 1221, 1693, 3747, 10711, 1671, 31587, 12139, 248585}},
+{17194, 18, 63758, {1, 1, 1, 3, 1, 61, 39, 139, 37, 79, 125, 1145, 7505, 10129, 29209, 52045, 99159, 195553}},
+{17195, 18, 63769, {1, 1, 5, 3, 13, 41, 13, 11, 167, 953, 1961, 3557, 871, 1687, 28479, 10621, 27533, 243519}},
+{17196, 18, 63782, {1, 1, 7, 7, 1, 35, 107, 227, 375, 225, 483, 1239, 7591, 8549, 7351, 62001, 70245, 102795}},
+{17197, 18, 63803, {1, 1, 1, 9, 29, 35, 15, 3, 337, 1017, 1065, 2107, 2457, 9455, 7069, 55081, 57887, 149679}},
+{17198, 18, 63811, {1, 1, 7, 1, 1, 1, 13, 63, 287, 895, 593, 1253, 4717, 10313, 10275, 22143, 59149, 38865}},
+{17199, 18, 63851, {1, 1, 3, 15, 27, 39, 73, 11, 509, 391, 1901, 503, 5523, 6777, 30849, 41301, 35067, 68443}},
+{17200, 18, 63854, {1, 3, 3, 15, 17, 57, 39, 229, 273, 917, 577, 3627, 3285, 4495, 28581, 34011, 38537, 194999}},
+{17201, 18, 63872, {1, 1, 7, 3, 17, 51, 91, 203, 161, 757, 581, 1625, 477, 8839, 16515, 43101, 121497, 23603}},
+{17202, 18, 63878, {1, 3, 3, 5, 19, 29, 55, 127, 283, 999, 1227, 1937, 4471, 11305, 8813, 40509, 78521, 175573}},
+{17203, 18, 63895, {1, 3, 3, 3, 5, 29, 33, 249, 25, 213, 1315, 393, 6967, 12751, 7485, 39561, 14801, 191921}},
+{17204, 18, 63917, {1, 3, 7, 9, 23, 15, 93, 69, 23, 239, 1993, 3375, 539, 14141, 10123, 33561, 127565, 181527}},
+{17205, 18, 63930, {1, 3, 3, 15, 13, 15, 65, 241, 83, 351, 1943, 1305, 7181, 11803, 31907, 63623, 5439, 150661}},
+{17206, 18, 63935, {1, 3, 7, 11, 13, 17, 17, 37, 409, 577, 973, 797, 1761, 5333, 13803, 22991, 29743, 53051}},
+{17207, 18, 63955, {1, 3, 5, 5, 27, 25, 91, 225, 411, 23, 877, 2487, 8061, 12337, 11471, 8857, 10791, 112699}},
+{17208, 18, 63964, {1, 1, 5, 3, 15, 1, 87, 249, 205, 1011, 2045, 1879, 4137, 5877, 12709, 5231, 74283, 124315}},
+{17209, 18, 63967, {1, 1, 7, 7, 31, 37, 117, 71, 139, 391, 1085, 4033, 3087, 3063, 19991, 8787, 96899, 17279}},
+{17210, 18, 63980, {1, 1, 7, 15, 19, 47, 45, 181, 303, 151, 337, 2557, 6131, 3161, 13097, 52777, 77783, 259817}},
+{17211, 18, 63985, {1, 1, 3, 3, 1, 55, 115, 227, 83, 591, 967, 4067, 3441, 243, 13443, 4043, 129365, 161459}},
+{17212, 18, 63992, {1, 1, 3, 15, 5, 23, 71, 31, 271, 585, 931, 909, 3375, 15063, 12111, 35811, 124047, 68225}},
+{17213, 18, 64021, {1, 1, 5, 11, 1, 59, 19, 193, 323, 489, 837, 3709, 1807, 11617, 30931, 33561, 2805, 100979}},
+{17214, 18, 64026, {1, 3, 5, 7, 27, 7, 71, 67, 167, 521, 1237, 2911, 3531, 2885, 4669, 25703, 87647, 36381}},
+{17215, 18, 64044, {1, 3, 3, 13, 13, 21, 97, 225, 477, 1023, 2029, 877, 3849, 4675, 17665, 19257, 9697, 168577}},
+{17216, 18, 64055, {1, 1, 7, 15, 25, 31, 19, 255, 45, 539, 1831, 2655, 7471, 12011, 12455, 3681, 123881, 234471}},
+{17217, 18, 64056, {1, 1, 3, 9, 17, 39, 105, 73, 271, 555, 987, 873, 5371, 12381, 13469, 54961, 125701, 194063}},
+{17218, 18, 64061, {1, 1, 5, 5, 7, 27, 15, 195, 121, 175, 991, 955, 5007, 11423, 1539, 21381, 79891, 162149}},
+{17219, 18, 64067, {1, 3, 1, 7, 25, 23, 69, 69, 177, 545, 481, 3503, 3721, 1077, 8763, 6919, 64743, 172311}},
+{17220, 18, 64081, {1, 1, 3, 15, 31, 5, 33, 45, 81, 795, 435, 399, 4591, 3741, 26493, 14791, 59529, 89989}},
+{17221, 18, 64100, {1, 1, 7, 13, 21, 29, 95, 75, 213, 59, 1635, 479, 441, 14667, 16389, 9139, 30955, 169895}},
+{17222, 18, 64109, {1, 3, 3, 3, 17, 61, 103, 85, 233, 287, 447, 2687, 4755, 9489, 1669, 10405, 58489, 170429}},
+{17223, 18, 64112, {1, 1, 5, 5, 13, 9, 63, 129, 321, 531, 393, 3353, 5309, 16375, 20473, 12595, 52239, 183647}},
+{17224, 18, 64118, {1, 1, 3, 7, 7, 31, 101, 253, 119, 325, 351, 2321, 1899, 14073, 8985, 13609, 32043, 33225}},
+{17225, 18, 64124, {1, 1, 3, 13, 7, 25, 73, 191, 399, 591, 819, 2859, 6053, 815, 30417, 5709, 18277, 121991}},
+{17226, 18, 64145, {1, 3, 3, 1, 7, 47, 7, 81, 451, 463, 699, 1857, 8169, 15649, 22693, 28673, 9717, 227583}},
+{17227, 18, 64151, {1, 3, 3, 3, 31, 45, 123, 205, 23, 901, 1003, 1149, 7481, 6925, 23845, 18573, 97047, 248957}},
+{17228, 18, 64203, {1, 1, 3, 3, 21, 9, 53, 241, 125, 583, 1055, 3981, 8113, 12477, 8455, 6289, 112253, 17321}},
+{17229, 18, 64208, {1, 1, 7, 3, 19, 5, 51, 111, 443, 283, 117, 2127, 4273, 2335, 20373, 2885, 57439, 56839}},
+{17230, 18, 64236, {1, 1, 5, 15, 7, 5, 65, 163, 27, 691, 1667, 69, 2459, 7477, 21349, 52417, 42299, 75965}},
+{17231, 18, 64254, {1, 1, 1, 13, 13, 19, 87, 223, 475, 205, 1113, 887, 2213, 5533, 15875, 36173, 53933, 200173}},
+{17232, 18, 64261, {1, 3, 3, 13, 23, 17, 93, 37, 391, 127, 873, 1445, 3007, 10863, 21245, 55025, 99275, 255329}},
+{17233, 18, 64280, {1, 3, 1, 15, 1, 47, 57, 5, 207, 825, 161, 539, 6151, 12829, 14121, 51217, 25547, 234303}},
+{17234, 18, 64296, {1, 1, 5, 1, 21, 63, 15, 83, 19, 817, 591, 3131, 889, 12451, 14363, 27295, 83877, 124701}},
+{17235, 18, 64313, {1, 1, 7, 7, 11, 21, 87, 85, 13, 555, 163, 9, 5973, 14749, 19585, 57287, 43421, 66301}},
+{17236, 18, 64314, {1, 3, 5, 5, 7, 33, 19, 7, 9, 819, 533, 2105, 4275, 10611, 30517, 35863, 84687, 245157}},
+{17237, 18, 64316, {1, 3, 5, 13, 3, 55, 111, 157, 235, 405, 39, 2191, 905, 3099, 245, 37371, 365, 257385}},
+{17238, 18, 64348, {1, 3, 3, 13, 29, 39, 125, 235, 213, 879, 497, 1659, 6689, 12165, 18621, 14657, 37079, 167867}},
+{17239, 18, 64352, {1, 1, 5, 15, 5, 5, 27, 197, 77, 477, 1115, 3369, 2253, 5757, 20855, 4473, 112501, 76881}},
+{17240, 18, 64355, {1, 3, 3, 13, 13, 61, 37, 97, 229, 743, 1381, 3979, 307, 319, 16765, 56295, 109303, 21361}},
+{17241, 18, 64361, {1, 1, 7, 11, 19, 7, 63, 145, 129, 899, 93, 1851, 7901, 8767, 15553, 13913, 4897, 129483}},
+{17242, 18, 64388, {1, 3, 5, 11, 7, 23, 19, 5, 465, 365, 883, 3563, 4395, 2759, 4273, 623, 75047, 249519}},
+{17243, 18, 64398, {1, 3, 1, 5, 29, 43, 75, 7, 509, 373, 359, 2041, 5957, 1251, 32431, 37803, 120915, 45137}},
+{17244, 18, 64403, {1, 3, 1, 5, 21, 9, 43, 1, 337, 743, 1359, 1629, 5117, 2499, 16129, 22831, 38795, 32137}},
+{17245, 18, 64419, {1, 3, 3, 7, 23, 57, 9, 31, 351, 559, 1729, 1461, 3037, 12685, 8899, 14859, 108851, 170195}},
+{17246, 18, 64421, {1, 1, 1, 15, 23, 57, 39, 23, 283, 487, 1055, 1265, 6781, 7955, 195, 37745, 66115, 56413}},
+{17247, 18, 64428, {1, 1, 3, 7, 27, 35, 57, 17, 137, 17, 905, 4033, 5775, 5305, 22975, 17547, 106297, 146287}},
+{17248, 18, 64453, {1, 1, 1, 3, 5, 39, 73, 151, 469, 523, 119, 539, 2817, 7783, 22957, 59937, 21331, 172437}},
+{17249, 18, 64463, {1, 1, 3, 13, 21, 1, 23, 109, 113, 257, 817, 1671, 6729, 1571, 15009, 48539, 94025, 160379}},
+{17250, 18, 64475, {1, 1, 1, 1, 31, 23, 83, 107, 225, 715, 949, 69, 2163, 4777, 7715, 25901, 82935, 81455}},
+{17251, 18, 64511, {1, 3, 5, 13, 29, 11, 61, 169, 241, 973, 315, 3991, 1389, 3293, 31123, 59419, 7359, 170929}},
+{17252, 18, 64537, {1, 1, 7, 3, 21, 15, 111, 41, 329, 513, 1175, 4037, 2747, 11465, 17253, 54055, 29409, 230925}},
+{17253, 18, 64576, {1, 3, 5, 15, 31, 17, 105, 45, 61, 339, 1387, 1021, 4499, 13671, 25521, 52081, 49153, 31587}},
+{17254, 18, 64579, {1, 3, 3, 3, 29, 17, 51, 103, 429, 849, 1759, 1267, 6255, 4631, 32643, 44977, 40875, 239457}},
+{17255, 18, 64581, {1, 1, 7, 15, 3, 11, 123, 157, 73, 151, 777, 3855, 1913, 969, 11821, 16889, 63503, 197305}},
+{17256, 18, 64606, {1, 3, 1, 5, 13, 49, 61, 209, 105, 523, 851, 3667, 7525, 5537, 12851, 42867, 50535, 131403}},
+{17257, 18, 64615, {1, 3, 1, 7, 13, 19, 107, 71, 479, 895, 405, 89, 1345, 5543, 12709, 6093, 97581, 20483}},
+{17258, 18, 64649, {1, 3, 3, 11, 3, 47, 117, 175, 175, 321, 1257, 365, 1193, 12813, 2713, 26941, 43605, 223323}},
+{17259, 18, 64655, {1, 1, 7, 1, 19, 35, 45, 143, 395, 255, 1599, 575, 2637, 1287, 27673, 48329, 57975, 44173}},
+{17260, 18, 64664, {1, 3, 5, 1, 1, 19, 107, 233, 465, 661, 91, 4007, 6409, 3399, 8175, 54171, 111417, 124955}},
+{17261, 18, 64667, {1, 1, 5, 13, 9, 27, 121, 225, 55, 761, 779, 3015, 6333, 10779, 26531, 57103, 33463, 90219}},
+{17262, 18, 64712, {1, 3, 1, 9, 17, 3, 85, 147, 111, 133, 869, 1833, 2401, 5811, 24415, 27095, 65529, 164121}},
+{17263, 18, 64715, {1, 1, 5, 13, 11, 37, 13, 83, 391, 909, 2013, 1327, 6697, 1711, 29265, 10607, 20127, 57873}},
+{17264, 18, 64718, {1, 3, 1, 11, 17, 17, 33, 101, 383, 837, 1769, 1711, 3735, 14777, 27101, 56853, 110643, 101917}},
+{17265, 18, 64741, {1, 3, 5, 13, 25, 7, 37, 99, 473, 211, 1469, 1827, 6307, 8835, 15853, 22027, 43095, 15817}},
+{17266, 18, 64766, {1, 3, 1, 5, 19, 13, 61, 193, 57, 359, 1277, 749, 5499, 11239, 20681, 48477, 7225, 259259}},
+{17267, 18, 64780, {1, 1, 1, 7, 27, 17, 79, 213, 307, 761, 429, 1519, 7483, 6007, 11251, 13263, 24851, 7919}},
+{17268, 18, 64788, {1, 1, 3, 5, 9, 37, 101, 149, 405, 413, 1213, 157, 3811, 4485, 13099, 32697, 75677, 127815}},
+{17269, 18, 64791, {1, 3, 3, 7, 29, 29, 13, 113, 45, 885, 1471, 3433, 2289, 4375, 815, 16741, 20933, 9763}},
+{17270, 18, 64795, {1, 3, 5, 15, 5, 3, 7, 37, 347, 41, 1977, 395, 6363, 3591, 21457, 31455, 60547, 108153}},
+{17271, 18, 64798, {1, 3, 5, 7, 19, 9, 113, 1, 241, 439, 731, 1591, 3347, 1295, 6635, 25267, 13239, 214669}},
+{17272, 18, 64816, {1, 1, 3, 5, 7, 7, 69, 77, 281, 851, 1533, 1, 7351, 3429, 29237, 54597, 11171, 66613}},
+{17273, 18, 64819, {1, 1, 7, 15, 29, 7, 59, 9, 105, 129, 1397, 3841, 3945, 4755, 19877, 11109, 17497, 225473}},
+{17274, 18, 64822, {1, 3, 7, 7, 15, 61, 3, 207, 97, 229, 1251, 101, 3157, 5729, 15579, 14849, 119119, 91891}},
+{17275, 18, 64833, {1, 3, 3, 9, 27, 15, 85, 221, 231, 577, 1787, 3489, 2393, 7593, 13175, 25561, 108505, 97267}},
+{17276, 18, 64836, {1, 3, 7, 13, 23, 3, 7, 85, 307, 899, 371, 3539, 3467, 7955, 9539, 53583, 125587, 30969}},
+{17277, 18, 64876, {1, 1, 5, 7, 7, 31, 115, 245, 375, 803, 1121, 3775, 3565, 15283, 25981, 24681, 34469, 172003}},
+{17278, 18, 64891, {1, 1, 5, 1, 31, 5, 5, 161, 153, 235, 1703, 2163, 1089, 16233, 6183, 25167, 102925, 36673}},
+{17279, 18, 64907, {1, 3, 3, 5, 1, 57, 59, 5, 87, 497, 151, 1731, 2727, 4583, 28165, 63053, 76003, 29259}},
+{17280, 18, 64943, {1, 1, 5, 7, 5, 21, 79, 111, 347, 879, 827, 3947, 4421, 9589, 23971, 11681, 104555, 226535}},
+{17281, 18, 64965, {1, 1, 5, 1, 17, 35, 105, 159, 391, 495, 1709, 3731, 261, 2359, 1413, 37105, 8979, 189381}},
+{17282, 18, 64977, {1, 3, 3, 1, 11, 23, 21, 213, 261, 755, 1503, 2369, 1765, 14531, 2605, 15609, 48691, 113059}},
+{17283, 18, 64999, {1, 3, 5, 1, 1, 55, 87, 197, 89, 391, 1157, 3523, 385, 5871, 13681, 29097, 101903, 184553}},
+{17284, 18, 65034, {1, 3, 7, 5, 17, 51, 87, 191, 495, 761, 1943, 1845, 2963, 13133, 22439, 20101, 96759, 215215}},
+{17285, 18, 65036, {1, 3, 5, 11, 23, 9, 53, 41, 229, 233, 2025, 2835, 2359, 4755, 3015, 48267, 20721, 61001}},
+{17286, 18, 65089, {1, 1, 7, 9, 27, 35, 45, 201, 137, 291, 151, 733, 6199, 3127, 3073, 14491, 95051, 12469}},
+{17287, 18, 65107, {1, 1, 1, 9, 7, 49, 73, 233, 239, 881, 1991, 695, 5947, 9377, 12027, 41137, 80217, 122961}},
+{17288, 18, 65110, {1, 1, 5, 11, 3, 15, 85, 203, 305, 945, 1007, 1831, 3999, 373, 21141, 63829, 91779, 122495}},
+{17289, 18, 65120, {1, 1, 1, 11, 23, 51, 127, 215, 441, 467, 229, 3071, 2731, 8813, 30155, 60289, 54531, 196187}},
+{17290, 18, 65132, {1, 3, 5, 15, 29, 31, 11, 129, 443, 649, 773, 3035, 7915, 13831, 31979, 5577, 42869, 153591}},
+{17291, 18, 65143, {1, 1, 3, 11, 21, 37, 23, 79, 153, 7, 1801, 441, 8189, 7235, 6311, 965, 71993, 81755}},
+{17292, 18, 65150, {1, 3, 5, 5, 23, 13, 93, 39, 247, 367, 811, 1381, 6809, 16219, 8755, 41923, 79873, 105781}},
+{17293, 18, 65177, {1, 3, 5, 9, 19, 43, 21, 229, 251, 187, 1047, 2295, 5529, 2965, 1507, 16185, 121183, 30551}},
+{17294, 18, 65201, {1, 3, 7, 9, 19, 11, 33, 213, 39, 811, 231, 1527, 6093, 1507, 3541, 37585, 78785, 215419}},
+{17295, 18, 65214, {1, 3, 7, 7, 11, 13, 109, 119, 175, 311, 719, 3127, 6351, 1909, 5441, 5411, 58751, 80875}},
+{17296, 18, 65234, {1, 1, 1, 7, 17, 35, 57, 139, 289, 137, 1919, 2131, 6145, 3953, 24887, 64737, 4677, 23833}},
+{17297, 18, 65240, {1, 1, 3, 13, 1, 21, 83, 243, 27, 69, 501, 3925, 3339, 13313, 27021, 38319, 76441, 146397}},
+{17298, 18, 65243, {1, 3, 7, 9, 15, 17, 97, 117, 505, 673, 1333, 3891, 7775, 6323, 12967, 17387, 19501, 68347}},
+{17299, 18, 65259, {1, 1, 1, 5, 27, 55, 43, 47, 399, 147, 1539, 2663, 5555, 11993, 8759, 33783, 8361, 78633}},
+{17300, 18, 65276, {1, 1, 1, 15, 1, 17, 21, 85, 129, 117, 339, 1319, 1119, 6869, 12913, 56873, 30795, 76849}},
+{17301, 18, 65287, {1, 1, 5, 5, 11, 1, 11, 175, 355, 737, 1367, 3089, 5993, 4377, 10325, 3817, 61735, 187689}},
+{17302, 18, 65306, {1, 3, 5, 5, 21, 41, 85, 219, 425, 611, 1219, 1849, 349, 925, 26185, 31591, 23855, 35549}},
+{17303, 18, 65311, {1, 1, 3, 5, 21, 3, 77, 25, 265, 949, 1979, 1561, 4243, 12437, 5215, 23445, 33295, 130385}},
+{17304, 18, 65321, {1, 1, 3, 1, 13, 7, 3, 81, 143, 735, 31, 1781, 1537, 10789, 11923, 61589, 75761, 178837}},
+{17305, 18, 65350, {1, 1, 7, 7, 11, 47, 55, 37, 39, 533, 1773, 3121, 183, 7193, 19403, 45757, 20457, 158437}},
+{17306, 18, 65364, {1, 1, 5, 5, 3, 15, 53, 41, 139, 529, 601, 2967, 4683, 3869, 13449, 30155, 85833, 190053}},
+{17307, 18, 65451, {1, 1, 5, 1, 11, 39, 85, 131, 349, 175, 267, 779, 923, 5905, 32727, 22055, 63087, 247607}},
+{17308, 18, 65488, {1, 3, 5, 7, 7, 59, 11, 49, 465, 617, 557, 251, 1303, 10369, 29207, 13457, 113591, 43717}},
+{17309, 18, 65510, {1, 3, 5, 3, 27, 39, 21, 157, 39, 891, 1833, 2887, 7395, 7965, 21771, 42675, 71705, 177323}},
+{17310, 18, 65528, {1, 3, 7, 7, 21, 51, 53, 83, 433, 889, 1033, 1701, 6285, 14335, 1683, 3637, 110241, 110355}},
+{17311, 18, 65533, {1, 1, 7, 7, 11, 23, 35, 63, 71, 867, 79, 2551, 1837, 773, 21093, 60433, 67305, 70731}},
+{17312, 18, 65553, {1, 3, 5, 11, 9, 25, 67, 23, 137, 75, 707, 2229, 6237, 9871, 29063, 30433, 112897, 68037}},
+{17313, 18, 65563, {1, 3, 7, 13, 1, 45, 119, 149, 487, 667, 1177, 2927, 1875, 11963, 20771, 1177, 2331, 244039}},
+{17314, 18, 65579, {1, 3, 3, 7, 19, 61, 89, 163, 91, 409, 1109, 1947, 1017, 12385, 13487, 45645, 64175, 184221}},
+{17315, 18, 65621, {1, 1, 1, 15, 13, 47, 21, 203, 341, 845, 443, 1891, 2591, 2721, 7515, 52161, 70359, 173139}},
+{17316, 18, 65625, {1, 3, 3, 11, 5, 3, 119, 179, 509, 33, 1909, 2531, 6713, 12447, 30157, 61019, 45857, 165557}},
+{17317, 18, 65635, {1, 3, 7, 5, 3, 47, 79, 55, 321, 71, 1917, 4053, 6603, 3079, 28133, 15611, 99161, 118279}},
+{17318, 18, 65644, {1, 1, 1, 7, 19, 13, 3, 31, 213, 705, 435, 2381, 991, 4719, 24473, 8907, 122013, 228081}},
+{17319, 18, 65690, {1, 1, 7, 11, 27, 15, 5, 123, 169, 197, 361, 3803, 2001, 14547, 22967, 27575, 118325, 130651}},
+{17320, 18, 65696, {1, 3, 3, 5, 29, 43, 77, 15, 463, 753, 695, 3489, 2023, 9913, 13029, 26621, 129393, 209439}},
+{17321, 18, 65705, {1, 1, 5, 15, 1, 39, 55, 129, 247, 729, 1537, 2529, 3981, 13153, 1505, 12743, 104173, 218423}},
+{17322, 18, 65716, {1, 3, 7, 3, 21, 3, 49, 173, 445, 821, 3, 2671, 1865, 1377, 7589, 65485, 96485, 80193}},
+{17323, 18, 65725, {1, 3, 3, 11, 7, 21, 99, 143, 333, 869, 1469, 1579, 1749, 2203, 18773, 47377, 103211, 238357}},
+{17324, 18, 65733, {1, 3, 5, 11, 11, 19, 25, 253, 229, 755, 101, 269, 6703, 5603, 23201, 57163, 28431, 159653}},
+{17325, 18, 65740, {1, 3, 5, 3, 3, 15, 45, 225, 325, 997, 1061, 883, 3885, 7633, 461, 44411, 52129, 84535}},
+{17326, 18, 65758, {1, 1, 7, 1, 27, 29, 51, 23, 473, 443, 117, 3021, 55, 7413, 7911, 3063, 47533, 234941}},
+{17327, 18, 65786, {1, 3, 3, 15, 19, 43, 37, 95, 249, 805, 603, 865, 2115, 6999, 9739, 59029, 12181, 211159}},
+{17328, 18, 65806, {1, 3, 7, 3, 3, 61, 105, 113, 11, 169, 1007, 689, 2553, 14561, 17473, 38249, 41225, 80021}},
+{17329, 18, 65834, {1, 3, 7, 11, 5, 47, 69, 49, 457, 931, 435, 1423, 411, 15163, 3171, 29143, 101153, 240869}},
+{17330, 18, 65844, {1, 3, 7, 1, 17, 1, 13, 45, 155, 551, 1783, 3583, 2767, 2761, 18019, 61635, 104527, 123817}},
+{17331, 18, 65866, {1, 1, 5, 11, 9, 43, 101, 205, 233, 689, 1247, 2903, 3117, 12261, 11827, 50403, 103727, 35533}},
+{17332, 18, 65895, {1, 1, 5, 13, 23, 37, 121, 195, 133, 265, 1517, 823, 5933, 13917, 6363, 8533, 58443, 178549}},
+{17333, 18, 65902, {1, 1, 7, 9, 29, 1, 3, 195, 221, 877, 71, 473, 1173, 15285, 6057, 60005, 92401, 65357}},
+{17334, 18, 65953, {1, 3, 7, 1, 5, 25, 15, 207, 455, 447, 1125, 3731, 1289, 867, 22111, 38893, 70779, 88277}},
+{17335, 18, 65954, {1, 1, 1, 13, 31, 19, 15, 179, 183, 351, 1197, 1929, 3569, 12251, 17641, 4097, 24141, 186857}},
+{17336, 18, 65983, {1, 1, 1, 9, 19, 9, 125, 23, 431, 225, 943, 479, 2615, 443, 30977, 10889, 17107, 116819}},
+{17337, 18, 65985, {1, 3, 1, 9, 9, 13, 85, 123, 85, 857, 125, 3149, 1105, 3687, 2313, 38749, 52131, 259511}},
+{17338, 18, 66003, {1, 3, 5, 7, 27, 33, 57, 105, 511, 871, 1089, 2311, 3291, 2245, 3365, 30211, 62549, 56207}},
+{17339, 18, 66010, {1, 1, 7, 11, 1, 19, 75, 37, 139, 173, 391, 317, 2575, 11887, 4289, 32275, 43487, 487}},
+{17340, 18, 66025, {1, 1, 7, 1, 11, 3, 9, 217, 343, 35, 59, 93, 1343, 5043, 14869, 63717, 40983, 235373}},
+{17341, 18, 66050, {1, 1, 3, 5, 15, 13, 93, 247, 417, 179, 307, 3299, 4383, 5491, 21271, 37155, 32289, 75737}},
+{17342, 18, 66074, {1, 3, 3, 9, 3, 39, 63, 243, 305, 729, 9, 3317, 3301, 13165, 20437, 36505, 32977, 2761}},
+{17343, 18, 66076, {1, 3, 7, 5, 3, 37, 61, 109, 351, 641, 1699, 2517, 2637, 4995, 27365, 56971, 53609, 14373}},
+{17344, 18, 66097, {1, 3, 1, 15, 31, 53, 127, 123, 219, 1003, 1425, 1201, 5303, 10369, 21481, 26987, 42541, 37855}},
+{17345, 18, 66132, {1, 3, 3, 13, 9, 29, 35, 111, 395, 791, 1619, 2647, 713, 15955, 19145, 33883, 65215, 166267}},
+{17346, 18, 66158, {1, 1, 7, 11, 17, 5, 45, 249, 421, 273, 411, 2885, 7027, 11933, 24847, 36969, 124701, 214931}},
+{17347, 18, 66175, {1, 1, 3, 1, 27, 41, 125, 83, 327, 643, 223, 151, 6709, 15949, 125, 13275, 90405, 15759}},
+{17348, 18, 66185, {1, 1, 5, 15, 19, 45, 55, 109, 497, 1011, 1363, 1937, 3697, 7475, 10533, 65325, 29681, 76275}},
+{17349, 18, 66199, {1, 1, 1, 3, 23, 17, 59, 209, 229, 151, 1199, 279, 191, 8993, 25939, 13885, 113477, 166961}},
+{17350, 18, 66206, {1, 3, 5, 1, 19, 61, 27, 129, 103, 721, 1451, 2803, 5879, 3523, 15443, 4047, 95927, 50339}},
+{17351, 18, 66222, {1, 1, 1, 11, 27, 9, 53, 47, 331, 185, 1337, 3429, 807, 3341, 14871, 11035, 50651, 243843}},
+{17352, 18, 66227, {1, 3, 5, 11, 7, 57, 125, 15, 271, 811, 1873, 3093, 7841, 5761, 19955, 571, 123319, 149465}},
+{17353, 18, 66241, {1, 3, 1, 3, 31, 61, 71, 47, 477, 273, 167, 1069, 3513, 1463, 2667, 22097, 60367, 246045}},
+{17354, 18, 66272, {1, 1, 1, 11, 1, 55, 35, 233, 37, 659, 1517, 411, 2981, 10339, 21857, 33701, 44393, 6861}},
+{17355, 18, 66324, {1, 1, 5, 7, 11, 43, 109, 205, 103, 315, 1925, 2109, 6307, 7915, 19793, 61167, 27963, 251913}},
+{17356, 18, 66424, {1, 1, 5, 11, 5, 63, 107, 219, 53, 251, 1053, 2035, 77, 15885, 22011, 3945, 91, 204899}},
+{17357, 18, 66460, {1, 3, 7, 13, 21, 45, 51, 53, 99, 831, 1421, 3171, 4241, 14105, 26161, 45071, 2813, 54339}},
+{17358, 18, 66464, {1, 3, 5, 1, 3, 61, 43, 141, 355, 699, 11, 2203, 8055, 14815, 24597, 65201, 32689, 70167}},
+{17359, 18, 66481, {1, 3, 1, 5, 11, 27, 109, 239, 199, 23, 375, 1477, 3197, 4401, 29901, 46623, 79593, 133143}},
+{17360, 18, 66482, {1, 1, 1, 3, 23, 9, 63, 103, 41, 177, 1365, 1971, 5937, 13055, 27713, 13535, 47371, 57841}},
+{17361, 18, 66523, {1, 1, 5, 5, 19, 15, 5, 21, 307, 65, 215, 3801, 4149, 6565, 10249, 63541, 30867, 12129}},
+{17362, 18, 66526, {1, 3, 3, 9, 11, 1, 107, 99, 235, 331, 1479, 1365, 2557, 9545, 25767, 12461, 6471, 184643}},
+{17363, 18, 66532, {1, 3, 3, 5, 17, 13, 103, 223, 95, 955, 1479, 1825, 705, 5311, 28531, 22787, 118899, 181829}},
+{17364, 18, 66539, {1, 3, 7, 1, 5, 59, 65, 11, 251, 419, 659, 2559, 5445, 4221, 5871, 51845, 33925, 167037}},
+{17365, 18, 66541, {1, 3, 5, 13, 15, 45, 35, 181, 325, 293, 1897, 3321, 6081, 9919, 27641, 9407, 35263, 231009}},
+{17366, 18, 66573, {1, 3, 3, 3, 3, 35, 85, 33, 293, 777, 1945, 3771, 6967, 12353, 2737, 12501, 127359, 163591}},
+{17367, 18, 66582, {1, 3, 7, 9, 13, 7, 119, 107, 309, 811, 1113, 2465, 4867, 4295, 565, 59159, 94587, 119761}},
+{17368, 18, 66591, {1, 3, 3, 1, 1, 31, 61, 49, 461, 635, 233, 175, 6237, 10463, 17847, 54925, 115675, 260575}},
+{17369, 18, 66615, {1, 3, 5, 15, 25, 17, 61, 155, 235, 483, 1771, 2903, 3163, 2525, 17153, 54701, 49521, 11911}},
+{17370, 18, 66622, {1, 3, 3, 5, 1, 35, 51, 23, 187, 107, 177, 1381, 165, 6149, 10841, 3619, 107811, 188811}},
+{17371, 18, 66629, {1, 1, 5, 9, 7, 35, 5, 233, 43, 913, 939, 2195, 1369, 5355, 7941, 26075, 66813, 227623}},
+{17372, 18, 66641, {1, 3, 7, 11, 5, 43, 97, 211, 427, 875, 1179, 3631, 7989, 2419, 17209, 15789, 128209, 224117}},
+{17373, 18, 66712, {1, 1, 1, 7, 17, 7, 109, 255, 111, 883, 371, 3481, 6031, 14665, 5905, 28735, 113003, 327}},
+{17374, 18, 66724, {1, 3, 5, 3, 5, 61, 7, 155, 87, 861, 39, 3163, 179, 15493, 16403, 18755, 116157, 233185}},
+{17375, 18, 66731, {1, 3, 5, 5, 23, 45, 67, 205, 395, 417, 1235, 669, 5097, 6823, 31483, 61395, 36073, 24183}},
+{17376, 18, 66745, {1, 1, 3, 1, 11, 35, 123, 171, 125, 759, 197, 907, 2273, 3623, 31861, 60071, 91857, 158011}},
+{17377, 18, 66759, {1, 3, 7, 11, 19, 19, 25, 25, 167, 429, 1565, 3179, 5453, 15731, 30727, 32111, 63685, 113309}},
+{17378, 18, 66808, {1, 3, 7, 9, 15, 33, 67, 225, 495, 19, 1881, 1357, 4311, 9547, 18717, 20749, 8819, 209979}},
+{17379, 18, 66814, {1, 3, 5, 3, 13, 47, 107, 153, 461, 815, 1521, 2361, 7721, 10631, 2799, 62321, 59755, 170803}},
+{17380, 18, 66821, {1, 3, 7, 5, 25, 61, 5, 235, 71, 349, 1555, 3419, 1159, 2027, 17391, 29849, 47145, 122057}},
+{17381, 18, 66831, {1, 1, 5, 11, 19, 19, 101, 45, 333, 553, 1431, 4077, 2629, 15997, 19793, 65521, 124287, 174675}},
+{17382, 18, 66834, {1, 3, 7, 11, 25, 39, 103, 219, 375, 27, 227, 1061, 445, 14803, 18883, 49191, 33303, 114467}},
+{17383, 18, 66879, {1, 1, 5, 7, 3, 13, 117, 29, 387, 891, 371, 2199, 7023, 13671, 26291, 61563, 2733, 16093}},
+{17384, 18, 66884, {1, 3, 5, 11, 29, 5, 17, 249, 149, 777, 1817, 319, 19, 12321, 15241, 29069, 58381, 157467}},
+{17385, 18, 66899, {1, 3, 7, 9, 29, 17, 81, 141, 201, 383, 429, 3675, 69, 8155, 22821, 60707, 127015, 248279}},
+{17386, 18, 66901, {1, 3, 7, 9, 25, 5, 11, 27, 423, 987, 99, 3599, 4849, 4513, 32119, 34301, 6327, 249457}},
+{17387, 18, 66924, {1, 3, 3, 7, 13, 25, 71, 227, 307, 985, 665, 3097, 6713, 3823, 6357, 58199, 84057, 28055}},
+{17388, 18, 66929, {1, 3, 5, 7, 19, 21, 93, 45, 159, 527, 493, 59, 1111, 1415, 1949, 28525, 50343, 11039}},
+{17389, 18, 66942, {1, 3, 5, 13, 17, 35, 79, 229, 449, 533, 235, 3445, 8153, 15473, 12975, 53909, 24589, 237049}},
+{17390, 18, 66985, {1, 1, 7, 5, 3, 53, 93, 33, 339, 423, 497, 2691, 6125, 3931, 25357, 27509, 92509, 227209}},
+{17391, 18, 66986, {1, 1, 7, 3, 13, 49, 111, 179, 449, 279, 827, 1481, 2477, 6867, 18079, 6261, 30885, 205675}},
+{17392, 18, 66994, {1, 3, 7, 7, 11, 9, 13, 105, 367, 639, 1307, 1617, 4759, 8387, 8909, 13715, 56599, 113259}},
+{17393, 18, 67066, {1, 1, 3, 3, 15, 17, 103, 125, 205, 67, 999, 3965, 907, 13235, 15275, 58457, 66889, 227279}},
+{17394, 18, 67075, {1, 3, 3, 3, 11, 35, 99, 81, 421, 75, 1757, 2413, 5655, 1227, 4019, 14503, 20719, 224807}},
+{17395, 18, 67099, {1, 1, 7, 11, 17, 17, 109, 203, 331, 813, 987, 2925, 1601, 13617, 29, 8235, 95129, 117987}},
+{17396, 18, 67130, {1, 3, 7, 5, 5, 33, 105, 191, 183, 899, 1949, 2923, 2473, 3435, 8097, 35615, 10109, 62563}},
+{17397, 18, 67173, {1, 1, 7, 13, 5, 25, 21, 159, 487, 415, 1507, 2161, 649, 14425, 2605, 8357, 92441, 87323}},
+{17398, 18, 67183, {1, 3, 7, 15, 3, 23, 87, 209, 407, 765, 975, 3859, 675, 6351, 18703, 44919, 57155, 134961}},
+{17399, 18, 67186, {1, 3, 5, 15, 7, 59, 77, 37, 235, 565, 1707, 3531, 6733, 2223, 12621, 59523, 83547, 172355}},
+{17400, 18, 67197, {1, 3, 7, 5, 23, 15, 57, 217, 151, 333, 1033, 2549, 303, 1455, 5329, 20187, 55415, 166093}},
+{17401, 18, 67201, {1, 3, 1, 13, 21, 27, 1, 85, 335, 201, 135, 2603, 291, 10573, 28411, 1059, 129871, 98303}},
+{17402, 18, 67208, {1, 1, 3, 5, 23, 61, 123, 169, 503, 629, 711, 2795, 2291, 13273, 32703, 63377, 72809, 214927}},
+{17403, 18, 67221, {1, 3, 5, 13, 31, 11, 115, 133, 443, 709, 263, 3739, 2777, 11545, 19137, 61285, 64065, 214477}},
+{17404, 18, 67238, {1, 3, 1, 11, 29, 25, 3, 5, 385, 613, 1277, 1445, 1643, 15137, 28041, 47713, 122051, 62915}},
+{17405, 18, 67252, {1, 3, 5, 11, 3, 11, 1, 137, 457, 577, 783, 1745, 5, 5817, 26569, 50751, 14075, 246219}},
+{17406, 18, 67256, {1, 1, 1, 9, 7, 9, 105, 27, 167, 939, 799, 2773, 6427, 15579, 1975, 10695, 111429, 227105}},
+{17407, 18, 67270, {1, 3, 1, 11, 23, 23, 73, 103, 103, 61, 1743, 3061, 8127, 15893, 21223, 43549, 103659, 89129}},
+{17408, 18, 67288, {1, 1, 7, 13, 5, 43, 59, 235, 139, 961, 839, 3843, 1317, 4903, 21043, 15479, 115065, 112531}},
+{17409, 18, 67318, {1, 3, 1, 3, 19, 15, 57, 145, 193, 321, 1919, 385, 125, 15517, 14243, 62845, 38995, 120045}},
+{17410, 18, 67329, {1, 3, 3, 7, 17, 61, 77, 75, 267, 203, 1911, 2599, 1797, 761, 28101, 58603, 107755, 158689}},
+{17411, 18, 67349, {1, 1, 5, 11, 15, 21, 71, 227, 377, 361, 2013, 129, 6271, 1421, 6009, 52261, 113389, 74915}},
+{17412, 18, 67369, {1, 1, 5, 7, 3, 39, 27, 49, 97, 885, 651, 1633, 3445, 3415, 20167, 26667, 52997, 221391}},
+{17413, 18, 67392, {1, 1, 7, 9, 7, 59, 95, 127, 479, 871, 845, 2951, 673, 6385, 10057, 2605, 78529, 230771}},
+{17414, 18, 67435, {1, 3, 5, 7, 31, 15, 53, 125, 223, 711, 875, 429, 7237, 4005, 2153, 26865, 63205, 144125}},
+{17415, 18, 67473, {1, 1, 7, 9, 1, 57, 19, 189, 67, 423, 1937, 37, 4925, 15503, 25969, 20419, 59921, 58119}},
+{17416, 18, 67496, {1, 1, 7, 7, 31, 51, 99, 189, 21, 1011, 1551, 3529, 7617, 15805, 11365, 43123, 84785, 203703}},
+{17417, 18, 67507, {1, 1, 3, 15, 3, 63, 9, 67, 399, 151, 253, 1839, 1365, 16295, 13145, 29211, 48681, 177643}},
+{17418, 18, 67514, {1, 1, 1, 5, 13, 37, 1, 21, 435, 483, 939, 535, 1505, 10879, 7027, 5599, 63261, 158573}},
+{17419, 18, 67536, {1, 1, 7, 15, 13, 39, 113, 209, 213, 1017, 1197, 285, 4221, 6831, 13383, 2265, 34313, 160879}},
+{17420, 18, 67555, {1, 3, 7, 15, 25, 23, 95, 217, 141, 681, 451, 1275, 4957, 10197, 21375, 50905, 11087, 96135}},
+{17421, 18, 67598, {1, 3, 1, 11, 17, 35, 87, 15, 57, 777, 1429, 615, 681, 8437, 23981, 51781, 112169, 198471}},
+{17422, 18, 67615, {1, 3, 1, 5, 21, 37, 113, 105, 123, 327, 549, 1641, 7697, 2127, 5709, 8351, 56787, 260157}},
+{17423, 18, 67625, {1, 3, 7, 15, 19, 17, 51, 15, 367, 89, 1635, 353, 4855, 1551, 7197, 27403, 11259, 176029}},
+{17424, 18, 67645, {1, 3, 1, 1, 27, 9, 3, 35, 213, 31, 885, 797, 7077, 15641, 22509, 35193, 112411, 157335}},
+{17425, 18, 67651, {1, 1, 5, 1, 5, 9, 101, 149, 169, 581, 1927, 197, 5935, 6361, 3915, 15541, 69575, 102451}},
+{17426, 18, 67663, {1, 3, 3, 13, 23, 63, 45, 205, 271, 17, 707, 937, 2547, 12019, 8559, 26163, 58117, 138625}},
+{17427, 18, 67672, {1, 1, 3, 1, 19, 63, 125, 175, 253, 629, 1121, 3701, 7755, 61, 13037, 39417, 6179, 261923}},
+{17428, 18, 67682, {1, 1, 5, 1, 25, 63, 27, 245, 371, 657, 157, 3821, 3279, 8977, 9065, 35611, 27325, 205737}},
+{17429, 18, 67699, {1, 3, 7, 15, 7, 57, 19, 191, 1, 927, 1379, 2579, 4335, 7163, 4877, 51435, 17309, 100173}},
+{17430, 18, 67718, {1, 1, 1, 5, 21, 59, 107, 195, 317, 691, 541, 69, 7235, 2175, 25191, 23913, 126369, 9263}},
+{17431, 18, 67780, {1, 3, 5, 15, 17, 7, 67, 27, 263, 855, 1065, 973, 6705, 10729, 8719, 32741, 59207, 249107}},
+{17432, 18, 67795, {1, 3, 1, 1, 21, 23, 115, 119, 351, 207, 1691, 1105, 7479, 3877, 24439, 29017, 34171, 133797}},
+{17433, 18, 67804, {1, 3, 3, 3, 11, 23, 39, 165, 99, 1023, 309, 3933, 4235, 3891, 27237, 30887, 34363, 175017}},
+{17434, 18, 67818, {1, 3, 1, 5, 17, 33, 79, 105, 253, 515, 823, 1783, 1523, 2095, 10355, 8929, 51001, 112815}},
+{17435, 18, 67832, {1, 3, 7, 15, 11, 27, 123, 161, 279, 541, 1343, 1009, 6015, 8565, 27031, 233, 2153, 179243}},
+{17436, 18, 67941, {1, 1, 7, 7, 1, 53, 1, 33, 75, 57, 723, 3855, 3301, 14941, 6637, 25181, 103441, 208339}},
+{17437, 18, 67984, {1, 3, 7, 13, 3, 23, 11, 75, 55, 19, 1181, 3451, 4901, 2621, 18323, 42395, 95701, 237753}},
+{17438, 18, 68044, {1, 1, 1, 5, 1, 1, 123, 203, 367, 71, 1897, 295, 6719, 2647, 7135, 34511, 79853, 58351}},
+{17439, 18, 68059, {1, 3, 3, 7, 7, 63, 87, 91, 223, 265, 927, 3843, 1703, 11633, 8077, 26425, 46573, 181201}},
+{17440, 18, 68062, {1, 3, 3, 3, 1, 51, 3, 99, 37, 251, 1739, 2813, 3955, 8745, 4425, 42419, 124177, 173997}},
+{17441, 18, 68065, {1, 3, 5, 15, 9, 19, 11, 207, 123, 287, 1703, 2155, 2729, 4541, 4925, 4735, 77159, 97911}},
+{17442, 18, 68071, {1, 3, 3, 15, 23, 31, 35, 33, 507, 315, 1071, 3001, 7569, 11749, 3183, 6989, 68637, 177803}},
+{17443, 18, 68072, {1, 3, 5, 1, 31, 1, 113, 39, 295, 263, 1113, 619, 5523, 15385, 24115, 24233, 91943, 129299}},
+{17444, 18, 68085, {1, 1, 5, 11, 9, 57, 89, 49, 67, 601, 1277, 2275, 6349, 4141, 28397, 47061, 28143, 126291}},
+{17445, 18, 68090, {1, 3, 7, 15, 11, 63, 123, 187, 305, 1009, 1509, 2569, 2235, 8233, 27351, 53437, 34353, 105799}},
+{17446, 18, 68101, {1, 1, 3, 1, 13, 9, 11, 169, 427, 171, 1031, 633, 4275, 1173, 11233, 57997, 107753, 257337}},
+{17447, 18, 68102, {1, 3, 5, 5, 3, 39, 49, 233, 309, 999, 1275, 85, 1663, 16275, 9145, 18439, 59055, 249657}},
+{17448, 18, 68106, {1, 1, 3, 7, 11, 55, 73, 75, 115, 397, 945, 3657, 6847, 7341, 21305, 30119, 65675, 169281}},
+{17449, 18, 68164, {1, 1, 7, 7, 3, 5, 31, 179, 183, 479, 329, 217, 1077, 6893, 23425, 21903, 34293, 184819}},
+{17450, 18, 68191, {1, 1, 3, 3, 7, 63, 97, 255, 289, 917, 1881, 3829, 2433, 3473, 11045, 37739, 73349, 171899}},
+{17451, 18, 68192, {1, 3, 5, 5, 27, 23, 61, 151, 353, 667, 1889, 2323, 3261, 15999, 24225, 35265, 97301, 75743}},
+{17452, 18, 68195, {1, 3, 7, 1, 19, 41, 81, 61, 461, 275, 131, 2665, 5615, 1719, 21047, 42025, 97725, 196587}},
+{17453, 18, 68209, {1, 1, 7, 11, 3, 5, 47, 107, 397, 237, 1795, 3049, 5317, 14147, 15299, 50469, 83855, 75685}},
+{17454, 18, 68245, {1, 1, 7, 7, 19, 31, 39, 153, 225, 591, 1547, 3755, 3219, 15823, 4015, 30977, 63999, 198023}},
+{17455, 18, 68246, {1, 3, 1, 1, 17, 57, 91, 3, 425, 465, 735, 719, 2955, 3003, 6669, 14335, 32137, 82265}},
+{17456, 18, 68274, {1, 3, 1, 9, 13, 25, 93, 187, 119, 735, 447, 3387, 5111, 6525, 28241, 37643, 99023, 58551}},
+{17457, 18, 68293, {1, 1, 7, 1, 23, 15, 105, 89, 109, 743, 2007, 3131, 4839, 3285, 14681, 47097, 69531, 104647}},
+{17458, 18, 68294, {1, 1, 5, 7, 27, 33, 85, 109, 165, 569, 511, 3223, 2201, 2869, 30457, 42585, 125187, 83115}},
+{17459, 18, 68322, {1, 1, 7, 13, 1, 39, 55, 69, 279, 757, 425, 1317, 2403, 10711, 3341, 33491, 5607, 214161}},
+{17460, 18, 68353, {1, 3, 3, 9, 23, 57, 109, 9, 473, 323, 1371, 657, 5039, 1947, 12787, 29099, 81887, 44039}},
+{17461, 18, 68359, {1, 3, 1, 9, 21, 49, 39, 71, 493, 611, 1465, 3965, 7509, 5315, 4095, 21865, 123533, 148467}},
+{17462, 18, 68377, {1, 1, 7, 5, 15, 45, 67, 109, 143, 423, 205, 849, 1291, 245, 26275, 62873, 69177, 173705}},
+{17463, 18, 68401, {1, 3, 7, 13, 3, 13, 103, 45, 171, 919, 903, 2171, 5025, 14855, 895, 36937, 37643, 30311}},
+{17464, 18, 68422, {1, 3, 1, 5, 31, 35, 67, 111, 201, 183, 375, 905, 5705, 8839, 31551, 22525, 53013, 34189}},
+{17465, 18, 68434, {1, 1, 3, 7, 25, 11, 85, 231, 285, 957, 1731, 1267, 8179, 14195, 18405, 8489, 32503, 86257}},
+{17466, 18, 68443, {1, 3, 7, 5, 29, 7, 73, 15, 501, 909, 1325, 793, 4479, 12137, 30871, 36243, 109781, 7235}},
+{17467, 18, 68445, {1, 1, 3, 15, 13, 13, 75, 221, 497, 921, 1939, 2791, 5277, 6257, 11129, 109, 27549, 44901}},
+{17468, 18, 68476, {1, 1, 7, 3, 21, 9, 35, 113, 101, 15, 545, 2429, 5869, 11379, 14427, 28605, 108313, 220523}},
+{17469, 18, 68492, {1, 3, 5, 5, 21, 31, 79, 101, 11, 687, 609, 3741, 1259, 1529, 10185, 49863, 86529, 5147}},
+{17470, 18, 68504, {1, 3, 1, 5, 5, 49, 105, 213, 435, 201, 511, 525, 5219, 9503, 32023, 25407, 2493, 51165}},
+{17471, 18, 68525, {1, 1, 5, 9, 9, 61, 67, 107, 351, 519, 1373, 1261, 1069, 4325, 9579, 37117, 71759, 17601}},
+{17472, 18, 68540, {1, 1, 7, 7, 27, 63, 63, 229, 239, 291, 1813, 3831, 8091, 2553, 18445, 60707, 88855, 224325}},
+{17473, 18, 68543, {1, 1, 5, 7, 15, 23, 109, 7, 409, 447, 185, 3535, 4643, 13431, 11107, 48771, 95843, 155889}},
+{17474, 18, 68555, {1, 3, 3, 11, 9, 47, 13, 31, 83, 837, 1661, 2283, 299, 13161, 25305, 6079, 107237, 58477}},
+{17475, 18, 68563, {1, 3, 7, 15, 3, 31, 21, 245, 105, 141, 703, 71, 1887, 9345, 15719, 37737, 58431, 195997}},
+{17476, 18, 68576, {1, 1, 1, 13, 25, 21, 23, 67, 349, 581, 1585, 809, 3955, 4621, 25989, 25633, 107229, 193271}},
+{17477, 18, 68581, {1, 1, 5, 3, 15, 57, 111, 147, 243, 575, 851, 3461, 5171, 4203, 21855, 59579, 90509, 16897}},
+{17478, 18, 68617, {1, 1, 5, 13, 5, 45, 83, 59, 253, 261, 1277, 3179, 6397, 4277, 6629, 10979, 55759, 3033}},
+{17479, 18, 68631, {1, 1, 1, 9, 25, 1, 127, 159, 273, 357, 1343, 3209, 649, 6631, 1365, 40813, 98955, 181679}},
+{17480, 18, 68656, {1, 3, 1, 11, 1, 9, 67, 5, 41, 661, 863, 3769, 2737, 7261, 26829, 43093, 113025, 127975}},
+{17481, 18, 68666, {1, 1, 3, 3, 7, 5, 77, 207, 125, 625, 437, 1059, 2635, 1099, 25567, 63759, 97575, 231313}},
+{17482, 18, 68714, {1, 3, 7, 5, 21, 41, 11, 177, 489, 405, 1831, 1373, 6267, 11275, 23613, 55565, 120353, 98771}},
+{17483, 18, 68743, {1, 1, 3, 11, 15, 55, 103, 185, 493, 755, 1235, 3143, 4355, 4887, 11245, 60103, 4023, 184729}},
+{17484, 18, 68761, {1, 3, 1, 1, 23, 5, 103, 117, 269, 101, 2013, 1781, 6445, 8753, 15041, 13993, 28753, 47133}},
+{17485, 18, 68764, {1, 3, 7, 5, 9, 23, 1, 203, 19, 535, 1445, 1713, 5503, 11555, 6195, 35797, 55663, 10187}},
+{17486, 18, 68767, {1, 3, 5, 1, 15, 3, 125, 225, 447, 269, 1663, 1823, 4309, 12243, 16689, 3889, 41111, 123355}},
+{17487, 18, 68768, {1, 1, 1, 5, 21, 33, 83, 147, 243, 101, 1085, 121, 4939, 6081, 22621, 52995, 103047, 82531}},
+{17488, 18, 68786, {1, 3, 5, 3, 21, 3, 5, 81, 431, 191, 1973, 3675, 6691, 8687, 31619, 51669, 95541, 110447}},
+{17489, 18, 68788, {1, 1, 1, 15, 1, 11, 83, 145, 75, 133, 967, 2837, 5111, 6099, 9119, 53661, 128647, 40557}},
+{17490, 18, 68848, {1, 1, 1, 7, 3, 57, 101, 231, 255, 117, 1903, 2133, 3867, 11299, 647, 58853, 22153, 135959}},
+{17491, 18, 68851, {1, 3, 5, 5, 9, 19, 89, 229, 313, 421, 201, 953, 2487, 6283, 1305, 33421, 20933, 164841}},
+{17492, 18, 68914, {1, 1, 3, 3, 1, 45, 93, 165, 343, 577, 1329, 3019, 2727, 14397, 7123, 63347, 45525, 35133}},
+{17493, 18, 68946, {1, 3, 5, 5, 19, 1, 33, 55, 49, 1003, 1567, 2539, 7461, 14641, 7655, 37499, 65525, 84961}},
+{17494, 18, 68952, {1, 3, 5, 5, 29, 3, 77, 39, 251, 791, 215, 3779, 1589, 3577, 22299, 24133, 105449, 257157}},
+{17495, 18, 68973, {1, 3, 1, 5, 7, 23, 109, 209, 35, 571, 1047, 3453, 3657, 11713, 19379, 57101, 29943, 60909}},
+{17496, 18, 69001, {1, 1, 7, 11, 17, 63, 15, 175, 333, 831, 1447, 1991, 3339, 2519, 30127, 51481, 71935, 144995}},
+{17497, 18, 69016, {1, 3, 1, 11, 13, 51, 17, 67, 43, 209, 789, 1285, 5655, 5841, 10203, 32053, 15721, 211725}},
+{17498, 18, 69035, {1, 1, 5, 7, 31, 49, 69, 255, 325, 819, 1769, 1961, 7403, 1241, 2241, 40425, 14839, 178969}},
+{17499, 18, 69037, {1, 1, 3, 9, 1, 5, 9, 35, 167, 865, 337, 1079, 6195, 10139, 19215, 57607, 122437, 197147}},
+{17500, 18, 69049, {1, 1, 1, 15, 23, 7, 47, 155, 345, 547, 333, 3747, 961, 1397, 17067, 33385, 48253, 138611}},
+{17501, 18, 69052, {1, 1, 7, 9, 29, 27, 81, 183, 153, 171, 1125, 1929, 1047, 12463, 1543, 42981, 126163, 203259}},
+{17502, 18, 69058, {1, 1, 5, 3, 1, 41, 123, 213, 7, 179, 1, 3527, 1437, 3545, 2025, 5325, 27097, 187823}},
+{17503, 18, 69063, {1, 1, 7, 1, 19, 5, 111, 251, 431, 91, 1437, 1155, 335, 9587, 18287, 23937, 123331, 3939}},
+{17504, 18, 69075, {1, 1, 1, 9, 13, 59, 75, 219, 225, 313, 525, 2003, 7829, 7063, 22123, 4263, 95491, 9375}},
+{17505, 18, 69112, {1, 3, 1, 1, 27, 29, 71, 189, 169, 301, 165, 2967, 5147, 7127, 2191, 34259, 66605, 149603}},
+{17506, 18, 69117, {1, 3, 5, 13, 29, 57, 105, 31, 495, 311, 1161, 2109, 1471, 1275, 12761, 58379, 46365, 229935}},
+{17507, 18, 69124, {1, 1, 7, 3, 7, 49, 125, 189, 309, 399, 1361, 3969, 2177, 8171, 26623, 41855, 2809, 5825}},
+{17508, 18, 69127, {1, 3, 5, 7, 17, 21, 77, 101, 37, 661, 1743, 2243, 823, 12431, 26931, 7163, 108093, 191305}},
+{17509, 18, 69134, {1, 1, 7, 5, 27, 55, 109, 119, 13, 727, 421, 3469, 1137, 6125, 5107, 52733, 102891, 147425}},
+{17510, 18, 69139, {1, 1, 3, 5, 17, 45, 17, 211, 137, 21, 689, 1487, 233, 9845, 6499, 52617, 73081, 198137}},
+{17511, 18, 69161, {1, 3, 7, 1, 25, 27, 67, 7, 161, 633, 729, 807, 7371, 7301, 29499, 45939, 110565, 219491}},
+{17512, 18, 69196, {1, 3, 3, 13, 17, 7, 55, 211, 103, 981, 1809, 1913, 5705, 14011, 7405, 13893, 92053, 17997}},
+{17513, 18, 69224, {1, 1, 1, 1, 15, 9, 75, 37, 5, 443, 157, 2749, 5587, 16087, 14953, 26793, 21229, 226879}},
+{17514, 18, 69238, {1, 3, 3, 3, 9, 13, 113, 7, 255, 647, 235, 1713, 525, 8579, 20873, 49565, 43869, 145823}},
+{17515, 18, 69301, {1, 1, 5, 15, 9, 1, 119, 189, 73, 321, 1045, 467, 1565, 14381, 22683, 7939, 44337, 231901}},
+{17516, 18, 69316, {1, 1, 3, 13, 21, 61, 35, 105, 425, 395, 381, 1205, 3631, 8099, 23723, 29435, 94683, 180367}},
+{17517, 18, 69325, {1, 3, 3, 13, 19, 15, 59, 111, 355, 165, 857, 3131, 5037, 2527, 17533, 53563, 621, 89837}},
+{17518, 18, 69334, {1, 3, 3, 11, 11, 41, 3, 75, 179, 325, 897, 3141, 75, 1735, 493, 1123, 126763, 68645}},
+{17519, 18, 69347, {1, 3, 5, 7, 19, 61, 9, 99, 101, 583, 1967, 621, 1869, 10693, 2025, 62797, 85727, 212309}},
+{17520, 18, 69359, {1, 3, 1, 13, 23, 47, 15, 29, 199, 889, 423, 3995, 1655, 10753, 25301, 55551, 94829, 205833}},
+{17521, 18, 69381, {1, 1, 1, 1, 21, 1, 91, 237, 195, 721, 881, 1155, 4109, 10367, 1873, 6851, 13295, 182363}},
+{17522, 18, 69388, {1, 1, 5, 15, 19, 35, 37, 197, 137, 255, 93, 681, 949, 15183, 24785, 39357, 65547, 149013}},
+{17523, 18, 69393, {1, 3, 3, 3, 27, 27, 95, 239, 171, 513, 655, 1629, 4577, 3005, 1681, 2581, 59995, 83981}},
+{17524, 18, 69409, {1, 3, 3, 7, 29, 33, 111, 85, 437, 297, 1563, 2411, 6171, 2043, 17625, 59093, 995, 211599}},
+{17525, 18, 69422, {1, 3, 1, 13, 19, 35, 33, 9, 57, 153, 819, 2017, 5879, 13559, 23135, 25981, 41091, 50975}},
+{17526, 18, 69453, {1, 3, 5, 11, 23, 53, 11, 123, 119, 57, 1775, 3457, 7939, 4999, 10771, 23571, 30099, 17361}},
+{17527, 18, 69459, {1, 1, 7, 11, 27, 13, 7, 215, 7, 1009, 1967, 1845, 6679, 13781, 21797, 18755, 47131, 245907}},
+{17528, 18, 69481, {1, 1, 1, 3, 19, 47, 35, 13, 287, 349, 439, 3125, 2387, 12483, 3833, 29399, 27037, 30235}},
+{17529, 18, 69487, {1, 3, 1, 15, 17, 41, 15, 21, 499, 87, 1899, 2835, 1919, 925, 4525, 12935, 25021, 106657}},
+{17530, 18, 69490, {1, 1, 1, 13, 17, 59, 73, 75, 443, 199, 1871, 3447, 4517, 8395, 16661, 30655, 17871, 231337}},
+{17531, 18, 69495, {1, 1, 7, 1, 1, 53, 17, 49, 259, 77, 917, 631, 6061, 12291, 17715, 49761, 70699, 68313}},
+{17532, 18, 69501, {1, 1, 3, 9, 13, 27, 67, 149, 229, 347, 1397, 3457, 6047, 13117, 11, 18121, 70323, 36441}},
+{17533, 18, 69511, {1, 3, 5, 7, 27, 13, 69, 177, 451, 87, 647, 3797, 5433, 3137, 20213, 9809, 126877, 55243}},
+{17534, 18, 69512, {1, 3, 7, 13, 21, 57, 73, 157, 173, 631, 1527, 337, 5605, 8041, 2181, 19567, 19829, 63353}},
+{17535, 18, 69532, {1, 3, 3, 7, 11, 5, 111, 161, 247, 553, 435, 3883, 5639, 10889, 8953, 58297, 15197, 99711}},
+{17536, 18, 69542, {1, 1, 7, 13, 11, 29, 71, 251, 387, 1003, 1275, 763, 67, 10597, 5995, 53677, 4683, 2157}},
+{17537, 18, 69560, {1, 1, 3, 9, 23, 27, 93, 209, 325, 517, 297, 3215, 4359, 395, 10377, 36967, 69803, 190037}},
+{17538, 18, 69565, {1, 1, 1, 3, 27, 61, 21, 229, 469, 3, 387, 523, 4753, 2267, 9879, 32113, 60837, 76205}},
+{17539, 18, 69571, {1, 3, 1, 7, 31, 31, 67, 15, 161, 699, 713, 2973, 2007, 693, 21823, 57549, 28989, 157879}},
+{17540, 18, 69611, {1, 3, 1, 1, 3, 63, 111, 61, 311, 685, 1029, 345, 6763, 16217, 14505, 9777, 3513, 160985}},
+{17541, 18, 69633, {1, 1, 1, 11, 5, 25, 13, 79, 337, 3, 1997, 3489, 7621, 12115, 9221, 7953, 19067, 52697}},
+{17542, 18, 69640, {1, 1, 1, 3, 19, 3, 85, 127, 475, 391, 293, 2249, 1211, 1185, 17133, 6753, 65517, 98157}},
+{17543, 18, 69667, {1, 1, 5, 9, 11, 31, 57, 107, 315, 983, 1117, 2189, 4813, 9925, 26635, 30589, 32989, 44195}},
+{17544, 18, 69669, {1, 1, 7, 7, 21, 1, 1, 221, 421, 199, 539, 3981, 4627, 15655, 12621, 20427, 11619, 187185}},
+{17545, 18, 69679, {1, 1, 7, 5, 13, 19, 49, 31, 55, 35, 1847, 3173, 475, 15245, 30907, 50075, 130837, 87283}},
+{17546, 18, 69688, {1, 1, 7, 15, 13, 47, 13, 17, 169, 185, 1411, 1689, 2339, 2159, 10591, 52283, 26785, 255707}},
+{17547, 18, 69699, {1, 3, 5, 7, 3, 29, 7, 83, 329, 747, 1755, 1067, 2565, 2437, 12309, 15043, 97589, 69409}},
+{17548, 18, 69756, {1, 3, 3, 9, 19, 49, 9, 231, 427, 131, 485, 1637, 1129, 14723, 19071, 47997, 74613, 171539}},
+{17549, 18, 69759, {1, 1, 1, 1, 5, 17, 105, 39, 313, 407, 1321, 3013, 8035, 4395, 15917, 21105, 53599, 21341}},
+{17550, 18, 69770, {1, 3, 1, 15, 7, 35, 5, 153, 485, 1019, 713, 1891, 5023, 13885, 15911, 48215, 81719, 228189}},
+{17551, 18, 69772, {1, 1, 3, 3, 19, 3, 103, 55, 221, 847, 27, 1653, 4887, 3617, 30235, 42353, 67007, 21443}},
+{17552, 18, 69826, {1, 1, 7, 15, 15, 39, 65, 189, 251, 411, 1953, 1187, 141, 14919, 7763, 50879, 2569, 63467}},
+{17553, 18, 69840, {1, 1, 7, 1, 15, 3, 37, 133, 11, 745, 697, 3755, 1233, 2009, 25597, 40661, 40743, 198117}},
+{17554, 18, 69846, {1, 1, 7, 15, 5, 17, 13, 253, 197, 491, 1499, 2141, 6803, 13833, 27297, 385, 54341, 64305}},
+{17555, 18, 69868, {1, 3, 5, 7, 3, 11, 19, 193, 441, 575, 1649, 1821, 2621, 15803, 7343, 37361, 16467, 60629}},
+{17556, 18, 69885, {1, 3, 3, 11, 11, 29, 109, 1, 83, 475, 1913, 1975, 1289, 5221, 24221, 7479, 26683, 203435}},
+{17557, 18, 69946, {1, 1, 3, 13, 3, 35, 119, 131, 323, 413, 147, 4009, 3167, 11161, 30523, 65223, 109859, 239317}},
+{17558, 18, 69966, {1, 3, 1, 11, 25, 17, 103, 165, 437, 163, 1141, 105, 3655, 8105, 20859, 50727, 27915, 19309}},
+{17559, 18, 69973, {1, 3, 3, 11, 9, 59, 17, 135, 131, 781, 675, 2865, 7287, 11431, 3717, 56691, 54971, 83433}},
+{17560, 18, 69977, {1, 1, 1, 11, 3, 1, 59, 35, 299, 927, 1761, 823, 287, 13271, 30321, 32895, 45961, 23151}},
+{17561, 18, 69980, {1, 3, 3, 7, 11, 3, 11, 115, 241, 497, 1359, 1789, 6677, 2683, 21145, 58185, 46131, 17591}},
+{17562, 18, 69984, {1, 3, 1, 3, 17, 5, 65, 169, 247, 1001, 1183, 1801, 759, 2797, 28721, 7549, 112463, 127451}},
+{17563, 18, 69994, {1, 1, 1, 11, 1, 49, 5, 227, 333, 793, 759, 2845, 6261, 6325, 6581, 35853, 39737, 21457}},
+{17564, 18, 70024, {1, 1, 1, 3, 7, 17, 81, 105, 453, 207, 1113, 301, 4933, 14715, 18815, 29165, 85251, 209171}},
+{17565, 18, 70044, {1, 3, 1, 13, 3, 25, 7, 109, 249, 649, 1009, 937, 659, 14605, 13325, 26003, 45507, 166837}},
+{17566, 18, 70053, {1, 3, 7, 11, 19, 57, 55, 213, 261, 325, 761, 3167, 6823, 15039, 13329, 30195, 52103, 27877}},
+{17567, 18, 70086, {1, 3, 3, 11, 31, 45, 3, 185, 225, 143, 651, 327, 4263, 6005, 31577, 57779, 90485, 48393}},
+{17568, 18, 70113, {1, 1, 3, 13, 9, 21, 97, 63, 285, 531, 1275, 175, 693, 3735, 15137, 62193, 80533, 196545}},
+{17569, 18, 70120, {1, 1, 1, 11, 5, 25, 101, 111, 101, 17, 1999, 3709, 19, 5087, 20151, 4781, 88417, 186293}},
+{17570, 18, 70131, {1, 1, 5, 7, 31, 37, 39, 85, 451, 189, 1521, 619, 5021, 2601, 32447, 43513, 8317, 170611}},
+{17571, 18, 70150, {1, 1, 7, 1, 25, 45, 33, 111, 443, 719, 1869, 3619, 5751, 2649, 27823, 55465, 113203, 23875}},
+{17572, 18, 70178, {1, 3, 5, 15, 19, 47, 49, 241, 75, 395, 307, 1001, 137, 7029, 21661, 39159, 94129, 106693}},
+{17573, 18, 70198, {1, 3, 7, 1, 7, 35, 85, 27, 285, 975, 565, 2119, 5861, 9229, 15877, 25017, 10551, 155357}},
+{17574, 18, 70227, {1, 3, 3, 5, 29, 41, 17, 159, 211, 571, 907, 1745, 6541, 11643, 4441, 54599, 83359, 57227}},
+{17575, 18, 70285, {1, 3, 7, 5, 19, 11, 37, 191, 75, 443, 1833, 1715, 6949, 2477, 31161, 15647, 84305, 82887}},
+{17576, 18, 70288, {1, 1, 3, 9, 29, 35, 87, 11, 147, 443, 1659, 2457, 1615, 16135, 10729, 31583, 111583, 52607}},
+{17577, 18, 70291, {1, 3, 7, 1, 7, 47, 55, 133, 53, 23, 225, 2689, 3075, 12435, 8337, 37065, 58631, 247415}},
+{17578, 18, 70309, {1, 3, 3, 9, 23, 39, 5, 17, 353, 443, 627, 1609, 5277, 3899, 31111, 5935, 25445, 161043}},
+{17579, 18, 70334, {1, 3, 3, 11, 31, 11, 97, 99, 37, 169, 1361, 689, 5481, 5935, 11957, 36761, 105641, 250905}},
+{17580, 18, 70339, {1, 1, 7, 15, 31, 33, 3, 201, 125, 649, 315, 497, 7715, 2331, 9081, 16073, 88459, 70475}},
+{17581, 18, 70381, {1, 1, 7, 13, 25, 25, 39, 193, 185, 253, 495, 1143, 3745, 3459, 10935, 22029, 70213, 245827}},
+{17582, 18, 70413, {1, 3, 3, 11, 1, 47, 93, 27, 117, 755, 1837, 4045, 4839, 3413, 21395, 41905, 6505, 158029}},
+{17583, 18, 70414, {1, 3, 5, 5, 3, 41, 23, 207, 3, 409, 1635, 3511, 899, 747, 10623, 44933, 62439, 75577}},
+{17584, 18, 70481, {1, 3, 7, 15, 1, 15, 113, 175, 43, 513, 515, 1295, 1903, 9961, 20995, 57319, 40649, 22799}},
+{17585, 18, 70488, {1, 1, 5, 9, 7, 25, 99, 167, 117, 547, 777, 3819, 4409, 13465, 3963, 53355, 67895, 58007}},
+{17586, 18, 70493, {1, 1, 5, 9, 25, 9, 11, 113, 455, 563, 143, 1507, 4055, 6805, 25027, 37645, 475, 193193}},
+{17587, 18, 70515, {1, 1, 1, 11, 15, 27, 123, 199, 229, 27, 1285, 4013, 6541, 11203, 23705, 56821, 59665, 151109}},
+{17588, 18, 70540, {1, 1, 3, 1, 31, 19, 27, 129, 235, 407, 865, 2723, 5387, 7727, 2309, 45787, 118107, 199907}},
+{17589, 18, 70543, {1, 1, 5, 15, 17, 1, 21, 167, 165, 203, 745, 825, 7993, 15191, 13731, 13417, 543, 201511}},
+{17590, 18, 70558, {1, 3, 1, 1, 29, 49, 45, 81, 321, 755, 1319, 633, 4889, 7809, 6305, 58233, 20213, 144915}},
+{17591, 18, 70568, {1, 1, 3, 13, 1, 31, 73, 173, 111, 961, 1995, 3827, 879, 5567, 31103, 13227, 126611, 204507}},
+{17592, 18, 70582, {1, 1, 3, 7, 21, 3, 75, 137, 125, 981, 1991, 1167, 1249, 3821, 19503, 52855, 122329, 68717}},
+{17593, 18, 70593, {1, 1, 1, 13, 17, 17, 69, 167, 327, 635, 427, 2125, 7499, 9715, 24097, 39361, 64301, 63411}},
+{17594, 18, 70596, {1, 1, 1, 1, 31, 57, 55, 31, 289, 251, 823, 2301, 5965, 3381, 479, 39545, 93051, 68683}},
+{17595, 18, 70613, {1, 1, 3, 3, 15, 27, 117, 37, 29, 851, 1891, 3507, 6279, 323, 11451, 57961, 41487, 188359}},
+{17596, 18, 70620, {1, 1, 5, 1, 25, 55, 125, 207, 129, 849, 589, 1381, 3395, 645, 1157, 29285, 105423, 104429}},
+{17597, 18, 70647, {1, 1, 7, 7, 9, 47, 41, 103, 473, 395, 883, 1087, 2827, 9685, 6313, 15461, 39803, 254865}},
+{17598, 18, 70666, {1, 1, 7, 3, 17, 55, 71, 119, 159, 185, 1415, 3033, 3045, 1403, 18349, 2727, 123995, 45953}},
+{17599, 18, 70710, {1, 1, 3, 15, 17, 11, 19, 25, 483, 29, 1329, 1779, 2885, 6655, 28327, 42255, 87555, 211051}},
+{17600, 18, 70719, {1, 3, 5, 11, 29, 19, 43, 141, 157, 87, 1091, 3505, 3139, 11919, 12123, 31581, 116229, 167875}},
+{17601, 18, 70721, {1, 3, 1, 5, 25, 55, 113, 219, 491, 607, 1641, 3833, 3153, 1881, 16027, 39923, 38551, 204819}},
+{17602, 18, 70722, {1, 1, 5, 3, 7, 9, 73, 181, 305, 211, 1699, 983, 3051, 11643, 12445, 44827, 74613, 199699}},
+{17603, 18, 70742, {1, 1, 3, 5, 23, 21, 115, 49, 311, 205, 963, 1357, 4013, 8357, 7065, 47757, 7937, 249935}},
+{17604, 18, 70757, {1, 1, 1, 9, 23, 61, 21, 165, 9, 829, 457, 3975, 5831, 10901, 15871, 36769, 45899, 162083}},
+{17605, 18, 70764, {1, 1, 3, 3, 25, 41, 91, 45, 37, 939, 299, 3815, 6433, 3121, 10585, 62125, 51333, 171615}},
+{17606, 18, 70781, {1, 1, 5, 11, 1, 1, 39, 45, 141, 803, 1493, 1151, 6243, 8683, 30223, 53661, 7949, 197291}},
+{17607, 18, 70795, {1, 1, 3, 1, 17, 35, 29, 253, 395, 933, 1015, 3431, 139, 9095, 30745, 39747, 58837, 28517}},
+{17608, 18, 70803, {1, 1, 5, 3, 21, 17, 105, 21, 249, 387, 1985, 951, 6323, 8221, 24601, 57367, 18751, 240661}},
+{17609, 18, 70809, {1, 1, 7, 9, 5, 21, 23, 149, 243, 501, 935, 855, 1821, 15885, 2239, 39091, 93615, 31411}},
+{17610, 18, 70821, {1, 1, 1, 3, 23, 11, 43, 5, 65, 193, 1723, 3253, 7533, 12987, 571, 56073, 125061, 97117}},
+{17611, 18, 70846, {1, 1, 1, 13, 13, 21, 113, 79, 115, 867, 777, 2199, 501, 2913, 18697, 14959, 18369, 41631}},
+{17612, 18, 70882, {1, 1, 7, 13, 13, 53, 101, 165, 447, 995, 587, 201, 1701, 6429, 8647, 59265, 27321, 110841}},
+{17613, 18, 70887, {1, 3, 1, 3, 25, 35, 67, 95, 173, 877, 1133, 3027, 2321, 12517, 4313, 24469, 40313, 253095}},
+{17614, 18, 70940, {1, 1, 1, 9, 17, 33, 103, 141, 259, 963, 1975, 2979, 5017, 15689, 30659, 55145, 73737, 43539}},
+{17615, 18, 70961, {1, 3, 1, 15, 7, 7, 7, 1, 267, 415, 1591, 17, 2451, 13415, 6993, 16631, 90019, 237161}},
+{17616, 18, 70996, {1, 1, 7, 11, 11, 37, 107, 143, 263, 49, 1391, 3269, 6139, 1413, 26557, 16369, 86789, 89151}},
+{17617, 18, 71012, {1, 1, 7, 13, 27, 41, 3, 169, 453, 547, 157, 3219, 4711, 9805, 10657, 8121, 40229, 247825}},
+{17618, 18, 71046, {1, 3, 3, 3, 25, 25, 109, 253, 67, 901, 259, 1159, 6161, 6763, 19669, 42775, 74089, 69821}},
+{17619, 18, 71057, {1, 3, 7, 15, 11, 25, 91, 137, 247, 851, 511, 1847, 1179, 411, 9545, 31275, 46201, 169677}},
+{17620, 18, 71060, {1, 1, 5, 3, 3, 61, 19, 167, 491, 765, 1997, 3267, 883, 15439, 27581, 24865, 128245, 130055}},
+{17621, 18, 71063, {1, 1, 3, 9, 17, 61, 7, 109, 325, 347, 1109, 889, 2995, 4763, 21551, 60137, 91833, 126989}},
+{17622, 18, 71079, {1, 3, 3, 7, 5, 17, 61, 107, 209, 577, 885, 2611, 1471, 7549, 16199, 12319, 48865, 242229}},
+{17623, 18, 71080, {1, 3, 5, 1, 5, 49, 85, 177, 213, 583, 857, 179, 1805, 4297, 5835, 61923, 22741, 261983}},
+{17624, 18, 71111, {1, 3, 1, 13, 1, 1, 83, 227, 457, 375, 567, 1563, 2085, 8153, 12563, 44561, 115487, 188351}},
+{17625, 18, 71118, {1, 3, 1, 9, 15, 39, 127, 135, 181, 967, 1495, 3187, 7463, 9651, 26261, 57435, 42069, 48549}},
+{17626, 18, 71129, {1, 3, 1, 7, 5, 31, 111, 19, 19, 855, 273, 2089, 6001, 2799, 26013, 6625, 75623, 150185}},
+{17627, 18, 71136, {1, 1, 7, 1, 31, 19, 15, 159, 35, 791, 1005, 3947, 7031, 41, 28807, 45299, 37761, 101191}},
+{17628, 18, 71142, {1, 3, 5, 3, 15, 7, 7, 67, 329, 367, 843, 2309, 3023, 5369, 21561, 18881, 14395, 193369}},
+{17629, 18, 71145, {1, 3, 3, 11, 21, 53, 3, 251, 87, 131, 563, 847, 8049, 1639, 30103, 30461, 108427, 125197}},
+{17630, 18, 71151, {1, 1, 1, 5, 21, 45, 79, 229, 29, 133, 1873, 261, 4221, 3091, 25569, 11219, 70693, 227025}},
+{17631, 18, 71163, {1, 3, 1, 5, 17, 9, 75, 101, 155, 311, 789, 821, 7361, 3791, 18511, 57607, 97647, 42107}},
+{17632, 18, 71218, {1, 3, 1, 11, 21, 39, 33, 179, 7, 775, 55, 3779, 6163, 3575, 27535, 32363, 9169, 57133}},
+{17633, 18, 71223, {1, 3, 7, 3, 19, 33, 19, 11, 173, 175, 219, 3585, 1115, 15693, 23481, 45669, 94149, 19531}},
+{17634, 18, 71232, {1, 1, 5, 11, 11, 49, 29, 217, 229, 757, 1031, 3833, 4235, 13535, 8765, 20707, 52851, 9037}},
+{17635, 18, 71237, {1, 3, 1, 13, 25, 61, 65, 111, 95, 533, 1235, 2947, 3239, 9513, 11395, 9321, 117535, 228289}},
+{17636, 18, 71272, {1, 1, 1, 3, 19, 33, 13, 233, 331, 811, 1931, 1109, 7705, 3129, 19757, 44325, 97903, 165311}},
+{17637, 18, 71323, {1, 1, 3, 15, 13, 55, 57, 81, 257, 613, 1305, 653, 6059, 4935, 15707, 4717, 1859, 109265}},
+{17638, 18, 71339, {1, 1, 7, 15, 15, 19, 19, 91, 213, 311, 1651, 2215, 6985, 2989, 11961, 28647, 111163, 217187}},
+{17639, 18, 71341, {1, 3, 3, 5, 15, 31, 45, 193, 119, 11, 511, 3155, 5989, 813, 32655, 41531, 121007, 24733}},
+{17640, 18, 71349, {1, 3, 7, 1, 19, 63, 61, 11, 225, 677, 1323, 1655, 7607, 15691, 27083, 56743, 116167, 250413}},
+{17641, 18, 71368, {1, 1, 1, 15, 7, 25, 27, 213, 171, 1011, 1483, 119, 6849, 12527, 20601, 35701, 68377, 245669}},
+{17642, 18, 71379, {1, 3, 7, 5, 27, 5, 7, 117, 127, 871, 631, 3395, 1501, 4839, 1857, 45769, 107597, 90385}},
+{17643, 18, 71395, {1, 1, 3, 13, 1, 15, 49, 69, 479, 919, 881, 3069, 5609, 12795, 30225, 14411, 122847, 75569}},
+{17644, 18, 71407, {1, 1, 5, 9, 1, 15, 91, 207, 235, 667, 321, 2047, 841, 16049, 12499, 8799, 8245, 42199}},
+{17645, 18, 71421, {1, 3, 7, 15, 11, 19, 99, 163, 331, 953, 791, 3443, 3215, 8025, 1999, 43685, 72595, 153185}},
+{17646, 18, 71430, {1, 3, 1, 13, 25, 23, 17, 133, 59, 233, 151, 1971, 3611, 3951, 16979, 991, 73325, 158475}},
+{17647, 18, 71436, {1, 3, 5, 11, 1, 53, 123, 81, 285, 457, 1183, 489, 939, 3069, 15845, 24799, 81301, 105187}},
+{17648, 18, 71454, {1, 3, 5, 1, 11, 5, 61, 151, 5, 813, 1347, 1107, 4915, 4035, 18709, 20909, 60569, 55007}},
+{17649, 18, 71467, {1, 3, 3, 7, 27, 41, 79, 193, 471, 415, 937, 2561, 1669, 9213, 21145, 44917, 64763, 33195}},
+{17650, 18, 71472, {1, 3, 7, 13, 31, 5, 71, 237, 419, 957, 1741, 2829, 5879, 8143, 8717, 48995, 114465, 110295}},
+{17651, 18, 71478, {1, 1, 7, 3, 7, 23, 83, 161, 381, 313, 383, 2813, 333, 4647, 18321, 10437, 111645, 55509}},
+{17652, 18, 71481, {1, 1, 5, 9, 23, 1, 83, 121, 245, 37, 1097, 1437, 3891, 2727, 30775, 27649, 95571, 216245}},
+{17653, 18, 71501, {1, 1, 5, 7, 1, 43, 59, 253, 329, 421, 791, 3945, 2599, 2243, 11121, 37761, 27223, 176867}},
+{17654, 18, 71519, {1, 3, 5, 5, 25, 59, 85, 155, 367, 291, 1025, 1415, 7871, 14191, 23249, 32233, 93253, 177869}},
+{17655, 18, 71530, {1, 1, 1, 9, 21, 41, 111, 241, 177, 999, 779, 2827, 1683, 6405, 16133, 26523, 102567, 190313}},
+{17656, 18, 71550, {1, 3, 3, 15, 13, 59, 69, 239, 231, 511, 1675, 147, 4041, 3723, 29191, 24913, 15601, 198141}},
+{17657, 18, 71573, {1, 3, 3, 9, 17, 29, 1, 107, 243, 509, 1949, 205, 1693, 6339, 31591, 61527, 128043, 222497}},
+{17658, 18, 71593, {1, 3, 7, 3, 21, 7, 87, 57, 9, 209, 1831, 2189, 5523, 8509, 23687, 46221, 87469, 146815}},
+{17659, 18, 71608, {1, 3, 7, 9, 5, 45, 51, 207, 401, 681, 469, 1951, 793, 16379, 32143, 55457, 91787, 178569}},
+{17660, 18, 71619, {1, 3, 3, 9, 19, 15, 121, 143, 243, 795, 1839, 2411, 7175, 11535, 31995, 4157, 20111, 92653}},
+{17661, 18, 71622, {1, 3, 1, 1, 1, 5, 47, 107, 455, 429, 1411, 2375, 2823, 14657, 16297, 21893, 115257, 50343}},
+{17662, 18, 71636, {1, 3, 5, 9, 19, 63, 55, 197, 281, 797, 1539, 2601, 4497, 1631, 26583, 23819, 104553, 27285}},
+{17663, 18, 71650, {1, 1, 3, 9, 23, 41, 123, 37, 327, 789, 1711, 1299, 6735, 7243, 30635, 21251, 56081, 65623}},
+{17664, 18, 71655, {1, 3, 7, 15, 25, 49, 89, 231, 133, 1003, 351, 765, 7115, 16239, 1141, 44063, 31519, 233719}},
+{17665, 18, 71685, {1, 3, 7, 3, 13, 37, 93, 83, 59, 539, 1185, 525, 705, 993, 1113, 1871, 60817, 254075}},
+{17666, 18, 71703, {1, 3, 7, 11, 25, 33, 23, 21, 141, 451, 25, 1321, 5139, 8947, 10305, 30175, 43123, 113049}},
+{17667, 18, 71714, {1, 3, 5, 5, 17, 1, 125, 211, 143, 637, 1175, 1149, 6775, 11091, 12503, 5537, 35379, 30045}},
+{17668, 18, 71748, {1, 1, 1, 15, 17, 31, 123, 33, 279, 831, 1247, 2305, 1033, 3201, 231, 23173, 34453, 66617}},
+{17669, 18, 71758, {1, 3, 3, 1, 3, 1, 23, 115, 421, 553, 273, 4091, 5965, 7521, 18393, 31229, 78533, 243921}},
+{17670, 18, 71766, {1, 1, 7, 15, 15, 29, 73, 165, 391, 215, 1801, 45, 7451, 6969, 27897, 36599, 103647, 145165}},
+{17671, 18, 71772, {1, 3, 3, 13, 5, 7, 67, 81, 477, 301, 1397, 921, 3777, 12431, 14753, 50555, 24497, 52995}},
+{17672, 18, 71785, {1, 1, 5, 5, 27, 21, 91, 155, 405, 347, 1135, 3701, 2471, 577, 3927, 52605, 1725, 25803}},
+{17673, 18, 71794, {1, 3, 1, 3, 15, 57, 117, 175, 437, 13, 1821, 649, 899, 1295, 2753, 2183, 47923, 163407}},
+{17674, 18, 71796, {1, 3, 5, 9, 23, 15, 103, 179, 233, 787, 715, 3751, 3321, 2069, 8299, 43417, 96549, 180737}},
+{17675, 18, 71803, {1, 3, 7, 9, 1, 41, 81, 205, 141, 707, 397, 763, 4797, 8843, 3311, 37425, 43873, 131491}},
+{17676, 18, 71809, {1, 1, 5, 3, 9, 29, 123, 163, 15, 871, 159, 2615, 6987, 471, 25653, 11295, 94481, 195409}},
+{17677, 18, 71858, {1, 3, 7, 3, 13, 7, 9, 59, 59, 381, 2027, 2639, 59, 7977, 14505, 34327, 99113, 157439}},
+{17678, 18, 71863, {1, 1, 5, 9, 27, 13, 87, 85, 443, 531, 1069, 3479, 6547, 13943, 13711, 11007, 37395, 190293}},
+{17679, 18, 71878, {1, 3, 7, 9, 19, 47, 95, 229, 395, 979, 359, 1799, 7389, 14377, 19371, 56785, 6699, 215433}},
+{17680, 18, 71895, {1, 1, 1, 5, 21, 15, 59, 17, 281, 585, 293, 3029, 2539, 16089, 19, 34757, 115811, 235565}},
+{17681, 18, 71899, {1, 1, 7, 11, 27, 19, 55, 217, 475, 119, 1291, 1761, 6879, 4355, 30019, 17573, 14987, 204623}},
+{17682, 18, 71906, {1, 1, 7, 11, 29, 47, 5, 201, 165, 845, 385, 2903, 7735, 10855, 14171, 17881, 45001, 100725}},
+{17683, 18, 71908, {1, 1, 5, 5, 31, 57, 99, 35, 315, 363, 1135, 897, 1041, 729, 26987, 15299, 29563, 67293}},
+{17684, 18, 71917, {1, 1, 5, 7, 27, 13, 99, 81, 491, 887, 1309, 3343, 7241, 1289, 12021, 52533, 101799, 238721}},
+{17685, 18, 71952, {1, 1, 1, 11, 27, 49, 79, 235, 49, 215, 2003, 2771, 5943, 1183, 31931, 33885, 56971, 52665}},
+{17686, 18, 71957, {1, 1, 1, 13, 13, 1, 123, 1, 191, 747, 859, 2287, 5113, 3715, 2217, 61483, 195, 237163}},
+{17687, 18, 71961, {1, 3, 7, 15, 13, 13, 17, 207, 141, 821, 231, 1373, 5355, 6503, 2403, 18183, 83717, 170047}},
+{17688, 18, 71973, {1, 3, 1, 3, 13, 11, 41, 51, 443, 201, 1349, 2331, 1009, 16169, 5247, 50315, 15589, 150497}},
+{17689, 18, 71980, {1, 3, 5, 13, 29, 21, 93, 55, 27, 17, 1615, 3473, 3641, 10999, 31955, 4699, 23585, 141243}},
+{17690, 18, 71997, {1, 3, 3, 11, 11, 27, 125, 139, 53, 637, 241, 2651, 4999, 5923, 16203, 13645, 95965, 94459}},
+{17691, 18, 72017, {1, 3, 7, 3, 9, 53, 87, 171, 489, 691, 303, 3599, 6093, 841, 3527, 12953, 22907, 69823}},
+{17692, 18, 72060, {1, 1, 5, 13, 31, 11, 33, 207, 437, 683, 703, 1757, 1443, 14269, 12677, 20877, 46791, 176135}},
+{17693, 18, 72091, {1, 1, 7, 1, 13, 53, 123, 199, 173, 585, 1099, 3653, 2253, 13741, 15675, 38755, 74545, 139053}},
+{17694, 18, 72097, {1, 3, 3, 3, 17, 11, 1, 161, 383, 409, 605, 889, 827, 263, 9677, 42857, 127691, 99621}},
+{17695, 18, 72166, {1, 3, 5, 9, 21, 21, 11, 151, 199, 695, 493, 569, 881, 10533, 11255, 61997, 124921, 211139}},
+{17696, 18, 72172, {1, 3, 5, 5, 9, 47, 109, 7, 195, 287, 97, 3691, 6929, 6985, 3063, 16185, 6313, 228147}},
+{17697, 18, 72183, {1, 3, 1, 3, 3, 9, 107, 243, 391, 893, 1207, 2229, 5295, 723, 14753, 10921, 104147, 214941}},
+{17698, 18, 72203, {1, 3, 1, 9, 5, 63, 63, 247, 413, 805, 285, 4001, 6735, 3531, 25949, 44845, 66959, 194429}},
+{17699, 18, 72205, {1, 1, 3, 1, 15, 15, 43, 69, 419, 739, 1739, 1091, 1043, 3217, 1139, 44749, 74131, 165145}},
+{17700, 18, 72213, {1, 1, 3, 9, 17, 53, 119, 25, 427, 791, 1873, 481, 6793, 4767, 30449, 18079, 52105, 260371}},
+{17701, 18, 72214, {1, 1, 3, 15, 15, 41, 15, 53, 395, 571, 1727, 3081, 4531, 4215, 22359, 18165, 91843, 157273}},
+{17702, 18, 72230, {1, 3, 3, 9, 19, 15, 55, 185, 321, 285, 695, 1067, 2551, 1401, 20023, 22671, 21365, 89053}},
+{17703, 18, 72239, {1, 1, 7, 15, 23, 57, 71, 141, 57, 479, 543, 3783, 3635, 14011, 23603, 40877, 21837, 81079}},
+{17704, 18, 72248, {1, 3, 7, 11, 31, 5, 83, 177, 105, 981, 331, 2901, 1781, 8407, 30199, 19287, 116219, 78471}},
+{17705, 18, 72251, {1, 1, 1, 9, 7, 13, 61, 21, 299, 15, 1045, 475, 7141, 4827, 5921, 17323, 42909, 203623}},
+{17706, 18, 72280, {1, 3, 7, 1, 17, 59, 99, 221, 77, 37, 1263, 2137, 1567, 12473, 20029, 9231, 32739, 17021}},
+{17707, 18, 72313, {1, 1, 1, 5, 23, 61, 39, 13, 97, 191, 1479, 19, 1913, 3185, 32393, 59067, 5483, 158895}},
+{17708, 18, 72338, {1, 1, 1, 7, 5, 51, 81, 223, 435, 939, 781, 1153, 6409, 6369, 30559, 19007, 50121, 26525}},
+{17709, 18, 72340, {1, 3, 3, 5, 29, 1, 57, 127, 153, 897, 161, 683, 295, 11207, 245, 1819, 3061, 242609}},
+{17710, 18, 72343, {1, 1, 1, 7, 5, 19, 105, 57, 263, 433, 1339, 1479, 6671, 9917, 26299, 4573, 68725, 195}},
+{17711, 18, 72368, {1, 3, 5, 15, 1, 19, 45, 95, 155, 117, 367, 2051, 1053, 8847, 6399, 23641, 95355, 98415}},
+{17712, 18, 72371, {1, 3, 3, 15, 3, 1, 5, 115, 349, 747, 1865, 1669, 659, 7097, 7871, 3685, 11013, 59837}},
+{17713, 18, 72426, {1, 3, 3, 5, 9, 47, 51, 131, 327, 903, 975, 2481, 3509, 12481, 4049, 38053, 4629, 254415}},
+{17714, 18, 72439, {1, 3, 5, 9, 31, 47, 1, 29, 37, 683, 1363, 2527, 4019, 4965, 14077, 14191, 101, 1945}},
+{17715, 18, 72446, {1, 1, 7, 1, 9, 35, 41, 187, 509, 33, 385, 3907, 1461, 6827, 6931, 44723, 109495, 184641}},
+{17716, 18, 72494, {1, 3, 5, 9, 5, 49, 21, 171, 353, 927, 409, 913, 5199, 11747, 8777, 19891, 63189, 118839}},
+{17717, 18, 72519, {1, 3, 3, 1, 27, 49, 43, 157, 75, 469, 787, 3957, 4147, 13919, 17489, 57103, 62091, 135589}},
+{17718, 18, 72573, {1, 1, 3, 11, 7, 45, 29, 177, 185, 185, 1537, 127, 121, 817, 31269, 1677, 20245, 3835}},
+{17719, 18, 72577, {1, 1, 5, 3, 21, 9, 67, 79, 391, 971, 1711, 2607, 5705, 12863, 12415, 41255, 26447, 1643}},
+{17720, 18, 72578, {1, 1, 5, 5, 9, 63, 67, 245, 31, 225, 309, 1753, 1507, 817, 4275, 51843, 22331, 196875}},
+{17721, 18, 72614, {1, 3, 1, 13, 15, 39, 3, 245, 147, 485, 241, 2507, 1859, 7299, 15037, 41139, 82757, 224031}},
+{17722, 18, 72628, {1, 3, 3, 15, 7, 51, 9, 103, 37, 643, 25, 2067, 7619, 11991, 12885, 46809, 109107, 22393}},
+{17723, 18, 72640, {1, 1, 1, 9, 1, 55, 119, 85, 115, 827, 187, 2241, 2553, 577, 12115, 2391, 69705, 232101}},
+{17724, 18, 72676, {1, 1, 5, 7, 13, 61, 125, 129, 475, 703, 1723, 3233, 5713, 1941, 21375, 42119, 75199, 73163}},
+{17725, 18, 72708, {1, 1, 5, 5, 5, 21, 73, 155, 493, 81, 1627, 827, 5925, 7391, 1587, 39425, 11807, 64385}},
+{17726, 18, 72717, {1, 3, 1, 15, 27, 35, 111, 183, 283, 335, 1387, 669, 6041, 11637, 26255, 21113, 121183, 219703}},
+{17727, 18, 72766, {1, 3, 5, 15, 15, 23, 119, 91, 197, 809, 975, 3275, 6171, 11769, 8385, 5461, 4561, 29159}},
+{17728, 18, 72786, {1, 1, 5, 9, 29, 9, 107, 233, 417, 1005, 799, 1437, 2679, 15643, 32341, 54055, 27861, 115483}},
+{17729, 18, 72788, {1, 1, 5, 7, 27, 19, 95, 153, 175, 407, 215, 303, 8165, 14791, 2099, 61797, 129411, 10461}},
+{17730, 18, 72795, {1, 1, 1, 13, 25, 51, 11, 77, 97, 495, 971, 449, 2833, 7121, 24105, 34527, 123135, 129305}},
+{17731, 18, 72797, {1, 1, 7, 11, 23, 9, 111, 101, 169, 233, 267, 953, 6379, 15887, 22921, 33665, 95195, 159707}},
+{17732, 18, 72798, {1, 1, 5, 15, 21, 3, 21, 57, 173, 513, 2027, 1235, 5031, 5375, 2717, 23361, 71817, 232101}},
+{17733, 18, 72808, {1, 3, 3, 11, 7, 25, 43, 65, 19, 135, 1611, 85, 7673, 6459, 27813, 55557, 100989, 25205}},
+{17734, 18, 72826, {1, 3, 7, 1, 15, 37, 55, 141, 239, 205, 647, 3715, 1617, 13507, 9847, 64681, 108711, 231329}},
+{17735, 18, 72835, {1, 3, 5, 9, 21, 27, 79, 153, 335, 299, 493, 887, 1457, 16011, 13795, 50205, 43319, 130963}},
+{17736, 18, 72837, {1, 1, 3, 1, 23, 59, 121, 83, 463, 151, 323, 2977, 4769, 6011, 20135, 59541, 23179, 203487}},
+{17737, 18, 72865, {1, 1, 5, 7, 9, 17, 63, 149, 59, 281, 763, 619, 2551, 8179, 2963, 61283, 107727, 119817}},
+{17738, 18, 72871, {1, 3, 7, 3, 15, 39, 11, 145, 141, 965, 505, 2625, 4335, 7619, 11007, 43321, 33199, 212661}},
+{17739, 18, 72872, {1, 3, 5, 9, 9, 61, 27, 223, 5, 941, 513, 1437, 481, 9651, 6567, 57945, 52547, 21283}},
+{17740, 18, 72898, {1, 3, 1, 1, 25, 1, 87, 25, 121, 757, 529, 3857, 1321, 13479, 5357, 49341, 5797, 235895}},
+{17741, 18, 72907, {1, 3, 5, 1, 21, 35, 37, 215, 509, 165, 1423, 3067, 4779, 4693, 12523, 48099, 69283, 255111}},
+{17742, 18, 72909, {1, 1, 3, 1, 31, 15, 45, 127, 339, 331, 1249, 1075, 6169, 2941, 30471, 46789, 118039, 224651}},
+{17743, 18, 72917, {1, 1, 5, 13, 21, 37, 39, 61, 191, 17, 177, 3719, 2177, 11039, 20047, 14489, 20475, 171235}},
+{17744, 18, 72934, {1, 1, 3, 9, 19, 11, 65, 111, 121, 901, 99, 1861, 3687, 765, 24861, 46315, 63433, 171679}},
+{17745, 18, 72987, {1, 3, 1, 7, 1, 51, 87, 199, 241, 909, 353, 2471, 7163, 9547, 16351, 41129, 12217, 194099}},
+{17746, 18, 73000, {1, 1, 7, 7, 17, 17, 127, 67, 51, 217, 1189, 19, 2099, 10281, 9071, 21185, 122821, 110211}},
+{17747, 18, 73005, {1, 3, 3, 7, 15, 3, 53, 45, 77, 665, 701, 3175, 6151, 2639, 19819, 1063, 25079, 203343}},
+{17748, 18, 73014, {1, 1, 5, 11, 11, 5, 103, 11, 481, 999, 713, 499, 5069, 921, 20619, 25623, 69601, 82941}},
+{17749, 18, 73023, {1, 3, 5, 9, 15, 61, 67, 79, 371, 993, 475, 617, 1611, 12513, 14907, 55313, 39207, 112653}},
+{17750, 18, 73025, {1, 1, 5, 15, 17, 45, 91, 187, 175, 465, 907, 3371, 3743, 15657, 30511, 58191, 105683, 216759}},
+{17751, 18, 73074, {1, 1, 5, 9, 23, 1, 17, 79, 73, 717, 1785, 677, 7377, 4511, 21927, 34341, 47119, 193977}},
+{17752, 18, 73076, {1, 3, 7, 13, 21, 1, 59, 179, 121, 641, 175, 563, 961, 10549, 15779, 49875, 8109, 1039}},
+{17753, 18, 73113, {1, 1, 5, 7, 17, 9, 37, 171, 335, 135, 1403, 2541, 3845, 15311, 1905, 40853, 11013, 255669}},
+{17754, 18, 73116, {1, 1, 7, 1, 5, 23, 113, 111, 337, 755, 2037, 3067, 2821, 10549, 28467, 22615, 71585, 61871}},
+{17755, 18, 73140, {1, 1, 3, 9, 7, 3, 49, 229, 111, 871, 1711, 1793, 3089, 12571, 30883, 44773, 80827, 151709}},
+{17756, 18, 73149, {1, 1, 5, 1, 13, 41, 3, 253, 399, 881, 1107, 4081, 1849, 115, 31557, 2515, 126751, 195663}},
+{17757, 18, 73186, {1, 1, 3, 1, 13, 31, 113, 85, 57, 549, 1653, 2927, 5433, 11879, 22709, 41675, 13395, 46931}},
+{17758, 18, 73188, {1, 1, 3, 9, 21, 1, 109, 65, 377, 63, 861, 1031, 2709, 7265, 9861, 64109, 34577, 9743}},
+{17759, 18, 73191, {1, 1, 7, 7, 17, 31, 5, 177, 253, 387, 1271, 2805, 2211, 1813, 11649, 3217, 123793, 197753}},
+{17760, 18, 73205, {1, 1, 3, 9, 15, 63, 89, 59, 455, 783, 1181, 7, 2309, 15961, 11231, 37389, 101221, 119331}},
+{17761, 18, 73215, {1, 3, 3, 13, 7, 3, 15, 251, 431, 951, 639, 1585, 1247, 15927, 9695, 37469, 34945, 219723}},
+{17762, 18, 73216, {1, 1, 5, 3, 21, 29, 83, 151, 383, 227, 215, 2329, 1297, 13709, 15653, 3119, 111319, 222877}},
+{17763, 18, 73239, {1, 3, 1, 13, 1, 43, 127, 125, 243, 955, 583, 3497, 6605, 3821, 4657, 10599, 90927, 82725}},
+{17764, 18, 73294, {1, 1, 1, 1, 15, 51, 61, 167, 489, 603, 873, 907, 575, 6957, 24409, 63587, 50205, 159291}},
+{17765, 18, 73311, {1, 3, 3, 1, 19, 23, 7, 23, 239, 961, 1001, 1541, 2211, 4637, 19931, 39153, 102769, 242005}},
+{17766, 18, 73330, {1, 1, 1, 15, 19, 31, 73, 121, 119, 199, 979, 4061, 3903, 12055, 27957, 15999, 5709, 210329}},
+{17767, 18, 73366, {1, 1, 7, 13, 25, 35, 21, 25, 241, 937, 13, 947, 943, 3727, 15321, 46665, 99437, 233919}},
+{17768, 18, 73379, {1, 1, 1, 9, 3, 51, 127, 113, 105, 335, 685, 2173, 4329, 7569, 5617, 32407, 21649, 30609}},
+{17769, 18, 73386, {1, 3, 7, 9, 9, 13, 69, 191, 95, 727, 1649, 1201, 2093, 10053, 29381, 6207, 70755, 118505}},
+{17770, 18, 73391, {1, 1, 1, 11, 21, 57, 77, 139, 271, 21, 1747, 2337, 7761, 7753, 6847, 5219, 87033, 229105}},
+{17771, 18, 73418, {1, 3, 3, 1, 5, 51, 15, 235, 87, 567, 391, 3039, 2253, 11177, 11899, 25305, 14815, 51051}},
+{17772, 18, 73438, {1, 3, 5, 7, 27, 51, 69, 93, 261, 947, 31, 2751, 6685, 3655, 24125, 22161, 108421, 230865}},
+{17773, 18, 73476, {1, 1, 3, 3, 27, 17, 35, 97, 285, 855, 1767, 2545, 825, 11519, 11231, 50951, 32883, 78573}},
+{17774, 18, 73503, {1, 3, 7, 13, 1, 57, 99, 193, 371, 839, 1319, 2295, 5897, 7893, 14339, 64217, 16951, 234953}},
+{17775, 18, 73509, {1, 3, 1, 3, 11, 37, 13, 21, 299, 379, 63, 1209, 7879, 5001, 10181, 40173, 1753, 104821}},
+{17776, 18, 73534, {1, 3, 5, 9, 23, 51, 75, 103, 249, 533, 621, 15, 1883, 2109, 20859, 4635, 120615, 135515}},
+{17777, 18, 73545, {1, 1, 3, 3, 21, 45, 113, 57, 495, 457, 685, 3625, 243, 14831, 12351, 63001, 118191, 153875}},
+{17778, 18, 73548, {1, 3, 5, 5, 21, 15, 65, 251, 183, 241, 1513, 2711, 4527, 12675, 26747, 5181, 4237, 246479}},
+{17779, 18, 73563, {1, 1, 5, 3, 27, 29, 91, 93, 345, 893, 195, 3109, 2611, 12657, 10401, 15063, 95807, 244587}},
+{17780, 18, 73575, {1, 3, 5, 13, 19, 49, 85, 155, 159, 939, 1139, 1569, 1129, 8641, 18391, 55201, 108491, 77863}},
+{17781, 18, 73582, {1, 3, 5, 9, 25, 53, 75, 77, 85, 903, 1399, 2379, 2219, 14725, 21877, 24271, 40955, 61849}},
+{17782, 18, 73603, {1, 1, 5, 9, 13, 49, 53, 177, 163, 331, 533, 1469, 1397, 8187, 12379, 10185, 125541, 260271}},
+{17783, 18, 73609, {1, 1, 7, 9, 19, 31, 81, 89, 281, 397, 1917, 145, 2723, 15019, 18841, 13887, 11859, 171749}},
+{17784, 18, 73610, {1, 3, 7, 13, 25, 17, 87, 189, 29, 283, 913, 3855, 5707, 15881, 12787, 42357, 84579, 78531}},
+{17785, 18, 73645, {1, 1, 5, 15, 15, 31, 37, 249, 445, 119, 431, 4069, 5699, 10119, 31661, 9555, 6869, 1145}},
+{17786, 18, 73646, {1, 3, 7, 1, 31, 29, 57, 177, 341, 411, 1019, 1889, 383, 1461, 26695, 61777, 18367, 137233}},
+{17787, 18, 73678, {1, 3, 5, 1, 7, 53, 29, 53, 387, 675, 435, 461, 6247, 7519, 14003, 9037, 116599, 54471}},
+{17788, 18, 73685, {1, 3, 3, 7, 17, 59, 91, 77, 169, 591, 95, 113, 6135, 10479, 17153, 52953, 16183, 90775}},
+{17789, 18, 73708, {1, 3, 3, 15, 11, 11, 117, 141, 493, 163, 65, 1305, 7477, 7383, 22651, 64271, 80983, 154845}},
+{17790, 18, 73747, {1, 1, 1, 3, 9, 15, 83, 11, 113, 77, 1115, 1417, 511, 6825, 21013, 37241, 104695, 31335}},
+{17791, 18, 73765, {1, 1, 7, 3, 13, 33, 115, 121, 245, 673, 1991, 2157, 479, 9843, 5963, 4637, 8925, 27751}},
+{17792, 18, 73797, {1, 3, 3, 7, 19, 11, 67, 125, 339, 27, 1545, 2319, 5977, 11603, 23219, 48273, 119265, 20151}},
+{17793, 18, 73810, {1, 1, 5, 7, 27, 29, 31, 227, 279, 405, 1133, 689, 1133, 8957, 29629, 48849, 109995, 259749}},
+{17794, 18, 73819, {1, 3, 5, 7, 7, 61, 95, 243, 91, 741, 1591, 3169, 2287, 11015, 15601, 43043, 65319, 50671}},
+{17795, 18, 73825, {1, 1, 5, 5, 13, 47, 31, 95, 425, 715, 1603, 3485, 673, 12869, 32561, 42329, 112809, 181971}},
+{17796, 18, 73845, {1, 3, 3, 3, 17, 51, 109, 45, 397, 457, 1379, 3845, 4215, 14185, 16597, 27711, 74283, 98151}},
+{17797, 18, 73855, {1, 1, 1, 15, 7, 25, 13, 49, 441, 513, 1769, 707, 6037, 9689, 18915, 35647, 110823, 196633}},
+{17798, 18, 73866, {1, 1, 1, 1, 23, 53, 93, 61, 277, 125, 55, 2453, 3331, 14037, 10809, 33205, 43785, 248743}},
+{17799, 18, 73890, {1, 1, 3, 7, 23, 15, 93, 77, 333, 801, 1969, 31, 51, 5239, 24241, 5077, 113503, 132211}},
+{17800, 18, 73919, {1, 3, 3, 1, 7, 55, 53, 5, 311, 657, 1507, 3413, 565, 15745, 6129, 40285, 91811, 90527}},
+{17801, 18, 73922, {1, 3, 3, 13, 19, 23, 45, 25, 509, 313, 915, 2199, 5549, 8469, 32735, 37877, 11607, 37993}},
+{17802, 18, 73936, {1, 1, 5, 11, 25, 33, 55, 31, 311, 851, 159, 2103, 2641, 8957, 9375, 37179, 33667, 100513}},
+{17803, 18, 73939, {1, 3, 1, 1, 7, 7, 17, 75, 217, 171, 359, 1169, 4105, 929, 6427, 56349, 77985, 41941}},
+{17804, 18, 73964, {1, 1, 1, 15, 5, 51, 73, 63, 259, 351, 1797, 1001, 5025, 11203, 30221, 54345, 11331, 158415}},
+{17805, 18, 73976, {1, 3, 1, 5, 3, 21, 13, 3, 63, 779, 871, 2517, 6345, 4103, 16321, 30211, 120815, 83751}},
+{17806, 18, 73984, {1, 1, 3, 13, 11, 7, 41, 255, 215, 37, 279, 2485, 6511, 12855, 22857, 55695, 122717, 238151}},
+{17807, 18, 73990, {1, 3, 3, 3, 1, 55, 27, 193, 509, 677, 1861, 573, 5341, 5285, 6909, 51781, 91203, 139791}},
+{17808, 18, 74013, {1, 3, 7, 11, 5, 63, 87, 215, 305, 235, 1049, 1339, 5301, 9639, 29861, 58415, 68303, 76907}},
+{17809, 18, 74014, {1, 1, 5, 11, 13, 13, 67, 139, 19, 577, 165, 3067, 8023, 10905, 3159, 41289, 118231, 119673}},
+{17810, 18, 74020, {1, 1, 3, 1, 15, 5, 69, 119, 363, 703, 461, 2293, 3801, 14217, 10709, 9553, 100651, 186115}},
+{17811, 18, 74035, {1, 3, 7, 15, 19, 21, 59, 237, 227, 193, 827, 619, 3447, 13815, 3467, 38911, 41403, 99627}},
+{17812, 18, 74038, {1, 1, 3, 3, 27, 23, 41, 199, 161, 555, 1629, 3187, 1355, 5947, 1157, 25877, 110989, 231285}},
+{17813, 18, 74069, {1, 1, 3, 15, 3, 43, 103, 29, 179, 223, 375, 2877, 1917, 9367, 15337, 15381, 62833, 139003}},
+{17814, 18, 74119, {1, 3, 3, 11, 23, 33, 107, 189, 511, 209, 1519, 2809, 6185, 5921, 20939, 63879, 113687, 79149}},
+{17815, 18, 74123, {1, 3, 5, 15, 1, 63, 101, 227, 419, 803, 59, 2261, 6905, 10679, 5393, 54447, 58521, 59855}},
+{17816, 18, 74126, {1, 1, 7, 13, 13, 21, 121, 123, 181, 371, 1485, 3191, 2627, 6197, 11169, 44927, 34739, 10687}},
+{17817, 18, 74153, {1, 1, 3, 3, 25, 47, 13, 115, 187, 967, 1439, 1021, 4413, 3343, 31463, 3729, 13511, 162125}},
+{17818, 18, 74179, {1, 3, 3, 15, 15, 59, 29, 129, 469, 171, 2045, 2859, 1097, 11199, 12147, 37465, 14179, 197923}},
+{17819, 18, 74200, {1, 1, 7, 5, 13, 35, 41, 167, 207, 123, 1077, 3145, 2803, 15729, 767, 7321, 84375, 190855}},
+{17820, 18, 74210, {1, 3, 5, 11, 3, 5, 65, 3, 111, 725, 143, 2945, 4755, 3407, 31801, 15329, 70311, 119197}},
+{17821, 18, 74216, {1, 1, 5, 3, 17, 19, 61, 73, 261, 663, 821, 3389, 3883, 9961, 17727, 33113, 98371, 247097}},
+{17822, 18, 74250, {1, 3, 1, 9, 29, 17, 43, 43, 481, 1015, 1249, 607, 3495, 13259, 29001, 23083, 51487, 81723}},
+{17823, 18, 74263, {1, 3, 1, 3, 25, 57, 5, 33, 313, 21, 1731, 3417, 7033, 6609, 31631, 63231, 61107, 10941}},
+{17824, 18, 74264, {1, 3, 3, 11, 29, 29, 117, 131, 417, 789, 1545, 1677, 3213, 13869, 5319, 41387, 13895, 252387}},
+{17825, 18, 74279, {1, 3, 3, 13, 25, 47, 55, 213, 83, 345, 1453, 159, 1521, 14777, 24177, 7631, 81259, 135411}},
+{17826, 18, 74285, {1, 1, 3, 15, 11, 63, 49, 69, 273, 843, 1661, 1157, 1285, 12751, 5, 54909, 114375, 6395}},
+{17827, 18, 74294, {1, 3, 1, 11, 25, 1, 83, 55, 161, 125, 1547, 401, 7639, 4289, 7075, 9971, 33825, 135071}},
+{17828, 18, 74298, {1, 3, 7, 9, 17, 5, 79, 131, 373, 1023, 573, 2219, 1789, 5789, 5347, 26455, 58661, 206417}},
+{17829, 18, 74303, {1, 1, 7, 5, 1, 43, 83, 107, 125, 289, 793, 1731, 5167, 8943, 28397, 26877, 53781, 95899}},
+{17830, 18, 74306, {1, 3, 3, 13, 21, 53, 123, 103, 385, 753, 1917, 2075, 4385, 5757, 9221, 35797, 86743, 69069}},
+{17831, 18, 74366, {1, 3, 3, 3, 5, 19, 119, 221, 457, 907, 359, 3493, 2331, 5685, 11133, 29293, 27051, 213927}},
+{17832, 18, 74369, {1, 1, 3, 11, 11, 31, 29, 129, 429, 601, 1217, 3653, 5935, 14823, 21161, 33423, 98391, 214703}},
+{17833, 18, 74403, {1, 1, 3, 15, 31, 49, 109, 139, 349, 13, 205, 2483, 8083, 8391, 4789, 30355, 12165, 195263}},
+{17834, 18, 74406, {1, 1, 1, 9, 19, 63, 15, 167, 45, 185, 811, 529, 6811, 13441, 27195, 59047, 106675, 167125}},
+{17835, 18, 74442, {1, 1, 7, 1, 19, 19, 39, 1, 349, 467, 551, 4081, 4743, 11627, 607, 22005, 60893, 49101}},
+{17836, 18, 74450, {1, 3, 7, 9, 9, 25, 105, 119, 113, 825, 1429, 2019, 5209, 8491, 6017, 47783, 88455, 119083}},
+{17837, 18, 74452, {1, 3, 3, 13, 21, 39, 107, 119, 321, 251, 563, 311, 4441, 6491, 3157, 65479, 107349, 211621}},
+{17838, 18, 74459, {1, 1, 7, 13, 9, 3, 17, 117, 327, 459, 489, 7, 6883, 10047, 31935, 28069, 37903, 188281}},
+{17839, 18, 74461, {1, 1, 7, 1, 15, 53, 47, 127, 483, 595, 811, 1143, 4543, 10043, 30349, 24409, 91947, 240165}},
+{17840, 18, 74477, {1, 1, 1, 13, 25, 43, 109, 161, 147, 1009, 1071, 1533, 2781, 13439, 20507, 41387, 26943, 84675}},
+{17841, 18, 74478, {1, 3, 5, 13, 19, 21, 23, 167, 135, 257, 587, 2691, 5877, 3047, 11745, 24895, 114799, 48003}},
+{17842, 18, 74489, {1, 3, 1, 1, 9, 57, 33, 51, 137, 109, 137, 195, 1233, 11139, 16833, 27545, 35877, 126627}},
+{17843, 18, 74504, {1, 1, 1, 15, 5, 37, 7, 19, 363, 411, 1193, 767, 6209, 9115, 14699, 55515, 46023, 90693}},
+{17844, 18, 74528, {1, 3, 5, 3, 19, 55, 85, 117, 391, 757, 861, 3537, 6507, 6993, 19589, 6843, 33557, 64683}},
+{17845, 18, 74533, {1, 1, 7, 5, 5, 61, 99, 9, 311, 595, 807, 429, 63, 12359, 28289, 709, 129911, 143745}},
+{17846, 18, 74538, {1, 1, 1, 7, 17, 9, 9, 117, 19, 985, 657, 2803, 2699, 829, 31069, 13277, 106769, 109231}},
+{17847, 18, 74551, {1, 1, 5, 13, 25, 19, 63, 217, 419, 221, 1921, 215, 2631, 4659, 29855, 46549, 62257, 260113}},
+{17848, 18, 74580, {1, 3, 3, 9, 13, 45, 63, 129, 147, 489, 879, 3025, 6777, 1119, 20963, 30553, 20863, 169837}},
+{17849, 18, 74589, {1, 3, 5, 9, 25, 61, 79, 51, 495, 583, 1519, 1501, 123, 13871, 32239, 957, 31921, 255561}},
+{17850, 18, 74590, {1, 3, 7, 3, 31, 61, 89, 65, 305, 429, 785, 3871, 7711, 2745, 24131, 43055, 51167, 87743}},
+{17851, 18, 74593, {1, 3, 1, 11, 19, 23, 89, 117, 185, 121, 109, 1327, 6553, 14367, 16069, 28657, 81751, 10185}},
+{17852, 18, 74608, {1, 3, 5, 5, 17, 33, 115, 61, 101, 367, 1465, 3899, 6601, 4483, 2447, 49575, 129987, 11703}},
+{17853, 18, 74611, {1, 1, 3, 13, 13, 59, 79, 83, 253, 171, 53, 2467, 5005, 1045, 943, 62419, 98563, 78935}},
+{17854, 18, 74617, {1, 1, 7, 15, 31, 17, 77, 73, 249, 247, 119, 1655, 7079, 14593, 105, 55767, 130401, 74189}},
+{17855, 18, 74623, {1, 3, 5, 11, 19, 29, 79, 251, 75, 949, 527, 2779, 5839, 11451, 24125, 45991, 127437, 86541}},
+{17856, 18, 74648, {1, 1, 5, 7, 1, 29, 127, 27, 477, 807, 829, 1569, 205, 13319, 16149, 26003, 38985, 188587}},
+{17857, 18, 74704, {1, 1, 1, 3, 19, 29, 39, 71, 17, 51, 1169, 467, 7505, 1867, 4469, 32161, 43031, 31675}},
+{17858, 18, 74735, {1, 1, 1, 15, 27, 45, 67, 107, 127, 469, 1955, 1933, 2379, 8513, 32071, 35043, 126537, 23303}},
+{17859, 18, 74737, {1, 3, 7, 9, 23, 41, 23, 197, 97, 213, 17, 1751, 5467, 6179, 29291, 33397, 42131, 151093}},
+{17860, 18, 74738, {1, 3, 7, 15, 27, 3, 39, 87, 365, 77, 487, 293, 6405, 2239, 30455, 44723, 12399, 100013}},
+{17861, 18, 74779, {1, 3, 5, 9, 29, 21, 55, 183, 343, 263, 1643, 2027, 2255, 6259, 18277, 64661, 39391, 255839}},
+{17862, 18, 74781, {1, 1, 7, 11, 21, 55, 11, 139, 261, 11, 1721, 3779, 85, 8203, 12089, 50579, 128341, 119043}},
+{17863, 18, 74809, {1, 3, 5, 13, 27, 53, 109, 1, 313, 661, 431, 1543, 1571, 7337, 18857, 49951, 7881, 228161}},
+{17864, 18, 74812, {1, 1, 7, 5, 5, 31, 27, 149, 239, 199, 1011, 1979, 5297, 14609, 26971, 65531, 64215, 115109}},
+{17865, 18, 74827, {1, 1, 5, 13, 15, 11, 63, 225, 165, 405, 1367, 2291, 5171, 12419, 19561, 37719, 621, 137607}},
+{17866, 18, 74868, {1, 3, 1, 15, 25, 1, 125, 243, 97, 455, 1977, 3333, 801, 1343, 993, 18453, 19285, 71547}},
+{17867, 18, 74871, {1, 1, 5, 11, 9, 51, 109, 135, 73, 147, 649, 4071, 7425, 3093, 26417, 51139, 1523, 142225}},
+{17868, 18, 74905, {1, 3, 7, 11, 1, 39, 109, 119, 337, 715, 1087, 4005, 1393, 6397, 31135, 38935, 106255, 60723}},
+{17869, 18, 74930, {1, 1, 1, 9, 9, 11, 45, 11, 171, 671, 965, 109, 2261, 13775, 8539, 63669, 10507, 249113}},
+{17870, 18, 74962, {1, 3, 1, 15, 21, 33, 127, 173, 419, 31, 299, 857, 4915, 11331, 29385, 47375, 111891, 14505}},
+{17871, 18, 74990, {1, 3, 5, 13, 7, 43, 85, 183, 377, 275, 803, 1755, 8005, 15327, 31043, 18851, 122581, 229731}},
+{17872, 18, 74995, {1, 3, 5, 1, 27, 9, 41, 73, 283, 475, 671, 747, 1419, 15209, 25465, 60061, 91417, 103203}},
+{17873, 18, 75007, {1, 3, 1, 15, 15, 43, 13, 45, 217, 519, 363, 3265, 6213, 13045, 3709, 22119, 79733, 224195}},
+{17874, 18, 75012, {1, 3, 1, 15, 15, 59, 95, 71, 171, 769, 1395, 2673, 4523, 749, 13411, 60431, 124651, 11475}},
+{17875, 18, 75030, {1, 1, 7, 3, 1, 35, 13, 239, 101, 355, 1201, 3665, 5403, 11413, 11983, 52469, 63621, 155819}},
+{17876, 18, 75033, {1, 1, 1, 7, 31, 59, 87, 25, 511, 483, 569, 3337, 4027, 8347, 3031, 24351, 57963, 79425}},
+{17877, 18, 75039, {1, 3, 1, 3, 11, 17, 29, 249, 61, 923, 585, 2107, 2727, 8589, 22809, 3, 17937, 163267}},
+{17878, 18, 75055, {1, 3, 5, 11, 27, 3, 73, 187, 19, 975, 257, 2361, 935, 9071, 29991, 13619, 92169, 101031}},
+{17879, 18, 75078, {1, 1, 5, 13, 17, 53, 105, 157, 343, 673, 237, 3231, 7311, 1593, 18521, 57889, 79805, 97847}},
+{17880, 18, 75120, {1, 3, 1, 3, 31, 55, 63, 167, 489, 167, 121, 3333, 2475, 1545, 13291, 921, 101757, 62147}},
+{17881, 18, 75130, {1, 3, 3, 15, 13, 17, 9, 209, 339, 567, 2011, 1737, 1455, 9289, 6105, 49733, 74237, 93195}},
+{17882, 18, 75159, {1, 1, 7, 11, 3, 13, 77, 115, 305, 327, 1005, 3381, 4269, 4835, 27221, 16301, 75173, 244603}},
+{17883, 18, 75163, {1, 3, 5, 7, 7, 31, 47, 75, 499, 41, 281, 167, 3525, 8649, 23623, 4987, 2057, 204083}},
+{17884, 18, 75170, {1, 3, 3, 5, 9, 5, 35, 53, 269, 437, 1035, 1675, 4567, 13291, 19787, 28937, 108915, 62545}},
+{17885, 18, 75193, {1, 3, 1, 5, 15, 59, 57, 181, 321, 1, 791, 2149, 591, 6691, 8759, 62861, 10815, 257331}},
+{17886, 18, 75228, {1, 1, 7, 1, 21, 25, 93, 39, 429, 455, 669, 1725, 7087, 11805, 22405, 13083, 88411, 225967}},
+{17887, 18, 75244, {1, 1, 5, 15, 5, 45, 15, 1, 55, 281, 2027, 97, 2639, 57, 23717, 21669, 92181, 32731}},
+{17888, 18, 75249, {1, 3, 7, 3, 7, 3, 67, 201, 445, 577, 1011, 793, 7763, 10823, 30309, 41565, 37263, 218909}},
+{17889, 18, 75328, {1, 1, 7, 3, 17, 53, 51, 119, 399, 903, 1785, 1053, 4315, 2967, 17579, 64185, 55005, 12969}},
+{17890, 18, 75357, {1, 3, 3, 13, 21, 63, 13, 1, 427, 39, 71, 1811, 1237, 1623, 11401, 14371, 44355, 93089}},
+{17891, 18, 75373, {1, 1, 5, 1, 17, 39, 39, 105, 187, 691, 251, 3957, 931, 12149, 18299, 48819, 23061, 49179}},
+{17892, 18, 75392, {1, 1, 5, 11, 31, 3, 23, 211, 101, 763, 237, 3635, 417, 4935, 14997, 3859, 22343, 153541}},
+{17893, 18, 75428, {1, 3, 7, 5, 21, 37, 59, 137, 13, 179, 527, 895, 3451, 1743, 3149, 10665, 119427, 259343}},
+{17894, 18, 75438, {1, 3, 5, 3, 7, 37, 103, 173, 453, 327, 131, 2453, 7795, 12585, 13947, 59161, 41845, 29527}},
+{17895, 18, 75469, {1, 3, 3, 1, 17, 49, 57, 251, 295, 279, 1545, 3963, 589, 9211, 32371, 14963, 116927, 197321}},
+{17896, 18, 75487, {1, 1, 3, 7, 17, 59, 37, 115, 315, 591, 481, 767, 4611, 14741, 6949, 19507, 6567, 143371}},
+{17897, 18, 75494, {1, 1, 5, 3, 19, 53, 121, 229, 355, 909, 339, 1645, 2747, 7045, 9085, 5799, 50997, 17981}},
+{17898, 18, 75515, {1, 3, 3, 9, 3, 1, 109, 7, 15, 177, 789, 3911, 6427, 8453, 22583, 12039, 124587, 123887}},
+{17899, 18, 75526, {1, 1, 5, 1, 7, 23, 15, 193, 109, 685, 1147, 3921, 2329, 15153, 25045, 28389, 34759, 256611}},
+{17900, 18, 75532, {1, 1, 3, 3, 23, 27, 55, 43, 485, 541, 1617, 3761, 1051, 7525, 19941, 52699, 35421, 162939}},
+{17901, 18, 75543, {1, 3, 7, 1, 25, 9, 113, 251, 477, 1005, 9, 3321, 5817, 965, 18523, 29407, 53353, 205575}},
+{17902, 18, 75549, {1, 1, 7, 11, 9, 31, 111, 175, 227, 33, 1745, 1141, 1547, 2113, 8785, 40273, 100301, 190749}},
+{17903, 18, 75559, {1, 1, 5, 11, 19, 49, 45, 197, 457, 223, 91, 2769, 6331, 1161, 6609, 61905, 42257, 152117}},
+{17904, 18, 75563, {1, 1, 7, 11, 1, 17, 37, 153, 431, 933, 269, 1529, 1297, 15567, 149, 41701, 59867, 93631}},
+{17905, 18, 75568, {1, 1, 5, 9, 25, 33, 83, 127, 305, 667, 343, 185, 3527, 13079, 10567, 35753, 72191, 214091}},
+{17906, 18, 75598, {1, 3, 7, 1, 1, 7, 75, 241, 185, 81, 2043, 3081, 3563, 385, 3055, 59421, 27081, 32521}},
+{17907, 18, 75612, {1, 1, 3, 5, 31, 1, 101, 21, 69, 979, 917, 695, 5601, 12251, 15031, 18715, 116985, 53071}},
+{17908, 18, 75622, {1, 1, 3, 9, 23, 57, 91, 127, 327, 979, 721, 3855, 1131, 997, 32227, 33843, 128299, 15239}},
+{17909, 18, 75640, {1, 3, 7, 13, 23, 1, 87, 105, 259, 939, 1935, 1983, 6619, 1611, 31901, 14745, 96641, 211945}},
+{17910, 18, 75683, {1, 1, 3, 5, 25, 17, 39, 95, 137, 971, 377, 2493, 981, 329, 25845, 44513, 100561, 57985}},
+{17911, 18, 75689, {1, 1, 3, 9, 27, 37, 69, 103, 167, 131, 487, 2935, 7099, 15375, 4825, 12209, 117165, 84909}},
+{17912, 18, 75690, {1, 3, 1, 15, 27, 19, 115, 239, 247, 243, 83, 1535, 8095, 3953, 25721, 62983, 89045, 16783}},
+{17913, 18, 75692, {1, 1, 5, 1, 19, 13, 125, 39, 439, 411, 171, 155, 5117, 15137, 19851, 251, 37921, 97209}},
+{17914, 18, 75752, {1, 1, 1, 5, 13, 41, 17, 97, 215, 323, 1333, 775, 1155, 15269, 19943, 48489, 71741, 202501}},
+{17915, 18, 75766, {1, 3, 5, 3, 1, 31, 55, 125, 69, 437, 1649, 2791, 8027, 15509, 31575, 8491, 106953, 155215}},
+{17916, 18, 75769, {1, 3, 3, 13, 19, 45, 39, 63, 227, 67, 2021, 1243, 6525, 7211, 6275, 39719, 74513, 6713}},
+{17917, 18, 75791, {1, 1, 5, 11, 13, 45, 15, 101, 171, 613, 1561, 2939, 3849, 2917, 29765, 2027, 53617, 59939}},
+{17918, 18, 75794, {1, 1, 5, 9, 27, 21, 119, 19, 441, 759, 703, 2985, 3007, 2087, 5207, 64403, 20273, 66181}},
+{17919, 18, 75806, {1, 1, 7, 13, 21, 3, 49, 3, 485, 883, 1863, 1925, 877, 10009, 24191, 58639, 107755, 106539}},
+{17920, 18, 75809, {1, 1, 1, 5, 27, 37, 23, 185, 281, 533, 437, 555, 8151, 6489, 22343, 4573, 91577, 167919}},
+{17921, 18, 75819, {1, 1, 7, 15, 3, 61, 103, 221, 223, 703, 133, 2923, 1027, 14643, 26413, 16523, 107223, 97185}},
+{17922, 18, 75834, {1, 3, 1, 11, 13, 15, 1, 203, 363, 675, 511, 3225, 1163, 741, 16063, 8097, 95905, 148465}},
+{17923, 18, 75895, {1, 3, 1, 7, 11, 11, 11, 243, 371, 129, 209, 3533, 1279, 12181, 31973, 29165, 122089, 115117}},
+{17924, 18, 75908, {1, 3, 1, 5, 25, 17, 31, 45, 215, 809, 1443, 3245, 1005, 2903, 20783, 23041, 96577, 192063}},
+{17925, 18, 75951, {1, 3, 3, 3, 19, 17, 101, 219, 91, 805, 189, 761, 4771, 11629, 7285, 21631, 21691, 47421}},
+{17926, 18, 75960, {1, 3, 7, 1, 31, 11, 71, 149, 303, 793, 35, 3109, 2769, 11593, 31839, 2053, 4541, 202997}},
+{17927, 18, 75965, {1, 1, 1, 3, 11, 19, 113, 249, 141, 659, 1117, 2145, 2617, 1075, 25347, 12913, 27457, 222095}},
+{17928, 18, 75974, {1, 3, 1, 3, 5, 23, 41, 57, 193, 815, 1293, 1109, 7597, 999, 10773, 41065, 18555, 35617}},
+{17929, 18, 75978, {1, 1, 3, 1, 31, 11, 127, 99, 163, 293, 299, 3415, 3761, 8781, 5327, 47631, 56411, 242787}},
+{17930, 18, 75998, {1, 3, 7, 13, 3, 41, 23, 169, 419, 725, 1419, 2643, 5265, 77, 24077, 18639, 78665, 205303}},
+{17931, 18, 76001, {1, 1, 5, 1, 31, 39, 39, 205, 413, 393, 1713, 309, 707, 4153, 10461, 16053, 26963, 253993}},
+{17932, 18, 76007, {1, 3, 7, 5, 23, 37, 125, 87, 199, 631, 1935, 551, 7047, 4585, 21257, 42345, 39365, 249393}},
+{17933, 18, 76016, {1, 3, 5, 13, 17, 55, 29, 209, 151, 465, 155, 363, 3097, 4093, 9869, 23297, 33973, 115543}},
+{17934, 18, 76091, {1, 1, 1, 13, 23, 59, 83, 71, 145, 717, 127, 1299, 1701, 10885, 5343, 40793, 87819, 66621}},
+{17935, 18, 76119, {1, 3, 3, 9, 19, 37, 23, 11, 269, 603, 871, 851, 837, 15303, 7595, 56481, 57819, 185065}},
+{17936, 18, 76135, {1, 3, 1, 1, 3, 15, 11, 249, 413, 723, 1403, 3233, 2747, 10335, 7127, 63285, 29237, 191953}},
+{17937, 18, 76170, {1, 3, 1, 1, 11, 31, 67, 139, 51, 413, 521, 969, 171, 5943, 31613, 16477, 85771, 202139}},
+{17938, 18, 76189, {1, 3, 7, 5, 5, 21, 109, 25, 463, 873, 493, 2673, 6409, 11199, 17195, 40623, 76821, 72509}},
+{17939, 18, 76214, {1, 1, 7, 7, 11, 1, 95, 43, 243, 67, 1289, 3219, 2255, 4957, 17561, 40499, 48537, 108809}},
+{17940, 18, 76225, {1, 1, 7, 15, 3, 39, 45, 75, 43, 821, 533, 4043, 1503, 83, 26937, 56327, 114149, 156845}},
+{17941, 18, 76235, {1, 3, 1, 1, 31, 21, 59, 1, 77, 147, 137, 1827, 4123, 2791, 27859, 57921, 40569, 134753}},
+{17942, 18, 76259, {1, 1, 5, 13, 31, 41, 111, 11, 181, 963, 459, 2771, 6123, 4035, 1627, 2047, 109537, 33653}},
+{17943, 18, 76261, {1, 3, 5, 7, 31, 57, 17, 21, 5, 761, 1833, 1279, 1239, 10089, 22531, 32547, 82699, 28389}},
+{17944, 18, 76262, {1, 3, 5, 13, 11, 39, 11, 61, 299, 753, 1067, 1347, 5189, 12859, 681, 46309, 31873, 90333}},
+{17945, 18, 76266, {1, 3, 1, 5, 13, 27, 119, 205, 377, 457, 817, 3017, 279, 1859, 30241, 52089, 61445, 176203}},
+{17946, 18, 76286, {1, 1, 3, 5, 11, 35, 17, 163, 27, 1001, 417, 2899, 1959, 5513, 1441, 19743, 67147, 236591}},
+{17947, 18, 76289, {1, 3, 5, 13, 15, 39, 53, 179, 447, 675, 933, 1261, 4415, 9845, 28459, 33497, 107375, 156855}},
+{17948, 18, 76310, {1, 3, 3, 13, 27, 31, 11, 191, 413, 1011, 2035, 3965, 2071, 5429, 16247, 7439, 15079, 225041}},
+{17949, 18, 76319, {1, 3, 3, 11, 7, 23, 87, 215, 241, 687, 1351, 2399, 4677, 12967, 22957, 10443, 116701, 155477}},
+{17950, 18, 76364, {1, 3, 7, 5, 25, 55, 5, 197, 359, 879, 619, 1969, 1513, 12743, 10953, 28343, 63685, 39115}},
+{17951, 18, 76375, {1, 1, 3, 1, 19, 15, 63, 7, 305, 343, 1333, 3845, 377, 14031, 28383, 4271, 60063, 11827}},
+{17952, 18, 76392, {1, 3, 5, 15, 25, 21, 115, 101, 171, 735, 787, 3143, 593, 8793, 4121, 15471, 53491, 20617}},
+{17953, 18, 76422, {1, 1, 5, 15, 15, 51, 103, 17, 433, 611, 1351, 1729, 6147, 11623, 3, 6319, 6133, 19029}},
+{17954, 18, 76450, {1, 3, 1, 13, 29, 15, 115, 97, 505, 985, 745, 745, 1459, 7193, 1247, 58901, 114255, 212849}},
+{17955, 18, 76496, {1, 1, 7, 1, 1, 53, 99, 35, 377, 723, 1751, 2625, 5113, 13295, 20133, 26831, 41657, 51717}},
+{17956, 18, 76521, {1, 3, 5, 15, 15, 39, 17, 227, 351, 435, 49, 203, 6959, 11673, 15755, 29733, 51445, 64619}},
+{17957, 18, 76522, {1, 1, 1, 3, 25, 51, 57, 137, 415, 49, 355, 2149, 7607, 10781, 30363, 43889, 55543, 36637}},
+{17958, 18, 76527, {1, 1, 7, 5, 5, 15, 73, 189, 153, 949, 527, 587, 513, 12891, 16765, 41477, 75569, 80747}},
+{17959, 18, 76536, {1, 1, 5, 5, 9, 5, 3, 225, 115, 125, 821, 3551, 4833, 927, 24331, 63669, 26549, 220159}},
+{17960, 18, 76541, {1, 1, 3, 9, 21, 7, 9, 183, 391, 783, 493, 2785, 3879, 8311, 9935, 60629, 119329, 5791}},
+{17961, 18, 76553, {1, 1, 5, 15, 15, 41, 61, 97, 33, 29, 199, 3335, 1531, 6107, 757, 33797, 3001, 224507}},
+{17962, 18, 76568, {1, 1, 3, 9, 13, 39, 25, 247, 407, 1, 1129, 1453, 7091, 5557, 8657, 33961, 100763, 25099}},
+{17963, 18, 76574, {1, 3, 3, 13, 31, 21, 69, 73, 431, 827, 861, 235, 2369, 4283, 27183, 29095, 99957, 97577}},
+{17964, 18, 76584, {1, 1, 7, 13, 1, 25, 21, 173, 365, 921, 21, 3527, 2481, 8795, 25621, 41755, 127249, 221385}},
+{17965, 18, 76604, {1, 1, 1, 5, 25, 25, 65, 203, 305, 373, 527, 4033, 3483, 9403, 28669, 32083, 52273, 77037}},
+{17966, 18, 76607, {1, 3, 1, 15, 9, 23, 19, 7, 29, 83, 1163, 1147, 5315, 2381, 21203, 33915, 109511, 40669}},
+{17967, 18, 76609, {1, 3, 7, 15, 23, 19, 69, 127, 113, 937, 935, 1067, 2431, 7677, 21327, 44095, 82799, 5715}},
+{17968, 18, 76669, {1, 1, 5, 5, 7, 37, 107, 223, 433, 515, 393, 1721, 1977, 6383, 18835, 54841, 103263, 196997}},
+{17969, 18, 76683, {1, 1, 1, 3, 1, 11, 85, 173, 259, 685, 595, 1635, 6979, 4483, 8097, 42249, 56259, 105925}},
+{17970, 18, 76745, {1, 1, 7, 7, 1, 23, 11, 253, 187, 665, 313, 3745, 2423, 15835, 32085, 48643, 75625, 47511}},
+{17971, 18, 76753, {1, 1, 3, 5, 1, 59, 127, 83, 501, 387, 977, 3515, 7921, 12329, 14757, 20287, 49699, 91237}},
+{17972, 18, 76754, {1, 3, 5, 11, 31, 45, 51, 109, 319, 621, 1013, 3519, 4023, 12099, 28829, 26691, 83131, 261497}},
+{17973, 18, 76756, {1, 1, 3, 3, 5, 35, 51, 253, 253, 569, 1017, 2299, 8159, 13783, 22123, 55213, 111527, 110699}},
+{17974, 18, 76760, {1, 3, 7, 3, 9, 5, 59, 129, 41, 845, 723, 1607, 3047, 14323, 19277, 39447, 12465, 45925}},
+{17975, 18, 76782, {1, 1, 3, 1, 17, 35, 51, 79, 115, 361, 739, 2037, 6167, 14699, 28187, 65271, 67285, 48489}},
+{17976, 18, 76821, {1, 3, 1, 11, 1, 29, 95, 181, 419, 235, 745, 621, 3889, 2933, 743, 23801, 32057, 54103}},
+{17977, 18, 76828, {1, 3, 1, 11, 17, 47, 43, 55, 7, 695, 1653, 3983, 961, 3037, 8669, 10039, 86571, 6981}},
+{17978, 18, 76849, {1, 1, 5, 15, 13, 19, 67, 141, 291, 511, 1913, 397, 7423, 6541, 21845, 49821, 126047, 218587}},
+{17979, 18, 76850, {1, 1, 5, 3, 11, 13, 103, 213, 189, 115, 1495, 2695, 2127, 11979, 13609, 46615, 64775, 206417}},
+{17980, 18, 76870, {1, 3, 1, 5, 5, 9, 57, 207, 253, 251, 1155, 1319, 6699, 6613, 21757, 49703, 124879, 89987}},
+{17981, 18, 76874, {1, 3, 5, 7, 23, 25, 35, 81, 165, 789, 771, 415, 5557, 8431, 12043, 44359, 9447, 229481}},
+{17982, 18, 76898, {1, 1, 1, 13, 17, 21, 63, 251, 387, 767, 85, 3901, 3227, 10329, 5049, 56173, 58065, 78595}},
+{17983, 18, 76903, {1, 3, 1, 15, 23, 5, 45, 7, 123, 389, 1041, 1223, 5865, 5365, 2915, 24861, 106893, 170769}},
+{17984, 18, 76910, {1, 3, 7, 15, 27, 61, 27, 59, 309, 103, 279, 1829, 1501, 11277, 4461, 34817, 60973, 99805}},
+{17985, 18, 76921, {1, 1, 3, 9, 1, 25, 57, 85, 411, 699, 911, 1643, 2687, 13539, 10187, 21597, 18883, 212975}},
+{17986, 18, 76968, {1, 1, 3, 7, 5, 7, 81, 209, 225, 321, 1867, 2189, 6315, 5393, 8859, 47471, 41677, 222455}},
+{17987, 18, 77013, {1, 1, 5, 11, 27, 33, 119, 159, 273, 659, 883, 3773, 6519, 15449, 17219, 23923, 33749, 225489}},
+{17988, 18, 77027, {1, 1, 7, 13, 29, 39, 1, 161, 165, 531, 1019, 2369, 2093, 4341, 24945, 28537, 49467, 258065}},
+{17989, 18, 77042, {1, 3, 3, 3, 15, 59, 23, 143, 377, 943, 1329, 977, 7025, 2167, 17973, 65087, 115757, 75959}},
+{17990, 18, 77059, {1, 1, 1, 15, 17, 55, 33, 167, 43, 719, 51, 3873, 3317, 10763, 639, 58195, 20023, 100725}},
+{17991, 18, 77062, {1, 1, 7, 5, 17, 23, 71, 249, 23, 929, 467, 3073, 3355, 1343, 18755, 12247, 49737, 184103}},
+{17992, 18, 77074, {1, 3, 3, 15, 1, 9, 17, 193, 157, 265, 983, 1825, 4805, 2131, 22117, 32937, 57, 261867}},
+{17993, 18, 77076, {1, 3, 5, 9, 5, 1, 101, 141, 511, 489, 73, 1789, 1303, 2633, 709, 11891, 44897, 191229}},
+{17994, 18, 77110, {1, 1, 7, 15, 1, 27, 121, 7, 129, 421, 725, 1421, 3883, 13335, 7247, 8393, 85029, 127691}},
+{17995, 18, 77113, {1, 1, 3, 9, 19, 53, 121, 115, 85, 909, 1535, 3261, 7063, 16381, 1719, 19847, 19041, 215433}},
+{17996, 18, 77131, {1, 1, 7, 3, 17, 45, 91, 187, 181, 829, 609, 931, 5727, 3971, 14567, 15871, 9825, 184165}},
+{17997, 18, 77157, {1, 1, 1, 3, 5, 29, 7, 249, 361, 815, 1101, 1485, 6879, 5379, 7179, 27467, 101427, 196089}},
+{17998, 18, 77158, {1, 1, 5, 7, 23, 11, 27, 175, 237, 747, 1911, 3107, 961, 6649, 29887, 11003, 27561, 233841}},
+{17999, 18, 77216, {1, 1, 1, 5, 11, 5, 125, 227, 303, 315, 1879, 817, 7445, 1447, 9333, 54825, 118865, 216397}},
+{18000, 18, 77246, {1, 1, 3, 13, 17, 33, 27, 95, 245, 25, 1741, 2633, 1869, 14111, 24507, 61287, 46397, 220803}},
+{18001, 18, 77258, {1, 1, 7, 7, 25, 5, 41, 101, 171, 333, 497, 3417, 4921, 4553, 25487, 51529, 72873, 43525}},
+{18002, 18, 77281, {1, 1, 7, 7, 9, 19, 25, 161, 235, 929, 1663, 3237, 323, 3889, 31423, 2345, 63113, 212659}},
+{18003, 18, 77284, {1, 1, 5, 13, 29, 59, 39, 25, 393, 519, 429, 1461, 5867, 113, 28091, 36813, 47827, 163407}},
+{18004, 18, 77294, {1, 3, 5, 13, 15, 49, 85, 161, 83, 389, 765, 3349, 4659, 11007, 24749, 51121, 93511, 229885}},
+{18005, 18, 77302, {1, 3, 5, 11, 5, 27, 107, 233, 221, 425, 941, 1181, 5403, 4373, 32625, 41991, 2019, 245967}},
+{18006, 18, 77306, {1, 3, 5, 9, 9, 53, 97, 27, 221, 731, 1301, 3517, 4407, 11369, 4251, 31121, 4813, 42029}},
+{18007, 18, 77315, {1, 1, 1, 9, 17, 59, 107, 247, 231, 123, 1177, 3299, 6163, 4855, 14547, 63171, 45201, 27711}},
+{18008, 18, 77352, {1, 3, 7, 3, 25, 31, 63, 37, 123, 457, 1531, 3723, 4807, 14665, 17973, 42547, 5417, 170323}},
+{18009, 18, 77360, {1, 3, 7, 3, 17, 19, 57, 7, 359, 741, 385, 3127, 855, 10803, 30093, 24501, 53629, 40447}},
+{18010, 18, 77365, {1, 3, 7, 15, 11, 45, 49, 125, 445, 795, 113, 2425, 7085, 7337, 16297, 26447, 94369, 12371}},
+{18011, 18, 77370, {1, 3, 7, 9, 29, 59, 35, 191, 123, 619, 415, 1081, 2469, 4125, 25587, 7853, 119781, 9447}},
+{18012, 18, 77378, {1, 3, 1, 15, 13, 13, 111, 89, 381, 757, 389, 253, 6929, 33, 8263, 17385, 122129, 146679}},
+{18013, 18, 77380, {1, 1, 3, 3, 15, 35, 101, 95, 479, 577, 1645, 3781, 7533, 4665, 6561, 49897, 72413, 151383}},
+{18014, 18, 77407, {1, 1, 1, 1, 7, 49, 23, 223, 189, 763, 227, 2805, 8093, 389, 11525, 30915, 91341, 210231}},
+{18015, 18, 77408, {1, 1, 7, 3, 19, 23, 3, 137, 79, 569, 1833, 2091, 4235, 10739, 22855, 33845, 120141, 220267}},
+{18016, 18, 77414, {1, 3, 7, 3, 11, 43, 85, 63, 419, 681, 365, 3017, 3603, 6413, 13515, 16003, 107949, 241261}},
+{18017, 18, 77444, {1, 1, 5, 13, 3, 35, 41, 193, 189, 999, 1395, 2431, 2227, 7245, 23929, 16137, 14591, 54999}},
+{18018, 18, 77454, {1, 1, 7, 15, 23, 51, 47, 77, 31, 25, 589, 611, 371, 13329, 5873, 2133, 40351, 145293}},
+{18019, 18, 77481, {1, 1, 7, 15, 17, 19, 53, 155, 309, 573, 1059, 3557, 2445, 12205, 4497, 32061, 130293, 73859}},
+{18020, 18, 77482, {1, 1, 7, 13, 3, 25, 71, 157, 237, 185, 1035, 1759, 1331, 13533, 25635, 811, 54391, 91109}},
+{18021, 18, 77531, {1, 1, 1, 11, 5, 21, 99, 31, 259, 413, 2033, 2187, 755, 4591, 28641, 64031, 88499, 160789}},
+{18022, 18, 77544, {1, 3, 7, 13, 29, 33, 13, 157, 97, 981, 329, 81, 6351, 4171, 10925, 22733, 72521, 105477}},
+{18023, 18, 77552, {1, 3, 7, 9, 11, 31, 97, 35, 337, 309, 847, 3429, 2697, 3141, 19481, 43679, 11129, 205757}},
+{18024, 18, 77569, {1, 3, 1, 7, 27, 45, 123, 193, 439, 639, 633, 1375, 7307, 1599, 23379, 56811, 100877, 228687}},
+{18025, 18, 77579, {1, 3, 7, 1, 29, 43, 103, 131, 103, 933, 143, 2431, 2221, 4565, 20841, 58611, 49163, 13673}},
+{18026, 18, 77610, {1, 3, 5, 13, 25, 17, 121, 17, 455, 941, 1577, 509, 5401, 797, 29573, 38373, 50527, 17951}},
+{18027, 18, 77612, {1, 1, 1, 13, 25, 21, 77, 253, 199, 871, 935, 3919, 1687, 6653, 20345, 56969, 77989, 244767}},
+{18028, 18, 77623, {1, 1, 3, 1, 17, 5, 5, 191, 279, 33, 579, 651, 969, 6091, 11659, 1643, 17935, 85145}},
+{18029, 18, 77649, {1, 3, 3, 9, 29, 1, 103, 39, 83, 295, 1237, 207, 4837, 7899, 27879, 23195, 29549, 206885}},
+{18030, 18, 77650, {1, 3, 5, 1, 9, 55, 115, 37, 225, 447, 943, 1133, 6203, 949, 9973, 4309, 43969, 166795}},
+{18031, 18, 77661, {1, 1, 7, 7, 17, 43, 75, 251, 35, 489, 1011, 355, 4113, 2377, 13775, 34935, 84905, 252973}},
+{18032, 18, 77675, {1, 3, 3, 3, 11, 45, 3, 1, 135, 499, 81, 3265, 6657, 3875, 27565, 60931, 13117, 87931}},
+{18033, 18, 77686, {1, 1, 3, 1, 9, 1, 77, 69, 137, 241, 1613, 2607, 3307, 171, 13551, 54529, 45937, 180411}},
+{18034, 18, 77742, {1, 1, 1, 1, 19, 29, 77, 255, 95, 461, 567, 1103, 2753, 10627, 19479, 43411, 128565, 29869}},
+{18035, 18, 77791, {1, 1, 3, 5, 5, 63, 123, 159, 165, 733, 1107, 1711, 5039, 9221, 15541, 5527, 27629, 206505}},
+{18036, 18, 77792, {1, 3, 1, 3, 7, 45, 73, 63, 413, 693, 433, 2281, 3981, 7719, 31473, 56939, 70391, 67467}},
+{18037, 18, 77807, {1, 1, 1, 11, 19, 33, 113, 151, 427, 603, 1653, 2451, 5367, 12171, 14373, 33175, 62013, 209273}},
+{18038, 18, 77815, {1, 3, 5, 5, 17, 37, 109, 5, 187, 293, 617, 2663, 7381, 14217, 23561, 48999, 108717, 248289}},
+{18039, 18, 77842, {1, 1, 5, 1, 9, 27, 35, 127, 355, 479, 281, 2081, 7303, 259, 8893, 59141, 20927, 61611}},
+{18040, 18, 77847, {1, 3, 3, 15, 31, 33, 71, 209, 315, 363, 593, 1035, 8029, 12501, 2859, 54745, 39391, 153259}},
+{18041, 18, 77899, {1, 3, 3, 11, 21, 39, 35, 173, 171, 15, 987, 3737, 7415, 1827, 973, 6831, 108643, 241333}},
+{18042, 18, 77901, {1, 3, 7, 9, 17, 37, 127, 243, 153, 195, 113, 309, 5301, 13619, 7927, 35385, 9501, 99241}},
+{18043, 18, 77904, {1, 3, 5, 13, 23, 9, 81, 235, 139, 635, 443, 2235, 2613, 2389, 18431, 8409, 2885, 254811}},
+{18044, 18, 77914, {1, 3, 7, 9, 1, 5, 15, 109, 141, 173, 1059, 1961, 7945, 10381, 17337, 19591, 42173, 119831}},
+{18045, 18, 77925, {1, 3, 1, 13, 19, 7, 111, 111, 345, 327, 1147, 2293, 49, 16213, 25309, 60537, 50421, 108467}},
+{18046, 18, 77950, {1, 1, 5, 1, 3, 23, 63, 219, 69, 879, 1397, 3857, 1859, 1939, 4851, 26549, 86019, 7927}},
+{18047, 18, 77959, {1, 3, 1, 13, 23, 61, 25, 31, 301, 189, 1031, 2817, 829, 8777, 26869, 54405, 43535, 234687}},
+{18048, 18, 77994, {1, 1, 1, 9, 11, 31, 13, 139, 77, 567, 949, 3415, 6955, 14973, 9565, 37911, 18395, 94167}},
+{18049, 18, 78004, {1, 3, 5, 13, 17, 17, 21, 213, 171, 993, 1001, 979, 5085, 3909, 11797, 48669, 73541, 48979}},
+{18050, 18, 78043, {1, 1, 7, 9, 7, 37, 35, 107, 347, 239, 585, 2883, 3235, 1053, 14871, 25799, 4861, 56335}},
+{18051, 18, 78052, {1, 1, 3, 5, 19, 7, 91, 139, 325, 921, 863, 209, 845, 15943, 8281, 55103, 110193, 216091}},
+{18052, 18, 78061, {1, 3, 1, 13, 31, 33, 65, 155, 177, 103, 1991, 343, 6299, 3587, 30215, 64335, 114301, 220403}},
+{18053, 18, 78064, {1, 3, 5, 3, 31, 37, 121, 157, 443, 349, 1097, 3683, 503, 14061, 14685, 29755, 61543, 232983}},
+{18054, 18, 78084, {1, 3, 3, 11, 17, 59, 29, 161, 381, 791, 1647, 1077, 6369, 1095, 17279, 43141, 65003, 144609}},
+{18055, 18, 78094, {1, 1, 5, 1, 1, 15, 67, 77, 3, 585, 1909, 1485, 3003, 591, 4711, 10279, 75901, 226417}},
+{18056, 18, 78099, {1, 3, 7, 5, 1, 5, 5, 193, 469, 631, 1065, 607, 2751, 8163, 13633, 40563, 1417, 118169}},
+{18057, 18, 78129, {1, 1, 7, 9, 25, 25, 109, 27, 157, 495, 225, 1385, 4315, 995, 10591, 1629, 129939, 56765}},
+{18058, 18, 78142, {1, 3, 1, 7, 9, 23, 61, 63, 35, 145, 1537, 1029, 4225, 1467, 10519, 32861, 519, 53983}},
+{18059, 18, 78149, {1, 3, 3, 11, 7, 59, 25, 199, 403, 967, 1089, 1121, 1063, 6701, 16827, 55479, 72983, 36873}},
+{18060, 18, 78153, {1, 1, 1, 13, 9, 27, 19, 23, 395, 229, 1837, 1231, 1737, 10475, 16743, 42369, 130331, 47255}},
+{18061, 18, 78171, {1, 1, 5, 7, 29, 15, 95, 155, 339, 65, 751, 2399, 5615, 2987, 16769, 57381, 113021, 41417}},
+{18062, 18, 78173, {1, 3, 1, 9, 15, 17, 1, 111, 197, 7, 417, 3999, 7261, 5939, 16773, 29275, 105559, 84685}},
+{18063, 18, 78174, {1, 3, 3, 13, 19, 31, 103, 1, 37, 269, 1257, 1397, 4293, 3019, 6503, 7727, 93943, 237313}},
+{18064, 18, 78195, {1, 1, 3, 9, 13, 37, 67, 129, 43, 669, 1331, 1787, 8185, 323, 18749, 13737, 86123, 154131}},
+{18065, 18, 78201, {1, 3, 1, 11, 3, 51, 13, 35, 197, 867, 559, 1381, 1057, 13293, 20603, 18633, 50503, 169685}},
+{18066, 18, 78202, {1, 3, 1, 11, 9, 35, 7, 51, 499, 885, 353, 4095, 6491, 5917, 15053, 18363, 99593, 213089}},
+{18067, 18, 78241, {1, 1, 3, 9, 19, 23, 107, 147, 339, 331, 1349, 2855, 3721, 13317, 26457, 783, 93949, 196051}},
+{18068, 18, 78247, {1, 1, 5, 1, 9, 61, 89, 217, 315, 385, 1729, 2641, 5753, 6269, 547, 33737, 20103, 31533}},
+{18069, 18, 78274, {1, 3, 5, 13, 13, 61, 3, 191, 57, 683, 1227, 1255, 3651, 10687, 9049, 6529, 60783, 28639}},
+{18070, 18, 78276, {1, 1, 7, 11, 25, 41, 79, 19, 383, 363, 1731, 1597, 1651, 15037, 22191, 51883, 41927, 82419}},
+{18071, 18, 78303, {1, 3, 5, 9, 15, 61, 39, 149, 49, 633, 709, 1743, 621, 14659, 3309, 64129, 91897, 74235}},
+{18072, 18, 78307, {1, 3, 7, 15, 5, 59, 7, 197, 111, 885, 1737, 855, 2807, 3817, 13759, 29989, 45105, 171689}},
+{18073, 18, 78328, {1, 1, 3, 9, 21, 25, 55, 67, 483, 437, 303, 703, 6993, 1971, 4565, 56117, 6105, 254517}},
+{18074, 18, 78344, {1, 3, 3, 13, 15, 13, 19, 3, 487, 751, 1185, 2985, 1619, 7139, 26087, 21105, 9049, 236153}},
+{18075, 18, 78362, {1, 1, 5, 7, 15, 55, 51, 231, 85, 953, 713, 659, 2021, 4271, 15961, 26873, 31141, 76635}},
+{18076, 18, 78367, {1, 3, 5, 1, 11, 39, 3, 223, 367, 903, 799, 415, 7247, 9539, 14479, 37195, 59951, 181935}},
+{18077, 18, 78368, {1, 1, 5, 3, 13, 47, 17, 159, 439, 859, 1067, 3111, 5277, 13973, 21999, 28381, 115685, 231483}},
+{18078, 18, 78409, {1, 1, 7, 15, 17, 21, 69, 131, 193, 479, 1075, 3271, 2057, 1295, 31235, 35027, 94145, 65419}},
+{18079, 18, 78412, {1, 3, 3, 5, 5, 21, 5, 81, 113, 259, 837, 831, 5985, 6717, 12041, 40355, 50957, 111185}},
+{18080, 18, 78417, {1, 1, 1, 9, 15, 47, 103, 195, 465, 739, 1415, 225, 3121, 12623, 7539, 17555, 36703, 217641}},
+{18081, 18, 78430, {1, 3, 1, 3, 31, 17, 91, 153, 221, 217, 525, 981, 281, 9869, 9713, 10669, 12049, 97615}},
+{18082, 18, 78433, {1, 1, 5, 7, 29, 1, 1, 199, 415, 843, 301, 941, 4589, 13301, 5833, 41311, 74019, 78537}},
+{18083, 18, 78440, {1, 1, 5, 11, 13, 5, 41, 127, 213, 917, 1297, 2281, 3193, 3877, 9517, 40685, 14657, 185139}},
+{18084, 18, 78451, {1, 1, 1, 7, 21, 45, 87, 33, 425, 487, 643, 271, 7087, 5979, 14795, 27575, 34541, 173251}},
+{18085, 18, 78453, {1, 3, 7, 5, 21, 11, 7, 169, 325, 905, 973, 2853, 7929, 8801, 1005, 60641, 45973, 81859}},
+{18086, 18, 78458, {1, 3, 3, 1, 1, 35, 39, 81, 93, 463, 697, 2309, 7769, 5169, 17595, 41447, 28837, 52613}},
+{18087, 18, 78467, {1, 1, 7, 1, 1, 23, 37, 17, 137, 873, 1657, 681, 503, 7887, 24463, 32453, 112727, 133347}},
+{18088, 18, 78479, {1, 1, 5, 9, 19, 35, 37, 85, 11, 245, 11, 3, 6475, 5953, 247, 49447, 32813, 243841}},
+{18089, 18, 78507, {1, 3, 5, 3, 19, 53, 37, 45, 431, 259, 1831, 1443, 2237, 7651, 20701, 22857, 50041, 119667}},
+{18090, 18, 78518, {1, 1, 7, 1, 5, 37, 113, 69, 389, 369, 1251, 1989, 7613, 10669, 4233, 33379, 72465, 256861}},
+{18091, 18, 78535, {1, 1, 7, 5, 27, 55, 17, 75, 373, 325, 1981, 1743, 7341, 319, 28169, 3587, 66057, 169723}},
+{18092, 18, 78542, {1, 3, 3, 15, 27, 31, 47, 91, 367, 245, 2045, 979, 2169, 10935, 29523, 64871, 119447, 92131}},
+{18093, 18, 78549, {1, 3, 7, 15, 9, 11, 93, 61, 249, 107, 1883, 2547, 375, 4195, 6451, 14533, 62529, 93557}},
+{18094, 18, 78554, {1, 1, 1, 3, 29, 61, 65, 155, 301, 1017, 131, 1567, 3649, 3447, 27943, 52111, 9133, 88147}},
+{18095, 18, 78556, {1, 1, 1, 1, 21, 59, 107, 151, 265, 707, 767, 2325, 8095, 14027, 15355, 15465, 83143, 116199}},
+{18096, 18, 78583, {1, 3, 1, 15, 23, 51, 31, 25, 439, 357, 1563, 1091, 2135, 1327, 18427, 60965, 29215, 157351}},
+{18097, 18, 78590, {1, 3, 3, 13, 29, 37, 25, 215, 149, 487, 703, 1787, 3641, 8301, 8795, 13845, 95245, 169793}},
+{18098, 18, 78615, {1, 3, 3, 11, 27, 3, 49, 87, 69, 687, 1181, 3405, 589, 12901, 14199, 48607, 74027, 181379}},
+{18099, 18, 78635, {1, 3, 5, 13, 9, 15, 33, 229, 135, 769, 1005, 2435, 4831, 5493, 16745, 64379, 20253, 52661}},
+{18100, 18, 78649, {1, 1, 1, 13, 9, 61, 33, 127, 339, 15, 945, 219, 4291, 6995, 29127, 61853, 40741, 170541}},
+{18101, 18, 78684, {1, 3, 3, 15, 9, 33, 75, 39, 327, 133, 733, 1125, 2747, 15031, 24575, 65013, 41997, 158679}},
+{18102, 18, 78691, {1, 1, 3, 9, 3, 9, 63, 83, 493, 175, 249, 1977, 8177, 4067, 2131, 12467, 86185, 73417}},
+{18103, 18, 78705, {1, 1, 3, 13, 29, 55, 91, 109, 73, 913, 1343, 2147, 105, 8763, 7613, 55749, 4339, 61253}},
+{18104, 18, 78724, {1, 1, 5, 5, 17, 19, 45, 57, 345, 835, 341, 1365, 5187, 7485, 22685, 32321, 67279, 141119}},
+{18105, 18, 78755, {1, 1, 3, 11, 9, 47, 11, 231, 241, 681, 255, 3663, 5547, 997, 2445, 64413, 55349, 61785}},
+{18106, 18, 78770, {1, 3, 5, 5, 23, 29, 23, 249, 149, 1011, 173, 271, 485, 1239, 81, 59277, 96669, 210859}},
+{18107, 18, 78772, {1, 3, 3, 1, 17, 9, 41, 39, 309, 131, 1431, 1497, 1669, 14191, 22795, 48951, 101731, 70847}},
+{18108, 18, 78818, {1, 1, 3, 15, 1, 11, 37, 79, 23, 1023, 585, 127, 7817, 15009, 3897, 44601, 83039, 240457}},
+{18109, 18, 78837, {1, 3, 5, 9, 21, 33, 55, 31, 193, 745, 1741, 3637, 7265, 8969, 11797, 33239, 29123, 126077}},
+{18110, 18, 78844, {1, 3, 3, 13, 31, 5, 87, 215, 271, 573, 1423, 2611, 947, 14669, 23785, 60579, 127099, 55877}},
+{18111, 18, 78849, {1, 3, 1, 13, 5, 53, 103, 85, 237, 457, 739, 1201, 133, 8589, 13471, 6707, 42257, 141989}},
+{18112, 18, 78909, {1, 1, 1, 5, 23, 3, 65, 159, 445, 823, 341, 1723, 6263, 9421, 16023, 19145, 52337, 229397}},
+{18113, 18, 78915, {1, 3, 5, 3, 15, 3, 15, 251, 407, 137, 951, 1319, 1035, 7713, 29579, 19591, 77841, 84949}},
+{18114, 18, 78941, {1, 1, 7, 15, 19, 25, 63, 141, 511, 11, 1027, 1209, 6627, 8127, 14879, 12965, 109973, 144501}},
+{18115, 18, 78958, {1, 1, 1, 3, 11, 57, 65, 169, 453, 197, 1249, 2933, 3743, 1971, 19373, 32109, 73265, 46185}},
+{18116, 18, 78975, {1, 1, 3, 1, 3, 1, 21, 47, 471, 565, 1795, 1771, 3187, 7189, 18627, 22993, 112319, 158693}},
+{18117, 18, 78979, {1, 1, 5, 7, 5, 25, 127, 113, 31, 609, 1273, 2799, 5713, 16091, 22239, 43617, 126003, 218991}},
+{18118, 18, 78986, {1, 3, 3, 7, 19, 59, 19, 185, 483, 431, 335, 565, 819, 2555, 18653, 36573, 50085, 31007}},
+{18119, 18, 79029, {1, 1, 3, 13, 17, 61, 5, 219, 297, 755, 2005, 391, 4927, 1517, 11341, 9527, 51739, 182599}},
+{18120, 18, 79030, {1, 3, 7, 9, 9, 3, 39, 211, 475, 717, 189, 819, 529, 469, 28559, 7321, 60213, 79505}},
+{18121, 18, 79044, {1, 3, 1, 9, 17, 39, 53, 65, 247, 145, 9, 1669, 7221, 8359, 11021, 29775, 24693, 208655}},
+{18122, 18, 79048, {1, 1, 5, 13, 7, 7, 31, 135, 375, 439, 1419, 3579, 4313, 14057, 31505, 55249, 5345, 69537}},
+{18123, 18, 79056, {1, 3, 5, 9, 21, 3, 125, 223, 9, 73, 1693, 281, 3941, 10377, 29365, 19807, 73973, 169113}},
+{18124, 18, 79095, {1, 3, 7, 15, 29, 41, 119, 75, 241, 79, 1969, 1091, 6241, 10685, 11579, 3791, 124443, 5051}},
+{18125, 18, 79099, {1, 3, 7, 15, 23, 53, 13, 255, 205, 547, 255, 1589, 7261, 15735, 14521, 29679, 109373, 236433}},
+{18126, 18, 79121, {1, 3, 7, 3, 17, 37, 71, 163, 95, 265, 1, 3239, 1779, 9047, 31387, 32291, 86741, 55317}},
+{18127, 18, 79150, {1, 3, 1, 9, 31, 55, 117, 247, 317, 673, 749, 1155, 7743, 6427, 25273, 49701, 62345, 20913}},
+{18128, 18, 79196, {1, 3, 3, 7, 27, 55, 35, 111, 69, 799, 213, 3011, 4359, 14763, 7387, 13281, 58397, 38415}},
+{18129, 18, 79199, {1, 1, 5, 9, 5, 61, 49, 219, 419, 297, 1019, 2181, 6069, 12957, 24637, 23317, 6389, 240893}},
+{18130, 18, 79220, {1, 1, 5, 15, 13, 57, 59, 43, 373, 647, 1407, 3955, 5583, 15229, 20935, 38007, 65971, 95987}},
+{18131, 18, 79229, {1, 1, 7, 7, 23, 17, 77, 91, 449, 75, 1059, 3337, 2041, 261, 25077, 28161, 44537, 189443}},
+{18132, 18, 79263, {1, 1, 7, 11, 9, 7, 117, 225, 457, 941, 161, 1825, 1101, 193, 32619, 37245, 102633, 86707}},
+{18133, 18, 79264, {1, 1, 1, 7, 13, 43, 33, 137, 275, 691, 1387, 1265, 759, 1457, 4877, 41813, 4159, 234397}},
+{18134, 18, 79296, {1, 3, 3, 1, 9, 23, 71, 39, 205, 175, 953, 2965, 3283, 6025, 5905, 34691, 120987, 71841}},
+{18135, 18, 79302, {1, 3, 1, 13, 31, 63, 49, 73, 299, 169, 1265, 2205, 1299, 10045, 6919, 26067, 56909, 42549}},
+{18136, 18, 79354, {1, 3, 3, 1, 31, 41, 75, 219, 457, 407, 5, 1901, 6823, 531, 3155, 64375, 38523, 68217}},
+{18137, 18, 79387, {1, 1, 7, 9, 7, 35, 123, 193, 145, 1021, 757, 3775, 2313, 11885, 11649, 61071, 129363, 120467}},
+{18138, 18, 79399, {1, 3, 7, 3, 29, 21, 127, 93, 415, 641, 453, 923, 7713, 9569, 5961, 25969, 31095, 93317}},
+{18139, 18, 79435, {1, 3, 3, 1, 5, 15, 21, 235, 211, 663, 385, 2429, 319, 11571, 17539, 42975, 43179, 100105}},
+{18140, 18, 79525, {1, 3, 7, 7, 25, 57, 51, 215, 393, 167, 1569, 3235, 5555, 3391, 2389, 36485, 21919, 164479}},
+{18141, 18, 79540, {1, 3, 3, 3, 29, 21, 81, 59, 239, 671, 605, 583, 2341, 2321, 28593, 19035, 10209, 36433}},
+{18142, 18, 79552, {1, 3, 3, 11, 31, 33, 1, 147, 111, 523, 427, 3545, 111, 8009, 29101, 34549, 122745, 82117}},
+{18143, 18, 79562, {1, 3, 5, 15, 19, 37, 97, 141, 387, 523, 467, 1657, 4161, 5505, 18091, 39597, 124423, 74827}},
+{18144, 18, 79576, {1, 1, 1, 11, 21, 63, 61, 13, 169, 851, 1863, 3307, 7189, 10791, 22619, 24431, 127781, 14717}},
+{18145, 18, 79579, {1, 1, 3, 13, 27, 41, 69, 127, 497, 565, 1489, 277, 2551, 15409, 9885, 187, 101319, 194121}},
+{18146, 18, 79605, {1, 1, 7, 7, 17, 45, 1, 139, 347, 503, 1189, 1459, 6117, 14319, 22153, 2915, 91991, 246679}},
+{18147, 18, 79618, {1, 3, 3, 3, 9, 41, 25, 199, 327, 295, 945, 2765, 563, 11605, 24267, 37729, 80057, 169479}},
+{18148, 18, 79648, {1, 1, 7, 3, 23, 19, 13, 219, 235, 837, 1015, 2071, 2727, 3989, 32539, 26713, 112391, 163943}},
+{18149, 18, 79654, {1, 3, 3, 9, 21, 27, 17, 187, 315, 753, 817, 3053, 5961, 973, 23973, 37621, 105637, 247711}},
+{18150, 18, 79666, {1, 1, 7, 1, 11, 15, 45, 25, 421, 213, 663, 3829, 469, 15889, 28773, 14323, 107705, 111729}},
+{18151, 18, 79686, {1, 1, 1, 7, 7, 7, 51, 189, 457, 95, 1903, 639, 1933, 7409, 22327, 18959, 42679, 158987}},
+{18152, 18, 79697, {1, 1, 5, 9, 13, 13, 49, 159, 387, 365, 1799, 2399, 6375, 14965, 32495, 5383, 73479, 5653}},
+{18153, 18, 79700, {1, 1, 3, 1, 29, 23, 81, 73, 183, 563, 435, 133, 5731, 6663, 21219, 60007, 101215, 68775}},
+{18154, 18, 79723, {1, 1, 7, 11, 31, 47, 43, 159, 221, 745, 1317, 2405, 4563, 4073, 27675, 14225, 114231, 222553}},
+{18155, 18, 79749, {1, 1, 1, 5, 11, 63, 105, 99, 413, 81, 771, 547, 1633, 8097, 30431, 31417, 101379, 163575}},
+{18156, 18, 79750, {1, 1, 3, 9, 23, 29, 123, 149, 241, 267, 1925, 467, 7743, 4473, 12223, 10521, 86265, 89949}},
+{18157, 18, 79764, {1, 3, 5, 1, 31, 29, 111, 67, 311, 851, 1919, 2563, 3725, 4035, 7241, 13859, 105207, 200599}},
+{18158, 18, 79771, {1, 3, 7, 3, 19, 53, 113, 107, 133, 243, 2021, 2669, 4633, 14393, 24827, 1233, 81471, 20105}},
+{18159, 18, 79774, {1, 1, 1, 5, 3, 23, 43, 149, 157, 875, 1175, 963, 6189, 7343, 13913, 41375, 112857, 236047}},
+{18160, 18, 79780, {1, 3, 5, 15, 11, 31, 43, 225, 469, 229, 703, 3033, 2341, 10309, 12057, 13325, 109019, 130789}},
+{18161, 18, 79789, {1, 1, 1, 7, 27, 47, 45, 49, 371, 971, 1121, 2179, 1267, 9499, 10771, 28781, 77059, 90765}},
+{18162, 18, 79798, {1, 1, 7, 1, 17, 27, 59, 169, 269, 217, 983, 1365, 1985, 12287, 5385, 46407, 24827, 155761}},
+{18163, 18, 79821, {1, 1, 7, 11, 9, 5, 19, 205, 159, 937, 763, 3823, 3625, 14209, 32031, 58879, 118449, 50723}},
+{18164, 18, 79850, {1, 1, 5, 3, 25, 55, 27, 35, 125, 999, 1541, 3883, 539, 5691, 18071, 63199, 112089, 194825}},
+{18165, 18, 79864, {1, 3, 3, 1, 27, 43, 57, 225, 173, 673, 1339, 3433, 5743, 1375, 32429, 35071, 98035, 229973}},
+{18166, 18, 79898, {1, 3, 3, 9, 3, 51, 5, 203, 439, 41, 529, 863, 6735, 13211, 7075, 55637, 24481, 46673}},
+{18167, 18, 79904, {1, 1, 5, 11, 15, 23, 93, 7, 181, 843, 777, 1299, 1941, 7147, 26253, 10967, 5387, 84611}},
+{18168, 18, 79934, {1, 3, 1, 7, 9, 57, 127, 155, 257, 423, 1421, 261, 4477, 11169, 22997, 12371, 8705, 135883}},
+{18169, 18, 79936, {1, 3, 1, 9, 17, 9, 15, 209, 427, 889, 1939, 3623, 2587, 4037, 32233, 40391, 32529, 63851}},
+{18170, 18, 79942, {1, 3, 3, 13, 3, 19, 49, 155, 213, 239, 817, 1787, 2999, 9955, 20155, 44711, 41367, 59623}},
+{18171, 18, 79945, {1, 3, 7, 5, 5, 39, 103, 181, 405, 85, 1997, 3639, 1259, 10737, 189, 44377, 23589, 89371}},
+{18172, 18, 79963, {1, 3, 5, 11, 15, 13, 57, 81, 203, 773, 1571, 3235, 6625, 13803, 2091, 64265, 131013, 189705}},
+{18173, 18, 79987, {1, 1, 1, 13, 15, 3, 113, 159, 149, 55, 355, 2345, 5043, 4067, 23277, 32647, 43755, 5445}},
+{18174, 18, 80057, {1, 3, 3, 9, 31, 7, 67, 177, 423, 269, 1731, 3957, 4383, 13483, 14653, 8243, 57689, 37375}},
+{18175, 18, 80077, {1, 1, 3, 5, 25, 5, 77, 199, 161, 859, 497, 1679, 6809, 4877, 1107, 16443, 15505, 138155}},
+{18176, 18, 80078, {1, 3, 5, 1, 11, 57, 7, 49, 145, 569, 571, 2679, 7531, 14517, 12425, 6285, 116961, 116397}},
+{18177, 18, 80080, {1, 1, 7, 11, 1, 37, 65, 43, 151, 419, 801, 3231, 5321, 10725, 12885, 62771, 16507, 179009}},
+{18178, 18, 80102, {1, 1, 5, 11, 29, 55, 89, 81, 325, 47, 1037, 3235, 2017, 10875, 8919, 25115, 118035, 178227}},
+{18179, 18, 80106, {1, 3, 1, 7, 1, 43, 101, 25, 449, 617, 381, 3437, 6655, 1291, 18693, 53939, 99143, 195695}},
+{18180, 18, 80111, {1, 3, 1, 5, 23, 7, 47, 159, 295, 939, 173, 3087, 1497, 6353, 13893, 13465, 118973, 193737}},
+{18181, 18, 80152, {1, 1, 3, 9, 3, 41, 65, 79, 449, 345, 2039, 1193, 5915, 13689, 1257, 23273, 48515, 256793}},
+{18182, 18, 80155, {1, 3, 5, 11, 11, 55, 13, 117, 343, 899, 1853, 373, 6885, 12863, 1209, 34433, 48215, 218187}},
+{18183, 18, 80173, {1, 3, 7, 7, 3, 45, 103, 145, 55, 507, 743, 4027, 2075, 15707, 4473, 50077, 64551, 204305}},
+{18184, 18, 80186, {1, 1, 3, 5, 31, 45, 123, 233, 363, 1003, 411, 1459, 6455, 985, 29451, 17625, 44153, 137097}},
+{18185, 18, 80203, {1, 3, 3, 1, 27, 11, 53, 251, 41, 43, 495, 107, 6145, 8785, 28997, 7181, 92903, 105785}},
+{18186, 18, 80223, {1, 1, 3, 11, 13, 5, 117, 141, 463, 639, 1857, 2873, 3627, 6081, 18207, 29451, 80909, 73557}},
+{18187, 18, 80233, {1, 1, 1, 3, 29, 51, 15, 81, 85, 487, 307, 2481, 2769, 14901, 9407, 58321, 52813, 230393}},
+{18188, 18, 80258, {1, 3, 3, 11, 31, 7, 107, 43, 205, 811, 1121, 2757, 2447, 6843, 21347, 9143, 41003, 80507}},
+{18189, 18, 80281, {1, 1, 1, 1, 29, 19, 13, 203, 47, 689, 2003, 1477, 7857, 5031, 21781, 5745, 3649, 160389}},
+{18190, 18, 80318, {1, 3, 3, 7, 21, 21, 65, 3, 351, 157, 167, 3425, 2395, 9165, 26143, 57221, 127171, 54461}},
+{18191, 18, 80326, {1, 3, 1, 15, 13, 13, 65, 53, 305, 719, 181, 709, 5485, 13385, 30287, 52669, 82647, 83851}},
+{18192, 18, 80330, {1, 1, 3, 11, 11, 23, 31, 109, 205, 123, 509, 3831, 7771, 7341, 31613, 28035, 38061, 49375}},
+{18193, 18, 80337, {1, 3, 3, 3, 15, 33, 47, 159, 321, 589, 393, 3253, 3743, 6161, 445, 33129, 8181, 27793}},
+{18194, 18, 80344, {1, 1, 1, 13, 9, 57, 111, 253, 203, 539, 673, 855, 1937, 2699, 25795, 6889, 13531, 63561}},
+{18195, 18, 80365, {1, 1, 1, 13, 31, 45, 13, 101, 113, 903, 1699, 2423, 7967, 7957, 20303, 64395, 124447, 33947}},
+{18196, 18, 80383, {1, 3, 5, 11, 17, 39, 59, 181, 421, 535, 1445, 3927, 5433, 12885, 12497, 47231, 39819, 46371}},
+{18197, 18, 80389, {1, 3, 5, 7, 27, 3, 75, 49, 461, 781, 433, 1767, 6903, 11907, 2063, 55199, 82823, 229405}},
+{18198, 18, 80413, {1, 3, 3, 15, 17, 61, 17, 23, 247, 683, 33, 4027, 341, 8069, 2529, 9757, 95653, 12927}},
+{18199, 18, 80441, {1, 3, 3, 11, 17, 7, 29, 205, 353, 917, 219, 3509, 7803, 5939, 25111, 45357, 9259, 1549}},
+{18200, 18, 80449, {1, 3, 3, 15, 21, 7, 23, 25, 459, 291, 31, 2091, 1177, 9311, 12231, 16617, 33575, 252643}},
+{18201, 18, 80461, {1, 3, 5, 5, 3, 51, 113, 123, 453, 503, 1575, 2785, 5011, 1789, 819, 30857, 12955, 172421}},
+{18202, 18, 80467, {1, 1, 5, 3, 15, 15, 125, 65, 113, 281, 53, 3417, 5279, 6351, 25931, 54835, 124077, 204241}},
+{18203, 18, 80476, {1, 1, 3, 9, 29, 31, 19, 179, 275, 933, 711, 3351, 6221, 1711, 9375, 11645, 118911, 249395}},
+{18204, 18, 80507, {1, 3, 7, 13, 23, 59, 43, 61, 85, 267, 691, 3949, 2135, 3203, 21455, 61895, 71157, 136739}},
+{18205, 18, 80516, {1, 1, 7, 5, 19, 27, 69, 141, 9, 633, 95, 3789, 7823, 12635, 27661, 30285, 129469, 67163}},
+{18206, 18, 80519, {1, 3, 3, 9, 11, 25, 103, 47, 425, 809, 1279, 411, 219, 6703, 24145, 17303, 56835, 84879}},
+{18207, 18, 80568, {1, 1, 5, 13, 29, 41, 47, 133, 197, 615, 169, 2157, 1795, 4945, 31693, 57763, 39369, 83353}},
+{18208, 18, 80571, {1, 3, 1, 3, 27, 23, 23, 213, 387, 239, 977, 221, 383, 11005, 7221, 8795, 100963, 163777}},
+{18209, 18, 80579, {1, 1, 1, 1, 31, 29, 87, 93, 239, 399, 801, 3143, 6973, 16331, 16865, 1823, 1127, 41983}},
+{18210, 18, 80586, {1, 1, 3, 13, 7, 39, 25, 251, 277, 417, 119, 3033, 6785, 9783, 1641, 60169, 25047, 182263}},
+{18211, 18, 80599, {1, 1, 5, 5, 7, 35, 17, 47, 295, 861, 1671, 1971, 4583, 3925, 31013, 50039, 125191, 143019}},
+{18212, 18, 80610, {1, 1, 5, 1, 3, 57, 11, 23, 273, 209, 617, 1499, 665, 1193, 7539, 1625, 48065, 82843}},
+{18213, 18, 80629, {1, 1, 3, 15, 15, 17, 39, 145, 193, 503, 1305, 2071, 93, 11529, 14267, 14779, 49327, 51347}},
+{18214, 18, 80642, {1, 3, 5, 3, 7, 39, 63, 171, 263, 493, 383, 3209, 4277, 6259, 1345, 48013, 110571, 127865}},
+{18215, 18, 80690, {1, 3, 1, 7, 15, 29, 93, 75, 37, 235, 1095, 153, 745, 9785, 28831, 58899, 67091, 34743}},
+{18216, 18, 80713, {1, 3, 7, 9, 27, 23, 67, 85, 491, 447, 1899, 709, 555, 13979, 12529, 38383, 16091, 117301}},
+{18217, 18, 80716, {1, 1, 5, 3, 9, 55, 109, 173, 29, 19, 1265, 2391, 7761, 1953, 5643, 24079, 14187, 127017}},
+{18218, 18, 80737, {1, 3, 7, 13, 21, 57, 105, 145, 73, 421, 403, 5, 3523, 7005, 1109, 63357, 111671, 191857}},
+{18219, 18, 80743, {1, 1, 7, 13, 5, 27, 21, 5, 199, 515, 917, 365, 2775, 12453, 26989, 60593, 98977, 161759}},
+{18220, 18, 80750, {1, 3, 1, 13, 15, 37, 71, 65, 27, 533, 1311, 2981, 1945, 7183, 5337, 20659, 67355, 185633}},
+{18221, 18, 80786, {1, 1, 5, 7, 21, 39, 21, 195, 443, 979, 1033, 1823, 3045, 3023, 31783, 61803, 1023, 119291}},
+{18222, 18, 80811, {1, 1, 3, 11, 5, 15, 107, 155, 465, 249, 1845, 357, 2769, 3313, 12335, 16615, 20809, 103469}},
+{18223, 18, 80834, {1, 1, 3, 9, 13, 21, 11, 227, 173, 949, 1255, 3257, 601, 10865, 12779, 9173, 87255, 12867}},
+{18224, 18, 80839, {1, 3, 3, 15, 3, 41, 97, 141, 385, 23, 1253, 2905, 1523, 7647, 7069, 61143, 101245, 59747}},
+{18225, 18, 80840, {1, 3, 1, 3, 7, 35, 117, 93, 357, 741, 1673, 3295, 6809, 547, 22949, 42151, 91241, 16189}},
+{18226, 18, 80846, {1, 3, 5, 9, 25, 31, 27, 221, 55, 595, 1513, 3963, 3143, 1189, 19843, 6361, 19575, 231765}},
+{18227, 18, 80848, {1, 1, 5, 1, 3, 35, 91, 217, 385, 717, 57, 1471, 3529, 859, 15259, 4411, 54491, 79841}},
+{18228, 18, 80876, {1, 1, 5, 9, 29, 47, 111, 89, 469, 975, 513, 1339, 1747, 8839, 30375, 46217, 128191, 95831}},
+{18229, 18, 80911, {1, 1, 5, 13, 9, 45, 3, 221, 223, 461, 1353, 3953, 5505, 3139, 3407, 12953, 74487, 209401}},
+{18230, 18, 80947, {1, 1, 7, 7, 7, 43, 33, 143, 427, 183, 573, 2881, 7355, 10693, 12841, 14267, 61847, 47689}},
+{18231, 18, 81001, {1, 1, 3, 5, 23, 45, 53, 173, 347, 715, 173, 3385, 429, 8143, 2831, 57883, 77245, 37613}},
+{18232, 18, 81031, {1, 1, 1, 13, 21, 47, 33, 157, 171, 47, 1981, 2003, 7401, 7687, 10553, 38083, 111901, 30251}},
+{18233, 18, 81045, {1, 1, 5, 9, 23, 35, 121, 251, 7, 835, 1561, 1605, 7023, 15645, 14313, 6361, 107973, 211667}},
+{18234, 18, 81056, {1, 3, 1, 13, 25, 39, 81, 31, 145, 483, 1587, 3457, 5293, 927, 3529, 22457, 69689, 190371}},
+{18235, 18, 81073, {1, 1, 1, 3, 25, 61, 87, 111, 441, 829, 313, 2271, 205, 10187, 3003, 47237, 99899, 200553}},
+{18236, 18, 81083, {1, 1, 7, 13, 31, 51, 9, 243, 219, 139, 1703, 2001, 959, 11265, 27897, 9081, 4473, 107737}},
+{18237, 18, 81145, {1, 3, 5, 1, 25, 37, 61, 131, 487, 35, 1293, 833, 3847, 11315, 11811, 2763, 2199, 81127}},
+{18238, 18, 81168, {1, 3, 7, 7, 31, 33, 87, 111, 429, 809, 173, 1093, 7719, 14307, 5735, 61019, 21223, 26361}},
+{18239, 18, 81177, {1, 1, 3, 11, 17, 33, 31, 17, 49, 885, 1279, 2243, 3693, 61, 30909, 35807, 14027, 159225}},
+{18240, 18, 81207, {1, 3, 7, 11, 9, 35, 61, 75, 171, 117, 1285, 935, 7271, 3509, 14119, 31065, 58181, 136623}},
+{18241, 18, 81208, {1, 1, 3, 15, 3, 43, 93, 221, 239, 783, 37, 4007, 3637, 10461, 18425, 59629, 93781, 252689}},
+{18242, 18, 81226, {1, 3, 5, 7, 5, 61, 19, 107, 123, 417, 1655, 2307, 8177, 13617, 17195, 31597, 66241, 107199}},
+{18243, 18, 81245, {1, 3, 7, 7, 5, 5, 25, 69, 383, 217, 993, 2719, 3425, 8395, 1125, 10763, 80111, 70421}},
+{18244, 18, 81269, {1, 1, 3, 9, 29, 45, 123, 45, 89, 1015, 1703, 4049, 4969, 3801, 23657, 41031, 66415, 34063}},
+{18245, 18, 81285, {1, 1, 3, 3, 7, 53, 125, 63, 67, 335, 1937, 1793, 4641, 7115, 10951, 45503, 54723, 177433}},
+{18246, 18, 81289, {1, 3, 5, 1, 21, 55, 83, 199, 509, 331, 695, 2133, 1881, 14369, 21687, 2343, 85895, 99255}},
+{18247, 18, 81292, {1, 1, 5, 9, 11, 5, 111, 97, 433, 851, 1537, 411, 6629, 5185, 30749, 50017, 46177, 213347}},
+{18248, 18, 81298, {1, 3, 3, 1, 7, 21, 95, 229, 311, 605, 1277, 2435, 5053, 3051, 15447, 35479, 2835, 204149}},
+{18249, 18, 81310, {1, 3, 5, 9, 31, 27, 79, 201, 329, 735, 1933, 27, 6201, 9375, 24801, 34045, 16227, 61013}},
+{18250, 18, 81346, {1, 1, 5, 5, 31, 7, 73, 197, 455, 835, 1845, 2733, 3371, 513, 10495, 43659, 4621, 68969}},
+{18251, 18, 81348, {1, 1, 1, 15, 21, 55, 15, 83, 419, 471, 1427, 919, 7125, 7635, 25579, 19493, 37381, 191563}},
+{18252, 18, 81355, {1, 1, 7, 3, 15, 35, 25, 73, 295, 507, 719, 3307, 4253, 945, 21005, 24903, 80287, 48885}},
+{18253, 18, 81388, {1, 3, 7, 15, 27, 13, 71, 79, 189, 491, 1185, 3007, 4285, 13005, 18973, 33759, 15327, 45595}},
+{18254, 18, 81396, {1, 3, 3, 9, 9, 33, 115, 103, 31, 949, 1817, 2865, 1215, 9611, 16019, 7925, 72945, 208301}},
+{18255, 18, 81415, {1, 1, 1, 5, 19, 35, 89, 181, 409, 641, 1277, 2201, 2825, 5707, 13463, 34741, 39303, 217803}},
+{18256, 18, 81460, {1, 1, 3, 11, 13, 31, 65, 191, 11, 179, 509, 2513, 3861, 13323, 11817, 24901, 53815, 44343}},
+{18257, 18, 81482, {1, 3, 1, 5, 5, 57, 97, 25, 83, 177, 1963, 2367, 6703, 13361, 8749, 45533, 87883, 2977}},
+{18258, 18, 81518, {1, 3, 5, 3, 15, 41, 113, 145, 39, 509, 81, 1387, 2881, 1441, 75, 28409, 61417, 79393}},
+{18259, 18, 81523, {1, 3, 3, 3, 17, 1, 41, 19, 173, 133, 2033, 3637, 7415, 1841, 19497, 42643, 122885, 195301}},
+{18260, 18, 81529, {1, 3, 3, 9, 15, 37, 11, 87, 291, 881, 1471, 2469, 6877, 6813, 8273, 1455, 30957, 181887}},
+{18261, 18, 81545, {1, 3, 5, 9, 25, 41, 7, 71, 451, 831, 495, 3991, 4173, 4307, 31249, 7253, 57141, 35495}},
+{18262, 18, 81570, {1, 1, 7, 9, 15, 39, 29, 193, 327, 837, 991, 3503, 1175, 14965, 18151, 22479, 51127, 159019}},
+{18263, 18, 81576, {1, 3, 1, 9, 23, 41, 89, 211, 179, 507, 1005, 613, 8083, 15655, 1927, 23401, 51025, 21589}},
+{18264, 18, 81604, {1, 1, 5, 15, 5, 63, 105, 229, 239, 399, 591, 2233, 391, 2871, 29829, 49961, 62045, 190437}},
+{18265, 18, 81613, {1, 3, 5, 9, 7, 23, 85, 219, 163, 37, 1881, 589, 4239, 12845, 19993, 57267, 29519, 207597}},
+{18266, 18, 81631, {1, 3, 7, 15, 19, 19, 115, 141, 41, 405, 657, 2517, 4231, 10247, 21383, 11479, 52955, 121545}},
+{18267, 18, 81656, {1, 3, 1, 7, 23, 33, 65, 229, 287, 739, 1265, 1105, 487, 3801, 5211, 44731, 5359, 103685}},
+{18268, 18, 81679, {1, 3, 1, 13, 23, 29, 101, 153, 395, 335, 899, 303, 2073, 15767, 1303, 15539, 12889, 35517}},
+{18269, 18, 81684, {1, 1, 5, 11, 5, 63, 41, 53, 99, 339, 563, 2921, 4959, 13941, 13655, 10115, 56867, 42919}},
+{18270, 18, 81698, {1, 3, 5, 5, 5, 35, 127, 225, 497, 27, 139, 3269, 3929, 3369, 22697, 19421, 2921, 171927}},
+{18271, 18, 81736, {1, 1, 1, 15, 15, 21, 35, 251, 67, 447, 1045, 1173, 2951, 6589, 27261, 36597, 98721, 7205}},
+{18272, 18, 81747, {1, 3, 3, 9, 11, 63, 83, 19, 163, 381, 87, 1211, 3007, 4971, 27105, 2341, 21389, 32995}},
+{18273, 18, 81765, {1, 1, 3, 3, 21, 19, 63, 65, 505, 987, 1821, 2419, 3195, 2573, 1481, 35279, 45135, 597}},
+{18274, 18, 81775, {1, 3, 1, 15, 29, 5, 77, 65, 121, 223, 2009, 593, 7929, 10353, 22301, 25137, 40289, 95847}},
+{18275, 18, 81805, {1, 1, 3, 1, 17, 49, 9, 167, 69, 729, 1189, 1191, 1, 12603, 8281, 45193, 1427, 15887}},
+{18276, 18, 81842, {1, 1, 3, 7, 17, 5, 11, 217, 505, 317, 505, 1201, 8025, 13255, 12591, 16207, 32387, 242425}},
+{18277, 18, 81859, {1, 3, 7, 9, 25, 9, 97, 23, 91, 765, 653, 2689, 2787, 11719, 8455, 24665, 26907, 78525}},
+{18278, 18, 81865, {1, 3, 3, 15, 27, 19, 79, 157, 117, 715, 1921, 2453, 499, 13593, 14173, 1993, 110087, 151427}},
+{18279, 18, 81866, {1, 3, 1, 13, 5, 43, 59, 21, 451, 863, 533, 1723, 2059, 1611, 10403, 36479, 36999, 109553}},
+{18280, 18, 81892, {1, 3, 7, 7, 29, 63, 51, 5, 475, 549, 123, 1949, 5279, 8581, 20053, 52287, 125223, 152299}},
+{18281, 18, 81902, {1, 3, 1, 1, 7, 19, 1, 215, 273, 157, 1557, 425, 7549, 12337, 1735, 30917, 116487, 177335}},
+{18282, 18, 81933, {1, 1, 1, 1, 7, 47, 61, 191, 73, 551, 1435, 2283, 3191, 8545, 11875, 41389, 17607, 26869}},
+{18283, 18, 81934, {1, 1, 7, 9, 13, 61, 109, 121, 365, 223, 1729, 3311, 7249, 10765, 12419, 4235, 64127, 132257}},
+{18284, 18, 81942, {1, 1, 3, 13, 17, 25, 65, 49, 417, 311, 141, 1127, 53, 945, 28277, 33347, 96399, 166049}},
+{18285, 18, 81969, {1, 3, 7, 9, 5, 21, 93, 203, 467, 805, 115, 1757, 4535, 8687, 10423, 8065, 2955, 20403}},
+{18286, 18, 81981, {1, 3, 3, 15, 7, 63, 103, 137, 227, 111, 735, 2139, 4293, 5347, 4131, 63405, 42599, 173299}},
+{18287, 18, 81999, {1, 3, 7, 7, 17, 53, 127, 251, 57, 625, 843, 3045, 1319, 10085, 18591, 36115, 104193, 183891}},
+{18288, 18, 82004, {1, 3, 7, 1, 31, 57, 107, 253, 207, 739, 1703, 1377, 3807, 10289, 22969, 13087, 2805, 261279}},
+{18289, 18, 82008, {1, 1, 5, 5, 5, 59, 59, 63, 77, 663, 1109, 2159, 3725, 12355, 4805, 22433, 81851, 9419}},
+{18290, 18, 82032, {1, 1, 7, 15, 1, 1, 101, 101, 295, 311, 447, 3931, 933, 15713, 8919, 7185, 38577, 254203}},
+{18291, 18, 82035, {1, 1, 5, 15, 7, 35, 35, 141, 283, 665, 1685, 3875, 495, 1655, 8269, 23493, 1523, 248783}},
+{18292, 18, 82060, {1, 1, 5, 9, 27, 35, 25, 57, 285, 469, 1491, 1479, 3705, 11357, 5319, 11575, 116207, 215961}},
+{18293, 18, 82063, {1, 3, 5, 11, 7, 41, 67, 161, 73, 777, 247, 823, 6677, 1631, 3431, 2821, 25291, 17633}},
+{18294, 18, 82071, {1, 1, 3, 9, 19, 17, 45, 181, 139, 85, 857, 1231, 7167, 2951, 26847, 39113, 51705, 104617}},
+{18295, 18, 82081, {1, 3, 5, 1, 5, 55, 101, 209, 1, 47, 1059, 2175, 1549, 8007, 11267, 21863, 125567, 102775}},
+{18296, 18, 82082, {1, 3, 3, 15, 15, 21, 79, 85, 427, 963, 1335, 2129, 6831, 6613, 13319, 15781, 3781, 222547}},
+{18297, 18, 82105, {1, 3, 3, 13, 19, 63, 25, 123, 1, 215, 139, 1345, 5035, 3107, 14381, 6239, 18481, 202581}},
+{18298, 18, 82106, {1, 1, 5, 1, 11, 11, 11, 53, 109, 533, 1113, 177, 609, 15391, 22735, 62229, 103591, 89143}},
+{18299, 18, 82120, {1, 1, 5, 15, 3, 21, 115, 223, 167, 441, 277, 2971, 933, 2841, 26893, 48513, 74553, 250413}},
+{18300, 18, 82125, {1, 1, 1, 7, 19, 17, 43, 181, 483, 897, 819, 1657, 5539, 8847, 23483, 57605, 104703, 242559}},
+{18301, 18, 82156, {1, 3, 5, 11, 3, 63, 3, 129, 45, 981, 45, 845, 1481, 14735, 30451, 16937, 13789, 27107}},
+{18302, 18, 82176, {1, 3, 3, 15, 25, 11, 33, 49, 155, 947, 521, 3417, 3299, 1123, 9517, 32127, 117795, 223167}},
+{18303, 18, 82203, {1, 3, 5, 15, 3, 35, 27, 37, 287, 541, 727, 2779, 7033, 5189, 21579, 36895, 109645, 123353}},
+{18304, 18, 82210, {1, 3, 7, 9, 15, 53, 123, 125, 405, 841, 119, 63, 853, 8693, 1537, 25509, 49345, 54301}},
+{18305, 18, 82241, {1, 3, 7, 9, 11, 63, 65, 145, 283, 529, 1553, 883, 3319, 8601, 29379, 26991, 127343, 98701}},
+{18306, 18, 82287, {1, 1, 1, 7, 23, 59, 11, 89, 407, 869, 445, 659, 3029, 5465, 5063, 36775, 69089, 205367}},
+{18307, 18, 82323, {1, 3, 7, 5, 19, 35, 99, 49, 257, 287, 1113, 2825, 2797, 7283, 31757, 47015, 106987, 82589}},
+{18308, 18, 82330, {1, 3, 7, 11, 15, 37, 41, 101, 493, 725, 1091, 503, 2611, 13025, 11071, 39311, 5193, 92127}},
+{18309, 18, 82366, {1, 1, 3, 7, 9, 59, 69, 113, 381, 341, 1495, 3169, 5099, 69, 7911, 9721, 84609, 254171}},
+{18310, 18, 82378, {1, 3, 5, 7, 21, 19, 75, 71, 7, 617, 1185, 2787, 4147, 16045, 18859, 52347, 66551, 161563}},
+{18311, 18, 82395, {1, 3, 5, 3, 27, 39, 17, 205, 425, 3, 1443, 1947, 7645, 10125, 24577, 45373, 38015, 30407}},
+{18312, 18, 82398, {1, 3, 3, 11, 1, 57, 105, 251, 65, 389, 1993, 3933, 3093, 1425, 9483, 5953, 13147, 234121}},
+{18313, 18, 82401, {1, 3, 3, 3, 1, 27, 105, 45, 435, 393, 609, 291, 545, 4905, 22621, 62115, 78955, 84355}},
+{18314, 18, 82404, {1, 3, 7, 9, 1, 15, 91, 183, 301, 223, 1183, 1877, 2141, 5549, 371, 44147, 6771, 136777}},
+{18315, 18, 82419, {1, 1, 5, 15, 5, 49, 127, 161, 121, 979, 1247, 3681, 3805, 3363, 11643, 25735, 21193, 111657}},
+{18316, 18, 82421, {1, 3, 5, 15, 15, 33, 47, 91, 137, 323, 1577, 3723, 3609, 11533, 4415, 26467, 120947, 200919}},
+{18317, 18, 82428, {1, 3, 3, 3, 3, 33, 121, 161, 453, 205, 1815, 65, 5893, 4669, 14377, 10905, 9559, 56359}},
+{18318, 18, 82442, {1, 1, 1, 7, 1, 55, 21, 143, 411, 65, 1009, 2989, 133, 7059, 30981, 15417, 2651, 110345}},
+{18319, 18, 82452, {1, 1, 3, 7, 19, 25, 91, 241, 193, 903, 661, 665, 7681, 14111, 29197, 51299, 109519, 155827}},
+{18320, 18, 82455, {1, 1, 1, 15, 25, 3, 79, 57, 417, 73, 705, 7, 4415, 7699, 28185, 53005, 88547, 7281}},
+{18321, 18, 82466, {1, 1, 7, 13, 27, 21, 35, 197, 65, 171, 1773, 393, 3759, 8335, 5987, 20611, 91373, 80715}},
+{18322, 18, 82510, {1, 3, 7, 3, 17, 51, 85, 229, 131, 733, 281, 3157, 1283, 10751, 20203, 49955, 23861, 128517}},
+{18323, 18, 82524, {1, 1, 5, 15, 3, 27, 35, 87, 391, 509, 1627, 769, 701, 4933, 24597, 9695, 111441, 198493}},
+{18324, 18, 82545, {1, 1, 1, 15, 3, 31, 73, 235, 341, 263, 883, 2369, 4887, 4659, 9493, 6763, 130625, 15031}},
+{18325, 18, 82555, {1, 3, 1, 15, 1, 11, 63, 79, 389, 355, 619, 1361, 313, 1199, 555, 42213, 81089, 170863}},
+{18326, 18, 82581, {1, 3, 1, 15, 21, 27, 1, 179, 19, 241, 1655, 1803, 5413, 5353, 65, 31211, 3501, 27205}},
+{18327, 18, 82588, {1, 3, 3, 9, 9, 19, 63, 191, 217, 271, 1453, 2777, 2915, 13291, 31391, 37489, 86435, 22857}},
+{18328, 18, 82591, {1, 3, 5, 9, 13, 41, 85, 11, 333, 479, 363, 2591, 697, 8587, 3647, 5741, 21627, 244573}},
+{18329, 18, 82636, {1, 1, 3, 1, 5, 61, 83, 229, 193, 977, 677, 2585, 3273, 12035, 2621, 12943, 49293, 37985}},
+{18330, 18, 82658, {1, 1, 5, 7, 27, 9, 69, 189, 489, 747, 519, 719, 1493, 13337, 14933, 44359, 11471, 57245}},
+{18331, 18, 82675, {1, 3, 5, 1, 5, 17, 75, 89, 417, 367, 57, 1641, 1573, 1819, 31237, 5213, 78821, 149853}},
+{18332, 18, 82678, {1, 1, 7, 3, 7, 17, 121, 91, 211, 101, 1145, 3753, 2997, 67, 10755, 11261, 122489, 61679}},
+{18333, 18, 82716, {1, 3, 7, 7, 15, 17, 73, 133, 429, 285, 201, 1917, 5677, 1793, 21653, 49729, 68965, 5347}},
+{18334, 18, 82725, {1, 3, 3, 13, 23, 17, 49, 249, 71, 169, 619, 843, 2163, 585, 23309, 39509, 68087, 232233}},
+{18335, 18, 82743, {1, 1, 7, 15, 23, 15, 19, 227, 89, 719, 1247, 2521, 1509, 7553, 12225, 12865, 100107, 261847}},
+{18336, 18, 82744, {1, 1, 5, 3, 23, 17, 117, 5, 401, 57, 1945, 1081, 1269, 5921, 31815, 42341, 112099, 130047}},
+{18337, 18, 82762, {1, 1, 1, 1, 9, 5, 87, 203, 211, 1009, 403, 1617, 3969, 2541, 7261, 6989, 16579, 206159}},
+{18338, 18, 82770, {1, 3, 7, 9, 5, 13, 93, 191, 79, 631, 1019, 3639, 7137, 13859, 19603, 63263, 82947, 181023}},
+{18339, 18, 82809, {1, 1, 5, 11, 25, 17, 85, 51, 61, 311, 517, 2001, 6325, 6831, 10835, 20101, 115241, 15815}},
+{18340, 18, 82846, {1, 3, 7, 13, 29, 19, 33, 115, 473, 477, 471, 773, 4097, 11697, 30781, 20843, 27089, 181927}},
+{18341, 18, 82855, {1, 3, 5, 5, 21, 27, 3, 239, 45, 335, 505, 149, 3005, 3511, 18037, 31291, 6145, 2913}},
+{18342, 18, 82882, {1, 1, 3, 1, 25, 49, 21, 225, 27, 395, 415, 1813, 5727, 7211, 9887, 63533, 99185, 119269}},
+{18343, 18, 82899, {1, 3, 3, 5, 15, 53, 127, 195, 81, 895, 587, 561, 5951, 9901, 18117, 37855, 19393, 259031}},
+{18344, 18, 82905, {1, 1, 7, 13, 9, 49, 109, 127, 53, 735, 391, 1523, 3759, 10363, 11299, 3203, 89121, 122643}},
+{18345, 18, 82950, {1, 1, 5, 3, 13, 3, 21, 247, 259, 557, 977, 1465, 6889, 3879, 4627, 1439, 122809, 248941}},
+{18346, 18, 82953, {1, 3, 7, 15, 7, 19, 113, 251, 245, 63, 267, 1873, 6601, 16253, 24643, 7433, 130051, 233047}},
+{18347, 18, 82967, {1, 1, 3, 9, 29, 39, 47, 31, 493, 817, 1697, 2139, 1059, 11365, 31653, 56477, 119191, 45509}},
+{18348, 18, 82971, {1, 1, 1, 15, 9, 29, 99, 61, 109, 341, 1009, 1551, 897, 13075, 10603, 25153, 65911, 228213}},
+{18349, 18, 82987, {1, 3, 7, 7, 29, 47, 57, 85, 263, 767, 1633, 2473, 199, 49, 22287, 33345, 118877, 248435}},
+{18350, 18, 83007, {1, 3, 1, 9, 5, 45, 5, 179, 9, 129, 1231, 4075, 7497, 2159, 18101, 31039, 95213, 171913}},
+{18351, 18, 83009, {1, 1, 1, 13, 23, 1, 89, 63, 21, 983, 481, 773, 5957, 4823, 4483, 50405, 42979, 243567}},
+{18352, 18, 83012, {1, 1, 5, 13, 15, 21, 65, 133, 347, 511, 1887, 743, 7825, 1681, 4857, 49247, 21277, 212995}},
+{18353, 18, 83030, {1, 3, 7, 9, 7, 51, 3, 233, 287, 727, 815, 3609, 397, 5721, 16473, 7549, 100455, 136233}},
+{18354, 18, 83045, {1, 3, 1, 1, 31, 51, 59, 37, 79, 623, 1219, 2655, 4619, 11967, 11377, 28985, 16069, 188773}},
+{18355, 18, 83050, {1, 3, 3, 13, 13, 59, 93, 159, 197, 339, 1633, 1601, 255, 1631, 4989, 12019, 23921, 261273}},
+{18356, 18, 83052, {1, 1, 3, 13, 27, 25, 55, 43, 147, 981, 65, 725, 5753, 115, 26125, 25501, 89099, 233419}},
+{18357, 18, 83070, {1, 3, 7, 5, 25, 3, 95, 135, 191, 417, 929, 3855, 5829, 3827, 13979, 65367, 63683, 85911}},
+{18358, 18, 83076, {1, 3, 5, 1, 7, 63, 45, 187, 355, 735, 1325, 1461, 3869, 2127, 18231, 45891, 24027, 202997}},
+{18359, 18, 83086, {1, 3, 7, 13, 19, 47, 89, 229, 253, 659, 355, 3323, 4081, 8243, 32553, 46579, 46431, 53291}},
+{18360, 18, 83128, {1, 1, 5, 11, 3, 61, 33, 65, 239, 779, 665, 1337, 6427, 12787, 1495, 27105, 71455, 89715}},
+{18361, 18, 83141, {1, 3, 1, 11, 31, 33, 115, 69, 511, 187, 99, 1055, 1065, 9531, 29897, 23897, 80581, 166957}},
+{18362, 18, 83153, {1, 1, 7, 13, 19, 1, 13, 241, 89, 761, 425, 3865, 961, 14999, 24175, 19103, 39095, 38899}},
+{18363, 18, 83156, {1, 3, 7, 7, 11, 17, 25, 217, 113, 615, 1455, 1409, 5679, 2321, 28687, 8089, 74031, 230559}},
+{18364, 18, 83194, {1, 3, 7, 1, 25, 15, 77, 111, 405, 523, 961, 647, 3857, 14355, 27063, 48829, 87913, 254965}},
+{18365, 18, 83225, {1, 1, 3, 3, 5, 13, 67, 155, 393, 943, 1875, 1209, 3765, 8627, 15123, 43405, 78473, 146127}},
+{18366, 18, 83261, {1, 1, 3, 7, 29, 43, 23, 33, 35, 883, 1859, 1559, 4163, 13277, 16971, 15289, 60305, 56743}},
+{18367, 18, 83264, {1, 1, 1, 5, 19, 55, 37, 53, 123, 35, 1477, 1035, 4683, 259, 20079, 37041, 48081, 198685}},
+{18368, 18, 83322, {1, 1, 3, 3, 1, 19, 27, 129, 427, 685, 959, 2501, 2761, 9495, 23649, 18789, 54521, 219547}},
+{18369, 18, 83382, {1, 1, 7, 1, 31, 11, 65, 171, 229, 11, 1825, 1641, 2731, 11085, 2567, 30831, 20365, 242731}},
+{18370, 18, 83391, {1, 1, 1, 13, 13, 5, 21, 175, 265, 271, 133, 407, 3415, 5943, 15385, 12817, 106159, 41859}},
+{18371, 18, 83399, {1, 3, 7, 1, 11, 45, 105, 229, 395, 877, 1495, 2113, 1733, 10117, 1125, 9989, 109637, 124517}},
+{18372, 18, 83406, {1, 1, 7, 3, 27, 43, 57, 77, 63, 907, 1137, 3333, 189, 15285, 13895, 23773, 73523, 47811}},
+{18373, 18, 83427, {1, 3, 3, 11, 17, 19, 81, 197, 73, 897, 515, 3801, 5105, 6987, 10125, 7239, 32339, 124411}},
+{18374, 18, 83439, {1, 3, 1, 9, 11, 15, 99, 109, 307, 133, 249, 1463, 5479, 8565, 19489, 13773, 11443, 149799}},
+{18375, 18, 83444, {1, 3, 7, 7, 19, 53, 61, 75, 83, 545, 1449, 683, 5845, 8325, 18111, 35941, 51843, 97907}},
+{18376, 18, 83453, {1, 1, 1, 3, 31, 23, 37, 187, 207, 51, 439, 3095, 2217, 6393, 9117, 2779, 47331, 118275}},
+{18377, 18, 83457, {1, 1, 3, 9, 23, 17, 41, 37, 59, 281, 319, 1333, 6207, 2265, 4445, 50831, 115893, 120491}},
+{18378, 18, 83475, {1, 3, 1, 13, 27, 23, 25, 23, 187, 51, 1257, 379, 921, 3801, 24537, 59547, 34191, 184625}},
+{18379, 18, 83484, {1, 1, 5, 3, 23, 21, 23, 159, 163, 537, 1589, 2797, 8007, 6767, 31331, 20741, 119969, 174135}},
+{18380, 18, 83488, {1, 3, 1, 1, 13, 35, 73, 147, 491, 317, 69, 1069, 5413, 13973, 19741, 44717, 63263, 77145}},
+{18381, 18, 83493, {1, 3, 1, 15, 31, 41, 23, 79, 55, 863, 129, 2229, 3395, 1621, 6273, 44521, 100047, 42337}},
+{18382, 18, 83512, {1, 3, 7, 3, 7, 5, 79, 1, 191, 227, 1039, 2909, 1085, 3173, 29311, 13861, 124785, 212453}},
+{18383, 18, 83525, {1, 3, 1, 5, 13, 9, 99, 213, 61, 201, 889, 1171, 3981, 2091, 31679, 26643, 5611, 154339}},
+{18384, 18, 83535, {1, 3, 3, 7, 27, 49, 53, 77, 285, 441, 1669, 2157, 223, 1899, 2725, 36547, 39273, 206653}},
+{18385, 18, 83560, {1, 3, 3, 9, 29, 5, 91, 1, 13, 409, 1275, 891, 6557, 5157, 6481, 57381, 87683, 117277}},
+{18386, 18, 83617, {1, 3, 3, 1, 11, 7, 13, 69, 9, 1015, 907, 2685, 6665, 16307, 24567, 13191, 9567, 55073}},
+{18387, 18, 83664, {1, 3, 1, 5, 19, 15, 65, 13, 503, 427, 1947, 1869, 5857, 823, 20533, 25337, 83551, 128505}},
+{18388, 18, 83676, {1, 1, 5, 11, 25, 53, 83, 175, 445, 5, 841, 2773, 4381, 2829, 1927, 63689, 63643, 246629}},
+{18389, 18, 83757, {1, 3, 1, 11, 27, 63, 43, 95, 453, 235, 673, 117, 6617, 7589, 5767, 16465, 36961, 39395}},
+{18390, 18, 83770, {1, 1, 3, 13, 3, 27, 119, 87, 209, 167, 721, 1499, 1955, 9151, 11649, 29009, 25249, 26125}},
+{18391, 18, 83775, {1, 1, 5, 1, 9, 59, 47, 57, 81, 243, 485, 559, 7311, 15119, 9827, 47219, 5941, 16909}},
+{18392, 18, 83835, {1, 3, 7, 11, 29, 13, 97, 63, 289, 653, 1811, 835, 801, 13103, 9333, 7785, 111587, 10021}},
+{18393, 18, 83838, {1, 3, 3, 1, 27, 61, 73, 165, 279, 239, 865, 517, 7763, 1917, 9839, 20725, 50721, 171351}},
+{18394, 18, 83848, {1, 3, 7, 1, 27, 29, 43, 137, 353, 927, 889, 2511, 709, 3309, 967, 18119, 48099, 98139}},
+{18395, 18, 83856, {1, 3, 1, 1, 17, 5, 79, 23, 367, 231, 605, 3809, 7557, 14283, 18417, 15775, 107421, 9587}},
+{18396, 18, 83878, {1, 1, 1, 7, 25, 9, 93, 41, 165, 509, 661, 2165, 3595, 2555, 11399, 2403, 76179, 176003}},
+{18397, 18, 83884, {1, 3, 3, 7, 27, 19, 55, 213, 83, 601, 377, 2381, 6831, 5609, 31321, 26897, 105321, 144705}},
+{18398, 18, 83896, {1, 3, 7, 7, 21, 11, 45, 55, 379, 133, 653, 3593, 7481, 15789, 12723, 9697, 20073, 58211}},
+{18399, 18, 83902, {1, 3, 5, 1, 1, 57, 89, 159, 461, 719, 1251, 3899, 1063, 10753, 6509, 28391, 129377, 195279}},
+{18400, 18, 83922, {1, 3, 7, 7, 5, 39, 59, 81, 27, 169, 1541, 2213, 3631, 11601, 13153, 43221, 14587, 29719}},
+{18401, 18, 83977, {1, 1, 1, 1, 3, 29, 103, 125, 35, 455, 255, 3855, 567, 12013, 13285, 44753, 117415, 226285}},
+{18402, 18, 83985, {1, 1, 5, 1, 21, 41, 59, 69, 83, 813, 1041, 2559, 1947, 7343, 5291, 39281, 56141, 54487}},
+{18403, 18, 83988, {1, 1, 7, 15, 25, 17, 83, 115, 321, 659, 1625, 3253, 281, 6673, 26301, 45647, 92151, 150707}},
+{18404, 18, 84034, {1, 1, 5, 15, 9, 19, 83, 167, 325, 869, 501, 483, 2155, 14697, 12755, 54687, 100637, 6791}},
+{18405, 18, 84046, {1, 1, 7, 3, 3, 47, 91, 79, 347, 215, 847, 2957, 5881, 5371, 20099, 45603, 29349, 175357}},
+{18406, 18, 84058, {1, 3, 1, 3, 13, 43, 101, 235, 505, 289, 691, 673, 5579, 8721, 9639, 18569, 44797, 250887}},
+{18407, 18, 84069, {1, 1, 3, 11, 23, 27, 85, 223, 365, 767, 577, 2781, 4179, 12963, 25235, 51021, 84989, 149521}},
+{18408, 18, 84107, {1, 1, 1, 1, 9, 51, 13, 129, 393, 725, 1301, 1391, 4693, 4979, 16801, 21361, 122157, 56675}},
+{18409, 18, 84155, {1, 3, 5, 11, 7, 21, 97, 97, 17, 915, 255, 155, 3961, 7999, 7493, 52683, 49377, 131663}},
+{18410, 18, 84157, {1, 3, 5, 15, 31, 23, 41, 187, 89, 933, 309, 2519, 6595, 13785, 14339, 44393, 64439, 142105}},
+{18411, 18, 84160, {1, 1, 1, 11, 13, 57, 29, 249, 467, 863, 77, 3185, 6221, 13109, 32397, 13859, 27331, 35295}},
+{18412, 18, 84165, {1, 3, 3, 3, 23, 31, 29, 189, 405, 855, 1597, 3167, 4171, 13801, 12297, 38019, 130141, 135517}},
+{18413, 18, 84187, {1, 1, 5, 7, 13, 37, 87, 41, 503, 281, 103, 1997, 3603, 4185, 25331, 55123, 74263, 248695}},
+{18414, 18, 84214, {1, 3, 1, 15, 13, 57, 67, 135, 429, 489, 829, 2069, 7657, 15713, 3907, 5819, 114005, 187859}},
+{18415, 18, 84226, {1, 1, 3, 1, 23, 43, 93, 63, 5, 435, 1649, 1429, 2923, 9035, 28667, 13991, 74491, 236225}},
+{18416, 18, 84235, {1, 3, 3, 7, 19, 29, 37, 143, 443, 955, 1431, 3193, 6023, 2421, 28955, 29171, 126785, 124709}},
+{18417, 18, 84240, {1, 3, 7, 7, 23, 45, 59, 101, 25, 711, 1685, 851, 3101, 12273, 10775, 57633, 52739, 244681}},
+{18418, 18, 84255, {1, 1, 1, 5, 3, 13, 97, 143, 367, 139, 1535, 873, 8005, 2795, 11103, 3837, 125833, 194903}},
+{18419, 18, 84273, {1, 3, 5, 7, 23, 61, 61, 203, 443, 543, 573, 2835, 941, 12315, 18453, 34367, 94359, 132437}},
+{18420, 18, 84291, {1, 1, 7, 5, 11, 21, 87, 27, 495, 67, 1267, 2029, 5041, 4133, 18821, 50249, 52397, 101431}},
+{18421, 18, 84311, {1, 3, 3, 3, 13, 51, 89, 183, 61, 919, 1841, 373, 7091, 9413, 1227, 44515, 72869, 198769}},
+{18422, 18, 84317, {1, 3, 3, 11, 13, 63, 13, 253, 203, 571, 91, 3477, 123, 15353, 7803, 62729, 14337, 252725}},
+{18423, 18, 84328, {1, 1, 7, 1, 11, 57, 45, 251, 351, 895, 1813, 3857, 7545, 9739, 32029, 24915, 46261, 8149}},
+{18424, 18, 84346, {1, 3, 1, 15, 25, 41, 71, 47, 265, 567, 307, 4079, 1943, 10407, 2999, 6605, 97621, 194711}},
+{18425, 18, 84357, {1, 1, 3, 5, 17, 29, 97, 249, 449, 761, 1727, 1533, 7417, 16167, 421, 39075, 1029, 180923}},
+{18426, 18, 84361, {1, 1, 1, 3, 11, 27, 67, 227, 131, 453, 951, 3897, 515, 4513, 17361, 50049, 4533, 35953}},
+{18427, 18, 84372, {1, 1, 1, 13, 7, 53, 25, 163, 453, 195, 1115, 1019, 3799, 7489, 12419, 15141, 112001, 106459}},
+{18428, 18, 84388, {1, 1, 3, 9, 27, 15, 63, 109, 293, 867, 645, 1821, 2867, 9653, 32617, 39617, 125589, 249169}},
+{18429, 18, 84415, {1, 1, 7, 5, 19, 17, 15, 105, 65, 143, 961, 493, 7301, 11299, 4549, 49873, 82447, 107}},
+{18430, 18, 84438, {1, 1, 7, 1, 31, 21, 19, 61, 255, 815, 421, 3097, 4993, 9709, 11529, 53839, 32653, 137861}},
+{18431, 18, 84444, {1, 3, 1, 9, 5, 5, 59, 179, 115, 101, 407, 1143, 309, 843, 31143, 60639, 126659, 111695}},
+{18432, 18, 84447, {1, 3, 7, 13, 7, 47, 65, 127, 159, 817, 1029, 2983, 5443, 11087, 10595, 47143, 128353, 195189}},
+{18433, 18, 84451, {1, 3, 7, 1, 27, 21, 61, 235, 433, 929, 581, 1925, 8185, 6037, 28859, 16843, 43499, 217091}},
+{18434, 18, 84465, {1, 3, 7, 11, 1, 11, 81, 187, 227, 967, 25, 2285, 1251, 10743, 2321, 29029, 89739, 188023}},
+{18435, 18, 84471, {1, 3, 5, 11, 21, 25, 57, 201, 89, 965, 1593, 2879, 2469, 13675, 28789, 11407, 13109, 52749}},
+{18436, 18, 84496, {1, 3, 3, 3, 19, 25, 87, 3, 127, 881, 645, 207, 1129, 4235, 1533, 52503, 128733, 238679}},
+{18437, 18, 84554, {1, 3, 3, 1, 5, 5, 63, 181, 493, 457, 1529, 1795, 219, 10807, 26713, 49673, 47167, 103595}},
+{18438, 18, 84561, {1, 1, 3, 3, 1, 31, 65, 79, 473, 257, 1477, 387, 2843, 4031, 8459, 44849, 115157, 8417}},
+{18439, 18, 84571, {1, 3, 3, 5, 15, 1, 105, 67, 343, 333, 1961, 649, 5105, 11387, 27437, 35471, 26295, 220309}},
+{18440, 18, 84580, {1, 3, 7, 15, 1, 7, 23, 113, 67, 1019, 1793, 3237, 7223, 5691, 6279, 50231, 49393, 84393}},
+{18441, 18, 84598, {1, 1, 1, 7, 9, 29, 125, 249, 89, 813, 561, 871, 1957, 1095, 18563, 5257, 39563, 225651}},
+{18442, 18, 84611, {1, 1, 1, 15, 17, 11, 51, 191, 217, 617, 793, 3633, 4673, 15463, 10621, 47221, 51611, 155937}},
+{18443, 18, 84620, {1, 3, 7, 15, 13, 7, 63, 57, 45, 1005, 685, 2913, 3597, 9933, 14819, 26015, 80023, 60547}},
+{18444, 18, 84625, {1, 1, 5, 5, 31, 43, 69, 63, 425, 439, 143, 933, 675, 11301, 31779, 53445, 25143, 213213}},
+{18445, 18, 84632, {1, 1, 1, 5, 21, 9, 91, 89, 483, 153, 389, 7, 633, 15527, 21833, 45171, 88331, 150935}},
+{18446, 18, 84648, {1, 3, 5, 5, 11, 31, 49, 139, 295, 289, 1623, 3359, 7551, 11285, 25083, 27699, 91869, 237571}},
+{18447, 18, 84659, {1, 1, 1, 9, 9, 25, 55, 71, 51, 603, 1901, 2729, 6803, 11135, 5427, 37285, 69141, 262073}},
+{18448, 18, 84662, {1, 1, 3, 11, 3, 7, 81, 89, 49, 303, 755, 223, 603, 12525, 26037, 47867, 118871, 238677}},
+{18449, 18, 84683, {1, 3, 3, 11, 1, 53, 55, 15, 341, 151, 245, 1979, 3523, 15151, 25075, 21425, 48689, 125391}},
+{18450, 18, 84697, {1, 3, 3, 7, 15, 21, 73, 247, 215, 339, 1995, 633, 2557, 5625, 28443, 16413, 34615, 260591}},
+{18451, 18, 84698, {1, 3, 5, 1, 1, 59, 21, 247, 403, 15, 1129, 2263, 3361, 10675, 30417, 31285, 69913, 124329}},
+{18452, 18, 84709, {1, 1, 5, 1, 17, 3, 103, 107, 333, 191, 345, 3219, 3845, 5953, 26403, 51115, 71623, 52293}},
+{18453, 18, 84722, {1, 1, 7, 5, 29, 13, 59, 65, 185, 91, 717, 3179, 1237, 1187, 25485, 40119, 6069, 23567}},
+{18454, 18, 84753, {1, 1, 1, 5, 17, 57, 27, 39, 269, 627, 1239, 135, 623, 483, 19229, 51939, 114387, 146431}},
+{18455, 18, 84775, {1, 3, 7, 9, 21, 41, 119, 129, 177, 149, 1527, 3639, 4489, 11635, 23007, 59863, 85199, 87795}},
+{18456, 18, 84789, {1, 3, 5, 9, 17, 25, 57, 237, 129, 855, 199, 1929, 2793, 4277, 4509, 46301, 32905, 102015}},
+{18457, 18, 84885, {1, 1, 7, 1, 15, 23, 3, 131, 475, 347, 1301, 241, 153, 2801, 29271, 1337, 107613, 154105}},
+{18458, 18, 84890, {1, 1, 1, 13, 5, 19, 43, 47, 381, 709, 637, 2565, 7503, 10027, 16873, 23511, 101785, 47987}},
+{18459, 18, 84899, {1, 1, 5, 13, 31, 15, 125, 97, 361, 819, 121, 2723, 3395, 6943, 5279, 55977, 103559, 134177}},
+{18460, 18, 84926, {1, 1, 7, 13, 17, 27, 105, 11, 327, 203, 1355, 1437, 959, 10113, 7405, 43511, 114073, 199463}},
+{18461, 18, 84946, {1, 1, 7, 5, 29, 19, 7, 151, 107, 739, 1021, 1287, 6881, 2741, 3407, 13847, 75669, 116015}},
+{18462, 18, 84958, {1, 1, 1, 5, 5, 17, 99, 67, 179, 319, 149, 4069, 7811, 3055, 24669, 21635, 68057, 72059}},
+{18463, 18, 84976, {1, 3, 1, 11, 3, 3, 103, 45, 431, 159, 1693, 1069, 3403, 6121, 12695, 16565, 29787, 199327}},
+{18464, 18, 84979, {1, 1, 5, 5, 5, 35, 97, 9, 7, 703, 1533, 847, 7693, 16041, 13127, 26829, 68801, 205219}},
+{18465, 18, 85003, {1, 1, 5, 9, 25, 59, 3, 63, 305, 71, 1429, 1567, 2377, 12611, 9267, 62381, 32373, 187735}},
+{18466, 18, 85014, {1, 1, 3, 15, 5, 31, 21, 113, 329, 573, 1975, 1615, 947, 987, 4655, 46803, 100251, 89729}},
+{18467, 18, 85017, {1, 1, 5, 9, 15, 63, 83, 5, 71, 191, 1127, 3529, 7325, 1169, 4255, 6715, 42765, 73231}},
+{18468, 18, 85024, {1, 3, 3, 9, 11, 1, 1, 23, 97, 967, 1465, 1305, 2073, 3143, 31333, 1409, 95321, 182333}},
+{18469, 18, 85029, {1, 3, 5, 13, 21, 53, 47, 105, 75, 721, 239, 3619, 2581, 2063, 21227, 25579, 23729, 20067}},
+{18470, 18, 85036, {1, 3, 5, 13, 1, 55, 55, 115, 391, 539, 869, 3347, 189, 11087, 11533, 18747, 25387, 19205}},
+{18471, 18, 85042, {1, 3, 1, 15, 25, 57, 81, 27, 379, 635, 1697, 2805, 8071, 11407, 14843, 17593, 20819, 42891}},
+{18472, 18, 85054, {1, 3, 5, 11, 1, 59, 51, 187, 11, 211, 1425, 3829, 3193, 15743, 16479, 4205, 108205, 205367}},
+{18473, 18, 85056, {1, 1, 1, 5, 7, 7, 59, 85, 63, 509, 897, 2473, 7345, 111, 4431, 55273, 114037, 232541}},
+{18474, 18, 85061, {1, 1, 5, 9, 29, 7, 25, 41, 401, 843, 115, 163, 6835, 13943, 5223, 31033, 10813, 250471}},
+{18475, 18, 85066, {1, 1, 5, 11, 27, 45, 43, 233, 195, 151, 11, 1539, 4775, 15743, 15507, 26939, 30353, 162929}},
+{18476, 18, 85073, {1, 3, 1, 7, 7, 39, 1, 87, 85, 1019, 1711, 2707, 735, 5093, 8231, 25069, 102861, 45751}},
+{18477, 18, 85096, {1, 3, 7, 1, 19, 49, 55, 249, 255, 809, 1799, 3475, 7697, 5003, 12437, 52313, 96355, 138537}},
+{18478, 18, 85101, {1, 1, 3, 5, 5, 43, 25, 95, 349, 775, 213, 3643, 1355, 7745, 9553, 53367, 123655, 195365}},
+{18479, 18, 85109, {1, 1, 1, 1, 19, 53, 39, 105, 449, 447, 147, 2293, 7817, 1503, 31985, 37193, 51039, 209083}},
+{18480, 18, 85114, {1, 3, 3, 15, 27, 15, 59, 51, 411, 543, 421, 3595, 2091, 7171, 23595, 33509, 37283, 105719}},
+{18481, 18, 85119, {1, 3, 1, 11, 5, 37, 5, 203, 171, 853, 1875, 2735, 4003, 15163, 26193, 36149, 31389, 256631}},
+{18482, 18, 85123, {1, 3, 5, 1, 21, 1, 127, 41, 185, 929, 1757, 2711, 2947, 9709, 18401, 45037, 1371, 242397}},
+{18483, 18, 85149, {1, 1, 1, 1, 13, 43, 51, 187, 487, 759, 1579, 959, 2499, 4781, 27179, 6839, 43869, 36163}},
+{18484, 18, 85185, {1, 3, 1, 15, 5, 3, 101, 25, 181, 107, 1105, 879, 5341, 12215, 21615, 9619, 129591, 108393}},
+{18485, 18, 85228, {1, 1, 7, 1, 11, 39, 55, 101, 43, 935, 1703, 1269, 6751, 13723, 7463, 10055, 112971, 72789}},
+{18486, 18, 85236, {1, 3, 5, 13, 7, 3, 81, 41, 55, 375, 663, 801, 5051, 14583, 30793, 63897, 127255, 174179}},
+{18487, 18, 85281, {1, 3, 1, 7, 19, 31, 53, 29, 313, 57, 1411, 103, 6863, 10673, 4341, 5587, 106059, 222309}},
+{18488, 18, 85282, {1, 3, 7, 3, 1, 33, 89, 199, 91, 557, 715, 2715, 4753, 5987, 30355, 13819, 57443, 112179}},
+{18489, 18, 85293, {1, 3, 5, 7, 13, 27, 55, 11, 495, 29, 1273, 1727, 3397, 2739, 22907, 46203, 16687, 47385}},
+{18490, 18, 85302, {1, 3, 5, 9, 13, 23, 23, 107, 353, 429, 359, 2667, 6137, 7213, 7977, 35903, 118507, 209243}},
+{18491, 18, 85319, {1, 3, 1, 13, 9, 7, 37, 135, 377, 753, 1819, 113, 7379, 2795, 10373, 7131, 17845, 246101}},
+{18492, 18, 85353, {1, 1, 3, 11, 11, 45, 53, 209, 49, 385, 1573, 1129, 2939, 10949, 413, 59193, 15399, 169355}},
+{18493, 18, 85354, {1, 1, 5, 15, 29, 29, 89, 139, 403, 11, 1335, 2601, 3631, 15317, 1707, 3517, 1939, 121997}},
+{18494, 18, 85356, {1, 3, 1, 7, 17, 3, 113, 97, 435, 911, 1743, 1649, 4829, 9995, 2873, 17527, 46931, 86199}},
+{18495, 18, 85389, {1, 1, 7, 1, 13, 19, 83, 51, 49, 671, 1651, 3443, 2279, 5677, 8859, 41945, 110607, 200469}},
+{18496, 18, 85418, {1, 1, 5, 13, 19, 63, 19, 73, 205, 571, 507, 1781, 1489, 5909, 10351, 64607, 67023, 49441}},
+{18497, 18, 85446, {1, 1, 3, 5, 13, 35, 107, 63, 489, 69, 1541, 3761, 17, 9317, 20323, 35401, 61451, 116115}},
+{18498, 18, 85450, {1, 3, 1, 5, 31, 35, 39, 119, 237, 533, 107, 3235, 4929, 15839, 9309, 50131, 110945, 24739}},
+{18499, 18, 85463, {1, 3, 1, 5, 3, 25, 73, 145, 391, 481, 1927, 3071, 4347, 13415, 26723, 51629, 3003, 54575}},
+{18500, 18, 85497, {1, 3, 3, 11, 29, 63, 63, 183, 11, 269, 153, 3379, 5603, 14279, 28579, 4653, 98179, 125693}},
+{18501, 18, 85534, {1, 1, 5, 15, 1, 51, 101, 69, 177, 233, 213, 2389, 4963, 3391, 13419, 41283, 25667, 187239}},
+{18502, 18, 85543, {1, 1, 1, 11, 13, 29, 95, 231, 481, 283, 1323, 521, 4689, 5311, 21949, 31851, 115845, 50433}},
+{18503, 18, 85549, {1, 3, 7, 15, 11, 31, 67, 207, 57, 439, 1561, 2167, 673, 6467, 8189, 31783, 5051, 64097}},
+{18504, 18, 85562, {1, 1, 7, 9, 17, 57, 77, 85, 119, 149, 211, 2727, 4921, 8701, 23121, 36355, 9179, 68003}},
+{18505, 18, 85587, {1, 1, 5, 15, 1, 15, 123, 205, 79, 299, 71, 3413, 7635, 5699, 32393, 10253, 86205, 216015}},
+{18506, 18, 85590, {1, 1, 5, 11, 23, 39, 105, 187, 487, 247, 333, 2423, 5643, 8111, 23549, 50153, 122859, 100361}},
+{18507, 18, 85599, {1, 1, 1, 9, 11, 33, 65, 125, 67, 743, 1331, 1563, 6333, 11375, 15873, 18137, 52765, 224889}},
+{18508, 18, 85630, {1, 3, 5, 9, 15, 17, 81, 165, 3, 609, 635, 2093, 6635, 8647, 25883, 18907, 73333, 80835}},
+{18509, 18, 85660, {1, 1, 1, 11, 1, 1, 25, 115, 205, 941, 1917, 1295, 3659, 821, 11355, 1435, 40289, 115627}},
+{18510, 18, 85669, {1, 3, 1, 9, 13, 23, 35, 105, 441, 777, 1255, 3315, 1157, 8719, 9939, 38931, 120723, 123201}},
+{18511, 18, 85693, {1, 1, 5, 3, 1, 21, 95, 143, 23, 233, 73, 1223, 5619, 8583, 21417, 61971, 74565, 116249}},
+{18512, 18, 85711, {1, 1, 7, 7, 23, 35, 21, 201, 441, 623, 419, 2375, 1189, 15681, 29469, 29437, 124525, 241899}},
+{18513, 18, 85716, {1, 1, 3, 1, 11, 7, 23, 171, 435, 467, 1811, 63, 3705, 9395, 579, 58305, 86165, 67805}},
+{18514, 18, 85773, {1, 3, 1, 3, 13, 11, 107, 243, 163, 79, 815, 1149, 2247, 12411, 30287, 56915, 26939, 85883}},
+{18515, 18, 85801, {1, 3, 3, 1, 5, 23, 105, 63, 35, 57, 1815, 3325, 3727, 3623, 7203, 8301, 28073, 190053}},
+{18516, 18, 85815, {1, 3, 1, 11, 23, 33, 121, 55, 287, 139, 491, 907, 4237, 17, 20055, 63729, 7517, 151597}},
+{18517, 18, 85839, {1, 3, 5, 5, 21, 1, 37, 19, 159, 1013, 27, 2627, 851, 14021, 31311, 5871, 77613, 125311}},
+{18518, 18, 85842, {1, 3, 3, 1, 27, 3, 51, 133, 459, 581, 383, 1351, 6149, 15611, 2631, 20797, 65955, 113665}},
+{18519, 18, 85864, {1, 3, 1, 11, 23, 61, 75, 217, 283, 405, 767, 1151, 7501, 5553, 113, 48331, 49379, 191473}},
+{18520, 18, 85867, {1, 3, 5, 5, 15, 3, 19, 27, 497, 519, 1611, 709, 405, 13329, 27861, 14981, 47197, 173979}},
+{18521, 18, 85903, {1, 1, 7, 7, 25, 19, 99, 219, 349, 713, 1421, 3427, 153, 13319, 22415, 48617, 119637, 20835}},
+{18522, 18, 85917, {1, 1, 1, 3, 13, 37, 43, 9, 317, 961, 1255, 2975, 2775, 12283, 29941, 57495, 77413, 256695}},
+{18523, 18, 85921, {1, 1, 7, 5, 29, 37, 91, 199, 397, 739, 877, 251, 847, 2951, 19497, 57285, 76891, 258711}},
+{18524, 18, 85928, {1, 1, 7, 15, 21, 55, 107, 115, 481, 845, 2015, 481, 3823, 14071, 4037, 39687, 62867, 170891}},
+{18525, 18, 85934, {1, 3, 3, 1, 17, 51, 81, 195, 189, 455, 1343, 1493, 351, 361, 20289, 37423, 7747, 245861}},
+{18526, 18, 85974, {1, 1, 5, 15, 9, 41, 71, 155, 197, 563, 1271, 2227, 2557, 6657, 13565, 8467, 96135, 5903}},
+{18527, 18, 85994, {1, 1, 5, 13, 29, 33, 115, 131, 283, 435, 1327, 1113, 4729, 14125, 23743, 40121, 119955, 237453}},
+{18528, 18, 85999, {1, 1, 1, 1, 13, 21, 109, 91, 105, 749, 1695, 1123, 4349, 9855, 31565, 64001, 7919, 83591}},
+{18529, 18, 86004, {1, 3, 1, 1, 13, 19, 89, 83, 13, 609, 731, 2655, 1123, 13415, 5645, 10003, 69381, 187621}},
+{18530, 18, 86008, {1, 3, 1, 15, 3, 37, 1, 139, 11, 917, 1191, 1381, 6035, 13851, 4565, 5427, 117703, 109965}},
+{18531, 18, 86046, {1, 1, 5, 3, 17, 37, 15, 115, 19, 65, 1807, 3879, 2709, 9819, 11457, 53705, 14821, 156079}},
+{18532, 18, 86067, {1, 1, 7, 13, 17, 29, 105, 77, 127, 457, 1287, 1533, 6879, 4001, 4083, 29523, 81175, 226409}},
+{18533, 18, 86084, {1, 3, 1, 5, 5, 59, 21, 253, 459, 733, 409, 3359, 1913, 8893, 16113, 61063, 6511, 22441}},
+{18534, 18, 86087, {1, 3, 5, 11, 7, 1, 121, 217, 63, 83, 173, 1869, 7931, 655, 21053, 20703, 116853, 131785}},
+{18535, 18, 86093, {1, 1, 7, 7, 5, 13, 41, 57, 1, 17, 649, 233, 2867, 5577, 30553, 7635, 45305, 47979}},
+{18536, 18, 86121, {1, 1, 7, 1, 1, 29, 61, 241, 107, 891, 49, 3433, 5045, 143, 22473, 29243, 82625, 184163}},
+{18537, 18, 86122, {1, 3, 1, 11, 11, 21, 119, 43, 117, 429, 1569, 637, 67, 9475, 31779, 2237, 122037, 245361}},
+{18538, 18, 86127, {1, 1, 7, 1, 31, 61, 9, 179, 467, 153, 1913, 2839, 6255, 12715, 28229, 20189, 3617, 213539}},
+{18539, 18, 86151, {1, 1, 7, 13, 25, 61, 9, 109, 331, 577, 21, 1017, 6521, 5991, 26573, 56881, 58455, 169407}},
+{18540, 18, 86166, {1, 1, 7, 9, 31, 57, 51, 41, 327, 859, 1295, 1577, 1071, 3277, 11685, 62129, 34111, 174639}},
+{18541, 18, 86179, {1, 3, 5, 1, 7, 63, 35, 165, 43, 943, 1545, 3717, 1471, 11579, 29637, 22913, 8867, 12837}},
+{18542, 18, 86188, {1, 1, 3, 1, 23, 7, 19, 151, 359, 347, 1085, 3923, 1039, 5149, 6047, 49811, 33099, 247983}},
+{18543, 18, 86193, {1, 1, 1, 5, 29, 23, 73, 189, 59, 865, 1499, 1953, 1261, 1071, 26761, 26145, 129427, 223219}},
+{18544, 18, 86206, {1, 3, 1, 9, 1, 29, 107, 173, 387, 703, 193, 1965, 6233, 10997, 32697, 31005, 15415, 94345}},
+{18545, 18, 86214, {1, 1, 3, 9, 31, 35, 7, 15, 317, 79, 2045, 1455, 1559, 15087, 287, 46665, 37225, 149017}},
+{18546, 18, 86226, {1, 1, 5, 13, 17, 27, 11, 107, 47, 803, 1487, 3049, 1171, 6237, 9157, 10037, 122349, 236877}},
+{18547, 18, 86242, {1, 1, 7, 9, 21, 35, 53, 139, 165, 73, 1405, 2941, 3553, 11945, 2493, 5743, 63749, 140535}},
+{18548, 18, 86256, {1, 3, 7, 11, 7, 57, 41, 187, 483, 499, 687, 117, 4951, 14709, 17025, 23027, 94863, 228465}},
+{18549, 18, 86259, {1, 3, 7, 7, 27, 29, 85, 117, 201, 637, 823, 1135, 7595, 3323, 23579, 40759, 25087, 995}},
+{18550, 18, 86298, {1, 3, 1, 9, 31, 53, 101, 29, 381, 101, 1939, 1973, 8191, 8155, 13881, 32309, 92907, 239525}},
+{18551, 18, 86300, {1, 1, 5, 7, 3, 35, 15, 207, 1, 47, 325, 559, 3377, 3909, 31225, 28367, 63891, 19129}},
+{18552, 18, 86307, {1, 1, 1, 5, 31, 61, 117, 211, 127, 969, 73, 1295, 7167, 14881, 9965, 28143, 28161, 131867}},
+{18553, 18, 86310, {1, 3, 7, 5, 5, 57, 37, 207, 201, 79, 1151, 3685, 2071, 1751, 5481, 51447, 103437, 154895}},
+{18554, 18, 86319, {1, 3, 5, 13, 9, 5, 57, 27, 131, 211, 1481, 2237, 4227, 6927, 18625, 49773, 55399, 15209}},
+{18555, 18, 86321, {1, 3, 1, 7, 23, 29, 3, 179, 479, 787, 463, 2041, 2581, 6281, 1657, 51433, 93807, 160047}},
+{18556, 18, 86328, {1, 1, 3, 13, 25, 35, 33, 231, 385, 479, 335, 3837, 5517, 13603, 15623, 46737, 42507, 208355}},
+{18557, 18, 86356, {1, 1, 7, 9, 3, 25, 51, 125, 213, 175, 1575, 1755, 1843, 14361, 13155, 22445, 55435, 62793}},
+{18558, 18, 86360, {1, 1, 1, 7, 25, 3, 21, 7, 309, 547, 19, 471, 2679, 16185, 12149, 41437, 47625, 75113}},
+{18559, 18, 86375, {1, 1, 5, 1, 9, 23, 81, 95, 123, 143, 1111, 9, 3501, 11897, 26499, 10009, 48073, 182529}},
+{18560, 18, 86399, {1, 3, 1, 1, 1, 17, 15, 157, 129, 1005, 543, 3917, 3493, 6537, 26997, 33217, 7987, 251635}},
+{18561, 18, 86400, {1, 3, 1, 13, 11, 41, 9, 19, 173, 751, 491, 1645, 5205, 9907, 28503, 61137, 79727, 200851}},
+{18562, 18, 86403, {1, 1, 1, 1, 3, 5, 105, 203, 97, 903, 1507, 2719, 5275, 1023, 29595, 42507, 39893, 151495}},
+{18563, 18, 86430, {1, 1, 1, 11, 31, 53, 51, 65, 145, 671, 489, 109, 803, 8541, 4439, 33893, 98495, 114955}},
+{18564, 18, 86446, {1, 1, 7, 11, 27, 63, 117, 235, 497, 841, 1461, 3757, 1077, 6997, 9611, 47453, 20197, 176939}},
+{18565, 18, 86460, {1, 3, 3, 3, 31, 17, 85, 145, 377, 225, 1033, 3017, 735, 5811, 25503, 25457, 124623, 51713}},
+{18566, 18, 86465, {1, 3, 3, 13, 19, 33, 127, 57, 321, 687, 1651, 3321, 5051, 8511, 19609, 49927, 30499, 102613}},
+{18567, 18, 86486, {1, 1, 5, 13, 7, 17, 17, 147, 381, 137, 1007, 2607, 1071, 8921, 13955, 47223, 130359, 246265}},
+{18568, 18, 86502, {1, 3, 7, 9, 13, 35, 71, 129, 57, 233, 357, 3181, 2841, 3707, 24947, 57777, 115133, 6049}},
+{18569, 18, 86563, {1, 3, 7, 15, 23, 1, 107, 225, 57, 633, 1515, 1631, 4303, 4221, 8281, 59139, 45023, 70219}},
+{18570, 18, 86595, {1, 1, 7, 5, 9, 9, 93, 131, 41, 245, 1261, 459, 4811, 10987, 10421, 63839, 34067, 196353}},
+{18571, 18, 86635, {1, 3, 3, 13, 17, 3, 87, 255, 167, 701, 821, 1965, 1415, 4101, 549, 6347, 92421, 47193}},
+{18572, 18, 86649, {1, 3, 7, 11, 23, 17, 51, 81, 71, 345, 971, 917, 1057, 3627, 20361, 13491, 12855, 234215}},
+{18573, 18, 86661, {1, 1, 1, 13, 17, 9, 25, 155, 463, 851, 243, 3887, 2445, 7459, 19915, 21813, 86969, 85891}},
+{18574, 18, 86674, {1, 1, 7, 1, 9, 15, 57, 201, 193, 169, 351, 1355, 1089, 4705, 15153, 51359, 49907, 66007}},
+{18575, 18, 86689, {1, 3, 1, 9, 19, 13, 69, 83, 39, 667, 1549, 1503, 7167, 8657, 17269, 59357, 80091, 194007}},
+{18576, 18, 86721, {1, 3, 5, 5, 17, 37, 125, 117, 355, 685, 637, 3159, 4783, 3159, 14953, 12731, 126759, 89149}},
+{18577, 18, 86734, {1, 3, 3, 9, 15, 53, 7, 41, 473, 857, 511, 3741, 6837, 6167, 26351, 9885, 104819, 48221}},
+{18578, 18, 86741, {1, 3, 7, 15, 21, 21, 21, 101, 465, 223, 13, 1773, 2763, 8621, 23591, 12633, 82143, 134899}},
+{18579, 18, 86742, {1, 3, 1, 1, 29, 25, 67, 19, 349, 503, 655, 3567, 97, 6967, 18253, 42755, 33041, 250279}},
+{18580, 18, 86784, {1, 1, 7, 9, 17, 1, 7, 165, 255, 613, 579, 127, 7567, 13181, 6255, 1785, 21527, 113815}},
+{18581, 18, 86799, {1, 3, 1, 5, 27, 33, 61, 235, 37, 135, 1515, 3611, 1825, 9627, 18805, 37065, 126107, 23223}},
+{18582, 18, 86808, {1, 3, 7, 5, 23, 11, 29, 121, 129, 311, 429, 1653, 5789, 7693, 18775, 18189, 97203, 213501}},
+{18583, 18, 86837, {1, 3, 7, 3, 29, 61, 87, 197, 43, 509, 5, 3275, 345, 7885, 4381, 22059, 1395, 40125}},
+{18584, 18, 86869, {1, 3, 5, 1, 1, 59, 69, 125, 297, 983, 641, 2665, 7045, 8591, 16581, 58657, 119189, 256579}},
+{18585, 18, 86900, {1, 3, 7, 7, 7, 53, 65, 181, 149, 987, 1377, 4045, 971, 9827, 17727, 59357, 90975, 27395}},
+{18586, 18, 86949, {1, 1, 7, 7, 1, 51, 109, 165, 361, 515, 739, 3709, 6431, 113, 21401, 41743, 53071, 134205}},
+{18587, 18, 86993, {1, 3, 1, 13, 5, 51, 107, 99, 135, 163, 1705, 1683, 6221, 1377, 2211, 13379, 22801, 208753}},
+{18588, 18, 86999, {1, 3, 5, 11, 11, 39, 49, 45, 503, 549, 821, 4077, 885, 13721, 29673, 28435, 6235, 212071}},
+{18589, 18, 87030, {1, 3, 3, 11, 15, 25, 17, 67, 125, 7, 1163, 973, 5325, 12707, 12763, 9481, 21363, 195897}},
+{18590, 18, 87041, {1, 1, 7, 9, 17, 19, 15, 13, 107, 919, 461, 343, 1101, 8195, 29293, 61643, 64995, 230469}},
+{18591, 18, 87044, {1, 3, 5, 1, 9, 25, 39, 65, 27, 461, 669, 2841, 7973, 11565, 9531, 52235, 6741, 215513}},
+{18592, 18, 87084, {1, 3, 3, 1, 7, 57, 101, 199, 37, 79, 2033, 1723, 6877, 2733, 26445, 62625, 21671, 238431}},
+{18593, 18, 87116, {1, 1, 1, 9, 27, 31, 125, 199, 331, 611, 523, 407, 747, 9499, 4685, 17805, 43717, 253233}},
+{18594, 18, 87138, {1, 1, 3, 7, 29, 7, 7, 153, 339, 337, 701, 2639, 6311, 6375, 26023, 27693, 59733, 260405}},
+{18595, 18, 87162, {1, 1, 7, 7, 15, 27, 23, 49, 181, 433, 485, 2915, 6021, 9095, 15951, 47257, 104513, 208089}},
+{18596, 18, 87188, {1, 1, 5, 7, 19, 19, 125, 153, 109, 829, 1967, 2567, 7157, 6001, 10151, 55323, 92405, 82549}},
+{18597, 18, 87211, {1, 1, 3, 11, 13, 17, 85, 215, 265, 875, 311, 3773, 8059, 2115, 19259, 63999, 77411, 220267}},
+{18598, 18, 87234, {1, 3, 1, 15, 15, 35, 81, 213, 411, 435, 105, 1487, 1991, 14539, 8175, 2115, 47259, 45893}},
+{18599, 18, 87245, {1, 3, 1, 11, 9, 47, 27, 115, 449, 521, 321, 2463, 1355, 5785, 11269, 45337, 29049, 91675}},
+{18600, 18, 87246, {1, 3, 1, 13, 21, 53, 49, 83, 373, 519, 757, 1241, 577, 14443, 449, 44773, 116673, 155209}},
+{18601, 18, 87260, {1, 3, 3, 1, 29, 63, 97, 145, 371, 585, 1809, 3997, 249, 283, 28369, 27325, 61673, 12637}},
+{18602, 18, 87270, {1, 3, 5, 9, 11, 55, 77, 89, 285, 297, 861, 2791, 3245, 15093, 32489, 40477, 97603, 35347}},
+{18603, 18, 87284, {1, 1, 1, 3, 27, 33, 115, 209, 169, 893, 393, 1457, 6069, 12511, 20423, 11385, 86711, 197555}},
+{18604, 18, 87293, {1, 3, 5, 15, 21, 25, 87, 159, 477, 177, 991, 495, 29, 9347, 9721, 4071, 30145, 214155}},
+{18605, 18, 87296, {1, 1, 5, 3, 11, 45, 53, 251, 177, 651, 549, 3377, 3247, 8761, 20339, 27743, 103387, 159591}},
+{18606, 18, 87299, {1, 3, 7, 11, 17, 27, 43, 179, 507, 553, 261, 3939, 6133, 6347, 12987, 46071, 42551, 99225}},
+{18607, 18, 87305, {1, 3, 3, 11, 3, 33, 85, 51, 277, 117, 1295, 2435, 1467, 13787, 2209, 52673, 53515, 157625}},
+{18608, 18, 87308, {1, 3, 3, 3, 9, 15, 121, 229, 227, 795, 541, 3727, 4333, 2251, 27833, 43567, 82505, 230427}},
+{18609, 18, 87313, {1, 1, 5, 13, 29, 19, 119, 63, 207, 945, 761, 2601, 1391, 8939, 11683, 52433, 63301, 82501}},
+{18610, 18, 87323, {1, 3, 7, 1, 3, 57, 127, 115, 209, 31, 1631, 347, 3937, 4015, 13313, 49507, 15103, 237071}},
+{18611, 18, 87332, {1, 3, 1, 13, 3, 25, 85, 151, 115, 385, 303, 2453, 2417, 8051, 1447, 59517, 3711, 160345}},
+{18612, 18, 87361, {1, 3, 1, 13, 1, 23, 49, 75, 117, 295, 1737, 2091, 6229, 3157, 32737, 13751, 101667, 96261}},
+{18613, 18, 87376, {1, 3, 3, 5, 27, 19, 103, 201, 65, 757, 1847, 239, 2185, 15139, 8883, 17737, 9207, 147663}},
+{18614, 18, 87392, {1, 3, 1, 9, 3, 39, 51, 1, 419, 929, 1049, 2891, 2585, 2759, 27587, 55711, 15461, 46851}},
+{18615, 18, 87419, {1, 1, 5, 3, 23, 23, 23, 101, 249, 997, 1889, 2293, 5693, 939, 29619, 2775, 49293, 168895}},
+{18616, 18, 87432, {1, 3, 1, 15, 9, 63, 17, 97, 385, 517, 1737, 713, 157, 2597, 20889, 35209, 47525, 14389}},
+{18617, 18, 87435, {1, 3, 1, 1, 7, 27, 9, 147, 349, 493, 341, 2699, 7743, 4283, 24691, 11881, 78619, 153899}},
+{18618, 18, 87445, {1, 3, 1, 9, 15, 25, 103, 177, 485, 355, 1319, 767, 6675, 3425, 7187, 53767, 92023, 151523}},
+{18619, 18, 87466, {1, 1, 3, 3, 15, 35, 25, 177, 295, 5, 661, 3651, 2597, 16229, 1343, 54941, 72047, 169155}},
+{18620, 18, 87491, {1, 1, 1, 1, 19, 29, 63, 229, 79, 551, 1401, 2851, 6935, 12485, 9243, 21671, 54209, 105347}},
+{18621, 18, 87503, {1, 1, 3, 1, 13, 33, 53, 125, 261, 623, 65, 3863, 1899, 2453, 16483, 48655, 50771, 248555}},
+{18622, 18, 87558, {1, 3, 5, 7, 25, 15, 107, 149, 485, 247, 1977, 3125, 4663, 4925, 15749, 39429, 52315, 30545}},
+{18623, 18, 87570, {1, 1, 7, 13, 23, 13, 127, 111, 9, 17, 1887, 1341, 3017, 14333, 6003, 35113, 14935, 17593}},
+{18624, 18, 87581, {1, 1, 1, 15, 23, 17, 111, 43, 71, 549, 1369, 1711, 3903, 13605, 14573, 18973, 28157, 128421}},
+{18625, 18, 87603, {1, 1, 7, 15, 27, 23, 5, 99, 87, 865, 1979, 3287, 3977, 14989, 17439, 14593, 92711, 211259}},
+{18626, 18, 87615, {1, 3, 3, 15, 5, 19, 3, 231, 127, 863, 1537, 369, 7915, 10281, 13925, 12931, 3905, 178609}},
+{18627, 18, 87623, {1, 1, 3, 15, 13, 5, 17, 217, 383, 251, 1701, 3379, 8157, 4991, 8563, 24611, 66081, 205775}},
+{18628, 18, 87635, {1, 3, 7, 11, 9, 25, 73, 131, 217, 601, 843, 807, 4509, 16209, 29581, 50869, 56595, 14283}},
+{18629, 18, 87647, {1, 3, 5, 9, 5, 59, 57, 153, 359, 775, 859, 1897, 6415, 7389, 10851, 64247, 21627, 145017}},
+{18630, 18, 87651, {1, 3, 7, 1, 27, 11, 117, 179, 175, 343, 687, 2775, 3655, 11655, 2641, 355, 83447, 237799}},
+{18631, 18, 87657, {1, 1, 7, 11, 17, 59, 91, 21, 403, 797, 1839, 525, 3279, 6575, 30083, 12503, 83057, 109465}},
+{18632, 18, 87665, {1, 3, 7, 1, 25, 27, 41, 223, 169, 679, 699, 3287, 6305, 6459, 23145, 45519, 127487, 183563}},
+{18633, 18, 87694, {1, 3, 3, 1, 9, 45, 105, 57, 185, 97, 899, 3113, 7081, 7057, 14559, 53537, 105623, 155399}},
+{18634, 18, 87701, {1, 3, 7, 5, 17, 35, 89, 13, 87, 587, 451, 4079, 1005, 4311, 15861, 49977, 59653, 12107}},
+{18635, 18, 87705, {1, 3, 7, 3, 19, 55, 43, 77, 317, 369, 71, 937, 1905, 5005, 17715, 4005, 55445, 25159}},
+{18636, 18, 87722, {1, 1, 7, 15, 15, 51, 87, 37, 59, 755, 763, 455, 711, 13399, 30999, 61269, 66037, 202793}},
+{18637, 18, 87739, {1, 1, 3, 5, 11, 57, 111, 135, 325, 553, 273, 1533, 3431, 6427, 24771, 42143, 56711, 220873}},
+{18638, 18, 87750, {1, 1, 1, 13, 3, 49, 53, 81, 491, 177, 1543, 1847, 7907, 7817, 15417, 9897, 101597, 160195}},
+{18639, 18, 87790, {1, 3, 1, 15, 19, 15, 91, 123, 365, 113, 129, 3371, 5789, 13553, 6887, 62317, 84269, 44777}},
+{18640, 18, 87795, {1, 3, 7, 13, 15, 63, 43, 175, 449, 437, 597, 1371, 5101, 13797, 28025, 15809, 7645, 21169}},
+{18641, 18, 87797, {1, 1, 7, 13, 23, 63, 105, 69, 219, 153, 1539, 1537, 6899, 9363, 27459, 34551, 62563, 236679}},
+{18642, 18, 87816, {1, 3, 7, 3, 9, 33, 3, 101, 135, 571, 127, 3881, 7017, 13403, 13817, 55167, 8645, 471}},
+{18643, 18, 87884, {1, 3, 3, 13, 7, 53, 29, 89, 473, 135, 639, 3137, 93, 965, 4867, 58265, 114963, 175295}},
+{18644, 18, 87917, {1, 3, 1, 1, 9, 11, 45, 123, 129, 441, 1601, 39, 4657, 3701, 29581, 16045, 57173, 75195}},
+{18645, 18, 87930, {1, 1, 3, 11, 7, 21, 9, 73, 25, 891, 1625, 3019, 223, 14351, 30621, 3075, 79051, 178127}},
+{18646, 18, 87942, {1, 1, 7, 3, 7, 43, 69, 209, 9, 857, 1539, 2629, 5277, 14583, 16443, 28275, 54143, 206479}},
+{18647, 18, 87953, {1, 3, 5, 9, 27, 15, 109, 237, 323, 103, 837, 597, 3609, 6249, 795, 37191, 20997, 142079}},
+{18648, 18, 87954, {1, 1, 3, 1, 27, 33, 123, 191, 55, 531, 1707, 2633, 6717, 9645, 21377, 51593, 9017, 178185}},
+{18649, 18, 87984, {1, 1, 5, 15, 3, 3, 67, 225, 229, 161, 2039, 1499, 873, 8803, 29901, 58809, 35625, 207797}},
+{18650, 18, 87989, {1, 3, 3, 7, 3, 47, 99, 237, 221, 31, 1043, 1081, 837, 1617, 17323, 43879, 55615, 238537}},
+{18651, 18, 88008, {1, 3, 7, 1, 17, 37, 45, 211, 245, 657, 221, 1067, 1683, 16127, 585, 9067, 25935, 162469}},
+{18652, 18, 88016, {1, 1, 5, 9, 23, 27, 5, 237, 137, 227, 129, 279, 4171, 5963, 349, 12387, 40701, 177255}},
+{18653, 18, 88038, {1, 3, 7, 15, 17, 11, 95, 69, 49, 901, 509, 2541, 3001, 15501, 24235, 39863, 95381, 260793}},
+{18654, 18, 88042, {1, 3, 3, 3, 29, 3, 125, 3, 423, 609, 1401, 2337, 1093, 11419, 29735, 9033, 115977, 210201}},
+{18655, 18, 88044, {1, 1, 1, 9, 11, 21, 71, 33, 399, 1005, 1691, 1501, 2585, 7361, 21527, 7535, 87091, 192319}},
+{18656, 18, 88049, {1, 1, 1, 11, 5, 49, 65, 115, 239, 255, 381, 2803, 3447, 5775, 18243, 16545, 108901, 81355}},
+{18657, 18, 88083, {1, 3, 7, 15, 31, 5, 81, 213, 281, 903, 189, 1807, 3551, 4423, 3591, 27449, 71659, 255357}},
+{18658, 18, 88119, {1, 1, 1, 15, 11, 1, 25, 213, 259, 215, 435, 3531, 4889, 9509, 21391, 21589, 89871, 85895}},
+{18659, 18, 88134, {1, 3, 3, 9, 29, 29, 37, 127, 419, 631, 1793, 1547, 1463, 13265, 17233, 24627, 3687, 174179}},
+{18660, 18, 88138, {1, 1, 1, 7, 27, 61, 105, 135, 439, 161, 721, 2779, 6731, 14575, 4565, 25869, 38981, 191683}},
+{18661, 18, 88143, {1, 1, 7, 13, 21, 41, 43, 5, 313, 407, 505, 231, 5023, 8971, 15825, 38461, 38797, 136027}},
+{18662, 18, 88191, {1, 3, 7, 3, 7, 59, 11, 255, 327, 843, 1179, 889, 4505, 10891, 7901, 14485, 72297, 255985}},
+{18663, 18, 88216, {1, 1, 5, 3, 9, 37, 89, 59, 413, 51, 515, 4009, 6501, 8443, 14381, 60917, 43567, 234431}},
+{18664, 18, 88231, {1, 1, 3, 9, 9, 57, 65, 205, 367, 935, 1975, 2561, 225, 12529, 4721, 56659, 87901, 219641}},
+{18665, 18, 88232, {1, 3, 7, 15, 23, 55, 61, 15, 89, 267, 1245, 2703, 7471, 10499, 19, 19357, 72413, 199289}},
+{18666, 18, 88297, {1, 1, 1, 13, 1, 29, 65, 11, 353, 509, 1831, 2181, 5265, 14761, 913, 17109, 113613, 37143}},
+{18667, 18, 88300, {1, 1, 7, 5, 17, 37, 97, 249, 169, 223, 475, 2091, 3101, 8541, 325, 42359, 16121, 151739}},
+{18668, 18, 88308, {1, 1, 3, 13, 1, 45, 13, 209, 395, 215, 15, 2287, 5365, 9887, 29799, 51957, 97483, 109467}},
+{18669, 18, 88317, {1, 3, 7, 1, 9, 35, 91, 51, 387, 833, 783, 2483, 3743, 6155, 5881, 3047, 86191, 151867}},
+{18670, 18, 88344, {1, 1, 1, 7, 15, 25, 13, 3, 119, 333, 761, 3459, 2555, 15737, 12945, 15225, 45487, 78235}},
+{18671, 18, 88350, {1, 3, 1, 3, 13, 55, 111, 45, 121, 593, 633, 2705, 1653, 13275, 13533, 3559, 100573, 124363}},
+{18672, 18, 88371, {1, 1, 3, 1, 29, 49, 65, 69, 133, 667, 653, 2559, 6335, 8019, 9251, 5415, 90125, 197413}},
+{18673, 18, 88469, {1, 1, 1, 7, 23, 53, 99, 149, 39, 453, 129, 185, 1143, 12799, 23339, 41293, 94023, 105581}},
+{18674, 18, 88483, {1, 3, 3, 13, 5, 3, 5, 215, 425, 455, 421, 3815, 5983, 3851, 19569, 17363, 6411, 60037}},
+{18675, 18, 88485, {1, 3, 7, 1, 29, 7, 63, 207, 299, 17, 1915, 2041, 8129, 661, 32481, 55475, 72027, 239683}},
+{18676, 18, 88518, {1, 1, 5, 13, 29, 11, 39, 177, 177, 479, 1291, 3931, 4353, 327, 7827, 9529, 6967, 6469}},
+{18677, 18, 88586, {1, 1, 5, 3, 25, 39, 121, 15, 7, 715, 583, 3997, 1373, 7747, 1777, 7269, 105333, 201511}},
+{18678, 18, 88605, {1, 3, 3, 9, 11, 7, 81, 109, 129, 359, 1281, 1163, 4895, 10303, 17801, 43461, 120271, 173027}},
+{18679, 18, 88621, {1, 3, 5, 1, 23, 59, 123, 75, 505, 925, 637, 1713, 995, 14031, 13711, 62569, 90553, 242345}},
+{18680, 18, 88651, {1, 3, 3, 15, 19, 11, 39, 203, 229, 619, 735, 1367, 4963, 5263, 30229, 17847, 9623, 3277}},
+{18681, 18, 88656, {1, 1, 7, 13, 5, 27, 23, 223, 377, 335, 1821, 2481, 4111, 10373, 18423, 7237, 75225, 223433}},
+{18682, 18, 88665, {1, 3, 7, 1, 21, 19, 71, 107, 19, 703, 945, 3831, 1099, 6267, 17489, 27665, 8861, 127499}},
+{18683, 18, 88668, {1, 3, 5, 1, 19, 49, 117, 181, 245, 939, 1279, 3127, 4427, 3061, 23399, 64805, 43077, 100789}},
+{18684, 18, 88712, {1, 1, 3, 3, 31, 55, 53, 205, 97, 645, 215, 2617, 7419, 7159, 27373, 62341, 58121, 248677}},
+{18685, 18, 88717, {1, 1, 7, 5, 15, 41, 99, 75, 201, 187, 197, 3773, 3097, 6803, 5307, 31375, 26743, 142723}},
+{18686, 18, 88751, {1, 3, 5, 11, 23, 61, 127, 15, 89, 245, 1345, 1305, 5937, 15917, 23867, 50319, 91921, 248663}},
+{18687, 18, 88754, {1, 1, 3, 9, 27, 7, 1, 75, 181, 155, 1947, 577, 2975, 8855, 5295, 43403, 112497, 100679}},
+{18688, 18, 88756, {1, 1, 1, 11, 29, 61, 35, 241, 207, 73, 1747, 1797, 3665, 14275, 25359, 28685, 79367, 81819}},
+{18689, 18, 88785, {1, 3, 5, 9, 11, 1, 37, 79, 431, 157, 1979, 159, 3087, 1731, 26141, 31411, 56457, 94293}},
+{18690, 18, 88801, {1, 3, 7, 1, 17, 35, 107, 243, 279, 79, 227, 1275, 761, 11485, 22181, 16415, 68801, 4577}},
+{18691, 18, 88807, {1, 3, 1, 9, 21, 43, 115, 131, 129, 123, 1677, 1875, 7355, 15927, 845, 24101, 48985, 39703}},
+{18692, 18, 88826, {1, 1, 7, 3, 17, 25, 105, 189, 317, 109, 1629, 3103, 615, 1047, 621, 62743, 43631, 9811}},
+{18693, 18, 88848, {1, 3, 1, 3, 3, 45, 49, 73, 383, 761, 685, 3211, 3855, 16307, 30469, 1393, 52535, 165503}},
+{18694, 18, 88854, {1, 3, 5, 15, 1, 41, 89, 105, 213, 33, 1477, 711, 4823, 503, 12533, 56781, 42825, 223399}},
+{18695, 18, 88864, {1, 3, 5, 9, 17, 45, 63, 113, 359, 927, 1467, 2811, 4275, 5193, 6023, 32689, 87747, 234697}},
+{18696, 18, 88879, {1, 1, 3, 1, 21, 49, 73, 157, 97, 915, 1689, 3289, 7515, 10759, 32253, 63175, 66175, 125813}},
+{18697, 18, 88939, {1, 1, 1, 5, 19, 1, 127, 229, 453, 617, 511, 1515, 3815, 3125, 26851, 31635, 35389, 237483}},
+{18698, 18, 88947, {1, 1, 1, 13, 27, 61, 75, 23, 289, 133, 975, 3217, 3777, 12095, 15235, 33845, 125503, 88417}},
+{18699, 18, 88987, {1, 1, 3, 13, 27, 49, 29, 115, 221, 995, 1305, 2717, 2243, 13391, 20841, 863, 63195, 46829}},
+{18700, 18, 88990, {1, 3, 1, 11, 31, 49, 43, 163, 503, 123, 657, 1285, 3695, 8401, 17087, 48289, 3947, 41495}},
+{18701, 18, 88996, {1, 3, 7, 9, 21, 17, 125, 75, 395, 979, 781, 2501, 6511, 4619, 28943, 18295, 87547, 196289}},
+{18702, 18, 89008, {1, 3, 3, 5, 3, 39, 107, 199, 7, 331, 77, 511, 5787, 3155, 29605, 44633, 51041, 89141}},
+{18703, 18, 89011, {1, 1, 3, 7, 11, 37, 79, 69, 181, 623, 299, 2321, 4371, 7449, 3137, 25753, 116673, 30441}},
+{18704, 18, 89043, {1, 1, 5, 9, 11, 13, 49, 207, 179, 671, 1469, 1005, 6887, 12203, 9365, 62455, 36283, 42053}},
+{18705, 18, 89045, {1, 3, 1, 1, 7, 31, 115, 79, 435, 101, 1525, 3695, 3229, 11401, 23959, 62055, 37725, 219753}},
+{18706, 18, 89050, {1, 3, 3, 7, 25, 49, 123, 161, 275, 291, 255, 2247, 4271, 10771, 2449, 26343, 61169, 30691}},
+{18707, 18, 89097, {1, 1, 7, 1, 15, 3, 11, 15, 125, 1021, 1817, 417, 2721, 13985, 19039, 451, 32559, 199407}},
+{18708, 18, 89100, {1, 1, 5, 15, 11, 25, 23, 101, 427, 431, 1353, 1957, 3529, 513, 11937, 14469, 89539, 242015}},
+{18709, 18, 89106, {1, 1, 5, 13, 27, 5, 107, 29, 469, 3, 1427, 1949, 7007, 16339, 3375, 63545, 100739, 229487}},
+{18710, 18, 89134, {1, 3, 5, 13, 15, 17, 59, 213, 417, 557, 11, 811, 5041, 4133, 25735, 46807, 65669, 148081}},
+{18711, 18, 89178, {1, 1, 5, 13, 9, 47, 35, 173, 277, 805, 1249, 3707, 1079, 2833, 29383, 58995, 21005, 181567}},
+{18712, 18, 89189, {1, 3, 5, 1, 5, 25, 125, 45, 157, 291, 1329, 3317, 2311, 9919, 31001, 65127, 19451, 117621}},
+{18713, 18, 89202, {1, 1, 5, 9, 31, 21, 9, 193, 23, 879, 699, 1135, 7151, 8635, 20711, 45207, 67047, 4397}},
+{18714, 18, 89211, {1, 3, 1, 11, 11, 49, 119, 129, 409, 491, 463, 833, 3661, 607, 25961, 6061, 12747, 160337}},
+{18715, 18, 89224, {1, 3, 1, 15, 31, 35, 93, 95, 239, 695, 1113, 2371, 2625, 10371, 10781, 46209, 67051, 109923}},
+{18716, 18, 89241, {1, 3, 5, 9, 5, 61, 25, 19, 99, 159, 55, 43, 3679, 1023, 17951, 44841, 101653, 195955}},
+{18717, 18, 89251, {1, 1, 3, 11, 19, 45, 99, 47, 407, 115, 353, 3537, 7147, 5837, 27309, 44539, 30227, 93183}},
+{18718, 18, 89254, {1, 1, 7, 15, 13, 59, 83, 215, 79, 865, 269, 2999, 2415, 10631, 23655, 51583, 46105, 43965}},
+{18719, 18, 89258, {1, 3, 7, 5, 17, 1, 7, 119, 501, 25, 1097, 3639, 7017, 381, 4793, 37263, 60431, 77323}},
+{18720, 18, 89295, {1, 3, 7, 13, 1, 37, 99, 103, 459, 853, 5, 3093, 6167, 14497, 7003, 36979, 71919, 64823}},
+{18721, 18, 89328, {1, 3, 7, 5, 23, 7, 37, 255, 297, 115, 113, 579, 4561, 5245, 11173, 28645, 23989, 240777}},
+{18722, 18, 89357, {1, 3, 5, 9, 29, 47, 43, 145, 481, 251, 737, 2531, 2425, 529, 3953, 13229, 35933, 187855}},
+{18723, 18, 89403, {1, 3, 1, 15, 15, 15, 29, 73, 405, 91, 1399, 3599, 1517, 11075, 11265, 22817, 26619, 1183}},
+{18724, 18, 89420, {1, 1, 5, 15, 21, 47, 93, 33, 47, 527, 877, 3453, 3867, 4007, 32503, 11789, 68333, 187419}},
+{18725, 18, 89426, {1, 1, 3, 13, 5, 3, 99, 21, 17, 779, 541, 3919, 1339, 13507, 28965, 61145, 50421, 192319}},
+{18726, 18, 89465, {1, 1, 3, 7, 31, 63, 17, 9, 331, 681, 515, 1067, 351, 2471, 31271, 36015, 72911, 32383}},
+{18727, 18, 89471, {1, 1, 3, 7, 1, 55, 97, 211, 409, 499, 1207, 2405, 2291, 1373, 1263, 65303, 38655, 159965}},
+{18728, 18, 89475, {1, 1, 1, 5, 23, 11, 21, 23, 35, 19, 1699, 2325, 6117, 14971, 32327, 31369, 28061, 112819}},
+{18729, 18, 89547, {1, 3, 3, 13, 29, 63, 19, 201, 173, 395, 1437, 369, 7045, 14347, 5393, 11311, 28415, 161019}},
+{18730, 18, 89549, {1, 3, 1, 5, 31, 15, 101, 13, 97, 865, 1063, 2129, 811, 3337, 7585, 54803, 122099, 149531}},
+{18731, 18, 89558, {1, 3, 3, 13, 19, 5, 47, 13, 497, 683, 1197, 3509, 4375, 3353, 31847, 283, 95281, 7975}},
+{18732, 18, 89564, {1, 1, 7, 5, 25, 19, 59, 105, 167, 775, 581, 2679, 3003, 9345, 20209, 31487, 25357, 226341}},
+{18733, 18, 89611, {1, 1, 5, 5, 31, 61, 13, 77, 189, 141, 1157, 609, 7245, 15303, 32743, 50229, 67391, 173977}},
+{18734, 18, 89616, {1, 3, 7, 13, 17, 11, 49, 135, 475, 303, 1373, 1437, 6119, 1729, 21347, 31643, 86523, 41223}},
+{18735, 18, 89626, {1, 3, 7, 13, 3, 19, 103, 53, 209, 281, 77, 2009, 7911, 8549, 17655, 33165, 9685, 2289}},
+{18736, 18, 89650, {1, 3, 3, 9, 5, 31, 71, 113, 93, 255, 165, 3465, 6769, 13047, 20701, 33669, 22537, 175209}},
+{18737, 18, 89691, {1, 3, 1, 1, 15, 59, 89, 227, 275, 451, 869, 1865, 1327, 3895, 5459, 47997, 34287, 95343}},
+{18738, 18, 89718, {1, 3, 7, 13, 27, 1, 25, 99, 475, 421, 693, 1955, 4017, 16037, 29915, 52415, 99913, 59151}},
+{18739, 18, 89764, {1, 3, 5, 1, 9, 61, 107, 149, 465, 1003, 891, 2387, 407, 5851, 6287, 56401, 109693, 72035}},
+{18740, 18, 89776, {1, 1, 1, 11, 25, 53, 101, 125, 35, 949, 1019, 3087, 2785, 11271, 25623, 57313, 115683, 101923}},
+{18741, 18, 89785, {1, 3, 5, 13, 19, 13, 97, 147, 149, 483, 1727, 1771, 2089, 8661, 28223, 30437, 42565, 13261}},
+{18742, 18, 89813, {1, 3, 3, 11, 17, 9, 13, 13, 419, 531, 1617, 1459, 411, 9953, 25581, 30305, 120721, 81113}},
+{18743, 18, 89817, {1, 3, 3, 9, 9, 9, 83, 35, 367, 981, 911, 1915, 4937, 16187, 20441, 30433, 107605, 119939}},
+{18744, 18, 89861, {1, 3, 7, 11, 11, 47, 31, 7, 141, 905, 1753, 3069, 47, 7347, 10517, 19515, 126827, 68669}},
+{18745, 18, 89876, {1, 3, 3, 9, 17, 33, 121, 159, 265, 389, 261, 2479, 7705, 6453, 31963, 14123, 100201, 77235}},
+{18746, 18, 89889, {1, 1, 5, 5, 13, 63, 3, 1, 107, 383, 633, 2183, 1437, 14525, 29315, 3277, 2153, 204061}},
+{18747, 18, 89904, {1, 3, 3, 3, 17, 9, 47, 173, 17, 413, 451, 1127, 1807, 5265, 32543, 8215, 123601, 138777}},
+{18748, 18, 89939, {1, 3, 1, 1, 7, 57, 93, 29, 101, 955, 1445, 4017, 2853, 3551, 22173, 40355, 34687, 133063}},
+{18749, 18, 89948, {1, 1, 5, 11, 19, 15, 95, 177, 49, 971, 15, 2293, 2627, 7841, 2103, 64331, 60481, 182431}},
+{18750, 18, 89952, {1, 3, 1, 15, 25, 57, 47, 85, 485, 11, 1669, 995, 6939, 4125, 19513, 62397, 62645, 82213}},
+{18751, 18, 89964, {1, 1, 1, 11, 1, 37, 101, 157, 17, 261, 997, 817, 2195, 4141, 10505, 60685, 98165, 167391}},
+{18752, 18, 89969, {1, 1, 1, 1, 31, 9, 103, 97, 161, 13, 1043, 307, 7321, 671, 12417, 58661, 23031, 207833}},
+{18753, 18, 89979, {1, 1, 7, 9, 15, 49, 69, 117, 93, 95, 507, 393, 6169, 2111, 27179, 47217, 93699, 67315}},
+{18754, 18, 90009, {1, 3, 7, 1, 23, 41, 115, 125, 343, 615, 397, 1199, 3041, 11019, 1071, 51069, 75757, 245765}},
+{18755, 18, 90022, {1, 1, 1, 13, 7, 15, 111, 239, 29, 419, 203, 2395, 3995, 13, 32341, 17471, 53259, 3317}},
+{18756, 18, 90031, {1, 3, 1, 11, 29, 27, 15, 217, 17, 163, 1847, 3549, 4911, 4539, 4927, 57157, 44893, 41669}},
+{18757, 18, 90043, {1, 1, 7, 7, 25, 15, 101, 149, 433, 717, 1827, 3837, 4565, 14521, 28857, 27775, 117429, 136131}},
+{18758, 18, 90045, {1, 1, 1, 3, 25, 35, 85, 3, 381, 253, 375, 3967, 3101, 12727, 31739, 48885, 35821, 92229}},
+{18759, 18, 90068, {1, 3, 3, 7, 29, 5, 51, 157, 67, 467, 1957, 3453, 1353, 4839, 25379, 42731, 109385, 52479}},
+{18760, 18, 90071, {1, 3, 7, 13, 3, 55, 61, 73, 257, 313, 89, 2557, 7467, 2223, 2951, 49265, 126605, 72007}},
+{18761, 18, 90082, {1, 3, 7, 5, 5, 11, 83, 3, 347, 63, 479, 529, 5059, 7029, 20523, 58387, 44891, 168921}},
+{18762, 18, 90087, {1, 3, 1, 11, 3, 51, 99, 5, 161, 279, 1509, 3659, 3107, 13925, 5117, 46153, 48731, 69767}},
+{18763, 18, 90117, {1, 1, 5, 5, 3, 53, 49, 243, 383, 401, 1205, 975, 3305, 12769, 25533, 28733, 115161, 160885}},
+{18764, 18, 90127, {1, 1, 1, 7, 15, 5, 43, 143, 493, 527, 1625, 2115, 3929, 12425, 16127, 25045, 55973, 202359}},
+{18765, 18, 90163, {1, 3, 7, 7, 11, 9, 69, 79, 417, 941, 473, 1655, 5763, 9889, 22443, 12153, 103489, 74737}},
+{18766, 18, 90166, {1, 1, 7, 9, 27, 31, 97, 253, 199, 99, 1955, 1481, 2509, 11923, 6337, 15899, 122515, 244721}},
+{18767, 18, 90177, {1, 1, 5, 13, 29, 15, 35, 177, 261, 613, 1279, 2837, 2945, 4501, 22865, 36893, 51979, 245569}},
+{18768, 18, 90211, {1, 1, 5, 9, 21, 5, 85, 5, 303, 165, 681, 3965, 2575, 1493, 10367, 55845, 92139, 92539}},
+{18769, 18, 90218, {1, 3, 5, 1, 23, 49, 49, 161, 481, 181, 1991, 1845, 4541, 14187, 10893, 64931, 79943, 57907}},
+{18770, 18, 90225, {1, 3, 1, 5, 11, 27, 19, 193, 371, 463, 1573, 271, 1127, 15091, 9967, 40337, 104163, 159339}},
+{18771, 18, 90231, {1, 3, 1, 3, 13, 3, 57, 149, 465, 789, 1155, 2223, 2007, 13987, 19057, 40447, 5217, 86191}},
+{18772, 18, 90235, {1, 3, 5, 5, 9, 45, 27, 155, 95, 171, 489, 2539, 843, 16125, 7047, 58541, 84641, 212013}},
+{18773, 18, 90289, {1, 3, 5, 13, 13, 53, 101, 159, 7, 481, 143, 3869, 6629, 3527, 1555, 6019, 155, 230157}},
+{18774, 18, 90344, {1, 3, 1, 1, 19, 59, 59, 129, 107, 887, 1595, 93, 6577, 3947, 14409, 31081, 68595, 226741}},
+{18775, 18, 90347, {1, 3, 3, 11, 13, 49, 81, 253, 363, 875, 489, 2181, 3487, 1615, 31157, 32949, 44809, 119421}},
+{18776, 18, 90379, {1, 1, 3, 1, 3, 19, 71, 93, 397, 521, 2015, 3829, 3013, 3941, 29437, 1959, 70283, 254361}},
+{18777, 18, 90387, {1, 3, 1, 3, 27, 11, 95, 39, 299, 521, 389, 3451, 3047, 8637, 22537, 11279, 67407, 101511}},
+{18778, 18, 90418, {1, 3, 1, 1, 27, 43, 123, 237, 315, 503, 1059, 2185, 3963, 1593, 19157, 13909, 58025, 91649}},
+{18779, 18, 90435, {1, 1, 7, 1, 5, 19, 79, 109, 459, 541, 521, 89, 389, 13499, 9769, 1429, 117357, 153261}},
+{18780, 18, 90444, {1, 1, 5, 3, 9, 29, 21, 97, 219, 915, 2013, 1955, 1015, 549, 9777, 5005, 110953, 16915}},
+{18781, 18, 90472, {1, 1, 1, 9, 29, 11, 103, 167, 465, 515, 843, 151, 769, 12033, 9451, 14949, 110075, 113947}},
+{18782, 18, 90478, {1, 3, 5, 1, 21, 1, 105, 49, 35, 737, 231, 2761, 1519, 9997, 601, 20883, 42575, 98081}},
+{18783, 18, 90485, {1, 1, 1, 5, 13, 63, 47, 171, 187, 407, 643, 1423, 6325, 10079, 23781, 36353, 20655, 10231}},
+{18784, 18, 90486, {1, 1, 7, 13, 13, 13, 91, 31, 19, 305, 505, 1937, 2683, 10791, 7719, 54797, 9405, 195819}},
+{18785, 18, 90513, {1, 1, 1, 7, 17, 9, 21, 211, 85, 851, 211, 1533, 4035, 11, 26873, 16755, 77809, 44603}},
+{18786, 18, 90514, {1, 1, 3, 1, 29, 47, 31, 141, 9, 881, 1229, 1261, 3747, 4603, 22177, 48937, 21435, 157029}},
+{18787, 18, 90532, {1, 1, 1, 9, 11, 35, 109, 187, 319, 863, 1339, 2193, 4147, 3721, 7243, 18295, 92461, 88875}},
+{18788, 18, 90567, {1, 1, 1, 1, 25, 41, 79, 191, 47, 819, 2013, 3133, 2763, 9231, 10343, 49693, 26753, 97465}},
+{18789, 18, 90595, {1, 3, 1, 3, 17, 25, 63, 139, 179, 113, 1681, 1997, 4561, 14453, 30721, 7053, 22937, 183303}},
+{18790, 18, 90597, {1, 1, 7, 3, 29, 11, 41, 157, 427, 887, 295, 443, 5593, 8633, 9757, 37595, 121655, 135739}},
+{18791, 18, 90621, {1, 3, 1, 7, 29, 5, 23, 231, 85, 67, 103, 1395, 7821, 9551, 17019, 1825, 69963, 254583}},
+{18792, 18, 90631, {1, 1, 7, 9, 7, 23, 7, 205, 17, 111, 1219, 3101, 7485, 11579, 11791, 10203, 119835, 175985}},
+{18793, 18, 90668, {1, 3, 3, 13, 3, 57, 101, 255, 331, 911, 491, 3929, 2519, 2185, 21107, 24599, 92831, 75001}},
+{18794, 18, 90706, {1, 3, 7, 1, 23, 53, 69, 229, 295, 881, 905, 3727, 3885, 7967, 2061, 53595, 16033, 36443}},
+{18795, 18, 90708, {1, 1, 7, 15, 21, 1, 127, 115, 191, 53, 929, 1093, 5447, 1665, 4409, 22611, 38157, 139201}},
+{18796, 18, 90715, {1, 3, 3, 13, 29, 31, 113, 215, 365, 41, 1977, 2839, 4147, 8321, 1361, 45717, 80505, 176631}},
+{18797, 18, 90724, {1, 3, 5, 3, 3, 57, 25, 81, 41, 229, 669, 3371, 7505, 1197, 14921, 34365, 67571, 27355}},
+{18798, 18, 90769, {1, 3, 7, 9, 17, 35, 7, 169, 13, 163, 2007, 3697, 5635, 8003, 26105, 62917, 19349, 47029}},
+{18799, 18, 90791, {1, 1, 5, 5, 29, 27, 89, 137, 69, 189, 871, 3139, 6383, 14955, 15349, 60447, 122291, 26541}},
+{18800, 18, 90792, {1, 1, 7, 13, 27, 49, 115, 111, 441, 865, 1397, 161, 755, 14461, 8601, 45533, 105309, 149799}},
+{18801, 18, 90805, {1, 1, 7, 3, 9, 29, 91, 5, 239, 605, 491, 1705, 4099, 9111, 19821, 56903, 62815, 40615}},
+{18802, 18, 90810, {1, 1, 7, 15, 5, 45, 71, 225, 211, 539, 1881, 1201, 5675, 6061, 12121, 13289, 30455, 33131}},
+{18803, 18, 90820, {1, 1, 5, 15, 5, 59, 35, 121, 185, 143, 165, 2999, 7907, 5035, 8337, 11951, 66403, 219997}},
+{18804, 18, 90844, {1, 1, 5, 9, 3, 7, 27, 129, 245, 93, 715, 1249, 1717, 13381, 31255, 23153, 22227, 8077}},
+{18805, 18, 90907, {1, 3, 5, 11, 19, 49, 21, 163, 157, 615, 1475, 2453, 6315, 12325, 26565, 58399, 49385, 252127}},
+{18806, 18, 90925, {1, 3, 7, 11, 23, 3, 35, 61, 409, 795, 1447, 3461, 535, 6533, 25757, 31783, 9509, 217589}},
+{18807, 18, 90926, {1, 1, 5, 15, 9, 21, 67, 65, 399, 515, 777, 3183, 1155, 16071, 7339, 59985, 56659, 200701}},
+{18808, 18, 90934, {1, 3, 3, 1, 15, 33, 119, 145, 71, 517, 1775, 163, 5307, 1549, 31071, 56289, 128395, 230381}},
+{18809, 18, 90946, {1, 3, 1, 7, 7, 47, 97, 187, 193, 887, 515, 1301, 4841, 12069, 413, 41503, 36421, 45909}},
+{18810, 18, 90981, {1, 1, 5, 3, 17, 21, 53, 227, 137, 865, 715, 3601, 5027, 2983, 24113, 23349, 106391, 188193}},
+{18811, 18, 90999, {1, 3, 7, 15, 29, 37, 91, 235, 351, 15, 425, 681, 187, 1517, 30079, 41347, 49691, 66369}},
+{18812, 18, 91003, {1, 1, 5, 5, 15, 25, 93, 245, 397, 517, 1635, 2475, 5543, 9597, 27721, 21475, 79571, 259011}},
+{18813, 18, 91019, {1, 1, 1, 5, 21, 29, 5, 161, 37, 409, 1661, 3371, 5663, 4317, 9951, 23605, 7393, 90593}},
+{18814, 18, 91022, {1, 1, 3, 15, 21, 51, 79, 159, 209, 891, 1391, 2895, 5003, 6601, 17983, 42359, 104497, 162181}},
+{18815, 18, 91050, {1, 3, 7, 11, 23, 51, 99, 145, 21, 345, 1389, 1035, 5939, 8293, 22765, 23331, 7789, 115149}},
+{18816, 18, 91055, {1, 1, 5, 11, 27, 61, 115, 123, 317, 607, 463, 779, 5121, 3861, 18761, 39407, 125837, 244163}},
+{18817, 18, 91064, {1, 1, 7, 3, 15, 9, 33, 1, 437, 621, 31, 147, 8157, 3451, 18223, 61187, 125297, 211225}},
+{18818, 18, 91078, {1, 3, 1, 11, 27, 55, 21, 251, 5, 57, 1889, 71, 3745, 499, 9043, 62683, 21945, 138615}},
+{18819, 18, 91117, {1, 1, 3, 13, 25, 9, 1, 31, 277, 373, 507, 301, 2341, 1741, 11997, 47661, 44121, 183151}},
+{18820, 18, 91120, {1, 3, 3, 5, 15, 51, 5, 233, 475, 397, 1833, 1267, 7025, 2593, 15425, 47053, 16205, 208007}},
+{18821, 18, 91129, {1, 3, 3, 9, 31, 51, 123, 219, 493, 789, 659, 985, 7283, 11545, 15383, 25173, 130423, 196619}},
+{18822, 18, 91140, {1, 1, 1, 15, 9, 17, 37, 145, 297, 933, 1019, 1699, 2149, 12391, 17003, 42157, 126283, 252231}},
+{18823, 18, 91157, {1, 3, 5, 9, 17, 1, 91, 69, 335, 857, 925, 3855, 2225, 6909, 19101, 12191, 92117, 229077}},
+{18824, 18, 91161, {1, 3, 5, 13, 5, 21, 67, 17, 307, 879, 1563, 3169, 745, 6799, 27237, 39621, 1413, 146295}},
+{18825, 18, 91240, {1, 3, 7, 13, 17, 59, 23, 253, 415, 761, 451, 2773, 3523, 10985, 29853, 7275, 79521, 133447}},
+{18826, 18, 91260, {1, 1, 1, 1, 15, 43, 89, 19, 85, 837, 1335, 1641, 105, 5429, 8317, 45555, 104447, 102313}},
+{18827, 18, 91270, {1, 3, 3, 5, 17, 21, 67, 235, 367, 265, 1069, 835, 5457, 177, 26987, 39477, 6895, 123283}},
+{18828, 18, 91287, {1, 1, 5, 15, 19, 61, 5, 15, 487, 291, 661, 825, 1569, 8795, 13035, 57077, 112847, 160267}},
+{18829, 18, 91321, {1, 1, 7, 9, 27, 21, 91, 133, 361, 7, 447, 3035, 3523, 13167, 15927, 35555, 35713, 91291}},
+{18830, 18, 91336, {1, 3, 7, 11, 17, 23, 77, 255, 437, 897, 1185, 1633, 6451, 13081, 29097, 61335, 39671, 177835}},
+{18831, 18, 91341, {1, 1, 7, 5, 31, 49, 81, 221, 167, 241, 1895, 1813, 1493, 2475, 379, 5685, 116341, 121823}},
+{18832, 18, 91378, {1, 3, 5, 9, 25, 11, 117, 253, 337, 381, 743, 69, 1641, 3649, 26335, 59683, 28729, 83449}},
+{18833, 18, 91398, {1, 3, 1, 7, 15, 17, 59, 9, 129, 233, 1905, 1371, 6521, 8953, 26173, 9707, 70817, 260035}},
+{18834, 18, 91437, {1, 3, 1, 5, 19, 53, 23, 255, 305, 835, 1387, 2947, 3013, 9117, 27571, 47123, 49881, 47229}},
+{18835, 18, 91440, {1, 1, 3, 5, 23, 37, 123, 193, 365, 49, 1211, 3083, 8133, 14205, 11361, 55945, 23225, 159109}},
+{18836, 18, 91475, {1, 1, 7, 11, 5, 49, 43, 165, 97, 581, 617, 3045, 6187, 8399, 24045, 46713, 28389, 156811}},
+{18837, 18, 91494, {1, 3, 1, 5, 29, 17, 75, 231, 59, 143, 2041, 2319, 2289, 11805, 4039, 29895, 91305, 179091}},
+{18838, 18, 91500, {1, 1, 7, 7, 29, 5, 13, 43, 409, 81, 751, 2157, 2543, 13317, 28275, 60871, 119833, 36743}},
+{18839, 18, 91511, {1, 1, 5, 13, 5, 5, 21, 101, 497, 993, 157, 647, 3587, 1495, 20233, 30889, 112579, 172009}},
+{18840, 18, 91567, {1, 1, 7, 13, 7, 19, 101, 217, 305, 897, 1305, 1693, 6881, 2415, 17373, 56327, 53971, 19021}},
+{18841, 18, 91572, {1, 1, 7, 15, 31, 61, 93, 99, 459, 999, 239, 969, 2427, 12295, 23699, 4839, 73707, 110365}},
+{18842, 18, 91601, {1, 3, 5, 9, 15, 59, 29, 35, 15, 331, 93, 529, 2651, 5675, 3039, 25967, 2907, 222053}},
+{18843, 18, 91617, {1, 3, 3, 1, 1, 17, 59, 81, 495, 917, 1907, 3, 1989, 14339, 21311, 60909, 39393, 54115}},
+{18844, 18, 91653, {1, 3, 1, 9, 1, 37, 31, 201, 251, 117, 1753, 2453, 5007, 6935, 1165, 49231, 51495, 200219}},
+{18845, 18, 91678, {1, 1, 3, 3, 15, 47, 17, 175, 77, 363, 1455, 1417, 1357, 2295, 31165, 53337, 97891, 145621}},
+{18846, 18, 91705, {1, 3, 3, 3, 27, 31, 41, 179, 47, 629, 5, 2543, 6817, 8953, 7151, 20715, 52363, 251037}},
+{18847, 18, 91723, {1, 3, 1, 1, 21, 11, 103, 87, 285, 189, 1911, 2979, 7563, 13405, 2309, 25695, 106277, 179493}},
+{18848, 18, 91725, {1, 1, 1, 5, 7, 19, 1, 233, 261, 825, 1071, 3529, 5617, 11207, 24559, 47461, 79753, 41009}},
+{18849, 18, 91733, {1, 1, 3, 1, 15, 35, 65, 157, 381, 509, 1455, 3117, 31, 2251, 29729, 33687, 74999, 214765}},
+{18850, 18, 91761, {1, 1, 7, 11, 31, 43, 11, 147, 509, 891, 1929, 357, 3905, 16251, 30169, 27787, 124003, 142587}},
+{18851, 18, 91768, {1, 1, 7, 11, 3, 31, 93, 161, 311, 377, 1119, 2177, 4339, 3889, 24299, 35167, 87583, 145611}},
+{18852, 18, 91790, {1, 1, 5, 9, 23, 9, 73, 85, 233, 919, 1319, 13, 3353, 1029, 31251, 17731, 86759, 11705}},
+{18853, 18, 91804, {1, 1, 1, 7, 27, 23, 67, 235, 207, 161, 697, 2433, 833, 5305, 32695, 29327, 25285, 51289}},
+{18854, 18, 91807, {1, 3, 3, 3, 31, 55, 107, 211, 61, 993, 1443, 463, 5029, 5401, 8821, 29721, 113939, 194839}},
+{18855, 18, 91808, {1, 1, 1, 11, 11, 33, 39, 167, 17, 863, 363, 3967, 2277, 4053, 15403, 31887, 98565, 217953}},
+{18856, 18, 91818, {1, 1, 7, 1, 21, 47, 97, 147, 155, 327, 1417, 3531, 7649, 8975, 21221, 57631, 72611, 97745}},
+{18857, 18, 91840, {1, 3, 3, 1, 1, 63, 19, 91, 105, 991, 819, 673, 7845, 14947, 1633, 40517, 91525, 151041}},
+{18858, 18, 91849, {1, 1, 7, 11, 25, 43, 57, 141, 65, 415, 1045, 3947, 7099, 11653, 29321, 51591, 2591, 44803}},
+{18859, 18, 91869, {1, 3, 1, 9, 15, 19, 105, 37, 485, 3, 213, 1217, 951, 5637, 1589, 25501, 95073, 124683}},
+{18860, 18, 91873, {1, 1, 5, 7, 13, 19, 55, 143, 507, 575, 715, 1633, 5201, 10493, 26041, 18407, 8097, 152313}},
+{18861, 18, 91876, {1, 1, 3, 5, 9, 51, 5, 171, 143, 877, 1571, 2997, 4209, 13423, 9389, 23015, 6665, 254799}},
+{18862, 18, 91888, {1, 3, 5, 15, 31, 43, 87, 79, 89, 463, 1075, 1257, 1631, 13225, 13529, 53267, 73651, 89125}},
+{18863, 18, 91891, {1, 3, 7, 13, 23, 17, 93, 113, 45, 225, 1939, 3301, 6031, 9749, 16577, 12857, 68437, 169861}},
+{18864, 18, 91897, {1, 3, 3, 15, 31, 11, 91, 127, 227, 813, 105, 901, 6861, 10627, 18425, 2553, 102503, 83167}},
+{18865, 18, 91911, {1, 3, 3, 13, 17, 63, 83, 163, 451, 659, 1995, 2283, 6297, 8097, 20935, 6017, 4977, 5045}},
+{18866, 18, 91965, {1, 1, 5, 13, 27, 47, 103, 129, 259, 975, 391, 2343, 6639, 1385, 30187, 35401, 74321, 24751}},
+{18867, 18, 91971, {1, 3, 1, 13, 1, 57, 37, 65, 57, 413, 63, 3819, 5915, 3925, 20777, 48539, 3019, 54965}},
+{18868, 18, 91988, {1, 1, 7, 3, 7, 13, 91, 33, 143, 489, 657, 3127, 707, 10841, 11307, 37855, 92697, 119189}},
+{18869, 18, 91992, {1, 1, 3, 11, 25, 47, 11, 57, 463, 693, 55, 501, 3765, 15443, 12917, 61677, 97145, 213637}},
+{18870, 18, 92004, {1, 3, 1, 1, 13, 49, 13, 225, 101, 475, 627, 1447, 7587, 11335, 3599, 20795, 72915, 174663}},
+{18871, 18, 92021, {1, 3, 7, 5, 31, 15, 115, 255, 329, 365, 959, 3399, 4695, 14537, 1447, 17391, 88557, 130213}},
+{18872, 18, 92035, {1, 1, 1, 9, 25, 47, 29, 173, 29, 149, 291, 691, 7621, 7607, 20769, 7149, 27323, 57689}},
+{18873, 18, 92068, {1, 3, 5, 15, 3, 61, 119, 247, 25, 495, 1297, 1119, 8011, 16077, 21567, 30559, 88455, 68763}},
+{18874, 18, 92098, {1, 1, 7, 1, 11, 47, 109, 115, 313, 517, 1951, 3319, 337, 11793, 22345, 33457, 47383, 213893}},
+{18875, 18, 92104, {1, 1, 5, 11, 11, 53, 103, 237, 383, 927, 421, 4085, 3327, 169, 9941, 24753, 65437, 108173}},
+{18876, 18, 92121, {1, 1, 5, 11, 17, 59, 107, 53, 479, 143, 825, 2667, 5219, 6143, 11573, 33637, 124981, 98195}},
+{18877, 18, 92127, {1, 3, 3, 13, 3, 17, 61, 129, 475, 585, 1611, 1791, 7817, 4099, 20437, 51411, 130173, 220085}},
+{18878, 18, 92151, {1, 3, 3, 3, 27, 25, 33, 255, 361, 967, 1415, 3213, 3341, 15875, 32359, 53267, 27665, 178301}},
+{18879, 18, 92162, {1, 1, 5, 3, 13, 9, 91, 187, 173, 525, 1675, 2217, 4093, 2009, 16917, 18485, 104849, 163233}},
+{18880, 18, 92186, {1, 1, 1, 11, 3, 17, 125, 157, 9, 429, 1573, 2257, 7943, 9893, 5611, 64619, 4509, 200181}},
+{18881, 18, 92191, {1, 3, 1, 1, 3, 9, 83, 53, 315, 85, 1093, 2621, 663, 12369, 317, 6089, 16479, 225071}},
+{18882, 18, 92192, {1, 3, 3, 1, 25, 47, 57, 45, 219, 45, 945, 3989, 4889, 8989, 381, 52483, 57029, 253899}},
+{18883, 18, 92207, {1, 3, 3, 5, 3, 61, 75, 189, 53, 489, 553, 2381, 7485, 9941, 29733, 2611, 74119, 203647}},
+{18884, 18, 92260, {1, 3, 1, 11, 27, 63, 53, 61, 59, 613, 465, 867, 1985, 7605, 14301, 53847, 68547, 14717}},
+{18885, 18, 92282, {1, 3, 5, 11, 5, 41, 51, 11, 59, 761, 59, 267, 7273, 3061, 11223, 48825, 117869, 158551}},
+{18886, 18, 92288, {1, 3, 7, 1, 31, 47, 111, 43, 435, 997, 135, 3369, 6439, 5637, 13629, 13221, 90607, 86359}},
+{18887, 18, 92297, {1, 1, 1, 11, 23, 51, 109, 223, 495, 765, 1557, 3545, 305, 4949, 23931, 45115, 12121, 14487}},
+{18888, 18, 92303, {1, 3, 5, 9, 5, 25, 41, 249, 27, 375, 1339, 3647, 3529, 2077, 21091, 45523, 67191, 1257}},
+{18889, 18, 92315, {1, 1, 3, 7, 13, 15, 63, 45, 187, 761, 1245, 3381, 1817, 2491, 16469, 64417, 87333, 143103}},
+{18890, 18, 92322, {1, 1, 3, 13, 11, 33, 87, 11, 279, 689, 1047, 3935, 5359, 11309, 19735, 33259, 12347, 183653}},
+{18891, 18, 92327, {1, 1, 5, 7, 5, 49, 109, 221, 455, 167, 785, 1859, 4337, 14937, 209, 23435, 22923, 172985}},
+{18892, 18, 92341, {1, 3, 7, 9, 13, 7, 127, 117, 147, 741, 531, 2627, 2565, 11083, 30577, 42471, 77065, 120983}},
+{18893, 18, 92389, {1, 1, 7, 1, 5, 61, 115, 203, 15, 305, 1005, 2085, 2597, 4371, 11661, 33219, 53657, 40325}},
+{18894, 18, 92390, {1, 3, 7, 13, 13, 15, 69, 167, 369, 747, 1115, 1493, 4881, 2693, 32281, 27089, 56821, 121693}},
+{18895, 18, 92422, {1, 3, 5, 3, 19, 51, 101, 29, 411, 509, 847, 1033, 4135, 15561, 7045, 60757, 48479, 247295}},
+{18896, 18, 92439, {1, 1, 5, 3, 27, 47, 103, 123, 413, 71, 689, 2113, 4347, 1983, 25727, 20095, 3271, 133081}},
+{18897, 18, 92452, {1, 1, 3, 3, 5, 39, 87, 27, 505, 631, 689, 2591, 1955, 3205, 12681, 10821, 13343, 101505}},
+{18898, 18, 92470, {1, 3, 7, 9, 31, 23, 103, 223, 499, 721, 13, 1399, 7369, 3945, 27727, 7923, 60265, 197793}},
+{18899, 18, 92473, {1, 3, 3, 5, 27, 7, 119, 23, 371, 495, 1583, 3913, 5139, 12151, 17477, 10907, 121775, 13369}},
+{18900, 18, 92493, {1, 3, 7, 1, 19, 53, 91, 235, 161, 97, 37, 1115, 5909, 1943, 8137, 1541, 16253, 252151}},
+{18901, 18, 92508, {1, 3, 7, 5, 3, 1, 107, 241, 187, 253, 1225, 2827, 4191, 2749, 25629, 47465, 19969, 45035}},
+{18902, 18, 92517, {1, 3, 1, 5, 1, 29, 47, 233, 175, 313, 793, 2089, 6235, 6595, 27599, 20505, 63379, 8729}},
+{18903, 18, 92529, {1, 3, 7, 11, 15, 9, 87, 113, 389, 1, 1057, 3307, 3455, 1847, 1497, 28115, 92897, 2383}},
+{18904, 18, 92551, {1, 3, 7, 13, 19, 59, 45, 59, 49, 273, 1619, 1975, 5949, 9951, 7685, 52559, 42377, 29855}},
+{18905, 18, 92557, {1, 1, 3, 9, 19, 7, 119, 35, 85, 37, 269, 3443, 8015, 8061, 6001, 19123, 70643, 115513}},
+{18906, 18, 92596, {1, 1, 3, 15, 3, 19, 83, 171, 259, 207, 1495, 513, 5455, 4071, 27471, 15773, 66301, 228743}},
+{18907, 18, 92611, {1, 3, 7, 9, 3, 27, 93, 3, 471, 13, 677, 4067, 1941, 15345, 26629, 29419, 121593, 108669}},
+{18908, 18, 92613, {1, 3, 7, 15, 29, 43, 97, 41, 15, 181, 1969, 1901, 7237, 3879, 19337, 17659, 17957, 164667}},
+{18909, 18, 92642, {1, 3, 1, 1, 25, 33, 7, 41, 387, 469, 795, 781, 113, 4161, 29687, 32225, 73905, 137879}},
+{18910, 18, 92666, {1, 1, 3, 13, 9, 59, 89, 23, 393, 111, 1957, 719, 6179, 16183, 31331, 48015, 32147, 31691}},
+{18911, 18, 92684, {1, 3, 7, 5, 9, 45, 73, 219, 181, 51, 717, 1813, 2581, 1395, 17595, 23689, 89709, 201451}},
+{18912, 18, 92723, {1, 3, 7, 3, 1, 21, 15, 35, 131, 515, 803, 1429, 3855, 349, 11795, 26787, 6109, 117745}},
+{18913, 18, 92732, {1, 3, 3, 9, 7, 11, 57, 15, 491, 371, 1787, 85, 577, 11455, 27419, 20687, 2493, 209993}},
+{18914, 18, 92738, {1, 3, 7, 15, 5, 5, 87, 197, 93, 643, 247, 31, 357, 7377, 10509, 29883, 42747, 248861}},
+{18915, 18, 92783, {1, 3, 3, 3, 29, 33, 47, 253, 485, 25, 2003, 2953, 1629, 11549, 5697, 1135, 117761, 96411}},
+{18916, 18, 92808, {1, 3, 5, 1, 29, 5, 27, 187, 235, 423, 41, 1855, 4359, 15627, 28409, 49331, 37735, 68823}},
+{18917, 18, 92816, {1, 1, 5, 5, 21, 61, 67, 85, 41, 671, 1617, 3867, 7913, 1693, 18487, 1831, 100971, 168191}},
+{18918, 18, 92835, {1, 1, 7, 3, 1, 61, 111, 87, 55, 229, 217, 2801, 563, 13617, 9641, 22247, 16039, 113541}},
+{18919, 18, 92847, {1, 3, 5, 7, 5, 29, 67, 99, 91, 561, 1203, 643, 2607, 13421, 29695, 31925, 82985, 69031}},
+{18920, 18, 92879, {1, 1, 1, 1, 27, 7, 63, 107, 269, 163, 1711, 587, 5657, 15077, 24709, 10235, 95483, 94799}},
+{18921, 18, 92881, {1, 3, 3, 5, 29, 5, 127, 137, 67, 609, 1657, 1131, 959, 15773, 17295, 58575, 96525, 80529}},
+{18922, 18, 92884, {1, 3, 7, 7, 25, 15, 89, 93, 145, 695, 367, 2853, 3073, 4867, 26823, 31467, 94769, 9145}},
+{18923, 18, 92932, {1, 1, 7, 15, 15, 5, 1, 225, 57, 381, 1295, 2525, 1493, 2401, 91, 19809, 32803, 195289}},
+{18924, 18, 92935, {1, 3, 3, 7, 29, 51, 29, 63, 249, 107, 1689, 3703, 7227, 6967, 27861, 39167, 20043, 218827}},
+{18925, 18, 92960, {1, 1, 3, 13, 17, 1, 77, 143, 167, 255, 1709, 2089, 7465, 4805, 16185, 15167, 20493, 240855}},
+{18926, 18, 92990, {1, 1, 5, 1, 11, 43, 107, 175, 93, 955, 615, 2923, 3637, 7451, 18847, 53467, 12463, 127249}},
+{18927, 18, 93010, {1, 1, 3, 13, 31, 1, 61, 113, 479, 777, 1805, 3625, 6299, 12221, 29599, 60175, 31165, 122815}},
+{18928, 18, 93025, {1, 3, 3, 11, 11, 29, 89, 129, 195, 337, 1843, 2769, 1747, 7137, 9901, 18459, 25215, 70609}},
+{18929, 18, 93046, {1, 1, 3, 7, 17, 35, 55, 81, 413, 25, 1505, 2185, 3121, 11435, 17885, 12543, 36767, 64039}},
+{18930, 18, 93085, {1, 3, 1, 13, 25, 9, 83, 25, 5, 49, 1975, 3967, 4135, 13213, 26479, 63913, 14921, 96193}},
+{18931, 18, 93089, {1, 3, 7, 5, 17, 15, 101, 47, 245, 821, 1275, 3343, 5471, 5045, 31741, 3319, 8141, 95501}},
+{18932, 18, 93096, {1, 3, 1, 13, 1, 5, 105, 39, 175, 439, 1625, 249, 4859, 12449, 30529, 45669, 49071, 214037}},
+{18933, 18, 93145, {1, 1, 7, 7, 17, 21, 83, 123, 261, 559, 1967, 2933, 4417, 8331, 10119, 21793, 128729, 187247}},
+{18934, 18, 93155, {1, 1, 7, 9, 15, 43, 77, 231, 241, 419, 503, 3335, 927, 2567, 31259, 52453, 114441, 257449}},
+{18935, 18, 93169, {1, 3, 3, 1, 9, 29, 21, 89, 311, 185, 519, 271, 3595, 8951, 6105, 64593, 38209, 120491}},
+{18936, 18, 93179, {1, 1, 7, 9, 1, 57, 65, 5, 275, 615, 801, 2839, 2851, 15609, 28731, 31223, 87725, 437}},
+{18937, 18, 93184, {1, 3, 3, 5, 29, 3, 67, 53, 17, 499, 263, 651, 7963, 5371, 11593, 34761, 57427, 84979}},
+{18938, 18, 93204, {1, 3, 7, 11, 15, 9, 33, 165, 313, 659, 909, 969, 2309, 2197, 27263, 35273, 52887, 236107}},
+{18939, 18, 93211, {1, 1, 7, 1, 13, 17, 29, 3, 329, 573, 619, 1013, 6947, 7031, 30773, 41129, 116481, 184233}},
+{18940, 18, 93213, {1, 1, 5, 9, 13, 5, 87, 235, 63, 759, 1143, 1861, 3783, 2735, 26191, 64387, 3651, 119447}},
+{18941, 18, 93227, {1, 1, 3, 7, 15, 41, 117, 135, 273, 655, 251, 1859, 4363, 14725, 29385, 6269, 91505, 82679}},
+{18942, 18, 93285, {1, 3, 7, 3, 13, 21, 21, 9, 121, 899, 199, 1973, 7437, 9771, 26647, 30909, 118573, 152913}},
+{18943, 18, 93292, {1, 3, 3, 9, 31, 43, 5, 249, 109, 183, 161, 1185, 4025, 10331, 20983, 28549, 122687, 183429}},
+{18944, 18, 93320, {1, 3, 7, 7, 11, 45, 111, 99, 487, 971, 597, 1555, 273, 10403, 25289, 45483, 35845, 35791}},
+{18945, 18, 93356, {1, 1, 1, 7, 11, 49, 125, 229, 279, 289, 1945, 3575, 5683, 15659, 31123, 12517, 79303, 255797}},
+{18946, 18, 93371, {1, 3, 1, 15, 9, 23, 61, 53, 383, 855, 1743, 407, 4401, 7507, 26307, 56205, 110943, 184183}},
+{18947, 18, 93374, {1, 3, 5, 13, 23, 29, 101, 243, 417, 925, 1267, 257, 5893, 4335, 6309, 43519, 126035, 99205}},
+{18948, 18, 93385, {1, 3, 1, 5, 5, 35, 83, 25, 31, 455, 1799, 2919, 7037, 11829, 12239, 12969, 108469, 89513}},
+{18949, 18, 93403, {1, 3, 5, 9, 17, 29, 61, 217, 183, 131, 425, 4025, 7141, 5445, 21497, 10603, 53423, 5701}},
+{18950, 18, 93406, {1, 1, 1, 15, 27, 35, 9, 139, 261, 43, 587, 3835, 4627, 11689, 15739, 6031, 73547, 134271}},
+{18951, 18, 93427, {1, 1, 3, 3, 25, 15, 7, 225, 29, 785, 2047, 2219, 6083, 7973, 17053, 56167, 83915, 87597}},
+{18952, 18, 93451, {1, 3, 7, 15, 13, 43, 85, 121, 421, 867, 1895, 2437, 6003, 5269, 8625, 26877, 100023, 110229}},
+{18953, 18, 93454, {1, 3, 3, 3, 25, 49, 121, 1, 125, 353, 1811, 1575, 3925, 13897, 26087, 24977, 105995, 242817}},
+{18954, 18, 93472, {1, 1, 1, 9, 31, 55, 71, 241, 439, 927, 955, 109, 7779, 2397, 18797, 34177, 1255, 178671}},
+{18955, 18, 93482, {1, 1, 7, 7, 5, 15, 99, 225, 49, 407, 1711, 4027, 4845, 9209, 20983, 33969, 14205, 9351}},
+{18956, 18, 93507, {1, 3, 5, 1, 9, 13, 113, 143, 97, 189, 929, 1163, 2261, 9761, 30011, 32911, 117043, 169493}},
+{18957, 18, 93537, {1, 1, 3, 5, 9, 35, 95, 77, 5, 95, 1745, 2013, 7009, 5427, 18969, 2771, 5099, 52939}},
+{18958, 18, 93562, {1, 3, 7, 9, 13, 19, 31, 189, 367, 569, 95, 1665, 6231, 2169, 22589, 8427, 116097, 41077}},
+{18959, 18, 93564, {1, 3, 7, 3, 31, 61, 45, 233, 327, 541, 87, 3449, 2767, 12237, 17747, 53827, 80389, 121489}},
+{18960, 18, 93608, {1, 3, 7, 15, 31, 1, 49, 73, 157, 131, 553, 3417, 5283, 4737, 31675, 63213, 43689, 261869}},
+{18961, 18, 93636, {1, 3, 7, 1, 3, 5, 113, 43, 343, 39, 135, 1555, 7955, 9851, 30983, 21955, 34871, 147649}},
+{18962, 18, 93640, {1, 3, 5, 3, 5, 27, 15, 179, 141, 983, 265, 2651, 5907, 10501, 6275, 29629, 115965, 125745}},
+{18963, 18, 93653, {1, 3, 7, 13, 1, 1, 81, 105, 309, 457, 1817, 3435, 4615, 1181, 27835, 26075, 63447, 44701}},
+{18964, 18, 93654, {1, 1, 5, 5, 25, 19, 85, 103, 409, 323, 2001, 3719, 3403, 1301, 19615, 47829, 109905, 65777}},
+{18965, 18, 93664, {1, 3, 5, 3, 21, 15, 47, 75, 467, 273, 1885, 3929, 1877, 5209, 6881, 34431, 35663, 100205}},
+{18966, 18, 93676, {1, 1, 5, 3, 3, 9, 47, 143, 471, 653, 1011, 2263, 3673, 11921, 31207, 50365, 27177, 214377}},
+{18967, 18, 93721, {1, 3, 1, 15, 3, 43, 81, 253, 495, 139, 679, 2207, 4603, 5269, 27133, 46461, 120783, 185595}},
+{18968, 18, 93740, {1, 1, 7, 3, 13, 3, 109, 197, 477, 101, 859, 1035, 777, 10153, 15581, 22715, 17493, 120851}},
+{18969, 18, 93743, {1, 3, 1, 3, 23, 5, 121, 67, 265, 935, 741, 3311, 541, 1093, 1639, 5941, 5587, 150345}},
+{18970, 18, 93745, {1, 3, 1, 5, 3, 13, 65, 173, 493, 303, 359, 3813, 6007, 1105, 12185, 10431, 17117, 164899}},
+{18971, 18, 93751, {1, 3, 3, 1, 25, 33, 71, 181, 149, 7, 333, 1981, 2981, 14683, 10997, 63373, 22605, 119681}},
+{18972, 18, 93770, {1, 1, 1, 15, 29, 35, 89, 21, 281, 175, 587, 3117, 7221, 8239, 26399, 49133, 65895, 142175}},
+{18973, 18, 93796, {1, 3, 7, 15, 9, 9, 35, 161, 65, 749, 421, 3575, 6307, 2029, 11423, 63901, 102049, 26333}},
+{18974, 18, 93820, {1, 3, 1, 13, 1, 45, 97, 41, 231, 245, 271, 1497, 3119, 6225, 21665, 12113, 67315, 62779}},
+{18975, 18, 93824, {1, 1, 1, 7, 3, 29, 119, 193, 179, 353, 1015, 2803, 6869, 7653, 22309, 53421, 86969, 115549}},
+{18976, 18, 93833, {1, 3, 3, 5, 17, 37, 49, 129, 195, 537, 1237, 2775, 6683, 699, 19181, 61125, 27483, 175645}},
+{18977, 18, 93841, {1, 3, 7, 3, 7, 49, 107, 41, 285, 335, 1415, 4015, 1301, 6525, 32429, 9337, 87923, 176751}},
+{18978, 18, 93847, {1, 1, 5, 9, 21, 43, 91, 25, 225, 311, 417, 303, 2629, 3609, 29987, 28647, 104173, 52383}},
+{18979, 18, 93848, {1, 3, 5, 9, 13, 47, 75, 143, 109, 173, 503, 3843, 1767, 9433, 10009, 5653, 87339, 212975}},
+{18980, 18, 93854, {1, 3, 1, 13, 13, 55, 123, 95, 499, 245, 1875, 3661, 7661, 6927, 21003, 51729, 88089, 89063}},
+{18981, 18, 93882, {1, 1, 3, 1, 31, 7, 93, 35, 169, 191, 1079, 2137, 4401, 1563, 20021, 9101, 66881, 231589}},
+{18982, 18, 93943, {1, 3, 1, 15, 21, 41, 75, 231, 459, 701, 1715, 2581, 4445, 5877, 4765, 1037, 15827, 189529}},
+{18983, 18, 93958, {1, 3, 5, 13, 17, 23, 41, 133, 143, 297, 1335, 3907, 7745, 5139, 9397, 5765, 5347, 243091}},
+{18984, 18, 93972, {1, 1, 5, 13, 7, 15, 31, 183, 315, 153, 785, 2723, 97, 14361, 10509, 17717, 46615, 133289}},
+{18985, 18, 93975, {1, 3, 7, 9, 13, 3, 75, 103, 445, 409, 603, 201, 1873, 9277, 23953, 6881, 64327, 196771}},
+{18986, 18, 94003, {1, 1, 7, 13, 15, 21, 73, 183, 419, 997, 857, 1373, 3855, 417, 10175, 5253, 66509, 15731}},
+{18987, 18, 94009, {1, 3, 3, 9, 19, 7, 15, 119, 497, 25, 1165, 105, 2605, 15097, 28241, 2269, 519, 235655}},
+{18988, 18, 94020, {1, 3, 3, 9, 27, 9, 103, 205, 97, 317, 1621, 971, 931, 9099, 24583, 12695, 122399, 78021}},
+{18989, 18, 94072, {1, 1, 3, 5, 27, 45, 41, 239, 87, 603, 317, 3507, 7677, 9141, 26721, 40225, 80515, 205263}},
+{18990, 18, 94081, {1, 1, 3, 1, 25, 3, 63, 165, 41, 783, 291, 1997, 3769, 1881, 30613, 18821, 86175, 38837}},
+{18991, 18, 94093, {1, 1, 3, 5, 17, 19, 95, 17, 357, 587, 689, 3127, 6999, 6703, 23923, 55945, 97629, 210177}},
+{18992, 18, 94102, {1, 1, 3, 15, 21, 55, 63, 229, 397, 1007, 779, 2105, 681, 10659, 26679, 681, 115901, 83627}},
+{18993, 18, 94122, {1, 1, 7, 11, 25, 9, 47, 133, 109, 17, 697, 749, 5529, 9289, 29675, 2631, 15247, 13913}},
+{18994, 18, 94135, {1, 1, 7, 7, 3, 55, 29, 13, 467, 889, 675, 1187, 3301, 13721, 13783, 44559, 78177, 114219}},
+{18995, 18, 94136, {1, 3, 5, 13, 15, 11, 77, 71, 313, 427, 1385, 2007, 4003, 1529, 4797, 12289, 24897, 129513}},
+{18996, 18, 94150, {1, 1, 3, 11, 9, 47, 103, 253, 345, 659, 1109, 3493, 2515, 5669, 30551, 25077, 97393, 252689}},
+{18997, 18, 94184, {1, 3, 7, 9, 25, 19, 69, 161, 365, 51, 1365, 1045, 4319, 10035, 15529, 23251, 44359, 62163}},
+{18998, 18, 94187, {1, 3, 1, 7, 3, 25, 119, 33, 19, 561, 659, 2741, 6177, 899, 30911, 9627, 83003, 12939}},
+{18999, 18, 94258, {1, 3, 7, 1, 13, 37, 19, 161, 427, 621, 1045, 1963, 6067, 4439, 32507, 32775, 5201, 144645}},
+{19000, 18, 94264, {1, 1, 5, 7, 31, 17, 89, 239, 317, 109, 1827, 1395, 1587, 14813, 29911, 63545, 22939, 235383}},
+{19001, 18, 94272, {1, 1, 7, 15, 1, 17, 41, 123, 405, 539, 1063, 1443, 4611, 1847, 24107, 29365, 85859, 218601}},
+{19002, 18, 94278, {1, 1, 5, 13, 21, 27, 101, 223, 245, 705, 1579, 679, 5461, 8955, 15031, 7731, 31219, 165033}},
+{19003, 18, 94281, {1, 1, 7, 11, 19, 29, 13, 223, 179, 481, 761, 1543, 3195, 10695, 17147, 37577, 130901, 44699}},
+{19004, 18, 94317, {1, 1, 7, 3, 19, 53, 49, 1, 393, 583, 1183, 2817, 1293, 12949, 15491, 44467, 86261, 220439}},
+{19005, 18, 94348, {1, 3, 7, 15, 15, 47, 7, 125, 467, 511, 1207, 3787, 5575, 5359, 3859, 29933, 104627, 243073}},
+{19006, 18, 94376, {1, 1, 1, 13, 27, 25, 17, 243, 477, 457, 1835, 2859, 1023, 10107, 26829, 49853, 114569, 250471}},
+{19007, 18, 94382, {1, 3, 1, 15, 11, 43, 15, 235, 431, 671, 1935, 1143, 4121, 15403, 19313, 15919, 111961, 50455}},
+{19008, 18, 94387, {1, 3, 3, 3, 11, 45, 107, 143, 353, 671, 1259, 1599, 6075, 10645, 9131, 28133, 58679, 29883}},
+{19009, 18, 94389, {1, 3, 5, 15, 15, 43, 29, 171, 303, 71, 1751, 411, 7615, 12063, 26829, 31469, 34335, 3163}},
+{19010, 18, 94393, {1, 1, 7, 7, 25, 63, 25, 25, 27, 671, 505, 1235, 1985, 2593, 30031, 3251, 94729, 248911}},
+{19011, 18, 94402, {1, 1, 3, 1, 19, 15, 125, 133, 133, 209, 1749, 2091, 6325, 1275, 5675, 2249, 22631, 56293}},
+{19012, 18, 94421, {1, 1, 5, 1, 19, 27, 25, 99, 211, 739, 565, 3903, 7701, 7547, 12303, 5421, 24663, 22807}},
+{19013, 18, 94422, {1, 3, 5, 13, 5, 45, 99, 67, 21, 269, 851, 3333, 4555, 12483, 14645, 44757, 99047, 198521}},
+{19014, 18, 94431, {1, 1, 5, 13, 19, 1, 123, 87, 109, 799, 591, 2997, 1005, 16369, 10329, 34541, 100935, 200397}},
+{19015, 18, 94473, {1, 3, 5, 1, 13, 51, 93, 23, 19, 23, 965, 171, 6865, 3561, 23255, 44295, 87405, 222269}},
+{19016, 18, 94487, {1, 1, 3, 5, 1, 53, 25, 129, 123, 737, 271, 61, 113, 8481, 27075, 58633, 21499, 156689}},
+{19017, 18, 94504, {1, 3, 3, 11, 3, 43, 11, 123, 243, 1015, 1389, 3663, 1725, 6933, 5315, 7137, 127705, 56607}},
+{19018, 18, 94510, {1, 1, 5, 13, 7, 23, 43, 103, 503, 173, 267, 1509, 3311, 9553, 28851, 15771, 28741, 236427}},
+{19019, 18, 94522, {1, 1, 5, 15, 27, 43, 119, 3, 13, 107, 317, 3725, 6669, 4945, 30485, 10155, 96893, 154081}},
+{19020, 18, 94532, {1, 3, 7, 5, 11, 21, 61, 99, 155, 45, 569, 1325, 673, 15803, 12047, 55431, 9515, 106969}},
+{19021, 18, 94572, {1, 1, 7, 11, 27, 49, 121, 145, 105, 223, 1471, 1163, 3889, 4213, 21195, 45649, 14663, 82799}},
+{19022, 18, 94589, {1, 1, 3, 3, 31, 21, 17, 85, 31, 695, 1591, 2465, 907, 11621, 29681, 13131, 77187, 175913}},
+{19023, 18, 94599, {1, 3, 5, 5, 21, 49, 77, 229, 359, 825, 1851, 1223, 3351, 5349, 30971, 20797, 26975, 94425}},
+{19024, 18, 94603, {1, 1, 3, 1, 3, 63, 23, 219, 503, 47, 1675, 1641, 5257, 8035, 29793, 30093, 44897, 235691}},
+{19025, 18, 94647, {1, 1, 7, 9, 27, 37, 109, 33, 511, 203, 1195, 3281, 407, 15237, 28485, 21379, 106325, 231755}},
+{19026, 18, 94665, {1, 3, 1, 3, 9, 45, 19, 31, 255, 799, 909, 767, 421, 3301, 18557, 15043, 48505, 36763}},
+{19027, 18, 94695, {1, 3, 7, 13, 1, 45, 59, 233, 319, 265, 517, 1571, 4593, 12813, 30729, 19517, 70345, 142411}},
+{19028, 18, 94716, {1, 1, 1, 13, 17, 15, 79, 93, 265, 381, 285, 253, 919, 3715, 30555, 38801, 30439, 51511}},
+{19029, 18, 94738, {1, 1, 7, 15, 25, 39, 71, 57, 145, 487, 1655, 2589, 7655, 8413, 24537, 36761, 36427, 88929}},
+{19030, 18, 94740, {1, 1, 3, 3, 29, 41, 61, 191, 97, 849, 911, 3269, 5425, 13997, 7749, 537, 113705, 179765}},
+{19031, 18, 94778, {1, 1, 5, 9, 13, 55, 33, 221, 27, 521, 13, 2847, 6035, 8397, 6579, 29353, 101953, 88983}},
+{19032, 18, 94803, {1, 3, 3, 13, 31, 47, 97, 177, 373, 353, 159, 249, 4741, 7427, 8353, 38617, 13857, 122081}},
+{19033, 18, 94810, {1, 3, 5, 15, 13, 21, 1, 239, 369, 253, 1009, 1927, 5111, 2219, 28167, 32013, 51487, 210521}},
+{19034, 18, 94815, {1, 3, 5, 9, 17, 21, 37, 105, 405, 39, 321, 1515, 3759, 15469, 13643, 60157, 72127, 233505}},
+{19035, 18, 94821, {1, 3, 7, 5, 1, 3, 3, 125, 283, 757, 829, 2303, 3715, 6027, 17795, 37359, 54721, 5891}},
+{19036, 18, 94862, {1, 3, 7, 15, 27, 63, 117, 101, 341, 965, 1543, 51, 3397, 14051, 9889, 64647, 111169, 249477}},
+{19037, 18, 94886, {1, 1, 5, 13, 5, 29, 51, 61, 233, 685, 751, 163, 2319, 14691, 29881, 39029, 57093, 240147}},
+{19038, 18, 94900, {1, 3, 5, 3, 9, 21, 107, 147, 263, 471, 621, 3485, 197, 13271, 24689, 64341, 110163, 142711}},
+{19039, 18, 94924, {1, 3, 1, 7, 1, 23, 17, 31, 131, 631, 795, 3751, 5337, 9151, 2873, 31113, 65303, 244969}},
+{19040, 18, 94952, {1, 1, 5, 11, 3, 51, 93, 155, 389, 859, 1181, 2711, 1375, 6119, 229, 47767, 115521, 114129}},
+{19041, 18, 94963, {1, 3, 3, 15, 5, 7, 29, 187, 259, 911, 1537, 1885, 6139, 4549, 21655, 58771, 1003, 124609}},
+{19042, 18, 94970, {1, 1, 3, 15, 25, 45, 97, 217, 331, 305, 1105, 3465, 3651, 10171, 31601, 6947, 4545, 232627}},
+{19043, 18, 94980, {1, 1, 5, 5, 9, 53, 109, 201, 473, 201, 1113, 973, 1825, 13089, 1207, 9947, 92515, 216199}},
+{19044, 18, 94992, {1, 3, 7, 3, 1, 49, 25, 109, 249, 489, 1663, 3493, 4615, 13899, 27851, 60711, 14351, 41787}},
+{19045, 18, 95017, {1, 3, 3, 7, 3, 15, 29, 53, 61, 669, 371, 2187, 6769, 4623, 25785, 12997, 52263, 28387}},
+{19046, 18, 95028, {1, 1, 1, 3, 9, 31, 69, 3, 441, 219, 285, 183, 1971, 10903, 8271, 19389, 61913, 203537}},
+{19047, 18, 95031, {1, 1, 5, 3, 9, 63, 117, 131, 53, 525, 1349, 2701, 1317, 6047, 1661, 51785, 93199, 158645}},
+{19048, 18, 95035, {1, 3, 5, 3, 21, 61, 11, 91, 317, 635, 61, 1919, 2139, 12817, 6587, 63201, 52659, 8971}},
+{19049, 18, 95040, {1, 3, 1, 9, 11, 47, 49, 35, 115, 711, 511, 835, 3787, 837, 15737, 7467, 53263, 132047}},
+{19050, 18, 95058, {1, 1, 5, 3, 27, 47, 121, 211, 65, 363, 1067, 3813, 6353, 13701, 23943, 7573, 112721, 219587}},
+{19051, 18, 95079, {1, 1, 3, 7, 21, 39, 15, 199, 113, 517, 1429, 1399, 6007, 1389, 16425, 17709, 1231, 51803}},
+{19052, 18, 95122, {1, 3, 5, 11, 5, 37, 35, 97, 215, 281, 517, 1777, 4171, 10161, 18369, 23233, 83005, 75519}},
+{19053, 18, 95149, {1, 3, 7, 9, 3, 9, 69, 111, 135, 351, 971, 3551, 3739, 3571, 22861, 62669, 83723, 10707}},
+{19054, 18, 95150, {1, 3, 3, 5, 31, 35, 103, 205, 321, 553, 409, 363, 4085, 7735, 5513, 64249, 127883, 147839}},
+{19055, 18, 95167, {1, 1, 7, 3, 23, 35, 85, 231, 251, 237, 421, 757, 7081, 11247, 24941, 22649, 51111, 157383}},
+{19056, 18, 95175, {1, 3, 7, 5, 23, 35, 7, 101, 491, 529, 1437, 489, 5057, 12955, 27543, 60903, 104151, 42545}},
+{19057, 18, 95205, {1, 1, 3, 15, 23, 53, 85, 89, 247, 269, 1555, 3789, 467, 11145, 11751, 44343, 120117, 9975}},
+{19058, 18, 95229, {1, 1, 5, 3, 29, 49, 123, 179, 311, 45, 1839, 2725, 7307, 5525, 32075, 7979, 107751, 133677}},
+{19059, 18, 95321, {1, 1, 5, 3, 31, 21, 65, 229, 31, 597, 755, 2653, 2699, 2075, 11693, 28953, 55811, 13653}},
+{19060, 18, 95345, {1, 1, 1, 7, 25, 51, 119, 21, 245, 493, 407, 2997, 4255, 15487, 26359, 24153, 42955, 142191}},
+{19061, 18, 95364, {1, 1, 5, 3, 27, 61, 13, 209, 13, 401, 399, 2909, 3623, 8057, 21301, 32273, 112127, 210221}},
+{19062, 18, 95379, {1, 3, 5, 13, 3, 19, 121, 19, 57, 583, 947, 3591, 5283, 10831, 20429, 54097, 7559, 112465}},
+{19063, 18, 95386, {1, 3, 5, 1, 21, 1, 125, 245, 217, 165, 1319, 2119, 4641, 9481, 4147, 7079, 119015, 128401}},
+{19064, 18, 95395, {1, 1, 5, 3, 3, 31, 25, 63, 17, 191, 497, 819, 1515, 11215, 24961, 7679, 125801, 239521}},
+{19065, 18, 95416, {1, 1, 5, 1, 3, 25, 27, 43, 37, 863, 739, 2585, 773, 799, 17649, 21171, 123541, 164777}},
+{19066, 18, 95419, {1, 3, 5, 7, 7, 25, 15, 251, 305, 159, 1941, 3655, 2881, 15123, 10911, 35541, 62221, 175845}},
+{19067, 18, 95433, {1, 1, 1, 9, 19, 5, 103, 1, 417, 951, 139, 2413, 2983, 15471, 9495, 41349, 110175, 29501}},
+{19068, 18, 95464, {1, 1, 1, 5, 29, 53, 95, 173, 211, 803, 1599, 4093, 5559, 15855, 12271, 12583, 102221, 203453}},
+{19069, 18, 95490, {1, 3, 5, 5, 19, 43, 31, 175, 493, 289, 1865, 2925, 3833, 11327, 23337, 62669, 99485, 230583}},
+{19070, 18, 95496, {1, 3, 3, 11, 11, 25, 95, 215, 501, 421, 725, 1571, 2133, 2761, 8649, 45359, 88851, 55057}},
+{19071, 18, 95504, {1, 1, 7, 7, 21, 45, 69, 63, 399, 929, 1431, 3397, 3613, 14595, 10417, 62913, 106283, 120869}},
+{19072, 18, 95513, {1, 3, 7, 15, 13, 45, 11, 177, 125, 611, 1115, 2441, 2689, 12517, 8989, 34991, 23789, 51543}},
+{19073, 18, 95523, {1, 1, 3, 1, 3, 15, 5, 125, 511, 137, 1919, 2953, 5267, 3543, 5485, 7463, 130407, 255945}},
+{19074, 18, 95525, {1, 1, 3, 7, 7, 21, 95, 97, 51, 91, 813, 2819, 2839, 12041, 26197, 20143, 51403, 171337}},
+{19075, 18, 95558, {1, 1, 1, 1, 7, 27, 15, 125, 441, 387, 1869, 2157, 5863, 581, 893, 58827, 104063, 93735}},
+{19076, 18, 95572, {1, 3, 3, 7, 27, 9, 79, 97, 465, 207, 931, 2809, 2225, 13749, 18819, 30605, 9829, 130743}},
+{19077, 18, 95591, {1, 3, 5, 13, 31, 41, 19, 147, 293, 725, 297, 397, 1343, 12669, 15339, 58599, 12113, 149835}},
+{19078, 18, 95609, {1, 3, 3, 13, 27, 13, 121, 253, 349, 229, 915, 1673, 3819, 77, 20691, 53823, 78265, 138743}},
+{19079, 18, 95619, {1, 1, 5, 5, 29, 41, 65, 235, 123, 871, 1809, 3013, 3531, 1551, 8441, 23481, 58729, 117639}},
+{19080, 18, 95625, {1, 1, 7, 5, 23, 55, 89, 81, 201, 313, 1307, 2427, 2025, 8543, 26631, 58655, 122095, 247579}},
+{19081, 18, 95633, {1, 3, 1, 5, 3, 63, 89, 219, 449, 9, 1771, 2915, 5925, 13773, 26119, 61309, 65107, 33001}},
+{19082, 18, 95649, {1, 3, 7, 1, 27, 11, 25, 221, 139, 665, 1543, 2157, 7617, 9135, 567, 64985, 88749, 54223}},
+{19083, 18, 95652, {1, 1, 3, 9, 13, 41, 7, 99, 483, 115, 1499, 3343, 7207, 1805, 16031, 63707, 8555, 90959}},
+{19084, 18, 95655, {1, 3, 1, 9, 15, 53, 41, 239, 295, 47, 1645, 1095, 5163, 7739, 26635, 28245, 9315, 100629}},
+{19085, 18, 95696, {1, 3, 1, 5, 1, 19, 69, 5, 171, 669, 673, 633, 6895, 7571, 11539, 25133, 99235, 7991}},
+{19086, 18, 95721, {1, 3, 5, 11, 21, 37, 63, 77, 281, 307, 1711, 2671, 1315, 14683, 28757, 22751, 56477, 190805}},
+{19087, 18, 95766, {1, 3, 3, 5, 15, 1, 5, 21, 199, 161, 655, 1263, 3315, 16051, 2409, 773, 9075, 121265}},
+{19088, 18, 95772, {1, 3, 3, 3, 7, 23, 71, 195, 11, 263, 1845, 165, 3489, 447, 11315, 23861, 110949, 78909}},
+{19089, 18, 95775, {1, 1, 7, 5, 1, 53, 37, 9, 439, 135, 909, 457, 6993, 11401, 14065, 30795, 56149, 168013}},
+{19090, 18, 95794, {1, 1, 1, 15, 23, 37, 13, 87, 113, 251, 233, 725, 7757, 14399, 3023, 54277, 87879, 54053}},
+{19091, 18, 95796, {1, 3, 5, 11, 11, 57, 109, 171, 171, 17, 343, 2749, 6525, 9735, 11715, 23783, 54439, 82819}},
+{19092, 18, 95818, {1, 1, 1, 15, 3, 47, 73, 237, 399, 301, 947, 2055, 1909, 14105, 26893, 47805, 25, 172957}},
+{19093, 18, 95820, {1, 1, 7, 7, 11, 27, 93, 167, 117, 637, 351, 319, 4605, 12897, 31001, 39655, 53551, 246113}},
+{19094, 18, 95832, {1, 3, 5, 15, 3, 37, 25, 9, 421, 519, 257, 3251, 1649, 4069, 999, 59367, 112383, 32095}},
+{19095, 18, 95842, {1, 3, 7, 7, 25, 57, 11, 37, 271, 545, 1213, 1927, 6471, 5145, 22995, 51051, 126981, 260457}},
+{19096, 18, 95851, {1, 3, 5, 11, 1, 61, 77, 201, 395, 199, 477, 103, 4069, 7003, 26371, 49145, 103839, 195661}},
+{19097, 18, 95854, {1, 3, 3, 9, 13, 41, 25, 125, 161, 371, 179, 351, 7169, 7179, 21627, 57793, 104679, 158583}},
+{19098, 18, 95859, {1, 3, 7, 11, 5, 7, 111, 163, 201, 783, 189, 273, 2751, 13917, 28501, 18261, 12755, 15521}},
+{19099, 18, 95868, {1, 1, 5, 7, 3, 37, 121, 209, 503, 299, 1301, 3703, 2321, 99, 14953, 28087, 85059, 256911}},
+{19100, 18, 95881, {1, 3, 3, 13, 3, 29, 95, 249, 383, 971, 1291, 13, 1587, 3447, 26477, 15837, 111141, 73899}},
+{19101, 18, 95895, {1, 1, 7, 1, 17, 57, 31, 1, 219, 329, 19, 3841, 1829, 5179, 14945, 6625, 3783, 200583}},
+{19102, 18, 95943, {1, 3, 1, 3, 1, 31, 23, 17, 209, 383, 297, 3065, 4323, 7847, 30189, 56541, 57535, 24853}},
+{19103, 18, 95949, {1, 1, 3, 11, 31, 35, 125, 141, 251, 79, 161, 775, 2455, 6959, 26433, 39145, 26563, 665}},
+{19104, 18, 95978, {1, 1, 7, 1, 11, 9, 9, 211, 231, 723, 1337, 1713, 3779, 2001, 23451, 27107, 64297, 254943}},
+{19105, 18, 95980, {1, 3, 7, 15, 21, 55, 19, 159, 449, 837, 1259, 1851, 5061, 355, 21531, 63479, 114657, 139265}},
+{19106, 18, 96010, {1, 1, 1, 3, 11, 55, 103, 179, 363, 567, 421, 981, 7221, 2077, 19339, 1155, 67019, 218231}},
+{19107, 18, 96020, {1, 1, 7, 11, 3, 43, 55, 161, 347, 995, 1555, 3251, 1605, 13313, 4499, 19361, 60145, 71593}},
+{19108, 18, 96024, {1, 1, 5, 3, 9, 15, 119, 213, 455, 241, 857, 683, 1247, 13085, 23919, 20365, 16303, 73263}},
+{19109, 18, 96063, {1, 1, 3, 13, 25, 17, 45, 193, 375, 289, 1381, 3629, 3015, 15883, 20633, 7431, 108787, 233297}},
+{19110, 18, 96108, {1, 1, 1, 15, 21, 57, 105, 91, 233, 961, 1623, 3849, 711, 3857, 32657, 5935, 85113, 38287}},
+{19111, 18, 96125, {1, 3, 3, 3, 15, 31, 97, 217, 335, 385, 1661, 3927, 6849, 137, 28871, 56485, 32777, 260033}},
+{19112, 18, 96154, {1, 1, 3, 13, 5, 61, 19, 255, 123, 481, 1865, 1815, 3047, 173, 25363, 1277, 6453, 174405}},
+{19113, 18, 96172, {1, 3, 7, 13, 27, 9, 19, 21, 433, 857, 1931, 2927, 629, 7733, 13503, 48263, 67517, 26495}},
+{19114, 18, 96189, {1, 1, 1, 3, 5, 43, 61, 239, 81, 585, 187, 1123, 3319, 8699, 20925, 40815, 76575, 169383}},
+{19115, 18, 96204, {1, 3, 3, 3, 9, 49, 71, 225, 95, 365, 645, 237, 7829, 5727, 17031, 58971, 71415, 232423}},
+{19116, 18, 96219, {1, 3, 5, 9, 25, 49, 113, 47, 105, 609, 1557, 2099, 2129, 8663, 24811, 25505, 38153, 185821}},
+{19117, 18, 96256, {1, 3, 5, 13, 23, 55, 107, 17, 309, 807, 635, 1007, 6207, 3363, 7607, 25013, 4141, 171509}},
+{19118, 18, 96261, {1, 1, 1, 13, 27, 35, 31, 89, 109, 879, 1845, 3999, 5415, 8777, 9605, 29703, 28149, 36469}},
+{19119, 18, 96289, {1, 3, 1, 3, 13, 3, 51, 31, 479, 549, 1245, 2033, 961, 13893, 21829, 32791, 109497, 187425}},
+{19120, 18, 96292, {1, 1, 5, 3, 19, 5, 25, 187, 173, 869, 201, 3851, 7369, 6229, 16577, 45623, 19859, 209855}},
+{19121, 18, 96296, {1, 1, 7, 9, 1, 9, 53, 47, 289, 557, 999, 141, 3789, 3087, 30217, 24221, 81431, 157507}},
+{19122, 18, 96324, {1, 1, 3, 9, 1, 25, 11, 73, 155, 155, 621, 4047, 6759, 5641, 28147, 8523, 69439, 92613}},
+{19123, 18, 96345, {1, 3, 1, 5, 25, 23, 41, 79, 71, 793, 1381, 307, 7863, 16289, 28783, 5299, 128481, 222799}},
+{19124, 18, 96346, {1, 1, 7, 1, 17, 33, 117, 111, 15, 249, 1397, 1349, 4883, 6009, 3179, 33509, 56355, 31937}},
+{19125, 18, 96358, {1, 3, 5, 13, 29, 15, 41, 185, 91, 501, 571, 2889, 6901, 3875, 3737, 23657, 101587, 261181}},
+{19126, 18, 96386, {1, 1, 7, 9, 21, 49, 33, 143, 19, 203, 75, 1353, 585, 7719, 11311, 48989, 10803, 51743}},
+{19127, 18, 96412, {1, 1, 7, 13, 23, 31, 103, 209, 375, 817, 1461, 3657, 7931, 15893, 15065, 28721, 54299, 71147}},
+{19128, 18, 96428, {1, 3, 7, 7, 7, 25, 37, 173, 355, 499, 247, 459, 7701, 2219, 11703, 20631, 128857, 125367}},
+{19129, 18, 96445, {1, 1, 3, 5, 25, 61, 43, 135, 451, 667, 547, 443, 5071, 12671, 26975, 20131, 101545, 115281}},
+{19130, 18, 96446, {1, 3, 3, 5, 9, 19, 75, 133, 211, 585, 1283, 3397, 3181, 65, 20213, 47725, 101883, 194749}},
+{19131, 18, 96448, {1, 1, 1, 1, 19, 13, 75, 135, 111, 641, 765, 1631, 4711, 241, 15125, 38233, 95535, 177965}},
+{19132, 18, 96458, {1, 1, 7, 13, 31, 1, 91, 61, 299, 35, 1327, 3903, 6193, 5589, 6331, 6321, 105741, 89639}},
+{19133, 18, 96475, {1, 3, 3, 15, 1, 55, 11, 39, 171, 713, 973, 1827, 3487, 13057, 30775, 16881, 124989, 208193}},
+{19134, 18, 96482, {1, 3, 7, 1, 21, 29, 19, 75, 397, 755, 1601, 2907, 6861, 10377, 23127, 2443, 86545, 3841}},
+{19135, 18, 96494, {1, 3, 1, 11, 25, 33, 53, 195, 343, 425, 1523, 3051, 3115, 3205, 3457, 20521, 39187, 33307}},
+{19136, 18, 96502, {1, 3, 5, 1, 25, 23, 47, 5, 133, 511, 1549, 2691, 7861, 4987, 2877, 38693, 37491, 22481}},
+{19137, 18, 96508, {1, 1, 5, 15, 5, 55, 125, 231, 11, 451, 1443, 3865, 4115, 2379, 13675, 29953, 85721, 114859}},
+{19138, 18, 96511, {1, 3, 1, 15, 19, 37, 29, 75, 483, 785, 1933, 2435, 1811, 2787, 32653, 23159, 80993, 26867}},
+{19139, 18, 96516, {1, 1, 1, 15, 7, 27, 53, 99, 11, 693, 1085, 743, 939, 6461, 6391, 45913, 94037, 217039}},
+{19140, 18, 96520, {1, 3, 3, 9, 19, 37, 93, 77, 363, 125, 1675, 347, 5599, 7771, 23549, 39945, 106931, 127959}},
+{19141, 18, 96547, {1, 3, 1, 5, 27, 47, 107, 85, 31, 621, 1529, 2349, 7055, 889, 4663, 1705, 40011, 214775}},
+{19142, 18, 96556, {1, 3, 1, 5, 11, 47, 35, 13, 139, 783, 1009, 845, 4139, 14713, 24191, 17597, 124923, 219657}},
+{19143, 18, 96561, {1, 1, 7, 3, 3, 25, 63, 207, 361, 587, 763, 3027, 6523, 6783, 11203, 57313, 115397, 149921}},
+{19144, 18, 96568, {1, 1, 7, 1, 21, 55, 109, 183, 487, 869, 195, 83, 3675, 13103, 12383, 63519, 48379, 256443}},
+{19145, 18, 96581, {1, 3, 7, 13, 9, 21, 29, 163, 105, 871, 747, 2459, 7383, 439, 5223, 1655, 1469, 50345}},
+{19146, 18, 96582, {1, 3, 1, 1, 15, 63, 37, 159, 385, 795, 1369, 1973, 6119, 6027, 23913, 52475, 80827, 198261}},
+{19147, 18, 96679, {1, 3, 3, 11, 15, 5, 121, 231, 43, 907, 1621, 3895, 5075, 10865, 3123, 49657, 69827, 215813}},
+{19148, 18, 96683, {1, 3, 1, 15, 7, 41, 75, 105, 87, 899, 629, 1699, 5861, 9279, 30107, 37443, 7555, 64461}},
+{19149, 18, 96717, {1, 3, 1, 7, 9, 15, 119, 127, 121, 621, 1117, 1659, 605, 13705, 31181, 40063, 17257, 77645}},
+{19150, 18, 96754, {1, 1, 5, 5, 3, 37, 95, 237, 379, 375, 903, 257, 4425, 14191, 9185, 57133, 82067, 73521}},
+{19151, 18, 96769, {1, 1, 7, 15, 1, 43, 63, 45, 121, 669, 1775, 179, 7385, 3557, 17261, 379, 24759, 214831}},
+{19152, 18, 96799, {1, 1, 3, 9, 31, 5, 43, 153, 451, 573, 1623, 2831, 4483, 7219, 27657, 47111, 58165, 145799}},
+{19153, 18, 96805, {1, 1, 3, 11, 3, 11, 111, 83, 329, 807, 779, 1223, 6095, 7269, 22425, 19343, 11937, 10173}},
+{19154, 18, 96809, {1, 1, 1, 13, 27, 15, 7, 111, 37, 663, 51, 3759, 6321, 8253, 737, 59501, 109595, 177827}},
+{19155, 18, 96823, {1, 1, 3, 3, 29, 39, 79, 115, 307, 765, 331, 377, 1873, 14491, 11065, 11865, 76717, 29101}},
+{19156, 18, 96829, {1, 3, 7, 3, 21, 45, 97, 213, 309, 3, 483, 3933, 1043, 8519, 22517, 34675, 78819, 172479}},
+{19157, 18, 96832, {1, 3, 5, 3, 31, 51, 27, 137, 405, 427, 815, 43, 6551, 10971, 28589, 53077, 36639, 167661}},
+{19158, 18, 96850, {1, 3, 1, 3, 29, 5, 111, 19, 343, 21, 557, 4067, 1525, 12793, 11513, 48869, 78035, 171531}},
+{19159, 18, 96856, {1, 1, 5, 7, 25, 47, 53, 245, 135, 137, 1697, 2057, 3147, 15903, 26979, 2157, 43967, 207661}},
+{19160, 18, 96906, {1, 1, 5, 3, 25, 11, 15, 59, 511, 307, 757, 3275, 1299, 10373, 11943, 54169, 32417, 21645}},
+{19161, 18, 96962, {1, 3, 3, 11, 15, 15, 5, 137, 237, 741, 1613, 3565, 7359, 6181, 25953, 18137, 59759, 186693}},
+{19162, 18, 96974, {1, 3, 5, 3, 19, 13, 99, 167, 45, 71, 1683, 3635, 7603, 14879, 23903, 14795, 58395, 11853}},
+{19163, 18, 96979, {1, 3, 1, 7, 15, 45, 111, 111, 175, 567, 1031, 2255, 3895, 11861, 20195, 15461, 88411, 225713}},
+{19164, 18, 96997, {1, 1, 7, 3, 5, 5, 85, 65, 231, 643, 1591, 219, 2929, 4845, 29327, 14769, 46629, 131367}},
+{19165, 18, 96998, {1, 1, 5, 9, 29, 21, 47, 87, 113, 469, 1647, 2461, 3663, 5865, 6647, 41345, 39539, 220301}},
+{19166, 18, 97002, {1, 1, 5, 11, 9, 55, 5, 147, 141, 181, 283, 1695, 6537, 11095, 10385, 36013, 111653, 182273}},
+{19167, 18, 97054, {1, 1, 3, 5, 17, 45, 103, 253, 407, 151, 1585, 1585, 6661, 14579, 5723, 37641, 56813, 258819}},
+{19168, 18, 97064, {1, 3, 3, 3, 5, 63, 85, 201, 87, 419, 1993, 737, 5859, 6049, 17393, 9453, 65915, 1731}},
+{19169, 18, 97067, {1, 1, 3, 3, 3, 27, 97, 135, 137, 731, 1559, 3409, 5973, 15981, 19833, 8419, 33273, 44155}},
+{19170, 18, 97110, {1, 3, 3, 9, 31, 55, 109, 191, 119, 59, 645, 1047, 7767, 8379, 13781, 52289, 31605, 186667}},
+{19171, 18, 97116, {1, 3, 1, 15, 9, 1, 23, 31, 23, 311, 1879, 1939, 5509, 14573, 10501, 38867, 39131, 231151}},
+{19172, 18, 97137, {1, 3, 7, 1, 31, 33, 33, 19, 475, 723, 795, 1793, 6639, 14349, 16639, 31473, 110411, 95703}},
+{19173, 18, 97138, {1, 1, 5, 9, 11, 3, 39, 119, 455, 839, 513, 2423, 2219, 6059, 6125, 60995, 117701, 204057}},
+{19174, 18, 97143, {1, 1, 1, 9, 5, 23, 87, 33, 59, 241, 1427, 3867, 1091, 14683, 21651, 7091, 38011, 63809}},
+{19175, 18, 97183, {1, 1, 7, 15, 15, 23, 75, 227, 415, 1015, 2033, 1311, 6659, 5093, 14799, 65331, 96989, 170395}},
+{19176, 18, 97187, {1, 3, 5, 15, 25, 61, 33, 179, 503, 875, 1853, 257, 6727, 9117, 16777, 29585, 110901, 231617}},
+{19177, 18, 97190, {1, 1, 1, 15, 13, 53, 73, 151, 315, 887, 669, 3959, 5279, 1461, 15497, 40107, 9595, 252059}},
+{19178, 18, 97202, {1, 3, 7, 13, 17, 45, 43, 61, 99, 555, 981, 3255, 6385, 8723, 24451, 45243, 68617, 171911}},
+{19179, 18, 97219, {1, 3, 3, 11, 1, 29, 97, 219, 341, 597, 503, 773, 3777, 5431, 4581, 37169, 57269, 186377}},
+{19180, 18, 97239, {1, 3, 1, 11, 15, 49, 119, 189, 279, 821, 1541, 1343, 4379, 5833, 26537, 29769, 121125, 202553}},
+{19181, 18, 97245, {1, 3, 5, 9, 19, 23, 5, 197, 323, 101, 1155, 7, 5933, 3111, 19595, 36807, 40147, 153}},
+{19182, 18, 97246, {1, 1, 5, 11, 17, 9, 83, 51, 185, 415, 367, 1431, 7803, 8253, 16283, 54545, 99733, 57777}},
+{19183, 18, 97249, {1, 1, 5, 7, 5, 31, 41, 13, 33, 531, 1381, 781, 1699, 6321, 18125, 34567, 113253, 104181}},
+{19184, 18, 97264, {1, 3, 1, 5, 1, 59, 37, 239, 343, 395, 121, 2181, 2485, 13825, 19127, 22689, 103023, 198213}},
+{19185, 18, 97267, {1, 3, 1, 15, 29, 17, 11, 27, 413, 273, 1805, 2845, 8147, 10301, 5423, 29859, 85243, 190379}},
+{19186, 18, 97269, {1, 3, 1, 15, 7, 61, 29, 135, 273, 951, 725, 1345, 4231, 13651, 31291, 6081, 85735, 96023}},
+{19187, 18, 97274, {1, 1, 3, 11, 15, 29, 81, 129, 245, 295, 527, 3905, 4323, 5447, 21253, 51177, 105105, 48323}},
+{19188, 18, 97282, {1, 1, 3, 13, 13, 45, 71, 43, 383, 95, 1689, 639, 4631, 15113, 28053, 49247, 128303, 183999}},
+{19189, 18, 97287, {1, 1, 1, 3, 19, 31, 93, 35, 369, 765, 1201, 1625, 7683, 8719, 13843, 42723, 62323, 49431}},
+{19190, 18, 97294, {1, 3, 3, 11, 5, 39, 49, 217, 109, 63, 1753, 2489, 6017, 403, 16657, 59577, 80255, 66071}},
+{19191, 18, 97299, {1, 3, 5, 5, 11, 1, 79, 37, 261, 537, 1845, 3567, 3233, 16249, 9795, 2471, 69661, 118231}},
+{19192, 18, 97306, {1, 3, 3, 1, 19, 61, 35, 253, 31, 19, 161, 2597, 5733, 8231, 26569, 38613, 121945, 137391}},
+{19193, 18, 97347, {1, 3, 7, 3, 15, 25, 125, 231, 187, 797, 1237, 1767, 1557, 1095, 13613, 43325, 33801, 127881}},
+{19194, 18, 97361, {1, 1, 1, 9, 23, 63, 75, 107, 311, 493, 471, 2985, 1861, 4285, 27125, 14961, 122567, 152033}},
+{19195, 18, 97371, {1, 3, 5, 7, 9, 7, 43, 117, 203, 727, 101, 3831, 3201, 2327, 4675, 12085, 25131, 211835}},
+{19196, 18, 97435, {1, 1, 7, 11, 17, 1, 5, 87, 291, 1023, 1345, 3879, 7739, 9201, 19573, 20037, 128711, 187263}},
+{19197, 18, 97466, {1, 1, 3, 13, 25, 39, 71, 251, 365, 617, 1539, 2121, 3803, 8003, 23393, 56991, 56143, 223453}},
+{19198, 18, 97473, {1, 3, 5, 13, 25, 61, 71, 139, 319, 399, 903, 3063, 3667, 275, 13297, 25285, 120417, 169613}},
+{19199, 18, 97474, {1, 3, 1, 9, 9, 41, 59, 213, 195, 705, 313, 2313, 4993, 323, 24049, 30527, 27287, 80489}},
+{19200, 18, 97559, {1, 1, 5, 1, 29, 57, 107, 161, 217, 295, 721, 3857, 1935, 14981, 12243, 38541, 51177, 248889}},
+{19201, 18, 97565, {1, 1, 1, 15, 5, 25, 95, 137, 11, 215, 971, 1573, 4341, 4725, 8201, 33147, 87687, 187405}},
+{19202, 18, 97587, {1, 3, 3, 9, 9, 13, 31, 3, 175, 309, 145, 2265, 4863, 7199, 23881, 15445, 123753, 126653}},
+{19203, 18, 97611, {1, 1, 7, 3, 7, 43, 51, 191, 21, 639, 939, 691, 7823, 10529, 7757, 9291, 115045, 51539}},
+{19204, 18, 97622, {1, 1, 7, 13, 7, 45, 91, 173, 73, 779, 1647, 2059, 1373, 16027, 4611, 45787, 699, 78905}},
+{19205, 18, 97625, {1, 1, 5, 15, 5, 23, 123, 45, 265, 1009, 235, 1343, 5779, 209, 23263, 63163, 26079, 240905}},
+{19206, 18, 97632, {1, 1, 1, 11, 19, 31, 75, 105, 71, 21, 1361, 2125, 6949, 2111, 10333, 61881, 112811, 85723}},
+{19207, 18, 97635, {1, 3, 5, 7, 27, 17, 95, 35, 503, 181, 1885, 1097, 6019, 13745, 15009, 26343, 117727, 93017}},
+{19208, 18, 97652, {1, 1, 3, 11, 27, 41, 109, 23, 365, 283, 1509, 3269, 5969, 14567, 27715, 429, 65813, 169391}},
+{19209, 18, 97672, {1, 1, 5, 9, 11, 1, 23, 143, 401, 61, 993, 3029, 1901, 12947, 10439, 48661, 113863, 9353}},
+{19210, 18, 97678, {1, 3, 7, 3, 15, 27, 123, 51, 403, 569, 75, 3837, 8167, 10875, 29861, 44133, 52385, 185515}},
+{19211, 18, 97683, {1, 3, 3, 15, 15, 45, 3, 77, 439, 265, 103, 3715, 7889, 9241, 26511, 19063, 108239, 237233}},
+{19212, 18, 97695, {1, 1, 5, 13, 7, 47, 7, 185, 155, 833, 1895, 1103, 6761, 4307, 19551, 2371, 41079, 207663}},
+{19213, 18, 97705, {1, 1, 3, 7, 1, 49, 79, 127, 149, 383, 919, 3787, 6703, 8823, 15551, 28397, 11497, 144227}},
+{19214, 18, 97713, {1, 1, 7, 15, 7, 5, 9, 161, 425, 275, 1943, 3003, 3615, 1417, 587, 20949, 9651, 101257}},
+{19215, 18, 97719, {1, 3, 5, 11, 31, 11, 113, 201, 113, 889, 867, 3537, 7173, 3403, 4713, 29709, 50127, 55893}},
+{19216, 18, 97757, {1, 3, 7, 11, 11, 17, 123, 97, 3, 1009, 1567, 3261, 8053, 4639, 24493, 64085, 73975, 123965}},
+{19217, 18, 97761, {1, 1, 7, 1, 31, 7, 111, 137, 427, 615, 865, 2243, 3603, 5943, 1639, 22213, 81977, 77283}},
+{19218, 18, 97762, {1, 1, 5, 11, 25, 63, 5, 19, 67, 469, 621, 2831, 1635, 11859, 23143, 29189, 43955, 87475}},
+{19219, 18, 97771, {1, 3, 7, 15, 7, 61, 125, 207, 401, 567, 1943, 2645, 641, 15427, 24467, 41767, 122591, 48905}},
+{19220, 18, 97795, {1, 3, 3, 5, 1, 61, 65, 169, 329, 489, 435, 1719, 491, 6189, 18383, 34973, 90611, 180991}},
+{19221, 18, 97809, {1, 3, 7, 9, 25, 43, 115, 11, 289, 193, 263, 3885, 4881, 15669, 19757, 20073, 119873, 67069}},
+{19222, 18, 97826, {1, 1, 7, 11, 3, 45, 93, 115, 233, 891, 1541, 2557, 2115, 2237, 4253, 30445, 32983, 86185}},
+{19223, 18, 97845, {1, 3, 7, 3, 29, 23, 105, 51, 157, 505, 773, 2403, 1237, 5193, 32725, 53331, 66377, 25745}},
+{19224, 18, 97877, {1, 3, 5, 11, 31, 5, 111, 251, 287, 225, 913, 97, 3429, 15111, 10637, 18843, 102589, 229667}},
+{19225, 18, 97882, {1, 3, 7, 13, 21, 43, 27, 11, 265, 991, 1645, 1967, 2675, 3083, 2957, 65275, 7757, 201953}},
+{19226, 18, 97891, {1, 3, 7, 7, 23, 59, 37, 105, 113, 961, 1585, 855, 6037, 8461, 24057, 46861, 42421, 21061}},
+{19227, 18, 97903, {1, 1, 5, 1, 7, 45, 37, 147, 225, 793, 737, 753, 565, 5347, 15393, 42611, 39253, 246455}},
+{19228, 18, 97961, {1, 3, 3, 5, 29, 59, 125, 69, 283, 677, 1615, 3341, 219, 10753, 445, 43343, 117035, 137907}},
+{19229, 18, 97970, {1, 1, 5, 1, 19, 41, 93, 137, 481, 93, 703, 1211, 4051, 5591, 5913, 32831, 62027, 60519}},
+{19230, 18, 97975, {1, 1, 7, 13, 17, 63, 65, 147, 361, 83, 1383, 1761, 579, 9493, 2611, 6951, 12197, 81857}},
+{19231, 18, 97996, {1, 3, 3, 15, 11, 3, 25, 7, 221, 211, 1745, 1173, 5479, 12063, 5667, 43443, 4865, 193345}},
+{19232, 18, 98001, {1, 1, 5, 11, 31, 11, 71, 61, 57, 851, 1089, 1395, 4525, 1223, 27681, 14355, 23125, 257233}},
+{19233, 18, 98014, {1, 3, 1, 11, 25, 59, 17, 193, 229, 1005, 387, 3993, 2457, 4185, 18421, 1315, 125155, 142277}},
+{19234, 18, 98023, {1, 1, 5, 11, 13, 55, 123, 191, 5, 1023, 705, 3481, 367, 12961, 11917, 12131, 99109, 105093}},
+{19235, 18, 98035, {1, 1, 3, 11, 13, 29, 57, 57, 467, 19, 1409, 971, 3041, 13487, 24737, 3377, 97883, 248893}},
+{19236, 18, 98052, {1, 3, 7, 3, 3, 37, 109, 77, 201, 469, 39, 1747, 2027, 14781, 18821, 34647, 123865, 195097}},
+{19237, 18, 98059, {1, 3, 3, 5, 29, 27, 97, 217, 249, 141, 431, 1621, 539, 8945, 3443, 48227, 27867, 205355}},
+{19238, 18, 98061, {1, 1, 3, 13, 7, 57, 65, 167, 103, 511, 239, 325, 1793, 2811, 14223, 40999, 12589, 149759}},
+{19239, 18, 98086, {1, 3, 5, 11, 3, 1, 61, 87, 283, 29, 507, 3473, 2685, 13829, 32337, 8413, 12201, 152309}},
+{19240, 18, 98098, {1, 3, 5, 15, 1, 23, 103, 173, 423, 915, 1519, 1859, 7341, 8689, 17141, 53769, 81189, 144305}},
+{19241, 18, 98117, {1, 1, 1, 5, 31, 41, 89, 117, 329, 245, 381, 3357, 1053, 15079, 3569, 27665, 65645, 259279}},
+{19242, 18, 98118, {1, 1, 7, 5, 3, 55, 91, 35, 463, 15, 1195, 533, 6013, 10755, 1919, 61169, 81285, 82757}},
+{19243, 18, 98132, {1, 3, 5, 11, 3, 29, 85, 169, 163, 733, 939, 3401, 3709, 3307, 17329, 56873, 10721, 174235}},
+{19244, 18, 98135, {1, 1, 5, 1, 11, 45, 75, 247, 435, 21, 1985, 2261, 7013, 4935, 2457, 41077, 53121, 143269}},
+{19245, 18, 98145, {1, 3, 3, 13, 17, 59, 43, 149, 27, 1, 367, 957, 5607, 2591, 22161, 10095, 73769, 52455}},
+{19246, 18, 98160, {1, 1, 3, 13, 15, 15, 121, 83, 469, 819, 1973, 3595, 2313, 1621, 3105, 42971, 7243, 98727}},
+{19247, 18, 98194, {1, 1, 5, 7, 21, 53, 123, 9, 119, 437, 1567, 431, 3647, 10967, 22037, 8523, 81279, 126473}},
+{19248, 18, 98205, {1, 1, 5, 13, 5, 23, 125, 119, 195, 555, 341, 2037, 313, 6323, 27201, 8377, 122793, 197781}},
+{19249, 18, 98210, {1, 3, 3, 5, 17, 25, 67, 237, 349, 443, 1529, 3541, 3105, 10105, 13409, 20165, 64597, 244513}},
+{19250, 18, 98224, {1, 1, 5, 1, 11, 43, 77, 245, 359, 625, 1171, 597, 3, 591, 2457, 20275, 75995, 204685}},
+{19251, 18, 98227, {1, 3, 1, 11, 5, 13, 99, 107, 285, 617, 1687, 2959, 4439, 771, 3103, 62363, 89437, 172221}},
+{19252, 18, 98254, {1, 3, 1, 11, 1, 63, 43, 85, 23, 95, 501, 1223, 669, 16101, 1071, 53175, 102101, 419}},
+{19253, 18, 98271, {1, 3, 1, 5, 19, 23, 63, 105, 289, 419, 885, 441, 5107, 4213, 8683, 1847, 113301, 240821}},
+{19254, 18, 98272, {1, 1, 1, 9, 9, 9, 111, 63, 53, 531, 517, 3463, 8171, 2645, 13883, 52213, 40707, 24637}},
+{19255, 18, 98302, {1, 3, 1, 5, 15, 43, 71, 215, 117, 685, 1819, 1105, 5805, 8875, 31093, 31077, 93807, 65631}},
+{19256, 18, 98320, {1, 1, 7, 7, 17, 15, 31, 87, 13, 615, 2003, 3461, 7585, 1947, 6693, 26141, 95059, 52229}},
+{19257, 18, 98346, {1, 1, 3, 5, 5, 55, 7, 41, 473, 541, 545, 2901, 763, 12731, 24715, 43301, 7981, 123961}},
+{19258, 18, 98356, {1, 3, 1, 11, 13, 29, 65, 47, 511, 931, 1681, 3813, 995, 4261, 32243, 21327, 33749, 52607}},
+{19259, 18, 98360, {1, 1, 3, 1, 27, 51, 19, 119, 71, 989, 485, 1483, 4115, 11743, 5513, 32447, 62599, 163185}},
+{19260, 18, 98366, {1, 3, 7, 13, 7, 5, 127, 67, 221, 773, 1641, 3763, 2061, 2025, 29813, 64385, 109219, 70149}},
+{19261, 18, 98478, {1, 1, 5, 15, 9, 29, 105, 245, 333, 11, 803, 1877, 6735, 3797, 1913, 63837, 23649, 234721}},
+{19262, 18, 98483, {1, 3, 7, 13, 11, 21, 113, 175, 385, 885, 1259, 983, 7715, 11889, 12515, 35723, 9897, 63415}},
+{19263, 18, 98486, {1, 1, 5, 9, 31, 63, 53, 51, 375, 133, 2021, 3173, 3861, 9885, 4117, 37505, 73687, 16411}},
+{19264, 18, 98497, {1, 3, 7, 7, 11, 13, 99, 235, 285, 159, 489, 917, 3033, 7711, 6545, 52893, 28549, 68791}},
+{19265, 18, 98528, {1, 1, 5, 11, 31, 15, 89, 157, 105, 347, 455, 3391, 5341, 16035, 11819, 57679, 48057, 147673}},
+{19266, 18, 98537, {1, 3, 1, 5, 21, 5, 1, 41, 213, 677, 1745, 2591, 6237, 14265, 5963, 30017, 47293, 199411}},
+{19267, 18, 98551, {1, 3, 1, 15, 19, 9, 65, 103, 489, 977, 579, 2571, 2827, 12971, 24445, 17963, 68829, 89781}},
+{19268, 18, 98557, {1, 3, 5, 7, 3, 45, 9, 223, 137, 749, 919, 2695, 7569, 6735, 16649, 55899, 91531, 10709}},
+{19269, 18, 98572, {1, 1, 5, 11, 25, 51, 81, 243, 473, 85, 1189, 2317, 785, 9307, 25555, 36623, 66881, 150945}},
+{19270, 18, 98575, {1, 1, 3, 7, 9, 17, 99, 57, 333, 891, 71, 2359, 2067, 13265, 30077, 17935, 47343, 22673}},
+{19271, 18, 98600, {1, 1, 5, 7, 13, 17, 77, 109, 427, 667, 1367, 2383, 7505, 11239, 14229, 35431, 35473, 62447}},
+{19272, 18, 98628, {1, 1, 1, 15, 27, 5, 51, 221, 471, 877, 449, 3961, 4197, 15713, 2955, 58985, 31431, 241539}},
+{19273, 18, 98635, {1, 1, 7, 1, 13, 61, 55, 199, 87, 679, 723, 271, 1061, 8043, 13163, 8079, 81501, 60467}},
+{19274, 18, 98645, {1, 1, 3, 3, 11, 1, 85, 65, 445, 731, 2017, 3113, 8085, 7133, 14789, 2435, 38459, 234997}},
+{19275, 18, 98652, {1, 3, 3, 9, 23, 31, 49, 137, 349, 651, 1975, 3429, 7137, 7841, 28297, 58209, 36493, 259097}},
+{19276, 18, 98655, {1, 1, 7, 15, 23, 11, 87, 133, 245, 445, 151, 4075, 141, 15395, 16649, 36925, 98421, 217265}},
+{19277, 18, 98665, {1, 3, 3, 5, 25, 53, 57, 177, 481, 177, 671, 1249, 2663, 12855, 24537, 31867, 110323, 164113}},
+{19278, 18, 98710, {1, 3, 5, 7, 23, 25, 19, 91, 447, 1023, 373, 3863, 4399, 12973, 7475, 37485, 8567, 53271}},
+{19279, 18, 98719, {1, 1, 5, 7, 31, 33, 31, 75, 223, 299, 1549, 1863, 353, 4339, 8891, 10365, 3399, 185807}},
+{19280, 18, 98720, {1, 1, 7, 9, 31, 53, 23, 203, 319, 915, 1923, 205, 3119, 7243, 25251, 12907, 101921, 102695}},
+{19281, 18, 98786, {1, 1, 7, 9, 15, 1, 123, 173, 123, 215, 263, 3003, 5881, 1117, 15195, 47457, 66663, 224177}},
+{19282, 18, 98792, {1, 1, 7, 13, 11, 25, 61, 121, 173, 115, 1897, 2145, 7783, 9673, 3321, 1707, 61475, 53875}},
+{19283, 18, 98806, {1, 3, 7, 3, 31, 21, 27, 99, 421, 225, 1565, 2351, 2275, 10583, 7877, 43505, 27629, 140919}},
+{19284, 18, 98816, {1, 3, 5, 5, 11, 45, 71, 105, 487, 867, 361, 3995, 2039, 1495, 27481, 4753, 20657, 67077}},
+{19285, 18, 98836, {1, 1, 5, 1, 19, 33, 1, 77, 377, 353, 719, 1463, 7053, 7409, 32165, 15557, 117673, 69887}},
+{19286, 18, 98859, {1, 1, 5, 7, 25, 5, 15, 231, 23, 213, 1627, 1801, 7793, 651, 9903, 51745, 111611, 39679}},
+{19287, 18, 98864, {1, 3, 3, 5, 23, 43, 37, 199, 437, 19, 1853, 2119, 461, 12641, 15865, 39941, 122545, 213443}},
+{19288, 18, 98879, {1, 3, 3, 11, 31, 45, 19, 227, 507, 909, 1501, 2021, 905, 1763, 1897, 3735, 81475, 30005}},
+{19289, 18, 98905, {1, 1, 5, 5, 29, 9, 55, 25, 23, 59, 593, 2197, 6029, 8235, 8397, 27521, 96221, 168837}},
+{19290, 18, 98917, {1, 3, 1, 15, 5, 33, 75, 121, 433, 557, 1011, 3785, 2545, 953, 17295, 14407, 94871, 60445}},
+{19291, 18, 98929, {1, 3, 3, 7, 7, 53, 29, 75, 171, 587, 1701, 3815, 2761, 4403, 39, 17291, 34897, 187257}},
+{19292, 18, 98969, {1, 3, 1, 15, 17, 57, 11, 95, 335, 13, 265, 1161, 7945, 6419, 26723, 31907, 89995, 82265}},
+{19293, 18, 98975, {1, 1, 7, 5, 9, 59, 27, 153, 37, 165, 823, 3525, 621, 4777, 3485, 9109, 116567, 34691}},
+{19294, 18, 98976, {1, 1, 5, 13, 23, 27, 11, 63, 35, 39, 995, 2101, 2611, 14139, 2683, 63787, 19813, 97497}},
+{19295, 18, 98981, {1, 3, 7, 15, 31, 15, 3, 163, 167, 53, 71, 1881, 4213, 3485, 21525, 705, 122345, 203549}},
+{19296, 18, 98999, {1, 3, 5, 5, 21, 33, 85, 133, 21, 505, 1639, 3989, 771, 7171, 21953, 34503, 31247, 247459}},
+{19297, 18, 99020, {1, 1, 7, 7, 31, 1, 27, 39, 469, 243, 679, 4091, 7137, 8505, 13329, 34139, 69485, 259795}},
+{19298, 18, 99026, {1, 3, 5, 5, 31, 43, 31, 161, 413, 657, 1407, 1417, 7349, 3301, 7691, 49355, 22929, 68043}},
+{19299, 18, 99054, {1, 1, 7, 11, 15, 61, 73, 217, 163, 503, 193, 3795, 41, 16251, 1187, 65363, 113211, 100337}},
+{19300, 18, 99083, {1, 3, 1, 11, 9, 15, 109, 187, 109, 865, 845, 1579, 321, 1269, 20613, 5693, 58421, 254959}},
+{19301, 18, 99093, {1, 3, 1, 13, 11, 3, 19, 135, 93, 779, 1383, 219, 2737, 377, 1125, 35663, 130815, 103797}},
+{19302, 18, 99103, {1, 1, 5, 11, 25, 25, 71, 249, 201, 679, 1677, 1817, 7619, 10327, 14821, 47847, 33629, 250979}},
+{19303, 18, 99131, {1, 1, 7, 15, 23, 19, 69, 39, 25, 843, 99, 3499, 2457, 11681, 30009, 17609, 46653, 162427}},
+{19304, 18, 99156, {1, 3, 3, 7, 23, 25, 77, 135, 61, 501, 1381, 3977, 1957, 11255, 16053, 30297, 58835, 97589}},
+{19305, 18, 99159, {1, 3, 5, 3, 9, 31, 9, 55, 421, 109, 1823, 1921, 7349, 2661, 4503, 36691, 48843, 182631}},
+{19306, 18, 99165, {1, 1, 1, 11, 7, 23, 107, 125, 393, 105, 1407, 3461, 4539, 6121, 7881, 32407, 83749, 98831}},
+{19307, 18, 99170, {1, 3, 3, 13, 5, 59, 5, 3, 185, 959, 241, 819, 1443, 1789, 12771, 26703, 25399, 182583}},
+{19308, 18, 99189, {1, 1, 1, 3, 3, 47, 7, 45, 93, 373, 175, 87, 649, 12903, 5029, 1945, 111967, 140889}},
+{19309, 18, 99223, {1, 3, 1, 11, 9, 47, 25, 191, 215, 845, 1557, 9, 3451, 5837, 11763, 29127, 113115, 99039}},
+{19310, 18, 99227, {1, 1, 1, 5, 23, 53, 45, 1, 361, 751, 807, 1765, 685, 2109, 28437, 60489, 65739, 234511}},
+{19311, 18, 99271, {1, 3, 3, 7, 15, 57, 71, 61, 195, 123, 1745, 3249, 351, 14309, 2017, 15653, 110803, 45937}},
+{19312, 18, 99277, {1, 3, 7, 9, 25, 11, 25, 29, 467, 313, 1927, 2423, 7311, 14299, 8145, 8123, 115103, 213881}},
+{19313, 18, 99278, {1, 1, 3, 15, 1, 35, 111, 99, 507, 417, 1433, 129, 5565, 13365, 18853, 8607, 109739, 120623}},
+{19314, 18, 99313, {1, 1, 1, 7, 13, 31, 93, 3, 327, 67, 1101, 1965, 5939, 6505, 3117, 3021, 33707, 79353}},
+{19315, 18, 99314, {1, 1, 3, 7, 15, 21, 23, 117, 367, 137, 287, 903, 4685, 13943, 26779, 24607, 70853, 99743}},
+{19316, 18, 99345, {1, 1, 7, 11, 25, 43, 67, 181, 459, 737, 1567, 3491, 5085, 6487, 23115, 62341, 102943, 77301}},
+{19317, 18, 99361, {1, 1, 3, 15, 7, 35, 81, 199, 455, 851, 835, 3421, 4675, 15173, 9205, 7305, 109849, 15183}},
+{19318, 18, 99367, {1, 3, 5, 11, 9, 55, 3, 53, 235, 271, 1265, 3681, 3627, 3485, 11591, 53097, 85949, 158173}},
+{19319, 18, 99386, {1, 3, 7, 3, 15, 27, 57, 183, 487, 9, 1797, 2973, 3687, 12987, 9133, 14595, 52067, 131217}},
+{19320, 18, 99394, {1, 1, 5, 3, 7, 25, 19, 215, 291, 325, 813, 577, 4249, 10373, 17233, 29557, 72979, 70721}},
+{19321, 18, 99417, {1, 3, 1, 7, 25, 1, 107, 167, 367, 303, 883, 993, 4189, 6557, 13697, 15251, 77065, 116127}},
+{19322, 18, 99418, {1, 3, 5, 11, 13, 59, 9, 121, 489, 593, 1503, 601, 5263, 13837, 20991, 35761, 45867, 155905}},
+{19323, 18, 99453, {1, 1, 3, 3, 19, 47, 127, 115, 267, 261, 969, 961, 5919, 10085, 29363, 4935, 100485, 75561}},
+{19324, 18, 99454, {1, 3, 1, 15, 11, 53, 39, 187, 53, 11, 1951, 913, 965, 2565, 5457, 3237, 24923, 245681}},
+{19325, 18, 99477, {1, 1, 7, 3, 15, 5, 25, 45, 17, 45, 1317, 1853, 6627, 15879, 29935, 24749, 118149, 35359}},
+{19326, 18, 99518, {1, 1, 7, 1, 21, 45, 67, 71, 25, 743, 925, 3441, 3013, 1613, 6321, 12491, 119931, 164701}},
+{19327, 18, 99544, {1, 1, 7, 1, 13, 15, 35, 187, 91, 995, 401, 2443, 4183, 10823, 20589, 27413, 117095, 20359}},
+{19328, 18, 99559, {1, 3, 3, 7, 15, 51, 55, 167, 409, 859, 719, 3223, 2457, 16013, 13639, 4027, 79339, 225113}},
+{19329, 18, 99592, {1, 3, 1, 9, 3, 29, 105, 193, 279, 27, 1093, 2199, 6983, 619, 10163, 40365, 71015, 102191}},
+{19330, 18, 99597, {1, 1, 3, 9, 29, 5, 33, 247, 27, 299, 2017, 379, 6199, 15047, 18329, 3493, 47679, 76703}},
+{19331, 18, 99603, {1, 3, 5, 5, 9, 19, 51, 129, 157, 831, 1373, 653, 7489, 13125, 1815, 10915, 88679, 50269}},
+{19332, 18, 99621, {1, 3, 3, 9, 9, 49, 79, 11, 181, 679, 1697, 3707, 205, 13305, 6293, 56653, 42619, 116257}},
+{19333, 18, 99646, {1, 1, 5, 9, 23, 41, 17, 135, 145, 715, 257, 1561, 6941, 2411, 31459, 25055, 35807, 51579}},
+{19334, 18, 99693, {1, 1, 1, 7, 11, 13, 49, 155, 403, 569, 751, 2959, 425, 13949, 22047, 49829, 71925, 101647}},
+{19335, 18, 99722, {1, 1, 3, 15, 15, 15, 17, 213, 113, 395, 1999, 2039, 3623, 13255, 24435, 54487, 78773, 202637}},
+{19336, 18, 99760, {1, 3, 7, 9, 5, 21, 61, 165, 97, 349, 1131, 2677, 333, 13129, 2137, 22909, 95795, 143081}},
+{19337, 18, 99780, {1, 1, 1, 5, 31, 41, 109, 179, 295, 475, 639, 3929, 1841, 7545, 19411, 52573, 10173, 236769}},
+{19338, 18, 99789, {1, 1, 1, 5, 27, 51, 9, 217, 393, 671, 931, 433, 7303, 16295, 6727, 5703, 88241, 132665}},
+{19339, 18, 99804, {1, 1, 7, 13, 21, 33, 19, 241, 497, 519, 1413, 489, 4975, 1345, 24925, 40383, 110815, 136217}},
+{19340, 18, 99823, {1, 3, 1, 9, 7, 51, 79, 15, 15, 601, 997, 3713, 7829, 903, 12393, 60059, 42057, 175141}},
+{19341, 18, 99826, {1, 1, 5, 15, 9, 63, 107, 63, 495, 591, 207, 779, 8069, 3013, 23839, 3075, 127481, 193885}},
+{19342, 18, 99832, {1, 1, 1, 7, 13, 17, 121, 171, 99, 59, 1043, 1109, 1337, 1179, 27635, 34063, 12945, 1431}},
+{19343, 18, 99842, {1, 3, 1, 3, 5, 47, 101, 205, 157, 595, 263, 3887, 7015, 4693, 15211, 25381, 128803, 227233}},
+{19344, 18, 99851, {1, 1, 3, 11, 17, 33, 1, 19, 153, 603, 119, 2305, 4041, 4011, 19849, 761, 52807, 129811}},
+{19345, 18, 99862, {1, 3, 7, 15, 21, 7, 13, 225, 497, 459, 389, 911, 6349, 5059, 6363, 41915, 90687, 214501}},
+{19346, 18, 99871, {1, 3, 1, 15, 1, 39, 31, 83, 147, 629, 185, 1913, 3217, 959, 651, 65267, 108613, 20391}},
+{19347, 18, 99899, {1, 3, 1, 7, 9, 11, 29, 201, 245, 815, 1869, 2597, 5693, 15669, 23293, 30885, 4029, 225737}},
+{19348, 18, 99940, {1, 3, 5, 11, 7, 29, 119, 207, 499, 23, 1563, 3645, 3839, 2509, 24043, 64231, 22509, 221835}},
+{19349, 18, 99983, {1, 3, 3, 7, 11, 49, 13, 201, 353, 217, 831, 2803, 1521, 12989, 25339, 41035, 2125, 165271}},
+{19350, 18, 99985, {1, 1, 5, 11, 1, 45, 93, 29, 55, 1007, 1919, 241, 5931, 9211, 17291, 39849, 25453, 96077}},
+{19351, 18, 100025, {1, 3, 1, 1, 29, 43, 11, 105, 331, 693, 1363, 291, 8191, 7813, 14135, 38287, 15469, 256913}},
+{19352, 18, 100043, {1, 3, 5, 11, 19, 21, 23, 117, 253, 111, 733, 3785, 5835, 423, 30251, 27283, 79561, 162095}},
+{19353, 18, 100070, {1, 3, 3, 1, 9, 19, 83, 13, 37, 725, 1597, 1117, 8067, 8085, 1315, 41813, 8973, 175525}},
+{19354, 18, 100076, {1, 1, 5, 3, 13, 39, 3, 213, 335, 907, 1143, 1729, 601, 11255, 24351, 41045, 11335, 186221}},
+{19355, 18, 100084, {1, 3, 3, 9, 17, 11, 29, 33, 303, 815, 1607, 2403, 8095, 4213, 16697, 64733, 24439, 93081}},
+{19356, 18, 100096, {1, 1, 1, 3, 13, 37, 35, 181, 243, 645, 1915, 3521, 569, 3005, 7271, 32755, 64575, 119813}},
+{19357, 18, 100105, {1, 1, 5, 13, 25, 59, 77, 121, 459, 755, 385, 1893, 1227, 9957, 5069, 40063, 27261, 4703}},
+{19358, 18, 100108, {1, 3, 1, 3, 29, 41, 95, 255, 219, 21, 317, 3021, 2615, 5101, 19413, 25795, 6521, 157749}},
+{19359, 18, 100123, {1, 3, 3, 5, 7, 33, 7, 205, 415, 23, 1431, 117, 1605, 9541, 11825, 49195, 86341, 99673}},
+{19360, 18, 100132, {1, 3, 3, 5, 17, 37, 33, 209, 49, 161, 321, 3697, 6483, 12859, 895, 675, 1899, 260289}},
+{19361, 18, 100141, {1, 1, 3, 15, 1, 27, 83, 125, 309, 553, 505, 2209, 4931, 2593, 28253, 12879, 74971, 9047}},
+{19362, 18, 100181, {1, 3, 7, 3, 15, 3, 105, 19, 41, 119, 149, 3847, 6593, 875, 23777, 4547, 57717, 139387}},
+{19363, 18, 100191, {1, 1, 1, 3, 9, 43, 25, 15, 67, 609, 951, 273, 8095, 621, 24819, 17233, 53423, 192757}},
+{19364, 18, 100202, {1, 3, 5, 3, 9, 49, 107, 215, 245, 217, 545, 2285, 2075, 401, 26599, 32967, 130457, 203755}},
+{19365, 18, 100216, {1, 1, 5, 1, 7, 31, 87, 181, 135, 155, 9, 1431, 307, 13367, 31147, 10327, 2817, 63327}},
+{19366, 18, 100246, {1, 3, 3, 3, 29, 17, 55, 201, 33, 275, 2005, 3037, 3439, 1513, 7563, 46491, 103319, 5279}},
+{19367, 18, 100256, {1, 3, 7, 11, 31, 63, 105, 169, 257, 225, 711, 2041, 1519, 11801, 18543, 35173, 92125, 72729}},
+{19368, 18, 100271, {1, 1, 3, 3, 11, 13, 127, 231, 229, 809, 303, 1167, 47, 4281, 2373, 10455, 74685, 131775}},
+{19369, 18, 100285, {1, 1, 5, 15, 1, 5, 97, 139, 189, 39, 37, 3513, 2119, 1453, 11477, 45477, 75613, 169915}},
+{19370, 18, 100294, {1, 3, 5, 1, 15, 27, 31, 87, 311, 785, 489, 1331, 5259, 6963, 26441, 41675, 107187, 60723}},
+{19371, 18, 100305, {1, 1, 3, 5, 13, 9, 33, 3, 273, 357, 841, 1421, 5993, 12449, 6821, 4283, 9437, 215035}},
+{19372, 18, 100321, {1, 3, 3, 1, 15, 43, 101, 35, 23, 743, 29, 3953, 3095, 14355, 25977, 12513, 54565, 20199}},
+{19373, 18, 100331, {1, 3, 3, 1, 11, 53, 99, 95, 63, 503, 1361, 3231, 2445, 5073, 4667, 33033, 4575, 139475}},
+{19374, 18, 100334, {1, 3, 3, 5, 19, 57, 15, 115, 125, 1017, 1913, 907, 2461, 3229, 16591, 6591, 26385, 228661}},
+{19375, 18, 100345, {1, 3, 1, 11, 27, 19, 7, 121, 245, 997, 1743, 2571, 1333, 9603, 27811, 42081, 44365, 94943}},
+{19376, 18, 100346, {1, 3, 1, 1, 13, 5, 127, 217, 63, 137, 989, 1441, 1133, 8273, 18091, 22243, 122931, 28867}},
+{19377, 18, 100369, {1, 1, 7, 15, 23, 39, 57, 83, 321, 817, 819, 223, 4803, 6935, 2027, 20373, 119683, 29781}},
+{19378, 18, 100372, {1, 1, 7, 7, 9, 1, 55, 211, 455, 283, 1647, 471, 4351, 14119, 6945, 63117, 109687, 200165}},
+{19379, 18, 100382, {1, 1, 7, 7, 29, 45, 113, 253, 135, 375, 1091, 959, 1423, 1241, 31689, 33751, 73459, 91769}},
+{19380, 18, 100403, {1, 3, 5, 11, 23, 63, 55, 181, 453, 267, 995, 1309, 2847, 3791, 21683, 59809, 81891, 132635}},
+{19381, 18, 100451, {1, 1, 1, 13, 17, 37, 87, 17, 61, 689, 1895, 3877, 4717, 6447, 22329, 1619, 30069, 190887}},
+{19382, 18, 100488, {1, 3, 1, 7, 27, 61, 17, 51, 99, 909, 85, 951, 107, 1923, 35, 63389, 90273, 152643}},
+{19383, 18, 100499, {1, 1, 1, 1, 15, 39, 77, 255, 191, 613, 655, 1881, 267, 3927, 18025, 13825, 15381, 169193}},
+{19384, 18, 100501, {1, 3, 3, 1, 31, 17, 73, 69, 231, 221, 501, 3755, 1671, 2049, 22493, 16353, 1775, 181783}},
+{19385, 18, 100511, {1, 1, 7, 5, 31, 45, 125, 189, 287, 487, 1911, 3133, 3257, 8967, 21295, 1247, 72297, 68269}},
+{19386, 18, 100536, {1, 3, 3, 1, 7, 9, 123, 147, 7, 381, 1597, 1289, 7831, 14493, 21145, 15487, 70353, 147891}},
+{19387, 18, 100629, {1, 1, 5, 9, 15, 17, 43, 87, 101, 425, 1819, 163, 6741, 8255, 2591, 17719, 112871, 110793}},
+{19388, 18, 100652, {1, 1, 3, 9, 3, 27, 7, 41, 43, 743, 131, 705, 2607, 9963, 26367, 41191, 126347, 164291}},
+{19389, 18, 100655, {1, 3, 3, 15, 7, 17, 97, 153, 283, 461, 1723, 2421, 4973, 16369, 30633, 62299, 119425, 3591}},
+{19390, 18, 100669, {1, 1, 1, 13, 7, 33, 95, 255, 429, 693, 849, 3783, 5985, 8551, 23227, 1015, 109023, 42493}},
+{19391, 18, 100687, {1, 3, 1, 7, 3, 43, 53, 137, 413, 265, 2033, 1347, 335, 529, 24751, 16443, 122195, 158951}},
+{19392, 18, 100692, {1, 1, 5, 9, 27, 21, 83, 185, 325, 557, 1247, 2739, 6925, 5459, 26027, 62217, 61113, 197743}},
+{19393, 18, 100696, {1, 1, 3, 13, 9, 57, 79, 133, 137, 851, 863, 1605, 7839, 11809, 29941, 20473, 6687, 164479}},
+{19394, 18, 100701, {1, 1, 3, 9, 9, 51, 123, 29, 139, 43, 1329, 2701, 3413, 3875, 19673, 62369, 10529, 226525}},
+{19395, 18, 100706, {1, 3, 1, 5, 25, 47, 7, 201, 119, 623, 9, 25, 1713, 10817, 8201, 5847, 77477, 237883}},
+{19396, 18, 100711, {1, 1, 5, 13, 15, 53, 39, 93, 235, 619, 1695, 2389, 2571, 2389, 4619, 45769, 17245, 69973}},
+{19397, 18, 100726, {1, 1, 7, 1, 31, 9, 75, 143, 1, 67, 809, 1037, 2801, 16129, 22443, 26021, 119683, 14681}},
+{19398, 18, 100754, {1, 3, 1, 9, 23, 49, 69, 71, 139, 953, 1053, 3059, 1061, 5881, 26207, 15907, 79389, 95341}},
+{19399, 18, 100759, {1, 3, 5, 1, 19, 39, 69, 183, 95, 289, 847, 393, 1649, 1275, 21187, 34715, 67553, 123239}},
+{19400, 18, 100790, {1, 1, 1, 5, 21, 39, 119, 193, 347, 87, 731, 3327, 6089, 13781, 20389, 52303, 11869, 48975}},
+{19401, 18, 100838, {1, 3, 5, 1, 19, 17, 93, 33, 215, 457, 687, 1325, 1997, 2655, 21195, 54997, 36877, 57991}},
+{19402, 18, 100878, {1, 1, 1, 3, 17, 45, 91, 45, 231, 611, 413, 2321, 7181, 13765, 7791, 6973, 24497, 231795}},
+{19403, 18, 100880, {1, 3, 3, 15, 7, 29, 103, 31, 295, 637, 1775, 2293, 8001, 4175, 1257, 16881, 93695, 180591}},
+{19404, 18, 100885, {1, 1, 1, 13, 31, 7, 47, 51, 267, 231, 463, 939, 7977, 8593, 15329, 36871, 50449, 222341}},
+{19405, 18, 100886, {1, 3, 7, 3, 27, 31, 57, 135, 507, 177, 1455, 1963, 4473, 6449, 727, 49853, 65275, 237531}},
+{19406, 18, 100943, {1, 3, 7, 11, 31, 21, 111, 231, 269, 27, 719, 3275, 2489, 3689, 3425, 23763, 39413, 64565}},
+{19407, 18, 100948, {1, 1, 1, 11, 23, 27, 31, 153, 201, 985, 1553, 3061, 7663, 4079, 13549, 48765, 64169, 68223}},
+{19408, 18, 100957, {1, 1, 7, 15, 11, 53, 125, 23, 73, 799, 591, 665, 127, 3941, 11251, 12649, 2657, 230923}},
+{19409, 18, 100962, {1, 1, 7, 15, 29, 43, 95, 81, 337, 367, 779, 1237, 7627, 997, 3355, 1245, 70477, 159097}},
+{19410, 18, 100968, {1, 3, 1, 13, 19, 31, 11, 91, 179, 425, 1395, 1439, 2723, 401, 26779, 36723, 115743, 179653}},
+{19411, 18, 100981, {1, 1, 3, 1, 29, 35, 11, 217, 301, 421, 765, 1949, 5475, 2247, 3953, 27091, 16895, 194821}},
+{19412, 18, 100986, {1, 1, 5, 9, 11, 21, 95, 135, 127, 65, 609, 3893, 7143, 13231, 29199, 36205, 38711, 159599}},
+{19413, 18, 101001, {1, 3, 5, 13, 25, 25, 101, 221, 495, 993, 961, 2575, 907, 5277, 18415, 1797, 22043, 129889}},
+{19414, 18, 101012, {1, 1, 1, 15, 21, 21, 99, 3, 175, 735, 659, 543, 7573, 15549, 14067, 60009, 65785, 112927}},
+{19415, 18, 101015, {1, 3, 7, 7, 3, 39, 61, 203, 143, 581, 487, 2097, 3943, 6869, 14435, 46431, 101781, 233067}},
+{19416, 18, 101019, {1, 1, 3, 1, 13, 27, 21, 147, 295, 89, 1845, 1017, 4621, 10029, 3517, 25371, 104531, 225179}},
+{19417, 18, 101037, {1, 1, 3, 11, 25, 51, 45, 179, 299, 487, 2039, 85, 4643, 8211, 12051, 64819, 93481, 159511}},
+{19418, 18, 101063, {1, 1, 5, 3, 21, 7, 73, 193, 415, 7, 125, 2487, 7369, 2043, 7633, 19265, 65337, 57399}},
+{19419, 18, 101105, {1, 1, 5, 3, 3, 53, 51, 169, 313, 973, 1549, 243, 3155, 13827, 24971, 61393, 15147, 187397}},
+{19420, 18, 101144, {1, 3, 3, 3, 29, 33, 91, 41, 367, 77, 1259, 1703, 2105, 14473, 17763, 29809, 47777, 205553}},
+{19421, 18, 101147, {1, 3, 7, 3, 23, 61, 59, 235, 51, 41, 417, 691, 2953, 15577, 32283, 2793, 109557, 64729}},
+{19422, 18, 101154, {1, 1, 5, 9, 13, 17, 93, 201, 151, 323, 1481, 3645, 3039, 5131, 503, 42055, 114939, 198755}},
+{19423, 18, 101163, {1, 3, 5, 1, 21, 53, 75, 29, 283, 541, 499, 309, 1923, 995, 21479, 56183, 103743, 152113}},
+{19424, 18, 101166, {1, 3, 1, 3, 21, 51, 67, 97, 481, 509, 805, 213, 5157, 13573, 16187, 8199, 28025, 208445}},
+{19425, 18, 101173, {1, 1, 7, 7, 15, 25, 107, 127, 355, 249, 707, 1287, 6831, 5317, 15613, 12837, 48091, 27611}},
+{19426, 18, 101174, {1, 3, 3, 7, 31, 53, 127, 239, 17, 709, 979, 4023, 7149, 4239, 20015, 44365, 113245, 75873}},
+{19427, 18, 101219, {1, 3, 5, 11, 27, 37, 49, 123, 137, 967, 1857, 3961, 7429, 8355, 30733, 64587, 73903, 188581}},
+{19428, 18, 101240, {1, 3, 3, 7, 19, 51, 69, 121, 345, 637, 1987, 335, 7071, 13849, 22369, 46895, 20761, 148227}},
+{19429, 18, 101250, {1, 1, 3, 11, 9, 1, 93, 151, 487, 889, 919, 2429, 5425, 15303, 12583, 57627, 42683, 98265}},
+{19430, 18, 101259, {1, 3, 5, 3, 1, 29, 87, 189, 285, 805, 933, 1381, 2789, 107, 14215, 33171, 110573, 250983}},
+{19431, 18, 101273, {1, 3, 1, 1, 27, 43, 63, 115, 317, 401, 885, 1029, 7003, 10041, 15299, 42251, 58675, 177545}},
+{19432, 18, 101274, {1, 3, 5, 7, 11, 33, 119, 5, 185, 777, 1795, 1585, 3543, 1801, 17681, 1041, 44513, 105435}},
+{19433, 18, 101285, {1, 3, 1, 9, 19, 33, 15, 253, 299, 925, 241, 1333, 615, 12501, 499, 44449, 16595, 70357}},
+{19434, 18, 101300, {1, 1, 3, 13, 13, 31, 17, 123, 215, 805, 1177, 3683, 27, 11881, 7645, 25575, 63057, 89547}},
+{19435, 18, 101309, {1, 1, 5, 5, 17, 1, 57, 183, 267, 825, 1987, 329, 5603, 1295, 425, 61871, 27859, 157109}},
+{19436, 18, 101310, {1, 3, 3, 11, 19, 45, 37, 79, 191, 17, 17, 3379, 7941, 3159, 20351, 26341, 34687, 116281}},
+{19437, 18, 101321, {1, 1, 3, 7, 11, 7, 61, 199, 459, 993, 1729, 3751, 1067, 14965, 14669, 40281, 12579, 154601}},
+{19438, 18, 101324, {1, 3, 3, 13, 19, 53, 17, 39, 137, 219, 1645, 2899, 505, 10057, 22891, 32317, 81201, 126291}},
+{19439, 18, 101363, {1, 3, 5, 7, 21, 53, 65, 125, 69, 781, 761, 1683, 5817, 11859, 11543, 62853, 57149, 212261}},
+{19440, 18, 101366, {1, 3, 5, 9, 13, 25, 81, 119, 439, 25, 239, 2867, 421, 12631, 22705, 31039, 96105, 79023}},
+{19441, 18, 101377, {1, 3, 5, 3, 19, 9, 51, 135, 437, 393, 1711, 1205, 5195, 10927, 28583, 7513, 110227, 139295}},
+{19442, 18, 101380, {1, 3, 7, 9, 31, 15, 5, 143, 49, 13, 1143, 2325, 5437, 14289, 31555, 58777, 102675, 64559}},
+{19443, 18, 101389, {1, 1, 7, 3, 3, 21, 65, 127, 341, 109, 167, 1835, 6687, 1695, 15631, 47047, 127543, 51413}},
+{19444, 18, 101407, {1, 1, 3, 1, 31, 49, 103, 147, 59, 701, 1251, 3391, 1935, 5371, 28585, 50023, 73839, 118205}},
+{19445, 18, 101411, {1, 3, 3, 1, 5, 49, 91, 23, 91, 663, 1369, 1437, 2657, 11369, 29857, 53875, 127045, 242323}},
+{19446, 18, 101432, {1, 3, 1, 3, 23, 33, 7, 105, 353, 863, 1211, 1175, 1347, 12913, 11973, 55255, 27145, 175539}},
+{19447, 18, 101476, {1, 1, 1, 13, 9, 29, 71, 71, 509, 571, 2005, 3125, 2731, 6829, 26863, 16459, 113195, 80247}},
+{19448, 18, 101488, {1, 3, 5, 1, 7, 11, 45, 177, 281, 695, 1197, 2035, 2137, 11833, 12417, 5805, 77211, 45553}},
+{19449, 18, 101494, {1, 1, 7, 7, 27, 59, 91, 183, 267, 373, 677, 2431, 903, 4229, 31997, 19843, 125089, 242871}},
+{19450, 18, 101514, {1, 3, 3, 13, 23, 23, 53, 101, 225, 247, 2013, 853, 279, 2161, 30045, 28255, 130907, 57157}},
+{19451, 18, 101534, {1, 3, 5, 13, 5, 11, 63, 137, 219, 661, 773, 1991, 4081, 5963, 25207, 50461, 85293, 159441}},
+{19452, 18, 101537, {1, 3, 1, 15, 5, 59, 43, 87, 429, 77, 73, 1275, 2619, 16133, 20009, 26089, 38129, 157267}},
+{19453, 18, 101543, {1, 1, 5, 15, 9, 59, 37, 127, 127, 733, 1703, 1331, 4293, 3555, 22739, 49513, 34533, 143225}},
+{19454, 18, 101547, {1, 1, 7, 7, 11, 51, 121, 59, 505, 147, 1855, 1661, 5539, 3421, 28863, 14811, 39811, 228927}},
+{19455, 18, 101584, {1, 1, 5, 5, 1, 31, 57, 167, 107, 753, 1835, 2491, 3311, 8639, 8743, 17279, 77071, 8673}},
+{19456, 18, 101589, {1, 1, 3, 3, 15, 39, 1, 223, 395, 603, 1095, 435, 1225, 4045, 21721, 40767, 48971, 1583}},
+{19457, 18, 101590, {1, 1, 3, 13, 9, 17, 47, 175, 229, 827, 769, 2901, 137, 9931, 11115, 25337, 105811, 68413}},
+{19458, 18, 101629, {1, 1, 1, 5, 29, 55, 43, 39, 319, 919, 749, 931, 1973, 13147, 913, 48353, 40955, 189783}},
+{19459, 18, 101678, {1, 3, 5, 5, 13, 33, 81, 213, 79, 781, 1069, 3117, 5859, 9061, 30963, 17307, 6281, 208707}},
+{19460, 18, 101683, {1, 1, 5, 13, 27, 63, 41, 91, 123, 763, 1115, 3193, 4571, 4573, 8235, 24291, 40911, 225985}},
+{19461, 18, 101700, {1, 1, 1, 7, 13, 5, 77, 215, 67, 183, 1447, 1571, 213, 3481, 28349, 22451, 44951, 240257}},
+{19462, 18, 101712, {1, 3, 7, 7, 3, 21, 39, 233, 263, 19, 489, 1511, 2313, 1799, 25173, 17913, 70593, 2969}},
+{19463, 18, 101748, {1, 3, 7, 15, 3, 1, 93, 101, 393, 911, 1055, 953, 1279, 11947, 11963, 53443, 29105, 226057}},
+{19464, 18, 101757, {1, 1, 3, 7, 7, 53, 119, 39, 439, 629, 1845, 3411, 3633, 16345, 27501, 59565, 39581, 85373}},
+{19465, 18, 101762, {1, 1, 5, 7, 19, 39, 19, 191, 509, 239, 359, 645, 8107, 13721, 21289, 20763, 67727, 45957}},
+{19466, 18, 101771, {1, 1, 1, 13, 5, 13, 113, 41, 135, 351, 311, 1099, 2391, 16165, 15805, 54737, 102645, 224417}},
+{19467, 18, 101785, {1, 3, 3, 9, 17, 47, 95, 249, 45, 749, 313, 317, 2413, 15861, 27221, 35537, 6407, 50111}},
+{19468, 18, 101795, {1, 1, 7, 5, 29, 57, 81, 7, 233, 393, 307, 1089, 1367, 12275, 11861, 29119, 27271, 36351}},
+{19469, 18, 101822, {1, 3, 5, 15, 9, 15, 23, 241, 233, 305, 1025, 2035, 4897, 10321, 17345, 42873, 109045, 129533}},
+{19470, 18, 101851, {1, 3, 5, 9, 21, 33, 111, 81, 311, 829, 1851, 1437, 5935, 7847, 15493, 28531, 74879, 40567}},
+{19471, 18, 101863, {1, 3, 7, 7, 13, 21, 43, 119, 507, 701, 1385, 745, 799, 1567, 13271, 40267, 130843, 59951}},
+{19472, 18, 101894, {1, 3, 3, 1, 19, 43, 45, 119, 87, 263, 1475, 3897, 2811, 2711, 4949, 48043, 125237, 230897}},
+{19473, 18, 101903, {1, 1, 7, 1, 1, 53, 17, 71, 313, 373, 5, 2359, 1643, 9867, 18365, 5011, 40675, 105371}},
+{19474, 18, 101924, {1, 3, 7, 11, 23, 49, 123, 255, 33, 241, 473, 959, 1859, 6109, 5433, 27625, 46839, 90727}},
+{19475, 18, 101939, {1, 1, 1, 3, 31, 43, 33, 129, 159, 445, 1831, 1005, 587, 2091, 5749, 33271, 50909, 65057}},
+{19476, 18, 101980, {1, 1, 7, 13, 3, 21, 17, 125, 357, 97, 1255, 669, 1583, 7433, 32287, 61795, 5915, 211593}},
+{19477, 18, 101993, {1, 1, 7, 7, 31, 19, 71, 211, 213, 731, 1491, 3315, 3633, 14953, 21369, 4977, 33533, 12115}},
+{19478, 18, 101994, {1, 3, 1, 1, 31, 1, 87, 253, 211, 57, 1431, 2613, 4075, 14463, 11287, 38671, 100129, 4241}},
+{19479, 18, 101996, {1, 1, 1, 5, 21, 13, 27, 29, 31, 285, 179, 3861, 5319, 15683, 2579, 15663, 63357, 81849}},
+{19480, 18, 102007, {1, 1, 3, 7, 23, 29, 29, 79, 263, 865, 1237, 3871, 2097, 5337, 2387, 59277, 28831, 57957}},
+{19481, 18, 102044, {1, 3, 7, 15, 15, 31, 83, 195, 87, 691, 71, 1025, 3145, 675, 14619, 22399, 88885, 222969}},
+{19482, 18, 102086, {1, 1, 5, 7, 19, 3, 121, 105, 383, 675, 777, 2073, 643, 14439, 19467, 13159, 115421, 250561}},
+{19483, 18, 102097, {1, 3, 5, 9, 13, 41, 119, 23, 355, 765, 579, 849, 3313, 2443, 29521, 42965, 102559, 227707}},
+{19484, 18, 102113, {1, 3, 3, 7, 23, 55, 115, 83, 331, 873, 797, 621, 1197, 15299, 26307, 34287, 120459, 260603}},
+{19485, 18, 102123, {1, 1, 3, 5, 7, 11, 113, 119, 65, 691, 1169, 2291, 7283, 1391, 10737, 3801, 40649, 191009}},
+{19486, 18, 102155, {1, 1, 7, 9, 3, 23, 95, 109, 457, 277, 871, 3013, 2833, 4131, 21081, 43635, 19875, 162173}},
+{19487, 18, 102157, {1, 1, 3, 15, 25, 7, 45, 109, 195, 935, 1487, 1603, 1663, 15595, 10687, 4073, 34863, 45851}},
+{19488, 18, 102169, {1, 1, 1, 5, 21, 19, 37, 141, 377, 553, 1225, 2485, 1235, 13179, 2587, 43659, 1405, 52023}},
+{19489, 18, 102181, {1, 3, 1, 9, 5, 27, 1, 219, 397, 555, 533, 941, 2755, 1295, 16157, 30733, 54279, 168455}},
+{19490, 18, 102182, {1, 3, 3, 1, 27, 41, 93, 177, 119, 581, 167, 3943, 5765, 15455, 555, 17419, 33117, 160599}},
+{19491, 18, 102185, {1, 1, 3, 7, 15, 25, 29, 177, 503, 529, 229, 2535, 1493, 805, 30983, 26309, 123453, 118441}},
+{19492, 18, 102199, {1, 1, 7, 15, 13, 33, 83, 151, 183, 433, 823, 4003, 1991, 6563, 18743, 61835, 56535, 191193}},
+{19493, 18, 102208, {1, 1, 1, 13, 9, 31, 91, 63, 455, 67, 243, 1573, 3507, 9491, 4677, 13835, 121603, 241781}},
+{19494, 18, 102213, {1, 1, 5, 5, 29, 13, 45, 29, 289, 909, 1923, 3371, 3675, 13119, 24599, 58511, 109467, 126865}},
+{19495, 18, 102226, {1, 1, 5, 9, 21, 41, 41, 179, 25, 463, 949, 819, 397, 12329, 3461, 34773, 61337, 23579}},
+{19496, 18, 102290, {1, 3, 3, 11, 1, 25, 17, 165, 77, 455, 1983, 143, 2763, 8165, 14849, 1601, 30093, 54599}},
+{19497, 18, 102296, {1, 1, 7, 3, 7, 1, 117, 117, 53, 611, 1405, 3357, 1717, 8157, 247, 17501, 30201, 192485}},
+{19498, 18, 102306, {1, 1, 1, 5, 23, 47, 95, 173, 133, 603, 1627, 4039, 5599, 10575, 30275, 60287, 3313, 77551}},
+{19499, 18, 102317, {1, 1, 1, 9, 31, 49, 87, 169, 221, 561, 1045, 365, 1955, 9905, 13057, 33717, 91203, 57513}},
+{19500, 18, 102337, {1, 3, 3, 1, 19, 25, 113, 231, 415, 717, 1767, 755, 4825, 7541, 10121, 9351, 72093, 255877}},
+{19501, 18, 102344, {1, 3, 1, 7, 1, 35, 3, 231, 345, 375, 809, 2753, 849, 13915, 16127, 7575, 45259, 28917}},
+{19502, 18, 102350, {1, 3, 3, 11, 23, 43, 13, 37, 305, 765, 517, 333, 473, 14949, 11939, 35171, 63963, 181825}},
+{19503, 18, 102378, {1, 3, 3, 3, 5, 43, 35, 89, 293, 913, 1325, 2097, 603, 14365, 4005, 38935, 23837, 34271}},
+{19504, 18, 102383, {1, 1, 3, 15, 1, 47, 67, 199, 167, 909, 1167, 1513, 7087, 5017, 23469, 2621, 24961, 226679}},
+{19505, 18, 102391, {1, 3, 7, 15, 23, 37, 111, 217, 33, 423, 457, 1767, 4821, 10233, 27045, 33397, 85351, 156751}},
+{19506, 18, 102400, {1, 3, 3, 7, 31, 25, 67, 65, 291, 169, 1505, 1707, 4833, 11541, 1189, 62959, 59831, 48729}},
+{19507, 18, 102409, {1, 1, 5, 7, 27, 27, 15, 23, 189, 819, 709, 3591, 2781, 14807, 20303, 27795, 88349, 210251}},
+{19508, 18, 102427, {1, 3, 7, 15, 1, 19, 49, 103, 219, 85, 1281, 3981, 7229, 10427, 11689, 1547, 90747, 12283}},
+{19509, 18, 102434, {1, 1, 1, 13, 31, 49, 81, 121, 287, 851, 333, 353, 7373, 10165, 1157, 11713, 89445, 210709}},
+{19510, 18, 102453, {1, 3, 7, 5, 31, 35, 3, 229, 443, 973, 1971, 1861, 5695, 6725, 6405, 45927, 115313, 228667}},
+{19511, 18, 102472, {1, 3, 3, 11, 29, 17, 105, 203, 69, 945, 1239, 3213, 6005, 10095, 31233, 37421, 62911, 91371}},
+{19512, 18, 102502, {1, 1, 7, 1, 21, 59, 7, 43, 391, 299, 1225, 283, 3351, 11495, 25071, 16619, 65127, 114033}},
+{19513, 18, 102525, {1, 1, 3, 9, 17, 11, 71, 73, 377, 437, 311, 1083, 6941, 1039, 1047, 55647, 21239, 209201}},
+{19514, 18, 102547, {1, 3, 7, 5, 29, 51, 113, 163, 215, 511, 615, 2427, 2747, 14389, 1005, 27015, 31809, 30603}},
+{19515, 18, 102554, {1, 1, 1, 3, 9, 61, 9, 201, 259, 411, 175, 1003, 401, 13695, 13103, 3075, 43695, 177139}},
+{19516, 18, 102560, {1, 1, 5, 3, 17, 47, 125, 173, 277, 17, 619, 2295, 3091, 5615, 4529, 54065, 81875, 97279}},
+{19517, 18, 102578, {1, 3, 3, 9, 3, 61, 97, 151, 287, 671, 1439, 1129, 6343, 8161, 24593, 40371, 109705, 106279}},
+{19518, 18, 102580, {1, 3, 3, 1, 5, 61, 21, 31, 41, 855, 1541, 3351, 575, 3195, 17155, 46913, 1797, 146401}},
+{19519, 18, 102597, {1, 1, 7, 13, 11, 43, 27, 97, 479, 117, 1873, 3103, 1947, 9273, 29171, 35719, 10601, 209629}},
+{19520, 18, 102616, {1, 3, 1, 9, 21, 47, 53, 129, 85, 505, 165, 3437, 5687, 10289, 6615, 46719, 50731, 25271}},
+{19521, 18, 102625, {1, 1, 3, 1, 1, 33, 37, 239, 45, 565, 1907, 3831, 2177, 10967, 12689, 49395, 36289, 247507}},
+{19522, 18, 102632, {1, 1, 5, 1, 19, 57, 75, 245, 59, 967, 1319, 3971, 5267, 11713, 15417, 60503, 63431, 157267}},
+{19523, 18, 102663, {1, 1, 5, 7, 7, 15, 99, 87, 331, 261, 1973, 219, 3063, 4071, 19273, 48637, 128089, 55511}},
+{19524, 18, 102669, {1, 3, 5, 13, 23, 43, 7, 171, 173, 1023, 1145, 3551, 5127, 6365, 18013, 1613, 51997, 107265}},
+{19525, 18, 102681, {1, 3, 5, 3, 7, 7, 23, 195, 251, 387, 1889, 3645, 4221, 6025, 27291, 24831, 123749, 231403}},
+{19526, 18, 102694, {1, 3, 1, 1, 29, 49, 107, 215, 93, 211, 1349, 1925, 7149, 1015, 27465, 34139, 126149, 121349}},
+{19527, 18, 102706, {1, 1, 5, 5, 19, 15, 121, 189, 167, 801, 483, 1955, 8031, 4749, 26665, 64791, 18671, 123221}},
+{19528, 18, 102715, {1, 3, 3, 15, 23, 57, 15, 249, 197, 103, 2021, 1897, 5975, 12821, 6441, 62719, 81415, 232417}},
+{19529, 18, 102723, {1, 1, 3, 9, 17, 45, 111, 225, 103, 121, 1259, 2849, 2235, 2041, 13261, 7929, 76325, 38677}},
+{19530, 18, 102730, {1, 1, 3, 9, 25, 17, 63, 63, 369, 387, 31, 1423, 5699, 12519, 27407, 53193, 963, 123473}},
+{19531, 18, 102743, {1, 3, 3, 13, 3, 59, 59, 3, 367, 357, 1391, 1519, 2619, 2291, 1349, 28275, 21655, 8763}},
+{19532, 18, 102856, {1, 1, 7, 1, 31, 51, 121, 49, 157, 509, 1513, 3247, 3439, 8691, 20729, 17585, 49013, 228695}},
+{19533, 18, 102870, {1, 1, 5, 9, 11, 29, 103, 49, 209, 35, 673, 1409, 2483, 4561, 12435, 46139, 31019, 50929}},
+{19534, 18, 102898, {1, 1, 3, 9, 11, 45, 77, 143, 277, 769, 1151, 3705, 7901, 3735, 31155, 46135, 84061, 254357}},
+{19535, 18, 102926, {1, 3, 3, 3, 5, 51, 95, 7, 155, 121, 1899, 2261, 2915, 6637, 6557, 20535, 20937, 257275}},
+{19536, 18, 102931, {1, 1, 7, 9, 13, 49, 125, 135, 7, 535, 1171, 3501, 1701, 5791, 10121, 9845, 21645, 56451}},
+{19537, 18, 102938, {1, 1, 7, 5, 9, 1, 115, 27, 229, 813, 133, 753, 1959, 13121, 30425, 31059, 114619, 132257}},
+{19538, 18, 102947, {1, 1, 5, 3, 23, 25, 41, 165, 21, 551, 1751, 3563, 731, 15811, 14777, 22327, 82853, 116699}},
+{19539, 18, 102968, {1, 3, 1, 9, 3, 25, 95, 211, 457, 25, 349, 921, 213, 5721, 26725, 19541, 102473, 200845}},
+{19540, 18, 102976, {1, 3, 1, 13, 5, 1, 31, 49, 493, 785, 61, 2603, 5997, 12545, 9793, 32521, 99859, 256105}},
+{19541, 18, 102993, {1, 3, 3, 7, 31, 19, 31, 121, 507, 79, 685, 197, 4027, 12909, 30533, 38427, 38993, 14581}},
+{19542, 18, 103005, {1, 3, 7, 13, 13, 23, 63, 15, 223, 25, 1957, 2527, 6061, 11753, 4835, 34553, 45579, 205805}},
+{19543, 18, 103019, {1, 3, 3, 3, 5, 39, 55, 123, 275, 185, 749, 3227, 8137, 12959, 7243, 20613, 46247, 106127}},
+{19544, 18, 103022, {1, 1, 7, 13, 1, 21, 49, 145, 237, 291, 1721, 2981, 267, 1255, 21817, 39553, 21937, 115307}},
+{19545, 18, 103057, {1, 1, 1, 15, 5, 63, 3, 201, 117, 991, 1049, 1975, 5117, 5799, 28211, 37907, 46799, 240847}},
+{19546, 18, 103080, {1, 3, 3, 5, 25, 15, 29, 111, 201, 857, 319, 2695, 4251, 4303, 28495, 12481, 31979, 107503}},
+{19547, 18, 103100, {1, 1, 3, 11, 3, 27, 81, 55, 489, 983, 293, 3181, 4593, 4759, 18437, 51185, 47701, 75469}},
+{19548, 18, 103106, {1, 3, 1, 3, 11, 25, 113, 243, 365, 299, 1717, 561, 5173, 5983, 7453, 33563, 98519, 162451}},
+{19549, 18, 103126, {1, 3, 1, 5, 1, 21, 3, 87, 267, 483, 1397, 791, 4807, 4649, 13713, 19861, 110471, 51443}},
+{19550, 18, 103173, {1, 3, 7, 5, 31, 9, 13, 251, 351, 609, 841, 3267, 4201, 8771, 6673, 44867, 105221, 189399}},
+{19551, 18, 103202, {1, 1, 3, 1, 13, 43, 47, 153, 331, 1013, 705, 1867, 563, 6361, 7407, 46243, 30521, 213831}},
+{19552, 18, 103207, {1, 3, 3, 7, 29, 41, 3, 179, 319, 877, 905, 3803, 2775, 9729, 5673, 9521, 117887, 37605}},
+{19553, 18, 103219, {1, 1, 5, 5, 11, 49, 111, 195, 467, 931, 849, 2785, 7829, 2291, 29031, 52019, 86493, 213971}},
+{19554, 18, 103226, {1, 1, 3, 11, 13, 11, 81, 81, 419, 621, 181, 1203, 7305, 7857, 16885, 2531, 53127, 35553}},
+{19555, 18, 103228, {1, 1, 5, 1, 19, 35, 75, 131, 159, 211, 319, 2805, 6497, 14759, 28997, 62347, 4013, 233821}},
+{19556, 18, 103248, {1, 3, 3, 15, 1, 55, 107, 105, 35, 369, 1259, 665, 6717, 2555, 7149, 10373, 33153, 105915}},
+{19557, 18, 103274, {1, 3, 7, 5, 31, 13, 27, 207, 359, 355, 2047, 1777, 5555, 12659, 30547, 3655, 86189, 961}},
+{19558, 18, 103288, {1, 3, 7, 9, 9, 55, 7, 117, 57, 115, 745, 501, 2341, 3899, 8229, 10625, 66905, 187959}},
+{19559, 18, 103291, {1, 3, 3, 13, 25, 43, 87, 197, 303, 405, 1459, 3385, 4109, 8325, 24747, 18405, 48845, 96673}},
+{19560, 18, 103293, {1, 3, 5, 3, 21, 37, 109, 9, 183, 585, 1287, 3851, 4939, 1057, 19489, 42603, 32447, 117957}},
+{19561, 18, 103324, {1, 1, 5, 13, 3, 47, 109, 115, 73, 733, 1189, 3773, 7471, 10339, 5093, 50253, 122665, 254381}},
+{19562, 18, 103358, {1, 1, 5, 5, 21, 33, 113, 187, 51, 245, 241, 3887, 4075, 11945, 20883, 18817, 43567, 851}},
+{19563, 18, 103372, {1, 3, 7, 3, 1, 29, 87, 101, 29, 93, 643, 2659, 1753, 4797, 17477, 16087, 43453, 110383}},
+{19564, 18, 103375, {1, 1, 7, 13, 17, 51, 75, 91, 445, 171, 1369, 499, 3753, 14035, 4445, 21437, 86205, 231163}},
+{19565, 18, 103390, {1, 1, 7, 13, 17, 41, 67, 49, 225, 659, 1181, 1751, 5211, 6847, 20339, 34271, 60273, 52315}},
+{19566, 18, 103414, {1, 1, 5, 5, 5, 17, 87, 223, 25, 773, 53, 2447, 6805, 6547, 4429, 46809, 51171, 66457}},
+{19567, 18, 103432, {1, 1, 5, 3, 29, 49, 11, 205, 279, 821, 725, 2425, 443, 211, 6347, 59845, 90763, 237911}},
+{19568, 18, 103446, {1, 1, 3, 9, 31, 7, 49, 1, 229, 755, 517, 809, 2955, 3571, 2385, 33097, 19659, 55397}},
+{19569, 18, 103455, {1, 3, 5, 3, 5, 21, 67, 227, 359, 401, 1697, 2131, 4585, 2661, 3659, 22621, 51639, 245877}},
+{19570, 18, 103471, {1, 1, 7, 5, 11, 7, 57, 133, 9, 917, 427, 2777, 6009, 11393, 29473, 59311, 77095, 176215}},
+{19571, 18, 103474, {1, 1, 7, 5, 13, 29, 101, 15, 293, 7, 797, 437, 3739, 3369, 16917, 19047, 17773, 219541}},
+{19572, 18, 103476, {1, 3, 1, 9, 13, 51, 15, 19, 209, 991, 413, 787, 3797, 14029, 23699, 8591, 40429, 56115}},
+{19573, 18, 103515, {1, 3, 7, 3, 31, 9, 77, 33, 487, 155, 1903, 3023, 8163, 385, 4703, 57511, 102083, 85785}},
+{19574, 18, 103527, {1, 1, 5, 11, 17, 59, 115, 73, 89, 723, 1523, 2671, 1755, 3463, 19861, 31573, 126405, 90215}},
+{19575, 18, 103542, {1, 3, 3, 13, 17, 27, 123, 37, 71, 173, 203, 1245, 7905, 8955, 22589, 56705, 120473, 90129}},
+{19576, 18, 103562, {1, 3, 3, 1, 17, 63, 55, 225, 259, 531, 1493, 2639, 1319, 10865, 17993, 11205, 13253, 111261}},
+{19577, 18, 103569, {1, 1, 1, 11, 25, 17, 41, 45, 385, 1009, 1573, 1797, 527, 543, 14743, 35789, 63871, 112183}},
+{19578, 18, 103572, {1, 1, 7, 15, 15, 57, 109, 127, 143, 955, 1091, 2585, 3429, 11763, 5849, 53805, 116865, 68895}},
+{19579, 18, 103581, {1, 1, 7, 15, 9, 11, 1, 9, 491, 765, 1835, 3825, 5043, 13091, 4123, 19621, 17687, 241015}},
+{19580, 18, 103609, {1, 3, 5, 7, 25, 51, 117, 193, 91, 451, 1871, 3819, 1881, 8065, 25809, 36257, 107955, 37109}},
+{19581, 18, 103612, {1, 3, 1, 15, 5, 5, 101, 7, 59, 859, 977, 2673, 2825, 3291, 26283, 23467, 28383, 257775}},
+{19582, 18, 103618, {1, 3, 3, 15, 17, 43, 87, 191, 85, 829, 653, 327, 1773, 10101, 2707, 18341, 61435, 242215}},
+{19583, 18, 103637, {1, 3, 7, 13, 27, 43, 127, 253, 403, 81, 505, 2841, 1509, 4951, 23791, 18099, 46747, 192717}},
+{19584, 18, 103644, {1, 1, 1, 9, 31, 15, 127, 29, 171, 999, 1919, 4059, 2781, 2475, 8997, 15459, 37003, 217141}},
+{19585, 18, 103653, {1, 3, 3, 1, 31, 41, 67, 31, 171, 719, 789, 645, 3925, 11117, 1241, 63221, 1087, 59789}},
+{19586, 18, 103663, {1, 1, 1, 9, 17, 41, 107, 13, 405, 879, 1955, 3309, 1281, 10601, 13883, 43987, 111691, 130555}},
+{19587, 18, 103671, {1, 3, 7, 9, 21, 17, 127, 243, 51, 689, 1945, 3769, 7121, 7703, 16825, 34893, 32167, 20167}},
+{19588, 18, 103678, {1, 1, 1, 5, 7, 7, 61, 149, 75, 289, 717, 1951, 5917, 13375, 15683, 27507, 10897, 199009}},
+{19589, 18, 103695, {1, 3, 7, 9, 25, 61, 43, 167, 45, 299, 5, 125, 3289, 13685, 10843, 25535, 98383, 143401}},
+{19590, 18, 103698, {1, 1, 3, 15, 21, 27, 37, 45, 233, 179, 611, 3025, 7887, 9421, 16791, 17147, 49013, 33249}},
+{19591, 18, 103720, {1, 3, 7, 15, 19, 43, 43, 9, 255, 295, 649, 811, 1303, 1989, 5401, 53891, 42679, 66879}},
+{19592, 18, 103723, {1, 1, 7, 7, 25, 31, 89, 199, 455, 733, 295, 1157, 4375, 7341, 7823, 6025, 56311, 257579}},
+{19593, 18, 103738, {1, 1, 7, 3, 1, 51, 15, 29, 35, 917, 1839, 741, 1089, 8615, 4967, 34047, 32981, 200693}},
+{19594, 18, 103743, {1, 3, 3, 11, 21, 13, 71, 53, 315, 801, 1015, 3829, 2297, 6649, 28501, 18173, 83121, 107195}},
+{19595, 18, 103745, {1, 1, 7, 7, 1, 5, 127, 103, 435, 707, 7, 1045, 187, 10927, 32395, 24999, 58463, 94069}},
+{19596, 18, 103757, {1, 1, 7, 9, 11, 25, 73, 57, 231, 455, 1033, 2899, 2861, 8811, 21671, 16115, 97807, 221791}},
+{19597, 18, 103810, {1, 3, 5, 11, 11, 19, 105, 37, 181, 1, 1231, 2275, 4789, 13071, 24843, 25901, 123711, 145609}},
+{19598, 18, 103822, {1, 3, 7, 13, 7, 7, 21, 215, 393, 43, 1713, 2921, 1959, 14417, 17109, 55793, 36285, 81731}},
+{19599, 18, 103855, {1, 1, 5, 15, 29, 15, 5, 115, 15, 795, 1535, 2473, 3663, 10123, 20721, 32739, 21141, 217731}},
+{19600, 18, 103887, {1, 1, 3, 1, 15, 13, 21, 49, 293, 689, 985, 3949, 3329, 7167, 16925, 15069, 47345, 192749}},
+{19601, 18, 103905, {1, 3, 3, 7, 5, 27, 85, 11, 337, 651, 777, 1775, 5279, 15229, 21473, 36561, 85293, 27893}},
+{19602, 18, 103915, {1, 3, 7, 1, 15, 29, 7, 199, 71, 893, 1587, 1831, 3891, 3299, 14323, 23165, 28199, 84055}},
+{19603, 18, 103925, {1, 1, 1, 7, 9, 27, 15, 75, 497, 127, 433, 1781, 3711, 12659, 3765, 40827, 112425, 36281}},
+{19604, 18, 103929, {1, 1, 5, 1, 31, 59, 9, 91, 301, 217, 2013, 2015, 265, 3795, 14609, 13389, 5451, 260169}},
+{19605, 18, 103945, {1, 1, 1, 15, 19, 43, 85, 37, 33, 687, 1253, 2615, 4027, 3741, 13971, 21261, 106261, 204233}},
+{19606, 18, 103954, {1, 1, 7, 9, 31, 45, 105, 111, 207, 433, 633, 3949, 8057, 5049, 23657, 12227, 86251, 218077}},
+{19607, 18, 103969, {1, 3, 5, 11, 13, 33, 1, 67, 117, 595, 1835, 287, 2509, 14841, 1525, 15761, 61319, 182531}},
+{19608, 18, 104011, {1, 1, 3, 9, 7, 43, 105, 85, 17, 349, 1769, 3945, 31, 4907, 9373, 22447, 70905, 29189}},
+{19609, 18, 104055, {1, 1, 5, 5, 9, 19, 93, 179, 95, 255, 1807, 2717, 4757, 15025, 19479, 63499, 42441, 236519}},
+{19610, 18, 104111, {1, 1, 1, 1, 21, 35, 1, 101, 343, 1023, 1311, 347, 301, 8419, 23367, 31543, 51661, 148277}},
+{19611, 18, 104116, {1, 1, 7, 11, 23, 37, 113, 207, 147, 743, 1905, 1683, 3733, 5659, 22491, 62129, 111671, 227019}},
+{19612, 18, 104125, {1, 1, 3, 13, 27, 5, 21, 207, 445, 319, 1355, 2541, 2853, 583, 1261, 64477, 18337, 91611}},
+{19613, 18, 104145, {1, 3, 5, 3, 1, 31, 51, 55, 487, 735, 1599, 523, 5323, 10855, 28717, 62103, 18671, 143885}},
+{19614, 18, 104162, {1, 3, 1, 1, 15, 5, 79, 107, 173, 747, 1213, 1151, 875, 12759, 27115, 16403, 31349, 208909}},
+{19615, 18, 104176, {1, 3, 5, 9, 13, 57, 35, 121, 135, 237, 1707, 3655, 8109, 3623, 5119, 27645, 49401, 46453}},
+{19616, 18, 104193, {1, 3, 7, 11, 27, 3, 103, 231, 43, 515, 1279, 499, 1355, 2605, 11587, 33641, 81661, 29441}},
+{19617, 18, 104199, {1, 3, 5, 7, 13, 27, 55, 191, 81, 185, 527, 519, 4555, 3349, 24533, 60635, 40009, 230761}},
+{19618, 18, 104224, {1, 1, 5, 3, 13, 35, 75, 211, 67, 305, 705, 543, 3819, 16265, 9867, 64309, 35047, 24873}},
+{19619, 18, 104236, {1, 3, 1, 1, 11, 37, 75, 3, 145, 327, 1243, 3291, 7127, 5009, 7757, 59567, 90459, 98035}},
+{19620, 18, 104247, {1, 3, 5, 9, 9, 5, 71, 29, 243, 41, 447, 2597, 1243, 12899, 19681, 30523, 90799, 142279}},
+{19621, 18, 104254, {1, 3, 3, 3, 15, 21, 25, 101, 451, 651, 143, 3899, 3377, 4855, 23843, 25047, 87951, 239229}},
+{19622, 18, 104289, {1, 1, 1, 1, 23, 29, 25, 31, 227, 43, 399, 723, 693, 12379, 11343, 46123, 105435, 224997}},
+{19623, 18, 104325, {1, 1, 7, 3, 21, 47, 77, 57, 397, 689, 267, 813, 1279, 1727, 7451, 34025, 90273, 111663}},
+{19624, 18, 104332, {1, 1, 5, 3, 25, 61, 7, 137, 271, 723, 495, 2575, 3695, 4947, 31973, 47835, 107003, 221839}},
+{19625, 18, 104335, {1, 3, 1, 7, 5, 25, 21, 95, 323, 3, 613, 1721, 2551, 8803, 6803, 52765, 34543, 110945}},
+{19626, 18, 104353, {1, 3, 5, 9, 27, 23, 123, 193, 63, 161, 1395, 679, 161, 13719, 29321, 19243, 51947, 229547}},
+{19627, 18, 104363, {1, 3, 5, 15, 15, 37, 127, 103, 439, 513, 989, 1393, 3761, 9109, 20649, 18171, 69939, 117447}},
+{19628, 18, 104371, {1, 1, 7, 9, 7, 57, 87, 159, 195, 821, 57, 2469, 7693, 6759, 32595, 41109, 94785, 53381}},
+{19629, 18, 104373, {1, 3, 3, 7, 17, 63, 41, 7, 437, 469, 1453, 3741, 7591, 5563, 11819, 23861, 129777, 119731}},
+{19630, 18, 104406, {1, 1, 3, 3, 27, 55, 21, 145, 243, 991, 687, 909, 2105, 4485, 9095, 3677, 53819, 183027}},
+{19631, 18, 104412, {1, 1, 1, 15, 13, 61, 27, 81, 95, 37, 1439, 973, 7613, 5749, 16811, 26801, 105745, 8847}},
+{19632, 18, 104440, {1, 3, 1, 9, 15, 17, 111, 61, 27, 373, 89, 2729, 6397, 4899, 11297, 4403, 30657, 207379}},
+{19633, 18, 104459, {1, 3, 5, 15, 19, 9, 19, 19, 497, 667, 105, 601, 6715, 6355, 4231, 19241, 101771, 105651}},
+{19634, 18, 104461, {1, 1, 3, 9, 11, 11, 115, 109, 177, 753, 997, 2119, 5969, 13377, 13285, 25373, 105023, 158393}},
+{19635, 18, 104469, {1, 3, 5, 15, 27, 23, 19, 117, 129, 457, 1973, 2171, 8071, 2093, 13407, 9295, 82967, 184753}},
+{19636, 18, 104479, {1, 1, 7, 5, 1, 45, 9, 25, 307, 629, 1169, 2859, 3987, 11411, 13609, 44993, 26019, 107003}},
+{19637, 18, 104483, {1, 1, 1, 13, 29, 15, 13, 163, 203, 885, 281, 1605, 8001, 899, 4081, 65467, 61283, 198963}},
+{19638, 18, 104490, {1, 1, 3, 5, 27, 9, 89, 193, 375, 633, 1807, 2069, 3467, 3167, 23751, 39115, 90093, 190365}},
+{19639, 18, 104500, {1, 3, 3, 5, 1, 1, 19, 161, 21, 745, 493, 2227, 7993, 3337, 27041, 4817, 58963, 237015}},
+{19640, 18, 104536, {1, 3, 5, 15, 15, 45, 51, 145, 299, 787, 1059, 2407, 1143, 775, 17473, 22235, 18241, 103897}},
+{19641, 18, 104560, {1, 1, 1, 9, 11, 35, 75, 195, 281, 935, 113, 3009, 4797, 7221, 12475, 18563, 10315, 255541}},
+{19642, 18, 104569, {1, 1, 5, 7, 25, 9, 121, 179, 303, 511, 2041, 1485, 529, 13843, 29013, 28139, 63237, 21259}},
+{19643, 18, 104588, {1, 3, 7, 11, 9, 21, 61, 177, 63, 179, 679, 17, 4069, 8929, 14499, 53913, 27925, 48449}},
+{19644, 18, 104591, {1, 3, 5, 3, 9, 27, 111, 247, 253, 175, 1591, 3583, 3351, 9039, 597, 23859, 126585, 157367}},
+{19645, 18, 104621, {1, 1, 7, 9, 1, 9, 29, 1, 273, 89, 767, 1873, 39, 10487, 29857, 23577, 67457, 44571}},
+{19646, 18, 104661, {1, 1, 7, 5, 5, 23, 13, 181, 283, 333, 21, 1409, 5937, 8981, 7445, 61267, 21729, 32677}},
+{19647, 18, 104675, {1, 3, 1, 15, 31, 5, 45, 253, 179, 91, 341, 359, 4269, 7567, 23699, 30589, 42909, 126171}},
+{19648, 18, 104684, {1, 3, 7, 7, 23, 45, 15, 93, 115, 873, 49, 845, 827, 14357, 20163, 41565, 37105, 120331}},
+{19649, 18, 104713, {1, 1, 7, 7, 15, 25, 55, 175, 11, 457, 1537, 1937, 807, 11399, 27751, 16935, 75231, 204039}},
+{19650, 18, 104747, {1, 3, 7, 13, 1, 37, 67, 145, 471, 1013, 1273, 4093, 4449, 4433, 29063, 205, 93249, 140383}},
+{19651, 18, 104750, {1, 3, 1, 13, 1, 57, 85, 223, 349, 125, 863, 2179, 7813, 8817, 1767, 19169, 41367, 65883}},
+{19652, 18, 104757, {1, 3, 3, 15, 21, 39, 3, 31, 67, 505, 271, 505, 5495, 4183, 3631, 4567, 48061, 149565}},
+{19653, 18, 104775, {1, 1, 7, 11, 13, 39, 109, 201, 287, 1013, 1505, 3105, 3845, 1963, 4361, 61753, 29145, 146235}},
+{19654, 18, 104782, {1, 3, 5, 3, 29, 39, 71, 99, 501, 53, 835, 3295, 5335, 1017, 25913, 63637, 115353, 210509}},
+{19655, 18, 104803, {1, 3, 1, 13, 9, 53, 33, 177, 419, 63, 793, 1329, 2261, 11633, 18805, 49771, 47533, 74949}},
+{19656, 18, 104820, {1, 3, 7, 11, 7, 49, 123, 237, 195, 17, 1919, 1911, 4135, 11829, 26307, 34905, 114361, 228655}},
+{19657, 18, 104824, {1, 3, 5, 3, 5, 57, 65, 161, 195, 857, 1187, 2303, 1975, 2555, 26065, 17963, 57403, 136193}},
+{19658, 18, 104829, {1, 1, 3, 11, 1, 5, 105, 217, 229, 769, 1393, 2419, 7751, 14293, 9407, 4569, 30663, 89345}},
+{19659, 18, 104830, {1, 3, 3, 7, 23, 15, 15, 189, 67, 863, 485, 2435, 5145, 10537, 16485, 50369, 118245, 253201}},
+{19660, 18, 104836, {1, 1, 1, 5, 27, 27, 47, 129, 383, 227, 115, 3027, 1575, 15765, 10207, 4885, 125707, 184703}},
+{19661, 18, 104851, {1, 3, 5, 5, 17, 9, 45, 55, 151, 751, 415, 2139, 8071, 2309, 27641, 29743, 47183, 21437}},
+{19662, 18, 104882, {1, 3, 3, 7, 9, 47, 51, 31, 261, 237, 1695, 1065, 4503, 7167, 25791, 39659, 90145, 130481}},
+{19663, 18, 104920, {1, 1, 3, 3, 21, 27, 53, 249, 407, 779, 1315, 1005, 6953, 14959, 2265, 61645, 118623, 254067}},
+{19664, 18, 104941, {1, 3, 1, 9, 13, 25, 33, 225, 467, 325, 1513, 1237, 1569, 8749, 1587, 4699, 19893, 163597}},
+{19665, 18, 104963, {1, 3, 5, 5, 29, 29, 1, 55, 437, 575, 149, 791, 4243, 4405, 22963, 64125, 21631, 25819}},
+{19666, 18, 104989, {1, 3, 5, 3, 25, 9, 19, 27, 419, 139, 2035, 2065, 1925, 11499, 20053, 13161, 15115, 120891}},
+{19667, 18, 104999, {1, 1, 5, 9, 7, 9, 113, 3, 195, 555, 863, 595, 6569, 9819, 14727, 38285, 13737, 130903}},
+{19668, 18, 105006, {1, 1, 3, 7, 19, 17, 35, 107, 489, 285, 247, 3103, 2919, 11163, 2811, 62081, 42989, 24495}},
+{19669, 18, 105040, {1, 3, 1, 15, 17, 5, 123, 221, 117, 689, 1567, 3803, 5801, 14121, 23263, 8851, 41559, 226271}},
+{19670, 18, 105066, {1, 1, 1, 15, 21, 39, 87, 135, 485, 59, 1899, 2483, 2599, 8783, 6129, 55407, 7291, 217117}},
+{19671, 18, 105089, {1, 1, 3, 11, 27, 53, 45, 241, 51, 829, 121, 3047, 6785, 15127, 13923, 47913, 9087, 112005}},
+{19672, 18, 105120, {1, 1, 1, 13, 5, 9, 45, 37, 235, 497, 871, 1471, 2895, 247, 9085, 39611, 63445, 218391}},
+{19673, 18, 105125, {1, 1, 5, 3, 5, 29, 23, 155, 339, 293, 535, 1569, 2625, 2867, 4639, 53049, 88721, 96903}},
+{19674, 18, 105137, {1, 1, 3, 15, 5, 25, 17, 45, 47, 683, 949, 1381, 5929, 9539, 3345, 59883, 19071, 200411}},
+{19675, 18, 105179, {1, 1, 1, 11, 11, 5, 71, 15, 469, 749, 1763, 541, 7109, 11731, 8463, 35145, 121795, 219441}},
+{19676, 18, 105215, {1, 3, 7, 11, 5, 17, 63, 159, 69, 993, 1519, 1531, 6913, 3901, 22131, 42909, 41299, 261813}},
+{19677, 18, 105244, {1, 1, 3, 5, 21, 27, 27, 197, 339, 275, 2011, 2263, 855, 1939, 21561, 30577, 6515, 124417}},
+{19678, 18, 105258, {1, 3, 5, 15, 25, 35, 91, 31, 269, 857, 327, 3643, 3211, 14401, 18399, 9007, 12897, 25555}},
+{19679, 18, 105263, {1, 1, 7, 15, 19, 47, 127, 157, 407, 867, 943, 1509, 3113, 49, 32131, 46975, 130013, 66457}},
+{19680, 18, 105280, {1, 3, 3, 13, 31, 45, 59, 135, 67, 825, 157, 2441, 2851, 2355, 28115, 14075, 106317, 145945}},
+{19681, 18, 105286, {1, 1, 1, 15, 27, 27, 5, 211, 85, 749, 671, 1341, 6865, 10027, 14419, 20159, 126647, 147893}},
+{19682, 18, 105380, {1, 1, 1, 7, 25, 49, 115, 231, 65, 161, 1409, 573, 2859, 639, 12567, 58459, 73781, 136893}},
+{19683, 18, 105397, {1, 1, 1, 7, 11, 57, 97, 141, 327, 975, 1799, 3051, 365, 9331, 14583, 16723, 113153, 224127}},
+{19684, 18, 105409, {1, 3, 1, 13, 13, 17, 105, 109, 151, 41, 1903, 1685, 2285, 5697, 16559, 34133, 106045, 203217}},
+{19685, 18, 105427, {1, 1, 1, 3, 29, 61, 43, 255, 269, 277, 1847, 3781, 7991, 131, 9833, 34305, 10763, 41869}},
+{19686, 18, 105452, {1, 1, 7, 3, 11, 1, 85, 89, 247, 99, 419, 2041, 3729, 10301, 5291, 36033, 31749, 261871}},
+{19687, 18, 105469, {1, 3, 7, 9, 27, 27, 41, 3, 303, 893, 697, 1631, 5015, 4233, 22827, 3913, 22245, 121193}},
+{19688, 18, 105472, {1, 3, 3, 13, 19, 11, 15, 239, 419, 123, 1213, 185, 4465, 4909, 25421, 18363, 72537, 167939}},
+{19689, 18, 105477, {1, 1, 3, 5, 13, 49, 57, 197, 19, 877, 1465, 2933, 5909, 7147, 1039, 37035, 91209, 126013}},
+{19690, 18, 105490, {1, 1, 3, 5, 23, 7, 63, 179, 59, 47, 1501, 1863, 2949, 13959, 28131, 29705, 107975, 155251}},
+{19691, 18, 105505, {1, 1, 1, 5, 25, 51, 77, 169, 327, 585, 1531, 3367, 3075, 6313, 26725, 453, 68635, 173787}},
+{19692, 18, 105529, {1, 3, 7, 9, 5, 15, 43, 45, 311, 367, 297, 2249, 7507, 4785, 22685, 37279, 121683, 141453}},
+{19693, 18, 105530, {1, 3, 7, 15, 17, 33, 43, 251, 281, 345, 1659, 3729, 7629, 6179, 26107, 64255, 88003, 2545}},
+{19694, 18, 105604, {1, 3, 7, 9, 17, 13, 71, 49, 341, 495, 1975, 173, 5773, 3821, 6615, 50917, 53781, 75557}},
+{19695, 18, 105614, {1, 1, 5, 13, 17, 21, 121, 35, 195, 367, 1191, 1331, 6423, 8425, 7705, 59117, 44575, 225431}},
+{19696, 18, 105622, {1, 1, 1, 5, 25, 39, 89, 65, 449, 491, 211, 2949, 4493, 23, 22571, 4801, 50525, 222563}},
+{19697, 18, 105625, {1, 1, 7, 5, 7, 21, 15, 171, 443, 225, 577, 1841, 8139, 15071, 6095, 60185, 71957, 244753}},
+{19698, 18, 105652, {1, 1, 5, 9, 31, 33, 21, 195, 415, 1003, 441, 627, 2339, 8245, 11187, 55933, 59045, 177455}},
+{19699, 18, 105687, {1, 1, 3, 9, 31, 29, 7, 15, 31, 577, 1435, 1317, 2923, 3807, 29693, 45857, 61787, 213565}},
+{19700, 18, 105693, {1, 3, 7, 15, 17, 51, 65, 87, 295, 811, 753, 1113, 7695, 275, 28331, 46363, 53247, 166993}},
+{19701, 18, 105707, {1, 1, 5, 11, 15, 31, 31, 47, 273, 383, 1831, 3821, 1337, 13257, 415, 35453, 15293, 173095}},
+{19702, 18, 105721, {1, 3, 1, 13, 19, 21, 63, 199, 159, 475, 1257, 3119, 7083, 2861, 21099, 16873, 83583, 186289}},
+{19703, 18, 105730, {1, 1, 7, 13, 15, 23, 11, 103, 387, 899, 261, 2863, 3681, 5683, 5587, 64655, 7411, 148633}},
+{19704, 18, 105736, {1, 3, 1, 13, 1, 45, 5, 173, 379, 287, 1451, 2253, 3811, 10963, 20285, 59681, 81285, 48523}},
+{19705, 18, 105753, {1, 1, 5, 9, 27, 17, 57, 25, 499, 289, 1083, 3057, 793, 5251, 10519, 36647, 67751, 237487}},
+{19706, 18, 105759, {1, 1, 3, 1, 17, 13, 23, 73, 1, 951, 111, 3769, 3611, 4827, 10081, 55919, 21411, 127303}},
+{19707, 18, 105760, {1, 3, 1, 1, 29, 35, 93, 139, 179, 217, 1839, 1907, 4365, 1813, 31985, 28927, 39319, 233413}},
+{19708, 18, 105802, {1, 1, 1, 7, 7, 47, 37, 127, 449, 473, 311, 3833, 3263, 4163, 15985, 50159, 82685, 73273}},
+{19709, 18, 105822, {1, 1, 1, 3, 3, 5, 69, 95, 101, 115, 1575, 63, 1897, 13733, 22149, 8793, 82983, 192553}},
+{19710, 18, 105832, {1, 3, 1, 5, 3, 57, 121, 13, 291, 975, 505, 3105, 6929, 12737, 25869, 29173, 16757, 17733}},
+{19711, 18, 105865, {1, 1, 3, 13, 13, 23, 51, 51, 239, 795, 877, 1547, 6533, 11497, 14309, 32941, 128109, 187313}},
+{19712, 18, 105873, {1, 1, 3, 5, 19, 37, 57, 223, 509, 379, 1235, 1881, 4133, 13219, 5479, 36781, 56155, 231001}},
+{19713, 18, 105874, {1, 1, 1, 5, 25, 45, 111, 183, 37, 875, 1487, 3771, 5593, 6835, 10921, 40697, 114455, 259491}},
+{19714, 18, 105880, {1, 1, 3, 11, 13, 5, 43, 47, 7, 435, 1543, 3835, 1631, 8889, 23567, 24705, 26687, 14261}},
+{19715, 18, 105899, {1, 3, 3, 11, 1, 13, 51, 171, 433, 1011, 679, 1307, 1683, 7379, 7163, 29727, 40209, 259973}},
+{19716, 18, 105902, {1, 3, 1, 5, 25, 33, 111, 11, 303, 815, 1883, 263, 7907, 12637, 19203, 64151, 55739, 240509}},
+{19717, 18, 105909, {1, 3, 5, 7, 23, 51, 3, 183, 425, 47, 231, 807, 1891, 10943, 17873, 20209, 60871, 30269}},
+{19718, 18, 105919, {1, 1, 1, 1, 1, 23, 11, 183, 351, 5, 37, 3883, 1291, 15933, 11379, 53057, 61389, 240547}},
+{19719, 18, 105922, {1, 3, 1, 5, 7, 53, 97, 29, 239, 805, 1929, 1001, 5103, 11, 24695, 7825, 109755, 254717}},
+{19720, 18, 105946, {1, 3, 3, 11, 15, 37, 115, 117, 391, 313, 1761, 3627, 3931, 10277, 1767, 25401, 123827, 60463}},
+{19721, 18, 105975, {1, 1, 7, 9, 9, 61, 23, 65, 473, 579, 1979, 415, 629, 3613, 27409, 46909, 3281, 3883}},
+{19722, 18, 105992, {1, 3, 3, 13, 25, 17, 71, 247, 297, 451, 153, 1949, 2727, 6427, 19815, 54013, 129363, 248237}},
+{19723, 18, 106005, {1, 1, 7, 7, 29, 9, 57, 171, 159, 287, 693, 1365, 4665, 5255, 15013, 21225, 125409, 5893}},
+{19724, 18, 106057, {1, 3, 3, 1, 9, 43, 13, 139, 359, 267, 115, 2025, 693, 4789, 10353, 60459, 30835, 56575}},
+{19725, 18, 106081, {1, 1, 1, 7, 23, 35, 35, 77, 245, 705, 75, 2841, 1683, 6109, 19661, 49021, 25019, 7297}},
+{19726, 18, 106093, {1, 3, 1, 5, 1, 19, 49, 53, 19, 435, 1471, 409, 7051, 7057, 3621, 42925, 59551, 70941}},
+{19727, 18, 106117, {1, 3, 7, 5, 21, 27, 39, 221, 389, 255, 537, 597, 7729, 10473, 6657, 13261, 11303, 112409}},
+{19728, 18, 106127, {1, 3, 7, 13, 29, 29, 81, 107, 329, 25, 537, 561, 2247, 10371, 30031, 20537, 28437, 113319}},
+{19729, 18, 106135, {1, 1, 5, 9, 9, 7, 89, 155, 337, 829, 755, 3259, 3563, 11849, 31179, 43297, 79601, 187545}},
+{19730, 18, 106141, {1, 3, 3, 5, 11, 63, 101, 159, 357, 627, 587, 3233, 405, 4083, 5953, 44541, 110723, 240573}},
+{19731, 18, 106189, {1, 1, 3, 15, 5, 39, 87, 231, 455, 195, 1603, 315, 3869, 6375, 745, 28349, 56469, 119033}},
+{19732, 18, 106190, {1, 1, 7, 1, 11, 7, 79, 47, 391, 585, 1299, 3237, 7345, 15959, 4293, 43285, 111737, 215923}},
+{19733, 18, 106197, {1, 1, 3, 15, 21, 53, 113, 73, 265, 589, 299, 289, 3983, 1653, 17407, 15287, 53199, 44221}},
+{19734, 18, 106214, {1, 3, 1, 3, 1, 13, 31, 41, 509, 523, 401, 2647, 2731, 5699, 15649, 51737, 81249, 230865}},
+{19735, 18, 106237, {1, 3, 5, 3, 15, 53, 91, 209, 249, 243, 1119, 2531, 319, 9259, 26555, 59579, 28767, 235073}},
+{19736, 18, 106245, {1, 1, 1, 13, 29, 25, 57, 3, 413, 945, 841, 1151, 7167, 2545, 7283, 3947, 109375, 148677}},
+{19737, 18, 106257, {1, 3, 3, 7, 29, 27, 81, 141, 21, 771, 577, 897, 73, 13081, 30035, 49213, 90627, 7483}},
+{19738, 18, 106300, {1, 3, 1, 13, 23, 11, 19, 159, 183, 789, 683, 2071, 7107, 3025, 27333, 9571, 69621, 48529}},
+{19739, 18, 106335, {1, 3, 1, 9, 5, 43, 7, 123, 341, 75, 1709, 135, 7929, 14563, 6849, 32783, 91971, 223789}},
+{19740, 18, 106351, {1, 1, 7, 3, 19, 13, 45, 229, 7, 559, 1895, 2649, 7593, 1063, 17715, 45019, 29743, 37819}},
+{19741, 18, 106370, {1, 1, 5, 3, 11, 25, 11, 169, 249, 415, 249, 209, 2223, 5947, 23381, 12109, 37697, 131729}},
+{19742, 18, 106375, {1, 1, 1, 7, 19, 47, 125, 117, 235, 825, 801, 921, 2363, 1261, 20529, 65445, 55315, 173561}},
+{19743, 18, 106376, {1, 1, 1, 1, 5, 39, 31, 11, 239, 333, 727, 3991, 1453, 2201, 18129, 3513, 112057, 109673}},
+{19744, 18, 106384, {1, 1, 7, 5, 21, 59, 37, 255, 261, 1, 1401, 1101, 1233, 3813, 22809, 39389, 66263, 191623}},
+{19745, 18, 106403, {1, 3, 1, 7, 5, 51, 73, 85, 319, 671, 1149, 1631, 6021, 10711, 3813, 36485, 106147, 202021}},
+{19746, 18, 106405, {1, 3, 3, 13, 7, 63, 59, 253, 337, 453, 61, 209, 2809, 10429, 28069, 55971, 57985, 244779}},
+{19747, 18, 106406, {1, 1, 1, 9, 27, 59, 45, 101, 427, 713, 1667, 2965, 6161, 1235, 8793, 2387, 66031, 85151}},
+{19748, 18, 106429, {1, 1, 3, 1, 5, 25, 101, 7, 449, 149, 823, 725, 6803, 11949, 13009, 14785, 45633, 241957}},
+{19749, 18, 106447, {1, 3, 7, 15, 29, 45, 103, 151, 159, 23, 1353, 3541, 5909, 4173, 31391, 16179, 38289, 206603}},
+{19750, 18, 106466, {1, 1, 7, 7, 23, 3, 97, 29, 141, 383, 379, 3189, 4399, 4545, 30797, 55827, 126223, 97049}},
+{19751, 18, 106495, {1, 3, 3, 7, 25, 35, 61, 15, 349, 929, 65, 3697, 7637, 12239, 29051, 36001, 114513, 151069}},
+{19752, 18, 106532, {1, 3, 3, 11, 19, 1, 23, 245, 9, 689, 1251, 1043, 2393, 15817, 31561, 21059, 3435, 228091}},
+{19753, 18, 106542, {1, 3, 7, 3, 23, 17, 121, 147, 427, 47, 905, 3877, 2301, 15709, 13599, 48895, 108955, 53219}},
+{19754, 18, 106547, {1, 3, 7, 3, 25, 31, 53, 143, 1, 841, 1691, 749, 6713, 5373, 23487, 25749, 13911, 240923}},
+{19755, 18, 106564, {1, 3, 5, 3, 7, 39, 101, 83, 159, 187, 583, 721, 7745, 1119, 61, 27319, 35157, 241729}},
+{19756, 18, 106576, {1, 1, 5, 11, 27, 21, 79, 199, 179, 463, 987, 3909, 1741, 503, 12339, 15323, 4063, 180337}},
+{19757, 18, 106586, {1, 3, 7, 11, 23, 43, 7, 115, 489, 215, 209, 3213, 4057, 13221, 27061, 52037, 34921, 36385}},
+{19758, 18, 106592, {1, 1, 7, 1, 15, 13, 113, 55, 207, 839, 1939, 4095, 5629, 7647, 12753, 59739, 60779, 196589}},
+{19759, 18, 106597, {1, 1, 1, 5, 5, 13, 113, 243, 297, 513, 1615, 1513, 1247, 4025, 20901, 44775, 86987, 75437}},
+{19760, 18, 106610, {1, 1, 3, 7, 7, 35, 77, 115, 223, 929, 1683, 949, 2191, 15533, 29471, 24103, 102475, 173027}},
+{19761, 18, 106612, {1, 3, 1, 11, 23, 37, 7, 179, 287, 267, 319, 3147, 1481, 12297, 28185, 51423, 7505, 236225}},
+{19762, 18, 106635, {1, 1, 3, 5, 27, 5, 71, 95, 289, 121, 939, 3543, 365, 4903, 10091, 3903, 111155, 83517}},
+{19763, 18, 106640, {1, 1, 7, 9, 29, 3, 87, 245, 313, 973, 1181, 3389, 3697, 13237, 13703, 31557, 17269, 17329}},
+{19764, 18, 106673, {1, 1, 5, 11, 5, 41, 117, 51, 239, 907, 809, 741, 5327, 3403, 11825, 46981, 93485, 38053}},
+{19765, 18, 106691, {1, 1, 7, 1, 25, 41, 5, 169, 11, 599, 1451, 2189, 7255, 8441, 11169, 58313, 4387, 69}},
+{19766, 18, 106724, {1, 3, 1, 13, 5, 21, 75, 229, 153, 355, 1511, 175, 4793, 12111, 25321, 39983, 84205, 195003}},
+{19767, 18, 106731, {1, 1, 7, 1, 17, 61, 67, 181, 69, 149, 921, 1107, 6319, 431, 29481, 12507, 13109, 29527}},
+{19768, 18, 106741, {1, 1, 5, 5, 27, 47, 69, 119, 469, 193, 513, 1573, 7421, 2723, 20997, 59585, 49645, 261259}},
+{19769, 18, 106748, {1, 1, 3, 9, 27, 41, 41, 3, 181, 803, 1281, 2937, 6745, 5629, 8403, 18987, 98411, 128321}},
+{19770, 18, 106765, {1, 3, 3, 9, 5, 29, 55, 223, 309, 841, 1049, 1163, 3497, 8935, 8529, 51367, 90693, 77463}},
+{19771, 18, 106789, {1, 3, 5, 3, 3, 59, 23, 31, 309, 907, 107, 3471, 4365, 14463, 24093, 35435, 24587, 151163}},
+{19772, 18, 106822, {1, 3, 3, 1, 11, 37, 99, 95, 485, 601, 1797, 891, 5645, 8927, 22085, 5185, 18495, 260455}},
+{19773, 18, 106856, {1, 3, 7, 15, 31, 61, 5, 177, 159, 287, 311, 1377, 1419, 4387, 25297, 22505, 100937, 223785}},
+{19774, 18, 106861, {1, 3, 3, 3, 27, 31, 45, 171, 95, 507, 1475, 4013, 2781, 133, 6857, 3367, 103455, 69559}},
+{19775, 18, 106870, {1, 3, 3, 7, 9, 51, 47, 247, 213, 665, 1929, 2799, 5513, 9183, 20197, 14831, 75277, 187565}},
+{19776, 18, 106883, {1, 3, 1, 9, 13, 11, 15, 253, 145, 31, 847, 1579, 5513, 9, 3327, 46049, 16709, 56353}},
+{19777, 18, 106895, {1, 3, 3, 3, 9, 17, 59, 131, 3, 621, 1209, 3415, 2999, 127, 629, 7925, 6109, 59743}},
+{19778, 18, 106928, {1, 1, 5, 15, 29, 35, 87, 197, 495, 671, 51, 293, 3943, 7969, 4739, 10161, 119943, 97217}},
+{19779, 18, 106938, {1, 1, 1, 9, 25, 57, 61, 197, 139, 899, 783, 3835, 3407, 16301, 19033, 33359, 56309, 16237}},
+{19780, 18, 106979, {1, 1, 5, 11, 25, 47, 95, 121, 197, 511, 227, 2281, 5805, 10581, 14885, 19685, 28075, 25431}},
+{19781, 18, 106985, {1, 1, 3, 9, 1, 43, 59, 105, 319, 45, 1567, 905, 7641, 2199, 3979, 13717, 22829, 44777}},
+{19782, 18, 107005, {1, 3, 7, 1, 19, 49, 105, 53, 227, 293, 989, 697, 2553, 4561, 14851, 8999, 74815, 207475}},
+{19783, 18, 107012, {1, 1, 5, 11, 23, 3, 85, 29, 419, 847, 1385, 3857, 641, 14951, 25629, 18019, 2497, 24723}},
+{19784, 18, 107019, {1, 3, 5, 15, 5, 11, 51, 225, 179, 695, 787, 663, 7051, 3595, 4987, 53315, 88693, 7915}},
+{19785, 18, 107045, {1, 3, 1, 13, 17, 51, 51, 247, 431, 555, 603, 3301, 443, 629, 26509, 32047, 54433, 208297}},
+{19786, 18, 107052, {1, 3, 7, 7, 13, 41, 95, 105, 135, 443, 377, 1259, 3301, 6945, 11677, 33869, 107799, 186567}},
+{19787, 18, 107082, {1, 1, 5, 7, 31, 17, 85, 129, 409, 781, 983, 25, 6877, 83, 12625, 31919, 41989, 55195}},
+{19788, 18, 107089, {1, 1, 3, 3, 7, 45, 37, 45, 237, 967, 1371, 657, 7983, 3121, 32707, 25757, 49987, 92683}},
+{19789, 18, 107118, {1, 3, 1, 1, 19, 57, 63, 25, 355, 893, 2017, 1671, 7343, 4451, 28243, 22157, 103901, 178017}},
+{19790, 18, 107163, {1, 3, 7, 13, 17, 59, 81, 99, 329, 117, 1395, 2565, 5725, 2371, 343, 4713, 35077, 49793}},
+{19791, 18, 107202, {1, 3, 7, 15, 31, 19, 87, 243, 411, 339, 1063, 117, 1827, 1583, 12571, 23153, 3363, 81695}},
+{19792, 18, 107238, {1, 3, 7, 1, 3, 49, 95, 133, 295, 433, 1885, 843, 6679, 13673, 32277, 59085, 46957, 217037}},
+{19793, 18, 107242, {1, 1, 3, 9, 23, 53, 45, 183, 79, 55, 1267, 283, 3249, 4101, 8107, 54473, 126141, 127235}},
+{19794, 18, 107244, {1, 3, 5, 7, 19, 57, 113, 205, 37, 817, 929, 3643, 2231, 15725, 1733, 7877, 116741, 254529}},
+{19795, 18, 107264, {1, 3, 1, 9, 9, 7, 75, 45, 83, 203, 1401, 445, 1043, 239, 30865, 32189, 91081, 180681}},
+{19796, 18, 107273, {1, 1, 7, 7, 1, 3, 61, 255, 483, 599, 897, 1601, 5189, 13279, 4981, 37235, 117505, 66625}},
+{19797, 18, 107291, {1, 1, 3, 13, 29, 43, 65, 73, 213, 307, 959, 2735, 5155, 16063, 15745, 6225, 50159, 182445}},
+{19798, 18, 107293, {1, 1, 3, 9, 31, 61, 73, 185, 457, 687, 1887, 4041, 3455, 4739, 16399, 40929, 32631, 179031}},
+{19799, 18, 107312, {1, 3, 3, 15, 5, 45, 1, 241, 187, 23, 63, 2497, 7759, 9175, 11003, 40579, 45769, 107133}},
+{19800, 18, 107318, {1, 3, 3, 7, 5, 63, 7, 67, 31, 917, 1825, 2037, 2527, 9767, 2665, 18573, 14289, 21583}},
+{19801, 18, 107335, {1, 1, 5, 15, 15, 25, 51, 127, 261, 925, 1651, 769, 7779, 7327, 7239, 20437, 9947, 144697}},
+{19802, 18, 107349, {1, 1, 5, 1, 5, 13, 99, 7, 269, 135, 345, 1851, 7963, 457, 24573, 32529, 127359, 157755}},
+{19803, 18, 107350, {1, 3, 5, 15, 21, 17, 31, 115, 321, 351, 117, 1301, 2455, 3363, 14213, 62903, 75273, 261119}},
+{19804, 18, 107363, {1, 3, 7, 1, 1, 9, 53, 209, 319, 489, 827, 1365, 4709, 7419, 28213, 56095, 9611, 234877}},
+{19805, 18, 107390, {1, 1, 5, 5, 1, 7, 49, 15, 377, 309, 1701, 1775, 5571, 12437, 27521, 54753, 68977, 138549}},
+{19806, 18, 107405, {1, 1, 3, 11, 9, 29, 67, 21, 411, 647, 983, 1075, 2387, 13355, 1781, 56129, 87235, 260133}},
+{19807, 18, 107408, {1, 3, 1, 11, 5, 57, 71, 159, 345, 853, 745, 3733, 1607, 7265, 20097, 18911, 101141, 70495}},
+{19808, 18, 107427, {1, 1, 3, 9, 1, 43, 127, 127, 471, 465, 1777, 1879, 4655, 12925, 24935, 58445, 78303, 200463}},
+{19809, 18, 107433, {1, 1, 1, 15, 5, 33, 63, 17, 401, 831, 1559, 3547, 7869, 13901, 18185, 9399, 65859, 185315}},
+{19810, 18, 107444, {1, 3, 7, 1, 25, 21, 17, 175, 401, 833, 847, 3593, 1283, 14745, 11827, 1987, 89299, 187369}},
+{19811, 18, 107514, {1, 1, 7, 13, 29, 31, 45, 219, 177, 369, 1313, 3015, 5859, 1829, 8793, 49109, 97581, 233179}},
+{19812, 18, 107522, {1, 3, 3, 15, 17, 31, 61, 215, 231, 495, 1307, 3067, 3187, 8813, 22505, 14055, 30773, 177955}},
+{19813, 18, 107545, {1, 3, 7, 15, 9, 61, 57, 105, 89, 267, 233, 905, 3727, 1841, 31875, 32499, 27003, 208491}},
+{19814, 18, 107582, {1, 3, 1, 11, 31, 9, 63, 55, 213, 209, 1625, 2635, 4335, 15201, 6127, 11097, 37991, 62813}},
+{19815, 18, 107590, {1, 1, 1, 5, 13, 49, 127, 249, 339, 525, 1943, 2935, 3255, 5199, 6869, 6325, 731, 51085}},
+{19816, 18, 107593, {1, 1, 5, 7, 7, 29, 59, 187, 463, 409, 1321, 377, 7361, 8303, 20385, 39649, 81379, 235555}},
+{19817, 18, 107599, {1, 1, 5, 13, 15, 45, 99, 57, 217, 535, 1747, 4081, 4781, 1005, 25197, 23853, 90587, 189579}},
+{19818, 18, 107604, {1, 1, 7, 7, 23, 31, 1, 151, 339, 447, 523, 2609, 5917, 6965, 25815, 62797, 104083, 245917}},
+{19819, 18, 107608, {1, 3, 5, 3, 7, 37, 79, 253, 423, 511, 1477, 3121, 5557, 1413, 31075, 22249, 117639, 243543}},
+{19820, 18, 107627, {1, 1, 3, 7, 5, 31, 93, 117, 135, 235, 745, 3287, 4451, 2487, 15179, 62229, 18247, 150277}},
+{19821, 18, 107638, {1, 1, 7, 15, 31, 57, 125, 219, 433, 629, 1809, 2499, 6083, 7631, 31495, 63183, 28533, 120579}},
+{19822, 18, 107666, {1, 1, 1, 13, 31, 47, 77, 73, 343, 867, 1055, 1121, 3035, 15693, 6971, 50231, 16527, 190795}},
+{19823, 18, 107678, {1, 3, 7, 7, 11, 1, 5, 215, 87, 885, 1429, 1277, 3831, 9341, 22011, 34585, 56167, 65301}},
+{19824, 18, 107701, {1, 3, 1, 15, 13, 53, 91, 59, 277, 819, 453, 3191, 757, 4729, 20605, 4283, 110745, 233655}},
+{19825, 18, 107720, {1, 3, 3, 5, 17, 47, 69, 117, 113, 775, 935, 1879, 2239, 5877, 18337, 50895, 44891, 2759}},
+{19826, 18, 107723, {1, 3, 5, 1, 27, 31, 77, 65, 355, 405, 825, 2419, 3337, 10179, 27665, 35459, 13721, 154227}},
+{19827, 18, 107725, {1, 3, 3, 7, 23, 61, 9, 241, 239, 85, 485, 2659, 5371, 16175, 28691, 49109, 124433, 167033}},
+{19828, 18, 107731, {1, 3, 3, 3, 11, 57, 37, 155, 443, 249, 1913, 1347, 6569, 5357, 4231, 58273, 50707, 57097}},
+{19829, 18, 107737, {1, 1, 3, 3, 1, 7, 87, 115, 259, 807, 45, 2997, 63, 16313, 12507, 39925, 17699, 24411}},
+{19830, 18, 107767, {1, 3, 3, 1, 19, 59, 97, 209, 247, 395, 21, 1803, 2547, 11607, 15703, 58099, 111907, 196101}},
+{19831, 18, 107779, {1, 1, 7, 13, 27, 61, 73, 183, 493, 953, 445, 567, 7373, 15275, 30081, 539, 89365, 3455}},
+{19832, 18, 107788, {1, 3, 1, 3, 25, 35, 3, 105, 243, 781, 1937, 2781, 7849, 2159, 2221, 58005, 89313, 182183}},
+{19833, 18, 107799, {1, 1, 7, 15, 21, 7, 67, 163, 179, 453, 581, 2245, 3915, 8985, 16809, 35113, 93605, 79009}},
+{19834, 18, 107819, {1, 1, 7, 5, 29, 57, 13, 75, 387, 511, 331, 1119, 307, 6145, 3841, 49987, 67335, 120419}},
+{19835, 18, 107833, {1, 3, 1, 5, 13, 21, 119, 207, 453, 943, 137, 2245, 7771, 5737, 9541, 29209, 106867, 110513}},
+{19836, 18, 107881, {1, 3, 7, 13, 7, 3, 99, 129, 245, 687, 883, 1321, 1131, 6661, 7437, 1345, 128247, 167877}},
+{19837, 18, 107901, {1, 1, 3, 11, 7, 57, 59, 3, 217, 549, 85, 2607, 215, 2249, 3963, 42931, 33747, 226265}},
+{19838, 18, 107911, {1, 1, 5, 5, 29, 23, 115, 215, 103, 427, 1689, 831, 3293, 14055, 3735, 49521, 17703, 182887}},
+{19839, 18, 107930, {1, 1, 1, 15, 5, 43, 27, 181, 217, 955, 225, 2731, 7347, 14123, 26169, 4371, 26907, 15017}},
+{19840, 18, 107936, {1, 1, 7, 7, 31, 55, 63, 223, 61, 63, 431, 2779, 3169, 14323, 2945, 63913, 85407, 76511}},
+{19841, 18, 107980, {1, 1, 3, 11, 5, 27, 113, 75, 313, 697, 13, 1853, 7467, 5701, 16749, 17939, 13475, 39807}},
+{19842, 18, 108004, {1, 1, 7, 5, 13, 53, 55, 115, 125, 341, 321, 3291, 2675, 13659, 16819, 45397, 42917, 104361}},
+{19843, 18, 108008, {1, 3, 3, 15, 27, 47, 19, 213, 441, 605, 593, 2287, 4847, 10505, 22185, 36157, 10881, 87799}},
+{19844, 18, 108016, {1, 1, 1, 11, 15, 39, 109, 3, 469, 371, 1743, 2789, 199, 8703, 7407, 3353, 103417, 73319}},
+{19845, 18, 108066, {1, 3, 7, 5, 25, 61, 77, 111, 263, 399, 1579, 3447, 6205, 5945, 28099, 39183, 77003, 115001}},
+{19846, 18, 108071, {1, 1, 1, 3, 1, 7, 57, 193, 379, 923, 151, 2227, 7285, 2371, 24567, 34037, 80655, 125499}},
+{19847, 18, 108107, {1, 3, 5, 7, 13, 15, 5, 193, 55, 319, 1851, 2439, 8071, 5329, 3155, 64669, 18547, 238997}},
+{19848, 18, 108110, {1, 3, 3, 11, 7, 23, 1, 203, 333, 951, 153, 1249, 5093, 407, 361, 14175, 45149, 186291}},
+{19849, 18, 108124, {1, 3, 1, 11, 13, 19, 89, 229, 139, 981, 455, 907, 5109, 8513, 23823, 54933, 69985, 227679}},
+{19850, 18, 108145, {1, 3, 5, 13, 23, 47, 65, 123, 115, 759, 375, 1283, 729, 11045, 22015, 18287, 112603, 75911}},
+{19851, 18, 108148, {1, 1, 3, 1, 5, 43, 91, 123, 219, 409, 517, 3999, 1409, 5949, 15727, 62705, 73573, 198447}},
+{19852, 18, 108158, {1, 3, 3, 3, 5, 23, 95, 51, 275, 455, 1831, 2427, 3779, 10209, 30839, 23393, 25681, 8715}},
+{19853, 18, 108164, {1, 3, 5, 3, 9, 5, 61, 97, 497, 397, 695, 517, 3313, 4911, 1961, 45805, 99135, 216657}},
+{19854, 18, 108197, {1, 1, 1, 7, 13, 41, 19, 31, 103, 1005, 73, 1855, 405, 12395, 19979, 17663, 105183, 28493}},
+{19855, 18, 108198, {1, 3, 1, 11, 27, 27, 69, 149, 1, 225, 1809, 1367, 3663, 6545, 8475, 40837, 64459, 66705}},
+{19856, 18, 108219, {1, 3, 3, 1, 29, 21, 113, 149, 215, 443, 1069, 3437, 1793, 13573, 28285, 33707, 29127, 40715}},
+{19857, 18, 108222, {1, 3, 3, 5, 21, 9, 53, 181, 455, 283, 245, 3999, 875, 9799, 10963, 31603, 34907, 64977}},
+{19858, 18, 108224, {1, 3, 1, 11, 31, 51, 29, 103, 61, 529, 777, 1097, 445, 9169, 6305, 4513, 60189, 164103}},
+{19859, 18, 108227, {1, 1, 1, 3, 21, 5, 87, 11, 461, 637, 1283, 1471, 1429, 2401, 12163, 29401, 30089, 41745}},
+{19860, 18, 108290, {1, 1, 3, 3, 17, 43, 13, 153, 73, 419, 747, 279, 7195, 4383, 26345, 28365, 97753, 208989}},
+{19861, 18, 108302, {1, 3, 7, 1, 17, 55, 103, 151, 327, 575, 1923, 1533, 4699, 2171, 15447, 64047, 59007, 54523}},
+{19862, 18, 108329, {1, 3, 7, 7, 3, 51, 79, 39, 403, 599, 161, 2465, 4911, 10327, 23599, 3267, 44177, 184231}},
+{19863, 18, 108335, {1, 3, 3, 15, 5, 19, 57, 83, 507, 927, 665, 3471, 5037, 2051, 22923, 36813, 97393, 102715}},
+{19864, 18, 108338, {1, 3, 3, 13, 11, 19, 91, 179, 113, 295, 855, 2071, 3265, 4089, 8627, 7461, 23855, 53675}},
+{19865, 18, 108362, {1, 1, 3, 5, 21, 41, 11, 227, 87, 417, 209, 2013, 4849, 5291, 22073, 40235, 71283, 140785}},
+{19866, 18, 108398, {1, 3, 3, 5, 29, 57, 95, 65, 177, 177, 1973, 563, 5249, 337, 7611, 45099, 15443, 46583}},
+{19867, 18, 108405, {1, 1, 7, 3, 3, 5, 107, 75, 31, 293, 821, 1837, 2363, 13621, 8793, 29841, 127201, 131707}},
+{19868, 18, 108409, {1, 1, 1, 5, 1, 45, 69, 61, 157, 999, 183, 3431, 3487, 9461, 17545, 26973, 115527, 58419}},
+{19869, 18, 108431, {1, 1, 7, 7, 27, 5, 125, 153, 191, 745, 125, 2807, 5043, 10657, 24487, 19517, 31735, 42421}},
+{19870, 18, 108449, {1, 1, 7, 9, 25, 37, 73, 255, 141, 229, 1723, 1331, 6089, 13109, 30683, 2335, 111517, 105411}},
+{19871, 18, 108474, {1, 1, 5, 7, 3, 61, 79, 203, 423, 669, 1757, 1725, 4239, 7013, 28591, 61853, 81103, 39813}},
+{19872, 18, 108488, {1, 1, 3, 7, 21, 27, 23, 119, 441, 113, 1019, 285, 53, 8643, 31689, 2629, 126573, 60835}},
+{19873, 18, 108530, {1, 1, 5, 11, 29, 49, 23, 55, 441, 809, 1177, 1371, 5945, 6461, 11537, 12287, 85637, 232065}},
+{19874, 18, 108545, {1, 3, 1, 15, 5, 13, 19, 209, 105, 897, 565, 3209, 487, 9837, 22169, 26317, 39907, 185193}},
+{19875, 18, 108551, {1, 1, 1, 5, 23, 45, 49, 55, 501, 213, 1217, 3159, 733, 5889, 5475, 4953, 37317, 100369}},
+{19876, 18, 108558, {1, 1, 5, 1, 19, 5, 57, 137, 361, 605, 1077, 2015, 5511, 4667, 18457, 45979, 120253, 203397}},
+{19877, 18, 108585, {1, 1, 7, 9, 19, 19, 11, 187, 5, 647, 275, 1265, 7587, 16183, 369, 31885, 58347, 36829}},
+{19878, 18, 108613, {1, 3, 5, 3, 31, 31, 7, 105, 359, 839, 641, 3215, 4807, 13397, 885, 52867, 57125, 180607}},
+{19879, 18, 108638, {1, 1, 7, 9, 19, 45, 43, 211, 429, 757, 1637, 1569, 935, 8899, 24823, 18599, 111373, 190979}},
+{19880, 18, 108642, {1, 1, 7, 7, 13, 47, 3, 241, 467, 209, 323, 3467, 4397, 15395, 15373, 14499, 92443, 65931}},
+{19881, 18, 108653, {1, 3, 3, 5, 5, 9, 67, 115, 45, 279, 1753, 1575, 8127, 9651, 5169, 25643, 29671, 214383}},
+{19882, 18, 108671, {1, 3, 7, 7, 29, 7, 37, 205, 495, 445, 1771, 1439, 3577, 10423, 10865, 26851, 15251, 63373}},
+{19883, 18, 108675, {1, 3, 1, 9, 29, 13, 45, 61, 153, 193, 1407, 1075, 4023, 2367, 1147, 51277, 52975, 123061}},
+{19884, 18, 108684, {1, 3, 3, 3, 31, 25, 113, 173, 345, 565, 145, 3437, 7051, 12557, 27919, 41733, 76717, 192645}},
+{19885, 18, 108687, {1, 3, 3, 7, 3, 55, 35, 219, 55, 467, 635, 3833, 3753, 1099, 15301, 53121, 120807, 70481}},
+{19886, 18, 108696, {1, 3, 7, 7, 13, 1, 121, 191, 71, 193, 1891, 2303, 1401, 9143, 31297, 38979, 43093, 138941}},
+{19887, 18, 108786, {1, 3, 7, 5, 17, 51, 83, 201, 231, 423, 511, 1301, 6075, 475, 2603, 49327, 78565, 220827}},
+{19888, 18, 108792, {1, 3, 1, 7, 5, 61, 23, 11, 9, 711, 251, 1383, 613, 6213, 8921, 27267, 66009, 28575}},
+{19889, 18, 108795, {1, 3, 1, 3, 13, 13, 61, 211, 353, 883, 343, 1089, 2041, 7781, 25285, 9053, 76801, 153009}},
+{19890, 18, 108818, {1, 3, 7, 5, 17, 61, 67, 69, 361, 937, 949, 1483, 2825, 3753, 16533, 17277, 16539, 140521}},
+{19891, 18, 108830, {1, 3, 5, 9, 7, 19, 31, 239, 357, 561, 1583, 3059, 2023, 2213, 11283, 18603, 83487, 162415}},
+{19892, 18, 108836, {1, 1, 3, 15, 15, 59, 9, 43, 353, 203, 765, 1907, 2733, 3747, 30617, 32671, 119005, 72131}},
+{19893, 18, 108839, {1, 3, 1, 7, 17, 61, 55, 113, 439, 75, 703, 2741, 1059, 4561, 15923, 17153, 32563, 79681}},
+{19894, 18, 108851, {1, 1, 1, 15, 11, 57, 91, 245, 187, 185, 1859, 1209, 3247, 10863, 22421, 47287, 26831, 200935}},
+{19895, 18, 108875, {1, 1, 3, 13, 11, 39, 61, 211, 51, 197, 861, 2965, 4691, 9955, 2289, 28795, 61537, 235359}},
+{19896, 18, 108883, {1, 1, 7, 1, 31, 37, 121, 107, 79, 521, 371, 983, 6189, 4515, 25691, 26933, 123189, 70033}},
+{19897, 18, 108895, {1, 3, 3, 15, 19, 33, 31, 237, 35, 877, 1013, 3445, 573, 1145, 27781, 26327, 117451, 142339}},
+{19898, 18, 108908, {1, 3, 3, 15, 15, 9, 17, 185, 151, 499, 493, 1331, 1587, 12657, 22577, 7957, 126253, 57971}},
+{19899, 18, 108953, {1, 3, 7, 15, 3, 29, 43, 105, 423, 601, 793, 1011, 6657, 7287, 18561, 46993, 72945, 233051}},
+{19900, 18, 108956, {1, 1, 7, 5, 15, 17, 125, 141, 75, 877, 281, 2011, 4217, 9785, 7587, 42863, 35585, 212795}},
+{19901, 18, 108963, {1, 1, 3, 3, 3, 37, 67, 129, 433, 233, 115, 687, 6253, 12805, 10935, 49963, 91675, 241951}},
+{19902, 18, 108989, {1, 3, 1, 5, 3, 41, 3, 233, 317, 959, 1407, 1251, 743, 4165, 15561, 41165, 22393, 111633}},
+{19903, 18, 109001, {1, 3, 3, 15, 17, 15, 53, 245, 109, 413, 1149, 35, 2931, 11635, 27091, 63659, 33973, 16867}},
+{19904, 18, 109009, {1, 3, 7, 13, 3, 43, 83, 201, 367, 275, 235, 1795, 4041, 13539, 22345, 31451, 83985, 3527}},
+{19905, 18, 109052, {1, 3, 3, 9, 31, 47, 63, 117, 195, 497, 453, 1183, 3857, 14075, 28057, 13205, 54331, 54641}},
+{19906, 18, 109083, {1, 1, 7, 11, 11, 39, 37, 183, 213, 537, 1371, 901, 5255, 11791, 18993, 58785, 114113, 229815}},
+{19907, 18, 109090, {1, 3, 5, 5, 13, 45, 77, 165, 329, 439, 2011, 1845, 4577, 12457, 16959, 45943, 37715, 169775}},
+{19908, 18, 109104, {1, 1, 3, 11, 5, 7, 21, 245, 365, 371, 1291, 2569, 1791, 6003, 18619, 18661, 98551, 89645}},
+{19909, 18, 109121, {1, 3, 1, 7, 3, 51, 49, 245, 151, 919, 489, 3967, 3157, 7159, 17207, 19749, 94455, 112403}},
+{19910, 18, 109128, {1, 3, 7, 5, 9, 15, 17, 201, 273, 669, 1571, 3915, 1859, 2569, 28855, 27225, 116711, 148377}},
+{19911, 18, 109141, {1, 3, 7, 3, 19, 45, 115, 71, 201, 85, 1349, 3897, 4941, 10839, 14781, 36487, 107037, 109185}},
+{19912, 18, 109146, {1, 3, 5, 13, 11, 11, 35, 19, 213, 41, 45, 4075, 3163, 12937, 17487, 28911, 21289, 198489}},
+{19913, 18, 109155, {1, 1, 1, 11, 7, 35, 67, 23, 451, 235, 717, 181, 6697, 9359, 24561, 36187, 125179, 35119}},
+{19914, 18, 109162, {1, 1, 7, 15, 7, 47, 55, 125, 465, 251, 211, 3137, 4101, 1341, 2287, 22149, 45089, 94173}},
+{19915, 18, 109209, {1, 3, 1, 15, 19, 7, 15, 207, 7, 759, 869, 2337, 6805, 8287, 13447, 9963, 7177, 173505}},
+{19916, 18, 109216, {1, 3, 7, 13, 15, 3, 65, 143, 291, 511, 939, 669, 4095, 1931, 26015, 18253, 102461, 93837}},
+{19917, 18, 109243, {1, 3, 1, 5, 23, 3, 19, 121, 489, 583, 1425, 627, 4229, 5343, 3759, 17845, 105369, 132239}},
+{19918, 18, 109265, {1, 3, 3, 9, 29, 9, 17, 153, 111, 879, 1225, 979, 2687, 10477, 10105, 18091, 37825, 28077}},
+{19919, 18, 109282, {1, 1, 7, 9, 3, 51, 75, 101, 197, 551, 89, 1441, 607, 14025, 30411, 26887, 3435, 32977}},
+{19920, 18, 109306, {1, 1, 7, 3, 25, 29, 95, 123, 197, 767, 1513, 721, 4149, 10873, 32247, 4469, 42297, 49651}},
+{19921, 18, 109316, {1, 3, 5, 15, 11, 3, 77, 161, 309, 923, 513, 161, 6447, 9811, 9209, 21413, 8611, 237557}},
+{19922, 18, 109334, {1, 3, 1, 3, 23, 11, 61, 107, 317, 771, 1469, 3367, 6607, 11495, 12271, 59989, 52483, 194761}},
+{19923, 18, 109359, {1, 3, 7, 7, 23, 1, 37, 47, 185, 863, 1153, 3517, 6165, 3921, 19311, 37339, 112477, 204915}},
+{19924, 18, 109373, {1, 3, 7, 7, 15, 61, 9, 113, 175, 305, 1759, 2933, 2139, 3591, 15303, 54479, 126511, 255205}},
+{19925, 18, 109386, {1, 1, 1, 3, 29, 43, 19, 183, 121, 577, 1329, 1737, 4373, 5577, 24023, 40103, 22333, 123423}},
+{19926, 18, 109394, {1, 3, 5, 1, 29, 1, 5, 177, 271, 431, 139, 705, 4319, 9301, 15887, 13253, 13275, 233317}},
+{19927, 18, 109403, {1, 1, 3, 7, 21, 3, 13, 51, 459, 359, 1721, 193, 4887, 7805, 20615, 28813, 82427, 57853}},
+{19928, 18, 109409, {1, 3, 3, 13, 3, 29, 43, 95, 339, 993, 979, 2323, 7505, 10203, 9475, 16513, 21651, 104871}},
+{19929, 18, 109412, {1, 1, 3, 15, 11, 5, 97, 127, 397, 25, 507, 1839, 2313, 13399, 899, 25713, 94363, 178287}},
+{19930, 18, 109427, {1, 1, 5, 5, 9, 53, 95, 171, 107, 129, 1041, 3583, 5479, 943, 21435, 36481, 85519, 169651}},
+{19931, 18, 109439, {1, 1, 1, 1, 1, 11, 17, 249, 277, 805, 1827, 2705, 3015, 9033, 25019, 38593, 59235, 21145}},
+{19932, 18, 109464, {1, 1, 7, 3, 7, 59, 107, 213, 109, 213, 555, 3463, 953, 3173, 18947, 2863, 27889, 32493}},
+{19933, 18, 109467, {1, 3, 5, 15, 21, 11, 99, 131, 287, 513, 1393, 3327, 7347, 4343, 8805, 29571, 97151, 97313}},
+{19934, 18, 109476, {1, 3, 5, 3, 17, 53, 23, 21, 227, 291, 111, 1951, 6593, 16325, 31725, 31997, 116907, 181027}},
+{19935, 18, 109488, {1, 1, 5, 3, 15, 57, 93, 153, 345, 257, 169, 795, 3907, 5669, 25447, 28775, 1489, 216417}},
+{19936, 18, 109497, {1, 1, 1, 5, 19, 19, 113, 55, 431, 685, 1839, 711, 4909, 10211, 25765, 37, 72657, 79769}},
+{19937, 18, 109523, {1, 3, 5, 7, 19, 17, 93, 145, 99, 799, 1615, 1583, 7705, 1069, 30259, 37951, 78965, 16203}},
+{19938, 18, 109551, {1, 3, 7, 13, 23, 61, 119, 49, 413, 1021, 415, 465, 7395, 31, 16415, 1009, 9843, 86531}},
+{19939, 18, 109556, {1, 1, 3, 15, 17, 21, 83, 69, 411, 1, 269, 1391, 295, 13649, 21649, 62453, 11457, 215375}},
+{19940, 18, 109566, {1, 3, 3, 7, 25, 53, 95, 99, 447, 323, 27, 1595, 3771, 16099, 31523, 14405, 66999, 65733}},
+{19941, 18, 109598, {1, 1, 3, 11, 25, 29, 19, 95, 101, 661, 537, 641, 1455, 16151, 29087, 54009, 89395, 2223}},
+{19942, 18, 109628, {1, 1, 1, 11, 11, 33, 91, 227, 449, 661, 1621, 1743, 2859, 9797, 32397, 41767, 116325, 6839}},
+{19943, 18, 109643, {1, 3, 3, 7, 31, 41, 15, 139, 53, 789, 25, 67, 1131, 5987, 14091, 37259, 70313, 6633}},
+{19944, 18, 109663, {1, 3, 7, 13, 21, 29, 71, 245, 497, 493, 207, 3221, 3695, 3045, 1497, 29235, 65113, 82015}},
+{19945, 18, 109674, {1, 1, 7, 5, 29, 29, 87, 197, 123, 323, 773, 157, 2925, 9235, 31625, 58187, 121457, 25561}},
+{19946, 18, 109688, {1, 1, 1, 9, 3, 15, 99, 55, 133, 757, 1405, 997, 5201, 8971, 6095, 33309, 35587, 254545}},
+{19947, 18, 109691, {1, 3, 5, 9, 19, 57, 85, 45, 429, 823, 1369, 933, 1971, 13753, 11351, 45805, 16527, 129907}},
+{19948, 18, 109704, {1, 3, 3, 15, 23, 15, 35, 89, 477, 875, 1087, 2837, 1093, 617, 18687, 53269, 63447, 226393}},
+{19949, 18, 109715, {1, 1, 7, 9, 27, 37, 23, 107, 265, 485, 1975, 3159, 4065, 10089, 26975, 45067, 4241, 49051}},
+{19950, 18, 109717, {1, 3, 3, 1, 29, 53, 89, 129, 149, 717, 749, 1481, 7829, 15887, 23185, 30667, 11749, 188963}},
+{19951, 18, 109746, {1, 3, 5, 9, 13, 47, 119, 135, 407, 99, 1773, 2307, 7885, 4013, 25723, 53519, 37487, 205671}},
+{19952, 18, 109789, {1, 1, 5, 1, 11, 27, 121, 213, 147, 669, 799, 485, 4275, 15909, 30583, 45925, 90365, 226901}},
+{19953, 18, 109794, {1, 1, 3, 5, 1, 19, 81, 109, 217, 949, 1637, 3413, 5957, 7293, 17337, 63857, 103815, 80805}},
+{19954, 18, 109868, {1, 3, 7, 3, 9, 43, 119, 251, 345, 3, 203, 829, 3391, 2575, 6859, 50849, 22221, 227581}},
+{19955, 18, 109886, {1, 1, 7, 15, 13, 43, 7, 23, 101, 89, 1747, 1231, 1883, 13363, 10981, 59179, 59555, 242021}},
+{19956, 18, 109888, {1, 1, 5, 5, 23, 15, 93, 183, 231, 891, 1745, 2665, 1689, 8515, 11717, 35643, 113067, 233757}},
+{19957, 18, 109903, {1, 3, 7, 11, 29, 21, 13, 59, 103, 105, 483, 863, 2711, 7917, 29279, 53931, 7011, 60075}},
+{19958, 18, 109908, {1, 1, 3, 15, 5, 37, 101, 163, 31, 575, 2029, 1625, 4545, 12579, 15175, 32667, 59497, 63653}},
+{19959, 18, 109912, {1, 3, 5, 7, 23, 37, 61, 101, 273, 49, 1943, 3381, 491, 4079, 20341, 26463, 122261, 77965}},
+{19960, 18, 109927, {1, 1, 3, 15, 9, 51, 53, 89, 175, 487, 1583, 1797, 4353, 1339, 19613, 26913, 78955, 166523}},
+{19961, 18, 109936, {1, 3, 3, 9, 27, 57, 25, 207, 233, 675, 661, 2629, 6971, 8723, 31199, 47215, 36931, 28347}},
+{19962, 18, 109979, {1, 3, 1, 3, 31, 15, 123, 17, 211, 883, 1861, 2747, 8075, 5373, 23521, 46217, 86629, 171777}},
+{19963, 18, 110005, {1, 3, 5, 9, 11, 43, 45, 171, 465, 835, 603, 2121, 409, 1643, 20327, 63211, 129479, 223113}},
+{19964, 18, 110010, {1, 1, 5, 7, 13, 57, 83, 233, 307, 489, 941, 1723, 6149, 5557, 2053, 17377, 31597, 176051}},
+{19965, 18, 110017, {1, 1, 7, 3, 11, 11, 85, 163, 169, 989, 1289, 2749, 7681, 4679, 645, 36589, 85907, 194713}},
+{19966, 18, 110041, {1, 1, 1, 7, 3, 57, 39, 149, 463, 947, 481, 1163, 7171, 8539, 28991, 61235, 74487, 107051}},
+{19967, 18, 110042, {1, 1, 3, 7, 9, 57, 89, 101, 231, 163, 1355, 1393, 5823, 7565, 26285, 13523, 130329, 26099}},
+{19968, 18, 110047, {1, 1, 7, 15, 13, 59, 111, 35, 265, 927, 125, 1881, 5397, 757, 23845, 9677, 76077, 163361}},
+{19969, 18, 110048, {1, 1, 7, 9, 1, 63, 61, 157, 389, 143, 1445, 881, 3609, 9955, 11159, 59677, 45831, 138345}},
+{19970, 18, 110053, {1, 3, 5, 7, 5, 45, 65, 23, 257, 589, 905, 3651, 743, 117, 30307, 7415, 103331, 252889}},
+{19971, 18, 110054, {1, 1, 7, 13, 3, 57, 113, 91, 217, 967, 481, 989, 4795, 3549, 23717, 60793, 80281, 19977}},
+{19972, 18, 110057, {1, 3, 3, 1, 15, 37, 113, 245, 239, 575, 197, 2803, 7743, 13447, 3601, 56981, 76381, 13321}},
+{19973, 18, 110091, {1, 3, 1, 11, 27, 33, 99, 151, 43, 835, 1951, 1957, 2983, 6781, 9319, 2119, 40533, 118325}},
+{19974, 18, 110093, {1, 3, 3, 7, 27, 19, 23, 243, 347, 477, 1661, 1891, 2439, 2485, 31743, 1427, 20317, 90803}},
+{19975, 18, 110112, {1, 3, 1, 1, 3, 59, 71, 129, 21, 3, 449, 629, 3657, 4045, 8305, 40461, 60927, 38529}},
+{19976, 18, 110127, {1, 3, 3, 7, 9, 11, 85, 185, 369, 451, 887, 3709, 6931, 111, 1379, 8741, 58777, 188045}},
+{19977, 18, 110178, {1, 3, 7, 11, 23, 13, 77, 141, 99, 543, 725, 2439, 6825, 1361, 2785, 5345, 5941, 234751}},
+{19978, 18, 110183, {1, 1, 5, 5, 17, 55, 69, 9, 431, 585, 1049, 165, 1705, 14907, 8655, 12485, 22783, 91195}},
+{19979, 18, 110184, {1, 1, 7, 11, 29, 41, 91, 137, 17, 785, 1151, 2033, 7031, 15077, 2241, 21453, 117947, 128891}},
+{19980, 18, 110195, {1, 1, 1, 11, 17, 53, 113, 195, 409, 275, 1757, 245, 6263, 14785, 29159, 43827, 65027, 248403}},
+{19981, 18, 110307, {1, 3, 3, 3, 5, 15, 23, 41, 261, 891, 1021, 1999, 4883, 9233, 10385, 21953, 50711, 4247}},
+{19982, 18, 110334, {1, 1, 1, 13, 23, 47, 33, 77, 317, 251, 617, 2265, 7549, 327, 2317, 41209, 41063, 120863}},
+{19983, 18, 110336, {1, 1, 7, 11, 15, 17, 25, 105, 253, 713, 1147, 415, 5777, 2215, 4207, 33857, 17001, 260533}},
+{19984, 18, 110354, {1, 1, 1, 11, 31, 45, 3, 25, 329, 45, 1563, 121, 1413, 16229, 32485, 54477, 101025, 64847}},
+{19985, 18, 110356, {1, 3, 5, 1, 15, 59, 113, 203, 481, 545, 371, 1357, 5549, 3043, 397, 61483, 59779, 58159}},
+{19986, 18, 110390, {1, 3, 3, 3, 25, 39, 29, 193, 379, 293, 1173, 3389, 4231, 11519, 6681, 28813, 63609, 13029}},
+{19987, 18, 110419, {1, 3, 1, 1, 27, 57, 37, 249, 441, 905, 463, 3543, 7203, 10075, 5373, 46103, 6685, 146943}},
+{19988, 18, 110452, {1, 3, 5, 7, 31, 51, 21, 139, 209, 219, 1663, 837, 3351, 6291, 735, 8715, 33751, 199485}},
+{19989, 18, 110461, {1, 3, 5, 11, 19, 57, 41, 163, 287, 327, 243, 2891, 1095, 3959, 5067, 2867, 16207, 213089}},
+{19990, 18, 110465, {1, 1, 5, 11, 21, 59, 97, 239, 309, 371, 797, 453, 2595, 4277, 3771, 5665, 10075, 56101}},
+{19991, 18, 110466, {1, 1, 3, 15, 17, 29, 103, 33, 449, 525, 961, 3551, 3611, 14057, 15971, 26981, 35169, 130213}},
+{19992, 18, 110468, {1, 1, 3, 1, 5, 13, 39, 211, 387, 797, 1051, 3287, 3737, 12953, 3387, 35107, 78809, 162907}},
+{19993, 18, 110486, {1, 1, 7, 9, 7, 63, 127, 115, 173, 981, 623, 737, 7625, 12245, 4195, 61873, 104301, 250333}},
+{19994, 18, 110511, {1, 1, 1, 5, 19, 5, 123, 43, 209, 741, 747, 1057, 2683, 15359, 24121, 38413, 5823, 62213}},
+{19995, 18, 110531, {1, 1, 7, 1, 23, 13, 63, 165, 309, 323, 247, 3827, 5451, 4823, 23925, 56957, 69765, 259923}},
+{19996, 18, 110561, {1, 1, 5, 1, 5, 49, 51, 65, 31, 257, 1363, 3031, 5765, 3645, 16383, 6347, 30429, 130557}},
+{19997, 18, 110573, {1, 3, 5, 13, 9, 63, 31, 3, 317, 379, 1345, 2161, 7787, 2055, 21507, 20347, 97021, 183377}},
+{19998, 18, 110593, {1, 3, 5, 11, 15, 59, 13, 139, 415, 821, 639, 1249, 6349, 15861, 21377, 22813, 42839, 76595}},
+{19999, 18, 110611, {1, 1, 7, 9, 23, 11, 25, 115, 393, 153, 1269, 871, 1323, 1891, 11619, 3103, 79813, 39811}},
+{20000, 18, 110614, {1, 3, 1, 15, 27, 37, 63, 253, 1, 855, 1651, 3111, 6693, 1825, 22549, 64189, 18347, 253425}},
+{20001, 18, 110651, {1, 3, 1, 11, 23, 27, 119, 59, 421, 343, 831, 2679, 5899, 12087, 15953, 18601, 109551, 33895}},
+{20002, 18, 110661, {1, 3, 1, 13, 29, 3, 91, 227, 301, 491, 1045, 2105, 5189, 13717, 1095, 6039, 16229, 215687}},
+{20003, 18, 110665, {1, 1, 7, 3, 11, 53, 85, 25, 23, 293, 841, 3569, 5335, 8949, 28665, 15139, 100807, 155587}},
+{20004, 18, 110701, {1, 1, 1, 9, 31, 1, 77, 149, 181, 5, 915, 1155, 4717, 2837, 17545, 3235, 26811, 124901}},
+{20005, 18, 110730, {1, 1, 3, 5, 25, 27, 47, 215, 425, 195, 1575, 3961, 3521, 4197, 9565, 32523, 125091, 165543}},
+{20006, 18, 110735, {1, 3, 7, 3, 17, 57, 7, 137, 507, 303, 1123, 1511, 2465, 4277, 19959, 31951, 83157, 62843}},
+{20007, 18, 110738, {1, 3, 3, 1, 27, 43, 79, 191, 265, 167, 665, 4017, 6613, 1175, 5427, 47139, 91517, 32071}},
+{20008, 18, 110759, {1, 1, 1, 11, 29, 63, 9, 39, 303, 1021, 415, 2157, 5227, 13557, 4931, 12541, 74101, 13189}},
+{20009, 18, 110763, {1, 1, 3, 9, 15, 41, 45, 163, 301, 315, 1433, 1449, 3589, 15783, 16069, 16155, 10527, 69335}},
+{20010, 18, 110768, {1, 3, 1, 1, 1, 5, 75, 169, 215, 115, 939, 1285, 43, 1941, 27847, 5245, 51211, 244817}},
+{20011, 18, 110774, {1, 1, 1, 15, 7, 33, 31, 23, 397, 537, 1415, 329, 6705, 15015, 18883, 62895, 21435, 233075}},
+{20012, 18, 110783, {1, 3, 3, 5, 11, 49, 73, 147, 183, 317, 11, 1997, 1045, 6015, 29159, 55195, 105711, 134727}},
+{20013, 18, 110785, {1, 3, 3, 9, 21, 41, 5, 213, 421, 539, 1269, 1929, 3701, 2165, 14997, 21933, 58167, 239719}},
+{20014, 18, 110809, {1, 3, 1, 5, 23, 63, 37, 27, 21, 547, 1499, 1621, 141, 5309, 32257, 47241, 123617, 243853}},
+{20015, 18, 110812, {1, 1, 1, 13, 31, 45, 47, 91, 165, 1007, 1295, 4035, 1461, 10423, 7747, 7329, 114599, 169375}},
+{20016, 18, 110840, {1, 1, 5, 3, 21, 9, 75, 61, 35, 745, 31, 4085, 3645, 16239, 14979, 15725, 108859, 56745}},
+{20017, 18, 110853, {1, 1, 5, 15, 11, 31, 13, 229, 417, 147, 1993, 4043, 7757, 13507, 15297, 56119, 2223, 142275}},
+{20018, 18, 110905, {1, 3, 5, 13, 3, 57, 45, 109, 135, 829, 159, 769, 865, 2583, 15755, 44343, 84561, 98621}},
+{20019, 18, 110933, {1, 1, 7, 11, 17, 11, 115, 45, 371, 411, 863, 2139, 3897, 13981, 16771, 4587, 25195, 66077}},
+{20020, 18, 110961, {1, 3, 7, 15, 17, 47, 51, 133, 133, 475, 1363, 3325, 4287, 4837, 22077, 60225, 3097, 246805}},
+{20021, 18, 110962, {1, 3, 5, 9, 29, 51, 127, 125, 353, 519, 129, 1409, 1497, 3167, 14163, 24921, 81343, 129835}},
+{20022, 18, 110974, {1, 3, 5, 5, 19, 39, 95, 109, 229, 1015, 367, 2373, 709, 6169, 4089, 13533, 22399, 118977}},
+{20023, 18, 110987, {1, 1, 5, 5, 17, 21, 91, 131, 309, 739, 1373, 3723, 6659, 1119, 27521, 55589, 34967, 70831}},
+{20024, 18, 110989, {1, 3, 1, 11, 5, 7, 85, 215, 425, 947, 589, 375, 5943, 13399, 18307, 27007, 18919, 200617}},
+{20025, 18, 111007, {1, 1, 3, 15, 11, 37, 111, 179, 259, 517, 1679, 225, 3493, 15025, 21751, 40687, 73001, 214477}},
+{20026, 18, 111011, {1, 1, 7, 15, 17, 41, 109, 129, 427, 847, 1965, 3269, 5871, 12331, 26899, 49791, 103471, 213789}},
+{20027, 18, 111043, {1, 3, 3, 3, 9, 41, 25, 115, 95, 737, 717, 1545, 841, 14923, 7409, 45365, 100139, 77787}},
+{20028, 18, 111070, {1, 1, 3, 15, 11, 3, 63, 23, 425, 433, 537, 1599, 2691, 11271, 1695, 40579, 53507, 73033}},
+{20029, 18, 111088, {1, 3, 7, 13, 9, 21, 85, 31, 337, 583, 1883, 3877, 7197, 7715, 21525, 53273, 11263, 41907}},
+{20030, 18, 111127, {1, 3, 7, 1, 7, 53, 61, 45, 299, 885, 1391, 3109, 6851, 6079, 18857, 44537, 95713, 146125}},
+{20031, 18, 111140, {1, 1, 1, 3, 21, 49, 95, 105, 419, 315, 365, 3035, 4169, 5723, 26921, 62809, 27019, 243965}},
+{20032, 18, 111149, {1, 1, 3, 5, 11, 39, 71, 89, 249, 11, 1395, 105, 6637, 4577, 22979, 32405, 93163, 58785}},
+{20033, 18, 111229, {1, 1, 1, 1, 27, 25, 125, 85, 495, 697, 1793, 301, 7665, 12671, 25359, 38803, 58723, 189837}},
+{20034, 18, 111230, {1, 3, 5, 11, 17, 11, 61, 211, 19, 901, 1701, 223, 2195, 15571, 3529, 34699, 94607, 196519}},
+{20035, 18, 111243, {1, 3, 7, 11, 15, 1, 111, 1, 381, 145, 293, 3639, 6931, 13195, 19985, 58491, 53067, 184411}},
+{20036, 18, 111267, {1, 3, 1, 15, 31, 39, 39, 101, 17, 431, 1151, 2465, 727, 12709, 5377, 5857, 49707, 76439}},
+{20037, 18, 111287, {1, 3, 3, 5, 7, 1, 3, 39, 357, 339, 415, 567, 7245, 13943, 7495, 54133, 119705, 160615}},
+{20038, 18, 111313, {1, 3, 5, 15, 9, 17, 13, 253, 337, 673, 1745, 2613, 4635, 14025, 11159, 50001, 40753, 172983}},
+{20039, 18, 111356, {1, 3, 7, 11, 3, 15, 19, 107, 393, 1015, 1441, 181, 5721, 9987, 15557, 37263, 90053, 205685}},
+{20040, 18, 111368, {1, 1, 5, 1, 9, 3, 69, 123, 245, 111, 283, 1581, 259, 275, 813, 12213, 19639, 7335}},
+{20041, 18, 111409, {1, 3, 7, 7, 1, 55, 101, 63, 259, 705, 653, 3821, 2081, 6447, 25471, 15523, 38827, 68055}},
+{20042, 18, 111419, {1, 1, 5, 7, 27, 9, 97, 149, 445, 341, 167, 3695, 375, 853, 8143, 36027, 62729, 197357}},
+{20043, 18, 111430, {1, 3, 7, 1, 1, 37, 97, 103, 493, 319, 1287, 3787, 4079, 13049, 14305, 6665, 4631, 96225}},
+{20044, 18, 111433, {1, 1, 5, 7, 1, 5, 127, 143, 251, 725, 1759, 2381, 181, 15741, 9395, 64441, 44347, 221697}},
+{20045, 18, 111442, {1, 3, 1, 3, 25, 47, 29, 167, 397, 827, 1255, 3271, 6307, 13915, 3131, 19123, 88619, 62847}},
+{20046, 18, 111467, {1, 3, 5, 1, 29, 11, 59, 203, 245, 553, 617, 1287, 205, 2291, 3613, 39933, 116981, 43595}},
+{20047, 18, 111491, {1, 1, 3, 9, 27, 33, 35, 77, 437, 1003, 119, 253, 6643, 113, 10587, 41073, 55371, 233307}},
+{20048, 18, 111503, {1, 3, 7, 1, 29, 63, 1, 231, 373, 995, 1063, 1385, 273, 14115, 6899, 62991, 112003, 80527}},
+{20049, 18, 111527, {1, 3, 3, 1, 31, 21, 55, 115, 393, 685, 245, 1587, 5617, 267, 19639, 15169, 14073, 173091}},
+{20050, 18, 111531, {1, 3, 1, 11, 29, 45, 53, 21, 433, 979, 1067, 2999, 6279, 4739, 30835, 61653, 112893, 75839}},
+{20051, 18, 111541, {1, 1, 5, 11, 23, 25, 15, 107, 325, 981, 1057, 1181, 4465, 16291, 1523, 64497, 129437, 45067}},
+{20052, 18, 111546, {1, 1, 1, 5, 1, 21, 79, 135, 419, 997, 1967, 747, 2097, 15397, 4415, 15807, 79583, 259561}},
+{20053, 18, 111548, {1, 3, 1, 7, 5, 49, 105, 109, 243, 371, 13, 2297, 2845, 12569, 13165, 13551, 75471, 168579}},
+{20054, 18, 111577, {1, 1, 1, 1, 9, 33, 7, 233, 43, 773, 1121, 3763, 4047, 15039, 8165, 25407, 82561, 215045}},
+{20055, 18, 111625, {1, 3, 7, 1, 17, 41, 105, 129, 333, 687, 1357, 1197, 1271, 3835, 15823, 36777, 94311, 192321}},
+{20056, 18, 111636, {1, 1, 5, 15, 13, 31, 93, 249, 81, 167, 1681, 1587, 179, 5755, 27741, 29437, 100407, 63287}},
+{20057, 18, 111650, {1, 3, 3, 13, 11, 39, 85, 23, 37, 183, 547, 1255, 1167, 15961, 23281, 59989, 99393, 34983}},
+{20058, 18, 111655, {1, 3, 7, 5, 13, 33, 17, 243, 321, 845, 447, 1997, 4639, 11175, 24651, 18281, 82677, 244543}},
+{20059, 18, 111662, {1, 3, 5, 13, 3, 63, 75, 35, 493, 207, 1707, 1401, 3687, 11353, 5461, 23433, 71259, 93483}},
+{20060, 18, 111673, {1, 1, 3, 1, 19, 61, 81, 133, 115, 957, 669, 647, 347, 8739, 18451, 39641, 118677, 136601}},
+{20061, 18, 111699, {1, 1, 7, 13, 3, 13, 119, 187, 111, 181, 1865, 1613, 201, 3633, 17805, 46553, 8899, 100407}},
+{20062, 18, 111727, {1, 3, 3, 9, 19, 33, 35, 215, 235, 893, 877, 3099, 7597, 13521, 22473, 65435, 3205, 44897}},
+{20063, 18, 111729, {1, 3, 3, 11, 27, 3, 101, 201, 215, 373, 859, 1435, 2637, 6795, 21157, 3333, 27797, 199427}},
+{20064, 18, 111741, {1, 1, 7, 13, 31, 33, 85, 205, 273, 565, 2033, 3451, 7581, 16223, 1383, 16297, 1263, 49065}},
+{20065, 18, 111757, {1, 1, 1, 13, 11, 29, 65, 71, 395, 179, 1193, 3859, 3075, 10133, 6463, 34617, 20173, 203471}},
+{20066, 18, 111781, {1, 1, 7, 3, 7, 29, 11, 115, 465, 695, 1759, 3137, 6337, 977, 43, 62501, 13297, 59319}},
+{20067, 18, 111791, {1, 3, 5, 9, 31, 59, 11, 107, 109, 797, 177, 2891, 2535, 4305, 19255, 9591, 84417, 87381}},
+{20068, 18, 111826, {1, 3, 3, 3, 1, 9, 45, 219, 73, 573, 1477, 3699, 8145, 835, 7123, 37167, 53411, 45397}},
+{20069, 18, 111838, {1, 3, 5, 15, 15, 41, 37, 63, 233, 971, 1497, 1223, 3909, 11721, 9217, 41055, 9779, 199339}},
+{20070, 18, 111854, {1, 3, 3, 7, 17, 61, 91, 237, 313, 841, 7, 3283, 4049, 10403, 22157, 4889, 31903, 188043}},
+{20071, 18, 111861, {1, 3, 7, 1, 25, 3, 59, 87, 191, 725, 1615, 4057, 3037, 14597, 17371, 42221, 73919, 58009}},
+{20072, 18, 111866, {1, 3, 5, 11, 27, 7, 45, 231, 315, 727, 843, 2191, 7909, 53, 23309, 55189, 96193, 174017}},
+{20073, 18, 111868, {1, 3, 5, 11, 27, 51, 127, 187, 209, 883, 429, 137, 4585, 15195, 16527, 32571, 30905, 8137}},
+{20074, 18, 111897, {1, 1, 1, 11, 15, 55, 13, 161, 183, 671, 659, 3669, 4461, 13691, 17119, 26877, 52041, 110103}},
+{20075, 18, 111903, {1, 3, 5, 9, 5, 45, 29, 19, 415, 931, 683, 2987, 3839, 4529, 3091, 54457, 115537, 102671}},
+{20076, 18, 111904, {1, 1, 7, 13, 23, 31, 61, 17, 327, 951, 1333, 713, 4309, 1955, 22797, 27007, 106673, 47177}},
+{20077, 18, 111959, {1, 3, 3, 9, 31, 49, 19, 115, 413, 257, 1799, 3641, 2075, 15613, 14293, 16123, 45131, 209389}},
+{20078, 18, 111975, {1, 1, 7, 15, 1, 15, 27, 63, 463, 825, 1081, 991, 2641, 5999, 8551, 41119, 80251, 189263}},
+{20079, 18, 112018, {1, 1, 5, 9, 7, 55, 125, 97, 245, 997, 457, 1087, 1297, 3433, 14887, 24117, 30689, 184809}},
+{20080, 18, 112023, {1, 3, 1, 9, 23, 59, 81, 233, 341, 943, 1335, 2819, 2625, 4957, 14925, 7917, 107383, 204493}},
+{20081, 18, 112033, {1, 3, 5, 5, 5, 25, 79, 29, 191, 541, 1295, 269, 613, 5201, 28639, 52839, 52865, 75181}},
+{20082, 18, 112036, {1, 3, 3, 7, 19, 45, 35, 201, 391, 317, 1323, 2733, 3407, 10273, 32689, 52153, 108751, 242493}},
+{20083, 18, 112043, {1, 3, 1, 7, 15, 27, 45, 21, 383, 483, 1857, 3443, 2263, 11471, 3697, 63929, 116399, 229733}},
+{20084, 18, 112095, {1, 1, 3, 9, 13, 27, 19, 37, 181, 811, 1833, 177, 7689, 10073, 20229, 31397, 65415, 68461}},
+{20085, 18, 112113, {1, 1, 1, 15, 19, 53, 65, 209, 433, 783, 1647, 4075, 3155, 733, 25603, 39033, 43109, 151257}},
+{20086, 18, 112136, {1, 3, 3, 5, 9, 37, 61, 75, 497, 825, 1785, 3709, 1731, 889, 19325, 57453, 39095, 190855}},
+{20087, 18, 112153, {1, 3, 3, 13, 3, 53, 21, 39, 483, 833, 1191, 2829, 1323, 1877, 17257, 36077, 47997, 25349}},
+{20088, 18, 112165, {1, 1, 7, 9, 29, 25, 7, 91, 87, 723, 777, 1865, 7763, 10995, 15953, 36111, 21313, 214417}},
+{20089, 18, 112166, {1, 3, 5, 3, 17, 15, 85, 133, 245, 317, 879, 3237, 7049, 6501, 13359, 34063, 124703, 118289}},
+{20090, 18, 112177, {1, 1, 1, 7, 11, 25, 111, 143, 369, 593, 237, 2787, 1015, 13059, 23275, 38453, 90809, 25803}},
+{20091, 18, 112189, {1, 1, 7, 5, 13, 21, 39, 235, 381, 381, 949, 773, 1123, 9911, 18115, 47657, 47849, 197633}},
+{20092, 18, 112226, {1, 1, 3, 13, 15, 57, 47, 203, 483, 341, 137, 1283, 2847, 5051, 22593, 60915, 45123, 258733}},
+{20093, 18, 112237, {1, 1, 3, 5, 29, 7, 23, 127, 493, 543, 747, 3547, 4433, 5847, 28999, 18079, 81205, 231557}},
+{20094, 18, 112240, {1, 1, 3, 15, 9, 63, 17, 197, 75, 387, 1679, 2631, 1033, 2757, 18365, 11957, 98915, 24223}},
+{20095, 18, 112255, {1, 1, 3, 9, 27, 55, 67, 97, 345, 995, 1151, 1747, 4889, 13847, 13237, 9035, 13461, 10377}},
+{20096, 18, 112265, {1, 1, 5, 9, 27, 13, 7, 77, 399, 191, 137, 2801, 6379, 15969, 1727, 27503, 97385, 147625}},
+{20097, 18, 112280, {1, 3, 1, 7, 5, 9, 103, 163, 489, 615, 1359, 2635, 3115, 13795, 18853, 65225, 26545, 212065}},
+{20098, 18, 112292, {1, 3, 7, 3, 13, 25, 125, 133, 359, 423, 751, 4045, 1209, 7521, 6653, 39171, 125083, 229399}},
+{20099, 18, 112307, {1, 3, 1, 9, 15, 21, 121, 223, 283, 313, 1807, 3829, 5279, 10609, 20113, 7851, 23731, 245327}},
+{20100, 18, 112316, {1, 1, 1, 11, 15, 13, 63, 253, 311, 369, 1549, 2803, 2029, 14967, 14217, 1387, 104669, 63375}},
+{20101, 18, 112342, {1, 1, 3, 3, 31, 49, 59, 189, 249, 779, 275, 3761, 3465, 2205, 11543, 16973, 126249, 104769}},
+{20102, 18, 112345, {1, 3, 1, 5, 11, 39, 59, 33, 121, 151, 467, 1011, 1379, 13955, 20117, 52537, 51049, 50663}},
+{20103, 18, 112351, {1, 1, 1, 7, 5, 41, 121, 29, 357, 33, 849, 2441, 2127, 1337, 21147, 63869, 80215, 31211}},
+{20104, 18, 112361, {1, 3, 3, 3, 25, 41, 17, 101, 173, 915, 463, 2391, 1671, 8789, 13357, 42127, 17599, 61087}},
+{20105, 18, 112364, {1, 1, 3, 9, 29, 23, 47, 211, 435, 223, 1421, 2463, 4543, 8569, 30209, 46621, 14367, 13263}},
+{20106, 18, 112372, {1, 3, 7, 7, 5, 9, 75, 209, 299, 81, 1705, 2335, 6703, 6309, 5859, 57889, 43219, 7667}},
+{20107, 18, 112382, {1, 3, 3, 3, 19, 31, 107, 87, 413, 111, 215, 2711, 7053, 5223, 25241, 26675, 16067, 122719}},
+{20108, 18, 112389, {1, 1, 1, 15, 21, 3, 15, 13, 281, 63, 725, 2025, 4813, 14177, 18577, 875, 118623, 192005}},
+{20109, 18, 112408, {1, 3, 5, 9, 17, 21, 85, 173, 59, 153, 763, 3899, 1985, 2071, 10439, 44911, 60915, 122419}},
+{20110, 18, 112417, {1, 3, 7, 13, 11, 63, 59, 95, 53, 927, 555, 1897, 5195, 13469, 16973, 3463, 125173, 256021}},
+{20111, 18, 112423, {1, 1, 3, 7, 9, 63, 33, 193, 61, 445, 1247, 1379, 4701, 5311, 30709, 16795, 69871, 161113}},
+{20112, 18, 112476, {1, 3, 1, 3, 21, 25, 125, 111, 109, 75, 455, 861, 6483, 4501, 19095, 45601, 78415, 30995}},
+{20113, 18, 112480, {1, 1, 3, 5, 1, 25, 15, 25, 223, 961, 537, 1453, 4951, 5085, 19801, 9863, 108819, 7319}},
+{20114, 18, 112483, {1, 3, 1, 5, 29, 21, 79, 113, 177, 691, 219, 3159, 3493, 25, 30655, 46257, 23707, 243377}},
+{20115, 18, 112513, {1, 1, 3, 3, 27, 21, 11, 95, 43, 161, 2029, 4091, 6695, 7179, 9955, 45195, 32017, 128605}},
+{20116, 18, 112538, {1, 1, 7, 5, 19, 37, 47, 83, 169, 143, 773, 2127, 347, 1887, 2861, 8155, 21437, 175641}},
+{20117, 18, 112543, {1, 3, 1, 1, 27, 63, 119, 57, 77, 931, 629, 1807, 4469, 2315, 3767, 19207, 114581, 125135}},
+{20118, 18, 112574, {1, 1, 5, 11, 13, 51, 51, 239, 333, 369, 1035, 3017, 103, 1809, 14579, 34425, 123915, 258397}},
+{20119, 18, 112599, {1, 1, 1, 3, 3, 19, 63, 237, 141, 929, 943, 2597, 3983, 1043, 24269, 12325, 39013, 216689}},
+{20120, 18, 112605, {1, 1, 3, 7, 9, 61, 73, 31, 287, 303, 1415, 3453, 2667, 8625, 14347, 51953, 9181, 251937}},
+{20121, 18, 112667, {1, 1, 7, 1, 15, 41, 1, 197, 87, 311, 1147, 3799, 2585, 14027, 491, 54203, 124861, 227637}},
+{20122, 18, 112688, {1, 3, 7, 3, 15, 35, 97, 89, 65, 493, 1897, 3345, 3807, 5911, 12461, 21393, 116975, 212801}},
+{20123, 18, 112735, {1, 1, 7, 11, 29, 47, 61, 171, 399, 929, 93, 2815, 4933, 9209, 15053, 21911, 117217, 52539}},
+{20124, 18, 112746, {1, 3, 1, 1, 19, 25, 11, 41, 73, 317, 215, 923, 5153, 8025, 18703, 11513, 107981, 2027}},
+{20125, 18, 112810, {1, 1, 5, 7, 27, 33, 47, 99, 171, 259, 2017, 2055, 909, 4185, 26689, 23155, 109857, 213957}},
+{20126, 18, 112817, {1, 3, 7, 3, 31, 17, 39, 203, 255, 345, 1461, 1561, 4349, 6451, 14763, 32993, 74475, 140557}},
+{20127, 18, 112827, {1, 1, 5, 3, 21, 57, 75, 201, 371, 529, 1471, 243, 3751, 581, 18405, 40933, 106311, 745}},
+{20128, 18, 112835, {1, 1, 3, 13, 7, 53, 125, 15, 55, 267, 1865, 3297, 4331, 2913, 21675, 58911, 28419, 105585}},
+{20129, 18, 112892, {1, 3, 5, 13, 7, 13, 37, 37, 207, 127, 785, 1129, 8123, 7655, 16003, 18907, 48883, 2001}},
+{20130, 18, 112898, {1, 1, 5, 3, 11, 3, 127, 149, 503, 1019, 887, 3429, 7775, 7113, 19571, 34461, 38889, 66981}},
+{20131, 18, 112915, {1, 3, 7, 7, 1, 55, 87, 217, 465, 485, 411, 2955, 4899, 1741, 7051, 42885, 1837, 68175}},
+{20132, 18, 112918, {1, 1, 7, 1, 7, 39, 25, 1, 185, 523, 273, 2409, 1867, 3101, 29823, 4509, 81621, 11815}},
+{20133, 18, 112937, {1, 1, 1, 11, 13, 11, 89, 237, 355, 347, 91, 1791, 5745, 4181, 29207, 39495, 5275, 199395}},
+{20134, 18, 112940, {1, 1, 7, 3, 17, 37, 109, 169, 191, 295, 1001, 2631, 1981, 11821, 8315, 40675, 1293, 220247}},
+{20135, 18, 112958, {1, 3, 1, 7, 31, 25, 5, 55, 1, 795, 1663, 3177, 6821, 2073, 25789, 23691, 25015, 75203}},
+{20136, 18, 113013, {1, 3, 5, 9, 19, 9, 97, 129, 351, 735, 1897, 3555, 1731, 5413, 32051, 12869, 111973, 100157}},
+{20137, 18, 113014, {1, 3, 3, 15, 27, 1, 3, 167, 7, 851, 805, 713, 6389, 1455, 32371, 7617, 107157, 131299}},
+{20138, 18, 113027, {1, 3, 1, 13, 31, 29, 91, 123, 387, 939, 223, 3583, 2889, 5307, 16561, 6055, 4437, 123229}},
+{20139, 18, 113048, {1, 3, 5, 11, 27, 17, 5, 145, 369, 449, 1677, 1039, 3553, 3057, 11667, 51879, 20519, 41573}},
+{20140, 18, 113051, {1, 3, 1, 9, 9, 1, 91, 33, 379, 35, 691, 375, 5937, 15019, 16177, 53457, 52015, 232257}},
+{20141, 18, 113053, {1, 1, 3, 11, 23, 17, 75, 217, 377, 571, 1725, 2719, 3911, 12277, 27799, 55573, 21981, 112529}},
+{20142, 18, 113102, {1, 3, 1, 11, 9, 37, 81, 95, 501, 615, 327, 3751, 7333, 15407, 7785, 29113, 116335, 221853}},
+{20143, 18, 113104, {1, 1, 1, 3, 17, 1, 125, 157, 461, 845, 93, 107, 4429, 2271, 14445, 32919, 81175, 244557}},
+{20144, 18, 113114, {1, 3, 3, 1, 27, 23, 33, 15, 29, 361, 409, 981, 7819, 10259, 21971, 23317, 66641, 54591}},
+{20145, 18, 113130, {1, 3, 7, 13, 31, 63, 11, 167, 511, 81, 1165, 3973, 4275, 3315, 10227, 34973, 58505, 2333}},
+{20146, 18, 113159, {1, 3, 1, 9, 3, 49, 111, 101, 41, 775, 449, 1349, 4411, 8691, 535, 60137, 3269, 204895}},
+{20147, 18, 113180, {1, 3, 7, 15, 7, 43, 39, 147, 309, 185, 733, 1473, 5467, 6183, 17971, 56805, 111931, 163515}},
+{20148, 18, 113189, {1, 3, 1, 3, 21, 31, 17, 129, 317, 587, 801, 2517, 2569, 765, 20869, 16461, 34425, 101123}},
+{20149, 18, 113211, {1, 3, 1, 7, 13, 63, 117, 31, 25, 741, 365, 687, 6195, 2093, 14679, 16861, 123381, 25263}},
+{20150, 18, 113245, {1, 1, 1, 3, 13, 59, 65, 131, 41, 39, 1659, 1491, 225, 10277, 12445, 4161, 92119, 146705}},
+{20151, 18, 113261, {1, 3, 5, 1, 31, 11, 21, 203, 345, 473, 1643, 1377, 555, 11675, 15383, 30855, 41249, 231059}},
+{20152, 18, 113273, {1, 1, 7, 15, 3, 23, 33, 133, 433, 407, 1217, 3345, 7455, 11489, 21463, 41621, 95755, 86971}},
+{20153, 18, 113292, {1, 1, 1, 3, 13, 47, 45, 181, 489, 89, 427, 1915, 3993, 10133, 20437, 31811, 48421, 150009}},
+{20154, 18, 113314, {1, 3, 1, 9, 9, 25, 89, 195, 503, 755, 59, 1869, 6645, 13841, 22973, 17761, 46759, 68717}},
+{20155, 18, 113319, {1, 3, 1, 1, 19, 21, 119, 123, 481, 289, 1009, 3769, 3909, 1123, 17875, 17383, 71533, 45455}},
+{20156, 18, 113323, {1, 1, 1, 3, 31, 33, 127, 43, 467, 749, 377, 3025, 511, 13335, 23987, 63627, 50211, 197253}},
+{20157, 18, 113326, {1, 1, 5, 13, 29, 7, 101, 43, 299, 769, 1637, 3731, 1945, 9933, 22263, 1523, 127557, 116867}},
+{20158, 18, 113337, {1, 1, 3, 11, 1, 59, 25, 45, 275, 535, 1349, 3625, 8125, 727, 1215, 15487, 86229, 124817}},
+{20159, 18, 113338, {1, 3, 3, 13, 3, 11, 25, 237, 213, 331, 395, 1775, 1225, 6859, 16577, 39105, 118081, 74727}},
+{20160, 18, 113355, {1, 1, 1, 9, 5, 27, 117, 75, 479, 757, 1299, 2273, 3221, 5297, 249, 60327, 48739, 107023}},
+{20161, 18, 113365, {1, 1, 5, 9, 27, 9, 123, 49, 63, 763, 121, 3955, 2069, 5999, 25973, 64661, 6321, 1179}},
+{20162, 18, 113376, {1, 3, 7, 11, 9, 51, 65, 93, 51, 51, 829, 3239, 7431, 3489, 7691, 38777, 28151, 96635}},
+{20163, 18, 113408, {1, 3, 3, 13, 15, 51, 13, 203, 49, 73, 363, 2173, 7771, 11527, 27683, 39333, 2083, 178623}},
+{20164, 18, 113462, {1, 1, 5, 5, 15, 27, 27, 127, 503, 955, 427, 3061, 6213, 917, 889, 12601, 72445, 105383}},
+{20165, 18, 113476, {1, 3, 5, 3, 27, 43, 105, 187, 309, 747, 1843, 723, 539, 8829, 19171, 46009, 26129, 173145}},
+{20166, 18, 113503, {1, 3, 7, 7, 9, 51, 121, 139, 107, 453, 1103, 2957, 633, 1435, 27275, 53231, 51393, 16847}},
+{20167, 18, 113550, {1, 3, 7, 5, 25, 31, 71, 191, 169, 69, 1477, 1413, 7659, 11737, 12365, 25067, 21787, 16225}},
+{20168, 18, 113578, {1, 1, 7, 1, 9, 33, 37, 123, 391, 341, 829, 1543, 7323, 14695, 16431, 20009, 95821, 182791}},
+{20169, 18, 113580, {1, 3, 1, 5, 9, 59, 109, 39, 301, 977, 1963, 177, 8107, 16193, 5691, 14157, 71605, 250839}},
+{20170, 18, 113634, {1, 3, 5, 9, 29, 33, 33, 153, 7, 217, 201, 563, 6577, 9605, 16671, 63949, 97937, 234309}},
+{20171, 18, 113653, {1, 3, 7, 3, 25, 11, 81, 89, 275, 801, 477, 1921, 2279, 1651, 13333, 9127, 99693, 83141}},
+{20172, 18, 113677, {1, 3, 7, 5, 23, 51, 23, 51, 447, 689, 387, 1845, 6033, 2037, 20139, 33165, 56111, 243353}},
+{20173, 18, 113713, {1, 3, 5, 7, 5, 7, 105, 121, 439, 471, 721, 85, 1627, 3735, 29611, 15537, 36131, 30225}},
+{20174, 18, 113751, {1, 1, 5, 5, 7, 29, 31, 209, 183, 217, 467, 1287, 6145, 14737, 16249, 8857, 101405, 103355}},
+{20175, 18, 113771, {1, 3, 3, 5, 19, 1, 43, 15, 239, 63, 617, 2189, 3841, 1223, 12217, 4121, 88047, 14069}},
+{20176, 18, 113781, {1, 3, 7, 1, 9, 49, 11, 65, 297, 943, 1739, 3797, 6169, 2057, 5031, 2149, 21439, 141039}},
+{20177, 18, 113797, {1, 1, 1, 7, 15, 59, 35, 203, 347, 529, 1741, 1003, 6143, 4979, 15495, 48447, 2139, 187025}},
+{20178, 18, 113846, {1, 1, 7, 13, 15, 17, 77, 225, 461, 691, 1067, 1133, 6555, 511, 25845, 39835, 11755, 142743}},
+{20179, 18, 113849, {1, 3, 3, 11, 27, 25, 49, 51, 335, 1, 381, 2703, 7023, 14739, 19335, 39625, 82255, 76277}},
+{20180, 18, 113855, {1, 3, 3, 7, 19, 3, 35, 95, 203, 991, 515, 2245, 6085, 4129, 9581, 38309, 114203, 136021}},
+{20181, 18, 113878, {1, 1, 7, 7, 21, 61, 31, 57, 459, 119, 523, 1293, 3647, 735, 28849, 15581, 123943, 210069}},
+{20182, 18, 113884, {1, 1, 7, 3, 9, 55, 103, 23, 401, 109, 23, 4083, 6179, 12817, 2787, 43337, 53647, 241507}},
+{20183, 18, 113926, {1, 1, 5, 7, 9, 51, 37, 133, 97, 933, 1509, 2229, 1769, 12901, 15439, 25687, 128823, 72451}},
+{20184, 18, 113938, {1, 3, 1, 13, 17, 19, 7, 109, 299, 799, 621, 3393, 3645, 283, 29889, 63215, 97805, 45795}},
+{20185, 18, 113956, {1, 3, 1, 15, 21, 7, 65, 237, 221, 433, 1611, 2591, 3639, 3231, 6025, 53465, 88091, 17657}},
+{20186, 18, 113980, {1, 1, 7, 9, 27, 13, 11, 185, 381, 43, 961, 2743, 2691, 10531, 3713, 61757, 124011, 209323}},
+{20187, 18, 113986, {1, 3, 5, 1, 13, 7, 109, 65, 359, 577, 2001, 3085, 3519, 8577, 19299, 40145, 37159, 82421}},
+{20188, 18, 113991, {1, 1, 3, 11, 7, 5, 21, 215, 391, 317, 879, 1835, 611, 7189, 3887, 45383, 41025, 175701}},
+{20189, 18, 114005, {1, 1, 1, 1, 5, 17, 69, 115, 481, 477, 2017, 583, 8033, 11349, 16625, 213, 88033, 31707}},
+{20190, 18, 114022, {1, 1, 7, 15, 19, 55, 121, 35, 1, 71, 1011, 3247, 4133, 1681, 29943, 30149, 96797, 177707}},
+{20191, 18, 114036, {1, 3, 5, 13, 11, 45, 83, 153, 455, 223, 787, 2025, 5271, 229, 17549, 5775, 75311, 134523}},
+{20192, 18, 114046, {1, 3, 5, 7, 21, 43, 3, 253, 395, 651, 1111, 1685, 539, 6555, 25761, 39477, 15823, 261825}},
+{20193, 18, 114050, {1, 3, 7, 15, 27, 35, 43, 191, 269, 247, 883, 887, 1505, 7433, 6239, 5421, 49583, 17765}},
+{20194, 18, 114061, {1, 1, 5, 15, 7, 19, 113, 177, 63, 119, 517, 3987, 971, 12071, 13107, 28913, 85675, 204921}},
+{20195, 18, 114067, {1, 3, 7, 15, 31, 47, 21, 129, 31, 505, 661, 855, 6135, 13063, 27971, 63801, 27469, 75373}},
+{20196, 18, 114117, {1, 1, 7, 5, 13, 23, 111, 85, 279, 969, 483, 831, 483, 9065, 10997, 59031, 5083, 150939}},
+{20197, 18, 114142, {1, 3, 5, 7, 17, 55, 11, 223, 189, 209, 139, 577, 5443, 913, 19085, 53113, 8427, 11251}},
+{20198, 18, 114158, {1, 1, 1, 7, 23, 61, 95, 213, 443, 803, 1545, 3625, 2195, 2649, 10913, 14339, 23001, 16735}},
+{20199, 18, 114165, {1, 3, 3, 3, 13, 45, 15, 225, 419, 445, 527, 635, 2279, 5097, 25267, 199, 66187, 156717}},
+{20200, 18, 114200, {1, 1, 1, 7, 23, 17, 113, 245, 99, 159, 919, 2961, 1731, 6241, 12749, 8925, 44153, 243249}},
+{20201, 18, 114219, {1, 3, 1, 3, 29, 57, 43, 245, 389, 233, 135, 45, 3771, 14061, 10173, 51939, 128985, 81605}},
+{20202, 18, 114254, {1, 1, 1, 15, 1, 19, 25, 111, 91, 193, 1185, 3679, 7155, 7077, 13743, 35631, 128975, 196979}},
+{20203, 18, 114265, {1, 3, 3, 13, 31, 57, 25, 53, 149, 331, 643, 915, 1607, 14429, 29803, 23459, 72915, 39253}},
+{20204, 18, 114272, {1, 3, 3, 9, 23, 45, 9, 29, 383, 277, 981, 1647, 5217, 4449, 26759, 63849, 98081, 37565}},
+{20205, 18, 114312, {1, 1, 1, 15, 3, 23, 9, 121, 231, 27, 1961, 2389, 1689, 7041, 8069, 37973, 74601, 15553}},
+{20206, 18, 114318, {1, 1, 5, 15, 15, 29, 11, 177, 355, 47, 1821, 393, 3383, 10439, 6357, 41119, 60323, 206253}},
+{20207, 18, 114348, {1, 1, 1, 1, 21, 29, 87, 149, 157, 979, 1867, 729, 1949, 4409, 27495, 6841, 89033, 214957}},
+{20208, 18, 114377, {1, 1, 3, 3, 9, 7, 115, 129, 141, 157, 881, 109, 5537, 303, 32549, 1953, 9903, 82401}},
+{20209, 18, 114383, {1, 1, 5, 15, 9, 19, 93, 53, 319, 913, 1341, 705, 4639, 16189, 11375, 39155, 81393, 115843}},
+{20210, 18, 114386, {1, 1, 5, 7, 31, 21, 3, 47, 437, 799, 359, 3291, 3917, 12983, 19283, 23769, 34033, 226041}},
+{20211, 18, 114431, {1, 3, 7, 7, 27, 13, 65, 31, 181, 511, 1373, 3871, 1537, 6015, 12103, 42187, 121043, 95715}},
+{20212, 18, 114448, {1, 1, 5, 11, 1, 55, 91, 11, 105, 137, 1787, 81, 5163, 5793, 17403, 59433, 113439, 65751}},
+{20213, 18, 114479, {1, 1, 3, 13, 21, 57, 87, 157, 379, 5, 285, 3217, 4557, 3359, 28953, 63397, 110537, 230571}},
+{20214, 18, 114487, {1, 3, 7, 7, 7, 27, 25, 109, 125, 337, 719, 561, 5903, 12913, 6987, 17157, 50655, 195109}},
+{20215, 18, 114513, {1, 3, 3, 15, 3, 11, 97, 93, 441, 19, 1435, 515, 6129, 5177, 28075, 53495, 107817, 78399}},
+{20216, 18, 114542, {1, 3, 1, 9, 13, 7, 89, 171, 165, 479, 223, 4001, 691, 4033, 13577, 33363, 63447, 46609}},
+{20217, 18, 114572, {1, 3, 7, 1, 15, 47, 103, 45, 209, 639, 1465, 2795, 6025, 7981, 29491, 47743, 12861, 222445}},
+{20218, 18, 114584, {1, 3, 3, 3, 1, 25, 121, 91, 253, 969, 1259, 1409, 1329, 15995, 17733, 24081, 101747, 120619}},
+{20219, 18, 114600, {1, 3, 7, 11, 11, 5, 7, 241, 469, 411, 1733, 1385, 7005, 10977, 23369, 10675, 90341, 93077}},
+{20220, 18, 114605, {1, 3, 3, 13, 17, 35, 107, 189, 437, 801, 1761, 3133, 3847, 14079, 22465, 45957, 38449, 54273}},
+{20221, 18, 114623, {1, 1, 7, 9, 9, 47, 55, 107, 491, 281, 777, 2187, 6179, 6607, 2151, 9093, 42873, 104677}},
+{20222, 18, 114628, {1, 1, 5, 3, 25, 3, 37, 55, 339, 619, 1227, 3859, 5593, 9639, 31199, 48155, 80779, 6497}},
+{20223, 18, 114640, {1, 1, 7, 1, 21, 49, 105, 45, 119, 635, 163, 3821, 3689, 11395, 19265, 14289, 89259, 167433}},
+{20224, 18, 114650, {1, 3, 3, 15, 29, 23, 11, 255, 425, 443, 1659, 3965, 4791, 10223, 11113, 48751, 7987, 166605}},
+{20225, 18, 114668, {1, 1, 7, 3, 7, 1, 113, 153, 233, 803, 539, 297, 4847, 11203, 29393, 54319, 94373, 173471}},
+{20226, 18, 114671, {1, 3, 3, 5, 27, 57, 23, 147, 423, 617, 103, 3369, 4825, 13613, 23635, 61977, 5331, 115243}},
+{20227, 18, 114674, {1, 3, 3, 9, 11, 47, 41, 27, 345, 657, 1873, 365, 1685, 11181, 31977, 60489, 98741, 215357}},
+{20228, 18, 114700, {1, 3, 1, 11, 19, 33, 39, 223, 151, 921, 309, 3413, 6735, 11971, 25583, 6927, 54821, 125203}},
+{20229, 18, 114731, {1, 1, 5, 1, 27, 31, 61, 247, 207, 895, 1453, 3613, 7097, 6537, 29407, 9903, 39937, 98285}},
+{20230, 18, 114748, {1, 3, 1, 5, 7, 11, 119, 7, 323, 27, 1069, 2033, 7387, 3381, 19007, 49039, 39453, 115411}},
+{20231, 18, 114759, {1, 1, 7, 3, 9, 15, 51, 139, 353, 857, 1829, 3955, 7669, 3961, 22805, 39879, 26677, 66865}},
+{20232, 18, 114766, {1, 3, 5, 7, 1, 11, 59, 95, 181, 645, 829, 3119, 3607, 5973, 12381, 41577, 79443, 226945}},
+{20233, 18, 114768, {1, 3, 3, 5, 3, 13, 91, 119, 103, 889, 703, 3005, 541, 7529, 12613, 14267, 70445, 217543}},
+{20234, 18, 114784, {1, 1, 5, 7, 17, 41, 5, 225, 85, 759, 1071, 2055, 1655, 14811, 25635, 50803, 58545, 105687}},
+{20235, 18, 114808, {1, 3, 5, 13, 3, 7, 77, 209, 139, 717, 985, 1085, 831, 11011, 27313, 46423, 29435, 207359}},
+{20236, 18, 114813, {1, 3, 1, 7, 27, 45, 39, 75, 311, 937, 1593, 1357, 4815, 1997, 1045, 48681, 49301, 155607}},
+{20237, 18, 114829, {1, 3, 5, 11, 21, 9, 111, 39, 447, 241, 1613, 1799, 4817, 1861, 1263, 63641, 92081, 252051}},
+{20238, 18, 114830, {1, 1, 1, 13, 31, 13, 39, 29, 349, 25, 1227, 2457, 3831, 7965, 16903, 25825, 62381, 101765}},
+{20239, 18, 114842, {1, 1, 3, 7, 15, 17, 5, 29, 83, 607, 931, 261, 1087, 16247, 10129, 7813, 5445, 167723}},
+{20240, 18, 114875, {1, 3, 5, 9, 15, 31, 69, 191, 139, 467, 1681, 1951, 7813, 4295, 18191, 11411, 15601, 13025}},
+{20241, 18, 114898, {1, 1, 1, 11, 29, 53, 97, 205, 281, 917, 1009, 913, 1003, 16085, 30339, 55753, 53099, 30697}},
+{20242, 18, 114903, {1, 1, 3, 15, 25, 35, 7, 227, 63, 251, 845, 843, 7117, 6021, 26917, 43611, 108643, 215471}},
+{20243, 18, 114913, {1, 1, 3, 11, 19, 29, 75, 5, 131, 37, 1185, 2387, 8161, 1621, 19887, 20525, 33067, 30869}},
+{20244, 18, 114928, {1, 1, 3, 3, 7, 37, 75, 159, 313, 17, 479, 2477, 7779, 309, 26095, 35693, 92561, 143151}},
+{20245, 18, 114937, {1, 1, 5, 9, 5, 29, 65, 223, 331, 1013, 37, 1813, 1379, 9277, 14681, 61687, 24763, 124669}},
+{20246, 18, 114958, {1, 3, 1, 1, 17, 47, 7, 219, 11, 13, 1517, 2583, 7483, 5399, 6883, 51387, 17901, 108659}},
+{20247, 18, 114963, {1, 3, 7, 11, 9, 63, 81, 91, 411, 535, 255, 3683, 5285, 1787, 27205, 43651, 15647, 230651}},
+{20248, 18, 115000, {1, 3, 1, 11, 7, 47, 35, 255, 341, 379, 421, 753, 7821, 13271, 13021, 463, 48457, 132521}},
+{20249, 18, 115018, {1, 1, 5, 7, 21, 23, 53, 229, 393, 509, 1641, 2245, 6941, 10447, 3231, 5451, 18883, 47401}},
+{20250, 18, 115023, {1, 3, 1, 7, 13, 61, 71, 49, 147, 625, 299, 3843, 4851, 3483, 27005, 23871, 18855, 124893}},
+{20251, 18, 115028, {1, 3, 1, 7, 31, 13, 127, 177, 259, 179, 531, 1775, 5481, 13157, 23821, 31773, 93941, 237697}},
+{20252, 18, 115042, {1, 1, 7, 1, 23, 21, 111, 219, 401, 455, 1603, 2077, 1537, 2063, 17821, 52087, 20707, 29535}},
+{20253, 18, 115084, {1, 1, 3, 11, 17, 17, 13, 79, 49, 353, 1691, 361, 2805, 7121, 27013, 50631, 108235, 70513}},
+{20254, 18, 115096, {1, 1, 5, 3, 15, 25, 103, 73, 377, 253, 1303, 501, 555, 15789, 16647, 9019, 60581, 157337}},
+{20255, 18, 115105, {1, 3, 5, 9, 23, 45, 3, 251, 25, 559, 429, 1091, 5657, 15387, 5113, 64533, 131049, 127587}},
+{20256, 18, 115117, {1, 1, 3, 15, 1, 53, 71, 141, 413, 849, 737, 3045, 7119, 8049, 18295, 31447, 70735, 117457}},
+{20257, 18, 115149, {1, 1, 1, 11, 17, 11, 69, 155, 211, 249, 1869, 1575, 6859, 7045, 7015, 20135, 84157, 232621}},
+{20258, 18, 115155, {1, 3, 7, 5, 19, 55, 15, 163, 457, 371, 1665, 1935, 601, 3629, 21975, 1191, 45133, 111649}},
+{20259, 18, 115198, {1, 3, 7, 11, 23, 33, 5, 253, 355, 379, 933, 1781, 3989, 6191, 19081, 7651, 74671, 258799}},
+{20260, 18, 115221, {1, 1, 3, 3, 23, 3, 63, 123, 273, 861, 369, 2409, 1505, 9059, 10727, 189, 122911, 44037}},
+{20261, 18, 115222, {1, 1, 7, 13, 13, 23, 19, 87, 191, 397, 2027, 1689, 1143, 10919, 27073, 15013, 118429, 119165}},
+{20262, 18, 115225, {1, 1, 5, 9, 15, 13, 29, 81, 409, 955, 1827, 1341, 3473, 16005, 29041, 57527, 7329, 167093}},
+{20263, 18, 115276, {1, 1, 5, 3, 11, 31, 47, 13, 171, 995, 961, 3885, 3259, 2745, 12405, 49281, 2901, 207591}},
+{20264, 18, 115294, {1, 3, 5, 13, 31, 3, 1, 215, 465, 279, 1697, 2449, 3829, 2053, 9877, 52911, 126077, 210515}},
+{20265, 18, 115297, {1, 1, 3, 7, 11, 27, 55, 115, 249, 353, 407, 2567, 8105, 7747, 18111, 3383, 101875, 2185}},
+{20266, 18, 115321, {1, 1, 3, 9, 25, 5, 35, 137, 405, 667, 1671, 2965, 5975, 4999, 18421, 43623, 64621, 129797}},
+{20267, 18, 115348, {1, 3, 7, 13, 3, 17, 33, 191, 463, 787, 1795, 3037, 1679, 63, 12389, 3983, 22385, 84235}},
+{20268, 18, 115364, {1, 1, 5, 9, 11, 25, 85, 215, 355, 553, 317, 1637, 3461, 15943, 2619, 14545, 125507, 18659}},
+{20269, 18, 115376, {1, 1, 7, 5, 3, 41, 105, 179, 125, 557, 1345, 3631, 481, 10621, 11213, 40223, 46581, 113137}},
+{20270, 18, 115385, {1, 3, 3, 15, 1, 63, 95, 213, 89, 21, 1249, 3063, 413, 4307, 26723, 10225, 115143, 144817}},
+{20271, 18, 115386, {1, 3, 5, 15, 9, 43, 41, 117, 419, 143, 1651, 377, 4775, 8761, 23793, 8719, 76499, 208119}},
+{20272, 18, 115400, {1, 3, 3, 1, 21, 29, 47, 117, 23, 333, 1153, 1067, 5859, 9375, 29997, 58991, 55895, 204933}},
+{20273, 18, 115414, {1, 1, 3, 11, 11, 21, 115, 85, 223, 281, 701, 1331, 1341, 1149, 5993, 10885, 77353, 113553}},
+{20274, 18, 115465, {1, 1, 5, 1, 25, 1, 1, 153, 449, 231, 593, 3061, 4157, 6661, 21735, 11361, 57751, 129569}},
+{20275, 18, 115485, {1, 1, 3, 7, 27, 63, 81, 251, 125, 197, 1525, 1637, 4643, 4743, 17127, 51217, 95781, 973}},
+{20276, 18, 115492, {1, 1, 3, 7, 11, 51, 13, 139, 83, 341, 543, 3061, 7777, 6705, 9609, 28933, 24669, 225275}},
+{20277, 18, 115501, {1, 3, 1, 9, 25, 39, 99, 139, 5, 725, 1759, 1577, 1751, 3197, 3169, 39051, 1743, 108813}},
+{20278, 18, 115519, {1, 1, 7, 5, 31, 15, 115, 229, 499, 291, 501, 3119, 2293, 14137, 625, 16379, 111057, 101643}},
+{20279, 18, 115527, {1, 3, 7, 15, 31, 1, 51, 73, 455, 51, 1983, 3687, 6049, 3495, 26247, 6567, 28479, 158909}},
+{20280, 18, 115531, {1, 3, 5, 5, 9, 11, 77, 181, 165, 773, 1611, 3945, 6787, 3827, 28597, 53269, 34003, 237291}},
+{20281, 18, 115567, {1, 1, 5, 3, 31, 57, 15, 9, 163, 363, 1021, 2193, 8175, 3851, 26059, 63915, 114293, 163637}},
+{20282, 18, 115572, {1, 1, 3, 7, 27, 49, 35, 121, 469, 833, 879, 1601, 6991, 13271, 8085, 45343, 5189, 109413}},
+{20283, 18, 115631, {1, 3, 1, 15, 7, 11, 111, 153, 129, 769, 565, 2693, 333, 7343, 28535, 56937, 85641, 19871}},
+{20284, 18, 115648, {1, 1, 5, 13, 7, 49, 121, 223, 55, 33, 19, 2291, 1847, 10173, 23337, 23431, 18181, 155663}},
+{20285, 18, 115660, {1, 3, 1, 11, 25, 9, 3, 255, 425, 861, 1025, 3719, 6995, 14687, 31083, 60609, 115375, 17813}},
+{20286, 18, 115672, {1, 1, 5, 13, 1, 55, 109, 239, 13, 939, 1077, 669, 1643, 10949, 25399, 55055, 125829, 253077}},
+{20287, 18, 115681, {1, 1, 5, 3, 15, 51, 13, 133, 257, 387, 2017, 2223, 1479, 9377, 12867, 9833, 32323, 6255}},
+{20288, 18, 115688, {1, 3, 1, 9, 1, 53, 121, 163, 349, 491, 1867, 3403, 6859, 459, 1483, 23893, 66851, 150843}},
+{20289, 18, 115694, {1, 1, 1, 1, 1, 33, 51, 33, 177, 633, 449, 2705, 663, 3701, 8331, 43895, 87223, 48587}},
+{20290, 18, 115699, {1, 3, 5, 7, 23, 7, 99, 43, 217, 31, 749, 2831, 1557, 3295, 6797, 45229, 46831, 62183}},
+{20291, 18, 115719, {1, 1, 7, 7, 1, 45, 35, 51, 415, 693, 479, 1017, 6703, 241, 30887, 8953, 26901, 2951}},
+{20292, 18, 115726, {1, 3, 3, 7, 29, 3, 25, 217, 67, 769, 653, 3983, 5513, 15481, 21399, 17525, 81747, 109843}},
+{20293, 18, 115733, {1, 3, 5, 5, 29, 17, 97, 187, 157, 189, 1531, 1123, 4291, 14831, 15493, 62753, 53563, 153679}},
+{20294, 18, 115796, {1, 3, 7, 13, 15, 63, 47, 5, 351, 275, 1177, 3947, 6755, 1319, 17053, 14267, 98215, 228795}},
+{20295, 18, 115879, {1, 3, 7, 5, 19, 45, 43, 223, 213, 903, 539, 267, 83, 6951, 2979, 56929, 58405, 198373}},
+{20296, 18, 115880, {1, 1, 5, 11, 21, 37, 109, 103, 29, 49, 17, 3987, 5679, 2559, 17391, 46157, 38743, 82245}},
+{20297, 18, 115888, {1, 1, 3, 7, 7, 35, 57, 187, 113, 361, 721, 1821, 6473, 10233, 22549, 37725, 8445, 220669}},
+{20298, 18, 115908, {1, 3, 3, 9, 21, 41, 73, 29, 163, 701, 1277, 3869, 1529, 4889, 10091, 65507, 53829, 191347}},
+{20299, 18, 115925, {1, 1, 5, 15, 5, 21, 39, 39, 341, 271, 1543, 3161, 3935, 8319, 24921, 19575, 95009, 256221}},
+{20300, 18, 115942, {1, 1, 1, 3, 11, 33, 63, 189, 21, 773, 1261, 3947, 183, 6769, 31337, 22179, 57255, 8323}},
+{20301, 18, 115978, {1, 1, 3, 15, 29, 59, 103, 251, 107, 499, 915, 387, 3127, 5597, 3345, 15657, 979, 91685}},
+{20302, 18, 115986, {1, 3, 3, 11, 13, 27, 9, 137, 177, 75, 567, 1511, 7355, 3087, 15309, 51733, 87329, 217125}},
+{20303, 18, 116014, {1, 1, 1, 15, 9, 43, 113, 177, 507, 379, 765, 75, 6895, 7523, 24611, 7315, 49653, 59263}},
+{20304, 18, 116019, {1, 3, 1, 5, 29, 23, 59, 215, 267, 161, 1957, 341, 4081, 9635, 3345, 12323, 128751, 144577}},
+{20305, 18, 116031, {1, 3, 3, 13, 17, 55, 59, 73, 65, 697, 1209, 3345, 5629, 4545, 23043, 37649, 55015, 10263}},
+{20306, 18, 116048, {1, 1, 7, 1, 21, 3, 7, 19, 445, 417, 1677, 799, 1241, 15463, 19815, 52845, 81309, 256713}},
+{20307, 18, 116069, {1, 1, 3, 13, 13, 57, 17, 199, 3, 377, 1799, 2713, 3937, 12511, 7439, 33605, 56697, 168195}},
+{20308, 18, 116091, {1, 3, 1, 7, 21, 53, 115, 97, 389, 83, 961, 813, 1499, 3411, 22377, 33323, 118405, 115947}},
+{20309, 18, 116103, {1, 3, 7, 11, 23, 43, 85, 249, 151, 893, 833, 901, 7731, 13467, 14721, 38613, 104033, 136097}},
+{20310, 18, 116107, {1, 3, 1, 11, 23, 23, 119, 129, 175, 159, 1031, 2379, 2753, 6755, 10979, 18225, 52375, 257003}},
+{20311, 18, 116145, {1, 3, 1, 13, 1, 9, 61, 255, 433, 621, 1469, 705, 5841, 7421, 23873, 30487, 55823, 119705}},
+{20312, 18, 116152, {1, 3, 1, 15, 19, 31, 29, 163, 87, 793, 885, 2495, 4609, 2757, 5333, 52937, 79187, 228777}},
+{20313, 18, 116247, {1, 1, 1, 3, 17, 43, 69, 241, 143, 173, 327, 2747, 5617, 16347, 16155, 47775, 25917, 163663}},
+{20314, 18, 116289, {1, 1, 1, 1, 19, 19, 15, 27, 25, 139, 691, 4019, 3055, 10301, 11281, 10957, 59117, 178149}},
+{20315, 18, 116316, {1, 1, 1, 3, 15, 15, 37, 89, 103, 7, 527, 2823, 7205, 6831, 25179, 22249, 103323, 31251}},
+{20316, 18, 116344, {1, 1, 3, 3, 7, 49, 7, 241, 37, 11, 577, 1987, 1935, 14787, 16411, 36305, 65185, 221253}},
+{20317, 18, 116354, {1, 1, 1, 5, 31, 51, 123, 169, 441, 13, 721, 2359, 5687, 2641, 16339, 8441, 55967, 98775}},
+{20318, 18, 116368, {1, 1, 7, 5, 21, 23, 91, 229, 23, 105, 339, 2371, 7803, 14913, 12651, 40573, 117399, 134865}},
+{20319, 18, 116377, {1, 3, 1, 15, 19, 27, 127, 77, 469, 343, 451, 2251, 6705, 7765, 8623, 10367, 100379, 140899}},
+{20320, 18, 116383, {1, 3, 1, 5, 1, 11, 93, 231, 33, 133, 1545, 1015, 7577, 8871, 29975, 12141, 130833, 103123}},
+{20321, 18, 116387, {1, 3, 3, 5, 7, 25, 95, 93, 293, 543, 1785, 2097, 6045, 4225, 607, 443, 72055, 32269}},
+{20322, 18, 116408, {1, 1, 1, 1, 5, 55, 47, 105, 189, 359, 1589, 765, 2303, 11963, 25565, 40669, 98977, 242089}},
+{20323, 18, 116428, {1, 1, 1, 15, 13, 45, 121, 235, 125, 181, 1891, 3265, 2097, 3207, 31647, 13407, 22515, 15155}},
+{20324, 18, 116445, {1, 1, 5, 15, 13, 11, 81, 233, 307, 505, 221, 813, 6483, 741, 9819, 19405, 74235, 144761}},
+{20325, 18, 116476, {1, 3, 5, 7, 9, 25, 31, 209, 337, 473, 1831, 2711, 5551, 13531, 28747, 1875, 6401, 159995}},
+{20326, 18, 116482, {1, 1, 7, 7, 29, 3, 127, 207, 387, 849, 1449, 2741, 2105, 885, 18115, 5433, 122119, 16969}},
+{20327, 18, 116488, {1, 3, 7, 9, 25, 17, 43, 209, 41, 927, 409, 1567, 1609, 12487, 16305, 41365, 10991, 172127}},
+{20328, 18, 116493, {1, 1, 3, 7, 27, 29, 63, 127, 81, 283, 1459, 143, 5993, 14027, 8055, 28065, 128389, 255307}},
+{20329, 18, 116502, {1, 3, 7, 11, 13, 41, 63, 223, 215, 901, 1853, 2881, 5149, 7439, 4519, 33279, 127765, 139431}},
+{20330, 18, 116518, {1, 3, 7, 7, 15, 61, 61, 173, 221, 711, 191, 3863, 2695, 9663, 6277, 8791, 128019, 256755}},
+{20331, 18, 116524, {1, 3, 1, 9, 29, 45, 83, 43, 297, 605, 1887, 2421, 2307, 5199, 17275, 39225, 127215, 253687}},
+{20332, 18, 116527, {1, 1, 5, 3, 21, 23, 121, 125, 497, 945, 1367, 2757, 3481, 8607, 32447, 62373, 32171, 226621}},
+{20333, 18, 116549, {1, 3, 1, 5, 7, 1, 71, 255, 465, 951, 129, 1989, 6053, 3737, 6511, 54519, 16947, 124491}},
+{20334, 18, 116561, {1, 3, 5, 1, 9, 21, 127, 49, 85, 615, 1897, 1715, 7923, 10309, 16919, 24131, 18015, 140195}},
+{20335, 18, 116562, {1, 1, 1, 1, 5, 27, 3, 205, 29, 319, 485, 3941, 7829, 789, 4207, 39939, 67761, 152459}},
+{20336, 18, 116568, {1, 3, 7, 11, 9, 41, 1, 129, 511, 831, 1007, 2011, 6211, 9179, 20877, 62121, 21879, 23661}},
+{20337, 18, 116577, {1, 1, 7, 1, 19, 53, 75, 123, 181, 735, 925, 1065, 3317, 3201, 27473, 19379, 78223, 45725}},
+{20338, 18, 116590, {1, 1, 5, 9, 9, 61, 3, 193, 441, 815, 583, 3235, 247, 14091, 19877, 33505, 3477, 20111}},
+{20339, 18, 116602, {1, 1, 5, 13, 29, 53, 55, 165, 359, 889, 1833, 1543, 7913, 307, 22853, 37839, 15569, 140127}},
+{20340, 18, 116607, {1, 1, 1, 15, 21, 53, 63, 195, 299, 1019, 1371, 1311, 5401, 8015, 30335, 56281, 61011, 59279}},
+{20341, 18, 116611, {1, 1, 3, 13, 3, 57, 45, 239, 445, 419, 581, 3971, 4621, 9327, 27255, 53069, 126415, 250313}},
+{20342, 18, 116626, {1, 3, 1, 9, 5, 63, 21, 25, 447, 961, 1857, 3123, 3029, 9743, 26069, 38251, 58475, 108737}},
+{20343, 18, 116637, {1, 3, 1, 15, 13, 59, 5, 21, 171, 107, 1631, 2407, 6695, 8079, 2805, 50995, 53173, 104757}},
+{20344, 18, 116647, {1, 3, 7, 7, 1, 55, 103, 67, 369, 533, 515, 2363, 5147, 11633, 20435, 24591, 68155, 140029}},
+{20345, 18, 116665, {1, 3, 7, 13, 19, 51, 13, 149, 159, 915, 1029, 2825, 5259, 5139, 31325, 42825, 119923, 227811}},
+{20346, 18, 116674, {1, 3, 3, 3, 23, 17, 121, 25, 403, 333, 491, 2869, 881, 12997, 5101, 48351, 90831, 143009}},
+{20347, 18, 116700, {1, 1, 3, 15, 23, 63, 93, 43, 107, 393, 419, 3509, 1543, 10295, 11019, 8389, 73753, 42681}},
+{20348, 18, 116714, {1, 1, 7, 1, 29, 49, 41, 189, 303, 955, 1241, 1623, 2269, 3413, 6261, 2155, 90945, 95117}},
+{20349, 18, 116719, {1, 1, 3, 15, 31, 13, 103, 241, 189, 283, 1303, 1693, 1587, 16313, 205, 43421, 121799, 200151}},
+{20350, 18, 116744, {1, 3, 5, 1, 29, 27, 105, 83, 345, 411, 1197, 3489, 5891, 1137, 7311, 681, 127991, 69533}},
+{20351, 18, 116764, {1, 3, 5, 15, 31, 11, 105, 221, 57, 39, 145, 3233, 1431, 16271, 21225, 47989, 72583, 191327}},
+{20352, 18, 116774, {1, 3, 7, 9, 25, 47, 109, 61, 257, 949, 981, 1383, 8003, 4661, 19555, 20191, 114641, 84817}},
+{20353, 18, 116778, {1, 1, 5, 9, 17, 9, 19, 209, 73, 573, 1039, 2741, 1495, 1615, 6299, 20507, 84729, 166977}},
+{20354, 18, 116798, {1, 3, 5, 13, 27, 51, 39, 203, 437, 725, 1479, 3071, 621, 15563, 28473, 58403, 25943, 116683}},
+{20355, 18, 116803, {1, 1, 3, 9, 5, 29, 63, 61, 329, 305, 523, 2243, 6689, 11773, 19319, 57783, 24265, 218153}},
+{20356, 18, 116806, {1, 3, 7, 5, 17, 27, 115, 9, 243, 613, 679, 1915, 7265, 2989, 13663, 15115, 50779, 235761}},
+{20357, 18, 116827, {1, 1, 5, 5, 13, 35, 111, 151, 255, 569, 1209, 3277, 4503, 3797, 22601, 19523, 126339, 141289}},
+{20358, 18, 116839, {1, 1, 3, 9, 15, 51, 85, 125, 233, 1011, 231, 2949, 1091, 8605, 14855, 62401, 14143, 212557}},
+{20359, 18, 116863, {1, 3, 5, 11, 29, 53, 83, 31, 201, 219, 1083, 967, 6913, 10325, 1971, 55841, 7733, 208883}},
+{20360, 18, 116873, {1, 3, 3, 1, 23, 33, 51, 103, 265, 285, 1363, 2813, 3327, 7921, 13537, 31483, 43405, 189641}},
+{20361, 18, 116882, {1, 1, 7, 15, 27, 3, 5, 87, 117, 437, 1251, 189, 3271, 15579, 25025, 23203, 39421, 133581}},
+{20362, 18, 116887, {1, 1, 5, 1, 9, 3, 91, 45, 71, 557, 2019, 2355, 5539, 2843, 13025, 61017, 3475, 179891}},
+{20363, 18, 116915, {1, 1, 7, 5, 17, 11, 127, 241, 9, 971, 1699, 2719, 1947, 109, 19817, 13949, 120247, 60775}},
+{20364, 18, 116939, {1, 1, 5, 9, 9, 39, 117, 221, 197, 767, 1691, 4075, 3665, 1271, 16119, 64129, 2681, 105325}},
+{20365, 18, 116944, {1, 3, 3, 11, 31, 51, 5, 23, 419, 715, 1985, 4095, 7255, 10491, 25575, 6177, 35917, 178345}},
+{20366, 18, 116953, {1, 3, 5, 7, 15, 23, 99, 203, 461, 509, 1501, 1965, 1105, 1341, 21713, 21901, 129905, 67937}},
+{20367, 18, 116965, {1, 3, 3, 15, 25, 5, 55, 167, 477, 125, 163, 2379, 2433, 12975, 26259, 55825, 19913, 202873}},
+{20368, 18, 117002, {1, 3, 3, 7, 15, 15, 67, 227, 413, 905, 1609, 2083, 4011, 10477, 22809, 61873, 96423, 119253}},
+{20369, 18, 117007, {1, 3, 1, 11, 13, 17, 37, 147, 355, 445, 619, 3181, 5939, 6953, 15859, 37979, 24723, 133037}},
+{20370, 18, 117015, {1, 1, 5, 15, 5, 25, 89, 3, 279, 569, 343, 2453, 5739, 2901, 6709, 43957, 75791, 20791}},
+{20371, 18, 117032, {1, 1, 3, 5, 13, 39, 53, 203, 75, 945, 635, 349, 2339, 2549, 23827, 7903, 128005, 14949}},
+{20372, 18, 117035, {1, 1, 7, 3, 7, 59, 59, 77, 143, 99, 1313, 3957, 3807, 15731, 20919, 60829, 105967, 226767}},
+{20373, 18, 117052, {1, 1, 3, 7, 17, 49, 27, 245, 129, 583, 1055, 741, 5607, 689, 20075, 54837, 113257, 222677}},
+{20374, 18, 117087, {1, 1, 7, 13, 17, 5, 19, 141, 205, 749, 1769, 2981, 5787, 4511, 135, 19475, 113735, 116859}},
+{20375, 18, 117139, {1, 3, 7, 1, 9, 33, 111, 139, 77, 117, 363, 1171, 2587, 1539, 30791, 10697, 6879, 104827}},
+{20376, 18, 117157, {1, 3, 3, 5, 27, 47, 49, 215, 65, 435, 1601, 231, 2047, 10405, 28409, 17013, 103909, 232051}},
+{20377, 18, 117193, {1, 3, 3, 3, 13, 19, 3, 159, 293, 675, 247, 2829, 6703, 6085, 1935, 18209, 15709, 186669}},
+{20378, 18, 117211, {1, 3, 3, 5, 21, 55, 17, 237, 121, 603, 953, 947, 6973, 15979, 11029, 12381, 12807, 131603}},
+{20379, 18, 117214, {1, 3, 5, 3, 3, 41, 121, 203, 283, 349, 1841, 115, 6567, 2131, 883, 50515, 78381, 168189}},
+{20380, 18, 117220, {1, 3, 7, 15, 5, 55, 85, 13, 77, 443, 1711, 1043, 1265, 3701, 5121, 41435, 40637, 69125}},
+{20381, 18, 117238, {1, 1, 5, 15, 15, 33, 67, 235, 3, 95, 1685, 731, 2187, 11857, 7197, 62113, 12565, 127455}},
+{20382, 18, 117248, {1, 3, 7, 7, 11, 45, 125, 231, 263, 611, 221, 195, 6347, 14029, 7823, 52295, 78879, 211441}},
+{20383, 18, 117275, {1, 3, 7, 15, 9, 63, 75, 189, 187, 449, 27, 3647, 4705, 13037, 3773, 36441, 35445, 181793}},
+{20384, 18, 117293, {1, 1, 5, 3, 31, 19, 123, 39, 297, 1017, 1191, 2227, 6085, 5117, 16569, 64743, 29329, 157279}},
+{20385, 18, 117301, {1, 1, 5, 5, 15, 47, 111, 61, 435, 657, 141, 3445, 6921, 7759, 30141, 37631, 85969, 227563}},
+{20386, 18, 117319, {1, 3, 1, 13, 27, 39, 15, 167, 151, 185, 1513, 211, 951, 12705, 25703, 29289, 120993, 156741}},
+{20387, 18, 117338, {1, 3, 7, 7, 7, 39, 19, 221, 351, 951, 1231, 1915, 3043, 189, 18977, 50149, 56583, 122147}},
+{20388, 18, 117347, {1, 1, 5, 15, 29, 37, 77, 207, 291, 851, 131, 1041, 1657, 4393, 5023, 12745, 32253, 204431}},
+{20389, 18, 117361, {1, 1, 7, 15, 11, 59, 85, 255, 67, 23, 1321, 2153, 7043, 417, 15719, 59937, 37619, 109331}},
+{20390, 18, 117380, {1, 3, 7, 15, 25, 37, 43, 15, 385, 735, 1741, 3655, 4215, 1097, 19519, 44313, 99851, 204717}},
+{20391, 18, 117389, {1, 1, 3, 7, 15, 17, 17, 105, 399, 49, 105, 159, 465, 11991, 29797, 23907, 129609, 179013}},
+{20392, 18, 117398, {1, 1, 7, 13, 9, 17, 87, 51, 391, 695, 545, 3061, 4499, 2059, 10095, 13847, 68519, 60611}},
+{20393, 18, 117435, {1, 3, 3, 1, 31, 7, 11, 233, 231, 189, 1599, 1589, 401, 8759, 17273, 43613, 48709, 253521}},
+{20394, 18, 117458, {1, 1, 1, 11, 5, 9, 27, 77, 491, 951, 579, 1635, 3241, 14497, 27149, 45001, 56769, 160731}},
+{20395, 18, 117476, {1, 3, 7, 15, 29, 11, 125, 101, 19, 971, 107, 1525, 3939, 7633, 16355, 24727, 19475, 157571}},
+{20396, 18, 117498, {1, 1, 1, 9, 25, 7, 35, 187, 321, 483, 1919, 1911, 7869, 12903, 26977, 49419, 24973, 214731}},
+{20397, 18, 117500, {1, 1, 5, 3, 23, 1, 11, 143, 315, 1015, 1367, 1555, 1041, 6655, 10481, 49275, 49575, 101061}},
+{20398, 18, 117529, {1, 3, 5, 15, 15, 59, 13, 117, 217, 975, 1821, 3829, 1545, 921, 20875, 43305, 18793, 158651}},
+{20399, 18, 117554, {1, 3, 3, 11, 23, 23, 91, 7, 29, 613, 1093, 3881, 3301, 3751, 16137, 48277, 119813, 177341}},
+{20400, 18, 117556, {1, 3, 3, 15, 7, 37, 115, 19, 147, 585, 1877, 2395, 3343, 9567, 16199, 13969, 89731, 124835}},
+{20401, 18, 117565, {1, 1, 5, 7, 29, 3, 59, 141, 375, 527, 1219, 409, 7155, 2823, 32497, 23103, 73187, 53089}},
+{20402, 18, 117580, {1, 1, 5, 3, 13, 27, 111, 63, 189, 813, 643, 19, 3461, 13891, 26651, 52395, 74729, 148397}},
+{20403, 18, 117585, {1, 3, 5, 1, 27, 61, 97, 227, 123, 829, 1559, 2523, 7737, 6047, 213, 23613, 61571, 7093}},
+{20404, 18, 117592, {1, 1, 1, 11, 17, 1, 73, 203, 391, 937, 321, 3431, 7163, 3547, 29467, 65271, 69775, 226405}},
+{20405, 18, 117597, {1, 1, 5, 15, 25, 7, 75, 199, 511, 731, 1547, 2127, 1609, 5623, 26771, 29935, 76671, 178683}},
+{20406, 18, 117616, {1, 3, 5, 15, 25, 49, 99, 23, 281, 81, 507, 1499, 5235, 9945, 14099, 5993, 319, 178581}},
+{20407, 18, 117637, {1, 3, 7, 9, 5, 13, 105, 7, 135, 827, 927, 3463, 839, 7047, 19863, 63859, 13951, 221795}},
+{20408, 18, 117644, {1, 1, 1, 13, 7, 21, 59, 9, 467, 299, 1035, 1395, 7413, 7313, 24769, 44043, 50679, 72867}},
+{20409, 18, 117659, {1, 1, 7, 1, 31, 33, 95, 155, 429, 413, 493, 2025, 2069, 551, 507, 13515, 3507, 93873}},
+{20410, 18, 117703, {1, 1, 3, 5, 3, 33, 109, 1, 299, 727, 495, 2981, 3795, 11467, 27173, 4171, 6859, 129961}},
+{20411, 18, 117704, {1, 1, 7, 9, 23, 41, 113, 103, 161, 303, 1565, 2637, 7113, 11635, 13707, 3559, 21007, 250107}},
+{20412, 18, 117727, {1, 1, 5, 13, 1, 49, 11, 87, 31, 77, 1847, 1137, 3031, 1943, 28755, 32197, 96043, 152447}},
+{20413, 18, 117738, {1, 1, 3, 7, 3, 3, 123, 65, 175, 809, 681, 2135, 5279, 7119, 4573, 19287, 90235, 183391}},
+{20414, 18, 117770, {1, 3, 1, 13, 7, 5, 25, 151, 437, 155, 1841, 219, 5641, 12097, 6153, 11, 60315, 169293}},
+{20415, 18, 117796, {1, 1, 7, 5, 21, 29, 23, 83, 35, 651, 1507, 635, 3867, 12133, 25523, 55341, 105741, 240349}},
+{20416, 18, 117799, {1, 1, 1, 15, 9, 29, 27, 151, 463, 747, 547, 577, 1263, 15235, 6695, 60849, 72231, 175671}},
+{20417, 18, 117820, {1, 3, 5, 11, 11, 43, 81, 37, 505, 509, 1325, 3295, 839, 5855, 19795, 1403, 15711, 219481}},
+{20418, 18, 117832, {1, 3, 3, 15, 25, 61, 121, 37, 201, 133, 537, 1345, 4213, 13023, 18795, 8949, 84431, 105521}},
+{20419, 18, 117840, {1, 3, 7, 11, 13, 51, 87, 245, 357, 7, 699, 2003, 5963, 1399, 69, 19083, 114585, 232313}},
+{20420, 18, 117843, {1, 1, 1, 13, 9, 29, 65, 123, 37, 885, 227, 2795, 1037, 10905, 21217, 4081, 77643, 254245}},
+{20421, 18, 117865, {1, 3, 1, 3, 25, 23, 71, 189, 253, 785, 1337, 1275, 3285, 1067, 8607, 3883, 119099, 116637}},
+{20422, 18, 117868, {1, 1, 1, 15, 19, 43, 17, 89, 257, 175, 1943, 207, 597, 9279, 405, 33209, 65221, 39557}},
+{20423, 18, 117874, {1, 1, 7, 5, 7, 47, 127, 11, 197, 871, 23, 1951, 6829, 7831, 5223, 56287, 115649, 114283}},
+{20424, 18, 117886, {1, 3, 1, 3, 1, 35, 81, 189, 19, 117, 1683, 469, 8117, 5449, 22871, 5505, 125111, 128717}},
+{20425, 18, 117962, {1, 3, 7, 5, 7, 31, 105, 57, 387, 691, 1293, 3103, 2329, 16247, 18357, 55453, 112633, 225641}},
+{20426, 18, 117967, {1, 3, 1, 3, 13, 3, 65, 25, 47, 413, 521, 3507, 1793, 14431, 22341, 39813, 46399, 204501}},
+{20427, 18, 117995, {1, 3, 1, 1, 31, 37, 21, 45, 261, 665, 1243, 1937, 5001, 3789, 26473, 20153, 107131, 75523}},
+{20428, 18, 118000, {1, 3, 5, 15, 27, 61, 109, 139, 19, 583, 353, 445, 53, 67, 20753, 57827, 116527, 55109}},
+{20429, 18, 118017, {1, 1, 3, 3, 1, 37, 113, 21, 305, 967, 1703, 2095, 1059, 2843, 22381, 24871, 24765, 52425}},
+{20430, 18, 118037, {1, 3, 7, 11, 27, 59, 111, 111, 283, 79, 1227, 3631, 4169, 5671, 7769, 56553, 75503, 206259}},
+{20431, 18, 118038, {1, 1, 5, 11, 11, 1, 127, 13, 17, 255, 1383, 2879, 6785, 289, 7061, 53067, 11539, 131405}},
+{20432, 18, 118051, {1, 1, 5, 15, 29, 27, 67, 15, 247, 689, 579, 3237, 5279, 13847, 20305, 60237, 115841, 144855}},
+{20433, 18, 118057, {1, 1, 5, 1, 9, 25, 75, 11, 83, 1015, 281, 1617, 7449, 10673, 7033, 38839, 113703, 233101}},
+{20434, 18, 118072, {1, 3, 3, 3, 23, 41, 81, 109, 199, 969, 935, 1793, 6921, 4013, 9625, 48149, 54395, 1193}},
+{20435, 18, 118080, {1, 3, 5, 7, 19, 63, 25, 201, 63, 799, 765, 533, 1417, 3199, 7773, 44247, 112207, 11783}},
+{20436, 18, 118098, {1, 3, 1, 11, 7, 25, 87, 159, 491, 749, 1157, 667, 2951, 12019, 22259, 36933, 124159, 176041}},
+{20437, 18, 118107, {1, 1, 5, 15, 21, 19, 113, 175, 129, 385, 2025, 2685, 1925, 8547, 4835, 15953, 128023, 236341}},
+{20438, 18, 118109, {1, 1, 1, 9, 13, 47, 25, 81, 389, 249, 1857, 1061, 4439, 3717, 16299, 23247, 95275, 222701}},
+{20439, 18, 118114, {1, 3, 3, 1, 3, 61, 61, 117, 159, 689, 43, 113, 4203, 7699, 27607, 37195, 63415, 90481}},
+{20440, 18, 118123, {1, 3, 1, 5, 11, 49, 73, 13, 307, 655, 645, 2765, 6079, 12687, 22417, 44713, 5247, 40265}},
+{20441, 18, 118150, {1, 1, 7, 13, 5, 55, 57, 237, 317, 101, 481, 2515, 707, 6385, 9421, 50557, 92395, 193737}},
+{20442, 18, 118159, {1, 3, 5, 1, 27, 35, 65, 107, 63, 57, 1699, 4077, 4279, 8547, 15137, 11533, 117641, 64925}},
+{20443, 18, 118164, {1, 1, 5, 1, 13, 7, 7, 141, 305, 191, 2033, 2677, 6025, 12927, 4057, 12047, 60253, 90803}},
+{20444, 18, 118173, {1, 1, 7, 3, 1, 9, 63, 233, 185, 97, 913, 187, 4321, 8951, 27669, 27035, 30029, 218725}},
+{20445, 18, 118201, {1, 1, 7, 1, 11, 59, 41, 195, 335, 551, 491, 3079, 7777, 4003, 24543, 17165, 103261, 167505}},
+{20446, 18, 118212, {1, 1, 3, 3, 9, 59, 37, 185, 289, 845, 1083, 63, 7439, 4677, 29245, 40813, 16295, 45499}},
+{20447, 18, 118246, {1, 3, 5, 1, 1, 37, 89, 5, 277, 493, 155, 1641, 5395, 11389, 26247, 2833, 103803, 74447}},
+{20448, 18, 118257, {1, 1, 3, 1, 29, 55, 83, 211, 377, 583, 1075, 2679, 7157, 11719, 1653, 5977, 52263, 45531}},
+{20449, 18, 118303, {1, 1, 5, 15, 1, 31, 89, 7, 239, 821, 887, 1319, 225, 14555, 5443, 44717, 99803, 241577}},
+{20450, 18, 118310, {1, 3, 5, 11, 7, 23, 81, 161, 67, 1011, 177, 2837, 7767, 14385, 29415, 9377, 7407, 128403}},
+{20451, 18, 118313, {1, 1, 7, 11, 3, 13, 13, 237, 199, 601, 481, 3809, 6591, 8497, 25361, 22547, 28317, 22961}},
+{20452, 18, 118324, {1, 3, 1, 1, 31, 29, 105, 161, 483, 391, 321, 1087, 4149, 8803, 22291, 24611, 114447, 33645}},
+{20453, 18, 118334, {1, 3, 1, 11, 1, 47, 41, 45, 287, 503, 169, 2265, 1835, 6609, 25245, 7069, 61137, 160653}},
+{20454, 18, 118336, {1, 1, 7, 13, 11, 39, 29, 39, 489, 205, 741, 2871, 377, 10679, 11689, 50947, 85309, 95697}},
+{20455, 18, 118339, {1, 3, 7, 7, 23, 19, 103, 15, 79, 425, 369, 2009, 4417, 11031, 2113, 36969, 73241, 120903}},
+{20456, 18, 118353, {1, 3, 1, 7, 27, 9, 43, 33, 123, 895, 223, 1045, 2701, 3339, 12099, 24449, 52973, 175671}},
+{20457, 18, 118354, {1, 3, 5, 5, 3, 1, 13, 117, 429, 167, 1361, 2299, 7565, 1153, 9259, 29209, 25747, 71005}},
+{20458, 18, 118390, {1, 3, 1, 15, 7, 7, 13, 209, 73, 523, 1549, 2545, 5583, 10209, 27205, 41243, 14217, 208993}},
+{20459, 18, 118396, {1, 3, 5, 5, 3, 29, 99, 255, 479, 297, 1319, 2171, 7321, 14425, 15869, 44449, 10917, 171165}},
+{20460, 18, 118436, {1, 3, 3, 11, 13, 49, 29, 95, 79, 987, 161, 859, 6503, 8839, 14131, 30249, 16183, 40257}},
+{20461, 18, 118453, {1, 3, 3, 11, 27, 7, 27, 33, 255, 847, 789, 3897, 2599, 16107, 22379, 1853, 102713, 197547}},
+{20462, 18, 118466, {1, 1, 3, 9, 29, 11, 107, 227, 35, 183, 639, 1585, 313, 1451, 19789, 13855, 94277, 85569}},
+{20463, 18, 118492, {1, 3, 7, 7, 25, 33, 101, 49, 137, 457, 2027, 3317, 1961, 6097, 739, 12875, 69503, 95453}},
+{20464, 18, 118506, {1, 3, 3, 11, 29, 13, 127, 3, 31, 319, 1341, 927, 5067, 13891, 31265, 41381, 49341, 160343}},
+{20465, 18, 118525, {1, 1, 3, 15, 31, 21, 93, 155, 471, 707, 1395, 2995, 867, 10353, 8137, 44267, 24823, 6113}},
+{20466, 18, 118557, {1, 3, 1, 7, 7, 33, 83, 79, 349, 687, 1045, 1183, 4441, 15199, 1953, 36395, 84691, 134939}},
+{20467, 18, 118561, {1, 1, 3, 15, 13, 21, 41, 105, 189, 439, 1171, 4005, 7641, 1597, 24317, 58749, 35539, 220647}},
+{20468, 18, 118586, {1, 1, 3, 15, 13, 39, 49, 5, 461, 613, 1633, 1951, 7959, 5733, 10061, 18829, 49505, 90033}},
+{20469, 18, 118606, {1, 3, 5, 5, 29, 25, 19, 227, 379, 525, 687, 2629, 7729, 4791, 5911, 14481, 49063, 216669}},
+{20470, 18, 118627, {1, 3, 7, 7, 7, 63, 93, 227, 79, 165, 1971, 1695, 4485, 6009, 8769, 12861, 83653, 27667}},
+{20471, 18, 118641, {1, 1, 5, 5, 25, 11, 23, 89, 363, 491, 459, 4063, 3787, 9375, 28011, 44757, 56441, 116609}},
+{20472, 18, 118654, {1, 3, 5, 9, 7, 53, 43, 149, 435, 35, 135, 1759, 3197, 7749, 12731, 28295, 25901, 125847}},
+{20473, 18, 118687, {1, 1, 3, 5, 15, 15, 1, 215, 307, 711, 1971, 2795, 677, 11921, 10303, 37997, 6653, 51295}},
+{20474, 18, 118688, {1, 1, 5, 15, 1, 59, 75, 195, 51, 215, 1303, 3023, 8023, 10951, 13015, 23513, 37029, 23581}},
+{20475, 18, 118735, {1, 1, 1, 3, 27, 3, 77, 165, 97, 499, 937, 1129, 6649, 11305, 27763, 32849, 78251, 210407}},
+{20476, 18, 118737, {1, 3, 3, 3, 9, 21, 19, 197, 339, 53, 1875, 1057, 3485, 14645, 13417, 39307, 81437, 45857}},
+{20477, 18, 118750, {1, 1, 1, 5, 19, 5, 95, 205, 399, 699, 819, 1927, 7913, 8109, 1223, 28595, 397, 81051}},
+{20478, 18, 118773, {1, 3, 7, 13, 23, 11, 37, 167, 189, 813, 1199, 3545, 655, 13239, 10469, 33895, 119025, 185361}},
+{20479, 18, 118778, {1, 1, 5, 11, 9, 13, 41, 37, 443, 269, 1199, 1347, 7081, 11273, 14389, 64083, 117901, 51903}},
+{20480, 18, 118786, {1, 1, 3, 13, 5, 17, 117, 151, 155, 637, 731, 1839, 855, 9749, 19529, 18101, 20341, 21941}},
+{20481, 18, 118809, {1, 1, 1, 11, 15, 17, 35, 9, 91, 907, 667, 853, 1455, 10097, 31277, 749, 47089, 219517}},
+{20482, 18, 118833, {1, 3, 7, 1, 27, 31, 9, 145, 309, 811, 5, 2645, 7851, 1953, 21427, 18805, 108755, 77215}},
+{20483, 18, 118853, {1, 1, 7, 3, 21, 7, 25, 233, 145, 1015, 43, 2205, 4735, 13257, 24001, 50469, 42567, 253745}},
+{20484, 18, 118854, {1, 3, 1, 15, 3, 53, 51, 45, 397, 379, 641, 895, 7569, 15783, 23923, 6147, 121395, 261853}},
+{20485, 18, 118863, {1, 1, 1, 1, 23, 47, 35, 125, 289, 65, 1875, 2309, 519, 5435, 5271, 25319, 14557, 19389}},
+{20486, 18, 118881, {1, 3, 5, 7, 27, 43, 15, 61, 357, 791, 1781, 3671, 3911, 1325, 5607, 44107, 67873, 119849}},
+{20487, 18, 118896, {1, 3, 1, 5, 25, 37, 105, 51, 491, 407, 475, 1763, 1425, 14883, 31435, 48979, 120667, 131089}},
+{20488, 18, 118917, {1, 3, 5, 13, 1, 51, 109, 161, 215, 871, 185, 2389, 7977, 6705, 14045, 45569, 44557, 114795}},
+{20489, 18, 118921, {1, 3, 7, 11, 17, 21, 111, 183, 343, 593, 447, 3995, 759, 3709, 32655, 30141, 127225, 120899}},
+{20490, 18, 118939, {1, 1, 5, 3, 17, 3, 69, 25, 113, 897, 1933, 2717, 2003, 5847, 2541, 62415, 50975, 97903}},
+{20491, 18, 118948, {1, 1, 1, 1, 9, 35, 107, 81, 257, 57, 1719, 4049, 1237, 10659, 4689, 20887, 90791, 251911}},
+{20492, 18, 118960, {1, 1, 7, 11, 1, 49, 83, 213, 169, 169, 825, 2983, 5833, 2413, 32165, 47459, 129021, 156217}},
+{20493, 18, 118970, {1, 1, 5, 13, 15, 39, 61, 93, 407, 553, 839, 4035, 6609, 6327, 945, 49625, 127867, 240161}},
+{20494, 18, 118983, {1, 1, 1, 15, 23, 47, 21, 235, 81, 431, 1819, 1141, 7973, 4623, 4539, 23201, 83111, 230857}},
+{20495, 18, 119025, {1, 3, 3, 15, 9, 15, 15, 173, 29, 803, 1453, 2621, 8095, 6639, 6607, 21471, 44785, 122271}},
+{20496, 18, 119026, {1, 3, 3, 7, 21, 5, 127, 203, 43, 581, 1925, 165, 4615, 9141, 18563, 54413, 71559, 172791}},
+{20497, 18, 119064, {1, 3, 3, 3, 27, 31, 55, 3, 381, 971, 1087, 2659, 139, 10935, 9189, 3445, 15071, 218873}},
+{20498, 18, 119069, {1, 3, 1, 3, 1, 57, 47, 71, 85, 335, 207, 225, 2931, 14721, 21431, 17199, 745, 177403}},
+{20499, 18, 119079, {1, 3, 1, 7, 7, 17, 21, 57, 345, 29, 1147, 1179, 7371, 14725, 27445, 62061, 16483, 112489}},
+{20500, 18, 119085, {1, 3, 7, 15, 23, 11, 91, 1, 1, 117, 1665, 3899, 5683, 14497, 25633, 6233, 104029, 22155}},
+{20501, 18, 119115, {1, 3, 5, 9, 1, 27, 15, 187, 37, 329, 585, 729, 5651, 15715, 4339, 1899, 90611, 195643}},
+{20502, 18, 119165, {1, 1, 3, 11, 1, 45, 95, 103, 13, 83, 319, 2295, 6333, 13469, 19237, 55985, 129725, 141699}},
+{20503, 18, 119166, {1, 1, 5, 11, 7, 41, 97, 159, 511, 617, 1545, 3023, 7919, 8437, 8345, 16701, 69053, 105047}},
+{20504, 18, 119193, {1, 3, 3, 11, 29, 35, 23, 95, 277, 931, 857, 3887, 4597, 10841, 12947, 18009, 61499, 242827}},
+{20505, 18, 119194, {1, 1, 3, 3, 7, 63, 35, 161, 125, 637, 149, 1045, 3297, 16213, 1543, 8073, 80373, 61507}},
+{20506, 18, 119199, {1, 1, 7, 5, 31, 43, 113, 189, 181, 659, 1971, 3309, 4237, 4279, 31563, 29429, 17443, 154385}},
+{20507, 18, 119215, {1, 1, 1, 13, 19, 43, 99, 91, 47, 477, 153, 3295, 6281, 779, 17169, 343, 1723, 171133}},
+{20508, 18, 119218, {1, 1, 1, 15, 9, 35, 123, 45, 417, 631, 1415, 1835, 3063, 897, 18947, 62477, 12759, 97831}},
+{20509, 18, 119241, {1, 1, 3, 13, 31, 1, 31, 139, 411, 605, 1829, 303, 3891, 15807, 7335, 44833, 87427, 62183}},
+{20510, 18, 119277, {1, 1, 3, 13, 29, 55, 97, 107, 241, 981, 1281, 3295, 6825, 15865, 4221, 24695, 54203, 252069}},
+{20511, 18, 119301, {1, 3, 7, 13, 1, 3, 33, 165, 483, 813, 127, 1717, 8077, 3521, 23465, 41705, 2769, 173233}},
+{20512, 18, 119306, {1, 3, 1, 11, 11, 51, 39, 125, 375, 825, 1775, 2923, 4903, 4779, 907, 47787, 22293, 169631}},
+{20513, 18, 119335, {1, 3, 5, 5, 13, 27, 43, 229, 267, 153, 567, 3403, 2103, 6203, 29629, 29715, 116735, 122515}},
+{20514, 18, 119344, {1, 3, 5, 13, 3, 3, 15, 5, 345, 343, 691, 3703, 361, 2019, 9309, 26909, 22897, 103555}},
+{20515, 18, 119364, {1, 3, 1, 11, 9, 25, 123, 235, 131, 469, 1749, 3681, 3841, 10157, 15183, 61413, 42207, 170359}},
+{20516, 18, 119373, {1, 1, 7, 3, 13, 9, 7, 191, 239, 417, 817, 1381, 1179, 2719, 21025, 17429, 50295, 196485}},
+{20517, 18, 119382, {1, 1, 7, 9, 9, 31, 123, 229, 381, 569, 513, 1617, 6141, 9717, 31769, 30159, 113697, 254237}},
+{20518, 18, 119410, {1, 1, 1, 15, 31, 43, 37, 17, 283, 905, 297, 1317, 1883, 11313, 5653, 55655, 121029, 149831}},
+{20519, 18, 119425, {1, 1, 1, 7, 7, 47, 83, 101, 497, 465, 1133, 3877, 5371, 3355, 17161, 50185, 120837, 255103}},
+{20520, 18, 119459, {1, 1, 3, 5, 5, 19, 3, 251, 433, 303, 1193, 1263, 2139, 473, 10725, 57725, 111411, 133687}},
+{20521, 18, 119473, {1, 1, 1, 7, 3, 1, 99, 115, 481, 395, 115, 1699, 953, 2807, 7227, 52781, 2855, 161159}},
+{20522, 18, 119486, {1, 1, 5, 9, 25, 25, 85, 3, 451, 847, 837, 3669, 4717, 3661, 29111, 43735, 49445, 100379}},
+{20523, 18, 119500, {1, 1, 7, 9, 19, 61, 67, 123, 195, 483, 1741, 2719, 7809, 5035, 30689, 21325, 56191, 46127}},
+{20524, 18, 119508, {1, 1, 3, 11, 15, 39, 101, 27, 103, 807, 1557, 1647, 1285, 16169, 20203, 57153, 60749, 71361}},
+{20525, 18, 119511, {1, 3, 3, 3, 19, 1, 93, 31, 105, 925, 689, 3061, 7451, 12667, 27179, 36295, 61011, 90321}},
+{20526, 18, 119517, {1, 3, 7, 15, 19, 35, 47, 241, 261, 935, 1033, 751, 6519, 6911, 13519, 2539, 40285, 81535}},
+{20527, 18, 119528, {1, 1, 7, 13, 17, 31, 71, 135, 167, 5, 673, 2909, 4377, 3453, 31289, 38081, 21993, 192933}},
+{20528, 18, 119533, {1, 1, 5, 15, 23, 49, 85, 127, 13, 849, 1661, 2099, 3479, 3613, 21723, 58147, 56321, 203171}},
+{20529, 18, 119539, {1, 1, 7, 15, 23, 63, 3, 207, 445, 573, 1419, 1161, 2237, 1251, 23387, 65259, 81447, 74555}},
+{20530, 18, 119542, {1, 3, 5, 3, 25, 61, 37, 25, 287, 969, 37, 1615, 7923, 4457, 27611, 8519, 113957, 237427}},
+{20531, 18, 119546, {1, 3, 5, 11, 11, 25, 117, 169, 149, 701, 139, 2835, 6029, 9067, 841, 51707, 9287, 115825}},
+{20532, 18, 119566, {1, 1, 1, 13, 31, 5, 9, 5, 313, 1023, 551, 3635, 6765, 13379, 29135, 39737, 80913, 256355}},
+{20533, 18, 119587, {1, 3, 1, 13, 9, 23, 105, 117, 181, 211, 755, 555, 2763, 13965, 14743, 63725, 16377, 203435}},
+{20534, 18, 119590, {1, 3, 1, 15, 11, 45, 111, 147, 471, 321, 381, 2921, 6423, 629, 25117, 51213, 126941, 181931}},
+{20535, 18, 119607, {1, 1, 1, 11, 1, 49, 127, 105, 315, 1, 859, 1223, 5967, 2521, 14491, 58399, 45155, 192567}},
+{20536, 18, 119614, {1, 1, 3, 9, 19, 21, 73, 93, 95, 307, 293, 3243, 4765, 2253, 16775, 29861, 3785, 90357}},
+{20537, 18, 119625, {1, 1, 3, 7, 3, 53, 33, 167, 165, 509, 1133, 169, 6951, 7715, 26317, 5249, 86235, 39649}},
+{20538, 18, 119633, {1, 1, 5, 5, 3, 47, 105, 89, 201, 1003, 877, 635, 2225, 6391, 21247, 5707, 1233, 87055}},
+{20539, 18, 119634, {1, 1, 1, 1, 9, 39, 61, 201, 435, 843, 1245, 533, 1757, 1117, 19687, 54817, 32495, 228865}},
+{20540, 18, 119643, {1, 3, 1, 1, 3, 61, 63, 117, 143, 217, 435, 1977, 2647, 7631, 12969, 50211, 26483, 256329}},
+{20541, 18, 119683, {1, 3, 3, 9, 21, 25, 113, 243, 457, 143, 833, 1505, 3071, 1845, 17867, 58205, 103819, 185215}},
+{20542, 18, 119704, {1, 1, 5, 7, 23, 51, 11, 117, 195, 535, 685, 31, 3037, 9719, 22811, 42959, 21021, 126297}},
+{20543, 18, 119710, {1, 3, 3, 1, 1, 17, 107, 245, 257, 547, 887, 45, 5243, 2439, 22191, 19503, 2143, 75187}},
+{20544, 18, 119734, {1, 3, 7, 9, 11, 27, 123, 197, 353, 151, 1115, 403, 1105, 7425, 7463, 42065, 116187, 154537}},
+{20545, 18, 119752, {1, 3, 5, 15, 23, 5, 49, 177, 223, 615, 1255, 2081, 321, 8733, 19549, 53027, 275, 62739}},
+{20546, 18, 119760, {1, 3, 7, 1, 17, 61, 3, 233, 249, 763, 369, 555, 1621, 7221, 22575, 13295, 99793, 233635}},
+{20547, 18, 119826, {1, 1, 3, 1, 27, 41, 125, 113, 47, 583, 543, 453, 1213, 14187, 1645, 35761, 110051, 197081}},
+{20548, 18, 119922, {1, 1, 7, 9, 29, 43, 105, 125, 489, 135, 153, 2279, 4079, 6731, 12055, 60181, 82563, 173991}},
+{20549, 18, 119931, {1, 3, 7, 3, 29, 1, 67, 151, 127, 625, 113, 2127, 6723, 12359, 28609, 60605, 20375, 120129}},
+{20550, 18, 119977, {1, 1, 5, 7, 9, 13, 27, 171, 129, 199, 303, 4045, 2047, 8887, 22233, 57571, 40545, 36479}},
+{20551, 18, 120015, {1, 3, 1, 7, 1, 5, 127, 203, 213, 691, 1155, 27, 5409, 13519, 6747, 42371, 37089, 145855}},
+{20552, 18, 120020, {1, 3, 3, 9, 3, 33, 119, 25, 337, 715, 1093, 987, 7157, 14975, 28595, 19021, 1243, 148707}},
+{20553, 18, 120083, {1, 3, 1, 13, 3, 41, 81, 151, 23, 787, 181, 2357, 5077, 1997, 6451, 25505, 44875, 198341}},
+{20554, 18, 120086, {1, 1, 7, 3, 5, 15, 9, 169, 337, 487, 1325, 1505, 465, 2339, 20747, 8269, 96875, 108985}},
+{20555, 18, 120101, {1, 3, 1, 7, 23, 7, 113, 181, 25, 989, 1649, 1, 823, 6793, 18729, 3599, 97951, 239609}},
+{20556, 18, 120105, {1, 3, 7, 7, 3, 63, 63, 207, 419, 355, 1133, 2979, 2071, 11699, 32565, 61347, 106475, 16893}},
+{20557, 18, 120155, {1, 1, 7, 5, 7, 3, 119, 133, 189, 341, 1571, 1559, 4309, 16203, 22459, 21019, 80375, 3453}},
+{20558, 18, 120188, {1, 1, 3, 11, 21, 21, 45, 69, 485, 21, 727, 703, 5209, 14745, 3437, 54603, 104357, 151207}},
+{20559, 18, 120195, {1, 3, 7, 5, 25, 17, 13, 147, 329, 93, 121, 315, 2779, 6921, 425, 50441, 1133, 252291}},
+{20560, 18, 120216, {1, 1, 3, 5, 5, 51, 15, 135, 323, 841, 409, 1067, 3243, 4207, 6833, 59329, 90545, 116661}},
+{20561, 18, 120228, {1, 1, 3, 15, 25, 7, 43, 147, 153, 947, 79, 1897, 4519, 14441, 27181, 38517, 71673, 158597}},
+{20562, 18, 120238, {1, 3, 3, 3, 3, 47, 109, 111, 273, 271, 741, 3999, 649, 7367, 14933, 11785, 92709, 133815}},
+{20563, 18, 120255, {1, 1, 3, 13, 5, 41, 55, 15, 409, 355, 1255, 3043, 7503, 3523, 4261, 48927, 119901, 149411}},
+{20564, 18, 120317, {1, 1, 5, 1, 11, 57, 3, 149, 409, 287, 909, 3541, 4243, 4485, 3611, 63213, 102575, 49863}},
+{20565, 18, 120327, {1, 1, 3, 7, 15, 55, 119, 185, 511, 301, 237, 3701, 3195, 1323, 27511, 44635, 45363, 117683}},
+{20566, 18, 120369, {1, 3, 3, 11, 3, 61, 125, 15, 235, 819, 467, 1097, 1055, 16343, 8329, 37807, 38663, 145625}},
+{20567, 18, 120382, {1, 1, 7, 1, 25, 49, 117, 163, 413, 509, 63, 1313, 5113, 6505, 25475, 12059, 88021, 168037}},
+{20568, 18, 120404, {1, 3, 3, 9, 9, 37, 15, 185, 359, 231, 1483, 2999, 773, 10375, 27103, 39899, 100187, 54485}},
+{20569, 18, 120414, {1, 3, 3, 1, 13, 63, 111, 79, 133, 425, 1491, 3735, 533, 13417, 5161, 11455, 16907, 132267}},
+{20570, 18, 120432, {1, 3, 1, 15, 15, 47, 57, 157, 453, 681, 1811, 1685, 4329, 131, 22763, 1017, 66637, 1673}},
+{20571, 18, 120435, {1, 3, 7, 3, 31, 5, 105, 101, 431, 983, 1333, 845, 7369, 15041, 6527, 8617, 61911, 137513}},
+{20572, 18, 120454, {1, 3, 7, 15, 3, 45, 57, 23, 393, 495, 769, 215, 3611, 12907, 20637, 52997, 88345, 37961}},
+{20573, 18, 120463, {1, 3, 5, 7, 31, 3, 85, 249, 353, 559, 1803, 959, 4625, 9413, 22339, 6071, 124765, 43973}},
+{20574, 18, 120471, {1, 3, 1, 9, 31, 15, 109, 197, 179, 293, 457, 709, 627, 7743, 1997, 59625, 36919, 252849}},
+{20575, 18, 120505, {1, 1, 7, 11, 17, 21, 89, 11, 431, 617, 1029, 2649, 1725, 2723, 18367, 46103, 108063, 221855}},
+{20576, 18, 120528, {1, 3, 7, 1, 29, 7, 81, 187, 353, 807, 965, 3655, 3255, 9139, 28619, 32127, 107901, 139099}},
+{20577, 18, 120588, {1, 1, 5, 3, 17, 9, 39, 59, 431, 829, 525, 1885, 2387, 13381, 5271, 29739, 80413, 240595}},
+{20578, 18, 120616, {1, 3, 1, 5, 1, 5, 25, 9, 193, 971, 681, 2921, 3271, 3891, 20123, 37477, 33141, 82481}},
+{20579, 18, 120630, {1, 1, 3, 5, 1, 63, 77, 93, 63, 399, 1945, 387, 5457, 7339, 13279, 34119, 129903, 12621}},
+{20580, 18, 120644, {1, 3, 3, 11, 17, 11, 117, 189, 473, 23, 13, 1261, 2153, 12181, 21075, 33179, 43355, 168293}},
+{20581, 18, 120672, {1, 3, 5, 11, 21, 13, 73, 227, 211, 939, 885, 2091, 1123, 14809, 15705, 56675, 58087, 1451}},
+{20582, 18, 120677, {1, 3, 7, 1, 15, 15, 101, 235, 287, 675, 1741, 3885, 6211, 14817, 10235, 29289, 60401, 27639}},
+{20583, 18, 120718, {1, 3, 5, 13, 13, 7, 117, 31, 143, 505, 1823, 2841, 2133, 7305, 14093, 14229, 85179, 136793}},
+{20584, 18, 120725, {1, 1, 3, 15, 27, 15, 67, 237, 315, 793, 207, 3781, 5201, 13191, 9601, 44041, 116097, 178543}},
+{20585, 18, 120730, {1, 3, 1, 9, 9, 47, 53, 225, 109, 831, 1757, 349, 6353, 15417, 16395, 36295, 10901, 122349}},
+{20586, 18, 120756, {1, 1, 1, 1, 1, 17, 109, 13, 123, 537, 1859, 3717, 4441, 4271, 29017, 13601, 18533, 216695}},
+{20587, 18, 120759, {1, 3, 3, 13, 31, 23, 45, 233, 29, 295, 761, 757, 777, 3499, 26715, 24153, 113777, 256337}},
+{20588, 18, 120765, {1, 3, 5, 7, 23, 57, 37, 179, 511, 897, 2031, 1285, 3957, 15085, 19993, 28819, 39959, 187445}},
+{20589, 18, 120795, {1, 3, 1, 15, 25, 41, 121, 227, 433, 859, 357, 3107, 3241, 879, 10763, 59473, 73145, 258493}},
+{20590, 18, 120821, {1, 3, 3, 5, 13, 9, 85, 117, 347, 161, 995, 549, 5443, 9057, 28931, 57549, 27523, 54717}},
+{20591, 18, 120850, {1, 1, 5, 13, 13, 33, 97, 37, 55, 367, 403, 2361, 5717, 4433, 26921, 14227, 69445, 100337}},
+{20592, 18, 120868, {1, 3, 5, 7, 1, 41, 89, 165, 163, 1, 685, 3577, 1079, 1057, 125, 35853, 8387, 113035}},
+{20593, 18, 120880, {1, 3, 3, 13, 3, 59, 119, 51, 325, 205, 821, 1417, 2097, 13725, 31785, 53803, 15737, 2013}},
+{20594, 18, 120885, {1, 3, 7, 7, 1, 45, 95, 221, 249, 65, 1479, 2163, 5761, 15321, 8013, 25771, 110897, 214127}},
+{20595, 18, 120892, {1, 3, 3, 5, 25, 11, 27, 29, 95, 955, 1989, 3775, 609, 7073, 4571, 38857, 92205, 156209}},
+{20596, 18, 120897, {1, 3, 1, 13, 29, 57, 97, 47, 499, 641, 587, 2125, 2257, 13911, 13993, 1715, 46233, 181279}},
+{20597, 18, 120912, {1, 1, 7, 13, 7, 55, 69, 235, 379, 269, 1969, 2733, 3677, 1707, 26999, 64041, 98111, 138691}},
+{20598, 18, 120934, {1, 1, 3, 5, 27, 63, 65, 251, 413, 903, 1307, 2941, 5649, 11271, 1935, 49389, 37995, 218197}},
+{20599, 18, 120991, {1, 3, 3, 13, 7, 1, 45, 225, 13, 169, 581, 1657, 117, 10251, 23435, 40379, 127085, 88185}},
+{20600, 18, 121004, {1, 1, 7, 5, 21, 63, 69, 37, 459, 115, 1403, 1939, 6437, 13149, 3597, 50115, 129075, 260613}},
+{20601, 18, 121021, {1, 1, 3, 5, 29, 57, 15, 223, 131, 907, 1561, 1103, 4355, 2763, 6359, 55401, 1751, 53143}},
+{20602, 18, 121022, {1, 1, 7, 11, 15, 5, 17, 159, 505, 407, 1873, 2501, 2203, 12559, 5123, 53281, 29307, 16215}},
+{20603, 18, 121036, {1, 1, 1, 15, 9, 41, 77, 145, 325, 529, 1939, 3835, 3109, 12215, 18323, 2551, 89793, 94745}},
+{20604, 18, 121041, {1, 3, 1, 9, 21, 5, 7, 57, 99, 1005, 1211, 4063, 6851, 7653, 29283, 15463, 121289, 187055}},
+{20605, 18, 121069, {1, 1, 3, 3, 13, 11, 17, 125, 173, 283, 1419, 2533, 6875, 16031, 26633, 51027, 27343, 74257}},
+{20606, 18, 121078, {1, 1, 3, 11, 29, 49, 87, 19, 367, 941, 983, 1041, 8099, 8735, 30123, 62665, 87051, 98745}},
+{20607, 18, 121126, {1, 1, 1, 15, 25, 57, 97, 177, 467, 181, 923, 3833, 5405, 14335, 23495, 48323, 70331, 136825}},
+{20608, 18, 121135, {1, 1, 1, 13, 21, 17, 29, 237, 305, 117, 1077, 2999, 1879, 6875, 19321, 10999, 130513, 160883}},
+{20609, 18, 121138, {1, 3, 7, 15, 19, 47, 89, 153, 287, 7, 1429, 1507, 2853, 4197, 11195, 33891, 59063, 189601}},
+{20610, 18, 121162, {1, 1, 3, 15, 31, 5, 113, 71, 13, 925, 147, 451, 5701, 13671, 13943, 13799, 59627, 115715}},
+{20611, 18, 121176, {1, 1, 1, 5, 13, 25, 51, 11, 409, 393, 1479, 2583, 3101, 303, 17609, 10653, 69107, 150459}},
+{20612, 18, 121186, {1, 1, 5, 7, 21, 27, 107, 77, 61, 467, 1723, 1247, 287, 1039, 25347, 18111, 24837, 42903}},
+{20613, 18, 121209, {1, 3, 5, 5, 1, 29, 57, 177, 311, 9, 819, 3235, 3887, 9679, 11849, 31755, 68467, 135587}},
+{20614, 18, 121212, {1, 1, 5, 5, 29, 15, 13, 69, 163, 709, 1405, 3835, 777, 7567, 10153, 5043, 129465, 59113}},
+{20615, 18, 121221, {1, 1, 1, 13, 3, 47, 97, 101, 179, 53, 1919, 17, 3597, 11769, 17971, 39257, 76167, 255653}},
+{20616, 18, 121225, {1, 1, 7, 5, 1, 45, 121, 223, 299, 271, 1857, 1955, 5509, 1245, 9519, 60547, 78497, 191251}},
+{20617, 18, 121228, {1, 1, 1, 11, 5, 57, 87, 113, 59, 547, 1591, 1905, 475, 4687, 27591, 43807, 9617, 70769}},
+{20618, 18, 121239, {1, 1, 7, 1, 1, 35, 35, 11, 107, 401, 827, 2271, 2131, 12751, 25771, 51311, 46897, 198655}},
+{20619, 18, 121245, {1, 3, 3, 3, 15, 29, 91, 147, 9, 611, 1739, 3211, 3883, 14205, 24073, 37445, 54451, 208123}},
+{20620, 18, 121264, {1, 3, 7, 1, 25, 53, 33, 161, 365, 651, 1263, 1623, 1767, 3789, 18013, 52133, 60119, 100859}},
+{20621, 18, 121270, {1, 3, 5, 9, 15, 9, 97, 67, 379, 981, 1323, 1095, 3701, 3257, 13647, 12511, 53375, 156689}},
+{20622, 18, 121299, {1, 1, 3, 5, 9, 23, 97, 239, 171, 501, 1549, 1029, 8019, 5023, 9439, 14223, 54433, 152855}},
+{20623, 18, 121306, {1, 1, 7, 13, 17, 35, 111, 169, 81, 599, 1673, 3461, 7905, 7925, 16311, 20327, 57109, 158719}},
+{20624, 18, 121315, {1, 1, 3, 15, 7, 33, 23, 33, 273, 987, 1489, 363, 4017, 8919, 28839, 10143, 114179, 218155}},
+{20625, 18, 121317, {1, 3, 5, 13, 29, 5, 61, 133, 65, 933, 509, 551, 7365, 3703, 15003, 27849, 64211, 140383}},
+{20626, 18, 121321, {1, 1, 1, 13, 7, 25, 49, 1, 269, 601, 251, 33, 2443, 13725, 5805, 63347, 109489, 111491}},
+{20627, 18, 121324, {1, 1, 7, 9, 31, 23, 117, 71, 371, 733, 605, 4019, 4577, 3887, 31061, 24939, 57905, 148331}},
+{20628, 18, 121330, {1, 3, 5, 1, 3, 35, 35, 227, 355, 27, 1673, 2173, 5001, 14613, 6343, 40775, 72349, 101287}},
+{20629, 18, 121339, {1, 1, 7, 15, 29, 3, 43, 77, 43, 51, 1495, 2577, 2093, 7515, 20151, 44533, 32223, 6355}},
+{20630, 18, 121346, {1, 1, 5, 5, 11, 47, 91, 221, 35, 969, 343, 3287, 857, 4851, 12599, 939, 53615, 262125}},
+{20631, 18, 121370, {1, 1, 5, 7, 29, 11, 67, 155, 317, 629, 211, 583, 1061, 13243, 13999, 45405, 18187, 99021}},
+{20632, 18, 121372, {1, 3, 7, 13, 3, 39, 5, 207, 175, 515, 1181, 739, 379, 9919, 12079, 18903, 62475, 239383}},
+{20633, 18, 121393, {1, 1, 1, 15, 25, 15, 113, 215, 281, 861, 1055, 2577, 5545, 12365, 16097, 35775, 8331, 119353}},
+{20634, 18, 121396, {1, 1, 1, 1, 25, 55, 111, 185, 485, 361, 155, 4077, 5517, 16057, 19069, 40129, 38959, 211233}},
+{20635, 18, 121414, {1, 1, 3, 3, 13, 1, 93, 129, 243, 813, 115, 177, 53, 8251, 32351, 63847, 54537, 25527}},
+{20636, 18, 121442, {1, 3, 5, 11, 25, 47, 113, 69, 285, 451, 2011, 81, 6535, 3409, 8647, 56575, 975, 149571}},
+{20637, 18, 121475, {1, 1, 7, 7, 19, 1, 75, 123, 413, 697, 41, 3179, 4075, 15967, 2477, 17549, 54193, 258657}},
+{20638, 18, 121499, {1, 1, 5, 5, 11, 23, 19, 253, 303, 255, 901, 875, 1517, 6953, 25189, 26763, 28843, 167705}},
+{20639, 18, 121512, {1, 3, 7, 7, 17, 45, 31, 79, 279, 965, 1869, 1201, 1627, 14035, 11651, 45021, 76171, 49137}},
+{20640, 18, 121518, {1, 3, 1, 15, 9, 55, 83, 59, 437, 915, 1667, 89, 2797, 1841, 29261, 23497, 55785, 102265}},
+{20641, 18, 121588, {1, 1, 5, 5, 3, 59, 17, 131, 199, 541, 1647, 2175, 4449, 6081, 10609, 39467, 72945, 32423}},
+{20642, 18, 121597, {1, 3, 1, 7, 5, 7, 85, 11, 255, 397, 87, 1661, 6523, 5699, 29407, 28015, 50783, 246625}},
+{20643, 18, 121612, {1, 3, 3, 13, 5, 61, 123, 147, 295, 37, 301, 2549, 7615, 5725, 32477, 18121, 69353, 242579}},
+{20644, 18, 121629, {1, 3, 5, 7, 9, 45, 83, 211, 475, 281, 743, 3955, 7811, 6043, 30547, 5315, 53345, 25775}},
+{20645, 18, 121630, {1, 3, 3, 5, 7, 63, 125, 43, 131, 353, 345, 1689, 5483, 5467, 13445, 13041, 68381, 134567}},
+{20646, 18, 121634, {1, 3, 5, 11, 31, 9, 123, 53, 237, 911, 349, 3737, 1867, 7375, 3031, 4191, 8697, 182255}},
+{20647, 18, 121680, {1, 1, 3, 3, 11, 11, 89, 251, 69, 93, 1241, 1719, 2227, 1793, 21683, 58099, 110831, 24835}},
+{20648, 18, 121725, {1, 1, 5, 9, 3, 57, 3, 17, 11, 217, 923, 3623, 727, 1837, 21203, 63007, 33691, 216259}},
+{20649, 18, 121798, {1, 3, 3, 9, 21, 25, 83, 115, 325, 921, 811, 303, 3555, 10669, 5837, 45585, 61923, 159061}},
+{20650, 18, 121815, {1, 3, 3, 15, 17, 29, 77, 75, 509, 363, 199, 317, 7375, 11971, 15679, 17135, 101925, 103375}},
+{20651, 18, 121822, {1, 3, 5, 5, 29, 45, 85, 151, 73, 329, 911, 3055, 2381, 4717, 5133, 58987, 59885, 226689}},
+{20652, 18, 121837, {1, 3, 5, 1, 11, 59, 17, 83, 385, 867, 215, 2275, 7247, 10613, 6493, 63843, 74483, 134271}},
+{20653, 18, 121840, {1, 1, 7, 13, 29, 25, 77, 61, 281, 439, 353, 2213, 697, 14741, 1597, 7515, 7703, 149123}},
+{20654, 18, 121869, {1, 3, 7, 7, 7, 53, 77, 21, 483, 793, 969, 123, 3581, 12489, 22943, 54573, 25785, 178419}},
+{20655, 18, 121878, {1, 3, 5, 3, 17, 59, 75, 55, 125, 569, 1625, 77, 4593, 8493, 5259, 54537, 100479, 107509}},
+{20656, 18, 121897, {1, 1, 1, 15, 5, 7, 11, 169, 349, 133, 1113, 2877, 6109, 16275, 9755, 1385, 55005, 36095}},
+{20657, 18, 121920, {1, 1, 7, 7, 21, 25, 41, 161, 11, 321, 343, 705, 4601, 12867, 21997, 25283, 78467, 159089}},
+{20658, 18, 121929, {1, 3, 7, 1, 15, 3, 71, 227, 427, 883, 1021, 1405, 7791, 12669, 9159, 30931, 105993, 40917}},
+{20659, 18, 121944, {1, 1, 5, 5, 25, 41, 93, 57, 125, 915, 701, 2589, 7147, 15369, 28307, 54635, 13253, 97177}},
+{20660, 18, 121999, {1, 3, 1, 13, 11, 63, 103, 241, 317, 927, 965, 3179, 5213, 13849, 11509, 52665, 1637, 235647}},
+{20661, 18, 122008, {1, 3, 5, 3, 31, 31, 111, 9, 339, 1017, 1715, 101, 6849, 14329, 31607, 40741, 73067, 119001}},
+{20662, 18, 122056, {1, 3, 1, 13, 3, 55, 53, 15, 185, 717, 1447, 3029, 4899, 14217, 19949, 32817, 24829, 206829}},
+{20663, 18, 122062, {1, 3, 7, 9, 21, 11, 33, 213, 5, 769, 1807, 2179, 63, 5167, 23235, 25495, 113299, 129419}},
+{20664, 18, 122067, {1, 3, 7, 11, 11, 33, 23, 125, 21, 609, 595, 1329, 6175, 15837, 3889, 57797, 81453, 211413}},
+{20665, 18, 122083, {1, 1, 5, 11, 31, 7, 13, 73, 143, 559, 1541, 275, 3349, 2987, 21797, 32921, 125395, 247667}},
+{20666, 18, 122095, {1, 1, 3, 11, 19, 1, 23, 167, 337, 75, 1597, 3591, 2705, 7323, 5957, 7317, 58945, 44625}},
+{20667, 18, 122110, {1, 1, 5, 11, 27, 19, 63, 231, 353, 645, 531, 3861, 1681, 6901, 16217, 20639, 70077, 220233}},
+{20668, 18, 122118, {1, 1, 5, 15, 31, 41, 19, 253, 147, 365, 509, 1199, 6699, 14633, 1339, 48203, 58707, 83315}},
+{20669, 18, 122127, {1, 1, 5, 7, 19, 47, 47, 17, 267, 139, 549, 803, 4625, 6851, 32141, 12891, 43785, 211361}},
+{20670, 18, 122189, {1, 3, 1, 13, 19, 35, 13, 45, 167, 627, 1449, 3041, 5043, 9279, 15889, 41675, 25769, 13835}},
+{20671, 18, 122207, {1, 3, 7, 7, 19, 47, 13, 117, 403, 79, 1623, 3741, 3255, 2301, 25, 2311, 5237, 150879}},
+{20672, 18, 122226, {1, 1, 1, 15, 29, 43, 75, 21, 237, 809, 129, 2637, 181, 15921, 30709, 61281, 82405, 232885}},
+{20673, 18, 122253, {1, 1, 3, 15, 15, 15, 55, 217, 243, 579, 945, 3993, 1875, 2425, 25045, 36729, 42935, 213703}},
+{20674, 18, 122301, {1, 3, 3, 1, 5, 59, 115, 71, 483, 327, 701, 2893, 1815, 4611, 3843, 5893, 126479, 167807}},
+{20675, 18, 122324, {1, 3, 1, 7, 17, 59, 115, 191, 3, 615, 215, 2121, 5085, 15233, 16661, 6215, 31061, 192847}},
+{20676, 18, 122337, {1, 3, 1, 1, 21, 25, 41, 195, 151, 905, 1587, 439, 3317, 2275, 4743, 33505, 1185, 254873}},
+{20677, 18, 122362, {1, 1, 3, 9, 11, 49, 37, 117, 419, 1007, 789, 1323, 345, 2047, 20697, 57063, 69167, 219393}},
+{20678, 18, 122368, {1, 3, 1, 1, 25, 49, 81, 79, 117, 1015, 1777, 2427, 527, 10139, 16261, 42587, 33933, 19749}},
+{20679, 18, 122371, {1, 1, 5, 15, 31, 43, 19, 17, 97, 591, 891, 177, 7835, 3979, 15473, 2173, 65555, 182773}},
+{20680, 18, 122378, {1, 1, 3, 15, 13, 53, 31, 179, 247, 635, 683, 423, 2981, 14401, 26385, 10935, 68497, 181703}},
+{20681, 18, 122404, {1, 3, 3, 9, 25, 55, 43, 29, 487, 969, 989, 3561, 6425, 11619, 5773, 56515, 17461, 151239}},
+{20682, 18, 122443, {1, 1, 5, 13, 3, 31, 73, 51, 213, 215, 297, 783, 697, 14197, 7277, 60697, 985, 189995}},
+{20683, 18, 122451, {1, 3, 3, 5, 9, 47, 69, 27, 15, 407, 1029, 2541, 183, 4413, 5143, 33903, 49509, 49007}},
+{20684, 18, 122457, {1, 1, 1, 3, 5, 3, 9, 165, 215, 577, 1657, 363, 737, 5483, 5955, 34533, 45861, 104645}},
+{20685, 18, 122458, {1, 1, 5, 7, 31, 27, 37, 215, 125, 915, 1297, 3095, 1529, 12737, 25675, 29355, 83939, 106765}},
+{20686, 18, 122479, {1, 1, 3, 3, 1, 49, 29, 115, 395, 647, 147, 3905, 1025, 8873, 10587, 25471, 72089, 171467}},
+{20687, 18, 122484, {1, 3, 7, 1, 21, 55, 57, 233, 487, 883, 439, 929, 1405, 13709, 2389, 20205, 17579, 9129}},
+{20688, 18, 122521, {1, 3, 5, 5, 23, 51, 55, 45, 307, 855, 933, 1443, 4757, 8719, 28401, 35189, 105329, 9211}},
+{20689, 18, 122540, {1, 3, 7, 11, 29, 17, 17, 147, 221, 997, 1433, 59, 8027, 231, 30335, 2153, 21393, 116661}},
+{20690, 18, 122545, {1, 1, 7, 3, 5, 43, 47, 155, 357, 915, 1923, 3315, 4107, 9785, 4847, 57683, 87569, 179583}},
+{20691, 18, 122552, {1, 1, 7, 7, 27, 5, 37, 95, 265, 113, 143, 3755, 5793, 5601, 16621, 54777, 15989, 158933}},
+{20692, 18, 122560, {1, 3, 1, 1, 13, 31, 113, 255, 367, 559, 1777, 4065, 8061, 15785, 10345, 54833, 95277, 159347}},
+{20693, 18, 122575, {1, 1, 1, 15, 3, 43, 85, 251, 193, 19, 1685, 271, 1779, 11901, 18983, 65361, 128217, 248051}},
+{20694, 18, 122578, {1, 3, 5, 7, 29, 21, 5, 47, 263, 913, 83, 3233, 113, 8341, 14473, 37405, 2363, 155931}},
+{20695, 18, 122605, {1, 1, 7, 15, 7, 25, 41, 39, 315, 323, 827, 1277, 1211, 4465, 21161, 36865, 6689, 139147}},
+{20696, 18, 122661, {1, 1, 1, 9, 11, 45, 81, 235, 31, 247, 77, 1877, 7119, 16007, 2225, 65, 85537, 99251}},
+{20697, 18, 122673, {1, 1, 3, 11, 19, 5, 49, 179, 345, 961, 349, 2099, 2317, 12771, 27169, 59389, 116071, 68333}},
+{20698, 18, 122722, {1, 3, 3, 5, 15, 53, 47, 177, 103, 941, 87, 2813, 7729, 8003, 7717, 40095, 74569, 106617}},
+{20699, 18, 122728, {1, 1, 7, 7, 31, 23, 105, 205, 325, 855, 1529, 3601, 7151, 15827, 16241, 18221, 55771, 139225}},
+{20700, 18, 122739, {1, 3, 5, 13, 13, 5, 95, 167, 25, 779, 1147, 221, 5055, 10943, 28077, 15131, 89501, 137407}},
+{20701, 18, 122751, {1, 3, 7, 13, 31, 3, 105, 163, 41, 823, 1493, 2985, 5589, 3543, 24683, 34469, 40595, 200875}},
+{20702, 18, 122762, {1, 3, 5, 3, 27, 35, 105, 163, 477, 667, 45, 319, 3201, 11535, 19349, 55253, 60275, 209597}},
+{20703, 18, 122769, {1, 3, 1, 11, 5, 13, 25, 225, 169, 925, 1617, 537, 891, 5583, 7181, 39953, 97537, 104019}},
+{20704, 18, 122772, {1, 3, 5, 9, 13, 1, 69, 147, 465, 259, 1219, 2407, 4015, 4883, 4333, 40441, 31289, 52989}},
+{20705, 18, 122782, {1, 3, 5, 5, 17, 29, 105, 233, 307, 807, 1535, 251, 135, 925, 6865, 59739, 112757, 208275}},
+{20706, 18, 122798, {1, 1, 1, 7, 9, 21, 49, 247, 33, 127, 1277, 1745, 139, 12165, 23517, 50235, 101003, 109031}},
+{20707, 18, 122810, {1, 3, 5, 9, 19, 7, 9, 139, 511, 901, 551, 2717, 6091, 3213, 819, 51381, 108333, 119681}},
+{20708, 18, 122812, {1, 1, 1, 3, 19, 17, 73, 19, 313, 589, 1965, 1745, 921, 4237, 12527, 10735, 110139, 171513}},
+{20709, 18, 122818, {1, 1, 5, 15, 25, 29, 15, 217, 87, 793, 419, 915, 1359, 10507, 25343, 62977, 100913, 110041}},
+{20710, 18, 122829, {1, 3, 7, 15, 15, 15, 91, 243, 441, 437, 1759, 2659, 2319, 7783, 16857, 19051, 15463, 253115}},
+{20711, 18, 122851, {1, 1, 5, 13, 15, 5, 7, 165, 355, 559, 217, 235, 3565, 12047, 2387, 62285, 73363, 238551}},
+{20712, 18, 122857, {1, 3, 7, 11, 5, 5, 69, 205, 179, 815, 335, 979, 2129, 6221, 31987, 13623, 23103, 24373}},
+{20713, 18, 122868, {1, 1, 7, 11, 31, 51, 55, 93, 195, 219, 825, 2919, 4495, 5927, 11813, 16415, 121595, 188613}},
+{20714, 18, 122893, {1, 1, 3, 1, 3, 11, 73, 45, 141, 219, 337, 2569, 6549, 3699, 2417, 2945, 19389, 82561}},
+{20715, 18, 122894, {1, 3, 1, 13, 5, 47, 47, 81, 11, 57, 1965, 2173, 3209, 10617, 19887, 5571, 61403, 37401}},
+{20716, 18, 122902, {1, 3, 3, 7, 3, 5, 99, 253, 287, 655, 813, 3365, 2387, 8951, 1561, 37637, 97625, 148699}},
+{20717, 18, 122921, {1, 1, 3, 5, 9, 31, 49, 7, 55, 607, 1489, 3229, 5871, 1271, 22751, 32309, 16125, 93409}},
+{20718, 18, 122959, {1, 3, 1, 5, 19, 35, 29, 233, 407, 297, 1465, 3089, 7535, 7221, 24469, 42653, 65719, 196771}},
+{20719, 18, 122984, {1, 1, 7, 13, 17, 19, 37, 45, 211, 545, 963, 79, 13, 8319, 8045, 24975, 122749, 25845}},
+{20720, 18, 123001, {1, 3, 5, 3, 23, 23, 53, 101, 363, 49, 1351, 3419, 1603, 10795, 5289, 63695, 113911, 228301}},
+{20721, 18, 123038, {1, 3, 7, 9, 15, 59, 125, 59, 11, 397, 693, 397, 3829, 14349, 13973, 54739, 22093, 216009}},
+{20722, 18, 123076, {1, 1, 1, 13, 5, 63, 21, 23, 421, 35, 589, 803, 6193, 11375, 9501, 34441, 68421, 120109}},
+{20723, 18, 123100, {1, 3, 3, 7, 23, 25, 79, 203, 177, 173, 175, 809, 4331, 6953, 4999, 34345, 94481, 88683}},
+{20724, 18, 123107, {1, 3, 3, 3, 1, 51, 109, 195, 83, 747, 63, 325, 927, 1757, 32055, 37185, 22697, 41509}},
+{20725, 18, 123122, {1, 3, 5, 13, 1, 63, 45, 73, 121, 445, 1935, 3373, 563, 7503, 17941, 60313, 42219, 220917}},
+{20726, 18, 123139, {1, 3, 5, 13, 27, 31, 7, 83, 109, 387, 447, 1691, 1301, 7449, 8075, 30713, 87207, 84855}},
+{20727, 18, 123175, {1, 3, 1, 5, 25, 51, 83, 11, 261, 977, 1415, 2973, 1789, 12641, 16279, 4225, 44237, 173561}},
+{20728, 18, 123190, {1, 1, 5, 15, 17, 47, 105, 199, 83, 705, 1215, 2759, 7509, 10407, 4005, 4575, 65961, 209933}},
+{20729, 18, 123201, {1, 3, 1, 13, 27, 3, 5, 199, 405, 515, 291, 3399, 1497, 14755, 30229, 35075, 111585, 16633}},
+{20730, 18, 123219, {1, 1, 1, 13, 17, 53, 93, 161, 447, 903, 947, 1871, 3597, 10575, 18389, 48551, 65229, 32591}},
+{20731, 18, 123232, {1, 3, 5, 11, 9, 7, 53, 155, 299, 523, 1653, 3517, 2725, 9485, 27099, 47895, 30169, 260463}},
+{20732, 18, 123255, {1, 1, 3, 13, 11, 45, 31, 183, 445, 21, 313, 2597, 195, 16053, 7323, 52951, 25919, 9323}},
+{20733, 18, 123285, {1, 1, 1, 15, 1, 35, 15, 115, 53, 561, 1141, 3261, 83, 2547, 8925, 43455, 112755, 94157}},
+{20734, 18, 123328, {1, 1, 3, 5, 27, 25, 81, 51, 209, 87, 379, 3167, 4953, 13885, 20159, 103, 115363, 123585}},
+{20735, 18, 123385, {1, 3, 5, 1, 25, 29, 107, 225, 77, 435, 2009, 4069, 3703, 8855, 14101, 61683, 16993, 110823}},
+{20736, 18, 123397, {1, 3, 7, 3, 31, 25, 51, 117, 397, 271, 89, 3571, 2357, 4923, 16303, 2357, 107775, 73809}},
+{20737, 18, 123404, {1, 1, 3, 1, 29, 21, 33, 67, 363, 753, 915, 3715, 2013, 8439, 5779, 267, 32687, 104283}},
+{20738, 18, 123419, {1, 3, 1, 11, 11, 7, 31, 43, 339, 917, 2005, 759, 4285, 1933, 4341, 19111, 130651, 122853}},
+{20739, 18, 123435, {1, 1, 5, 1, 17, 63, 85, 63, 387, 127, 1313, 619, 6525, 9003, 10915, 64507, 13175, 45219}},
+{20740, 18, 123437, {1, 3, 7, 9, 25, 15, 43, 13, 411, 391, 571, 527, 8175, 10849, 20093, 2987, 29869, 77207}},
+{20741, 18, 123443, {1, 1, 5, 3, 29, 53, 105, 57, 91, 977, 1103, 2977, 5617, 7203, 26717, 28463, 55909, 59943}},
+{20742, 18, 123500, {1, 3, 1, 7, 1, 47, 111, 215, 189, 377, 11, 871, 2267, 5705, 8165, 38895, 71025, 10921}},
+{20743, 18, 123506, {1, 1, 7, 9, 29, 55, 1, 103, 505, 697, 317, 3209, 3643, 13689, 8499, 14671, 67937, 100467}},
+{20744, 18, 123511, {1, 3, 1, 5, 25, 15, 99, 199, 117, 957, 1421, 1719, 5185, 15247, 28615, 2657, 46867, 190135}},
+{20745, 18, 123512, {1, 1, 7, 9, 27, 55, 81, 47, 15, 497, 537, 857, 2905, 1909, 3341, 32625, 123189, 21875}},
+{20746, 18, 123518, {1, 3, 1, 3, 19, 51, 97, 143, 305, 1021, 543, 829, 7593, 8101, 6337, 4869, 19177, 38981}},
+{20747, 18, 123522, {1, 3, 3, 15, 9, 37, 51, 193, 295, 731, 809, 4065, 3377, 15303, 12505, 11327, 76191, 139899}},
+{20748, 18, 123545, {1, 1, 5, 1, 3, 19, 5, 223, 379, 7, 755, 1127, 505, 9429, 27409, 50817, 97599, 179019}},
+{20749, 18, 123572, {1, 3, 5, 3, 5, 11, 83, 119, 3, 311, 405, 2401, 1821, 1381, 4567, 44079, 61903, 183583}},
+{20750, 18, 123587, {1, 3, 7, 9, 7, 11, 107, 95, 271, 537, 335, 3079, 6695, 1163, 32055, 44985, 29075, 94235}},
+{20751, 18, 123594, {1, 3, 7, 7, 7, 57, 59, 85, 199, 563, 1835, 351, 7675, 2601, 3717, 57975, 92529, 101511}},
+{20752, 18, 123607, {1, 1, 1, 5, 17, 5, 97, 43, 101, 141, 1511, 199, 7157, 3169, 24815, 55653, 104195, 37951}},
+{20753, 18, 123608, {1, 1, 1, 11, 23, 29, 41, 47, 447, 583, 773, 859, 1657, 8707, 16709, 53477, 42037, 186809}},
+{20754, 18, 123630, {1, 1, 1, 13, 13, 5, 85, 9, 213, 511, 1003, 811, 2271, 14715, 21423, 48127, 50613, 214031}},
+{20755, 18, 123635, {1, 1, 3, 5, 7, 31, 87, 101, 297, 853, 1599, 1521, 4965, 9655, 23543, 62277, 11231, 49931}},
+{20756, 18, 123659, {1, 1, 7, 7, 19, 31, 9, 165, 207, 919, 739, 3849, 2121, 867, 3233, 40867, 75721, 5327}},
+{20757, 18, 123692, {1, 3, 7, 1, 17, 3, 27, 13, 431, 283, 465, 1427, 1937, 15601, 21793, 9315, 54285, 196453}},
+{20758, 18, 123695, {1, 1, 7, 3, 17, 39, 65, 137, 511, 19, 1357, 3373, 5227, 2485, 1151, 25061, 117507, 119219}},
+{20759, 18, 123700, {1, 3, 3, 9, 9, 23, 13, 235, 505, 625, 115, 3859, 6943, 14719, 6363, 14957, 28241, 187989}},
+{20760, 18, 123730, {1, 3, 7, 13, 11, 31, 23, 39, 463, 441, 1145, 417, 4177, 1655, 26491, 16895, 26263, 198157}},
+{20761, 18, 123748, {1, 3, 3, 7, 25, 55, 121, 157, 131, 537, 1891, 2367, 1717, 2331, 20251, 8679, 62657, 121957}},
+{20762, 18, 123751, {1, 1, 1, 11, 7, 43, 59, 101, 333, 961, 569, 1603, 3009, 6539, 9627, 5759, 44401, 127613}},
+{20763, 18, 123770, {1, 3, 3, 3, 1, 27, 15, 135, 235, 215, 627, 2427, 2647, 3201, 22873, 64445, 32635, 16587}},
+{20764, 18, 123793, {1, 3, 7, 7, 5, 49, 63, 103, 467, 897, 117, 1149, 6045, 5003, 5005, 6183, 90815, 190909}},
+{20765, 18, 123800, {1, 1, 3, 3, 31, 43, 45, 227, 363, 409, 1097, 3155, 1519, 14461, 29377, 19577, 52595, 94041}},
+{20766, 18, 123803, {1, 3, 1, 1, 3, 25, 83, 243, 57, 243, 389, 1427, 5197, 13125, 18571, 17845, 74961, 125569}},
+{20767, 18, 123851, {1, 3, 5, 5, 1, 39, 11, 175, 97, 1001, 143, 3653, 5887, 5845, 5691, 5433, 62629, 176261}},
+{20768, 18, 123859, {1, 1, 1, 13, 11, 41, 41, 155, 17, 823, 1507, 733, 5663, 13657, 24133, 9971, 27179, 108075}},
+{20769, 18, 123866, {1, 1, 7, 9, 19, 9, 103, 29, 427, 363, 931, 3959, 1629, 5127, 14807, 61937, 127175, 237233}},
+{20770, 18, 123868, {1, 1, 1, 5, 29, 53, 51, 229, 123, 1001, 697, 411, 4669, 5051, 18447, 55437, 129269, 72613}},
+{20771, 18, 123877, {1, 3, 7, 3, 19, 53, 111, 131, 255, 547, 653, 2839, 1447, 14397, 5707, 23773, 127897, 135177}},
+{20772, 18, 123884, {1, 3, 3, 5, 21, 37, 53, 219, 359, 341, 489, 2477, 3383, 6931, 7753, 2619, 114267, 63271}},
+{20773, 18, 123909, {1, 1, 3, 15, 15, 15, 95, 171, 301, 563, 603, 593, 4037, 7305, 10849, 11753, 103087, 74887}},
+{20774, 18, 123910, {1, 1, 5, 3, 11, 51, 105, 35, 155, 643, 569, 1697, 1679, 7547, 19289, 7065, 57359, 142855}},
+{20775, 18, 123919, {1, 1, 7, 15, 23, 55, 17, 67, 375, 559, 355, 165, 93, 973, 22831, 48027, 98435, 59945}},
+{20776, 18, 123927, {1, 3, 7, 3, 5, 43, 9, 253, 111, 819, 45, 3461, 4821, 14735, 14469, 29793, 30681, 26359}},
+{20777, 18, 123937, {1, 3, 3, 5, 15, 1, 39, 233, 63, 287, 131, 3453, 427, 4929, 30085, 18583, 50119, 262101}},
+{20778, 18, 123950, {1, 3, 7, 9, 31, 7, 127, 157, 287, 57, 1091, 1989, 5045, 13071, 27705, 58125, 85317, 66649}},
+{20779, 18, 123957, {1, 1, 1, 15, 17, 29, 25, 223, 311, 489, 1901, 3197, 1813, 10097, 31915, 54871, 32289, 227001}},
+{20780, 18, 123979, {1, 3, 7, 5, 31, 35, 69, 87, 131, 963, 1125, 1109, 8037, 3257, 27655, 50999, 3715, 57851}},
+{20781, 18, 123996, {1, 1, 5, 5, 27, 7, 119, 29, 425, 721, 541, 3069, 3349, 13623, 12293, 51395, 14033, 61545}},
+{20782, 18, 124040, {1, 3, 7, 3, 17, 49, 103, 115, 387, 729, 1389, 2257, 3273, 3375, 23143, 2835, 28071, 79533}},
+{20783, 18, 124054, {1, 1, 3, 7, 9, 19, 55, 159, 261, 467, 17, 2595, 3947, 7045, 193, 23629, 89067, 81197}},
+{20784, 18, 124063, {1, 1, 1, 15, 13, 39, 103, 195, 251, 769, 1003, 2707, 3263, 8451, 8007, 53789, 112653, 258717}},
+{20785, 18, 124067, {1, 3, 5, 1, 3, 21, 29, 217, 125, 779, 1597, 513, 2677, 3979, 31903, 64813, 69963, 92887}},
+{20786, 18, 124088, {1, 1, 3, 11, 11, 59, 81, 237, 447, 703, 41, 3369, 3547, 14935, 31693, 52005, 74149, 131039}},
+{20787, 18, 124101, {1, 1, 3, 1, 23, 1, 33, 93, 275, 847, 921, 2745, 533, 8975, 30529, 46809, 98975, 75541}},
+{20788, 18, 124154, {1, 1, 7, 7, 15, 1, 3, 213, 71, 1009, 1951, 3015, 713, 9365, 21949, 60983, 117633, 225387}},
+{20789, 18, 124162, {1, 1, 1, 11, 31, 27, 59, 179, 231, 635, 1555, 2765, 31, 15065, 22719, 59251, 84733, 96769}},
+{20790, 18, 124167, {1, 3, 7, 3, 19, 5, 35, 207, 317, 735, 943, 3987, 4021, 11229, 13015, 713, 125167, 55887}},
+{20791, 18, 124176, {1, 1, 3, 1, 27, 49, 81, 17, 253, 633, 43, 2953, 3151, 8429, 30625, 28551, 126683, 175087}},
+{20792, 18, 124195, {1, 3, 3, 3, 9, 53, 111, 245, 57, 557, 945, 2957, 7669, 12537, 17291, 9713, 87727, 44739}},
+{20793, 18, 124230, {1, 3, 1, 1, 5, 39, 77, 127, 87, 687, 1485, 1555, 2567, 13551, 17075, 24003, 47627, 129813}},
+{20794, 18, 124267, {1, 3, 5, 9, 25, 35, 87, 233, 439, 563, 1719, 419, 4459, 4285, 25157, 943, 111543, 232107}},
+{20795, 18, 124346, {1, 3, 5, 11, 1, 13, 97, 153, 459, 551, 73, 2087, 3985, 4661, 15603, 22211, 123163, 187233}},
+{20796, 18, 124389, {1, 1, 7, 13, 17, 59, 5, 219, 353, 441, 387, 441, 3009, 485, 20081, 38023, 50659, 159243}},
+{20797, 18, 124418, {1, 3, 1, 7, 21, 31, 117, 49, 227, 677, 417, 1153, 1611, 1669, 25161, 52223, 15109, 114759}},
+{20798, 18, 124420, {1, 1, 7, 9, 19, 13, 111, 7, 1, 701, 731, 2075, 685, 15679, 19149, 44315, 41719, 243975}},
+{20799, 18, 124454, {1, 3, 3, 7, 15, 63, 59, 105, 327, 39, 1497, 2407, 2865, 7065, 9957, 20031, 45359, 73657}},
+{20800, 18, 124490, {1, 3, 1, 13, 7, 3, 55, 221, 443, 953, 15, 2455, 4681, 16247, 18179, 44731, 41323, 172621}},
+{20801, 18, 124503, {1, 1, 3, 9, 1, 27, 65, 167, 115, 137, 819, 2129, 3393, 5901, 11735, 62753, 14941, 21425}},
+{20802, 18, 124519, {1, 3, 7, 11, 7, 9, 41, 175, 237, 481, 59, 265, 2135, 9419, 3937, 55959, 48343, 172549}},
+{20803, 18, 124533, {1, 1, 1, 13, 23, 33, 105, 87, 461, 297, 1345, 3715, 7715, 16369, 19017, 15141, 10873, 109641}},
+{20804, 18, 124544, {1, 3, 5, 1, 11, 1, 13, 41, 447, 511, 447, 2295, 2401, 14171, 16269, 50453, 40361, 205857}},
+{20805, 18, 124589, {1, 1, 3, 3, 27, 7, 35, 193, 113, 341, 335, 2113, 343, 4575, 20863, 40383, 86787, 142603}},
+{20806, 18, 124616, {1, 1, 7, 11, 17, 25, 51, 89, 341, 237, 1233, 1505, 7401, 6887, 26897, 20127, 51077, 107559}},
+{20807, 18, 124630, {1, 1, 1, 15, 9, 59, 29, 115, 339, 785, 201, 947, 1501, 6883, 169, 44059, 17527, 197623}},
+{20808, 18, 124636, {1, 3, 7, 3, 17, 59, 15, 5, 379, 347, 821, 4047, 3565, 13689, 23275, 27901, 121401, 43077}},
+{20809, 18, 124645, {1, 1, 1, 7, 15, 11, 35, 29, 59, 99, 181, 3035, 3239, 1553, 32319, 64195, 115247, 149211}},
+{20810, 18, 124652, {1, 1, 5, 3, 31, 49, 87, 177, 231, 167, 373, 1125, 5919, 4805, 31983, 42873, 30169, 91853}},
+{20811, 18, 124663, {1, 1, 5, 15, 7, 63, 37, 15, 459, 449, 1835, 1769, 2527, 2577, 4251, 62459, 76699, 81721}},
+{20812, 18, 124667, {1, 1, 1, 3, 21, 15, 19, 183, 423, 827, 341, 2101, 3797, 7103, 30845, 24511, 115337, 117019}},
+{20813, 18, 124690, {1, 3, 5, 5, 19, 1, 97, 13, 491, 51, 445, 1987, 7481, 2613, 23141, 36603, 26917, 177397}},
+{20814, 18, 124755, {1, 1, 1, 5, 15, 43, 21, 167, 259, 989, 1937, 1519, 2201, 13973, 18031, 31583, 57557, 252737}},
+{20815, 18, 124757, {1, 3, 3, 7, 31, 11, 89, 53, 279, 83, 1247, 1221, 5499, 1199, 361, 22269, 88633, 134975}},
+{20816, 18, 124819, {1, 1, 3, 5, 9, 5, 113, 41, 143, 655, 1147, 2043, 4229, 10523, 1453, 1735, 76259, 30607}},
+{20817, 18, 124862, {1, 1, 1, 11, 5, 7, 9, 155, 221, 619, 813, 3111, 6039, 10789, 10905, 33285, 62841, 229217}},
+{20818, 18, 124864, {1, 3, 5, 9, 19, 19, 123, 65, 419, 597, 87, 3843, 4857, 15903, 23655, 13023, 8389, 230803}},
+{20819, 18, 124874, {1, 3, 3, 15, 9, 19, 51, 223, 197, 759, 139, 59, 6547, 1043, 5077, 55267, 23681, 17099}},
+{20820, 18, 124882, {1, 1, 3, 3, 15, 43, 63, 85, 227, 961, 1043, 1069, 6557, 7499, 31639, 4345, 26991, 132783}},
+{20821, 18, 124903, {1, 3, 1, 1, 25, 33, 59, 219, 435, 105, 1001, 323, 2729, 12517, 16607, 57533, 101167, 53829}},
+{20822, 18, 124915, {1, 3, 7, 7, 9, 55, 3, 247, 303, 453, 861, 817, 705, 14337, 15965, 28867, 126763, 204005}},
+{20823, 18, 124938, {1, 1, 3, 7, 1, 39, 15, 39, 359, 313, 1753, 2835, 387, 16223, 10945, 19481, 19995, 29989}},
+{20824, 18, 124945, {1, 1, 1, 5, 3, 31, 103, 123, 493, 1023, 119, 2175, 2273, 11637, 21605, 23349, 100759, 41227}},
+{20825, 18, 124973, {1, 3, 7, 13, 5, 13, 17, 7, 341, 945, 621, 1421, 3893, 5825, 26777, 35497, 13791, 25415}},
+{20826, 18, 124986, {1, 1, 5, 1, 19, 27, 39, 7, 177, 749, 1217, 2133, 6913, 13489, 23713, 1085, 31529, 179741}},
+{20827, 18, 124991, {1, 3, 3, 3, 15, 21, 5, 145, 281, 131, 1347, 19, 4917, 8655, 2515, 36927, 56551, 202039}},
+{20828, 18, 125011, {1, 1, 3, 7, 27, 31, 33, 255, 511, 195, 1493, 2221, 2157, 9303, 3957, 14163, 70435, 215763}},
+{20829, 18, 125014, {1, 3, 3, 15, 31, 41, 33, 37, 239, 865, 375, 2217, 809, 11961, 29393, 52145, 76223, 202623}},
+{20830, 18, 125082, {1, 3, 5, 11, 5, 57, 73, 193, 341, 843, 1817, 231, 65, 5941, 29693, 31751, 57081, 180977}},
+{20831, 18, 125105, {1, 3, 1, 9, 29, 57, 85, 107, 343, 891, 465, 2413, 1965, 7303, 7461, 25857, 110517, 16995}},
+{20832, 18, 125163, {1, 1, 7, 15, 7, 49, 121, 211, 253, 511, 1385, 1205, 33, 7713, 20059, 47353, 3267, 215759}},
+{20833, 18, 125165, {1, 1, 3, 9, 15, 63, 45, 155, 415, 589, 651, 3707, 5429, 4497, 13733, 21231, 18953, 28671}},
+{20834, 18, 125205, {1, 1, 5, 15, 7, 57, 31, 109, 427, 921, 629, 3439, 7615, 4535, 1507, 58931, 49597, 214397}},
+{20835, 18, 125219, {1, 3, 3, 5, 21, 35, 9, 241, 67, 767, 659, 1639, 7797, 5209, 14851, 55311, 108549, 175937}},
+{20836, 18, 125239, {1, 1, 7, 15, 21, 61, 13, 47, 267, 269, 1169, 257, 2481, 8345, 1061, 28119, 127197, 95379}},
+{20837, 18, 125240, {1, 1, 3, 7, 21, 35, 121, 223, 145, 665, 1389, 2105, 5499, 1377, 32417, 39027, 5335, 248315}},
+{20838, 18, 125257, {1, 3, 3, 9, 13, 33, 57, 225, 123, 703, 1049, 709, 7347, 11317, 12339, 23247, 62157, 85931}},
+{20839, 18, 125284, {1, 3, 3, 3, 5, 3, 105, 115, 13, 675, 757, 987, 6429, 13017, 21347, 38829, 82153, 220677}},
+{20840, 18, 125302, {1, 3, 1, 13, 5, 51, 75, 205, 7, 561, 207, 1133, 3303, 1889, 17093, 5933, 48109, 244387}},
+{20841, 18, 125327, {1, 3, 3, 7, 11, 11, 71, 243, 235, 941, 1875, 2387, 1139, 16275, 4537, 18791, 67927, 156759}},
+{20842, 18, 125336, {1, 3, 5, 5, 11, 35, 29, 5, 351, 223, 847, 1539, 4903, 7619, 24907, 37071, 57899, 32981}},
+{20843, 18, 125355, {1, 3, 1, 7, 23, 7, 119, 17, 123, 845, 1423, 2995, 3595, 13287, 31217, 33939, 6891, 156477}},
+{20844, 18, 125363, {1, 1, 1, 9, 11, 55, 121, 85, 175, 757, 1093, 513, 1117, 14049, 22377, 4623, 38511, 51391}},
+{20845, 18, 125365, {1, 1, 7, 1, 17, 1, 7, 185, 173, 841, 61, 2735, 6679, 7617, 17309, 58047, 11791, 228635}},
+{20846, 18, 125372, {1, 1, 5, 5, 1, 1, 61, 57, 37, 857, 531, 2655, 1907, 4245, 3047, 50489, 93447, 116637}},
+{20847, 18, 125378, {1, 3, 5, 7, 27, 47, 121, 95, 73, 63, 539, 137, 1765, 4659, 31141, 24495, 109541, 16421}},
+{20848, 18, 125383, {1, 3, 7, 13, 13, 25, 47, 45, 97, 243, 1509, 3539, 4791, 5627, 31981, 57663, 65359, 32183}},
+{20849, 18, 125387, {1, 1, 1, 7, 15, 57, 117, 249, 183, 849, 557, 833, 5751, 8035, 3371, 11389, 125581, 248799}},
+{20850, 18, 125390, {1, 3, 1, 15, 13, 31, 59, 243, 17, 473, 289, 1527, 649, 2807, 6183, 6173, 74381, 261673}},
+{20851, 18, 125414, {1, 1, 7, 7, 19, 17, 95, 81, 191, 487, 2023, 307, 3261, 13885, 9285, 30831, 114009, 26483}},
+{20852, 18, 125435, {1, 1, 3, 11, 17, 21, 85, 193, 477, 267, 393, 39, 5793, 8621, 25379, 9721, 13947, 44235}},
+{20853, 18, 125466, {1, 1, 7, 5, 27, 33, 93, 9, 471, 751, 1279, 695, 2625, 7061, 29577, 5403, 80705, 77895}},
+{20854, 18, 125481, {1, 1, 3, 11, 7, 25, 125, 9, 233, 935, 1897, 3685, 595, 15499, 43, 29251, 18029, 250231}},
+{20855, 18, 125522, {1, 1, 5, 1, 9, 55, 125, 179, 287, 371, 233, 149, 5639, 5737, 25251, 103, 117015, 35579}},
+{20856, 18, 125531, {1, 1, 5, 9, 17, 33, 69, 15, 209, 521, 1083, 2469, 679, 9307, 31539, 63889, 48825, 126327}},
+{20857, 18, 125544, {1, 3, 5, 15, 15, 41, 105, 121, 21, 935, 721, 445, 6759, 4227, 15227, 54933, 69589, 2689}},
+{20858, 18, 125564, {1, 1, 7, 15, 1, 15, 111, 141, 279, 1013, 825, 1069, 3793, 12929, 153, 11463, 87759, 179987}},
+{20859, 18, 125588, {1, 1, 1, 9, 15, 59, 109, 103, 223, 695, 1979, 1241, 2559, 8627, 10559, 53319, 94311, 245193}},
+{20860, 18, 125602, {1, 1, 5, 3, 1, 41, 51, 129, 297, 15, 637, 2489, 343, 13549, 7707, 36757, 55703, 161043}},
+{20861, 18, 125613, {1, 3, 5, 1, 13, 35, 119, 219, 319, 733, 789, 1343, 8035, 15049, 981, 14477, 13717, 177481}},
+{20862, 18, 125621, {1, 1, 1, 11, 5, 17, 3, 43, 129, 705, 1701, 3635, 1201, 12283, 27443, 54257, 102281, 211859}},
+{20863, 18, 125648, {1, 3, 1, 13, 7, 63, 9, 45, 283, 41, 801, 131, 2797, 13329, 19011, 21055, 122965, 7961}},
+{20864, 18, 125651, {1, 3, 3, 5, 9, 27, 99, 129, 499, 523, 1939, 3661, 455, 12601, 11723, 3727, 32671, 78251}},
+{20865, 18, 125681, {1, 3, 7, 5, 9, 57, 63, 47, 49, 745, 945, 2927, 6659, 1023, 9991, 55379, 105295, 259901}},
+{20866, 18, 125719, {1, 1, 3, 3, 3, 47, 15, 237, 193, 409, 1165, 3581, 719, 3049, 14679, 31559, 7825, 96083}},
+{20867, 18, 125773, {1, 1, 7, 11, 9, 55, 29, 123, 163, 415, 2013, 97, 1471, 1409, 28867, 50405, 99417, 57113}},
+{20868, 18, 125774, {1, 1, 7, 15, 5, 17, 57, 123, 25, 119, 1699, 1289, 3139, 7177, 13465, 33583, 34517, 182669}},
+{20869, 18, 125779, {1, 1, 3, 1, 15, 45, 79, 7, 461, 223, 691, 3071, 6233, 14997, 4083, 65391, 60571, 82929}},
+{20870, 18, 125786, {1, 3, 5, 1, 25, 39, 89, 105, 497, 685, 1921, 133, 4849, 8467, 609, 62183, 123787, 223025}},
+{20871, 18, 125792, {1, 1, 1, 13, 3, 57, 117, 241, 501, 107, 1253, 3097, 603, 10645, 3395, 13997, 112527, 208263}},
+{20872, 18, 125822, {1, 1, 7, 9, 7, 31, 25, 97, 205, 785, 517, 549, 6841, 7097, 9635, 17151, 57135, 105469}},
+{20873, 18, 125828, {1, 3, 7, 1, 25, 35, 43, 75, 179, 1023, 1921, 1529, 2791, 6747, 9135, 61801, 46729, 26821}},
+{20874, 18, 125831, {1, 1, 3, 1, 31, 49, 107, 219, 285, 501, 1503, 3103, 5257, 14561, 31493, 7753, 34375, 260357}},
+{20875, 18, 125837, {1, 3, 7, 13, 15, 7, 75, 57, 329, 67, 1541, 2445, 3069, 6723, 10189, 22913, 110781, 243765}},
+{20876, 18, 125880, {1, 1, 5, 3, 5, 45, 47, 39, 493, 787, 1019, 3933, 535, 1763, 139, 45967, 123167, 115019}},
+{20877, 18, 125891, {1, 3, 1, 3, 23, 59, 93, 139, 349, 973, 1401, 2109, 701, 461, 19199, 21733, 80009, 37239}},
+{20878, 18, 125922, {1, 1, 3, 5, 3, 39, 117, 77, 257, 117, 1991, 3371, 509, 3963, 14579, 62459, 52281, 99209}},
+{20879, 18, 125928, {1, 3, 1, 15, 29, 47, 73, 157, 429, 497, 39, 123, 4851, 12871, 4567, 29453, 90777, 188683}},
+{20880, 18, 125931, {1, 3, 3, 1, 17, 25, 5, 247, 61, 81, 1555, 2167, 6003, 15911, 16023, 7841, 50731, 229163}},
+{20881, 18, 125941, {1, 1, 5, 9, 9, 39, 89, 37, 105, 133, 333, 2863, 7249, 2355, 9407, 28145, 25923, 68827}},
+{20882, 18, 125948, {1, 3, 7, 13, 15, 55, 11, 93, 197, 447, 1793, 1793, 4639, 1869, 1711, 1439, 15899, 106931}},
+{20883, 18, 125960, {1, 1, 5, 13, 23, 11, 67, 155, 511, 363, 1073, 2249, 719, 11167, 7953, 21699, 55735, 47353}},
+{20884, 18, 125973, {1, 1, 3, 3, 21, 59, 123, 227, 65, 695, 1769, 4057, 7071, 1827, 13639, 45711, 84019, 96897}},
+{20885, 18, 126014, {1, 3, 1, 11, 25, 51, 57, 139, 147, 589, 1565, 511, 3629, 7329, 9565, 62893, 85789, 112047}},
+{20886, 18, 126016, {1, 3, 5, 5, 23, 11, 93, 75, 25, 947, 1489, 4081, 3395, 4655, 27853, 41299, 89447, 100971}},
+{20887, 18, 126036, {1, 3, 5, 11, 25, 63, 93, 227, 411, 49, 403, 437, 1739, 8453, 31693, 51439, 89729, 113405}},
+{20888, 18, 126043, {1, 3, 7, 9, 29, 13, 51, 155, 403, 627, 173, 2111, 833, 11453, 17673, 7121, 52943, 114835}},
+{20889, 18, 126062, {1, 1, 5, 13, 11, 11, 105, 101, 309, 577, 1003, 3667, 3489, 11807, 6119, 13773, 89879, 12391}},
+{20890, 18, 126076, {1, 3, 7, 9, 17, 11, 111, 239, 225, 723, 933, 3353, 2003, 5273, 207, 38539, 82539, 209781}},
+{20891, 18, 126116, {1, 1, 7, 13, 15, 53, 69, 105, 155, 445, 353, 617, 5625, 13439, 29223, 60439, 119635, 49643}},
+{20892, 18, 126125, {1, 1, 3, 11, 13, 25, 107, 27, 109, 313, 1721, 2647, 1861, 10631, 17131, 31365, 65319, 102905}},
+{20893, 18, 126145, {1, 1, 1, 7, 21, 29, 39, 167, 341, 115, 1523, 2209, 95, 4399, 3881, 38875, 107691, 132471}},
+{20894, 18, 126152, {1, 1, 1, 13, 15, 61, 125, 23, 301, 407, 1497, 3731, 7013, 5405, 31233, 51701, 45619, 107407}},
+{20895, 18, 126175, {1, 3, 5, 5, 31, 27, 77, 21, 339, 1013, 371, 19, 5733, 2177, 15547, 27595, 6805, 172695}},
+{20896, 18, 126188, {1, 3, 5, 11, 5, 15, 71, 23, 441, 169, 1715, 437, 1791, 293, 13441, 11225, 119119, 223035}},
+{20897, 18, 126199, {1, 3, 1, 5, 11, 15, 95, 127, 433, 789, 899, 2591, 2339, 8237, 20765, 32897, 51511, 58437}},
+{20898, 18, 126205, {1, 3, 5, 9, 11, 57, 103, 5, 401, 51, 1813, 923, 1983, 1853, 21913, 3051, 56309, 19423}},
+{20899, 18, 126213, {1, 1, 3, 15, 3, 3, 41, 5, 231, 35, 391, 185, 7585, 1005, 20311, 11193, 18275, 114131}},
+{20900, 18, 126220, {1, 1, 3, 9, 13, 13, 115, 203, 223, 575, 459, 1839, 3949, 16027, 23137, 13723, 19195, 249337}},
+{20901, 18, 126286, {1, 1, 1, 9, 21, 51, 39, 245, 187, 609, 319, 2927, 3625, 10789, 31291, 45557, 45935, 132447}},
+{20902, 18, 126294, {1, 3, 3, 9, 25, 37, 47, 55, 219, 409, 1927, 553, 3953, 6209, 11807, 11133, 48047, 132437}},
+{20903, 18, 126300, {1, 3, 1, 13, 23, 31, 109, 167, 281, 179, 233, 1603, 7391, 9091, 27021, 31213, 13093, 86017}},
+{20904, 18, 126322, {1, 3, 1, 13, 13, 15, 7, 29, 409, 59, 505, 1307, 6247, 6055, 5531, 59727, 58069, 84049}},
+{20905, 18, 126324, {1, 1, 5, 7, 19, 7, 103, 245, 133, 609, 1087, 2365, 3341, 1689, 18841, 19625, 47413, 63445}},
+{20906, 18, 126343, {1, 1, 7, 3, 11, 27, 79, 75, 97, 355, 493, 2035, 3413, 11835, 9157, 51173, 1, 71797}},
+{20907, 18, 126344, {1, 1, 5, 5, 29, 1, 43, 135, 473, 329, 1197, 1693, 3823, 7723, 24771, 22349, 94383, 41461}},
+{20908, 18, 126430, {1, 3, 3, 15, 25, 9, 79, 213, 317, 615, 541, 441, 505, 13665, 3691, 17825, 49303, 91783}},
+{20909, 18, 126433, {1, 3, 1, 11, 27, 33, 65, 31, 469, 799, 1251, 3357, 5239, 5651, 13317, 28553, 64225, 9805}},
+{20910, 18, 126448, {1, 1, 7, 13, 9, 49, 77, 43, 363, 719, 1943, 1285, 1587, 1047, 29419, 24025, 89901, 229095}},
+{20911, 18, 126451, {1, 1, 1, 15, 19, 57, 33, 243, 111, 183, 497, 603, 923, 1957, 6493, 11833, 7331, 229975}},
+{20912, 18, 126457, {1, 3, 1, 1, 13, 43, 31, 25, 169, 303, 69, 723, 1745, 1025, 14301, 2523, 111887, 179519}},
+{20913, 18, 126458, {1, 3, 1, 5, 31, 55, 11, 103, 391, 881, 1885, 3923, 7507, 377, 29331, 32167, 56915, 44211}},
+{20914, 18, 126463, {1, 1, 7, 1, 27, 55, 33, 141, 393, 73, 701, 3173, 973, 15553, 10219, 51441, 55201, 131055}},
+{20915, 18, 126470, {1, 1, 3, 9, 1, 31, 115, 85, 173, 227, 163, 157, 5569, 8291, 27163, 7581, 8699, 104523}},
+{20916, 18, 126484, {1, 1, 1, 5, 5, 19, 11, 55, 217, 571, 1001, 945, 6237, 1993, 11809, 63893, 60081, 102997}},
+{20917, 18, 126518, {1, 3, 3, 15, 15, 7, 51, 161, 147, 263, 1701, 1079, 3027, 11779, 24885, 16127, 68985, 162975}},
+{20918, 18, 126521, {1, 3, 1, 9, 25, 1, 47, 107, 149, 997, 1779, 2905, 4951, 10345, 31059, 63831, 117219, 251935}},
+{20919, 18, 126547, {1, 3, 3, 9, 5, 23, 83, 95, 399, 343, 1597, 1733, 5959, 9685, 4721, 59109, 113633, 80365}},
+{20920, 18, 126556, {1, 1, 7, 11, 31, 43, 71, 133, 305, 529, 645, 3095, 6273, 4019, 14433, 41609, 64093, 79051}},
+{20921, 18, 126583, {1, 3, 5, 11, 1, 63, 123, 25, 245, 583, 1013, 3275, 2997, 13021, 27515, 16233, 113093, 249101}},
+{20922, 18, 126584, {1, 1, 1, 9, 3, 59, 113, 155, 125, 423, 259, 1559, 3745, 9105, 27673, 36601, 36117, 47953}},
+{20923, 18, 126633, {1, 3, 3, 7, 19, 41, 55, 87, 53, 801, 661, 329, 3391, 7581, 25487, 25751, 120171, 35953}},
+{20924, 18, 126673, {1, 1, 7, 15, 31, 57, 49, 179, 147, 139, 957, 289, 4321, 8747, 53, 46003, 40219, 96855}},
+{20925, 18, 126680, {1, 1, 7, 9, 29, 49, 71, 101, 389, 793, 1355, 3263, 6331, 4869, 28479, 8335, 74653, 8519}},
+{20926, 18, 126686, {1, 1, 1, 13, 1, 19, 31, 161, 261, 679, 1115, 985, 2855, 4395, 15087, 18593, 98535, 52537}},
+{20927, 18, 126689, {1, 1, 3, 11, 15, 51, 79, 7, 75, 75, 753, 2637, 7193, 7961, 21411, 24273, 7543, 6277}},
+{20928, 18, 126702, {1, 3, 1, 5, 5, 51, 67, 191, 201, 777, 587, 1439, 1027, 3759, 31141, 42159, 58475, 7355}},
+{20929, 18, 126710, {1, 3, 5, 3, 15, 37, 11, 251, 53, 799, 739, 2225, 6985, 9183, 12341, 29963, 44101, 23889}},
+{20930, 18, 126722, {1, 1, 3, 3, 5, 33, 81, 223, 89, 531, 301, 305, 2401, 4015, 18607, 65041, 82447, 228487}},
+{20931, 18, 126787, {1, 3, 1, 7, 15, 29, 71, 247, 445, 1005, 1229, 3897, 899, 11175, 6349, 29145, 103153, 90275}},
+{20932, 18, 126789, {1, 3, 3, 7, 15, 7, 75, 13, 417, 719, 121, 1345, 3737, 4119, 15259, 33579, 57727, 111517}},
+{20933, 18, 126794, {1, 3, 7, 3, 31, 11, 49, 61, 405, 741, 1607, 1561, 4655, 9775, 14349, 27431, 91791, 228607}},
+{20934, 18, 126801, {1, 3, 5, 13, 17, 27, 93, 153, 99, 683, 219, 3783, 6963, 1633, 6621, 8133, 5111, 57333}},
+{20935, 18, 126857, {1, 3, 3, 3, 25, 29, 75, 155, 159, 25, 637, 3053, 4737, 5831, 9651, 45331, 100407, 188607}},
+{20936, 18, 126891, {1, 3, 1, 9, 21, 55, 123, 27, 509, 227, 1569, 1379, 7137, 11749, 14257, 38349, 459, 54873}},
+{20937, 18, 126896, {1, 1, 7, 15, 29, 35, 81, 79, 237, 155, 1551, 343, 5127, 3233, 3691, 59917, 7367, 181979}},
+{20938, 18, 126902, {1, 3, 1, 15, 1, 57, 111, 121, 375, 635, 1529, 635, 2337, 6553, 22067, 36047, 80099, 116411}},
+{20939, 18, 126911, {1, 1, 3, 3, 29, 27, 19, 3, 69, 197, 1829, 1907, 5901, 12651, 3295, 7805, 57871, 47571}},
+{20940, 18, 126919, {1, 1, 1, 13, 21, 5, 115, 51, 203, 991, 1731, 1101, 1607, 14323, 12233, 48047, 33969, 147621}},
+{20941, 18, 126943, {1, 3, 3, 1, 25, 55, 41, 31, 101, 551, 1519, 1915, 6961, 13919, 15339, 13141, 107625, 9247}},
+{20942, 18, 126947, {1, 1, 7, 11, 17, 25, 87, 175, 341, 445, 1813, 2995, 3217, 6015, 1637, 65243, 72743, 248715}},
+{20943, 18, 126949, {1, 1, 5, 13, 11, 1, 61, 139, 233, 167, 1363, 1991, 7999, 16289, 25595, 8915, 32205, 169963}},
+{20944, 18, 126953, {1, 1, 1, 13, 31, 33, 67, 57, 121, 477, 755, 2035, 3683, 16205, 5511, 25615, 5169, 128843}},
+{20945, 18, 126971, {1, 3, 5, 15, 31, 1, 89, 29, 493, 379, 1627, 491, 2503, 8105, 30275, 27379, 43905, 46397}},
+{20946, 18, 126976, {1, 1, 7, 9, 31, 41, 127, 121, 61, 561, 223, 3231, 7321, 3683, 15455, 8019, 116739, 96557}},
+{20947, 18, 126982, {1, 1, 5, 9, 19, 41, 25, 65, 111, 535, 611, 1631, 4251, 107, 19787, 40749, 65701, 48749}},
+{20948, 18, 127009, {1, 3, 3, 11, 27, 49, 75, 93, 15, 937, 1517, 1577, 7485, 8713, 15979, 13799, 103057, 144799}},
+{20949, 18, 127021, {1, 1, 7, 7, 7, 29, 3, 63, 177, 781, 2001, 315, 6703, 8055, 19081, 33641, 44279, 87597}},
+{20950, 18, 127027, {1, 1, 7, 11, 29, 53, 83, 223, 275, 951, 1883, 2447, 1815, 9313, 9247, 17185, 8143, 135247}},
+{20951, 18, 127039, {1, 1, 5, 13, 21, 47, 87, 55, 169, 95, 777, 2787, 7227, 11373, 16707, 28237, 30789, 64589}},
+{20952, 18, 127041, {1, 1, 1, 11, 15, 41, 1, 55, 337, 493, 1379, 2505, 6831, 10955, 1875, 21821, 54101, 9379}},
+{20953, 18, 127044, {1, 3, 5, 15, 27, 9, 121, 49, 439, 781, 1457, 1341, 7433, 5879, 13039, 24001, 64059, 157077}},
+{20954, 18, 127059, {1, 1, 1, 9, 19, 55, 89, 37, 255, 345, 215, 4067, 8151, 14253, 12121, 3637, 29185, 60643}},
+{20955, 18, 127071, {1, 3, 1, 7, 31, 39, 71, 29, 71, 83, 1249, 871, 8037, 1001, 25245, 26651, 34509, 123607}},
+{20956, 18, 127075, {1, 1, 3, 11, 13, 21, 15, 171, 255, 373, 429, 2179, 4431, 16087, 17949, 16307, 129877, 186495}},
+{20957, 18, 127126, {1, 3, 3, 9, 17, 45, 75, 175, 3, 403, 215, 1781, 7875, 14113, 6967, 65263, 125885, 232983}},
+{20958, 18, 127129, {1, 1, 7, 9, 21, 57, 73, 105, 163, 583, 587, 2743, 2199, 5187, 5571, 56399, 797, 192405}},
+{20959, 18, 127145, {1, 1, 1, 3, 29, 27, 71, 145, 11, 455, 1505, 2789, 4083, 12345, 14785, 4981, 95121, 134977}},
+{20960, 18, 127154, {1, 1, 1, 1, 1, 27, 1, 145, 473, 483, 83, 3009, 7241, 13633, 15071, 30767, 128103, 94727}},
+{20961, 18, 127165, {1, 3, 5, 15, 17, 51, 71, 21, 237, 65, 901, 3365, 7831, 3027, 8751, 14435, 79445, 172587}},
+{20962, 18, 127171, {1, 1, 5, 1, 9, 49, 49, 31, 395, 339, 343, 1813, 2607, 9347, 11239, 6761, 127623, 43459}},
+{20963, 18, 127197, {1, 1, 1, 1, 13, 23, 71, 131, 225, 229, 117, 889, 8145, 5953, 10679, 38687, 80029, 63689}},
+{20964, 18, 127198, {1, 1, 5, 1, 29, 1, 87, 181, 441, 353, 257, 335, 203, 10897, 24085, 26967, 62573, 170285}},
+{20965, 18, 127207, {1, 1, 7, 3, 3, 39, 47, 135, 353, 977, 89, 259, 6411, 5511, 10697, 57623, 27367, 108451}},
+{20966, 18, 127226, {1, 3, 3, 11, 9, 57, 95, 211, 237, 281, 1703, 2107, 2179, 3411, 32621, 5387, 29971, 102889}},
+{20967, 18, 127240, {1, 1, 1, 13, 27, 49, 47, 49, 413, 985, 649, 1245, 807, 13637, 21741, 32565, 80135, 127971}},
+{20968, 18, 127254, {1, 3, 7, 13, 3, 19, 57, 97, 493, 597, 135, 1689, 5011, 4579, 6093, 28341, 37279, 142197}},
+{20969, 18, 127269, {1, 3, 1, 15, 15, 31, 3, 89, 327, 107, 827, 1111, 261, 6211, 4359, 38553, 43297, 75057}},
+{20970, 18, 127305, {1, 1, 1, 9, 19, 19, 53, 195, 141, 297, 141, 3859, 4173, 12243, 31399, 6353, 110505, 172219}},
+{20971, 18, 127323, {1, 3, 3, 9, 31, 51, 59, 53, 55, 723, 1575, 3399, 8057, 12317, 8393, 1719, 96987, 228955}},
+{20972, 18, 127342, {1, 1, 7, 11, 19, 59, 41, 9, 217, 267, 629, 2977, 4515, 463, 31773, 61765, 78827, 51331}},
+{20973, 18, 127347, {1, 3, 3, 13, 9, 55, 51, 177, 183, 431, 555, 3573, 7977, 3067, 21111, 12971, 78283, 260721}},
+{20974, 18, 127363, {1, 1, 1, 11, 27, 5, 89, 69, 435, 199, 221, 1017, 7703, 7469, 7755, 46319, 37941, 55285}},
+{20975, 18, 127394, {1, 1, 7, 13, 19, 55, 53, 207, 367, 177, 1483, 2857, 3753, 5493, 13349, 14033, 7933, 93457}},
+{20976, 18, 127426, {1, 1, 7, 3, 27, 35, 19, 223, 341, 137, 1195, 1263, 5937, 13517, 55, 6391, 106173, 176503}},
+{20977, 18, 127432, {1, 3, 7, 11, 23, 25, 37, 103, 351, 945, 1205, 2543, 3875, 155, 27777, 36647, 47979, 25113}},
+{20978, 18, 127440, {1, 1, 3, 15, 25, 59, 79, 39, 17, 553, 1119, 3353, 2619, 3851, 5945, 47501, 17369, 89355}},
+{20979, 18, 127462, {1, 1, 1, 13, 9, 55, 13, 173, 207, 925, 1855, 1871, 7851, 1361, 20117, 51677, 77703, 51309}},
+{20980, 18, 127468, {1, 3, 1, 1, 31, 57, 3, 25, 329, 927, 1683, 1447, 6853, 103, 9549, 21393, 415, 122749}},
+{20981, 18, 127473, {1, 1, 5, 5, 31, 61, 31, 213, 85, 531, 931, 999, 1189, 5189, 15127, 47799, 70769, 81901}},
+{20982, 18, 127486, {1, 1, 3, 1, 5, 59, 89, 53, 105, 761, 313, 3013, 4093, 9595, 4287, 51505, 20095, 232933}},
+{20983, 18, 127502, {1, 1, 7, 7, 23, 9, 41, 29, 399, 395, 759, 2541, 2373, 15365, 12083, 49579, 34401, 168121}},
+{20984, 18, 127510, {1, 1, 3, 1, 7, 23, 37, 183, 205, 377, 1081, 1081, 7767, 363, 14571, 16265, 18267, 102155}},
+{20985, 18, 127523, {1, 3, 3, 15, 19, 11, 59, 59, 465, 437, 965, 3707, 3505, 14785, 23605, 12505, 130607, 40693}},
+{20986, 18, 127543, {1, 1, 3, 13, 5, 15, 91, 33, 235, 215, 1997, 2035, 7407, 3203, 27143, 14007, 96411, 593}},
+{20987, 18, 127567, {1, 3, 7, 1, 19, 51, 1, 69, 489, 629, 1731, 393, 6807, 10521, 23971, 45649, 105183, 207351}},
+{20988, 18, 127570, {1, 3, 5, 3, 5, 41, 89, 141, 469, 177, 109, 2439, 7155, 2083, 31993, 13933, 100557, 137255}},
+{20989, 18, 127585, {1, 1, 7, 15, 21, 45, 41, 197, 365, 177, 61, 811, 2535, 5219, 3689, 53129, 42063, 60759}},
+{20990, 18, 127588, {1, 3, 5, 1, 23, 7, 19, 193, 253, 793, 539, 3747, 2611, 16211, 17199, 14875, 95377, 6999}},
+{20991, 18, 127619, {1, 1, 3, 5, 9, 5, 9, 129, 217, 473, 151, 3053, 6981, 8075, 32121, 31995, 41271, 208927}},
+{20992, 18, 127621, {1, 1, 5, 9, 9, 9, 89, 139, 381, 937, 1937, 1879, 8191, 2237, 25629, 51471, 87639, 173697}},
+{20993, 18, 127626, {1, 1, 5, 9, 17, 35, 81, 223, 161, 315, 139, 2597, 2599, 16191, 2567, 54947, 8603, 121589}},
+{20994, 18, 127628, {1, 1, 5, 5, 9, 7, 33, 49, 49, 723, 1013, 1055, 4025, 1471, 30081, 17475, 127931, 63723}},
+{20995, 18, 127640, {1, 3, 7, 7, 9, 49, 107, 17, 335, 119, 1959, 3613, 8129, 11033, 12197, 23803, 112595, 131655}},
+{20996, 18, 127662, {1, 3, 5, 11, 3, 45, 91, 17, 181, 1005, 985, 3045, 853, 8181, 5517, 48515, 16225, 237151}},
+{20997, 18, 127684, {1, 1, 3, 1, 3, 63, 35, 135, 61, 383, 1233, 675, 151, 2157, 18711, 37113, 40353, 61783}},
+{20998, 18, 127687, {1, 3, 5, 5, 29, 3, 105, 11, 351, 761, 165, 911, 6903, 10111, 1779, 24601, 3177, 110301}},
+{20999, 18, 127693, {1, 1, 3, 15, 25, 19, 73, 237, 263, 161, 731, 3853, 7705, 14497, 30799, 32979, 100729, 21761}},
+{21000, 18, 127696, {1, 1, 3, 5, 27, 9, 3, 149, 207, 715, 1435, 2563, 2451, 7951, 26313, 55115, 99423, 231639}},
+{21001, 18, 127708, {1, 1, 5, 15, 11, 51, 13, 47, 311, 969, 2013, 357, 4847, 1831, 2235, 22779, 32375, 40893}},
+{21002, 18, 127711, {1, 1, 3, 9, 21, 45, 11, 99, 275, 849, 443, 1257, 7855, 9121, 6549, 20289, 101337, 13869}},
+{21003, 18, 127722, {1, 1, 1, 15, 25, 27, 15, 111, 215, 437, 1923, 1985, 4603, 15469, 6667, 17941, 50433, 152759}},
+{21004, 18, 127732, {1, 3, 7, 15, 7, 37, 119, 53, 337, 853, 1785, 3507, 3743, 14303, 22757, 5149, 1539, 227051}},
+{21005, 18, 127747, {1, 1, 3, 13, 11, 23, 55, 19, 495, 531, 1021, 3831, 5993, 15819, 2121, 52773, 19775, 94643}},
+{21006, 18, 127767, {1, 1, 3, 3, 23, 55, 55, 69, 457, 755, 1187, 3993, 613, 12691, 1779, 21251, 2293, 236725}},
+{21007, 18, 127771, {1, 1, 5, 9, 23, 27, 61, 125, 113, 99, 503, 699, 6873, 13141, 10649, 65209, 21773, 162749}},
+{21008, 18, 127790, {1, 1, 1, 11, 15, 27, 111, 227, 493, 361, 1071, 607, 1409, 9281, 24515, 26739, 82421, 30463}},
+{21009, 18, 127816, {1, 3, 5, 1, 11, 57, 23, 239, 265, 675, 441, 4031, 5163, 15729, 2741, 26037, 32533, 140645}},
+{21010, 18, 127824, {1, 3, 3, 7, 3, 45, 105, 135, 493, 579, 1707, 2933, 1135, 11891, 3171, 45401, 24993, 175681}},
+{21011, 18, 127833, {1, 1, 1, 11, 11, 3, 67, 213, 483, 9, 1053, 213, 3205, 8487, 16093, 7305, 122591, 31811}},
+{21012, 18, 127869, {1, 1, 5, 13, 19, 31, 13, 65, 29, 929, 343, 463, 1885, 13467, 14997, 22737, 42869, 128239}},
+{21013, 18, 127910, {1, 3, 3, 13, 9, 47, 125, 33, 475, 285, 1901, 2525, 305, 11587, 27309, 30037, 70681, 180425}},
+{21014, 18, 127928, {1, 3, 5, 15, 9, 37, 45, 149, 19, 135, 555, 4037, 5173, 12473, 983, 40923, 28561, 185941}},
+{21015, 18, 127933, {1, 3, 3, 9, 23, 35, 35, 151, 113, 885, 1553, 2233, 351, 4071, 28127, 26109, 12299, 163973}},
+{21016, 18, 127963, {1, 3, 3, 11, 17, 55, 125, 87, 315, 917, 383, 2397, 1573, 9255, 10499, 16051, 99487, 139415}},
+{21017, 18, 127975, {1, 1, 3, 1, 29, 21, 101, 153, 5, 705, 1965, 1447, 8163, 13547, 25929, 28569, 57897, 173229}},
+{21018, 18, 128016, {1, 1, 7, 15, 3, 37, 113, 213, 495, 935, 529, 2299, 6901, 1765, 4255, 14579, 14175, 112333}},
+{21019, 18, 128031, {1, 3, 3, 9, 11, 53, 89, 27, 461, 235, 1525, 3533, 3061, 4351, 12847, 21649, 10843, 60901}},
+{21020, 18, 128059, {1, 1, 5, 1, 17, 11, 17, 157, 387, 887, 2017, 3641, 923, 12659, 19691, 18657, 3127, 218819}},
+{21021, 18, 128074, {1, 3, 1, 9, 5, 3, 49, 215, 379, 765, 1375, 345, 2285, 8197, 9531, 6725, 22475, 203883}},
+{21022, 18, 128107, {1, 1, 3, 9, 19, 41, 13, 233, 97, 755, 249, 2011, 5815, 6317, 4121, 63637, 43353, 154753}},
+{21023, 18, 128122, {1, 3, 7, 15, 31, 25, 93, 197, 455, 979, 1805, 2619, 803, 5705, 1679, 29317, 66477, 159187}},
+{21024, 18, 128157, {1, 1, 1, 13, 11, 25, 61, 233, 339, 171, 559, 427, 3239, 8889, 3711, 19743, 18099, 49201}},
+{21025, 18, 128161, {1, 3, 7, 13, 19, 5, 9, 183, 355, 137, 1767, 1113, 1149, 5791, 4099, 37911, 75945, 115397}},
+{21026, 18, 128200, {1, 1, 3, 13, 27, 25, 121, 3, 337, 195, 1841, 2009, 4181, 3197, 20275, 42493, 7495, 24407}},
+{21027, 18, 128213, {1, 1, 1, 15, 3, 43, 39, 25, 57, 829, 565, 1977, 4027, 11053, 13961, 13965, 4207, 1663}},
+{21028, 18, 128229, {1, 3, 5, 9, 11, 7, 107, 205, 479, 961, 1549, 1701, 6305, 15419, 23331, 46443, 55171, 235109}},
+{21029, 18, 128233, {1, 3, 5, 5, 19, 3, 39, 211, 429, 363, 765, 283, 2469, 1947, 10481, 1969, 95545, 187671}},
+{21030, 18, 128241, {1, 1, 1, 1, 11, 55, 47, 121, 251, 63, 767, 3673, 3233, 14865, 25713, 48443, 79139, 225021}},
+{21031, 18, 128259, {1, 1, 3, 11, 25, 35, 57, 103, 385, 155, 173, 4023, 489, 1733, 14423, 61843, 24793, 9871}},
+{21032, 18, 128295, {1, 3, 1, 15, 9, 29, 99, 187, 471, 877, 1321, 2489, 7439, 4259, 32703, 1459, 42093, 261097}},
+{21033, 18, 128299, {1, 1, 3, 11, 9, 25, 113, 251, 337, 405, 847, 2451, 5649, 3449, 11703, 18271, 108005, 208789}},
+{21034, 18, 128313, {1, 3, 3, 7, 13, 53, 61, 251, 461, 461, 1557, 1215, 6731, 13349, 21003, 11573, 66751, 79733}},
+{21035, 18, 128345, {1, 1, 5, 1, 23, 49, 101, 175, 251, 577, 1667, 2561, 6545, 16305, 18457, 65067, 35843, 123445}},
+{21036, 18, 128362, {1, 1, 5, 3, 7, 9, 61, 107, 395, 137, 559, 2315, 2559, 11929, 4843, 41661, 61361, 146163}},
+{21037, 18, 128375, {1, 3, 1, 5, 1, 3, 43, 251, 329, 289, 323, 2201, 4129, 4963, 27477, 18743, 46551, 93061}},
+{21038, 18, 128376, {1, 1, 7, 3, 17, 63, 21, 159, 447, 377, 69, 2517, 8181, 6043, 3039, 7747, 72465, 41027}},
+{21039, 18, 128406, {1, 1, 1, 1, 13, 3, 45, 93, 391, 509, 867, 1561, 5017, 11851, 24891, 22531, 18993, 129421}},
+{21040, 18, 128410, {1, 3, 3, 11, 15, 1, 127, 9, 161, 321, 2003, 239, 1379, 11903, 13503, 26529, 57725, 214797}},
+{21041, 18, 128416, {1, 1, 1, 13, 31, 11, 17, 25, 1, 645, 675, 735, 2083, 1919, 18977, 4995, 91559, 230463}},
+{21042, 18, 128443, {1, 3, 1, 13, 17, 21, 107, 167, 135, 797, 715, 3275, 5437, 4253, 11671, 14867, 36041, 71751}},
+{21043, 18, 128451, {1, 3, 5, 5, 11, 49, 93, 231, 431, 567, 1605, 3281, 7049, 2947, 863, 39593, 117167, 167301}},
+{21044, 18, 128465, {1, 1, 1, 1, 5, 13, 61, 91, 127, 189, 1879, 3921, 4303, 4831, 6765, 31005, 107627, 80693}},
+{21045, 18, 128466, {1, 3, 1, 3, 1, 49, 61, 9, 467, 891, 105, 317, 137, 12789, 12367, 57455, 39777, 88047}},
+{21046, 18, 128484, {1, 1, 3, 13, 23, 63, 37, 103, 23, 223, 647, 2523, 3211, 14551, 22663, 48237, 54777, 180297}},
+{21047, 18, 128499, {1, 3, 3, 7, 29, 51, 85, 179, 441, 431, 535, 2975, 8083, 8619, 30229, 31421, 54063, 163601}},
+{21048, 18, 128502, {1, 3, 1, 1, 27, 39, 125, 171, 57, 729, 511, 957, 7541, 2347, 1669, 32323, 108531, 69943}},
+{21049, 18, 128524, {1, 3, 3, 7, 1, 33, 89, 245, 95, 21, 699, 1441, 2659, 501, 32323, 39145, 82311, 155479}},
+{21050, 18, 128536, {1, 1, 3, 11, 29, 13, 87, 251, 329, 667, 325, 2411, 7959, 8069, 20817, 42445, 121675, 113421}},
+{21051, 18, 128541, {1, 1, 1, 7, 9, 57, 109, 237, 325, 535, 89, 1285, 5649, 13673, 29375, 51553, 81723, 11003}},
+{21052, 18, 128542, {1, 3, 1, 1, 13, 5, 31, 109, 157, 817, 1303, 725, 1841, 5503, 2255, 34637, 93603, 82825}},
+{21053, 18, 128592, {1, 3, 7, 7, 5, 33, 39, 233, 217, 157, 357, 2727, 3565, 1539, 5317, 23967, 30375, 260381}},
+{21054, 18, 128598, {1, 1, 5, 3, 23, 51, 45, 181, 353, 519, 949, 3043, 1517, 3387, 15081, 5997, 31523, 80007}},
+{21055, 18, 128623, {1, 1, 3, 5, 23, 21, 83, 51, 275, 629, 1433, 1821, 3761, 2367, 32089, 13813, 99629, 64603}},
+{21056, 18, 128632, {1, 1, 5, 15, 11, 49, 69, 197, 193, 459, 1915, 787, 3631, 5219, 11109, 12311, 56625, 117439}},
+{21057, 18, 128671, {1, 3, 3, 3, 31, 29, 57, 27, 43, 231, 777, 2139, 2609, 12273, 23777, 4151, 51749, 110013}},
+{21058, 18, 128713, {1, 1, 5, 13, 9, 63, 83, 69, 225, 913, 99, 1167, 5279, 14163, 3979, 55151, 84387, 234583}},
+{21059, 18, 128724, {1, 1, 7, 5, 9, 57, 87, 23, 335, 403, 1843, 725, 5187, 4137, 24299, 44807, 98523, 217815}},
+{21060, 18, 128731, {1, 3, 3, 3, 3, 23, 115, 229, 193, 655, 1205, 3159, 1935, 113, 20943, 32917, 69633, 2133}},
+{21061, 18, 128761, {1, 3, 3, 1, 17, 5, 59, 139, 75, 185, 1951, 3689, 4997, 2761, 8673, 41783, 75075, 101063}},
+{21062, 18, 128767, {1, 3, 1, 13, 1, 51, 63, 127, 67, 743, 1049, 2055, 4249, 131, 8153, 50237, 28135, 76059}},
+{21063, 18, 128782, {1, 3, 7, 13, 5, 39, 83, 63, 429, 573, 1915, 3801, 2223, 1585, 16997, 45571, 23311, 108099}},
+{21064, 18, 128793, {1, 3, 1, 3, 15, 49, 19, 65, 433, 401, 1901, 3653, 2399, 15171, 9695, 30257, 104877, 181221}},
+{21065, 18, 128805, {1, 3, 1, 1, 25, 37, 89, 7, 81, 343, 949, 3535, 1681, 10089, 23513, 3897, 127083, 214005}},
+{21066, 18, 128820, {1, 3, 7, 13, 1, 1, 123, 89, 433, 541, 1579, 931, 3459, 11095, 20729, 13117, 59323, 90309}},
+{21067, 18, 128830, {1, 1, 7, 1, 19, 9, 31, 211, 271, 25, 1053, 2249, 6549, 12785, 16947, 55633, 70155, 253741}},
+{21068, 18, 128842, {1, 3, 5, 9, 7, 49, 11, 251, 101, 795, 1015, 2037, 1239, 10151, 22179, 749, 2373, 224517}},
+{21069, 18, 128852, {1, 3, 7, 15, 21, 19, 15, 59, 439, 621, 1081, 3041, 1587, 3077, 2319, 51135, 110513, 222551}},
+{21070, 18, 128859, {1, 1, 5, 5, 9, 61, 49, 97, 361, 647, 351, 1977, 3023, 10213, 6889, 8753, 72203, 37521}},
+{21071, 18, 128866, {1, 3, 3, 1, 7, 29, 51, 117, 259, 81, 1263, 1829, 6541, 5699, 30367, 61325, 78795, 3491}},
+{21072, 18, 128875, {1, 1, 1, 5, 5, 23, 19, 255, 267, 251, 239, 3561, 6771, 10647, 4129, 40285, 11041, 27023}},
+{21073, 18, 128892, {1, 1, 7, 5, 29, 17, 121, 91, 427, 51, 243, 1617, 5389, 3633, 14105, 5329, 109507, 93719}},
+{21074, 18, 128896, {1, 3, 7, 5, 7, 59, 107, 89, 181, 719, 1029, 585, 2415, 9175, 11605, 9271, 12105, 42503}},
+{21075, 18, 128914, {1, 3, 5, 15, 27, 15, 83, 223, 489, 901, 1823, 1515, 6295, 12509, 27179, 181, 29813, 66163}},
+{21076, 18, 128935, {1, 1, 7, 15, 5, 9, 79, 29, 201, 391, 609, 935, 4025, 201, 8333, 24557, 33739, 257979}},
+{21077, 18, 128964, {1, 3, 3, 9, 9, 19, 55, 211, 347, 943, 559, 467, 1363, 10249, 7109, 41293, 28035, 205889}},
+{21078, 18, 128973, {1, 1, 5, 3, 21, 25, 25, 163, 95, 119, 789, 1679, 3845, 1427, 25531, 13375, 121029, 194845}},
+{21079, 18, 129001, {1, 1, 5, 3, 31, 21, 83, 27, 17, 59, 885, 3889, 4795, 4383, 28739, 55129, 10387, 176437}},
+{21080, 18, 129007, {1, 3, 1, 5, 31, 39, 37, 79, 433, 313, 1155, 3025, 6141, 10695, 27819, 28227, 32161, 250515}},
+{21081, 18, 129012, {1, 1, 5, 9, 27, 41, 3, 129, 235, 621, 1171, 3305, 6309, 5323, 15049, 16301, 13817, 238521}},
+{21082, 18, 129021, {1, 3, 7, 7, 27, 31, 63, 143, 183, 625, 1627, 3093, 6597, 14089, 30197, 60411, 66221, 221691}},
+{21083, 18, 129026, {1, 3, 7, 13, 21, 15, 59, 67, 441, 113, 1229, 1587, 5889, 6691, 10641, 11865, 89791, 82867}},
+{21084, 18, 129055, {1, 1, 7, 9, 13, 21, 53, 145, 235, 877, 2005, 1005, 7137, 6091, 19611, 25959, 124019, 216269}},
+{21085, 18, 129071, {1, 3, 7, 9, 17, 63, 5, 245, 397, 351, 1613, 4079, 7235, 4397, 18951, 11609, 71593, 148615}},
+{21086, 18, 129093, {1, 3, 3, 11, 5, 59, 65, 221, 237, 527, 861, 397, 249, 15273, 8415, 61185, 59419, 98115}},
+{21087, 18, 129105, {1, 1, 3, 5, 5, 59, 17, 247, 3, 765, 835, 1131, 3985, 9021, 18067, 28525, 86513, 250227}},
+{21088, 18, 129124, {1, 3, 7, 15, 25, 47, 119, 143, 143, 283, 1791, 59, 8171, 12577, 17079, 9809, 100299, 63977}},
+{21089, 18, 129148, {1, 3, 5, 13, 1, 47, 93, 159, 199, 863, 1279, 77, 4719, 3623, 30713, 39271, 126299, 130297}},
+{21090, 18, 129151, {1, 1, 5, 3, 23, 11, 119, 187, 57, 373, 747, 1507, 5165, 12929, 903, 49041, 70215, 117113}},
+{21091, 18, 129155, {1, 1, 5, 1, 3, 59, 23, 77, 151, 77, 627, 2865, 7055, 10469, 12095, 20481, 13429, 47573}},
+{21092, 18, 129161, {1, 3, 1, 13, 27, 13, 115, 233, 343, 407, 1321, 4011, 5589, 15369, 23495, 4435, 75421, 229325}},
+{21093, 18, 129200, {1, 3, 3, 3, 5, 51, 89, 53, 275, 279, 203, 2829, 4415, 4735, 25417, 17633, 99445, 183945}},
+{21094, 18, 129224, {1, 3, 3, 15, 7, 9, 91, 63, 143, 945, 453, 4001, 3943, 7285, 9359, 27507, 8571, 31827}},
+{21095, 18, 129230, {1, 3, 3, 11, 15, 49, 103, 25, 273, 791, 145, 2203, 4721, 7709, 25085, 33937, 98693, 97445}},
+{21096, 18, 129237, {1, 1, 5, 15, 9, 13, 87, 27, 331, 137, 1031, 585, 7841, 12213, 32259, 46953, 17813, 203379}},
+{21097, 18, 129298, {1, 3, 1, 5, 29, 53, 121, 179, 21, 311, 991, 2145, 6577, 12889, 8763, 46629, 128093, 105033}},
+{21098, 18, 129300, {1, 3, 1, 9, 7, 29, 57, 137, 333, 109, 615, 749, 2665, 13087, 13989, 41857, 102937, 125183}},
+{21099, 18, 129316, {1, 1, 5, 5, 3, 23, 107, 5, 319, 503, 1209, 47, 349, 11681, 28521, 44707, 112887, 232275}},
+{21100, 18, 129345, {1, 3, 3, 13, 13, 51, 13, 5, 293, 15, 555, 135, 2565, 13325, 30411, 14837, 65591, 249205}},
+{21101, 18, 129351, {1, 3, 5, 13, 17, 3, 73, 255, 447, 699, 503, 3655, 7735, 12163, 6167, 15027, 103831, 146395}},
+{21102, 18, 129352, {1, 3, 1, 13, 5, 9, 27, 45, 397, 463, 1739, 3193, 6731, 7533, 11217, 22359, 82603, 231613}},
+{21103, 18, 129363, {1, 1, 3, 15, 5, 43, 73, 191, 53, 187, 1905, 745, 1571, 9013, 8515, 59527, 104671, 227063}},
+{21104, 18, 129393, {1, 1, 3, 1, 5, 47, 57, 179, 433, 979, 147, 1701, 4019, 6855, 24487, 65495, 69919, 6659}},
+{21105, 18, 129410, {1, 3, 3, 1, 17, 17, 13, 75, 163, 781, 421, 1573, 2519, 9243, 20693, 60909, 65661, 208125}},
+{21106, 18, 129415, {1, 3, 5, 7, 27, 57, 39, 79, 157, 415, 729, 3651, 3581, 9443, 6409, 45993, 99051, 140977}},
+{21107, 18, 129449, {1, 3, 3, 13, 1, 7, 109, 77, 423, 185, 97, 3719, 2355, 10593, 2421, 37339, 24961, 24305}},
+{21108, 18, 129477, {1, 3, 5, 13, 17, 7, 125, 43, 453, 43, 643, 3757, 3721, 16083, 20871, 26451, 95201, 29153}},
+{21109, 18, 129501, {1, 1, 7, 3, 13, 49, 99, 253, 59, 21, 445, 3677, 6683, 2165, 32367, 55249, 5991, 155033}},
+{21110, 18, 129518, {1, 1, 3, 9, 21, 9, 15, 219, 175, 631, 665, 2455, 4701, 10639, 13907, 26937, 58867, 259861}},
+{21111, 18, 129520, {1, 3, 5, 5, 23, 5, 39, 233, 27, 811, 1435, 625, 4703, 3699, 20763, 50047, 123875, 10129}},
+{21112, 18, 129545, {1, 1, 7, 5, 23, 1, 49, 223, 309, 691, 953, 575, 5279, 10515, 11519, 35387, 48417, 134001}},
+{21113, 18, 129563, {1, 1, 7, 11, 3, 15, 125, 109, 39, 713, 1823, 1613, 4347, 6839, 29511, 26865, 102077, 31425}},
+{21114, 18, 129594, {1, 1, 1, 7, 31, 43, 13, 221, 115, 993, 1155, 1641, 1063, 2065, 18909, 45769, 65331, 188455}},
+{21115, 18, 129608, {1, 1, 7, 13, 21, 9, 59, 7, 79, 217, 2009, 667, 7685, 14761, 20149, 44133, 41037, 78369}},
+{21116, 18, 129616, {1, 3, 1, 9, 23, 57, 1, 193, 77, 681, 1135, 3657, 8149, 3559, 25011, 55027, 121903, 240157}},
+{21117, 18, 129652, {1, 3, 3, 5, 31, 41, 59, 5, 159, 627, 1569, 23, 2311, 2239, 20811, 54931, 130949, 193071}},
+{21118, 18, 129659, {1, 1, 1, 1, 27, 45, 43, 1, 381, 801, 451, 1361, 1611, 5379, 27819, 8949, 4953, 222335}},
+{21119, 18, 129680, {1, 1, 7, 7, 7, 11, 101, 17, 197, 561, 297, 159, 7443, 7273, 819, 23487, 24927, 151781}},
+{21120, 18, 129692, {1, 3, 1, 3, 15, 43, 119, 193, 205, 835, 7, 689, 8045, 11167, 19521, 65075, 87265, 53669}},
+{21121, 18, 129738, {1, 3, 7, 7, 9, 51, 43, 209, 239, 415, 995, 4037, 1219, 2683, 30459, 36161, 111157, 184551}},
+{21122, 18, 129764, {1, 3, 7, 11, 27, 3, 81, 43, 407, 463, 231, 3545, 2691, 5235, 22053, 37233, 98757, 149111}},
+{21123, 18, 129782, {1, 3, 1, 5, 17, 25, 47, 185, 487, 403, 1063, 1445, 4457, 15443, 11693, 54823, 131001, 9813}},
+{21124, 18, 129793, {1, 3, 5, 3, 5, 35, 127, 253, 173, 491, 133, 3575, 1981, 12735, 26021, 61615, 74615, 159829}},
+{21125, 18, 129820, {1, 1, 5, 9, 13, 37, 67, 155, 317, 389, 603, 4061, 3527, 9315, 32331, 43145, 82511, 240133}},
+{21126, 18, 129824, {1, 1, 5, 1, 21, 41, 89, 3, 61, 627, 1301, 2073, 447, 8139, 2509, 52075, 50687, 240239}},
+{21127, 18, 129829, {1, 3, 7, 13, 25, 61, 117, 107, 175, 7, 1173, 561, 5777, 10525, 20713, 34987, 48005, 214361}},
+{21128, 18, 129848, {1, 3, 7, 15, 25, 31, 127, 147, 177, 881, 95, 2115, 4765, 10485, 9253, 721, 193, 222459}},
+{21129, 18, 129854, {1, 3, 5, 3, 3, 13, 47, 77, 441, 1001, 215, 2365, 3603, 405, 11401, 14523, 65755, 258229}},
+{21130, 18, 129861, {1, 1, 3, 9, 19, 29, 71, 153, 77, 613, 1815, 2033, 1821, 15497, 18805, 28851, 88247, 143115}},
+{21131, 18, 129879, {1, 3, 1, 11, 21, 19, 37, 35, 427, 887, 1977, 1961, 3619, 10739, 30115, 55937, 102045, 110929}},
+{21132, 18, 129886, {1, 3, 3, 13, 21, 27, 49, 15, 405, 629, 2015, 867, 2121, 13789, 19225, 22343, 105629, 123113}},
+{21133, 18, 129907, {1, 1, 1, 1, 17, 19, 55, 207, 507, 1001, 1753, 315, 2799, 8643, 1519, 4057, 16599, 222223}},
+{21134, 18, 129949, {1, 1, 5, 7, 21, 37, 63, 53, 103, 261, 595, 389, 6041, 11127, 23625, 61683, 80953, 255891}},
+{21135, 18, 129953, {1, 1, 1, 5, 25, 21, 81, 233, 79, 57, 1311, 3965, 7747, 687, 32149, 397, 4551, 37657}},
+{21136, 18, 129980, {1, 1, 1, 5, 9, 19, 87, 67, 325, 157, 317, 591, 1401, 8275, 20413, 39529, 75349, 183679}},
+{21137, 18, 129998, {1, 3, 3, 15, 9, 3, 83, 205, 195, 599, 829, 3109, 3705, 13991, 8781, 41555, 31689, 86933}},
+{21138, 18, 130031, {1, 3, 5, 1, 3, 9, 37, 235, 271, 883, 561, 1473, 7693, 177, 14113, 19507, 75221, 67517}},
+{21139, 18, 130043, {1, 1, 1, 9, 7, 29, 87, 189, 239, 429, 537, 1657, 6373, 2449, 17621, 19649, 77235, 102775}},
+{21140, 18, 130057, {1, 1, 7, 7, 1, 43, 69, 207, 241, 561, 1809, 3119, 4657, 15797, 18751, 52169, 105005, 172657}},
+{21141, 18, 130065, {1, 1, 7, 5, 5, 59, 67, 231, 27, 435, 1073, 2689, 229, 733, 1579, 52289, 110285, 76721}},
+{21142, 18, 130087, {1, 3, 5, 9, 31, 19, 87, 41, 489, 705, 1363, 963, 5865, 8237, 10295, 43169, 81561, 177209}},
+{21143, 18, 130091, {1, 3, 3, 1, 25, 39, 63, 255, 403, 625, 1601, 71, 6609, 4165, 21987, 31269, 25473, 17063}},
+{21144, 18, 130096, {1, 3, 3, 11, 19, 13, 101, 245, 17, 687, 1037, 3345, 7257, 13081, 5131, 29003, 72319, 223505}},
+{21145, 18, 130101, {1, 3, 3, 3, 11, 49, 107, 29, 463, 465, 977, 4007, 2121, 4821, 1465, 53725, 36783, 247057}},
+{21146, 18, 130111, {1, 1, 1, 3, 1, 43, 71, 49, 261, 965, 1041, 3951, 3791, 2503, 26009, 52039, 4639, 141281}},
+{21147, 18, 130126, {1, 1, 3, 5, 29, 45, 79, 33, 119, 491, 1403, 1637, 853, 5609, 29853, 16435, 117877, 58443}},
+{21148, 18, 130137, {1, 1, 3, 5, 13, 17, 109, 187, 201, 705, 235, 1485, 7673, 6335, 3341, 20451, 64697, 129519}},
+{21149, 18, 130138, {1, 1, 7, 13, 11, 41, 95, 81, 135, 783, 1293, 2095, 3599, 10175, 3205, 56915, 131, 19281}},
+{21150, 18, 130149, {1, 3, 5, 9, 13, 19, 53, 223, 283, 733, 1915, 3029, 2779, 8133, 28163, 37263, 91245, 1927}},
+{21151, 18, 130177, {1, 3, 3, 3, 1, 55, 41, 123, 209, 195, 1423, 2467, 3809, 11169, 23593, 8703, 40975, 175651}},
+{21152, 18, 130180, {1, 3, 7, 9, 31, 57, 31, 115, 415, 445, 557, 3971, 1565, 15223, 7799, 10463, 117387, 225127}},
+{21153, 18, 130214, {1, 3, 5, 11, 31, 19, 3, 63, 315, 501, 903, 1925, 3393, 16149, 11013, 15483, 70765, 279}},
+{21154, 18, 130228, {1, 3, 3, 9, 29, 21, 13, 227, 263, 815, 1259, 2549, 955, 9237, 16083, 38891, 31145, 731}},
+{21155, 18, 130240, {1, 3, 3, 5, 27, 23, 33, 189, 107, 655, 889, 1549, 7315, 13341, 12721, 59339, 54503, 91679}},
+{21156, 18, 130267, {1, 3, 7, 5, 15, 9, 1, 255, 451, 91, 1279, 2359, 5913, 5215, 23161, 29327, 45275, 206709}},
+{21157, 18, 130280, {1, 3, 3, 9, 9, 41, 75, 91, 87, 695, 335, 3375, 7307, 14095, 5359, 7815, 9339, 46387}},
+{21158, 18, 130294, {1, 1, 3, 15, 5, 47, 69, 231, 423, 255, 1335, 3395, 2799, 8955, 31445, 59849, 104955, 240587}},
+{21159, 18, 130306, {1, 3, 5, 7, 7, 9, 21, 209, 321, 5, 653, 2199, 3657, 6397, 20229, 32349, 54543, 47971}},
+{21160, 18, 130325, {1, 3, 7, 11, 31, 21, 85, 49, 197, 865, 53, 609, 1867, 14503, 12671, 61703, 39245, 8493}},
+{21161, 18, 130398, {1, 3, 1, 13, 27, 31, 119, 247, 209, 65, 1729, 1563, 1597, 1617, 26597, 50139, 108667, 77035}},
+{21162, 18, 130402, {1, 1, 5, 13, 3, 49, 53, 219, 71, 1013, 1239, 3725, 117, 9273, 8277, 32619, 45933, 71509}},
+{21163, 18, 130421, {1, 3, 7, 13, 1, 3, 119, 153, 79, 555, 429, 1221, 3725, 6073, 1295, 7187, 117709, 258911}},
+{21164, 18, 130438, {1, 3, 3, 13, 1, 13, 105, 185, 81, 989, 563, 3761, 6725, 4699, 10539, 50247, 95307, 211927}},
+{21165, 18, 130441, {1, 3, 7, 3, 21, 11, 45, 81, 495, 391, 1437, 3495, 3789, 13701, 9479, 42505, 22561, 135019}},
+{21166, 18, 130475, {1, 3, 3, 11, 7, 61, 65, 211, 269, 997, 385, 3843, 4905, 2939, 28551, 19515, 25177, 68137}},
+{21167, 18, 130486, {1, 1, 3, 3, 3, 47, 73, 127, 15, 977, 209, 1791, 4711, 6733, 29093, 36311, 13665, 240603}},
+{21168, 18, 130503, {1, 3, 5, 5, 19, 39, 29, 211, 463, 755, 1723, 397, 213, 14009, 22701, 7131, 35587, 183885}},
+{21169, 18, 130551, {1, 3, 5, 9, 11, 29, 7, 25, 381, 631, 1343, 2255, 2535, 3239, 7287, 14161, 69295, 85245}},
+{21170, 18, 130574, {1, 1, 5, 5, 17, 47, 19, 217, 289, 411, 1855, 323, 4109, 2601, 5835, 61909, 99333, 99959}},
+{21171, 18, 130602, {1, 1, 3, 11, 1, 51, 121, 207, 403, 993, 1171, 3451, 3389, 957, 22125, 9333, 110775, 54125}},
+{21172, 18, 130612, {1, 3, 5, 15, 9, 51, 13, 251, 203, 861, 321, 2017, 6933, 10785, 20089, 65213, 105451, 117319}},
+{21173, 18, 130621, {1, 3, 3, 15, 19, 63, 89, 217, 269, 723, 57, 1923, 4267, 4895, 2191, 21605, 62401, 11063}},
+{21174, 18, 130633, {1, 3, 1, 3, 21, 47, 103, 75, 167, 989, 1401, 575, 3717, 10373, 21321, 5487, 36063, 140411}},
+{21175, 18, 130684, {1, 1, 7, 15, 19, 29, 121, 197, 429, 773, 901, 1875, 291, 11395, 31459, 55041, 49263, 185143}},
+{21176, 18, 130688, {1, 3, 3, 1, 19, 17, 19, 21, 41, 885, 1665, 547, 5887, 6205, 3317, 59399, 125559, 82721}},
+{21177, 18, 130698, {1, 3, 1, 9, 15, 39, 81, 9, 279, 33, 1287, 3035, 5759, 10647, 3933, 20953, 3137, 30693}},
+{21178, 18, 130700, {1, 3, 5, 13, 3, 33, 33, 169, 233, 83, 467, 3719, 5617, 6165, 15631, 56059, 95541, 245233}},
+{21179, 18, 130712, {1, 3, 5, 13, 5, 21, 81, 9, 413, 247, 1307, 3363, 3383, 11525, 1259, 8735, 36507, 98359}},
+{21180, 18, 130739, {1, 1, 1, 13, 17, 49, 105, 131, 385, 309, 1295, 565, 8031, 15391, 31263, 52657, 102721, 212195}},
+{21181, 18, 130748, {1, 3, 1, 7, 13, 41, 21, 103, 237, 649, 55, 1565, 6327, 8743, 15457, 29975, 34165, 80839}},
+{21182, 18, 130774, {1, 3, 5, 11, 15, 31, 121, 219, 375, 159, 731, 59, 3205, 15039, 10023, 46209, 34619, 110253}},
+{21183, 18, 130783, {1, 3, 3, 11, 31, 19, 79, 185, 363, 635, 463, 987, 2681, 6405, 30077, 21173, 14213, 58095}},
+{21184, 18, 130802, {1, 1, 5, 13, 23, 37, 57, 111, 293, 553, 269, 3393, 345, 1983, 1097, 47217, 22281, 212607}},
+{21185, 18, 130811, {1, 3, 5, 7, 7, 33, 65, 61, 185, 411, 187, 641, 6437, 4625, 17547, 38941, 81119, 48651}},
+{21186, 18, 130836, {1, 1, 7, 3, 19, 25, 39, 243, 139, 465, 691, 713, 7879, 14539, 31669, 35871, 130681, 255929}},
+{21187, 18, 130840, {1, 3, 1, 1, 3, 43, 87, 13, 179, 835, 719, 1189, 7207, 5863, 6077, 20669, 35469, 211155}},
+{21188, 18, 130856, {1, 3, 7, 13, 25, 59, 97, 129, 151, 985, 739, 1919, 7729, 14057, 21721, 17603, 82797, 181319}},
+{21189, 18, 130864, {1, 1, 7, 7, 5, 3, 21, 141, 379, 257, 207, 597, 4051, 7563, 25481, 59427, 45449, 61159}},
+{21190, 18, 130873, {1, 3, 3, 9, 11, 25, 5, 29, 131, 603, 637, 189, 4033, 13099, 15219, 4447, 73501, 135795}},
+{21191, 18, 130918, {1, 3, 1, 9, 1, 49, 57, 227, 141, 543, 1499, 3525, 3127, 11191, 4071, 47003, 7431, 155137}},
+{21192, 18, 130927, {1, 3, 1, 11, 27, 31, 15, 31, 113, 135, 1251, 245, 6965, 14263, 5679, 55201, 121453, 132503}},
+{21193, 18, 130929, {1, 1, 5, 15, 7, 23, 67, 163, 57, 513, 1809, 1343, 6165, 199, 31169, 30803, 86705, 71103}},
+{21194, 18, 130958, {1, 1, 3, 1, 15, 9, 75, 143, 273, 797, 819, 4037, 2305, 4841, 15697, 41191, 38187, 174131}},
+{21195, 18, 130966, {1, 3, 7, 7, 3, 55, 65, 135, 423, 185, 299, 2221, 7987, 4223, 28183, 32273, 95941, 260297}},
+{21196, 18, 130970, {1, 1, 7, 7, 7, 11, 67, 109, 507, 673, 1555, 2537, 7553, 4659, 3945, 20839, 32539, 43053}},
+{21197, 18, 130976, {1, 1, 7, 15, 1, 47, 61, 73, 211, 397, 1785, 4063, 6461, 13725, 11299, 17565, 80063, 118271}},
+{21198, 18, 131006, {1, 1, 7, 5, 29, 27, 97, 105, 379, 153, 915, 2795, 4933, 6729, 21207, 9995, 70241, 85641}},
+{21199, 18, 131008, {1, 3, 5, 5, 23, 13, 41, 67, 127, 649, 1351, 3597, 7077, 4989, 14649, 17401, 70883, 239841}},
+{21200, 18, 131020, {1, 1, 5, 1, 19, 1, 83, 3, 425, 873, 1943, 3935, 4257, 14587, 11829, 55217, 21963, 39683}},
+{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)
+{
+ assert(dimensions <= SOBOL_MAX_DIMENSIONS);
+
+ const unsigned int L = SOBOL_BITS;
+
+ /* first dimension is exception */
+ unsigned int *v = vectors[0];
+
+ for(unsigned int 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;
+
+ v = vectors[dim];
+
+ if(L <= s) {
+ for(unsigned int i = 0; i < L; i++)
+ v[i] = m[i] << (31-i);
+ }
+ else {
+ for(unsigned int i = 0; i < s; i++)
+ v[i] = m[i] << (31-i);
+
+ for(unsigned int i = s; i < L; i++) {
+ v[i] = v[i-s] ^ (v[i-s] >> s);
+
+ for(unsigned int k = 1; k < s; k++)
+ v[i] ^= (((a >> (s-1-k)) & 1) * v[i-k]);
+ }
+ }
+ }
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/sobol.h b/intern/cycles/render/sobol.h
new file mode 100644
index 00000000000..bfc2f5512aa
--- /dev/null
+++ b/intern/cycles/render/sobol.h
@@ -0,0 +1,32 @@
+/*
+ * 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 __SOBOL_H__
+#define __SOBOL_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);
+
+CCL_NAMESPACE_END
+
+#endif /* __SOBOL_H__ */
+
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
new file mode 100644
index 00000000000..f088a8143cc
--- /dev/null
+++ b/intern/cycles/render/svm.cpp
@@ -0,0 +1,683 @@
+/*
+ * 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 "device.h"
+#include "graph.h"
+#include "light.h"
+#include "mesh.h"
+#include "scene.h"
+#include "shader.h"
+#include "svm.h"
+
+#include "util_debug.h"
+#include "util_foreach.h"
+#include "util_progress.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Shader Manager */
+
+SVMShaderManager::SVMShaderManager()
+{
+}
+
+SVMShaderManager::~SVMShaderManager()
+{
+}
+
+void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ if(!need_update)
+ return;
+
+ /* test if we need to update */
+ device_free(device, dscene);
+
+ /* svm_nodes */
+ vector<int4> svm_nodes;
+ size_t i;
+
+ for(i = 0; i < scene->shaders.size(); i++) {
+ svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
+ svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
+ }
+
+ bool sunsky_done = false;
+ bool use_multi_closure = device->support_full_kernel();
+
+ for(i = 0; i < scene->shaders.size(); i++) {
+ Shader *shader = scene->shaders[i];
+
+ if(progress.get_cancel()) return;
+
+ assert(shader->graph);
+
+ if(shader->sample_as_light && shader->has_surface_emission)
+ scene->light_manager->need_update = true;
+
+ SVMCompiler compiler(scene->shader_manager, scene->image_manager,
+ use_multi_closure);
+ compiler.sunsky = (sunsky_done)? NULL: &dscene->data.sunsky;
+ compiler.background = ((int)i == scene->default_background);
+ compiler.compile(shader, svm_nodes, i);
+ if(!compiler.sunsky)
+ sunsky_done = true;
+ }
+
+ dscene->svm_nodes.copy((uint4*)&svm_nodes[0], svm_nodes.size());
+ device->tex_alloc("__svm_nodes", dscene->svm_nodes);
+
+ for(i = 0; i < scene->shaders.size(); i++) {
+ Shader *shader = scene->shaders[i];
+ shader->need_update = false;
+ }
+
+ device_update_common(device, dscene, scene, progress);
+
+ need_update = false;
+}
+
+void SVMShaderManager::device_free(Device *device, DeviceScene *dscene)
+{
+ device_free_common(device, dscene);
+
+ device->tex_free(dscene->svm_nodes);
+ dscene->svm_nodes.clear();
+}
+
+/* Graph Compiler */
+
+SVMCompiler::SVMCompiler(ShaderManager *shader_manager_, ImageManager *image_manager_, bool use_multi_closure_)
+{
+ shader_manager = shader_manager_;
+ image_manager = image_manager_;
+ sunsky = NULL;
+ max_stack_use = 0;
+ current_type = SHADER_TYPE_SURFACE;
+ current_shader = NULL;
+ background = false;
+ mix_weight_offset = SVM_STACK_INVALID;
+ use_multi_closure = use_multi_closure_;
+}
+
+int SVMCompiler::stack_size(ShaderSocketType type)
+{
+ if(type == SHADER_SOCKET_FLOAT)
+ return 1;
+ else if(type == SHADER_SOCKET_COLOR)
+ return 3;
+ else if(type == SHADER_SOCKET_VECTOR)
+ return 3;
+ else if(type == SHADER_SOCKET_NORMAL)
+ return 3;
+ else if(type == SHADER_SOCKET_POINT)
+ return 3;
+ else if(type == SHADER_SOCKET_CLOSURE)
+ return 0;
+
+ assert(0);
+ return 0;
+}
+
+int SVMCompiler::stack_find_offset(ShaderSocketType type)
+{
+ int size = stack_size(type);
+ int offset = -1;
+
+ /* find free space in stack & mark as used */
+ for(int i = 0, num_unused = 0; i < SVM_STACK_SIZE; i++) {
+ if(active_stack.users[i]) num_unused = 0;
+ else num_unused++;
+
+ if(num_unused == size) {
+ offset = i+1 - size;
+ max_stack_use = max(i+1, max_stack_use);
+
+ while(i >= offset)
+ active_stack.users[i--] = 1;
+
+ return offset;
+ }
+ }
+
+ fprintf(stderr, "Out of SVM stack space.\n");
+ assert(0);
+
+ return offset;
+}
+
+void SVMCompiler::stack_backup(StackBackup& backup, set<ShaderNode*>& done)
+{
+ backup.done = done;
+ backup.stack = active_stack;
+
+ foreach(ShaderNode *node, current_graph->nodes) {
+ foreach(ShaderInput *input, node->inputs)
+ backup.offsets.push_back(input->stack_offset);
+ foreach(ShaderOutput *output, node->outputs)
+ backup.offsets.push_back(output->stack_offset);
+ }
+}
+
+void SVMCompiler::stack_restore(StackBackup& backup, set<ShaderNode*>& done)
+{
+ int i = 0;
+
+ done = backup.done;
+ active_stack = backup.stack;
+
+ foreach(ShaderNode *node, current_graph->nodes) {
+ foreach(ShaderInput *input, node->inputs)
+ input->stack_offset = backup.offsets[i++];
+ foreach(ShaderOutput *output, node->outputs)
+ output->stack_offset = backup.offsets[i++];
+ }
+}
+
+void SVMCompiler::stack_assign(ShaderInput *input)
+{
+ /* stack offset assign? */
+ if(input->stack_offset == SVM_STACK_INVALID) {
+ if(input->link) {
+ /* linked to output -> use output offset */
+ input->stack_offset = input->link->stack_offset;
+ }
+ else {
+ /* not linked to output -> add nodes to load default value */
+ input->stack_offset = stack_find_offset(input->type);
+
+ if(input->type == SHADER_SOCKET_FLOAT) {
+ add_node(NODE_VALUE_F, __float_as_int(input->value.x), input->stack_offset);
+ }
+ else if(input->type == SHADER_SOCKET_VECTOR ||
+ input->type == SHADER_SOCKET_NORMAL ||
+ input->type == SHADER_SOCKET_POINT ||
+ input->type == SHADER_SOCKET_COLOR) {
+
+ add_node(NODE_VALUE_V, input->stack_offset);
+ add_node(NODE_VALUE_V, input->value);
+ }
+ else /* should not get called for closure */
+ assert(0);
+ }
+ }
+}
+
+void SVMCompiler::stack_assign(ShaderOutput *output)
+{
+ /* if no stack offset assigned yet, find one */
+ if(output->stack_offset == SVM_STACK_INVALID)
+ output->stack_offset = stack_find_offset(output->type);
+}
+
+void SVMCompiler::stack_link(ShaderInput *input, ShaderOutput *output)
+{
+ if(output->stack_offset == SVM_STACK_INVALID) {
+ assert(input->link);
+ assert(stack_size(output->type) == stack_size(input->link->type));
+
+ output->stack_offset = input->link->stack_offset;
+
+ int size = stack_size(output->type);
+
+ for(int i = 0; i < size; i++)
+ active_stack.users[output->stack_offset + i]++;
+ }
+}
+
+void SVMCompiler::stack_clear_users(ShaderNode *node, set<ShaderNode*>& done)
+{
+ /* optimization we should add:
+ find and lower user counts for outputs for which all inputs are done.
+ this is done before the node is compiled, under the assumption that the
+ node will first load all inputs from the stack and then writes its
+ outputs. this used to work, but was disabled because it gave trouble
+ with inputs getting stack positions assigned */
+
+ foreach(ShaderInput *input, node->inputs) {
+ ShaderOutput *output = input->link;
+
+ if(output && output->stack_offset != SVM_STACK_INVALID) {
+ bool all_done = true;
+
+ /* optimization we should add: verify if in->parent is actually used */
+ foreach(ShaderInput *in, output->links)
+ if(in->parent != node && done.find(in->parent) == done.end())
+ all_done = false;
+
+ if(all_done) {
+ int size = stack_size(output->type);
+
+ for(int i = 0; i < size; i++)
+ active_stack.users[output->stack_offset + i]--;
+
+ output->stack_offset = SVM_STACK_INVALID;
+
+ foreach(ShaderInput *in, output->links)
+ in->stack_offset = SVM_STACK_INVALID;
+ }
+ }
+ }
+}
+
+void SVMCompiler::stack_clear_temporary(ShaderNode *node)
+{
+ foreach(ShaderInput *input, node->inputs) {
+ if(!input->link && input->stack_offset != SVM_STACK_INVALID) {
+ int size = stack_size(input->type);
+
+ for(int i = 0; i < size; i++)
+ active_stack.users[input->stack_offset + i]--;
+
+ input->stack_offset = SVM_STACK_INVALID;
+ }
+ }
+}
+
+uint SVMCompiler::encode_uchar4(uint x, uint y, uint z, uint w)
+{
+ assert(x <= 255);
+ assert(y <= 255);
+ assert(z <= 255);
+ assert(w <= 255);
+
+ return (x) | (y << 8) | (z << 16) | (w << 24);
+}
+
+void SVMCompiler::add_node(int a, int b, int c, int d)
+{
+ svm_nodes.push_back(make_int4(a, b, c, d));
+}
+
+void SVMCompiler::add_node(NodeType type, int a, int b, int c)
+{
+ svm_nodes.push_back(make_int4(type, a, b, c));
+}
+
+void SVMCompiler::add_node(NodeType type, const float3& f)
+{
+ svm_nodes.push_back(make_int4(type,
+ __float_as_int(f.x),
+ __float_as_int(f.y),
+ __float_as_int(f.z)));
+}
+
+void SVMCompiler::add_node(const float4& f)
+{
+ svm_nodes.push_back(make_int4(
+ __float_as_int(f.x),
+ __float_as_int(f.y),
+ __float_as_int(f.z),
+ __float_as_int(f.w)));
+}
+
+uint SVMCompiler::attribute(ustring name)
+{
+ return shader_manager->get_attribute_id(name);
+}
+
+uint SVMCompiler::attribute(Attribute::Standard std)
+{
+ return shader_manager->get_attribute_id(std);
+}
+
+bool SVMCompiler::node_skip_input(ShaderNode *node, ShaderInput *input)
+{
+ /* nasty exception .. */
+ if(current_type == SHADER_TYPE_DISPLACEMENT && input->link && input->link->parent->name == ustring("bump"))
+ return true;
+
+ return false;
+}
+
+void SVMCompiler::find_dependencies(set<ShaderNode*>& dependencies, const set<ShaderNode*>& done, ShaderInput *input)
+{
+ ShaderNode *node = (input->link)? input->link->parent: NULL;
+
+ if(node && done.find(node) == done.end()) {
+ foreach(ShaderInput *in, node->inputs)
+ if(!node_skip_input(node, in))
+ find_dependencies(dependencies, done, in);
+
+ dependencies.insert(node);
+ }
+}
+
+void SVMCompiler::generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNode*>& done)
+{
+ bool nodes_done;
+
+ do {
+ nodes_done = true;
+
+ foreach(ShaderNode *node, nodes) {
+ if(done.find(node) == done.end()) {
+ bool inputs_done = true;
+
+ foreach(ShaderInput *input, node->inputs)
+ if(!node_skip_input(node, input))
+ if(input->link && done.find(input->link->parent) == done.end())
+ inputs_done = false;
+
+ if(inputs_done) {
+ node->compile(*this);
+ stack_clear_users(node, done);
+ stack_clear_temporary(node);
+ done.insert(node);
+ }
+ else
+ nodes_done = false;
+ }
+ }
+ } while(!nodes_done);
+}
+
+void SVMCompiler::generate_closure(ShaderNode *node, set<ShaderNode*>& done)
+{
+ if(node->name == ustring("mix_closure") || node->name == ustring("add_closure")) {
+ ShaderInput *fin = node->input("Fac");
+ ShaderInput *cl1in = node->input("Closure1");
+ ShaderInput *cl2in = node->input("Closure2");
+
+ /* execute dependencies for mix weight */
+ if(fin) {
+ set<ShaderNode*> dependencies;
+ find_dependencies(dependencies, done, fin);
+ generate_svm_nodes(dependencies, done);
+
+ /* add mix node */
+ stack_assign(fin);
+ }
+
+ int mix_offset = svm_nodes.size();
+
+ if(fin)
+ add_node(NODE_MIX_CLOSURE, fin->stack_offset, 0, 0);
+ else
+ add_node(NODE_ADD_CLOSURE, 0, 0, 0);
+
+ /* generate code for closure 1
+ note we backup all compiler state and restore it afterwards, so one
+ closure choice doesn't influence the other*/
+ if(cl1in->link) {
+ StackBackup backup;
+ stack_backup(backup, done);
+
+ generate_closure(cl1in->link->parent, done);
+ add_node(NODE_END, 0, 0, 0);
+
+ stack_restore(backup, done);
+ }
+ else
+ add_node(NODE_END, 0, 0, 0);
+
+ /* generate code for closure 2 */
+ int cl2_offset = svm_nodes.size();
+
+ if(cl2in->link) {
+ StackBackup backup;
+ stack_backup(backup, done);
+
+ generate_closure(cl2in->link->parent, done);
+ add_node(NODE_END, 0, 0, 0);
+
+ stack_restore(backup, done);
+ }
+ else
+ add_node(NODE_END, 0, 0, 0);
+
+ /* set jump for mix node, -1 because offset is already
+ incremented when this jump is added to it */
+ svm_nodes[mix_offset].z = cl2_offset - mix_offset - 1;
+
+ done.insert(node);
+ stack_clear_users(node, done);
+ stack_clear_temporary(node);
+ }
+ else {
+ /* execute dependencies for closure */
+ foreach(ShaderInput *in, node->inputs) {
+ if(!node_skip_input(node, in) && in->link) {
+ set<ShaderNode*> dependencies;
+ find_dependencies(dependencies, done, in);
+ generate_svm_nodes(dependencies, done);
+ }
+ }
+
+ /* compile closure itself */
+ node->compile(*this);
+ stack_clear_users(node, done);
+ stack_clear_temporary(node);
+
+ if(node->name == ustring("emission"))
+ current_shader->has_surface_emission = true;
+ if(node->name == ustring("transparent"))
+ current_shader->has_surface_transparent = true;
+
+ /* end node is added outside of this */
+ }
+}
+
+void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, uint in_offset)
+{
+ /* todo: the weaks point here is that unlike the single closure sampling
+ we will evaluate all nodes even if they are used as input for closures
+ that are unused. it's not clear what would be the best way to skip such
+ nodes at runtime, especially if they are tangled up */
+
+ if(node->name == ustring("mix_closure") || node->name == ustring("add_closure")) {
+ ShaderInput *fin = node->input("Fac");
+ ShaderInput *cl1in = node->input("Closure1");
+ ShaderInput *cl2in = node->input("Closure2");
+
+ uint out1_offset = SVM_STACK_INVALID;
+ uint out2_offset = SVM_STACK_INVALID;
+
+ if(fin) {
+ /* mix closure */
+ set<ShaderNode*> dependencies;
+ find_dependencies(dependencies, done, fin);
+ generate_svm_nodes(dependencies, done);
+
+ stack_assign(fin);
+
+ if(cl1in->link)
+ out1_offset = stack_find_offset(SHADER_SOCKET_FLOAT);
+ if(cl2in->link)
+ out2_offset = stack_find_offset(SHADER_SOCKET_FLOAT);
+
+ add_node(NODE_MIX_CLOSURE,
+ encode_uchar4(fin->stack_offset, in_offset, out1_offset, out2_offset));
+ }
+ else {
+ /* add closure */
+ out1_offset = in_offset;
+ out2_offset = in_offset;
+ }
+
+ if(cl1in->link) {
+ generate_multi_closure(cl1in->link->parent, done, out1_offset);
+
+ if(fin)
+ active_stack.users[out1_offset]--;
+ }
+
+ if(cl2in->link) {
+ generate_multi_closure(cl2in->link->parent, done, out2_offset);
+
+ if(fin)
+ active_stack.users[out2_offset]--;
+ }
+ }
+ else {
+ /* execute dependencies for closure */
+ foreach(ShaderInput *in, node->inputs) {
+ if(!node_skip_input(node, in) && in->link) {
+ set<ShaderNode*> dependencies;
+ find_dependencies(dependencies, done, in);
+ generate_svm_nodes(dependencies, done);
+ }
+ }
+
+ mix_weight_offset = in_offset;
+
+ /* compile closure itself */
+ node->compile(*this);
+ stack_clear_users(node, done);
+ stack_clear_temporary(node);
+
+ mix_weight_offset = SVM_STACK_INVALID;
+
+ if(node->name == ustring("emission"))
+ current_shader->has_surface_emission = true;
+ if(node->name == ustring("transparent"))
+ current_shader->has_surface_transparent = true;
+
+ /* end node is added outside of this */
+ }
+}
+
+
+void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType type)
+{
+ /* Converting a shader graph into svm_nodes that can be executed
+ * sequentially on the virtual machine is fairly simple. We can keep
+ * looping over nodes and each time all the inputs of a node are
+ * ready, we add svm_nodes for it that read the inputs from the
+ * stack and write outputs back to the stack.
+ *
+ * With the SVM, we always sample only a single closure. We can think
+ * of all closures nodes as a binary tree with mix closures as inner
+ * nodes and other closures as leafs. The SVM will traverse that tree,
+ * each time deciding to go left or right depending on the mix weights,
+ * until a closure is found.
+ *
+ * We only execute nodes that are needed for the mix weights and chosen
+ * closure.
+ */
+
+ current_type = type;
+ current_graph = graph;
+
+ /* get input in output node */
+ ShaderNode *node = graph->output();
+ ShaderInput *clin = NULL;
+
+ if(type == SHADER_TYPE_SURFACE)
+ clin = node->input("Surface");
+ else if(type == SHADER_TYPE_VOLUME)
+ clin = node->input("Volume");
+ else if(type == SHADER_TYPE_DISPLACEMENT)
+ clin = node->input("Displacement");
+ else
+ assert(0);
+
+ /* clear all compiler state */
+ memset(&active_stack, 0, sizeof(active_stack));
+ svm_nodes.clear();
+
+ foreach(ShaderNode *node, graph->nodes) {
+ foreach(ShaderInput *input, node->inputs)
+ input->stack_offset = SVM_STACK_INVALID;
+ foreach(ShaderOutput *output, node->outputs)
+ output->stack_offset = SVM_STACK_INVALID;
+ }
+
+ if(clin->link) {
+ bool generate = false;
+ if(type == SHADER_TYPE_SURFACE) {
+ /* generate surface shader */
+ generate = true;
+ shader->has_surface = true;
+ }
+ else if(type == SHADER_TYPE_VOLUME) {
+ /* generate volume shader */
+ generate = true;
+ shader->has_volume = true;
+ }
+ else if(type == SHADER_TYPE_DISPLACEMENT) {
+ /* generate displacement shader */
+ generate = true;
+ shader->has_displacement = true;
+ }
+
+ if(generate) {
+ set<ShaderNode*> done;
+
+ if(use_multi_closure)
+ generate_multi_closure(clin->link->parent, done, SVM_STACK_INVALID);
+ else
+ generate_closure(clin->link->parent, done);
+ }
+ }
+
+ /* compile output node */
+ node->compile(*this);
+
+ add_node(NODE_END, 0, 0, 0);
+}
+
+void SVMCompiler::compile(Shader *shader, vector<int4>& global_svm_nodes, int index)
+{
+ /* copy graph for shader with bump mapping */
+ ShaderNode *node = shader->graph->output();
+
+ if(node->input("Surface")->link && node->input("Displacement")->link)
+ if(!shader->graph_bump)
+ shader->graph_bump = shader->graph->copy();
+
+ /* finalize */
+ shader->graph->finalize(false, false);
+ if(shader->graph_bump)
+ shader->graph_bump->finalize(true, false);
+
+ current_shader = shader;
+
+ shader->has_surface = false;
+ shader->has_surface_emission = false;
+ shader->has_surface_transparent = false;
+ shader->has_volume = false;
+ shader->has_displacement = false;
+
+ /* generate surface shader */
+ compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
+ global_svm_nodes[index*2 + 0].y = global_svm_nodes.size();
+ global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
+ global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
+
+ if(shader->graph_bump) {
+ compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
+ global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
+ global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
+ }
+
+ /* generate volume shader */
+ compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
+ global_svm_nodes[index*2 + 0].z = global_svm_nodes.size();
+ global_svm_nodes[index*2 + 1].z = global_svm_nodes.size();
+ global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
+
+ /* generate displacement shader */
+ compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
+ global_svm_nodes[index*2 + 0].w = global_svm_nodes.size();
+ global_svm_nodes[index*2 + 1].w = global_svm_nodes.size();
+ global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h
new file mode 100644
index 00000000000..d66d3816068
--- /dev/null
+++ b/intern/cycles/render/svm.h
@@ -0,0 +1,143 @@
+/*
+ * 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_H__
+#define __SVM_H__
+
+#include "attribute.h"
+#include "graph.h"
+#include "shader.h"
+
+#include "util_set.h"
+#include "util_string.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Device;
+class DeviceScene;
+class ImageManager;
+struct KernelSunSky;
+class Scene;
+class ShaderGraph;
+class ShaderInput;
+class ShaderNode;
+class ShaderOutput;
+
+/* Shader Manager */
+
+class SVMShaderManager : public ShaderManager {
+public:
+ SVMShaderManager();
+ ~SVMShaderManager();
+
+ void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_free(Device *device, DeviceScene *dscene);
+};
+
+/* Graph Compiler */
+
+class SVMCompiler {
+public:
+ SVMCompiler(ShaderManager *shader_manager, ImageManager *image_manager,
+ bool use_multi_closure_);
+ void compile(Shader *shader, vector<int4>& svm_nodes, int index);
+
+ void stack_assign(ShaderOutput *output);
+ void stack_assign(ShaderInput *input);
+ void stack_link(ShaderInput *input, ShaderOutput *output);
+ void add_node(NodeType type, int a = 0, int b = 0, int c = 0);
+ void add_node(int a = 0, int b = 0, int c = 0, int d = 0);
+ void add_node(NodeType type, const float3& f);
+ void add_node(const float4& f);
+ uint attribute(ustring name);
+ uint attribute(Attribute::Standard std);
+ uint encode_uchar4(uint x, uint y = 0, uint z = 0, uint w = 0);
+ uint closure_mix_weight_offset() { return mix_weight_offset; }
+
+ ShaderType output_type() { return current_type; }
+
+ ImageManager *image_manager;
+ ShaderManager *shader_manager;
+ KernelSunSky *sunsky;
+ bool background;
+
+protected:
+ struct Stack {
+ Stack() { memset(users, 0, sizeof(users)); }
+ Stack(const Stack& other) { memcpy(users, other.users, sizeof(users)); }
+ Stack& operator=(const Stack& other) { memcpy(users, other.users, sizeof(users)); return *this; }
+
+ bool empty()
+ {
+ for(int i = 0; i < SVM_STACK_SIZE; i++)
+ if(users[i])
+ return false;
+
+ return true;
+ }
+
+ void print()
+ {
+ printf("stack <");
+
+ for(int i = 0; i < SVM_STACK_SIZE; i++)
+ printf((users[i])? "*": " ");
+
+ printf(">\n");
+ }
+
+ int users[SVM_STACK_SIZE];
+ };
+
+ struct StackBackup {
+ Stack stack;
+ vector<int> offsets;
+ set<ShaderNode*> done;
+ };
+
+ void stack_backup(StackBackup& backup, set<ShaderNode*>& done);
+ void stack_restore(StackBackup& backup, set<ShaderNode*>& done);
+
+ void stack_clear_temporary(ShaderNode *node);
+ int stack_size(ShaderSocketType type);
+ int stack_find_offset(ShaderSocketType type);
+ void stack_clear_users(ShaderNode *node, set<ShaderNode*>& done);
+
+ bool node_skip_input(ShaderNode *node, ShaderInput *input);
+
+ void find_dependencies(set<ShaderNode*>& dependencies, const set<ShaderNode*>& done, ShaderInput *input);
+ void generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNode*>& done);
+ void generate_closure(ShaderNode *node, set<ShaderNode*>& done);
+ void generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, uint in_offset);
+
+ void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
+
+ vector<int4> svm_nodes;
+ ShaderType current_type;
+ Shader *current_shader;
+ ShaderGraph *current_graph;
+ Stack active_stack;
+ int max_stack_use;
+ uint mix_weight_offset;
+ bool use_multi_closure;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SVM_H__ */
+
diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp
new file mode 100644
index 00000000000..ba437e74874
--- /dev/null
+++ b/intern/cycles/render/tile.cpp
@@ -0,0 +1,122 @@
+/*
+ * 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 "tile.h"
+
+#include "util_algorithm.h"
+
+CCL_NAMESPACE_BEGIN
+
+TileManager::TileManager(bool progressive_, int samples_, int tile_size_, int min_size_)
+{
+ progressive = progressive_;
+ tile_size = tile_size_;
+ min_size = min_size_;
+
+ reset(0, 0, 0);
+}
+
+TileManager::~TileManager()
+{
+}
+
+void TileManager::reset(int width_, int height_, int samples_)
+{
+ full_width = width_;
+ full_height = height_;
+
+ start_resolution = 1;
+
+ int w = width_, h = height_;
+
+ if(min_size != INT_MAX) {
+ while(w*h > min_size*min_size) {
+ w = max(1, w/2);
+ h = max(1, h/2);
+
+ start_resolution *= 2;
+ }
+ }
+
+ samples = samples_;
+
+ state.width = 0;
+ state.height = 0;
+ state.sample = -1;
+ state.resolution = start_resolution;
+ state.tiles.clear();
+}
+
+void TileManager::set_samples(int samples_)
+{
+ samples = 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 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;
+ int sub_h = image_h/tile_h;
+
+ state.tiles.clear();
+
+ for(int tile_y = 0; tile_y < tile_h; tile_y++) {
+ for(int tile_x = 0; tile_x < tile_w; tile_x++) {
+ int x = tile_x * sub_w;
+ int y = tile_y * sub_h;
+ int w = (tile_x == tile_w-1)? image_w - x: sub_w;
+ int h = (tile_y == tile_h-1)? image_h - y: sub_h;
+
+ state.tiles.push_back(Tile(x, y, w, h));
+ }
+ }
+
+ state.width = image_w;
+ state.height = image_h;
+}
+
+bool TileManager::done()
+{
+ return (state.sample+1 >= samples && state.resolution == 1);
+}
+
+bool TileManager::next()
+{
+ if(done())
+ return false;
+
+ if(progressive && state.resolution > 1) {
+ state.sample = 0;
+ state.resolution /= 2;
+ set_tiles();
+ }
+ else {
+ state.sample++;
+ state.resolution = 1;
+ set_tiles();
+ }
+
+ return true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/render/tile.h b/intern/cycles/render/tile.h
new file mode 100644
index 00000000000..5cd16eb8afa
--- /dev/null
+++ b/intern/cycles/render/tile.h
@@ -0,0 +1,74 @@
+/*
+ * 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 __TILE_H__
+#define __TILE_H__
+
+#include <limits.h>
+
+#include "util_list.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Tile */
+
+class Tile {
+public:
+ int x, y, w, h;
+
+ Tile(int x_, int y_, int w_, int h_)
+ : x(x_), y(y_), w(w_), h(h_) {}
+};
+
+/* Tile Manager */
+
+class TileManager {
+public:
+ struct State {
+ int width;
+ int height;
+ int sample;
+ int resolution;
+ list<Tile> tiles;
+ } state;
+
+ TileManager(bool progressive, int samples, int tile_size, int min_size);
+ ~TileManager();
+
+ void reset(int width, int height, int samples);
+ void set_samples(int samples);
+ bool next();
+ bool done();
+
+protected:
+ void set_tiles();
+
+ bool progressive;
+ int samples;
+ int tile_size;
+ int min_size;
+
+ int full_width;
+ int full_height;
+ int start_resolution;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __TILE_H__ */
+
diff --git a/intern/cycles/subd/CMakeLists.txt b/intern/cycles/subd/CMakeLists.txt
new file mode 100644
index 00000000000..75f70753ddf
--- /dev/null
+++ b/intern/cycles/subd/CMakeLists.txt
@@ -0,0 +1,35 @@
+
+set(INC
+ .
+ ../util
+ ../kernel
+ ../kernel/svm
+ ../render
+)
+
+set(SRC
+ subd_build.cpp
+ subd_dice.cpp
+ subd_mesh.cpp
+ subd_patch.cpp
+ subd_ring.cpp
+ subd_split.cpp
+ subd_stencil.cpp
+)
+
+set(SRC_HEADERS
+ subd_build.h
+ subd_dice.h
+ subd_edge.h
+ subd_face.h
+ subd_mesh.h
+ subd_patch.h
+ subd_ring.h
+ subd_split.h
+ subd_stencil.h
+ subd_vert.h
+)
+
+include_directories(${INC})
+
+add_library(cycles_subd ${SRC} ${SRC_HEADERS})
diff --git a/intern/cycles/subd/subd_build.cpp b/intern/cycles/subd/subd_build.cpp
new file mode 100644
index 00000000000..640c30eba9d
--- /dev/null
+++ b/intern/cycles/subd/subd_build.cpp
@@ -0,0 +1,666 @@
+/*
+ * Copyright 2006, NVIDIA Corporation Ignacio Castano <icastano@nvidia.com>
+ *
+ * Modifications copyright (c) 2011, Blender Foundation. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "subd_build.h"
+#include "subd_edge.h"
+#include "subd_face.h"
+#include "subd_ring.h"
+#include "subd_mesh.h"
+#include "subd_patch.h"
+#include "subd_stencil.h"
+#include "subd_vert.h"
+
+#include "util_algorithm.h"
+#include "util_debug.h"
+#include "util_math.h"
+#include "util_string.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Subd Builder */
+
+SubdBuilder *SubdBuilder::create(bool linear)
+{
+ if(linear)
+ return new SubdLinearBuilder();
+ else
+ return new SubdAccBuilder();
+}
+
+/* Gregory ACC Stencil */
+
+class GregoryAccStencil {
+public:
+ SubdFaceRing *ring;
+ StencilMask stencil[20];
+
+ GregoryAccStencil(SubdFaceRing *ring_)
+ {
+ ring = ring_;
+
+ for(int i = 0; i < 20; i++)
+ stencil[i].resize(ring->num_verts());
+ }
+
+ StencilMask& get(int i)
+ {
+ assert(i < 20);
+ return stencil[i];
+ }
+
+ float& get(int i, SubdVert *vert)
+ {
+ assert(i < 20);
+ return stencil[i][ring->vert_index(vert)];
+ }
+};
+
+static float pseudoValence(SubdVert *vert)
+{
+ float valence = (float)vert->valence();
+
+ if(vert->is_boundary()) {
+ /* we treat boundary verts as being half a closed mesh. corners are
+ special case. n = 4 for corners and n = 2*(n-1) for boundaries. */
+ if(valence == 2) return 4;
+ return (valence - 1)*2;
+ }
+
+ return valence;
+}
+
+/* Subd ACC Builder */
+
+SubdAccBuilder::SubdAccBuilder()
+{
+}
+
+SubdAccBuilder::~SubdAccBuilder()
+{
+}
+
+Patch *SubdAccBuilder::run(SubdFace *face)
+{
+ SubdFaceRing ring(face, face->edge);
+ GregoryAccStencil stencil(&ring);
+ float3 position[20];
+
+ computeCornerStencil(&ring, &stencil);
+ computeEdgeStencil(&ring, &stencil);
+ computeInteriorStencil(&ring, &stencil);
+
+ ring.evaluate_stencils(position, stencil.stencil, 20);
+
+ if(face->num_edges() == 3) {
+ GregoryTrianglePatch *patch = new GregoryTrianglePatch();
+ memcpy(patch->hull, position, sizeof(float3)*20);
+ return patch;
+ }
+ else if(face->num_edges() == 4) {
+ GregoryQuadPatch *patch = new GregoryQuadPatch();
+ memcpy(patch->hull, position, sizeof(float3)*20);
+ return patch;
+ }
+
+ assert(0); /* n-gons should have been split already */
+ return NULL;
+}
+
+/* Gregory Patch */
+
+void SubdAccBuilder::computeCornerStencil(SubdFaceRing *ring, GregoryAccStencil *stencil)
+{
+ const int cornerIndices[7] = {8, 11, 19, 16, 6, 9, 12};
+ int primitiveOffset = ring->is_quad()? 0: 4;
+
+ SubdEdge *firstEdge = ring->firstEdge();
+
+ /* compute corner control points */
+ int v = 0;
+
+ for(SubdFace::EdgeIterator it(firstEdge); !it.isDone(); it.advance(), v++) {
+ SubdVert *vert = it.current()->from();
+ int valence = vert->valence();
+ int cid = cornerIndices[primitiveOffset+v];
+
+ if(vert->is_boundary()) {
+ /* compute vertex limit position */
+ SubdEdge *edge0 = vert->edge;
+ SubdEdge *edge1 = vert->edge->prev;
+
+ assert(edge0->face == NULL);
+ assert(edge0->to() != vert);
+ assert(edge1->face == NULL);
+ assert(edge1->from() != vert);
+
+ stencil->get(cid, vert) = 2.0f/3.0f;
+ stencil->get(cid, edge0->to()) = 1.0f/6.0f;
+ stencil->get(cid, edge1->from()) = 1.0f/6.0f;
+
+ assert(stencil->get(cid).is_normalized());
+ }
+ else {
+ stencil->get(cid, vert) = 3.0f*valence*valence;
+
+ for(SubdVert::EdgeIterator eit(vert->edge); !eit.isDone(); eit.advance()) {
+ SubdEdge *edge = eit.current();
+ assert(vert->co == edge->from()->co);
+
+ stencil->get(cid, edge->to()) = 12.0f;
+
+ if(SubdFaceRing::is_triangle(edge->face)) {
+ /* distribute weight to all verts */
+ stencil->get(cid, vert) += 1.0f;
+ stencil->get(cid, edge->to()) += 1.0f;
+ stencil->get(cid, edge->next->to()) += 1.0f;
+ }
+ else
+ stencil->get(cid, edge->next->to()) = 3.0f;
+ }
+
+ /* normalize stencil. */
+ stencil->get(cid).normalize();
+ }
+ }
+}
+
+void SubdAccBuilder::computeEdgeStencil(SubdFaceRing *ring, GregoryAccStencil *stencil)
+{
+ const int cornerIndices[7] = {8, 11, 19, 16, 6, 9, 12};
+ const int edge1Indices[7] = {9, 13, 18, 14, 7, 10, 13};
+ const int edge2Indices[7] = {12, 10, 15, 17, 14, 8, 11};
+ int primitiveOffset = ring->is_quad()? 0: 4;
+
+ float tangentScales[14] = {
+ 0.0f, 0.0f, 0.0f, 0.667791f, 1.0f,
+ 1.11268f, 1.1284f, 1.10289f, 1.06062f,
+ 1.01262f, 0.963949f, 0.916926f, 0.872541f, 0.831134f
+ };
+
+ SubdEdge *firstEdge = ring->firstEdge();
+
+ /* compute corner / edge control points */
+ int v = 0;
+
+ for(SubdFace::EdgeIterator it(firstEdge); !it.isDone(); it.advance(), v++) {
+ SubdVert *vert = it.current()->from();
+ int valence = vert->valence();
+ int cid = cornerIndices[primitiveOffset+v];
+
+ int i1 = 0, i2 = 0, j = 0;
+
+ for(SubdVert::EdgeIterator eit(vert->edge); !eit.isDone(); eit.advance(), j++) {
+ SubdEdge *edge = eit.current();
+
+ /* find index of "our" edge for edge control points */
+ if(edge == it.current())
+ i1 = j;
+ if(edge == it.current()->prev->pair)
+ i2 = j;
+ }
+
+ if(vert->is_boundary()) {
+ int num_verts = ring->num_verts();
+ StencilMask r0(num_verts);
+ StencilMask r1(num_verts);
+
+ computeBoundaryTangentStencils(ring, vert, r0, r1);
+
+ int k = valence - 1;
+ float omega = M_PI_F / k;
+
+ int eid1 = edge1Indices[primitiveOffset + v];
+ int eid2 = edge2Indices[primitiveOffset + v];
+
+ if(it.current()->is_boundary()) {
+ assert(it.current()->from() == vert);
+
+ stencil->get(eid1, vert) = 2.0f / 3.0f;
+ stencil->get(eid1, it.current()->to()) = 1.0f / 3.0f;
+
+ assert(stencil->get(eid1).is_normalized());
+
+ if(valence == 2) {
+ for(int i = 0; i < num_verts; i++)
+ stencil->get(eid1)[i] += r0[i] * 0.0001f;
+ }
+ }
+ else {
+ stencil->get(eid1) = stencil->get(cid);
+
+ /* compute index of it.current() around vert */
+ int idx = 0;
+
+ for(SubdVert::EdgeIterator eit(vert->edges()); !eit.isDone(); eit.advance(), idx++)
+ if(eit.current() == it.current())
+ break;
+
+ assert(idx != valence);
+
+ float c = cosf(idx * omega);
+ float s = sinf(idx * omega);
+
+ for(int i = 0; i < num_verts; i++)
+ stencil->get(eid1)[i] += (r0[i] * s + r1[i] * c) / 3.0f;
+ }
+
+ if(it.current()->prev->is_boundary()) {
+ assert(it.current()->prev->pair->from() == vert);
+
+ stencil->get(eid2, vert) = 2.0f / 3.0f;
+ stencil->get(eid2, it.current()->prev->pair->to()) = 1.0f / 3.0f;
+
+ assert(stencil->get(eid2).is_normalized());
+
+ if(valence == 2) {
+ for(int i = 0; i < num_verts; i++)
+ stencil->get(eid2)[i] += r0[i] * 0.0001f;
+ }
+ }
+ else {
+ stencil->get(eid2) = stencil->get(cid);
+
+ /* compute index of it.current() around vert */
+ int idx = 0;
+
+ for(SubdVert::EdgeIterator eit(vert->edges()); !eit.isDone(); eit.advance(), idx++)
+ if(eit.current() == it.current()->prev->pair)
+ break;
+
+ assert(idx != valence);
+
+ float c = cosf(idx * omega);
+ float s = sinf(idx * omega);
+
+ for(int i = 0; i < num_verts; i++)
+ stencil->get(eid2)[i] += (r0[i] * s + r1[i] * c) / 3;
+ }
+ }
+ else {
+ float costerm = cosf(M_PI_F / valence);
+ float sqrtterm = sqrtf(4.0f + costerm*costerm);
+
+ /* float tangentScale = 1.0f; */
+ float tangentScale = tangentScales[min(valence, 13U)];
+
+ float alpha = (1.0f + costerm / sqrtterm) / (3.0f * valence) * tangentScale;
+ float beta = 1.0f / (3.0f * valence * sqrtterm) * tangentScale;
+
+
+ int eid1 = edge1Indices[primitiveOffset + v];
+ int eid2 = edge2Indices[primitiveOffset + v];
+
+ stencil->get(eid1) = stencil->get(cid);
+ stencil->get(eid2) = stencil->get(cid);
+
+ int j = 0;
+ for(SubdVert::EdgeIterator eit(vert->edges()); !eit.isDone(); eit.advance(), j++) {
+ SubdEdge *edge = eit.current();
+ assert(vert->co == edge->from()->co);
+
+ float costerm1_a = cosf(M_PI_F * 2 * (j-i1) / valence);
+ float costerm1_b = cosf(M_PI_F * (2 * (j-i1)-1) / valence); /* -1 instead of +1 b/c of edge->next->to() */
+
+ float costerm2_a = cosf(M_PI_F * 2 * (j-i2) / valence);
+ float costerm2_b = cosf(M_PI_F * (2 * (j-i2)-1) / valence); /* -1 instead of +1 b/c of edge->next->to() */
+
+
+ stencil->get(eid1, edge->to()) += alpha * costerm1_a;
+ stencil->get(eid2, edge->to()) += alpha * costerm2_a;
+
+ if(SubdFaceRing::is_triangle(edge->face)) {
+ /* @@ this probably does not provide watertight results!! (1/3 + 1/3 + 1/3 != 1) */
+
+ /* distribute weight to all verts */
+ stencil->get(eid1, vert) += beta * costerm1_b / 3.0f;
+ stencil->get(eid1, edge->to()) += beta * costerm1_b / 3.0f;
+ stencil->get(eid1, edge->next->to()) += beta * costerm1_b / 3.0f;
+
+ stencil->get(eid2, vert) += beta * costerm2_b / 3.0f;
+ stencil->get(eid2, edge->to()) += beta * costerm2_b / 3.0f;
+ stencil->get(eid2, edge->next->to()) += beta * costerm2_b / 3.0f;
+ }
+ else {
+ stencil->get(eid1, edge->next->to()) += beta * costerm1_b;
+ stencil->get(eid2, edge->next->to()) += beta * costerm2_b;
+ }
+ }
+ }
+ }
+}
+
+void SubdAccBuilder::computeInteriorStencil(SubdFaceRing *ring, GregoryAccStencil *stencil)
+{
+ static int corner1Indices[7] = {8, 11, 19, 16, 6, 9, 12};
+ static int corner2Indices[7] = {11, 19, 16, 8, 9, 12, 6};
+ static int edge1Indices[7] = {9, 13, 18, 14, 7, 10, 13};
+ static int edge2Indices[7] = {10, 15, 17, 12, 8, 11, 14};
+ static int interior1Indices[7] = {1, 3, 6, 4, 1, 3, 5};
+ static int interior2Indices[7] = {2, 7, 5, 0, 2, 4, 0};
+
+ int primitiveOffset = ring->is_quad()? 0: 4;
+
+ SubdFace * face = ring->face();
+ SubdEdge *firstEdge = ring->firstEdge();
+
+ /* interior control points */
+ int v = 0;
+ for(SubdFace::EdgeIterator it(firstEdge); !it.isDone(); it.advance(), v++) {
+ SubdEdge *edge = it.current();
+
+ if(edge->is_boundary()) {
+ float valence1 = pseudoValence(edge->from());
+ float valence2 = pseudoValence(edge->to());
+
+ float weights1[4];
+ float weights2[4];
+
+ if(ring->is_quad()) {
+ weights1[0] = 3 * valence1;
+ weights1[1] = 6;
+ weights1[2] = 3;
+ weights1[3] = 6;
+
+ weights2[0] = 6;
+ weights2[1] = 3 * valence2;
+ weights2[2] = 6;
+ weights2[3] = 3;
+ }
+ else {
+ assert(ring->is_triangle());
+ weights1[0] = 3 * valence1 + 1;
+ weights1[1] = 7;
+ weights1[2] = 7;
+
+ weights2[0] = 7;
+ weights2[1] = 3 * valence2 + 1;
+ weights2[2] = 7;
+ }
+
+ int idx1 = interior1Indices[primitiveOffset+v];
+ int idx2 = interior2Indices[primitiveOffset+v];
+
+ int i = 0;
+ for(SubdFace::EdgeIterator it(face->edges(edge)); !it.isDone(); it.advance(), i++) {
+ SubdVert *vert = it.current()->from();
+ stencil->get(idx1, vert) += weights1[i];
+ stencil->get(idx2, vert) += weights2[i];
+ }
+
+ stencil->get(idx1).normalize();
+ stencil->get(idx2).normalize();
+ }
+ else {
+ SubdVert *e0 = edge->from();
+ float costerm0 = cosf(2.0f * M_PI_F / pseudoValence(e0));
+
+ SubdVert *f0 = edge->to();
+ float costerm1 = cosf(2.0f * M_PI_F / pseudoValence(f0));
+
+ /* p0 +------+ q0
+ * | |
+ * f0 +======+ e0 <=== current edge
+ * | |
+ * p1 +------+ q1
+ */
+
+ SubdVert *q0 = edge->next->to();
+ SubdVert *p0 = edge->prev->from();
+
+ SubdVert *p1 = edge->pair->next->to();
+ SubdVert *q1 = edge->pair->prev->from();
+
+
+ StencilMask x(ring->num_verts());
+ StencilMask y(ring->num_verts());
+
+ for(int i = 0; i < ring->num_verts(); i++) {
+ x[i] =
+ (costerm1 * stencil->get(corner1Indices[primitiveOffset+v])[i] -
+ (2*costerm0 + costerm1) * stencil->get(edge1Indices[primitiveOffset+v])[i] +
+ 2*costerm0 * stencil->get(edge2Indices[primitiveOffset+v])[i]) / 3.0f;
+ }
+
+ /* y = (2*( midedgeA1 - midedgeB1) + 4*(centroidA - centroidB))/18.0f; */
+ y[ring->vert_index(p0)] = 1;
+ y[ring->vert_index(p1)] = -1;
+
+ /* add centroidA */
+ if(ring->is_triangle()) {
+ y[ring->vert_index(p0)] += 4.0f / 3.0f;
+ y[ring->vert_index(e0)] += 4.0f / 3.0f;
+ y[ring->vert_index(f0)] += 4.0f / 3.0f;
+ }
+ else {
+ y[ring->vert_index(p0)] += 1;
+ y[ring->vert_index(q0)] += 1;
+ y[ring->vert_index(e0)] += 1;
+ y[ring->vert_index(f0)] += 1;
+ }
+
+ /* sub centroidB */
+ if(SubdFaceRing::is_triangle(edge->pair->face)) {
+ y[ring->vert_index(p1)] -= 4.0f / 3.0f;
+ y[ring->vert_index(e0)] -= 4.0f / 3.0f;
+ y[ring->vert_index(f0)] -= 4.0f / 3.0f;
+
+ }
+ else {
+ y[ring->vert_index(p1)] -= 1;
+ y[ring->vert_index(q1)] -= 1;
+ y[ring->vert_index(e0)] -= 1;
+ y[ring->vert_index(f0)] -= 1;
+ }
+
+ y /= 18.0f;
+
+ if(ring->is_triangle()) {
+ x *= 3.0f / 4.0f;
+ y *= 3.0f / 4.0f;
+ }
+
+ /* this change makes the triangle boundaries smoother, but distorts the quads next to them */
+ /*if(ring->is_triangle() || SubdFaceRing::is_triangle(edge->pair->face))
+ {
+ y *= 4.0f / 3.0f;
+ }*/
+
+ stencil->get(interior1Indices[primitiveOffset+v]) = stencil->get(edge1Indices[primitiveOffset+v]);
+ stencil->get(interior1Indices[primitiveOffset+v]) += x;
+ stencil->get(interior1Indices[primitiveOffset+v]) += y;
+
+ for(int i = 0; i < ring->num_verts(); i++) {
+ x[i] =
+ (costerm0 * stencil->get(corner2Indices[primitiveOffset+v])[i] -
+ (2*costerm1 + costerm0) * stencil->get(edge2Indices[primitiveOffset+v])[i] +
+ 2*costerm1 * stencil->get(edge1Indices[primitiveOffset+v])[i]) / 3.0f;
+ }
+
+ /* y = (2*( midedgeA2 - midedgeB2) + 4*(centroidA - centroidB))/18.0f; */
+ y = 0.0f;
+
+ /* (2*( midedgeA2 - midedgeB2) */
+ y[ring->vert_index(q0)] = 1;
+ y[ring->vert_index(q1)] = -1;
+
+ /* add centroidA */
+ if(ring->is_triangle()) {
+ y[ring->vert_index(p0)] += 4.0f / 3.0f;
+ y[ring->vert_index(e0)] += 4.0f / 3.0f;
+ y[ring->vert_index(f0)] += 4.0f / 3.0f;
+ }
+ else {
+ y[ring->vert_index(p0)] += 1;
+ y[ring->vert_index(q0)] += 1;
+ y[ring->vert_index(e0)] += 1;
+ y[ring->vert_index(f0)] += 1;
+ }
+
+ /* sub centroidB */
+ if(SubdFaceRing::is_triangle(edge->pair->face)) {
+ y[ring->vert_index(p1)] -= 4.0f / 3.0f;
+ y[ring->vert_index(e0)] -= 4.0f / 3.0f;
+ y[ring->vert_index(f0)] -= 4.0f / 3.0f;
+
+ }
+ else {
+ y[ring->vert_index(p1)] -= 1;
+ y[ring->vert_index(q1)] -= 1;
+ y[ring->vert_index(e0)] -= 1;
+ y[ring->vert_index(f0)] -= 1;
+ }
+
+ y /= 18.0f;
+
+ if(ring->is_triangle()) {
+ x *= 3.0f / 4.0f;
+ y *= 3.0f / 4.0f;
+ }
+
+ /* this change makes the triangle boundaries smoother, but distorts the quads next to them. */
+ /*if(ring->is_triangle() || SubdFaceRing::is_triangle(edge->pair->face))
+ y *= 4.0f / 3.0f;*/
+
+ stencil->get(interior2Indices[primitiveOffset+v]) = stencil->get(edge2Indices[primitiveOffset+v]);
+ stencil->get(interior2Indices[primitiveOffset+v]) += x;
+ stencil->get(interior2Indices[primitiveOffset+v]) += y;
+ }
+ }
+}
+
+void SubdAccBuilder::computeBoundaryTangentStencils(SubdFaceRing *ring, SubdVert *vert, StencilMask & r0, StencilMask & r1)
+{
+ assert(vert->is_boundary());
+ assert(r0.size() == ring->num_verts());
+ assert(r1.size() == ring->num_verts());
+
+ SubdEdge *edge0 = vert->edge;
+ assert(edge0->face == NULL);
+ assert(edge0->to() != vert);
+
+ SubdEdge *edgek = vert->edge->prev;
+ assert(edgek->face == NULL);
+ assert(edgek->from() != vert);
+
+ int valence = vert->valence();
+
+ int k = valence - 1;
+ float omega = M_PI_F / k;
+ float s = sinf(omega);
+ float c = cosf(omega);
+
+ float factor = 1.0f / (3 * k + c);
+
+ float gamma = -4 * s * factor;
+ r0[ring->vert_index(vert)] = gamma;
+ /* r1[ring->vert_index(vert)] = 0; */
+
+ float salpha0 = -((1 + 2 * c) * sqrtf(1 + c)) * factor / sqrtf(1 - c);
+ float calpha0 = 1.0f / 2.0f;
+
+ r0[ring->vert_index(edge0->to())] = salpha0;
+ r1[ring->vert_index(edge0->to())] = calpha0;
+
+ float salphak = salpha0;
+ float calphak = -1.0f / 2.0f;
+
+ r0[ring->vert_index(edgek->from())] = salphak;
+ r1[ring->vert_index(edgek->from())] = calphak;
+
+ int j = 0;
+ for(SubdVert::EdgeIterator it(vert->edges()); !it.isDone(); it.advance(), j++) {
+ SubdEdge *edge = it.current();
+
+ if(j == k) break;
+
+ SubdVert *p = edge->to();
+ SubdVert *q = edge->pair->prev->from();
+
+ float alphaj = 4 * sinf(j * omega) * factor;
+ float betaj = (sinf(j * omega) + sinf((j + 1) * omega)) * factor;
+
+ if(j != 0)
+ r0[ring->vert_index(p)] += alphaj;
+
+ if(edge->pair->prev->prev->prev == edge->pair) {
+ r0[ring->vert_index(vert)] += betaj / 3.0f;
+ r0[ring->vert_index(edge->pair->from())] += betaj / 3.0f;
+ r0[ring->vert_index(q)] += betaj / 3.0f;
+ }
+ else
+ r0[ring->vert_index(q)] += betaj;
+ }
+
+ if(valence == 2) {
+ /* r0 perpendicular to r1 */
+ r0[ring->vert_index(vert)] = -4.0f / 3.0f;
+ r0[ring->vert_index(edgek->from())] = 1.0f / 2.0f;
+ r0[ring->vert_index(edge0->to())] = 1.0f / 2.0f;
+ r0[ring->vert_index(edge0->next->to())] = 1.0f / 3.0f;
+ }
+}
+
+/* Subd Linear Builder */
+
+SubdLinearBuilder::SubdLinearBuilder()
+{
+}
+
+SubdLinearBuilder::~SubdLinearBuilder()
+{
+}
+
+Patch *SubdLinearBuilder::run(SubdFace *face)
+{
+ Patch *patch;
+ float3 *hull;
+
+ if(face->num_edges() == 3) {
+ LinearTrianglePatch *lpatch = new LinearTrianglePatch();
+ hull = lpatch->hull;
+ patch = lpatch;
+ }
+ else if(face->num_edges() == 4) {
+ LinearQuadPatch *lpatch = new LinearQuadPatch();
+ hull = lpatch->hull;
+ patch = lpatch;
+ }
+ else {
+ assert(0); /* n-gons should have been split already */
+ return NULL;
+ }
+
+ int i = 0;
+
+ for(SubdFace::EdgeIterator it(face->edge); !it.isDone(); it.advance())
+ hull[i++] = it.current()->from()->co;
+
+ if(face->num_edges() == 4)
+ swap(hull[2], hull[3]);
+
+ return patch;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/subd/subd_build.h b/intern/cycles/subd/subd_build.h
new file mode 100644
index 00000000000..e93ffc4a2c4
--- /dev/null
+++ b/intern/cycles/subd/subd_build.h
@@ -0,0 +1,75 @@
+/*
+ * 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 __SUBD_BUILD_H__
+#define __SUBD_BUILD_H__
+
+CCL_NAMESPACE_BEGIN
+
+class SubdFace;
+class SubdFaceRing;
+class SubdVert;
+class GregoryAccStencil;
+class Patch;
+class StencilMask;
+
+/* Builder */
+
+class SubdBuilder
+{
+public:
+ virtual ~SubdBuilder() {};
+ virtual Patch *run(SubdFace *face) = 0;
+ static SubdBuilder *create(bool linear);
+};
+
+/* Approximate Catmull Clark using Loop's approximation */
+
+class SubdAccBuilder : public SubdBuilder
+{
+public:
+ SubdAccBuilder();
+ ~SubdAccBuilder();
+
+ Patch *run(SubdFace *face);
+
+protected:
+ /* Gregory Patch */
+ void computeCornerStencil(SubdFaceRing *ring, GregoryAccStencil *stencil);
+ void computeEdgeStencil(SubdFaceRing *ring, GregoryAccStencil *stencil);
+ void computeInteriorStencil(SubdFaceRing *ring, GregoryAccStencil *stencil);
+ void computeBoundaryTangentStencils(SubdFaceRing *ring,
+ SubdVert *vert,
+ StencilMask & r0, StencilMask & r1);
+};
+
+/* Linear Subdivision */
+
+class SubdLinearBuilder : public SubdBuilder
+{
+public:
+ SubdLinearBuilder();
+ ~SubdLinearBuilder();
+
+ Patch *run(SubdFace *face);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_BUILD_H__ */
+
diff --git a/intern/cycles/subd/subd_dice.cpp b/intern/cycles/subd/subd_dice.cpp
new file mode 100644
index 00000000000..086b7b246d3
--- /dev/null
+++ b/intern/cycles/subd/subd_dice.cpp
@@ -0,0 +1,461 @@
+/*
+ * 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 "camera.h"
+#include "mesh.h"
+
+#include "subd_dice.h"
+#include "subd_patch.h"
+
+#include "util_debug.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* EdgeDice Base */
+
+EdgeDice::EdgeDice(Mesh *mesh_, int shader_, bool smooth_, float dicing_rate_)
+{
+ mesh = mesh_;
+ mesh_P = NULL;
+ mesh_N = NULL;
+ vert_offset = 0;
+ dicing_rate = dicing_rate_;
+ shader = shader_;
+ smooth = smooth_;
+ camera = NULL;
+
+ mesh->attributes.add(Attribute::STD_VERTEX_NORMAL);
+}
+
+void EdgeDice::reserve(int num_verts, int num_tris)
+{
+ vert_offset = mesh->verts.size();
+ tri_offset = mesh->triangles.size();
+
+ mesh->reserve(vert_offset + num_verts, tri_offset + num_tris);
+
+ Attribute *attr_vN = mesh->attributes.add(Attribute::STD_VERTEX_NORMAL);
+
+ mesh_P = &mesh->verts[0];
+ mesh_N = attr_vN->data_float3();
+}
+
+int EdgeDice::add_vert(Patch *patch, float2 uv)
+{
+ float3 P, N, dPdu, dPdv;
+
+ patch->eval(&P, &dPdu, &dPdv, uv.x, uv.y);
+ N = normalize(cross(dPdu, dPdv));
+
+ assert(vert_offset < mesh->verts.size());
+
+ mesh_P[vert_offset] = P;
+ mesh_N[vert_offset] = N;
+
+ return vert_offset++;
+}
+
+void EdgeDice::add_triangle(int v0, int v1, int v2)
+{
+ mesh->add_triangle(v0, v1, v2, shader, smooth);
+}
+
+void EdgeDice::stitch_triangles(vector<int>& outer, vector<int>& inner)
+{
+ if(inner.size() == 0 || outer.size() == 0)
+ return; // XXX avoid crashes for Mu or Mv == 1, missing polygons
+
+ /* stitch together two arrays of verts with triangles. at each step,
+ we compare using the next verts on both sides, to find the split
+ direction with the smallest diagonal, and use that in order to keep
+ the triangle shape reasonable. */
+ for(size_t i = 0, j = 0; i+1 < inner.size() || j+1 < outer.size();) {
+ int v0, v1, v2;
+
+ v0 = inner[i];
+ v1 = outer[j];
+
+ if(j+1 == outer.size()) {
+ v2 = inner[++i];
+ }
+ else if(i+1 == inner.size()) {
+ v2 = outer[++j];
+ }
+ else {
+ /* length of diagonals */
+ float len1 = len(mesh_P[inner[i]] - mesh_P[outer[j+1]]);
+ float len2 = len(mesh_P[outer[j]] - mesh_P[inner[i+1]]);
+
+ /* use smallest diagonal */
+ if(len1 < len2)
+ v2 = outer[++j];
+ else
+ v2 = inner[++i];
+ }
+
+ add_triangle(v0, v1, v2);
+ }
+}
+
+/* QuadDice */
+
+QuadDice::QuadDice(Mesh *mesh_, int shader_, bool smooth_, float dicing_rate_)
+: EdgeDice(mesh_, shader_, smooth_, dicing_rate_)
+{
+}
+
+void QuadDice::reserve(EdgeFactors& ef, int Mu, int Mv)
+{
+ /* XXX need to make this also work for edge factor 0 and 1 */
+ int num_verts = (ef.tu0 + ef.tu1 + ef.tv0 + ef.tv1) + (Mu - 1)*(Mv - 1);
+ EdgeDice::reserve(num_verts, 0);
+}
+
+float2 QuadDice::map_uv(SubPatch& sub, float u, float v)
+{
+ /* map UV from subpatch to patch parametric coordinates */
+ float2 d0 = interp(sub.P00, sub.P01, v);
+ float2 d1 = interp(sub.P10, sub.P11, v);
+ return interp(d0, d1, u);
+}
+
+float3 QuadDice::eval_projected(SubPatch& sub, float u, float v)
+{
+ float2 uv = map_uv(sub, u, v);
+ float3 P;
+
+ sub.patch->eval(&P, NULL, NULL, uv.x, uv.y);
+ if(camera)
+ P = transform(&camera->worldtoraster, P);
+
+ return P;
+}
+
+int QuadDice::add_vert(SubPatch& sub, float u, float v)
+{
+ return EdgeDice::add_vert(sub.patch, map_uv(sub, u, v));
+}
+
+void QuadDice::add_side_u(SubPatch& sub,
+ vector<int>& outer, vector<int>& inner,
+ int Mu, int Mv, int tu, int side, int offset)
+{
+ outer.clear();
+ inner.clear();
+
+ /* set verts on the edge of the patch */
+ outer.push_back(offset + ((side)? 2: 0));
+
+ for(int i = 1; i < tu; i++) {
+ float u = i/(float)tu;
+ float v = (side)? 1.0f: 0.0f;
+
+ outer.push_back(add_vert(sub, u, v));
+ }
+
+ outer.push_back(offset + ((side)? 3: 1));
+
+ /* set verts on the edge of the inner grid */
+ for(int i = 0; i < Mu-1; i++) {
+ int j = (side)? Mv-1-1: 0;
+ inner.push_back(offset + 4 + i + j*(Mu-1));
+ }
+}
+
+void QuadDice::add_side_v(SubPatch& sub,
+ vector<int>& outer, vector<int>& inner,
+ int Mu, int Mv, int tv, int side, int offset)
+{
+ outer.clear();
+ inner.clear();
+
+ /* set verts on the edge of the patch */
+ outer.push_back(offset + ((side)? 1: 0));
+
+ for(int j = 1; j < tv; j++) {
+ float u = (side)? 1.0f: 0.0f;
+ float v = j/(float)tv;
+
+ outer.push_back(add_vert(sub, u, v));
+ }
+
+ outer.push_back(offset + ((side)? 3: 2));
+
+ /* set verts on the edge of the inner grid */
+ for(int j = 0; j < Mv-1; j++) {
+ int i = (side)? Mu-1-1: 0;
+ inner.push_back(offset + 4 + i + j*(Mu-1));
+ }
+}
+
+float QuadDice::quad_area(const float3& a, const float3& b, const float3& c, const float3& d)
+{
+ return triangle_area(a, b, d) + triangle_area(a, d, c);
+}
+
+float QuadDice::scale_factor(SubPatch& sub, EdgeFactors& ef, int Mu, int Mv)
+{
+ /* estimate area as 4x largest of 4 quads */
+ float3 P[3][3];
+
+ for(int i = 0; i < 3; i++)
+ for(int j = 0; j < 3; j++)
+ P[i][j] = eval_projected(sub, i*0.5f, j*0.5f);
+
+ float A1 = quad_area(P[0][0], P[1][0], P[0][1], P[1][1]);
+ float A2 = quad_area(P[1][0], P[2][0], P[1][1], P[2][1]);
+ float A3 = quad_area(P[0][1], P[1][1], P[0][2], P[1][2]);
+ float A4 = quad_area(P[1][1], P[2][1], P[1][2], P[2][2]);
+ float Apatch = max(A1, max(A2, max(A3, A4)))*4.0f;
+
+ /* solve for scaling factor */
+ float Atri = dicing_rate*dicing_rate*0.5f;
+ float Ntris = Apatch/Atri;
+
+ // XXX does the -sqrt solution matter
+ // XXX max(D, 0.0) is highly suspicious, need to test cases
+ // where D goes negative
+ float N = 0.5f*(Ntris - (ef.tu0 + ef.tu1 + ef.tv0 + ef.tv1));
+ float D = 4.0f*N*Mu*Mv + (Mu + Mv)*(Mu + Mv);
+ float S = (Mu + Mv + sqrtf(max(D, 0.0f)))/(2*Mu*Mv);
+
+ return S;
+}
+
+void QuadDice::add_corners(SubPatch& sub)
+{
+ /* add verts for patch corners */
+ if(sub.patch->is_triangle()) {
+ add_vert(sub, 0.0f, 0.0f);
+ add_vert(sub, 1.0f, 0.0f);
+ add_vert(sub, 0.0f, 1.0f);
+ }
+ else {
+ add_vert(sub, 0.0f, 0.0f);
+ add_vert(sub, 1.0f, 0.0f);
+ add_vert(sub, 0.0f, 1.0f);
+ add_vert(sub, 1.0f, 1.0f);
+ }
+}
+
+void QuadDice::add_grid(SubPatch& sub, int Mu, int Mv, int offset)
+{
+ /* create inner grid */
+ float du = 1.0f/(float)Mu;
+ float dv = 1.0f/(float)Mv;
+
+ for(int j = 1; j < Mv; j++) {
+ for(int i = 1; i < Mu; i++) {
+ float u = i*du;
+ float v = j*dv;
+
+ add_vert(sub, u, v);
+
+ if(i < Mu-1 && j < Mv-1) {
+ int i1 = offset + 4 + (i-1) + (j-1)*(Mu-1);
+ int i2 = offset + 4 + i + (j-1)*(Mu-1);
+ int i3 = offset + 4 + i + j*(Mu-1);
+ int i4 = offset + 4 + (i-1) + j*(Mu-1);
+
+ add_triangle(i1, i2, i3);
+ add_triangle(i1, i3, i4);
+ }
+ }
+ }
+}
+
+void QuadDice::dice(SubPatch& sub, EdgeFactors& ef)
+{
+ /* compute inner grid size with scale factor */
+ int Mu = max(ef.tu0, ef.tu1);
+ int Mv = max(ef.tv0, ef.tv1);
+
+ float S = scale_factor(sub, ef, Mu, Mv);
+ Mu = max((int)ceil(S*Mu), 2); // XXX handle 0 & 1?
+ Mv = max((int)ceil(S*Mv), 2); // XXX handle 0 & 1?
+
+ /* reserve space for new verts */
+ int offset = mesh->verts.size();
+ reserve(ef, Mu, Mv);
+
+ /* corners and inner grid */
+ add_corners(sub);
+ add_grid(sub, Mu, Mv, offset);
+
+ /* bottom side */
+ vector<int> outer, inner;
+
+ add_side_u(sub, outer, inner, Mu, Mv, ef.tu0, 0, offset);
+ stitch_triangles(outer, inner);
+
+ /* top side */
+ add_side_u(sub, outer, inner, Mu, Mv, ef.tu1, 1, offset);
+ stitch_triangles(inner, outer);
+
+ /* left side */
+ add_side_v(sub, outer, inner, Mu, Mv, ef.tv0, 0, offset);
+ stitch_triangles(inner, outer);
+
+ /* right side */
+ add_side_v(sub, outer, inner, Mu, Mv, ef.tv1, 1, offset);
+ stitch_triangles(outer, inner);
+
+ assert(vert_offset == mesh->verts.size());
+}
+
+/* TriangleDice */
+
+TriangleDice::TriangleDice(Mesh *mesh_, int shader_, bool smooth_, float dicing_rate_)
+: EdgeDice(mesh_, shader_, smooth_, dicing_rate_)
+{
+}
+
+void TriangleDice::reserve(EdgeFactors& ef, int M)
+{
+ int num_verts = ef.tu + ef.tv + ef.tw;
+
+ for(int m = M-2; m > 0; m -= 2)
+ num_verts += 3 + (m-1)*3;
+
+ if(!(M & 1))
+ num_verts++;
+
+ EdgeDice::reserve(num_verts, 0);
+}
+
+float2 TriangleDice::map_uv(SubPatch& sub, float2 uv)
+{
+ /* map UV from subpatch to patch parametric coordinates */
+ return uv.x*sub.Pu + uv.y*sub.Pv + (1.0f - uv.x - uv.y)*sub.Pw;
+}
+
+int TriangleDice::add_vert(SubPatch& sub, float2 uv)
+{
+ return EdgeDice::add_vert(sub.patch, map_uv(sub, uv));
+}
+
+void TriangleDice::add_grid(SubPatch& sub, EdgeFactors& ef, int M)
+{
+ // XXX normals are flipped, why?
+
+ /* grid is constructed starting from the outside edges, and adding
+ progressively smaller inner triangles that connected to the outer
+ one, until M = 1 or 2, the we fill up the last part. */
+ vector<int> outer_u, outer_v, outer_w;
+ int m;
+
+ /* add outer corners vertices */
+ {
+ float2 p_u = make_float2(1.0f, 0.0f);
+ float2 p_v = make_float2(0.0f, 1.0f);
+ float2 p_w = make_float2(0.0f, 0.0f);
+
+ int corner_u = add_vert(sub, p_u);
+ int corner_v = add_vert(sub, p_v);
+ int corner_w = add_vert(sub, p_w);
+
+ outer_u.push_back(corner_v);
+ outer_v.push_back(corner_w);
+ outer_w.push_back(corner_u);
+
+ for(int i = 1; i < ef.tu; i++)
+ outer_u.push_back(add_vert(sub, interp(p_v, p_w, i/(float)ef.tu)));
+ for(int i = 1; i < ef.tv; i++)
+ outer_v.push_back(add_vert(sub, interp(p_w, p_u, i/(float)ef.tv)));
+ for(int i = 1; i < ef.tw; i++)
+ outer_w.push_back(add_vert(sub, interp(p_u, p_v, i/(float)ef.tw)));
+
+ outer_u.push_back(corner_w);
+ outer_v.push_back(corner_u);
+ outer_w.push_back(corner_v);
+ }
+
+ for(m = M-2; m > 0; m -= 2) {
+ vector<int> inner_u, inner_v, inner_w;
+
+ float t = m/(float)M;
+ float2 center = make_float2(1.0f/3.0f, 1.0f/3.0f);
+
+ /* 3 corner vertices */
+ float2 p_u = interp(center, make_float2(1.0f, 0.0f), t);
+ float2 p_v = interp(center, make_float2(0.0f, 1.0f), t);
+ float2 p_w = interp(center, make_float2(0.0f, 0.0f), t);
+
+ int corner_u = add_vert(sub, p_u);
+ int corner_v = add_vert(sub, p_v);
+ int corner_w = add_vert(sub, p_w);
+
+ /* construct array of vertex indices for each side */
+ inner_u.push_back(corner_v);
+ inner_v.push_back(corner_w);
+ inner_w.push_back(corner_u);
+
+ for(int i = 1; i < m; i++) {
+ /* add vertices between corners */
+ float t = i/(float)m;
+
+ inner_u.push_back(add_vert(sub, interp(p_v, p_w, t)));
+ inner_v.push_back(add_vert(sub, interp(p_w, p_u, t)));
+ inner_w.push_back(add_vert(sub, interp(p_u, p_v, t)));
+ }
+
+ inner_u.push_back(corner_w);
+ inner_v.push_back(corner_u);
+ inner_w.push_back(corner_v);
+
+ /* stitch together inner/outer with triangles */
+ stitch_triangles(outer_u, inner_u);
+ stitch_triangles(outer_v, inner_v);
+ stitch_triangles(outer_w, inner_w);
+
+ outer_u = inner_u;
+ outer_v = inner_v;
+ outer_w = inner_w;
+ }
+
+ /* fill up last part */
+ if(m == -1) {
+ /* single triangle */
+ add_triangle(outer_w[0], outer_u[0], outer_v[0]);
+ }
+ else {
+ /* center vertex + 6 triangles */
+ int center = add_vert(sub, make_float2(1.0f/3.0f, 1.0f/3.0f));
+
+ add_triangle(outer_w[0], outer_w[1], center);
+ add_triangle(outer_w[1], outer_w[2], center);
+ add_triangle(outer_u[0], outer_u[1], center);
+ add_triangle(outer_u[1], outer_u[2], center);
+ add_triangle(outer_v[0], outer_v[1], center);
+ add_triangle(outer_v[1], outer_v[2], center);
+ }
+}
+
+void TriangleDice::dice(SubPatch& sub, EdgeFactors& ef)
+{
+ /* todo: handle 2 1 1 resolution */
+ int M = max(ef.tu, max(ef.tv, ef.tw));
+
+ reserve(ef, M);
+ add_grid(sub, ef, M);
+
+ assert(vert_offset == mesh->verts.size());
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/subd/subd_dice.h b/intern/cycles/subd/subd_dice.h
new file mode 100644
index 00000000000..71879f1f5f1
--- /dev/null
+++ b/intern/cycles/subd/subd_dice.h
@@ -0,0 +1,159 @@
+/*
+ * 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 __SUBD_DICE_H__
+#define __SUBD_DICE_H__
+
+/* DX11 like EdgeDice implementation, with different tesselation factors for
+ * each edge for watertight tesselation, with subpatch remapping to work with
+ * DiagSplit. For more algorithm details, see the DiagSplit paper or the
+ * ARB_tessellation_shader OpenGL extension, Section 2.X.2. */
+
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Camera;
+class Mesh;
+class Patch;
+
+/* EdgeDice Base */
+
+class EdgeDice {
+public:
+ Camera *camera;
+ Mesh *mesh;
+ float3 *mesh_P;
+ float3 *mesh_N;
+ float dicing_rate;
+ size_t vert_offset;
+ size_t tri_offset;
+ int shader;
+ bool smooth;
+
+ EdgeDice(Mesh *mesh, int shader, bool smooth, float dicing_rate);
+
+ void reserve(int num_verts, int num_tris);
+
+ int add_vert(Patch *patch, float2 uv);
+ void add_triangle(int v0, int v1, int v2);
+
+ void stitch_triangles(vector<int>& outer, vector<int>& inner);
+};
+
+/* Quad EdgeDice
+ *
+ * Edge tesselation factors and subpatch coordinates are as follows:
+ *
+ * tu1
+ * P01 --------- P11
+ * | |
+ * tv0 | | tv1
+ * | |
+ * P00 --------- P10
+ * tu0
+ */
+
+class QuadDice : public EdgeDice {
+public:
+ struct SubPatch {
+ Patch *patch;
+
+ float2 P00;
+ float2 P10;
+ float2 P01;
+ float2 P11;
+ };
+
+ struct EdgeFactors {
+ int tu0;
+ int tu1;
+ int tv0;
+ int tv1;
+ };
+
+ QuadDice(Mesh *mesh, int shader, bool smooth, float dicing_rate);
+
+ void reserve(EdgeFactors& ef, int Mu, int Mv);
+ float3 eval_projected(SubPatch& sub, float u, float v);
+
+ float2 map_uv(SubPatch& sub, float u, float v);
+ int add_vert(SubPatch& sub, float u, float v);
+
+ void add_corners(SubPatch& sub);
+ void add_grid(SubPatch& sub, int Mu, int Mv, int offset);
+
+ void add_side_u(SubPatch& sub,
+ vector<int>& outer, vector<int>& inner,
+ int Mu, int Mv, int tu, int side, int offset);
+
+ void add_side_v(SubPatch& sub,
+ vector<int>& outer, vector<int>& inner,
+ int Mu, int Mv, int tv, int side, int offset);
+
+ float quad_area(const float3& a, const float3& b, const float3& c, const float3& d);
+ float scale_factor(SubPatch& sub, EdgeFactors& ef, int Mu, int Mv);
+
+ void dice(SubPatch& sub, EdgeFactors& ef);
+};
+
+/* Triangle EdgeDice
+ *
+ * Edge tesselation factors and subpatch coordinates are as follows:
+ *
+ * Pw
+ * /\
+ * tv / \ tu
+ * / \
+ * / \
+ * Pu -------- Pv
+ * tw
+ */
+
+class TriangleDice : public EdgeDice {
+public:
+ struct SubPatch {
+ Patch *patch;
+
+ float2 Pu;
+ float2 Pv;
+ float2 Pw;
+ };
+
+ struct EdgeFactors {
+ int tu;
+ int tv;
+ int tw;
+ };
+
+ TriangleDice(Mesh *mesh, int shader, bool smooth, float dicing_rate);
+
+ void reserve(EdgeFactors& ef, int M);
+
+ float2 map_uv(SubPatch& sub, float2 uv);
+ int add_vert(SubPatch& sub, float2 uv);
+
+ void add_grid(SubPatch& sub, EdgeFactors& ef, int M);
+ void dice(SubPatch& sub, EdgeFactors& ef);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_DICE_H__ */
+
diff --git a/intern/cycles/subd/subd_edge.h b/intern/cycles/subd/subd_edge.h
new file mode 100644
index 00000000000..edf98c8a5a0
--- /dev/null
+++ b/intern/cycles/subd/subd_edge.h
@@ -0,0 +1,70 @@
+/*
+ * Original code in the public domain -- castanyo@yahoo.es
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SUBD_EDGE_H__
+#define __SUBD_EDGE_H__
+
+#include "subd_mesh.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Subd Half Edge */
+
+class SubdEdge
+{
+public:
+ int id;
+
+ SubdEdge *next;
+ SubdEdge *prev;
+ SubdEdge *pair;
+ SubdVert *vert;
+ SubdFace *face;
+
+ SubdEdge(int id_)
+ {
+ id = id_;
+ next = NULL;
+ prev = NULL;
+ pair = NULL;
+ vert = NULL;
+ face = NULL;
+ }
+
+ /* vertex queries */
+ SubdVert *from() { return vert; }
+ SubdVert *to() { return next->vert; }
+
+ /* face queries */
+ bool is_boundary() { return !(face && pair->face); }
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_EDGE_H__ */
+
diff --git a/intern/cycles/subd/subd_face.h b/intern/cycles/subd/subd_face.h
new file mode 100644
index 00000000000..8f8a9ec3f47
--- /dev/null
+++ b/intern/cycles/subd/subd_face.h
@@ -0,0 +1,109 @@
+/*
+ * Original code in the public domain -- castanyo@yahoo.es
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SUBD_FACE_H__
+#define __SUBD_FACE_H__
+
+#include "subd_edge.h"
+#include "subd_mesh.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Subd Face */
+
+class SubdFace
+{
+public:
+ int id;
+ SubdEdge *edge;
+
+ SubdFace(int id_)
+ {
+ id = id_;
+ edge = NULL;
+ }
+
+ bool contains(SubdEdge *e)
+ {
+ for(EdgeIterator it(edges()); !it.isDone(); it.advance())
+ if(it.current() == e)
+ return true;
+
+ return false;
+ }
+
+ int num_edges()
+ {
+ int num = 0;
+
+ for(EdgeIterator it(edges()); !it.isDone(); it.advance())
+ num++;
+
+ return num;
+ }
+
+ bool is_boundary()
+ {
+ for(EdgeIterator it(edges()); !it.isDone(); it.advance()) {
+ SubdEdge *edge = it.current();
+
+ if(edge->pair->face == NULL)
+ return true;
+ }
+
+ return false;
+ }
+
+ /* iterate over edges in clockwise order */
+ class EdgeIterator
+ {
+ public:
+ EdgeIterator(SubdEdge *e) : end(NULL), cur(e) { }
+
+ virtual void advance()
+ {
+ if (end == NULL) end = cur;
+ cur = cur->next;
+ }
+
+ virtual bool isDone() { return end == cur; }
+ virtual SubdEdge *current() { return cur; }
+
+ private:
+ SubdEdge *end;
+ SubdEdge *cur;
+ };
+
+ EdgeIterator edges() { return EdgeIterator(edge); }
+ EdgeIterator edges(SubdEdge *edge) { return EdgeIterator(edge); }
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_FACE_H__ */
+
diff --git a/intern/cycles/subd/subd_mesh.cpp b/intern/cycles/subd/subd_mesh.cpp
new file mode 100644
index 00000000000..8ed4854b786
--- /dev/null
+++ b/intern/cycles/subd/subd_mesh.cpp
@@ -0,0 +1,309 @@
+/*
+ * Original code in the public domain -- castanyo@yahoo.es
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+
+#include "subd_build.h"
+#include "subd_edge.h"
+#include "subd_face.h"
+#include "subd_mesh.h"
+#include "subd_patch.h"
+#include "subd_split.h"
+#include "subd_vert.h"
+
+#include "util_debug.h"
+#include "util_foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+SubdMesh::SubdMesh()
+{
+}
+
+SubdMesh::~SubdMesh()
+{
+ pair<Key, SubdEdge*> em;
+
+ foreach(SubdVert *vertex, verts)
+ delete vertex;
+ foreach(em, edge_map)
+ delete em.second;
+ foreach(SubdFace *face, faces)
+ delete face;
+
+ verts.clear();
+ edges.clear();
+ edge_map.clear();
+ faces.clear();
+}
+
+SubdVert *SubdMesh::add_vert(const float3& co)
+{
+ SubdVert *v = new SubdVert(verts.size());
+ v->co = co;
+ verts.push_back(v);
+
+ return v;
+}
+
+SubdFace *SubdMesh::add_face(int v0, int v1, int v2)
+{
+ int index[3] = {v0, v1, v2};
+ return add_face(index, 3);
+}
+
+SubdFace *SubdMesh::add_face(int v0, int v1, int v2, int v3)
+{
+ int index[4] = {v0, v1, v2, v3};
+ return add_face(index, 4);
+}
+
+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());
+ return NULL;
+ }
+
+ SubdFace *f = new SubdFace(faces.size());
+
+ SubdEdge *first_edge = NULL;
+ SubdEdge *last = NULL;
+ SubdEdge *current = NULL;
+
+ /* add edges */
+ for(int i = 0; i < num-1; i++) {
+ current = add_edge(index[i], index[i+1]);
+ assert(current != NULL);
+
+ current->face = f;
+
+ if(last != NULL) {
+ last->next = current;
+ current->prev = last;
+ }
+ else
+ first_edge = current;
+
+ last = current;
+ }
+
+ current = add_edge(index[num-1], index[0]);
+ assert(current != NULL);
+
+ current->face = f;
+
+ last->next = current;
+ current->prev = last;
+
+ current->next = first_edge;
+ first_edge->prev = current;
+
+ f->edge = first_edge;
+ faces.push_back(f);
+
+ return f;
+}
+
+bool SubdMesh::can_add_face(int *index, int num)
+{
+ /* manifold check */
+ for(int i = 0; i < num-1; i++)
+ if(!can_add_edge(index[i], index[i+1]))
+ return false;
+
+ return can_add_edge(index[num-1], index[0]);
+}
+
+bool SubdMesh::can_add_edge(int i, int j)
+{
+ /* check for degenerate edge */
+ if(i == j)
+ return false;
+
+ /* make sure edge has not been added yet. */
+ return find_edge(i, j) == NULL;
+}
+
+SubdEdge *SubdMesh::add_edge(int i, int j)
+{
+ SubdEdge *edge;
+
+ /* find pair */
+ SubdEdge *pair = find_edge(j, i);
+
+ if(pair != NULL) {
+ /* create edge with same id */
+ edge = new SubdEdge(pair->id + 1);
+
+ /* link edge pairs */
+ edge->pair = pair;
+ pair->pair = edge;
+
+ /* not sure this is necessary? */
+ pair->vert->edge = pair;
+ }
+ else {
+ /* create edge */
+ edge = new SubdEdge(2*edges.size());
+
+ /* add only unpaired edges */
+ edges.push_back(edge);
+ }
+
+ /* assign vertex and put into map */
+ edge->vert = verts[i];
+ edge_map[Key(i, j)] = edge;
+
+ /* face and next are set by add_face */
+
+ return edge;
+}
+
+SubdEdge *SubdMesh::find_edge(int i, int j)
+{
+ map<Key, SubdEdge*>::const_iterator it = edge_map.find(Key(i, j));
+
+ return (it == edge_map.end())? NULL: it->second;
+}
+
+bool SubdMesh::link_boundary()
+{
+ /* link boundary edges once the mesh has been created */
+ int num = 0;
+
+ /* create boundary edges */
+ int num_edges = edges.size();
+
+ for(int e = 0; e < num_edges; e++) {
+ SubdEdge *edge = edges[e];
+
+ if(edge->pair == NULL) {
+ SubdEdge *pair = new SubdEdge(edge->id + 1);
+
+ int i = edge->from()->id;
+ int j = edge->to()->id;
+
+ assert(edge_map.find(Key(j, i)) == edge_map.end());
+
+ pair->vert = verts[j];
+ edge_map[Key(j, i)] = pair;
+
+ edge->pair = pair;
+ pair->pair = edge;
+
+ num++;
+ }
+ }
+
+ /* link boundary edges */
+ for(int e = 0; e < num_edges; e++) {
+ SubdEdge *edge = edges[e];
+
+ if(edge->pair->face == NULL)
+ link_boundary_edge(edge->pair);
+ }
+
+ /* detect boundary intersections */
+ int boundaryIntersections = 0;
+ int num_verts = verts.size();
+
+ for(int v = 0; v < num_verts; v++) {
+ SubdVert *vertex = verts[v];
+
+ int boundarySubdEdges = 0;
+ for(SubdVert::EdgeIterator it(vertex->edges()); !it.isDone(); it.advance())
+ if(it.current()->is_boundary())
+ boundarySubdEdges++;
+
+ if(boundarySubdEdges > 2) {
+ assert((boundarySubdEdges & 1) == 0);
+ boundaryIntersections++;
+ }
+ }
+
+ if(boundaryIntersections != 0) {
+ fprintf(stderr, "Invalid mesh, boundary intersections found!\n");
+ return false;
+ }
+
+ return true;
+}
+
+void SubdMesh::link_boundary_edge(SubdEdge *edge)
+{
+ /* link this boundary edge. */
+
+ /* make sure next pointer has not been set. */
+ assert(edge->face == NULL);
+ assert(edge->next == NULL);
+
+ SubdEdge *next = edge;
+
+ while(next->pair->face != NULL) {
+ /* get pair prev */
+ SubdEdge *e = next->pair->next;
+
+ while(e->next != next->pair)
+ e = e->next;
+
+ next = e;
+ }
+
+ edge->next = next->pair;
+ next->pair->prev = edge;
+
+ /* adjust vertex edge, so that it's the boundary edge. (required for is_boundary()) */
+ if(edge->vert->edge != edge)
+ edge->vert->edge = edge;
+}
+
+void SubdMesh::tesselate(DiagSplit *split, bool linear, Mesh *mesh, int shader, bool smooth)
+{
+ SubdBuilder *builder = SubdBuilder::create(linear);
+ int num_faces = faces.size();
+
+ for(int f = 0; f < num_faces; f++) {
+ SubdFace *face = faces[f];
+ Patch *patch = builder->run(face);
+
+ if(patch->is_triangle())
+ split->split_triangle(mesh, patch, shader, smooth);
+ else
+ split->split_quad(mesh, patch, shader, smooth);
+
+ delete patch;
+ }
+
+ delete builder;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/subd/subd_mesh.h b/intern/cycles/subd/subd_mesh.h
new file mode 100644
index 00000000000..999d92d6daf
--- /dev/null
+++ b/intern/cycles/subd/subd_mesh.h
@@ -0,0 +1,90 @@
+/*
+ * Original code in the public domain -- castanyo@yahoo.es
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SUBD_MESH_H__
+#define __SUBD_MESH_H__
+
+#include "util_map.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class SubdFace;
+class SubdVert;
+class SubdEdge;
+
+class DiagSplit;
+class Mesh;
+
+/* Subd Mesh, half edge based for dynamic mesh manipulation */
+
+class SubdMesh
+{
+public:
+ vector<SubdVert*> verts;
+ vector<SubdEdge*> edges;
+ vector<SubdFace*> faces;
+
+ SubdMesh();
+ ~SubdMesh();
+
+ SubdVert *add_vert(const float3& co);
+
+ SubdFace *add_face(int v0, int v1, int v2);
+ SubdFace *add_face(int v0, int v1, int v2, int v3);
+ SubdFace *add_face(int *index, int num);
+
+ bool link_boundary();
+ void tesselate(DiagSplit *split, bool linear,
+ Mesh *mesh, int shader, bool smooth);
+
+protected:
+ bool can_add_face(int *index, int num);
+ bool can_add_edge(int i, int j);
+ SubdEdge *add_edge(int i, int j);
+ SubdEdge *find_edge(int i, int j);
+ void link_boundary_edge(SubdEdge *edge);
+
+ struct Key {
+ Key() {}
+ Key(int v0, int v1) : p0(v0), p1(v1) {}
+
+ bool operator<(const Key& k) const
+ { return (p0 < k.p0 || (p0 == k.p0 && p1 < k.p1)); }
+
+ int p0, p1;
+ };
+
+ map<Key, SubdEdge *> edge_map;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_MESH_H__ */
+
diff --git a/intern/cycles/subd/subd_patch.cpp b/intern/cycles/subd/subd_patch.cpp
new file mode 100644
index 00000000000..ff477296c7e
--- /dev/null
+++ b/intern/cycles/subd/subd_patch.cpp
@@ -0,0 +1,288 @@
+/*
+ * 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.
+ */
+
+/* Parts adapted from code in the public domain in NVidia Mesh Tools. */
+
+#include "mesh.h"
+
+#include "subd_patch.h"
+
+#include "util_math.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* De Casteljau Evaluation */
+
+static float3 decasteljau_quadratic(float t, const float3 cp[3])
+{
+ float3 d0 = cp[0] + t*(cp[1] - cp[0]);
+ float3 d1 = cp[1] + t*(cp[2] - cp[1]);
+
+ return d0 + t*(d1 - d0);
+}
+
+static void decasteljau_cubic(float3 *P, float3 *dt, float t, const float3 cp[4])
+{
+ float3 d0 = cp[0] + t*(cp[1] - cp[0]);
+ float3 d1 = cp[1] + t*(cp[2] - cp[1]);
+ float3 d2 = cp[2] + t*(cp[3] - cp[2]);
+
+ d0 += t*(d1 - d0);
+ d1 += t*(d2 - d1);
+
+ *P = d0 + t*(d1 - d0);
+ if(dt) *dt = d1 - d0;
+}
+
+static void decasteljau_bicubic(float3 *P, float3 *du, float3 *dv, const float3 cp[16], float u, float v)
+{
+ float3 ucp[4], utn[4];
+
+ /* interpolate over u */
+ decasteljau_cubic(ucp+0, utn+0, u, cp);
+ decasteljau_cubic(ucp+1, utn+1, u, cp+4);
+ decasteljau_cubic(ucp+2, utn+2, u, cp+8);
+ decasteljau_cubic(ucp+3, utn+3, u, cp+12);
+
+ /* interpolate over v */
+ decasteljau_cubic(P, dv, v, ucp);
+ if(du) decasteljau_cubic(du, NULL, v, utn);
+}
+
+static float3 decasteljau_tangent(const float3 cp[12], float u, float v)
+{
+ float3 ucp[3];
+
+ decasteljau_cubic(ucp+0, NULL, v, cp);
+ decasteljau_cubic(ucp+1, NULL, v, cp+4);
+ decasteljau_cubic(ucp+2, NULL, v, cp+8);
+
+ return decasteljau_quadratic(u, ucp);
+}
+
+/* Linear Quad Patch */
+
+void LinearQuadPatch::eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v)
+{
+ float3 d0 = interp(hull[0], hull[1], u);
+ float3 d1 = interp(hull[2], hull[3], u);
+
+ *P = interp(d0, d1, v);
+
+ if(dPdu && dPdv) {
+ *dPdu = interp(hull[1] - hull[0], hull[3] - hull[2], v);
+ *dPdv = interp(hull[2] - hull[0], hull[3] - hull[1], u);
+ }
+}
+
+BoundBox LinearQuadPatch::bound()
+{
+ BoundBox bbox;
+
+ for(int i = 0; i < 4; i++)
+ bbox.grow(hull[i]);
+
+ return bbox;
+}
+
+/* Linear Triangle Patch */
+
+void LinearTrianglePatch::eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v)
+{
+ *P = u*hull[0] + v*hull[1] + (1.0f - u - v)*hull[2];
+
+ if(dPdu && dPdv) {
+ *dPdu = hull[0] - hull[2];
+ *dPdv = hull[1] - hull[2];
+ }
+}
+
+BoundBox LinearTrianglePatch::bound()
+{
+ BoundBox bbox;
+
+ for(int i = 0; i < 3; i++)
+ bbox.grow(hull[i]);
+
+ return bbox;
+}
+
+/* Bicubic Patch */
+
+void BicubicPatch::eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v)
+{
+ decasteljau_bicubic(P, dPdu, dPdv, hull, u, v);
+}
+
+BoundBox BicubicPatch::bound()
+{
+ BoundBox bbox;
+
+ for(int i = 0; i < 16; i++)
+ bbox.grow(hull[i]);
+
+ return bbox;
+}
+
+/* Bicubic Patch with Tangent Fields */
+
+void BicubicTangentPatch::eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v)
+{
+ decasteljau_bicubic(P, NULL, NULL, hull, u, v);
+
+ if(dPdu) *dPdu = decasteljau_tangent(utan, u, v);
+ if(dPdv) *dPdv = decasteljau_tangent(vtan, v, u);
+}
+
+BoundBox BicubicTangentPatch::bound()
+{
+ BoundBox bbox;
+
+ for(int i = 0; i < 16; i++)
+ bbox.grow(hull[i]);
+
+ return bbox;
+}
+
+/* Gregory Patch */
+
+static float no_zero_div(float f)
+{
+ if(f == 0.0f) return 1.0f;
+ return f;
+}
+
+void GregoryQuadPatch::eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v)
+{
+ float3 bicubic[16];
+
+ float U = 1 - u;
+ float V = 1 - v;
+
+ /* 8 9 10 11
+ * 12 0\1 2/3 13
+ * 14 4/5 6\7 15
+ * 16 17 18 19
+ */
+
+ bicubic[5] = (u*hull[1] + v*hull[0])/no_zero_div(u + v);
+ bicubic[6] = (U*hull[2] + v*hull[3])/no_zero_div(U + v);
+ bicubic[9] = (u*hull[5] + V*hull[4])/no_zero_div(u + V);
+ bicubic[10] = (U*hull[6] + V*hull[7])/no_zero_div(U + V);
+
+ // Map gregory control points to bezier control points.
+ bicubic[0] = hull[8];
+ bicubic[1] = hull[9];
+ bicubic[2] = hull[10];
+ bicubic[3] = hull[11];
+ bicubic[4] = hull[12];
+ bicubic[7] = hull[13];
+ bicubic[8] = hull[14];
+ bicubic[11] = hull[15];
+ bicubic[12] = hull[16];
+ bicubic[13] = hull[17];
+ bicubic[14] = hull[18];
+ bicubic[15] = hull[19];
+
+ decasteljau_bicubic(P, dPdu, dPdv, bicubic, u, v);
+}
+
+BoundBox GregoryQuadPatch::bound()
+{
+ BoundBox bbox;
+
+ for(int i = 0; i < 20; i++)
+ bbox.grow(hull[i]);
+
+ return bbox;
+}
+
+void GregoryTrianglePatch::eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v)
+{
+ /* 6
+ *
+ * 14 0/1 7
+ *
+ * 13 5/4 3\2 8
+ *
+ * 12 11 10 9
+ */
+
+ float w = 1 - u - v;
+ float uu = u * u;
+ float vv = v * v;
+ float ww = w * w;
+ float uuu = uu * u;
+ float vvv = vv * v;
+ float www = ww * w;
+
+ float U = 1 - u;
+ float V = 1 - v;
+ float W = 1 - w;
+
+ float3 C0 = ( v*U * hull[5] + u*V * hull[4] ) / no_zero_div(v*U + u*V);
+ float3 C1 = ( w*V * hull[3] + v*W * hull[2] ) / no_zero_div(w*V + v*W);
+ float3 C2 = ( u*W * hull[1] + w*U * hull[0] ) / no_zero_div(u*W + w*U);
+
+ *P =
+ (hull[12] * www + 3*hull[11] * ww*u + 3*hull[10] * w*uu + hull[ 9]*uuu) * (w + u) +
+ (hull[ 9] * uuu + 3*hull[ 8] * uu*v + 3*hull[ 7] * u*vv + hull[ 6]*vvv) * (u + v) +
+ (hull[ 6] * vvv + 3*hull[14] * vv*w + 3*hull[13] * v*ww + hull[12]*www) * (v + w) -
+ (hull[12] * www*w + hull[ 9] * uuu*u + hull[ 6] * vvv*v) +
+ 12*(C0 * u*v*ww + C1 * uu*v*w + C2 * u*vv*w);
+
+ if(dPdu || dPdv) {
+ float3 E1 = (hull[12]*www + 3*hull[11]*ww*u + 3*hull[10]*w*uu + hull[ 9]*uuu);
+ float3 E2 = (hull[ 9]*uuu + 3*hull[ 8]*uu*v + 3*hull[ 7]*u*vv + hull[ 6]*vvv);
+ float3 E3 = (hull[ 6]*vvv + 3*hull[14]*vv*w + 3*hull[13]*v*ww + hull[12]*www);
+
+ if(dPdu) {
+ float3 E1u = 3*( - hull[12]*ww + hull[11]*(ww-2*u*w) + hull[10]*(2*u*w-uu) + hull[ 9]*uu);
+ float3 E2u = 3*( hull[ 9]*uu + 2*hull[ 8]*u*v + hull[ 7]*vv );
+ float3 E3u = 3*( - hull[14]*vv - 2*hull[13]*v*w - hull[12]*ww);
+ float3 Su = 4*( -hull[12]*www + hull[9]*uuu);
+ float3 Cu = 12*( C0*(ww*v-2*u*v*w) + C1*(2*u*v*w-uu*v) + C2*vv*(w-u) );
+
+ *dPdu = E1u*(w+u) + (E2+E2u*(u+v)) + (E3u*(v+w)-E3) - Su + Cu;
+ }
+
+ if(dPdv) {
+ float3 E1v = 3*(-hull[12]*ww - 2*hull[11]*w*u - hull[10]*uu );
+ float3 E2v = 3*( hull[ 8]*uu + 2*hull[ 7]*u*v + hull[ 6]*vv);
+ float3 E3v = 3*( hull[ 6]*vv + hull[14]*(2*w*v-vv) + hull[13]*(ww-2*w*v) - hull[12]*ww);
+ float3 Sv = 4*(-hull[12]*www + hull[ 6]*vvv);
+ float3 Cv = 12*(C0*(u*ww-2*u*v*w) + C1*uu*(w-v) + C2*(2*u*v*w-u*vv));
+
+ *dPdv = ((E1v*(w+u)-E1) + (E2+E2v*(u+v)) + E3v*(v+w) - Sv + Cv );
+ }
+ }
+}
+
+BoundBox GregoryTrianglePatch::bound()
+{
+ BoundBox bbox;
+
+ for(int i = 0; i < 20; i++)
+ bbox.grow(hull[i]);
+
+ return bbox;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/subd/subd_patch.h b/intern/cycles/subd/subd_patch.h
new file mode 100644
index 00000000000..ac2317f4359
--- /dev/null
+++ b/intern/cycles/subd/subd_patch.h
@@ -0,0 +1,108 @@
+/*
+ * 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 __SUBD_PATCH_H__
+#define __SUBD_PATCH_H__
+
+#include "util_boundbox.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Mesh;
+
+/* Base */
+
+class Patch {
+public:
+ virtual ~Patch() {}
+ virtual void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v) = 0;
+ virtual bool is_triangle() = 0;
+ virtual BoundBox bound() = 0;
+};
+
+/* Linear Quad Patch */
+
+class LinearQuadPatch : public Patch {
+public:
+ float3 hull[4];
+
+ void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v);
+ bool is_triangle() { return false; }
+ BoundBox bound();
+};
+
+/* Linear Triangle Patch */
+
+class LinearTrianglePatch : public Patch {
+public:
+ float3 hull[3];
+
+ void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v);
+ bool is_triangle() { return true; }
+ BoundBox bound();
+};
+
+/* Bicubic Patch */
+
+class BicubicPatch : public Patch {
+public:
+ float3 hull[16];
+
+ void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v);
+ bool is_triangle() { return false; }
+ BoundBox bound();
+};
+
+/* Bicubic Patch with Tangent Fields */
+
+class BicubicTangentPatch : public Patch {
+public:
+ float3 hull[16];
+ float3 utan[12];
+ float3 vtan[12];
+
+ void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v);
+ bool is_triangle() { return false; }
+ BoundBox bound();
+};
+
+/* Gregory Patches */
+
+class GregoryQuadPatch : public Patch {
+public:
+ float3 hull[20];
+
+ void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v);
+ bool is_triangle() { return false; }
+ BoundBox bound();
+};
+
+class GregoryTrianglePatch : public Patch {
+public:
+ float3 hull[20];
+
+ void eval(float3 *P, float3 *dPdu, float3 *dPdv, float u, float v);
+ bool is_triangle() { return true; }
+ BoundBox bound();
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_PATCH_H__ */
+
diff --git a/intern/cycles/subd/subd_ring.cpp b/intern/cycles/subd/subd_ring.cpp
new file mode 100644
index 00000000000..cbd12e60da0
--- /dev/null
+++ b/intern/cycles/subd/subd_ring.cpp
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2006, NVIDIA Corporation Ignacio Castano <icastano@nvidia.com>
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "subd_face.h"
+#include "subd_ring.h"
+#include "subd_stencil.h"
+#include "subd_vert.h"
+
+#include "util_algorithm.h"
+#include "util_debug.h"
+#include "util_math.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Utility for sorting verts by index */
+
+class vertex_compare
+{
+public:
+ const vector<int>& index;
+ vertex_compare(const vector<int>& index_) : index(index_) {}
+ bool operator()(int a, int b) const { return index[a] < index[b]; }
+};
+
+/* Subd Face Ring */
+
+SubdFaceRing::SubdFaceRing(SubdFace *face, SubdEdge *firstEdge)
+{
+ m_face = face;
+ m_firstEdge = firstEdge;
+ m_num_edges = face->num_edges();
+
+ assert(m_num_edges == 3 || m_num_edges == 4);
+
+ initVerts();
+}
+
+int SubdFaceRing::num_verts()
+{
+ return m_verts.size();
+}
+
+SubdVert *SubdFaceRing::vertexAt(int i)
+{
+ return m_verts[i];
+}
+
+int SubdFaceRing::vert_index(SubdVert *vertex)
+{
+ int count = this->num_verts();
+
+ for(int i = 0; i < count; i++)
+ if(m_verts[i] == vertex)
+ return i;
+
+ assert(0);
+ return 0;
+}
+
+void SubdFaceRing::evaluate_stencils(float3 *P, StencilMask *mask, int num)
+{
+ /* first we sort verts by id. this way verts will always be added
+ in the same order to ensure the exact same float ops happen for control
+ points of other patches, so we get water-tight patches */
+ int num_verts = m_verts.size();
+
+ vector<int> vmap(num_verts);
+ vector<int> vertid(num_verts);
+
+ for(int v = 0; v < num_verts; v++) {
+ vmap[v] = v;
+ vertid[v] = m_verts[v]->id;
+ }
+
+ sort(vmap.begin(), vmap.end(), vertex_compare(vertid));
+
+ /* then evaluate the stencils */
+ for(int j = 0; j < num; j++) {
+ float3 p = make_float3(0.0f, 0.0f, 0.0f);
+
+ for(int i = 0; i < num_verts; i++) {
+ int idx = vmap[i];
+ p += m_verts[idx]->co * mask[j][idx];
+ }
+
+ P[j] = p;
+ }
+}
+
+bool SubdFaceRing::is_triangle()
+{
+ return m_num_edges == 3;
+}
+
+bool SubdFaceRing::is_quad()
+{
+ return m_num_edges == 4;
+}
+
+int SubdFaceRing::num_edges()
+{
+ return m_num_edges;
+}
+
+bool SubdFaceRing::is_regular(SubdFace *face)
+{
+ if(!is_quad(face))
+ return false;
+
+ for(SubdFace::EdgeIterator it(face->edges()); !it.isDone(); it.advance()) {
+ SubdEdge *edge = it.current();
+
+ /* regular faces don't have boundary edges */
+ if(edge->is_boundary())
+ return false;
+
+ /* regular faces only have ordinary verts */
+ if(edge->vert->valence() != 4)
+ return false;
+
+ /* regular faces are only adjacent to quads */
+ for(SubdVert::EdgeIterator eit(edge); !eit.isDone(); eit.advance())
+ if(eit.current()->face == NULL || eit.current()->face->num_edges() != 4)
+ return false;
+ }
+
+ return true;
+}
+
+bool SubdFaceRing::is_triangle(SubdFace *face)
+{
+ return face->num_edges() == 3;
+}
+bool SubdFaceRing::is_quad(SubdFace *face)
+{
+ return face->num_edges() == 4;
+}
+
+bool SubdFaceRing::is_boundary(SubdFace *face)
+{
+ /* note that face->is_boundary() returns a different result. That function
+ returns true when any of the *edges* are on the boundary. however, this
+ function returns true if any of the face *verts* are on the boundary. */
+
+ for(SubdFace::EdgeIterator it(face->edges()); !it.isDone(); it.advance()) {
+ SubdEdge *edge = it.current();
+
+ if(edge->vert->is_boundary())
+ return true;
+ }
+
+ return false;
+}
+
+void SubdFaceRing::initVerts()
+{
+ m_verts.reserve(16);
+
+ /* add face verts */
+ for(SubdFace::EdgeIterator it(m_firstEdge); !it.isDone(); it.advance()) {
+ SubdEdge *edge = it.current();
+ m_verts.push_back(edge->from());
+ }
+
+ // @@ Add support for non manifold surfaces!
+ // The fix:
+ // - not all colocals should point to the same edge.
+ // - multiple colocals could belong to different boundaries, make sure they point to the right one.
+
+ // @@ When the face neighborhood wraps that could result in overlapping stencils.
+
+ // Add surronding verts.
+ for(SubdFace::EdgeIterator it(m_firstEdge); !it.isDone(); it.advance()) {
+ SubdEdge *firstEdge = it.current();
+
+ int i = 0;
+
+ /* traverse edges around vertex */
+ for(SubdVert::ReverseEdgeIterator eit(firstEdge); !eit.isDone(); eit.advance(), i++) {
+ SubdEdge *edge = eit.current();
+
+ assert(edge->from()->co == firstEdge->from()->co);
+
+ add_vert(edge->to());
+
+ if(edge->face != NULL)
+ add_vert(edge->next->to());
+ }
+
+ assert(i == firstEdge->from()->valence());
+ }
+}
+
+
+void SubdFaceRing::add_vert(SubdVert *vertex)
+{
+ /* avoid having duplicate verts */
+ if(!has_vert(vertex))
+ m_verts.push_back(vertex);
+}
+
+bool SubdFaceRing::has_vert(SubdVert *vertex)
+{
+ int num_verts = m_verts.size();
+
+ for(int i = 0; i < num_verts; i++)
+ if(m_verts[i]->co == vertex->co)
+ return true;
+
+ return false;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/subd/subd_ring.h b/intern/cycles/subd/subd_ring.h
new file mode 100644
index 00000000000..f25342233b0
--- /dev/null
+++ b/intern/cycles/subd/subd_ring.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2006, NVIDIA Corporation Ignacio Castano <icastano@nvidia.com>
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef __SUBD_FACE_RING_H__
+#define __SUBD_FACE_RING_H__
+
+CCL_NAMESPACE_BEGIN
+
+class StencilMask;
+class SubdVert;
+class SubdEdge;
+class SubdFace;
+
+class SubdFaceRing
+{
+public:
+ SubdFaceRing(SubdFace *face, SubdEdge *edge);
+
+ SubdFace *face() { return m_face; }
+ SubdEdge *firstEdge() { return m_firstEdge; }
+
+ int num_verts();
+ SubdVert *vertexAt(int i);
+ int vert_index(SubdVert *vertex);
+
+ void evaluate_stencils(float3 *P, StencilMask *mask, int num);
+
+ bool is_triangle();
+ bool is_quad();
+ int num_edges();
+
+ static bool is_regular(SubdFace *face);
+ static bool is_triangle(SubdFace *face);
+ static bool is_quad(SubdFace *face);
+ static bool is_boundary(SubdFace *face);
+
+protected:
+ void initVerts();
+ void add_vert(SubdVert *vertex);
+ bool has_vert(SubdVert *vertex);
+
+protected:
+ SubdFace *m_face;
+ SubdEdge *m_firstEdge;
+
+ int m_num_edges;
+ vector<SubdVert*> m_verts;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_FACE_RING_H__ */
+
diff --git a/intern/cycles/subd/subd_split.cpp b/intern/cycles/subd/subd_split.cpp
new file mode 100644
index 00000000000..d61a42e4dcf
--- /dev/null
+++ b/intern/cycles/subd/subd_split.cpp
@@ -0,0 +1,325 @@
+/*
+ * 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 "camera.h"
+#include "mesh.h"
+
+#include "subd_dice.h"
+#include "subd_patch.h"
+#include "subd_split.h"
+
+#include "util_debug.h"
+#include "util_math.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* DiagSplit */
+
+DiagSplit::DiagSplit()
+{
+ test_steps = 3;
+ split_threshold = 1;
+ dicing_rate = 0.1f;
+ camera = NULL;
+}
+
+void DiagSplit::dispatch(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef)
+{
+ subpatches_quad.push_back(sub);
+ edgefactors_quad.push_back(ef);
+}
+
+void DiagSplit::dispatch(TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef)
+{
+ subpatches_triangle.push_back(sub);
+ edgefactors_triangle.push_back(ef);
+}
+
+float3 DiagSplit::project(Patch *patch, float2 uv)
+{
+ float3 P;
+
+ patch->eval(&P, NULL, NULL, uv.x, uv.y);
+ if(camera)
+ P = transform(&camera->worldtoraster, P);
+
+ return P;
+}
+
+int DiagSplit::T(Patch *patch, float2 Pstart, float2 Pend)
+{
+ float3 Plast = make_float3(0.0f, 0.0f, 0.0f);
+ float Lsum = 0.0f;
+ float Lmax = 0.0f;
+
+ for(int i = 0; i < test_steps; i++) {
+ float t = i/(float)(test_steps-1);
+
+ float3 P = project(patch, Pstart + t*(Pend - Pstart));
+
+ if(i > 0) {
+ float L = len(P - Plast);
+ Lsum += L;
+ Lmax = max(L, Lmax);
+ }
+
+ Plast = P;
+ }
+
+ int tmin = (int)ceil(Lsum/dicing_rate);
+ int tmax = (int)ceil((test_steps-1)*Lmax/dicing_rate); // XXX paper says N instead of N-1, seems wrong?
+
+ if(tmax - tmin > split_threshold)
+ return DSPLIT_NON_UNIFORM;
+
+ return tmax;
+}
+
+void DiagSplit::partition_edge(Patch *patch, float2 *P, int *t0, int *t1, float2 Pstart, float2 Pend, int t)
+{
+ if(t == DSPLIT_NON_UNIFORM) {
+ *P = (Pstart + Pend)*0.5f;
+ *t0 = T(patch, Pstart, *P);
+ *t1 = T(patch, *P, Pend);
+ }
+ else {
+ int I = floor(t*0.5f);
+ *P = interp(Pstart, Pend, (t == 0)? 0: I/(float)t); /* XXX is t faces or verts */
+ *t0 = I;
+ *t1 = t - I;
+ }
+}
+
+void DiagSplit::split(TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef, int depth)
+{
+ assert(ef.tu == T(sub.patch, sub.Pv, sub.Pw));
+ assert(ef.tv == T(sub.patch, sub.Pw, sub.Pu));
+ assert(ef.tw == T(sub.patch, sub.Pu, sub.Pv));
+
+ if(depth == 0) {
+ dispatch(sub, ef);
+ return;
+ }
+
+ if(ef.tu == DSPLIT_NON_UNIFORM) {
+ /* partition edges */
+ TriangleDice::EdgeFactors ef0, ef1;
+ float2 Psplit;
+
+ partition_edge(sub.patch,
+ &Psplit, &ef1.tu, &ef0.tu, sub.Pv, sub.Pw, ef.tu);
+
+ /* split */
+ int tsplit = T(sub.patch, sub.Pu, Psplit);
+ ef0.tv = ef.tv;
+ ef0.tw = tsplit;
+
+ ef1.tv = tsplit;
+ ef1.tw = ef.tw;
+
+ /* create subpatches */
+ TriangleDice::SubPatch sub0 = {sub.patch, sub.Pu, Psplit, sub.Pw};
+ TriangleDice::SubPatch sub1 = {sub.patch, sub.Pu, sub.Pv, Psplit};
+
+ split(sub0, ef0, depth+1);
+ split(sub1, ef1, depth+1);
+ }
+ else if(ef.tv == DSPLIT_NON_UNIFORM) {
+ /* partition edges */
+ TriangleDice::EdgeFactors ef0, ef1;
+ float2 Psplit;
+
+ partition_edge(sub.patch,
+ &Psplit, &ef1.tu, &ef0.tu, sub.Pw, sub.Pu, ef.tv);
+
+ /* split */
+ int tsplit = T(sub.patch, sub.Pv, Psplit);
+ ef0.tv = ef.tw;
+ ef0.tw = tsplit;
+
+ ef1.tv = tsplit;
+ ef1.tw = ef.tu;
+
+ /* create subpatches */
+ TriangleDice::SubPatch sub0 = {sub.patch, sub.Pv, Psplit, sub.Pu};
+ TriangleDice::SubPatch sub1 = {sub.patch, sub.Pv, sub.Pw, Psplit};
+
+ split(sub0, ef0, depth+1);
+ split(sub1, ef1, depth+1);
+ }
+ else if(ef.tw == DSPLIT_NON_UNIFORM) {
+ /* partition edges */
+ TriangleDice::EdgeFactors ef0, ef1;
+ float2 Psplit;
+
+ partition_edge(sub.patch,
+ &Psplit, &ef1.tu, &ef0.tu, sub.Pu, sub.Pv, ef.tw);
+
+ /* split */
+ int tsplit = T(sub.patch, sub.Pw, Psplit);
+ ef0.tv = ef.tu;
+ ef0.tw = tsplit;
+
+ ef1.tv = tsplit;
+ ef1.tw = ef.tv;
+
+ /* create subpatches */
+ TriangleDice::SubPatch sub0 = {sub.patch, sub.Pw, Psplit, sub.Pv};
+ TriangleDice::SubPatch sub1 = {sub.patch, sub.Pw, sub.Pu, Psplit};
+
+ split(sub0, ef0, depth+1);
+ split(sub1, ef1, depth+1);
+ }
+ else
+ dispatch(sub, ef);
+}
+
+void DiagSplit::split(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef, int depth)
+{
+ if((ef.tu0 == DSPLIT_NON_UNIFORM || ef.tu1 == DSPLIT_NON_UNIFORM)) {
+ /* partition edges */
+ QuadDice::EdgeFactors ef0, ef1;
+ float2 Pu0, Pu1;
+
+ partition_edge(sub.patch,
+ &Pu0, &ef0.tu0, &ef1.tu0, sub.P00, sub.P10, ef.tu0);
+ partition_edge(sub.patch,
+ &Pu1, &ef0.tu1, &ef1.tu1, sub.P01, sub.P11, ef.tu1);
+
+ /* split */
+ int tsplit = T(sub.patch, Pu0, Pu1);
+ ef0.tv0 = ef.tv0;
+ ef0.tv1 = tsplit;
+
+ ef1.tv0 = tsplit;
+ ef1.tv1 = ef.tv1;
+
+ /* create subpatches */
+ QuadDice::SubPatch sub0 = {sub.patch, sub.P00, Pu0, sub.P01, Pu1};
+ QuadDice::SubPatch sub1 = {sub.patch, Pu0, sub.P10, Pu1, sub.P11};
+
+ split(sub0, ef0, depth+1);
+ split(sub1, ef1, depth+1);
+ }
+ else if(ef.tv0 == DSPLIT_NON_UNIFORM || ef.tv1 == DSPLIT_NON_UNIFORM) {
+ /* partition edges */
+ QuadDice::EdgeFactors ef0, ef1;
+ float2 Pv0, Pv1;
+
+ partition_edge(sub.patch,
+ &Pv0, &ef0.tv0, &ef1.tv0, sub.P00, sub.P01, ef.tv0);
+ partition_edge(sub.patch,
+ &Pv1, &ef0.tv1, &ef1.tv1, sub.P10, sub.P11, ef.tv1);
+
+ /* split */
+ int tsplit = T(sub.patch, Pv0, Pv1);
+ ef0.tu0 = ef.tu0;
+ ef0.tu1 = tsplit;
+
+ ef1.tu0 = tsplit;
+ ef1.tu1 = ef.tu1;
+
+ /* create subpatches */
+ QuadDice::SubPatch sub0 = {sub.patch, sub.P00, sub.P10, Pv0, Pv1};
+ QuadDice::SubPatch sub1 = {sub.patch, Pv0, Pv1, sub.P01, sub.P11};
+
+ split(sub0, ef0, depth+1);
+ split(sub1, ef1, depth+1);
+ }
+ else
+ dispatch(sub, ef);
+}
+
+void DiagSplit::split_triangle(Mesh *mesh, Patch *patch, int shader, bool smooth)
+{
+ TriangleDice::SubPatch sub;
+ TriangleDice::EdgeFactors ef;
+
+ sub.patch = patch;
+ sub.Pu = make_float2(1.0f, 0.0f);
+ sub.Pv = make_float2(0.0f, 1.0f);
+ sub.Pw = make_float2(0.0f, 0.0f);
+
+ ef.tu = T(patch, sub.Pv, sub.Pw);
+ ef.tv = T(patch, sub.Pw, sub.Pu);
+ ef.tw = T(patch, sub.Pu, sub.Pv);
+
+ split(sub, ef);
+
+ TriangleDice dice(mesh, shader, smooth, dicing_rate);
+ dice.camera = camera;
+
+ for(size_t i = 0; i < subpatches_triangle.size(); i++) {
+ TriangleDice::SubPatch& sub = subpatches_triangle[i];
+ TriangleDice::EdgeFactors& ef = edgefactors_triangle[i];
+
+ ef.tu = 4;
+ ef.tv = 4;
+ ef.tw = 4;
+
+ ef.tu = max(ef.tu, 1);
+ ef.tv = max(ef.tv, 1);
+ ef.tw = max(ef.tw, 1);
+
+ dice.dice(sub, ef);
+ }
+
+ subpatches_triangle.clear();
+ edgefactors_triangle.clear();
+}
+
+void DiagSplit::split_quad(Mesh *mesh, Patch *patch, int shader, bool smooth)
+{
+ QuadDice::SubPatch sub;
+ QuadDice::EdgeFactors ef;
+
+ sub.patch = patch;
+ sub.P00 = make_float2(0.0f, 0.0f);
+ sub.P10 = make_float2(1.0f, 0.0f);
+ sub.P01 = make_float2(0.0f, 1.0f);
+ sub.P11 = make_float2(1.0f, 1.0f);
+
+ ef.tu0 = T(patch, sub.P00, sub.P10);
+ ef.tu1 = T(patch, sub.P01, sub.P11);
+ ef.tv0 = T(patch, sub.P00, sub.P01);
+ ef.tv1 = T(patch, sub.P10, sub.P11);
+
+ split(sub, ef);
+
+ QuadDice dice(mesh, shader, smooth, dicing_rate);
+ dice.camera = camera;
+
+ for(size_t i = 0; i < subpatches_quad.size(); i++) {
+ QuadDice::SubPatch& sub = subpatches_quad[i];
+ QuadDice::EdgeFactors& ef = edgefactors_quad[i];
+
+ ef.tu0 = max(ef.tu0, 1);
+ ef.tu1 = max(ef.tu1, 1);
+ ef.tv0 = max(ef.tv0, 1);
+ ef.tv1 = max(ef.tv1, 1);
+
+ dice.dice(sub, ef);
+ }
+
+ subpatches_quad.clear();
+ edgefactors_quad.clear();
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/subd/subd_split.h b/intern/cycles/subd/subd_split.h
new file mode 100644
index 00000000000..8ec5d24266e
--- /dev/null
+++ b/intern/cycles/subd/subd_split.h
@@ -0,0 +1,71 @@
+/*
+ * 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 __SUBD_SPLIT_H__
+#define __SUBD_SPLIT_H__
+
+/* DiagSplit: Parallel, Crack-free, Adaptive Tessellation for Micropolygon Rendering
+ * Splits up patches and determines edge tesselation factors for dicing. Patch
+ * evaluation at arbitrary points is required for this to work. See the paper
+ * for more details. */
+
+#include "subd_dice.h"
+
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Mesh;
+class Patch;
+
+#define DSPLIT_NON_UNIFORM -1
+
+class DiagSplit {
+public:
+ vector<QuadDice::SubPatch> subpatches_quad;
+ vector<QuadDice::EdgeFactors> edgefactors_quad;
+ vector<TriangleDice::SubPatch> subpatches_triangle;
+ vector<TriangleDice::EdgeFactors> edgefactors_triangle;
+
+ int test_steps;
+ int split_threshold;
+ float dicing_rate;
+ Camera *camera;
+
+ DiagSplit();
+
+ float3 project(Patch *patch, float2 uv);
+ int T(Patch *patch, float2 Pstart, float2 Pend);
+ void partition_edge(Patch *patch, float2 *P, int *t0, int *t1,
+ float2 Pstart, float2 Pend, int t);
+
+ void dispatch(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef);
+ void split(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef, int depth=0);
+
+ void dispatch(TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef);
+ void split(TriangleDice::SubPatch& sub, TriangleDice::EdgeFactors& ef, int depth=0);
+
+ void split_triangle(Mesh *mesh, Patch *patch, int shader, bool smooth);
+ void split_quad(Mesh *mesh, Patch *patch, int shader, bool smooth);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_SPLIT_H__ */
+
diff --git a/intern/cycles/subd/subd_stencil.cpp b/intern/cycles/subd/subd_stencil.cpp
new file mode 100644
index 00000000000..599a745eebb
--- /dev/null
+++ b/intern/cycles/subd/subd_stencil.cpp
@@ -0,0 +1,103 @@
+/*
+ * 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 "subd_stencil.h"
+
+#include "util_debug.h"
+#include "util_math.h"
+
+CCL_NAMESPACE_BEGIN
+
+StencilMask::StencilMask()
+{
+}
+
+StencilMask::StencilMask(int size)
+{
+ /* initialize weights to zero. */
+ weights.resize(size, 0.0f);
+}
+
+void StencilMask::resize(int size)
+{
+ weights.resize(size, 0.0f);
+}
+
+StencilMask& StencilMask::operator=(float value)
+{
+ const int size = weights.size();
+ for(int i = 0; i < size; i++)
+ weights[i] = value;
+
+ return *this;
+}
+
+void StencilMask::operator+=(const StencilMask& mask)
+{
+ assert(mask.size() == size());
+
+ const int size = weights.size();
+ for(int i = 0; i < size; i++)
+ weights[i] += mask.weights[i];
+}
+
+void StencilMask::operator-=(const StencilMask& mask)
+{
+ assert(mask.size() == size());
+
+ const int size = weights.size();
+ for(int i = 0; i < size; i++)
+ weights[i] -= mask.weights[i];
+}
+
+void StencilMask::operator*=(float scale)
+{
+ const int size = weights.size();
+
+ for(int i = 0; i < size; i++)
+ weights[i] *= scale;
+}
+
+void StencilMask::operator/=(float scale)
+{
+ *this *= 1.0f/scale;
+}
+
+float StencilMask::sum() const
+{
+ float total = 0.0f;
+ const int size = weights.size();
+
+ for(int i = 0; i < size; i++)
+ total += weights[i];
+
+ return total;
+}
+
+bool StencilMask::is_normalized() const
+{
+ return fabsf(sum() - 1.0f) < 0.0001f;
+}
+
+void StencilMask::normalize()
+{
+ *this /= sum();
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/subd/subd_stencil.h b/intern/cycles/subd/subd_stencil.h
new file mode 100644
index 00000000000..e11d8f37cd3
--- /dev/null
+++ b/intern/cycles/subd/subd_stencil.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2006, NVIDIA Corporation Ignacio Castano <icastano@nvidia.com>
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef __SUBD_STENCIL__
+#define __SUBD_STENCIL__
+
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class StencilMask
+{
+public:
+ StencilMask();
+ StencilMask(int size);
+
+ void resize(int size);
+
+ StencilMask& operator=(float value);
+
+ void operator+=(const StencilMask& mask);
+ void operator-=(const StencilMask& mask);
+ void operator*=(float scale);
+ void operator/=(float scale);
+
+ int size() const { return weights.size(); }
+
+ float operator[](int i) const { return weights[i]; }
+ float& operator[](int i) { return weights[i]; }
+
+ float sum() const;
+ bool is_normalized() const;
+ void normalize();
+
+private:
+ vector<float> weights;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_STENCIL__ */
+
diff --git a/intern/cycles/subd/subd_vert.h b/intern/cycles/subd/subd_vert.h
new file mode 100644
index 00000000000..638019547ae
--- /dev/null
+++ b/intern/cycles/subd/subd_vert.h
@@ -0,0 +1,121 @@
+/*
+ * Original code in the public domain -- castanyo@yahoo.es
+ *
+ * Modifications copyright (c) 2011, Blender Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SUBD_VERTEX_H__
+#define __SUBD_VERTEX_H__
+
+#include "subd_edge.h"
+#include "subd_mesh.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* Subd Vertex */
+
+class SubdVert
+{
+public:
+ int id;
+ float3 co;
+
+ SubdEdge *edge;
+ SubdVert *next;
+ SubdVert *prev;
+
+ SubdVert(int id_)
+ {
+ id = id_;
+ edge = NULL;
+ co = make_float3(0.0f, 0.0f, 0.0f);
+
+ next = this;
+ prev = this;
+ }
+
+ /* valence */
+ int valence()
+ {
+ int num = 0;
+
+ for(EdgeIterator it(edges()); !it.isDone(); it.advance())
+ num++;
+
+ return num;
+ }
+
+ /* edge queries */
+ bool is_boundary() { return (edge && !edge->face); }
+
+ /* iterator over edges in counterclockwise order */
+ class EdgeIterator
+ {
+ public:
+ EdgeIterator(SubdEdge *e) : end(NULL), cur(e) { }
+
+ virtual void advance()
+ {
+ if(end == NULL) end = cur;
+ cur = cur->pair->next;
+ //cur = cur->prev->pair;
+ }
+
+ virtual bool isDone() { return end == cur; }
+ virtual SubdEdge *current() { return cur; }
+
+ private:
+ SubdEdge *end;
+ SubdEdge *cur;
+ };
+
+ /* iterator over edges in clockwise order */
+ class ReverseEdgeIterator
+ {
+ public:
+ ReverseEdgeIterator(SubdEdge *e) : end(NULL), cur(e) { }
+
+ virtual void advance()
+ {
+ if(end == NULL) end = cur;
+ cur = cur->prev->pair;
+ }
+
+ virtual bool isDone() { return end == cur; }
+ virtual SubdEdge *current() { return cur; }
+
+ private:
+ SubdEdge *end;
+ SubdEdge *cur;
+ };
+
+ EdgeIterator edges() { return EdgeIterator(edge); }
+ EdgeIterator edges(SubdEdge *edge) { return EdgeIterator(edge); }
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __SUBD_VERTEX_H__ */
+
diff --git a/intern/cycles/util/CMakeLists.txt b/intern/cycles/util/CMakeLists.txt
new file mode 100644
index 00000000000..76e948504eb
--- /dev/null
+++ b/intern/cycles/util/CMakeLists.txt
@@ -0,0 +1,64 @@
+
+set(INC
+ .
+ ${GLEW_INCLUDE_PATH}
+ ${OPENGL_INCLUDE_DIR}
+)
+
+set(SRC
+ util_cache.cpp
+ util_cuda.cpp
+ util_dynlib.cpp
+ util_md5.cpp
+ util_memarena.cpp
+ util_opencl.c
+ util_path.cpp
+ util_string.cpp
+ util_system.cpp
+ util_time.cpp
+ util_transform.cpp
+)
+
+if(WITH_CYCLES_TEST)
+ list(APPEND SRC
+ util_view.cpp
+ )
+endif()
+
+set(SRC_HEADERS
+ util_algorithm.h
+ util_args.h
+ util_boundbox.h
+ util_cache.h
+ util_cuda.h
+ util_debug.h
+ util_dynlib.h
+ util_foreach.h
+ util_function.h
+ util_hash.h
+ util_image.h
+ util_list.h
+ util_map.h
+ util_math.h
+ util_md5.h
+ util_memarena.h
+ util_opencl.h
+ util_opengl.h
+ util_param.h
+ util_path.h
+ util_progress.h
+ util_set.h
+ util_string.h
+ util_system.h
+ util_thread.h
+ util_time.h
+ util_transform.h
+ util_types.h
+ util_view.h
+ util_vector.h
+ util_xml.h
+)
+
+include_directories(${INC})
+
+add_library(cycles_util ${SRC} ${SRC_HEADERS})
diff --git a/intern/cycles/util/util_algorithm.h b/intern/cycles/util/util_algorithm.h
new file mode 100644
index 00000000000..708a2730be7
--- /dev/null
+++ b/intern/cycles/util/util_algorithm.h
@@ -0,0 +1,35 @@
+/*
+ * 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 __UTIL_ALGORITHM_H__
+#define __UTIL_ALGORITHM_H__
+
+#include <algorithm>
+
+CCL_NAMESPACE_BEGIN
+
+using std::sort;
+using std::swap;
+using std::max;
+using std::min;
+using std::remove;
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_ALGORITHM_H__ */
+
diff --git a/intern/cycles/util/util_args.h b/intern/cycles/util/util_args.h
new file mode 100644
index 00000000000..639fd06bead
--- /dev/null
+++ b/intern/cycles/util/util_args.h
@@ -0,0 +1,34 @@
+/*
+ * 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 __UTIL_ARGS_H__
+#define __UTIL_ARGS_H__
+
+/* Argument Parsing for command line, we use the OpenImageIO
+ * library because it has nice functions to do this. */
+
+#include <OpenImageIO/argparse.h>
+
+CCL_NAMESPACE_BEGIN
+
+OIIO_NAMESPACE_USING
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_ARGS_H__ */
+
diff --git a/intern/cycles/util/util_boundbox.h b/intern/cycles/util/util_boundbox.h
new file mode 100644
index 00000000000..34cc1d6e11c
--- /dev/null
+++ b/intern/cycles/util/util_boundbox.h
@@ -0,0 +1,98 @@
+/*
+ * 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 __UTIL_BOUNDBOX_H__
+#define __UTIL_BOUNDBOX_H__
+
+#include <float.h>
+
+#include "util_transform.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class BoundBox
+{
+public:
+ float3 min, max;
+
+ BoundBox(void)
+ {
+ min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX);
+ max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
+ }
+
+ BoundBox(const float3& min_, const float3& max_)
+ : min(min_), max(max_)
+ {
+ }
+
+ void grow(const float3& pt)
+ {
+ min = ccl::min(min, pt);
+ max = ccl::max(max, pt);
+ }
+
+ void grow(const BoundBox& bbox)
+ {
+ grow(bbox.min);
+ grow(bbox.max);
+ }
+
+ void intersect(const BoundBox& bbox)
+ {
+ min = ccl::max(min, bbox.min);
+ max = ccl::min(max, bbox.max);
+ }
+
+ float area(void) const
+ {
+ if(!valid())
+ return 0.0f;
+
+ float3 d = max - min;
+ return dot(d, d)*2.0f;
+ }
+
+ bool valid(void) const
+ {
+ return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z);
+ }
+
+ BoundBox transformed(const Transform *tfm)
+ {
+ BoundBox result;
+
+ for(int i = 0; i < 8; i++) {
+ float3 p;
+
+ p.x = (i & 1)? min.x: max.x;
+ p.y = (i & 2)? min.y: max.y;
+ p.z = (i & 4)? min.z: max.z;
+
+ result.grow(transform(tfm, p));
+ }
+
+ return result;
+ }
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_BOUNDBOX_H__ */
+
diff --git a/intern/cycles/util/util_cache.cpp b/intern/cycles/util/util_cache.cpp
new file mode 100644
index 00000000000..49a0f62cae8
--- /dev/null
+++ b/intern/cycles/util/util_cache.cpp
@@ -0,0 +1,93 @@
+/*
+ * 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 <stdio.h>
+
+#include "util_cache.h"
+#include "util_foreach.h"
+#include "util_md5.h"
+#include "util_path.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* CacheData */
+
+CacheData::CacheData(const string& name_)
+{
+ name = name_;
+ f = NULL;
+}
+
+CacheData::~CacheData()
+{
+ if(f)
+ fclose(f);
+}
+
+/* Cache */
+
+Cache Cache::global;
+
+string Cache::data_filename(const CacheData& key)
+{
+ MD5Hash hash;
+
+ foreach(const CacheBuffer& buffer, key.buffers)
+ hash.append((uint8_t*)buffer.data, buffer.size);
+
+ string fname = key.name + "_" + hash.get_hex();
+ return path_get("cache/" + fname);
+}
+
+void Cache::insert(const CacheData& key, const CacheData& value)
+{
+ string filename = data_filename(key);
+ FILE *f = fopen(filename.c_str(), "wb");
+
+ if(!f) {
+ fprintf(stderr, "Failed to open file %s for writing.\n", filename.c_str());
+ return;
+ }
+
+ foreach(const CacheBuffer& buffer, value.buffers) {
+ if(!fwrite(&buffer.size, sizeof(buffer.size), 1, f))
+ fprintf(stderr, "Failed to write to file %s.\n", filename.c_str());
+ if(!fwrite(buffer.data, buffer.size, 1, f))
+ fprintf(stderr, "Failed to write to file %s.\n", filename.c_str());
+ }
+
+ fclose(f);
+}
+
+bool Cache::lookup(const CacheData& key, CacheData& value)
+{
+ string filename = data_filename(key);
+ FILE *f = fopen(filename.c_str(), "rb");
+
+ if(!f)
+ return false;
+
+ value.name = key.name;
+ value.f = f;
+
+ return true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_cache.h b/intern/cycles/util/util_cache.h
new file mode 100644
index 00000000000..91e8a94a584
--- /dev/null
+++ b/intern/cycles/util/util_cache.h
@@ -0,0 +1,141 @@
+/*
+ * 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 __UTIL_CACHE_H__
+#define __UTIL_CACHE_H__
+
+/* Disk Cache based on Hashing
+ *
+ * To be used to cache expensive computations. The hash key is created from an
+ * arbitrary number of bytes, by hashing the bytes using MD5, which then gives
+ * the file name containing the data. This data then is read from the file
+ * again into the appropriate data structures.
+ *
+ * This way we do not need to accurately track changes, compare dates and
+ * invalidate cache entries, at the cost of exta computation. If everything
+ * is stored in a global cache, computations can perhaps even be shared between
+ * different scenes where it may be hard to detect duplicate work.
+ */
+
+#include "util_string.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+class CacheBuffer {
+public:
+ const void *data;
+ size_t size;
+
+ CacheBuffer(const void *data_, size_t size_)
+ { data = data_; size = size_; }
+};
+
+class CacheData {
+public:
+ vector<CacheBuffer> buffers;
+ string name;
+ FILE *f;
+
+ CacheData(const string& name = "");
+ ~CacheData();
+
+ template<typename T> void add(const vector<T>& data)
+ {
+ if(data.size()) {
+ CacheBuffer buffer(&data[0], data.size()*sizeof(T));
+ buffers.push_back(buffer);
+ }
+ }
+
+ template<typename T> void add(const array<T>& data)
+ {
+ if(data.size()) {
+ CacheBuffer buffer(&data[0], data.size()*sizeof(T));
+ buffers.push_back(buffer);
+ }
+ }
+
+ void add(void *data, size_t size)
+ {
+ if(size) {
+ CacheBuffer buffer(data, size);
+ buffers.push_back(buffer);
+ }
+ }
+
+ void add(int& data)
+ {
+ CacheBuffer buffer(&data, sizeof(int));
+ buffers.push_back(buffer);
+ }
+
+ void add(size_t& data)
+ {
+ CacheBuffer buffer(&data, sizeof(size_t));
+ buffers.push_back(buffer);
+ }
+
+ template<typename T> void read(array<T>& data)
+ {
+ size_t size;
+
+ if(!fread(&size, sizeof(size), 1, f)) {
+ fprintf(stderr, "Failed to read vector size from cache.\n");
+ return;
+ }
+
+ if(!size)
+ return;
+
+ data.resize(size/sizeof(T));
+
+ if(!fread(&data[0], size, 1, f)) {
+ fprintf(stderr, "Failed to read vector data from cache (%ld).\n", size);
+ return;
+ }
+ }
+
+ void read(int& data)
+ {
+ if(!fread(&data, sizeof(data), 1, f))
+ fprintf(stderr, "Failed to read int from cache.\n");
+ }
+
+ void read(size_t& data)
+ {
+ if(!fread(&data, sizeof(data), 1, f))
+ fprintf(stderr, "Failed to read size_t from cache.\n");
+ }
+};
+
+class Cache {
+public:
+ static Cache global;
+
+ void insert(const CacheData& key, const CacheData& value);
+ bool lookup(const CacheData& key, CacheData& value);
+
+protected:
+ string data_filename(const CacheData& key);
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_CACHE_H__ */
+
diff --git a/intern/cycles/util/util_color.h b/intern/cycles/util/util_color.h
new file mode 100644
index 00000000000..8b4a175f498
--- /dev/null
+++ b/intern/cycles/util/util_color.h
@@ -0,0 +1,71 @@
+/*
+ * 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 __UTIL_COLOR_H__
+#define __UTIL_COLOR_H__
+
+#include "util_math.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+__device float color_srgb_to_scene_linear(float c)
+{
+ if(c < 0.04045f)
+ return (c < 0.0f)? 0.0f: c * (1.0f/12.92f);
+ else
+ return pow((c + 0.055f)*(1.0f/1.055f), 2.4f);
+}
+
+__device float color_scene_linear_to_srgb(float c)
+{
+ if(c < 0.0031308f)
+ return (c < 0.0f)? 0.0f: c * 12.92f;
+ else
+ return 1.055f * pow(c, 1.0f/2.4f) - 0.055f;
+}
+
+#ifndef __KERNEL_OPENCL__
+
+__device float3 color_srgb_to_scene_linear(float3 c)
+{
+ return make_float3(
+ color_srgb_to_scene_linear(c.x),
+ color_srgb_to_scene_linear(c.y),
+ color_srgb_to_scene_linear(c.z));
+}
+
+__device float3 color_scene_linear_to_srgb(float3 c)
+{
+ return make_float3(
+ color_scene_linear_to_srgb(c.x),
+ color_scene_linear_to_srgb(c.y),
+ color_scene_linear_to_srgb(c.z));
+}
+
+#endif
+
+__device float linear_rgb_to_gray(float3 c)
+{
+ return c.x*0.2126f + c.y*0.7152f + c.z*0.0722f;
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_COLOR_H__ */
+
diff --git a/intern/cycles/util/util_cuda.cpp b/intern/cycles/util/util_cuda.cpp
new file mode 100644
index 00000000000..f81a11ba9da
--- /dev/null
+++ b/intern/cycles/util/util_cuda.cpp
@@ -0,0 +1,424 @@
+/*
+ * 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 <stdlib.h>
+
+#include "util_cuda.h"
+#include "util_debug.h"
+#include "util_dynlib.h"
+#include "util_path.h"
+#include "util_string.h"
+
+/* function defininitions */
+
+tcuInit *cuInit;
+tcuDriverGetVersion *cuDriverGetVersion;
+tcuDeviceGet *cuDeviceGet;
+tcuDeviceGetCount *cuDeviceGetCount;
+tcuDeviceGetName *cuDeviceGetName;
+tcuDeviceComputeCapability *cuDeviceComputeCapability;
+tcuDeviceTotalMem *cuDeviceTotalMem;
+tcuDeviceGetProperties *cuDeviceGetProperties;
+tcuDeviceGetAttribute *cuDeviceGetAttribute;
+tcuCtxCreate *cuCtxCreate;
+tcuCtxDestroy *cuCtxDestroy;
+tcuCtxAttach *cuCtxAttach;
+tcuCtxDetach *cuCtxDetach;
+tcuCtxPushCurrent *cuCtxPushCurrent;
+tcuCtxPopCurrent *cuCtxPopCurrent;
+tcuCtxGetDevice *cuCtxGetDevice;
+tcuCtxSynchronize *cuCtxSynchronize;
+tcuModuleLoad *cuModuleLoad;
+tcuModuleLoadData *cuModuleLoadData;
+tcuModuleLoadDataEx *cuModuleLoadDataEx;
+tcuModuleLoadFatBinary *cuModuleLoadFatBinary;
+tcuModuleUnload *cuModuleUnload;
+tcuModuleGetFunction *cuModuleGetFunction;
+tcuModuleGetGlobal *cuModuleGetGlobal;
+tcuModuleGetTexRef *cuModuleGetTexRef;
+tcuModuleGetSurfRef *cuModuleGetSurfRef;
+tcuMemGetInfo *cuMemGetInfo;
+tcuMemAlloc *cuMemAlloc;
+tcuMemAllocPitch *cuMemAllocPitch;
+tcuMemFree *cuMemFree;
+tcuMemGetAddressRange *cuMemGetAddressRange;
+tcuMemAllocHost *cuMemAllocHost;
+tcuMemFreeHost *cuMemFreeHost;
+tcuMemHostAlloc *cuMemHostAlloc;
+tcuMemHostGetDevicePointer *cuMemHostGetDevicePointer;
+tcuMemHostGetFlags *cuMemHostGetFlags;
+tcuMemcpyHtoD *cuMemcpyHtoD;
+tcuMemcpyDtoH *cuMemcpyDtoH;
+tcuMemcpyDtoD *cuMemcpyDtoD;
+tcuMemcpyDtoA *cuMemcpyDtoA;
+tcuMemcpyAtoD *cuMemcpyAtoD;
+tcuMemcpyHtoA *cuMemcpyHtoA;
+tcuMemcpyAtoH *cuMemcpyAtoH;
+tcuMemcpyAtoA *cuMemcpyAtoA;
+tcuMemcpy2D *cuMemcpy2D;
+tcuMemcpy2DUnaligned *cuMemcpy2DUnaligned;
+tcuMemcpy3D *cuMemcpy3D;
+tcuMemcpyHtoDAsync *cuMemcpyHtoDAsync;
+tcuMemcpyDtoHAsync *cuMemcpyDtoHAsync;
+tcuMemcpyDtoDAsync *cuMemcpyDtoDAsync;
+tcuMemcpyHtoAAsync *cuMemcpyHtoAAsync;
+tcuMemcpyAtoHAsync *cuMemcpyAtoHAsync;
+tcuMemcpy2DAsync *cuMemcpy2DAsync;
+tcuMemcpy3DAsync *cuMemcpy3DAsync;
+tcuMemsetD8 *cuMemsetD8;
+tcuMemsetD16 *cuMemsetD16;
+tcuMemsetD32 *cuMemsetD32;
+tcuMemsetD2D8 *cuMemsetD2D8;
+tcuMemsetD2D16 *cuMemsetD2D16;
+tcuMemsetD2D32 *cuMemsetD2D32;
+tcuFuncSetBlockShape *cuFuncSetBlockShape;
+tcuFuncSetSharedSize *cuFuncSetSharedSize;
+tcuFuncGetAttribute *cuFuncGetAttribute;
+tcuFuncSetCacheConfig *cuFuncSetCacheConfig;
+tcuArrayCreate *cuArrayCreate;
+tcuArrayGetDescriptor *cuArrayGetDescriptor;
+tcuArrayDestroy *cuArrayDestroy;
+tcuArray3DCreate *cuArray3DCreate;
+tcuArray3DGetDescriptor *cuArray3DGetDescriptor;
+tcuTexRefCreate *cuTexRefCreate;
+tcuTexRefDestroy *cuTexRefDestroy;
+tcuTexRefSetArray *cuTexRefSetArray;
+tcuTexRefSetAddress *cuTexRefSetAddress;
+tcuTexRefSetAddress2D *cuTexRefSetAddress2D;
+tcuTexRefSetFormat *cuTexRefSetFormat;
+tcuTexRefSetAddressMode *cuTexRefSetAddressMode;
+tcuTexRefSetFilterMode *cuTexRefSetFilterMode;
+tcuTexRefSetFlags *cuTexRefSetFlags;
+tcuTexRefGetAddress *cuTexRefGetAddress;
+tcuTexRefGetArray *cuTexRefGetArray;
+tcuTexRefGetAddressMode *cuTexRefGetAddressMode;
+tcuTexRefGetFilterMode *cuTexRefGetFilterMode;
+tcuTexRefGetFormat *cuTexRefGetFormat;
+tcuTexRefGetFlags *cuTexRefGetFlags;
+tcuSurfRefSetArray *cuSurfRefSetArray;
+tcuSurfRefGetArray *cuSurfRefGetArray;
+tcuParamSetSize *cuParamSetSize;
+tcuParamSeti *cuParamSeti;
+tcuParamSetf *cuParamSetf;
+tcuParamSetv *cuParamSetv;
+tcuParamSetTexRef *cuParamSetTexRef;
+tcuLaunch *cuLaunch;
+tcuLaunchGrid *cuLaunchGrid;
+tcuLaunchGridAsync *cuLaunchGridAsync;
+tcuEventCreate *cuEventCreate;
+tcuEventRecord *cuEventRecord;
+tcuEventQuery *cuEventQuery;
+tcuEventSynchronize *cuEventSynchronize;
+tcuEventDestroy *cuEventDestroy;
+tcuEventElapsedTime *cuEventElapsedTime;
+tcuStreamCreate *cuStreamCreate;
+tcuStreamQuery *cuStreamQuery;
+tcuStreamSynchronize *cuStreamSynchronize;
+tcuStreamDestroy *cuStreamDestroy;
+tcuGraphicsUnregisterResource *cuGraphicsUnregisterResource;
+tcuGraphicsSubResourceGetMappedArray *cuGraphicsSubResourceGetMappedArray;
+tcuGraphicsResourceGetMappedPointer *cuGraphicsResourceGetMappedPointer;
+tcuGraphicsResourceSetMapFlags *cuGraphicsResourceSetMapFlags;
+tcuGraphicsMapResources *cuGraphicsMapResources;
+tcuGraphicsUnmapResources *cuGraphicsUnmapResources;
+tcuGetExportTable *cuGetExportTable;
+tcuCtxSetLimit *cuCtxSetLimit;
+tcuCtxGetLimit *cuCtxGetLimit;
+tcuGLCtxCreate *cuGLCtxCreate;
+tcuGraphicsGLRegisterBuffer *cuGraphicsGLRegisterBuffer;
+tcuGraphicsGLRegisterImage *cuGraphicsGLRegisterImage;
+tcuCtxSetCurrent *cuCtxSetCurrent;
+
+CCL_NAMESPACE_BEGIN
+
+/* utility macros */
+#define CUDA_LIBRARY_FIND_CHECKED(name) \
+ name = (t##name*)dynamic_library_find(lib, #name);
+
+#define CUDA_LIBRARY_FIND(name) \
+ name = (t##name*)dynamic_library_find(lib, #name); \
+ assert(name);
+
+#define CUDA_LIBRARY_FIND_V2(name) \
+ name = (t##name*)dynamic_library_find(lib, #name "_v2"); \
+ assert(name);
+
+/* initialization function */
+
+bool cuLibraryInit()
+{
+ static bool initialized = false;
+ static bool result = false;
+
+ if(initialized)
+ return result;
+
+ initialized = true;
+
+ /* library paths */
+#ifdef _WIN32
+ /* expected in c:/windows/system or similar, no path needed */
+ const char *path = "nvcuda.dll";
+#elif defined(__APPLE__)
+ /* default installation path */
+ const char *path = "/usr/local/cuda/lib/libcuda.dylib";
+#else
+ const char *path = "libcuda.so";
+#endif
+
+ /* load library */
+ DynamicLibrary *lib = dynamic_library_open(path);
+
+ if(lib == NULL)
+ return false;
+
+ /* detect driver version */
+ int driver_version = 1000;
+
+ CUDA_LIBRARY_FIND_CHECKED(cuDriverGetVersion);
+ if(cuDriverGetVersion)
+ cuDriverGetVersion(&driver_version);
+
+ /* we require version 4.0 */
+ if(driver_version < 4000)
+ return false;
+
+ /* fetch all function pointers */
+ CUDA_LIBRARY_FIND(cuInit);
+ CUDA_LIBRARY_FIND(cuDeviceGet);
+ CUDA_LIBRARY_FIND(cuDeviceGetCount);
+ CUDA_LIBRARY_FIND(cuDeviceGetName);
+ CUDA_LIBRARY_FIND(cuDeviceComputeCapability);
+ CUDA_LIBRARY_FIND(cuDeviceTotalMem);
+ CUDA_LIBRARY_FIND(cuDeviceGetProperties);
+ CUDA_LIBRARY_FIND(cuDeviceGetAttribute);
+ CUDA_LIBRARY_FIND(cuCtxCreate);
+ CUDA_LIBRARY_FIND(cuCtxDestroy);
+ CUDA_LIBRARY_FIND(cuCtxAttach);
+ CUDA_LIBRARY_FIND(cuCtxDetach);
+ CUDA_LIBRARY_FIND(cuCtxPushCurrent);
+ CUDA_LIBRARY_FIND(cuCtxPopCurrent);
+ CUDA_LIBRARY_FIND(cuCtxGetDevice);
+ CUDA_LIBRARY_FIND(cuCtxSynchronize);
+ CUDA_LIBRARY_FIND(cuModuleLoad);
+ CUDA_LIBRARY_FIND(cuModuleLoadData);
+ CUDA_LIBRARY_FIND(cuModuleUnload);
+ CUDA_LIBRARY_FIND(cuModuleGetFunction);
+ CUDA_LIBRARY_FIND(cuModuleGetGlobal);
+ CUDA_LIBRARY_FIND(cuModuleGetTexRef);
+ CUDA_LIBRARY_FIND(cuMemGetInfo);
+ CUDA_LIBRARY_FIND(cuMemAlloc);
+ CUDA_LIBRARY_FIND(cuMemAllocPitch);
+ CUDA_LIBRARY_FIND(cuMemFree);
+ CUDA_LIBRARY_FIND(cuMemGetAddressRange);
+ CUDA_LIBRARY_FIND(cuMemAllocHost);
+ CUDA_LIBRARY_FIND(cuMemFreeHost);
+ CUDA_LIBRARY_FIND(cuMemHostAlloc);
+ CUDA_LIBRARY_FIND(cuMemHostGetDevicePointer);
+ CUDA_LIBRARY_FIND(cuMemcpyHtoD);
+ CUDA_LIBRARY_FIND(cuMemcpyDtoH);
+ CUDA_LIBRARY_FIND(cuMemcpyDtoD);
+ CUDA_LIBRARY_FIND(cuMemcpyDtoA);
+ CUDA_LIBRARY_FIND(cuMemcpyAtoD);
+ CUDA_LIBRARY_FIND(cuMemcpyHtoA);
+ CUDA_LIBRARY_FIND(cuMemcpyAtoH);
+ CUDA_LIBRARY_FIND(cuMemcpyAtoA);
+ CUDA_LIBRARY_FIND(cuMemcpy2D);
+ CUDA_LIBRARY_FIND(cuMemcpy2DUnaligned);
+ CUDA_LIBRARY_FIND(cuMemcpy3D);
+ CUDA_LIBRARY_FIND(cuMemcpyHtoDAsync);
+ CUDA_LIBRARY_FIND(cuMemcpyDtoHAsync);
+ CUDA_LIBRARY_FIND(cuMemcpyHtoAAsync);
+ CUDA_LIBRARY_FIND(cuMemcpyAtoHAsync);
+ CUDA_LIBRARY_FIND(cuMemcpy2DAsync);
+ CUDA_LIBRARY_FIND(cuMemcpy3DAsync);
+ CUDA_LIBRARY_FIND(cuMemsetD8);
+ CUDA_LIBRARY_FIND(cuMemsetD16);
+ CUDA_LIBRARY_FIND(cuMemsetD32);
+ CUDA_LIBRARY_FIND(cuMemsetD2D8);
+ CUDA_LIBRARY_FIND(cuMemsetD2D16);
+ CUDA_LIBRARY_FIND(cuMemsetD2D32);
+ CUDA_LIBRARY_FIND(cuFuncSetBlockShape);
+ CUDA_LIBRARY_FIND(cuFuncSetSharedSize);
+ CUDA_LIBRARY_FIND(cuFuncGetAttribute);
+ CUDA_LIBRARY_FIND(cuArrayCreate);
+ CUDA_LIBRARY_FIND(cuArrayGetDescriptor);
+ CUDA_LIBRARY_FIND(cuArrayDestroy);
+ CUDA_LIBRARY_FIND(cuArray3DCreate);
+ CUDA_LIBRARY_FIND(cuArray3DGetDescriptor);
+ CUDA_LIBRARY_FIND(cuTexRefCreate);
+ CUDA_LIBRARY_FIND(cuTexRefDestroy);
+ CUDA_LIBRARY_FIND(cuTexRefSetArray);
+ CUDA_LIBRARY_FIND(cuTexRefSetAddress);
+ CUDA_LIBRARY_FIND(cuTexRefSetAddress2D);
+ CUDA_LIBRARY_FIND(cuTexRefSetFormat);
+ CUDA_LIBRARY_FIND(cuTexRefSetAddressMode);
+ CUDA_LIBRARY_FIND(cuTexRefSetFilterMode);
+ CUDA_LIBRARY_FIND(cuTexRefSetFlags);
+ CUDA_LIBRARY_FIND(cuTexRefGetAddress);
+ CUDA_LIBRARY_FIND(cuTexRefGetArray);
+ CUDA_LIBRARY_FIND(cuTexRefGetAddressMode);
+ CUDA_LIBRARY_FIND(cuTexRefGetFilterMode);
+ CUDA_LIBRARY_FIND(cuTexRefGetFormat);
+ CUDA_LIBRARY_FIND(cuTexRefGetFlags);
+ CUDA_LIBRARY_FIND(cuParamSetSize);
+ CUDA_LIBRARY_FIND(cuParamSeti);
+ CUDA_LIBRARY_FIND(cuParamSetf);
+ CUDA_LIBRARY_FIND(cuParamSetv);
+ CUDA_LIBRARY_FIND(cuParamSetTexRef);
+ CUDA_LIBRARY_FIND(cuLaunch);
+ CUDA_LIBRARY_FIND(cuLaunchGrid);
+ CUDA_LIBRARY_FIND(cuLaunchGridAsync);
+ CUDA_LIBRARY_FIND(cuEventCreate);
+ CUDA_LIBRARY_FIND(cuEventRecord);
+ CUDA_LIBRARY_FIND(cuEventQuery);
+ CUDA_LIBRARY_FIND(cuEventSynchronize);
+ CUDA_LIBRARY_FIND(cuEventDestroy);
+ CUDA_LIBRARY_FIND(cuEventElapsedTime);
+ CUDA_LIBRARY_FIND(cuStreamCreate);
+ CUDA_LIBRARY_FIND(cuStreamQuery);
+ CUDA_LIBRARY_FIND(cuStreamSynchronize);
+ CUDA_LIBRARY_FIND(cuStreamDestroy);
+
+ /* cuda 2.1 */
+ CUDA_LIBRARY_FIND(cuModuleLoadDataEx);
+ CUDA_LIBRARY_FIND(cuModuleLoadFatBinary);
+ CUDA_LIBRARY_FIND(cuGLCtxCreate);
+ CUDA_LIBRARY_FIND(cuGraphicsGLRegisterBuffer);
+ CUDA_LIBRARY_FIND(cuGraphicsGLRegisterImage);
+
+ /* cuda 2.3 */
+ CUDA_LIBRARY_FIND(cuMemHostGetFlags);
+ CUDA_LIBRARY_FIND(cuGraphicsGLRegisterBuffer);
+ CUDA_LIBRARY_FIND(cuGraphicsGLRegisterImage);
+
+ /* cuda 3.0 */
+ CUDA_LIBRARY_FIND(cuMemcpyDtoDAsync);
+ CUDA_LIBRARY_FIND(cuFuncSetCacheConfig);
+ CUDA_LIBRARY_FIND(cuGraphicsUnregisterResource);
+ CUDA_LIBRARY_FIND(cuGraphicsSubResourceGetMappedArray);
+ CUDA_LIBRARY_FIND(cuGraphicsResourceGetMappedPointer);
+ CUDA_LIBRARY_FIND(cuGraphicsResourceSetMapFlags);
+ CUDA_LIBRARY_FIND(cuGraphicsMapResources);
+ CUDA_LIBRARY_FIND(cuGraphicsUnmapResources);
+ CUDA_LIBRARY_FIND(cuGetExportTable);
+
+ /* cuda 3.1 */
+ CUDA_LIBRARY_FIND(cuModuleGetSurfRef);
+ CUDA_LIBRARY_FIND(cuSurfRefSetArray);
+ CUDA_LIBRARY_FIND(cuSurfRefGetArray);
+ CUDA_LIBRARY_FIND(cuCtxSetLimit);
+ CUDA_LIBRARY_FIND(cuCtxGetLimit);
+
+ /* functions which changed 3.1 -> 3.2 for 64 bit stuff, the cuda library
+ has both the old ones for compatibility and new ones with _v2 postfix,
+ we load the _v2 ones here. */
+ CUDA_LIBRARY_FIND_V2(cuDeviceTotalMem);
+ CUDA_LIBRARY_FIND_V2(cuCtxCreate);
+ CUDA_LIBRARY_FIND_V2(cuModuleGetGlobal);
+ CUDA_LIBRARY_FIND_V2(cuMemGetInfo);
+ CUDA_LIBRARY_FIND_V2(cuMemAlloc);
+ CUDA_LIBRARY_FIND_V2(cuMemAllocPitch);
+ CUDA_LIBRARY_FIND_V2(cuMemFree);
+ CUDA_LIBRARY_FIND_V2(cuMemGetAddressRange);
+ CUDA_LIBRARY_FIND_V2(cuMemAllocHost);
+ CUDA_LIBRARY_FIND_V2(cuMemHostGetDevicePointer);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyHtoD);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyDtoH);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyDtoD);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyDtoA);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyAtoD);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyHtoA);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyAtoH);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyAtoA);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyHtoAAsync);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyAtoHAsync);
+ CUDA_LIBRARY_FIND_V2(cuMemcpy2D);
+ CUDA_LIBRARY_FIND_V2(cuMemcpy2DUnaligned);
+ CUDA_LIBRARY_FIND_V2(cuMemcpy3D);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyHtoDAsync);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyDtoHAsync);
+ CUDA_LIBRARY_FIND_V2(cuMemcpyDtoDAsync);
+ CUDA_LIBRARY_FIND_V2(cuMemcpy2DAsync);
+ CUDA_LIBRARY_FIND_V2(cuMemcpy3DAsync);
+ CUDA_LIBRARY_FIND_V2(cuMemsetD8);
+ CUDA_LIBRARY_FIND_V2(cuMemsetD16);
+ CUDA_LIBRARY_FIND_V2(cuMemsetD32);
+ CUDA_LIBRARY_FIND_V2(cuMemsetD2D8);
+ CUDA_LIBRARY_FIND_V2(cuMemsetD2D16);
+ CUDA_LIBRARY_FIND_V2(cuMemsetD2D32);
+ CUDA_LIBRARY_FIND_V2(cuArrayCreate);
+ CUDA_LIBRARY_FIND_V2(cuArrayGetDescriptor);
+ CUDA_LIBRARY_FIND_V2(cuArray3DCreate);
+ CUDA_LIBRARY_FIND_V2(cuArray3DGetDescriptor);
+ CUDA_LIBRARY_FIND_V2(cuTexRefSetAddress);
+ CUDA_LIBRARY_FIND_V2(cuTexRefSetAddress2D);
+ CUDA_LIBRARY_FIND_V2(cuTexRefGetAddress);
+ CUDA_LIBRARY_FIND_V2(cuGraphicsResourceGetMappedPointer);
+ CUDA_LIBRARY_FIND_V2(cuGLCtxCreate);
+
+ /* cuda 4.0 */
+ CUDA_LIBRARY_FIND(cuCtxSetCurrent);
+
+#ifndef WITH_CUDA_BINARIES
+#ifdef _WIN32
+ return false; /* runtime build doesn't work at the moment */
+#else
+ if(cuCompilerPath() == "")
+ return false;
+#endif
+#endif
+
+ /* success */
+ result = true;
+
+ return result;
+}
+
+string cuCompilerPath()
+{
+#ifdef _WIN32
+ const char *defaultpath = "C:/CUDA/bin";
+ const char *executable = "nvcc.exe";
+#else
+ const char *defaultpath = "/usr/local/cuda/bin";
+ const char *executable = "nvcc";
+#endif
+
+ const char *binpath = getenv("CUDA_BIN_PATH");
+
+ string nvcc;
+
+ if(binpath)
+ nvcc = path_join(binpath, executable);
+ else
+ nvcc = path_join(defaultpath, executable);
+
+ if(path_exists(nvcc))
+ return nvcc;
+
+#ifndef _WIN32
+ if(system("which nvcc") == 0)
+ return "nvcc";
+#endif
+
+ return "";
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_cuda.h b/intern/cycles/util/util_cuda.h
new file mode 100644
index 00000000000..3674c65bd93
--- /dev/null
+++ b/intern/cycles/util/util_cuda.h
@@ -0,0 +1,621 @@
+/*
+ * 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 __UTIL_CUDA_H__
+#define __UTIL_CUDA_H__
+
+#include <stdlib.h>
+#include "util_opengl.h"
+#include "util_string.h"
+
+CCL_NAMESPACE_BEGIN
+
+/* CUDA is linked in dynamically at runtime, so we can start the application
+ * without requiring a CUDA installation. Code adapted from the example
+ * matrixMulDynlinkJIT in the CUDA SDK. */
+
+bool cuLibraryInit();
+string cuCompilerPath();
+
+CCL_NAMESPACE_END
+
+/* defines, structs, enums */
+
+#define CUDA_VERSION 3020
+
+#if defined(__x86_64) || defined(AMD64) || defined(_M_AMD64)
+typedef unsigned long long CUdeviceptr;
+#else
+typedef unsigned int CUdeviceptr;
+#endif
+
+typedef int CUdevice;
+typedef struct CUctx_st *CUcontext;
+typedef struct CUmod_st *CUmodule;
+typedef struct CUfunc_st *CUfunction;
+typedef struct CUarray_st *CUarray;
+typedef struct CUtexref_st *CUtexref;
+typedef struct CUsurfref_st *CUsurfref;
+typedef struct CUevent_st *CUevent;
+typedef struct CUstream_st *CUstream;
+typedef struct CUgraphicsResource_st *CUgraphicsResource;
+
+typedef struct CUuuid_st {
+ char bytes[16];
+} CUuuid;
+
+typedef enum CUctx_flags_enum {
+ CU_CTX_SCHED_AUTO = 0,
+ CU_CTX_SCHED_SPIN = 1,
+ CU_CTX_SCHED_YIELD = 2,
+ CU_CTX_SCHED_MASK = 0x3,
+ CU_CTX_BLOCKING_SYNC = 4,
+ CU_CTX_MAP_HOST = 8,
+ CU_CTX_LMEM_RESIZE_TO_MAX = 16,
+ CU_CTX_FLAGS_MASK = 0x1f
+} CUctx_flags;
+
+typedef enum CUevent_flags_enum {
+ CU_EVENT_DEFAULT = 0,
+ CU_EVENT_BLOCKING_SYNC = 1,
+ CU_EVENT_DISABLE_TIMING = 2
+} CUevent_flags;
+
+typedef enum CUarray_format_enum {
+ CU_AD_FORMAT_UNSIGNED_INT8 = 0x01,
+ CU_AD_FORMAT_UNSIGNED_INT16 = 0x02,
+ CU_AD_FORMAT_UNSIGNED_INT32 = 0x03,
+ CU_AD_FORMAT_SIGNED_INT8 = 0x08,
+ CU_AD_FORMAT_SIGNED_INT16 = 0x09,
+ CU_AD_FORMAT_SIGNED_INT32 = 0x0a,
+ CU_AD_FORMAT_HALF = 0x10,
+ CU_AD_FORMAT_FLOAT = 0x20
+} CUarray_format;
+
+typedef enum CUaddress_mode_enum {
+ CU_TR_ADDRESS_MODE_WRAP = 0,
+ CU_TR_ADDRESS_MODE_CLAMP = 1,
+ CU_TR_ADDRESS_MODE_MIRROR = 2,
+ CU_TR_ADDRESS_MODE_BORDER = 3
+} CUaddress_mode;
+
+typedef enum CUfilter_mode_enum {
+ CU_TR_FILTER_MODE_POINT = 0,
+ CU_TR_FILTER_MODE_LINEAR = 1
+} CUfilter_mode;
+
+typedef enum CUdevice_attribute_enum {
+ CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 1,
+ CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X = 2,
+ CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y = 3,
+ CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z = 4,
+ CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X = 5,
+ CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y = 6,
+ CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z = 7,
+ CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK = 8,
+ CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK = 8,
+ CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY = 9,
+ CU_DEVICE_ATTRIBUTE_WARP_SIZE = 10,
+ CU_DEVICE_ATTRIBUTE_MAX_PITCH = 11,
+ CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK = 12,
+ CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK = 12,
+ CU_DEVICE_ATTRIBUTE_CLOCK_RATE = 13,
+ CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT = 14,
+ CU_DEVICE_ATTRIBUTE_GPU_OVERLAP = 15,
+ CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT = 16,
+ CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT = 17,
+ CU_DEVICE_ATTRIBUTE_INTEGRATED = 18,
+ CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY = 19,
+ CU_DEVICE_ATTRIBUTE_COMPUTE_MODE = 20,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH = 21,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH = 22,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT = 23,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH = 24,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT = 25,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH = 26,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH = 27,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT = 28,
+ CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES = 29,
+ CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT = 30,
+ CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS = 31,
+ CU_DEVICE_ATTRIBUTE_ECC_ENABLED = 32,
+ CU_DEVICE_ATTRIBUTE_PCI_BUS_ID = 33,
+ CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID = 34,
+ CU_DEVICE_ATTRIBUTE_TCC_DRIVER = 35
+} CUdevice_attribute;
+
+typedef struct CUdevprop_st {
+ int maxThreadsPerBlock;
+ int maxThreadsDim[3];
+ int maxGridSize[3];
+ int sharedMemPerBlock;
+ int totalConstantMemory;
+ int SIMDWidth;
+ int memPitch;
+ int regsPerBlock;
+ int clockRate;
+ int textureAlign;
+} CUdevprop;
+
+typedef enum CUfunction_attribute_enum {
+ CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 0,
+ CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES = 1,
+ CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES = 2,
+ CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES = 3,
+ CU_FUNC_ATTRIBUTE_NUM_REGS = 4,
+ CU_FUNC_ATTRIBUTE_PTX_VERSION = 5,
+ CU_FUNC_ATTRIBUTE_BINARY_VERSION = 6,
+ CU_FUNC_ATTRIBUTE_MAX
+} CUfunction_attribute;
+
+typedef enum CUfunc_cache_enum {
+ CU_FUNC_CACHE_PREFER_NONE = 0x00,
+ CU_FUNC_CACHE_PREFER_SHARED = 0x01,
+ CU_FUNC_CACHE_PREFER_L1 = 0x02
+} CUfunc_cache;
+
+typedef enum CUmemorytype_enum {
+ CU_MEMORYTYPE_HOST = 0x01,
+ CU_MEMORYTYPE_DEVICE = 0x02,
+ CU_MEMORYTYPE_ARRAY = 0x03
+} CUmemorytype;
+
+typedef enum CUcomputemode_enum {
+ CU_COMPUTEMODE_DEFAULT = 0,
+ CU_COMPUTEMODE_EXCLUSIVE = 1,
+ CU_COMPUTEMODE_PROHIBITED = 2
+} CUcomputemode;
+
+typedef enum CUjit_option_enum
+{
+ CU_JIT_MAX_REGISTERS = 0,
+ CU_JIT_THREADS_PER_BLOCK,
+ CU_JIT_WALL_TIME,
+ CU_JIT_INFO_LOG_BUFFER,
+ CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES,
+ CU_JIT_ERROR_LOG_BUFFER,
+ CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES,
+ CU_JIT_OPTIMIZATION_LEVEL,
+ CU_JIT_TARGET_FROM_CUCONTEXT,
+ CU_JIT_TARGET,
+ CU_JIT_FALLBACK_STRATEGY
+
+} CUjit_option;
+
+typedef enum CUjit_target_enum
+{
+ CU_TARGET_COMPUTE_10 = 0,
+ CU_TARGET_COMPUTE_11,
+ CU_TARGET_COMPUTE_12,
+ CU_TARGET_COMPUTE_13,
+ CU_TARGET_COMPUTE_20,
+ CU_TARGET_COMPUTE_21
+} CUjit_target;
+
+typedef enum CUjit_fallback_enum
+{
+ CU_PREFER_PTX = 0,
+ CU_PREFER_BINARY
+
+} CUjit_fallback;
+
+typedef enum CUgraphicsRegisterFlags_enum {
+ CU_GRAPHICS_REGISTER_FLAGS_NONE = 0x00
+} CUgraphicsRegisterFlags;
+
+typedef enum CUgraphicsMapResourceFlags_enum {
+ CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE = 0x00,
+ CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY = 0x01,
+ CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD = 0x02
+} CUgraphicsMapResourceFlags;
+
+typedef enum CUarray_cubemap_face_enum {
+ CU_CUBEMAP_FACE_POSITIVE_X = 0x00,
+ CU_CUBEMAP_FACE_NEGATIVE_X = 0x01,
+ CU_CUBEMAP_FACE_POSITIVE_Y = 0x02,
+ CU_CUBEMAP_FACE_NEGATIVE_Y = 0x03,
+ CU_CUBEMAP_FACE_POSITIVE_Z = 0x04,
+ CU_CUBEMAP_FACE_NEGATIVE_Z = 0x05
+} CUarray_cubemap_face;
+
+typedef enum CUlimit_enum {
+ CU_LIMIT_STACK_SIZE = 0x00,
+ CU_LIMIT_PRINTF_FIFO_SIZE = 0x01,
+ CU_LIMIT_MALLOC_HEAP_SIZE = 0x02
+} CUlimit;
+
+typedef enum cudaError_enum {
+ CUDA_SUCCESS = 0,
+ CUDA_ERROR_INVALID_VALUE = 1,
+ CUDA_ERROR_OUT_OF_MEMORY = 2,
+ CUDA_ERROR_NOT_INITIALIZED = 3,
+ CUDA_ERROR_DEINITIALIZED = 4,
+ CUDA_ERROR_NO_DEVICE = 100,
+ CUDA_ERROR_INVALID_DEVICE = 101,
+ CUDA_ERROR_INVALID_IMAGE = 200,
+ CUDA_ERROR_INVALID_CONTEXT = 201,
+ CUDA_ERROR_CONTEXT_ALREADY_CURRENT = 202,
+ CUDA_ERROR_MAP_FAILED = 205,
+ CUDA_ERROR_UNMAP_FAILED = 206,
+ CUDA_ERROR_ARRAY_IS_MAPPED = 207,
+ CUDA_ERROR_ALREADY_MAPPED = 208,
+ CUDA_ERROR_NO_BINARY_FOR_GPU = 209,
+ CUDA_ERROR_ALREADY_ACQUIRED = 210,
+ CUDA_ERROR_NOT_MAPPED = 211,
+ CUDA_ERROR_NOT_MAPPED_AS_ARRAY = 212,
+ CUDA_ERROR_NOT_MAPPED_AS_POINTER = 213,
+ CUDA_ERROR_ECC_UNCORRECTABLE = 214,
+ CUDA_ERROR_UNSUPPORTED_LIMIT = 215,
+ CUDA_ERROR_INVALID_SOURCE = 300,
+ CUDA_ERROR_FILE_NOT_FOUND = 301,
+ CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND = 302,
+ CUDA_ERROR_SHARED_OBJECT_INIT_FAILED = 303,
+ CUDA_ERROR_OPERATING_SYSTEM = 304,
+ CUDA_ERROR_INVALID_HANDLE = 400,
+ CUDA_ERROR_NOT_FOUND = 500,
+ CUDA_ERROR_NOT_READY = 600,
+ CUDA_ERROR_LAUNCH_FAILED = 700,
+ CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES = 701,
+ CUDA_ERROR_LAUNCH_TIMEOUT = 702,
+ CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING = 703,
+ CUDA_ERROR_UNKNOWN = 999
+} CUresult;
+
+#define CU_MEMHOSTALLOC_PORTABLE 0x01
+#define CU_MEMHOSTALLOC_DEVICEMAP 0x02
+#define CU_MEMHOSTALLOC_WRITECOMBINED 0x04
+
+typedef struct CUDA_MEMCPY2D_st {
+ size_t srcXInBytes;
+ size_t srcY;
+
+ CUmemorytype srcMemoryType;
+ const void *srcHost;
+ CUdeviceptr srcDevice;
+ CUarray srcArray;
+ size_t srcPitch;
+
+ size_t dstXInBytes;
+ size_t dstY;
+
+ CUmemorytype dstMemoryType;
+ void *dstHost;
+ CUdeviceptr dstDevice;
+ CUarray dstArray;
+ size_t dstPitch;
+
+ size_t WidthInBytes;
+ size_t Height;
+} CUDA_MEMCPY2D;
+
+typedef struct CUDA_MEMCPY3D_st {
+ size_t srcXInBytes;
+ size_t srcY;
+ size_t srcZ;
+ size_t srcLOD;
+ CUmemorytype srcMemoryType;
+ const void *srcHost;
+ CUdeviceptr srcDevice;
+ CUarray srcArray;
+ void *reserved0;
+ size_t srcPitch;
+ size_t srcHeight;
+
+ size_t dstXInBytes;
+ size_t dstY;
+ size_t dstZ;
+ size_t dstLOD;
+ CUmemorytype dstMemoryType;
+ void *dstHost;
+ CUdeviceptr dstDevice;
+ CUarray dstArray;
+ void *reserved1;
+ size_t dstPitch;
+ size_t dstHeight;
+
+ size_t WidthInBytes;
+ size_t Height;
+ size_t Depth;
+} CUDA_MEMCPY3D;
+
+typedef struct CUDA_ARRAY_DESCRIPTOR_st
+{
+ size_t Width;
+ size_t Height;
+
+ CUarray_format Format;
+ unsigned int NumChannels;
+} CUDA_ARRAY_DESCRIPTOR;
+
+typedef struct CUDA_ARRAY3D_DESCRIPTOR_st
+{
+ size_t Width;
+ size_t Height;
+ size_t Depth;
+
+ CUarray_format Format;
+ unsigned int NumChannels;
+ unsigned int Flags;
+} CUDA_ARRAY3D_DESCRIPTOR;
+
+#define CUDA_ARRAY3D_2DARRAY 0x01
+#define CUDA_ARRAY3D_SURFACE_LDST 0x02
+#define CU_TRSA_OVERRIDE_FORMAT 0x01
+#define CU_TRSF_READ_AS_INTEGER 0x01
+#define CU_TRSF_NORMALIZED_COORDINATES 0x02
+#define CU_TRSF_SRGB 0x10
+#define CU_PARAM_TR_DEFAULT -1
+
+#ifdef _WIN32
+#define CUDAAPI __stdcall
+#else
+#define CUDAAPI
+#endif
+
+/* function types */
+
+typedef CUresult CUDAAPI tcuInit(unsigned int Flags);
+typedef CUresult CUDAAPI tcuDriverGetVersion(int *driverVersion);
+typedef CUresult CUDAAPI tcuDeviceGet(CUdevice *device, int ordinal);
+typedef CUresult CUDAAPI tcuDeviceGetCount(int *count);
+typedef CUresult CUDAAPI tcuDeviceGetName(char *name, int len, CUdevice dev);
+typedef CUresult CUDAAPI tcuDeviceComputeCapability(int *major, int *minor, CUdevice dev);
+typedef CUresult CUDAAPI tcuDeviceTotalMem(size_t *bytes, CUdevice dev);
+typedef CUresult CUDAAPI tcuDeviceGetProperties(CUdevprop *prop, CUdevice dev);
+typedef CUresult CUDAAPI tcuDeviceGetAttribute(int *pi, CUdevice_attribute attrib, CUdevice dev);
+typedef CUresult CUDAAPI tcuCtxCreate(CUcontext *pctx, unsigned int flags, CUdevice dev);
+typedef CUresult CUDAAPI tcuCtxDestroy(CUcontext ctx);
+typedef CUresult CUDAAPI tcuCtxAttach(CUcontext *pctx, unsigned int flags);
+typedef CUresult CUDAAPI tcuCtxDetach(CUcontext ctx);
+typedef CUresult CUDAAPI tcuCtxPushCurrent(CUcontext ctx );
+typedef CUresult CUDAAPI tcuCtxPopCurrent(CUcontext *pctx);
+typedef CUresult CUDAAPI tcuCtxGetDevice(CUdevice *device);
+typedef CUresult CUDAAPI tcuCtxSynchronize(void);
+typedef CUresult CUDAAPI tcuCtxSetLimit(CUlimit limit, size_t value);
+typedef CUresult CUDAAPI tcuCtxGetLimit(size_t *pvalue, CUlimit limit);
+typedef CUresult CUDAAPI tcuCtxGetCacheConfig(CUfunc_cache *pconfig);
+typedef CUresult CUDAAPI tcuCtxSetCacheConfig(CUfunc_cache config);
+typedef CUresult CUDAAPI tcuCtxGetApiVersion(CUcontext ctx, unsigned int *version);
+typedef CUresult CUDAAPI tcuModuleLoad(CUmodule *module, const char *fname);
+typedef CUresult CUDAAPI tcuModuleLoadData(CUmodule *module, const void *image);
+typedef CUresult CUDAAPI tcuModuleLoadDataEx(CUmodule *module, const void *image, unsigned int numOptions, CUjit_option *options, void **optionValues);
+typedef CUresult CUDAAPI tcuModuleLoadFatBinary(CUmodule *module, const void *fatCubin);
+typedef CUresult CUDAAPI tcuModuleUnload(CUmodule hmod);
+typedef CUresult CUDAAPI tcuModuleGetFunction(CUfunction *hfunc, CUmodule hmod, const char *name);
+typedef CUresult CUDAAPI tcuModuleGetGlobal(CUdeviceptr *dptr, size_t *bytes, CUmodule hmod, const char *name);
+typedef CUresult CUDAAPI tcuModuleGetTexRef(CUtexref *pTexRef, CUmodule hmod, const char *name);
+typedef CUresult CUDAAPI tcuModuleGetSurfRef(CUsurfref *pSurfRef, CUmodule hmod, const char *name);
+typedef CUresult CUDAAPI tcuMemGetInfo(size_t *free, size_t *total);
+typedef CUresult CUDAAPI tcuMemAlloc(CUdeviceptr *dptr, size_t bytesize);
+typedef CUresult CUDAAPI tcuMemAllocPitch(CUdeviceptr *dptr, size_t *pPitch, size_t WidthInBytes, size_t Height, unsigned int ElementSizeBytes);
+typedef CUresult CUDAAPI tcuMemFree(CUdeviceptr dptr);
+typedef CUresult CUDAAPI tcuMemGetAddressRange(CUdeviceptr *pbase, size_t *psize, CUdeviceptr dptr);
+typedef CUresult CUDAAPI tcuMemAllocHost(void **pp, size_t bytesize);
+typedef CUresult CUDAAPI tcuMemFreeHost(void *p);
+typedef CUresult CUDAAPI tcuMemHostAlloc(void **pp, size_t bytesize, unsigned int Flags);
+typedef CUresult CUDAAPI tcuMemHostGetDevicePointer(CUdeviceptr *pdptr, void *p, unsigned int Flags);
+typedef CUresult CUDAAPI tcuMemHostGetFlags(unsigned int *pFlags, void *p);
+typedef CUresult CUDAAPI tcuMemcpyHtoD(CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpyDtoH(void *dstHost, CUdeviceptr srcDevice, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpyDtoD(CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpyDtoA(CUarray dstArray, size_t dstOffset, CUdeviceptr srcDevice, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpyAtoD(CUdeviceptr dstDevice, CUarray srcArray, size_t srcOffset, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpyHtoA(CUarray dstArray, size_t dstOffset, const void *srcHost, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpyAtoH(void *dstHost, CUarray srcArray, size_t srcOffset, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpyAtoA(CUarray dstArray, size_t dstOffset, CUarray srcArray, size_t srcOffset, size_t ByteCount);
+typedef CUresult CUDAAPI tcuMemcpy2D(const CUDA_MEMCPY2D *pCopy);
+typedef CUresult CUDAAPI tcuMemcpy2DUnaligned(const CUDA_MEMCPY2D *pCopy);
+typedef CUresult CUDAAPI tcuMemcpy3D(const CUDA_MEMCPY3D *pCopy);
+typedef CUresult CUDAAPI tcuMemcpyHtoDAsync(CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemcpyDtoHAsync(void *dstHost, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemcpyDtoDAsync(CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemcpyHtoAAsync(CUarray dstArray, size_t dstOffset, const void *srcHost, size_t ByteCount, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemcpyAtoHAsync(void *dstHost, CUarray srcArray, size_t srcOffset, size_t ByteCount, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemcpy2DAsync(const CUDA_MEMCPY2D *pCopy, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemcpy3DAsync(const CUDA_MEMCPY3D *pCopy, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemsetD8(CUdeviceptr dstDevice, unsigned char uc, size_t N);
+typedef CUresult CUDAAPI tcuMemsetD16(CUdeviceptr dstDevice, unsigned short us, size_t N);
+typedef CUresult CUDAAPI tcuMemsetD32(CUdeviceptr dstDevice, unsigned int ui, size_t N);
+typedef CUresult CUDAAPI tcuMemsetD2D8(CUdeviceptr dstDevice, size_t dstPitch, unsigned char uc, size_t Width, size_t Height);
+typedef CUresult CUDAAPI tcuMemsetD2D16(CUdeviceptr dstDevice, size_t dstPitch, unsigned short us, size_t Width, size_t Height);
+typedef CUresult CUDAAPI tcuMemsetD2D32(CUdeviceptr dstDevice, size_t dstPitch, unsigned int ui, size_t Width, size_t Height);
+typedef CUresult CUDAAPI tcuMemsetD8Async(CUdeviceptr dstDevice, unsigned char uc, size_t N, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemsetD16Async(CUdeviceptr dstDevice, unsigned short us, size_t N, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemsetD32Async(CUdeviceptr dstDevice, unsigned int ui, size_t N, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemsetD2D8Async(CUdeviceptr dstDevice, size_t dstPitch, unsigned char uc, size_t Width, size_t Height, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemsetD2D16Async(CUdeviceptr dstDevice, size_t dstPitch, unsigned short us, size_t Width, size_t Height, CUstream hStream);
+typedef CUresult CUDAAPI tcuMemsetD2D32Async(CUdeviceptr dstDevice, size_t dstPitch, unsigned int ui, size_t Width, size_t Height, CUstream hStream);
+typedef CUresult CUDAAPI tcuArrayCreate(CUarray *pHandle, const CUDA_ARRAY_DESCRIPTOR *pAllocateArray);
+typedef CUresult CUDAAPI tcuArrayGetDescriptor(CUDA_ARRAY_DESCRIPTOR *pArrayDescriptor, CUarray hArray);
+typedef CUresult CUDAAPI tcuArrayDestroy(CUarray hArray);
+typedef CUresult CUDAAPI tcuArray3DCreate(CUarray *pHandle, const CUDA_ARRAY3D_DESCRIPTOR *pAllocateArray);
+typedef CUresult CUDAAPI tcuArray3DGetDescriptor(CUDA_ARRAY3D_DESCRIPTOR *pArrayDescriptor, CUarray hArray);
+typedef CUresult CUDAAPI tcuStreamCreate(CUstream *phStream, unsigned int Flags);
+typedef CUresult CUDAAPI tcuStreamWaitEvent(CUstream hStream, CUevent hEvent, unsigned int Flags);
+typedef CUresult CUDAAPI tcuStreamQuery(CUstream hStream);
+typedef CUresult CUDAAPI tcuStreamSynchronize(CUstream hStream);
+typedef CUresult CUDAAPI tcuStreamDestroy(CUstream hStream);
+typedef CUresult CUDAAPI tcuEventCreate(CUevent *phEvent, unsigned int Flags);
+typedef CUresult CUDAAPI tcuEventRecord(CUevent hEvent, CUstream hStream);
+typedef CUresult CUDAAPI tcuEventQuery(CUevent hEvent);
+typedef CUresult CUDAAPI tcuEventSynchronize(CUevent hEvent);
+typedef CUresult CUDAAPI tcuEventDestroy(CUevent hEvent);
+typedef CUresult CUDAAPI tcuEventElapsedTime(float *pMilliseconds, CUevent hStart, CUevent hEnd);
+typedef CUresult CUDAAPI tcuFuncSetBlockShape(CUfunction hfunc, int x, int y, int z);
+typedef CUresult CUDAAPI tcuFuncSetSharedSize(CUfunction hfunc, unsigned int bytes);
+typedef CUresult CUDAAPI tcuFuncGetAttribute(int *pi, CUfunction_attribute attrib, CUfunction hfunc);
+typedef CUresult CUDAAPI tcuFuncSetCacheConfig(CUfunction hfunc, CUfunc_cache config);
+typedef CUresult CUDAAPI tcuParamSetSize(CUfunction hfunc, unsigned int numbytes);
+typedef CUresult CUDAAPI tcuParamSeti(CUfunction hfunc, int offset, unsigned int value);
+typedef CUresult CUDAAPI tcuParamSetf(CUfunction hfunc, int offset, float value);
+typedef CUresult CUDAAPI tcuParamSetv(CUfunction hfunc, int offset, void *ptr, unsigned int numbytes);
+typedef CUresult CUDAAPI tcuLaunch(CUfunction f);
+typedef CUresult CUDAAPI tcuLaunchGrid(CUfunction f, int grid_width, int grid_height);
+typedef CUresult CUDAAPI tcuLaunchGridAsync(CUfunction f, int grid_width, int grid_height, CUstream hStream);
+typedef CUresult CUDAAPI tcuParamSetTexRef(CUfunction hfunc, int texunit, CUtexref hTexRef);
+typedef CUresult CUDAAPI tcuTexRefSetArray(CUtexref hTexRef, CUarray hArray, unsigned int Flags);
+typedef CUresult CUDAAPI tcuTexRefSetAddress(size_t *ByteOffset, CUtexref hTexRef, CUdeviceptr dptr, size_t bytes);
+typedef CUresult CUDAAPI tcuTexRefSetAddress2D(CUtexref hTexRef, const CUDA_ARRAY_DESCRIPTOR *desc, CUdeviceptr dptr, size_t Pitch);
+typedef CUresult CUDAAPI tcuTexRefSetFormat(CUtexref hTexRef, CUarray_format fmt, int NumPackedComponents);
+typedef CUresult CUDAAPI tcuTexRefSetAddressMode(CUtexref hTexRef, int dim, CUaddress_mode am);
+typedef CUresult CUDAAPI tcuTexRefSetFilterMode(CUtexref hTexRef, CUfilter_mode fm);
+typedef CUresult CUDAAPI tcuTexRefSetFlags(CUtexref hTexRef, unsigned int Flags);
+typedef CUresult CUDAAPI tcuTexRefGetAddress(CUdeviceptr *pdptr, CUtexref hTexRef);
+typedef CUresult CUDAAPI tcuTexRefGetArray(CUarray *phArray, CUtexref hTexRef);
+typedef CUresult CUDAAPI tcuTexRefGetAddressMode(CUaddress_mode *pam, CUtexref hTexRef, int dim);
+typedef CUresult CUDAAPI tcuTexRefGetFilterMode(CUfilter_mode *pfm, CUtexref hTexRef);
+typedef CUresult CUDAAPI tcuTexRefGetFormat(CUarray_format *pFormat, int *pNumChannels, CUtexref hTexRef);
+typedef CUresult CUDAAPI tcuTexRefGetFlags(unsigned int *pFlags, CUtexref hTexRef);
+typedef CUresult CUDAAPI tcuTexRefCreate(CUtexref *pTexRef);
+typedef CUresult CUDAAPI tcuTexRefDestroy(CUtexref hTexRef);
+typedef CUresult CUDAAPI tcuSurfRefSetArray(CUsurfref hSurfRef, CUarray hArray, unsigned int Flags);
+typedef CUresult CUDAAPI tcuSurfRefGetArray(CUarray *phArray, CUsurfref hSurfRef);
+typedef CUresult CUDAAPI tcuGraphicsUnregisterResource(CUgraphicsResource resource);
+typedef CUresult CUDAAPI tcuGraphicsSubResourceGetMappedArray(CUarray *pArray, CUgraphicsResource resource, unsigned int arrayIndex, unsigned int mipLevel);
+typedef CUresult CUDAAPI tcuGraphicsResourceGetMappedPointer(CUdeviceptr *pDevPtr, size_t *pSize, CUgraphicsResource resource);
+typedef CUresult CUDAAPI tcuGraphicsResourceSetMapFlags(CUgraphicsResource resource, unsigned int flags);
+typedef CUresult CUDAAPI tcuGraphicsMapResources(unsigned int count, CUgraphicsResource *resources, CUstream hStream);
+typedef CUresult CUDAAPI tcuGraphicsUnmapResources(unsigned int count, CUgraphicsResource *resources, CUstream hStream);
+typedef CUresult CUDAAPI tcuGetExportTable(const void **ppExportTable, const CUuuid *pExportTableId);
+typedef CUresult CUDAAPI tcuGLCtxCreate(CUcontext *pCtx, unsigned int Flags, CUdevice device );
+typedef CUresult CUDAAPI tcuGraphicsGLRegisterBuffer(CUgraphicsResource *pCudaResource, GLuint buffer, unsigned int Flags);
+typedef CUresult CUDAAPI tcuGraphicsGLRegisterImage(CUgraphicsResource *pCudaResource, GLuint image, GLenum target, unsigned int Flags);
+typedef CUresult CUDAAPI tcuCtxSetCurrent(CUcontext ctx);
+
+/* function declarations */
+
+extern tcuInit *cuInit;
+extern tcuDriverGetVersion *cuDriverGetVersion;
+extern tcuDeviceGet *cuDeviceGet;
+extern tcuDeviceGetCount *cuDeviceGetCount;
+extern tcuDeviceGetName *cuDeviceGetName;
+extern tcuDeviceComputeCapability *cuDeviceComputeCapability;
+extern tcuDeviceTotalMem *cuDeviceTotalMem;
+extern tcuDeviceGetProperties *cuDeviceGetProperties;
+extern tcuDeviceGetAttribute *cuDeviceGetAttribute;
+extern tcuCtxCreate *cuCtxCreate;
+extern tcuCtxDestroy *cuCtxDestroy;
+extern tcuCtxAttach *cuCtxAttach;
+extern tcuCtxDetach *cuCtxDetach;
+extern tcuCtxPushCurrent *cuCtxPushCurrent;
+extern tcuCtxPopCurrent *cuCtxPopCurrent;
+extern tcuCtxGetDevice *cuCtxGetDevice;
+extern tcuCtxSynchronize *cuCtxSynchronize;
+extern tcuModuleLoad *cuModuleLoad;
+extern tcuModuleLoadData *cuModuleLoadData;
+extern tcuModuleLoadDataEx *cuModuleLoadDataEx;
+extern tcuModuleLoadFatBinary *cuModuleLoadFatBinary;
+extern tcuModuleUnload *cuModuleUnload;
+extern tcuModuleGetFunction *cuModuleGetFunction;
+extern tcuModuleGetGlobal *cuModuleGetGlobal;
+extern tcuModuleGetTexRef *cuModuleGetTexRef;
+extern tcuModuleGetSurfRef *cuModuleGetSurfRef;
+extern tcuMemGetInfo *cuMemGetInfo;
+extern tcuMemAlloc *cuMemAlloc;
+extern tcuMemAllocPitch *cuMemAllocPitch;
+extern tcuMemFree *cuMemFree;
+extern tcuMemGetAddressRange *cuMemGetAddressRange;
+extern tcuMemAllocHost *cuMemAllocHost;
+extern tcuMemFreeHost *cuMemFreeHost;
+extern tcuMemHostAlloc *cuMemHostAlloc;
+extern tcuMemHostGetDevicePointer *cuMemHostGetDevicePointer;
+extern tcuMemHostGetFlags *cuMemHostGetFlags;
+extern tcuMemcpyHtoD *cuMemcpyHtoD;
+extern tcuMemcpyDtoH *cuMemcpyDtoH;
+extern tcuMemcpyDtoD *cuMemcpyDtoD;
+extern tcuMemcpyDtoA *cuMemcpyDtoA;
+extern tcuMemcpyAtoD *cuMemcpyAtoD;
+extern tcuMemcpyHtoA *cuMemcpyHtoA;
+extern tcuMemcpyAtoH *cuMemcpyAtoH;
+extern tcuMemcpyAtoA *cuMemcpyAtoA;
+extern tcuMemcpy2D *cuMemcpy2D;
+extern tcuMemcpy2DUnaligned *cuMemcpy2DUnaligned;
+extern tcuMemcpy3D *cuMemcpy3D;
+extern tcuMemcpyHtoDAsync *cuMemcpyHtoDAsync;
+extern tcuMemcpyDtoHAsync *cuMemcpyDtoHAsync;
+extern tcuMemcpyDtoDAsync *cuMemcpyDtoDAsync;
+extern tcuMemcpyHtoAAsync *cuMemcpyHtoAAsync;
+extern tcuMemcpyAtoHAsync *cuMemcpyAtoHAsync;
+extern tcuMemcpy2DAsync *cuMemcpy2DAsync;
+extern tcuMemcpy3DAsync *cuMemcpy3DAsync;
+extern tcuMemsetD8 *cuMemsetD8;
+extern tcuMemsetD16 *cuMemsetD16;
+extern tcuMemsetD32 *cuMemsetD32;
+extern tcuMemsetD2D8 *cuMemsetD2D8;
+extern tcuMemsetD2D16 *cuMemsetD2D16;
+extern tcuMemsetD2D32 *cuMemsetD2D32;
+extern tcuFuncSetBlockShape *cuFuncSetBlockShape;
+extern tcuFuncSetSharedSize *cuFuncSetSharedSize;
+extern tcuFuncGetAttribute *cuFuncGetAttribute;
+extern tcuFuncSetCacheConfig *cuFuncSetCacheConfig;
+extern tcuArrayCreate *cuArrayCreate;
+extern tcuArrayGetDescriptor *cuArrayGetDescriptor;
+extern tcuArrayDestroy *cuArrayDestroy;
+extern tcuArray3DCreate *cuArray3DCreate;
+extern tcuArray3DGetDescriptor *cuArray3DGetDescriptor;
+extern tcuTexRefCreate *cuTexRefCreate;
+extern tcuTexRefDestroy *cuTexRefDestroy;
+extern tcuTexRefSetArray *cuTexRefSetArray;
+extern tcuTexRefSetAddress *cuTexRefSetAddress;
+extern tcuTexRefSetAddress2D *cuTexRefSetAddress2D;
+extern tcuTexRefSetFormat *cuTexRefSetFormat;
+extern tcuTexRefSetAddressMode *cuTexRefSetAddressMode;
+extern tcuTexRefSetFilterMode *cuTexRefSetFilterMode;
+extern tcuTexRefSetFlags *cuTexRefSetFlags;
+extern tcuTexRefGetAddress *cuTexRefGetAddress;
+extern tcuTexRefGetArray *cuTexRefGetArray;
+extern tcuTexRefGetAddressMode *cuTexRefGetAddressMode;
+extern tcuTexRefGetFilterMode *cuTexRefGetFilterMode;
+extern tcuTexRefGetFormat *cuTexRefGetFormat;
+extern tcuTexRefGetFlags *cuTexRefGetFlags;
+extern tcuSurfRefSetArray *cuSurfRefSetArray;
+extern tcuSurfRefGetArray *cuSurfRefGetArray;
+extern tcuParamSetSize *cuParamSetSize;
+extern tcuParamSeti *cuParamSeti;
+extern tcuParamSetf *cuParamSetf;
+extern tcuParamSetv *cuParamSetv;
+extern tcuParamSetTexRef *cuParamSetTexRef;
+extern tcuLaunch *cuLaunch;
+extern tcuLaunchGrid *cuLaunchGrid;
+extern tcuLaunchGridAsync *cuLaunchGridAsync;
+extern tcuEventCreate *cuEventCreate;
+extern tcuEventRecord *cuEventRecord;
+extern tcuEventQuery *cuEventQuery;
+extern tcuEventSynchronize *cuEventSynchronize;
+extern tcuEventDestroy *cuEventDestroy;
+extern tcuEventElapsedTime *cuEventElapsedTime;
+extern tcuStreamCreate *cuStreamCreate;
+extern tcuStreamQuery *cuStreamQuery;
+extern tcuStreamSynchronize *cuStreamSynchronize;
+extern tcuStreamDestroy *cuStreamDestroy;
+extern tcuGraphicsUnregisterResource *cuGraphicsUnregisterResource;
+extern tcuGraphicsSubResourceGetMappedArray *cuGraphicsSubResourceGetMappedArray;
+extern tcuGraphicsResourceGetMappedPointer *cuGraphicsResourceGetMappedPointer;
+extern tcuGraphicsResourceSetMapFlags *cuGraphicsResourceSetMapFlags;
+extern tcuGraphicsMapResources *cuGraphicsMapResources;
+extern tcuGraphicsUnmapResources *cuGraphicsUnmapResources;
+extern tcuGetExportTable *cuGetExportTable;
+extern tcuCtxSetLimit *cuCtxSetLimit;
+extern tcuCtxGetLimit *cuCtxGetLimit;
+extern tcuGLCtxCreate *cuGLCtxCreate;
+extern tcuGraphicsGLRegisterBuffer *cuGraphicsGLRegisterBuffer;
+extern tcuGraphicsGLRegisterImage *cuGraphicsGLRegisterImage;
+extern tcuCtxSetCurrent *cuCtxSetCurrent;
+
+#endif /* __UTIL_CUDA_H__ */
+
diff --git a/intern/cycles/util/util_debug.h b/intern/cycles/util/util_debug.h
new file mode 100644
index 00000000000..17c169859ec
--- /dev/null
+++ b/intern/cycles/util/util_debug.h
@@ -0,0 +1,25 @@
+/*
+ * 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 __UTIL_DEBUG_H__
+#define __UTIL_DEBUG_H__
+
+#include <assert.h>
+
+#endif /* __UTIL_DEBUG_H__ */
+
diff --git a/intern/cycles/util/util_dynlib.cpp b/intern/cycles/util/util_dynlib.cpp
new file mode 100644
index 00000000000..5836073a07a
--- /dev/null
+++ b/intern/cycles/util/util_dynlib.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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 <stdlib.h>
+
+#include "util_dynlib.h"
+
+#ifdef _WIN32
+
+#include <Windows.h>
+
+CCL_NAMESPACE_BEGIN
+
+struct DynamicLibrary {
+ HMODULE module;
+};
+
+DynamicLibrary *dynamic_library_open(const char *name)
+{
+ HMODULE module = LoadLibrary(name);
+
+ if(!module)
+ return NULL;
+
+ DynamicLibrary *lib = new DynamicLibrary();
+ lib->module = module;
+
+ return lib;
+}
+
+void *dynamic_library_find(DynamicLibrary *lib, const char *name)
+{
+ return (void*)GetProcAddress(lib->module, name);
+}
+
+void dynamic_library_close(DynamicLibrary *lib)
+{
+ FreeLibrary(lib->module);
+ delete lib;
+}
+
+CCL_NAMESPACE_END
+
+#else
+
+#include <dlfcn.h>
+
+CCL_NAMESPACE_BEGIN
+
+struct DynamicLibrary {
+ void *module;
+};
+
+DynamicLibrary *dynamic_library_open(const char *name)
+{
+ void *module = dlopen(name, RTLD_NOW);
+
+ if(!module)
+ return NULL;
+
+ DynamicLibrary *lib = new DynamicLibrary();
+ lib->module = module;
+
+ return lib;
+}
+
+void *dynamic_library_find(DynamicLibrary *lib, const char *name)
+{
+ return dlsym(lib->module, name);
+}
+
+void dynamic_library_close(DynamicLibrary *lib)
+{
+ dlclose(lib->module);
+ delete lib;
+}
+
+CCL_NAMESPACE_END
+
+#endif
+
diff --git a/intern/cycles/util/util_dynlib.h b/intern/cycles/util/util_dynlib.h
new file mode 100644
index 00000000000..888fb6cef24
--- /dev/null
+++ b/intern/cycles/util/util_dynlib.h
@@ -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.
+ */
+
+#ifndef __UTIL_DYNLIB_H__
+#define __UTIL_DYNLIB_H__
+
+CCL_NAMESPACE_BEGIN
+
+struct DynamicLibrary;
+
+DynamicLibrary *dynamic_library_open(const char *name);
+void *dynamic_library_find(DynamicLibrary *lib, const char *name);
+void dynamic_library_close(DynamicLibrary *lib);
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_DYNLIB_H__ */
+
diff --git a/intern/cycles/util/util_foreach.h b/intern/cycles/util/util_foreach.h
new file mode 100644
index 00000000000..b8298c003b5
--- /dev/null
+++ b/intern/cycles/util/util_foreach.h
@@ -0,0 +1,28 @@
+/*
+ * 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 __UTIL_FOREACH_H__
+#define __UTIL_FOREACH_H__
+
+/* Use Boost to get nice foreach() loops for STL data structures. */
+
+#include <boost/foreach.hpp>
+#define foreach BOOST_FOREACH
+
+#endif /* __UTIL_FOREACH_H__ */
+
diff --git a/intern/cycles/util/util_function.h b/intern/cycles/util/util_function.h
new file mode 100644
index 00000000000..dfcd58183d9
--- /dev/null
+++ b/intern/cycles/util/util_function.h
@@ -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.
+ */
+
+#ifndef __UTIL_FUNCTION_H__
+#define __UTIL_FUNCTION_H__
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+
+CCL_NAMESPACE_BEGIN
+
+using boost::function;
+#define function_bind boost::bind
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_FUNCTION_H__ */
+
diff --git a/intern/cycles/util/util_hash.h b/intern/cycles/util/util_hash.h
new file mode 100644
index 00000000000..16901dab38e
--- /dev/null
+++ b/intern/cycles/util/util_hash.h
@@ -0,0 +1,55 @@
+/*
+ * 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 __UTIL_HASH_H__
+#define __UTIL_HASH_H__
+
+CCL_NAMESPACE_BEGIN
+
+static inline unsigned int hash_int_2d(unsigned int kx, unsigned int ky)
+{
+ #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
+
+ unsigned int a, b, c;
+
+ a = b = c = 0xdeadbeef + (2 << 2) + 13;
+ a += kx;
+ b += ky;
+
+ c ^= b; c -= rot(b,14);
+ a ^= c; a -= rot(c,11);
+ b ^= a; b -= rot(a,25);
+ c ^= b; c -= rot(b,16);
+ a ^= c; a -= rot(c,4);
+ b ^= a; b -= rot(a,14);
+ c ^= b; c -= rot(b,24);
+
+ return c;
+
+ #undef rot
+}
+
+static inline unsigned int hash_int(unsigned int k)
+{
+ return hash_int_2d(k, 0);
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_HASH_H__ */
+
diff --git a/intern/cycles/util/util_image.h b/intern/cycles/util/util_image.h
new file mode 100644
index 00000000000..df566ccc79c
--- /dev/null
+++ b/intern/cycles/util/util_image.h
@@ -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.
+ */
+
+#ifndef __UTIL_IMAGE_H__
+#define __UTIL_IMAGE_H__
+
+/* OpenImageIO is used for all image file reading and writing. */
+
+#include <OpenImageIO/imageio.h>
+
+CCL_NAMESPACE_BEGIN
+
+OIIO_NAMESPACE_USING
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_IMAGE_H__ */
+
diff --git a/intern/cycles/util/util_list.h b/intern/cycles/util/util_list.h
new file mode 100644
index 00000000000..d8f79643469
--- /dev/null
+++ b/intern/cycles/util/util_list.h
@@ -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.
+ */
+
+#ifndef __UTIL_LIST_H__
+#define __UTIL_LIST_H__
+
+#include <list>
+
+CCL_NAMESPACE_BEGIN
+
+using std::list;
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_LIST_H__ */
+
diff --git a/intern/cycles/util/util_map.h b/intern/cycles/util/util_map.h
new file mode 100644
index 00000000000..f0abe70f785
--- /dev/null
+++ b/intern/cycles/util/util_map.h
@@ -0,0 +1,34 @@
+/*
+ * 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 __UTIL_MAP_H__
+#define __UTIL_MAP_H__
+
+#include <map>
+#include <boost/tr1/unordered_map.hpp>
+
+CCL_NAMESPACE_BEGIN
+
+using std::map;
+using std::pair;
+using std::tr1::unordered_map;
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_MAP_H__ */
+
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h
new file mode 100644
index 00000000000..c0dd627a606
--- /dev/null
+++ b/intern/cycles/util/util_math.h
@@ -0,0 +1,799 @@
+/*
+ * 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 __UTIL_MATH_H__
+#define __UTIL_MATH_H__
+
+/* Math
+ *
+ * Basic math functions on scalar and vector types. This header is used by
+ * both the kernel code when compiled as C++, and other C++ non-kernel code. */
+
+#ifndef __KERNEL_OPENCL__
+
+#define _USE_MATH_DEFINES
+
+#include <float.h>
+#include <math.h>
+#include <stdio.h>
+
+#endif
+
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+#ifndef M_PI_F
+#define M_PI_F ((float)3.14159265358979323846264338327950288)
+#endif
+#ifndef M_PI_2_F
+#define M_PI_2_F ((float)1.57079632679489661923132169163975144)
+#endif
+#ifndef M_PI_4_F
+#define M_PI_4_F ((float)0.785398163397448309615660845819875721)
+#endif
+#ifndef M_1_PI_F
+#define M_1_PI_F ((float)0.318309886183790671537767526745028724)
+#endif
+#ifndef M_2_PI_F
+#define M_2_PI_F ((float)0.636619772367581343075535053490057448)
+#endif
+
+/* Scalar */
+
+#ifdef _WIN32
+
+#ifndef __KERNEL_GPU__
+
+#if(!defined(FREE_WINDOWS))
+#define copysignf(x, y) ((float)_copysign(x, y))
+#define hypotf(x, y) _hypotf(x, y)
+#endif
+
+#endif
+
+__device_inline float fmaxf(float a, float b)
+{
+ return (a > b)? a: b;
+}
+
+__device_inline float fminf(float a, float b)
+{
+ return (a < b)? a: b;
+}
+
+#endif
+
+#ifndef __KERNEL_GPU__
+
+__device_inline int max(int a, int b)
+{
+ return (a > b)? a: b;
+}
+
+__device_inline int min(int a, int b)
+{
+ return (a < b)? a: b;
+}
+
+__device_inline float max(float a, float b)
+{
+ return (a > b)? a: b;
+}
+
+__device_inline float min(float a, float b)
+{
+ return (a < b)? a: b;
+}
+
+__device_inline double max(double a, double b)
+{
+ return (a > b)? a: b;
+}
+
+__device_inline double min(double a, double b)
+{
+ return (a < b)? a: b;
+}
+
+#endif
+
+__device_inline float min4(float a, float b, float c, float d)
+{
+ return min(min(min(a, b), c), d);
+}
+
+__device_inline float max4(float a, float b, float c, float d)
+{
+ return max(max(max(a, b), c), d);
+}
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline int clamp(int a, int mn, int mx)
+{
+ return min(max(a, mn), mx);
+}
+
+__device_inline float clamp(float a, float mn, float mx)
+{
+ return min(max(a, mn), mx);
+}
+
+#endif
+
+__device_inline float signf(float f)
+{
+ return (f < 0.0f)? -1.0f: 1.0f;
+}
+
+__device_inline float nonzerof(float f, float eps)
+{
+ if(fabsf(f) < eps)
+ return signf(f)*eps;
+ else
+ return f;
+}
+
+/* Float2 Vector */
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline bool is_zero(const float2 a)
+{
+ return (a.x == 0.0f && a.y == 0.0f);
+}
+
+#endif
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline float average(const float2 a)
+{
+ return (a.x + a.y)*(1.0f/2.0f);
+}
+
+#endif
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline float2 operator-(const float2 a)
+{
+ float2 r = {-a.x, -a.y};
+ return r;
+}
+
+__device_inline float2 operator*(const float2 a, const float2 b)
+{
+ float2 r = {a.x*b.x, a.y*b.y};
+ return r;
+}
+
+__device_inline float2 operator*(const float2 a, float f)
+{
+ float2 r = {a.x*f, a.y*f};
+ return r;
+}
+
+__device_inline float2 operator*(float f, const float2 a)
+{
+ float2 r = {a.x*f, a.y*f};
+ return r;
+}
+
+__device_inline float2 operator/(float f, const float2 a)
+{
+ float2 r = {f/a.x, f/a.y};
+ return r;
+}
+
+__device_inline float2 operator/(const float2 a, float f)
+{
+ float invf = 1.0f/f;
+ float2 r = {a.x*invf, a.y*invf};
+ return r;
+}
+
+__device_inline float2 operator/(const float2 a, const float2 b)
+{
+ float2 r = {a.x/b.x, a.y/b.y};
+ return r;
+}
+
+__device_inline float2 operator+(const float2 a, const float2 b)
+{
+ float2 r = {a.x+b.x, a.y+b.y};
+ return r;
+}
+
+__device_inline float2 operator-(const float2 a, const float2 b)
+{
+ float2 r = {a.x-b.x, a.y-b.y};
+ return r;
+}
+
+__device_inline float2 operator+=(float2& a, const float2 b)
+{
+ a.x += b.x;
+ a.y += b.y;
+ return a;
+}
+
+__device_inline float2 operator*=(float2& a, const float2 b)
+{
+ a.x *= b.x;
+ a.y *= b.y;
+ return a;
+}
+
+__device_inline float2 operator*=(float2& a, float f)
+{
+ a.x *= f;
+ a.y *= f;
+ return a;
+}
+
+__device_inline float2 operator/=(float2& a, const float2 b)
+{
+ a.x /= b.x;
+ a.y /= b.y;
+ return a;
+}
+
+__device_inline float2 operator/=(float2& a, float f)
+{
+ float invf = 1.0f/f;
+ a.x *= invf;
+ a.y *= invf;
+ return a;
+}
+
+
+__device_inline float dot(const float2 a, const float2 b)
+{
+ return a.x*b.x + a.y*b.y;
+}
+
+__device_inline float cross(const float2 a, const float2 b)
+{
+ return (a.x*b.y - a.y*b.x);
+}
+
+#endif
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline float len(const float2 a)
+{
+ return sqrtf(dot(a, a));
+}
+
+__device_inline float2 normalize(const float2 a)
+{
+ return a/len(a);
+}
+
+__device_inline float2 normalize_len(const float2 a, float *t)
+{
+ *t = len(a);
+ return a/(*t);
+}
+
+__device_inline bool operator==(const float2 a, const float2 b)
+{
+ return (a.x == b.x && a.y == b.y);
+}
+
+__device_inline bool operator!=(const float2 a, const float2 b)
+{
+ return !(a == b);
+}
+
+__device_inline float2 min(float2 a, float2 b)
+{
+ float2 r = {min(a.x, b.x), min(a.y, b.y)};
+ return r;
+}
+
+__device_inline float2 max(float2 a, float2 b)
+{
+ float2 r = {max(a.x, b.x), max(a.y, b.y)};
+ return r;
+}
+
+__device_inline float2 clamp(float2 a, float2 mn, float2 mx)
+{
+ return min(max(a, mn), mx);
+}
+
+__device_inline float2 fabs(float2 a)
+{
+ return make_float2(fabsf(a.x), fabsf(a.y));
+}
+
+__device_inline float2 as_float2(const float4 a)
+{
+ return make_float2(a.x, a.y);
+}
+
+#endif
+
+#ifndef __KERNEL_GPU__
+
+__device_inline void print_float2(const char *label, const float2& a)
+{
+ printf("%s: %.8f %.8f\n", label, a.x, a.y);
+}
+
+#endif
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline float2 interp(float2 a, float2 b, float t)
+{
+ return a + t*(b - a);
+}
+
+#endif
+
+/* Float3 Vector */
+
+__device_inline bool is_zero(const float3 a)
+{
+ return (a.x == 0.0f && a.y == 0.0f && a.z == 0.0f);
+}
+
+__device_inline float average(const float3 a)
+{
+ return (a.x + a.y + a.z)*(1.0f/3.0f);
+}
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline float3 operator-(const float3 a)
+{
+ float3 r = make_float3(-a.x, -a.y, -a.z);
+ return r;
+}
+
+__device_inline float3 operator*(const float3 a, const float3 b)
+{
+ float3 r = make_float3(a.x*b.x, a.y*b.y, a.z*b.z);
+ return r;
+}
+
+__device_inline float3 operator*(const float3 a, float f)
+{
+ float3 r = make_float3(a.x*f, a.y*f, a.z*f);
+ return r;
+}
+
+__device_inline float3 operator*(float f, const float3 a)
+{
+ float3 r = make_float3(a.x*f, a.y*f, a.z*f);
+ return r;
+}
+
+__device_inline float3 operator/(float f, const float3 a)
+{
+ float3 r = make_float3(f/a.x, f/a.y, f/a.z);
+ return r;
+}
+
+__device_inline float3 operator/(const float3 a, float f)
+{
+ float invf = 1.0f/f;
+ float3 r = make_float3(a.x*invf, a.y*invf, a.z*invf);
+ return r;
+}
+
+__device_inline float3 operator/(const float3 a, const float3 b)
+{
+ float3 r = make_float3(a.x/b.x, a.y/b.y, a.z/b.z);
+ return r;
+}
+
+__device_inline float3 operator+(const float3 a, const float3 b)
+{
+ float3 r = make_float3(a.x+b.x, a.y+b.y, a.z+b.z);
+ return r;
+}
+
+__device_inline float3 operator-(const float3 a, const float3 b)
+{
+ float3 r = make_float3(a.x-b.x, a.y-b.y, a.z-b.z);
+ return r;
+}
+
+__device_inline float3 operator+=(float3& a, const float3 b)
+{
+ a.x += b.x;
+ a.y += b.y;
+ a.z += b.z;
+ return a;
+}
+
+__device_inline float3 operator*=(float3& a, const float3 b)
+{
+ a.x *= b.x;
+ a.y *= b.y;
+ a.z *= b.z;
+ return a;
+}
+
+__device_inline float3 operator*=(float3& a, float f)
+{
+ a.x *= f;
+ a.y *= f;
+ a.z *= f;
+ return a;
+}
+
+__device_inline float3 operator/=(float3& a, const float3 b)
+{
+ a.x /= b.x;
+ a.y /= b.y;
+ a.z /= b.z;
+ return a;
+}
+
+__device_inline float3 operator/=(float3& a, float f)
+{
+ float invf = 1.0f/f;
+ a.x *= invf;
+ a.y *= invf;
+ a.z *= invf;
+ return a;
+}
+
+__device_inline float dot(const float3 a, const float3 b)
+{
+ return a.x*b.x + a.y*b.y + a.z*b.z;
+}
+
+__device_inline float3 cross(const float3 a, const float3 b)
+{
+ float3 r = make_float3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x);
+ return r;
+}
+
+#endif
+
+__device_inline float len(const float3 a)
+{
+ return sqrtf(dot(a, a));
+}
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline float3 normalize(const float3 a)
+{
+ return a/len(a);
+}
+
+#endif
+
+__device_inline float3 normalize_len(const float3 a, float *t)
+{
+ *t = len(a);
+ return a/(*t);
+}
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline bool operator==(const float3 a, const float3 b)
+{
+ return (a.x == b.x && a.y == b.y && a.z == b.z);
+}
+
+__device_inline bool operator!=(const float3 a, const float3 b)
+{
+ return !(a == b);
+}
+
+__device_inline float3 min(float3 a, float3 b)
+{
+ float3 r = make_float3(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z));
+ return r;
+}
+
+__device_inline float3 max(float3 a, float3 b)
+{
+ float3 r = make_float3(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z));
+ return r;
+}
+
+__device_inline float3 clamp(float3 a, float3 mn, float3 mx)
+{
+ return min(max(a, mn), mx);
+}
+
+__device_inline float3 fabs(float3 a)
+{
+ return make_float3(fabsf(a.x), fabsf(a.y), fabsf(a.z));
+}
+
+#endif
+
+__device_inline float3 float4_to_float3(const float4 a)
+{
+ return make_float3(a.x, a.y, a.z);
+}
+
+#ifndef __KERNEL_GPU__
+
+__device_inline void print_float3(const char *label, const float3& a)
+{
+ printf("%s: %.8f %.8f %.8f\n", label, a.x, a.y, a.z);
+}
+
+#endif
+
+__device_inline float3 interp(float3 a, float3 b, float t)
+{
+ return a + t*(b - a);
+}
+
+/* Float4 Vector */
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline bool is_zero(const float4& a)
+{
+ return (a.x == 0.0f && a.y == 0.0f && a.z == 0.0f && a.w == 0.0f);
+}
+
+__device_inline float average(const float4& a)
+{
+ return (a.x + a.y + a.z + a.w)*(1.0f/4.0f);
+}
+
+__device_inline float4 operator-(const float4& a)
+{
+ float4 r = {-a.x, -a.y, -a.z, -a.w};
+ return r;
+}
+
+__device_inline float4 operator*(const float4& a, const float4& b)
+{
+ float4 r = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w};
+ return r;
+}
+
+__device_inline float4 operator*(const float4& a, float f)
+{
+ float4 r = {a.x*f, a.y*f, a.z*f, a.w*f};
+ return r;
+}
+
+__device_inline float4 operator*(float f, const float4& a)
+{
+ float4 r = {a.x*f, a.y*f, a.z*f, a.w*f};
+ return r;
+}
+
+__device_inline float4 operator/(const float4& a, float f)
+{
+ float invf = 1.0f/f;
+ float4 r = {a.x*invf, a.y*invf, a.z*invf, a.w*invf};
+ return r;
+}
+
+__device_inline float4 operator/(const float4& a, const float4& b)
+{
+ float4 r = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w};
+ return r;
+}
+
+__device_inline float4 operator+(const float4& a, const float4& b)
+{
+ float4 r = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w};
+ return r;
+}
+
+__device_inline float4 operator-(const float4& a, const float4& b)
+{
+ float4 r = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w};
+ return r;
+}
+
+__device_inline float4 operator+=(float4& a, const float4& b)
+{
+ a.x += b.x;
+ a.y += b.y;
+ a.z += b.z;
+ a.w += b.w;
+ return a;
+}
+
+__device_inline float4 operator*=(float4& a, const float4& b)
+{
+ a.x *= b.x;
+ a.y *= b.y;
+ a.z *= b.z;
+ a.w *= b.w;
+ return a;
+}
+
+__device_inline float4 operator/=(float4& a, float f)
+{
+ float invf = 1.0f/f;
+ a.x *= invf;
+ a.y *= invf;
+ a.z *= invf;
+ a.w *= invf;
+ return a;
+}
+
+__device_inline float dot(const float4& a, const float4& b)
+{
+ return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;
+}
+
+__device_inline float4 cross(const float4& a, const float4& b)
+{
+ float4 r = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x, 0.0f};
+ return r;
+}
+
+__device_inline float4 min(float4 a, float4 b)
+{
+ return make_float4(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z), min(a.w, b.w));
+}
+
+__device_inline float4 max(float4 a, float4 b)
+{
+ return make_float4(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z), max(a.w, b.w));
+}
+
+#endif
+
+#ifndef __KERNEL_GPU__
+
+__device_inline void print_float4(const char *label, const float4& a)
+{
+ printf("%s: %.8f %.8f %.8f %.8f\n", label, a.x, a.y, a.z, a.w);
+}
+
+#endif
+
+/* Int3 */
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline int3 max(int3 a, int3 b)
+{
+ int3 r = {max(a.x, b.x), max(a.y, b.y), max(a.z, b.z)};
+ return r;
+}
+
+__device_inline int3 clamp(const int3& a, int mn, int mx)
+{
+ int3 r = {clamp(a.x, mn, mx), clamp(a.y, mn, mx), clamp(a.z, mn, mx)};
+ return r;
+}
+
+__device_inline int3 clamp(const int3& a, int3& mn, int mx)
+{
+ int3 r = {clamp(a.x, mn.x, mx), clamp(a.y, mn.y, mx), clamp(a.z, mn.z, mx)};
+ return r;
+}
+
+#endif
+
+#ifndef __KERNEL_GPU__
+
+__device_inline void print_int3(const char *label, const int3& a)
+{
+ printf("%s: %d %d %d\n", label, a.x, a.y, a.z);
+}
+
+#endif
+
+/* Int4 */
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline int4 operator>=(float4 a, float4 b)
+{
+ return make_int4(a.x >= b.x, a.y >= b.y, a.z >= b.z, a.w >= b.w);
+}
+
+#endif
+
+#ifndef __KERNEL_GPU__
+
+__device_inline void print_int4(const char *label, const int4& a)
+{
+ printf("%s: %d %d %d %d\n", label, a.x, a.y, a.z, a.w);
+}
+
+#endif
+
+/* Int/Float conversion */
+
+#ifndef __KERNEL_OPENCL__
+
+__device_inline unsigned int as_uint(float f)
+{
+ union { unsigned int i; float f; } u;
+ u.f = f;
+ return u.i;
+}
+
+__device_inline int __float_as_int(float f)
+{
+ union { int i; float f; } u;
+ u.f = f;
+ return u.i;
+}
+
+__device_inline float __int_as_float(int i)
+{
+ union { int i; float f; } u;
+ u.i = i;
+ return u.f;
+}
+
+__device_inline uint __float_as_uint(float f)
+{
+ union { uint i; float f; } u;
+ u.f = f;
+ return u.i;
+}
+
+__device_inline float __uint_as_float(uint i)
+{
+ union { uint i; float f; } u;
+ u.i = i;
+ return u.f;
+}
+
+/* Interpolation */
+
+template<class A, class B> A lerp(const A& a, const A& b, const B& t)
+{
+ return (A)(a * ((B)1 - t) + b * t);
+}
+
+/* Triangle */
+
+__device_inline float triangle_area(const float3 v1, const float3 v2, const float3 v3)
+{
+ return len(cross(v3 - v2, v1 - v2))*0.5f;
+}
+
+#endif
+
+/* Orthonormal vectors */
+
+__device_inline void make_orthonormals(const float3 N, float3 *a, float3 *b)
+{
+ if(N.x != N.y || N.x != N.z)
+ *a = make_float3(N.z-N.y, N.x-N.z, N.y-N.x); //(1,1,1)x N
+ else
+ *a = make_float3(N.z-N.y, N.x+N.z, -N.y-N.x); //(-1,1,1)x N
+
+ *a = normalize(*a);
+ *b = cross(N, *a);
+}
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_MATH_H__ */
+
diff --git a/intern/cycles/util/util_md5.cpp b/intern/cycles/util/util_md5.cpp
new file mode 100644
index 00000000000..b871fad3636
--- /dev/null
+++ b/intern/cycles/util/util_md5.cpp
@@ -0,0 +1,375 @@
+/*
+ * Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * L. Peter Deutsch
+ * ghost@aladdin.com
+ */
+
+/* Minor modifications done to remove some code and change style. */
+
+#include "util_md5.h"
+
+#include <string.h>
+#include <stdio.h>
+
+CCL_NAMESPACE_BEGIN
+
+#define T_MASK ((uint32_t)~0)
+#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
+#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
+#define T3 0x242070db
+#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
+#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
+#define T6 0x4787c62a
+#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
+#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
+#define T9 0x698098d8
+#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
+#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
+#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
+#define T13 0x6b901122
+#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
+#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
+#define T16 0x49b40821
+#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
+#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
+#define T19 0x265e5a51
+#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
+#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
+#define T22 0x02441453
+#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
+#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
+#define T25 0x21e1cde6
+#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
+#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
+#define T28 0x455a14ed
+#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
+#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
+#define T31 0x676f02d9
+#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
+#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
+#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
+#define T35 0x6d9d6122
+#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
+#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
+#define T38 0x4bdecfa9
+#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
+#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
+#define T41 0x289b7ec6
+#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
+#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
+#define T44 0x04881d05
+#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
+#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
+#define T47 0x1fa27cf8
+#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
+#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
+#define T50 0x432aff97
+#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
+#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
+#define T53 0x655b59c3
+#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
+#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
+#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
+#define T57 0x6fa87e4f
+#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
+#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
+#define T60 0x4e0811a1
+#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
+#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
+#define T63 0x2ad7d2bb
+#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
+
+void MD5Hash::process(const uint8_t *data /*[64]*/)
+{
+ uint32_t
+ a = abcd[0], b = abcd[1],
+ c = abcd[2], d = abcd[3];
+ uint32_t t;
+ /* Define storage for little-endian or both types of CPUs. */
+ uint32_t xbuf[16];
+ const uint32_t *X;
+
+ {
+ /*
+ * Determine dynamically whether this is a big-endian or
+ * little-endian machine, since we can use a more efficient
+ * algorithm on the latter.
+ */
+ static const int w = 1;
+
+ if(*((const uint8_t *)&w)) /* dynamic little-endian */
+ {
+ /*
+ * On little-endian machines, we can process properly aligned
+ * data without copying it.
+ */
+ if(!((data - (const uint8_t *)0) & 3)) {
+ /* data are properly aligned */
+ X = (const uint32_t *)data;
+ }
+ else {
+ /* not aligned */
+ memcpy(xbuf, data, 64);
+ X = xbuf;
+ }
+ }
+ else { /* dynamic big-endian */
+ /*
+ * On big-endian machines, we must arrange the bytes in the
+ * right order.
+ */
+ const uint8_t *xp = data;
+ int i;
+
+ X = xbuf; /* (dynamic only) */
+ for(i = 0; i < 16; ++i, xp += 4)
+ xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
+ }
+ }
+
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
+
+ /* Round 1. */
+ /* Let [abcd k s i] denote the operation
+ a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
+#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
+#define SET(a, b, c, d, k, s, Ti)\
+ t = a + F(b,c,d) + X[k] + Ti;\
+ a = ROTATE_LEFT(t, s) + b
+ /* Do the following 16 operations. */
+ SET(a, b, c, d, 0, 7, T1);
+ SET(d, a, b, c, 1, 12, T2);
+ SET(c, d, a, b, 2, 17, T3);
+ SET(b, c, d, a, 3, 22, T4);
+ SET(a, b, c, d, 4, 7, T5);
+ SET(d, a, b, c, 5, 12, T6);
+ SET(c, d, a, b, 6, 17, T7);
+ SET(b, c, d, a, 7, 22, T8);
+ SET(a, b, c, d, 8, 7, T9);
+ SET(d, a, b, c, 9, 12, T10);
+ SET(c, d, a, b, 10, 17, T11);
+ SET(b, c, d, a, 11, 22, T12);
+ SET(a, b, c, d, 12, 7, T13);
+ SET(d, a, b, c, 13, 12, T14);
+ SET(c, d, a, b, 14, 17, T15);
+ SET(b, c, d, a, 15, 22, T16);
+#undef SET
+
+ /* Round 2. */
+ /* Let [abcd k s i] denote the operation
+ a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
+#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
+#define SET(a, b, c, d, k, s, Ti)\
+ t = a + G(b,c,d) + X[k] + Ti;\
+ a = ROTATE_LEFT(t, s) + b
+ /* Do the following 16 operations. */
+ SET(a, b, c, d, 1, 5, T17);
+ SET(d, a, b, c, 6, 9, T18);
+ SET(c, d, a, b, 11, 14, T19);
+ SET(b, c, d, a, 0, 20, T20);
+ SET(a, b, c, d, 5, 5, T21);
+ SET(d, a, b, c, 10, 9, T22);
+ SET(c, d, a, b, 15, 14, T23);
+ SET(b, c, d, a, 4, 20, T24);
+ SET(a, b, c, d, 9, 5, T25);
+ SET(d, a, b, c, 14, 9, T26);
+ SET(c, d, a, b, 3, 14, T27);
+ SET(b, c, d, a, 8, 20, T28);
+ SET(a, b, c, d, 13, 5, T29);
+ SET(d, a, b, c, 2, 9, T30);
+ SET(c, d, a, b, 7, 14, T31);
+ SET(b, c, d, a, 12, 20, T32);
+#undef SET
+
+ /* Round 3. */
+ /* Let [abcd k s t] denote the operation
+ a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define SET(a, b, c, d, k, s, Ti)\
+ t = a + H(b,c,d) + X[k] + Ti;\
+ a = ROTATE_LEFT(t, s) + b
+ /* Do the following 16 operations. */
+ SET(a, b, c, d, 5, 4, T33);
+ SET(d, a, b, c, 8, 11, T34);
+ SET(c, d, a, b, 11, 16, T35);
+ SET(b, c, d, a, 14, 23, T36);
+ SET(a, b, c, d, 1, 4, T37);
+ SET(d, a, b, c, 4, 11, T38);
+ SET(c, d, a, b, 7, 16, T39);
+ SET(b, c, d, a, 10, 23, T40);
+ SET(a, b, c, d, 13, 4, T41);
+ SET(d, a, b, c, 0, 11, T42);
+ SET(c, d, a, b, 3, 16, T43);
+ SET(b, c, d, a, 6, 23, T44);
+ SET(a, b, c, d, 9, 4, T45);
+ SET(d, a, b, c, 12, 11, T46);
+ SET(c, d, a, b, 15, 16, T47);
+ SET(b, c, d, a, 2, 23, T48);
+#undef SET
+
+ /* Round 4. */
+ /* Let [abcd k s t] denote the operation
+ a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
+#define I(x, y, z) ((y) ^ ((x) | ~(z)))
+#define SET(a, b, c, d, k, s, Ti)\
+ t = a + I(b,c,d) + X[k] + Ti;\
+ a = ROTATE_LEFT(t, s) + b
+ /* Do the following 16 operations. */
+ SET(a, b, c, d, 0, 6, T49);
+ SET(d, a, b, c, 7, 10, T50);
+ SET(c, d, a, b, 14, 15, T51);
+ SET(b, c, d, a, 5, 21, T52);
+ SET(a, b, c, d, 12, 6, T53);
+ SET(d, a, b, c, 3, 10, T54);
+ SET(c, d, a, b, 10, 15, T55);
+ SET(b, c, d, a, 1, 21, T56);
+ SET(a, b, c, d, 8, 6, T57);
+ SET(d, a, b, c, 15, 10, T58);
+ SET(c, d, a, b, 6, 15, T59);
+ SET(b, c, d, a, 13, 21, T60);
+ SET(a, b, c, d, 4, 6, T61);
+ SET(d, a, b, c, 11, 10, T62);
+ SET(c, d, a, b, 2, 15, T63);
+ SET(b, c, d, a, 9, 21, T64);
+#undef SET
+
+ /* Then perform the following additions. (That is increment each
+ of the four registers by the value it had before this block
+ was started.) */
+ abcd[0] += a;
+ abcd[1] += b;
+ abcd[2] += c;
+ abcd[3] += d;
+}
+
+MD5Hash::MD5Hash()
+{
+ count[0] = count[1] = 0;
+ abcd[0] = 0x67452301;
+ abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
+ abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
+ abcd[3] = 0x10325476;
+}
+
+MD5Hash::~MD5Hash()
+{
+}
+
+void MD5Hash::append(const uint8_t *data, int nbytes)
+{
+ const uint8_t *p = data;
+ int left = nbytes;
+ int offset = (count[0] >> 3) & 63;
+ uint32_t nbits = (uint32_t)(nbytes << 3);
+
+ if(nbytes <= 0)
+ return;
+
+ /* Update the message length. */
+ count[1] += nbytes >> 29;
+ count[0] += nbits;
+ if(count[0] < nbits)
+ count[1]++;
+
+ /* Process an initial partial block. */
+ if(offset) {
+ int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
+
+ memcpy(buf + offset, p, copy);
+ if(offset + copy < 64)
+ return;
+ p += copy;
+ left -= copy;
+ process(buf);
+ }
+
+ /* Process full blocks. */
+ for(; left >= 64; p += 64, left -= 64)
+ process(p);
+
+ /* Process a final partial block. */
+ if(left)
+ memcpy(buf, p, left);
+}
+
+bool MD5Hash::append_file(const string& filepath)
+{
+ FILE *f = fopen(filepath.c_str(), "rb");
+
+ if(!f) {
+ fprintf(stderr, "MD5: failed to open file %s\n", filepath.c_str());
+ return false;
+ }
+
+ const size_t buffer_size = 1024;
+ uint8_t buffer[buffer_size];
+ size_t n;
+
+ do {
+ n = fread(buffer, 1, buffer_size, f);
+ append(buffer, n);
+ } while(n == buffer_size);
+
+ bool success = (ferror(f) == 0);
+
+ fclose(f);
+
+ return success;
+}
+
+void MD5Hash::finish(uint8_t digest[16])
+{
+ static const uint8_t pad[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ uint8_t data[8];
+ int i;
+
+ /* Save the length before padding. */
+ for(i = 0; i < 8; ++i)
+ data[i] = (uint8_t)(count[i >> 2] >> ((i & 3) << 3));
+
+ /* Pad to 56 bytes mod 64. */
+ append(pad, ((55 - (count[0] >> 3)) & 63) + 1);
+ /* Append the length. */
+ append(data, 8);
+
+ for(i = 0; i < 16; ++i)
+ digest[i] = (uint8_t)(abcd[i >> 2] >> ((i & 3) << 3));
+}
+
+string MD5Hash::get_hex()
+{
+ uint8_t digest[16];
+ char buf[16*2];
+
+ finish(digest);
+
+ for(int i=0; i<16; i++)
+ sprintf(buf + i*2, "%02X", digest[i]);
+
+ return string(buf, sizeof(buf));
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_md5.h b/intern/cycles/util/util_md5.h
new file mode 100644
index 00000000000..5e7e604c4cf
--- /dev/null
+++ b/intern/cycles/util/util_md5.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ *
+ * L. Peter Deutsch
+ * ghost@aladdin.com
+ */
+
+/* MD5
+ *
+ * Simply MD5 hash computation, used by disk cache. Adapted from external
+ * code, with minor code modifications done to remove some unused code and
+ * change code style. */
+
+#ifndef __UTIL_MD5_H__
+#define __UTIL_MD5_H__
+
+#include "util_string.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class MD5Hash {
+public:
+ MD5Hash();
+ ~MD5Hash();
+
+ void append(const uint8_t *data, int size);
+ bool append_file(const string& filepath);
+ string get_hex();
+
+protected:
+ void process(const uint8_t *data);
+ void finish(uint8_t digest[16]);
+
+ uint32_t count[2]; /* message length in bits, lsw first */
+ uint32_t abcd[4]; /* digest buffer */
+ uint8_t buf[64]; /* accumulate block */
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_MD5_H__ */
+
diff --git a/intern/cycles/util/util_memarena.cpp b/intern/cycles/util/util_memarena.cpp
new file mode 100644
index 00000000000..e7ae0d6b272
--- /dev/null
+++ b/intern/cycles/util/util_memarena.cpp
@@ -0,0 +1,61 @@
+/*
+ * 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 "util_foreach.h"
+#include "util_math.h"
+#include "util_memarena.h"
+
+CCL_NAMESPACE_BEGIN
+
+MemArena::MemArena(bool use_calloc_, size_t buffer_size_)
+{
+ use_calloc = use_calloc_;
+ buffer_size = buffer_size_;
+
+ last_left = 0;
+ last_buffer = NULL;
+}
+
+MemArena::~MemArena()
+{
+ foreach(uint8_t *buffer, buffers)
+ delete [] buffer;
+}
+
+void *MemArena::alloc(size_t size)
+{
+ if(size > last_left) {
+ last_left = (size > buffer_size)? size: buffer_size;
+ last_buffer = new uint8_t[last_left];
+
+ if(use_calloc)
+ memset(last_buffer, 0, last_left);
+
+ buffers.push_back(last_buffer);
+ }
+
+ uint8_t *mem = last_buffer;
+
+ last_buffer += size;
+ last_left -= size;
+
+ return (void*)mem;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_memarena.h b/intern/cycles/util/util_memarena.h
new file mode 100644
index 00000000000..3b4b761509e
--- /dev/null
+++ b/intern/cycles/util/util_memarena.h
@@ -0,0 +1,48 @@
+/*
+ * 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 __UTIL_MEMARENA_H__
+#define __UTIL_MEMARENA_H__
+
+#include <stdlib.h>
+
+#include "util_list.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class MemArena {
+public:
+ MemArena(bool use_calloc = true, size_t buffer_size = (1<<14));
+ ~MemArena();
+
+ void *alloc(size_t size);
+
+protected:
+ bool use_calloc;
+ size_t buffer_size;
+
+ list<uint8_t*> buffers;
+ uint8_t *last_buffer;
+ size_t last_left;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_MEMARENA_H__ */
+
diff --git a/intern/cycles/util/util_opencl.c b/intern/cycles/util/util_opencl.c
new file mode 100755
index 00000000000..10429ffcd80
--- /dev/null
+++ b/intern/cycles/util/util_opencl.c
@@ -0,0 +1,317 @@
+//////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2009 Organic Vectory B.V.
+// Written by George van Venrooij
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file doc/license/Boost.txt)
+// Extracted from the CLCC project - http://clcc.sourceforge.net/
+//////////////////////////////////////////////////////////////////////////
+
+#include "util_opencl.h"
+
+#ifndef CLCC_GENERATE_DOCUMENTATION
+#ifdef _WIN32
+ #define WIN32_LEAN_AND_MEAN
+ #define VC_EXTRALEAN
+ #include <windows.h>
+
+ typedef HMODULE CLCC_DYNLIB_HANDLE;
+
+ #define CLCC_DYNLIB_OPEN LoadLibrary
+ #define CLCC_DYNLIB_CLOSE FreeLibrary
+ #define CLCC_DYNLIB_IMPORT GetProcAddress
+#else
+ #include <dlfcn.h>
+
+ typedef void* CLCC_DYNLIB_HANDLE;
+
+ #define CLCC_DYNLIB_OPEN(path) dlopen(path, RTLD_NOW | RTLD_GLOBAL)
+ #define CLCC_DYNLIB_CLOSE dlclose
+ #define CLCC_DYNLIB_IMPORT dlsym
+#endif
+#else
+ //typedef implementation_defined CLCC_DYNLIB_HANDLE;
+ //#define CLCC_DYNLIB_OPEN(path) implementation_defined
+ //#define CLCC_DYNLIB_CLOSE implementation_defined
+ //#define CLCC_DYNLIB_IMPORT implementation_defined
+#endif
+
+#include <stdlib.h>
+
+//! \brief module handle
+static CLCC_DYNLIB_HANDLE module = NULL;
+
+// Variables holding function entry points
+#ifndef CLCC_GENERATE_DOCUMENTATION
+PFNCLGETPLATFORMIDS __clewGetPlatformIDs = NULL;
+PFNCLGETPLATFORMINFO __clewGetPlatformInfo = NULL;
+PFNCLGETDEVICEIDS __clewGetDeviceIDs = NULL;
+PFNCLGETDEVICEINFO __clewGetDeviceInfo = NULL;
+PFNCLCREATECONTEXT __clewCreateContext = NULL;
+PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType = NULL;
+PFNCLRETAINCONTEXT __clewRetainContext = NULL;
+PFNCLRELEASECONTEXT __clewReleaseContext = NULL;
+PFNCLGETCONTEXTINFO __clewGetContextInfo = NULL;
+PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue = NULL;
+PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue = NULL;
+PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue = NULL;
+PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo = NULL;
+PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty = NULL;
+PFNCLCREATEBUFFER __clewCreateBuffer = NULL;
+PFNCLCREATEIMAGE2D __clewCreateImage2D = NULL;
+PFNCLCREATEIMAGE3D __clewCreateImage3D = NULL;
+PFNCLRETAINMEMOBJECT __clewRetainMemObject = NULL;
+PFNCLRELEASEMEMOBJECT __clewReleaseMemObject = NULL;
+PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats = NULL;
+PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo = NULL;
+PFNCLGETIMAGEINFO __clewGetImageInfo = NULL;
+PFNCLCREATESAMPLER __clewCreateSampler = NULL;
+PFNCLRETAINSAMPLER __clewRetainSampler = NULL;
+PFNCLRELEASESAMPLER __clewReleaseSampler = NULL;
+PFNCLGETSAMPLERINFO __clewGetSamplerInfo = NULL;
+PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource = NULL;
+PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary = NULL;
+PFNCLRETAINPROGRAM __clewRetainProgram = NULL;
+PFNCLRELEASEPROGRAM __clewReleaseProgram = NULL;
+PFNCLBUILDPROGRAM __clewBuildProgram = NULL;
+PFNCLUNLOADCOMPILER __clewUnloadCompiler = NULL;
+PFNCLGETPROGRAMINFO __clewGetProgramInfo = NULL;
+PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo = NULL;
+PFNCLCREATEKERNEL __clewCreateKernel = NULL;
+PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram = NULL;
+PFNCLRETAINKERNEL __clewRetainKernel = NULL;
+PFNCLRELEASEKERNEL __clewReleaseKernel = NULL;
+PFNCLSETKERNELARG __clewSetKernelArg = NULL;
+PFNCLGETKERNELINFO __clewGetKernelInfo = NULL;
+PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo = NULL;
+PFNCLWAITFOREVENTS __clewWaitForEvents = NULL;
+PFNCLGETEVENTINFO __clewGetEventInfo = NULL;
+PFNCLRETAINEVENT __clewRetainEvent = NULL;
+PFNCLRELEASEEVENT __clewReleaseEvent = NULL;
+PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo = NULL;
+PFNCLFLUSH __clewFlush = NULL;
+PFNCLFINISH __clewFinish = NULL;
+PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer = NULL;
+PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer = NULL;
+PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer = NULL;
+PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage = NULL;
+PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage = NULL;
+PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage = NULL;
+PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer = NULL;
+PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage = NULL;
+PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer = NULL;
+PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage = NULL;
+PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject = NULL;
+PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel = NULL;
+PFNCLENQUEUETASK __clewEnqueueTask = NULL;
+PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel = NULL;
+PFNCLENQUEUEMARKER __clewEnqueueMarker = NULL;
+PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents = NULL;
+PFNCLENQUEUEBARRIER __clewEnqueueBarrier = NULL;
+PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress = NULL;
+#endif // CLCC_GENERATE_DOCUMENTATION
+
+
+//! \brief Unloads OpenCL dynamic library, should not be called directly
+static void clewExit(void)
+{
+ if (module != NULL)
+ {
+ // Ignore errors
+ CLCC_DYNLIB_CLOSE(module);
+ module = NULL;
+ }
+}
+
+//! \param path path to dynamic library to load
+//! \return CLEW_ERROR_OPEN_FAILED if the library could not be opened
+//! CLEW_ERROR_ATEXIT_FAILED if atexit(clewExit) failed
+//! CLEW_SUCCESS when the library was succesfully loaded
+int clLibraryInit()
+{
+#ifdef _WIN32
+ const char *path = "OpenCL.dll";
+#elif defined(__APPLE__)
+ const char *path = "/Library/Frameworks/OpenCL.framework/OpenCL";
+#else
+ const char *path = "libOpenCL.so";
+#endif
+ int error = 0;
+
+ // Check if already initialized
+ if (module != NULL)
+ {
+ return 1;
+ }
+
+ // Load library
+ module = CLCC_DYNLIB_OPEN(path);
+
+ // Check for errors
+ if (module == NULL)
+ {
+ return 0;
+ }
+
+ // Set unloading
+ error = atexit(clewExit);
+
+ if (error)
+ {
+ // Failure queing atexit, shutdown with error
+ CLCC_DYNLIB_CLOSE(module);
+ module = NULL;
+
+ return 0;
+ }
+
+ // Determine function entry-points
+ __clewGetPlatformIDs = (PFNCLGETPLATFORMIDS )CLCC_DYNLIB_IMPORT(module, "clGetPlatformIDs");
+ __clewGetPlatformInfo = (PFNCLGETPLATFORMINFO )CLCC_DYNLIB_IMPORT(module, "clGetPlatformInfo");
+ __clewGetDeviceIDs = (PFNCLGETDEVICEIDS )CLCC_DYNLIB_IMPORT(module, "clGetDeviceIDs");
+ __clewGetDeviceInfo = (PFNCLGETDEVICEINFO )CLCC_DYNLIB_IMPORT(module, "clGetDeviceInfo");
+ __clewCreateContext = (PFNCLCREATECONTEXT )CLCC_DYNLIB_IMPORT(module, "clCreateContext");
+ __clewCreateContextFromType = (PFNCLCREATECONTEXTFROMTYPE )CLCC_DYNLIB_IMPORT(module, "clCreateContextFromType");
+ __clewRetainContext = (PFNCLRETAINCONTEXT )CLCC_DYNLIB_IMPORT(module, "clRetainContext");
+ __clewReleaseContext = (PFNCLRELEASECONTEXT )CLCC_DYNLIB_IMPORT(module, "clReleaseContext");
+ __clewGetContextInfo = (PFNCLGETCONTEXTINFO )CLCC_DYNLIB_IMPORT(module, "clGetContextInfo");
+ __clewCreateCommandQueue = (PFNCLCREATECOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clCreateCommandQueue");
+ __clewRetainCommandQueue = (PFNCLRETAINCOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clRetainCommandQueue");
+ __clewReleaseCommandQueue = (PFNCLRELEASECOMMANDQUEUE )CLCC_DYNLIB_IMPORT(module, "clReleaseCommandQueue");
+ __clewGetCommandQueueInfo = (PFNCLGETCOMMANDQUEUEINFO )CLCC_DYNLIB_IMPORT(module, "clGetCommandQueueInfo");
+ __clewSetCommandQueueProperty = (PFNCLSETCOMMANDQUEUEPROPERTY )CLCC_DYNLIB_IMPORT(module, "clSetCommandQueueProperty");
+ __clewCreateBuffer = (PFNCLCREATEBUFFER )CLCC_DYNLIB_IMPORT(module, "clCreateBuffer");
+ __clewCreateImage2D = (PFNCLCREATEIMAGE2D )CLCC_DYNLIB_IMPORT(module, "clCreateImage2D");
+ __clewCreateImage3D = (PFNCLCREATEIMAGE3D )CLCC_DYNLIB_IMPORT(module, "clCreateImage3D");
+ __clewRetainMemObject = (PFNCLRETAINMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clRetainMemObject");
+ __clewReleaseMemObject = (PFNCLRELEASEMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clReleaseMemObject");
+ __clewGetSupportedImageFormats = (PFNCLGETSUPPORTEDIMAGEFORMATS )CLCC_DYNLIB_IMPORT(module, "clGetSupportedImageFormats");
+ __clewGetMemObjectInfo = (PFNCLGETMEMOBJECTINFO )CLCC_DYNLIB_IMPORT(module, "clGetMemObjectInfo");
+ __clewGetImageInfo = (PFNCLGETIMAGEINFO )CLCC_DYNLIB_IMPORT(module, "clGetImageInfo");
+ __clewCreateSampler = (PFNCLCREATESAMPLER )CLCC_DYNLIB_IMPORT(module, "clCreateSampler");
+ __clewRetainSampler = (PFNCLRETAINSAMPLER )CLCC_DYNLIB_IMPORT(module, "clRetainSampler");
+ __clewReleaseSampler = (PFNCLRELEASESAMPLER )CLCC_DYNLIB_IMPORT(module, "clReleaseSampler");
+ __clewGetSamplerInfo = (PFNCLGETSAMPLERINFO )CLCC_DYNLIB_IMPORT(module, "clGetSamplerInfo");
+ __clewCreateProgramWithSource = (PFNCLCREATEPROGRAMWITHSOURCE )CLCC_DYNLIB_IMPORT(module, "clCreateProgramWithSource");
+ __clewCreateProgramWithBinary = (PFNCLCREATEPROGRAMWITHBINARY )CLCC_DYNLIB_IMPORT(module, "clCreateProgramWithBinary");
+ __clewRetainProgram = (PFNCLRETAINPROGRAM )CLCC_DYNLIB_IMPORT(module, "clRetainProgram");
+ __clewReleaseProgram = (PFNCLRELEASEPROGRAM )CLCC_DYNLIB_IMPORT(module, "clReleaseProgram");
+ __clewBuildProgram = (PFNCLBUILDPROGRAM )CLCC_DYNLIB_IMPORT(module, "clBuildProgram");
+ __clewUnloadCompiler = (PFNCLUNLOADCOMPILER )CLCC_DYNLIB_IMPORT(module, "clUnloadCompiler");
+ __clewGetProgramInfo = (PFNCLGETPROGRAMINFO )CLCC_DYNLIB_IMPORT(module, "clGetProgramInfo");
+ __clewGetProgramBuildInfo = (PFNCLGETPROGRAMBUILDINFO )CLCC_DYNLIB_IMPORT(module, "clGetProgramBuildInfo");
+ __clewCreateKernel = (PFNCLCREATEKERNEL )CLCC_DYNLIB_IMPORT(module, "clCreateKernel");
+ __clewCreateKernelsInProgram = (PFNCLCREATEKERNELSINPROGRAM )CLCC_DYNLIB_IMPORT(module, "clCreateKernelsInProgram");
+ __clewRetainKernel = (PFNCLRETAINKERNEL )CLCC_DYNLIB_IMPORT(module, "clRetainKernel");
+ __clewReleaseKernel = (PFNCLRELEASEKERNEL )CLCC_DYNLIB_IMPORT(module, "clReleaseKernel");
+ __clewSetKernelArg = (PFNCLSETKERNELARG )CLCC_DYNLIB_IMPORT(module, "clSetKernelArg");
+ __clewGetKernelInfo = (PFNCLGETKERNELINFO )CLCC_DYNLIB_IMPORT(module, "clGetKernelInfo");
+ __clewGetKernelWorkGroupInfo = (PFNCLGETKERNELWORKGROUPINFO )CLCC_DYNLIB_IMPORT(module, "clGetKernelWorkGroupInfo");
+ __clewWaitForEvents = (PFNCLWAITFOREVENTS )CLCC_DYNLIB_IMPORT(module, "clWaitForEvents");
+ __clewGetEventInfo = (PFNCLGETEVENTINFO )CLCC_DYNLIB_IMPORT(module, "clGetEventInfo");
+ __clewRetainEvent = (PFNCLRETAINEVENT )CLCC_DYNLIB_IMPORT(module, "clRetainEvent");
+ __clewReleaseEvent = (PFNCLRELEASEEVENT )CLCC_DYNLIB_IMPORT(module, "clReleaseEvent");
+ __clewGetEventProfilingInfo = (PFNCLGETEVENTPROFILINGINFO )CLCC_DYNLIB_IMPORT(module, "clGetEventProfilingInfo");
+ __clewFlush = (PFNCLFLUSH )CLCC_DYNLIB_IMPORT(module, "clFlush");
+ __clewFinish = (PFNCLFINISH )CLCC_DYNLIB_IMPORT(module, "clFinish");
+ __clewEnqueueReadBuffer = (PFNCLENQUEUEREADBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueReadBuffer");
+ __clewEnqueueWriteBuffer = (PFNCLENQUEUEWRITEBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueWriteBuffer");
+ __clewEnqueueCopyBuffer = (PFNCLENQUEUECOPYBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyBuffer");
+ __clewEnqueueReadImage = (PFNCLENQUEUEREADIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueReadImage");
+ __clewEnqueueWriteImage = (PFNCLENQUEUEWRITEIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueWriteImage");
+ __clewEnqueueCopyImage = (PFNCLENQUEUECOPYIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyImage");
+ __clewEnqueueCopyImageToBuffer = (PFNCLENQUEUECOPYIMAGETOBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyImageToBuffer");
+ __clewEnqueueCopyBufferToImage = (PFNCLENQUEUECOPYBUFFERTOIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueCopyBufferToImage");
+ __clewEnqueueMapBuffer = (PFNCLENQUEUEMAPBUFFER )CLCC_DYNLIB_IMPORT(module, "clEnqueueMapBuffer");
+ __clewEnqueueMapImage = (PFNCLENQUEUEMAPIMAGE )CLCC_DYNLIB_IMPORT(module, "clEnqueueMapImage");
+ __clewEnqueueUnmapMemObject = (PFNCLENQUEUEUNMAPMEMOBJECT )CLCC_DYNLIB_IMPORT(module, "clEnqueueUnmapMemObject");
+ __clewEnqueueNDRangeKernel = (PFNCLENQUEUENDRANGEKERNEL )CLCC_DYNLIB_IMPORT(module, "clEnqueueNDRangeKernel");
+ __clewEnqueueTask = (PFNCLENQUEUETASK )CLCC_DYNLIB_IMPORT(module, "clEnqueueTask");
+ __clewEnqueueNativeKernel = (PFNCLENQUEUENATIVEKERNEL )CLCC_DYNLIB_IMPORT(module, "clEnqueueNativeKernel");
+ __clewEnqueueMarker = (PFNCLENQUEUEMARKER )CLCC_DYNLIB_IMPORT(module, "clEnqueueMarker");
+ __clewEnqueueWaitForEvents = (PFNCLENQUEUEWAITFOREVENTS )CLCC_DYNLIB_IMPORT(module, "clEnqueueWaitForEvents");
+ __clewEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLCC_DYNLIB_IMPORT(module, "clEnqueueBarrier");
+ __clewGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLCC_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress");
+
+ return 1;
+}
+
+//! \param error CL error code
+//! \return a string representation of the error code
+const char *clErrorString(cl_int error)
+{
+ static const char* strings[] =
+ {
+ // Error Codes
+ "CL_SUCCESS" // 0
+ , "CL_DEVICE_NOT_FOUND" // -1
+ , "CL_DEVICE_NOT_AVAILABLE" // -2
+ , "CL_COMPILER_NOT_AVAILABLE" // -3
+ , "CL_MEM_OBJECT_ALLOCATION_FAILURE" // -4
+ , "CL_OUT_OF_RESOURCES" // -5
+ , "CL_OUT_OF_HOST_MEMORY" // -6
+ , "CL_PROFILING_INFO_NOT_AVAILABLE" // -7
+ , "CL_MEM_COPY_OVERLAP" // -8
+ , "CL_IMAGE_FORMAT_MISMATCH" // -9
+ , "CL_IMAGE_FORMAT_NOT_SUPPORTED" // -10
+ , "CL_BUILD_PROGRAM_FAILURE" // -11
+ , "CL_MAP_FAILURE" // -12
+
+ , "" // -13
+ , "" // -14
+ , "" // -15
+ , "" // -16
+ , "" // -17
+ , "" // -18
+ , "" // -19
+
+ , "" // -20
+ , "" // -21
+ , "" // -22
+ , "" // -23
+ , "" // -24
+ , "" // -25
+ , "" // -26
+ , "" // -27
+ , "" // -28
+ , "" // -29
+
+ , "CL_INVALID_VALUE" // -30
+ , "CL_INVALID_DEVICE_TYPE" // -31
+ , "CL_INVALID_PLATFORM" // -32
+ , "CL_INVALID_DEVICE" // -33
+ , "CL_INVALID_CONTEXT" // -34
+ , "CL_INVALID_QUEUE_PROPERTIES" // -35
+ , "CL_INVALID_COMMAND_QUEUE" // -36
+ , "CL_INVALID_HOST_PTR" // -37
+ , "CL_INVALID_MEM_OBJECT" // -38
+ , "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" // -39
+ , "CL_INVALID_IMAGE_SIZE" // -40
+ , "CL_INVALID_SAMPLER" // -41
+ , "CL_INVALID_BINARY" // -42
+ , "CL_INVALID_BUILD_OPTIONS" // -43
+ , "CL_INVALID_PROGRAM" // -44
+ , "CL_INVALID_PROGRAM_EXECUTABLE" // -45
+ , "CL_INVALID_KERNEL_NAME" // -46
+ , "CL_INVALID_KERNEL_DEFINITION" // -47
+ , "CL_INVALID_KERNEL" // -48
+ , "CL_INVALID_ARG_INDEX" // -49
+ , "CL_INVALID_ARG_VALUE" // -50
+ , "CL_INVALID_ARG_SIZE" // -51
+ , "CL_INVALID_KERNEL_ARGS" // -52
+ , "CL_INVALID_WORK_DIMENSION" // -53
+ , "CL_INVALID_WORK_GROUP_SIZE" // -54
+ , "CL_INVALID_WORK_ITEM_SIZE" // -55
+ , "CL_INVALID_GLOBAL_OFFSET" // -56
+ , "CL_INVALID_EVENT_WAIT_LIST" // -57
+ , "CL_INVALID_EVENT" // -58
+ , "CL_INVALID_OPERATION" // -59
+ , "CL_INVALID_GL_OBJECT" // -60
+ , "CL_INVALID_BUFFER_SIZE" // -61
+ , "CL_INVALID_MIP_LEVEL" // -62
+ , "CL_INVALID_GLOBAL_WORK_SIZE" // -63
+ };
+
+ return strings[-error];
+}
+
diff --git a/intern/cycles/util/util_opencl.h b/intern/cycles/util/util_opencl.h
new file mode 100755
index 00000000000..08694874ac1
--- /dev/null
+++ b/intern/cycles/util/util_opencl.h
@@ -0,0 +1,1320 @@
+//////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2009 Organic Vectory B.V.
+// Written by George van Venrooij
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file doc/license/Boost.txt)
+// Extracted from the CLCC project - http://clcc.sourceforge.net/
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef __UTIL_OPENCL_H__
+#define __UTIL_OPENCL_H__
+
+//! This file contains a copy of the contents of CL.H and CL_PLATFORM.H from the
+//! official OpenCL spec. The purpose of this code is to load the OpenCL dynamic
+//! library at run-time and thus allow the executable to function on many
+//! platforms regardless of the vendor of the OpenCL driver actually installed.
+//! Some of the techniques used here were inspired by work done in the GLEW
+//! library (http://glew.sourceforge.net/)
+
+// Run-time dynamic linking functionality based on concepts used in GLEW
+#ifdef __OPENCL_CL_H
+#error cl.h included before clew.h
+#endif
+
+#ifdef __OPENCL_CL_PLATFORM_H
+#error cl_platform.h included before clew.h
+#endif
+
+#ifndef CLCC_GENERATE_DOCUMENTATION
+// Prevent cl.h inclusion
+#define __OPENCL_CL_H
+// Prevent cl_platform.h inclusion
+#define __CL_PLATFORM_H
+#endif // CLCC_GENERATE_DOCUMENTATION
+
+/*******************************************************************************
+* Copyright (c) 2008-2009 The Khronos Group Inc.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and/or associated documentation files (the
+* "Materials"), to deal in the Materials without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Materials, and to
+* permit persons to whom the Materials are furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Materials.
+*
+* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+******************************************************************************/
+
+#ifdef __APPLE__
+/* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */
+#include <AvailabilityMacros.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef CLCC_GENERATE_DOCUMENTATION
+
+#if defined(_WIN32)
+#define CL_API_ENTRY
+#define CL_API_CALL __stdcall
+#else
+#define CL_API_ENTRY
+#define CL_API_CALL
+#endif
+
+#define CL_API_SUFFIX__VERSION_1_0
+
+#if defined(_WIN32) && defined(_MSC_VER)
+
+/* scalar types */
+typedef signed __int8 cl_char;
+typedef unsigned __int8 cl_uchar;
+typedef signed __int16 cl_short;
+typedef unsigned __int16 cl_ushort;
+typedef signed __int32 cl_int;
+typedef unsigned __int32 cl_uint;
+typedef signed __int64 cl_long;
+typedef unsigned __int64 cl_ulong;
+
+typedef unsigned __int16 cl_half;
+typedef float cl_float;
+typedef double cl_double;
+
+
+/*
+* Vector types
+*
+* Note: OpenCL requires that all types be naturally aligned.
+* This means that vector types must be naturally aligned.
+* For example, a vector of four floats must be aligned to
+* a 16 byte boundary (calculated as 4 * the natural 4-byte
+* alignment of the float). The alignment qualifiers here
+* will only function properly if your compiler supports them
+* and if you don't actively work to defeat them. For example,
+* in order for a cl_float4 to be 16 byte aligned in a struct,
+* the start of the struct must itself be 16-byte aligned.
+*
+* Maintaining proper alignment is the user's responsibility.
+*/
+typedef signed __int8 cl_char2[2];
+typedef signed __int8 cl_char4[4];
+typedef signed __int8 cl_char8[8];
+typedef signed __int8 cl_char16[16];
+typedef unsigned __int8 cl_uchar2[2];
+typedef unsigned __int8 cl_uchar4[4];
+typedef unsigned __int8 cl_uchar8[8];
+typedef unsigned __int8 cl_uchar16[16];
+
+typedef signed __int16 cl_short2[2];
+typedef signed __int16 cl_short4[4];
+typedef signed __int16 cl_short8[8];
+typedef signed __int16 cl_short16[16];
+typedef unsigned __int16 cl_ushort2[2];
+typedef unsigned __int16 cl_ushort4[4];
+typedef unsigned __int16 cl_ushort8[8];
+typedef unsigned __int16 cl_ushort16[16];
+
+typedef signed __int32 cl_int2[2];
+typedef signed __int32 cl_int4[4];
+typedef signed __int32 cl_int8[8];
+typedef signed __int32 cl_int16[16];
+typedef unsigned __int32 cl_uint2[2];
+typedef unsigned __int32 cl_uint4[4];
+typedef unsigned __int32 cl_uint8[8];
+typedef unsigned __int32 cl_uint16[16];
+
+typedef signed __int64 cl_long2[2];
+typedef signed __int64 cl_long4[4];
+typedef signed __int64 cl_long8[8];
+typedef signed __int64 cl_long16[16];
+typedef unsigned __int64 cl_ulong2[2];
+typedef unsigned __int64 cl_ulong4[4];
+typedef unsigned __int64 cl_ulong8[8];
+typedef unsigned __int64 cl_ulong16[16];
+
+typedef float cl_float2[2];
+typedef float cl_float4[4];
+typedef float cl_float8[8];
+typedef float cl_float16[16];
+
+typedef double cl_double2[2];
+typedef double cl_double4[4];
+typedef double cl_double8[8];
+typedef double cl_double16[16];
+/* There are no vector types for half */
+
+#else
+
+#include <stdint.h>
+
+/* scalar types */
+typedef int8_t cl_char;
+typedef uint8_t cl_uchar;
+typedef int16_t cl_short __attribute__((aligned(2)));
+typedef uint16_t cl_ushort __attribute__((aligned(2)));
+typedef int32_t cl_int __attribute__((aligned(4)));
+typedef uint32_t cl_uint __attribute__((aligned(4)));
+typedef int64_t cl_long __attribute__((aligned(8)));
+typedef uint64_t cl_ulong __attribute__((aligned(8)));
+
+typedef uint16_t cl_half __attribute__((aligned(2)));
+typedef float cl_float __attribute__((aligned(4)));
+typedef double cl_double __attribute__((aligned(8)));
+
+/*
+* Vector types
+*
+* Note: OpenCL requires that all types be naturally aligned.
+* This means that vector types must be naturally aligned.
+* For example, a vector of four floats must be aligned to
+* a 16 byte boundary (calculated as 4 * the natural 4-byte
+* alignment of the float). The alignment qualifiers here
+* will only function properly if your compiler supports them
+* and if you don't actively work to defeat them. For example,
+* in order for a cl_float4 to be 16 byte aligned in a struct,
+* the start of the struct must itself be 16-byte aligned.
+*
+* Maintaining proper alignment is the user's responsibility.
+*/
+typedef int8_t cl_char2[2] __attribute__((aligned(2)));
+typedef int8_t cl_char4[4] __attribute__((aligned(4)));
+typedef int8_t cl_char8[8] __attribute__((aligned(8)));
+typedef int8_t cl_char16[16] __attribute__((aligned(16)));
+typedef uint8_t cl_uchar2[2] __attribute__((aligned(2)));
+typedef uint8_t cl_uchar4[4] __attribute__((aligned(4)));
+typedef uint8_t cl_uchar8[8] __attribute__((aligned(8)));
+typedef uint8_t cl_uchar16[16] __attribute__((aligned(16)));
+
+typedef int16_t cl_short2[2] __attribute__((aligned(4)));
+typedef int16_t cl_short4[4] __attribute__((aligned(8)));
+typedef int16_t cl_short8[8] __attribute__((aligned(16)));
+typedef int16_t cl_short16[16] __attribute__((aligned(32)));
+typedef uint16_t cl_ushort2[2] __attribute__((aligned(4)));
+typedef uint16_t cl_ushort4[4] __attribute__((aligned(8)));
+typedef uint16_t cl_ushort8[8] __attribute__((aligned(16)));
+typedef uint16_t cl_ushort16[16] __attribute__((aligned(32)));
+
+typedef int32_t cl_int2[2] __attribute__((aligned(8)));
+typedef int32_t cl_int4[4] __attribute__((aligned(16)));
+typedef int32_t cl_int8[8] __attribute__((aligned(32)));
+typedef int32_t cl_int16[16] __attribute__((aligned(64)));
+typedef uint32_t cl_uint2[2] __attribute__((aligned(8)));
+typedef uint32_t cl_uint4[4] __attribute__((aligned(16)));
+typedef uint32_t cl_uint8[8] __attribute__((aligned(32)));
+typedef uint32_t cl_uint16[16] __attribute__((aligned(64)));
+
+typedef int64_t cl_long2[2] __attribute__((aligned(16)));
+typedef int64_t cl_long4[4] __attribute__((aligned(32)));
+typedef int64_t cl_long8[8] __attribute__((aligned(64)));
+typedef int64_t cl_long16[16] __attribute__((aligned(128)));
+typedef uint64_t cl_ulong2[2] __attribute__((aligned(16)));
+typedef uint64_t cl_ulong4[4] __attribute__((aligned(32)));
+typedef uint64_t cl_ulong8[8] __attribute__((aligned(64)));
+typedef uint64_t cl_ulong16[16] __attribute__((aligned(128)));
+
+typedef float cl_float2[2] __attribute__((aligned(8)));
+typedef float cl_float4[4] __attribute__((aligned(16)));
+typedef float cl_float8[8] __attribute__((aligned(32)));
+typedef float cl_float16[16] __attribute__((aligned(64)));
+
+typedef double cl_double2[2] __attribute__((aligned(16)));
+typedef double cl_double4[4] __attribute__((aligned(32)));
+typedef double cl_double8[8] __attribute__((aligned(64)));
+typedef double cl_double16[16] __attribute__((aligned(128)));
+
+/* There are no vector types for half */
+
+#endif
+
+/******************************************************************************/
+
+// Macro names and corresponding values defined by OpenCL
+
+#define CL_CHAR_BIT 8
+#define CL_SCHAR_MAX 127
+#define CL_SCHAR_MIN (-127-1)
+#define CL_CHAR_MAX CL_SCHAR_MAX
+#define CL_CHAR_MIN CL_SCHAR_MIN
+#define CL_UCHAR_MAX 255
+#define CL_SHRT_MAX 32767
+#define CL_SHRT_MIN (-32767-1)
+#define CL_USHRT_MAX 65535
+#define CL_INT_MAX 2147483647
+#define CL_INT_MIN (-2147483647-1)
+#define CL_UINT_MAX 0xffffffffU
+#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL)
+#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL)
+#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL)
+
+#define CL_FLT_DIG 6
+#define CL_FLT_MANT_DIG 24
+#define CL_FLT_MAX_10_EXP +38
+#define CL_FLT_MAX_EXP +128
+#define CL_FLT_MIN_10_EXP -37
+#define CL_FLT_MIN_EXP -125
+#define CL_FLT_RADIX 2
+#if defined(_MSC_VER)
+// MSVC doesn't understand hex floats
+#define CL_FLT_MAX 3.402823466e+38F
+#define CL_FLT_MIN 1.175494351e-38F
+#define CL_FLT_EPSILON 1.192092896e-07F
+#else
+#define CL_FLT_MAX 0x1.fffffep127f
+#define CL_FLT_MIN 0x1.0p-126f
+#define CL_FLT_EPSILON 0x1.0p-23f
+#endif
+
+#define CL_DBL_DIG 15
+#define CL_DBL_MANT_DIG 53
+#define CL_DBL_MAX_10_EXP +308
+#define CL_DBL_MAX_EXP +1024
+#define CL_DBL_MIN_10_EXP -307
+#define CL_DBL_MIN_EXP -1021
+#define CL_DBL_RADIX 2
+#if defined(_MSC_VER)
+// MSVC doesn't understand hex floats
+#define CL_DBL_MAX 1.7976931348623158e+308
+#define CL_DBL_MIN 2.2250738585072014e-308
+#define CL_DBL_EPSILON 2.2204460492503131e-016
+#else
+#define CL_DBL_MAX 0x1.fffffffffffffp1023
+#define CL_DBL_MIN 0x1.0p-1022
+#define CL_DBL_EPSILON 0x1.0p-52
+#endif
+
+#include <stddef.h>
+
+
+// CL.h contents
+/******************************************************************************/
+
+typedef struct _cl_platform_id * cl_platform_id;
+typedef struct _cl_device_id * cl_device_id;
+typedef struct _cl_context * cl_context;
+typedef struct _cl_command_queue * cl_command_queue;
+typedef struct _cl_mem * cl_mem;
+typedef struct _cl_program * cl_program;
+typedef struct _cl_kernel * cl_kernel;
+typedef struct _cl_event * cl_event;
+typedef struct _cl_sampler * cl_sampler;
+
+typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */
+typedef cl_ulong cl_bitfield;
+typedef cl_bitfield cl_device_type;
+typedef cl_uint cl_platform_info;
+typedef cl_uint cl_device_info;
+typedef cl_bitfield cl_device_address_info;
+typedef cl_bitfield cl_device_fp_config;
+typedef cl_uint cl_device_mem_cache_type;
+typedef cl_uint cl_device_local_mem_type;
+typedef cl_bitfield cl_device_exec_capabilities;
+typedef cl_bitfield cl_command_queue_properties;
+
+typedef intptr_t cl_context_properties;
+typedef cl_uint cl_context_info;
+typedef cl_uint cl_command_queue_info;
+typedef cl_uint cl_channel_order;
+typedef cl_uint cl_channel_type;
+typedef cl_bitfield cl_mem_flags;
+typedef cl_uint cl_mem_object_type;
+typedef cl_uint cl_mem_info;
+typedef cl_uint cl_image_info;
+typedef cl_uint cl_addressing_mode;
+typedef cl_uint cl_filter_mode;
+typedef cl_uint cl_sampler_info;
+typedef cl_bitfield cl_map_flags;
+typedef cl_uint cl_program_info;
+typedef cl_uint cl_program_build_info;
+typedef cl_int cl_build_status;
+typedef cl_uint cl_kernel_info;
+typedef cl_uint cl_kernel_work_group_info;
+typedef cl_uint cl_event_info;
+typedef cl_uint cl_command_type;
+typedef cl_uint cl_profiling_info;
+
+typedef struct _cl_image_format {
+ cl_channel_order image_channel_order;
+ cl_channel_type image_channel_data_type;
+} cl_image_format;
+
+
+
+/******************************************************************************/
+
+// Error Codes
+#define CL_SUCCESS 0
+#define CL_DEVICE_NOT_FOUND -1
+#define CL_DEVICE_NOT_AVAILABLE -2
+#define CL_COMPILER_NOT_AVAILABLE -3
+#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4
+#define CL_OUT_OF_RESOURCES -5
+#define CL_OUT_OF_HOST_MEMORY -6
+#define CL_PROFILING_INFO_NOT_AVAILABLE -7
+#define CL_MEM_COPY_OVERLAP -8
+#define CL_IMAGE_FORMAT_MISMATCH -9
+#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10
+#define CL_BUILD_PROGRAM_FAILURE -11
+#define CL_MAP_FAILURE -12
+
+#define CL_INVALID_VALUE -30
+#define CL_INVALID_DEVICE_TYPE -31
+#define CL_INVALID_PLATFORM -32
+#define CL_INVALID_DEVICE -33
+#define CL_INVALID_CONTEXT -34
+#define CL_INVALID_QUEUE_PROPERTIES -35
+#define CL_INVALID_COMMAND_QUEUE -36
+#define CL_INVALID_HOST_PTR -37
+#define CL_INVALID_MEM_OBJECT -38
+#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39
+#define CL_INVALID_IMAGE_SIZE -40
+#define CL_INVALID_SAMPLER -41
+#define CL_INVALID_BINARY -42
+#define CL_INVALID_BUILD_OPTIONS -43
+#define CL_INVALID_PROGRAM -44
+#define CL_INVALID_PROGRAM_EXECUTABLE -45
+#define CL_INVALID_KERNEL_NAME -46
+#define CL_INVALID_KERNEL_DEFINITION -47
+#define CL_INVALID_KERNEL -48
+#define CL_INVALID_ARG_INDEX -49
+#define CL_INVALID_ARG_VALUE -50
+#define CL_INVALID_ARG_SIZE -51
+#define CL_INVALID_KERNEL_ARGS -52
+#define CL_INVALID_WORK_DIMENSION -53
+#define CL_INVALID_WORK_GROUP_SIZE -54
+#define CL_INVALID_WORK_ITEM_SIZE -55
+#define CL_INVALID_GLOBAL_OFFSET -56
+#define CL_INVALID_EVENT_WAIT_LIST -57
+#define CL_INVALID_EVENT -58
+#define CL_INVALID_OPERATION -59
+#define CL_INVALID_GL_OBJECT -60
+#define CL_INVALID_BUFFER_SIZE -61
+#define CL_INVALID_MIP_LEVEL -62
+#define CL_INVALID_GLOBAL_WORK_SIZE -63
+
+// OpenCL Version
+#define CL_VERSION_1_0 1
+
+// cl_bool
+#define CL_FALSE 0
+#define CL_TRUE 1
+
+// cl_platform_info
+#define CL_PLATFORM_PROFILE 0x0900
+#define CL_PLATFORM_VERSION 0x0901
+#define CL_PLATFORM_NAME 0x0902
+#define CL_PLATFORM_VENDOR 0x0903
+#define CL_PLATFORM_EXTENSIONS 0x0904
+
+// cl_device_type - bitfield
+#define CL_DEVICE_TYPE_DEFAULT (1 << 0)
+#define CL_DEVICE_TYPE_CPU (1 << 1)
+#define CL_DEVICE_TYPE_GPU (1 << 2)
+#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3)
+#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF
+
+// cl_device_info
+#define CL_DEVICE_TYPE 0x1000
+#define CL_DEVICE_VENDOR_ID 0x1001
+#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002
+#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003
+#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004
+#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B
+#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C
+#define CL_DEVICE_ADDRESS_BITS 0x100D
+#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E
+#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F
+#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010
+#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011
+#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012
+#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013
+#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014
+#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015
+#define CL_DEVICE_IMAGE_SUPPORT 0x1016
+#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017
+#define CL_DEVICE_MAX_SAMPLERS 0x1018
+#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019
+#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A
+#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B
+#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C
+#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D
+#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E
+#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F
+#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020
+#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021
+#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022
+#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023
+#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024
+#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025
+#define CL_DEVICE_ENDIAN_LITTLE 0x1026
+#define CL_DEVICE_AVAILABLE 0x1027
+#define CL_DEVICE_COMPILER_AVAILABLE 0x1028
+#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029
+#define CL_DEVICE_QUEUE_PROPERTIES 0x102A
+#define CL_DEVICE_NAME 0x102B
+#define CL_DEVICE_VENDOR 0x102C
+#define CL_DRIVER_VERSION 0x102D
+#define CL_DEVICE_PROFILE 0x102E
+#define CL_DEVICE_VERSION 0x102F
+#define CL_DEVICE_EXTENSIONS 0x1030
+#define CL_DEVICE_PLATFORM 0x1031
+/* 0x1032 reserved for CL_DEVICE_DOUBLE_FP_CONFIG */
+/* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034
+#define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C
+#define CL_DEVICE_OPENCL_C_VERSION 0x103D
+
+// cl_device_fp_config - bitfield
+#define CL_FP_DENORM (1 << 0)
+#define CL_FP_INF_NAN (1 << 1)
+#define CL_FP_ROUND_TO_NEAREST (1 << 2)
+#define CL_FP_ROUND_TO_ZERO (1 << 3)
+#define CL_FP_ROUND_TO_INF (1 << 4)
+#define CL_FP_FMA (1 << 5)
+
+// cl_device_mem_cache_type
+#define CL_NONE 0x0
+#define CL_READ_ONLY_CACHE 0x1
+#define CL_READ_WRITE_CACHE 0x2
+
+// cl_device_local_mem_type
+#define CL_LOCAL 0x1
+#define CL_GLOBAL 0x2
+
+// cl_device_exec_capabilities - bitfield
+#define CL_EXEC_KERNEL (1 << 0)
+#define CL_EXEC_NATIVE_KERNEL (1 << 1)
+
+// cl_command_queue_properties - bitfield
+#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0)
+#define CL_QUEUE_PROFILING_ENABLE (1 << 1)
+
+// cl_context_info
+#define CL_CONTEXT_REFERENCE_COUNT 0x1080
+#define CL_CONTEXT_DEVICES 0x1081
+#define CL_CONTEXT_PROPERTIES 0x1082
+
+// cl_context_properties
+#define CL_CONTEXT_PLATFORM 0x1084
+
+// cl_command_queue_info
+#define CL_QUEUE_CONTEXT 0x1090
+#define CL_QUEUE_DEVICE 0x1091
+#define CL_QUEUE_REFERENCE_COUNT 0x1092
+#define CL_QUEUE_PROPERTIES 0x1093
+
+// cl_mem_flags - bitfield
+#define CL_MEM_READ_WRITE (1 << 0)
+#define CL_MEM_WRITE_ONLY (1 << 1)
+#define CL_MEM_READ_ONLY (1 << 2)
+#define CL_MEM_USE_HOST_PTR (1 << 3)
+#define CL_MEM_ALLOC_HOST_PTR (1 << 4)
+#define CL_MEM_COPY_HOST_PTR (1 << 5)
+
+// cl_channel_order
+#define CL_R 0x10B0
+#define CL_A 0x10B1
+#define CL_RG 0x10B2
+#define CL_RA 0x10B3
+#define CL_RGB 0x10B4
+#define CL_RGBA 0x10B5
+#define CL_BGRA 0x10B6
+#define CL_ARGB 0x10B7
+#define CL_INTENSITY 0x10B8
+#define CL_LUMINANCE 0x10B9
+
+// cl_channel_type
+#define CL_SNORM_INT8 0x10D0
+#define CL_SNORM_INT16 0x10D1
+#define CL_UNORM_INT8 0x10D2
+#define CL_UNORM_INT16 0x10D3
+#define CL_UNORM_SHORT_565 0x10D4
+#define CL_UNORM_SHORT_555 0x10D5
+#define CL_UNORM_INT_101010 0x10D6
+#define CL_SIGNED_INT8 0x10D7
+#define CL_SIGNED_INT16 0x10D8
+#define CL_SIGNED_INT32 0x10D9
+#define CL_UNSIGNED_INT8 0x10DA
+#define CL_UNSIGNED_INT16 0x10DB
+#define CL_UNSIGNED_INT32 0x10DC
+#define CL_HALF_FLOAT 0x10DD
+#define CL_FLOAT 0x10DE
+
+// cl_mem_object_type
+#define CL_MEM_OBJECT_BUFFER 0x10F0
+#define CL_MEM_OBJECT_IMAGE2D 0x10F1
+#define CL_MEM_OBJECT_IMAGE3D 0x10F2
+
+// cl_mem_info
+#define CL_MEM_TYPE 0x1100
+#define CL_MEM_FLAGS 0x1101
+#define CL_MEM_SIZE 0x1102
+#define CL_MEM_HOST_PTR 0x1103
+#define CL_MEM_MAP_COUNT 0x1104
+#define CL_MEM_REFERENCE_COUNT 0x1105
+#define CL_MEM_CONTEXT 0x1106
+
+// cl_image_info
+#define CL_IMAGE_FORMAT 0x1110
+#define CL_IMAGE_ELEMENT_SIZE 0x1111
+#define CL_IMAGE_ROW_PITCH 0x1112
+#define CL_IMAGE_SLICE_PITCH 0x1113
+#define CL_IMAGE_WIDTH 0x1114
+#define CL_IMAGE_HEIGHT 0x1115
+#define CL_IMAGE_DEPTH 0x1116
+
+// cl_addressing_mode
+#define CL_ADDRESS_NONE 0x1130
+#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131
+#define CL_ADDRESS_CLAMP 0x1132
+#define CL_ADDRESS_REPEAT 0x1133
+
+// cl_filter_mode
+#define CL_FILTER_NEAREST 0x1140
+#define CL_FILTER_LINEAR 0x1141
+
+// cl_sampler_info
+#define CL_SAMPLER_REFERENCE_COUNT 0x1150
+#define CL_SAMPLER_CONTEXT 0x1151
+#define CL_SAMPLER_NORMALIZED_COORDS 0x1152
+#define CL_SAMPLER_ADDRESSING_MODE 0x1153
+#define CL_SAMPLER_FILTER_MODE 0x1154
+
+// cl_map_flags - bitfield
+#define CL_MAP_READ (1 << 0)
+#define CL_MAP_WRITE (1 << 1)
+
+// cl_program_info
+#define CL_PROGRAM_REFERENCE_COUNT 0x1160
+#define CL_PROGRAM_CONTEXT 0x1161
+#define CL_PROGRAM_NUM_DEVICES 0x1162
+#define CL_PROGRAM_DEVICES 0x1163
+#define CL_PROGRAM_SOURCE 0x1164
+#define CL_PROGRAM_BINARY_SIZES 0x1165
+#define CL_PROGRAM_BINARIES 0x1166
+
+// cl_program_build_info
+#define CL_PROGRAM_BUILD_STATUS 0x1181
+#define CL_PROGRAM_BUILD_OPTIONS 0x1182
+#define CL_PROGRAM_BUILD_LOG 0x1183
+
+// cl_build_status
+#define CL_BUILD_SUCCESS 0
+#define CL_BUILD_NONE -1
+#define CL_BUILD_ERROR -2
+#define CL_BUILD_IN_PROGRESS -3
+
+// cl_kernel_info
+#define CL_KERNEL_FUNCTION_NAME 0x1190
+#define CL_KERNEL_NUM_ARGS 0x1191
+#define CL_KERNEL_REFERENCE_COUNT 0x1192
+#define CL_KERNEL_CONTEXT 0x1193
+#define CL_KERNEL_PROGRAM 0x1194
+
+// cl_kernel_work_group_info
+#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0
+#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1
+#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2
+
+// cl_event_info
+#define CL_EVENT_COMMAND_QUEUE 0x11D0
+#define CL_EVENT_COMMAND_TYPE 0x11D1
+#define CL_EVENT_REFERENCE_COUNT 0x11D2
+#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3
+
+// cl_command_type
+#define CL_COMMAND_NDRANGE_KERNEL 0x11F0
+#define CL_COMMAND_TASK 0x11F1
+#define CL_COMMAND_NATIVE_KERNEL 0x11F2
+#define CL_COMMAND_READ_BUFFER 0x11F3
+#define CL_COMMAND_WRITE_BUFFER 0x11F4
+#define CL_COMMAND_COPY_BUFFER 0x11F5
+#define CL_COMMAND_READ_IMAGE 0x11F6
+#define CL_COMMAND_WRITE_IMAGE 0x11F7
+#define CL_COMMAND_COPY_IMAGE 0x11F8
+#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9
+#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA
+#define CL_COMMAND_MAP_BUFFER 0x11FB
+#define CL_COMMAND_MAP_IMAGE 0x11FC
+#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD
+#define CL_COMMAND_MARKER 0x11FE
+#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF
+#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200
+
+// command execution status
+#define CL_COMPLETE 0x0
+#define CL_RUNNING 0x1
+#define CL_SUBMITTED 0x2
+#define CL_QUEUED 0x3
+
+// cl_profiling_info
+#define CL_PROFILING_COMMAND_QUEUED 0x1280
+#define CL_PROFILING_COMMAND_SUBMIT 0x1281
+#define CL_PROFILING_COMMAND_START 0x1282
+#define CL_PROFILING_COMMAND_END 0x1283
+
+/********************************************************************************************************/
+
+/********************************************************************************************************/
+
+// Function signature typedef's
+
+// Platform API
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETPLATFORMIDS)(cl_uint /* num_entries */,
+ cl_platform_id * /* platforms */,
+ cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETPLATFORMINFO)(cl_platform_id /* platform */,
+ cl_platform_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Device APIs
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETDEVICEIDS)(cl_platform_id /* platform */,
+ cl_device_type /* device_type */,
+ cl_uint /* num_entries */,
+ cl_device_id * /* devices */,
+ cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETDEVICEINFO)(cl_device_id /* device */,
+ cl_device_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Context APIs
+typedef CL_API_ENTRY cl_context (CL_API_CALL *
+PFNCLCREATECONTEXT)(const cl_context_properties * /* properties */,
+ cl_uint /* num_devices */,
+ const cl_device_id * /* devices */,
+ void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */,
+ void * /* user_data */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_context (CL_API_CALL *
+PFNCLCREATECONTEXTFROMTYPE)(const cl_context_properties * /* properties */,
+ cl_device_type /* device_type */,
+ void (*pfn_notify)(const char *, const void *, size_t, void *) /* pfn_notify */,
+ void * /* user_data */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRETAINCONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRELEASECONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETCONTEXTINFO)(cl_context /* context */,
+ cl_context_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Command Queue APIs
+typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *
+PFNCLCREATECOMMANDQUEUE)(cl_context /* context */,
+ cl_device_id /* device */,
+ cl_command_queue_properties /* properties */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRETAINCOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRELEASECOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETCOMMANDQUEUEINFO)(cl_command_queue /* command_queue */,
+ cl_command_queue_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLSETCOMMANDQUEUEPROPERTY)(cl_command_queue /* command_queue */,
+ cl_command_queue_properties /* properties */,
+ cl_bool /* enable */,
+ cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0;
+
+// Memory Object APIs
+typedef CL_API_ENTRY cl_mem (CL_API_CALL *
+PFNCLCREATEBUFFER)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ size_t /* size */,
+ void * /* host_ptr */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_mem (CL_API_CALL *
+PFNCLCREATEIMAGE2D)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ const cl_image_format * /* image_format */,
+ size_t /* image_width */,
+ size_t /* image_height */,
+ size_t /* image_row_pitch */,
+ void * /* host_ptr */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_mem (CL_API_CALL *
+PFNCLCREATEIMAGE3D)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ const cl_image_format * /* image_format */,
+ size_t /* image_width */,
+ size_t /* image_height */,
+ size_t /* image_depth */,
+ size_t /* image_row_pitch */,
+ size_t /* image_slice_pitch */,
+ void * /* host_ptr */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRETAINMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRELEASEMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETSUPPORTEDIMAGEFORMATS)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ cl_mem_object_type /* image_type */,
+ cl_uint /* num_entries */,
+ cl_image_format * /* image_formats */,
+ cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETMEMOBJECTINFO)(cl_mem /* memobj */,
+ cl_mem_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETIMAGEINFO)(cl_mem /* image */,
+ cl_image_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Sampler APIs
+typedef CL_API_ENTRY cl_sampler (CL_API_CALL *
+PFNCLCREATESAMPLER)(cl_context /* context */,
+ cl_bool /* normalized_coords */,
+ cl_addressing_mode /* addressing_mode */,
+ cl_filter_mode /* filter_mode */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRETAINSAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRELEASESAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETSAMPLERINFO)(cl_sampler /* sampler */,
+ cl_sampler_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Program Object APIs
+typedef CL_API_ENTRY cl_program (CL_API_CALL *
+PFNCLCREATEPROGRAMWITHSOURCE)(cl_context /* context */,
+ cl_uint /* count */,
+ const char ** /* strings */,
+ const size_t * /* lengths */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_program (CL_API_CALL *
+PFNCLCREATEPROGRAMWITHBINARY)(cl_context /* context */,
+ cl_uint /* num_devices */,
+ const cl_device_id * /* device_list */,
+ const size_t * /* lengths */,
+ const unsigned char ** /* binaries */,
+ cl_int * /* binary_status */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRETAINPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRELEASEPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLBUILDPROGRAM)(cl_program /* program */,
+ cl_uint /* num_devices */,
+ const cl_device_id * /* device_list */,
+ const char * /* options */,
+ void (*pfn_notify)(cl_program /* program */, void * /* user_data */),
+ void * /* user_data */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLUNLOADCOMPILER)(void) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETPROGRAMINFO)(cl_program /* program */,
+ cl_program_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETPROGRAMBUILDINFO)(cl_program /* program */,
+ cl_device_id /* device */,
+ cl_program_build_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Kernel Object APIs
+typedef CL_API_ENTRY cl_kernel (CL_API_CALL *
+PFNCLCREATEKERNEL)(cl_program /* program */,
+ const char * /* kernel_name */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLCREATEKERNELSINPROGRAM)(cl_program /* program */,
+ cl_uint /* num_kernels */,
+ cl_kernel * /* kernels */,
+ cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRETAINKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRELEASEKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLSETKERNELARG)(cl_kernel /* kernel */,
+ cl_uint /* arg_index */,
+ size_t /* arg_size */,
+ const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETKERNELINFO)(cl_kernel /* kernel */,
+ cl_kernel_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETKERNELWORKGROUPINFO)(cl_kernel /* kernel */,
+ cl_device_id /* device */,
+ cl_kernel_work_group_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Event Object APIs
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLWAITFOREVENTS)(cl_uint /* num_events */,
+ const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETEVENTINFO)(cl_event /* event */,
+ cl_event_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRETAINEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLRELEASEEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+// Profiling APIs
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLGETEVENTPROFILINGINFO)(cl_event /* event */,
+ cl_profiling_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+// Flush and Finish APIs
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLFLUSH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLFINISH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+// Enqueued Commands APIs
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEREADBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_read */,
+ size_t /* offset */,
+ size_t /* cb */,
+ void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEWRITEBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_write */,
+ size_t /* offset */,
+ size_t /* cb */,
+ const void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUECOPYBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* src_buffer */,
+ cl_mem /* dst_buffer */,
+ size_t /* src_offset */,
+ size_t /* dst_offset */,
+ size_t /* cb */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEREADIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* image */,
+ cl_bool /* blocking_read */,
+ const size_t * /* origin[3] */,
+ const size_t * /* region[3] */,
+ size_t /* row_pitch */,
+ size_t /* slice_pitch */,
+ void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEWRITEIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* image */,
+ cl_bool /* blocking_write */,
+ const size_t * /* origin[3] */,
+ const size_t * /* region[3] */,
+ size_t /* input_row_pitch */,
+ size_t /* input_slice_pitch */,
+ const void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUECOPYIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* src_image */,
+ cl_mem /* dst_image */,
+ const size_t * /* src_origin[3] */,
+ const size_t * /* dst_origin[3] */,
+ const size_t * /* region[3] */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUECOPYIMAGETOBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* src_image */,
+ cl_mem /* dst_buffer */,
+ const size_t * /* src_origin[3] */,
+ const size_t * /* region[3] */,
+ size_t /* dst_offset */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUECOPYBUFFERTOIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* src_buffer */,
+ cl_mem /* dst_image */,
+ size_t /* src_offset */,
+ const size_t * /* dst_origin[3] */,
+ const size_t * /* region[3] */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY void * (CL_API_CALL *
+PFNCLENQUEUEMAPBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_map */,
+ cl_map_flags /* map_flags */,
+ size_t /* offset */,
+ size_t /* cb */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY void * (CL_API_CALL *
+PFNCLENQUEUEMAPIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* image */,
+ cl_bool /* blocking_map */,
+ cl_map_flags /* map_flags */,
+ const size_t * /* origin[3] */,
+ const size_t * /* region[3] */,
+ size_t * /* image_row_pitch */,
+ size_t * /* image_slice_pitch */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEUNMAPMEMOBJECT)(cl_command_queue /* command_queue */,
+ cl_mem /* memobj */,
+ void * /* mapped_ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUENDRANGEKERNEL)(cl_command_queue /* command_queue */,
+ cl_kernel /* kernel */,
+ cl_uint /* work_dim */,
+ const size_t * /* global_work_offset */,
+ const size_t * /* global_work_size */,
+ const size_t * /* local_work_size */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUETASK)(cl_command_queue /* command_queue */,
+ cl_kernel /* kernel */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUENATIVEKERNEL)(cl_command_queue /* command_queue */,
+ void (*user_func)(void *),
+ void * /* args */,
+ size_t /* cb_args */,
+ cl_uint /* num_mem_objects */,
+ const cl_mem * /* mem_list */,
+ const void ** /* args_mem_loc */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEMARKER)(cl_command_queue /* command_queue */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEWAITFOREVENTS)(cl_command_queue /* command_queue */,
+ cl_uint /* num_events */,
+ const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
+
+typedef CL_API_ENTRY cl_int (CL_API_CALL *
+PFNCLENQUEUEBARRIER)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+// Extension function access
+//
+// Returns the extension function address for the given function name,
+// or NULL if a valid function can not be found. The client must
+// check to make sure the address is not NULL, before using or
+// calling the returned function address.
+//
+typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLGETEXTENSIONFUNCTIONADDRESS)(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0;
+
+
+#define CLEW_STATIC
+
+#ifdef CLEW_STATIC
+# define CLEWAPI extern
+#else
+# ifdef CLEW_BUILD
+# define CLEWAPI extern __declspec(dllexport)
+# else
+# define CLEWAPI extern __declspec(dllimport)
+# endif
+#endif
+
+#if defined(_WIN32)
+#define CLEW_FUN_EXPORT extern
+#else
+#define CLEW_FUN_EXPORT CLEWAPI
+#endif
+
+#define CLEW_GET_FUN(x) x
+
+
+// Variables holding function entry points
+CLEW_FUN_EXPORT PFNCLGETPLATFORMIDS __clewGetPlatformIDs ;
+CLEW_FUN_EXPORT PFNCLGETPLATFORMINFO __clewGetPlatformInfo ;
+CLEW_FUN_EXPORT PFNCLGETDEVICEIDS __clewGetDeviceIDs ;
+CLEW_FUN_EXPORT PFNCLGETDEVICEINFO __clewGetDeviceInfo ;
+CLEW_FUN_EXPORT PFNCLCREATECONTEXT __clewCreateContext ;
+CLEW_FUN_EXPORT PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType ;
+CLEW_FUN_EXPORT PFNCLRETAINCONTEXT __clewRetainContext ;
+CLEW_FUN_EXPORT PFNCLRELEASECONTEXT __clewReleaseContext ;
+CLEW_FUN_EXPORT PFNCLGETCONTEXTINFO __clewGetContextInfo ;
+CLEW_FUN_EXPORT PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue ;
+CLEW_FUN_EXPORT PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue ;
+CLEW_FUN_EXPORT PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue ;
+CLEW_FUN_EXPORT PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo ;
+CLEW_FUN_EXPORT PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty ;
+CLEW_FUN_EXPORT PFNCLCREATEBUFFER __clewCreateBuffer ;
+CLEW_FUN_EXPORT PFNCLCREATEIMAGE2D __clewCreateImage2D ;
+CLEW_FUN_EXPORT PFNCLCREATEIMAGE3D __clewCreateImage3D ;
+CLEW_FUN_EXPORT PFNCLRETAINMEMOBJECT __clewRetainMemObject ;
+CLEW_FUN_EXPORT PFNCLRELEASEMEMOBJECT __clewReleaseMemObject ;
+CLEW_FUN_EXPORT PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats ;
+CLEW_FUN_EXPORT PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo ;
+CLEW_FUN_EXPORT PFNCLGETIMAGEINFO __clewGetImageInfo ;
+CLEW_FUN_EXPORT PFNCLCREATESAMPLER __clewCreateSampler ;
+CLEW_FUN_EXPORT PFNCLRETAINSAMPLER __clewRetainSampler ;
+CLEW_FUN_EXPORT PFNCLRELEASESAMPLER __clewReleaseSampler ;
+CLEW_FUN_EXPORT PFNCLGETSAMPLERINFO __clewGetSamplerInfo ;
+CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource ;
+CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary ;
+CLEW_FUN_EXPORT PFNCLRETAINPROGRAM __clewRetainProgram ;
+CLEW_FUN_EXPORT PFNCLRELEASEPROGRAM __clewReleaseProgram ;
+CLEW_FUN_EXPORT PFNCLBUILDPROGRAM __clewBuildProgram ;
+CLEW_FUN_EXPORT PFNCLUNLOADCOMPILER __clewUnloadCompiler ;
+CLEW_FUN_EXPORT PFNCLGETPROGRAMINFO __clewGetProgramInfo ;
+CLEW_FUN_EXPORT PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo ;
+CLEW_FUN_EXPORT PFNCLCREATEKERNEL __clewCreateKernel ;
+CLEW_FUN_EXPORT PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram ;
+CLEW_FUN_EXPORT PFNCLRETAINKERNEL __clewRetainKernel ;
+CLEW_FUN_EXPORT PFNCLRELEASEKERNEL __clewReleaseKernel ;
+CLEW_FUN_EXPORT PFNCLSETKERNELARG __clewSetKernelArg ;
+CLEW_FUN_EXPORT PFNCLGETKERNELINFO __clewGetKernelInfo ;
+CLEW_FUN_EXPORT PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo ;
+CLEW_FUN_EXPORT PFNCLWAITFOREVENTS __clewWaitForEvents ;
+CLEW_FUN_EXPORT PFNCLGETEVENTINFO __clewGetEventInfo ;
+CLEW_FUN_EXPORT PFNCLRETAINEVENT __clewRetainEvent ;
+CLEW_FUN_EXPORT PFNCLRELEASEEVENT __clewReleaseEvent ;
+CLEW_FUN_EXPORT PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo ;
+CLEW_FUN_EXPORT PFNCLFLUSH __clewFlush ;
+CLEW_FUN_EXPORT PFNCLFINISH __clewFinish ;
+CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer ;
+CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer ;
+CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer ;
+CLEW_FUN_EXPORT PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage ;
+CLEW_FUN_EXPORT PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage ;
+CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage ;
+CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer ;
+CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage ;
+CLEW_FUN_EXPORT PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer ;
+CLEW_FUN_EXPORT PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage ;
+CLEW_FUN_EXPORT PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject ;
+CLEW_FUN_EXPORT PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel ;
+CLEW_FUN_EXPORT PFNCLENQUEUETASK __clewEnqueueTask ;
+CLEW_FUN_EXPORT PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel ;
+CLEW_FUN_EXPORT PFNCLENQUEUEMARKER __clewEnqueueMarker ;
+CLEW_FUN_EXPORT PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents ;
+CLEW_FUN_EXPORT PFNCLENQUEUEBARRIER __clewEnqueueBarrier ;
+CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress ;
+
+
+#define clGetPlatformIDs CLEW_GET_FUN(__clewGetPlatformIDs )
+#define clGetPlatformInfo CLEW_GET_FUN(__clewGetPlatformInfo )
+#define clGetDeviceIDs CLEW_GET_FUN(__clewGetDeviceIDs )
+#define clGetDeviceInfo CLEW_GET_FUN(__clewGetDeviceInfo )
+#define clCreateContext CLEW_GET_FUN(__clewCreateContext )
+#define clCreateContextFromType CLEW_GET_FUN(__clewCreateContextFromType )
+#define clRetainContext CLEW_GET_FUN(__clewRetainContext )
+#define clReleaseContext CLEW_GET_FUN(__clewReleaseContext )
+#define clGetContextInfo CLEW_GET_FUN(__clewGetContextInfo )
+#define clCreateCommandQueue CLEW_GET_FUN(__clewCreateCommandQueue )
+#define clRetainCommandQueue CLEW_GET_FUN(__clewRetainCommandQueue )
+#define clReleaseCommandQueue CLEW_GET_FUN(__clewReleaseCommandQueue )
+#define clGetCommandQueueInfo CLEW_GET_FUN(__clewGetCommandQueueInfo )
+#define clSetCommandQueueProperty CLEW_GET_FUN(__clewSetCommandQueueProperty )
+#define clCreateBuffer CLEW_GET_FUN(__clewCreateBuffer )
+#define clCreateImage2D CLEW_GET_FUN(__clewCreateImage2D )
+#define clCreateImage3D CLEW_GET_FUN(__clewCreateImage3D )
+#define clRetainMemObject CLEW_GET_FUN(__clewRetainMemObject )
+#define clReleaseMemObject CLEW_GET_FUN(__clewReleaseMemObject )
+#define clGetSupportedImageFormats CLEW_GET_FUN(__clewGetSupportedImageFormats )
+#define clGetMemObjectInfo CLEW_GET_FUN(__clewGetMemObjectInfo )
+#define clGetImageInfo CLEW_GET_FUN(__clewGetImageInfo )
+#define clCreateSampler CLEW_GET_FUN(__clewCreateSampler )
+#define clRetainSampler CLEW_GET_FUN(__clewRetainSampler )
+#define clReleaseSampler CLEW_GET_FUN(__clewReleaseSampler )
+#define clGetSamplerInfo CLEW_GET_FUN(__clewGetSamplerInfo )
+#define clCreateProgramWithSource CLEW_GET_FUN(__clewCreateProgramWithSource )
+#define clCreateProgramWithBinary CLEW_GET_FUN(__clewCreateProgramWithBinary )
+#define clRetainProgram CLEW_GET_FUN(__clewRetainProgram )
+#define clReleaseProgram CLEW_GET_FUN(__clewReleaseProgram )
+#define clBuildProgram CLEW_GET_FUN(__clewBuildProgram )
+#define clUnloadCompiler CLEW_GET_FUN(__clewUnloadCompiler )
+#define clGetProgramInfo CLEW_GET_FUN(__clewGetProgramInfo )
+#define clGetProgramBuildInfo CLEW_GET_FUN(__clewGetProgramBuildInfo )
+#define clCreateKernel CLEW_GET_FUN(__clewCreateKernel )
+#define clCreateKernelsInProgram CLEW_GET_FUN(__clewCreateKernelsInProgram )
+#define clRetainKernel CLEW_GET_FUN(__clewRetainKernel )
+#define clReleaseKernel CLEW_GET_FUN(__clewReleaseKernel )
+#define clSetKernelArg CLEW_GET_FUN(__clewSetKernelArg )
+#define clGetKernelInfo CLEW_GET_FUN(__clewGetKernelInfo )
+#define clGetKernelWorkGroupInfo CLEW_GET_FUN(__clewGetKernelWorkGroupInfo )
+#define clWaitForEvents CLEW_GET_FUN(__clewWaitForEvents )
+#define clGetEventInfo CLEW_GET_FUN(__clewGetEventInfo )
+#define clRetainEvent CLEW_GET_FUN(__clewRetainEvent )
+#define clReleaseEvent CLEW_GET_FUN(__clewReleaseEvent )
+#define clGetEventProfilingInfo CLEW_GET_FUN(__clewGetEventProfilingInfo )
+#define clFlush CLEW_GET_FUN(__clewFlush )
+#define clFinish CLEW_GET_FUN(__clewFinish )
+#define clEnqueueReadBuffer CLEW_GET_FUN(__clewEnqueueReadBuffer )
+#define clEnqueueWriteBuffer CLEW_GET_FUN(__clewEnqueueWriteBuffer )
+#define clEnqueueCopyBuffer CLEW_GET_FUN(__clewEnqueueCopyBuffer )
+#define clEnqueueReadImage CLEW_GET_FUN(__clewEnqueueReadImage )
+#define clEnqueueWriteImage CLEW_GET_FUN(__clewEnqueueWriteImage )
+#define clEnqueueCopyImage CLEW_GET_FUN(__clewEnqueueCopyImage )
+#define clEnqueueCopyImageToBuffer CLEW_GET_FUN(__clewEnqueueCopyImageToBuffer )
+#define clEnqueueCopyBufferToImage CLEW_GET_FUN(__clewEnqueueCopyBufferToImage )
+#define clEnqueueMapBuffer CLEW_GET_FUN(__clewEnqueueMapBuffer )
+#define clEnqueueMapImage CLEW_GET_FUN(__clewEnqueueMapImage )
+#define clEnqueueUnmapMemObject CLEW_GET_FUN(__clewEnqueueUnmapMemObject )
+#define clEnqueueNDRangeKernel CLEW_GET_FUN(__clewEnqueueNDRangeKernel )
+#define clEnqueueTask CLEW_GET_FUN(__clewEnqueueTask )
+#define clEnqueueNativeKernel CLEW_GET_FUN(__clewEnqueueNativeKernel )
+#define clEnqueueMarker CLEW_GET_FUN(__clewEnqueueMarker )
+#define clEnqueueWaitForEvents CLEW_GET_FUN(__clewEnqueueWaitForEvents )
+#define clEnqueueBarrier CLEW_GET_FUN(__clewEnqueueBarrier )
+#define clGetExtensionFunctionAddress CLEW_GET_FUN(__clewGetExtensionFunctionAddress )
+
+#endif // CLCC_GENERATE_DOCUMENTATION
+
+#define CLEW_SUCCESS 0 //!< Success error code
+#define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library
+#define CLEW_ERROR_ATEXIT_FAILED -2 //!< Error code for failing to queue the closing of the dynamic library to atexit()
+
+int clLibraryInit(void);
+const char *clErrorString(cl_int error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __UTIL_OPENCL_H__ */
+
diff --git a/intern/cycles/util/util_opengl.h b/intern/cycles/util/util_opengl.h
new file mode 100644
index 00000000000..352aa7b1c19
--- /dev/null
+++ b/intern/cycles/util/util_opengl.h
@@ -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.
+ */
+
+#ifndef __UTIL_OPENGL_H__
+#define __UTIL_OPENGL_H__
+
+/* OpenGL header includes, used everywhere we use OpenGL, to deal with
+ * platform differences in one central place. */
+
+#ifdef __APPLE__
+#include <OpenGL/gl.h>
+#include <OpenGL/glu.h>
+#else
+#include <GL/glew.h>
+#endif
+
+#endif /* __UTIL_OPENGL_H__ */
+
diff --git a/intern/cycles/util/util_param.h b/intern/cycles/util/util_param.h
new file mode 100644
index 00000000000..d1ca1b65ffb
--- /dev/null
+++ b/intern/cycles/util/util_param.h
@@ -0,0 +1,36 @@
+/*
+ * 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 __UTIL_PARAM_H__
+#define __UTIL_PARAM_H__
+
+/* Parameter value lists from OpenImageIO are used to store custom properties
+ * on various data, which can then later be used in shaders. */
+
+#include <OpenImageIO/paramlist.h>
+#include <OpenImageIO/typedesc.h>
+#include <OpenImageIO/ustring.h>
+
+CCL_NAMESPACE_BEGIN
+
+OIIO_NAMESPACE_USING
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_PARAM_H__ */
+
diff --git a/intern/cycles/util/util_path.cpp b/intern/cycles/util/util_path.cpp
new file mode 100644
index 00000000000..55e6a95b54a
--- /dev/null
+++ b/intern/cycles/util/util_path.cpp
@@ -0,0 +1,166 @@
+/*
+ * 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 "util_debug.h"
+#include "util_md5.h"
+#include "util_path.h"
+#include "util_string.h"
+
+#include <OpenImageIO/sysutil.h>
+OIIO_NAMESPACE_USING
+
+#include <stdio.h>
+
+#define BOOST_FILESYSTEM_VERSION 2
+
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string.hpp>
+
+CCL_NAMESPACE_BEGIN
+
+static string cached_path = "";
+static string cached_user_path = "";
+
+void path_init(const string& path, const string& user_path)
+{
+ cached_path = path;
+ cached_user_path = user_path;
+}
+
+string path_get(const string& sub)
+{
+ if(cached_path == "")
+ cached_path = path_dirname(Sysutil::this_program_path());
+
+ return path_join(cached_path, sub);
+}
+
+string path_user_get(const string& sub)
+{
+ if(cached_user_path == "")
+ cached_user_path = path_dirname(Sysutil::this_program_path());
+
+ return path_join(cached_user_path, sub);
+}
+
+string path_filename(const string& path)
+{
+ return boost::filesystem::path(path).filename();
+}
+
+string path_dirname(const string& path)
+{
+ return boost::filesystem::path(path).parent_path().string();
+}
+
+string path_join(const string& dir, const string& file)
+{
+ return (boost::filesystem::path(dir) / boost::filesystem::path(file)).string();
+}
+
+string path_escape(const string& path)
+{
+ string result = path;
+ boost::replace_all(result, " ", "\\ ");
+ return result;
+}
+
+bool path_exists(const string& path)
+{
+ return boost::filesystem::exists(path);
+}
+
+static void path_files_md5_hash_recursive(MD5Hash& hash, const string& dir)
+{
+ if(boost::filesystem::exists(dir)) {
+ boost::filesystem::directory_iterator it(dir), it_end;
+
+ for(; it != it_end; it++) {
+ if(boost::filesystem::is_directory(it->status())) {
+ path_files_md5_hash_recursive(hash, it->path().string());
+ }
+ else {
+ string filepath = it->path().string();
+
+ hash.append((const uint8_t*)filepath.c_str(), filepath.size());
+ hash.append_file(filepath);
+ }
+ }
+ }
+}
+
+string path_files_md5_hash(const string& dir)
+{
+ /* computes md5 hash of all files in the directory */
+ MD5Hash hash;
+
+ path_files_md5_hash_recursive(hash, dir);
+
+ return hash.get_hex();
+}
+
+void path_create_directories(const string& path)
+{
+ boost::filesystem::create_directories(path_dirname(path));
+}
+
+bool path_write_binary(const string& path, const vector<uint8_t>& binary)
+{
+ path_create_directories(path);
+
+ /* write binary file from memory */
+ FILE *f = fopen(path.c_str(), "wb");
+
+ if(!f)
+ return false;
+
+ if(binary.size() > 0)
+ fwrite(&binary[0], sizeof(uint8_t), binary.size(), f);
+
+ fclose(f);
+
+ return true;
+}
+
+bool path_read_binary(const string& path, vector<uint8_t>& binary)
+{
+ binary.resize(boost::filesystem::file_size(path));
+
+ /* read binary file into memory */
+ FILE *f = fopen(path.c_str(), "rb");
+
+ if(!f)
+ return false;
+
+ if(binary.size() == 0) {
+ fclose(f);
+ return false;
+ }
+
+ if(fread(&binary[0], sizeof(uint8_t), binary.size(), f) != binary.size()) {
+ fclose(f);
+ return false;
+ }
+
+ fclose(f);
+
+ return true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_path.h b/intern/cycles/util/util_path.h
new file mode 100644
index 00000000000..4a9d45ec594
--- /dev/null
+++ b/intern/cycles/util/util_path.h
@@ -0,0 +1,52 @@
+/*
+ * 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 __UTIL_PATH_H__
+#define __UTIL_PATH_H__
+
+/* Utility functions to get paths to files distributed with the program. For
+ * the standalone apps, paths are relative to the executable, for dynamically
+ * linked libraries, the path to the library may be set with path_init, which
+ * then makes all paths relative to that. */
+
+#include "util_string.h"
+#include "util_types.h"
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+void path_init(const string& path = "", const string& user_path = "");
+string path_get(const string& sub = "");
+string path_user_get(const string& sub = "");
+
+string path_filename(const string& path);
+string path_dirname(const string& path);
+string path_join(const string& dir, const string& file);
+
+string path_escape(const string& path);
+bool path_exists(const string& path);
+string path_files_md5_hash(const string& dir);
+
+void path_create_directories(const string& path);
+bool path_write_binary(const string& path, const vector<uint8_t>& binary);
+bool path_read_binary(const string& path, vector<uint8_t>& binary);
+
+CCL_NAMESPACE_END
+
+#endif
+
diff --git a/intern/cycles/util/util_progress.h b/intern/cycles/util/util_progress.h
new file mode 100644
index 00000000000..fc2e4af5ead
--- /dev/null
+++ b/intern/cycles/util/util_progress.h
@@ -0,0 +1,174 @@
+/*
+ * 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 __UTIL_PROGRESS_H__
+#define __UTIL_PROGRESS_H__
+
+/* Progress
+ *
+ * Simple class to communicate progress status messages, timing information,
+ * update notifications from a job running in another thread. All methods
+ * except for the constructor/destructor are thread safe. */
+
+#include "util_function.h"
+#include "util_string.h"
+#include "util_thread.h"
+
+CCL_NAMESPACE_BEGIN
+
+class Progress {
+public:
+ Progress()
+ {
+ sample = 0;
+ total_time = 0.0f;
+ sample_time = 0.0f;
+ status = "Initializing";
+ substatus = "";
+ update_cb = NULL;
+ cancel = false;
+ cancel_message = "";
+ cancel_cb = NULL;
+ }
+
+ Progress(Progress& progress)
+ {
+ *this = progress;
+ }
+
+ Progress& operator=(Progress& progress)
+ {
+ thread_scoped_lock lock(progress.progress_mutex);
+
+ progress.get_sample(sample, total_time, sample_time);
+ progress.get_status(status, substatus);
+
+ return *this;
+ }
+
+ /* cancel */
+ void set_cancel(const string& cancel_message_)
+ {
+ thread_scoped_lock lock(progress_mutex);
+ cancel_message = cancel_message_;
+ cancel = true;
+ }
+
+ bool get_cancel()
+ {
+ if(!cancel && cancel_cb)
+ cancel_cb();
+
+ return cancel;
+ }
+
+ string get_cancel_message()
+ {
+ thread_scoped_lock lock(progress_mutex);
+ return cancel_message;
+ }
+
+ void set_cancel_callback(boost::function<void(void)> function)
+ {
+ cancel_cb = function;
+ }
+
+ /* sample and timing information */
+
+ void set_sample(int sample_, double total_time_, double sample_time_)
+ {
+ thread_scoped_lock lock(progress_mutex);
+
+ sample = sample_;
+ total_time = total_time_;
+ sample_time = sample_time_;
+ }
+
+ void get_sample(int& sample_, double& total_time_, double& sample_time_)
+ {
+ thread_scoped_lock lock(progress_mutex);
+
+ sample_ = sample;
+ total_time_ = total_time;
+ sample_time_ = sample_time;
+ }
+
+ /* status messages */
+
+ void set_status(const string& status_, const string& substatus_ = "")
+ {
+ {
+ thread_scoped_lock lock(progress_mutex);
+ status = status_;
+ substatus = substatus_;
+ }
+
+ set_update();
+ }
+
+ void set_substatus(const string& substatus_)
+ {
+ {
+ thread_scoped_lock lock(progress_mutex);
+ substatus = substatus_;
+ }
+
+ set_update();
+ }
+
+ void get_status(string& status_, string& substatus_)
+ {
+ thread_scoped_lock lock(progress_mutex);
+ status_ = status;
+ substatus_ = substatus;
+ }
+
+ /* callback */
+
+ void set_update()
+ {
+ if(update_cb)
+ update_cb();
+ }
+
+ void set_update_callback(boost::function<void(void)> function)
+ {
+ update_cb = function;
+ }
+
+protected:
+ thread_mutex progress_mutex;
+ boost::function<void(void)> update_cb;
+ boost::function<void(void)> cancel_cb;
+
+ int sample;
+
+ double total_time;
+ double sample_time;
+
+ string status;
+ string substatus;
+
+ volatile bool cancel;
+ string cancel_message;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_PROGRESS_H__ */
+
diff --git a/intern/cycles/util/util_set.h b/intern/cycles/util/util_set.h
new file mode 100644
index 00000000000..8904063dd86
--- /dev/null
+++ b/intern/cycles/util/util_set.h
@@ -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.
+ */
+
+#ifndef __UTIL_SET_H__
+#define __UTIL_SET_H__
+
+#include <set>
+#include <boost/tr1/unordered_set.hpp>
+
+CCL_NAMESPACE_BEGIN
+
+using std::set;
+using std::tr1::unordered_set;
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_SET_H__ */
+
diff --git a/intern/cycles/util/util_string.cpp b/intern/cycles/util/util_string.cpp
new file mode 100644
index 00000000000..0dac9a8142a
--- /dev/null
+++ b/intern/cycles/util/util_string.cpp
@@ -0,0 +1,92 @@
+/*
+ * 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 <stdarg.h>
+#include <stdio.h>
+
+#include <boost/algorithm/string.hpp>
+
+#include "util_foreach.h"
+#include "util_string.h"
+
+#ifdef _WIN32
+#ifndef vsnprintf
+#define vsnprintf _vsnprintf
+#endif
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+string string_printf(const char *format, ...)
+{
+ vector<char> str(128, 0);
+
+ while(1) {
+ va_list args;
+ int result;
+
+ va_start(args, format);
+ result = vsnprintf(&str[0], str.size(), format, args);
+ va_end(args);
+
+ if(result == -1) {
+ /* not enough space or formatting error */
+ if(str.size() > 65536) {
+ assert(0);
+ return string("");
+ }
+
+ str.resize(str.size()*2, 0);
+ continue;
+ }
+ else if(result >= (int)str.size()) {
+ /* not enough space */
+ str.resize(result + 1, 0);
+ continue;
+ }
+
+ return string(&str[0]);
+ }
+}
+
+bool string_iequals(const string& a, const string& b)
+{
+ if(a.size() == b.size()) {
+ for(size_t i = 0; i < a.size(); i++)
+ if(toupper(a[i]) != toupper(b[i]))
+ return false;
+
+ return true;
+ }
+
+ return false;
+}
+
+void string_split(vector<string>& tokens, const string& str, const string& separators)
+{
+ vector<string> split;
+
+ boost::split(split, str, boost::is_any_of(separators), boost::token_compress_on);
+
+ foreach(const string& token, split)
+ if(token != "")
+ tokens.push_back(token);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_string.h b/intern/cycles/util/util_string.h
new file mode 100644
index 00000000000..342edd53658
--- /dev/null
+++ b/intern/cycles/util/util_string.h
@@ -0,0 +1,49 @@
+/*
+ * 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 __UTIL_STRING_H__
+#define __UTIL_STRING_H__
+
+#include <string.h>
+#include <string>
+#include <sstream>
+
+#include "util_vector.h"
+
+CCL_NAMESPACE_BEGIN
+
+using std::string;
+using std::stringstream;
+using std::ostringstream;
+using std::istringstream;
+
+#ifdef __GNUC__
+#define PRINTF_ATTRIBUTE __attribute__((format(printf, 1, 2)))
+#else
+#define PRINTF_ATTRIBUTE
+#endif
+
+string string_printf(const char *format, ...) PRINTF_ATTRIBUTE;
+
+bool string_iequals(const string& a, const string& b);
+void string_split(vector<string>& tokens, const string& str, const string& separators = "\t ");
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_STRING_H__ */
+
diff --git a/intern/cycles/util/util_system.cpp b/intern/cycles/util/util_system.cpp
new file mode 100644
index 00000000000..8b09f227a74
--- /dev/null
+++ b/intern/cycles/util/util_system.cpp
@@ -0,0 +1,122 @@
+/*
+ * 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 "util_system.h"
+#include "util_types.h"
+
+#ifdef _WIN32
+#if(!defined(FREE_WINDOWS))
+#include <intrin.h>
+#endif
+#include <windows.h>
+#elif defined(__APPLE__)
+#include <sys/sysctl.h>
+#include <sys/types.h>
+#else
+#include <unistd.h>
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+int system_cpu_thread_count()
+{
+ static uint count = 0;
+
+ if(count > 0)
+ return count;
+
+#ifdef _WIN32
+ SYSTEM_INFO info;
+ GetSystemInfo(&info);
+ count = (uint)info.dwNumberOfProcessors;
+#elif defined(__APPLE__)
+ size_t len = sizeof(count);
+ int mib[2] = { CTL_HW, HW_NCPU };
+
+ sysctl(mib, 2, &count, &len, NULL, 0);
+#else
+ count = (uint)sysconf(_SC_NPROCESSORS_ONLN);
+#endif
+
+ if(count < 1)
+ count = 1;
+
+ return count;
+}
+
+#if !defined(_WIN32) || defined(FREE_WINDOWS)
+static void __cpuid(int data[4], int selector)
+{
+#ifdef __x86_64__
+ asm("cpuid" : "=a" (data[0]), "=b" (data[1]), "=c" (data[2]), "=d" (data[3]) : "a"(selector));
+#else
+#ifdef __i386__
+ asm("pushl %%ebx \n\t"
+ "cpuid \n\t"
+ "movl %%ebx, %1 \n\t"
+ "popl %%ebx \n\t" : "=a" (data[0]), "=r" (data[1]), "=c" (data[2]), "=d" (data[3]) : "a"(selector));
+#else
+ data[0] = data[1] = data[2] = data[3] = 0;
+#endif
+#endif
+}
+#endif
+
+static void replace_string(string& haystack, const string& needle, const string& other)
+{
+ size_t i;
+
+ while((i = haystack.find(needle)) != string::npos)
+ haystack.replace(i, needle.length(), other);
+}
+
+string system_cpu_brand_string()
+{
+ char buf[48];
+ int result[4];
+
+ __cpuid(result, 0x80000000);
+
+ if(result[0] >= (int)0x80000004) {
+ __cpuid((int*)(buf+0), 0x80000002);
+ __cpuid((int*)(buf+16), 0x80000003);
+ __cpuid((int*)(buf+32), 0x80000004);
+
+ string brand = buf;
+
+ /* make it a bit more presentable */
+ replace_string(brand, "(TM)", "");
+ replace_string(brand, "(R)", "");
+
+ size_t i;
+ if((i = brand.find(" ")) != string::npos)
+ brand = brand.substr(0, i);
+
+ return brand;
+ }
+
+ return "Unknown CPU";
+}
+
+int system_cpu_bits()
+{
+ return (sizeof(void*)*8);
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_system.h b/intern/cycles/util/util_system.h
new file mode 100644
index 00000000000..214b3a18ca3
--- /dev/null
+++ b/intern/cycles/util/util_system.h
@@ -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.
+ */
+
+#ifndef __UTIL_SYSTEM_H__
+#define __UTIL_SYSTEM_H__
+
+#include "util_string.h"
+
+CCL_NAMESPACE_BEGIN
+
+int system_cpu_thread_count();
+string system_cpu_brand_string();
+int system_cpu_bits();
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_SYSTEM_H__ */
+
diff --git a/intern/cycles/util/util_thread.h b/intern/cycles/util/util_thread.h
new file mode 100644
index 00000000000..ad95f04b4f9
--- /dev/null
+++ b/intern/cycles/util/util_thread.h
@@ -0,0 +1,212 @@
+/*
+ * 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 __UTIL_THREAD_H__
+#define __UTIL_THREAD_H__
+
+#include <boost/thread.hpp>
+#include <queue>
+
+CCL_NAMESPACE_BEGIN
+
+#if 0
+
+/* Use STL for threading */
+
+using std::thread;
+using std::thread_mutex;
+typedef std::lock_guard thread_scoped_lock;
+using std::condition_variable;
+
+#else
+
+/* Use boost for threading */
+
+using boost::thread;
+typedef boost::mutex thread_mutex;
+typedef boost::mutex::scoped_lock thread_scoped_lock;
+typedef boost::condition_variable thread_condition_variable;
+
+#endif
+
+/* Thread Safe Queue to pass tasks from one thread to another. Tasks should be
+ * pushed into the queue, while the worker thread waits to pop the next task
+ * off the queue. Once all tasks are into the queue, calling stop() will stop
+ * the worker threads from waiting for more tasks once all tasks are done. */
+
+template<typename T> class ThreadQueue
+{
+public:
+ ThreadQueue()
+ {
+ tot = 0;
+ tot_done = 0;
+ do_stop = false;
+ do_cancel = false;
+ }
+
+ /* Main thread functions */
+
+ /* push a task to be executed */
+ void push(const T& value)
+ {
+ thread_scoped_lock lock(queue_mutex);
+ queue.push(value);
+ tot++;
+ lock.unlock();
+
+ queue_cond.notify_one();
+ }
+
+ /* wait until all tasks are done */
+ void wait_done()
+ {
+ thread_scoped_lock lock(done_mutex);
+
+ while(tot_done != tot)
+ done_cond.wait(lock);
+ }
+
+ /* stop all worker threads */
+ void stop()
+ {
+ clear();
+ do_stop = true;
+ queue_cond.notify_all();
+ }
+
+ /* cancel all tasks, but keep worker threads running */
+ void cancel()
+ {
+ clear();
+ do_cancel = true;
+ wait_done();
+ do_cancel = false;
+ }
+
+ /* Worker thread functions
+ *
+ * while(queue.worker_wait_pop(task)) {
+ * for(..) {
+ * ... do work ...
+ *
+ * if(queue.worker_cancel())
+ * break;
+ * }
+ *
+ * queue.worker_done();
+ * }
+ */
+
+ bool worker_wait_pop(T& value)
+ {
+ thread_scoped_lock lock(queue_mutex);
+
+ while(queue.empty() && !do_stop)
+ queue_cond.wait(lock);
+
+ if(queue.empty())
+ return false;
+
+ value = queue.front();
+ queue.pop();
+
+ return true;
+ }
+
+ void worker_done()
+ {
+ thread_scoped_lock lock(done_mutex);
+ tot_done++;
+ lock.unlock();
+
+ assert(tot_done <= tot);
+
+ done_cond.notify_all();
+ }
+
+ bool worker_cancel()
+ {
+ return do_cancel;
+ }
+
+protected:
+ void clear()
+ {
+ thread_scoped_lock lock(queue_mutex);
+
+ while(!queue.empty()) {
+ thread_scoped_lock done_lock(done_mutex);
+ tot_done++;
+ done_lock.unlock();
+
+ queue.pop();
+ }
+
+ done_cond.notify_all();
+ }
+
+ std::queue<T> queue;
+ thread_mutex queue_mutex;
+ thread_mutex done_mutex;
+ thread_condition_variable queue_cond;
+ thread_condition_variable done_cond;
+ volatile bool do_stop;
+ volatile bool do_cancel;
+ volatile int tot, tot_done;
+};
+
+/* Thread Local Storage
+ *
+ * Boost implementation is a bit slow, and Mac OS X __thread is not supported
+ * but the pthreads implementation is optimized, so we use these macros. */
+
+#ifdef __APPLE__
+
+#define tls_ptr(type, name) \
+ pthread_key_t name
+#define tls_set(name, value) \
+ pthread_setspecific(name, value)
+#define tls_get(type, name) \
+ ((type*)pthread_getspecific(name))
+#define tls_create(type, name) \
+ pthread_key_create(&name, NULL)
+#define tls_delete(type, name) \
+ pthread_key_delete(name);
+
+#else
+
+#ifdef __WIN32
+#define __thread __declspec(thread)
+#endif
+
+#define tls_ptr(type, name) \
+ __thread type *name
+#define tls_set(name, value) \
+ name = value
+#define tls_get(type, name) \
+ name
+#define tls_create(type, name)
+#define tls_delete(type, name)
+
+#endif
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_THREAD_H__ */
+
diff --git a/intern/cycles/util/util_time.cpp b/intern/cycles/util/util_time.cpp
new file mode 100644
index 00000000000..5f543fc7f91
--- /dev/null
+++ b/intern/cycles/util/util_time.cpp
@@ -0,0 +1,72 @@
+/*
+ * 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 <stdlib.h>
+
+#include "util_time.h"
+
+#ifdef _WIN32
+
+#include <windows.h>
+
+CCL_NAMESPACE_BEGIN
+
+double time_dt()
+{
+ __int64 frequency, counter;
+
+ QueryPerformanceFrequency((LARGE_INTEGER*)&frequency);
+ QueryPerformanceCounter((LARGE_INTEGER*)&counter);
+
+ return (double)counter/(double)frequency;
+}
+
+void time_sleep(double t)
+{
+ Sleep((int)(t*1000));
+}
+
+CCL_NAMESPACE_END
+
+#else
+
+#include <sys/time.h>
+#include <unistd.h>
+
+CCL_NAMESPACE_BEGIN
+
+double time_dt()
+{
+ struct timeval now;
+ gettimeofday(&now, NULL);
+
+ return now.tv_sec + now.tv_usec*1e-6;
+}
+
+void time_sleep(double t)
+{
+ if(t >= 1.0)
+ sleep((int)t);
+
+ usleep((int)(t*1e6));
+}
+
+CCL_NAMESPACE_END
+
+#endif
+
diff --git a/intern/cycles/util/util_time.h b/intern/cycles/util/util_time.h
new file mode 100644
index 00000000000..33fa8797a69
--- /dev/null
+++ b/intern/cycles/util/util_time.h
@@ -0,0 +1,35 @@
+/*
+ * 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 __UTIL_TIME_H__
+#define __UTIL_TIME_H__
+
+CCL_NAMESPACE_BEGIN
+
+/* Give current time in seconds in double precision, with good accuracy. */
+
+double time_dt();
+
+/* Sleep for the specified number of seconds */
+
+void time_sleep(double t);
+
+CCL_NAMESPACE_END
+
+#endif
+
diff --git a/intern/cycles/util/util_transform.cpp b/intern/cycles/util/util_transform.cpp
new file mode 100644
index 00000000000..8c5eac2cbb9
--- /dev/null
+++ b/intern/cycles/util/util_transform.cpp
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+
+/*
+ * Adapted from code with license:
+ *
+ * Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
+ * Digital Ltd. LLC. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Industrial Light & Magic nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "util_math.h"
+#include "util_transform.h"
+
+CCL_NAMESPACE_BEGIN
+
+static bool transform_matrix4_gj_inverse(float R[][4], float M[][4])
+{
+ /* forward elimination */
+ for(int i = 0; i < 4; i++) {
+ int pivot = i;
+ float pivotsize = M[i][i];
+
+ if(pivotsize < 0)
+ pivotsize = -pivotsize;
+
+ for(int j = i + 1; j < 4; j++) {
+ float tmp = M[j][i];
+
+ if(tmp < 0)
+ tmp = -tmp;
+
+ if(tmp > pivotsize) {
+ pivot = j;
+ pivotsize = tmp;
+ }
+ }
+
+ if(pivotsize == 0)
+ return false;
+
+ if(pivot != i) {
+ for(int j = 0; j < 4; j++) {
+ float tmp;
+
+ tmp = M[i][j];
+ M[i][j] = M[pivot][j];
+ M[pivot][j] = tmp;
+
+ tmp = R[i][j];
+ R[i][j] = R[pivot][j];
+ R[pivot][j] = tmp;
+ }
+ }
+
+ for(int j = i + 1; j < 4; j++) {
+ float f = M[j][i] / M[i][i];
+
+ for(int k = 0; k < 4; k++) {
+ M[j][k] -= f*M[i][k];
+ R[j][k] -= f*R[i][k];
+ }
+ }
+ }
+
+ /* backward substitution */
+ for(int i = 3; i >= 0; --i) {
+ float f;
+
+ if((f = M[i][i]) == 0)
+ return false;
+
+ for(int j = 0; j < 4; j++) {
+ M[i][j] /= f;
+ R[i][j] /= f;
+ }
+
+ for(int j = 0; j < i; j++) {
+ f = M[j][i];
+
+ for(int k = 0; k < 4; k++) {
+ M[j][k] -= f*M[i][k];
+ R[j][k] -= f*R[i][k];
+ }
+ }
+ }
+
+ return true;
+}
+
+Transform transform_inverse(const Transform& tfm)
+{
+ union { Transform T; float M[4][4]; } R, M;
+
+ R.T = transform_identity();
+ M.T = tfm;
+
+ if(!transform_matrix4_gj_inverse(R.M, M.M))
+ return transform_identity();
+
+ return R.T;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h
new file mode 100644
index 00000000000..8f4e2b46616
--- /dev/null
+++ b/intern/cycles/util/util_transform.h
@@ -0,0 +1,251 @@
+/*
+ * 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 __UTIL_TRANSFORM_H__
+#define __UTIL_TRANSFORM_H__
+
+#ifndef __KERNEL_GPU__
+#include <string.h>
+#endif
+
+#include "util_math.h"
+#include "util_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+typedef struct Transform {
+ float4 x, y, z, w; /* rows */
+
+#ifndef __KERNEL_GPU__
+ float4 operator[](int i) const { return *(&x + i); }
+ float4& operator[](int i) { return *(&x + i); }
+#endif
+} Transform;
+
+__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));
+
+ return c/dot(t->w, b);
+}
+
+__device_inline float3 transform_direction(const Transform *t, const float3 a)
+{
+ float4 b = make_float4(a.x, a.y, a.z, 0.0f);
+ float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
+
+ return c;
+}
+
+#ifndef __KERNEL_GPU__
+
+__device_inline void print_transform(const char *label, const Transform& t)
+{
+ print_float4(label, t.x);
+ print_float4(label, t.y);
+ print_float4(label, t.z);
+ print_float4(label, t.w);
+ printf("\n");
+}
+
+__device_inline Transform transform_transpose(const Transform a)
+{
+ Transform t;
+
+ t.x.x = a.x.x; t.x.y = a.y.x; t.x.z = a.z.x; t.x.w = a.w.x;
+ t.y.x = a.x.y; t.y.y = a.y.y; t.y.z = a.z.y; t.y.w = a.w.y;
+ t.z.x = a.x.z; t.z.y = a.y.z; t.z.z = a.z.z; t.z.w = a.w.z;
+ t.w.x = a.x.w; t.w.y = a.y.w; t.w.z = a.z.w; t.w.w = a.w.w;
+
+ return t;
+}
+
+__device_inline Transform operator*(const Transform a, const Transform b)
+{
+ Transform c = transform_transpose(b);
+ Transform t;
+
+ t.x = make_float4(dot(a.x, c.x), dot(a.x, c.y), dot(a.x, c.z), dot(a.x, c.w));
+ t.y = make_float4(dot(a.y, c.x), dot(a.y, c.y), dot(a.y, c.z), dot(a.y, c.w));
+ t.z = make_float4(dot(a.z, c.x), dot(a.z, c.y), dot(a.z, c.z), dot(a.z, c.w));
+ t.w = make_float4(dot(a.w, c.x), dot(a.w, c.y), dot(a.w, c.z), dot(a.w, c.w));
+
+ return t;
+}
+
+__device_inline Transform make_transform(float a, float b, float c, float d,
+ float e, float f, float g, float h,
+ float i, float j, float k, float l,
+ float m, float n, float o, float p)
+{
+ Transform t;
+
+ t.x.x = a; t.x.y = b; t.x.z = c; t.x.w = d;
+ t.y.x = e; t.y.y = f; t.y.z = g; t.y.w = h;
+ t.z.x = i; t.z.y = j; t.z.z = k; t.z.w = l;
+ t.w.x = m; t.w.y = n; t.w.z = o; t.w.w = p;
+
+ return t;
+}
+
+__device_inline Transform transform_translate(float3 t)
+{
+ return make_transform(
+ 1, 0, 0, t.x,
+ 0, 1, 0, t.y,
+ 0, 0, 1, t.z,
+ 0, 0, 0, 1);
+}
+
+__device_inline Transform transform_translate(float x, float y, float z)
+{
+ return transform_translate(make_float3(x, y, z));
+}
+
+__device_inline Transform transform_scale(float3 s)
+{
+ return make_transform(
+ s.x, 0, 0, 0,
+ 0, s.y, 0, 0,
+ 0, 0, s.z, 0,
+ 0, 0, 0, 1);
+}
+
+__device_inline Transform transform_scale(float x, float y, float z)
+{
+ return transform_scale(make_float3(x, y, z));
+}
+
+__device_inline Transform transform_perspective(float fov, float n, float f)
+{
+ Transform persp = make_transform(
+ 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, f / (f - n), -f*n / (f - n),
+ 0, 0, 1, 0);
+
+ float inv_angle = 1.0f/tanf(0.5f*fov);
+
+ Transform scale = transform_scale(inv_angle, inv_angle, 1);
+
+ return scale * persp;
+}
+
+__device_inline Transform transform_rotate(float angle, float3 axis)
+{
+ float s = sinf(angle);
+ float c = cosf(angle);
+ float t = 1.f - c;
+
+ axis = normalize(axis);
+
+ return make_transform(
+ axis.x*axis.x*t + c,
+ axis.x*axis.y*t - s*axis.z,
+ axis.x*axis.z*t + s*axis.y,
+ 0.0f,
+
+ axis.y*axis.x*t + s*axis.z,
+ axis.y*axis.y*t + c,
+ axis.y*axis.z*t - s*axis.x,
+ 0.0f,
+
+ axis.z*axis.x*t - s*axis.y,
+ axis.z*axis.y*t + s*axis.x,
+ axis.z*axis.z*t + c,
+ 0.0f,
+
+ 0.0f, 0.0f, 0.0f, 1.0f);
+}
+
+__device_inline Transform transform_euler(float3 euler)
+{
+ return
+ transform_rotate(euler.x, make_float3(1.0f, 0.0f, 0.0f)) *
+ transform_rotate(euler.y, make_float3(0.0f, 1.0f, 0.0f)) *
+ transform_rotate(euler.z, make_float3(0.0f, 0.0f, 1.0f));
+}
+
+__device_inline Transform transform_orthographic(float znear, float zfar)
+{
+ return transform_scale(1.0f, 1.0f, 1.0f / (zfar-znear)) *
+ transform_translate(0.0f, 0.0f, -znear);
+}
+
+__device_inline Transform transform_identity()
+{
+ return transform_scale(1.0f, 1.0f, 1.0f);
+}
+
+__device_inline bool operator==(const Transform& A, const Transform& B)
+{
+ return memcmp(&A, &B, sizeof(Transform)) == 0;
+}
+
+__device_inline bool operator!=(const Transform& A, const Transform& B)
+{
+ return !(A == B);
+}
+
+__device_inline float3 transform_get_column(const Transform *t, int column)
+{
+ return make_float3(t->x[column], t->y[column], t->z[column]);
+}
+
+Transform transform_inverse(const Transform& a);
+
+__device_inline bool transform_uniform_scale(const Transform& tfm, float& scale)
+{
+ /* the epsilon here is quite arbitrary, but this function is only used for
+ surface area and bump, where we except it to not be so sensitive */
+ Transform ttfm = transform_transpose(tfm);
+ float eps = 1e-7f;
+
+ float sx = len(float4_to_float3(tfm.x));
+ float sy = len(float4_to_float3(tfm.y));
+ float sz = len(float4_to_float3(tfm.z));
+ float stx = len(float4_to_float3(ttfm.x));
+ float sty = len(float4_to_float3(ttfm.y));
+ float stz = len(float4_to_float3(ttfm.z));
+
+ if(fabsf(sx - sy) < eps && fabsf(sx - sz) < eps &&
+ fabsf(sx - stx) < eps && fabsf(sx - sty) < eps &&
+ fabsf(sx - stz) < eps) {
+ scale = sx;
+ return true;
+ }
+
+ return false;
+}
+
+__device_inline bool transform_negative_scale(const Transform& tfm)
+{
+ float3 c0 = transform_get_column(&tfm, 0);
+ float3 c1 = transform_get_column(&tfm, 1);
+ float3 c2 = transform_get_column(&tfm, 2);
+
+ return (dot(cross(c0, c1), c2) < 0.0f);
+}
+
+#endif
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_TRANSFORM_H__ */
+
diff --git a/intern/cycles/util/util_types.h b/intern/cycles/util/util_types.h
new file mode 100644
index 00000000000..2c0ae13ad2a
--- /dev/null
+++ b/intern/cycles/util/util_types.h
@@ -0,0 +1,285 @@
+/*
+ * 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 __UTIL_TYPES_H__
+#define __UTIL_TYPES_H__
+
+#ifndef __KERNEL_OPENCL__
+
+#include <stdlib.h>
+
+#endif
+
+/* Qualifiers for kernel code shared by CPU and GPU */
+
+#ifndef __KERNEL_GPU__
+
+#define __device static inline
+#define __device_noinline static
+#define __global
+#define __local
+#define __shared
+#define __constant
+
+#ifdef __GNUC__
+#define __device_inline static inline __attribute__((always_inline))
+#else
+#define __device_inline static __forceinline
+#endif
+
+#endif
+
+/* SIMD Types */
+
+/* not needed yet, will be for qbvh
+#ifndef __KERNEL_GPU__
+
+#include <emmintrin.h>
+#include <xmmintrin.h>
+
+#endif*/
+
+#ifndef _WIN32
+#ifndef __KERNEL_GPU__
+
+#include <stdint.h>
+
+#endif
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+/* Types
+ *
+ * Define simpler unsigned type names, and integer with defined number of bits.
+ * Also vector types, named to be compatible with OpenCL builtin types, while
+ * working for CUDA and C++ too. */
+
+/* Shorter Unsigned Names */
+
+#ifndef __KERNEL_OPENCL__
+
+typedef unsigned char uchar;
+typedef unsigned int uint;
+
+#endif
+
+#ifndef __KERNEL_GPU__
+
+/* Fixed Bits Types */
+
+#ifdef _WIN32
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+
+typedef signed short int16_t;
+typedef unsigned short uint16_t;
+
+typedef signed int int32_t;
+typedef unsigned int uint32_t;
+
+typedef long long int64_t;
+typedef unsigned long long uint64_t;
+
+#endif
+
+/* Generic Memory Pointer */
+
+typedef uint64_t device_ptr;
+
+/* Vector Types */
+
+struct uchar2 {
+ uchar x, y;
+
+ uchar operator[](int i) const { return *(&x + i); }
+ uchar& operator[](int i) { return *(&x + i); }
+};
+
+struct uchar3 {
+ uchar x, y, z;
+
+ uchar operator[](int i) const { return *(&x + i); }
+ uchar& operator[](int i) { return *(&x + i); }
+};
+
+struct uchar4 {
+ uchar x, y, z, w;
+
+ uchar operator[](int i) const { return *(&x + i); }
+ uchar& operator[](int i) { return *(&x + i); }
+};
+
+struct int2 {
+ int x, y;
+
+ int operator[](int i) const { return *(&x + i); }
+ int& operator[](int i) { return *(&x + i); }
+};
+
+struct int3 {
+ int x, y, z;
+
+ int operator[](int i) const { return *(&x + i); }
+ int& operator[](int i) { return *(&x + i); }
+};
+
+struct int4 {
+ int x, y, z, w;
+
+ int operator[](int i) const { return *(&x + i); }
+ int& operator[](int i) { return *(&x + i); }
+};
+
+struct uint2 {
+ uint x, y;
+
+ uint operator[](int i) const { return *(&x + i); }
+ uint& operator[](int i) { return *(&x + i); }
+};
+
+struct uint3 {
+ uint x, y, z;
+
+ uint operator[](int i) const { return *(&x + i); }
+ uint& operator[](int i) { return *(&x + i); }
+};
+
+struct uint4 {
+ uint x, y, z, w;
+
+ uint operator[](int i) const { return *(&x + i); }
+ uint& operator[](int i) { return *(&x + i); }
+};
+
+struct float2 {
+ float x, y;
+
+ float operator[](int i) const { return *(&x + i); }
+ float& operator[](int i) { return *(&x + i); }
+};
+
+struct float3 {
+ float x, y, z;
+
+#ifdef WITH_OPENCL
+ float w;
+#endif
+
+ float operator[](int i) const { return *(&x + i); }
+ float& operator[](int i) { return *(&x + i); }
+};
+
+struct float4 {
+ float x, y, z, w;
+
+ float operator[](int i) const { return *(&x + i); }
+ float& operator[](int i) { return *(&x + i); }
+};
+
+#endif
+
+#ifndef __KERNEL_GPU__
+
+/* Vector Type Constructors
+ *
+ * OpenCL does not support C++ class, so we use these instead. */
+
+__device uchar2 make_uchar2(uchar x, uchar y)
+{
+ uchar2 a = {x, y};
+ return a;
+}
+
+__device uchar3 make_uchar3(uchar x, uchar y, uchar z)
+{
+ uchar3 a = {x, y, z};
+ return a;
+}
+
+__device uchar4 make_uchar4(uchar x, uchar y, uchar z, uchar w)
+{
+ uchar4 a = {x, y, z, w};
+ return a;
+}
+
+__device int2 make_int2(int x, int y)
+{
+ int2 a = {x, y};
+ return a;
+}
+
+__device int3 make_int3(int x, int y, int z)
+{
+ int3 a = {x, y, z};
+ return a;
+}
+
+__device int4 make_int4(int x, int y, int z, int w)
+{
+ int4 a = {x, y, z, w};
+ return a;
+}
+
+__device uint2 make_uint2(uint x, uint y)
+{
+ uint2 a = {x, y};
+ return a;
+}
+
+__device uint3 make_uint3(uint x, uint y, uint z)
+{
+ uint3 a = {x, y, z};
+ return a;
+}
+
+__device uint4 make_uint4(uint x, uint y, uint z, uint w)
+{
+ uint4 a = {x, y, z, w};
+ return a;
+}
+
+__device float2 make_float2(float x, float y)
+{
+ float2 a = {x, y};
+ return a;
+}
+
+__device float3 make_float3(float x, float y, float z)
+{
+#ifdef WITH_OPENCL
+ float3 a = {x, y, z, 0.0f};
+#else
+ float3 a = {x, y, z};
+#endif
+ return a;
+}
+
+__device float4 make_float4(float x, float y, float z, float w)
+{
+ float4 a = {x, y, z, w};
+ return a;
+}
+
+#endif
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_TYPES_H__ */
+
diff --git a/intern/cycles/util/util_vector.h b/intern/cycles/util/util_vector.h
new file mode 100644
index 00000000000..931ad272612
--- /dev/null
+++ b/intern/cycles/util/util_vector.h
@@ -0,0 +1,138 @@
+/*
+ * 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 __UTIL_VECTOR_H__
+#define __UTIL_VECTOR_H__
+
+/* Vector */
+
+#include <string.h>
+#include <vector>
+
+CCL_NAMESPACE_BEGIN
+
+using std::vector;
+
+/* Array
+ *
+ * Simplified version of vector, serving two purposes:
+ * - somewhat faster in that it does not clear memory on resize/alloc,
+ * this was actually showing up in profiles quite significantly
+ * - if this is used, we are not tempted to use inefficient operations */
+
+template<typename T>
+class array
+{
+public:
+ array()
+ {
+ data = NULL;
+ datasize = 0;
+ }
+
+ array(size_t newsize)
+ {
+ if(newsize == 0) {
+ data = NULL;
+ datasize = 0;
+ }
+ else {
+ data = new T[newsize];
+ datasize = newsize;
+ }
+ }
+
+ array(const array& from)
+ {
+ *this = from;
+ }
+
+ array& operator=(const array& from)
+ {
+ if(from.datasize == 0) {
+ data = NULL;
+ datasize = 0;
+ }
+ else {
+ data = new T[from.datasize];
+ memcpy(data, from.data, from.datasize*sizeof(T));
+ datasize = from.datasize;
+ }
+
+ return *this;
+ }
+
+ array& operator=(const vector<T>& from)
+ {
+ datasize = from.size();
+ data = NULL;
+
+ if(datasize > 0) {
+ data = new T[datasize];
+ memcpy(data, &from[0], datasize*sizeof(T));
+ }
+
+ return *this;
+ }
+
+ ~array()
+ {
+ delete [] data;
+ }
+
+ void resize(size_t newsize)
+ {
+ if(newsize == 0) {
+ clear();
+ }
+ else {
+ T *newdata = new T[newsize];
+ memcpy(newdata, data, ((datasize < newsize)? datasize: newsize)*sizeof(T));
+ delete [] data;
+
+ data = newdata;
+ datasize = newsize;
+ }
+ }
+
+ void clear()
+ {
+ delete [] data;
+ data = NULL;
+ datasize = 0;
+ }
+
+ size_t size() const
+ {
+ return datasize;
+ }
+
+ T& operator[](size_t i) const
+ {
+ return data[i];
+ }
+
+protected:
+ T *data;
+ size_t datasize;
+};
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_VECTOR_H__ */
+
diff --git a/intern/cycles/util/util_view.cpp b/intern/cycles/util/util_view.cpp
new file mode 100644
index 00000000000..0b311b0331a
--- /dev/null
+++ b/intern/cycles/util/util_view.cpp
@@ -0,0 +1,195 @@
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "util_opengl.h"
+#include "util_time.h"
+#include "util_view.h"
+
+#ifdef __APPLE__
+#include <GLUT/glut.h>
+#else
+#include <GL/glut.h>
+#endif
+
+CCL_NAMESPACE_BEGIN
+
+/* structs */
+
+struct View {
+ ViewInitFunc initf;
+ ViewExitFunc exitf;
+ ViewResizeFunc resize;
+ ViewDisplayFunc display;
+ ViewKeyboardFunc keyboard;
+
+ bool first_display;
+ bool redraw;
+
+ int width, height;
+} V;
+
+/* public */
+
+static void view_display_text(int x, int y, const char *text)
+{
+ const char *c;
+
+ glRasterPos3f(x, y, 0);
+
+ for(c=text; *c != '\0'; c++)
+ glutBitmapCharacter(GLUT_BITMAP_HELVETICA_10, *c);
+}
+
+void view_display_info(const char *info)
+{
+ const int height = 20;
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(0.1f, 0.1f, 0.1f, 0.8f);
+ glRectf(0.0f, V.height - height, V.width, V.height);
+ glDisable(GL_BLEND);
+
+ glColor3f(0.5f, 0.5f, 0.5f);
+
+ view_display_text(10, 7 + V.height - height, info);
+
+ glColor3f(1.0f, 1.0f, 1.0f);
+}
+
+static void view_display()
+{
+ if(V.first_display) {
+ if(V.initf) V.initf();
+ if(V.exitf) atexit(V.exitf);
+
+ V.first_display = false;
+ }
+
+ glClearColor(0.05f, 0.05f, 0.05f, 0.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0, V.width, 0, V.height);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glRasterPos3f(0, 0, 0);
+
+ if(V.display)
+ V.display();
+
+ glutSwapBuffers();
+}
+
+static void view_reshape(int width, int height)
+{
+ if(width <= 0 || height <= 0)
+ return;
+
+ V.width = width;
+ V.height = height;
+
+ glViewport(0, 0, width, height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if(V.resize)
+ V.resize(width, height);
+}
+
+static void view_keyboard(unsigned char key, int x, int y)
+{
+ if(V.keyboard)
+ V.keyboard(key);
+
+ if(key == 'm')
+ printf("mouse %d %d\n", x, y);
+ if(key == 'q') {
+ if(V.exitf) V.exitf();
+ exit(0);
+ }
+}
+
+void view_idle()
+{
+ if(V.redraw) {
+ V.redraw = false;
+ glutPostRedisplay();
+ }
+
+ time_sleep(0.1f);
+}
+
+void view_main_loop(const char *title, int width, int height,
+ ViewInitFunc initf, ViewExitFunc exitf,
+ ViewResizeFunc resize, ViewDisplayFunc display,
+ ViewKeyboardFunc keyboard)
+{
+ const char *name = "app";
+ char *argv = (char*)name;
+ int argc = 1;
+
+ memset(&V, 0, sizeof(V));
+ V.width = width;
+ V.height = height;
+ V.first_display = true;
+ V.redraw = false;
+ V.initf = initf;
+ V.exitf = exitf;
+ V.resize = resize;
+ V.display = display;
+ V.keyboard = keyboard;
+
+ glutInit(&argc, &argv);
+ glutInitWindowSize(width, height);
+ glutInitWindowPosition(0, 0);
+ glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
+ glutCreateWindow(title);
+
+#ifndef __APPLE__
+ glewInit();
+#endif
+
+ view_reshape(width, height);
+
+ glutDisplayFunc(view_display);
+ glutIdleFunc(view_idle);
+ glutReshapeFunc(view_reshape);
+ glutKeyboardFunc(view_keyboard);
+
+ glutMainLoop();
+}
+
+void view_redraw()
+{
+ V.redraw = true;
+}
+
+CCL_NAMESPACE_END
+
diff --git a/intern/cycles/util/util_view.h b/intern/cycles/util/util_view.h
new file mode 100644
index 00000000000..c6805b5ce7c
--- /dev/null
+++ b/intern/cycles/util/util_view.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.
+ */
+
+#ifndef __UTIL_VIEW_H__
+#define __UTIL_VIEW_H__
+
+/* Functions to display a simple OpenGL window using GLUT, simplified to the
+ * bare minimum we need to reduce boilerplate code in tests apps. */
+
+CCL_NAMESPACE_BEGIN
+
+typedef void (*ViewInitFunc)(void);
+typedef void (*ViewExitFunc)(void);
+typedef void (*ViewResizeFunc)(int width, int height);
+typedef void (*ViewDisplayFunc)(void);
+typedef void (*ViewKeyboardFunc)(unsigned char key);
+
+void view_main_loop(const char *title, int width, int height,
+ ViewInitFunc initf, ViewExitFunc exitf,
+ ViewResizeFunc resize, ViewDisplayFunc display,
+ ViewKeyboardFunc keyboard);
+
+void view_display_info(const char *info);
+void view_redraw();
+
+CCL_NAMESPACE_END
+
+#endif /*__UTIL_VIEW_H__*/
+
diff --git a/intern/cycles/util/util_xml.h b/intern/cycles/util/util_xml.h
new file mode 100644
index 00000000000..1e6874b7d77
--- /dev/null
+++ b/intern/cycles/util/util_xml.h
@@ -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.
+ */
+
+#ifndef __UTIL_XML_H__
+#define __UTIL_XML_H__
+
+/* PugiXML from OpenImageIO is used for XML parsing. */
+
+#include <OpenImageIO/pugixml.hpp>
+
+CCL_NAMESPACE_BEGIN
+
+OIIO_NAMESPACE_USING
+
+CCL_NAMESPACE_END
+
+#endif /* __UTIL_XML_H__ */
+
diff --git a/intern/decimation/intern/LOD_QSDecimator.cpp b/intern/decimation/intern/LOD_QSDecimator.cpp
index 607a43a156d..381571a41f6 100644
--- a/intern/decimation/intern/LOD_QSDecimator.cpp
+++ b/intern/decimation/intern/LOD_QSDecimator.cpp
@@ -152,8 +152,8 @@ CollapseEdge(
// assign new vertex position
- v0.pos = new_vertex;
- v1.pos = new_vertex;
+ v0.pos = new_vertex;
+ v1.pos = new_vertex;
// sum the quadrics of v0 and v1
q0 = sum;
diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h
index a46a0079f6b..04dc8717637 100644
--- a/intern/ghost/GHOST_ISystem.h
+++ b/intern/ghost/GHOST_ISystem.h
@@ -358,7 +358,7 @@ public:
* @return Returns "unsinged char" from X11 XA_CUT_BUFFER0 buffer
*
*/
- virtual GHOST_TUns8* getClipboard(bool selection) const = 0;
+ virtual GHOST_TUns8* getClipboard(bool selection) const = 0;
/**
* Put data to the Clipboard
diff --git a/intern/ghost/GHOST_ISystemPaths.h b/intern/ghost/GHOST_ISystemPaths.h
index 05795d86cc9..804cba721ff 100644
--- a/intern/ghost/GHOST_ISystemPaths.h
+++ b/intern/ghost/GHOST_ISystemPaths.h
@@ -86,12 +86,12 @@ public:
* Determine the directory of the current binary
* @return Unsigned char string pointing to the binary dir
*/
- virtual const GHOST_TUns8* getBinaryDir() const = 0;
+ virtual const GHOST_TUns8* getBinaryDir() const = 0;
- /**
- * Add the file to the operating system most recently used files
- */
- virtual void addToSystemRecentFiles(const char* filename) const = 0;
+ /**
+ * Add the file to the operating system most recently used files
+ */
+ virtual void addToSystemRecentFiles(const char* filename) const = 0;
private:
/** The one and only system paths*/
diff --git a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp
index 5ef3bbea942..1449da7b096 100644
--- a/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp
+++ b/intern/ghost/intern/GHOST_DisplayManagerCarbon.cpp
@@ -88,7 +88,7 @@ GHOST_TSuccess GHOST_DisplayManagerCarbon::getDisplaySetting(GHOST_TUns8 display
displayModes = ::CGDisplayAvailableModes(d);
//CFIndex numModes = ::CFArrayGetCount(displayModes);/*unused*/
//GHOST_TInt32 numSettings = (GHOST_TInt32)numModes; /*unused*/
- CFDictionaryRef displayModeValues = (CFDictionaryRef)::CFArrayGetValueAtIndex(displayModes, index);
+ CFDictionaryRef displayModeValues = (CFDictionaryRef)::CFArrayGetValueAtIndex(displayModes, index);
setting.xPixels = getValue(displayModeValues, kCGDisplayWidth);
setting.yPixels = getValue(displayModeValues, kCGDisplayHeight);
diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h
index 573ac7dc43d..afd2a8cbae3 100644
--- a/intern/ghost/intern/GHOST_System.h
+++ b/intern/ghost/intern/GHOST_System.h
@@ -276,7 +276,7 @@ public:
* @return Returns the clipboard data
*
*/
- virtual GHOST_TUns8* getClipboard(bool selection) const = 0;
+ virtual GHOST_TUns8* getClipboard(bool selection) const = 0;
/**
* Put data to the Clipboard
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm
index 9dc3dd3f30b..730a7c08151 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -875,24 +875,25 @@ bool GHOST_SystemCocoa::processEvents(bool waitForEvent)
/*do {
GHOST_TimerManager* timerMgr = getTimerManager();
- if (waitForEvent) {
- GHOST_TUns64 next = timerMgr->nextFireTime();
- double timeOut;
-
- if (next == GHOST_kFireTimeNever) {
- timeOut = kEventDurationForever;
- } else {
- timeOut = (double)(next - getMilliSeconds())/1000.0;
- if (timeOut < 0.0)
- timeOut = 0.0;
- }
-
- ::ReceiveNextEvent(0, NULL, timeOut, false, &event);
- }
-
- if (timerMgr->fireTimers(getMilliSeconds())) {
- anyProcessed = true;
- }*/
+ if (waitForEvent) {
+ GHOST_TUns64 next = timerMgr->nextFireTime();
+ double timeOut;
+
+ if (next == GHOST_kFireTimeNever) {
+ timeOut = kEventDurationForever;
+ } else {
+ timeOut = (double)(next - getMilliSeconds())/1000.0;
+ if (timeOut < 0.0)
+ timeOut = 0.0;
+ }
+
+ ::ReceiveNextEvent(0, NULL, timeOut, false, &event);
+ }
+
+ if (timerMgr->fireTimers(getMilliSeconds())) {
+ anyProcessed = true;
+ }
+ */
do {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
diff --git a/intern/ghost/intern/GHOST_SystemPaths.h b/intern/ghost/intern/GHOST_SystemPaths.h
index 4ee01e899d0..739fd4edfaf 100644
--- a/intern/ghost/intern/GHOST_SystemPaths.h
+++ b/intern/ghost/intern/GHOST_SystemPaths.h
@@ -68,12 +68,12 @@ public:
* Determine the directory of the current binary
* @return Unsigned char string pointing to the binary dir
*/
- virtual const GHOST_TUns8* getBinaryDir() const = 0;
+ virtual const GHOST_TUns8* getBinaryDir() const = 0;
- /**
- * Add the file to the operating system most recently used files
- */
- virtual void addToSystemRecentFiles(const char* filename) const = 0;
+ /**
+ * Add the file to the operating system most recently used files
+ */
+ virtual void addToSystemRecentFiles(const char* filename) const = 0;
};
diff --git a/intern/ghost/intern/GHOST_SystemPathsCocoa.h b/intern/ghost/intern/GHOST_SystemPathsCocoa.h
index 14fb65c1282..2b86659c116 100644
--- a/intern/ghost/intern/GHOST_SystemPathsCocoa.h
+++ b/intern/ghost/intern/GHOST_SystemPathsCocoa.h
@@ -70,12 +70,12 @@ public:
* Determine the directory of the current binary
* @return Unsigned char string pointing to the binary dir
*/
- virtual const GHOST_TUns8* getBinaryDir() const;
+ virtual const GHOST_TUns8* getBinaryDir() const;
- /**
- * Add the file to the operating system most recently used files
- */
- void addToSystemRecentFiles(const char* filename) const;
+ /**
+ * Add the file to the operating system most recently used files
+ */
+ void addToSystemRecentFiles(const char* filename) const;
};
#endif // _GHOST_SYSTEM_COCOA_H_
diff --git a/intern/ghost/intern/GHOST_SystemPathsWin32.h b/intern/ghost/intern/GHOST_SystemPathsWin32.h
index 3b7ce6f9910..dd875d4abea 100644
--- a/intern/ghost/intern/GHOST_SystemPathsWin32.h
+++ b/intern/ghost/intern/GHOST_SystemPathsWin32.h
@@ -74,18 +74,18 @@ public:
* If needed, it will create the base directory.
* @return Unsigned char string pointing to user dir (eg ~/).
*/
- const GHOST_TUns8* getUserDir() const;
+ const GHOST_TUns8* getUserDir() const;
- /**
- * Determine the directory of the current binary
- * @return Unsigned char string pointing to the binary dir
- */
- const GHOST_TUns8* getBinaryDir() const;
+ /**
+ * Determine the directory of the current binary
+ * @return Unsigned char string pointing to the binary dir
+ */
+ const GHOST_TUns8* getBinaryDir() const;
- /**
- * Add the file to the operating system most recently used files
- */
- void addToSystemRecentFiles(const char* filename) const;
+ /**
+ * Add the file to the operating system most recently used files
+ */
+ void addToSystemRecentFiles(const char* filename) const;
};
#endif // _GHOST_SYSTEM_PATHS_WIN32_H_
diff --git a/intern/ghost/intern/GHOST_SystemPathsX11.h b/intern/ghost/intern/GHOST_SystemPathsX11.h
index 469f93f5615..a0a1d28a253 100644
--- a/intern/ghost/intern/GHOST_SystemPathsX11.h
+++ b/intern/ghost/intern/GHOST_SystemPathsX11.h
@@ -68,12 +68,12 @@ public:
* Determine the directory of the current binary
* @return Unsigned char string pointing to the binary dir
*/
- const GHOST_TUns8* getBinaryDir() const;
+ const GHOST_TUns8* getBinaryDir() const;
- /**
- * Add the file to the operating system most recently used files
- */
- void addToSystemRecentFiles(const char* filename) const;
+ /**
+ * Add the file to the operating system most recently used files
+ */
+ void addToSystemRecentFiles(const char* filename) const;
};
#endif
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index a5799273fde..2547006ef28 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -304,14 +304,15 @@ static void SleepTillEvent(Display *display, GHOST_TInt64 maxSleep) {
FD_SET(fd, &fds);
if (maxSleep == -1) {
- select(fd + 1, &fds, NULL, NULL, NULL);
- } else {
+ select(fd + 1, &fds, NULL, NULL, NULL);
+ }
+ else {
timeval tv;
tv.tv_sec = maxSleep/1000;
tv.tv_usec = (maxSleep - tv.tv_sec*1000)*1000;
- select(fd + 1, &fds, NULL, NULL, &tv);
+ select(fd + 1, &fds, NULL, NULL, &tv);
}
}
diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h
index d35d91693e2..73d9c95e273 100644
--- a/intern/ghost/intern/GHOST_SystemX11.h
+++ b/intern/ghost/intern/GHOST_SystemX11.h
@@ -218,8 +218,8 @@ public:
/* Helped function for get data from the clipboard. */
void getClipboard_xcout(XEvent evt, Atom sel, Atom target,
- unsigned char **txt, unsigned long *len,
- unsigned int *context) const;
+ unsigned char **txt, unsigned long *len,
+ unsigned int *context) const;
/**
* Returns unsinged char from CUT_BUFFER0
diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp
index cd5eff18be5..a363130c897 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.cpp
+++ b/intern/ghost/intern/GHOST_WindowWin32.cpp
@@ -1046,9 +1046,9 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorGrab(GHOST_TGrabCursorMode mode
/* use to generate a mouse move event, otherwise the last event
* blender gets can be outside the screen causing menus not to show
* properly unless the user moves the mouse */
- GHOST_TInt32 pos[2];
- m_system->getCursorPosition(pos[0], pos[1]);
- m_system->setCursorPosition(pos[0], pos[1]);
+ GHOST_TInt32 pos[2];
+ m_system->getCursorPosition(pos[0], pos[1]);
+ m_system->setCursorPosition(pos[0], pos[1]);
}
/* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
diff --git a/intern/ghost/test/gears/GHOST_Test.cpp b/intern/ghost/test/gears/GHOST_Test.cpp
index 23a82cb9fbd..1822f3539bd 100644
--- a/intern/ghost/test/gears/GHOST_Test.cpp
+++ b/intern/ghost/test/gears/GHOST_Test.cpp
@@ -689,7 +689,7 @@ int main(int /*argc*/, char** /*argv*/)
//DWORD keyValue;
// lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable");
lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable",
- KEY_ALL_ACCESS );
+ KEY_ALL_ACCESS);
if(lresult == ERROR_SUCCESS)
printf("Succesfully opened key\n");
diff --git a/intern/memutil/MEM_CacheLimiter.h b/intern/memutil/MEM_CacheLimiter.h
index 5194c97fd78..fc12f22cfe6 100644
--- a/intern/memutil/MEM_CacheLimiter.h
+++ b/intern/memutil/MEM_CacheLimiter.h
@@ -115,7 +115,7 @@ private:
T * data;
int refcount;
- typename std::list<MEM_CacheLimiterHandle<T> *,
+ typename std::list<MEM_CacheLimiterHandle<T> *,
MEM_Allocator<MEM_CacheLimiterHandle<T> *> >::iterator me;
MEM_CacheLimiter<T> * parent;
};
@@ -160,7 +160,8 @@ public:
}
for (iterator it = queue.begin();
- it != queue.end() && mem_in_use > max;) {
+ it != queue.end() && mem_in_use > max;)
+ {
iterator jt = it;
++it;
diff --git a/release/datafiles/fonts/droidsans.ttf.gz b/release/datafiles/fonts/droidsans.ttf.gz
index a00f35f3a66..1701612d313 100644
--- a/release/datafiles/fonts/droidsans.ttf.gz
+++ b/release/datafiles/fonts/droidsans.ttf.gz
Binary files differ
diff --git a/release/plugins/sequence/dnr.c b/release/plugins/sequence/dnr.c
index 606ec19ef41..74b3a06ccbb 100644
--- a/release/plugins/sequence/dnr.c
+++ b/release/plugins/sequence/dnr.c
@@ -42,7 +42,7 @@ struct my_data {
};
void plugin_seq_doit(Cast *, float, float, int, int,
- ImBuf *, ImBuf *, ImBuf *, ImBuf *);
+ ImBuf *, ImBuf *, ImBuf *, ImBuf *);
int plugin_seq_getversion(void) { return B_PLUGIN_VERSION;}
diff --git a/release/plugins/sequence/gamma.c b/release/plugins/sequence/gamma.c
index 7ce86fff347..1560c5805df 100644
--- a/release/plugins/sequence/gamma.c
+++ b/release/plugins/sequence/gamma.c
@@ -117,13 +117,13 @@ void plugin_seq_doit(Cast *cast, float facf0, float facf1, int width,
src1= (unsigned char *) ibuf1->rect;
make_gamma_table(cast->setup_m, cast->gain_m, cast->gamma_m,
- gamma_table_m);
+ gamma_table_m);
make_gamma_table(cast->setup_r, cast->gain_r, cast->gamma_r,
- gamma_table_r);
+ gamma_table_r);
make_gamma_table(cast->setup_g, cast->gain_g, cast->gamma_g,
- gamma_table_g);
+ gamma_table_g);
make_gamma_table(cast->setup_b, cast->gain_b, cast->gamma_b,
- gamma_table_b);
+ gamma_table_b);
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++) {
diff --git a/release/scripts/presets/cycles/integrator/direct_light.py b/release/scripts/presets/cycles/integrator/direct_light.py
new file mode 100644
index 00000000000..504068722d7
--- /dev/null
+++ b/release/scripts/presets/cycles/integrator/direct_light.py
@@ -0,0 +1,11 @@
+import bpy
+cycles = bpy.context.scene.cycles
+
+cycles.max_bounces = 8
+cycles.min_bounces = 8
+cycles.no_caustics = True
+cycles.diffuse_bounces = 0
+cycles.glossy_bounces = 1
+cycles.transmission_bounces = 2
+cycles.transparent_min_bounces = 8
+cycles.transparent_max_bounces = 8
diff --git a/release/scripts/presets/cycles/integrator/full_global_illumination.py b/release/scripts/presets/cycles/integrator/full_global_illumination.py
new file mode 100644
index 00000000000..8687f169b8a
--- /dev/null
+++ b/release/scripts/presets/cycles/integrator/full_global_illumination.py
@@ -0,0 +1,11 @@
+import bpy
+cycles = bpy.context.scene.cycles
+
+cycles.max_bounces = 128
+cycles.min_bounces = 3
+cycles.no_caustics = False
+cycles.diffuse_bounces = 128
+cycles.glossy_bounces = 128
+cycles.transmission_bounces = 128
+cycles.transparent_min_bounces = 8
+cycles.transparent_max_bounces = 128
diff --git a/release/scripts/presets/cycles/integrator/limited_global_illumination.py b/release/scripts/presets/cycles/integrator/limited_global_illumination.py
new file mode 100644
index 00000000000..f2a7e1f7b7a
--- /dev/null
+++ b/release/scripts/presets/cycles/integrator/limited_global_illumination.py
@@ -0,0 +1,11 @@
+import bpy
+cycles = bpy.context.scene.cycles
+
+cycles.max_bounces = 8
+cycles.min_bounces = 3
+cycles.no_caustics = True
+cycles.diffuse_bounces = 1
+cycles.glossy_bounces = 4
+cycles.transmission_bounces = 8
+cycles.transparent_min_bounces = 8
+cycles.transparent_max_bounces = 8
diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py
index 056b3478c2b..5b28cdf44ae 100644
--- a/release/scripts/startup/bl_operators/add_mesh_torus.py
+++ b/release/scripts/startup/bl_operators/add_mesh_torus.py
@@ -86,7 +86,7 @@ class AddTorus(Operator):
'''Add a torus mesh'''
bl_idname = "mesh.primitive_torus_add"
bl_label = "Add Torus"
- bl_options = {'REGISTER', 'UNDO'}
+ bl_options = {'REGISTER', 'UNDO', 'PRESET'}
major_radius = FloatProperty(
name="Major Radius",
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index ac19bab4c66..dca96b302fb 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -395,9 +395,8 @@ class AddPresetOperator(AddPresetBase, Operator):
options={'HIDDEN'},
)
- # XXX, not ideal
preset_defines = [
- "op = bpy.context.space_data.operator",
+ "op = bpy.context.active_operator",
]
@property
@@ -432,7 +431,7 @@ class WM_MT_operator_presets(Menu):
bl_label = "Operator Presets"
def draw(self, context):
- self.operator = context.space_data.operator.bl_idname
+ self.operator = context.active_operator.bl_idname
Menu.draw_preset(self, context)
@property
diff --git a/release/scripts/startup/bl_operators/uvcalc_follow_active.py b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
index 324414b8bcb..919677fff8b 100644
--- a/release/scripts/startup/bl_operators/uvcalc_follow_active.py
+++ b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
@@ -233,10 +233,13 @@ class FollowActiveQuads(Operator):
bl_label = "Follow Active Quads"
bl_options = {'REGISTER', 'UNDO'}
- mode = bpy.props.EnumProperty(items=(("EVEN", "Even", "Space all UVs evently"), ("LENGTH", "Length", "Average space UVs edge length of each loop")),
- name="Edge Length Mode",
- description="Method to space UV edge loops",
- default="LENGTH")
+ mode = bpy.props.EnumProperty(
+ name="Edge Length Mode",
+ description="Method to space UV edge loops",
+ items=(('EVEN', "Even", "Space all UVs evently"),
+ ('LENGTH', "Length", "Average space UVs edge length of each loop")),
+ default='LENGTH',
+ )
@classmethod
def poll(cls, context):
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
index 52548817620..ae4add72a08 100644
--- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -552,9 +552,9 @@ class LightMapPack(Operator):
PREF_CONTEXT = bpy.props.EnumProperty(
name="Selection",
- items=(("SEL_FACES", "Selected Faces", "Space all UVs evently"),
- ("ALL_FACES", "All Faces", "Average space UVs edge length of each loop"),
- ("ALL_OBJECTS", "Selected Mesh Object", "Average space UVs edge length of each loop")
+ items=(('SEL_FACES', "Selected Faces", "Space all UVs evently"),
+ ('ALL_FACES', "All Faces", "Average space UVs edge length of each loop"),
+ ('ALL_OBJECTS', "Selected Mesh Object", "Average space UVs edge length of each loop")
),
)
diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py
index 48aefa93a5c..3db768f73fe 100644
--- a/release/scripts/startup/bl_ui/__init__.py
+++ b/release/scripts/startup/bl_ui/__init__.py
@@ -44,6 +44,7 @@ _modules = (
"properties_particle",
"properties_physics_cloth",
"properties_physics_common",
+ "properties_physics_dynamicpaint",
"properties_physics_field",
"properties_physics_fluid",
"properties_physics_smoke",
diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py
index 5dadcba2621..d1bc0694a89 100644
--- a/release/scripts/startup/bl_ui/properties_data_armature.py
+++ b/release/scripts/startup/bl_ui/properties_data_armature.py
@@ -71,7 +71,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel):
flow.prop(arm, "use_deform_envelopes", text="Envelopes")
flow.prop(arm, "use_deform_preserve_volume", text="Quaternion")
- if context.scene.render.engine == "BLENDER_GAME":
+ if context.scene.render.engine == 'BLENDER_GAME':
layout.row().prop(arm, "deform_method", expand=True)
@@ -289,7 +289,7 @@ class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, Panel):
row.prop(itasc, "damping_max", text="Damp", slider=True)
row.prop(itasc, "damping_epsilon", text="Eps", slider=True)
-from bl_ui.properties_animviz import (
+from .properties_animviz import (
MotionPathButtonsPanel,
OnionSkinButtonsPanel,
)
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index 1a0fb0ef4ac..1d7559b2ceb 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -18,7 +18,7 @@
# <pep8 compliant>
import bpy
-from bpy.types import Panel
+from bpy.types import Panel, Menu
from rna_prop_ui import PropertyPanel
@@ -33,12 +33,12 @@ class CameraButtonsPanel():
return context.camera and (engine in cls.COMPAT_ENGINES)
-class CAMERA_MT_presets(bpy.types.Menu):
+class CAMERA_MT_presets(Menu):
bl_label = "Camera Presets"
preset_subdir = "camera"
preset_operator = "script.execute_preset"
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
- draw = bpy.types.Menu.draw_preset
+ draw = Menu.draw_preset
class DATA_PT_context_camera(CameraButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index e4b152834fc..e1b08d1ff8e 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -230,6 +230,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
row.prop(md, "mid_level")
row.prop(md, "strength")
+ def DYNAMIC_PAINT(self, layout, ob, md):
+ layout.label(text="Settings can be found inside the Physics context")
+
def EDGE_SPLIT(self, layout, ob, md):
split = layout.split()
diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py
index a1b86b51f5f..853c11c96c6 100644
--- a/release/scripts/startup/bl_ui/properties_data_speaker.py
+++ b/release/scripts/startup/bl_ui/properties_data_speaker.py
@@ -18,6 +18,7 @@
# <pep8 compliant>
import bpy
+from bpy.types import Panel
from rna_prop_ui import PropertyPanel
@@ -32,7 +33,7 @@ class DataButtonsPanel():
return context.speaker and (engine in cls.COMPAT_ENGINES)
-class DATA_PT_context_speaker(DataButtonsPanel, bpy.types.Panel):
+class DATA_PT_context_speaker(DataButtonsPanel, Panel):
bl_label = ""
bl_options = {'HIDE_HEADER'}
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
@@ -52,7 +53,7 @@ class DATA_PT_context_speaker(DataButtonsPanel, bpy.types.Panel):
split.template_ID(space, "pin_id")
-class DATA_PT_speaker(DataButtonsPanel, bpy.types.Panel):
+class DATA_PT_speaker(DataButtonsPanel, Panel):
bl_label = "Sound"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -71,7 +72,7 @@ class DATA_PT_speaker(DataButtonsPanel, bpy.types.Panel):
row.prop(speaker, "pitch")
-class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel):
+class DATA_PT_distance(DataButtonsPanel, Panel):
bl_label = "Distance"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -94,7 +95,7 @@ class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel):
col.prop(speaker, "distance_reference", text="Reference")
-class DATA_PT_cone(DataButtonsPanel, bpy.types.Panel):
+class DATA_PT_cone(DataButtonsPanel, Panel):
bl_label = "Cone"
COMPAT_ENGINES = {'BLENDER_RENDER'}
@@ -116,7 +117,7 @@ class DATA_PT_cone(DataButtonsPanel, bpy.types.Panel):
col.prop(speaker, "cone_volume_outer", text="Outer")
-class DATA_PT_custom_props_speaker(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
+class DATA_PT_custom_props_speaker(DataButtonsPanel, PropertyPanel, Panel):
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
_context_path = "object.data"
_property_type = bpy.types.Speaker
diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index ba9bb4a624d..877b6c0893d 100644
--- a/release/scripts/startup/bl_ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -406,7 +406,7 @@ class SceneButtonsPanel():
bl_context = "scene"
-class SCENE_PT_game_navmesh(SceneButtonsPanel, bpy.types.Panel):
+class SCENE_PT_game_navmesh(SceneButtonsPanel, Panel):
bl_label = "Navigation mesh"
bl_default_closed = True
COMPAT_ENGINES = {'BLENDER_GAME'}
diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py
index f5a95016baa..6e66bd0d98b 100644
--- a/release/scripts/startup/bl_ui/properties_material.py
+++ b/release/scripts/startup/bl_ui/properties_material.py
@@ -612,7 +612,7 @@ class MATERIAL_PT_flare(MaterialButtonsPanel, Panel):
col.prop(halo, "flare_subflare_size", text="Subsize")
-class MATERIAL_PT_game_settings(MaterialButtonsPanel, bpy.types.Panel):
+class MATERIAL_PT_game_settings(MaterialButtonsPanel, Panel):
bl_label = "Game Settings"
COMPAT_ENGINES = {'BLENDER_GAME'}
@@ -637,7 +637,7 @@ class MATERIAL_PT_game_settings(MaterialButtonsPanel, bpy.types.Panel):
row.prop(game, "face_orientation", text="")
-class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel):
+class MATERIAL_PT_physics(MaterialButtonsPanel, Panel):
bl_label = "Physics"
COMPAT_ENGINES = {'BLENDER_GAME'}
diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index 36b8129ad8a..27b6aa721a4 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -280,7 +280,7 @@ class OBJECT_PT_relations_extras(ObjectButtonsPanel, Panel):
row.prop(ob, "slow_parent_offset", text="Offset")
-from bl_ui.properties_animviz import (
+from .properties_animviz import (
MotionPathButtonsPanel,
OnionSkinButtonsPanel,
)
diff --git a/release/scripts/startup/bl_ui/properties_object_constraint.py b/release/scripts/startup/bl_ui/properties_object_constraint.py
index c493124c5bb..508818b62dc 100644
--- a/release/scripts/startup/bl_ui/properties_object_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_object_constraint.py
@@ -131,7 +131,7 @@ class ConstraintButtonsPanel():
self.space_template(layout, con)
def IK(self, context, layout, con):
- if context.object.pose.ik_solver == "ITASC":
+ if context.object.pose.ik_solver == 'ITASC':
layout.prop(con, "ik_type")
getattr(self, 'IK_' + con.ik_type)(context, layout, con)
else:
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index c6d96171c38..a541f43be66 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -21,7 +21,7 @@ import bpy
from bpy.types import Panel
from rna_prop_ui import PropertyPanel
-from bl_ui.properties_physics_common import (
+from .properties_physics_common import (
point_cache_ui,
effector_weights_ui,
basic_force_field_settings_ui,
diff --git a/release/scripts/startup/bl_ui/properties_physics_cloth.py b/release/scripts/startup/bl_ui/properties_physics_cloth.py
index afb3c000980..32b94504525 100644
--- a/release/scripts/startup/bl_ui/properties_physics_cloth.py
+++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py
@@ -20,7 +20,7 @@
import bpy
from bpy.types import Menu, Panel
-from bl_ui.properties_physics_common import (
+from .properties_physics_common import (
point_cache_ui,
effector_weights_ui,
)
@@ -60,61 +60,59 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, Panel):
md = context.cloth
ob = context.object
+ cloth = md.settings
- if md:
- cloth = md.settings
-
- split = layout.split()
+ split = layout.split()
- split.active = cloth_panel_enabled(md)
+ split.active = cloth_panel_enabled(md)
- col = split.column()
+ col = split.column()
- col.label(text="Presets:")
- sub = col.row(align=True)
- sub.menu("CLOTH_MT_presets", text=bpy.types.CLOTH_MT_presets.bl_label)
- sub.operator("cloth.preset_add", text="", icon='ZOOMIN')
- sub.operator("cloth.preset_add", text="", icon='ZOOMOUT').remove_active = True
+ col.label(text="Presets:")
+ sub = col.row(align=True)
+ sub.menu("CLOTH_MT_presets", text=bpy.types.CLOTH_MT_presets.bl_label)
+ sub.operator("cloth.preset_add", text="", icon='ZOOMIN')
+ sub.operator("cloth.preset_add", text="", icon='ZOOMOUT').remove_active = True
- col.label(text="Quality:")
- col.prop(cloth, "quality", text="Steps", slider=True)
+ col.label(text="Quality:")
+ col.prop(cloth, "quality", text="Steps", slider=True)
- col.label(text="Material:")
- col.prop(cloth, "mass")
- col.prop(cloth, "structural_stiffness", text="Structural")
- col.prop(cloth, "bending_stiffness", text="Bending")
+ col.label(text="Material:")
+ col.prop(cloth, "mass")
+ col.prop(cloth, "structural_stiffness", text="Structural")
+ col.prop(cloth, "bending_stiffness", text="Bending")
- col = split.column()
+ col = split.column()
- col.label(text="Damping:")
- col.prop(cloth, "spring_damping", text="Spring")
- col.prop(cloth, "air_damping", text="Air")
+ col.label(text="Damping:")
+ col.prop(cloth, "spring_damping", text="Spring")
+ col.prop(cloth, "air_damping", text="Air")
- col.prop(cloth, "use_pin_cloth", text="Pinning")
- sub = col.column()
- sub.active = cloth.use_pin_cloth
- sub.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="")
- sub.prop(cloth, "pin_stiffness", text="Stiffness")
+ col.prop(cloth, "use_pin_cloth", text="Pinning")
+ sub = col.column()
+ sub.active = cloth.use_pin_cloth
+ sub.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="")
+ sub.prop(cloth, "pin_stiffness", text="Stiffness")
- col.label(text="Pre roll:")
- col.prop(cloth, "pre_roll", text="Frame")
+ col.label(text="Pre roll:")
+ col.prop(cloth, "pre_roll", text="Frame")
- # Disabled for now
- """
- if cloth.vertex_group_mass:
- layout.label(text="Goal:")
+ # Disabled for now
+ """
+ if cloth.vertex_group_mass:
+ layout.label(text="Goal:")
- col = layout.column_flow()
- col.prop(cloth, "goal_default", text="Default")
- col.prop(cloth, "goal_spring", text="Stiffness")
- col.prop(cloth, "goal_friction", text="Friction")
- """
+ col = layout.column_flow()
+ col.prop(cloth, "goal_default", text="Default")
+ col.prop(cloth, "goal_spring", text="Stiffness")
+ col.prop(cloth, "goal_friction", text="Friction")
+ """
- key = ob.data.shape_keys
+ key = ob.data.shape_keys
- if key:
- col.label(text="Rest Shape Key:")
- col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
+ if key:
+ col.label(text="Rest Shape Key:")
+ col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py
index 64dad98d99a..f623d9a37eb 100644
--- a/release/scripts/startup/bl_ui/properties_physics_common.py
+++ b/release/scripts/startup/bl_ui/properties_physics_common.py
@@ -65,6 +65,7 @@ class PHYSICS_PT_add(PhysicButtonsPanel, Panel):
if(ob.type == 'MESH'):
physics_add(self, col, context.collision, "Collision", 'COLLISION', 'MOD_PHYSICS', False)
physics_add(self, col, context.cloth, "Cloth", 'CLOTH', 'MOD_CLOTH', True)
+ physics_add(self, col, context.dynamic_paint, "Dynamic Paint", 'DYNAMIC_PAINT', 'MOD_DYNAMICPAINT', True)
col = split.column()
@@ -106,7 +107,7 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
layout.label(text=cache.info)
else:
- if cachetype == 'SMOKE':
+ if cachetype in {'SMOKE', 'DYNAMIC_PAINT'}:
if not bpy.data.is_saved:
layout.label(text="Cache is disabled until the file is saved")
layout.enabled = False
@@ -118,17 +119,17 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
row = layout.row(align=True)
- if cachetype != 'PSYS':
+ if cachetype not in {'PSYS', 'DYNAMIC_PAINT'}:
row.enabled = enabled
row.prop(cache, "frame_start")
row.prop(cache, "frame_end")
- if cachetype not in {'SMOKE', 'CLOTH'}:
+ if cachetype not in {'SMOKE', 'CLOTH', 'DYNAMIC_PAINT'}:
row.prop(cache, "frame_step")
row.prop(cache, "use_quick_cache")
if cachetype != 'SMOKE':
layout.label(text=cache.info)
- if cachetype != 'SMOKE':
+ if cachetype not in {'SMOKE', 'DYNAMIC_PAINT'}:
split = layout.split()
split.enabled = enabled and bpy.data.is_saved
diff --git a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
new file mode 100644
index 00000000000..a934e103c35
--- /dev/null
+++ b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
@@ -0,0 +1,498 @@
+# ##### 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 #####
+
+# <pep8 compliant>
+
+import bpy
+from bpy.types import Panel
+
+from .properties_physics_common import (
+ point_cache_ui,
+ effector_weights_ui,
+ )
+
+
+class PhysicButtonsPanel():
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = "physics"
+
+ @classmethod
+ def poll(cls, context):
+ ob = context.object
+ rd = context.scene.render
+ return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and context.dynamic_paint
+
+
+class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint"
+
+ def draw(self, context):
+ layout = self.layout
+
+ md = context.dynamic_paint
+ ob = context.object
+
+ layout.prop(md, "ui_type", expand=True)
+
+ if md.ui_type == 'CANVAS':
+ canvas = md.canvas_settings
+
+ if canvas is None:
+ layout.operator("dpaint.type_toggle", text="Add Canvas").type = 'CANVAS'
+ else:
+ layout.operator("dpaint.type_toggle", text="Remove Canvas", icon='X').type = 'CANVAS'
+
+ surface = canvas.canvas_surfaces.active
+
+ row = layout.row()
+ row.template_list(canvas, "canvas_surfaces", canvas.canvas_surfaces, "active_index", rows=2)
+
+ col = row.column(align=True)
+ col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="")
+ col.operator("dpaint.surface_slot_remove", icon='ZOOMOUT', text="")
+
+ if surface:
+ layout.prop(surface, "name")
+ layout.prop(surface, "surface_format")
+
+ col = layout.column()
+ if surface.surface_format != 'VERTEX':
+ col.label(text="Quality:")
+ col.prop(surface, "image_resolution")
+ col.prop(surface, "use_antialiasing")
+
+ col = layout.column()
+ col.label(text="Frames:")
+ split = col.split()
+
+ col = split.column(align=True)
+ col.prop(surface, "frame_start", text="Start")
+ col.prop(surface, "frame_end", text="End")
+
+ split.prop(surface, "frame_substeps")
+
+ elif md.ui_type == 'BRUSH':
+ brush = md.brush_settings
+ engine = context.scene.render.engine
+
+ if brush is None:
+ layout.operator("dpaint.type_toggle", text="Add Brush").type = 'BRUSH'
+ else:
+ layout.operator("dpaint.type_toggle", text="Remove Brush", icon='X').type = 'BRUSH'
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(brush, "absolute_alpha")
+ col.prop(brush, "paint_erase")
+ col.prop(brush, "paint_wetness", text="Wetness")
+
+ col = split.column()
+ if engine == 'BLENDER_RENDER':
+ sub = col.column()
+ sub.active = (brush.paint_source != 'PARTICLE_SYSTEM')
+ sub.prop(brush, "use_material")
+ if brush.use_material and brush.paint_source != 'PARTICLE_SYSTEM' and engine == 'BLENDER_RENDER':
+ col.prop(brush, "material", text="")
+ col.prop(brush, "paint_alpha", text="Alpha Factor")
+ else:
+ col.prop(brush, "paint_color", text="")
+ col.prop(brush, "paint_alpha", text="Alpha")
+
+
+class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Advanced"
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ return md and md.ui_type == 'CANVAS' and md.canvas_settings and md.canvas_settings.canvas_surfaces.active
+
+ def draw(self, context):
+ layout = self.layout
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ ob = context.object
+
+ surface_type = surface.surface_type
+
+ layout.prop(surface, "surface_type")
+ layout.separator()
+
+ # dissolve
+ if surface_type == 'PAINT':
+ split = layout.split(percentage=0.35)
+ split.label(text="Wetmap drying:")
+
+ col = split.column()
+ split = col.split(percentage=0.7)
+ split.prop(surface, "dry_speed", text="Time")
+ split.prop(surface, "use_dry_log", text="Slow")
+
+ if surface_type != 'WAVE':
+ split = layout.split(percentage=0.35)
+ col = split.column()
+ if surface_type == 'WEIGHT':
+ col.prop(surface, "use_dissolve", text="Fade:")
+ else:
+ col.prop(surface, "use_dissolve", text="Dissolve:")
+ col = split.column()
+ col.active = surface.use_dissolve
+ split = col.split(percentage=0.7)
+ split.prop(surface, "dissolve_speed", text="Time")
+ split.prop(surface, "use_dissolve_log", text="Slow")
+
+ # per type settings
+ if surface_type == 'DISPLACE':
+ layout.prop(surface, "use_incremental_displace")
+ if surface.surface_format == 'VERTEX':
+ row = layout.row()
+ row.prop(surface, "depth_clamp")
+ row.prop(surface, "displace_factor")
+
+ elif surface_type == 'WAVE':
+ layout.prop(surface, "wave_open_borders")
+
+ split = layout.split()
+
+ col = split.column(align=True)
+ col.prop(surface, "wave_timescale")
+ col.prop(surface, "wave_speed")
+
+ col = split.column(align=True)
+ col.prop(surface, "wave_damping")
+ col.prop(surface, "wave_spring")
+
+ layout.separator()
+ layout.prop(surface, "brush_group", text="Brush Group")
+
+
+class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Output"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
+ return 0
+ surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
+ return surface and not (surface.surface_format == 'VERTEX' and (surface.surface_type in {'DISPLACE', 'WAVE'}))
+
+ def draw(self, context):
+ layout = self.layout
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ ob = context.object
+
+ surface_type = surface.surface_type
+
+ # vertex format outputs
+ if surface.surface_format == 'VERTEX':
+ if surface_type == 'PAINT':
+ # toggle active preview
+ layout.prop(surface, "preview_id")
+
+ # paintmap output
+ row = layout.row()
+ row.prop_search(surface, "output_name", ob.data, "vertex_colors", text="Paintmap layer: ")
+ if surface.output_exists(object=ob, index=0):
+ ic = 'ZOOMOUT'
+ else:
+ ic = 'ZOOMIN'
+
+ row.operator("dpaint.output_toggle", icon=ic, text="").index = 0
+
+ # wetmap output
+ row = layout.row()
+ row.prop_search(surface, "output_name2", ob.data, "vertex_colors", text="Wetmap layer: ")
+ if surface.output_exists(object=ob, index=1):
+ ic = 'ZOOMOUT'
+ else:
+ ic = 'ZOOMIN'
+
+ row.operator("dpaint.output_toggle", icon=ic, text="").index = 1
+
+ elif surface_type == 'WEIGHT':
+ row = layout.row()
+ row.prop_search(surface, "output_name", ob, "vertex_groups", text="Vertex Group: ")
+ if surface.output_exists(object=ob, index=0):
+ ic = 'ZOOMOUT'
+ else:
+ ic = 'ZOOMIN'
+
+ row.operator("dpaint.output_toggle", icon=ic, text="").index = 0
+
+ # image format outputs
+ if surface.surface_format == 'IMAGE':
+ layout.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
+ layout.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="UV layer:")
+ layout.separator()
+
+ layout.prop(surface, "image_output_path", text="")
+ row = layout.row()
+ row.prop(surface, "image_fileformat", text="")
+ row.prop(surface, "premultiply", text="Premultiply alpha")
+
+ if surface_type == 'PAINT':
+ split = layout.split(percentage=0.4)
+ split.prop(surface, "do_output1", text="Paintmaps:")
+ sub = split.row()
+ sub.active = surface.do_output1
+ sub.prop(surface, "output_name", text="")
+
+ split = layout.split(percentage=0.4)
+ split.prop(surface, "do_output2", text="Wetmaps:")
+ sub = split.row()
+ sub.active = surface.do_output2
+ sub.prop(surface, "output_name2", text="")
+ else:
+ col = layout.column()
+ col.prop(surface, "output_name", text="Filename: ")
+ if surface_type == 'DISPLACE':
+ col.prop(surface, "displace_type", text="Displace Type")
+ col.prop(surface, "depth_clamp")
+ elif surface_type == 'WAVE':
+ col.prop(surface, "depth_clamp", text="Wave Clamp")
+
+
+class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Initial Color"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
+ return 0
+ surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
+ return (surface and surface.surface_type == 'PAINT')
+
+ def draw(self, context):
+ layout = self.layout
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+ ob = context.object
+
+ layout.prop(surface, "init_color_type", expand=False)
+ layout.separator()
+
+ # dissolve
+ if surface.init_color_type == 'COLOR':
+ layout.prop(surface, "init_color")
+
+ elif surface.init_color_type == 'TEXTURE':
+ layout.prop(surface, "init_texture")
+ layout.prop_search(surface, "init_layername", ob.data, "uv_textures", text="UV Layer:")
+
+ elif surface.init_color_type == 'VERTEX_COLOR':
+ layout.prop_search(surface, "init_layername", ob.data, "vertex_colors", text="Color Layer: ")
+
+
+class PHYSICS_PT_dp_effects(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Effects"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
+ return False
+ surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
+ return (surface and surface.surface_type == 'PAINT')
+
+ def draw(self, context):
+ layout = self.layout
+
+ canvas = context.dynamic_paint.canvas_settings
+ surface = canvas.canvas_surfaces.active
+
+ layout.prop(surface, "effect_ui", expand=True)
+
+ if surface.effect_ui == 'SPREAD':
+ layout.prop(surface, "use_spread")
+
+ row = layout.row()
+ row.active = surface.use_spread
+ row.prop(surface, "spread_speed")
+ row.prop(surface, "color_spread_speed")
+
+ elif surface.effect_ui == 'DRIP':
+ layout.prop(surface, "use_drip")
+
+ col = layout.column()
+ col.active = surface.use_drip
+ effector_weights_ui(self, context, surface.effector_weights)
+
+ layout.label(text="Surface Movement:")
+ row = layout.row()
+ row.prop(surface, "drip_velocity", slider=True)
+ row.prop(surface, "drip_acceleration", slider=True)
+
+ elif surface.effect_ui == 'SHRINK':
+ layout.prop(surface, "use_shrink")
+
+ row = layout.row()
+ row.active = surface.use_shrink
+ row.prop(surface, "shrink_speed")
+
+
+class PHYSICS_PT_dp_cache(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Cache"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ return (md and
+ md.ui_type == 'CANVAS' and
+ md.canvas_settings and
+ md.canvas_settings.canvas_surfaces.active and
+ md.canvas_settings.canvas_surfaces.active.uses_cache)
+
+ def draw(self, context):
+ layout = self.layout
+
+ surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
+ cache = surface.point_cache
+
+ point_cache_ui(self, context, cache, (cache.is_baked is False), 'DYNAMIC_PAINT')
+
+
+class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Source"
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ return md and md.ui_type == 'BRUSH' and md.brush_settings
+
+ def draw(self, context):
+ layout = self.layout
+
+ brush = context.dynamic_paint.brush_settings
+ ob = context.object
+
+ split = layout.split()
+ col = split.column()
+ col.prop(brush, "paint_source")
+
+ if brush.paint_source == 'PARTICLE_SYSTEM':
+ col.prop_search(brush, "particle_system", ob, "particle_systems", text="")
+ if brush.particle_system:
+ col.label(text="Particle effect:")
+ sub = col.column()
+ sub.active = not brush.use_particle_radius
+ sub.prop(brush, "solid_radius", text="Solid Radius")
+ col.prop(brush, "use_particle_radius", text="Use Particle's Radius")
+ col.prop(brush, "smooth_radius", text="Smooth radius")
+
+ if brush.paint_source in {'DISTANCE', 'VOLUME_DISTANCE', 'POINT'}:
+ col.prop(brush, "paint_distance", text="Paint Distance")
+ split = layout.row().split(percentage=0.4)
+ sub = split.column()
+ if brush.paint_source == 'DISTANCE':
+ sub.prop(brush, "proximity_project")
+ elif brush.paint_source == 'VOLUME_DISTANCE':
+ sub.prop(brush, "proximity_inverse")
+ sub.prop(brush, "negate_volume")
+
+ sub = split.column()
+ if brush.paint_source == 'DISTANCE':
+ column = sub.column()
+ column.active = brush.proximity_project
+ column.prop(brush, "ray_direction")
+ sub.prop(brush, "proximity_falloff")
+ if brush.proximity_falloff == 'RAMP':
+ col = layout.row().column()
+ col.separator()
+ col.prop(brush, "proximity_ramp_alpha", text="Only Use Alpha")
+ col.template_color_ramp(brush, "paint_ramp", expand=True)
+
+
+class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Velocity"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ return md and md.ui_type == 'BRUSH' and md.brush_settings
+
+ def draw(self, context):
+ layout = self.layout
+
+ brush = context.dynamic_paint.brush_settings
+ ob = context.object
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(brush, "velocity_alpha")
+ col.prop(brush, "velocity_color")
+
+ split.prop(brush, "velocity_depth")
+
+ col = layout.column()
+ col.active = (brush.velocity_alpha or brush.velocity_color or brush.velocity_depth)
+ col.prop(brush, "max_velocity")
+ col.template_color_ramp(brush, "velocity_ramp", expand=True)
+ layout.separator()
+
+ row = layout.row()
+ row.prop(brush, "do_smudge")
+ sub = row.row()
+ sub.active = brush.do_smudge
+ sub.prop(brush, "smudge_strength")
+
+
+class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, Panel):
+ bl_label = "Dynamic Paint Waves"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ md = context.dynamic_paint
+ return md and md.ui_type == 'BRUSH' and md.brush_settings
+
+ def draw(self, context):
+ layout = self.layout
+
+ brush = context.dynamic_paint.brush_settings
+ ob = context.object
+
+ layout.prop(brush, "wave_type")
+ if brush.wave_type != 'REFLECT':
+ row = layout.row()
+ row.prop(brush, "wave_factor")
+ row.prop(brush, "wave_clamp")
+
+
+def register():
+ bpy.utils.register_module(__name__)
+
+
+def unregister():
+ bpy.utils.register_module(__name__)
+
+if __name__ == "__main__":
+ register()
diff --git a/release/scripts/startup/bl_ui/properties_physics_field.py b/release/scripts/startup/bl_ui/properties_physics_field.py
index 2229b9dc3da..bc7f330a546 100644
--- a/release/scripts/startup/bl_ui/properties_physics_field.py
+++ b/release/scripts/startup/bl_ui/properties_physics_field.py
@@ -20,7 +20,7 @@
import bpy
from bpy.types import Panel
-from bl_ui.properties_physics_common import (
+from .properties_physics_common import (
basic_force_field_settings_ui,
basic_force_field_falloff_ui,
)
diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index ce65350e69b..a89249a6f75 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -40,151 +40,149 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel):
layout = self.layout
md = context.fluid
+ fluid = md.settings
+
+ row = layout.row()
+ if fluid is None:
+ row.label("Built without fluids")
+ return
+
+ row.prop(fluid, "type")
+ if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
+ row.prop(fluid, "use", text="")
+
+ layout = layout.column()
+ if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
+ layout.active = fluid.use
+
+ if fluid.type == 'DOMAIN':
+ layout.operator("fluid.bake", text="Bake (Req. Memory:" + " %s)" % fluid.memory_estimate, icon='MOD_FLUIDSIM')
+ split = layout.split()
- if md:
- fluid = md.settings
-
- row = layout.row()
- if fluid is None:
- row.label("Built without fluids")
- return
-
- row.prop(fluid, "type")
- if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
- row.prop(fluid, "use", text="")
-
- layout = layout.column()
- if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
- layout.active = fluid.use
-
- if fluid.type == 'DOMAIN':
- layout.operator("fluid.bake", text="Bake (Req. Memory:" + " %s)" % fluid.memory_estimate, icon='MOD_FLUIDSIM')
- split = layout.split()
-
- col = split.column()
- col.label(text="Resolution:")
- col.prop(fluid, "resolution", text="Final")
- col.label(text="Render Display:")
- col.prop(fluid, "render_display_mode", text="")
-
- col = split.column()
- col.label()
- col.prop(fluid, "preview_resolution", text="Preview")
- col.label(text="Viewport Display:")
- col.prop(fluid, "viewport_display_mode", text="")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Time:")
- sub = col.column(align=True)
- sub.prop(fluid, "start_time", text="Start")
- sub.prop(fluid, "end_time", text="End")
-
- col = split.column()
- col.label()
- col.prop(fluid, "use_speed_vectors")
- col.prop(fluid, "use_reverse_frames")
-
- layout.prop(fluid, "filepath", text="")
-
- elif fluid.type == 'FLUID':
- split = layout.split()
-
- col = split.column()
- col.label(text="Volume Initialization:")
- col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "use_animated_mesh")
-
- col = split.column()
- col.label(text="Initial Velocity:")
- col.prop(fluid, "initial_velocity", text="")
-
- elif fluid.type == 'OBSTACLE':
- split = layout.split()
-
- col = split.column()
- col.label(text="Volume Initialization:")
- col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "use_animated_mesh")
-
- col = split.column()
- col.label(text="Slip Type:")
- col.prop(fluid, "slip_type", text="")
- if fluid.slip_type == 'PARTIALSLIP':
- col.prop(fluid, "partial_slip_factor", slider=True, text="Amount")
-
- col.label(text="Impact:")
- col.prop(fluid, "impact_factor", text="Factor")
-
- elif fluid.type == 'INFLOW':
- split = layout.split()
-
- col = split.column()
- col.label(text="Volume Initialization:")
- col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "use_animated_mesh")
- row = col.row()
- row.active = not fluid.use_animated_mesh
- row.prop(fluid, "use_local_coords")
-
- col = split.column()
- col.label(text="Inflow Velocity:")
- col.prop(fluid, "inflow_velocity", text="")
-
- elif fluid.type == 'OUTFLOW':
- split = layout.split()
-
- col = split.column()
- col.label(text="Volume Initialization:")
- col.prop(fluid, "volume_initialization", text="")
- col.prop(fluid, "use_animated_mesh")
-
- split.column()
-
- elif fluid.type == 'PARTICLE':
- split = layout.split()
-
- col = split.column()
- col.label(text="Influence:")
- col.prop(fluid, "particle_influence", text="Size")
- col.prop(fluid, "alpha_influence", text="Alpha")
-
- col = split.column()
- col.label(text="Type:")
- col.prop(fluid, "use_drops")
- col.prop(fluid, "use_floats")
- col.prop(fluid, "show_tracer")
-
- layout.prop(fluid, "filepath", text="")
-
- elif fluid.type == 'CONTROL':
- split = layout.split()
-
- col = split.column()
- col.label(text="")
- col.prop(fluid, "quality", slider=True)
- col.prop(fluid, "use_reverse_frames")
-
- col = split.column()
- col.label(text="Time:")
- sub = col.column(align=True)
- sub.prop(fluid, "start_time", text="Start")
- sub.prop(fluid, "end_time", text="End")
-
- split = layout.split()
-
- col = split.column()
- col.label(text="Attraction Force:")
- sub = col.column(align=True)
- sub.prop(fluid, "attraction_strength", text="Strength")
- sub.prop(fluid, "attraction_radius", text="Radius")
-
- col = split.column()
- col.label(text="Velocity Force:")
- sub = col.column(align=True)
- sub.prop(fluid, "velocity_strength", text="Strength")
- sub.prop(fluid, "velocity_radius", text="Radius")
+ col = split.column()
+ col.label(text="Resolution:")
+ col.prop(fluid, "resolution", text="Final")
+ col.label(text="Render Display:")
+ col.prop(fluid, "render_display_mode", text="")
+
+ col = split.column()
+ col.label()
+ col.prop(fluid, "preview_resolution", text="Preview")
+ col.label(text="Viewport Display:")
+ col.prop(fluid, "viewport_display_mode", text="")
+
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Time:")
+ sub = col.column(align=True)
+ sub.prop(fluid, "start_time", text="Start")
+ sub.prop(fluid, "end_time", text="End")
+
+ col = split.column()
+ col.label()
+ col.prop(fluid, "use_speed_vectors")
+ col.prop(fluid, "use_reverse_frames")
+
+ layout.prop(fluid, "filepath", text="")
+
+ elif fluid.type == 'FLUID':
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Volume Initialization:")
+ col.prop(fluid, "volume_initialization", text="")
+ col.prop(fluid, "use_animated_mesh")
+
+ col = split.column()
+ col.label(text="Initial Velocity:")
+ col.prop(fluid, "initial_velocity", text="")
+
+ elif fluid.type == 'OBSTACLE':
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Volume Initialization:")
+ col.prop(fluid, "volume_initialization", text="")
+ col.prop(fluid, "use_animated_mesh")
+
+ col = split.column()
+ col.label(text="Slip Type:")
+ col.prop(fluid, "slip_type", text="")
+ if fluid.slip_type == 'PARTIALSLIP':
+ col.prop(fluid, "partial_slip_factor", slider=True, text="Amount")
+
+ col.label(text="Impact:")
+ col.prop(fluid, "impact_factor", text="Factor")
+
+ elif fluid.type == 'INFLOW':
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Volume Initialization:")
+ col.prop(fluid, "volume_initialization", text="")
+ col.prop(fluid, "use_animated_mesh")
+ row = col.row()
+ row.active = not fluid.use_animated_mesh
+ row.prop(fluid, "use_local_coords")
+
+ col = split.column()
+ col.label(text="Inflow Velocity:")
+ col.prop(fluid, "inflow_velocity", text="")
+
+ elif fluid.type == 'OUTFLOW':
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Volume Initialization:")
+ col.prop(fluid, "volume_initialization", text="")
+ col.prop(fluid, "use_animated_mesh")
+
+ split.column()
+
+ elif fluid.type == 'PARTICLE':
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Influence:")
+ col.prop(fluid, "particle_influence", text="Size")
+ col.prop(fluid, "alpha_influence", text="Alpha")
+
+ col = split.column()
+ col.label(text="Type:")
+ col.prop(fluid, "use_drops")
+ col.prop(fluid, "use_floats")
+ col.prop(fluid, "show_tracer")
+
+ layout.prop(fluid, "filepath", text="")
+
+ elif fluid.type == 'CONTROL':
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="")
+ col.prop(fluid, "quality", slider=True)
+ col.prop(fluid, "use_reverse_frames")
+
+ col = split.column()
+ col.label(text="Time:")
+ sub = col.column(align=True)
+ sub.prop(fluid, "start_time", text="Start")
+ sub.prop(fluid, "end_time", text="End")
+
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Attraction Force:")
+ sub = col.column(align=True)
+ sub.prop(fluid, "attraction_strength", text="Strength")
+ sub.prop(fluid, "attraction_radius", text="Radius")
+
+ col = split.column()
+ col.label(text="Velocity Force:")
+ sub = col.column(align=True)
+ sub.prop(fluid, "velocity_strength", text="Strength")
+ sub.prop(fluid, "velocity_radius", text="Radius")
class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py
index e270b53d6bb..4c413647210 100644
--- a/release/scripts/startup/bl_ui/properties_physics_smoke.py
+++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py
@@ -20,7 +20,7 @@
import bpy
from bpy.types import Panel
-from bl_ui.properties_physics_common import (
+from .properties_physics_common import (
point_cache_ui,
effector_weights_ui,
)
@@ -47,60 +47,59 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, Panel):
md = context.smoke
ob = context.object
- if md:
- layout.prop(md, "smoke_type", expand=True)
+ layout.prop(md, "smoke_type", expand=True)
- if md.smoke_type == 'DOMAIN':
- domain = md.domain_settings
+ if md.smoke_type == 'DOMAIN':
+ domain = md.domain_settings
- split = layout.split()
+ split = layout.split()
- split.enabled = not domain.point_cache.is_baked
+ split.enabled = not domain.point_cache.is_baked
- col = split.column()
- col.label(text="Resolution:")
- col.prop(domain, "resolution_max", text="Divisions")
- col.label(text="Time:")
- col.prop(domain, "time_scale", text="Scale")
- col.label(text="Border Collisions:")
- col.prop(domain, "collision_extents", text="")
+ col = split.column()
+ col.label(text="Resolution:")
+ col.prop(domain, "resolution_max", text="Divisions")
+ col.label(text="Time:")
+ col.prop(domain, "time_scale", text="Scale")
+ col.label(text="Border Collisions:")
+ col.prop(domain, "collision_extents", text="")
- col = split.column()
- col.label(text="Behavior:")
- col.prop(domain, "alpha")
- col.prop(domain, "beta", text="Temp. Diff.")
- col.prop(domain, "vorticity")
- col.prop(domain, "use_dissolve_smoke", text="Dissolve")
- sub = col.column()
- sub.active = domain.use_dissolve_smoke
- sub.prop(domain, "dissolve_speed", text="Time")
- sub.prop(domain, "use_dissolve_smoke_log", text="Slow")
+ col = split.column()
+ col.label(text="Behavior:")
+ col.prop(domain, "alpha")
+ col.prop(domain, "beta", text="Temp. Diff.")
+ col.prop(domain, "vorticity")
+ col.prop(domain, "use_dissolve_smoke", text="Dissolve")
+ sub = col.column()
+ sub.active = domain.use_dissolve_smoke
+ sub.prop(domain, "dissolve_speed", text="Time")
+ sub.prop(domain, "use_dissolve_smoke_log", text="Slow")
- elif md.smoke_type == 'FLOW':
+ elif md.smoke_type == 'FLOW':
- flow = md.flow_settings
+ flow = md.flow_settings
- split = layout.split()
+ split = layout.split()
- col = split.column()
- col.prop(flow, "use_outflow")
- col.label(text="Particle System:")
- col.prop_search(flow, "particle_system", ob, "particle_systems", text="")
+ col = split.column()
+ col.prop(flow, "use_outflow")
+ col.label(text="Particle System:")
+ col.prop_search(flow, "particle_system", ob, "particle_systems", text="")
- sub = col.column()
- sub.active = not md.flow_settings.use_outflow
+ sub = col.column()
+ sub.active = not md.flow_settings.use_outflow
- sub.prop(flow, "initial_velocity", text="Initial Velocity")
- sub = sub.column()
- sub.active = flow.initial_velocity
- sub.prop(flow, "velocity_factor", text="Multiplier")
+ sub.prop(flow, "initial_velocity", text="Initial Velocity")
+ sub = sub.column()
+ sub.active = flow.initial_velocity
+ sub.prop(flow, "velocity_factor", text="Multiplier")
- sub = split.column()
- sub.active = not md.flow_settings.use_outflow
- sub.label(text="Initial Values:")
- sub.prop(flow, "use_absolute")
- sub.prop(flow, "density")
- sub.prop(flow, "temperature")
+ sub = split.column()
+ sub.active = not md.flow_settings.use_outflow
+ sub.label(text="Initial Values:")
+ sub.prop(flow, "use_absolute")
+ sub.prop(flow, "density")
+ sub.prop(flow, "temperature")
class PHYSICS_PT_smoke_groups(PhysicButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_physics_softbody.py b/release/scripts/startup/bl_ui/properties_physics_softbody.py
index b9f8910fa59..78c74a7e1d3 100644
--- a/release/scripts/startup/bl_ui/properties_physics_softbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_softbody.py
@@ -20,7 +20,7 @@
import bpy
from bpy.types import Panel
-from bl_ui.properties_physics_common import (
+from .properties_physics_common import (
point_cache_ui,
effector_weights_ui,
)
@@ -39,8 +39,6 @@ class PhysicButtonsPanel():
def poll(cls, context):
ob = context.object
rd = context.scene.render
-# return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
-# i really hate touching things i do not understand completely .. but i think this should read (bjornmose)
return (ob and (ob.type == 'MESH' or ob.type == 'LATTICE'or ob.type == 'CURVE')) and (not rd.use_game_engine) and (context.soft_body)
@@ -53,22 +51,21 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel, Panel):
md = context.soft_body
ob = context.object
- if md:
- softbody = md.settings
+ softbody = md.settings
- # General
- split = layout.split()
- split.enabled = softbody_panel_enabled(md)
+ # General
+ split = layout.split()
+ split.enabled = softbody_panel_enabled(md)
- col = split.column()
- col.label(text="Object:")
- col.prop(softbody, "friction")
- col.prop(softbody, "mass")
- col.prop_search(softbody, "vertex_group_mass", ob, "vertex_groups", text="Mass:")
+ col = split.column()
+ col.label(text="Object:")
+ col.prop(softbody, "friction")
+ col.prop(softbody, "mass")
+ col.prop_search(softbody, "vertex_group_mass", ob, "vertex_groups", text="Mass:")
- col = split.column()
- col.label(text="Simulation:")
- col.prop(softbody, "speed")
+ col = split.column()
+ col.label(text="Simulation:")
+ col.prop(softbody, "speed")
class PHYSICS_PT_softbody_cache(PhysicButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py
index 73947c21a80..9ba0309aacd 100644
--- a/release/scripts/startup/bl_ui/properties_texture.py
+++ b/release/scripts/startup/bl_ui/properties_texture.py
@@ -44,7 +44,7 @@ class TEXTURE_MT_envmap_specials(Menu):
layout.operator("texture.envmap_clear", icon='FILE_REFRESH')
layout.operator("texture.envmap_clear_all", icon='FILE_REFRESH')
-from bl_ui.properties_material import active_node_mat
+from .properties_material import active_node_mat
def context_tex_datablock(context):
@@ -726,7 +726,7 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel, Panel):
col.prop(pd, "falloff", text="")
if pd.falloff == 'SOFT':
col.prop(pd, "falloff_soft")
- if pd.falloff == "PARTICLE_VELOCITY":
+ if pd.falloff == 'PARTICLE_VELOCITY':
col.prop(pd, "falloff_speed_scale")
col.prop(pd, "use_falloff_curve")
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index 3148c0dd51a..55fc641f5ae 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -757,8 +757,8 @@ class CLIP_MT_reconstruction(Menu):
layout.operator("clip.set_origin")
layout.operator("clip.set_floor")
- layout.operator("clip.set_axis", text="Set X Asix").axis = "X"
- layout.operator("clip.set_axis", text="Set Y Asix").axis = "Y"
+ layout.operator("clip.set_axis", text="Set X Axis").axis = "X"
+ layout.operator("clip.set_axis", text="Set Y Axis").axis = "Y"
layout.operator("clip.set_scale")
diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py
index b57d421dfaf..5f7462ce44e 100644
--- a/release/scripts/startup/bl_ui/space_graph.py
+++ b/release/scripts/startup/bl_ui/space_graph.py
@@ -26,7 +26,7 @@ class GRAPH_HT_header(Header):
bl_space_type = 'GRAPH_EDITOR'
def draw(self, context):
- from bl_ui.space_dopesheet import dopesheet_filter
+ from .space_dopesheet import dopesheet_filter
layout = self.layout
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 170ba3ccd0e..81526797109 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -312,19 +312,19 @@ class IMAGE_MT_uvs_select_mode(Menu):
else:
prop = layout.operator("wm.context_set_string", text="Vertex", icon='UV_VERTEXSEL')
- prop.value = "VERTEX"
+ prop.value = 'VERTEX'
prop.data_path = "tool_settings.uv_select_mode"
prop = layout.operator("wm.context_set_string", text="Edge", icon='UV_EDGESEL')
- prop.value = "EDGE"
+ prop.value = 'EDGE'
prop.data_path = "tool_settings.uv_select_mode"
prop = layout.operator("wm.context_set_string", text="Face", icon='UV_FACESEL')
- prop.value = "FACE"
+ prop.value = 'FACE'
prop.data_path = "tool_settings.uv_select_mode"
prop = layout.operator("wm.context_set_string", text="Island", icon='UV_ISLANDSEL')
- prop.value = "ISLAND"
+ prop.value = 'ISLAND'
prop.data_path = "tool_settings.uv_select_mode"
diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py
index c878c20c8a7..59057166ec4 100644
--- a/release/scripts/startup/bl_ui/space_nla.py
+++ b/release/scripts/startup/bl_ui/space_nla.py
@@ -26,7 +26,7 @@ class NLA_HT_header(Header):
bl_space_type = 'NLA_EDITOR'
def draw(self, context):
- from bl_ui.space_dopesheet import dopesheet_filter
+ from .space_dopesheet import dopesheet_filter
layout = self.layout
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index a4dcf64b679..c1c9bc12b2d 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -456,7 +456,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
elif strip.type == 'TRANSFORM':
self.draw_panel_transform(strip)
- elif strip.type == "MULTICAM":
+ elif strip.type == 'MULTICAM':
layout.prop(strip, "multicam_source")
row = layout.row(align=True)
diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py
index 5209e8be597..72818dfc642 100644
--- a/release/scripts/startup/bl_ui/space_time.py
+++ b/release/scripts/startup/bl_ui/space_time.py
@@ -92,7 +92,7 @@ class TIME_HT_header(Header):
row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT')
-class TIME_MT_marker(bpy.types.Menu):
+class TIME_MT_marker(Menu):
bl_label = "Marker"
def draw(self, context):
@@ -144,6 +144,7 @@ class TIME_MT_cache(Menu):
col.prop(st, "cache_particles")
col.prop(st, "cache_cloth")
col.prop(st, "cache_smoke")
+ col.prop(st, "cache_dynamicpaint")
class TIME_MT_frame(Menu):
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index a2ede26ecc6..51f55fe019c 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -743,7 +743,7 @@ class USERPREF_PT_file(Panel):
sub.active = paths.use_auto_save_temporary_files
sub.prop(paths, "auto_save_time", text="Timer (mins)")
-from bl_ui.space_userpref_keymap import InputKeyMapPanel
+from .space_userpref_keymap import InputKeyMapPanel
class USERPREF_MT_ndof_settings(Menu):
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index e5eccb4d940..1314401a1ef 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -1537,10 +1537,10 @@ class VIEW3D_MT_edit_mesh_extrude(Menu):
bl_label = "Extrude"
_extrude_funcs = {
- "VERT": lambda layout: layout.operator("mesh.extrude_vertices_move", text="Vertices Only"),
- "EDGE": lambda layout: layout.operator("mesh.extrude_edges_move", text="Edges Only"),
- "FACE": lambda layout: layout.operator("mesh.extrude_faces_move", text="Individual Faces"),
- "REGION": lambda layout: layout.operator("view3d.edit_mesh_extrude_move_normal", text="Region"),
+ 'VERT': lambda layout: layout.operator("mesh.extrude_vertices_move", text="Vertices Only"),
+ 'EDGE': lambda layout: layout.operator("mesh.extrude_edges_move", text="Edges Only"),
+ 'FACE': lambda layout: layout.operator("mesh.extrude_faces_move", text="Individual Faces"),
+ 'REGION': lambda layout: layout.operator("view3d.edit_mesh_extrude_move_normal", text="Region"),
}
@staticmethod
@@ -1550,11 +1550,11 @@ class VIEW3D_MT_edit_mesh_extrude(Menu):
menu = []
if mesh.total_face_sel:
- menu += ["REGION", "FACE"]
+ menu += ['REGION', 'FACE']
if mesh.total_edge_sel and (select_mode[0] or select_mode[1]):
- menu += ["EDGE"]
+ menu += ['EDGE']
if mesh.total_vert_sel and select_mode[0]:
- menu += ["VERT"]
+ menu += ['VERT']
# should never get here
return menu
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index df293ecbf41..6a6e71eac22 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -39,6 +39,7 @@ set(SRC_DNA_INC
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_curve_types.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_customdata_types.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
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_fileglobal_types.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_genfile.h
diff --git a/source/blender/SConscript b/source/blender/SConscript
index ed69c9e57e9..1fe815849db 100644
--- a/source/blender/SConscript
+++ b/source/blender/SConscript
@@ -12,7 +12,6 @@ SConscript(['avi/SConscript',
'freestyle/SConscript',
'imbuf/SConscript',
'makesdna/SConscript',
- 'makesrna/SConscript',
'render/SConscript',
'nodes/SConscript',
'modifiers/SConscript',
@@ -20,7 +19,7 @@ SConscript(['avi/SConscript',
'windowmanager/SConscript',
'blenfont/SConscript'])
-
+makesrna = SConscript('makesrna/SConscript')
if env['WITH_BF_PYTHON']:
SConscript(['python/SConscript'])
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index 6e8828ebce4..a021695b7c9 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -731,9 +731,9 @@ AviError AVI_open_compress (char *name, AviMovie *movie, int streams, ...) {
movie->header->fcc = FCC("avih");
movie->header->size = 56;
movie->header->MicroSecPerFrame = 66667;
- movie->header->MaxBytesPerSec = 0;
- movie->header->PaddingGranularity = 0;
- movie->header->Flags = AVIF_HASINDEX | AVIF_MUSTUSEINDEX;
+ movie->header->MaxBytesPerSec = 0;
+ movie->header->PaddingGranularity = 0;
+ movie->header->Flags = AVIF_HASINDEX | AVIF_MUSTUSEINDEX;
movie->header->TotalFrames = 0;
movie->header->InitialFrames = 0;
movie->header->Streams = streams;
diff --git a/source/blender/blenfont/BLF_translation.h b/source/blender/blenfont/BLF_translation.h
index 0d33180a817..ddbc9a6a760 100644
--- a/source/blender/blenfont/BLF_translation.h
+++ b/source/blender/blenfont/BLF_translation.h
@@ -58,8 +58,18 @@ void BLF_lang_encoding_name(const char *str);
void BLF_lang_encoding(const char *str);
+/* translation */
+int BLF_translate_iface(void);
+int BLF_translate_tooltips(void);
+const char *BLF_translate_do_iface(const char *msgid);
+const char *BLF_translate_do_tooltip(const char *msgid);
+
+
/*#define _(msgid) BLF_gettext(msgid)*/
/* The "translation-marker" macro. */
#define N_(msgid) msgid
+/* Those macros should be used everywhere in UI code. */
+#define IFACE_(msgid) BLF_translate_do_iface(msgid)
+#define TIP_(msgid) BLF_translate_do_tooltip(msgid)
#endif /* BLF_TRANSLATION_H */
diff --git a/source/blender/blenfont/intern/blf_translation.c b/source/blender/blenfont/intern/blf_translation.c
index 917d95cfc20..8688249732f 100644
--- a/source/blender/blenfont/intern/blf_translation.c
+++ b/source/blender/blenfont/intern/blf_translation.c
@@ -44,6 +44,8 @@
#include "BLF_translation.h"
+#include "DNA_userdef_types.h" /* For user settings. */
+
#ifdef WITH_INTERNATIONAL
const char unifont_filename[]="droidsans.ttf.gz";
static unsigned char *unifont_ttf= NULL;
@@ -88,3 +90,46 @@ const char* BLF_gettext(const char *msgid)
return msgid;
#endif
}
+
+int BLF_translate_iface(void)
+{
+#ifdef WITH_INTERNATIONAL
+ return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE);
+#else
+ return 0;
+#endif
+}
+
+int BLF_translate_tooltips(void)
+{
+#ifdef WITH_INTERNATIONAL
+ return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS);
+#else
+ return 0;
+#endif
+}
+
+const char *BLF_translate_do_iface(const char *msgid)
+{
+#ifdef WITH_INTERNATIONAL
+ if(BLF_translate_iface())
+ return BLF_gettext(msgid);
+ else
+ return msgid;
+#else
+ return msgid;
+#endif
+}
+
+const char *BLF_translate_do_tooltip(const char *msgid)
+{
+#ifdef WITH_INTERNATIONAL
+ if(BLF_translate_tooltips())
+ return BLF_gettext(msgid);
+ else
+ return msgid;
+#else
+ return msgid;
+#endif
+}
+
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 5e403849289..15fdc2fe307 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -324,6 +324,14 @@ struct DerivedMesh {
float t),
void *userData);
+ /* Draw all faces with materials
+ * o setMaterial is called for every different material nr
+ * o setFace is called to verify if a face must be hidden
+ */
+ void (*drawMappedFacesMat)(DerivedMesh *dm,
+ void (*setMaterial)(void *userData, int, void *attribs),
+ int (*setFace)(void *userData, int index), void *userData);
+
/* Release reference to the DerivedMesh. This function decides internally
* if the DerivedMesh will be freed, or cached for later use. */
void (*release)(DerivedMesh *dm);
@@ -339,7 +347,7 @@ void DM_init_funcs(DerivedMesh *dm);
* sets up the custom data layers)
*/
void DM_init(DerivedMesh *dm, DerivedMeshType type,
- int numVerts, int numEdges, int numFaces);
+ int numVerts, int numEdges, int numFaces);
/* utility function to initialise a DerivedMesh for the desired number
* of vertices, edges and faces, with a layer setup copied from source
diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index 44aebdf6205..c2b4e30ef3b 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -40,6 +40,7 @@ struct ListBase;
struct bAnimVizSettings;
struct bMotionPath;
struct bPoseChannel;
+struct ReportList;
/* ---------------------------------------------------- */
/* Animation Visualisation */
@@ -49,7 +50,7 @@ void animviz_settings_init(struct bAnimVizSettings *avs);
void animviz_free_motionpath_cache(struct bMotionPath *mpath);
void animviz_free_motionpath(struct bMotionPath *mpath);
-struct bMotionPath *animviz_verify_motionpaths(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan);
+struct bMotionPath *animviz_verify_motionpaths(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan);
void animviz_get_object_motionpaths(struct Object *ob, ListBase *targets);
void animviz_calc_motionpaths(struct Scene *scene, ListBase *targets);
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index ac56cd02eb0..b150c403b87 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 260
-#define BLENDER_SUBVERSION 2
+#define BLENDER_SUBVERSION 3
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_bmfont.h b/source/blender/blenkernel/BKE_bmfont.h
index 5f23121b802..71fd2ae3d67 100644
--- a/source/blender/blenkernel/BKE_bmfont.h
+++ b/source/blender/blenkernel/BKE_bmfont.h
@@ -44,19 +44,19 @@ struct bmFont;
void printfGlyph(struct bmGlyph * glyph);
void calcAlpha(struct ImBuf * ibuf);
void readBitmapFontVersion0(struct ImBuf * ibuf,
- unsigned char * rect,
- int step);
+ unsigned char * rect,
+ int step);
void detectBitmapFont(struct ImBuf *ibuf);
int locateGlyph(struct bmFont *bmfont, unsigned short unicode);
void matrixGlyph(struct ImBuf * ibuf, unsigned short unicode,
- float *centerx, float *centery,
- float *sizex, float *sizey,
- float *transx, float *transy,
- float *movex, float *movey, float *advance);
+ float *centerx, float *centery,
+ float *sizex, float *sizey,
+ float *transx, float *transy,
+ float *movex, float *movey, float *advance);
#ifdef __cplusplus
}
#endif
-
+
#endif
diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index c3f5ae7fbf0..07f0c2fef7c 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -105,6 +105,11 @@ BVHTree* bvhtree_from_mesh_edges(struct BVHTreeFromMesh *data, struct DerivedMes
*/
void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data);
+/*
+* Math functions used by callbacks
+*/
+float bvhtree_ray_tri_intersection(const BVHTreeRay *ray, const float m_dist, const float v0[3], const float v1[3], const float v2[3]);
+float nearest_point_in_tri_surface(const float v0[3], const float v1[3], const float v2[3], const float p[3], int *v, int *e, float nearest[3]);
/*
* BVHCache
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index f3922f43cbc..5497866b9df 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -278,6 +278,8 @@ const char *CustomData_layertype_name(int type);
/* make sure the name of layer at index is unique */
void CustomData_set_layer_unique_name(struct CustomData *data, int index);
+void CustomData_validate_layer_name(const struct CustomData *data, int type, char *name, char *outname);
+
/* for file reading compatibility, returns false if the layer was freed,
only after this test passes, layer->data should be assigned */
int CustomData_verify_versions(struct CustomData *data, int index);
diff --git a/source/blender/blenkernel/BKE_dynamicpaint.h b/source/blender/blenkernel/BKE_dynamicpaint.h
new file mode 100644
index 00000000000..d7e0f8bdaae
--- /dev/null
+++ b/source/blender/blenkernel/BKE_dynamicpaint.h
@@ -0,0 +1,89 @@
+/**
+ * ***** 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 *****
+ */
+
+#ifndef BKE_DYNAMIC_PAINT_H_
+#define BKE_DYNAMIC_PAINT_H_
+
+struct bContext;
+struct wmOperator;
+
+/* Actual surface point */
+typedef struct PaintSurfaceData {
+ void *format_data; /* special data for each surface "format" */
+ void *type_data; /* data used by specific surface type */
+ struct PaintAdjData *adj_data; /* adjacency data for current surface */
+
+ struct PaintBakeData *bData; /* temporary per step data used for frame calculation */
+ int total_points;
+
+} PaintSurfaceData;
+
+/* Paint type surface point */
+typedef struct PaintPoint {
+
+ /* Wet paint is handled at effect layer only
+ * and mixed to surface when drying */
+ float e_color[3];
+ float e_alpha;
+ float wetness;
+ short state;
+ float color[3];
+ float alpha;
+} PaintPoint;
+
+/* heigh field waves */
+typedef struct PaintWavePoint {
+
+ float height;
+ float velocity;
+ short state;
+} PaintWavePoint;
+
+struct DerivedMesh *dynamicPaint_Modifier_do(struct DynamicPaintModifierData *pmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
+void dynamicPaint_Modifier_free (struct DynamicPaintModifierData *pmd);
+void dynamicPaint_Modifier_copy(struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tsmd);
+
+int dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, struct Scene *scene);
+struct DynamicPaintSurface *dynamicPaint_createNewSurface(struct DynamicPaintCanvasSettings *canvas, struct Scene *scene);
+void dynamicPaint_clearSurface(struct DynamicPaintSurface *surface);
+int dynamicPaint_resetSurface(struct DynamicPaintSurface *surface);
+void dynamicPaint_freeSurface(struct DynamicPaintSurface *surface);
+void dynamicPaint_freeCanvas(struct DynamicPaintModifierData *pmd);
+void dynamicPaint_freeBrush(struct DynamicPaintModifierData *pmd);
+void dynamicPaint_freeSurfaceData(struct DynamicPaintSurface *surface);
+
+void dynamicPaint_cacheUpdateFrames(struct DynamicPaintSurface *surface);
+int dynamicPaint_surfaceHasColorPreview(struct DynamicPaintSurface *surface);
+int dynamicPaint_outputLayerExists(struct DynamicPaintSurface *surface, struct Object *ob, int index);
+void dynamicPaintSurface_updateType(struct DynamicPaintSurface *surface);
+void dynamicPaintSurface_setUniqueName(struct DynamicPaintSurface *surface, const char *basename);
+void dynamicPaint_resetPreview(struct DynamicPaintCanvasSettings *canvas);
+struct DynamicPaintSurface *get_activeSurface(struct DynamicPaintCanvasSettings *canvas);
+
+/* image sequence baking */
+int dynamicPaint_createUVSurface(struct DynamicPaintSurface *surface);
+int dynamicPaint_calculateFrame(struct DynamicPaintSurface *surface, struct Scene *scene, struct Object *cObject, int frame);
+void dynamicPaint_outputSurfaceImage(struct DynamicPaintSurface *surface, char* filename, short output_layer);
+
+/* PaintPoint state */
+#define DPAINT_PAINT_NONE -1
+#define DPAINT_PAINT_DRY 0
+#define DPAINT_PAINT_WET 1
+#define DPAINT_PAINT_NEW 2
+
+/* PaintWavePoint state */
+#define DPAINT_WAVE_NONE 0
+#define DPAINT_WAVE_OBSTACLE 1
+#define DPAINT_WAVE_REFLECT_ONLY 2
+
+#endif /* BKE_DYNAMIC_PAINT_H_ */
diff --git a/source/blender/blenkernel/BKE_fluidsim.h b/source/blender/blenkernel/BKE_fluidsim.h
index a68009dda37..2b2c7a4ff87 100644
--- a/source/blender/blenkernel/BKE_fluidsim.h
+++ b/source/blender/blenkernel/BKE_fluidsim.h
@@ -48,7 +48,7 @@ void initElbeemMesh(struct Scene *scene, struct Object *ob,
/* bounding box & memory estimate */
void fluid_get_bb(struct MVert *mvert, int totvert, float obmat[][4],
- float start[3], float size[3]);
+ float start[3], float size[3]);
void fluid_estimate_memory(struct Object *ob, struct FluidsimSettings *fss, char *value);
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 07c6fb8b09c..900835940c7 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -128,9 +128,9 @@ typedef struct IndexNode {
int index;
} IndexNode;
void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
- const int totvert, const int totface);
+ const int totvert, const int totface);
void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *medge,
- const int totvert, const int totedge);
+ const int totvert, const int totedge);
/* Partial Mesh Visibility */
struct PartialVisibility *mesh_pmv_copy(struct PartialVisibility *);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index b94fffab714..580f78d3063 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -351,6 +351,7 @@ struct bNode *nodeGetActive(struct bNodeTree *ntree);
struct bNode *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
int nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
void nodeClearActiveID(struct bNodeTree *ntree, short idtype);
+struct bNode *nodeGetActiveTexture(struct bNodeTree *ntree);
void nodeUpdate(struct bNodeTree *ntree, struct bNode *node);
int nodeUpdateID(struct bNodeTree *ntree, struct ID *id);
@@ -456,6 +457,40 @@ struct ShadeResult;
#define SH_NODE_HUE_SAT 122
#define NODE_DYNAMIC 123
+#define SH_NODE_OUTPUT_MATERIAL 124
+#define SH_NODE_OUTPUT_WORLD 125
+#define SH_NODE_OUTPUT_LAMP 126
+#define SH_NODE_FRESNEL 127
+#define SH_NODE_MIX_SHADER 128
+#define SH_NODE_ATTRIBUTE 129
+#define SH_NODE_BACKGROUND 130
+#define SH_NODE_BSDF_ANISOTROPIC 131
+#define SH_NODE_BSDF_DIFFUSE 132
+#define SH_NODE_BSDF_GLOSSY 133
+#define SH_NODE_BSDF_GLASS 134
+#define SH_NODE_BSDF_TRANSLUCENT 137
+#define SH_NODE_BSDF_TRANSPARENT 138
+#define SH_NODE_BSDF_VELVET 139
+#define SH_NODE_EMISSION 140
+#define SH_NODE_NEW_GEOMETRY 141
+#define SH_NODE_LIGHT_PATH 142
+#define SH_NODE_TEX_IMAGE 143
+#define SH_NODE_TEX_SKY 145
+#define SH_NODE_TEX_GRADIENT 146
+#define SH_NODE_TEX_VORONOI 147
+#define SH_NODE_TEX_MAGIC 148
+#define SH_NODE_TEX_WAVE 149
+#define SH_NODE_TEX_NOISE 150
+#define SH_NODE_TEX_MUSGRAVE 152
+#define SH_NODE_TEX_COORD 155
+#define SH_NODE_ADD_SHADER 156
+#define SH_NODE_TEX_ENVIRONMENT 157
+#define SH_NODE_OUTPUT_TEXTURE 158
+#define SH_NODE_HOLDOUT 159
+#define SH_NODE_LAYER_WEIGHT 160
+#define SH_NODE_VOLUME_TRANSPARENT 161
+#define SH_NODE_VOLUME_ISOTROPIC 162
+
/* custom defines options for Material node */
#define SH_NODE_MAT_DIFF 1
#define SH_NODE_MAT_SPEC 2
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 2ef942a2e09..ecc00901dd5 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -116,6 +116,22 @@ int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3
void *object_tfm_backup(struct Object *ob);
void object_tfm_restore(struct Object *ob, void *obtfm_pt);
+typedef struct ObjectTfmProtectedChannels {
+ float loc[3], dloc[3];
+ float size[3], dsize[3];
+ float rot[3], drot[3];
+ float quat[4], dquat[4];
+ float rotAxis[3], drotAxis[3];
+ float rotAngle, drotAngle;
+} ObjectTfmProtectedChannels;
+
+void object_tfm_protected_backup(const struct Object *ob,
+ ObjectTfmProtectedChannels *obtfm);
+
+void object_tfm_protected_restore(struct Object *ob,
+ const ObjectTfmProtectedChannels *obtfm,
+ const short protectflag);
+
void object_handle_update(struct Scene *scene, struct Object *ob);
void object_sculpt_modifiers_changed(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index e14db31607a..081b79b44d6 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -91,7 +91,7 @@ typedef struct SculptSession {
unsigned int texcache_side, *texcache, texcache_actual;
/* Layer brush persistence between strokes */
- float (*layer_co)[3]; /* Copy of the mesh vertices' locations */
+ float (*layer_co)[3]; /* Copy of the mesh vertices' locations */
struct SculptStroke *stroke;
struct StrokeCache *cache;
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index 28ca1006a03..9f4fae7dc2e 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -33,6 +33,7 @@
*/
#include "DNA_ID.h"
+#include "DNA_dynamicpaint_types.h"
#include "DNA_object_force.h"
#include "DNA_boid_types.h"
#include <stdio.h> /* for FILE */
@@ -65,6 +66,7 @@
#define PTCACHE_TYPE_CLOTH 2
#define PTCACHE_TYPE_SMOKE_DOMAIN 3
#define PTCACHE_TYPE_SMOKE_HIGHRES 4
+#define PTCACHE_TYPE_DYNAMICPAINT 5
/* high bits reserved for flags that need to be stored in file */
#define PTCACHE_TYPEFLAG_COMPRESS (1<<16)
@@ -138,7 +140,7 @@ typedef struct PTCacheID {
/* copies point data to cache data */
int (*write_stream)(PTCacheFile *pf, void *calldata);
/* copies cache cata to point data */
- void (*read_stream)(PTCacheFile *pf, void *calldata);
+ int (*read_stream)(PTCacheFile *pf, void *calldata);
/* copies custom extradata to cache data */
void (*write_extra_data)(void *calldata, struct PTCacheMem *pm, int cfra);
@@ -254,6 +256,7 @@ void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct Soft
void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
+void BKE_ptcache_id_from_dynamicpaint(PTCacheID *pid, struct Object *ob, struct DynamicPaintSurface *surface);
void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis);
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index a16e55ce8ff..715febf2fd1 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -198,8 +198,8 @@ int input_have_to_preprocess(
SeqRenderData context, struct Sequence * seq, float cfra);
void seq_proxy_rebuild(struct Main * bmain,
- struct Scene *scene, struct Sequence * seq,
- short *stop, short *do_update, float *progress);
+ struct Scene *scene, struct Sequence * seq,
+ short *stop, short *do_update, float *progress);
/* **********************************************************************
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index ffa3555e40b..4f909a59e8e 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -90,6 +90,7 @@ set(SRC
intern/deform.c
intern/depsgraph.c
intern/displist.c
+ intern/dynamicpaint.c
intern/effect.c
intern/fcurve.c
intern/fluidsim.c
@@ -179,6 +180,7 @@ set(SRC
BKE_deform.h
BKE_depsgraph.h
BKE_displist.h
+ BKE_dynamicpaint.h
BKE_effect.h
BKE_fcurve.h
BKE_fluidsim.h
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 964ba18ca40..a76ea1852de 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1123,6 +1123,140 @@ static void emDM_drawFacesGLSL(DerivedMesh *dm,
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;
@@ -1431,6 +1565,7 @@ DerivedMesh *editmesh_get_derived(EditMesh *em, float (*vertexCos)[3])
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;
@@ -1788,7 +1923,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
Mesh *me = ob->data;
ModifierData *firstmd, *md;
LinkNode *datamasks, *curr;
- CustomDataMask mask, nextmask;
+ CustomDataMask mask, nextmask, append_mask = 0;
float (*deformedVerts)[3] = NULL;
DerivedMesh *dm, *orcodm, *clothorcodm, *finaldm;
int numVerts = me->totvert;
@@ -2007,6 +2142,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
/* needMapping check here fixes bug [#28112], otherwise its
* possible that it wont be copied */
+ mask |= append_mask;
DM_set_only_copy(dm, mask | (needMapping ? CD_MASK_ORIGINDEX : 0));
/* add cloth rest shape key if need */
@@ -2065,6 +2201,10 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
clothorcodm = ndm;
}
}
+
+ /* in case of dynamic paint, make sure preview mask remains for following modifiers */
+ if (md->type == eModifierType_DynamicPaint)
+ append_mask |= CD_MASK_WEIGHT_MCOL;
}
isPrevDeform= (mti->type == eModifierTypeType_OnlyDeform);
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index c1f294fb102..36df1101a24 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -67,6 +67,7 @@
#include "BKE_utildefines.h"
#include "BKE_depsgraph.h"
#include "BKE_anim.h"
+#include "BKE_report.h"
// XXX bad level call...
@@ -147,7 +148,7 @@ void animviz_free_motionpath(bMotionPath *mpath)
* - ob: object to add paths for (must be provided)
* - pchan: posechannel to add paths for (optional; if not provided, object-paths are assumed)
*/
-bMotionPath *animviz_verify_motionpaths(Scene *scene, Object *ob, bPoseChannel *pchan)
+bMotionPath *animviz_verify_motionpaths(ReportList *reports, Scene *scene, Object *ob, bPoseChannel *pchan)
{
bAnimVizSettings *avs;
bMotionPath *mpath, **dst;
@@ -170,6 +171,11 @@ bMotionPath *animviz_verify_motionpaths(Scene *scene, Object *ob, bPoseChannel *
/* avoid 0 size allocs */
if (avs->path_sf >= avs->path_ef) {
+ BKE_reportf(reports, RPT_ERROR,
+ "Motion Path frame extents invalid for %s (%d to %d).%s\n",
+ (pchan)? pchan->name : ob->id.name,
+ avs->path_sf, avs->path_ef,
+ (avs->path_sf == avs->path_ef)? " Cannot have single-frame paths." : "");
return NULL;
}
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index c9868bd900f..6656d06e72e 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -175,7 +175,7 @@ static int rule_goal_avoid(BoidRule *rule, BoidBrainData *bbd, BoidValues *val,
if(len2 > 0.0f && efd.distance - surface < len2) {
len2 = (efd.distance - surface)/len2;
- bbd->wanted_speed *= pow(len2, boids->landing_smoothness);
+ bbd->wanted_speed *= powf(len2, boids->landing_smoothness);
}
}
@@ -242,7 +242,7 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
mul_v3_fl(bbd->wanted_co, (1.0f - t) * val->personal_space * pa->size);
- bbd->wanted_speed = sqrt(t) * len_v3(pa->prev_state.vel);
+ bbd->wanted_speed = sqrtf(t) * len_v3(pa->prev_state.vel);
bbd->wanted_speed = MAX2(bbd->wanted_speed, val->min_speed);
return 1;
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 09021e71025..5303baddbca 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -333,7 +333,7 @@ void brush_reset_sculpt(Brush *br)
/* enable this to see any non-default
settings used by a brush:
- brush_debug_print_state(br);
+ brush_debug_print_state(br);
*/
brush_set_defaults(br);
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 1a27a640797..1100c1c0ef5 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -48,7 +48,7 @@
/* Math stuff for ray casting on mesh faces and for nearest surface */
-static float ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), const float v0[3], const float v1[3], const float v2[3])
+float bvhtree_ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), const float v0[3], const float v1[3], const float v2[3])
{
float dist;
@@ -81,7 +81,7 @@ static float sphereray_tri_intersection(const BVHTreeRay *ray, float radius, con
* Function adapted from David Eberly's distance tools (LGPL)
* http://www.geometrictools.com/LibFoundation/Distance/Distance.html
*/
-static float nearest_point_in_tri_surface(const float v0[3], const float v1[3], const float v2[3], const float p[3], int *v, int *e, float nearest[3])
+float nearest_point_in_tri_surface(const float v0[3], const float v1[3], const float v2[3], const float p[3], int *v, int *e, float nearest[3])
{
float diff[3];
float e0[3];
@@ -456,7 +456,7 @@ static void mesh_faces_spherecast(void *userdata, int index, const BVHTreeRay *r
{
float dist;
if(data->sphere_radius == 0.0f)
- dist = ray_tri_intersection(ray, hit->dist, t0, t1, t2);
+ dist = bvhtree_ray_tri_intersection(ray, hit->dist, t0, t1, t2);
else
dist = sphereray_tri_intersection(ray, data->sphere_radius, hit->dist, t0, t1, t2);
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index e758f5a0487..eaf2afdcfb6 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -231,7 +231,7 @@ static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
cddm->pbvh = BLI_pbvh_new();
cddm->pbvh_draw = can_pbvh_draw(ob, dm);
BLI_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
- me->totface, me->totvert);
+ me->totface, me->totvert);
if(ss->modifiers_active && ob->derivedDeform) {
DerivedMesh *deformdm= ob->derivedDeform;
@@ -878,7 +878,9 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
if(useColors && mc)
cp = (unsigned char *)&mc[i * 4];
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+ /* no need to set shading mode to flat because
+ * normals are already used to change shading */
+ glShadeModel(GL_SMOOTH);
glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
if (!drawSmooth) {
@@ -1351,6 +1353,85 @@ static void cdDM_drawFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *at
dm->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
}
+static void cdDM_drawMappedFacesMat(DerivedMesh *dm,
+ void (*setMaterial)(void *userData, int, void *attribs),
+ int (*setFace)(void *userData, int index), void *userData)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ GPUVertexAttribs gattribs;
+ DMVertexAttribs attribs;
+ MVert *mvert = cddm->mvert;
+ MFace *mf = cddm->mface;
+ float (*nors)[3] = dm->getFaceDataArray(dm, CD_NORMAL);
+ int a, matnr, new_matnr;
+ int orig, *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
+
+ cdDM_update_normals_from_pbvh(dm);
+
+ matnr = -1;
+
+ glShadeModel(GL_SMOOTH);
+
+ memset(&attribs, 0, sizeof(attribs));
+
+ glBegin(GL_QUADS);
+
+ for(a = 0; a < dm->numFaceData; a++, mf++) {
+ const int smoothnormal = (mf->flag & ME_SMOOTH);
+
+ /* material */
+ new_matnr = mf->mat_nr + 1;
+
+ if(new_matnr != matnr) {
+ glEnd();
+
+ setMaterial(userData, matnr = new_matnr, &gattribs);
+ DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
+
+ glBegin(GL_QUADS);
+ }
+
+ /* skipping faces */
+ if(setFace) {
+ orig = (index)? index[a]: a;
+
+ if(orig != ORIGINDEX_NONE && !setFace(userData, orig))
+ continue;
+ }
+
+ /* smooth normal */
+ if(!smoothnormal) {
+ if(nors) {
+ glNormal3fv(nors[a]);
+ }
+ else {
+ /* TODO ideally a normal layer should always be available */
+ float nor[3];
+
+ if(mf->v4)
+ normal_quad_v3( nor,mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co);
+ else
+ normal_tri_v3( nor,mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co);
+
+ glNormal3fv(nor);
+ }
+ }
+
+ /* vertices */
+ cddm_draw_attrib_vertex(&attribs, mvert, a, mf->v1, 0, smoothnormal);
+ cddm_draw_attrib_vertex(&attribs, mvert, a, mf->v2, 1, smoothnormal);
+ cddm_draw_attrib_vertex(&attribs, mvert, a, mf->v3, 2, smoothnormal);
+
+ if(mf->v4)
+ cddm_draw_attrib_vertex(&attribs, mvert, a, mf->v4, 3, smoothnormal);
+ else
+ cddm_draw_attrib_vertex(&attribs, mvert, a, mf->v3, 2, smoothnormal);
+ }
+ glEnd();
+
+ glShadeModel(GL_FLAT);
+}
+
static void cdDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
@@ -1521,6 +1602,7 @@ static CDDerivedMesh *cdDM_create(const char *desc)
dm->drawMappedFaces = cdDM_drawMappedFaces;
dm->drawMappedFacesTex = cdDM_drawMappedFacesTex;
dm->drawMappedFacesGLSL = cdDM_drawMappedFacesGLSL;
+ dm->drawMappedFacesMat = cdDM_drawMappedFacesMat;
dm->foreachMappedVert = cdDM_foreachMappedVert;
dm->foreachMappedEdge = cdDM_foreachMappedEdge;
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index ae6a6ec012a..4d5dce14b27 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -60,9 +60,9 @@ double tval( void )
}
#else
#include <sys/time.h>
- static struct timeval _tstart, _tend;
- static struct timezone tz;
- void tstart ( void )
+static struct timeval _tstart, _tend;
+static struct timezone tz;
+void tstart ( void )
{
gettimeofday ( &_tstart, &tz );
}
@@ -1093,7 +1093,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
cloth->verts[spring->kl].spring_count++;
spring->type = CLOTH_SPRING_TYPE_STRUCTURAL;
spring->flags = 0;
- spring->stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0;
+ spring->stiffness = (cloth->verts[spring->kl].struct_stiff + cloth->verts[spring->ij].struct_stiff) / 2.0f;
struct_springs++;
BLI_linklist_prepend ( &cloth->springs, spring );
@@ -1110,7 +1110,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
for(i = 0; i < numverts; i++)
{
- cloth->verts[i].avg_spring_len = cloth->verts[i].avg_spring_len * 0.49 / ((float)cloth->verts[i].spring_count);
+ cloth->verts[i].avg_spring_len = cloth->verts[i].avg_spring_len * 0.49f / ((float)cloth->verts[i].spring_count);
}
// shear springs
@@ -1132,7 +1132,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
spring->kl = MAX2(mface[i].v3, mface[i].v1);
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest);
spring->type = CLOTH_SPRING_TYPE_SHEAR;
- spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0;
+ spring->stiffness = (cloth->verts[spring->kl].shear_stiff + cloth->verts[spring->ij].shear_stiff) / 2.0f;
BLI_linklist_append ( &edgelist[spring->ij], spring );
BLI_linklist_append ( &edgelist[spring->kl], spring );
@@ -1195,7 +1195,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
spring->kl = MAX2(tspring2->ij, index2);
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest);
spring->type = CLOTH_SPRING_TYPE_BENDING;
- spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0;
+ spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
BLI_edgehash_insert ( edgehash, spring->ij, spring->kl, NULL );
bend_springs++;
@@ -1234,7 +1234,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
spring->kl = tspring->kl;
spring->restlen = len_v3v3(cloth->verts[spring->kl].xrest, cloth->verts[spring->ij].xrest);
spring->type = CLOTH_SPRING_TYPE_BENDING;
- spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0;
+ spring->stiffness = (cloth->verts[spring->kl].bend_stiff + cloth->verts[spring->ij].bend_stiff) / 2.0f;
bend_springs++;
BLI_linklist_prepend ( &cloth->springs, spring );
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 09030575438..456c0c9fe3b 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -464,7 +464,7 @@ static void collision_compute_barycentric ( float pv[3], float p1[3], float p2[3
d = ( a * c - b * b );
- if ( ABS ( d ) < ALMOST_ZERO )
+ if ( ABS ( d ) < (double)ALMOST_ZERO )
{
*w1 = *w2 = *w3 = 1.0 / 3.0;
return;
@@ -554,14 +554,14 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
// Decrease in magnitude of relative tangential velocity due to coulomb friction
// in original formula "magrelVel" should be the "change of relative velocity in normal direction"
- magtangent = MIN2 ( clmd->coll_parms->friction * 0.01 * magrelVel,sqrt ( INPR ( vrel_t_pre,vrel_t_pre ) ) );
+ magtangent = MIN2 ( clmd->coll_parms->friction * 0.01f * magrelVel, sqrtf( INPR ( vrel_t_pre,vrel_t_pre ) ) );
// Apply friction impulse.
if ( magtangent > ALMOST_ZERO )
{
normalize_v3( vrel_t_pre );
- impulse = magtangent / ( 1.0 + w1*w1 + w2*w2 + w3*w3 ); // 2.0 *
+ impulse = magtangent / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); // 2.0 *
VECADDMUL ( cloth1->verts[collpair->ap1].impulse, vrel_t_pre, w1 * impulse );
VECADDMUL ( cloth1->verts[collpair->ap2].impulse, vrel_t_pre, w2 * impulse );
VECADDMUL ( cloth1->verts[collpair->ap3].impulse, vrel_t_pre, w3 * impulse );
@@ -585,17 +585,17 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
// I_r = -min(dt*kd, m(0,1d/dt - v_n))
spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale;
- d = clmd->coll_parms->epsilon*8.0/9.0 + epsilon2*8.0/9.0 - collpair->distance;
- if ( ( magrelVel < 0.1*d*spf ) && ( d > ALMOST_ZERO ) )
+ d = clmd->coll_parms->epsilon*8.0f/9.0f + epsilon2*8.0f/9.0f - collpair->distance;
+ if ( ( magrelVel < 0.1f*d*spf ) && ( d > ALMOST_ZERO ) )
{
- repulse = MIN2 ( d*1.0/spf, 0.1*d*spf - magrelVel );
+ repulse = MIN2 ( d*1.0f/spf, 0.1f*d*spf - magrelVel );
// stay on the safe side and clamp repulse
if ( impulse > ALMOST_ZERO )
repulse = MIN2 ( repulse, 5.0*impulse );
repulse = MAX2 ( impulse, repulse );
- impulse = repulse / ( 1.0 + w1*w1 + w2*w2 + w3*w3 ); // original 2.0 / 0.25
+ impulse = repulse / ( 1.0f + w1*w1 + w2*w2 + w3*w3 ); // original 2.0 / 0.25
VECADDMUL ( cloth1->verts[collpair->ap1].impulse, collpair->normal, impulse );
VECADDMUL ( cloth1->verts[collpair->ap2].impulse, collpair->normal, impulse );
VECADDMUL ( cloth1->verts[collpair->ap3].impulse, collpair->normal, impulse );
@@ -1492,8 +1492,8 @@ static CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2,
collmd->current_xnew[collpair->bp2].co,
collmd->current_xnew[collpair->bp3].co, &l, 0))
{
- if (l >= 0.0 && l < sdis) {
- mul_v3_fl(n2, (l-sdis)*cloth->verts[collpair->ap1].mass*dt*clmd->coll_parms->repel_force*0.1);
+ if (l >= 0.0f && l < sdis) {
+ mul_v3_fl(n2, (l-sdis)*cloth->verts[collpair->ap1].mass*dt*clmd->coll_parms->repel_force*0.1f);
add_v3_v3(cloth->verts[collpair->ap1].tv, n2);
add_v3_v3(cloth->verts[collpair->ap2].tv, n2);
@@ -1507,7 +1507,7 @@ static CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2,
verts1[collpair->ap1].txold, verts1[collpair->ap2].txold, verts1[collpair->ap3].txold, collmd->current_x[collpair->bp1].co, collmd->current_x[collpair->bp2].co, collmd->current_x[collpair->bp3].co, collpair->pa,collpair->pb,collpair->vector );
#else
// just be sure that we don't add anything
- distance = 2.0 * ( epsilon1 + epsilon2 + ALMOST_ZERO );
+ distance = 2.0 * (double)( epsilon1 + epsilon2 + ALMOST_ZERO );
#endif
if ( distance <= ( epsilon1 + epsilon2 + ALMOST_ZERO ) )
@@ -2534,7 +2534,7 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
}
else
{
- mul_v3_fl( temp, -correction*0.5 );
+ mul_v3_fl( temp, correction * -0.5 );
VECADD ( verts[j].tx, verts[j].tx, temp );
VECSUB ( verts[i].tx, verts[i].tx, temp );
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 160f5703a01..8a6e8faf29a 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -67,8 +67,8 @@
/* local */
static int cu_isectLL(float *v1, float *v2, float *v3, float *v4,
- short cox, short coy,
- float *labda, float *mu, float *vec);
+ short cox, short coy,
+ float *labda, float *mu, float *vec);
void unlink_curve(Curve *cu)
{
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index f2f3ade52bb..d7cc5376e21 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -90,7 +90,7 @@ typedef struct LayerTypeInfo {
* count gives the number of elements in sources
*/
void (*interp)(void **sources, float *weights, float *sub_weights,
- int count, void *dest);
+ int count, void *dest);
/* a function to swap the data in corners of the element */
void (*swap)(void *data, const int *corner_indices);
@@ -2350,6 +2350,25 @@ void CustomData_set_layer_unique_name(CustomData *data, int index)
BLI_uniquename_cb(customdata_unique_check, &data_arg, typeInfo->defaultname, '.', nlayer->name, sizeof(nlayer->name));
}
+void CustomData_validate_layer_name(const CustomData *data, int type, char *name, char *outname)
+{
+ int index = -1;
+
+ /* if a layer name was given, try to find that layer */
+ if(name[0])
+ index = CustomData_get_named_layer_index(data, type, name);
+
+ if(index < 0) {
+ /* either no layer was specified, or the layer we want has been
+ * deleted, so assign the active layer to name
+ */
+ index = CustomData_get_active_layer_index(data, type);
+ strcpy(outname, data->layers[index].name);
+ }
+ else
+ strcpy(outname, name);
+}
+
int CustomData_verify_versions(struct CustomData *data, int index)
{
const LayerTypeInfo *typeInfo;
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 7f099c03d09..b1e39b1d768 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1148,8 +1148,8 @@ void graph_bfs(void)
set_node_xy(node, node->BFS_dist*DEPSX*2, pos[node->BFS_dist]*DEPSY*2);
node->color = DAG_BLACK;
/*
- fprintf(stderr,"BFS node : %20s %i %5.0f %5.0f\n",((ID *) node->ob)->name,node->BFS_dist, node->x, node->y);
- */
+ fprintf(stderr,"BFS node : %20s %i %5.0f %5.0f\n",((ID *) node->ob)->name,node->BFS_dist, node->x, node->y);
+ */
}
}
queue_delete(nqueue);
@@ -1208,8 +1208,8 @@ int pre_and_post_source_BFS(DagForest *dag, short mask, DagNode *source, graph_a
post_func(node->ob,data);
node->color = DAG_BLACK;
/*
- fprintf(stderr,"BFS node : %20s %i %5.0f %5.0f\n",((ID *) node->ob)->name,node->BFS_dist, node->x, node->y);
- */
+ fprintf(stderr,"BFS node : %20s %i %5.0f %5.0f\n",((ID *) node->ob)->name,node->BFS_dist, node->x, node->y);
+ */
}
}
queue_delete(nqueue);
@@ -1325,7 +1325,7 @@ DagNodeQueue * graph_dfs(void)
set_node_xy(node, node->DFS_dist*DEPSX*2, pos[node->DFS_dist]*DEPSY*2);
/*
- fprintf(stderr,"DFS node : %20s %i %i %i %i\n",((ID *) node->ob)->name,node->BFS_dist, node->DFS_dist, node->DFS_dvtm, node->DFS_fntm );
+ fprintf(stderr,"DFS node : %20s %i %i %i %i\n",((ID *) node->ob)->name,node->BFS_dist, node->DFS_dist, node->DFS_dvtm, node->DFS_fntm );
*/
push_stack(retqueue,node);
@@ -1574,7 +1574,7 @@ int is_acyclic( DagForest *dag) {
void set_node_xy(DagNode *node, float x, float y)
{
- node->x = x;
+ node->x = x;
node->y = y;
}
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
new file mode 100644
index 00000000000..40421c25607
--- /dev/null
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -0,0 +1,4908 @@
+/**
+***** 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 *****
+ */
+
+
+#include "MEM_guardedalloc.h"
+
+#include <math.h>
+#include <stdio.h>
+
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_kdtree.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_dynamicpaint_types.h"
+#include "DNA_group_types.h" /*GroupObject*/
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+#include "DNA_texture_types.h"
+
+#include "BKE_animsys.h"
+#include "BKE_bvhutils.h" /* bvh tree */
+#include "BKE_blender.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_context.h"
+#include "BKE_customdata.h"
+#include "BKE_colortools.h"
+#include "BKE_deform.h"
+#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_dynamicpaint.h"
+#include "BKE_effect.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_modifier.h"
+#include "BKE_object.h"
+#include "BKE_particle.h"
+#include "BKE_pointcache.h"
+#include "BKE_scene.h"
+#include "BKE_texture.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+/* for image output */
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+
+/* to read material/texture color */
+#include "RE_render_ext.h"
+#include "RE_shader_ext.h"
+
+#ifdef _OPENMP
+#include <omp.h>
+#endif
+
+/* precalculated gaussian factors for 5x super sampling */
+static float gaussianFactors[5] = { 0.996849f,
+ 0.596145f,
+ 0.596145f,
+ 0.596145f,
+ 0.524141f};
+static float gaussianTotal = 3.309425f;
+
+/* UV Image neighbouring pixel table x and y list */
+static int neighX[8] = {1,1,0,-1,-1,-1, 0, 1};
+static int neighY[8] = {0,1,1, 1, 0,-1,-1,-1};
+
+/* subframe_updateObject() flags */
+#define UPDATE_PARENTS (1<<0)
+#define UPDATE_MESH (1<<1)
+#define UPDATE_EVERYTHING (UPDATE_PARENTS|UPDATE_MESH)
+/* surface_getBrushFlags() return vals */
+#define BRUSH_USES_VELOCITY (1<<0)
+/* brush mesh raycast status */
+#define HIT_VOLUME 1
+#define HIT_PROXIMITY 2
+/* paint effect default movement per frame in global units */
+#define EFF_MOVEMENT_PER_FRAME 0.05f
+/* initial wave time factor */
+#define WAVE_TIME_FAC 0.1
+/* drying limits */
+#define MIN_WETNESS 0.001f
+/* dissolve macro */
+#define VALUE_DISSOLVE(VALUE, TIME, SCALE, LOG) (VALUE) = (LOG) ? (VALUE) * (pow(MIN_WETNESS,1.0f/(1.2f*((float)(TIME))/(SCALE)))) : (VALUE) - 1.0f/(TIME)*(SCALE)
+
+/***************************** Internal Structs ***************************/
+
+typedef struct Bounds2D {
+ float min[2], max[2];
+} Bounds2D;
+
+typedef struct Bounds3D {
+ int valid;
+ float min[3], max[3];
+} Bounds3D;
+
+typedef struct VolumeGrid {
+ int dim[3];
+ Bounds3D grid_bounds; /* whole grid bounds */
+
+ Bounds3D *bounds; /* (x*y*z) precalculated grid cell bounds */
+ int *s_pos; /* (x*y*z) t_index begin id */
+ int *s_num; /* (x*y*z) number of t_index points */
+ int *t_index; /* actual surface point index,
+ access: (s_pos+s_num) */
+} VolumeGrid;
+
+typedef struct Vec3f {
+ float v[3];
+} Vec3f;
+
+typedef struct BakeNeighPoint {
+ float dir[3]; /* vector pointing towards this neighbour */
+ float dist; /* distance to */
+} BakeNeighPoint;
+
+/* Surface data used while processing a frame */
+typedef struct PaintBakeNormal {
+ float invNorm[3]; /* current pixel world-space inverted normal */
+ float normal_scale; /* normal directional scale for displace mapping */
+} PaintBakeNormal;
+
+/* Temp surface data used to process a frame */
+typedef struct PaintBakeData {
+ /* point space data */
+ PaintBakeNormal *bNormal;
+ int *s_pos; /* index to start reading point sample realCoord */
+ int *s_num; /* num of realCoord samples */
+ Vec3f *realCoord; /* current pixel center world-space coordinates for each sample
+ * ordered as (s_pos+s_num)*/
+
+ /* adjacency info */
+ BakeNeighPoint *bNeighs; /* current global neighbour distances and directions, if required */
+ double average_dist;
+ /* space partitioning */
+ VolumeGrid *grid; /* space partitioning grid to optimize brush checks */
+
+ /* velocity and movement */
+ Vec3f *velocity; /* speed vector in global space movement per frame, if required */
+ Vec3f *prev_velocity;
+ float *brush_velocity; /* special temp data for post-p velocity based brushes like smudge
+ * 3 float dir vec + 1 float str */
+ MVert *prev_verts; /* copy of previous frame vertices. used to observe surface movement */
+ float prev_obmat[4][4]; /* previous frame object matrix */
+ int clear; /* flag to check if surface was cleared/reset -> have to redo velocity etc. */
+
+} PaintBakeData;
+
+/* UV Image sequence format point */
+typedef struct PaintUVPoint {
+ /* Pixel / mesh data */
+ unsigned int face_index, pixel_index; /* face index on domain derived mesh */
+ unsigned int v1, v2, v3; /* vertex indexes */
+
+ unsigned int neighbour_pixel; /* If this pixel isn't uv mapped to any face,
+ but it's neighbouring pixel is */
+ short quad;
+} PaintUVPoint;
+
+typedef struct ImgSeqFormatData {
+ PaintUVPoint *uv_p;
+ Vec3f *barycentricWeights; /* b-weights for all pixel samples */
+} ImgSeqFormatData;
+
+typedef struct EffVelPoint {
+ float previous_pos[3];
+ float previous_vel[3];
+} EffVelPoint;
+
+
+/* adjacency data flags */
+#define ADJ_ON_MESH_EDGE (1<<0)
+
+typedef struct PaintAdjData {
+ int *n_target; /* array of neighbouring point indexes,
+ for single sample use (n_index+neigh_num) */
+ int *n_index; /* index to start reading n_target for each point */
+ int *n_num; /* num of neighs for each point */
+ int *flags; /* vertex adjacency flags */
+ int total_targets; /* size of n_target */
+} PaintAdjData;
+
+/***************************** General Utils ******************************/
+
+/* Set canvas error string to display at the bake report */
+static int setError(DynamicPaintCanvasSettings *canvas, const char *string)
+{
+ /* Add error to canvas ui info label */
+ BLI_snprintf(canvas->error, sizeof(canvas->error), string);
+ return 0;
+}
+
+/* Get number of surface points for cached types */
+static int dynamicPaint_surfaceNumOfPoints(DynamicPaintSurface *surface)
+{
+ if (surface->format == MOD_DPAINT_SURFACE_F_PTEX) {
+ return 0; /* not supported atm */
+ }
+ else if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ if (!surface->canvas->dm) return 0; /* invalid derived mesh */
+ return surface->canvas->dm->getNumVerts(surface->canvas->dm);
+ }
+ else
+ return 0;
+}
+
+/* checks whether surface's format/type has realtime preview */
+int dynamicPaint_surfaceHasColorPreview(DynamicPaintSurface *surface)
+{
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) return 0;
+ else if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
+ surface->type == MOD_DPAINT_SURFACE_T_WAVE) return 0;
+ else return 1;
+ }
+ else return 1;
+}
+
+/* get currently active surface (in user interface) */
+struct DynamicPaintSurface *get_activeSurface(DynamicPaintCanvasSettings *canvas)
+{
+ DynamicPaintSurface *surface = canvas->surfaces.first;
+ int i;
+
+ for(i=0; surface; surface=surface->next) {
+ if(i == canvas->active_sur)
+ return surface;
+ i++;
+ }
+ return NULL;
+}
+
+/* set preview to first previewable surface */
+void dynamicPaint_resetPreview(DynamicPaintCanvasSettings *canvas)
+{
+ DynamicPaintSurface *surface = canvas->surfaces.first;
+ int done=0;
+
+ for(; surface; surface=surface->next) {
+ if (!done && dynamicPaint_surfaceHasColorPreview(surface)) {
+ surface->flags |= MOD_DPAINT_PREVIEW;
+ done=1;
+ }
+ else
+ surface->flags &= ~MOD_DPAINT_PREVIEW;
+ }
+}
+
+/* set preview to defined surface */
+static void dynamicPaint_setPreview(DynamicPaintSurface *t_surface)
+{
+ DynamicPaintSurface *surface = t_surface->canvas->surfaces.first;
+ for(; surface; surface=surface->next) {
+ if (surface == t_surface)
+ surface->flags |= MOD_DPAINT_PREVIEW;
+ else
+ surface->flags &= ~MOD_DPAINT_PREVIEW;
+ }
+}
+
+int dynamicPaint_outputLayerExists(struct DynamicPaintSurface *surface, Object *ob, int index)
+{
+ char *name;
+
+ if (index == 0)
+ name = surface->output_name;
+ else if (index == 1)
+ name = surface->output_name2;
+ else
+ return 0;
+
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ Mesh *me = ob->data;
+ return (CustomData_get_named_layer_index(&me->fdata, CD_MCOL, name) != -1);
+ }
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT)
+ return (defgroup_name_index(ob, surface->output_name) != -1);
+ }
+
+ return 0;
+}
+
+static int surface_duplicateOutputExists(void *arg, const char *name)
+{
+ DynamicPaintSurface *t_surface = (DynamicPaintSurface*)arg;
+ DynamicPaintSurface *surface = t_surface->canvas->surfaces.first;
+
+ for(; surface; surface=surface->next) {
+ if (surface!=t_surface && surface->type==t_surface->type &&
+ surface->format==t_surface->format) {
+ if (surface->output_name[0]!='\0' && !strcmp(name, surface->output_name)) return 1;
+ if (surface->output_name2[0]!='\0' && !strcmp(name, surface->output_name2)) return 1;
+ }
+ }
+ return 0;
+}
+
+void surface_setUniqueOutputName(DynamicPaintSurface *surface, char *basename, int output)
+{
+ char name[64];
+ BLI_strncpy(name, basename, sizeof(name)); /* in case basename is surface->name use a copy */
+ if (!output)
+ BLI_uniquename_cb(surface_duplicateOutputExists, surface, name, '.', surface->output_name, sizeof(surface->output_name));
+ if (output)
+ BLI_uniquename_cb(surface_duplicateOutputExists, surface, name, '.', surface->output_name2, sizeof(surface->output_name2));
+}
+
+
+static int surface_duplicateNameExists(void *arg, const char *name)
+{
+ DynamicPaintSurface *t_surface = (DynamicPaintSurface*)arg;
+ DynamicPaintSurface *surface = t_surface->canvas->surfaces.first;
+
+ for(; surface; surface=surface->next) {
+ if (surface!=t_surface && !strcmp(name, surface->name)) return 1;
+ }
+ return 0;
+}
+
+void dynamicPaintSurface_setUniqueName(DynamicPaintSurface *surface, const char *basename)
+{
+ char name[64];
+ BLI_strncpy(name, basename, sizeof(name)); /* in case basename is surface->name use a copy */
+ BLI_uniquename_cb(surface_duplicateNameExists, surface, name, '.', surface->name, sizeof(surface->name));
+}
+
+
+/* change surface data to defaults on new type */
+void dynamicPaintSurface_updateType(struct DynamicPaintSurface *surface)
+{
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+ surface->output_name[0]='\0';
+ surface->output_name2[0]='\0';
+ surface->flags |= MOD_DPAINT_ANTIALIAS;
+ surface->depth_clamp = 1.0f;
+ }
+ else {
+ sprintf(surface->output_name, "dp_");
+ strcpy(surface->output_name2,surface->output_name);
+ surface->flags &= ~MOD_DPAINT_ANTIALIAS;
+ surface->depth_clamp = 0.0f;
+ }
+
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ strcat(surface->output_name,"paintmap");
+ strcat(surface->output_name2,"wetmap");
+ surface_setUniqueOutputName(surface, surface->output_name2, 1);
+ }
+ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) {
+ strcat(surface->output_name,"displace");
+ }
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
+ strcat(surface->output_name,"weight");
+ }
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ strcat(surface->output_name,"wave");
+ }
+
+ surface_setUniqueOutputName(surface, surface->output_name, 0);
+
+ /* update preview */
+ if (dynamicPaint_surfaceHasColorPreview(surface))
+ dynamicPaint_setPreview(surface);
+ else
+ dynamicPaint_resetPreview(surface->canvas);
+}
+
+static int surface_totalSamples(DynamicPaintSurface *surface)
+{
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ &&
+ surface->flags & MOD_DPAINT_ANTIALIAS)
+ return (surface->data->total_points*5);
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX &&
+ surface->flags & MOD_DPAINT_ANTIALIAS && surface->data->adj_data)
+ return (surface->data->total_points+surface->data->adj_data->total_targets);
+
+ return surface->data->total_points;
+}
+
+static void blendColors(float t_color[3], float t_alpha, float s_color[3], float s_alpha, float result[4])
+{
+ int i;
+ float i_alpha = 1.0f - s_alpha;
+ float f_alpha = t_alpha*i_alpha + s_alpha;
+
+ /* blend colors */
+ if (f_alpha) {
+ for (i=0; i<3; i++) {
+ result[i] = (t_color[i]*t_alpha*i_alpha + s_color[i]*s_alpha)/f_alpha;
+ }
+ }
+ else {
+ copy_v3_v3(result, t_color);
+ }
+ /* return final alpha */
+ result[3] = f_alpha;
+}
+
+/* assumes source alpha > 0.0f or results NaN colors */
+static void mixColors(float *t_color, float t_alpha, float *s_color, float s_alpha)
+{
+ float factor = (s_alpha<t_alpha) ? 1.0f : t_alpha/s_alpha;
+
+ /* set initial color depending on existing alpha */
+ interp_v3_v3v3(t_color, s_color, t_color, factor);
+ /* mix final color */
+ interp_v3_v3v3(t_color, t_color, s_color, s_alpha);
+}
+
+/* set "ignore cache" flag for all caches on this object */
+static void object_cacheIgnoreClear(Object *ob, int state)
+{
+ ListBase pidlist;
+ PTCacheID *pid;
+ BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
+
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ if(pid->cache) {
+ if (state)
+ pid->cache->flag |= PTCACHE_IGNORE_CLEAR;
+ else
+ pid->cache->flag &= ~PTCACHE_IGNORE_CLEAR;
+ }
+ }
+
+ BLI_freelistN(&pidlist);
+}
+
+static void subframe_updateObject(Scene *scene, Object *ob, int flags, float frame)
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
+
+ /* 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);
+
+ /* for curve following objects, parented curve has to be updated too */
+ if(ob->type==OB_CURVE) {
+ Curve *cu= ob->data;
+ BKE_animsys_evaluate_animdata(scene, &cu->id, cu->adt, frame, ADT_RECALC_ANIM);
+ }
+
+ ob->recalc |= OB_RECALC_ALL;
+ BKE_animsys_evaluate_animdata(scene, &ob->id, ob->adt, frame, ADT_RECALC_ANIM);
+ if (flags & UPDATE_MESH) {
+ /* ignore cache clear during subframe updates
+ * to not mess up cache validity */
+ object_cacheIgnoreClear(ob, 1);
+ object_handle_update(scene, ob);
+ object_cacheIgnoreClear(ob, 0);
+ }
+ else
+ where_is_object_time(scene, ob, frame);
+}
+
+static void scene_setSubframe(Scene *scene, float subframe)
+{
+ /* dynamic paint subframes must be done on previous frame */
+ scene->r.cfra -= 1;
+ scene->r.subframe = subframe;
+}
+
+#define BRUSH_USES_VELOCITY (1<<0)
+
+static int surface_getBrushFlags(DynamicPaintSurface *surface, Scene *scene)
+{
+ Base *base = NULL;
+ GroupObject *go = NULL;
+ Object *brushObj = NULL;
+ ModifierData *md = NULL;
+
+ int flags = 0;
+
+ if(surface->brush_group)
+ go = surface->brush_group->gobject.first;
+ else
+ base = scene->base.first;
+
+ while (base || go)
+ {
+ brushObj = NULL;
+
+ /* select object */
+ if(surface->brush_group) {
+ if(go->ob) brushObj = go->ob;
+ }
+ else
+ brushObj = base->object;
+
+ if(!brushObj)
+ {
+ if(surface->brush_group) go = go->next;
+ else base= base->next;
+ continue;
+ }
+
+ if(surface->brush_group)
+ go = go->next;
+ else
+ base= base->next;
+
+ md = modifiers_findByType(brushObj, eModifierType_DynamicPaint);
+ if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render))
+ {
+ DynamicPaintModifierData *pmd2 = (DynamicPaintModifierData *)md;
+
+ if (pmd2->brush)
+ {
+ DynamicPaintBrushSettings *brush = pmd2->brush;
+
+ if (brush->flags & MOD_DPAINT_USES_VELOCITY)
+ flags |= BRUSH_USES_VELOCITY;
+ }
+ }
+ }
+
+ return flags;
+}
+
+static int brush_usesMaterial(DynamicPaintBrushSettings *brush, Scene *scene)
+{
+ return ((brush->flags & MOD_DPAINT_USE_MATERIAL) && (!strcmp(scene->r.engine, "BLENDER_RENDER")));
+}
+
+/* check whether two bounds intersect */
+static int boundsIntersect(Bounds3D *b1, Bounds3D *b2)
+{
+ int i=2;
+ if (!b1->valid || !b2->valid) return 0;
+ for (; i>=0; i-=1)
+ if (!(b1->min[i] <= b2->max[i] && b1->max[i] >= b2->min[i])) return 0;
+ return 1;
+}
+
+/* check whether two bounds intersect inside defined proximity */
+static int boundsIntersectDist(Bounds3D *b1, Bounds3D *b2, float dist)
+{
+ int i=2;
+ if (!b1->valid || !b2->valid) return 0;
+ for (; i>=0; i-=1)
+ if (!(b1->min[i] <= (b2->max[i]+dist) && b1->max[i] >= (b2->min[i]-dist))) return 0;
+ return 1;
+}
+
+/* check whether bounds intersects a point with given radius */
+static int boundIntersectPoint(Bounds3D *b, float point[3], float radius)
+{
+ int i=2;
+ if (!b->valid) return 0;
+ for (; i>=0; i-=1)
+ if (!(b->min[i] <= (point[i]+radius) && b->max[i] >= (point[i]-radius))) return 0;
+ return 1;
+}
+
+/* expand bounds by a new point */
+static void boundInsert(Bounds3D *b, float point[3])
+{
+ int i=2;
+ if (!b->valid) {
+ copy_v3_v3(b->min, point);
+ copy_v3_v3(b->max, point);
+ b->valid = 1;
+ }
+ else {
+ for (; i>=0; i-=1) {
+ if (point[i] < b->min[i]) b->min[i]=point[i];
+ if (point[i] > b->max[i]) b->max[i]=point[i];
+ }
+ }
+}
+
+static void freeGrid(PaintSurfaceData *data)
+{
+ PaintBakeData *bData = data->bData;
+ VolumeGrid *grid = bData->grid;
+
+ if (grid->bounds) MEM_freeN(grid->bounds);
+ if (grid->s_pos) MEM_freeN(grid->s_pos);
+ if (grid->s_num) MEM_freeN(grid->s_num);
+ if (grid->t_index) MEM_freeN(grid->t_index);
+
+ MEM_freeN(bData->grid);
+ bData->grid = NULL;
+}
+
+static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ Bounds3D *grid_bounds;
+ VolumeGrid *grid;
+ int grid_cells, axis = 3;
+ int *temp_t_index = NULL;
+ int *temp_s_num = NULL;
+
+#ifdef _OPENMP
+ int num_of_threads = omp_get_max_threads();
+#else
+ int num_of_threads = 1;
+#endif
+
+ if (bData->grid)
+ freeGrid(sData);
+
+ /* allocate separate bounds for each thread */
+ grid_bounds = MEM_callocN(sizeof(Bounds3D)*num_of_threads, "Grid Bounds");
+ bData->grid = MEM_callocN(sizeof(VolumeGrid), "Surface Grid");
+ grid = bData->grid;
+
+ if (grid && grid_bounds) {
+ int i, error = 0;
+ float dim_factor, volume, dim[3];
+ float td[3];
+ float min_dim;
+
+ /* calculate canvas dimensions */
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ #ifdef _OPENMP
+ int id = omp_get_thread_num();
+ boundInsert(&grid_bounds[id], (bData->realCoord[bData->s_pos[i]].v));
+ #else
+ boundInsert(&grid_bounds[0], (bData->realCoord[bData->s_pos[i]].v));
+ #endif
+ }
+
+ /* get final dimensions */
+ for (i=0; i<num_of_threads; i++) {
+ boundInsert(&grid->grid_bounds, grid_bounds[i].min);
+ boundInsert(&grid->grid_bounds, grid_bounds[i].max);
+ }
+
+ /* get dimensions */
+ sub_v3_v3v3(dim, grid->grid_bounds.max, grid->grid_bounds.min);
+ copy_v3_v3(td, dim);
+ min_dim = MAX3(td[0],td[1],td[2]) / 1000.f;
+
+ /* deactivate zero axises */
+ for (i=0; i<3; i++) {
+ if (td[i]<min_dim) {td[i]=1.0f; axis-=1;}
+ }
+
+ if (axis == 0 || MAX3(td[0],td[1],td[2]) < 0.0001f) {
+ MEM_freeN(grid_bounds);
+ MEM_freeN(bData->grid);
+ bData->grid = NULL;
+ return;
+ }
+
+ /* now calculate grid volume/area/width depending on num of active axis */
+ volume = td[0]*td[1]*td[2];
+
+ /* determine final grid size by trying to fit average 10.000 points per grid cell */
+ dim_factor = (float)pow(volume / ((double)sData->total_points / 10000.0), 1.0/(double)axis);
+
+ /* define final grid size using dim_factor, use min 3 for active axises */
+ for (i=0; i<3; i++) {
+ grid->dim[i] = (int)floor(td[i] / dim_factor);
+ CLAMP(grid->dim[i], (dim[i]>=min_dim) ? 3 : 1, 100);
+ }
+ grid_cells = grid->dim[0]*grid->dim[1]*grid->dim[2];
+
+ /* allocate memory for grids */
+ grid->bounds = MEM_callocN(sizeof(Bounds3D) * grid_cells, "Surface Grid Bounds");
+ grid->s_pos = MEM_callocN(sizeof(int) * grid_cells, "Surface Grid Position");
+ grid->s_num = MEM_callocN(sizeof(int) * grid_cells*num_of_threads, "Surface Grid Points");
+ temp_s_num = MEM_callocN(sizeof(int) * grid_cells, "Temp Surface Grid Points");
+ grid->t_index = MEM_callocN(sizeof(int) * sData->total_points, "Surface Grid Target Ids");
+ temp_t_index = MEM_callocN(sizeof(int) * sData->total_points, "Temp Surface Grid Target Ids");
+
+ /* in case of an allocation failture abort here */
+ if (!grid->bounds || !grid->s_pos || !grid->s_num || !grid->t_index || !temp_s_num || !temp_t_index)
+ error = 1;
+
+ if (!error) {
+ /* calculate number of points withing each cell */
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ int co[3], j;
+ for (j=0; j<3; j++) {
+ co[j] = (int)floor((bData->realCoord[bData->s_pos[i]].v[j] - grid->grid_bounds.min[j])/dim[j]*grid->dim[j]);
+ CLAMP(co[j], 0, grid->dim[j]-1);
+ }
+
+ temp_t_index[i] = co[0] + co[1] * grid->dim[0] + co[2] * grid->dim[0]*grid->dim[1];
+ #ifdef _OPENMP
+ grid->s_num[temp_t_index[i]+omp_get_thread_num()*grid_cells]++;
+ #else
+ grid->s_num[temp_t_index[i]]++;
+ #endif
+ }
+
+ /* for first cell only calc s_num */
+ for (i=1; i<num_of_threads; i++) {
+ grid->s_num[0] += grid->s_num[i*grid_cells];
+ }
+
+ /* calculate grid indexes */
+ for (i=1; i<grid_cells; i++) {
+ int id;
+ for (id=1; id<num_of_threads; id++) {
+ grid->s_num[i] += grid->s_num[i+id*grid_cells];
+ }
+ grid->s_pos[i] = grid->s_pos[i-1] + grid->s_num[i-1];
+ }
+
+ /* save point indexes to final array */
+ for (i=0; i<sData->total_points; i++) {
+ int pos = grid->s_pos[temp_t_index[i]] + temp_s_num[temp_t_index[i]];
+ grid->t_index[pos] = i;
+
+ temp_s_num[temp_t_index[i]]++;
+ }
+
+ /* calculate cell bounds */
+ {
+ int x;
+ #pragma omp parallel for schedule(static)
+ for (x=0; x<grid->dim[0]; x++) {
+ int y;
+ for (y=0; y<grid->dim[1]; y++) {
+ int z;
+ for (z=0; z<grid->dim[2]; z++) {
+ int j, b_index = x + y * grid->dim[0] + z * grid->dim[0]*grid->dim[1];
+ /* set bounds */
+ for (j=0; j<3; j++) {
+ int s = (j==0) ? x : ((j==1) ? y : z);
+ grid->bounds[b_index].min[j] = grid->grid_bounds.min[j] + dim[j]/grid->dim[j]*s;
+ grid->bounds[b_index].max[j] = grid->grid_bounds.min[j] + dim[j]/grid->dim[j]*(s+1);
+ }
+ grid->bounds[b_index].valid = 1;
+ }
+ }
+ }
+ }
+ }
+
+ if (temp_s_num) MEM_freeN(temp_s_num);
+ if (temp_t_index) MEM_freeN(temp_t_index);
+
+ /* free per thread s_num values */
+ grid->s_num = MEM_reallocN(grid->s_num, sizeof(int) * grid_cells);
+
+ if (error || !grid->s_num) {
+ setError(surface->canvas, "Not enough free memory.");
+ freeGrid(sData);
+ }
+ }
+
+ if (grid_bounds) MEM_freeN(grid_bounds);
+}
+
+/***************************** Freeing data ******************************/
+
+/* Free brush data */
+void dynamicPaint_freeBrush(struct DynamicPaintModifierData *pmd)
+{
+ if(pmd->brush) {
+ if(pmd->brush->dm)
+ pmd->brush->dm->release(pmd->brush->dm);
+ pmd->brush->dm = NULL;
+
+ if(pmd->brush->paint_ramp)
+ MEM_freeN(pmd->brush->paint_ramp);
+ pmd->brush->paint_ramp = NULL;
+ if(pmd->brush->vel_ramp)
+ MEM_freeN(pmd->brush->vel_ramp);
+ pmd->brush->vel_ramp = NULL;
+
+ MEM_freeN(pmd->brush);
+ pmd->brush = NULL;
+ }
+}
+
+static void dynamicPaint_freeAdjData(PaintSurfaceData *data)
+{
+ if (data->adj_data) {
+ if (data->adj_data->n_index) MEM_freeN(data->adj_data->n_index);
+ if (data->adj_data->n_num) MEM_freeN(data->adj_data->n_num);
+ if (data->adj_data->n_target) MEM_freeN(data->adj_data->n_target);
+ if (data->adj_data->flags) MEM_freeN(data->adj_data->flags);
+ MEM_freeN(data->adj_data);
+ data->adj_data = NULL;
+ }
+}
+
+static void free_bakeData(PaintSurfaceData *data)
+{
+ PaintBakeData *bData = data->bData;
+ if (bData) {
+ if (bData->bNormal) MEM_freeN(bData->bNormal);
+ if (bData->s_pos) MEM_freeN(bData->s_pos);
+ if (bData->s_num) MEM_freeN(bData->s_num);
+ if (bData->realCoord) MEM_freeN(bData->realCoord);
+ if (bData->bNeighs) MEM_freeN(bData->bNeighs);
+ if (bData->grid) freeGrid(data);
+ if (bData->prev_verts) MEM_freeN(bData->prev_verts);
+ if (bData->velocity) MEM_freeN(bData->velocity);
+ if (bData->prev_velocity) MEM_freeN(bData->prev_velocity);
+
+ MEM_freeN(data->bData);
+ data->bData = NULL;
+ }
+}
+
+/* free surface data if it's not used anymore */
+void surface_freeUnusedData(DynamicPaintSurface *surface)
+{
+ if (!surface->data) return;
+
+ /* free bakedata if not active or surface is baked */
+ if (!(surface->flags & MOD_DPAINT_ACTIVE) ||
+ (surface->pointcache && surface->pointcache->flag & PTCACHE_BAKED))
+ free_bakeData(surface->data);
+}
+
+void dynamicPaint_freeSurfaceData(DynamicPaintSurface *surface)
+{
+ PaintSurfaceData *data = surface->data;
+ if (!data) return;
+ if (data->format_data) {
+ /* format specific free */
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+ ImgSeqFormatData *format_data = (ImgSeqFormatData*)data->format_data;
+ if (format_data->uv_p)
+ MEM_freeN(format_data->uv_p);
+ if (format_data->barycentricWeights)
+ MEM_freeN(format_data->barycentricWeights);
+ }
+ MEM_freeN(data->format_data);
+ }
+ /* type data */
+ if (data->type_data) MEM_freeN(data->type_data);
+ dynamicPaint_freeAdjData(data);
+ /* bake data */
+ free_bakeData(data);
+
+ MEM_freeN(surface->data);
+ surface->data = NULL;
+}
+
+void dynamicPaint_freeSurface(DynamicPaintSurface *surface)
+{
+ /* point cache */
+ BKE_ptcache_free_list(&(surface->ptcaches));
+ surface->pointcache = NULL;
+
+ if(surface->effector_weights)
+ MEM_freeN(surface->effector_weights);
+ surface->effector_weights = NULL;
+
+ BLI_remlink(&(surface->canvas->surfaces), surface);
+ dynamicPaint_freeSurfaceData(surface);
+ MEM_freeN(surface);
+}
+
+/* Free canvas data */
+void dynamicPaint_freeCanvas(DynamicPaintModifierData *pmd)
+{
+ if(pmd->canvas) {
+ /* Free surface data */
+ DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
+ DynamicPaintSurface *next_surface = NULL;
+
+ while (surface) {
+ next_surface = surface->next;
+ dynamicPaint_freeSurface(surface);
+ surface = next_surface;
+ }
+
+ /* free dm copy */
+ if (pmd->canvas->dm)
+ pmd->canvas->dm->release(pmd->canvas->dm);
+ pmd->canvas->dm = NULL;
+
+ MEM_freeN(pmd->canvas);
+ pmd->canvas = NULL;
+ }
+}
+
+/* Free whole dp modifier */
+void dynamicPaint_Modifier_free(struct DynamicPaintModifierData *pmd)
+{
+ if(pmd) {
+ dynamicPaint_freeCanvas(pmd);
+ dynamicPaint_freeBrush(pmd);
+ }
+}
+
+
+/***************************** Initialize and reset ******************************/
+
+/*
+* Creates a new surface and adds it to the list
+* If scene is null, frame range of 1-250 is used
+* A pointer to this surface is returned
+*/
+struct DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSettings *canvas, Scene *scene)
+{
+ DynamicPaintSurface *surface= MEM_callocN(sizeof(DynamicPaintSurface), "DynamicPaintSurface");
+ if (!surface) return NULL;
+
+ surface->canvas = canvas;
+ surface->format = MOD_DPAINT_SURFACE_F_VERTEX;
+ surface->type = MOD_DPAINT_SURFACE_T_PAINT;
+
+ /* cache */
+ surface->pointcache = BKE_ptcache_add(&(surface->ptcaches));
+ surface->pointcache->flag |= PTCACHE_DISK_CACHE;
+ surface->pointcache->step = 1;
+
+ /* Set initial values */
+ surface->flags = MOD_DPAINT_ANTIALIAS | MOD_DPAINT_MULALPHA | MOD_DPAINT_DRY_LOG | MOD_DPAINT_DISSOLVE_LOG |
+ MOD_DPAINT_ACTIVE | MOD_DPAINT_PREVIEW | MOD_DPAINT_OUT1;
+ surface->effect = 0;
+ surface->effect_ui = 1;
+
+ surface->diss_speed = 250;
+ surface->dry_speed = 500;
+ surface->depth_clamp = 0.0f;
+ surface->disp_factor = 1.0f;
+ surface->disp_type = MOD_DPAINT_DISP_DISPLACE;
+ surface->image_fileformat = MOD_DPAINT_IMGFORMAT_PNG;
+
+ surface->init_color[0] = 1.0f;
+ surface->init_color[1] = 1.0f;
+ surface->init_color[2] = 1.0f;
+ surface->init_color[3] = 1.0f;
+
+ surface->image_resolution = 256;
+ surface->substeps = 0;
+
+ if (scene) {
+ surface->start_frame = scene->r.sfra;
+ surface->end_frame = scene->r.efra;
+ }
+ else {
+ surface->start_frame = 1;
+ surface->end_frame = 250;
+ }
+
+ surface->spread_speed = 1.0f;
+ surface->color_spread_speed = 1.0f;
+ surface->shrink_speed = 1.0f;
+
+ surface->wave_damping = 0.05f;
+ surface->wave_speed = 1.0f;
+ surface->wave_timescale = 1.0f;
+ surface->wave_spring = 0.20f;
+
+ BLI_snprintf(surface->image_output_path, sizeof(surface->image_output_path), "%sdynamicpaint", U.textudir);
+ BLI_cleanup_dir(NULL, surface->image_output_path);
+ dynamicPaintSurface_setUniqueName(surface, "Surface");
+
+ surface->effector_weights = BKE_add_effector_weights(NULL);
+
+ dynamicPaintSurface_updateType(surface);
+
+ BLI_addtail(&canvas->surfaces, surface);
+
+ return surface;
+}
+
+/*
+* Initialize modifier data
+*/
+int dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, struct Scene *scene)
+{
+ if(pmd) {
+ if(type == MOD_DYNAMICPAINT_TYPE_CANVAS) {
+ DynamicPaintCanvasSettings *canvas;
+ if(pmd->canvas)
+ dynamicPaint_freeCanvas(pmd);
+
+ canvas = pmd->canvas = MEM_callocN(sizeof(DynamicPaintCanvasSettings), "DynamicPaint Canvas");
+ if (!canvas)
+ return 0;
+ canvas->pmd = pmd;
+ canvas->dm = NULL;
+
+ /* Create one surface */
+ if (!dynamicPaint_createNewSurface(canvas, scene))
+ return 0;
+
+ }
+ else if(type == MOD_DYNAMICPAINT_TYPE_BRUSH) {
+ DynamicPaintBrushSettings *brush;
+ if(pmd->brush)
+ dynamicPaint_freeBrush(pmd);
+
+ brush = pmd->brush = MEM_callocN(sizeof(DynamicPaintBrushSettings), "DynamicPaint Paint");
+ if (!brush)
+ return 0;
+ brush->pmd = pmd;
+
+ brush->psys = NULL;
+
+ brush->flags = MOD_DPAINT_ABS_ALPHA | MOD_DPAINT_RAMP_ALPHA;
+ brush->collision = MOD_DPAINT_COL_VOLUME;
+
+ brush->mat = NULL;
+ brush->r = 0.15f;
+ brush->g = 0.4f;
+ brush->b = 0.8f;
+ brush->alpha = 1.0f;
+ brush->wetness = 1.0f;
+
+ brush->paint_distance = 1.0f;
+ brush->proximity_falloff = MOD_DPAINT_PRFALL_SMOOTH;
+
+ brush->particle_radius = 0.2f;
+ brush->particle_smooth = 0.05f;
+
+ brush->wave_factor = 1.0f;
+ brush->wave_clamp = 0.0f;
+ brush->smudge_strength = 0.3f;
+ brush->max_velocity = 1.0f;
+
+ brush->dm = NULL;
+
+ /* Paint proximity falloff colorramp. */
+ {
+ CBData *ramp;
+
+ brush->paint_ramp = add_colorband(0);
+ if (!brush->paint_ramp)
+ return 0;
+ ramp = brush->paint_ramp->data;
+ /* Add default smooth-falloff ramp. */
+ ramp[0].r = ramp[0].g = ramp[0].b = ramp[0].a = 1.0f;
+ ramp[0].pos = 0.0f;
+ ramp[1].r = ramp[1].g = ramp[1].b = ramp[1].pos = 1.0f;
+ ramp[1].a = 0.0f;
+ pmd->brush->paint_ramp->tot = 2;
+ }
+
+ /* Brush velocity ramp. */
+ {
+ CBData *ramp;
+
+ brush->vel_ramp = add_colorband(0);
+ if (!brush->vel_ramp)
+ return 0;
+ ramp = brush->vel_ramp->data;
+ ramp[0].r = ramp[0].g = ramp[0].b = ramp[0].a = ramp[0].pos = 0.0f;
+ ramp[1].r = ramp[1].g = ramp[1].b = ramp[1].a = ramp[1].pos = 1.0f;
+ brush->paint_ramp->tot = 2;
+ }
+ }
+ }
+ else
+ return 0;
+
+ return 1;
+}
+
+void dynamicPaint_Modifier_copy(struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tpmd)
+{
+ /* Init modifier */
+ tpmd->type = pmd->type;
+ if (pmd->canvas)
+ dynamicPaint_createType(tpmd, MOD_DYNAMICPAINT_TYPE_CANVAS, NULL);
+ if (pmd->brush)
+ dynamicPaint_createType(tpmd, MOD_DYNAMICPAINT_TYPE_BRUSH, NULL);
+
+ /* Copy data */
+ if (tpmd->canvas) {
+ tpmd->canvas->pmd = tpmd;
+
+ } else if (tpmd->brush) {
+ DynamicPaintBrushSettings *brush = pmd->brush, *t_brush = tpmd->brush;
+ t_brush->pmd = tpmd;
+
+ t_brush->flags = brush->flags;
+ t_brush->collision = brush->collision;
+
+ t_brush->mat = brush->mat;
+ t_brush->r = brush->r;
+ t_brush->g = brush->g;
+ t_brush->b = brush->b;
+ t_brush->alpha = brush->alpha;
+ t_brush->wetness = brush->wetness;
+
+ t_brush->particle_radius = brush->particle_radius;
+ t_brush->particle_smooth = brush->particle_smooth;
+ t_brush->paint_distance = brush->paint_distance;
+ t_brush->psys = brush->psys;
+
+ if (brush->paint_ramp)
+ memcpy(t_brush->paint_ramp, brush->paint_ramp, sizeof(ColorBand));
+ if (brush->vel_ramp)
+ memcpy(t_brush->vel_ramp, brush->vel_ramp, sizeof(ColorBand));
+
+ t_brush->proximity_falloff = brush->proximity_falloff;
+ t_brush->wave_type = brush->wave_type;
+ t_brush->ray_dir = brush->ray_dir;
+
+ t_brush->wave_factor = brush->wave_factor;
+ t_brush->wave_clamp = brush->wave_clamp;
+ t_brush->max_velocity = brush->max_velocity;
+ t_brush->smudge_strength = brush->smudge_strength;
+ }
+}
+
+/* allocates surface data depending on surface type */
+static void dynamicPaint_allocateSurfaceType(DynamicPaintSurface *surface)
+{
+ PaintSurfaceData *sData = surface->data;
+
+ switch (surface->type) {
+ case MOD_DPAINT_SURFACE_T_PAINT:
+ sData->type_data = MEM_callocN(sizeof(PaintPoint)*sData->total_points, "DynamicPaintSurface Data");
+ break;
+ case MOD_DPAINT_SURFACE_T_DISPLACE:
+ sData->type_data = MEM_callocN(sizeof(float)*sData->total_points, "DynamicPaintSurface DepthData");
+ break;
+ case MOD_DPAINT_SURFACE_T_WEIGHT:
+ sData->type_data = MEM_callocN(sizeof(float)*sData->total_points, "DynamicPaintSurface WeightData");
+ break;
+ case MOD_DPAINT_SURFACE_T_WAVE:
+ sData->type_data = MEM_callocN(sizeof(PaintWavePoint)*sData->total_points, "DynamicPaintSurface WaveData");
+ break;
+ }
+
+ if (sData->type_data == NULL) setError(surface->canvas, "Not enough free memory!");
+}
+
+static int surface_usesAdjDistance(DynamicPaintSurface *surface)
+{
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT && surface->effect) return 1;
+ if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) return 1;
+ return 0;
+}
+
+static int surface_usesAdjData(DynamicPaintSurface *surface)
+{
+ if (surface_usesAdjDistance(surface)) return 1;
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX &&
+ surface->flags & MOD_DPAINT_ANTIALIAS) return 1;
+
+ return 0;
+}
+
+/* initialize surface adjacency data */
+static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, int force_init)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintAdjData *ed;
+ int *temp_data;
+ int neigh_points = 0;
+
+ if (!surface_usesAdjData(surface) && !force_init) return;
+
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ /* For vertex format, neighbours are connected by edges */
+ neigh_points = 2*surface->canvas->dm->getNumEdges(surface->canvas->dm);
+ }
+ else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ)
+ neigh_points = sData->total_points*8;
+
+ if (!neigh_points) return;
+
+ /* allocate memory */
+ ed = sData->adj_data = MEM_callocN(sizeof(PaintAdjData), "Surface Adj Data");
+ if (!ed) return;
+ ed->n_index = MEM_callocN(sizeof(int)*sData->total_points, "Surface Adj Index");
+ ed->n_num = MEM_callocN(sizeof(int)*sData->total_points, "Surface Adj Counts");
+ temp_data = MEM_callocN(sizeof(int)*sData->total_points, "Temp Adj Data");
+ ed->n_target = MEM_callocN(sizeof(int)*neigh_points, "Surface Adj Targets");
+ ed->flags = MEM_callocN(sizeof(int)*sData->total_points, "Surface Adj Flags");
+ ed->total_targets = neigh_points;
+
+ /* in case of allocation error, free memory */
+ if (!ed->n_index || !ed->n_num || !ed->n_target || !temp_data) {
+ dynamicPaint_freeAdjData(sData);
+ if (temp_data) MEM_freeN(temp_data);
+ setError(surface->canvas, "Not enough free memory.");
+ return;
+ }
+
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ int i;
+ int n_pos;
+
+ /* For vertex format, count every vertex that is connected by an edge */
+ int numOfEdges = surface->canvas->dm->getNumEdges(surface->canvas->dm);
+ int numOfFaces = surface->canvas->dm->getNumFaces(surface->canvas->dm);
+ struct MEdge *edge = surface->canvas->dm->getEdgeArray(surface->canvas->dm);
+ struct MFace *face = surface->canvas->dm->getFaceArray(surface->canvas->dm);
+
+ /* count number of edges per vertex */
+ for (i=0; i<numOfEdges; i++) {
+ ed->n_num[edge[i].v1]++;
+ ed->n_num[edge[i].v2]++;
+
+ temp_data[edge[i].v1]++;
+ temp_data[edge[i].v2]++;
+ }
+
+ /* to locate points on "mesh edge" */
+ for (i=0; i<numOfFaces; i++) {
+ temp_data[face[i].v1]++;
+ temp_data[face[i].v2]++;
+ temp_data[face[i].v3]++;
+ if (face[i].v4)
+ temp_data[face[i].v4]++;
+ }
+
+ /* now check if total number of edges+faces for
+ * each vertex is even, if not -> vertex is on mesh edge */
+ for (i=0; i<sData->total_points; i++) {
+ if ((temp_data[i]%2) ||
+ temp_data[i] < 4)
+ ed->flags[i] |= ADJ_ON_MESH_EDGE;
+
+ /* reset temp data */
+ temp_data[i] = 0;
+ }
+
+ /* order n_index array */
+ n_pos = 0;
+ for (i=0; i<sData->total_points; i++) {
+ ed->n_index[i] = n_pos;
+ n_pos += ed->n_num[i];
+ }
+
+ /* and now add neighbour data using that info */
+ for (i=0; i<numOfEdges; i++) {
+ /* first vertex */
+ int index = edge[i].v1;
+ n_pos = ed->n_index[index]+temp_data[index];
+ ed->n_target[n_pos] = edge[i].v2;
+ temp_data[index]++;
+
+ /* second vertex */
+ index = edge[i].v2;
+ n_pos = ed->n_index[index]+temp_data[index];
+ ed->n_target[n_pos] = edge[i].v1;
+ temp_data[index]++;
+ }
+ }
+ else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+ /* for image sequences, only allocate memory.
+ * bake initialization takes care of rest */
+ }
+
+ MEM_freeN(temp_data);
+}
+
+void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintPoint* pPoint = (PaintPoint*)sData->type_data;
+ DerivedMesh *dm = surface->canvas->dm;
+ int i;
+
+ if (surface->type != MOD_DPAINT_SURFACE_T_PAINT)
+ return;
+
+ if (surface->init_color_type == MOD_DPAINT_INITIAL_NONE)
+ return;
+ /* Single color */
+ else if (surface->init_color_type == MOD_DPAINT_INITIAL_COLOR) {
+ /* apply color to every surface point */
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ copy_v3_v3(pPoint[i].color, surface->init_color);
+ pPoint[i].alpha = surface->init_color[3];
+ }
+ }
+ /* UV mapped texture */
+ else if (surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) {
+ Tex *tex = surface->init_texture;
+ MTFace *tface;
+ MFace *mface = dm->getFaceArray(dm);
+ int numOfFaces = dm->getNumFaces(dm);
+ char uvname[40];
+
+ if (!tex) return;
+
+ /* get uv layer */
+ CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, surface->init_layername, uvname);
+ tface = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname);
+ if (!tface) return;
+
+ /* for vertex surface loop through tfaces and find uv color
+ * that provides highest alpha */
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfFaces; i++) {
+ int numOfVert = (mface[i].v4) ? 4 : 3;
+ float uv[3] = {0.0f};
+ int j;
+ for (j=0; j<numOfVert; j++) {
+ TexResult texres = {0};
+ unsigned int *vert = (&mface[i].v1)+j;
+
+ /* remap to -1.0 to 1.0 */
+ uv[0] = tface[i].uv[j][0]*2.0f - 1.0f;
+ uv[1] = tface[i].uv[j][1]*2.0f - 1.0f;
+
+ multitex_ext_safe(tex, uv, &texres);
+
+ if (texres.tin > pPoint[*vert].alpha) {
+ copy_v3_v3(pPoint[*vert].color, &texres.tr);
+ pPoint[*vert].alpha = texres.tin;
+ }
+ }
+ }
+ }
+ else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+ ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
+ int samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
+
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ float uv[9] = {0.0f};
+ float uv_final[3] = {0.0f};
+ int j;
+ TexResult texres = {0};
+
+ /* collect all uvs */
+ for (j=0; j<3; j++) {
+ int v=(f_data->uv_p[i].quad && j>0) ? j+1 : j;
+ copy_v2_v2(&uv[j*3], tface[f_data->uv_p[i].face_index].uv[v]);
+ }
+
+ /* interpolate final uv pos */
+ interp_v3_v3v3v3( uv_final, &uv[0], &uv[3], &uv[6],
+ f_data->barycentricWeights[i*samples].v);
+ /* remap to -1.0 to 1.0 */
+ uv_final[0] = uv_final[0]*2.0f - 1.0f;
+ uv_final[1] = uv_final[1]*2.0f - 1.0f;
+
+ multitex_ext_safe(tex, uv_final, &texres);
+
+ /* apply color */
+ copy_v3_v3(pPoint[i].color, &texres.tr);
+ pPoint[i].alpha = texres.tin;
+ }
+ }
+ }
+ /* vertex color layer */
+ else if (surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) {
+ MCol *col = CustomData_get_layer_named(&dm->faceData, CD_MCOL, surface->init_layername);
+ if (!col) return;
+
+ /* for vertex surface, just copy colors from mcol */
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ MFace *mface = dm->getFaceArray(dm);
+ int numOfFaces = dm->getNumFaces(dm);
+
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfFaces; i++) {
+ int numOfVert = (mface[i].v4) ? 4 : 3;
+ int j;
+ for (j=0; j<numOfVert; j++) {
+ unsigned int *vert = ((&mface[i].v1)+j);
+
+ pPoint[*vert].color[0] = 1.0f/255.f*(float)col[i*4+j].b;
+ pPoint[*vert].color[1] = 1.0f/255.f*(float)col[i*4+j].g;
+ pPoint[*vert].color[2] = 1.0f/255.f*(float)col[i*4+j].r;
+ pPoint[*vert].alpha = 1.0f/255.f*(float)col[i*4+j].a;
+ }
+ }
+ }
+ else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+ ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
+ int samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
+
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ int face_ind = f_data->uv_p[i].face_index;
+ float colors[3][4] = {{0.0f,0.0f,0.0f,0.0f}};
+ float final_color[4];
+ int j;
+ /* collect color values */
+ for (j=0; j<3; j++) {
+ int v=(f_data->uv_p[i].quad && j>0) ? j+1 : j;
+ colors[j][0] = 1.0f/255.f*(float)col[face_ind*4+v].b;
+ colors[j][1] = 1.0f/255.f*(float)col[face_ind*4+v].g;
+ colors[j][2] = 1.0f/255.f*(float)col[face_ind*4+v].r;
+ colors[j][3] = 1.0f/255.f*(float)col[face_ind*4+v].a;
+ }
+
+ /* interpolate final color */
+ interp_v4_v4v4v4( final_color, colors[0], colors[1], colors[2],
+ f_data->barycentricWeights[i*samples].v);
+
+ copy_v3_v3(pPoint[i].color, final_color);
+ pPoint[i].alpha = final_color[3];
+ }
+ }
+ }
+}
+
+/* clears surface data back to zero */
+void dynamicPaint_clearSurface(DynamicPaintSurface *surface)
+{
+ PaintSurfaceData *sData = surface->data;
+ if (sData && sData->type_data) {
+ unsigned int data_size;
+
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
+ data_size = sizeof(PaintPoint);
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE)
+ data_size = sizeof(PaintWavePoint);
+ else
+ data_size = sizeof(float);
+
+ memset(sData->type_data, 0, data_size * sData->total_points);
+
+ /* set initial color */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
+ dynamicPaint_setInitialColor(surface);
+
+ if (sData->bData)
+ sData->bData->clear = 1;
+ }
+}
+
+/* completely (re)initializes surface (only for point cache types)*/
+int dynamicPaint_resetSurface(DynamicPaintSurface *surface)
+{
+ int numOfPoints = dynamicPaint_surfaceNumOfPoints(surface);
+ /* dont touch image sequence types. they get handled only on bake */
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) return 1;
+
+ if (surface->data) dynamicPaint_freeSurfaceData(surface);
+ if (numOfPoints < 1) return 0;
+
+ /* allocate memory */
+ surface->data = MEM_callocN(sizeof(PaintSurfaceData), "PaintSurfaceData");
+ if (!surface->data) return 0;
+
+ /* allocate data depending on surface type and format */
+ surface->data->total_points = numOfPoints;
+ dynamicPaint_allocateSurfaceType(surface);
+ dynamicPaint_initAdjacencyData(surface, 0);
+
+ /* set initial color */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
+ dynamicPaint_setInitialColor(surface);
+
+ return 1;
+}
+
+/* make sure allocated surface size matches current requirements */
+static void dynamicPaint_checkSurfaceData(DynamicPaintSurface *surface)
+{
+ if (!surface->data || ((dynamicPaint_surfaceNumOfPoints(surface) != surface->data->total_points))) {
+ dynamicPaint_resetSurface(surface);
+ }
+}
+
+
+/***************************** Modifier processing ******************************/
+
+
+/* apply displacing vertex surface to the derived mesh */
+static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, DerivedMesh *result, int update_normals)
+{
+ PaintSurfaceData *sData = surface->data;
+
+ if (!sData || surface->format != MOD_DPAINT_SURFACE_F_VERTEX) return;
+
+ /* displace paint */
+ if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) {
+ MVert *mvert = result->getVertArray(result);
+ int i;
+ float* value = (float*)sData->type_data;
+
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ float normal[3], val=value[i]*surface->disp_factor;
+ normal_short_to_float_v3(normal, mvert[i].no);
+ normalize_v3(normal);
+
+ mvert[i].co[0] -= normal[0]*val;
+ mvert[i].co[1] -= normal[1]*val;
+ mvert[i].co[2] -= normal[2]*val;
+ }
+ }
+ else return;
+
+ if (update_normals)
+ CDDM_calc_normals(result);
+}
+
+/*
+* Apply canvas data to the object derived mesh
+*/
+static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd,
+ Object *ob,
+ DerivedMesh *dm)
+{
+ DerivedMesh *result = CDDM_copy(dm);
+
+ if(pmd->canvas && !(pmd->canvas->flags & MOD_DPAINT_BAKING)) {
+
+ DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
+ pmd->canvas->flags &= ~MOD_DPAINT_PREVIEW_READY;
+
+ /* loop through surfaces */
+ for (; surface; surface=surface->next) {
+ PaintSurfaceData *sData = surface->data;
+
+ if (surface && surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ && sData) {
+ if (!(surface->flags & (MOD_DPAINT_ACTIVE))) continue;
+
+ /* process vertex surface previews */
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+
+ /* vertex color paint */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+
+ MFace *mface = result->getFaceArray(result);
+ int numOfFaces = result->getNumFaces(result);
+ int i;
+ PaintPoint* pPoint = (PaintPoint*)sData->type_data;
+ MCol *col;
+
+ /* paint is stored on dry and wet layers, so mix final color first */
+ float *fcolor = MEM_callocN(sizeof(float)*sData->total_points*4, "Temp paint color");
+
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ /* blend dry and wet layer */
+ blendColors(pPoint[i].color, pPoint[i].alpha, pPoint[i].e_color, pPoint[i].e_alpha, &fcolor[i*4]);
+ }
+
+ /* viewport preview */
+ if (surface->flags & MOD_DPAINT_PREVIEW) {
+ /* Save preview results to weight layer, to be
+ * able to share same drawing methods */
+ col = result->getFaceDataArray(result, CD_WEIGHT_MCOL);
+ if (!col) col = CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, numOfFaces);
+
+ if (col) {
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfFaces; i++) {
+ int j=0;
+ Material *material = give_current_material(ob, mface[i].mat_nr+1);
+
+ for (; j<((mface[i].v4)?4:3); j++) {
+ int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
+
+ if (surface->preview_id == MOD_DPAINT_SURFACE_PREV_PAINT) {
+ float c[3];
+ index *= 4;
+
+ /* Apply material color as base vertex color for preview */
+ col[i*4+j].a = 255;
+ if (material) {
+ c[0] = material->r;
+ c[1] = material->g;
+ c[2] = material->b;
+ }
+ else { /* default grey */
+ c[0] = 0.65f;
+ c[1] = 0.65f;
+ c[2] = 0.65f;
+ }
+ /* mix surface color */
+ interp_v3_v3v3(c, c, &fcolor[index], fcolor[index+3]);
+
+ col[i*4+j].r = FTOCHAR(c[2]);
+ col[i*4+j].g = FTOCHAR(c[1]);
+ col[i*4+j].b = FTOCHAR(c[0]);
+ }
+ else {
+ col[i*4+j].a = 255;
+ col[i*4+j].r = FTOCHAR(pPoint[index].wetness);
+ col[i*4+j].g = FTOCHAR(pPoint[index].wetness);
+ col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
+ }
+ }
+ }
+ pmd->canvas->flags |= MOD_DPAINT_PREVIEW_READY;
+ }
+ }
+
+
+ /* save layer data to output layer */
+
+ /* paint layer */
+ col = CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name);
+ if (col) {
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfFaces; i++) {
+ int j=0;
+ for (; j<((mface[i].v4)?4:3); j++) {
+ int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
+ index *= 4;
+
+ col[i*4+j].a = FTOCHAR(fcolor[index+3]);
+ col[i*4+j].r = FTOCHAR(fcolor[index+2]);
+ col[i*4+j].g = FTOCHAR(fcolor[index+1]);
+ col[i*4+j].b = FTOCHAR(fcolor[index]);
+ }
+ }
+ }
+
+ MEM_freeN(fcolor);
+
+ /* wet layer */
+ col = CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name2);
+ if (col) {
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfFaces; i++) {
+ int j=0;
+
+ for (; j<((mface[i].v4)?4:3); j++) {
+ int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
+ col[i*4+j].a = 255;
+ col[i*4+j].r = FTOCHAR(pPoint[index].wetness);
+ col[i*4+j].g = FTOCHAR(pPoint[index].wetness);
+ col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
+ }
+ }
+ }
+ }
+ /* vertex group paint */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
+ int defgrp_index = defgroup_name_index(ob, surface->output_name);
+ MDeformVert *dvert = result->getVertDataArray(result, CD_MDEFORMVERT);
+ float *weight = (float*)sData->type_data;
+ /* viewport preview */
+ if (surface->flags & MOD_DPAINT_PREVIEW) {
+ /* Save preview results to weight layer, to be
+ * able to share same drawing methods */
+ MFace *mface = result->getFaceArray(result);
+ int numOfFaces = result->getNumFaces(result);
+ int i;
+ MCol *col = result->getFaceDataArray(result, CD_WEIGHT_MCOL);
+ if (!col) col = CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, numOfFaces);
+
+ if (col) {
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfFaces; i++) {
+ float temp_color[3];
+ int j=0;
+ for (; j<((mface[i].v4)?4:3); j++) {
+ int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
+
+ weight_to_rgb(weight[index], temp_color, temp_color+1, temp_color+2);
+ col[i*4+j].r = FTOCHAR(temp_color[2]);
+ col[i*4+j].g = FTOCHAR(temp_color[1]);
+ col[i*4+j].b = FTOCHAR(temp_color[0]);
+ col[i*4+j].a = 255;
+ }
+ }
+ pmd->canvas->flags |= MOD_DPAINT_PREVIEW_READY;
+ }
+ }
+
+ /* apply weights into a vertex group, if doesnt exists add a new layer */
+ if (defgrp_index >= 0 && !dvert && strlen(surface->output_name)>0)
+ dvert = CustomData_add_layer_named(&result->vertData, CD_MDEFORMVERT, CD_CALLOC,
+ NULL, sData->total_points, surface->output_name);
+ if (defgrp_index >= 0 && dvert) {
+ int i;
+ for(i=0; i<sData->total_points; i++) {
+ MDeformVert *dv= &dvert[i];
+ MDeformWeight *def_weight = defvert_find_index(dv, defgrp_index);
+
+ /* skip if weight value is 0 and no existing weight is found */
+ if (!def_weight && !weight[i])
+ continue;
+
+ /* if not found, add a weight for it */
+ if (!def_weight) {
+ MDeformWeight *newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1),
+ "deformWeight");
+ if(dv->dw){
+ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
+ MEM_freeN(dv->dw);
+ }
+ dv->dw=newdw;
+ dv->dw[dv->totweight].def_nr=defgrp_index;
+ def_weight = &dv->dw[dv->totweight];
+ dv->totweight++;
+ }
+
+ /* set weight value */
+ def_weight->weight = weight[i];
+ }
+ }
+ }
+ /* wave simulation */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ MVert *mvert = result->getVertArray(result);
+ int i;
+ PaintWavePoint* wPoint = (PaintWavePoint*)sData->type_data;
+
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<sData->total_points; i++) {
+ float normal[3];
+ normal_short_to_float_v3(normal, mvert[i].no);
+ normalize_v3(normal);
+
+ mvert[i].co[0] += normal[0]*wPoint[i].height;
+ mvert[i].co[1] += normal[1]*wPoint[i].height;
+ mvert[i].co[2] += normal[2]*wPoint[i].height;
+ }
+ CDDM_calc_normals(result);
+ }
+
+ /* displace */
+ dynamicPaint_applySurfaceDisplace(surface, result, 1);
+ }
+ }
+ }
+ }
+ /* make a copy of dm to use as brush data */
+ if (pmd->brush) {
+ if (pmd->brush->dm) pmd->brush->dm->release(pmd->brush->dm);
+ pmd->brush->dm = CDDM_copy(result);
+ }
+
+ return result;
+}
+
+/* update cache frame range */
+void dynamicPaint_cacheUpdateFrames(DynamicPaintSurface *surface)
+{
+ if (surface->pointcache) {
+ surface->pointcache->startframe = surface->start_frame;
+ surface->pointcache->endframe = surface->end_frame;
+ }
+}
+
+void canvas_copyDerivedMesh(DynamicPaintCanvasSettings *canvas, DerivedMesh *dm)
+{
+ if (canvas->dm) canvas->dm->release(canvas->dm);
+ canvas->dm = CDDM_copy(dm);
+}
+
+/*
+* Updates derived mesh copy and processes dynamic paint step / caches.
+*/
+static void dynamicPaint_frameUpdate(DynamicPaintModifierData *pmd, Scene *scene, Object *ob, DerivedMesh *dm)
+{
+ if(pmd->canvas) {
+ DynamicPaintCanvasSettings *canvas = pmd->canvas;
+ DynamicPaintSurface *surface = canvas->surfaces.first;
+
+ /* update derived mesh copy */
+ canvas_copyDerivedMesh(canvas, dm);
+
+ /* in case image sequence baking, stop here */
+ if (canvas->flags & MOD_DPAINT_BAKING) return;
+
+ /* loop through surfaces */
+ for (; surface; surface=surface->next) {
+ int current_frame = (int)scene->r.cfra;
+
+ /* free bake data if not required anymore */
+ surface_freeUnusedData(surface);
+
+ /* image sequences are handled by bake operator */
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) continue;
+ if (!(surface->flags & MOD_DPAINT_ACTIVE)) continue;
+
+ /* make sure surface is valid */
+ dynamicPaint_checkSurfaceData(surface);
+
+ /* limit frame range */
+ CLAMP(current_frame, surface->start_frame, surface->end_frame);
+
+ if (current_frame != surface->current_frame || (int)scene->r.cfra == surface->start_frame) {
+ PointCache *cache = surface->pointcache;
+ PTCacheID pid;
+ surface->current_frame = current_frame;
+
+ /* read point cache */
+ BKE_ptcache_id_from_dynamicpaint(&pid, ob, surface);
+ pid.cache->startframe = surface->start_frame;
+ pid.cache->endframe = surface->end_frame;
+ BKE_ptcache_id_time(&pid, scene, (float)scene->r.cfra, NULL, NULL, NULL);
+
+ /* reset non-baked cache at first frame */
+ if((int)scene->r.cfra == surface->start_frame && !(cache->flag & PTCACHE_BAKED))
+ {
+ cache->flag |= PTCACHE_REDO_NEEDED;
+ BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
+ }
+
+ /* try to read from cache */
+ if(BKE_ptcache_read(&pid, (float)scene->r.cfra)) {
+ BKE_ptcache_validate(cache, (int)scene->r.cfra);
+ }
+ /* if read failed and we're on surface range do recalculate */
+ else if ((int)scene->r.cfra == current_frame
+ && !(cache->flag & PTCACHE_BAKED)) {
+ /* calculate surface frame */
+ canvas->flags |= MOD_DPAINT_BAKING;
+ dynamicPaint_calculateFrame(surface, scene, ob, current_frame);
+ canvas->flags &= ~MOD_DPAINT_BAKING;
+
+ /* restore canvas derivedmesh if required */
+ if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE &&
+ surface->flags & MOD_DPAINT_DISP_INCREMENTAL && surface->next)
+ canvas_copyDerivedMesh(canvas, dm);
+
+ BKE_ptcache_validate(cache, surface->current_frame);
+ BKE_ptcache_write(&pid, surface->current_frame);
+ }
+ }
+ }
+ }
+}
+
+/* Modifier call. Processes dynamic paint modifier step. */
+struct DerivedMesh *dynamicPaint_Modifier_do(DynamicPaintModifierData *pmd, Scene *scene, Object *ob, DerivedMesh *dm)
+{
+ /* Update canvas data for a new frame */
+ dynamicPaint_frameUpdate(pmd, scene, ob, dm);
+
+ /* Return output mesh */
+ return dynamicPaint_Modifier_apply(pmd, ob, dm);
+}
+
+
+/***************************** Image Sequence / UV Image Surface Calls ******************************/
+
+/*
+* Tries to find the neighbouring pixel in given (uv space) direction.
+* Result is used by effect system to move paint on the surface.
+*
+* px,py : origin pixel x and y
+* n_index : lookup direction index (use neighX,neighY to get final index)
+*/
+static int dynamicPaint_findNeighbourPixel(PaintUVPoint *tempPoints, DerivedMesh *dm, char *uvname, int w, int h, int px, int py, int n_index)
+{
+ /* Note: Current method only uses polygon edges to detect neighbouring pixels.
+ * -> It doesn't always lead to the optimum pixel but is accurate enough
+ * and faster/simplier than including possible face tip point links)
+ */
+
+ int x,y;
+ PaintUVPoint *tPoint = NULL;
+ PaintUVPoint *cPoint = NULL;
+
+ /* shift position by given n_index */
+ x = px + neighX[n_index];
+ y = py + neighY[n_index];
+
+ if (x<0 || x>=w) return -1;
+ if (y<0 || y>=h) return -1;
+
+ tPoint = &tempPoints[x+w*y]; /* UV neighbour */
+ cPoint = &tempPoints[px+w*py]; /* Origin point */
+
+ /*
+ * Check if shifted point is on same face -> it's a correct neighbour
+ * (and if it isn't marked as an "edge pixel")
+ */
+ if ((tPoint->face_index == cPoint->face_index) && (tPoint->neighbour_pixel == -1))
+ return (x+w*y);
+
+ /*
+ * Even if shifted point is on another face
+ * -> use this point.
+ *
+ * !! Replace with "is uv faces linked" check !!
+ * This should work fine as long as uv island
+ * margin is > 1 pixel.
+ */
+ if ((tPoint->face_index != -1) && (tPoint->neighbour_pixel == -1)) {
+ return (x+w*y);
+ }
+
+ /*
+ * If we get here, the actual neighbouring pixel
+ * is located on a non-linked uv face, and we have to find
+ * it's "real" position.
+ *
+ * Simple neighbouring face finding algorithm:
+ * - find closest uv edge to shifted pixel and get
+ * the another face that shares that edge
+ * - find corresponding position of that new face edge
+ * in uv space
+ *
+ * TODO: Implement something more accurate / optimized?
+ */
+ {
+ int numOfFaces = dm->getNumFaces(dm);
+ MFace *mface = dm->getFaceArray(dm);
+ MTFace *tface = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname);
+
+ /* Get closest edge to that subpixel on UV map */
+ {
+ float pixel[2], dist, t_dist;
+ int i, uindex[2], edge1_index, edge2_index,
+ e1_index, e2_index, target_face;
+ float closest_point[2], lambda, dir_vec[2];
+ int target_uv1, target_uv2, final_pixel[2], final_index;
+
+ float *s_uv1, *s_uv2, *t_uv1, *t_uv2;
+
+ pixel[0] = ((float)(px + neighX[n_index]) + 0.5f) / (float)w;
+ pixel[1] = ((float)(py + neighY[n_index]) + 0.5f) / (float)h;
+
+ /* Get uv indexes for current face part */
+ if (cPoint->quad) {
+ uindex[0] = 0; uindex[1] = 2; uindex[2] = 3;
+ }
+ else {
+ uindex[0] = 0; uindex[1] = 1; uindex[2] = 2;
+ }
+
+ /*
+ * Find closest edge to that pixel
+ */
+ /* Dist to first edge */
+ e1_index = cPoint->v1; e2_index = cPoint->v2; edge1_index = uindex[0]; edge2_index = uindex[1];
+ dist = dist_to_line_segment_v2(pixel, tface[cPoint->face_index].uv[edge1_index], tface[cPoint->face_index].uv[edge2_index]);
+
+ /* Dist to second edge */
+ t_dist = dist_to_line_segment_v2(pixel, tface[cPoint->face_index].uv[uindex[1]], tface[cPoint->face_index].uv[uindex[2]]);
+ if (t_dist < dist) {e1_index = cPoint->v2; e2_index = cPoint->v3; edge1_index = uindex[1]; edge2_index = uindex[2]; dist = t_dist;}
+
+ /* Dist to third edge */
+ t_dist = dist_to_line_segment_v2(pixel, tface[cPoint->face_index].uv[uindex[2]], tface[cPoint->face_index].uv[uindex[0]]);
+ if (t_dist < dist) {e1_index = cPoint->v3; e2_index = cPoint->v1; edge1_index = uindex[2]; edge2_index = uindex[0]; dist = t_dist;}
+
+
+ /*
+ * Now find another face that is linked to that edge
+ */
+ target_face = -1;
+
+ for (i=0; i<numOfFaces; i++) {
+ /*
+ * Check if both edge vertices share this face
+ */
+ int v4 = (mface[i].v4) ? mface[i].v4 : -1;
+
+ if ((e1_index == mface[i].v1 || e1_index == mface[i].v2 || e1_index == mface[i].v3 || e1_index == v4) &&
+ (e2_index == mface[i].v1 || e2_index == mface[i].v2 || e2_index == mface[i].v3 || e2_index == v4)) {
+ if (i == cPoint->face_index) continue;
+
+ target_face = i;
+
+ /*
+ * Get edge UV index
+ */
+ if (e1_index == mface[i].v1) target_uv1 = 0;
+ else if (e1_index == mface[i].v2) target_uv1 = 1;
+ else if (e1_index == mface[i].v3) target_uv1 = 2;
+ else target_uv1 = 3;
+
+ if (e2_index == mface[i].v1) target_uv2 = 0;
+ else if (e2_index == mface[i].v2) target_uv2 = 1;
+ else if (e2_index == mface[i].v3) target_uv2 = 2;
+ else target_uv2 = 3;
+
+ break;
+ }
+ }
+
+ /* If none found return -1 */
+ if (target_face == -1) return -1;
+
+ /*
+ * If target face is connected in UV space as well, just use original index
+ */
+ s_uv1 = (float *)tface[cPoint->face_index].uv[edge1_index];
+ s_uv2 = (float *)tface[cPoint->face_index].uv[edge2_index];
+ t_uv1 = (float *)tface[target_face].uv[target_uv1];
+ t_uv2 = (float *)tface[target_face].uv[target_uv2];
+
+ //printf("connected UV : %f,%f & %f,%f - %f,%f & %f,%f\n", s_uv1[0], s_uv1[1], s_uv2[0], s_uv2[1], t_uv1[0], t_uv1[1], t_uv2[0], t_uv2[1]);
+
+ if (((s_uv1[0] == t_uv1[0] && s_uv1[1] == t_uv1[1]) &&
+ (s_uv2[0] == t_uv2[0] && s_uv2[1] == t_uv2[1]) ) ||
+ ((s_uv2[0] == t_uv1[0] && s_uv2[1] == t_uv1[1]) &&
+ (s_uv1[0] == t_uv2[0] && s_uv1[1] == t_uv2[1]) )) return ((px+neighX[n_index]) + w*(py+neighY[n_index]));
+
+ /*
+ * Find a point that is relatively at same edge position
+ * on this other face UV
+ */
+ lambda = closest_to_line_v2(closest_point, pixel, tface[cPoint->face_index].uv[edge1_index], tface[cPoint->face_index].uv[edge2_index]);
+ if (lambda < 0.0f) lambda = 0.0f;
+ if (lambda > 1.0f) lambda = 1.0f;
+
+ sub_v2_v2v2(dir_vec, tface[target_face].uv[target_uv2], tface[target_face].uv[target_uv1]);
+
+ mul_v2_fl(dir_vec, lambda);
+
+ copy_v2_v2(pixel, tface[target_face].uv[target_uv1]);
+ add_v2_v2(pixel, dir_vec);
+ pixel[0] = (pixel[0] * (float)w) - 0.5f;
+ pixel[1] = (pixel[1] * (float)h) - 0.5f;
+
+ final_pixel[0] = (int)floor(pixel[0]);
+ final_pixel[1] = (int)floor(pixel[1]);
+
+ /* If current pixel uv is outside of texture */
+ if (final_pixel[0] < 0 || final_pixel[0] >= w) return -1;
+ if (final_pixel[1] < 0 || final_pixel[1] >= h) return -1;
+
+ final_index = final_pixel[0] + w * final_pixel[1];
+
+ /* If we ended up to our origin point ( mesh has smaller than pixel sized faces) */
+ if (final_index == (px+w*py)) return -1;
+ /* If found pixel still lies on wrong face ( mesh has smaller than pixel sized faces) */
+ if (tempPoints[final_index].face_index != target_face) return -1;
+
+ /*
+ * If final point is an "edge pixel", use it's "real" neighbour instead
+ */
+ if (tempPoints[final_index].neighbour_pixel != -1) final_index = cPoint->neighbour_pixel;
+
+ return final_index;
+ }
+ }
+}
+
+/*
+* Create a surface for uv image sequence format
+*/
+int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
+{
+ /* Antialias jitter point relative coords */
+ float jitter5sample[10] = {0.0f, 0.0f,
+ -0.2f, -0.4f,
+ 0.2f, 0.4f,
+ 0.4f, -0.2f,
+ -0.4f, 0.3f};
+ int ty;
+ int w,h;
+ int numOfFaces;
+ char uvname[32];
+ int active_points = 0;
+ int error = 0;
+
+ PaintSurfaceData *sData;
+ DynamicPaintCanvasSettings *canvas = surface->canvas;
+ DerivedMesh *dm = canvas->dm;
+
+ PaintUVPoint *tempPoints = NULL;
+ Vec3f *tempWeights = NULL;
+ /* MVert *mvert = NULL; */ /* UNUSED */
+ MFace *mface = NULL;
+ MTFace *tface = NULL;
+ Bounds2D *faceBB = NULL;
+ int *final_index;
+ int aa_samples;
+
+ if (!dm) return setError(canvas, "Canvas mesh not updated.");
+ if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) return setError(canvas, "Can't bake non-\"image sequence\" formats.");
+
+ numOfFaces = dm->getNumFaces(dm);
+ /* mvert = dm->getVertArray(dm); */ /* UNUSED */
+ mface = dm->getFaceArray(dm);
+
+ /* get uv layer */
+ CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, surface->uvlayer_name, uvname);
+ tface = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname);
+
+ /* Check for validity */
+ if (!tface) return setError(canvas, "No UV data on canvas.");
+ if (surface->image_resolution < 16 || surface->image_resolution > 8192) return setError(canvas, "Invalid resolution.");
+
+ w = h = surface->image_resolution;
+
+ /*
+ * Start generating the surface
+ */
+ printf("DynamicPaint: Preparing UV surface of %ix%i pixels and %i faces.\n", w, h, numOfFaces);
+
+ /* Init data struct */
+ if (surface->data) dynamicPaint_freeSurfaceData(surface);
+ sData = surface->data = MEM_callocN(sizeof(PaintSurfaceData), "PaintSurfaceData");
+ if (!surface->data) return setError(canvas, "Not enough free memory.");
+
+ aa_samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
+ tempPoints = (struct PaintUVPoint *) MEM_callocN(w*h*sizeof(struct PaintUVPoint), "Temp PaintUVPoint");
+ if (!tempPoints) error=1;
+
+ final_index = (int *) MEM_callocN(w*h*sizeof(int), "Temp UV Final Indexes");
+ if (!final_index) error=1;
+
+ tempWeights = (struct Vec3f *) MEM_mallocN(w*h*aa_samples*sizeof(struct Vec3f), "Temp bWeights");
+ if (!tempWeights) error=1;
+
+ /*
+ * Generate a temporary bounding box array for UV faces to optimize
+ * the pixel-inside-a-face search.
+ */
+ if (!error) {
+ faceBB = (struct Bounds2D *) MEM_mallocN(numOfFaces*sizeof(struct Bounds2D), "MPCanvasFaceBB");
+ if (!faceBB) error=1;
+ }
+
+ if (!error)
+ for (ty=0; ty<numOfFaces; ty++) {
+ int numOfVert = (mface[ty].v4) ? 4 : 3;
+ int i;
+
+ copy_v2_v2(faceBB[ty].min, tface[ty].uv[0]);
+ copy_v2_v2(faceBB[ty].max, tface[ty].uv[0]);
+
+ for (i = 1; i<numOfVert; i++) {
+ if (tface[ty].uv[i][0] < faceBB[ty].min[0]) faceBB[ty].min[0] = tface[ty].uv[i][0];
+ if (tface[ty].uv[i][1] < faceBB[ty].min[1]) faceBB[ty].min[1] = tface[ty].uv[i][1];
+ if (tface[ty].uv[i][0] > faceBB[ty].max[0]) faceBB[ty].max[0] = tface[ty].uv[i][0];
+ if (tface[ty].uv[i][1] > faceBB[ty].max[1]) faceBB[ty].max[1] = tface[ty].uv[i][1];
+
+ }
+ }
+
+ /*
+ * Loop through every pixel and check
+ * if pixel is uv-mapped on a canvas face.
+ */
+ if (!error) {
+ #pragma omp parallel for schedule(static)
+ for (ty = 0; ty < h; ty++)
+ {
+ int tx;
+ for (tx = 0; tx < w; tx++)
+ {
+ int i, sample;
+ int index = tx+w*ty;
+ PaintUVPoint *tPoint = (&tempPoints[index]);
+
+ short isInside = 0; /* if point is inside a uv face */
+
+ float d1[2], d2[2], d3[2], point[5][2];
+ float dot00,dot01,dot02,dot11,dot12, invDenom, u,v;
+
+ /* Init per pixel settings */
+ tPoint->face_index = -1;
+ tPoint->neighbour_pixel = -1;
+ tPoint->pixel_index = index;
+
+ /* Actual pixel center, used when collision is found */
+ point[0][0] = ((float)tx + 0.5f) / w;
+ point[0][1] = ((float)ty + 0.5f) / h;
+
+ /*
+ * A pixel middle sample isn't enough to find very narrow polygons
+ * So using 4 samples of each corner too
+ */
+ point[1][0] = ((float)tx) / w;
+ point[1][1] = ((float)ty) / h;
+
+ point[2][0] = ((float)tx+1) / w;
+ point[2][1] = ((float)ty) / h;
+
+ point[3][0] = ((float)tx) / w;
+ point[3][1] = ((float)ty+1) / h;
+
+ point[4][0] = ((float)tx+1) / w;
+ point[4][1] = ((float)ty+1) / h;
+
+
+ /* Loop through samples, starting from middle point */
+ for (sample=0; sample<5; sample++) {
+
+ /* Loop through every face in the mesh */
+ for (i=0; i<numOfFaces; i++) {
+
+ /* Check uv bb */
+ if (faceBB[i].min[0] > (point[sample][0])) continue;
+ if (faceBB[i].min[1] > (point[sample][1])) continue;
+ if (faceBB[i].max[0] < (point[sample][0])) continue;
+ if (faceBB[i].max[1] < (point[sample][1])) continue;
+
+ /* Calculate point inside a triangle check
+ * for uv0,1,2 */
+ sub_v2_v2v2(d1, tface[i].uv[2], tface[i].uv[0]); // uv2 - uv0
+ sub_v2_v2v2(d2, tface[i].uv[1], tface[i].uv[0]); // uv1 - uv0
+ sub_v2_v2v2(d3, point[sample], tface[i].uv[0]); // point - uv0
+
+ dot00 = d1[0]*d1[0] + d1[1]*d1[1];
+ dot01 = d1[0]*d2[0] + d1[1]*d2[1];
+ dot02 = d1[0]*d3[0] + d1[1]*d3[1];
+ dot11 = d2[0]*d2[0] + d2[1]*d2[1];
+ dot12 = d2[0]*d3[0] + d2[1]*d3[1];
+
+ invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
+ u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ if ((u > 0) && (v > 0) && (u + v < 1)) {isInside=1;} /* is inside a triangle */
+
+ /* If collision wasn't found but the face is a quad
+ * do another check for the second half */
+ if ((!isInside) && mface[i].v4)
+ {
+
+ /* change d2 to test the other half */
+ sub_v2_v2v2(d2, tface[i].uv[3], tface[i].uv[0]); // uv3 - uv0
+
+ /* test again */
+ dot00 = d1[0]*d1[0] + d1[1]*d1[1];
+ dot01 = d1[0]*d2[0] + d1[1]*d2[1];
+ dot02 = d1[0]*d3[0] + d1[1]*d3[1];
+ dot11 = d2[0]*d2[0] + d2[1]*d2[1];
+ dot12 = d2[0]*d3[0] + d2[1]*d3[1];
+
+ invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
+ u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ if ((u > 0) && (v > 0) && (u + v < 1)) {isInside=2;} /* is inside the second half of the quad */
+
+ }
+
+ /*
+ * If point was inside the face
+ */
+ if (isInside != 0) {
+
+ float uv1co[2], uv2co[2], uv3co[2], uv[2];
+ int j;
+
+ /* Get triagnle uvs */
+ if (isInside==1) {
+ copy_v2_v2(uv1co, tface[i].uv[0]);
+ copy_v2_v2(uv2co, tface[i].uv[1]);
+ copy_v2_v2(uv3co, tface[i].uv[2]);
+ }
+ else {
+ copy_v2_v2(uv1co, tface[i].uv[0]);
+ copy_v2_v2(uv2co, tface[i].uv[2]);
+ copy_v2_v2(uv3co, tface[i].uv[3]);
+ }
+
+ /* Add b-weights per anti-aliasing sample */
+ for (j=0; j<aa_samples; j++) {
+ uv[0] = point[0][0] + jitter5sample[j*2] / w;
+ uv[1] = point[0][1] + jitter5sample[j*2+1] / h;
+
+ barycentric_weights_v2(uv1co, uv2co, uv3co, uv, tempWeights[index*aa_samples+j].v);
+ }
+
+ /* Set surface point face values */
+ tPoint->face_index = i; /* face index */
+ tPoint->quad = (isInside == 2) ? 1 : 0; /* quad or tri part*/
+
+ /* save vertex indexes */
+ tPoint->v1 = (isInside == 2) ? mface[i].v1 : mface[i].v1;
+ tPoint->v2 = (isInside == 2) ? mface[i].v3 : mface[i].v2;
+ tPoint->v3 = (isInside == 2) ? mface[i].v4 : mface[i].v3;
+
+ sample = 5; /* make sure we exit sample loop as well */
+ break;
+ }
+ }
+ } /* sample loop */
+ }
+ }
+
+ /*
+ * Now loop through every pixel that was left without index
+ * and find if they have neighbouring pixels that have an index.
+ * If so use that polygon as pixel surface.
+ * (To avoid seams on uv island edges)
+ */
+ #pragma omp parallel for schedule(static)
+ for (ty = 0; ty < h; ty++)
+ {
+ int tx;
+ for (tx = 0; tx < w; tx++)
+ {
+ int index = tx+w*ty;
+ PaintUVPoint *tPoint = (&tempPoints[index]);
+
+ /* If point isnt't on canvas mesh */
+ if (tPoint->face_index == -1) {
+ int u_min, u_max, v_min, v_max;
+ int u,v, ind;
+ float point[2];
+
+ /* get loop area */
+ u_min = (tx > 0) ? -1 : 0;
+ u_max = (tx < (w-1)) ? 1 : 0;
+ v_min = (ty > 0) ? -1 : 0;
+ v_max = (ty < (h-1)) ? 1 : 0;
+
+ point[0] = ((float)tx + 0.5f) / w;
+ point[1] = ((float)ty + 0.5f) / h;
+
+ /* search through defined area for neighbour */
+ for (u=u_min; u<=u_max; u++)
+ for (v=v_min; v<=v_max; v++) {
+ /* if not this pixel itself */
+ if (u!=0 || v!=0) {
+ ind = (tx+u)+w*(ty+v);
+
+ /* if neighbour has index */
+ if (tempPoints[ind].face_index != -1) {
+
+ float uv1co[2], uv2co[2], uv3co[2], uv[2];
+ int i = tempPoints[ind].face_index, j;
+
+ /* Now calculate pixel data for this pixel as it was on polygon surface */
+ if (!tempPoints[ind].quad) {
+ copy_v2_v2(uv1co, tface[i].uv[0]);
+ copy_v2_v2(uv2co, tface[i].uv[1]);
+ copy_v2_v2(uv3co, tface[i].uv[2]);
+ }
+ else {
+ copy_v2_v2(uv1co, tface[i].uv[0]);
+ copy_v2_v2(uv2co, tface[i].uv[2]);
+ copy_v2_v2(uv3co, tface[i].uv[3]);
+ }
+
+ /* Add b-weights per anti-aliasing sample */
+ for (j=0; j<aa_samples; j++) {
+
+ uv[0] = point[0] + jitter5sample[j*2] / w;
+ uv[1] = point[1] + jitter5sample[j*2+1] / h;
+ barycentric_weights_v2(uv1co, uv2co, uv3co, uv, tempWeights[index*aa_samples+j].v);
+ }
+
+ /* Set values */
+ tPoint->neighbour_pixel = ind; // face index
+ tPoint->quad = tempPoints[ind].quad; // quad or tri
+
+ /* save vertex indexes */
+ tPoint->v1 = (tPoint->quad) ? mface[i].v1 : mface[i].v1;
+ tPoint->v2 = (tPoint->quad) ? mface[i].v3 : mface[i].v2;
+ tPoint->v3 = (tPoint->quad) ? mface[i].v4 : mface[i].v3;
+
+ u = u_max + 1; /* make sure we exit outer loop as well */
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * When base loop is over convert found neighbour indexes to real ones
+ * Also count the final number of active surface points
+ */
+ for (ty = 0; ty < h; ty++)
+ {
+ int tx;
+ for (tx = 0; tx < w; tx++)
+ {
+ int index = tx+w*ty;
+ PaintUVPoint *tPoint = (&tempPoints[index]);
+
+ if (tPoint->face_index == -1 && tPoint->neighbour_pixel != -1) tPoint->face_index = tempPoints[tPoint->neighbour_pixel].face_index;
+ if (tPoint->face_index != -1) active_points++;
+ }
+ }
+
+ /* If any effect enabled, create surface effect / wet layer
+ * neighbour lists. Processes possibly moving data. */
+ if (surface_usesAdjData(surface)) {
+
+ int i, cursor=0;
+
+ /* Create a temporary array of final indexes (before unassigned
+ * pixels have been dropped) */
+ for (i=0; i<w*h; i++) {
+ if (tempPoints[i].face_index != -1) {
+ final_index[i] = cursor;
+ cursor++;
+ }
+ }
+ /* allocate memory */
+ sData->total_points = w*h;
+ dynamicPaint_initAdjacencyData(surface, 0);
+
+ 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;
+ for (tx = 0; tx < w; tx++)
+ {
+ int i, index = tx+w*ty;
+
+ if (tempPoints[index].face_index != -1) {
+ ed->n_index[final_index[index]] = n_pos;
+ ed->n_num[final_index[index]] = 0;
+
+ for (i=0; i<8; i++) {
+
+ /* Try to find a neighbouring pixel in defined direction
+ * If not found, -1 is returned */
+ int n_target = dynamicPaint_findNeighbourPixel(tempPoints, dm, uvname, w, h, tx, ty, i);
+
+ if (n_target != -1) {
+ ed->n_target[n_pos] = final_index[n_target];
+ ed->n_num[final_index[index]]++;
+ n_pos++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* Create final surface data without inactive points */
+ {
+ ImgSeqFormatData *f_data = MEM_callocN(sizeof(struct ImgSeqFormatData), "ImgSeqFormatData");
+ if (f_data) {
+ f_data->uv_p = MEM_callocN(active_points*sizeof(struct PaintUVPoint), "PaintUVPoint");
+ f_data->barycentricWeights = MEM_callocN(active_points*aa_samples*sizeof(struct Vec3f), "PaintUVPoint");
+
+ if (!f_data->uv_p || !f_data->barycentricWeights) error=1;
+ }
+ else error=1;
+
+ sData->total_points = active_points;
+
+ /* in case of allocation error, free everything */
+ if (error) {
+ if (f_data) {
+ if (f_data->uv_p) MEM_freeN(f_data->uv_p);
+ if (f_data->barycentricWeights) MEM_freeN(f_data->barycentricWeights);
+ MEM_freeN(f_data);
+ }
+ }
+ else {
+ int index, cursor = 0;
+ sData->total_points = active_points;
+ sData->format_data = f_data;
+
+ for(index = 0; index < (w*h); index++) {
+ if (tempPoints[index].face_index != -1) {
+ memcpy(&f_data->uv_p[cursor], &tempPoints[index], sizeof(PaintUVPoint));
+ memcpy(&f_data->barycentricWeights[cursor*aa_samples], &tempWeights[index*aa_samples], sizeof(Vec3f)*aa_samples);
+ cursor++;
+ }
+ }
+ }
+ }
+ }
+ if (error==1) setError(canvas, "Not enough free memory.");
+
+ if (faceBB) MEM_freeN(faceBB);
+ if (tempPoints) MEM_freeN(tempPoints);
+ if (tempWeights) MEM_freeN(tempWeights);
+ if (final_index) MEM_freeN(final_index);
+
+ /* Init surface type data */
+ if (!error) {
+ dynamicPaint_allocateSurfaceType(surface);
+
+#if 0
+ /* -----------------------------------------------------------------
+ * For debug, output pixel statuses to the color map
+ * -----------------------------------------------------------------*/
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
+ PaintUVPoint *uvPoint = &((PaintUVPoint*)f_data->uv_p)[index];
+ PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index];
+ pPoint->alpha=1.0f;
+
+ /* Every pixel that is assigned as "edge pixel" gets blue color */
+ if (uvPoint->neighbour_pixel != -1) pPoint->color[2] = 1.0f;
+ /* and every pixel that finally got an polygon gets red color */
+ if (uvPoint->face_index != -1) pPoint->color[0] = 1.0f;
+ /* green color shows pixel face index hash */
+ if (uvPoint->face_index != -1) pPoint->color[1] = (float)(uvPoint->face_index % 255)/256.0f;
+ }
+
+#endif
+ dynamicPaint_setInitialColor(surface);
+ }
+
+ return (error == 0);
+}
+
+/*
+* Outputs an image file from uv surface data.
+*/
+void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char* filename, short output_layer)
+{
+ int index;
+ ImBuf* ibuf = NULL;
+ PaintSurfaceData *sData = surface->data;
+ ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
+ /* OpenEXR or PNG */
+ int format = (surface->image_fileformat & MOD_DPAINT_IMGFORMAT_OPENEXR) ? R_OPENEXR : R_PNG;
+ char output_file[FILE_MAX];
+
+ if (!sData || !sData->type_data) {setError(surface->canvas, "Image save failed: Invalid surface.");return;}
+ /* if selected format is openexr, but current build doesnt support one */
+ #ifndef WITH_OPENEXR
+ if (format == R_OPENEXR) format = R_PNG;
+ #endif
+ BLI_strncpy(output_file, filename, sizeof(output_file));
+ BKE_add_image_extension(output_file, format);
+
+ /* Validate output file path */
+ BLI_path_abs(output_file, G.main->name);
+ BLI_make_existing_file(output_file);
+
+ /* Init image buffer */
+ ibuf = IMB_allocImBuf(surface->image_resolution, surface->image_resolution, 32, IB_rectfloat);
+ if (ibuf == NULL) {setError(surface->canvas, "Image save failed: Not enough free memory.");return;}
+
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ int pos=f_data->uv_p[index].pixel_index*4; /* image buffer position */
+
+ /* Set values of preferred type */
+ if (output_layer == 1) {
+ /* wetmap */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ PaintPoint *point = &((PaintPoint*)sData->type_data)[index];
+ float value = (point->wetness > 1.0f) ? 1.0f : point->wetness;
+
+ ibuf->rect_float[pos]=value;
+ ibuf->rect_float[pos+1]=value;
+ ibuf->rect_float[pos+2]=value;
+ ibuf->rect_float[pos+3]=1.0f;
+ }
+ }
+ else if (output_layer == 0) {
+ /* Paintmap */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ PaintPoint *point = &((PaintPoint*)sData->type_data)[index];
+
+ ibuf->rect_float[pos] = point->color[0];
+ ibuf->rect_float[pos+1] = point->color[1];
+ ibuf->rect_float[pos+2] = point->color[2];
+ /* mix wet layer */
+ if (point->e_alpha) mixColors(&ibuf->rect_float[pos], point->alpha, point->e_color, point->e_alpha);
+
+ /* use highest alpha */
+ ibuf->rect_float[pos+3] = (point->e_alpha > point->alpha) ? point->e_alpha : point->alpha;
+
+ /* Multiply color by alpha if enabled */
+ if (surface->flags & MOD_DPAINT_MULALPHA) {
+ ibuf->rect_float[pos] *= ibuf->rect_float[pos+3];
+ ibuf->rect_float[pos+1] *= ibuf->rect_float[pos+3];
+ ibuf->rect_float[pos+2] *= ibuf->rect_float[pos+3];
+ }
+ }
+ /* displace */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) {
+ float depth = ((float*)sData->type_data)[index];
+ if (surface->depth_clamp)
+ depth /= surface->depth_clamp;
+
+ if (surface->disp_type == MOD_DPAINT_DISP_DISPLACE) {
+ depth = (0.5f - depth/2.0f);
+ }
+
+ CLAMP(depth, 0.0f, 1.0f);
+
+ ibuf->rect_float[pos]=depth;
+ ibuf->rect_float[pos+1]=depth;
+ ibuf->rect_float[pos+2]=depth;
+ ibuf->rect_float[pos+3]=1.0f;
+ }
+ /* waves */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index];
+ float depth = wPoint->height;
+ if (surface->depth_clamp)
+ depth /= surface->depth_clamp;
+ depth = (0.5f + depth/2.0f);
+ CLAMP(depth, 0.0f, 1.0f);
+
+ ibuf->rect_float[pos]=depth;
+ ibuf->rect_float[pos+1]=depth;
+ ibuf->rect_float[pos+2]=depth;
+ ibuf->rect_float[pos+3]=1.0f;
+ }
+ }
+ }
+
+ /* Set output format, png in case exr isnt supported */
+ ibuf->ftype= PNG|95;
+#ifdef WITH_OPENEXR
+ if (format == R_OPENEXR) { /* OpenEXR 32-bit float */
+ ibuf->ftype = OPENEXR | OPENEXR_COMPRESS;
+ }
+#endif
+
+ /* Save image */
+ IMB_saveiff(ibuf, output_file, IB_rectfloat);
+ IMB_freeImBuf(ibuf);
+}
+
+
+/***************************** Material / Texture Sampling ******************************/
+
+/* stores a copy of required materials to allow doing adjustments
+* without interfering the render/preview */
+typedef struct BrushMaterials {
+ Material *mat;
+ Material **ob_mats;
+ int tot;
+} BrushMaterials;
+
+/* Initialize materials for brush object:
+* Calculates inverse matrices for linked objects, updates
+* volume caches etc. */
+static void dynamicPaint_updateBrushMaterials(Object *brushOb, Material *ui_mat, Scene *scene, BrushMaterials *bMats)
+{
+ /* Calculate inverse transformation matrix
+ * for this object */
+ invert_m4_m4(brushOb->imat, brushOb->obmat);
+ copy_m4_m4(brushOb->imat_ren, brushOb->imat);
+
+ /* Now process every material linked to this brush object */
+ if ((ui_mat == NULL) && brushOb->mat && brushOb->totcol) {
+ int i, tot=(*give_totcolp(brushOb));
+
+ /* allocate material pointer array */
+ if (tot) {
+ bMats->ob_mats = MEM_callocN(sizeof(Material*)*(tot), "BrushMaterials");
+ for (i=0; i<tot; i++) {
+ bMats->ob_mats[i] = RE_init_sample_material(give_current_material(brushOb,(i+1)), scene);
+ }
+ }
+ bMats->tot = tot;
+ }
+ else {
+ bMats->mat = RE_init_sample_material(ui_mat, scene);
+ }
+}
+
+/* free all data allocated by dynamicPaint_updateBrushMaterials() */
+static void dynamicPaint_freeBrushMaterials(BrushMaterials *bMats)
+{
+ /* Now process every material linked to this brush object */
+ if (bMats->ob_mats) {
+ int i;
+ for (i=0; i<bMats->tot; i++) {
+ RE_free_sample_material(bMats->ob_mats[i]);
+ }
+ MEM_freeN(bMats->ob_mats);
+ }
+ else if (bMats->mat) {
+ RE_free_sample_material(bMats->mat);
+ }
+}
+
+/*
+* Get material diffuse color and alpha (including linked textures) in given coordinates
+*/
+void dynamicPaint_doMaterialTex(BrushMaterials *bMats, float color[3], float *alpha, Object *brushOb, const float volume_co[3], const float surface_co[3], int faceIndex, short isQuad, DerivedMesh *orcoDm)
+{
+ Material *mat = bMats->mat;
+ MFace *mface = orcoDm->getFaceArray(orcoDm);
+
+ /* If no material defined, use the one assigned to the mesh face */
+ if (mat == NULL) {
+ if (bMats->ob_mats) {
+ int mat_nr = mface[faceIndex].mat_nr;
+ if (mat_nr >= (*give_totcolp(brushOb))) return;
+ mat = bMats->ob_mats[mat_nr];
+ if (mat == NULL) return; /* No material assigned */
+ }
+ else return;
+ }
+
+ RE_sample_material_color(mat, color, alpha, volume_co, surface_co, faceIndex, isQuad, orcoDm, brushOb);
+}
+
+
+/***************************** Ray / Nearest Point Utils ******************************/
+
+
+/* A modified callback to bvh tree raycast. The tree must bust have been built using bvhtree_from_mesh_faces.
+* userdata must be a BVHMeshCallbackUserdata built from the same mesh as the tree.
+*
+* To optimize brush detection speed this doesn't calculate hit coordinates or normal.
+* If ray hit the second half of a quad, no[0] is set to 1.0f.
+*/
+static void mesh_faces_spherecast_dp(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+{
+ const BVHTreeFromMesh *data = (BVHTreeFromMesh*) userdata;
+ MVert *vert = data->vert;
+ MFace *face = data->face + index;
+ short quad = 0;
+
+ float *t0, *t1, *t2, *t3;
+ t0 = vert[ face->v1 ].co;
+ t1 = vert[ face->v2 ].co;
+ t2 = vert[ face->v3 ].co;
+ t3 = face->v4 ? vert[ face->v4].co : NULL;
+
+ do
+ {
+ float dist = bvhtree_ray_tri_intersection(ray, hit->dist, t0, t1, t2);
+
+ if(dist >= 0 && dist < hit->dist)
+ {
+ hit->index = index;
+ hit->dist = dist;
+ hit->no[0] = (quad) ? 1.0f : 0.0f;
+ }
+
+ t1 = t2;
+ t2 = t3;
+ t3 = NULL;
+ quad = 1;
+
+ } while(t2);
+}
+
+/* A modified callback to bvh tree nearest point. The tree must bust have been built using bvhtree_from_mesh_faces.
+* userdata must be a BVHMeshCallbackUserdata built from the same mesh as the tree.
+*
+* To optimize brush detection speed this doesn't calculate hit normal.
+* If ray hit the second half of a quad, no[0] is set to 1.0f, else 0.0f
+*/
+static void mesh_faces_nearest_point_dp(void *userdata, int index, const float *co, BVHTreeNearest *nearest)
+{
+ const BVHTreeFromMesh *data = (BVHTreeFromMesh*) userdata;
+ MVert *vert = data->vert;
+ MFace *face = data->face + index;
+ short quad = 0;
+
+ float *t0, *t1, *t2, *t3;
+ t0 = vert[ face->v1 ].co;
+ t1 = vert[ face->v2 ].co;
+ t2 = vert[ face->v3 ].co;
+ t3 = face->v4 ? vert[ face->v4].co : NULL;
+
+ do
+ {
+ float nearest_tmp[3], dist;
+ int vertex, edge;
+
+ dist = nearest_point_in_tri_surface(t0, t1, t2, co, &vertex, &edge, nearest_tmp);
+ if(dist < nearest->dist)
+ {
+ nearest->index = index;
+ nearest->dist = dist;
+ copy_v3_v3(nearest->co, nearest_tmp);
+ nearest->no[0] = (quad) ? 1.0f : 0.0f;
+ }
+
+ t1 = t2;
+ t2 = t3;
+ t3 = NULL;
+ quad = 1;
+
+ } while(t2);
+}
+
+
+/***************************** Brush Painting Calls ******************************/
+
+/*
+* Mix color values to canvas point.
+*
+* surface : canvas surface
+* index : surface point index
+* paintFlags : paint object flags
+* paintColor,Alpha,Wetness : to be mixed paint values
+* timescale : value used to adjust time dependand
+* operations when using substeps
+*/
+static void dynamicPaint_mixPaintColors(DynamicPaintSurface *surface, int index, int paintFlags, float *paintColor, float *paintAlpha, float *paintWetness, float *timescale)
+{
+ PaintPoint *pPoint = &((PaintPoint*)surface->data->type_data)[index];
+
+ /* Add paint */
+ if (!(paintFlags & MOD_DPAINT_ERASE)) {
+ float mix[4];
+ float temp_alpha = (*paintAlpha) * ((paintFlags & MOD_DPAINT_ABS_ALPHA) ? 1.0f : (*timescale));
+
+ /* mix brush color with wet layer color */
+ blendColors(pPoint->e_color, pPoint->e_alpha, paintColor, temp_alpha, mix);
+ copy_v3_v3(pPoint->e_color, mix);
+
+ /* mix wetness and alpha depending on selected alpha mode */
+ if (paintFlags & MOD_DPAINT_ABS_ALPHA) {
+ /* update values to the brush level unless theyre higher already */
+ if (pPoint->e_alpha < (*paintAlpha)) pPoint->e_alpha = (*paintAlpha);
+ if (pPoint->wetness < (*paintWetness)) pPoint->wetness = (*paintWetness);
+ }
+ else {
+ float wetness = (*paintWetness);
+ CLAMP(wetness, 0.0f, 1.0f);
+ pPoint->e_alpha = mix[3];
+ pPoint->wetness = pPoint->wetness*(1.0f-wetness) + wetness;
+ }
+
+ if (pPoint->wetness<MIN_WETNESS) pPoint->wetness = MIN_WETNESS;
+
+ pPoint->state = DPAINT_PAINT_NEW;
+ }
+ /* Erase paint */
+ else {
+ float a_ratio, a_highest;
+ float wetness;
+ float invFact = 1.0f - (*paintAlpha);
+
+ /*
+ * Make highest alpha to match erased value
+ * but maintain alpha ratio
+ */
+ if (paintFlags & MOD_DPAINT_ABS_ALPHA) {
+ a_highest = (pPoint->e_alpha > pPoint->alpha) ? pPoint->e_alpha : pPoint->alpha;
+ if (a_highest > invFact) {
+ a_ratio = invFact / a_highest;
+
+ pPoint->e_alpha *= a_ratio;
+ pPoint->alpha *= a_ratio;
+ }
+ }
+ else {
+ pPoint->e_alpha -= (*paintAlpha) * (*timescale);
+ if (pPoint->e_alpha < 0.0f) pPoint->e_alpha = 0.0f;
+ pPoint->alpha -= (*paintAlpha) * (*timescale);
+ if (pPoint->alpha < 0.0f) pPoint->alpha = 0.0f;
+ }
+
+ wetness = (1.0f - (*paintWetness)) * pPoint->e_alpha;
+ if (pPoint->wetness > wetness) pPoint->wetness = wetness;
+ }
+}
+
+/* applies given brush intersection value for wave surface */
+static void dynamicPaint_mixWaveHeight(PaintWavePoint *wPoint, DynamicPaintBrushSettings *brush, float isect_height)
+{
+ int hit = 0;
+ isect_height *= brush->wave_factor;
+
+ /* determine hit depending on wave_factor */
+ if (brush->wave_factor > 0.0f && wPoint->height > isect_height)
+ hit = 1;
+ else if (brush->wave_factor < 0.0f && wPoint->height < isect_height)
+ hit = 1;
+
+ if (hit) {
+ if (brush->wave_type == MOD_DPAINT_WAVEB_DEPTH) {
+ wPoint->height = isect_height;
+ wPoint->state = DPAINT_WAVE_OBSTACLE;
+ wPoint->velocity = 0.0f;
+ }
+ else if (brush->wave_type == MOD_DPAINT_WAVEB_FORCE)
+ wPoint->velocity = isect_height;
+ else if (brush->wave_type == MOD_DPAINT_WAVEB_REFLECT)
+ wPoint->state = DPAINT_WAVE_REFLECT_ONLY;
+ }
+}
+
+/*
+* add brush results to the surface data depending on surface type
+*/
+static void dynamicPaint_updatePointData(DynamicPaintSurface *surface, unsigned int index, DynamicPaintBrushSettings *brush,
+ float paint[3], float influence, float depth, float vel_factor, float timescale)
+{
+ PaintSurfaceData *sData = surface->data;
+ float strength = influence * brush->alpha;
+ CLAMP(strength, 0.0f, 1.0f);
+
+ /* Sample velocity colorband if required */
+ if (brush->flags & (MOD_DPAINT_VELOCITY_ALPHA|MOD_DPAINT_VELOCITY_COLOR|MOD_DPAINT_VELOCITY_DEPTH)) {
+ float coba_res[4];
+ vel_factor /= brush->max_velocity;
+ CLAMP(vel_factor, 0.0f, 1.0f);
+
+ if (do_colorband(brush->vel_ramp, vel_factor, coba_res)) {
+ if (brush->flags & MOD_DPAINT_VELOCITY_COLOR) {
+ paint[0] = coba_res[0];
+ paint[1] = coba_res[1];
+ paint[2] = coba_res[2];
+ }
+ if (brush->flags & MOD_DPAINT_VELOCITY_ALPHA)
+ strength *= coba_res[3];
+ if (brush->flags & MOD_DPAINT_VELOCITY_DEPTH)
+ depth *= coba_res[3];
+ }
+ }
+
+ /* mix paint surface */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+
+ float paintWetness = brush->wetness * strength;
+ float paintAlpha = strength;
+
+ dynamicPaint_mixPaintColors(surface, index, brush->flags, paint, &paintAlpha, &paintWetness, &timescale);
+
+ }
+ /* displace surface */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) {
+ float *value = (float*)sData->type_data;
+
+ if (surface->flags & MOD_DPAINT_DISP_INCREMENTAL)
+ depth = value[index] + depth;
+
+ if (surface->depth_clamp) {
+ CLAMP(depth, 0.0f-surface->depth_clamp, surface->depth_clamp);
+ }
+
+ if (brush->flags & MOD_DPAINT_ERASE) {
+ value[index] *= (1.0f - strength);
+ if (value[index] < 0.0f) value[index] = 0.0f;
+ }
+ else {
+ if (value[index] < depth) value[index] = depth;
+ }
+ }
+ /* vertex weight group surface */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
+ float *value = (float*)sData->type_data;
+
+ if (brush->flags & MOD_DPAINT_ERASE) {
+ value[index] *= (1.0f - strength);
+ if (value[index] < 0.0f) value[index] = 0.0f;
+ }
+ else {
+ if (value[index] < strength) value[index] = strength;
+ }
+ }
+ /* wave surface */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ if (brush->wave_clamp) {
+ CLAMP(depth, 0.0f-brush->wave_clamp, brush->wave_clamp);
+ }
+
+ dynamicPaint_mixWaveHeight(&((PaintWavePoint*)sData->type_data)[index],
+ brush, 0.0f-depth);
+ }
+
+ /* doing velocity based painting */
+ if (sData->bData->brush_velocity) {
+ sData->bData->brush_velocity[index*4+3] *= influence;
+ }
+}
+
+/* checks whether surface and brush bounds intersect depending on brush type */
+static int meshBrush_boundsIntersect(Bounds3D *b1, Bounds3D *b2, DynamicPaintBrushSettings *brush)
+{
+ if (brush->collision == MOD_DPAINT_COL_VOLUME)
+ return boundsIntersect(b1, b2);
+ else if (brush->collision == MOD_DPAINT_COL_DIST || brush->collision == MOD_DPAINT_COL_VOLDIST)
+ return boundsIntersectDist(b1, b2, brush->paint_distance);
+ else return 1;
+}
+
+/* calculate velocity for mesh vertices */
+static void dynamicPaint_brushMeshCalculateVelocity(Scene *scene, Object *ob, DynamicPaintBrushSettings *brush, Vec3f **brushVel, float timescale)
+{
+ int i;
+ float prev_obmat[4][4];
+ DerivedMesh *dm_p, *dm_c;
+ MVert *mvert_p, *mvert_c;
+ int numOfVerts_p, numOfVerts_c;
+
+ float cur_sfra = scene->r.subframe;
+ int cur_fra = scene->r.cfra;
+ float prev_sfra = cur_sfra - timescale;
+ int prev_fra = cur_fra;
+
+ if (prev_sfra < 0.0f) {
+ prev_sfra += 1.0f;
+ prev_fra = cur_fra - 1;
+ }
+
+ /* previous frame dm */
+ scene->r.cfra = prev_fra;
+ scene->r.subframe = prev_sfra;
+
+ subframe_updateObject(scene, ob, UPDATE_EVERYTHING, BKE_curframe(scene));
+ dm_p = CDDM_copy(brush->dm);
+ numOfVerts_p = dm_p->getNumVerts(dm_p);
+ mvert_p = dm_p->getVertArray(dm_p);
+ copy_m4_m4(prev_obmat, ob->obmat);
+
+ /* current frame dm */
+ scene->r.cfra = cur_fra;
+ scene->r.subframe = cur_sfra;
+
+ subframe_updateObject(scene, ob, UPDATE_EVERYTHING, BKE_curframe(scene));
+ dm_c = brush->dm;
+ numOfVerts_c = dm_c->getNumVerts(dm_c);
+ mvert_c = dm_p->getVertArray(dm_c);
+
+ (*brushVel) = (struct Vec3f *) MEM_mallocN(numOfVerts_c*sizeof(Vec3f), "Dynamic Paint brush velocity");
+ if (!(*brushVel)) return;
+
+ /* if mesh is constructive -> num of verts has changed,
+ * only use current frame derived mesh */
+ if (numOfVerts_p != numOfVerts_c)
+ mvert_p = mvert_c;
+
+ /* calculate speed */
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfVerts_c; i++) {
+ float p1[3], p2[3];
+
+ copy_v3_v3(p1, mvert_p[i].co);
+ mul_m4_v3(prev_obmat, p1);
+
+ copy_v3_v3(p2, mvert_c[i].co);
+ mul_m4_v3(ob->obmat, p2);
+
+ sub_v3_v3v3((*brushVel)[i].v, p2, p1);
+ mul_v3_fl((*brushVel)[i].v, 1.0f/timescale);
+ }
+
+ dm_p->release(dm_p);
+}
+
+/* calculate velocity for object center point */
+static void dynamicPaint_brushObjectCalculateVelocity(Scene *scene, Object *ob, Vec3f *brushVel, float timescale)
+{
+ float prev_obmat[4][4];
+ float cur_loc[3] = {0.0f}, prev_loc[3] = {0.0f};
+
+ float cur_sfra = scene->r.subframe;
+ int cur_fra = scene->r.cfra;
+ float prev_sfra = cur_sfra - timescale;
+ int prev_fra = cur_fra;
+
+ if (prev_sfra < 0.0f) {
+ prev_sfra += 1.0f;
+ prev_fra = cur_fra - 1;
+ }
+
+ /* previous frame dm */
+ scene->r.cfra = prev_fra;
+ scene->r.subframe = prev_sfra;
+ subframe_updateObject(scene, ob, UPDATE_PARENTS, BKE_curframe(scene));
+ copy_m4_m4(prev_obmat, ob->obmat);
+
+ /* current frame dm */
+ scene->r.cfra = cur_fra;
+ scene->r.subframe = cur_sfra;
+ subframe_updateObject(scene, ob, UPDATE_PARENTS, BKE_curframe(scene));
+
+ /* calculate speed */
+ mul_m4_v3(prev_obmat, prev_loc);
+ mul_m4_v3(ob->obmat, cur_loc);
+
+ sub_v3_v3v3(brushVel->v, cur_loc, prev_loc);
+ mul_v3_fl(brushVel->v, 1.0f/timescale);
+}
+
+/*
+* Paint a brush object mesh to the surface
+*/
+static int dynamicPaint_paintMesh(DynamicPaintSurface *surface,
+ DynamicPaintBrushSettings *brush,
+ Object *brushOb,
+ BrushMaterials *bMats,
+ Scene *scene,
+ float timescale)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ DerivedMesh *dm = NULL;
+ Vec3f *brushVelocity = NULL;
+ MVert *mvert = NULL;
+ MFace *mface = NULL;
+
+ if (brush->flags & MOD_DPAINT_USES_VELOCITY)
+ dynamicPaint_brushMeshCalculateVelocity(scene, brushOb, brush, &brushVelocity, timescale);
+
+ if (!brush->dm) return 0;
+ {
+ BVHTreeFromMesh treeData = {0};
+ float avg_brushNor[3] = {0.0f};
+ int numOfVerts;
+ int ii;
+ Bounds3D mesh_bb = {0};
+ VolumeGrid *grid = bData->grid;
+
+ dm = CDDM_copy(brush->dm);
+ mvert = dm->getVertArray(dm);
+ mface = dm->getFaceArray(dm);
+ numOfVerts = dm->getNumVerts(dm);
+
+ /* Transform collider vertices to global space
+ * (Faster than transforming per surface point
+ * coordinates and normals to object space) */
+ for (ii=0; ii<numOfVerts; ii++) {
+ mul_m4_v3(brushOb->obmat, mvert[ii].co);
+ boundInsert(&mesh_bb, mvert[ii].co);
+
+ /* for project brush calculate average normal */
+ if (brush->collision & MOD_DPAINT_COL_DIST && brush->flags & MOD_DPAINT_PROX_PROJECT) {
+ float nor[3];
+ normal_short_to_float_v3(nor, mvert[ii].no);
+ mul_mat3_m4_v3(brushOb->obmat, nor);
+ normalize_v3(nor);
+
+ add_v3_v3(avg_brushNor, nor);
+ }
+ }
+
+ if (brush->collision & MOD_DPAINT_COL_DIST && brush->flags & MOD_DPAINT_PROX_PROJECT) {
+ mul_v3_fl(avg_brushNor, 1.0f/(float)numOfVerts);
+ /* instead of null vector use positive z */
+ if (!(MIN3(avg_brushNor[0],avg_brushNor[1],avg_brushNor[2])))
+ avg_brushNor[2] = 1.0f;
+ else
+ normalize_v3(avg_brushNor);
+ }
+
+ /* check bounding box collision */
+ if(grid && meshBrush_boundsIntersect(&grid->grid_bounds, &mesh_bb, brush))
+ /* Build a bvh tree from transformed vertices */
+ if (bvhtree_from_mesh_faces(&treeData, dm, 0.0f, 4, 8))
+ {
+ int c_index;
+ int total_cells = grid->dim[0]*grid->dim[1]*grid->dim[2];
+
+ /* loop through space partitioning grid */
+ for (c_index=0; c_index<total_cells; c_index++) {
+ int id;
+
+ /* check grid cell bounding box */
+ if (!grid->s_num[c_index] || !meshBrush_boundsIntersect(&grid->bounds[c_index], &mesh_bb, brush))
+ continue;
+
+ /* loop through cell points and process brush */
+ #pragma omp parallel for schedule(static)
+ for (id = 0; id < grid->s_num[c_index]; id++)
+ {
+ int index = grid->t_index[grid->s_pos[c_index] + id];
+ int ss, samples = bData->s_num[index];
+ float total_sample = (float)samples;
+ float brushStrength = 0.0f; /* brush influence factor */
+ float depth = 0.0f; /* brush intersection depth */
+ float velocity_val = 0.0f;
+
+ float paintColor[3] = {0.0f};
+ int numOfHits = 0;
+
+ /* for image sequence anti-aliasing, use gaussian factors */
+ if (samples > 1 && surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ)
+ total_sample = gaussianTotal;
+
+ /* Supersampling */
+ for (ss=0; ss<samples; ss++)
+ {
+
+ float ray_start[3], ray_dir[3];
+ float sample_factor = 0.0f;
+ float sampleStrength = 0.0f;
+ BVHTreeRayHit hit;
+ BVHTreeNearest nearest;
+ short hit_found = 0;
+
+ /* volume sample */
+ float volume_factor = 0.0f;
+ /* proximity sample */
+ float proximity_factor = 0.0f;
+ float prox_colorband[4] = {0.0f};
+ int inner_proximity = (brush->flags & MOD_DPAINT_INVERSE_PROX &&
+ brush->collision == MOD_DPAINT_COL_VOLDIST);
+
+ /* hit data */
+ float hitCoord[3];
+ int hitFace = -1;
+ short hitQuad;
+
+ /* Supersampling factor */
+ if (samples > 1 && surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ)
+ sample_factor = gaussianFactors[ss];
+ else
+ sample_factor = 1.0f;
+
+ /* Get current sample position in world coordinates */
+ copy_v3_v3(ray_start, bData->realCoord[bData->s_pos[index]+ss].v);
+ copy_v3_v3(ray_dir, bData->bNormal[index].invNorm);
+
+ /* a simple hack to minimize chance of ray leaks at identical ray <-> edge locations */
+ add_v3_fl(ray_start, 0.001f);
+
+ hit.index = -1;
+ hit.dist = 9999;
+ nearest.index = -1;
+ nearest.dist = brush->paint_distance * brush->paint_distance; /* find_nearest uses squared distance */
+
+ /* Check volume collision */
+ if (brush->collision == MOD_DPAINT_COL_VOLUME || brush->collision == MOD_DPAINT_COL_VOLDIST)
+ if(BLI_bvhtree_ray_cast(treeData.tree, ray_start, ray_dir, 0.0f, &hit, mesh_faces_spherecast_dp, &treeData) != -1)
+ {
+ /* We hit a triangle, now check if collision point normal is facing the point */
+
+ /* For optimization sake, hit point normal isn't calculated in ray cast loop */
+ int v1=mface[hit.index].v1, v2=mface[hit.index].v2, v3=mface[hit.index].v3, quad=(hit.no[0] == 1.0f);
+ float dot;
+
+ if (quad) {v2=mface[hit.index].v3; v3=mface[hit.index].v4;}
+ normal_tri_v3( hit.no, mvert[v1].co, mvert[v2].co, mvert[v3].co);
+ dot = ray_dir[0]*hit.no[0] + ray_dir[1]*hit.no[1] + ray_dir[2]*hit.no[2];
+
+ /* If ray and hit face normal are facing same direction
+ * hit point is inside a closed mesh. */
+ if (dot>=0)
+ {
+ float dist = hit.dist;
+ int f_index = hit.index;
+
+ /* Also cast a ray in opposite direction to make sure
+ * point is at least surrounded by two brush faces */
+ mul_v3_fl(ray_dir, -1.0f);
+ hit.index = -1;
+ hit.dist = 9999;
+
+ BLI_bvhtree_ray_cast(treeData.tree, ray_start, ray_dir, 0.0f, &hit, mesh_faces_spherecast_dp, &treeData);
+
+ if(hit.index != -1) {
+ /* Add factor on supersample filter */
+ volume_factor = 1.0f;
+ hit_found = HIT_VOLUME;
+
+ /* Mark hit info */
+ madd_v3_v3v3fl(hitCoord, ray_start, ray_dir, hit.dist); /* Calculate final hit coordinates */
+ depth += dist*sample_factor;
+ hitFace = f_index;
+ hitQuad = quad;
+ }
+ }
+ }
+
+ /* Check proximity collision */
+ if ((brush->collision == MOD_DPAINT_COL_DIST || brush->collision == MOD_DPAINT_COL_VOLDIST) &&
+ (!hit_found || (brush->flags & MOD_DPAINT_INVERSE_PROX)))
+ {
+ float proxDist = -1.0f;
+ float hitCo[3];
+ short hQuad;
+ int face;
+
+ /* if inverse prox and no hit found, skip this sample */
+ if (inner_proximity && !hit_found) continue;
+
+ /* If pure distance proximity, find the nearest point on the mesh */
+ if (brush->collision != MOD_DPAINT_COL_DIST || !(brush->flags & MOD_DPAINT_PROX_PROJECT)) {
+ if (BLI_bvhtree_find_nearest(treeData.tree, ray_start, &nearest, mesh_faces_nearest_point_dp, &treeData) != -1) {
+ proxDist = sqrt(nearest.dist);
+ copy_v3_v3(hitCo, nearest.co);
+ hQuad = (nearest.no[0] == 1.0f);
+ face = nearest.index;
+ }
+ }
+ else { /* else cast a ray in defined projection direction */
+ float proj_ray[3] = {0.0f};
+
+ if (brush->ray_dir == MOD_DPAINT_RAY_CANVAS) {
+ copy_v3_v3(proj_ray, bData->bNormal[index].invNorm);
+ negate_v3(proj_ray);
+ }
+ else if (brush->ray_dir == MOD_DPAINT_RAY_BRUSH_AVG) {
+ copy_v3_v3(proj_ray, avg_brushNor);
+ }
+ else { /* MOD_DPAINT_RAY_ZPLUS */
+ proj_ray[2] = 1.0f;
+ }
+ hit.index = -1;
+ hit.dist = brush->paint_distance;
+
+ /* Do a face normal directional raycast, and use that distance */
+ if(BLI_bvhtree_ray_cast(treeData.tree, ray_start, proj_ray, 0.0f, &hit, mesh_faces_spherecast_dp, &treeData) != -1)
+ {
+ proxDist = hit.dist;
+ madd_v3_v3v3fl(hitCo, ray_start, proj_ray, hit.dist); /* Calculate final hit coordinates */
+ hQuad = (hit.no[0] == 1.0f);
+ face = hit.index;
+ }
+ }
+
+ /* If a hit was found, calculate required values */
+ if (proxDist >= 0.0f && proxDist <= brush->paint_distance) {
+ proximity_factor = proxDist / brush->paint_distance;
+ CLAMP(proximity_factor, 0.0f, 1.0f);
+ if (!inner_proximity)
+ proximity_factor = 1.0f - proximity_factor;
+
+ hit_found = HIT_PROXIMITY;
+
+ /* if no volume hit, use prox point face info */
+ if (hitFace == -1) {
+ copy_v3_v3(hitCoord, hitCo);
+ hitQuad = hQuad;
+ hitFace = face;
+ }
+ }
+ }
+
+ /* mix final sample strength depending on brush settings */
+ if (hit_found) {
+ /* if "negate volume" enabled, negate all factors within volume*/
+ if (brush->collision == MOD_DPAINT_COL_VOLDIST && brush->flags & MOD_DPAINT_NEGATE_VOLUME) {
+ volume_factor = 1.0f - volume_factor;
+ if (inner_proximity)
+ proximity_factor = 1.0f - proximity_factor;
+ }
+
+ /* apply final sample depending on final hit type */
+ if (hit_found == HIT_VOLUME) {
+ sampleStrength = volume_factor;
+ }
+ else if (hit_found == HIT_PROXIMITY) {
+ /* apply falloff curve to the proximity_factor */
+ if (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP && do_colorband(brush->paint_ramp, (1.0f-proximity_factor), prox_colorband))
+ proximity_factor = prox_colorband[3];
+ else if (brush->proximity_falloff == MOD_DPAINT_PRFALL_CONSTANT)
+ proximity_factor = (!inner_proximity || brush->flags & MOD_DPAINT_NEGATE_VOLUME) ? 1.0f : 0.0f;
+ /* apply sample */
+ sampleStrength = proximity_factor;
+ }
+
+ sampleStrength *= sample_factor;
+ }
+ else continue;
+
+ /* velocity brush, only do on main sample */
+ if (brush->flags & MOD_DPAINT_USES_VELOCITY && ss==0 && brushVelocity) {
+ int v1,v2,v3;
+ float weights[4];
+ float brushPointVelocity[3];
+ float velocity[3];
+
+ if (!hitQuad) {
+ v1 = mface[hitFace].v1;
+ v2 = mface[hitFace].v2;
+ v3 = mface[hitFace].v3;
+ }
+ else {
+ v1 = mface[hitFace].v2;
+ v2 = mface[hitFace].v3;
+ v3 = mface[hitFace].v4;
+ }
+ /* calculate barycentric weights for hit point */
+ interp_weights_face_v3(weights, mvert[v1].co, mvert[v2].co, mvert[v3].co, NULL, hitCoord);
+
+ /* simple check based on brush surface velocity,
+ * todo: perhaps implement something that handles volume movement as well */
+
+ /* interpolate vertex speed vectors to get hit point velocity */
+ interp_v3_v3v3v3( brushPointVelocity,
+ brushVelocity[v1].v,
+ brushVelocity[v2].v,
+ brushVelocity[v3].v, weights);
+
+ /* substract canvas point velocity */
+ if (bData->velocity) {
+ sub_v3_v3v3(velocity, brushPointVelocity, bData->velocity[index].v);
+ }
+ else {
+ copy_v3_v3(velocity, brushPointVelocity);
+ }
+ velocity_val = len_v3(velocity);
+
+ /* if brush has smudge enabled store brush velocity */
+ if (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;
+ }
+ }
+
+ /*
+ * Process hit color and alpha
+ */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
+ {
+ float sampleColor[3];
+ float alpha_factor = 1.0f;
+
+ sampleColor[0] = brush->r;
+ sampleColor[1] = brush->g;
+ sampleColor[2] = brush->b;
+
+ /* Get material+textures color on hit point if required */
+ if (brush_usesMaterial(brush, scene))
+ dynamicPaint_doMaterialTex(bMats, sampleColor, &alpha_factor, brushOb, bData->realCoord[bData->s_pos[index]+ss].v, hitCoord, hitFace, hitQuad, brush->dm);
+
+ /* Sample proximity colorband if required */
+ if ((hit_found == HIT_PROXIMITY) && (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP)) {
+ if (!(brush->flags & MOD_DPAINT_RAMP_ALPHA)) {
+ sampleColor[0] = prox_colorband[0];
+ sampleColor[1] = prox_colorband[1];
+ sampleColor[2] = prox_colorband[2];
+ }
+ }
+
+ /* Add AA sample */
+ paintColor[0] += sampleColor[0];
+ paintColor[1] += sampleColor[1];
+ paintColor[2] += sampleColor[2];
+ sampleStrength *= alpha_factor;
+ numOfHits++;
+ }
+
+ /* apply sample strength */
+ brushStrength += sampleStrength;
+ } // end supersampling
+
+
+ /* if any sample was inside paint range */
+ if (brushStrength > 0.0f || depth > 0.0f) {
+
+ /* apply supersampling results */
+ if (samples > 1) {
+ brushStrength /= total_sample;
+ }
+ CLAMP(brushStrength, 0.0f, 1.0f);
+
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ /* Get final pixel color and alpha */
+ paintColor[0] /= numOfHits;
+ paintColor[1] /= numOfHits;
+ paintColor[2] /= numOfHits;
+ }
+ /* get final object space depth */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
+ surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ depth /= bData->bNormal[index].normal_scale * total_sample;
+ }
+
+ dynamicPaint_updatePointData(surface, index, brush, paintColor, brushStrength, depth, velocity_val, timescale);
+ }
+ }
+ }
+ }
+ /* free bvh tree */
+ free_bvhtree_from_mesh(&treeData);
+ dm->release(dm);
+
+ }
+
+ /* free brush velocity data */
+ if (brushVelocity)
+ MEM_freeN(brushVelocity);
+
+ return 1;
+}
+
+/*
+* Paint a particle system to the surface
+*/
+static int dynamicPaint_paintParticles(DynamicPaintSurface *surface,
+ ParticleSystem *psys,
+ DynamicPaintBrushSettings *brush,
+ float timescale)
+{
+ ParticleSettings *part=psys->part;
+ ParticleData *pa = NULL;
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ VolumeGrid *grid = bData->grid;
+
+ KDTree *tree;
+ int particlesAdded = 0;
+ int invalidParticles = 0;
+ int p = 0;
+
+ float solidradius = (brush->flags & MOD_DPAINT_PART_RAD) ? psys->part->size : brush->particle_radius;
+ float smooth = brush->particle_smooth;
+
+ float range = solidradius + smooth;
+ float particle_timestep = 0.04f * part->timetweak;
+
+ Bounds3D part_bb = {0};
+
+ if (psys->totpart < 1) return 1;
+
+ /*
+ * Build a kd-tree to optimize distance search
+ */
+ tree= BLI_kdtree_new(psys->totpart);
+
+ /* loop through particles and insert valid ones to the tree */
+ for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) {
+
+ /* Proceed only if particle is active */
+ if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0) continue;
+ else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0) continue;
+ else if(pa->flag & PARS_NO_DISP || pa->flag & PARS_UNEXIST) continue;
+
+ /* for debug purposes check if any NAN particle proceeds
+ * For some reason they get past activity check, this should rule most of them out */
+ if (isnan(pa->state.co[0]) || isnan(pa->state.co[1]) || isnan(pa->state.co[2])) {invalidParticles++;continue;}
+
+ /* make sure particle is close enough to canvas */
+ if (!boundIntersectPoint(&grid->grid_bounds, pa->state.co, range)) continue;
+
+ BLI_kdtree_insert(tree, p, pa->state.co, NULL);
+
+ /* calc particle system bounds */
+ boundInsert(&part_bb, pa->state.co);
+
+ particlesAdded++;
+ }
+ if (invalidParticles)
+ printf("Warning: Invalid particle(s) found!\n");
+
+ /* If no suitable particles were found, exit */
+ if (particlesAdded < 1) {
+ BLI_kdtree_free(tree);
+ return 1;
+ }
+
+ /* begin thread safe malloc */
+ BLI_begin_threaded_malloc();
+
+ /* only continue if particle bb is close enough to canvas bb */
+ if (boundsIntersectDist(&grid->grid_bounds, &part_bb, range))
+ {
+ int c_index;
+ int total_cells = grid->dim[0]*grid->dim[1]*grid->dim[2];
+
+ /* balance tree */
+ BLI_kdtree_balance(tree);
+
+ /* loop through space partitioning grid */
+ for (c_index=0; c_index<total_cells; c_index++) {
+ int id;
+
+ /* check cell bounding box */
+ if (!grid->s_num[c_index] ||
+ !boundsIntersectDist(&grid->bounds[c_index], &part_bb, range))
+ continue;
+
+ /* loop through cell points */
+ #pragma omp parallel for schedule(static)
+ for (id = 0; id < grid->s_num[c_index]; id++)
+ {
+ int index = grid->t_index[grid->s_pos[c_index] + id];
+ float disp_intersect = 0.0f;
+ float radius = 0.0f;
+ float strength = 0.0f;
+ float velocity_val = 0.0f;
+ int part_index;
+
+ /*
+ * With predefined radius, there is no variation between particles.
+ * It's enough to just find the nearest one.
+ */
+ {
+ KDTreeNearest nearest;
+ float smooth_range, part_solidradius;
+
+ /* Find nearest particle and get distance to it */
+ BLI_kdtree_find_nearest(tree, bData->realCoord[bData->s_pos[index]].v, NULL, &nearest);
+ /* if outside maximum range, no other particle can influence either */
+ if (nearest.dist > range) continue;
+
+ if (brush->flags & MOD_DPAINT_PART_RAD) {
+ /* use particles individual size */
+ ParticleData *pa = psys->particles + nearest.index;
+ part_solidradius = pa->size;
+ }
+ else {
+ part_solidradius = solidradius;
+ }
+ radius = part_solidradius + smooth;
+ if (nearest.dist < radius) {
+ /* distances inside solid radius has maximum influence -> dist = 0 */
+ smooth_range = (nearest.dist - part_solidradius);
+ if (smooth_range<0.0f) smooth_range=0.0f;
+ /* do smoothness if enabled */
+ if (smooth) smooth_range/=smooth;
+
+ strength = 1.0f - smooth_range;
+ disp_intersect = radius - nearest.dist;
+ part_index = nearest.index;
+ }
+ }
+ /* If using random per particle radius and closest particle didn't give max influence */
+ if (brush->flags & MOD_DPAINT_PART_RAD && strength < 1.0f && psys->part->randsize > 0.0f) {
+ /*
+ * If we use per particle radius, we have to sample all particles
+ * within max radius range
+ */
+ KDTreeNearest *nearest;
+
+ int n, particles = 0;
+ float smooth_range = smooth * (1.0f-strength), dist;
+ /* calculate max range that can have particles with higher influence than the nearest one */
+ float max_range = smooth - strength*smooth + solidradius;
+
+ particles = BLI_kdtree_range_search(tree, max_range, bData->realCoord[bData->s_pos[index]].v, NULL, &nearest);
+
+ /* Find particle that produces highest influence */
+ for(n=0; n<particles; n++) {
+ ParticleData *pa = psys->particles + nearest[n].index;
+ float s_range;
+
+ /* skip if out of range */
+ if (nearest[n].dist > (pa->size + smooth))
+ continue;
+
+ /* update hit data */
+ s_range = nearest[n].dist - pa->size;
+ /* skip if higher influence is already found */
+ if (smooth_range < s_range)
+ continue;
+
+ /* update hit data */
+ smooth_range = s_range;
+ dist = nearest[n].dist;
+ 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)
+ break;
+ }
+
+ if (nearest) MEM_freeN(nearest);
+
+ /* now calculate influence for this particle */
+ {
+ float rad = radius + smooth, str;
+ if ((rad-dist) > disp_intersect) {
+ disp_intersect = radius - dist;
+ radius = rad;
+ }
+
+ /* do smoothness if enabled */
+ if (smooth_range<0.0f) smooth_range=0.0f;
+ if (smooth) smooth_range/=smooth;
+ str = 1.0f - smooth_range;
+ /* if influence is greater, use this one */
+ if (str > strength) strength = str;
+ }
+ }
+
+ if (strength > 0.001f)
+ {
+ float paintColor[4] = {0.0f};
+ float depth = 0.0f;
+
+ /* apply velocity */
+ if (brush->flags & MOD_DPAINT_USES_VELOCITY) {
+ float velocity[3];
+ ParticleData *pa = psys->particles + part_index;
+ mul_v3_v3fl(velocity, pa->state.vel, particle_timestep);
+
+ /* substract canvas point velocity */
+ if (bData->velocity) {
+ sub_v3_v3(velocity, bData->velocity[index].v);
+ }
+ velocity_val = len_v3(velocity);
+
+ /* store brush velocity for smudge */
+ if (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;
+ }
+ }
+
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ paintColor[0] = brush->r;
+ paintColor[1] = brush->g;
+ paintColor[2] = brush->b;
+ }
+ 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;
+ if (depth<0.0f) depth = 0.0f;
+ }
+
+ dynamicPaint_updatePointData(surface, index, brush, paintColor, strength, depth, velocity_val, timescale);
+ }
+ }
+ }
+ }
+ BLI_end_threaded_malloc();
+ BLI_kdtree_free(tree);
+
+ return 1;
+}
+
+/* paint a single point of defined proximity radius to the surface */
+static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *pointCoord, DynamicPaintBrushSettings *brush,
+ Object *brushOb, BrushMaterials *bMats, Scene *scene, float timescale)
+{
+ int index;
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ Vec3f brushVel;
+
+ if (brush->flags & MOD_DPAINT_USES_VELOCITY)
+ dynamicPaint_brushObjectCalculateVelocity(scene, brushOb, &brushVel, timescale);
+
+ /*
+ * Loop through every surface point
+ */
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ float distance = len_v3v3(pointCoord, bData->realCoord[bData->s_pos[index]].v);
+ float colorband[4] = {0.0f};
+ float strength;
+
+ if (distance>brush->paint_distance) continue;
+
+ /* Smooth range or color ramp */
+ if (brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH ||
+ brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP) {
+
+ strength = 1.0f - distance / brush->paint_distance;
+ CLAMP(strength, 0.0f, 1.0f);
+ }
+ else strength = 1.0f;
+
+ if (strength >= 0.001f) {
+ float paintColor[3] = {0.0f};
+ float depth = 0.0f;
+ float velocity_val = 0.0f;
+
+ /* material */
+ if (brush_usesMaterial(brush, scene)) {
+ float alpha_factor = 1.0f;
+ float hit_coord[3];
+ MVert *mvert = brush->dm->getVertArray(brush->dm);
+ /* use dummy coord of first vertex */
+ copy_v3_v3(hit_coord, mvert[0].co);
+ mul_m4_v3(brushOb->obmat, hit_coord);
+
+ dynamicPaint_doMaterialTex(bMats, paintColor, &alpha_factor, brushOb, bData->realCoord[bData->s_pos[index]].v, hit_coord, 0, 0, brush->dm);
+ }
+
+ /* color ramp */
+ if (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP && do_colorband(brush->paint_ramp, (1.0f-strength), colorband))
+ strength = colorband[3];
+
+ if (brush->flags & MOD_DPAINT_USES_VELOCITY) {
+ float velocity[3];
+
+ /* substract canvas point velocity */
+ if (bData->velocity) {
+ sub_v3_v3v3(velocity, brushVel.v, bData->velocity[index].v);
+ }
+ else {
+ copy_v3_v3(velocity, brushVel.v);
+ }
+ velocity_val = len_v3(velocity);
+
+ /* store brush velocity for smudge */
+ if (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;
+ }
+ }
+
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ if (brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP &&
+ !(brush->flags & MOD_DPAINT_RAMP_ALPHA)) {
+ paintColor[0] = colorband[0];
+ paintColor[1] = colorband[1];
+ paintColor[2] = colorband[2];
+ }
+ else {
+ if (!brush_usesMaterial(brush, scene)) {
+ paintColor[0] = brush->r;
+ paintColor[1] = brush->g;
+ paintColor[2] = brush->b;
+ }
+ }
+ }
+ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
+ surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ /* get displace depth */
+ float disp_intersect = (1.0f - sqrtf((brush->paint_distance-distance) / brush->paint_distance)) * brush->paint_distance;
+ depth = (brush->paint_distance - disp_intersect) / bData->bNormal[index].normal_scale;
+ if (depth<0.0f) depth = 0.0f;
+ }
+ dynamicPaint_updatePointData(surface, index, brush, paintColor, strength, depth, velocity_val, timescale);
+ }
+ }
+
+ return 1;
+}
+
+
+/***************************** Dynamic Paint Step / Baking ******************************/
+
+/*
+* Calculate current frame neighbouring point distances
+* and direction vectors
+*/
+static void dynamicPaint_prepareNeighbourData(DynamicPaintSurface *surface, int force_init)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ BakeNeighPoint *bNeighs;
+ PaintAdjData *adj_data = sData->adj_data;
+ Vec3f *realCoord = bData->realCoord;
+ int index;
+
+ if ((!surface_usesAdjDistance(surface) && !force_init) || !sData->adj_data) return;
+
+ if (bData->bNeighs) MEM_freeN(bData->bNeighs);
+ bNeighs = bData->bNeighs = MEM_mallocN(sData->adj_data->total_targets*sizeof(struct BakeNeighPoint),"PaintEffectBake");
+ if (!bNeighs) return;
+
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ int i;
+ int numOfNeighs = adj_data->n_num[index];
+
+ for (i=0; i<numOfNeighs; i++) {
+ int n_index = adj_data->n_index[index]+i;
+ int t_index = adj_data->n_target[n_index];
+
+ /* dir vec */
+ sub_v3_v3v3(bNeighs[n_index].dir, realCoord[bData->s_pos[t_index]].v, realCoord[bData->s_pos[index]].v);
+ /* dist */
+ bNeighs[n_index].dist = len_v3(bNeighs[n_index].dir);
+ /* normalize dir */
+ if (bNeighs[n_index].dist) mul_v3_fl(bNeighs[n_index].dir, 1.0f/bNeighs[n_index].dist);
+ }
+ }
+
+ /* calculate average values (single thread) */
+ bData->average_dist = 0.0f;
+ for (index = 0; index < sData->total_points; index++)
+ {
+ int i;
+ int numOfNeighs = adj_data->n_num[index];
+
+ for (i=0; i<numOfNeighs; i++) {
+ bData->average_dist += (double)bNeighs[adj_data->n_index[index]+i].dist;
+ }
+ }
+ bData->average_dist /= adj_data->total_targets;
+}
+
+/* find two adjacency points (closest_id) and influence (closest_d) to move paint towards when affected by a force */
+void surface_determineForceTargetPoints(PaintSurfaceData *sData, int index, float force[3], float closest_d[2], int closest_id[2])
+{
+ BakeNeighPoint *bNeighs = sData->bData->bNeighs;
+ int numOfNeighs = sData->adj_data->n_num[index];
+ int i;
+
+ closest_id[0]=closest_id[1]= -1;
+ closest_d[0]=closest_d[1]= -1.0f;
+
+ /* find closest neigh */
+ for (i=0; i<numOfNeighs; i++) {
+ int n_index = sData->adj_data->n_index[index]+i;
+ float dir_dot = dot_v3v3(bNeighs[n_index].dir, force);
+
+ if (dir_dot>closest_d[0] && dir_dot>0.0f) {closest_d[0]=dir_dot; closest_id[0]=n_index;}
+ }
+
+ if (closest_d[0] < 0.0f) return;
+
+ /* find second closest neigh */
+ for (i=0; i<numOfNeighs; i++) {
+ int n_index = sData->adj_data->n_index[index]+i;
+ float dir_dot = dot_v3v3(bNeighs[n_index].dir, force);
+ float closest_dot = dot_v3v3(bNeighs[n_index].dir, bNeighs[closest_id[0]].dir);
+
+ if (n_index == closest_id[0]) continue;
+
+ /* only accept neighbour at "other side" of the first one in relation to force dir
+ * so make sure angle between this and closest neigh is greater than first angle */
+ if (dir_dot>closest_d[1] && closest_dot<closest_d[0] && dir_dot>0.0f) {closest_d[1]=dir_dot; closest_id[1]=n_index;}
+ }
+
+ /* if two valid neighs found, calculate how force effect is divided
+ * evenly between them (so that d[0]+d[1] = 1.0)*/
+ if (closest_id[1] != -1) {
+ float force_proj[3];
+ float tangent[3];
+ float neigh_diff = acos(dot_v3v3(bNeighs[closest_id[0]].dir, bNeighs[closest_id[1]].dir));
+ float force_intersect;
+ float temp;
+
+ /* project force vector on the plane determined by these two neightbour points
+ * and calculate relative force angle from it*/
+ cross_v3_v3v3(tangent, bNeighs[closest_id[0]].dir, bNeighs[closest_id[1]].dir);
+ normalize_v3(tangent);
+ force_intersect = dot_v3v3(force, tangent);
+ madd_v3_v3v3fl(force_proj, force, tangent, (-1.0f)*force_intersect);
+ normalize_v3(force_proj);
+
+ /* get drip factor based on force dir in relation to angle between those neighbours */
+ temp = dot_v3v3(bNeighs[closest_id[0]].dir, force_proj);
+ CLAMP(temp, -1.0f, 1.0f); /* float precision might cause values > 1.0f that return infinite */
+ closest_d[1] = acosf(temp)/neigh_diff;
+ closest_d[0] = 1.0f - closest_d[1];
+
+ /* and multiply depending on how deeply force intersects surface */
+ temp = fabs(force_intersect);
+ CLAMP(temp, 0.0f, 1.0f);
+ closest_d[0] *= acosf(temp)/1.57079633f;
+ closest_d[1] *= acosf(temp)/1.57079633f;
+ }
+ else {
+ /* if only single neighbour, still linearize force intersection effect */
+ closest_d[0] = 1.0f - acosf(closest_d[0])/1.57079633f;
+ }
+}
+
+static void dynamicPaint_doSmudge(DynamicPaintSurface *surface, DynamicPaintBrushSettings *brush, float timescale)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ BakeNeighPoint *bNeighs = sData->bData->bNeighs;
+ int index, steps, step;
+ float eff_scale, max_velocity = 0.0f;
+
+ if (!sData->adj_data) return;
+
+ /* find max velocity */
+ for (index = 0; index < sData->total_points; index++) {
+ float vel = bData->brush_velocity[index*4+3];
+ if (vel > max_velocity) max_velocity = vel;
+ }
+
+ steps = (int)ceil(max_velocity / bData->average_dist * timescale);
+ CLAMP(steps, 0, 12);
+ eff_scale = brush->smudge_strength/(float)steps*timescale;
+
+ for (step=0; step<steps; step++) {
+
+ for (index = 0; index < sData->total_points; index++) {
+ int i;
+ PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index];
+ float smudge_str = bData->brush_velocity[index*4+3];
+
+ /* force targets */
+ int closest_id[2];
+ float closest_d[2];
+
+ if (!smudge_str) continue;
+
+ /* get force affect points */
+ surface_determineForceTargetPoints(sData, index, &bData->brush_velocity[index*4], closest_d, closest_id);
+
+ /* Apply movement towards those two points */
+ for (i=0; i<2; i++) {
+ int n_index = closest_id[i];
+ if (n_index != -1 && closest_d[i]>0.0f) {
+ float dir_dot = closest_d[i], dir_factor;
+ float speed_scale = eff_scale*smudge_str/bNeighs[n_index].dist;
+ float mix;
+ PaintPoint *ePoint = &((PaintPoint*)sData->type_data)[sData->adj_data->n_target[n_index]];
+
+ /* just skip if angle is too extreme */
+ if (dir_dot <= 0.0f) continue;
+
+ dir_factor = dir_dot * speed_scale;
+ if (dir_factor > brush->smudge_strength) dir_factor = brush->smudge_strength;
+
+ /* mix new color and alpha */
+ mix = dir_factor*pPoint->alpha;
+ if (mix) mixColors(ePoint->color, ePoint->alpha, pPoint->color, mix);
+ ePoint->alpha = ePoint->alpha*(1.0f-dir_factor) + pPoint->alpha*dir_factor;
+
+ /* smudge "wet layer" */
+ mix = dir_factor*pPoint->e_alpha;
+ if (mix) mixColors(ePoint->e_color, ePoint->e_alpha, pPoint->e_color, mix);
+ ePoint->e_alpha = ePoint->e_alpha*(1.0f-dir_factor) + pPoint->e_alpha*dir_factor;
+ pPoint->wetness *= (1.0f-dir_factor);
+ }
+ }
+ }
+ }
+}
+
+/*
+* Prepare data required by effects for current frame.
+* Returns number of steps required
+*/
+static int dynamicPaint_prepareEffectStep(DynamicPaintSurface *surface, Scene *scene, Object *ob, float **force, float timescale)
+{
+ double average_force = 0.0f;
+ float shrink_speed=0.0f, spread_speed=0.0f;
+ float fastest_effect;
+ int steps;
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ Vec3f *realCoord = bData->realCoord;
+ int index;
+
+ /* Init force data if required */
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) {
+ float vel[3] = {0};
+ ListBase *effectors = pdInitEffectors(scene, ob, NULL, surface->effector_weights);
+
+ /* allocate memory for force data (dir vector + strength) */
+ *force = MEM_mallocN(sData->total_points*4*sizeof(float), "PaintEffectForces");
+
+ if (*force) {
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ float forc[3] = {0};
+
+ /* apply force fields */
+ if (effectors) {
+ EffectedPoint epoint;
+ pd_point_from_loc(scene, realCoord[bData->s_pos[index]].v, vel, index, &epoint);
+ epoint.vel_to_sec = 1.0f;
+ pdDoEffectors(effectors, NULL, surface->effector_weights, &epoint, forc, NULL);
+ }
+
+ /* if global gravity is enabled, add it too */
+ if (scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY)
+ /* also divide by 10 to about match default grav
+ * with default force strength (1.0) */
+ madd_v3_v3fl(forc, scene->physics_settings.gravity,
+ surface->effector_weights->global_gravity*surface->effector_weights->weight[0] / 10.f);
+
+ /* add surface point velocity and acceleration if enabled */
+ if (bData->velocity) {
+ if (surface->drip_vel)
+ madd_v3_v3fl(forc, bData->velocity[index].v, surface->drip_vel*(-1.0f));
+
+ /* acceleration */
+ if (bData->prev_velocity && surface->drip_acc) {
+ float acc[3];
+ copy_v3_v3(acc, bData->velocity[index].v);
+ sub_v3_v3(acc, bData->prev_velocity[index].v);
+ madd_v3_v3fl(forc, acc, surface->drip_acc*(-1.0f));
+ }
+ }
+
+ /* force strength */
+ (*force)[index*4+3] = len_v3(forc);
+ /* normalize and copy */
+ if ((*force)[index*4+3]) mul_v3_fl(forc, 1.0f/(*force)[index*4+3]);
+ copy_v3_v3(&((*force)[index*4]), forc);
+ }
+
+ /* calculate average values (single thread) */
+ for (index = 0; index < sData->total_points; index++)
+ {
+ average_force += (*force)[index*4+3];
+ }
+ average_force /= sData->total_points;
+ }
+ pdEndEffectors(&effectors);
+ }
+
+ /* Get number of required steps using averate point distance
+ * so that just a few ultra close pixels wont up substeps to max */
+
+ /* adjust number of required substep by fastest active effect */
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_SPREAD)
+ spread_speed = surface->spread_speed;
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_SHRINK)
+ shrink_speed = surface->shrink_speed;
+
+ fastest_effect = MAX3(spread_speed, shrink_speed, average_force);
+
+ steps = (int)ceil(1.5f*EFF_MOVEMENT_PER_FRAME*fastest_effect/bData->average_dist*timescale);
+ CLAMP(steps, 1, 14);
+
+ return steps;
+}
+
+/*
+* Processes active effect step.
+*/
+static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force, PaintPoint *prevPoint, float timescale, float steps)
+{
+ PaintSurfaceData *sData = surface->data;
+ BakeNeighPoint *bNeighs = sData->bData->bNeighs;
+ int index;
+ timescale /= steps;
+
+ if (!sData->adj_data) return;
+
+ /*
+ * Spread Effect
+ */
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_SPREAD) {
+ float eff_scale = EFF_MOVEMENT_PER_FRAME*surface->spread_speed*timescale;
+
+ /* Copy current surface to the previous points array to read unmodified values */
+ memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint));
+
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ int i;
+ int numOfNeighs = sData->adj_data->n_num[index];
+ float totalAlpha = 0.0f;
+ PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index];
+
+ /* Only reads values from the surface copy (prevPoint[]),
+ * so this one is thread safe */
+
+ /* Loop through neighbouring points */
+ for (i=0; i<numOfNeighs; i++) {
+ int n_index = sData->adj_data->n_index[index]+i;
+ float w_factor, alphaAdd = 0.0f;
+ PaintPoint *ePoint = &prevPoint[sData->adj_data->n_target[n_index]];
+ float speed_scale = (bNeighs[n_index].dist<eff_scale) ? 1.0f : eff_scale/bNeighs[n_index].dist;
+ float color_mix = (MIN2(ePoint->wetness, pPoint->wetness))*0.25f*surface->color_spread_speed;
+
+ totalAlpha += ePoint->e_alpha;
+
+ /* do color mixing */
+ if (color_mix) mixColors(pPoint->e_color, pPoint->e_alpha, ePoint->e_color, color_mix);
+
+ /* Check if neighbouring point has higher wetness,
+ * if so, add it's wetness to this point as well*/
+ if (ePoint->wetness <= pPoint->wetness) continue;
+ w_factor = ePoint->wetness/numOfNeighs * (ePoint->wetness - pPoint->wetness) * speed_scale;
+ if (w_factor <= 0.0f) continue;
+
+ if (ePoint->e_alpha > pPoint->e_alpha) {
+ alphaAdd = ePoint->e_alpha/numOfNeighs * (ePoint->wetness*ePoint->e_alpha - pPoint->wetness*pPoint->e_alpha) * speed_scale;
+ }
+
+ /* mix new color */
+ mixColors(pPoint->e_color, pPoint->e_alpha, ePoint->e_color, w_factor);
+
+ pPoint->e_alpha += alphaAdd;
+ pPoint->wetness += w_factor;
+
+ if (pPoint->e_alpha > 1.0f) pPoint->e_alpha = 1.0f;
+ }
+
+ /* For antialiasing sake, don't let alpha go much higher than average alpha of neighbours */
+ if (pPoint->e_alpha > (totalAlpha/numOfNeighs+0.25f)) {
+ pPoint->e_alpha = (totalAlpha/numOfNeighs+0.25f);
+ if (pPoint->e_alpha>1.0f) pPoint->e_alpha = 1.0f;
+ }
+ }
+ }
+
+ /*
+ * Shrink Effect
+ */
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_SHRINK) {
+ float eff_scale = EFF_MOVEMENT_PER_FRAME*surface->shrink_speed*timescale;
+
+ /* Copy current surface to the previous points array to read unmodified values */
+ memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint));
+
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ int i;
+ int numOfNeighs = sData->adj_data->n_num[index];
+ float totalAlpha = 0.0f;
+ PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index];
+
+ for (i=0; i<numOfNeighs; i++) {
+ int n_index = sData->adj_data->n_index[index]+i;
+ float speed_scale = (bNeighs[n_index].dist<eff_scale) ? 1.0f : eff_scale/bNeighs[n_index].dist;
+ PaintPoint *ePoint = &prevPoint[sData->adj_data->n_target[n_index]];
+ float a_factor, ea_factor, w_factor;
+
+ totalAlpha += ePoint->e_alpha;
+
+ /* Check if neighbouring point has lower alpha,
+ * if so, decrease this point's alpha as well*/
+ if (pPoint->alpha <= 0.0f && pPoint->e_alpha <= 0.0f && pPoint->wetness <= 0.0f) continue;
+
+ /* decrease factor for dry paint alpha */
+ a_factor = (1.0f - ePoint->alpha)/numOfNeighs * (pPoint->alpha - ePoint->alpha) * speed_scale;
+ if (a_factor < 0.0f) a_factor = 0.0f;
+ /* decrease factor for wet paint alpha */
+ ea_factor = (1.0f - ePoint->e_alpha)/8 * (pPoint->e_alpha - ePoint->e_alpha) * speed_scale;
+ if (ea_factor < 0.0f) ea_factor = 0.0f;
+ /* decrease factor for paint wetness */
+ w_factor = (1.0f - ePoint->wetness)/8 * (pPoint->wetness - ePoint->wetness) * speed_scale;
+ if (w_factor < 0.0f) w_factor = 0.0f;
+
+ pPoint->alpha -= a_factor;
+ if (pPoint->alpha < 0.0f) pPoint->alpha = 0.0f;
+ pPoint->e_alpha -= ea_factor;
+ if (pPoint->e_alpha < 0.0f) pPoint->e_alpha = 0.0f;
+ pPoint->wetness -= w_factor;
+ if (pPoint->wetness < 0.0f) pPoint->wetness = 0.0f;
+ }
+ }
+ }
+
+ /*
+ * Drip Effect
+ */
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP && force)
+ {
+ float eff_scale = EFF_MOVEMENT_PER_FRAME*timescale/2.0f;
+ /* Copy current surface to the previous points array to read unmodified values */
+ memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint));
+
+ for (index = 0; index < sData->total_points; index++) {
+ int i;
+ PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index];
+ PaintPoint *pPoint_prev = &prevPoint[index];
+
+ int closest_id[2];
+ float closest_d[2];
+
+ /* adjust drip speed depending on wetness */
+ float w_factor = pPoint_prev->wetness*0.5f - 0.025f;
+ if (w_factor <= 0) continue;
+
+ /* get force affect points */
+ surface_determineForceTargetPoints(sData, index, &force[index*4], closest_d, closest_id);
+
+ /* Apply movement towards those two points */
+ for (i=0; i<2; i++) {
+ int n_index = closest_id[i];
+ if (n_index != -1 && closest_d[i]>0.0f) {
+ float dir_dot = closest_d[i], dir_factor;
+ float speed_scale = eff_scale*force[index*4+3]/bNeighs[n_index].dist;
+ PaintPoint *ePoint = &((PaintPoint*)sData->type_data)[sData->adj_data->n_target[n_index]];
+
+ /* just skip if angle is too extreme */
+ if (dir_dot <= 0.0f) continue;
+
+ dir_factor = dir_dot * speed_scale * w_factor;
+ if (dir_factor > (0.5f/steps)) dir_factor = (0.5f/steps);
+
+ /* mix new color */
+ if (dir_factor) mixColors(ePoint->e_color, ePoint->e_alpha, pPoint->e_color, dir_factor);
+
+ ePoint->e_alpha += dir_factor;
+ ePoint->wetness += dir_factor;
+ if (ePoint->e_alpha > 1.0f) ePoint->e_alpha = 1.0f;
+
+ /* and decrease paint wetness on current point */
+ pPoint->wetness -= dir_factor;
+ }
+ }
+ }
+
+ /* Keep values within acceptable range */
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++)
+ {
+ PaintPoint *cPoint = &((PaintPoint*)sData->type_data)[index];
+
+ if (cPoint->e_alpha > 1.0f) cPoint->e_alpha=1.0f;
+ if (cPoint->wetness > 2.0f) cPoint->wetness=2.0f;
+
+ if (cPoint->e_alpha < 0.0f) cPoint->e_alpha=0.0f;
+ if (cPoint->wetness < 0.0f) cPoint->wetness=0.0f;
+ }
+ }
+}
+
+void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale)
+{
+ PaintSurfaceData *sData = surface->data;
+ BakeNeighPoint *bNeighs = sData->bData->bNeighs;
+ int index;
+ int steps, ss;
+ float dt, min_dist, damp_factor;
+ float wave_speed = surface->wave_speed;
+ double average_dist = 0.0f;
+
+ /* allocate memory */
+ PaintWavePoint *prevPoint = MEM_mallocN(sData->total_points*sizeof(PaintWavePoint), "Temp previous points for wave simulation");
+ if (!prevPoint) return;
+
+ /* calculate average neigh distance (single thread) */
+ for (index = 0; index < sData->total_points; index++)
+ {
+ int i;
+ int numOfNeighs = sData->adj_data->n_num[index];
+
+ for (i=0; i<numOfNeighs; i++) {
+ average_dist += bNeighs[sData->adj_data->n_index[index]+i].dist;
+ }
+ }
+ average_dist /= sData->adj_data->total_targets;
+
+ /* determine number of required steps */
+ steps = (int)ceil((WAVE_TIME_FAC*timescale*surface->wave_timescale) / (average_dist/wave_speed/3));
+ CLAMP(steps, 1, 15);
+ timescale /= steps;
+
+ /* apply simulation values for final timescale */
+ dt = WAVE_TIME_FAC*timescale*surface->wave_timescale;
+ min_dist = wave_speed*dt*1.5f;
+ damp_factor = pow((1.0f-surface->wave_damping), timescale*surface->wave_timescale);
+
+ for (ss=0; ss<steps; ss++) {
+
+ /* copy previous frame data */
+ memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(PaintWavePoint));
+
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++) {
+ PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index];
+ int numOfNeighs = sData->adj_data->n_num[index];
+ float force = 0.0f, avg_dist = 0.0f, avg_height = 0.0f;
+ int numOfN = 0, numOfRN = 0;
+ int i;
+
+ if (wPoint->state) continue;
+
+ /* calculate force from surrounding points */
+ for (i=0; i<numOfNeighs; i++) {
+ int n_index = sData->adj_data->n_index[index]+i;
+ float dist = bNeighs[n_index].dist;
+ PaintWavePoint *tPoint = &prevPoint[sData->adj_data->n_target[n_index]];
+
+ if (!dist || tPoint->state>0) continue;
+ if (dist<min_dist) dist=min_dist;
+ avg_dist += dist;
+ numOfN++;
+
+ /* count average height for edge points for open borders */
+ if (!(sData->adj_data->flags[sData->adj_data->n_target[n_index]] & ADJ_ON_MESH_EDGE)) {
+ avg_height += tPoint->height;
+ numOfRN++;
+ }
+
+ force += (tPoint->height - wPoint->height) / (dist*dist);
+ }
+ avg_dist = (numOfN) ? avg_dist/numOfN : 0.0f;
+
+ if (surface->flags & MOD_DPAINT_WAVE_OPEN_BORDERS &&
+ sData->adj_data->flags[index] & ADJ_ON_MESH_EDGE) {
+ /* if open borders, apply a fake height to keep waves going on */
+ avg_height = (numOfRN) ? avg_height/numOfRN : 0.0f;
+ wPoint->height = (dt*wave_speed*avg_height + wPoint->height*avg_dist) / (avg_dist + dt*wave_speed);
+ }
+ /* else do wave eq */
+ else {
+ /* add force towards zero height based on average dist */
+ if (avg_dist)
+ force += (0.0f - wPoint->height) * surface->wave_spring / (avg_dist*avg_dist) / 2.0f;
+
+ /* change point velocity */
+ wPoint->velocity += force*dt * wave_speed*wave_speed;
+ /* damping */
+ wPoint->velocity *= damp_factor;
+ /* and new height */
+ wPoint->height += wPoint->velocity*dt;
+ }
+ }
+ }
+
+ /* reset state */
+ #pragma omp parallel for schedule(static)
+ for (index = 0; index < sData->total_points; index++) {
+ PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index];
+ wPoint->state = DPAINT_WAVE_NONE;
+ }
+
+ MEM_freeN(prevPoint);
+}
+
+/* Do dissolve and fading effects */
+static void dynamicPaint_surfacePreStep(DynamicPaintSurface *surface, float timescale)
+{
+ PaintSurfaceData *sData = surface->data;
+ int index;
+
+ #pragma omp parallel for schedule(static)
+ for (index=0; index<sData->total_points; index++)
+ {
+ /* Do drying dissolve effects */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index];
+ /* drying */
+ if (pPoint->wetness >= MIN_WETNESS) {
+ int i;
+ float dry_ratio, f_color[4];
+ float p_wetness = pPoint->wetness;
+ VALUE_DISSOLVE(pPoint->wetness, surface->dry_speed, timescale, (surface->flags & MOD_DPAINT_DRY_LOG));
+ if (pPoint->wetness<0.0f) pPoint->wetness=0.0f;
+ dry_ratio = pPoint->wetness/p_wetness;
+
+ /*
+ * Slowly "shift" paint from wet layer to dry layer as it drys:
+ */
+ /* make sure alpha values are within proper range */
+ CLAMP(pPoint->alpha, 0.0f, 1.0f);
+ CLAMP(pPoint->e_alpha, 0.0f, 1.0f);
+
+ /* get current final blended color of these layers */
+ blendColors(pPoint->color, pPoint->alpha, pPoint->e_color, pPoint->e_alpha, f_color);
+ /* reduce wet layer alpha by dry factor */
+ pPoint->e_alpha *= dry_ratio;
+
+ /* now calculate new alpha for dry layer that keeps final blended color unchanged */
+ pPoint->alpha = (f_color[3] - pPoint->e_alpha)/(1.0f-pPoint->e_alpha);
+ /* for each rgb component, calculate a new dry layer color that keeps the final blend color
+ * with these new alpha values. (wet layer color doesnt change)*/
+ if (pPoint->alpha) {
+ for (i=0; i<3; i++) {
+ pPoint->color[i] = (f_color[i]*f_color[3] - pPoint->e_color[i]*pPoint->e_alpha)/(pPoint->alpha*(1.0f-pPoint->e_alpha));
+ }
+ }
+
+ pPoint->state = DPAINT_PAINT_WET;
+ }
+ /* in case of just dryed paint, just mix it to the dry layer and mark it empty */
+ else if (pPoint->state > 0) {
+ float f_color[4];
+ blendColors(pPoint->color, pPoint->alpha, pPoint->e_color, pPoint->e_alpha, f_color);
+ copy_v3_v3(pPoint->color, f_color);
+ pPoint->alpha = f_color[3];
+ /* clear wet layer */
+ pPoint->wetness = 0.0f;
+ pPoint->e_alpha = 0.0f;
+ pPoint->state = DPAINT_PAINT_DRY;
+ }
+
+ if (surface->flags & MOD_DPAINT_DISSOLVE) {
+ VALUE_DISSOLVE(pPoint->alpha, surface->diss_speed, timescale, (surface->flags & MOD_DPAINT_DISSOLVE_LOG));
+ if (pPoint->alpha < 0.0f) pPoint->alpha = 0.0f;
+
+ VALUE_DISSOLVE(pPoint->e_alpha, surface->diss_speed, timescale, (surface->flags & MOD_DPAINT_DISSOLVE_LOG));
+ if (pPoint->e_alpha < 0.0f) pPoint->e_alpha = 0.0f;
+ }
+ }
+ /* dissolve for float types */
+ else if (surface->flags & MOD_DPAINT_DISSOLVE &&
+ (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
+ surface->type == MOD_DPAINT_SURFACE_T_WEIGHT)) {
+
+ float *point = &((float*)sData->type_data)[index];
+ /* log or linear */
+ VALUE_DISSOLVE(*point, surface->diss_speed, timescale, (surface->flags & MOD_DPAINT_DISSOLVE_LOG));
+ if (*point < 0.0f) *point = 0.0f;
+ }
+ }
+}
+
+static int dynamicPaint_surfaceHasMoved(DynamicPaintSurface *surface, Object *ob)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ DerivedMesh *dm = surface->canvas->dm;
+ MVert *mvert = dm->getVertArray(dm);
+
+ int numOfVerts = dm->getNumVerts(dm);
+ int i;
+ int ret = 0;
+
+ if (!bData->prev_verts) return 1;
+
+ /* matrix comparison */
+ for (i=0; i<4; i++) {
+ int j;
+ for (j=0; j<4; j++)
+ if (bData->prev_obmat[i][j] != ob->obmat[i][j]) return 1;
+ }
+
+ /* vertices */
+ #pragma omp parallel for schedule(static)
+ for (i=0; i<numOfVerts; i++) {
+ int j;
+ for (j=0; j<3; j++)
+ if (bData->prev_verts[i].co[j] != mvert[i].co[j]) {
+ ret = 1;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static int surface_needsVelocityData(DynamicPaintSurface *surface, Scene *scene)
+{
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP)
+ return 1;
+
+ if (surface_getBrushFlags(surface, scene) & BRUSH_USES_VELOCITY)
+ return 1;
+
+ return 0;
+}
+
+static int surface_needsAccelerationData(DynamicPaintSurface *surface)
+{
+ if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP)
+ return 1;
+
+ return 0;
+}
+
+/* Prepare for surface step by creating PaintBakeNormal data */
+static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *scene, Object *ob)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintAdjData *adj_data = sData->adj_data;
+ PaintBakeData *bData = sData->bData;
+ DerivedMesh *dm = surface->canvas->dm;
+ int index, new_bdata = 0;
+ int do_velocity_data = surface_needsVelocityData(surface, scene);
+ int do_accel_data = surface_needsAccelerationData(surface);
+
+ int canvasNumOfVerts = dm->getNumVerts(dm);
+ MVert *mvert = dm->getVertArray(dm);
+ Vec3f *canvas_verts;
+
+ if (bData) {
+ int surface_moved = dynamicPaint_surfaceHasMoved(surface, ob);
+
+ /* get previous speed for accelertaion */
+ if (do_accel_data && bData->prev_velocity && bData->velocity)
+ memcpy(bData->prev_velocity, bData->velocity, sData->total_points*sizeof(Vec3f));
+
+ /* reset speed vectors */
+ if (do_velocity_data && bData->velocity && (bData->clear || !surface_moved))
+ memset(bData->velocity, 0, sData->total_points*sizeof(Vec3f));
+
+ /* if previous data exists and mesh hasn't moved, no need to recalc */
+ if (!surface_moved)
+ return 1;
+ }
+
+ canvas_verts = (struct Vec3f *) MEM_mallocN(canvasNumOfVerts*sizeof(struct Vec3f), "Dynamic Paint transformed canvas verts");
+ if (!canvas_verts) return 0;
+
+ /* allocate memory if required */
+ if (!bData) {
+ sData->bData = bData = (struct PaintBakeData *) MEM_callocN(sizeof(struct PaintBakeData), "Dynamic Paint bake data");
+ if (!bData) {
+ if (canvas_verts) MEM_freeN(canvas_verts);
+ return 0;
+ }
+
+ /* Init bdata */
+ bData->bNormal = (struct PaintBakeNormal *) MEM_mallocN(sData->total_points*sizeof(struct PaintBakeNormal), "Dynamic Paint step data");
+ bData->s_pos = MEM_mallocN(sData->total_points*sizeof(unsigned int), "Dynamic Paint bData s_pos");
+ bData->s_num = MEM_mallocN(sData->total_points*sizeof(unsigned int), "Dynamic Paint bData s_num");
+ bData->realCoord = (struct Vec3f *) MEM_mallocN(surface_totalSamples(surface)*sizeof(Vec3f), "Dynamic Paint point coords");
+ bData->prev_verts = MEM_mallocN(canvasNumOfVerts*sizeof(MVert), "Dynamic Paint bData prev_verts");
+
+ /* if any allocation failed, free everything */
+ if (!bData->bNormal || !bData->s_pos || !bData->s_num || !bData->realCoord || !canvas_verts) {
+ if (bData->bNormal) MEM_freeN(bData->bNormal);
+ if (bData->s_pos) MEM_freeN(bData->s_pos);
+ if (bData->s_num) MEM_freeN(bData->s_num);
+ if (bData->realCoord) MEM_freeN(bData->realCoord);
+ if (canvas_verts) MEM_freeN(canvas_verts);
+
+ return setError(surface->canvas, "Not enough free memory.");
+ }
+
+ new_bdata = 1;
+ }
+
+ if (do_velocity_data && !bData->velocity) {
+ bData->velocity = (struct Vec3f *) MEM_callocN(sData->total_points*sizeof(Vec3f), "Dynamic Paint velocity");
+ }
+ if (do_accel_data && !bData->prev_velocity) {
+ bData->prev_velocity = (struct Vec3f *) MEM_mallocN(sData->total_points*sizeof(Vec3f), "Dynamic Paint prev velocity");
+ /* copy previous vel */
+ if (bData->prev_velocity && bData->velocity)
+ memcpy(bData->prev_velocity, bData->velocity, sData->total_points*sizeof(Vec3f));
+ }
+
+ /*
+ * Make a transformed copy of canvas derived mesh vertices to avoid recalculation.
+ */
+ #pragma omp parallel for schedule(static)
+ for (index=0; index<canvasNumOfVerts; index++) {
+ copy_v3_v3(canvas_verts[index].v, mvert[index].co);
+ mul_m4_v3(ob->obmat, canvas_verts[index].v);
+ }
+
+ /*
+ * Prepare each surface point for a new step
+ */
+ #pragma omp parallel for schedule(static)
+ for (index=0; index<sData->total_points; index++)
+ {
+ float prev_point[3];
+ if (do_velocity_data && !new_bdata) {
+ copy_v3_v3(prev_point, bData->realCoord[bData->s_pos[index]].v);
+ }
+ /*
+ * Calculate current 3D-position and normal of each surface point
+ */
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+ float n1[3], n2[3], n3[3];
+ ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
+ PaintUVPoint *tPoint = &((PaintUVPoint*)f_data->uv_p)[index];
+ int ss;
+
+ bData->s_num[index] = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
+ bData->s_pos[index] = index * bData->s_num[index];
+
+ /* per sample coordinates */
+ for (ss=0; ss<bData->s_num[index]; ss++) {
+ interp_v3_v3v3v3( bData->realCoord[bData->s_pos[index]+ss].v,
+ canvas_verts[tPoint->v1].v,
+ canvas_verts[tPoint->v2].v,
+ canvas_verts[tPoint->v3].v, f_data->barycentricWeights[index*bData->s_num[index]+ss].v);
+ }
+
+ /* Calculate current pixel surface normal */
+ normal_short_to_float_v3(n1, mvert[tPoint->v1].no);
+ normal_short_to_float_v3(n2, mvert[tPoint->v2].no);
+ normal_short_to_float_v3(n3, mvert[tPoint->v3].no);
+
+ interp_v3_v3v3v3( bData->bNormal[index].invNorm,
+ n1, n2, n3, f_data->barycentricWeights[index*bData->s_num[index]].v);
+ mul_mat3_m4_v3(ob->obmat, bData->bNormal[index].invNorm);
+ normalize_v3(bData->bNormal[index].invNorm);
+ negate_v3(bData->bNormal[index].invNorm);
+ }
+ else if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ int ss;
+ if (surface->flags & MOD_DPAINT_ANTIALIAS && adj_data) {
+ bData->s_num[index] = adj_data->n_num[index]+1;
+ bData->s_pos[index] = adj_data->n_index[index]+index;
+ }
+ else {
+ bData->s_num[index] = 1;
+ bData->s_pos[index] = index;
+ }
+
+ /* calculate position for each sample */
+ for (ss=0; ss<bData->s_num[index]; ss++) {
+ /* first sample is always point center */
+ copy_v3_v3(bData->realCoord[bData->s_pos[index]+ss].v, canvas_verts[index].v);
+ if (ss > 0) {
+ int t_index = adj_data->n_index[index]+(ss-1);
+ /* get vertex position at 1/3 of each neigh edge */
+ mul_v3_fl(bData->realCoord[bData->s_pos[index]+ss].v, 2.0f/3.0f);
+ madd_v3_v3fl(bData->realCoord[bData->s_pos[index]+ss].v, canvas_verts[adj_data->n_target[t_index]].v, 1.0f/3.0f);
+ }
+ }
+
+ /* normal */
+ normal_short_to_float_v3(bData->bNormal[index].invNorm, mvert[index].no);
+ mul_mat3_m4_v3(ob->obmat, bData->bNormal[index].invNorm);
+ normalize_v3(bData->bNormal[index].invNorm);
+ negate_v3(bData->bNormal[index].invNorm);
+ }
+
+ /* Prepare surface normal directional scale to easily convert
+ * brush intersection amount between global and local space */
+ if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
+ surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ float temp_nor[3];
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ normal_short_to_float_v3(temp_nor, mvert[index].no);
+ normalize_v3(temp_nor);
+ }
+ else {
+ float n1[3], n2[3], n3[3];
+ ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
+ PaintUVPoint *tPoint = &((PaintUVPoint*)f_data->uv_p)[index];
+
+ normal_short_to_float_v3(n1, mvert[tPoint->v1].no);
+ normal_short_to_float_v3(n2, mvert[tPoint->v2].no);
+ normal_short_to_float_v3(n3, mvert[tPoint->v3].no);
+ interp_v3_v3v3v3(temp_nor,
+ n1, n2, n3, f_data->barycentricWeights[index*bData->s_num[index]].v);
+ }
+
+ mul_v3_v3(temp_nor, ob->size);
+ bData->bNormal[index].normal_scale = len_v3(temp_nor);
+ }
+
+ /* calculate speed vector */
+ if (do_velocity_data && !new_bdata && !bData->clear) {
+ sub_v3_v3v3(bData->velocity[index].v, bData->realCoord[bData->s_pos[index]].v, prev_point);
+ }
+ }
+
+ MEM_freeN(canvas_verts);
+
+ /* generate surface space partitioning grid */
+ surfaceGenerateGrid(surface);
+ /* calculate current frame neighbouring point distances and global dirs */
+ dynamicPaint_prepareNeighbourData(surface, 0);
+
+ /* Copy current frame vertices to check against in next frame */
+ copy_m4_m4(bData->prev_obmat, ob->obmat);
+ memcpy(bData->prev_verts, mvert, canvasNumOfVerts*sizeof(MVert));
+
+ bData->clear = 0;
+
+ return 1;
+}
+
+/*
+* Do Dynamic Paint step. Paints scene brush objects of current state/frame to the surface.
+*/
+static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface *surface, float timescale, float subframe)
+{
+ PaintSurfaceData *sData = surface->data;
+ PaintBakeData *bData = sData->bData;
+ DynamicPaintCanvasSettings *canvas = surface->canvas;
+ int ret = 1;
+ if (!sData || sData->total_points < 1) return 0;
+
+ dynamicPaint_surfacePreStep(surface, timescale);
+ /*
+ * Loop through surface's target paint objects and do painting
+ */
+ {
+ Base *base = NULL;
+ GroupObject *go = NULL;
+ Object *brushObj = NULL;
+ ModifierData *md = NULL;
+
+ /* backup current scene frame */
+ int scene_frame = scene->r.cfra;
+ float scene_subframe = scene->r.subframe;
+
+ /* either from group or from all objects */
+ if(surface->brush_group)
+ go = surface->brush_group->gobject.first;
+ else
+ base = scene->base.first;
+
+ while (base || go)
+ {
+ brushObj = NULL;
+ /* select object */
+ if(surface->brush_group) {
+ if(go->ob) brushObj = go->ob;
+ }
+ else
+ brushObj = base->object;
+
+ if(!brushObj) {
+ /* skip item */
+ if(surface->brush_group) go = go->next;
+ else base= base->next;
+ continue;
+ }
+
+ /* next item */
+ if(surface->brush_group)
+ go = go->next;
+ else
+ base= base->next;
+
+ /* check if target has an active dp modifier */
+ md = modifiers_findByType(brushObj, eModifierType_DynamicPaint);
+ if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render))
+ {
+ DynamicPaintModifierData *pmd2 = (DynamicPaintModifierData *)md;
+ /* make sure we're dealing with a brush */
+ if (pmd2->brush)
+ {
+ DynamicPaintBrushSettings *brush = pmd2->brush;
+ BrushMaterials bMats = {0};
+
+ /* calculate brush speed vectors if required */
+ if (brush->flags & MOD_DPAINT_DO_SMUDGE) {
+ bData->brush_velocity = MEM_callocN(sData->total_points*sizeof(float)*4, "Dynamic Paint brush velocity");
+ /* init adjacency data if not already */
+ if (!sData->adj_data)
+ dynamicPaint_initAdjacencyData(surface, 1);
+ if (!bData->bNeighs)
+ dynamicPaint_prepareNeighbourData(surface, 1);
+ }
+
+ /* update object data on this subframe */
+ if (subframe) {
+ scene_setSubframe(scene, subframe);
+ subframe_updateObject(scene, brushObj, UPDATE_EVERYTHING, BKE_curframe(scene));
+ }
+ /* Prepare materials if required */
+ if (brush_usesMaterial(brush, scene))
+ dynamicPaint_updateBrushMaterials(brushObj, brush->mat, scene, &bMats);
+
+ /* Apply brush on the surface depending on it's collision type */
+ /* Particle brush: */
+ if (brush->collision == MOD_DPAINT_COL_PSYS) {
+ if (brush && brush->psys && brush->psys->part && brush->psys->part->type==PART_EMITTER &&
+ psys_check_enabled(brushObj, brush->psys)) {
+
+ /* Paint a particle system */
+ BKE_animsys_evaluate_animdata(scene, &brush->psys->part->id, brush->psys->part->adt, BKE_curframe(scene), ADT_RECALC_ANIM);
+ dynamicPaint_paintParticles(surface, brush->psys, brush, timescale);
+ }
+ }
+ /* Object center distance: */
+ else if (brush->collision == MOD_DPAINT_COL_POINT && brushObj != ob) {
+ dynamicPaint_paintSinglePoint(surface, brushObj->loc, brush, brushObj, &bMats, scene, timescale);
+ }
+ /* Mesh volume/proximity: */
+ else if (brushObj != ob) {
+ dynamicPaint_paintMesh(surface, brush, brushObj, &bMats, scene, timescale);
+ }
+
+ /* free temp material data */
+ if (brush_usesMaterial(brush, scene))
+ dynamicPaint_freeBrushMaterials(&bMats);
+ /* reset object to it's original state */
+ if (subframe) {
+ scene->r.cfra = scene_frame;
+ scene->r.subframe = scene_subframe;
+ subframe_updateObject(scene, brushObj, UPDATE_EVERYTHING, BKE_curframe(scene));
+ }
+
+ /* process special brush effects, like smudge */
+ if (bData->brush_velocity) {
+ if (brush->flags & MOD_DPAINT_DO_SMUDGE)
+ dynamicPaint_doSmudge(surface, brush, timescale);
+ MEM_freeN(bData->brush_velocity);
+ bData->brush_velocity = NULL;
+ }
+ }
+ }
+ }
+ }
+
+ /* surfaces operations that use adjacency data */
+ if (sData->adj_data && bData->bNeighs)
+ {
+ /* wave type surface simulation step */
+ if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+ dynamicPaint_doWaveStep(surface, timescale);
+ }
+
+ /* paint surface effects */
+ if (surface->effect && surface->type == MOD_DPAINT_SURFACE_T_PAINT)
+ {
+ int steps = 1, s;
+ PaintPoint *prevPoint;
+ float *force = NULL;
+
+ /* Allocate memory for surface previous points to read unchanged values from */
+ prevPoint = MEM_mallocN(sData->total_points*sizeof(struct PaintPoint), "PaintSurfaceDataCopy");
+ if (!prevPoint)
+ return setError(canvas, "Not enough free memory.");
+
+ /* Prepare effects and get number of required steps */
+ steps = dynamicPaint_prepareEffectStep(surface, scene, ob, &force, timescale);
+ for (s = 0; s < steps; s++) {
+ dynamicPaint_doEffectStep(surface, force, prevPoint, timescale, (float)steps);
+ }
+
+ /* Free temporary effect data */
+ if (prevPoint) MEM_freeN(prevPoint);
+ if (force) MEM_freeN(force);
+ }
+ }
+
+ return ret;
+}
+
+/*
+* Calculate a single frame and included subframes for surface
+*/
+int dynamicPaint_calculateFrame(DynamicPaintSurface *surface, Scene *scene, Object *cObject, int frame)
+{
+ float timescale = 1.0f;
+
+ /* apply previous displace on derivedmesh if incremental surface */
+ if (surface->flags & MOD_DPAINT_DISP_INCREMENTAL)
+ dynamicPaint_applySurfaceDisplace(surface, surface->canvas->dm, 0);
+
+ /* update bake data */
+ dynamicPaint_generateBakeData(surface, scene, cObject);
+
+ /* dont do substeps for first frame */
+ if (surface->substeps && (frame != surface->start_frame)) {
+ int st;
+ timescale = 1.0f / (surface->substeps+1);
+
+ for (st = 1; st <= surface->substeps; st++) {
+ float subframe = ((float) st) / (surface->substeps+1);
+ if (!dynamicPaint_doStep(scene, cObject, surface, timescale, subframe)) return 0;
+ }
+ }
+
+ return dynamicPaint_doStep(scene, cObject, surface, timescale, 0.0f);
+}
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c
index 313143f362b..df3694e0bf1 100644
--- a/source/blender/blenkernel/intern/implicit.c
+++ b/source/blender/blenkernel/intern/implicit.c
@@ -79,9 +79,9 @@ double itval(void)
// #include <pmmintrin.h>
// #include <pthread.h>
- static struct timeval _itstart, _itend;
- static struct timezone itz;
- void itstart(void)
+static struct timeval _itstart, _itend;
+static struct timezone itz;
+void itstart(void)
{
gettimeofday(&_itstart, &itz);
}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index fe9678ee1fc..f57bb1bfd51 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -679,10 +679,10 @@ static ID *alloc_libblock_notest(short type)
break;
case ID_PA:
id = MEM_callocN(sizeof(ParticleSettings), "ParticleSettings");
- break;
+ break;
case ID_WM:
id = MEM_callocN(sizeof(wmWindowManager), "Window manager");
- break;
+ break;
case ID_GD:
id = MEM_callocN(sizeof(bGPdata), "Grease Pencil");
break;
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 5c82acde99b..d8628e526ef 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -776,7 +776,7 @@ void *new_pgn_element(int size)
if(cur) {
if(size+offs < blocksize) {
adr= (void *) (cur->data+offs);
- offs+= size;
+ offs+= size;
return adr;
}
}
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index b72a3be1014..540d757f0c9 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -191,15 +191,13 @@ static ImBuf *movieclip_load_sequence_file(MovieClip *clip, MovieClipUser *user,
{
struct ImBuf *ibuf;
char name[FILE_MAX];
- int loadflag /*, size */ /* UNUSED */, undistort;
+ int loadflag, use_proxy= 0;
- /* size= rendersize_to_number(user->render_size); */
-
- undistort= user->render_flag&MCLIP_PROXY_RENDER_UNDISTORT;
-
- if((flag&MCLIP_USE_PROXY) && user->render_size != MCLIP_PROXY_RENDER_SIZE_FULL)
+ use_proxy= (flag&MCLIP_USE_PROXY) && user->render_size != MCLIP_PROXY_RENDER_SIZE_FULL;
+ if(use_proxy) {
+ int undistort= user->render_flag&MCLIP_PROXY_RENDER_UNDISTORT;
get_proxy_fname(clip, user->render_size, undistort, framenr, name);
- else
+ } else
get_sequence_fname(clip, framenr, name);
loadflag= IB_rect|IB_multilayer;
@@ -318,7 +316,7 @@ static ImBuf *get_imbuf_cache(MovieClip *clip, MovieClipUser *user, int flag)
if(clip->cache) {
MovieClipImBufCacheKey key;
- key.framenr= user?user->framenr:clip->lastframe;
+ key.framenr= user->framenr;
if(flag&MCLIP_USE_PROXY) {
key.proxy= rendersize_to_proxy(user, flag);
@@ -346,7 +344,7 @@ static void put_imbuf_cache(MovieClip *clip, MovieClipUser *user, ImBuf *ibuf, i
moviecache_hashcmp, moviecache_keydata);
}
- key.framenr= user?user->framenr:clip->lastframe;
+ key.framenr= user->framenr;
if(flag&MCLIP_USE_PROXY) {
key.proxy= rendersize_to_proxy(user, flag);
@@ -478,9 +476,6 @@ static void real_ibuf_size(MovieClip *clip, MovieClipUser *user, ImBuf *ibuf, in
static int need_undistorted_cache(MovieClipUser *user, int flag)
{
- if (!user)
- return 0;
-
/* only full undistorted render can be used as on-fly undistorting image */
if(flag&MCLIP_USE_PROXY) {
if(user->render_size != MCLIP_PROXY_RENDER_SIZE_FULL || (user->render_flag&MCLIP_PROXY_RENDER_UNDISTORT)==0)
@@ -495,7 +490,7 @@ static ImBuf *get_undistorted_cache(MovieClip *clip, MovieClipUser *user)
{
MovieClipCache *cache= clip->cache;
MovieTrackingCamera *camera= &clip->tracking.camera;
- int framenr= user?user->framenr:clip->lastframe;
+ int framenr= user->framenr;
/* no cache or no cached undistorted image */
if(!clip->cache || !clip->cache->undistibuf)
@@ -530,7 +525,7 @@ static ImBuf *get_undistorted_ibuf(MovieClip *clip, struct MovieDistortion *dist
else
undistibuf= BKE_tracking_undistort(&clip->tracking, ibuf, ibuf->x, ibuf->y, 0.0f);
- if(undistibuf->userflags|= IB_RECT_INVALID) {
+ if(undistibuf->userflags&IB_RECT_INVALID) {
ibuf->userflags&= ~IB_RECT_INVALID;
IMB_rect_from_float(undistibuf);
}
@@ -547,7 +542,7 @@ static ImBuf *put_undistorted_cache(MovieClip *clip, MovieClipUser *user, ImBuf
copy_v2_v2(cache->principal, camera->principal);
copy_v3_v3(&cache->k1, &camera->k1);
- cache->undist_framenr= user?user->framenr:clip->lastframe;
+ cache->undist_framenr= user->framenr;
if(cache->undistibuf)
IMB_freeImBuf(cache->undistibuf);
@@ -568,7 +563,7 @@ static ImBuf *put_undistorted_cache(MovieClip *clip, MovieClipUser *user, ImBuf
ImBuf *BKE_movieclip_get_ibuf(MovieClip *clip, MovieClipUser *user)
{
ImBuf *ibuf= NULL;
- int framenr= user?user->framenr:clip->lastframe;
+ int framenr= user->framenr;
int cache_undistorted= 0;
/* cache isn't threadsafe itself and also loading of movies
@@ -586,11 +581,11 @@ ImBuf *BKE_movieclip_get_ibuf(MovieClip *clip, MovieClipUser *user)
ibuf= get_imbuf_cache(clip, user, clip->flag);
if(!ibuf) {
- int use_sequence= 1;
+ int use_sequence= 0;
/* undistorted proxies for movies should be read as image sequence */
- use_sequence&= user->render_flag&MCLIP_PROXY_RENDER_UNDISTORT;
- use_sequence&= user->render_size!=MCLIP_PROXY_RENDER_SIZE_FULL;
+ use_sequence= (user->render_flag&MCLIP_PROXY_RENDER_UNDISTORT) &&
+ (user->render_size!=MCLIP_PROXY_RENDER_SIZE_FULL);
if(clip->source==MCLIP_SRC_SEQUENCE || use_sequence)
ibuf= movieclip_load_sequence_file(clip, user, framenr, clip->flag);
@@ -622,7 +617,7 @@ ImBuf *BKE_movieclip_get_ibuf(MovieClip *clip, MovieClipUser *user)
ImBuf *BKE_movieclip_get_ibuf_flag(MovieClip *clip, MovieClipUser *user, int flag)
{
ImBuf *ibuf= NULL;
- int framenr= user?user->framenr:clip->lastframe;
+ int framenr= user->framenr;
int cache_undistorted= 0;
/* cache isn't threadsafe itself and also loading of movies
@@ -668,7 +663,7 @@ ImBuf *BKE_movieclip_get_ibuf_flag(MovieClip *clip, MovieClipUser *user, int fla
ImBuf *BKE_movieclip_get_stable_ibuf(MovieClip *clip, MovieClipUser *user, float loc[2], float *scale, float *angle)
{
ImBuf *ibuf, *stableibuf= NULL;
- int framenr= user?user->framenr:clip->lastframe;
+ int framenr= user->framenr;
ibuf= BKE_movieclip_get_ibuf(clip, user);
@@ -749,7 +744,7 @@ int BKE_movieclip_has_frame(MovieClip *clip, MovieClipUser *user)
void BKE_movieclip_get_size(MovieClip *clip, MovieClipUser *user, int *width, int *height)
{
- if(!user || user->framenr==clip->lastframe) {
+ if(user->framenr==clip->lastframe) {
*width= clip->lastsize[0];
*height= clip->lastsize[1];
} else {
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 6579d7a01f4..ae0774eb34f 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -1147,10 +1147,10 @@ static MultiresFace *find_old_face(ListBase *map, MultiresFace *faces, int v1, i
IndexNode *n1;
int v[4], i, j;
- v[0]= v1;
- v[1]= v2;
- v[2]= v3;
- v[3]= v4;
+ v[0]= v1;
+ v[1]= v2;
+ v[2]= v3;
+ v[3]= v4;
for(n1 = map[v1].first; n1; n1 = n1->next) {
int fnd[4] = {0, 0, 0, 0};
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index fd5c7912e1f..8a908097862 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -356,7 +356,7 @@ NlaStrip *add_nla_soundstrip (Scene *scene, Speaker *speaker)
{
AUD_SoundInfo info = AUD_getInfo(speaker->sound->playback_handle);
- strip->end = ceil(info.length * FPS);
+ strip->end = (float)ceil((double)info.length * FPS);
}
else
#endif
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 115591863cc..c4edddf587c 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -961,8 +961,8 @@ void ntreeSetOutput(bNodeTree *ntree)
/* we need a check for which output node should be tagged like this, below an exception */
if(node->type==CMP_NODE_OUTPUT_FILE)
- continue;
-
+ continue;
+
/* there is more types having output class, each one is checked */
for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
@@ -1314,11 +1314,15 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
if(GS(node->id->name) == GS(tnode->id->name))
tnode->flag &= ~NODE_ACTIVE_ID;
}
+ if(node->typeinfo->nclass == NODE_CLASS_TEXTURE)
+ tnode->flag &= ~NODE_ACTIVE_TEXTURE;
}
node->flag |= NODE_ACTIVE;
if(node->id)
node->flag |= NODE_ACTIVE_ID;
+ if(node->typeinfo->nclass == NODE_CLASS_TEXTURE)
+ node->flag |= NODE_ACTIVE_TEXTURE;
}
/* use flags are not persistent yet, groups might need different tagging, so we do it each time
@@ -1865,13 +1869,18 @@ static void registerShaderNodes(ListBase *ntypelist)
register_node_type_frame(ntypelist);
register_node_type_sh_group(ntypelist);
-// register_node_type_sh_forloop(ntypelist);
-// register_node_type_sh_whileloop(ntypelist);
-
+ //register_node_type_sh_forloop(ntypelist);
+ //register_node_type_sh_whileloop(ntypelist);
+
register_node_type_sh_output(ntypelist);
+ register_node_type_sh_material(ntypelist);
+ register_node_type_sh_camera(ntypelist);
+ register_node_type_sh_value(ntypelist);
+ register_node_type_sh_rgb(ntypelist);
register_node_type_sh_mix_rgb(ntypelist);
register_node_type_sh_valtorgb(ntypelist);
register_node_type_sh_rgbtobw(ntypelist);
+ register_node_type_sh_texture(ntypelist);
register_node_type_sh_normal(ntypelist);
register_node_type_sh_geom(ntypelist);
register_node_type_sh_mapping(ntypelist);
@@ -1880,17 +1889,47 @@ static void registerShaderNodes(ListBase *ntypelist)
register_node_type_sh_math(ntypelist);
register_node_type_sh_vect_math(ntypelist);
register_node_type_sh_squeeze(ntypelist);
- register_node_type_sh_camera(ntypelist);
- register_node_type_sh_material(ntypelist);
+ //register_node_type_sh_dynamic(ntypelist);
register_node_type_sh_material_ext(ntypelist);
- register_node_type_sh_value(ntypelist);
- register_node_type_sh_rgb(ntypelist);
- register_node_type_sh_texture(ntypelist);
-// register_node_type_sh_dynamic(ntypelist);
register_node_type_sh_invert(ntypelist);
register_node_type_sh_seprgb(ntypelist);
register_node_type_sh_combrgb(ntypelist);
register_node_type_sh_hue_sat(ntypelist);
+
+ register_node_type_sh_attribute(ntypelist);
+ register_node_type_sh_geometry(ntypelist);
+ register_node_type_sh_light_path(ntypelist);
+ register_node_type_sh_fresnel(ntypelist);
+ register_node_type_sh_layer_weight(ntypelist);
+ register_node_type_sh_tex_coord(ntypelist);
+
+ register_node_type_sh_background(ntypelist);
+ register_node_type_sh_bsdf_diffuse(ntypelist);
+ register_node_type_sh_bsdf_glossy(ntypelist);
+ register_node_type_sh_bsdf_glass(ntypelist);
+ register_node_type_sh_bsdf_translucent(ntypelist);
+ register_node_type_sh_bsdf_transparent(ntypelist);
+ register_node_type_sh_bsdf_velvet(ntypelist);
+ register_node_type_sh_emission(ntypelist);
+ register_node_type_sh_holdout(ntypelist);
+ //register_node_type_sh_volume_transparent(ntypelist);
+ //register_node_type_sh_volume_isotropic(ntypelist);
+ register_node_type_sh_mix_shader(ntypelist);
+ register_node_type_sh_add_shader(ntypelist);
+
+ register_node_type_sh_output_lamp(ntypelist);
+ register_node_type_sh_output_material(ntypelist);
+ register_node_type_sh_output_world(ntypelist);
+
+ register_node_type_sh_tex_image(ntypelist);
+ register_node_type_sh_tex_environment(ntypelist);
+ register_node_type_sh_tex_sky(ntypelist);
+ register_node_type_sh_tex_noise(ntypelist);
+ register_node_type_sh_tex_wave(ntypelist);
+ register_node_type_sh_tex_voronoi(ntypelist);
+ register_node_type_sh_tex_musgrave(ntypelist);
+ register_node_type_sh_tex_gradient(ntypelist);
+ register_node_type_sh_tex_magic(ntypelist);
}
static void registerTextureNodes(ListBase *ntypelist)
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 57b6cb6f02e..f3486360d08 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1508,6 +1508,71 @@ void object_mat3_to_rot(Object *ob, float mat[][3], short use_compat)
}
}
+void object_tfm_protected_backup(const Object *ob,
+ ObjectTfmProtectedChannels *obtfm)
+{
+
+#define TFMCPY( _v) (obtfm->_v = ob->_v)
+#define TFMCPY3D( _v) copy_v3_v3(obtfm->_v, ob->_v)
+#define TFMCPY4D( _v) copy_v4_v4(obtfm->_v, ob->_v)
+
+ TFMCPY3D(loc);
+ TFMCPY3D(dloc);
+ TFMCPY3D(size);
+ TFMCPY3D(dsize);
+ TFMCPY3D(rot);
+ TFMCPY3D(drot);
+ TFMCPY4D(quat);
+ TFMCPY4D(dquat);
+ TFMCPY3D(rotAxis);
+ TFMCPY3D(drotAxis);
+ TFMCPY(rotAngle);
+ TFMCPY(drotAngle);
+
+#undef TFMCPY
+#undef TFMCPY3D
+#undef TFMCPY4D
+
+}
+
+void object_tfm_protected_restore(Object *ob,
+ const ObjectTfmProtectedChannels *obtfm,
+ const short protectflag)
+{
+ unsigned int i;
+
+ for (i= 0; i < 3; i++) {
+ if (protectflag & (OB_LOCK_LOCX<<i)) {
+ ob->loc[i]= obtfm->loc[i];
+ ob->dloc[i]= obtfm->dloc[i];
+ }
+
+ if (protectflag & (OB_LOCK_SCALEX<<i)) {
+ ob->size[i]= obtfm->size[i];
+ ob->dsize[i]= obtfm->dsize[i];
+ }
+
+ if (protectflag & (OB_LOCK_ROTX<<i)) {
+ ob->rot[i]= obtfm->rot[i];
+ ob->drot[i]= obtfm->drot[i];
+
+ ob->quat[i + 1]= obtfm->quat[i + 1];
+ ob->dquat[i + 1]= obtfm->dquat[i + 1];
+
+ ob->rotAxis[i]= obtfm->rotAxis[i];
+ ob->drotAxis[i]= obtfm->drotAxis[i];
+ }
+ }
+
+ if ((protectflag & OB_LOCK_ROT4D) && (protectflag & OB_LOCK_ROTW)) {
+ ob->quat[0]= obtfm->quat[0];
+ ob->dquat[0]= obtfm->dquat[0];
+
+ ob->rotAngle= obtfm->rotAngle;
+ ob->drotAngle= obtfm->drotAngle;
+ }
+}
+
/* see pchan_apply_mat4() for the equivalent 'pchan' function */
void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const short use_parent)
{
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 1064a5af160..d28fe8b8509 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -45,6 +45,7 @@
#include "DNA_particle_types.h"
#include "DNA_smoke_types.h"
#include "DNA_scene_types.h"
+#include "DNA_dynamicpaint_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -637,7 +638,7 @@ static float psys_render_projected_area(ParticleSystem *psys, const float center
w= co[2]*data->winmat[2][3] + data->winmat[3][3];
dx= data->winx*ortho2[0]*data->winmat[0][0];
dy= data->winy*ortho2[1]*data->winmat[1][1];
- w= sqrt(dx*dx + dy*dy)/w;
+ w= sqrtf(dx*dx + dy*dy)/w;
/* w squared because we are working with area */
area= area*w*w;
@@ -3453,6 +3454,14 @@ void object_remove_particle_system(Scene *scene, Object *ob)
smd->flow->psys = NULL;
}
+ if((md = modifiers_findByType(ob, eModifierType_DynamicPaint)))
+ {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
+ if(pmd->brush && pmd->brush->psys)
+ if(pmd->brush->psys == psys)
+ pmd->brush->psys = NULL;
+ }
+
/* clear modifier */
psmd= psys_get_modifier(ob, psys);
BLI_remlink(&ob->modifiers, psmd);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 3e88fb7d65e..cb12230615e 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3176,7 +3176,7 @@ static int collision_response(ParticleData *pa, ParticleCollision *col, BVHTreeR
mul_v3_fl(v1_tan, 1.0f - 0.01f * frict);
/* surface_velocity is opposite to cm velocity */
- mul_v3_v3fl(vr_tan, v1_tan, -1.0f);
+ negate_v3_v3(vr_tan, v1_tan);
/* get back to global coordinates */
add_v3_v3(v1_tan, vc_tan);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 9deaa19429f..dbfda18942a 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -38,6 +38,7 @@
#include "DNA_ID.h"
#include "DNA_cloth_types.h"
+#include "DNA_dynamicpaint_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
@@ -58,6 +59,7 @@
#include "BKE_blender.h"
#include "BKE_cloth.h"
#include "BKE_depsgraph.h"
+#include "BKE_dynamicpaint.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -120,7 +122,7 @@ static int ptcache_extra_datasize[] = {
/* forward declerations */
static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result, unsigned int len);
static int ptcache_file_compressed_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode);
-static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
+static int ptcache_file_write(PTCacheFile *pf, const void *f, unsigned int tot, unsigned int size);
static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
/* Common functions */
@@ -601,7 +603,7 @@ static int ptcache_smoke_write(PTCacheFile *pf, void *smoke_v)
return ret;
}
-static void ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
+static int ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
{
SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
SmokeDomainSettings *sds = smd->domain;
@@ -650,13 +652,93 @@ static void ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
ptcache_file_compressed_read(pf, (unsigned char*)tcw, out_len);
}
}
+
+ return 1;
}
#else // WITH_SMOKE
-static int ptcache_smoke_totpoint(void *UNUSED(smoke_v), int UNUSED(cfra)) { return 0; };
-static void ptcache_smoke_read(PTCacheFile *UNUSED(pf), void *UNUSED(smoke_v)) {}
+static int ptcache_smoke_totpoint(void *UNUSED(smoke_v), int UNUSED(cfra)) { return 0; }
+static int ptcache_smoke_read(PTCacheFile *UNUSED(pf), void *UNUSED(smoke_v)) { return 0; }
static int ptcache_smoke_write(PTCacheFile *UNUSED(pf), void *UNUSED(smoke_v)) { return 0; }
#endif // WITH_SMOKE
+static int ptcache_dynamicpaint_totpoint(void *sd, int UNUSED(cfra))
+{
+ DynamicPaintSurface *surface = (DynamicPaintSurface*)sd;
+
+ if (!surface->data) return 0;
+ else return surface->data->total_points;
+}
+
+#define DPAINT_CACHE_VERSION "1.01"
+
+static int ptcache_dynamicpaint_write(PTCacheFile *pf, void *dp_v)
+{
+ DynamicPaintSurface *surface = (DynamicPaintSurface*)dp_v;
+ int cache_compress = 1;
+
+ /* version header */
+ ptcache_file_write(pf, DPAINT_CACHE_VERSION, 1, sizeof(char)*4);
+
+ if(surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ && surface->data) {
+ int total_points=surface->data->total_points;
+ unsigned int in_len;
+ unsigned char *out;
+
+ /* cache type */
+ ptcache_file_write(pf, &surface->type, 1, sizeof(int));
+
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
+ in_len = sizeof(PaintPoint)*total_points;
+ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
+ surface->type == MOD_DPAINT_SURFACE_T_WEIGHT)
+ in_len = sizeof(float)*total_points;
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE)
+ in_len = sizeof(PaintWavePoint)*total_points;
+ else return 0;
+
+ out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len), "pointcache_lzo_buffer");
+
+ ptcache_file_compressed_write(pf, (unsigned char *)surface->data->type_data, in_len, out, cache_compress);
+ MEM_freeN(out);
+
+ }
+ return 1;
+}
+static int ptcache_dynamicpaint_read(PTCacheFile *pf, void *dp_v)
+{
+ DynamicPaintSurface *surface = (DynamicPaintSurface*)dp_v;
+ char version[4];
+
+ /* version header */
+ ptcache_file_read(pf, version, 1, sizeof(char)*4);
+ if (strncmp(version, DPAINT_CACHE_VERSION,4)) {printf("Dynamic Paint: Invalid cache version: %s!\n",version); return 0;}
+
+ if(surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ && surface->data) {
+ unsigned int data_len;
+ int surface_type;
+
+ /* cache type */
+ ptcache_file_read(pf, &surface_type, 1, sizeof(int));
+
+ if (surface_type != surface->type)
+ return 0;
+
+ /* read surface data */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
+ data_len = sizeof(PaintPoint);
+ else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE ||
+ surface->type == MOD_DPAINT_SURFACE_T_WEIGHT)
+ data_len = sizeof(float);
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE)
+ data_len = sizeof(PaintWavePoint);
+ else return 0;
+
+ ptcache_file_compressed_read(pf, (unsigned char*)surface->data->type_data, data_len*surface->data->total_points);
+
+ }
+ return 1;
+}
+
/* Creating ID's */
void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
{
@@ -809,6 +891,40 @@ void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeMo
if(sds->wt)
pid->data_types |= (1<<BPHYS_DATA_SMOKE_HIGH);
}
+
+void BKE_ptcache_id_from_dynamicpaint(PTCacheID *pid, Object *ob, DynamicPaintSurface *surface)
+{
+
+ memset(pid, 0, sizeof(PTCacheID));
+
+ pid->ob= ob;
+ pid->calldata= surface;
+ pid->type= PTCACHE_TYPE_DYNAMICPAINT;
+ pid->cache= surface->pointcache;
+ pid->cache_ptr= &surface->pointcache;
+ pid->ptcaches= &surface->ptcaches;
+ pid->totpoint= pid->totwrite= ptcache_dynamicpaint_totpoint;
+
+ pid->write_point = NULL;
+ pid->read_point = NULL;
+ pid->interpolate_point = NULL;
+
+ pid->write_stream = ptcache_dynamicpaint_write;
+ pid->read_stream = ptcache_dynamicpaint_read;
+
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
+
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
+
+ pid->data_types= BPHYS_DATA_DYNAMICPAINT;
+ pid->info_types= 0;
+
+ pid->stack_index = pid->cache->index;
+}
+
void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int duplis)
{
PTCacheID *pid;
@@ -849,7 +965,7 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
BKE_ptcache_id_from_cloth(pid, ob, (ClothModifierData*)md);
BLI_addtail(lb, pid);
}
- if(md->type == eModifierType_Smoke) {
+ else if(md->type == eModifierType_Smoke) {
SmokeModifierData *smd = (SmokeModifierData *)md;
if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
{
@@ -858,6 +974,19 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
BLI_addtail(lb, pid);
}
}
+ else if(md->type == eModifierType_DynamicPaint) {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
+ if(pmd->canvas)
+ {
+ DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
+
+ for (; surface; surface=surface->next) {
+ pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
+ BKE_ptcache_id_from_dynamicpaint(pid, ob, surface);
+ BLI_addtail(lb, pid);
+ }
+ }
+ }
}
if(scene && (duplis-- > 0) && (ob->transflag & OB_DUPLI)) {
@@ -998,7 +1127,7 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra)
if (!BLI_exists(filename)) {
return NULL;
}
- fp = fopen(filename, "rb");
+ fp = fopen(filename, "rb");
} else if (mode==PTCACHE_FILE_WRITE) {
BLI_make_existing_file(filename); /* will create the dir if needs be, same as //textures is created */
fp = fopen(filename, "wb");
@@ -1132,7 +1261,7 @@ static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigne
{
return (fread(f, size, tot, pf->fp) == tot);
}
-static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size)
+static int ptcache_file_write(PTCacheFile *pf, const void *f, unsigned int tot, unsigned int size)
{
return (fwrite(f, size, tot, pf->fp) == tot);
}
@@ -1590,7 +1719,8 @@ static int ptcache_read_stream(PTCacheID *pid, int cfra)
ptcache_file_pointers_init(pf);
// we have stream reading here
- pid->read_stream(pf, pid->calldata);
+ if (!pid->read_stream(pf, pid->calldata))
+ error = 1;
}
ptcache_file_close(pf);
@@ -1726,15 +1856,21 @@ int BKE_ptcache_read(PTCacheID *pid, float cfra)
return 0;
if(cfra1) {
- if(pid->read_stream)
- ptcache_read_stream(pid, cfra1);
+
+ if(pid->read_stream) {
+ if (!ptcache_read_stream(pid, cfra1))
+ return 0;
+ }
else if(pid->read_point)
ptcache_read(pid, cfra1);
}
if(cfra2) {
- if(pid->read_stream)
- ptcache_read_stream(pid, cfra2);
+
+ if(pid->read_stream) {
+ if (!ptcache_read_stream(pid, cfra2))
+ return 0;
+ }
else if(pid->read_point) {
if(cfra1 && cfra2 && pid->interpolate_point)
ptcache_interpolate(pid, cfra, cfra1, cfra2);
@@ -1975,6 +2111,9 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, unsigned int cfra)
if(!pid || !pid->cache || pid->cache->flag & PTCACHE_BAKED)
return;
+ if (pid->cache->flag & PTCACHE_IGNORE_CLEAR)
+ return;
+
sta = pid->cache->startframe;
end = pid->cache->endframe;
@@ -2288,6 +2427,8 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
smokeModifier_reset(pid->calldata);
else if(pid->type == PTCACHE_TYPE_SMOKE_HIGHRES)
smokeModifier_reset_turbulence(pid->calldata);
+ else if(pid->type == PTCACHE_TYPE_DYNAMICPAINT)
+ dynamicPaint_clearSurface((DynamicPaintSurface*)pid->calldata);
}
if(clear)
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
@@ -2344,6 +2485,18 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
}
+ if(md->type == eModifierType_DynamicPaint) {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
+ if(pmd->canvas)
+ {
+ DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
+
+ for (; surface; surface=surface->next) {
+ BKE_ptcache_id_from_dynamicpaint(&pid, ob, surface);
+ reset |= BKE_ptcache_id_reset(scene, &pid, mode);
+ }
+ }
+ }
}
if (ob->type == OB_ARMATURE)
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index 3699cf40aa8..e8e9c754806 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -2144,7 +2144,7 @@ static struct ImBuf * do_transform_effect(
struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
do_transform(context.scene, seq, facf0,
- context.rectx, context.recty, ibuf1, out);
+ context.rectx, context.recty, ibuf1, out);
return out;
}
@@ -2541,7 +2541,7 @@ static void RVIsolateHighlights_byte (unsigned char* in, unsigned char* out,
for(y=0;y< height;y++) {
for (x=0;x< width;x++) {
- index= (x+y*width)*4;
+ index= (x+y*width)*4;
/* Isolate the intensity */
intensity=(in[index+GlowR]+in[index+GlowG]+in[index+GlowB]-threshold);
@@ -2570,7 +2570,7 @@ static void RVIsolateHighlights_float (float* in, float* out,
for(y=0;y< height;y++) {
for (x=0;x< width;x++) {
- index= (x+y*width)*4;
+ index= (x+y*width)*4;
/* Isolate the intensity */
intensity=(in[index+GlowR]+in[index+GlowG]+in[index+GlowB]-threshold);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 3e9b570d104..53878176fec 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -1160,13 +1160,13 @@ static void seq_open_anim_file(Sequence * seq)
return;
}
- BLI_join_dirfile(name, sizeof(name),
- seq->strip->dir, seq->strip->stripdata->name);
+ BLI_join_dirfile(name, sizeof(name),
+ seq->strip->dir, seq->strip->stripdata->name);
BLI_path_abs(name, G.main->name);
seq->anim = openanim(name, IB_rect |
- ((seq->flag & SEQ_FILTERY) ?
- IB_animdeinterlace : 0), seq->streamindex);
+ ((seq->flag & SEQ_FILTERY) ?
+ IB_animdeinterlace : 0), seq->streamindex);
if (seq->anim == NULL) {
return;
@@ -1211,8 +1211,8 @@ static int seq_proxy_get_fname(SeqRenderData context, Sequence * seq, int cfra,
}
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
- BLI_join_dirfile(name, PROXY_MAXFILE,
- dir, seq->strip->proxy->file);
+ BLI_join_dirfile(name, PROXY_MAXFILE,
+ dir, seq->strip->proxy->file);
BLI_path_abs(name, G.main->name);
return TRUE;
@@ -1227,14 +1227,13 @@ static int seq_proxy_get_fname(SeqRenderData context, Sequence * seq, int cfra,
if (seq->type == SEQ_IMAGE) {
BLI_snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy", dir,
- context.preview_render_size,
- give_stripelem(seq, cfra)->name);
+ context.preview_render_size,
+ give_stripelem(seq, cfra)->name);
frameno = 1;
} else {
- frameno = (int) give_stripelem_index(seq, cfra)
- + seq->anim_startofs;
+ frameno = (int) give_stripelem_index(seq, cfra) + seq->anim_startofs;
BLI_snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir,
- context.preview_render_size);
+ context.preview_render_size);
}
BLI_path_abs(name, G.main->name);
@@ -1504,7 +1503,7 @@ static void color_balance_byte_byte(Sequence * seq, ImBuf* ibuf, float mul)
for (c = 0; c < 3; c++) {
make_cb_table_byte(cb.lift[c], cb.gain[c], cb.gamma[c],
- cb_tab[c], mul);
+ cb_tab[c], mul);
}
while (p < e) {
@@ -1847,14 +1846,14 @@ static ImBuf* seq_render_effect_strip_impl(
switch (early_out) {
case EARLY_NO_INPUT:
- out = sh.execute(context, seq, cfra, fac, facf,
- NULL, NULL, NULL);
+ out = sh.execute(context, seq, cfra, fac, facf,
+ NULL, NULL, NULL);
break;
case EARLY_DO_EFFECT:
for(i=0; i<3; i++) {
if(input[i])
ibuf[i] = seq_render_strip(
- context, input[i], cfra);
+ context, input[i], cfra);
}
if (ibuf[0] && ibuf[1]) {
@@ -2909,7 +2908,7 @@ int seq_single_check(Sequence *seq)
return (seq->len==1 && (
seq->type == SEQ_IMAGE
|| ((seq->type & SEQ_EFFECT) &&
- get_sequence_effect_num_inputs(seq->type) == 0)));
+ get_sequence_effect_num_inputs(seq->type) == 0)));
}
/* check if the selected seq's reference unselected seq's */
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 5b02731050e..d3d6a658ede 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -561,7 +561,7 @@ static void ccd_build_deflector_hash(Scene *scene, Object *vertexowner, GHash *h
}/*--- only with deflecting set */
}/* mesh && layer*/
- base = base->next;
+ base = base->next;
} /* while (base) */
}
@@ -589,7 +589,7 @@ static void ccd_update_deflector_hash(Scene *scene, Object *vertexowner, GHash *
}/*--- only with deflecting set */
}/* mesh && layer*/
- base = base->next;
+ base = base->next;
} /* while (base) */
}
@@ -2270,7 +2270,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo
kd = sb->goalfrict * sb_fric_force_scale(ob) ;
add_v3_v3v3(auxvect,velgoal,bp->vec);
- if (forcetime > 0.0 ) { /* make sure friction does not become rocket motor on time reversal */
+ if (forcetime > 0.0f) { /* make sure friction does not become rocket motor on time reversal */
bp->force[0]-= kd * (auxvect[0]);
bp->force[1]-= kd * (auxvect[1]);
bp->force[2]-= kd * (auxvect[2]);
@@ -2675,7 +2675,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa
kd = sb->goalfrict * sb_fric_force_scale(ob) ;
add_v3_v3v3(auxvect,velgoal,bp->vec);
- if (forcetime > 0.0 ) { /* make sure friction does not become rocket motor on time reversal */
+ if (forcetime > 0.0f) { /* make sure friction does not become rocket motor on time reversal */
bp->force[0]-= kd * (auxvect[0]);
bp->force[1]-= kd * (auxvect[1]);
bp->force[2]-= kd * (auxvect[2]);
@@ -3149,7 +3149,7 @@ static void apply_spring_memory(Object *ob)
bp2 =&sb->bpoint[bs->v2];
l = len_v3v3(bp1->pos,bp2->pos);
r = bs->len/l;
- if (( r > 1.05f) || (r < 0.95)){
+ if (( r > 1.05f) || (r < 0.95f)){
bs->len = ((100.0f - b) * bs->len + b*l)/100.0f;
}
}
@@ -3356,7 +3356,7 @@ static void mesh_to_softbody(Scene *scene, Object *ob)
build_bps_springlist(ob); /* yes we need to do it again*/
}
springs_from_mesh(ob); /* write the 'rest'-length of the springs */
- if (ob->softflag & OB_SB_SELF) {calculate_collision_balls(ob);}
+ if (ob->softflag & OB_SB_SELF) {calculate_collision_balls(ob);}
}
@@ -3952,7 +3952,7 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime)
while ( (ABS(timedone) < ABS(dtime)) && (loops < 2000) )
{
/* set goals in time */
- interpolate_exciter(ob,200,(int)(200.0*(timedone/dtime)));
+ interpolate_exciter(ob,200,(int)(200.0f*(timedone/dtime)));
sb->scratch->flag &= ~SBF_DOFUZZY;
/* do predictive euler step */
@@ -3993,7 +3993,7 @@ static void softbody_step(Scene *scene, Object *ob, SoftBody *sb, float dtime)
timedone += forcetime;
newtime=MIN2(forcetimemax,MAX2(newtime,forcetimemin));
//if (newtime > forcetime) printf("up,");
- if (forcetime > 0.0)
+ if (forcetime > 0.0f)
forcetime = MIN2(dtime - timedone,newtime);
else
forcetime = MAX2(dtime - timedone,newtime);
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index a66178a935c..001d2abab01 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1511,6 +1511,155 @@ static void ccgDM_drawFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *a
dm->drawMappedFacesGLSL(dm, setMaterial, NULL, NULL);
}
+ /* Only used by non-editmesh types */
+static void ccgDM_drawMappedFacesMat(DerivedMesh *dm, void (*setMaterial)(void *userData, int, void *attribs), int (*setFace)(void *userData, int index), void *userData) {
+ CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
+ CCGSubSurf *ss = ccgdm->ss;
+ CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
+ GPUVertexAttribs gattribs;
+ DMVertexAttribs attribs= {{{NULL}}};
+ int gridSize = ccgSubSurf_getGridSize(ss);
+ int gridFaces = gridSize - 1;
+ int edgeSize = ccgSubSurf_getEdgeSize(ss);
+ char *faceFlags = ccgdm->faceFlags;
+ int a, b, i, numVerts, matnr, new_matnr, totface;
+
+ ccgdm_pbvh_update(ccgdm);
+
+ matnr = -1;
+
+#define PASSATTRIB(dx, dy, vert) { \
+ if(attribs.totorco) { \
+ index = getFaceIndex(ss, f, S, x+dx, y+dy, edgeSize, gridSize); \
+ if(attribs.orco.glTexco) \
+ glTexCoord3fv(attribs.orco.array[index]); \
+ else \
+ glVertexAttrib3fvARB(attribs.orco.glIndex, attribs.orco.array[index]); \
+ } \
+ for(b = 0; b < attribs.tottface; b++) { \
+ MTFace *tf = &attribs.tface[b].array[a]; \
+ 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 = &attribs.mcol[b].array[a*4 + vert]; \
+ 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[a*4 + vert]; \
+ glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \
+ } \
+}
+
+ totface = ccgSubSurf_getNumFaces(ss);
+ for(a = 0, i = 0; i < totface; i++) {
+ CCGFace *f = ccgdm->faceMap[i].face;
+ int S, x, y, drawSmooth;
+ int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
+ int origIndex = ccgDM_getFaceMapIndex(ss, f);
+
+ numVerts = ccgSubSurf_getFaceNumVerts(f);
+
+ /* get flags */
+ if(faceFlags) {
+ drawSmooth = (faceFlags[index*2] & ME_SMOOTH);
+ new_matnr= faceFlags[index*2 + 1] + 1;
+ }
+ else {
+ drawSmooth = 1;
+ new_matnr= 1;
+ }
+
+ /* material */
+ if(new_matnr != matnr) {
+ setMaterial(userData, matnr = new_matnr, &gattribs);
+ DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
+ }
+
+ /* face hiding */
+ if((setFace && (origIndex != ORIGINDEX_NONE) && !setFace(userData, origIndex))) {
+ a += gridFaces*gridFaces*numVerts;
+ continue;
+ }
+
+ /* draw face*/
+ glShadeModel(drawSmooth? GL_SMOOTH: GL_FLAT);
+ for (S=0; S<numVerts; S++) {
+ DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
+ DMGridData *vda, *vdb;
+
+ if (drawSmooth) {
+ for (y=0; y<gridFaces; y++) {
+ glBegin(GL_QUAD_STRIP);
+ for (x=0; x<gridFaces; x++) {
+ vda = &faceGridData[(y+0)*gridSize + x];
+ vdb = &faceGridData[(y+1)*gridSize + x];
+
+ PASSATTRIB(0, 0, 0);
+ glNormal3fv(vda->no);
+ glVertex3fv(vda->co);
+
+ PASSATTRIB(0, 1, 1);
+ glNormal3fv(vdb->no);
+ glVertex3fv(vdb->co);
+
+ if(x != gridFaces-1)
+ a++;
+ }
+
+ vda = &faceGridData[(y+0)*gridSize + x];
+ vdb = &faceGridData[(y+1)*gridSize + x];
+
+ PASSATTRIB(0, 0, 3);
+ glNormal3fv(vda->no);
+ glVertex3fv(vda->co);
+
+ PASSATTRIB(0, 1, 2);
+ glNormal3fv(vdb->no);
+ glVertex3fv(vdb->co);
+
+ glEnd();
+
+ a++;
+ }
+ } else {
+ glBegin(GL_QUADS);
+ for (y=0; y<gridFaces; y++) {
+ for (x=0; x<gridFaces; x++) {
+ float *aco = faceGridData[(y+0)*gridSize + x].co;
+ float *bco = faceGridData[(y+0)*gridSize + x + 1].co;
+ float *cco = faceGridData[(y+1)*gridSize + x + 1].co;
+ float *dco = faceGridData[(y+1)*gridSize + x].co;
+
+ ccgDM_glNormalFast(aco, bco, cco, dco);
+
+ PASSATTRIB(0, 1, 1);
+ glVertex3fv(dco);
+ PASSATTRIB(1, 1, 2);
+ glVertex3fv(cco);
+ PASSATTRIB(1, 0, 3);
+ glVertex3fv(bco);
+ PASSATTRIB(0, 0, 0);
+ glVertex3fv(aco);
+
+ a++;
+ }
+ }
+ glEnd();
+ }
+ }
+ }
+
+#undef PASSATTRIB
+
+ ccgFaceIterator_free(fi);
+}
+
+
static void ccgDM_drawFacesColored(DerivedMesh *dm, int UNUSED(useTwoSided), unsigned char *col1, unsigned char *col2) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1815,11 +1964,14 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(stipple_quarttone);
}
+
+ /* no need to set shading mode to flat because
+ * normals are already used to change shading */
+ glShadeModel(GL_SMOOTH);
for (S=0; S<numVerts; S++) {
DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
if (drawSmooth) {
- glShadeModel(GL_SMOOTH);
for (y=0; y<gridFaces; y++) {
DMGridData *a, *b;
glBegin(GL_QUAD_STRIP);
@@ -1854,7 +2006,6 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
glEnd();
}
} else {
- glShadeModel(GL_FLAT);
glBegin(GL_QUADS);
for (y=0; y<gridFaces; y++) {
for (x=0; x<gridFaces; x++) {
@@ -2382,6 +2533,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgdm->dm.drawMappedFaces = ccgDM_drawMappedFaces;
ccgdm->dm.drawMappedFacesTex = ccgDM_drawMappedFacesTex;
ccgdm->dm.drawMappedFacesGLSL = ccgDM_drawMappedFacesGLSL;
+ ccgdm->dm.drawMappedFacesMat = ccgDM_drawMappedFacesMat;
ccgdm->dm.drawUVEdges = ccgDM_drawUVEdges;
ccgdm->dm.drawMappedEdgesInterp = ccgDM_drawMappedEdgesInterp;
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index a834628641a..65b27f725bc 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -443,16 +443,17 @@ void BKE_tracking_clear_path(MovieTrackingTrack *track, int ref_frame, int actio
int BKE_tracking_test_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack *src_track)
{
- int i, a= 0, b= 0, tot= dst_track->markersnr+src_track->markersnr;
+ int a= 0, b= 0;
+ /* int tot= dst_track->markersnr+src_track->markersnr; */ /* UNUSED */
int count= 0;
- for(i= 0; i<tot; i++) {
- if(a>=src_track->markersnr) {
- b++;
+ while(a<src_track->markersnr || b<dst_track->markersnr) {
+ if(b>=dst_track->markersnr) {
+ a++;
count++;
}
- else if(b>=dst_track->markersnr) {
- a++;
+ else if(a>=src_track->markersnr) {
+ b++;
count++;
}
else if(src_track->markers[a].framenr<dst_track->markers[b].framenr) {
@@ -1793,8 +1794,8 @@ static void calculate_stabdata(MovieTracking *tracking, int framenr, float width
*angle*= stab->rotinf;
/* convert to rotation around image center */
- loc[0]-= (x0 + (x-x0)*cos(*angle)-(y-y0)*sin(*angle) - x)*(*scale);
- loc[1]-= (y0 + (x-x0)*sin(*angle)+(y-y0)*cos(*angle) - y)*(*scale);
+ loc[0]-= (x0 + (x-x0)*cosf(*angle)-(y-y0)*sinf(*angle) - x)*(*scale);
+ loc[1]-= (y0 + (x-x0)*sinf(*angle)+(y-y0)*cosf(*angle) - y)*(*scale);
}
}
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index 2646f5164b2..036a52a1235 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -343,8 +343,8 @@ static AVFrame* generate_video_frame(uint8_t* pixels, ReportList *reports)
if (c->pix_fmt != PIX_FMT_BGR32) {
sws_scale(img_convert_ctx, (const uint8_t * const*) rgb_frame->data,
- rgb_frame->linesize, 0, c->height,
- current_frame->data, current_frame->linesize);
+ rgb_frame->linesize, 0, c->height,
+ current_frame->data, current_frame->linesize);
delete_picture(rgb_frame);
}
return current_frame;
diff --git a/source/blender/blenlib/BLI_fnmatch.h b/source/blender/blenlib/BLI_fnmatch.h
index 94ae741250f..c09a7c7c0d2 100644
--- a/source/blender/blenlib/BLI_fnmatch.h
+++ b/source/blender/blenlib/BLI_fnmatch.h
@@ -63,7 +63,7 @@ extern "C" {
/* Match STRING against the filename pattern PATTERN,
returning zero if it matches, FNM_NOMATCH if not. */
extern int fnmatch __P ((const char *__pattern, const char *__string,
- int __flags));
+ int __flags));
#ifdef __cplusplus
}
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 713466f13f8..99687ae8bb4 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -58,7 +58,9 @@ float area_poly_v3(int nr, float verts[][3], const float normal[3]);
float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2]);
float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
+void closest_to_line_segment_v2(float closest[2], const float p[2], const float l1[2], const float l2[2]);
+float dist_to_plane_v3(const float p[2], const float plane_co[3], const float plane_no[2]);
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]);
diff --git a/source/blender/blenlib/BLI_pbvh.h b/source/blender/blenlib/BLI_pbvh.h
index c25243a9d36..e17a37c0a12 100644
--- a/source/blender/blenlib/BLI_pbvh.h
+++ b/source/blender/blenlib/BLI_pbvh.h
@@ -77,7 +77,7 @@ void BLI_pbvh_search_gather(PBVH *bvh,
hit first */
void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitOccludedCallback cb, void *data,
- float ray_start[3], float ray_normal[3], int original);
+ float ray_start[3], float ray_normal[3], int original);
int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3],
float ray_start[3], float ray_normal[3], float *dist);
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 1c9c9188e44..a513b9f9e85 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -56,6 +56,10 @@ void BLI_remove_threads(struct ListBase *threadbase);
void BLI_end_threads (struct ListBase *threadbase);
int BLI_thread_is_main(void);
+
+void BLI_begin_threaded_malloc(void);
+void BLI_end_threaded_malloc(void);
+
/* System Information */
int BLI_system_thread_count(void); /* gets the number of threads the system can make use of */
diff --git a/source/blender/blenlib/BLI_vfontdata.h b/source/blender/blenlib/BLI_vfontdata.h
index ef6608e2c25..e858e784991 100644
--- a/source/blender/blenlib/BLI_vfontdata.h
+++ b/source/blender/blenlib/BLI_vfontdata.h
@@ -47,13 +47,13 @@ typedef struct VFontData {
// float resol[MAX_VF_CHARS];
// float width[MAX_VF_CHARS];
// float *points[MAX_VF_CHARS];
- char name[128];
+ char name[128];
} VFontData;
typedef struct VChar {
struct VChar *next, *prev;
- ListBase nurbsbase;
- intptr_t index;
+ ListBase nurbsbase;
+ intptr_t index;
float resol;
float width;
float *points;
diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c
index 52365371421..62a38e7933a 100644
--- a/source/blender/blenlib/intern/BLI_heap.c
+++ b/source/blender/blenlib/intern/BLI_heap.c
@@ -62,8 +62,10 @@ struct Heap {
#define HEAP_COMPARE(a, b) (a->value < b->value)
#define HEAP_EQUALS(a, b) (a->value == b->value)
#define HEAP_SWAP(heap, i, j) \
- { SWAP(int, heap->tree[i]->index, heap->tree[j]->index); \
- SWAP(HeapNode*, heap->tree[i], heap->tree[j]); }
+{ \
+ SWAP(int, heap->tree[i]->index, heap->tree[j]->index); \
+ SWAP(HeapNode*, heap->tree[i], heap->tree[j]); \
+}
/***/
diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c
index 65c5dffa33c..0eda3e78824 100644
--- a/source/blender/blenlib/intern/edgehash.c
+++ b/source/blender/blenlib/intern/edgehash.c
@@ -85,7 +85,7 @@ void BLI_edgehash_insert(EdgeHash *eh, int v0, int v1, void *val) {
v1 ^= v0;
v0 ^= v1;
}
- hash = EDGEHASH(v0,v1)%eh->nbuckets;
+ hash = EDGEHASH(v0,v1)%eh->nbuckets;
e->v0 = v0;
e->v1 = v1;
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index b79ae9f0042..a135cb43882 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -207,6 +207,21 @@ float dist_to_line_segment_v2(const float v1[2], const float v2[2], const float
return sqrtf(rc[0]*rc[0]+ rc[1]*rc[1]);
}
+/* 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])
+{
+ float lambda, cp[2];
+
+ lambda= closest_to_line_v2(cp,p, l1, l2);
+
+ if(lambda <= 0.0f)
+ copy_v2_v2(closest, l1);
+ else if(lambda >= 1.0f)
+ copy_v2_v2(closest, l2);
+ else
+ copy_v2_v2(closest, 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])
{
@@ -222,6 +237,18 @@ void closest_to_line_segment_v3(float closest[3], const float v1[3], const float
copy_v3_v3(closest, cp);
}
+/* signed distance from the point to the plane in 3D */
+float dist_to_plane_v3(const float p[2], const float plane_co[3], const float plane_no[2])
+{
+ float plane_no_unit[3];
+ float plane_co_other[3];
+
+ normalize_v3_v3(plane_no_unit, plane_no);
+ add_v3_v3v3(plane_co_other, plane_co, plane_no_unit);
+
+ return -line_point_factor_v3(p, plane_co, plane_co_other);
+}
+
/* distance v1 to line-piece v2-v3 in 3D */
float dist_to_line_segment_v3(const float v1[3], const float v2[3], const float v3[3])
{
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 241ab62e175..b2c9a5706a3 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -426,9 +426,9 @@ void mul_m3_v3_double(float mat[][3], double vec[3])
x=vec[0];
y=vec[1];
- vec[0]= x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2];
- vec[1]= x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2];
- vec[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2];
+ vec[0]= x*(double)mat[0][0] + y*(double)mat[1][0] + (double)mat[2][0]*vec[2];
+ vec[1]= x*(double)mat[0][1] + y*(double)mat[1][1] + (double)mat[2][1]*vec[2];
+ vec[2]= x*(double)mat[0][2] + y*(double)mat[1][2] + (double)mat[2][2]*vec[2];
}
void add_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index 7fecbae8229..1637cd16161 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -211,7 +211,7 @@ void quat_to_mat4(float m[][4], const float q[4])
double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
#ifdef DEBUG
- if(!((q0=dot_qtqt(q, q))==0.0f || (fabs(q0-1.0) < QUAT_EPSILON))) {
+ if(!((q0=dot_qtqt(q, q))==0.0f || (fabsf(q0-1.0) < QUAT_EPSILON))) {
fprintf(stderr, "Warning! quat_to_mat4() called with non-normalized: size %.8f *** report a bug ***\n", (float)q0);
}
#endif
@@ -257,7 +257,7 @@ void mat3_to_quat(float *q, float wmat[][3])
/* work on a copy */
copy_m3_m3(mat, wmat);
- normalize_m3(mat); /* this is needed AND a NormalQuat in the end */
+ normalize_m3(mat); /* this is needed AND a 'normalize_qt' in the end */
tr= 0.25* (double)(1.0f+mat[0][0]+mat[1][1]+mat[2][2]);
@@ -271,31 +271,31 @@ void mat3_to_quat(float *q, float wmat[][3])
}
else {
if(mat[0][0] > mat[1][1] && mat[0][0] > mat[2][2]) {
- s= 2.0*sqrtf(1.0f + mat[0][0] - mat[1][1] - mat[2][2]);
+ s= 2.0f*sqrtf(1.0f + mat[0][0] - mat[1][1] - mat[2][2]);
q[1]= (float)(0.25*s);
s= 1.0/s;
- q[0]= (float)((mat[2][1] - mat[1][2])*s);
- q[2]= (float)((mat[1][0] + mat[0][1])*s);
- q[3]= (float)((mat[2][0] + mat[0][2])*s);
+ q[0]= (float)((double)(mat[2][1] - mat[1][2])*s);
+ q[2]= (float)((double)(mat[1][0] + mat[0][1])*s);
+ q[3]= (float)((double)(mat[2][0] + mat[0][2])*s);
}
else if(mat[1][1] > mat[2][2]) {
- s= 2.0*sqrtf(1.0f + mat[1][1] - mat[0][0] - mat[2][2]);
+ s= 2.0f*sqrtf(1.0f + mat[1][1] - mat[0][0] - mat[2][2]);
q[2]= (float)(0.25*s);
s= 1.0/s;
- q[0]= (float)((mat[2][0] - mat[0][2])*s);
- q[1]= (float)((mat[1][0] + mat[0][1])*s);
- q[3]= (float)((mat[2][1] + mat[1][2])*s);
+ q[0]= (float)((double)(mat[2][0] - mat[0][2])*s);
+ q[1]= (float)((double)(mat[1][0] + mat[0][1])*s);
+ q[3]= (float)((double)(mat[2][1] + mat[1][2])*s);
}
else {
- s= 2.0*sqrtf(1.0 + mat[2][2] - mat[0][0] - mat[1][1]);
+ s= 2.0f*sqrtf(1.0f + mat[2][2] - mat[0][0] - mat[1][1]);
q[3]= (float)(0.25*s);
s= 1.0/s;
- q[0]= (float)((mat[1][0] - mat[0][1])*s);
- q[1]= (float)((mat[2][0] + mat[0][2])*s);
- q[2]= (float)((mat[2][1] + mat[1][2])*s);
+ q[0]= (float)((double)(mat[1][0] - mat[0][1])*s);
+ q[1]= (float)((double)(mat[2][0] + mat[0][2])*s);
+ q[2]= (float)((double)(mat[2][1] + mat[1][2])*s);
}
}
diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c
index 5a8e378e8c4..0ac6e0ba4df 100644
--- a/source/blender/blenlib/intern/pbvh.c
+++ b/source/blender/blenlib/intern/pbvh.c
@@ -507,13 +507,13 @@ static void build_sub(PBVH *bvh, int node_index, BB *cb, BBC *prim_bbc,
bvh->nodes[node_index].orig_vb= bvh->nodes[node_index].vb;
end = partition_indices(bvh->prim_indices, offset, offset + count - 1,
- axis,
- (cb->bmax[axis] + cb->bmin[axis]) * 0.5f,
- prim_bbc);
+ axis,
+ (cb->bmax[axis] + cb->bmin[axis]) * 0.5f,
+ prim_bbc);
check_partitioning(bvh->prim_indices, offset, offset + count - 1,
- axis,
- (cb->bmax[axis] + cb->bmin[axis]) * 0.5f,
- prim_bbc, end);
+ axis,
+ (cb->bmax[axis] + cb->bmin[axis]) * 0.5f,
+ prim_bbc, end);
build_sub(bvh, bvh->nodes[node_index].children_offset, NULL,
prim_bbc, offset, end - offset);
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 4bd17fcf0b9..41b1fea32a6 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -165,7 +165,7 @@ static void *new_mem_element(int size)
if(cur) {
if(size+offs < blocksize) {
adr= (void *) (cur->data+offs);
- offs+= size;
+ offs+= size;
return adr;
}
}
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index 8247b861a7a..98d2179e2dd 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -669,3 +669,17 @@ void BLI_thread_queue_nowait(ThreadQueue *queue)
pthread_mutex_unlock(&queue->mutex);
}
+void BLI_begin_threaded_malloc(void)
+{
+ if(thread_levels == 0) {
+ MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread);
+ }
+ thread_levels++;
+}
+
+void BLI_end_threaded_malloc(void)
+{
+ thread_levels--;
+ if(thread_levels==0)
+ MEM_set_lock_callback(NULL, NULL);
+}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 304d302328a..1fc79080310 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -56,6 +56,7 @@
#include "DNA_cloth_types.h"
#include "DNA_controller_types.h"
#include "DNA_constraint_types.h"
+#include "DNA_dynamicpaint_types.h"
#include "DNA_effect_types.h"
#include "DNA_fileglobal_types.h"
#include "DNA_genfile.h"
@@ -1554,14 +1555,14 @@ static void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData
IDP_DirectLinkIDPArray(prop, switch_endian, fd);
break;
case IDP_DOUBLE:
- /*erg, stupid doubles. since I'm storing them
- in the same field as int val; val2 in the
- IDPropertyData struct, they have to deal with
- endianness specifically
-
- in theory, val and val2 would've already been swapped
- if switch_endian is true, so we have to first unswap
- them then reswap them as a single 64-bit entity.
+ /* erg, stupid doubles. since I'm storing them
+ * in the same field as int val; val2 in the
+ * IDPropertyData struct, they have to deal with
+ * endianness specifically
+
+ * in theory, val and val2 would've already been swapped
+ * if switch_endian is true, so we have to first unswap
+ * them then reswap them as a single 64-bit entity.
*/
if (switch_endian) {
@@ -2123,11 +2124,61 @@ static void lib_link_nodetree(FileData *fd, Main *main)
}
}
+static void do_versions_socket_default_value(bNodeSocket *sock)
+{
+ bNodeSocketValueFloat *valfloat;
+ bNodeSocketValueVector *valvector;
+ bNodeSocketValueRGBA *valrgba;
+
+ if (sock->default_value)
+ return;
+
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
+ valfloat->value = sock->ns.vec[0];
+ valfloat->min = sock->ns.min;
+ valfloat->max = sock->ns.max;
+ valfloat->subtype = PROP_NONE;
+ break;
+ case SOCK_VECTOR:
+ valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
+ copy_v3_v3(valvector->value, sock->ns.vec);
+ valvector->min = sock->ns.min;
+ valvector->max = sock->ns.max;
+ valvector->subtype = PROP_NONE;
+ break;
+ case SOCK_RGBA:
+ valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
+ copy_v4_v4(valrgba->value, sock->ns.vec);
+ break;
+ }
+}
+
+static void do_versions_nodetree_default_value(bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+ for (node=ntree->nodes.first; node; node=node->next) {
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ }
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+}
+
static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
{
bNode *node;
ntreeInitTypes(ntree);
+
+ /* need to do this here instead of in do_versions, otherwise next function can crash */
+ do_versions_nodetree_default_value(ntree);
/* XXX could be replaced by do_versions for new nodes */
for (node=ntree->nodes.first; node; node=node->next)
@@ -3517,8 +3568,8 @@ static void lib_link_mtface(FileData *fd, Mesh *me, MTFace *mtface, int totface)
int i;
/* Add pseudo-references (not fake users!) to images used by texface. A
- little bogus; it would be better if each mesh consistently added one ref
- to each image it used. - z0r */
+ * little bogus; it would be better if each mesh consistently added one ref
+ * to each image it used. - z0r */
for (i=0; i<totface; i++, tf++) {
tf->tpage= newlibadr(fd, me->id.lib, tf->tpage);
if(tf->tpage && tf->tpage->id.us==0)
@@ -3719,7 +3770,7 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
}
/* if multires is present but has no valid vertex data,
- there's no way to recover it; silently remove multires */
+ * there's no way to recover it; silently remove multires */
if(mesh->mr && !mesh->mr->verts) {
multires_free(mesh->mr);
mesh->mr = NULL;
@@ -4193,6 +4244,40 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
}
}
+ else if (md->type==eModifierType_DynamicPaint) {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+
+ if(pmd->canvas)
+ {
+ pmd->canvas = newdataadr(fd, pmd->canvas);
+ pmd->canvas->pmd = pmd;
+ pmd->canvas->dm = NULL;
+ pmd->canvas->flags &= ~MOD_DPAINT_BAKING; /* just in case */
+
+ if (pmd->canvas->surfaces.first) {
+ DynamicPaintSurface *surface;
+ link_list(fd, &pmd->canvas->surfaces);
+
+ for (surface=pmd->canvas->surfaces.first; surface; surface=surface->next) {
+ surface->canvas = pmd->canvas;
+ surface->data = NULL;
+ direct_link_pointcache_list(fd, &(surface->ptcaches), &(surface->pointcache), 1);
+
+ if(!(surface->effector_weights = newdataadr(fd, surface->effector_weights)))
+ surface->effector_weights = BKE_add_effector_weights(NULL);
+ }
+ }
+ }
+ if(pmd->brush)
+ {
+ pmd->brush = newdataadr(fd, pmd->brush);
+ pmd->brush->pmd = pmd;
+ pmd->brush->psys = newdataadr(fd, pmd->brush->psys);
+ pmd->brush->paint_ramp = newdataadr(fd, pmd->brush->paint_ramp);
+ pmd->brush->vel_ramp = newdataadr(fd, pmd->brush->vel_ramp);
+ pmd->brush->dm = NULL;
+ }
+ }
else if (md->type==eModifierType_Collision) {
CollisionModifierData *collmd = (CollisionModifierData*) md;
@@ -5625,6 +5710,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
else if(sl->spacetype==SPACE_BUTS) {
SpaceButs *sbuts= (SpaceButs *)sl;
sbuts->path= NULL;
+ sbuts->texuser= NULL;
}
else if(sl->spacetype==SPACE_CONSOLE) {
SpaceConsole *sconsole= (SpaceConsole *)sl;
@@ -7334,53 +7420,6 @@ static void do_version_bone_roll_256(Bone *bone)
do_version_bone_roll_256(child);
}
-static void do_versions_socket_default_value(bNodeSocket *sock)
-{
- bNodeSocketValueFloat *valfloat;
- bNodeSocketValueVector *valvector;
- bNodeSocketValueRGBA *valrgba;
-
- if (sock->default_value)
- return;
-
- switch (sock->type) {
- case SOCK_FLOAT:
- valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
- valfloat->value = sock->ns.vec[0];
- valfloat->min = sock->ns.min;
- valfloat->max = sock->ns.max;
- valfloat->subtype = PROP_NONE;
- break;
- case SOCK_VECTOR:
- valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
- copy_v3_v3(valvector->value, sock->ns.vec);
- valvector->min = sock->ns.min;
- valvector->max = sock->ns.max;
- valvector->subtype = PROP_NONE;
- break;
- case SOCK_RGBA:
- valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
- copy_v4_v4(valrgba->value, sock->ns.vec);
- break;
- }
-}
-
-static void do_versions_nodetree_default_value(bNodeTree *ntree)
-{
- bNode *node;
- bNodeSocket *sock;
- for (node=ntree->nodes.first; node; node=node->next) {
- for (sock=node->inputs.first; sock; sock=sock->next)
- do_versions_socket_default_value(sock);
- for (sock=node->outputs.first; sock; sock=sock->next)
- do_versions_socket_default_value(sock);
- }
- for (sock=ntree->inputs.first; sock; sock=sock->next)
- do_versions_socket_default_value(sock);
- for (sock=ntree->outputs.first; sock; sock=sock->next)
- do_versions_socket_default_value(sock);
-}
-
static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree)
{
bNodeSocket *sock;
@@ -8994,7 +9033,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* make sure old cameras have title safe on */
if (!(cam->flag & CAM_SHOWTITLESAFE))
- cam->flag |= CAM_SHOWTITLESAFE;
+ cam->flag |= CAM_SHOWTITLESAFE;
/* set an appropriate camera passepartout alpha */
if (!(cam->passepartalpha)) cam->passepartalpha = 0.2f;
@@ -9291,7 +9330,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(group= main->group.first; group; group= group->id.next)
if(group->layer==0)
- group->layer= (1<<20)-1;
+ group->layer= (1<<20)-1;
/* History fix (python?), shape key adrcode numbers have to be sorted */
sort_shape_fix(main);
@@ -11701,7 +11740,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* enable all cache display */
stime->cache_display |= TIME_CACHE_DISPLAY;
stime->cache_display |= (TIME_CACHE_SOFTBODY|TIME_CACHE_PARTICLES);
- stime->cache_display |= (TIME_CACHE_CLOTH|TIME_CACHE_SMOKE);
+ stime->cache_display |= (TIME_CACHE_CLOTH|TIME_CACHE_SMOKE|TIME_CACHE_DYNAMICPAINT);
}
}
}
@@ -12516,10 +12555,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
{
Camera *cam;
for(cam= main->camera.first; cam; cam= cam->id.next) {
- if (cam->sensor_x < 0.01)
+ if (cam->sensor_x < 0.01f)
cam->sensor_x = DEFAULT_SENSOR_WIDTH;
- if (cam->sensor_y < 0.01)
+ if (cam->sensor_y < 0.01f)
cam->sensor_y = DEFAULT_SENSOR_HEIGHT;
}
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 3accc871548..086b83d0962 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -97,6 +97,7 @@ Any case: direct data is ALWAYS after the lib block
#include "DNA_cloth_types.h"
#include "DNA_constraint_types.h"
#include "DNA_controller_types.h"
+#include "DNA_dynamicpaint_types.h"
#include "DNA_genfile.h"
#include "DNA_group_types.h"
#include "DNA_gpencil_types.h"
@@ -1327,6 +1328,31 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
FluidsimModifierData *fluidmd = (FluidsimModifierData*) md;
writestruct(wd, DATA, "FluidsimSettings", 1, fluidmd->fss);
+ }
+ else if(md->type==eModifierType_DynamicPaint) {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+
+ if(pmd->canvas)
+ {
+ DynamicPaintSurface *surface;
+ writestruct(wd, DATA, "DynamicPaintCanvasSettings", 1, pmd->canvas);
+
+ /* write surfaces */
+ for (surface=pmd->canvas->surfaces.first; surface; surface=surface->next)
+ writestruct(wd, DATA, "DynamicPaintSurface", 1, surface);
+ /* write caches and effector weights */
+ for (surface=pmd->canvas->surfaces.first; surface; surface=surface->next) {
+ write_pointcaches(wd, &(surface->ptcaches));
+
+ writestruct(wd, DATA, "EffectorWeights", 1, surface->effector_weights);
+ }
+ }
+ if(pmd->brush)
+ {
+ writestruct(wd, DATA, "DynamicPaintBrushSettings", 1, pmd->brush);
+ writestruct(wd, DATA, "ColorBand", 1, pmd->brush->paint_ramp);
+ writestruct(wd, DATA, "ColorBand", 1, pmd->brush->vel_ramp);
+ }
}
else if (md->type==eModifierType_Collision) {
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index 077a06ce6ca..df786c38c71 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -267,7 +267,7 @@ void ArmatureExporter::export_controller(Object* ob, Object *ob_arm)
std::string controller_id = get_controller_id(ob_arm, ob);
openSkin(controller_id, controller_name,
- COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
+ COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
add_bind_shape_mat(ob);
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index 7e9634da21d..bababf880a6 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -112,8 +112,7 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
bone->roll=angle;
// set head
copy_v3_v3(bone->head, mat[3]);
-
-
+
// set tail, don't set it to head because 0-length bones are not allowed
float vec[3] = {0.0f, 0.5f, 0.0f};
add_v3_v3v3(bone->tail, bone->head, vec);
@@ -427,7 +426,7 @@ void ArmatureImporter::create_armature_bones( )
TODO:
check if bones have already been created for a given joint
*/
- leaf_bone_length = FLT_MAX;
+ leaf_bone_length = FLT_MAX;
create_unskinned_bone(*ri, NULL, (*ri)->getChildNodes().getCount(), NULL, ob_arm);
fix_leaf_bones();
@@ -593,17 +592,16 @@ void ArmatureImporter::set_pose ( Object * ob_arm , COLLADAFW::Node * root_node
}
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);
-
+ float invObmat[4][4];
+ invert_m4_m4(invObmat, ob_arm->obmat);
+ mul_m4_m4m4(pchan->pose_mat, mat, invObmat);
}
-
- mat4_to_axis_angle(ax,&angle,mat);
- pchan->bone->roll = angle;
-
- COLLADAFW::NodePointerArray& children = root_node->getChildNodes();
+ mat4_to_axis_angle(ax,&angle,mat);
+ pchan->bone->roll = angle;
+
+
+ COLLADAFW::NodePointerArray& children = root_node->getChildNodes();
for (unsigned int i = 0; i < children.getCount(); i++) {
set_pose(ob_arm, children[i], bone_name, mat);
}
@@ -762,8 +760,8 @@ Object *ArmatureImporter::get_armature_for_joint(COLLADAFW::Node *node)
if (skin.uses_joint_or_descendant(node))
return skin.get_armature();
}
-
- std::map<COLLADAFW::UniqueId, Object*>::iterator arm;
+
+ std::map<COLLADAFW::UniqueId, Object*>::iterator arm;
for (arm = unskinned_armature_map.begin(); arm != unskinned_armature_map.end(); arm++) {
if(arm->first == node->getUniqueId() )
return arm->second;
diff --git a/source/blender/collada/ArmatureImporter.h b/source/blender/collada/ArmatureImporter.h
index d2e3b8be4f5..343badaca28 100644
--- a/source/blender/collada/ArmatureImporter.h
+++ b/source/blender/collada/ArmatureImporter.h
@@ -107,7 +107,7 @@ private:
float parent_mat[][4], bArmature *arm);
void create_unskinned_bone(COLLADAFW::Node *node, EditBone *parent, int totchild,
- float parent_mat[][4], Object * ob_arm);
+ float parent_mat[][4], Object * ob_arm);
void add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW::Node * node);
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 7376b2e804c..caffdc29118 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -4108,7 +4108,7 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot)
/* props */
RNA_def_enum(ot->srna, "direction", direction_items,
- BONE_SELECT_PARENT, "Direction", "");
+ BONE_SELECT_PARENT, "Direction", "");
RNA_def_boolean(ot->srna, "extend", 0, "Add to Selection", "");
}
@@ -5207,9 +5207,9 @@ static int pose_hide_exec(bContext *C, wmOperator *op)
bArmature *arm= ob->data;
if(RNA_boolean_get(op->ptr, "unselected"))
- bone_looper(ob, arm->bonebase.first, NULL, hide_unselected_pose_bone_cb);
+ bone_looper(ob, arm->bonebase.first, NULL, hide_unselected_pose_bone_cb);
else
- bone_looper(ob, arm->bonebase.first, NULL, hide_selected_pose_bone_cb);
+ bone_looper(ob, arm->bonebase.first, NULL, hide_selected_pose_bone_cb);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c
index b1651886620..451e672da7c 100644
--- a/source/blender/editors/armature/editarmature_retarget.c
+++ b/source/blender/editors/armature/editarmature_retarget.c
@@ -708,7 +708,7 @@ static int RIG_parentControl(RigControl *ctrl, EditBone *link)
sub_v3_v3v3(offset, ctrl->bone->head, link->head);
/* if root matches, check for direction too */
- if (dot_v3v3(offset, offset) < 0.0001)
+ if (dot_v3v3(offset, offset) < 0.0001f)
{
float vbone[3], vparent[3];
@@ -726,7 +726,7 @@ static int RIG_parentControl(RigControl *ctrl, EditBone *link)
cross_v3_v3v3(nor, vbone, vparent);
len = dot_v3v3(nor, nor);
- if (len < 0.0001)
+ if (len < 0.0001f)
{
flag |= RIG_CTRL_FIT_BONE;
}
@@ -859,8 +859,8 @@ static void RIG_reconnectControlBones(RigGraph *rg)
{
int fit = 0;
- fit = len_v3v3(ctrl->bone->head, edge->bone->head) < 0.0001;
- fit = fit || len_v3v3(ctrl->bone->tail, edge->bone->tail) < 0.0001;
+ fit = len_v3v3(ctrl->bone->head, edge->bone->head) < 0.0001f;
+ fit = fit || len_v3v3(ctrl->bone->tail, edge->bone->tail) < 0.0001f;
if (fit)
{
@@ -1016,13 +1016,13 @@ static void RIG_reconnectControlBones(RigGraph *rg)
/* don't link with parent */
if (bone->parent != ctrl->bone)
{
- if (len_v3v3(ctrl->bone->tail, bone->head) < 0.01)
+ if (len_v3v3(ctrl->bone->tail, bone->head) < 0.01f)
{
ctrl->tail_mode = TL_HEAD;
ctrl->link_tail = bone;
break;
}
- else if (len_v3v3(ctrl->bone->tail, bone->tail) < 0.01)
+ else if (len_v3v3(ctrl->bone->tail, bone->tail) < 0.01f)
{
ctrl->tail_mode = TL_TAIL;
ctrl->link_tail = bone;
@@ -1122,14 +1122,14 @@ static void RIG_removeUneededOffsets(RigGraph *rg)
if (first_edge->bone == NULL)
{
- if (first_edge->bone == NULL && len_v3v3(first_edge->tail, arc->head->p) <= 0.001)
+ if (first_edge->bone == NULL && len_v3v3(first_edge->tail, arc->head->p) <= 0.001f)
{
BLI_remlink(&arc->edges, first_edge);
MEM_freeN(first_edge);
}
else if (arc->head->degree == 1)
{
- RigNode *new_node = (RigNode*)BLI_FindNodeByPosition((BGraph*)rg, first_edge->tail, 0.001);
+ RigNode *new_node = (RigNode*)BLI_FindNodeByPosition((BGraph*)rg, first_edge->tail, 0.001f);
if (new_node)
{
@@ -1252,14 +1252,14 @@ static void RIG_removeUneededOffsets(RigGraph *rg)
if (last_edge->bone == NULL)
{
- if (len_v3v3(last_edge->head, arc->tail->p) <= 0.001)
+ if (len_v3v3(last_edge->head, arc->tail->p) <= 0.001f)
{
BLI_remlink(&arc->edges, last_edge);
MEM_freeN(last_edge);
}
else if (arc->tail->degree == 1)
{
- RigNode *new_node = (RigNode*)BLI_FindNodeByPosition((BGraph*)rg, last_edge->head, 0.001);
+ RigNode *new_node = (RigNode*)BLI_FindNodeByPosition((BGraph*)rg, last_edge->head, 0.001f);
if (new_node)
{
@@ -2013,11 +2013,11 @@ static float costAngle(float original_angle, float vec_first[3], float vec_secon
{
current_angle = saacos(dot_v3v3(vec_first, vec_second));
- return angle_weight * fabs(current_angle - original_angle);
+ return angle_weight * fabsf(current_angle - original_angle);
}
else
{
- return angle_weight * M_PI;
+ return angle_weight * (float)M_PI;
}
}
else
@@ -2287,8 +2287,8 @@ static void retargetArctoArcAggresive(bContext *C, RigGraph *rigg, RigArc *iarc,
/* set joints to best position */
for (edge = iarc->edges.first, i = 0;
- edge;
- edge = edge->next, i++)
+ edge;
+ edge = edge->next, i++)
{
float *no = NULL;
if (i < nb_joints)
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index b97e843529a..f16771b624c 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -508,7 +508,7 @@ static void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float si
angle = angle_normalized_v3v3(vec2, vec1);
- glRotatef(angle * 180 / M_PI + 180, axis[0], axis[1], axis[2]);
+ glRotatef(angle * (float)(180.0/M_PI) + 180.0f, axis[0], axis[1], axis[2]);
gluCylinder(quad, sk_clampPointSize(pt1, size), sk_clampPointSize(pt0, size), length, 8, 8);
}
@@ -529,7 +529,7 @@ static void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float heig
angle = angle_normalized_v3v3(vec2, pt->no);
- glRotatef(angle * 180 / M_PI, axis[0], axis[1], axis[2]);
+ glRotatef(angle * (float)(180.0/M_PI), axis[0], axis[1], axis[2]);
glColor3f(0, 1, 1);
gluCylinder(quad, sk_clampPointSize(pt, size), 0, sk_clampPointSize(pt, height), 10, 2);
@@ -1817,7 +1817,7 @@ int sk_detectTrimGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSE
sub_v3_v3v3(s1, gest->segments->points[1].p, gest->segments->points[0].p);
sub_v3_v3v3(s2, gest->segments->points[2].p, gest->segments->points[1].p);
- angle = RAD2DEG(angle_v2v2(s1, s2));
+ angle = RAD2DEGF(angle_v2v2(s1, s2));
if (angle > 60 && angle < 120)
{
@@ -1935,7 +1935,7 @@ int sk_detectDeleteGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNU
sub_v3_v3v3(s1, gest->segments->points[1].p, gest->segments->points[0].p);
sub_v3_v3v3(s2, gest->segments->points[2].p, gest->segments->points[1].p);
- angle = RAD2DEG(angle_v2v2(s1, s2));
+ angle = RAD2DEGF(angle_v2v2(s1, s2));
if (angle > 120)
{
@@ -2067,7 +2067,7 @@ int sk_detectReverseGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UN
sub_v3_v3v3(end_v, sk_lastStrokePoint(gest->stk)->p, isect->p);
}
- angle = RAD2DEG(angle_v2v2(start_v, end_v));
+ angle = RAD2DEGF(angle_v2v2(start_v, end_v));
if (angle > 120)
{
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index e89674e8a37..993c8420576 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -199,7 +199,7 @@ void ED_pose_recalculate_paths(Scene *scene, Object *ob)
/* For the object with pose/action: create path curves for selected bones
* This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
*/
-static int pose_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
+static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
Scene *scene= CTX_data_scene(C);
@@ -218,7 +218,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
{
/* verify makes sure that the selected bone has a bone with the appropriate settings */
- animviz_verify_motionpaths(scene, ob, pchan);
+ animviz_verify_motionpaths(op->reports, scene, ob, pchan);
}
CTX_DATA_END;
diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c
index 0b214e48b6a..6a43564e5f1 100644
--- a/source/blender/editors/armature/reeb.c
+++ b/source/blender/editors/armature/reeb.c
@@ -545,12 +545,12 @@ static void verifyBucketsArc(ReebGraph *UNUSED(rg), ReebArc *arc)
}
}
- if (ceil(head->weight) != arc->buckets[0].val)
+ if (ceilf(head->weight) != arc->buckets[0].val)
{
printArc(arc);
printf("alloc error in first bucket: %f should be %f \n", arc->buckets[0].val, ceil(head->weight));
}
- if (floor(tail->weight) != arc->buckets[arc->bcount - 1].val)
+ if (floorf(tail->weight) != arc->buckets[arc->bcount - 1].val)
{
printArc(arc);
printf("alloc error in last bucket: %f should be %f \n", arc->buckets[arc->bcount - 1].val, floor(tail->weight));
@@ -3684,7 +3684,7 @@ void REEB_draw()
if (G.scene->toolsettings->skgen_options & SKGEN_DISP_INDEX)
{
- interp_v3_v3v3(vec, arc->head->p, arc->tail->p, 0.5f);
+ mid_v3_v3v3(vec, arc->head->p, arc->tail->p);
s += sprintf(s, "%i (%i-%i-%i) ", i, arc->symmetry_level, arc->symmetry_flag, arc->symmetry_group);
if (G.scene->toolsettings->skgen_options & SKGEN_DISP_WEIGHT)
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 2557c7f7c72..59b3f483b38 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -42,7 +42,7 @@ extern const char ED_lorem[];
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
enum { CASE_LOWER, CASE_UPPER };
enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD,
- PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE };
+ PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE };
void FONT_OT_text_insert(struct wmOperatorType *ot);
void FONT_OT_line_break(struct wmOperatorType *ot);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 0556291c197..1f6673137a1 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -688,8 +688,8 @@ static void key_to_bezt(float *key, BezTriple *basebezt, BezTriple *bezt)
static void bezt_to_key(BezTriple *bezt, float *key)
{
- memcpy(key, bezt->vec, sizeof(float) * 9);
- key[9] = bezt->alfa;
+ memcpy(key, bezt->vec, sizeof(float) * 9);
+ key[9] = bezt->alfa;
}
static void calc_keyHandles(ListBase *nurb, float *key)
diff --git a/source/blender/editors/datafiles/blender_icons.png.c b/source/blender/editors/datafiles/blender_icons.png.c
index 93c3b45a3d9..0ff16998665 100644
--- a/source/blender/editors/datafiles/blender_icons.png.c
+++ b/source/blender/editors/datafiles/blender_icons.png.c
@@ -1,6760 +1,6289 @@
/* DataToC output of file <blender_icons_png> */
-int datatoc_blender_icons_png_size= 216116;
+int datatoc_blender_icons_png_size= 201043;
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, 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,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,219, 9, 8, 18, 45, 9, 58,221,
-153,135, 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, 97,252,189,217,
- 59,105,218, 52, 29,148,150, 2,165,147, 85,160,236, 81, 40,101,149,141,162, 34, 56, 1, 5, 68, 5,197, 1, 40,202,146, 37, 67,
- 86, 5, 5, 17, 20, 16, 89,101,169, 40,200,166, 5, 74,129,178,186,103,210,221,166, 73, 51,239,249,253, 65,203,175,212,142,164,
-197,129,222,207,243,220, 39,201,185,185,111,206, 93,231,190,249,158,117,231,236,149,139,167, 45, 28, 54, 11,222, 30,206, 24, 29,
-209, 17,175,140,235,137, 78,129,205,144,166, 53,224,228,201,159, 44, 41, 41, 73,231,237,233,113, 88,165,153,120, 51,254,220,141,
- 43,103,172, 92, 14,133,192,128, 54,152,251,193,187,202, 69, 31,205,113,106,211,202, 27,241,201, 37,248,233,196, 81, 75,118,102,
-198,175,127, 87,143,195, 83, 0, 79, 42,160, 36,108, 22, 11, 54,150,160,156, 93,217,145,166,109,112,176,191,155,187, 59, 98, 98,
- 98,192,114,160, 71,232, 41,128, 39,149, 62,168, 5,215,233,116,168,210,107, 29, 16, 16,224,237,227,131, 35, 49, 49, 96,211,244,
-173,190, 14, 14, 48,122,251, 65, 53,244, 67, 93, 10,168,120,189, 57,100,173,155,171, 3,148, 10, 9, 46,198,223,131,209, 66, 46,
-125, 91,132,191,117, 60,178, 63,145,201,104,100,213,225,242, 77,155, 54,133,109,217,178,101,224,219,111,191, 45,157, 52,105, 18,
-132, 66, 33,244,122, 61,188,188,188, 96,179,217,112,236,216, 49,196,198,198,234,104,154,254, 9,127, 28, 54, 32, 2,213,122,105,
- 28, 79,130,232,129,223,210,135, 29,120,234,169,199,162, 9, 0,210,123,180,188,160,133,105,199,218, 61,103,198,236, 60,126,133,
-122,243,217,190,172, 78, 1,205, 1, 0,110,110,110,144,203,229, 14,107, 62, 6,254,116,205,234,213,186,185,185,185,183,115,115,
-115,181,175,190,250,106, 96, 85,195,119,129, 64, 80, 81, 25,201, 42,170,109, 27, 59,242,105, 6,240,250,150, 45, 91, 14,150,148,
-148, 28,127,231,157,119,176,104,209, 34, 28, 58,116,168, 55,128,179,141,220,119, 91, 81, 81, 81,241,165, 75,151,220,252,130, 66,
-209, 82,205, 69,159,121,119, 65, 8,129,139,152,160,172,184, 16, 87,175, 94, 65, 89, 89,217, 69, 71,242,105, 54,155,139,181, 90,
-173, 74,173, 86,163,176,176, 16,249,249,249, 15, 77, 86, 81, 81, 17, 10, 11, 11, 9, 69,253, 97,204,150,250, 52,203,181, 90,173,
- 62, 49, 49,145,239,214,220, 15,173,212, 60,116,253,224, 54, 64, 8,188,157, 89, 40, 43, 45,198,249,243,231, 81, 82, 82,242, 91,
- 93,154, 52, 77,207,154, 48, 97, 2, 27,192,196,119,222,121,199, 25, 64,135,119,223,125,247, 39,212,232, 89,200,225,112, 62,223,
-177, 99, 71,219,170, 42,198, 57,115,230,172, 2,176,229,175,186,150, 92, 92, 92,102,197,196,196,200,204,102, 51,214,174, 93,139,
- 85,171, 86,109,197, 31, 7,170,140,249,226,139, 47,214,179, 88,172,105,211,167, 79,199,148, 41, 83,196,157, 59,119,126, 59, 39,
- 39,231,219,218, 52,179,178,178,230,118,234,212,105,190, 86,171, 93,108,151, 89,190,123,119,114,167, 78,157,230,106,181,218,101,
-245,157, 35,137, 68, 34,177,217,108, 72, 73, 73, 41, 2,234,108,223, 81,145,146,146,146,101,179,217,188,196, 98,177,115, 67,215,
-103, 81, 81,209,226,206,157, 59,127,172,209,104, 78, 0, 88, 88,139, 33,191,150,147,147, 19, 50,115,230,204, 25, 75,151, 46, 29,
-147,155,155,251, 93, 67,154,105,105,105,139,195,195,195,231,221,185,115,103, 27,234,174, 2,254, 98,193,130, 5,230, 29, 59,118,
-188,150,146,146,178,164, 1,205,195,249,249,249,135, 29, 56,191,117,125,255,161, 38,155,205,126,119,233,210,165,172, 77,155, 54,
-129, 16,178,194,102,179,213,149,207,248,253,251,247,111,239,217,179,231,164, 61,123,246, 8, 67, 66, 66,166, 24,141,198, 93, 13,
- 93,159,122,189,126,223,158, 61,123,198,196,199,199,123, 77,154, 52, 73,232,239,239, 15,179,217,140,156,156, 28,108,218,180,169,
- 34, 33, 33, 33,179,184,184,120,159, 35,101,136,213, 84,250,236,185,147, 7,118,165,222, 77,232,222,111,240, 72,165,201,236, 5,
- 65, 1, 27,197, 5,185, 56,118,120, 95, 81, 74, 74,210,121,189,190,248, 89, 71, 52,205,198,146,103,206,255,122,240,187,204,148,
-196,110,125,194,135, 42, 43, 76, 62, 16,240, 88, 40,208,100,225, 88,204,129,194,148,148,228,223, 43, 44,198, 23,254,174,114,158,
-237,139,133,236,220,216, 87,167, 14,239, 8,145,210,235, 42, 23, 88,219, 19, 16,169,220,220,120,149,247, 14,164, 15,218, 60,218,
-165,169, 1,248,126,149,181, 84,122,189, 30, 92,192,244, 34,192,117,117,117, 21, 1,192,157, 59,119, 32,126, 80,171,225, 80, 62,
-117,128, 68, 92, 77,151, 5,232, 11, 56,104,214, 90, 46,161, 0, 32, 51,183, 0, 38, 75,189,207,141, 39,157,232,106,134, 43,186,
- 49, 2, 60, 0, 17, 82,169,116,209,252,249,243, 87, 92,188,120,113, 69, 84, 84,212, 10,129, 64,176,168,242, 96,243,234, 57, 17,
-127,153,102, 23, 79, 56,135,183,162, 78, 71,182,166,232,169,189,149,182, 23,186, 74, 76,253,251,247, 95,223,196,124, 54,229,102,
-249, 51, 53, 15, 88, 44, 22,130, 7,213,118, 7, 80,119,149,224,251,213,214,231,166,167,167,147,202,247,142,228, 83, 53,126,252,
-120,186,172,172,140, 60,253,244,211, 4, 13, 79,225, 83,175,166, 64, 32, 8,239,211,167,143, 69,147, 87, 72,110, 39,103,145, 11,
-113, 55,201,241,147,231,200,119,251, 98,200,186,245,155, 73,251,246,237, 77, 0,124, 28,209,228,112, 56,253,195,195,195, 11, 52,
- 26, 13, 73, 76, 76, 36,167, 79,159, 38,123,247,238, 37,155, 55,111, 38, 27, 55,110, 36,205,155, 55,215, 0,112,115, 68, 83, 36,
- 18,141, 28, 50,100,136,165,184, 84, 79, 82,178, 10,200,245,196, 20,114,246,210,117,114,236,228, 89,242,237,174, 61, 36, 56, 56,
-184,194, 14, 77, 54,155,205, 94,247,221,119,223,149, 18, 66,200,200,145, 35, 51,241,232, 64,170, 45,103,205,154,165, 37,132,144,
-101,203,150, 21,160,246,134,240,127,246,181, 52,184, 89,179,102,183,121, 60, 94, 12,128,137, 13,108,247, 12,135,195, 57,228,238,
-238,126, 25,192,232,191,225, 62,138, 82,171,213, 23, 0, 52, 52,195, 65,213,247, 70,253, 75,238,247, 63, 67,179, 63,135,195, 57,
- 13,212, 63,137,112,181,242,250, 83, 54,155,125, 4,192, 0, 7,243,217, 70,165, 82, 61,173, 84, 42,223, 84, 42,149,111,170,213,
-234,167,249,124,126,155,166,236,187, 75,155,136,225,222,161, 35,246, 55,239, 48, 44,205,187, 99, 84,154,111,167,145,251, 93,218,
- 68, 12,111,170,166, 79,167,145, 7,188, 59, 70,165,123,119, 28,158,218,178,203,200,253,170,128,136, 33,127,231, 57,154,216, 12,
-158, 3, 91,194, 74, 78,207, 35,228,244, 60, 18,209, 18,116,119, 39, 4,135, 1,178, 65, 17, 17, 43,137,205,182,114,204,168, 81,
- 43,253, 0, 23, 2,176,107, 46,181,105,134, 2,242,135,219,142, 28,185,178, 21,160, 26, 8,136,251,246,238,189,130,216,108, 43,
- 39, 60,243,204, 74,111,192,189, 54,189,186, 52, 9,192,110, 6,120, 86,215, 85, 1,173,199,249, 34,228,253,225,190,132,156,158,
- 71, 22, 60,229, 79, 58,185, 97, 98, 3,154,117, 69,138,158,232,136,150,163, 72, 42, 11,215, 37,149,175,146,199,112, 17, 62,118,
-205,110, 30,240,143,104, 77, 37, 14, 13,224, 20,226, 65,151,100,201,191,176,144,220,102, 50,153, 72, 69, 69, 5,209,235,245, 68,
-167,211,213, 52, 80, 15, 13, 89,118,118, 54,201,204,204, 36,233,233,233, 36, 53, 53,149,224,255,109,111,236,206,167, 92, 46,223,
-242,212, 83, 79,217,184, 92,238,186,199,177,239,206,206,206, 75,186,118,237,106, 94,179,102, 13,217,191,127, 63,249,242,203, 47,
-201,244,233,211, 73,219,182,109,141, 78, 78, 78,207, 54, 70,211,221,221,125,110, 64, 64, 64,193,214,173, 91,201,183,223,126, 75,
- 86,175, 94, 77, 62,252,240, 67,155,151,151, 87,174, 76, 38, 27,212, 24, 77,181, 90, 29,221,171, 87, 47,115,116,116, 52,249,233,
-167,159,200,206,157, 59,201,172, 89,179, 72, 96, 96,160, 81, 34,145,140,181, 83,147,205,225,112, 86, 78,157, 58, 53,215,211,211,
- 51,166,198, 58,113,112,112,240,229, 9, 19, 38,100, 3,152,243, 47,186, 62, 25, 77, 70,147,209,252, 19,140,214,115,158,104, 70,
- 0,182,152,199,123,166,111,239,222, 43,120,192, 51,142,154, 34, 33,155, 61,174,103,215,174, 43,120,192,179, 85,223, 21,178,217,
-227,250,246,238,189,130,203,102, 63, 95,151, 94,125,154, 4, 96,243, 56,156, 57, 61,187,119, 95,201, 1, 62,168, 74,235,223,146,
-186, 53,107,112,115,210,219,135,186,247,188, 26,226,127,177,209,122,236,112,254,132,139,240, 73,209,252,167,220,212,126,149,134,
-233,128, 3, 17,173, 3,120, 48,139,186, 95, 35,243, 41,122,204,251,222, 78,165, 82, 29,245,243,243,203,107,209,162, 69,182, 82,
-169,220, 5,192,171,137,154, 33,238,238,238,223,184,185,185,221,245,240,240,136, 87,169, 84,159,227,193,168,243,141,214,228,114,
-185, 93,221,220,220,126,243,245,245, 45,246,241,241,209,168, 84,170,239,106,137,100,217,163,233,129,218, 11, 21, 94,229, 58,230,
-161,195,104, 50,154,140,230, 35, 6, 38,178, 21,150, 14,108, 9,235,192,150,176, 69,250,226,243,234, 6, 37, 10, 16, 53,214, 20,
-189, 0, 8,106,126,191, 33,189,134, 52, 9,192,238, 1, 72,107,110, 51,212, 11,193,118,106, 62,233, 17,173,170,114,222,177,225,
- 29,234,192,250, 39,100,242, 73,209,252,167,112, 15,245, 52, 70,174,198,146,199,248,155,134,199,188, 15,215,243,243,243,135,228,
-231, 63,214,190, 9, 55,114,115,115, 39, 62, 78, 65,139,197,114, 81,163,209,244,123, 12, 82,117,117,189, 54,195,206,110,217, 12,
- 12, 12,255, 29, 40,192,134, 36,188, 23,209, 6,107, 57, 54,176,142, 37, 35,171, 70,151, 60, 3,213, 24,205, 7,216,182,213, 82,
-198, 83,141,205,231,255,209,253, 65, 35, 19, 55,169,255,206,105,203,193,131, 54, 90, 77, 54, 90, 12, 12, 12, 12, 12, 12, 12,127,
- 1, 63,223,101,254,136, 61, 1,196,224,209,232, 91, 76, 53, 35, 90,103,232,211,145,158, 20,141, 9,159,254,204,104, 50,154,140,
- 38,163,201,104, 50,154,140,230,127, 78,179,138,186,230, 78,189, 93,227,115,163,122,241,253, 87, 96,234,217, 25, 77, 70,147,209,
-100, 52, 25, 77, 70,147,209,252,183,211,232,113,180, 24, 24, 24, 24, 24, 24, 24, 24, 24,234,167,206,168, 27, 99,180, 24, 24, 24,
- 24, 24, 24, 24, 24,154,134, 7, 30, 76, 81, 21,131,255, 79, 85, 21, 13, 52, 60, 5,207, 35, 44, 93,186,148,229,231,231, 39,229,
-243,249,109,147,146,146, 88,175,191,254,122,147, 59, 18,172,248,124, 29,203,199,199, 71, 10,160,109, 65, 81, 25,235,165, 87,222,
-161,152,243,197,192,192,192,192,192,192,240, 4, 49,172,210, 88, 85,189, 62,140,112, 57,100,180, 22, 46, 92,136,244,244,116, 9,
-128,241, 33, 33, 33,252, 13, 27, 54,144,221,187,119, 55,201, 24,125, 48,103, 22,210,210,210, 36, 0,198,171, 85, 78,252,175,182,
- 44, 39,123, 14,157,121,236,102, 75,165, 82,185,252,149,219, 49, 48, 48, 48, 48, 48, 48,252,167,152, 92,237,117,114,163,140, 22,
-135,195, 97,243,249,252, 86, 44, 22,107,136, 80, 40,236, 2, 0,149, 83,178, 52, 26, 14,135,195,230, 11, 4,173,216,108,246, 16,
-129,224,129,230, 83,195,123, 53, 85,115,128, 68, 34,201, 16,139,197,177, 0, 68, 50,153,236,138,217,108,190, 41,147,201,206, 57,
-162, 35,147,201,206, 85,110,119, 5,128, 72, 44, 22,199, 74, 36,146, 12, 14,135, 51,128,185,158, 24, 24, 24, 24, 24, 24, 24, 42,
-137,174,101,249, 35,135, 15, 31,174,211,224,240,249,124, 86, 72, 72, 72, 47, 31, 31,159,179, 65, 65, 65, 38, 47, 47,175,189, 98,
-177, 88,210,196,140,177,252,252, 3,123,121,122,184,157,237,216,202,195,164, 86,171,247,114,185,220,166,104,178,101, 50,217,234,
-200,200,200,146,179,103,207, 18,185, 92,174, 1,224,228,234,234,154, 77, 8, 33,238,238,238,180, 35, 98,238,238,238, 52, 33,132,
-184,186,186,102, 3,112,146,203,229,154,179,103,207,146,200,200,200, 18,153, 76,182, 26, 13,143,104,203,192,192,192,192,192,192,
-224, 0,245,121,145,127, 48, 85, 81, 44,143, 70,239, 28,159,207, 15, 85,169, 84, 9,111,189,245,150, 45, 58, 58,154,248,248,248,
- 92, 82,171,213,221, 85, 42,213, 35, 13,234, 95,124,241, 69, 71,170,253, 66,101,114, 69,194,182,153,131,109,134,175, 70,146,102,
- 30,234, 75, 78, 78, 78,221,229,114,249, 35,154, 19, 94,154, 98,143,166, 44,251,138,210, 0, 0, 32, 0, 73, 68, 65, 84,167, 66,
-161,136, 95,186,116,105, 69,113,113, 49, 33,132, 16,133, 66,161, 1,160,116,115,115,203, 78, 78, 78, 38, 42,149,138,192,254, 40,
- 30, 75,165, 82,145,228,228,100,226,230,230,150, 13, 64,169, 80, 40, 52,132, 16, 82, 92, 92, 76,150, 46, 93, 90,161, 80, 40,226,
- 1,120, 50,183, 5, 3, 3, 3, 3, 3,195,127,218,104,213, 52, 92,246, 85, 29,118,233,210, 69,224,230,230,214, 93, 38,147,141,
-146, 74,165,235, 71,140, 24, 17, 50,102,204, 24,150,209,104,180,133,132,132,120,250,250,250,206, 80, 42,149, 19,133, 66, 97,123,
- 62,159,255,188, 92, 46,247,216,181,107,151, 95,125,154,237, 58,116, 22, 56, 57, 41,187,243,249,130, 81, 82,169,108,253,212,113,
-253, 67, 38,190, 61,150,197, 51,165,218,250,183,247,246,108,219,202, 99,134,187, 82, 50,145,195,102,181,167, 40,234,121,161, 80,
-232,241,237, 87,155,253, 26,216,177, 86,158,158,158, 87,118,237,218,213,118,252,248,241,130,196,196, 68, 0,128,205,102,227, 3,
-176,176,217,108, 8, 4, 2,152,205,230, 34, 0,246,158, 64, 98, 54,155,139, 4, 2, 1,216,108, 54, 0, 88, 42,245,144,152,152,
-136,241,227,199, 11,118,237,218,213,214,211,211,243, 10,128, 86,204,173,193,192,192,192,192,192,240,159,165,202, 92,197,160, 70,
-213, 33,167,202, 61, 70, 69, 69, 61, 18, 53,226,243,249, 27,238,220,185,211,211,217,217,185, 21,151,203,181, 61,243,204, 51,130,
- 9, 19, 38, 32, 47, 47,143,214,233,116,236,208,208, 80,183,203,151, 47, 15,177, 90,173,189,157,156,156,244,197,197,197, 42,163,
-209,120, 15,192,140,122, 50,178,225,238,237,132,158, 46, 74,231, 86,124, 46,219, 54,253,229, 9,130, 15,230, 12, 6,101,140,163,
-109,218, 2,246,167,157,156,220, 62, 63, 87, 62,228,142,217,214,187, 92, 33,212,231,150, 24, 27,212, 84,169, 84,157,120, 60, 94,
-236,209,163, 71, 33, 22,139, 81, 82, 82, 2, 62,159, 15, 0,208,233,116, 10, 0, 28,138,162,192,231,243, 81, 90, 90,170,116,228,
-168,149,150,150, 42,249,124, 62, 40,138, 2, 0, 78,165, 30,248,124, 62, 74, 74, 74,224,231,231, 71, 29, 61,122, 84, 61,100,200,
-144,251,102,179,185,115,126,126,126, 28,115,173, 49, 48, 48, 48, 48, 48, 56, 78,109, 94,228, 9,162,193,113,180,250, 85,134,234,
-170, 79,156,187,221,213,213,213, 93, 42,149, 6, 77,158, 60,153,165, 82,169, 16, 27, 27, 75,151,151,151,179,184, 92, 46,184, 92,
- 46,187,127,255,254, 82,171,213, 42, 62,114,228, 8,117,255,254,253, 60,139,197,242,105, 65, 65,193,229,122, 50,178,189,181,147,
-192, 93,228,196, 15, 58,244, 78, 31,150,171, 95, 1,112,124, 1, 77,116, 90, 22,135, 38, 80, 73,104,246,202,222,148, 52, 87,225,
- 43,158,254, 93, 30,245,251,253,226, 60,139,197,242,105, 89, 89, 89,125,154, 89, 0, 80,153, 39,200,229,114,216,108,213,231,183,
- 4, 97,177, 88, 16, 8, 4,141, 58,114, 2,129, 0, 44, 22, 11,168, 22, 9, 83, 40, 20, 96,179,217, 96,177, 88,224,114,185,143,
-228,131,129,129,129,129,129,129,161, 81,212,230, 69,158, 20,170,143,163,101,223,220,148,110,110,110,148, 92, 46,247,232,208,161,
-195,199,145,145,145,201,163, 71,143,214,175, 89,179,134,172, 90,181,138,172, 92,185,146,108,221,186,213,246,235,175,191, 90, 94,
-121,229,149,138, 54,109,218,220, 91,191,126,125, 16, 0, 12, 29, 58,180,206,234, 72, 39,165, 51, 37,229,115, 60,130,131,218,125,
-252, 92,191,182,201,243, 70,249,235,205,219, 66, 9, 61,191, 57,177,173,243, 37,182, 61, 3,108,228,206,114,203,226, 87, 7, 84,
-180,240,105,113,111,227,214,239,131, 0, 32, 34,114,104,189, 85,156, 42,149,170,139,151,151,151,230,196,137, 19,116, 81, 81, 17,
- 41, 40, 40,168,106,163, 85, 12, 64,225,227,227,147,109,181, 90,137, 82,169, 44,116,228,168, 41,149,202, 66,171,213, 74,124,124,
-124,178, 31,248, 43, 69, 49, 33,132, 20, 20, 20,144,162,162, 34,114,226,196, 9,218,203,203, 75,163, 82,169,186, 48,247, 7, 3,
- 3, 3, 3, 3,195,127,150,201, 53, 94, 27,166,103,207,158,148, 92, 46,103,181,107,215, 78,234,233,233,217,205,211,211,243,226,
-231,159,127, 78, 86,173, 90,101,221,180,105, 19,249,230,155,111,172, 47,188,240, 66,169, 68, 34,137,225,243,249, 74, 0,240,245,
-245,173, 55,228,215,165, 91,119, 74, 36, 20,176, 2, 2,130,165, 42, 23,151,110,174, 46,206, 23,205,171,218, 18,178,160,153,149,
-108,233, 72,200,158,193,214,229, 79,135,149,114,185,188, 24, 0, 74, 0,240,242,244,176, 55,140,232,169, 86,171,227, 23, 44, 88,
- 80,110, 54,155, 73,101, 47, 67, 13, 0, 39, 31, 31,159,108, 66, 8,241,242,242,202, 0,160,178, 83, 79,229,229,229,149, 65, 8,
-169, 50, 90, 78,238,238,238, 26, 66, 8, 49,155,205,100,193,130, 5,229,106,181,154,105, 12,207,192,192,192,192,192,192, 80,231,
- 92,135,117, 70,138,206,158, 61, 75, 74, 75, 75,233,172,172, 44,155, 78,167,147,135,134,134, 42,217,108, 54,220,220,220,216,108,
- 54,155, 46, 47, 47,103,171, 84,170,108, 46,151,251,173,201,100, 42, 26, 53,106, 20,149,146,146, 82,111, 67,243,203, 23,206, 19,
- 67,133,145,206,204,204,176,233,117,165,242,137,237,157,149, 28,171, 25,116,104, 79,118,169,168, 13, 77, 27,138,216,129, 30,130,
-108, 30,143,251, 45,128,162,209, 81,195,168,204,236, 28,123, 27,175,103,107,181,218,208, 13, 27, 54,108,233,211,167, 79,145, 94,
-175,175,106, 91, 85,115, 8, 6, 39, 59,245,106,126,143, 77, 81, 20,244,122, 61,250,244,233, 83,180, 97,195,134, 45, 90,173, 54,
- 20, 64, 54,115,125, 49, 48, 48, 48, 48, 48,252,167,169,115, 28,173, 6,135, 58,208,235,245, 74, 30,143, 23, 17, 22, 22,214,162,
-188,188,156, 94,184,112, 97,198,154, 53,107,118,220,187,119,207,226,228,228,212, 74, 36, 18,189, 57,126,252,120,213,254,253,251,
- 73,239,222,189,107, 70,159,106,157,221,219, 96,208, 41, 5, 60,110,196,155, 93,101, 45, 50,204, 74, 58,232,205, 75, 25,125,231,
-159,219,241,227, 13,142,165,157,179,161,149, 51,159,122,115,252,248,167, 85, 63, 30,142, 33,221,187,119,179, 75,179, 18,155, 86,
-171,125, 51, 54, 54,246,233,150, 45, 91,102, 90, 44,150, 76, 0, 5, 6,131, 65,227,233,233,169, 53,155,205,153, 0,204,181,108,
- 87,155,166,217,108, 54,103,122,122,122,106, 13, 6,131, 6, 64,129,197, 98,201,108,217,178,101,102,108,108,236,211, 90,173,246,
- 77, 0,182,122,242,194,204,234,206,104, 50,154,140, 38,163,201,104, 50,154,255, 29,254, 16,205, 2,236,152, 84, 90, 32, 16,244,
-241,246,246,238,117,227,198, 13,219,249,243,231, 75, 88, 44,214,198,161, 67,135,238,221,183,111, 95, 87,103,103,103,117,243,230,
-205,221,126,249,229,151,112, 0,187,127,255,253,119,187,162, 79, 34, 1,175, 79, 71, 47, 69,175,232,107,196,246, 85,236,221, 18,
- 27, 91,176,177,255,216,177,123,223,216,177,179,171,167, 74,166,238,232, 33,119, 59,114,228, 88, 56,128,221,231,207, 95,112,120,
- 60, 13,171,213,250,139, 86,171,109, 94,245, 57, 47, 47, 47, 84,165, 82, 5,225, 65,244,169,196, 78,153, 52,154,166,135,210, 52,
-237,153,159,159,127, 11, 0,242,243,243, 59, 51,215, 17, 3, 3, 3, 3, 3, 3, 67, 45, 38, 43,186,182,207,245, 70,180,248,124,
-126, 51, 54,155, 29,156,153,153,153,118,228,200,145, 27, 93,186,116, 25,146,150,150,182,148, 16,146, 42, 22,139, 39,103,100,100,
-220,205,200,200, 48, 25, 12,134,169, 14,100,166, 25, 88,188,224,216,108, 67,218,103,191,220,188,209,174,251,160, 33,185,185,217,
- 75,109,132,164,242,197,242,201,119,210,243,238, 94,208, 26, 77, 21, 21, 14,105, 54, 72,126,126,254,173,252,252,252, 18, 7,183,
- 41,169, 50, 89, 12, 12, 12, 12, 12, 12, 12, 12,142,210, 80, 68,203,108,179,217,150, 27,141, 70,229,143, 63,254,152, 21, 25, 25,
-105, 4,128, 13, 27, 54,208, 47,191,252,242,153,164,164,164, 1,183,110,221, 26,226,238,238,126, 18, 0,149,156,156,108, 79,244,
-201, 76,211,182,229, 38,147, 81,249,203,175,113, 89,125,122,181, 51, 2,192,166, 47,214,210,207, 76,158,121, 38, 41,241,198,128,
- 59, 9, 87,134,184,187,187,159,180, 89, 57, 84, 78,110, 42, 97, 78, 19, 3, 3, 3, 3, 3, 3,195, 63,152,104, 60, 90,101, 24,
-109,151,209, 50,153, 76,121, 38,147, 9, 0,138, 34, 35, 35, 31, 89,183,117,235, 86, 2,160, 28,192,158,130,130, 2, 71, 50,147,
-103, 48, 24, 0,160,168, 79,175,118,143,172,248, 46,122,205, 67, 77, 93, 89, 41,115,218, 24, 24, 24, 24, 24, 24, 24,158, 36,179,
-245, 7, 88,204,113, 97, 96, 96, 96, 96, 96, 96, 96,104, 18,147,235,250, 76,161,238,158, 3, 63, 59,240, 3,141,233,125,240, 51,
-163,201,104, 50,154,140, 38,163,201,104, 50,154,255, 57,205,134,180,127,198,147, 71,157,141,225,255,108,152,174,175,140, 38,163,
-201,104, 50,154,140, 38,163,201,104,254,219,241,192,163,195, 59,120, 84,173,224, 48,199,134,129,225,201,134,236, 1, 27, 69, 1,
-190, 32,196, 19,108,126, 14,114,174, 39, 81, 31,131,110,178,166, 38,216, 7, 34,139, 27,172,194, 60,104,226,147,155,170,201,192,
-192,240,239,195,189,199,235,163, 41, 22,123, 35, 69,104, 24, 52,137, 2,158, 33, 85,172,205, 73,251, 47,122,139, 28,212, 17,193,
- 98,140, 22, 3,195,147, 78, 94,160, 63, 56, 88, 2, 22, 60, 64,204,247,225, 26,188, 4,184,153,208,100, 77, 30,189, 16, 54,150,
- 23,136,249, 14,212, 1, 75,129,219, 55,153,131,253,239, 99,198,244,215,200,173,132,139, 72, 79,207, 70,171,214, 30,240, 15,236,
-129, 53,107,215, 83,204,145, 97,176,239, 95, 25, 21, 29, 49,124,130,179, 72, 44, 3, 0,208, 86, 11,182,190,221,241, 39,171,213,
-186, 29,192,126, 0,134,255,250, 33,250,203, 27,195,115,185, 92, 13, 0, 90, 40, 20,238, 67,181,208, 26, 3,195,159,128, 71,229,
-117, 70, 87, 94,119,142, 32,229,112, 56,243,197, 98,241,175, 2,129, 64, 43, 16, 8,180, 18,137,228, 87, 14,135, 51, 31,128,244,
- 31, 83,198,125,211, 86, 12,150,109,136,201, 66, 55, 59,118,189, 88,173, 55,218,252,193,178, 14, 37, 91,219, 72,155,164,201,161,
- 34, 43,204,180,247,183,151,244,110,229, 38,107, 16, 8,154,164, 89, 13, 39, 30,143,119, 12,246,207, 57,202,240, 39,147,150,156,
-128, 35,135, 87, 98,225, 39,147,240,117,244, 84,220,190,117,161, 73,122, 65, 64,231,206, 28,206,236, 64,160, 63, 30,180, 3,102,
-248, 55, 67,145,201, 63, 31,250, 54,239,208,174, 47,242,190, 95, 57,149, 28, 88, 18,133,181,107,215, 70, 76,154, 52,233, 91,111,
-111,239, 60, 0, 79, 49, 70,235, 47,198, 98,177,168,243,243,243,169,237,219,183,143, 80, 40, 20,247, 57, 28,206,251, 0,120,255,
-149, 3, 46,149, 74,207,201,229,114,141, 66,161,208,200,229,242, 43, 13,165,255, 75,241,119,117,117, 77,115,118,118,190, 83, 61,
-209,181,253,232, 30,126, 61, 39,126,228, 18, 60,178,111, 19,245,121, 28, 14,231,125,133, 66,113,127,251,246,237, 35,178,178,178,
- 40,139,197,162,118, 96,251, 62, 74,165,242,214,197,139, 23,231,229,231,231,247,205,184,176,213, 53,247,226,102,215,180,223, 86,
-246,139, 61,178,110,158,147,147,226, 38,128, 62,255,136, 35, 89, 65,187,129,197, 14,191,145,163, 23,231,148, 90,220,226, 82,245,
- 50,128,221, 15,166, 38,252,137, 41,161,221, 0,210,255, 90,166, 65,114,174,208,213,237,247, 36,163, 28, 44, 86, 56, 42, 40,247,
- 38, 23, 56, 44,214,107, 52, 77, 15,228,241,120,111, 50, 79,168,127, 6, 2, 1, 15, 32, 4, 82,137, 16, 0, 1,171,137,214,136,
-207, 98,245, 60, 55, 98,196,194, 57,237,219,207, 8, 4,134,215, 97,182, 40, 0,111, 4, 6, 6, 30, 5,240,204, 99,220,157,207,
- 2, 2, 2,178, 0,204,124, 92,229, 82,167, 78,157,122,132,135,135,127,212,177, 99,199,190,143, 75,243,223, 68,238,185, 13, 63,
-230,156, 89,167,206, 62,187, 94, 93,156,124,250, 13, 15, 55, 37,157,156,156,140, 97,195,134,225,139, 47,190, 16,135,132,132,236,
- 0,224,249, 31,184,149, 66,171,254,224,163, 70, 27, 45,187,141,214, 56, 95,244,124,182, 37, 78, 61,237,139,178,241, 45,161,123,
-190, 37,206,140,245, 69,255,198,228,198,197,197, 5,125,250,244, 97,103,101,101,137,102,205,154,245,145, 80, 40, 76, 1, 48,168,
- 49, 90, 34,145, 40, 86, 44, 22,103,112, 56,156, 71,242, 34, 22,139, 99, 37, 18, 73, 6,135,195, 25, 80, 61, 93, 38,147,157,147,
-203,229, 26,153, 76,118,165, 14, 35, 20, 43,151,203, 53, 82,169, 52,182,122, 58,135,195, 25, 32,149, 74, 51,101, 50, 89,205,244,
-254, 50,153, 44,163,102,122, 93,112,185, 92,175,140,140, 12,117,102,102,166,154,207,231,187, 85, 79, 79, 79, 79, 87,103,100,100,
- 60,146,238, 8, 28, 14,167,191, 68, 34,201, 16,139,197,177,181,165,215,220,167,186,168,118,236,250,219,147,238,104,193, 19, 25,
- 25,121, 38, 39, 39,199,219,201,201,233,145,137,187,157, 21, 78,131,190,217,186,254,237,145, 67, 35, 95,115, 13, 26,213,174,145,
-250,131,132, 66, 97,202,172, 89,179, 62,202,202,202, 18,117,239,222,157,205, 98, 57,244,127, 34, 98,228,200,145, 7, 52, 26, 77,
-179, 14, 29, 58,176,173, 86, 43,110, 28,156, 15,113,252,155, 16,166,108, 66,115, 81, 30,231,254, 79, 75,189, 34,251,117, 62,128,
-191,185, 49, 40,217, 19,196, 3, 69,247,161, 9,113,189,149, 85,225, 58,108,196, 83,156,171, 25, 6, 87,139,205,230, 12,176,251,
-145,175,125, 4,141,210,228, 88,122,211,132,184,253,146,202,117, 13,127,122, 6,251,100, 42,199,213, 98,179,185,128,133,190,141,
-209,172,126,249,179,217,236,183, 87,174, 92,201, 2, 48, 29, 0,255,191,100,104,194, 60,209,172,127,107,246,165, 80, 15,244,124,
-140,178, 33,149,247,187,127, 83,133,182,124,125, 20, 47, 79,137, 70,155,192,110, 77,210, 49,209,244,237,239,146,147,143, 63,223,
-186,117,212,156,246,237, 95,172,197,108, 81, 0,230, 44, 93,186,116,226,141, 27, 55, 92, 91,182,108, 57,229, 49,253,233, 95,189,
-116,233,210,119,111,220,184,225,233,235,235,187,192, 65,205, 58,203, 37,165, 82, 57,104,203,150, 45,111, 15, 27, 54,236,181, 78,
-157, 58,181,123, 28,154,255, 98,190,184,118,237,154,247,202,149, 43,223,123,249,229,151, 75, 1, 96,192,128, 1, 60, 0,221,155,
- 92,222, 17,194, 39,132,132, 19, 66,134, 17, 66, 6, 16, 66,194, 42,223,119,169, 92,134, 17, 66, 34,106,188,118,169,220,182,106,
-125,215, 58, 52,134,213,220,174,218, 54, 53, 63, 63,242,190, 22,163, 53, 12, 15,218,106, 13,123,100, 7, 14, 31, 62, 76,170,191,
-214,100,188, 47, 62,158,209,163,153,254,214,161,157, 68,151,145, 76,138, 18,175,146,171,209,139,201,140, 46,174,250,231, 90,226,
- 51,199,143, 23, 33,103,207,158, 37, 55,110,220, 32, 58,157,142,220,189,123,151,116,237,218,213, 32, 22,139,127, 1,224,235,136,
-152, 76, 38,211,252,242,203, 47, 36, 50, 50,178, 68, 42,149,174,168,186,185,228,114,185,230,236,217,179, 36, 50, 50,178, 68, 38,
-147,173, 6,192, 6,128,177, 99,199,106, 9, 33,196,213,213, 53,187, 54,189,145, 35, 71, 22, 17, 66,136, 66,161,168,170,106, 98,
-203,100,178,213,211,166, 77,211, 93,190,124,153, 40,149,202,170,116,150, 92, 46, 95, 49,125,250,116, 93, 92, 92, 92,245,244,122,
-113,118,118,206,176,217,108,228,208,161, 67, 68,173, 86,103, 87,187,153, 51,108, 54, 27, 57,112,224, 64,157,121,171, 47, 80, 32,
-149, 74,151, 63,255,252,243,101,169,169,169,196,197,197, 69, 83, 45,125,197,164, 73,147,202,210,211,211,137, 74,165,178, 43,143,
- 46, 46, 46,154,115,231,206,145, 49, 99,198,148, 86, 63,166, 46, 46, 46,154,243,231,207, 87,165, 47,183,167, 32,243,244,244,156,
-162, 86,171,179,213,106,117,182,147,147,211, 34, 15, 15,143,220,188,188, 60, 66, 8, 33,173, 90,181,210, 86,143,100,169, 67, 70,
-188,181,105,207,249,139,167, 19, 10,242,218, 15,124,109,185,162,253, 72,133, 3,199,192, 87, 44, 22,255,210,183,111, 95, 67, 70,
- 70, 6, 41, 47, 47, 39,241,241,241,228,236,217,179,228,222,189,123, 4,128, 61, 51, 12,200,164, 82,105,150,209,104,164,141, 70,
- 35,157,151,151,103,211,106,181,182,196, 21, 30,132,124,197,125,184, 20, 31, 24, 78,114, 79, 47,161,229, 82,113, 38, 0,217,223,
-102,180,214, 7,123,145,205, 1,223,221,156,239,157,120,122,233, 96, 11, 73, 61, 73,118,190,232,106, 57,245, 86,179,251,100, 99,
-224, 15,100,115, 80,243, 70,105,110, 12,218, 25,255,161,247,237,117, 11,222,176,164,165,165,145,217,147, 6, 91, 79,204,104,150,
- 68, 54, 5,238,105,140,102, 53,158, 29, 61,122,180, 46, 61, 61,157, 4, 7, 7,151,179,217,236,151,255, 75, 38, 43,194,159,159,
- 21,255,237,108,122,120,136,184,224, 49,153,173, 16,181, 90,157,191,109,219, 54, 34,147,201,180,141, 53, 91,227, 70,245, 35,134,
-146, 95,200,168,168,176,122,239,145,167,159,126,154,132,135,135,147, 25, 51,102, 52,116, 47, 81,129,192,136,237,237,219, 31,160,
-199,141,179,109,111,223,254, 64, 32, 48,162,210, 96, 81, 0,222, 91,182,108, 89,156,197, 98,137,251,250,235,175,227, 70,140, 24,
- 17, 7, 96,118, 19,143,197,154,207, 62,251,140, 88, 44, 22,242,245,215, 95,147, 17, 35, 70, 16, 0,107,155, 82, 46, 85, 69,178,
- 66, 67, 67,223,218,191,127,255,197,219,183,111,231, 69, 69, 69, 45,111,223,190,189,162,177,154,255, 68,164, 82,169, 95,187,118,
-237,118, 4, 7, 7,167,119,232,208,193, 20, 20, 20, 84,225,239,239,159, 26, 18, 18,178, 77, 32, 16,248, 54, 82,182, 91,207,158,
- 61,109,167, 78,157, 34,163, 71,143, 38,213, 76, 72,189,212,231, 69, 8, 33, 97,239,189,247,222,251, 0,200,123,239,189,247, 62,
- 33,100, 88,165,159, 24, 86,253,125,205,215, 42,243, 84,245,185, 54,141,170,165, 54,205,218,126,163,198,239,160,142, 72,214,228,
- 63,236,220,225,195,135,251, 30, 62,124,248, 84,205,157,123,170, 37,122,204,232,209,204, 96,200,203, 33, 9,139,223, 36,191,134,
-123,145,179,253,220,201,157,183, 71,147,156,111, 87,147,215, 59, 42,245,227, 90, 34,220, 81,163, 21, 23, 23, 71,226,226,226,200,
-149, 43, 87, 72, 74, 74, 10, 41, 41, 41, 33,223,127,255,189,205,197,197,197, 32, 16, 8,150, 2, 16,217, 35, 38,151,203, 53,132,
- 16, 98, 52, 26,201,162, 69,139, 42, 42, 35, 85,110, 10,133, 66, 67, 8, 33,197,197,197,100,233,210,165, 21, 10,133, 34, 30,128,
-167, 74,165,202, 72, 78, 78, 38,110,110,110,181,154, 25,165, 82,169,185,125,251,118,149,113,106,166, 84, 42, 19, 14, 30, 60,104,
- 38,132,144,204,204, 76,226,236,236,172, 1,224,230,226,226,114,245,240,225,195,102, 66, 8,201,206,206,174, 74,183,203,104, 25,
- 12, 6,114,226,196,137, 71,242, 80,149,126,244,232,209, 71, 12,152, 29,184, 41, 20,138,184,239,191,255,222,100,179,217, 72, 66,
- 66, 66,149, 73,116,115,114,114,186,178,103,207, 30,147,205,102, 35,137,137,137,118,155,193, 22, 45, 90,104, 9, 33,196,106,181,
-146, 77,155, 54, 25,171,142,105, 85,186,201,100, 34, 27, 54,108, 48,202,229,242, 56, 0,245, 70,223, 84, 42, 85,182,201,100, 34,
-197,197,197,164,107,215,174,186,179,103,207,146,210,210, 82, 66, 8, 33, 45, 90,180,208, 2, 64, 64,223,151, 63,189,120, 87, 87,
-250,210,187,235,119,251,134, 61,183,248,248,165,172,204, 45,251, 99,227, 84, 33, 35, 7,219, 19,212, 20, 8, 4, 75, 61, 60, 60,
- 42,126,255,253,119,155,217,108, 38,233,233,233,228,202,149, 43, 15,175,177,235,215,175,219,101,180, 56, 28,206,252,139, 23, 47,
-154,109, 54, 27,157,159,159,111,211,106,181, 54,173, 86,107,173,105,180,200, 87, 92,146,127,244, 85, 18, 19, 61,211,196,227,241,
-230,255, 61,209, 44,176,201,230,128,145,100,115, 64,220,182,231, 85,249,101, 87,118, 17,242,211, 76,146,244,105, 75, 50,127,176,
-172,140,222, 28, 16, 71, 54, 7,142, 35, 31,247,229, 56,164, 25, 29, 52,156,108, 14,136,251,236, 41,159,130,171,113,151,201,169,
- 83,167,200,134,213,203,200,140,136,102,229,244,230,128, 56,178, 49,104,140, 35,154,213, 17, 8, 4,119,207,156, 57, 67, 78,159,
- 62, 77, 22, 44, 88, 64,196, 98,113,250,227,136,234,145,141,254, 62,228, 75,255,190,100,107, 27, 15,242, 91,223,127, 92, 7,159,
- 48, 79, 52, 27,232,207,207,204,191,186,159,144,194,123, 36,119, 69, 48, 25, 28,192,109,170,217, 10, 81,171,213,121,169,169,169,
- 36, 55, 55,151,172, 90,181,138,200,229,242, 70,153,173,113,163,250, 17, 67,241,207,245, 26,173,145, 35, 71,146,207, 63,255,156,
- 88, 44, 22,210,173, 91, 55,123,254,180,252,193,108, 5, 0, 35, 1,188,191,124,249,242,135, 38,107,253,250,245,113,215,175, 95,
-143,243,246,246, 62,210,132, 99,177,118,249,242,229, 15, 77,214,250,245,235,201,245,235,215,137,143,143, 79, 70, 83,202,165,129,
- 3, 7,126,154,146,146, 82, 58,119,238,220,221,125,250,244, 89,124,245,234,213,204,152,152,152,184,208,208,208,193,141,213,124,
- 12, 81, 29, 78,101,100,135, 79, 8,225, 18, 66,170,204, 43, 7, 0,183, 42,160, 96, 15,207, 63,255,188,184, 71,143, 30,113, 19,
- 38, 76,208,111,219,182,141,164,166,166,146,248,248,120,178,124,249,114,242,209, 71, 31,145,175,190,250,138,140, 25, 51,166,188,
-107,215,174, 23,199,141, 27, 39,116, 32,155,193,190,190,190, 37, 7, 14, 28, 32, 59,119,238, 36, 60, 30, 47,198,222, 13,235,243,
- 34,117,153,169,186, 12, 86,205,117,245, 24,177,122, 13,155, 29,191,247, 71, 83, 85, 51, 18, 82,237,253,111, 81, 81, 81,125,255,
-240,240, 33,248,100,242,172, 79,133, 41,219, 86, 65,243,253, 23, 96, 23,107,192, 45, 43,128,241, 76, 12, 44,103, 14, 98, 98,247,
-238, 34, 17, 69, 45,116,244,130,225,243,249,224,243,249,224,241,120,208,235,245,200,206,206, 70,175, 94,189, 88, 87,174, 92, 17,
- 78,153, 50,101,166, 72, 36, 74, 7, 48,170,193,187,153,122, 16,145, 62,119,238, 28, 94,125,245, 85,193,142, 29, 59, 58,184,186,
-186, 94,179,217,108,124, 0, 72, 76, 76,196,248,241,227, 5,187,118,237,106,235,233,233,121,197,108, 54,139, 5, 2, 1,216,108,
-118,157,122,124, 62, 31, 22,139, 69,208,166, 77,155,248,107,215,174,133, 68, 69, 69,113,211,210,210,144,156,156, 12,139,197,194,
-247,247,247,191,126,229,202,149, 14,195,134, 13,227,102,100,100, 32, 45, 45,237, 97, 62,236,201,175,201,100,130, 64, 32, 64,245,
- 42, 45,138,162, 96, 52, 26,193,231,243,237,214,226,112, 56,253, 3, 3, 3,175, 95,187,118, 45,116,228,200,145,188,203,151, 47,
- 35, 51, 51, 19, 54,155,141, 31, 20, 20,116,253,218,181,107, 29, 71,140, 24,193,139,143,143,135, 70,163,129,189, 85,104, 85,223,
-187,118,237, 26, 38, 76,152,192, 63,118,236, 88, 71, 15, 15,143,120,171,213,202, 7,128,235,215,175, 99,252,248,241,252,227,199,
-143,135, 54,111,222, 60,190,129,170, 68, 54, 0, 88, 44, 22, 76,153, 50, 69, 34,151,203,145,145,145, 1,154,166, 97,179,217, 0,
- 0, 5, 69, 5,215,175, 93, 79, 72,156,248,236, 83,125, 13,102,163,241,252,165,216, 91,173, 90,248,120, 81, 20,105,209, 64, 86,
- 71, 73, 36,146,244, 21, 43, 86,188,149,154,154, 42, 8, 12, 12,100, 37, 37, 37,161,172,172, 12, 60, 30,239,225, 53,102,239,126,
-243,249,252,126,193,193,193,156,138,138, 10,208, 52, 13, 0,132,197,170,189,197,138,176,248, 12,130,220,172, 92,145, 72,212,239,
-111,121,122,151, 6,187,128,198,192,180, 60,147, 64,224,228, 37,147,122,248, 3,233,167,209,210, 85, 0, 54,139, 45,188,156,172,
-151, 0,100, 32,188,243, 93, 28,211,164, 7, 38,107, 77, 2,139,115, 91,169,167,151, 55, 10, 10, 10,208,188, 85, 32, 42,248,174,
-252,115,247,202,165,160, 28,212,252, 63,189,219,180,105,227,238,231,231,135,252,252,124,132,134,134, 66,169, 84, 42, 1, 12,108,
-244, 67,231,107, 31, 1, 74,209, 19, 96,173,128,141, 90, 0, 11,103, 9,238,229,133,146,205,161,220,127,146,201,146, 75,249, 23,
-118,125,247,125, 51, 23,239, 32, 32,230, 37,184, 57, 9,176,245,181, 80,103, 87,133,224, 64, 35,205, 86,136,155,155,219,201,139,
- 23, 47,170,132, 66, 33,174, 92,185,130,224,224, 96,172, 90,181,202, 85,169, 84,158,110, 92,100,139,128, 80,117,155,172, 62,125,
-250, 96,250,244,233,216,177, 99, 7,156,157,157, 49, 97,194,132,134,204, 22, 73, 4, 14,125, 22, 31,255,245,142,251,247, 15, 63,
-223,186,117,212, 4,127,255, 69, 83,159,121,230,229, 55,222,120, 3,203,150, 45,195,129, 3, 7,208,179,103, 79, 76,158, 60,217,
-146,158,158,190,189,177, 85, 85, 43, 86,172,152, 49,115,230,204,154,154,230,180,180,180,207,154, 84, 46, 21, 20, 92,143,143,143,
- 79,124,246,217,103,251, 86, 84, 84, 24, 47, 93,186,116,203,215,215,215, 11, 64,139,198,106, 54,193, 96, 81,132, 16, 33, 0,113,
-229, 34, 1, 32,222,181,107,151, 98,228,200,145,242,202, 52, 81,229,210, 96,245,126,112,112,176,215,221,187,119,179,222,126,251,
-237,208, 29, 59,118,136,196, 98, 49,138,139,139,241,229,151, 95,226,253,247,223, 7, 69, 81, 32,132,224,171,175,190, 18,191,248,
-226,139, 97,247,239,223,207,242,241,241,177,167, 73,139, 64, 42,149,238, 89,180,104,145,156,166,105,204,153, 51, 39,223,108, 54,
- 79,175, 92, 55,215,201,201,233, 2, 30, 24,238,250,168,213,139, 84,123, 86, 30,174,113,108,162,106,166,213, 92, 71, 8,137,170,
- 79,195,193,115, 81,219,239,197,212,103,182,170, 63,129,250,213,234, 34,129,246,238,190, 1, 40,249,105, 15, 68, 28, 10, 34,118,
-229,194,161,192, 74,186,142,230, 66, 46, 44,132,132, 52,214,104, 85, 45, 92, 46, 23,122,189, 30, 54,155, 13,239,191,255,190,224,
-196,137, 19, 46, 44, 22,235,135,134,116,170, 27,166, 59,119,238, 32, 40, 40,136, 58,116,232,144,219,244,233,211, 69, 85,191, 83,
- 82, 82, 2, 63, 63, 63,234,232,209,163,234, 15, 63,252, 80, 90,159,153,161, 40, 10, 60, 30, 15, 51,103,206, 20, 93,186,116,201,
-217,211,211, 19, 73, 73, 73, 40, 44, 44,132, 84, 42,197,204,153, 51, 69, 23, 47, 94,116,245,244,244, 68,106,106, 42, 74, 74, 74,
- 32,149, 74, 29, 54, 90, 60, 30,239,145,109, 40,138,130,217,108,118,200, 24, 40, 20,138,157,113,113,113,174, 10,133, 2,241,241,
-241,176, 90,173, 80, 40, 20,152, 49, 99,134, 40, 46, 46,206,213,201,201, 9,137,137,137, 32,132, 64, 46,151, 59,148, 71, 0,160,
-105, 26,137,137,137,104,209,162, 5, 78,159, 62,173,158, 58,117,170,176, 42,253,222,189,123,240,242,242,194,233,211,167,213, 18,
-137,100,103, 93, 90, 52, 77, 35, 39, 39, 7, 55,110,220, 64, 82, 82, 18,242,242,242,144,159,159,143,178,178, 50, 88,173, 86, 0,
-128,184,172, 52,102,215,238, 67,215, 68, 34,145, 56,216,191,141,247,245,132,155, 90,145, 72, 36,246,241,246,246, 7, 62,102,213,
- 99, 8,127, 72, 75, 75,115,121,241,197, 23,121,185,185,185, 40, 42, 42, 2,135,195,249,195,181,197,231,219,215, 20,200,106,181,
- 6, 9,133, 66,202,108, 54, 63,140,128,241,249,124,188,181, 83,143,224,249,120,100,121,102,181, 22,196,102,129,201,100, 10,250,
-203,163, 89, 0, 5,202,212, 6, 20, 21,122, 33,169,220,185,119,212,179, 60, 36, 31, 3,104, 11,192,226,160, 95,123, 47,206,129,
-235,229,110, 32,104, 15, 35, 2, 9,105,184,231, 23, 1, 40,192,236, 7, 80,157, 79,220,181,186,244, 28,253, 26, 47, 43, 43, 11,
- 60, 30, 15, 2,129, 0,161,253,199,114,118, 93,179,184,131, 66, 7,152, 17, 96,143,230, 35, 97, 71,145,104,222, 71, 31,125, 36,
-169,174,249,242,203, 47, 75, 20, 10,197, 71,141, 54, 89,229,226,238,176,146,153, 55,178,244, 45, 22,197,228, 6,221,215, 26, 2,
- 64,200,219,128,165,227, 99, 48, 91,253, 4, 2, 65, 50,128, 94, 77, 50, 89, 50,254,249,239,190,251,190,153,115,243, 7, 38, 11,
-214, 10,128, 43,130,187,171, 19,182,190, 21,238,236,234, 36,114,212,108,133,184,185,185,253,114,225,194, 5,149, 80, 40, 68, 92,
- 92, 28,120, 60, 30,132, 66, 33,218,181,107,135,205,155, 55,187, 58, 59, 59, 59,108,182, 8, 72,173, 49,223, 81,163, 70,145, 62,
-125,250, 96,218,180,105,216,190,125, 59, 76, 38, 19, 22, 45, 90,132,180,180, 52,187,100, 19,129, 67, 75,227,227,183, 45,185,113,
-227,206,123, 33, 33,129,163, 36, 18,231,105, 19, 38, 40, 62,252,240,195,195, 7, 15, 30,252,122,216,176, 97,249,151, 46, 93,250,
- 28,192, 30, 7, 15, 47, 5, 96,253,202,149, 43,167, 85, 25,183, 15, 63,252,240,171,131, 7, 15, 46, 25, 54,108, 88,206,165, 75,
-151,222, 6,176,190, 41,229, 18, 77,211, 49, 63,252,240,195, 53,145, 72, 36, 14, 8, 8,240, 78, 72, 72,208,138, 68, 34,177,183,
-183,183,127,223,190,125, 89,141,209,108, 12,106,181,122,192,133, 11, 23,130,241,160,211,152,160,202,104, 37, 36, 36, 56,149,150,
-150, 58, 73,165, 82, 39, 15, 15, 15, 89,149,217, 26, 61,122,180, 19,135,195,169,247,186,213,233,116, 7,231,206,157,171, 24, 61,
-122,116,213,103,156, 57,115, 6,219,183,111,135, 68, 34,121,228,187, 35, 70,140,192,171,175,190,170, 52,153, 76, 63,216,145,221,
- 73, 83,166, 76, 9,112,115,115,195,188,121,243,140, 89, 89, 89, 3, 0,164, 1, 80, 68, 68, 68,124,154,144,144,208, 53, 44, 44,
-108, 55,128, 78,245,221,123,181,121,145,234, 70,199,158,180,198,126,223, 94,179, 85, 35,169,206, 49,180, 30, 49, 90, 81, 81, 81,
-167, 80, 71, 79, 42,115,161, 6, 2,216, 32, 98, 83, 16,179,171,153, 45,208,224,148,104, 65, 53,162,151, 74,109, 15, 67, 62,159,
- 15, 54,155, 13,147,201, 4,123, 39,170,174, 50, 5,114,185, 28, 82,169, 20, 6,131, 1, 86,171, 21, 66,161,176,202,140, 64, 46,
-151,131,203,229,130,203,229, 66, 40, 20,254, 33,154, 84, 51,154,195,227,241, 32,145, 72,144,147,147,131,180,180, 52,208, 52, 13,
-169, 84, 10,137, 68, 2, 62,159,143,236,236,108,100,103,103,131, 16, 2,137, 68, 2,137, 68, 2, 71, 26, 92,219,108,182, 90, 31,
-254, 22,139,197,161,136,150,213,106,197,173, 91,183,144,158,158, 14,161, 80,248,112, 95, 5, 2, 1,238,221,187,135,220,220, 92,
-136,197, 98,200,229,114, 40, 20, 10,187,117,171,246, 69, 38,147, 65, 36, 18,161,168,168, 8,122,189,254,225, 49,149,203,229,144,
- 72, 36, 40, 41, 41,129, 86,171,173,119,223,109, 54, 27,178,179,179,145,151,151,135,140,140, 12,228,231,231, 63, 44,128, 42,163,
- 70, 77, 11,236,148,150,162,160,160,224, 97, 36,178,174,197, 30,104,154, 70, 89, 89, 25, 46, 92,184, 64,209, 52,141,226,226, 98,
- 58, 47, 55,215,246,122, 54, 31, 7, 62,222, 72,190, 63,118,181, 98,215,145, 56,195,190, 95,110, 24,214,239,187,110, 16,118, 93,
- 96,197,223,193,134, 16, 5, 44,220,200,124,157, 69,144,103,230, 41,220, 66, 34,128,228,163, 0,139, 3, 8,149,232,214,182, 37,
-210,138,108,146,219, 26,147, 16, 20, 6, 97,189,191,210, 46, 77, 27,119, 96, 94,153, 69,144,106,118,149, 7,181,239, 4,141, 70,
- 3,129, 64, 0,129, 64,128,206, 61, 35,144, 92, 96, 19,223,204, 50,136, 65, 16,105,151,230,255,105, 37,149, 74,187,247,234,213,
-139,170,174, 57,116,232, 80, 80, 20,213, 14, 64,160, 67,133,220,218, 86,124,152,197,221,192, 33, 51,111,230,232, 61, 15, 36, 84,
-248, 15, 31, 53,214,121,205,207,218,160, 91,185, 70, 95, 16,203, 44, 16,115,167, 38,152,173,190, 50,153,236,240,186,117,235,124,
-133, 66,225, 81, 0,189, 27, 35, 34, 21,177, 55,205,155,246,108, 51,101,149,201,178,232, 1,142, 8,224,138, 0,142, 8,238,106,
- 21, 22,190, 58,208, 89, 44,228,238,115,192,176,238, 90,191,126,189,107, 77,147, 85,181,132,134,134, 98,254,252,249,174,206,206,
-206, 59,237,209, 91,177,124, 25, 41, 46, 41, 1, 8, 80, 90,170,195,138,229,203,138,170,214,141, 30, 61,154,244,238,221, 27,211,
-166, 77,195,146, 37, 75,112,228,200, 17,116,235,214, 13,147, 39, 79, 70, 88, 88, 88, 67,210,145, 10,133, 98, 71, 68, 68,196,133,
-108,153,236,213,156, 78,157,248,191, 40, 20, 37, 3, 74, 74, 20, 62, 9, 9,230, 0,224, 58,128, 13,153,153,153,131, 29, 48, 89,
-207,200,229,242,184, 1, 3, 6,152,101, 50, 89,250,170, 85,171, 94,159, 62,125, 58,150, 45, 91,134,185,115,231,126, 9,224, 21,
- 0, 31,100,102,102,122,214,103,178,254,172,114,233,207, 42,235,108, 54, 91,198,158, 61,123,194,204,102,179, 87,101,245,160,160,
-184,184, 88, 94, 88, 88, 40, 51,155,205, 18,154,166, 37, 78, 78, 78, 82, 0,226,137, 19, 39,114,110,222,188, 25,100,181, 90,179,
-234,211,204,205,205,125,110,206,156, 57,249,249,249,249, 0,128,118,237,218,161,184,184, 24,179,103,207,198,155,111, 62,232, 16,
-220,177, 99, 71, 16, 66,160,209,104,176, 98,197, 10, 77,110,110,238, 11,118,100,183,117,155, 54,109,144,144,144,128, 91,183,110,
-253, 12,128,198,131,118,172, 37, 87,175, 94,189,150,151,151,135,157, 59,119,242,154, 53,107,118, 16,117, 12,241, 82,159, 23,105,
- 12, 20, 69,197, 52,102,187,170,200, 85,109, 17,177, 58,168, 63,162, 21, 21, 21, 69, 85,127,125, 36, 98, 68, 33, 62, 61,246, 52,
-156, 67, 58, 61, 18,205, 18,179, 41,136,228, 10, 36,103,164,129, 7,234,198,227, 50, 90, 69, 69, 69,120,253,245,215, 13,207, 61,
-247, 92, 1, 77,211, 99,237, 53, 5, 10,133, 2, 10,133, 2, 55,111,222, 36, 99,198,140,209,172, 90,181,202, 80,221,104,221,185,
-115,135, 68, 70, 70,106, 63,250,232, 35, 93,125, 70,171, 42,162,181,116,233, 82, 67,191,126,253,242,110,220,184, 65,170,204,148,
- 84, 42,197,138, 21, 43, 12,225,225,225,154,203,151, 47,147,170, 52, 71, 34, 90, 44, 22,235,161,209,170,190, 13,139,197, 2, 77,
-211, 14, 25,173,242,242,242,231,134, 13, 27,166, 73, 76, 76, 36, 85,251,169, 80, 40,176,106,213, 42,195,192,129, 3, 53, 55,110,
-220, 32, 85,105,114,185,220,110, 51, 88,245,251, 50,153, 12,114,185, 28, 55,111,222, 36,145,145,145,154,181,107,215, 86, 84, 79,
-191,117,235, 22, 25, 49, 98,132,166,172,172,236,185,250,204, 75, 85,117,158,213,106, 69, 69, 69, 5,242,243,243,145,145,145,241,
- 48,156,110,144,200, 7, 63,251,244,240, 14, 6,131, 65,127,243,206,221,244,118,109,131,213, 6,131, 65,159,150,158,126, 7,248,
-152,174, 71,123,108, 72, 72, 72,193,235,175,191,110, 40, 42, 42,106,178,209,226,243,249,137, 28, 14,135,244,238,221,155,152, 76,
- 38,146,145,145, 97,201, 47, 42,178, 6, 46, 94, 76,110,188,245, 22, 37,138,141, 21, 72,165, 82,170, 82,147,149,148,148, 68,139,
- 68,162,196,191,220,104,177,104,119, 80,164,215,239,119,117, 78, 3,135,143,231, 83,185,151, 0,179, 14, 16, 40, 1,129, 18, 28,
-137, 11,134,244,238,200,222,118,161,212, 29,132,238, 1,158,192,171, 65, 77, 46,113, 3,232,222, 63,221,169, 80,246, 26, 55,131,
- 95, 88, 88, 8, 54,155,253,208, 20,137, 37, 18, 12, 24, 53,145,245,213, 37,163, 59, 64,122,130, 98,123, 57,112,175,191, 59,111,
-222, 60, 94, 81, 81, 17, 88, 44,214,255, 53,197, 98, 76,157, 58, 85, 32,151,203,231,218, 93,248,237, 9,226,129, 43,232, 6,144,
- 55,111,231, 86,120, 30,188,110, 8,152,181,116,171, 40,164, 99, 24,166,244, 83,139,150,198,104, 67,174,101, 24, 90, 2,182,183,
- 96, 53,117,110,132,217,234, 45,147,201, 98, 98, 99, 99,197, 67,135, 14,197,138, 21, 43, 36, 34,145,232,104, 99, 10,254,114,157,
-109,250, 39,107,191,209,196,127, 62, 8, 48,151, 63, 48, 88,213, 22,173,142,198,252,173, 39, 75, 44, 22,242,172,189,154, 6,131,
- 97,210, 43,175,188, 82,176,111,223,190, 63,152, 44,161, 80,136,148,148, 20, 44, 90,180,168,176,176,176,176,193,135,226,170,149,
- 43,226, 18,174,253,138,175,190,252, 4, 0,193,186, 85,175,225,252,239,223, 57,245,235,219,135,180,104,209,130,132,133,133,225,
-245,215, 95,199,194,133, 11,113,251,246,109,168, 84, 42,188,246,218,107,232,219,183, 47, 86,174, 92, 89, 95, 33, 21, 57,125,250,
-244, 69,153,153,153, 1, 63,253,244, 19, 39, 47, 47, 79,189,114,203,150,146,189, 37, 37,133, 75, 18, 18,110,127,208,182,109,155,
-247,218,183,127,161,158,161, 31,106, 53, 89,211,166, 77,219,149,153,153, 25,250,243,207, 63,115,243,242,242,188,166, 77,155,134,
-229,203,151, 99,238,220,185,155, 1, 76,129,125, 29, 94,236, 46,151,216,108,246,224,177, 99,199,118, 48, 24, 12,250,219,183,111,
-167,183,109,219, 86,109, 48, 24,244,233,233,233,119, 78,157, 58, 69, 55, 70,179, 49, 20, 20, 20,220,223,185,115,231,157, 84, 3,
- 53,104, 0, 0, 32, 0, 73, 68, 65, 84, 25, 51,102,132,102,102,102, 6, 1,112, 41, 43, 43,147,148,149,149, 9, 76, 38,147, 72,
-169, 84, 42, 59,118,236,168,154, 60,121,178,244,234,213,171, 65,153,153,153,186,202, 40, 82,157,152,205,230,219, 69, 69, 69, 81,
-131, 6, 13, 42, 46, 42, 42, 66,251,246,237, 49,124,248,112,184,187,187,195,211,211, 19, 35, 71,142,132,191,191, 63, 10, 10, 10,
-240,236,179,207, 22,230,229,229, 13, 2,144,100, 71,118,239,231,230,230,162, 71,143, 30,248,228,147, 79,162,158,122,234,169, 27,
-189,123,247, 46,109,219,182,173,222,203,203, 43,112,205,154, 53,104,214,172, 25,246,236,217,227, 33, 16, 8,118,214, 98,178,234,
-244, 34, 0,242, 42, 13,143,169,198,107, 94, 3,235,236,221,182,214,247,118,124,175,166,217,170,190,252,161,234,176,246, 19, 2,
-204,223,190,103, 91, 5,223,219, 15,138,128, 14, 16, 11,133, 16,241,249, 16, 41, 93, 96,164,105,108, 73,201,213,151, 19, 50,215,
-209,139,167,230,131,144,162, 40,124,241,197, 23,214,238,221,187, 87,156, 60,121,114,157,193, 96,240,198,131, 81,101,237, 54, 5,
-107,215,174,213,207,156, 57,243,154, 86,171,237, 32, 20, 10, 77, 85,233,235,214,173,211, 79,156, 56, 49, 33, 51, 51, 51, 84, 44,
- 22,235,235,106,159, 85,221,104, 9, 4, 2,163, 86,171, 13,123,249,229,151, 19, 55,108,216, 80, 46, 22,139, 33,145, 72, 32, 16,
- 8, 76, 90,173,182,195,235,175,191,126,109,249,242,229,122,145, 72, 4,137, 68,226, 80,181, 28, 33,228, 15,134,170,122,186,189,
- 88,173,214,147, 90,173,182,195,204,153, 51,175,174, 89,179,166,188,202, 0, 85,207,227,202,149, 43,245, 82,169,212,161,136, 86,
-213,247, 36, 18, 9, 86,175, 94,173,159, 49, 99,198, 53,173, 86,219, 65, 32, 16,152,170,165,151, 79,159, 62,253,170, 86,171,237,
- 96,181, 90, 79,214,243,111,204, 86, 90, 90, 10, 14,135,131,132,132, 4, 35,143,199, 3,139,197,194,189,123,247, 30, 22, 62,206,
-206,206,193, 29,218,181, 13,252,102,215,158, 83, 34,158, 64,208, 61,172,115, 80, 82,106, 90, 38, 33, 84,106, 3, 89,221,111, 48,
- 24,188, 79,158, 60,185,174,123,247,238, 21, 95,124,241,133,181,174,200,150, 61, 24,141,198, 83, 87,174, 92,177, 8,133, 66, 42,
- 39, 39,199,202,102,179, 97,179,217,136, 49, 44,204,216,110,205, 26,114,243,189,247, 40,185, 68,194,225,241,120, 16,139,197,212,
-177, 99,199, 76,122,189,254,212, 95,111,180, 32, 6, 5,209, 93,173, 81, 38,100, 89, 41,220,217,255,192,100, 9,157, 0,161, 18,
- 16, 42,209,172,153, 23, 46,165,232,101, 96,129, 15,155, 29, 99,136, 17, 34, 1, 5,113,130, 6, 50, 46, 95, 68,229,230,230, 62,
- 52, 68, 85,139,175, 95, 16,174,164,233,164,160,136, 0,108, 56, 50, 4, 73,148,139,139, 11, 39, 39, 39,231, 15,154,193,193,193,
-108,139,197, 98,255,208, 46,217, 54, 15,128,158,118, 39,183,194,227,199,107,229, 1,111, 45,249, 74, 36,178, 21, 3,177,107, 17,
-210,202, 19,111,141,235,200,255,240, 96, 94,200,229, 84,125, 43,176,201, 20,208, 58, 87, 7,242,217, 75, 38,147, 29,189,124,249,
-178, 88, 38,147, 33, 41, 41, 9, 97, 97, 97,136,142,142, 22,139,197,226, 35, 0, 28,106,143,119, 81,131, 52, 93,153,173,251,187,
-123,210,115,227,115,172,143,152,172,188,114,130, 87, 62, 59, 88, 92, 84, 90, 49,246, 66, 70,221,247, 79, 45, 92, 45, 46, 46,142,
-156, 59,119,110, 65, 94, 94,222, 35, 38, 43, 45, 45,173,234,161,216, 15, 64,131,127,126,127,251,245,120,232,226,133, 51,113, 57,
-246, 6,134, 68,189,137, 43,241,247,241,193,156, 81,112,146,139,112,242,228, 73,140, 30, 61, 26,159,124,242, 9,238,221,187,135,
-239,191,255,158,138,142,142,166, 46, 92,184, 64,125,246,217,103, 84, 3, 77, 26, 38, 44, 89,178, 4,151, 47, 95,198,208,161, 67,
-113,250,244,105, 20, 22, 22,226,187,163, 71,239,238,188,123,247,131,170, 54, 91,117, 12,253, 80, 43,114,185,124,214,146, 37, 75,
- 16, 27, 27,251, 80,179,160,160, 0, 75,150, 44,201, 4,240,154, 35, 38,203,145,114,169,125,251,246,129,187,118,237, 58, 37, 20,
- 10, 5, 97, 97, 97, 65, 41, 41, 41,153, 0, 82, 27,161, 89,218,148,154,170,252,252,252,115,209,209,209, 23,250,247,239, 47,158,
- 52,105,146,235,129, 3, 7, 92,244,122,189,167, 64, 32, 80,155, 76, 38,254,173, 91,183,216,123,247,238,117,191,121,243,102, 74,
- 69, 69,197, 37,123,142,135, 86,171,189,116,251,246,237, 65,237,219,183,191,181,110,221,186, 76, 15, 15, 15,122,242,228,201,120,
-229,149, 87,224,234,234,106, 91,189,122,117,122,239,222,189, 19,238,223,191, 31,161,215,235,175,219,153,215,175, 23, 47, 94,124,
-118,215,174, 93, 24, 62,124, 56, 62,251,236, 51,124,247,221,119,248,245,215, 95, 69,191,255,254, 59, 63, 58, 58, 26, 60, 30, 15,
-221,186,117, 67,100,100,228,128,202,234, 78,123,159, 75,151, 41,138,138,161, 40,234,231, 26,175,151,235, 91,231,192,182,117,189,
-175,247,123, 53,178, 25, 93, 99,177,159, 9,173,240,241,212,182, 50,253,185,231,187,145,220,201,189,136,102,124, 16, 57,211,215,
-153,188,220,154, 42,159,212,200,225, 29, 12, 6,195,195,101,223,190,125,196,221,221,189, 92, 38,147, 57, 60,188,131,187,187,187,
-166,180,180,148,116,233,210,165,208,213,213,245,225, 80, 4, 30, 30, 30,154,242,242,114,210,173, 91,183, 66,181, 90,253,112,120,
- 7, 47, 47,175, 12, 66, 8,241,241,241,201,174, 75,207,106,181, 18,119,119,247,170, 30,122, 92,103,103,231,141, 93,187,118, 45,
-212,104, 52,196,195,195,227,225,208, 9,174,174,174, 43,194,194,194,106,166, 55,148,223,140,204,204, 76,146,153,153, 73,154, 55,
-111,158, 93, 61, 61, 45, 45,141,164,165,165, 17, 47, 47, 47,135,135,119,112,117,117, 93, 94, 75, 94, 26,149, 71,111,111,111,141,
-193, 96, 32, 61,122,244,120,228,152,122,123,123,107, 42, 42, 42,170,210,237, 26,222, 65, 36, 18, 77, 17, 10,133,217, 66,161, 48,
- 91, 32, 16, 44,106,209,162,133,118,247,238,221,100,245,234,213, 85, 93,210,225, 26, 60,162,187, 95,143, 23, 62,112, 13, 30, 57,
-171, 41,195, 59,200,100,178, 95,220,221,221,203,247,237,219,247,200,245,101, 48, 24,236, 30,222, 65, 36, 18,101,234,116, 58, 90,
-163,209, 88,206,158, 61,171,143,141,141,213, 39, 36, 36,232, 83, 82, 82, 12, 5, 90,173, 89,163,209, 24, 74, 74, 74,140,215,174,
- 93, 51,138,197,127,207,240, 14, 36,218,223,143,108, 12, 60,120,255, 19,223,155, 51,251,136, 43,174, 47,236, 64,200, 15,163, 9,
- 57,242, 10, 33, 39,223, 37,151, 54, 79, 38, 61,124, 5,182,179,179,155,223, 33,155, 2,126,180,103, 72, 6, 18,221,206,143,108,
- 12, 60,114,119,129,239,205, 73,189, 61, 43,182,108, 88, 77, 46, 94,188, 72, 18, 18, 18, 72, 82, 82, 18, 57,178,127, 55,233,209,
- 74,252, 64,115, 99,224, 65, 7,135,121,232, 41, 16, 8,116,171, 86,173, 34, 23, 46, 92,120,168,121,240,224, 65, 34, 22,139,245,
-128,125,189,150, 9, 64,145,141,193,163,172, 27, 2,126,255,112,160,180,172,224,240,187,132, 92,223, 70, 72,116, 8, 33, 95,119,
- 37,100,247, 48, 66, 14,189, 64, 46,172, 30, 71,122,250,242, 44,100, 83,192,105,178, 57,216,238,198,246, 92, 46,183,116,223,190,
-125, 36, 59, 59,155,156, 62,125,154,196,198,198,146,196,196, 68,146,158,158, 78, 98, 98, 98, 8,151,203,173, 64, 35,166, 45,235,
-234, 6,159,136, 54,188,156,107, 75,123, 18,114,224, 89,146,183,115, 2,137,106, 43, 43,236,214,188, 73,227,209,117,116,113,113,
-201,143,137,137, 33, 41, 41, 41,228,212,169, 83, 68,173, 86,231, 3,176,187,189,108,212,144,222,132,152,174,145,240, 62,109, 73,
-251,246,109, 73,223,158,109, 72,214,253,181, 36,172, 83, 11,178,113,227, 70,162,209,104, 72,139, 22, 45,136,163, 25,139,136,136,
-184, 72, 8,137, 27, 58,116,104, 28,128, 99, 17, 17, 17,113,201,201,201,113, 97, 97, 97, 23, 80,255,208, 15,117, 50, 96,192, 0,
- 51, 33,132, 12, 29, 58,148, 0,200,142,136,136, 32,201,201,201, 36, 44, 44,204,212,152,131,103, 79,185, 20, 26, 26,218,189,127,
-255,254, 31,132,134,134,206,178,103,120,135, 6, 52, 31,215, 32,212,108, 60, 24,252, 51, 24, 64,231,202, 37,168, 50,141,221, 4,
-205, 23,184, 92,238, 22,103,103,231, 95,149, 74,229, 73, 54,155, 29, 13,224,121, 52,110,124, 51, 86,101,132,241,132,171,171,235,
-189,246,237,219, 27, 6, 13, 26, 68,134, 12, 25, 66,166, 77,155, 70,104,154, 38,187,119,239, 38,159,124,242, 9,105,237,226, 98,
- 93, 13,228,111, 2, 94, 4,195,131, 1, 75, 95,108, 69,157,122,174, 37,202,158,109, 9,221, 75,173, 41,123, 6, 44,141,168,203,
-104,209, 52, 77,238,220,185, 67,194,195,195,203, 37, 18, 73, 22,236, 31,176,244, 17, 77,149, 74, 21,171, 86,171,255, 48,136,102,
-181,244, 71, 6, 44, 85,171,213,231, 60, 60, 60, 52,174,174,174, 87,106,211, 84,169, 84,177, 30, 30, 30, 26,149, 74,245,200,224,
-158,108, 54,123,168, 74,165,202,170,153,206,225,112,250,171,213,234,140,154,233,117,236, 59,220,221,221, 51,178,179,179, 73, 94,
- 94, 30,241,246,246,206,174,105,192,114,115,115, 31, 49, 96,246,104, 54,148,151,122,242, 88,171,166, 29,199,180, 49,231,189, 10,
-255,102,205,154,105, 87,174, 92, 73,164, 82,233, 35, 93,158, 3,250,188, 52,239,226, 93, 93,233, 43,115, 54,238,174,101,192, 82,
-123, 7, 7, 29, 36,145, 72,178,194,195,195,203,239,220,185, 67,104,154, 38, 52, 77,215,101,180,106,211, 28,220,185,115,231,130,
-252,252,124, 91, 89, 89,153, 53, 35, 35,195,152,156,156,108, 88,184,112,161, 57, 47, 47,175, 66,167,211,153,226,227,227,141, 30,
- 30, 30,121, 0, 6, 59,122,142, 26, 73, 68,205,234, 51,178, 57,168, 39,217, 20, 20,147,248,145,207,173, 23,186, 74,140,113, 43,
-135, 18,114,242, 93,114, 97,227, 43,164,187, 47,255,129, 33,218, 28,120,148,124,229,223,135,172,109,197,183, 75,115, 75,235,222,
-100,115,224,209,155,243,125,110,141,238,228,106,218,181,109, 51,185,119,239, 30, 57,184,119, 39,233,214,178,210,100,109, 10, 58,
- 65, 54, 6,133,219,163, 89,155,217,218,186,117, 43,185,119,239, 30,249,241,199, 31,237, 53, 89, 17,181, 25,173,247, 35,164,197,
-175,116, 21, 26,159,237,200, 55,141, 12,225,153, 35,253,120,214, 30, 62, 28, 91, 7, 15, 22, 29,228, 10, 18, 25, 32, 50,146, 77,
- 1,167,201,166,160, 65,246,230,147,207,231,167,163,218,152, 58, 53, 23,129, 64,144, 87,143,209,138,104,208,108,249, 11,114,126,
-249,164, 63, 25,222, 94, 86, 96,167,201,106,232, 90,234,168, 82,169,242,191,254,250,107,226,230,230,150,103,167,201,122,168, 57,
- 34, 42,146,164,221, 63, 66,126,220,189,132,132,247, 9, 34, 59,182,206, 36, 23, 79,127, 68,134, 13, 9, 39, 17, 17, 17, 36, 63,
- 63,159,244,239,223,159, 56,154, 79,133, 66,177, 67,167,211,197, 29, 63,126, 60, 46, 34, 34, 34,110,199,142, 29,113,103,206,156,
-137, 19,139,197, 59,170,130, 19, 53,205, 86,208, 31,203,255,136, 26, 17,173,184,178,178, 50,114,252,248,113, 18, 17, 17, 65,118,
-236,216, 65,206,156, 57, 67,196, 98,113, 92, 99,239, 35,123,203,165,129, 3, 7,206, 75, 73, 73, 41,157, 63,127,254,238, 90, 6,
- 44,181, 87,243,222, 99,202,231, 99, 41, 67,254, 6, 77,153, 72, 36,138,187,118,237, 26, 41, 42, 42, 34,109,221,220,200, 98, 54,
-155,100,242,120, 36,155,199, 35, 27,129,194,127,129, 77,154, 92, 87,213,225,159, 77,173, 70,171,162,162,130,204,158, 61,219, 36,
- 20, 10,245, 60, 30,207,209, 41,120,158,232,139, 80,165, 82,157,115,115,115,211,184,185,185, 61, 98,246,170,167,171, 84,170, 43,
-255,242, 27,208,159,199,227,165,113,185,220, 71,167,224, 9, 30,209,189,117,207, 73,115,221, 66, 70, 12,105, 98, 62,121, 60, 30,
-239,125,161, 80,168,159, 61,123,182, 73,167,211, 57, 98,180, 0, 96,160, 88, 44,206,218,190,125,187,225,238,221,187,150,194,194,
- 66,235,197,139, 23, 45,177,177,177,166,143, 63,254,184, 76, 44, 22,103,161,238, 97, 9,254,146,227, 73,214,182,226, 87,153,173,
-235,115,125, 18,135,183, 21,155,163,223,142, 36,221, 91,212, 48, 89,117,143,228, 94,187,102,165,217,186,250,161,119, 98,184,191,
-212,186,100,238, 91,164, 91, 75,209,163, 38,203, 1,205,154,102, 75, 44, 22,151,125,244,209, 71,142, 68,178, 30, 53,132, 91, 2,
-188,201,230,192, 29, 15, 76, 84, 3,203,198,128, 47,201, 23, 1,222,255,148,251,168,171, 27,124, 6,248, 11,110, 56, 16,201,178,
- 39,159, 29,149, 74,229, 45, 7, 34, 89, 15, 53,191,248, 98, 29,153, 48,126, 32,185,127,107, 31,209, 21, 28, 33, 87,206,175, 34,
- 99, 70,132,146,110,221,194,200,230,205,155,201,237,219,183, 73,151, 46, 93, 72, 35,242, 25, 57,117,234,212,184,228,228,228,184,
-164,164,164,184, 51,103,206,196,141, 26, 53, 42, 14, 64,100,245,154,160, 42,179,101, 30, 51,198,216,145,197,122,171, 1,205,103,
-166, 78,157, 74,146,147,147, 73, 82, 82, 18, 57,115,230, 12, 25, 53,106, 20,129, 99,211,247, 52,170, 92, 10, 13, 13,237, 30, 30,
- 30, 62,183, 83,167, 78, 67, 30,151,230,127,208,104, 73, 70,143, 30, 77,219,108, 54, 50,100,200, 16,219, 26,160, 56,154,162, 52,
-209, 20,165,217, 12,228,253,219, 35, 90,127,246,132,159, 17, 0,126,174,158, 32, 20, 10, 53, 21, 21, 21,174, 82,169,116,191, 78,
-167,155,129, 7,221, 34,155,164,249,103,228,147,209,252, 87,104,122, 72,165,210,117, 58,157,110,148, 80, 40,204,171,168,168,112,
-115, 64,211, 73, 32, 16,188, 37, 20, 10,195,245,122,189, 63, 0, 72, 36,146, 59, 70,163,241, 87,131,193,240, 57,128,226,191,123,
-223,201,218, 86,124,240,249,157, 65,240, 94, 92,122,121,203, 37,199, 11,125,222,238,175, 76,239,209, 90,146, 2, 46,253, 25, 40,
-227, 37,234,197, 52,163,195,154, 34, 42, 12, 54,238,123,151, 82,245, 45, 62,251,169,204,103, 86,184, 52,189, 71, 43,105, 58, 8,
- 62,131, 64,127,222, 81,205,154,102, 75, 34,145,108, 47, 47, 47,127, 21,192,175,142,238, 59,217, 19,196, 67,185,165, 25, 44,236,
-182, 32,245, 76,225, 67,136, 30, 44,118, 2,114,161,161, 62,190,101,102,238,163,218, 53, 55,108, 88, 79,126,254,233, 8,140,250,
- 66,228,104, 75, 49,225,249,151,208,177, 99, 40, 84, 42, 21, 22, 47, 94, 12, 63, 63, 63,124,242,201, 39, 84, 35,242, 25, 41,149,
- 74, 39, 4, 6, 6,182,186,121,243,102,146, 94,175,255, 22,192,137,154,207,159, 64, 32, 92,204,225,116, 48, 88,173,167,111, 1,
-177, 13,104, 62, 35,149, 74,103, 5, 6, 6,134,220,188,121,243,134, 94,175, 95, 9,224, 59,166,172,123, 50, 52, 89, 44,214,231,
- 62, 62, 62, 99, 82, 82, 82,222, 3,176, 11,255, 33,254,114,163,197,104, 50,154, 79,160,102,213,125, 66,254,105,249,252,191,217,
-162,103,128, 66, 75, 16, 42, 19, 60,122,117, 3, 38,171, 97, 77, 17, 21, 6, 43,231, 77, 80,104, 14,130, 92, 16,214,231, 13,152,
-172,191,214,100, 2, 20, 62,174,167,252,250, 24,132,170,251,124, 49,215,124, 45,204,155, 55,143, 28, 59,118, 12, 98,177, 24, 6,
-131, 1,131, 6, 13,194,167,159,126, 74, 49,101, 8,163,249, 23,106,254, 43,225, 48,135,128,129,161, 65,200, 63, 53, 99,212, 27,
- 73, 38,178, 39,232, 50,242,217,179,193, 66, 75,192,154,134,114,107, 46,245, 70,154,169,137,154, 23,145, 79,205, 4, 27,254,224,
- 91,239, 67,103,202,165, 94,107,188,230,159,240, 15,145,224,227,127,238,121,121, 18,169,105,170, 98, 99, 99,153,131,194,192, 96,
- 63,147,241,104, 79,195,135,159, 25,163,197,192,240,132, 67, 61,117,203, 12, 32,179,114,249,199,106, 50, 48, 48, 48,252, 7, 13,
- 23, 40,212,221,160,205,145,144, 96, 99, 26,218,253,204,104, 54, 74,147, 13, 64, 1,192, 9, 15,198, 32,169,234,210,219,208, 48,
- 27, 67, 0, 88,152,227,201,104, 50,154,140, 38,163,201,104,254,205,154, 13,105, 63,137, 85,146,181,245, 50,140,254, 43,126, 56,
-130,209,124,172, 12,250,215,236, 59, 65, 7, 16,172,174, 92, 58, 48,231,157,209,100, 52, 25, 77, 70,243, 63,175,249,175,132,169,
- 58,124,178, 16, 62,177, 57, 39,196, 3, 64,213, 32,151, 9,168,160, 2, 33,196, 76, 0, 64, 25,174, 16,130,187, 0,218, 86,174,
-207,160, 40,135,123,163, 50, 48, 48, 48, 48, 48,252, 93,132, 2,184, 2,192, 3,192, 48, 0, 49,168, 28, 85,225,111, 53, 90, 34,
-151, 54, 30,224,176,218, 83, 52, 9, 4, 0,194,162, 18, 97,165,227, 13, 5,119,155,252,144,149,122,250, 59, 19,240,247, 80, 48,
- 61,165,203,190,211,228,193,208,218,250,203,199,184,169,100, 19,114, 11, 74,182,223,184,173, 59,224,200,182, 10,133,143, 66,232,
-172, 28,103, 52, 91,218,242,121,188,116,115,113,105,116, 81, 81, 82, 89, 35,178,225, 92,223,202,143, 63, 38,212,225,156, 43, 20,
- 79,108,102,185,200,121,148, 14, 58,162,203,145,210,190,197, 41,100,239,222,167,136,163,231,134, 98,161,159, 68, 38,235, 36, 16,
-138,195,196, 50,101, 27,154, 0,133,154,172, 84,147,197,122,198,102,210,199, 17, 26,191, 57,112,174, 38, 2, 88, 2, 0,232,223,
-255,103,180,133, 28,159, 87,101, 28,175,245,191,142,137, 39, 79,162,106,112,217,247, 1, 44,101,238, 91, 6, 6, 6, 6,134, 39,
-204,104, 13,195,131, 42,195,134, 27,195,251, 4,247,186, 44, 20,138,124, 1,128, 38, 4, 52, 1,202, 75,139,227,114,147, 98, 7,
- 1,128,170, 69,232,113,174, 80,222,137, 38, 15,214,219,104,192,106,174, 72, 41, 77,187,216,197,158, 28, 73, 92,253, 71,247,143,
- 24, 48, 38, 42,106, 88, 64,187,182,237, 90, 3,192,245,132,235,247, 15, 31,142,185,125,242,103,106, 95,121,222,157, 31,155, 20,
- 64,129,240,211,206,157, 59,246,138,141,189,242, 9,128,105, 77, 61,130, 46, 46,210, 25, 39,126,152,221,103,192,152, 21, 18,192,
- 49,163, 37,116, 86,142, 27, 57,124,112,199,119,222,152,202,122,101,246, 98,223,203,103,127, 91, 38,245, 8, 41, 38,180,229, 68,
-185,102,252,239,245, 77,156, 92,211, 63,214,101,176,190, 45, 60,198, 90,253,117,119,165,161,240,254,120, 66,219,198, 83, 20, 5,
- 54, 95,188,215,181, 85,175,221, 78,253,222, 46, 2, 96,119,143, 49,185, 71,112,132,218,195,107,223,248,151,222, 18,138, 21,110,
- 28,176,121, 0, 40,100,167,222,194,201,239,150, 40,223, 92,176, 53,244,108,124,154,245,151, 31,214, 87, 80, 60,238, 24,125,206,
-205,134,235,211,211,210,156,224,227,243,224,253,151, 95,206,131,111,203,235,120,208,214, 12, 88,133,146,111,178,209, 22,120, 96,
-180, 82, 83,161,100,238, 89, 6, 6, 6, 6,134, 39,136,152, 74,115, 21, 83,115, 69,157, 70, 75, 40, 20,249, 94,248,237,176,243,
-143,103, 50, 0, 0, 17,161,238,248, 96,225,186,200, 29,107, 99,111, 3, 64,247,254, 81,254,159,188,255, 6,206,221,208,130, 16,
-130,142,126, 46, 24, 50,242, 41,251,140,135, 91, 80,151,113,227,198, 62, 55,123,246,172, 17,247,238,221, 75,221,181,107,215,239,
- 0,208,187, 79, 31,191,197,139, 23, 63,189, 66,233, 44,248,126,239, 15, 89, 21,154, 91,151, 27,179,183, 66,207, 86,205, 2,218,
-180,156,240,253, 87,235, 88,253, 6,141,125, 54, 21,229, 75, 42,178,147,178,236,217, 86,165, 82,205,228,114,185, 10,224,193,108,
-236, 85,152,205,196, 29, 0,172, 54, 90,166,244, 12, 40, 99,243,132, 54,129,128,119,179, 76,167,219, 94,154,117,107, 75,125,154,
- 70,139, 37,228,205,215, 94,100, 93, 77, 42,128,111, 72,111,246,234, 37, 31,130,182, 89,148,111,189,191,112, 92,236,197,239, 81,
-174,193, 41, 59,119,141, 91, 51,161, 89,179,110,236, 79,151, 72, 7, 82, 20, 94,240,233,254,210,168, 79,182,237,229,118,246,147,
-195,104,161,113, 52,174,160,251,198,207, 63, 93,126,118,227,176, 67, 0, 54, 3,248, 5, 64,131,166,206,217,197,249,219,153,115,
- 63,151,150,155,254,223,219,187,210,100,225,203,237,123,112, 45,131, 70, 96, 64, 32,199,125,230, 50,233,230,133,147,183,233, 31,
-204,179, 85,155,221,109, 5,160, 39,144,232,140, 41, 11, 6,224,155,165,139,160, 86,151, 67, 38, 75, 7, 5, 55, 0,109, 42,191,
-120,151,159,143, 12, 0,239,107,181,144,124, 50, 21,131,174, 2,115, 58, 0, 90, 0,103, 41,251,102,141,103, 96, 96, 96, 96, 96,
-248,187,200,193,163,141,223,163, 27, 52, 90, 0, 32, 21,113,112, 59, 57, 23, 0,224, 36, 2,102, 76,153,132,130,252, 60,127,147,
-149,198, 75,147,158,199,149,196, 28,220, 78,201, 3, 33, 4,254, 94,118, 79,194, 13, 54,232,206, 47,189,252, 82,223,227, 39, 78,
- 92,154, 55,119,222, 55, 20,133,243, 0,176, 57,250,203,238,243, 63,154,255,234,243,147,158, 31,184,119,239,222, 27, 0, 26,101,
-180, 56,148,108,221,242,165,139,248,153,249, 21, 21, 51,103,191, 71,207,122,123,230,106, 0, 99,237,114, 50, 92,174, 34, 51, 51,
- 83,202, 98, 61, 58,151,230,103,139,222, 59, 61,112,204,138,187,169,233,197, 87,143, 31, 60,216, 37, 56, 56, 24,153, 89,185, 61,
-151,173,217,212,225,232,113,209,139,101,165,134, 49,250,252, 91,181, 78,218, 44,224,114,111, 44, 88,182,177, 35,237,228,199,250,
-224,213,161, 8,105,237,137, 44,109, 49,250, 12, 26,193,137,187,124, 57, 18,176,219,104,213, 28, 60,112,156,137,214,118, 88,188,
-253,226,128, 81, 61, 60, 59,179, 88,108,232, 12, 22,228,149, 24, 97,163,129,222, 65, 10, 12,222,177,134, 83, 88,110, 25,189,240,
-135,140,209,231,215, 70,105, 42, 74,178,167, 3,216, 87,255,207, 16,103, 47,181, 28,183, 51,202,106, 53, 89,229, 21, 86, 0, 0,
-143,109, 3, 5,226, 82,143, 80, 79, 0, 95, 3,129,192, 79,211,159,131,155,219, 46, 55, 55,183,113,106, 55,247, 56,255,231, 94,
-164,154,249, 6,201,116, 6, 51,110,222,184, 94, 22,220, 41,129,148, 21,106,223,170, 40, 47,218,123, 11, 72, 8, 4,118, 87,106,
-188, 8,198,104, 49, 48, 48, 48, 48,252,179,169,179,215, 33, 7, 0, 14, 31, 62, 76,162,162,162,254, 48, 2,176,205, 70,112, 59,
-229, 65, 19, 28, 54,155,141, 97,189,252,176,122,217, 2, 24, 76, 86, 92, 75, 46,193,143,231, 50, 96, 42, 47, 6, 33, 4,249, 33,
-234,218,126,248,145, 42,165, 21, 75, 68,161,108, 1,119,252,217,139,146, 22,206, 74,165,242,238,141,111,202,231,191,173, 9,226,
- 16,115,220,194,207,252,146,121,206,156, 30,123,246,236, 14, 30, 30, 21,197,151, 74,101,239, 18, 78, 7, 47,110, 57,153, 85, 82,
- 18, 95, 82,151,102, 77, 68,234,192, 17, 35,134, 13,238,239,238,238, 70, 63,183,248, 98,226,186,233,161,222,109,252,218,244,188,
-109, 49,140, 48,104,239, 30,172, 99,179,135,154, 52, 77,131,197, 98, 65,163,209,192,102,179,193,104, 52,194, 98,177, 32, 35, 35,
- 85, 67, 19,226,101, 3,205,242,240,240, 2,135,195,135,111, 11, 31,108, 92,189, 68,188,227,251,131, 97,115,230,125,122, 64,159,
-143,110,248,255,224,150, 15, 53, 43, 10,139,246, 30, 57,118,194,149,224,164,231, 7,175, 14,101,107,139,116, 56,121,249, 30,174,
-220,204,112,244, 68,214, 28,194,161, 69, 86,218,189,210, 21, 43, 86,176, 63, 57,122, 47,163,255,144,177, 54,159,214,237, 91, 24,
-109, 4, 0, 5, 1,143, 3, 30,135, 5, 31, 87, 33,246,191,215, 22, 23, 71,198,187, 69,134,186,126, 78, 8,217, 87,223,241, 52,
- 26, 45,182, 94,129, 18,118,135, 86, 10,196,223, 47,194,165,163,231, 49,115,238,231,136, 77, 54,162, 76,167, 7,101, 51,130, 77,
-140,200, 79, 75,130,213,102, 35, 13,157,247, 7,132, 22, 1,128, 64, 32,120,255,199, 67,199, 60,141,180, 16,185,197, 70,104,138,
-140,240,235, 54, 70,146,150,149,135,175, 23, 60,253, 62,128,189,129, 64,153,125,154, 77,134,209,100, 52, 25, 77, 70,147,209,252,
-135,104,214,229, 69,158, 16,234, 28,202,129, 85,223, 86,247, 51, 10,113, 59, 57, 23,157, 2,155,161,117, 11, 15, 92,186, 83,132,
-111, 79,102, 96,235,241, 52,156,188,150, 7,154, 35, 67,110, 41,112, 55, 85,131,187,105,249, 13,142,159,205, 22,112,199,191,249,
-102,201,236,118,193,165,221,126, 59, 58, 3,205, 92,239, 6,207,153, 83, 60,131, 45,224,142, 87, 54,151,237,122,111,246, 91, 19,
-100, 98, 49,223,100, 52,161, 85, 75, 31,225, 27,211,103,188, 72, 41, 5,118,207,137, 36,107, 22,164, 20,136, 68, 91, 22,126,252,
-174,224,243, 31,239,166,151,155, 80,190,239,188, 38,105,214,123,243, 11, 57, 92,225, 70, 89,179, 32,187,219,254, 88, 44, 22, 24,
-141, 70,152, 76, 38,152,205,102,100,101,220, 26,241,203,143,239, 12,106,217,220,121,144, 64, 40, 4, 1, 80,106,176, 34, 57, 71,
-143,240, 1, 3,217,157, 66, 67, 67,164, 30, 65, 47,215,166, 85, 82,146, 86, 66, 19,182,236,240,254,157,236,221, 63, 93,197, 55,
-135, 47,227,192,175, 87,113,233,212, 81, 43,161, 45, 15,231,255,146,122,248,249, 75, 61,218,165, 73, 61,219,107, 30, 46,205,218,
-214, 59, 60, 51,155,205, 34,225, 3, 34,126,158, 50,237,141,223,244,101, 5,218, 45,235, 22,100,229,101,167,222, 18,240, 40,171,
- 88,192,134,174,194,138,109,191,100, 99,220,146,107,184,153,174, 3, 33,164,193, 9,188,105,224,237,241, 47,191, 99,179,152,205,
- 8,240,150, 98,103,244, 82,140, 8,239,128,254,237,148,232,210, 90, 2, 49,199,136, 27,137,183,241,221,206,109, 86,154,102,205,
-106,224, 70, 28, 92,185,196, 1,128, 78,167,123,103,206,187,179,242, 76, 86, 26,102, 11, 13,115,229,235, 47,223,125,150,103,171,
-208,191, 83,185, 93, 92,181,237,152, 41, 30, 24, 24, 24, 24, 24,158,132,136, 86,213,226, 81,125, 69,157, 85,135, 21, 21,134,148,
-177,227,159,135,135,218, 93, 58,178,223, 11,188,184,251,197,200,203, 73,195,189, 59, 9,208, 87, 88,192, 83,182, 4,132,238,104,
-225,235,131,248,219, 7,204,107,151,199,232,104,171, 49,165, 46,189, 17, 35, 60,188,238, 37, 82,172,229,203,188, 47,220,185, 93,
-212,105,231,220,175,241,220,115, 82,213,242,101,222, 23, 82,147, 36, 44,177,144,244,120,113,210,179, 20,139, 34,152, 51,103, 54,
- 70, 70, 13,198, 75, 47, 78,164,182,111,223,214,173,216,206,189,164,193,253,226,253, 15, 23,240, 53,197, 86,211,165, 59, 58,163,
- 88, 34, 18,157,189,171, 43, 15,241,245, 22, 13, 29,243, 66,118,204,158, 45,159, 3,152,100,143, 86,149,193,178, 88, 44, 48,155,
-205, 0, 96, 3, 0, 22,235,193,107, 65,153, 9,218, 98, 35, 52,197, 70, 88,109, 52,198,140,159, 36,186, 28,123,109, 18,128, 58,
-218,107,209,180,197,106,193,190,159,174, 32,235,242, 94,154, 98,177, 75,170, 53,134,135,212,195,207,223,221,221,251,116,212,152,
-137,174,124,225,131,106,216,178,114, 35,182,111, 90, 86,111, 62, 89, 20, 69,104,155,181,216,106,177,148,183,106,217, 42, 43, 48,
-184,131,240,204,111,199, 71,156,253,121,159,206,218,106,162,211,253,212, 28,176,185, 2,176,121, 66, 24,205,246,117, 60,212,220,
-187,176, 30, 0,245,242,235,179, 87,191,245,206, 7,236,183,215,254, 14, 83,133, 30, 70, 67, 57, 74, 75,138, 32,226, 88,112,227,
-220, 65, 43,177, 89,222, 42,207,185,186,190,110, 37, 42, 27, 64,118,245,148,194,194,194,147,231,126, 63,125,232,226,185,223, 95,
-114,111,213,137,101,178,208,184,151,112,145,206,186, 27,123,200,104, 44, 61, 9, 0, 20, 80, 0,224, 56,115,223, 50, 48, 48, 48,
- 48, 60,129, 17,173,201,213,211,234, 52, 90,105, 55,207,116, 1, 0,255,206,145, 5, 82, 33,199,153,195,162,160,201,188,143,237,
- 43,102,130,166, 9,134,190,186, 28, 50, 95,119,136,120,108, 24,117, 5,186,194,251,167,234,107,171, 3,138,178, 12, 92,191, 57,
-203,247,245,215, 90,201,119,238,212,113, 1, 96,231, 78, 29,247,181,169,205,229, 27, 54,167,248,118,237,213, 9,196,102, 67,212,
-200,177, 24,255,204,120,164,230,234,241,195,233,116,148, 27, 76,118,245,150, 19,169, 2, 59,168, 92, 92, 7,191,249,194, 96, 9,
-135, 77, 81,109,124, 20,236,140, 60,139,149,205,230,218, 14, 93, 46,201, 30, 51,230, 25,213,201, 35,187,251,219, 84,129, 29, 12,
-249,137,215, 26,210, 51, 26,141,143, 84, 29, 58,171, 90, 30, 25, 56,118, 69,102, 78,110, 89, 76,110, 81, 69,215,114,139, 21,154,
- 98, 35,180,197, 70, 20,151,155,225, 46, 83,194,106, 49,181,171, 75,143, 16,242,205,168,177,207, 79, 4,192,162, 88,214,175,117,
- 57,137,119, 30,172,249,191,201, 26, 60,242, 57,215,211,113,247,113, 47,246,104, 17,161,173, 15, 70,113,167,232,204,250,143, 43,
- 8,155, 2,205,227, 80, 22, 54,139, 69,155,205, 58,139, 90,237,122,242,212,201, 99,195, 43,172, 73, 96,243, 4, 15,191,107, 48,
-253,143,189,183, 14,143,234, 90,191,199,215, 57,103, 92,226,201,196, 8, 18, 36,193, 29, 18,220, 73,113, 40, 20, 45, 80,138,183,
-212,160,165, 45, 45, 46, 23,215,210, 98,165,184,187, 67,240,226,154, 0, 9,196, 61,153,137,140,219,177,223, 31,147, 64,128,144,
- 76,160,247,247,189,247,115,179,158,103,158,201, 57,204,121,217,103,235,218,235,125,247,222,172,211, 53, 38,251,197,205,181, 0,
-176,106,245,202,101,173,186, 14, 19, 93,190,159, 8, 51, 13,132, 55, 9,193,225, 61, 27,173, 60, 79, 79, 51,102, 62, 88, 91,142,
- 74,232, 30, 20, 20,244,149, 80, 44,238, 36,147,187, 4,249,248, 87, 38,237, 12, 11, 59,205, 66,225, 21, 72, 74,148,158, 93, 57,
- 82,116,141,177,219, 34,237, 70,245, 42, 0, 5, 21,237,182, 2, 21,168, 64, 5, 42,240, 95,166,106, 1,197,246,208,122,141,104,
- 29, 63,126,156, 7,128,146,252,163,233,217,121,240, 82, 10,224, 19, 80, 13,195,191, 90,134,109, 43,190, 5,203,210,224,121,128,
- 97,157,219,153,128,231,133,231, 38, 79,172, 86,187,106, 53,202,103,248, 48,185,121,199, 78,147,108,248, 48,185,185,126, 3, 47,
-237,228,137,213, 18,245,150,202,173, 25,150,197,245,232, 28, 68, 37,106, 17,149,164,131, 82,230,252, 54, 95,148, 88, 52,113,241,
-162,133, 34, 1, 69, 16,209,201, 6, 67, 90, 46, 99,160,132, 66,187, 92, 38,230,109,188,192,154,164,225,115, 59,247, 27,109, 62,
-182,125,213, 24, 0, 95,188, 83, 21, 43, 92,105, 88,164,100, 21,125,243, 60,207, 19, 0,199, 17, 44,155,166,177,192, 96,167,145,
-157,255,138,104, 17,204,187, 61,167, 74,255,154, 33,174, 46,202,211, 20, 69, 73,120, 30,160,237,204, 39,240,175,217,221,144,249,
- 34,182, 56,201,186, 25,157,129,184, 7,231,179, 89,187,105,132, 41, 39,230,130,179,239, 78, 16,224, 41, 10, 28, 69, 18, 28, 65,
-128, 19,146,188, 13, 60,207,189,153, 34, 83, 57,136, 86, 17,217, 18, 11,169, 25,103,119,175, 80,125,214,179, 14,246, 92,113,112,
- 62,139, 94,173, 51,166,151,139,100,193,203,203,107,228,247,223,127, 63,179,207,199,195,160,181, 16,200,206,119,168,129, 54,154,
-131, 72,225,141,174,147,183, 4,101,170,117, 65, 47,110, 31,107,173,121,176, 83, 75, 91,180, 43, 43,218,108, 5, 42, 80,129, 10,
-252,111,161, 52, 46,242, 95,164,106,189,173,104,149,246, 66, 60, 15, 60, 79,214,160,106, 37, 31, 84,170, 90, 3,177, 79, 31,189,
-250, 55, 0, 12,235,156, 59,234,232,209,204,180,101,203, 92,185,111,191,213,134, 47, 94, 92,249,198,196, 9, 65,110,245, 27,120,
-105,191,255, 62, 37,124,249,114,183, 27,231,110, 10, 89,190,112,191,174,162,189,185,120,190, 60,123,108,146, 45, 26,213, 13,166,
-102,239,124,158,114,225,177, 62, 71, 36, 18,209,126, 30, 82,194, 69, 41,166, 40, 82, 40,182,210,164, 53,164, 94, 19,234, 24, 73,
- 52, 41,205, 74, 17,209,122,211,117,152,171,142,235,115,246,192,212,250, 29,250, 45,241, 76, 87,155,161,181, 81, 47, 93,135, 20,
- 73,224,241,211,100,128, 18, 69,149,100,211,213,197,243,204,174, 29,219, 42, 47, 95, 60, 31,118,134,197,228,111,127,193,232,145,
- 35,206,192,191,102,247,202,213, 66,239, 93, 61,246,167,188,251,132,245, 72,142,185,155,197, 88,117,187,203, 67,178, 94,146, 45,
-128,103,121,142,204,203,215, 41,173, 12,164, 40,129,247, 89,237,220,123,213, 28,131,153,193,177, 91, 89, 56,126,104, 55,220, 92,
- 20,239,101,195,205,205,173, 78,187,118,237, 65, 8,196,176,209, 86,216, 24, 14,182, 98, 49, 90,118,154, 3,205, 11, 33,247,111,
-136,188, 39,135,235,192,162,173,232,113, 42, 80,129, 10, 84,224,127, 8,255,197,129,240,197,201,213,187, 21,173,210, 80,165,146,
- 47,110, 69, 37,162, 65,237, 96,184,185,186,224, 89, 92, 26, 40, 82, 8,146, 0,104,198,121, 50,196,219,233, 61,203,151,187, 33,
- 57, 81, 65,254,182, 62,177,218,228,137,213, 18,151, 47,119,187,193,219,233, 61, 0, 70,240, 60,224, 32, 91, 14,194,197,150,131,
- 23,240, 28, 29,228,235, 41,167,238,198, 27,115, 73,146,178,122,185, 73, 57, 47, 55, 9,233,229, 34, 22,138,132, 20,199,240,164,
-189,146,170,154,133,231, 56,103,206,213,123,205,117,200,178, 44, 8,130,100, 11,137,152, 34, 53,215, 12,173,133, 66,118,129, 21,
-249,122, 59,106, 5, 42,112, 62,114,191,137,165,205, 59, 75,178, 69, 9, 69,110, 53,170, 85,194, 79,115,151,195,108,101,241, 60,
-221, 0,145, 68,226,231,235, 87,239,225,136, 73,211, 37, 83, 54,196, 97, 76, 39, 47,124,123, 53, 46,221,148, 45,157, 94,158,146,
-101, 89, 22,102,139, 77,148,173,201,247,208,233,141,174, 50,169,196,236,227,233,166, 41,233,183,150,114, 42, 90, 69,144, 75, 5,
-232, 29,230, 7,139,125, 40,204, 86, 6,127, 95, 56,248, 62,102,130,125, 3, 42,193, 96, 43, 70,174, 10,201, 86,113,210, 37, 84,
-250, 0, 32,130, 43,186,156, 10, 84,160, 2, 21,168,192,127, 17,222,185,234,208, 41,162,165,148, 75,193, 83, 82, 92,189, 23,135,
-208,186, 13,177,245,232,109,212,108, 16,134, 76, 61, 3, 30,100,153,171, 13,139, 48,245, 71,243,125, 0,247,251,244,145, 87,234,
-223, 63,176, 43,207, 11,207,173,255, 67,151, 6, 0,193,245, 29,102, 56,142, 7,207, 3, 60,231, 32, 92,206, 75, 58,130,228,196,
- 76, 93,213,106,126, 10, 60, 73,179, 91, 21, 18, 17,233,161, 16, 83, 62,110, 98,145, 72, 32, 0,203, 19,214,204,204, 56, 43, 1,
- 36, 57, 99,238, 77,215,161, 92,233,127,178,115,191, 37,234,164, 20,237,221, 90,121,166, 70, 90,187, 24, 60, 15,212, 10, 84, 32,
-234,230, 9, 54, 59,253,197,115,115,118,204,239, 37,217,226, 56, 80,118,134,195,195,120, 45, 10,140, 52, 10, 12,118,180,238,216,
- 91,212,186, 75, 31, 92,141,210,128, 99,104, 44,222,120, 66,207,242,244, 96,224, 41, 93,142,151, 38,111,221,143,174,164,206, 55,
- 74,132, 2, 65, 65,237,154, 85, 18,196, 34, 33,163,211,233,196,175,255,138,130, 66, 38, 70,158,129, 6, 0,186,188,181, 71,107,
-164,113,244,102, 22,142, 29,220, 5,153, 76, 6,254, 61,106,160, 72, 36,114, 23,138,164,176, 27, 29,238,194,162,143,253,141, 15,
- 41,144, 0,164,192,189,162,205, 86,160, 2, 21,168, 64, 5,254,139, 80,252,140,195,158,197,201, 23,233,148,106,194,241,240,246,
-242,132, 84,225,138,196,108, 59,244,132, 10,249, 38, 30, 44,235, 80,180, 74, 17,158, 74, 60,221,251,232,209,204,180, 35, 71, 52,
-155,143, 30,205, 44, 22,232,253, 74,201,122,249,205,241, 78,219, 36,120,246,252,209, 83,151,180,125, 90,250,120,144, 20,101, 22,
- 9, 73,171, 64, 68,217, 69, 2,146, 22, 9, 72,155,175,171,144,186,116,108,183,152, 39,112,169, 44,155, 22,139, 5, 93,186,116,
- 65,143, 30, 61,208,183,111, 95, 12, 26, 52, 8, 33, 33,117, 84, 36, 69,216,120,130,227,124,196,122,212,240, 33, 32,176,164,226,
-194,238,127,153,162,174, 31,126,200, 90, 45,189,241, 58,229,124,101,147,231,185, 60,173, 21, 22, 59,139,124,131, 29,249, 70, 59,
- 24,159,112, 28,254, 59, 3,102, 27,139,228,123,251,205,234,172,180,175,172, 57, 47, 18,203, 40,138, 31, 94,191,228,211, 62,255,
-108,164,218, 69, 74,190,104,219,170,185,218,219,203,147, 33,136, 87,202, 43, 65, 16,144,186,170,224,225,238,130,196,251,167,112,
-118,113,103, 51,128,159,157,201,207,226,112,149, 11,208,167,165, 31,122, 15, 24,138, 6, 97,221,157, 33,214,111,217,148,203,229,
-178, 34,245,170,248,182, 14,182, 98,170, 22, 91, 88,222,164, 64, 34,115,182,220, 63, 16, 21, 54, 43,108, 86,216,172,176, 89, 97,
-243, 63,199,230,127, 51,138,206, 56, 44,250,118,110,103,248, 34, 2, 84,221, 95,129,154,129, 10, 88,236, 42, 88,108, 44,140, 22,
- 22, 58,147, 29, 58, 19,141,196, 44, 19,162,142,126,120, 10, 29, 42,150, 99,235,115,222,177,223, 38, 88,142,119, 90, 61, 17,219,
-109,115,151, 45, 94,240,201,238, 38,141,109, 83,122,250, 7, 61, 74,180,101, 16, 4,105, 38, 41, 1,237,233, 34, 16, 62,123,246,
- 72,125,227,202,201,118, 82,134,253,212,129, 93, 93,197, 0, 0, 32, 0, 73, 68, 65, 84, 84,138, 29,134, 97,180,129,129,129,133,
- 74,212, 43, 10, 89,167,134,172,239,245, 19, 63, 4,183,239,179,216,103,197,252,169, 38,146, 18,113,132, 64, 20,197,210,230, 93,
-230,236,152,245, 40,133,126,144, 34,233,211, 91, 15,158,132,185,123, 6,225, 69,186, 17, 70, 11, 3, 59,195,193, 67, 41, 66,218,
-227, 51,246,196,103,119,247, 26, 50, 30,109,125,143,108,219, 25,251, 52,170, 82, 68, 68,247,143,195,194,194,169, 95,127,253, 5,
-161,161,161, 48,155,205, 32, 73, 18, 65, 85,107, 32, 49,246, 1,110,158,152,203,154,114,147,126, 7, 48, 7,128,186,188,255,137,
- 70,103,195,169,187, 57, 56,113,104, 15, 40,161,248,125,138,151,148,201,100,210,146,200, 85,113,210,245,242,199, 66,177,180,112,
- 18,192, 85,180,221, 10, 84,160, 2, 21,168,192,127, 9,198,189,241,189,193, 41,162,101,177, 88, 18,219,116,233, 13,142,227,193,
-242, 0,199, 22, 42, 79,220, 43,245,137,165, 45,137, 31,154, 58,142, 99,111,175,221,176,185, 71,147, 22,237,169,186,149,149,208,
-229,102,225,230,245,139, 12, 56,254,134, 51,207,231,230, 62, 55,200,124,107,126,252,201,192,254,251, 70,126, 54,161,160, 93,199,
-142, 10,149,202,207,154,150,158,102,218,178,125, 7,125,230,228,145,118, 28,152, 33,185,185, 47, 12,165,217,209,106,181,171, 74,
-186, 47, 17, 43, 91, 3, 8,166, 4,132,205,172,126, 94,174,136,112, 77,122,234,128, 5,115,103, 37, 13, 27,251,141,184,122, 96,
- 13,228,104, 41, 36,166,101,225,217,149, 35,214,244,216, 59,135,116,105,247,199, 56,105, 42,179,132,123,105, 0, 86,220,188,121,
-163, 94, 68, 68, 68,247, 78,157, 58,241,227,198,141, 3,207, 3, 23, 54, 76,228,243, 18,111,238,135, 67,197,138,127,207,114, 73,
-190,114,227,129,231,160,118,205, 4, 94, 46, 99,176,121,207, 73, 26, 60,151, 92, 78, 51,190,149, 42, 87, 21, 56,220,133,142, 45,
- 29,222,252,216,232, 87,241, 99, 34,165,175,192,132, 40,223,119,188,111, 5, 42, 80,129, 10, 84,160, 2,255,105,120,255, 24,173,
-212,167,142,253,180,254,221,208,103,229,140,216,186,117,219,188,109,219,119,183,182,216,108,129, 60, 68,169, 44, 99,187,108, 96,
-241,171,179, 54,204,217, 47,238,122,121,213,170,191,101,227,218,159,183,108,254,173, 61, 56,182, 54, 1, 36,241, 4, 46, 73,105,
-118,100, 89, 36,171, 84,178,164,209,255,209,245,227,165,230,220, 92,195,182,242, 62,107,206,141,201, 34, 41,123,208, 31, 43,231,
- 46, 33, 73,170, 27,203,114, 66,142,165, 95,176,118,203,191,204,234,152,163,112, 58,202, 13,121,165,252, 91, 52,128,232,200,200,
-200,182,145,145,145, 45, 0,172,130,227, 12,197,187, 31, 82, 46,214, 92,125,231,105, 83,167, 93,248, 14, 68, 21,142,227,193,176,
- 92,178,200,108,234, 92, 78, 51, 65,213,171,215,144,219,105,246,173, 0,248,226,129,240, 47,137,150, 91, 37, 57,128,160, 10,162,
- 85,129, 10, 84,160, 2, 21,248, 47,193, 56,188,189,105,169,115,138,214,255, 95,200,207,143,215, 35, 31, 83, 62,212, 78,110,238,
-115, 3,128,183, 86,238,153, 62,208,110,212,115,221, 1, 60,215, 29,120,223,231,141, 57, 9,106, 32, 97,228, 7, 38,195,153, 64,
-246,171,133,159,127, 4, 26,205, 83, 35, 52,104,249,161,197,178,115,199,246,103,187,119,239, 17,242, 36, 37,228,120, 74,196,240,
-132,144,225, 8, 33, 77,115,176,218,105,218,206, 48, 52, 88,198, 14,142,165,121,206, 78,195,177, 59,124, 5, 42, 80,129, 10, 84,
-160, 2,255,205,132,235, 63,135,104, 85,224,255, 52,226,227, 94,196,134, 85,100, 67, 5, 42, 80,129, 10, 84,224,255, 56,201, 42,
-254, 13,192, 17,123,254,174,149, 3,229, 57,204,247,125, 86, 31,156,175,176,249,193, 54,133, 0,196, 0,148, 0,202,114,105,118,
- 71,225,121,141, 21,249, 89, 97,179,194,102,133,205, 10,155, 21, 54,255, 31,218, 44,203,246,121, 84,224,223, 74,192, 42,108, 86,
-216,172,176, 89, 97,179,194,102,133,205, 10,155,255,123, 54,255,155, 49,174,132, 15,128, 10,215, 97, 5, 42, 80,129, 10, 84,224,
-127, 16, 94, 94,181,148,192,203,184,222, 50, 33,247,174,227, 11, 0, 38,205,211,236,138,220,171, 64, 9, 40,126,206,225,107, 49,
- 90,228,123, 26, 20,146, 2,241, 52,185,139,215, 83,133,155, 87,250,255,120,230, 18, 33, 85, 21, 95,118,109, 87,237,112,104,176,
-172,111,121, 30,148,251,132,252,233, 87,163,101,138, 66, 21,242, 37,252,155,200, 62, 36, 17, 10, 85,176,143, 50,168,217,117,151,
-192,122, 31,253, 27,222, 81, 82,183,110,221,240,186,117,235,134, 3,144,252, 19, 6,229,170,144,161,149,106,134, 93, 81, 85,111,
-124, 81,225, 91,107,224, 63,157, 96,165,127, 77, 47,101, 80,211, 3,202,128,134,249, 74,255,134, 58,101,165,166,151, 93,188,235,
- 84, 47,235,185,160, 62, 11,106,207,222, 21,181, 43,168,207,130,218, 37,253,187, 71,196,106,151,153,187,159,207,247,234,253, 47,
-101, 69,191,242,126, 8,106, 61,212,221,191,253,119, 94,229,125, 46, 48, 36, 44,186,106,189,182, 57, 1,181, 90, 70, 57,251, 76,
-165,208,240,251, 85,234,182,206,174, 20, 18,126,183, 34,231,157,131,212, 39, 56, 92,234, 81,249,132,196,163,242, 73,137,103,112,
-199, 15,181,231,239,239, 47,171, 93,187,118, 68, 88, 88,216,248,206,157, 59,127,221,184,113,227,113, 85,170, 84,233,246,255,114,
-162, 47, 87,133,252,104, 21, 18, 26,171,144,208,200, 85, 33, 63,150,221,191,134,206, 35, 72, 54,131, 32,217, 12,133, 42,116,222,
-127, 74, 89, 73,124, 67,170,200, 85, 33,203, 93,252,234,222,150,169,106,245, 46,239,243, 30, 30, 30,221,124,124,124,250, 21,125,
- 60, 60, 60,186, 85,180,128,247, 70,113, 21,235,131, 21, 45, 74, 40,145, 95, 27,246,217,228,250,139,102, 77,151,174,220,124, 24,
- 43,231, 79,125, 98, 53, 22,212,253, 79,124,115,239,224, 22,119, 41,146,170, 84,252, 30,203,177,105,154,132,219,205,254, 9,251,
-161, 85,101, 99,126,254,126,196,183, 67, 63,233, 82,165, 75,175,175,136,152, 4,243, 17,231, 41, 26, 26,237, 61,112, 40,232,202,
-165,139,171, 55,111,222, 48, 71,205,132, 46, 23, 74, 4,107,117,169,209, 5,229, 73,131,171, 79,245, 96,129,194,251, 74,155,190,
-147,253,238,157,223,177,149,181,113, 93, 77,154, 98,167,127,191, 63,124,106,212,168,209,156,162, 40,175, 47,191,252, 82, 4, 0,
- 43, 86,172,168,201,178,108,110, 92, 92,220, 29,188,199,230,167, 14,130, 25, 58, 98,213,146,217,219, 62,250,168, 7, 50, 52, 70,
- 44, 94,190,174,195,233,227,123, 7, 25,179,159,239,255, 39,202,196,221,189,154, 43, 68, 46,143,191,250,126,142, 42,162, 67,115,
-202, 96, 97,112,250,202,131,182, 59,214,205,185, 13,212,105,161,215, 60,125,231,158, 98,156, 73, 59,195, 87,201, 71,112, 38, 45,
- 0, 12,125,107,176, 87,210, 93,124,100,108,132,191, 68,240, 32, 23, 40,243,208, 71,247,170,173,207, 8, 37,146, 42, 36, 73,130,
- 36, 0,146, 36, 64, 17,132,227,156, 80,187, 57, 57,253,217,213,238,255, 9,237,196,165,114,139, 44, 80, 2, 47,146,120,149, 62,
-130, 44,252,230,121, 93,214,243,107, 94,255,192,127,227, 86,191,166,123,189,214, 53,141, 91, 46, 39,228, 41, 4,237,190, 62, 65,
-240,228,111, 41, 87,151, 63,116,138, 0, 72,165, 30,199,142, 29,243,137,136,136,112, 83,213,235,123,217,153,103,196,148,161,238,
-241,227, 71, 69, 17, 17,221,203, 81, 63, 67,186,130, 36,183, 19,128,144,227,248, 21, 20,199,239, 53,228,198,198, 1,229, 59,125,
- 74,166, 10, 29, 67,130,119,186,159,225, 64,220, 53,231,196,108,126,223,204, 21, 72, 92, 59, 11, 69,162,175,131, 67, 26, 52, 73,
- 79,122,113,215,104,208, 47,103,172,218,203,229, 54, 68, 51,211,206, 95,189,247,145, 64, 40, 36, 34, 58,183,164,172,192,197, 15,
- 41,116, 95, 95,223,126,107,214,172,169, 30, 30, 30, 14, 0, 96, 24,198,117,223,190,125,126,115,231,206, 85,196,198,198, 30,124,
- 79,179,129, 62, 62, 62,149,197, 98,113, 32, 0,216,108,182,116,181, 90,157, 2,160,204,137,191,194,183,186, 55,120,204,185,122,
-229,138, 0, 0,218,182,109, 55,175,114,155, 47, 60, 40,145,210, 92, 98,118,216,244,138,130,184,139,223,220,188,117,131, 0,128,
-176,150,225,211,229,222,117,214,254,191, 84,182,164,170,208,150, 36,240,109, 88,219, 46, 3, 6, 15, 25, 65,214,171, 85, 25,221,
-186,118,250,193, 12, 28, 43, 87,157, 17, 8,100,183,111,223,174, 65,146, 36,197, 48,140, 37, 44, 44, 44,229, 67,210, 21, 16, 18,
-254, 55, 1, 50,200,206,216, 54,170,227,239,206,195,219,155, 78, 83,110, 65, 77,126, 6, 37, 24,203,113, 92,170, 62,229,110,171,
-255,131,138,214,219,249, 92, 94, 75,164, 64,252,245,208,209,147,234,127,243,221, 79,210,175, 86, 70,226,196,186,233,154,255, 84,
-146, 5, 0, 20, 73, 85, 58,115,246,140, 74, 46,166, 0, 0, 6, 11,131,143, 34, 34,202, 30, 17,170,182,184, 68, 18, 68,104,209,
-129, 54, 44, 99,151, 10,132, 98, 11,225, 32, 72, 32, 0,120, 7, 84,141,244,101,174,201,135,126,210,165,202,246,221,231,210, 82,
-210,114,203,221,169, 17,148, 8, 97,237,186,161, 75,215,238,110,183,111,253, 61,103,195,239,235,127,100,236,244,122,142,230,150,
- 91,242, 94,100,148,217,153,251,213,106, 42, 86,122,159, 30, 48,126,174,151,133,244,196,175,243, 87,121, 95, 57,181,243,114,122,
-106, 35, 46, 57, 57,213,194, 19,196,147,252,188,204,175,141, 89,113, 49,206,102,153, 82,169,172,174, 84, 42, 27, 53,108,216, 80,
- 58,117,234, 84, 97,135, 14, 29, 94, 81,246,113,227, 68,151, 46, 93,242, 95,186,116,105,143, 71,143, 30, 89, 12, 6,195, 67,131,
-193, 16,143,114, 4,218,251,249,249,124,241,113,255,222,232, 52, 96, 50, 88,142,192,184, 73,223,224,204,169,131, 19, 0,252, 35,
- 68,139,150,187,206, 29, 59,126,170, 79, 88,243,198,212,156,157, 49,144,137, 5,232,222, 44,148, 24,253,229, 12,247,205,171,231,
-108,130, 6,237, 75, 82,178, 56,147,118, 70,125,111,219,144, 62,225,193, 56,186,203, 54, 4,157,191, 7, 41,119,155,151,122,244,
-167,103, 0, 80, 61,226, 75, 23, 9,171, 94, 19,224, 78,169, 36,172,122, 77,245,136, 47,207,199,159, 94,163, 47, 45, 45, 66,137,
-164,202,174,157, 59,107,121,184,136, 32, 32, 9, 80, 20, 1, 1, 69,194, 98, 99, 49,232,147, 33,255, 88, 53,151,169,106,245, 32,
-129,209,142, 1, 27,127,154,115,158,159, 44, 79,153, 16,148,200,235,248,209, 67, 2,149,155, 4, 20, 69,128, 34, 1,138, 36,144,
-148,109,198,152, 49,163,221, 62,148,176,127,212, 90,213,124,218,224,208,238, 97,245, 61, 27,238,185, 65,184,133,125, 52,216, 75,
- 99,145,143,218,125,228,226, 16,190,237, 55,183,120,158, 91,146,118,109,213,217,210,140, 88,173,214,236,238, 17, 31,185, 18, 2,
-133,252,252,225,173,237, 4, 36, 1,154,229,193,176, 60,216,194,179, 81,137,194, 25, 12, 73, 18,224, 57, 30, 99,199,142, 65,247,
-136,143, 76, 28,195,165, 57,223,201,145,219, 79,159,191,238, 99,165, 57, 44, 93,179,121,142, 81,171,158,147,240,204, 43,201,160,
-213,124, 99,206,121,238,244, 57, 24, 36,248,102,169,241, 81,227,119, 30,191,137,250,117,235,128,229, 28,233, 12,173,164,192,206,
- 19, 55, 81, 59,180,182, 35,221, 28,143,144, 32, 37,154, 55,107, 14, 0,239, 69,180, 4, 18,151, 95,219,247, 28, 49,187,215,160,
-207,160,242,241, 1,201,211,189,206,159,216,217,235,207,223,150, 76, 99, 44,186,165,229, 50,198,179, 47,199, 5,158,227, 62, 88,
-117, 10, 8, 8,240,105,222,252,213,118,140, 12,195,160, 90,181,106, 72, 79, 79, 15,125,159,121,154,191,191,127,207,153, 51,103,
-170,122,244,232, 33,244,243,243, 3, 0,100,101,101, 5,158, 62,125,186,201,204,153, 51,115, 50, 51, 51, 79,160,148, 29,125, 88,
-154, 20,145, 2, 80, 82,169,220,241,142, 32,200,169, 95,124,218,208,215, 63,192, 90,210,239,213,234, 44,241,247,147, 47, 18, 2,
-129,168,240,247, 32,121,158, 35, 74, 81,137,186, 8,133,194, 18, 61, 20,118,202, 53,140, 23,186,125, 78, 82,164,163,178, 50,180,
- 58, 63,229,126,157,114, 40,113,245,132, 98,209,250,143, 7,127,214,106,224,128,190,240,247,113,195,249,107,143, 48,225,139,111,
-105,198, 78, 47,127,175,206,131,162, 4, 57, 57, 57, 73, 30, 30, 30,126, 31, 62,222, 18,193,231,206,156, 82,157,191, 16, 57,125,
-217,202,213, 19,237, 54,134,230,120,254,229, 57,198, 50,153, 68,216,181,215, 39,174,170, 26, 97,210,213, 51, 63, 23,254, 31, 84,
-180, 54,252, 35, 68, 75, 44,115,249,228,151,239,191,148,206,221,113, 19, 39,214, 77,208,152,116, 26,159,151, 51, 5, 87,247,251,
- 70, 93, 65,147,247, 73,161,210, 39, 36,156,160, 4,227, 9,138, 82, 16, 36, 33,230, 88, 46,149,177,217,230,153,115,159,127,240,
-166,149, 28,199,227,192,223, 57,229, 35, 64, 60,106,110,223,115, 72,229,235, 46,129,197,206, 98,240,208, 17,216,182,109,155,139,
-143,155, 24, 22, 27,131, 37,203,150,233, 13, 73, 39, 84, 73,169,249,233, 93,122,127,123, 54, 62, 49, 39, 42, 37,211,178,183,188,
-105,179,218, 89,232, 76, 12, 76, 86, 18,181,234, 53,199,146,229,181,165, 41,201, 9,223,110,253,115,211,148, 39, 79,168,109, 28,
- 69,206,182,100, 62, 77, 45,177,209,249,213,239,238,234,225,181,171,255,248,249,238,207,115, 4,224, 97, 71,156,171, 20,159,140,
-154,226, 90,221, 79, 6,133,148,114, 79, 72, 78,247,159, 58,109,218,181,120,150,111,161, 83,199, 39,148,149,158,170, 85,171, 14,
-232,213,171,151,252,187,239,190, 19, 6, 5, 5,225,207,157,251,170,180,237, 62,168,119, 70,102,118, 16,207,243,240, 85,169, 82,
-199,142, 30,116,236,228,201,147,201,169,169,169,194,197,139, 23,183, 60,116,232, 80,221,172,172, 44,167,103,166, 44,207,195, 98,
-101,193, 22, 14,144,106,173,181,220,252, 52, 48, 48, 80,146,158,158,110, 45,166, 50, 16,175,132, 66,162,123,231,246, 45, 5,127,
-156, 74,132,193,194, 66, 33, 21, 34, 49,219,132,102,141, 27, 16, 27, 89,166, 81, 73, 6,199,124,210,115,134,175,146,143,232, 19,
- 30, 12,149,135, 28, 91,214,206,199,209, 27, 9, 17,217, 6, 2,107,120,106,188,191, 68,208, 85,193,101,174,233,208,172,134, 95,
-167,166, 85,112,167, 89, 13,191, 43,247, 98, 98,101,131,150,125,153,110, 16,158,207, 63, 61, 69, 95,114,199, 67,194,211, 69,132,
-205,103,146, 33,151, 10,160,144, 10,160,144, 56,190, 73,146,248,176, 89,173,127,157, 32,138, 99,199, 80,148, 96,204,144, 79, 6,
- 5, 12, 27, 50,136, 7, 69, 98,223,129, 99,125,119,236,216,158, 73,219,109,155, 88,146,218,252,174,250,243, 90,134,146,128,202,
- 77,140,105,155,162,224, 42, 19,194, 69, 46,132,171, 92,136, 78, 13,125, 64,145,239,157, 68,143, 9,125,171,247,152,208,191,106,
-199,208,202,202, 90, 15,227,180, 79,198,204,187,187,242, 82, 65,199,175,215,174,168,235,101, 40,176, 9,126,157, 58, 86,144,150,
-145,209,113,223,177,203,157, 88,219,103, 49,140,221,248,147,250,209,190, 18, 85,225,180,152, 27, 77, 2,195, 6, 74,237, 6,250,
-241,195,152,180, 26,249, 86, 9,162,147,116, 80, 72, 5, 80, 22,229,173, 84, 0,133, 84, 8,165, 84,128,140,180, 68,228, 25,169,
-107,233, 94,100, 71, 92,190,193,148, 39,225, 22, 59,139, 7, 9, 6, 84, 13,109, 12,127,255, 0,216,122, 12,175,122, 43,242,192,
-145,219,151, 15, 47, 52,101, 61,251,201, 89, 59, 59,143,223,196,244,111,198,223, 35,128,251,133,131,116,147, 95, 23,173,107, 58,
-103,250,228,215,238, 77,157,189,186,233,251, 43, 89, 46, 51, 58,245,159, 52,187,109,215,254,208,231,101,227,239,179,123,209,189,
-215,199, 24,254,217, 87,112,119,247, 94,178,124,222,247, 15, 25,171, 46,242,173, 62,215,175,118,155, 6,245,235,236, 8, 12, 8,
- 8,226, 56,199, 41, 31, 60, 15, 24,244, 90,124,255,245, 88,112, 60,143, 70, 77, 90,116,146,182,237,202,243,133,167,129,104,114,
- 53,198,152,103, 79,186, 88,114, 98,110, 57,157,151, 22, 11,173, 86,171,241,224,193, 3,196,198,198, 34, 58, 58, 26,185,185,185,
-112,115,115, 51, 24,141,198,114,137,247, 13, 27, 54, 28, 22, 25, 25, 41,245,240,240,120,121,211,102,179,193,197,197, 5,195,134,
- 13, 19,118,235,214, 45,176,103,207,158, 35,163,162,162,118, 2,208,149,152,158,188, 23, 25, 46,190,161,191,183,239,208,126, 34,
- 0,200, 92,253, 19,214,252,121, 44,186,212, 9,173, 91, 64,149, 86,173, 90,215, 0,207,131, 0,191,202,148, 27,155, 85,138, 74,
-164,184,121,243,102,117,138,162, 4,175,198, 32, 14,191,109,217, 83,251,220,213,199, 3, 22, 45, 89, 42,117, 85, 72,160,214,218,
-240,249,240,254, 78,143,193, 50,223,208, 30,173, 90,181, 59, 50,103,246, 47, 2,165, 66,129,179,183,226,241,229,215,211, 44,153,
- 73, 81, 75,121, 78,184,206,164,142,205,249,192,161,146,199, 63,128, 90,149,148,112,233,211, 93, 58,225,211, 62, 82, 27,205,162,
-192, 72,195,106,103,193,114, 60,180, 70, 26, 79, 82,244,240,118, 45,255, 81,110, 60,207, 55, 7,224, 3, 64, 77, 16,196,157,226,
-215, 69, 19,186, 34,110,252,198,181,166,112,124,240, 2, 96,131, 99,165,254,203,234, 83,120,253,174,251, 69,207, 63, 1, 80,167,
-208, 38, 11,224, 54, 65, 16,249,239, 32, 91,111,169, 92,130,227,199,143,243,189,122,245,122,217,227,191,121,253, 38, 36, 34, 97,
-128,194,205, 7, 60,255, 20,197, 15, 48, 86,249, 5,230, 46, 93,190,210,243,139, 73,227,147,117, 5,121, 85, 10,111,159,119,102,
-176, 16, 16,212,242,246,173,195,186, 77,156, 52, 9,161,213, 43,137, 88,150,229,163, 98, 19,232,173,155,183,140,186,114, 67,188,
- 82,151, 22, 53,163,152, 4, 89,174,101,159, 44,199,166,189,169, 96,177, 28,251,230,236,246, 45,155, 4, 1,184, 43,197,248,253,
- 84, 34,120, 30, 32,192,195, 77, 33,196,238, 75,105, 72,184,119, 80,215,171,145,206, 56,108,209,172, 78, 29,123, 76,137,124, 18,
-103,217,155,147, 99, 57, 3, 32,171, 52,155, 37,119,232, 28,172,118, 22, 52,195, 96,255,177, 99,136,232,212, 18,173, 90,181, 68,
-187,182,173, 4,119,239, 61,250,108,210,196,177, 65,120,181,186,227,165, 77,169,111,205,230, 74, 55,239,189, 3, 38, 46,118,121,
-156,198, 64, 64, 1,193,126, 50,120,186,136, 96, 99, 8, 36,169,237,133, 45,199, 29, 95, 78,157,237, 57,253,219,137, 39,117,106,
-113,125,224,169,189,180,119, 55,153, 76,226, 17, 35, 70, 8,105,154,182, 15,251,252,171,110, 89, 89,234,190,191,173,250,151, 68,
-165,242,133,201,194,224, 94,244,139, 58,115,230,204, 14, 62,118,250,210,225, 89,211, 38, 28,137,136,136,112,219,179,103, 15, 87,
- 86,126,190, 54, 67,204,214,172,221,178, 99,255,182, 21, 75, 23, 32, 38, 57, 31,155,255, 88, 7,158,101,126, 47, 35,171,138,219,
-228, 71,140, 24, 33, 59,124,248,112,165,180,180, 52,157,201,100, 82,191,166, 71,144,132, 32, 59,207, 4,111, 23, 49, 68, 2, 18,
-190, 30, 82,168,220, 36, 16, 82, 0, 73, 16,108, 73, 54, 55,239, 61, 49,143, 51,105,113,116,151,109,200,150,181,243,241,217, 23,
- 63, 35, 74, 35, 62, 77,202,221,230, 77, 30, 50, 96,186,143,140,141, 8,112, 39, 85,157,154, 86,133, 66, 42,194,143, 83, 70,160,
-197,189, 36, 85,122, 1,247,179,218, 76, 53,158,125,250,229, 97,221,231, 95, 23, 71, 28, 10,150,139, 92,136,211, 59,150,228, 24,
-181,106,109,145, 75,206,102,181, 36, 59, 89,141,207,151, 48,179,157,222,184, 65,189,249, 19,199,141, 33, 91,135,183,224, 73, 82,
- 8,141,222, 70,240, 60,240,245,151, 19, 48,121,194, 88,191,212,140,156, 95,215,173,251,125, 70,228, 57,126,174, 81,253,108, 86,
-105, 54, 73,194,161, 2, 41,165, 2, 40,101, 14,226,162,148, 10, 96,177,177, 32, 8, 80,238,149,155,104, 9,135,146,155,145,151,
-252,206, 25,248,107, 54, 61, 43,215,187,112, 46,193,165,118,254,222,252, 27,137, 25,209,243,238, 61,202,190, 13, 32, 47,168,157,
-251, 72, 59,195,195, 96, 97,144,152,109, 2, 99,231,137,207, 62,170,130,106, 3,137,208, 5, 91,238,111, 59,245, 8,174,197, 58,
-253,215,108,166,223,220,111,241,170,223,127,240,138,213,127,220, 89, 58,255,103, 74,163,181,129,227,121, 72,197, 20,100, 98, 65,
-225,135,130,217,168,197,186,245, 27,179, 24, 16, 3,112,249, 50, 83,158,250, 9,142, 31,222,191, 71,187,221, 4, 32, 38, 72, 81,
- 90, 64,149,170, 85, 58,247, 30, 37,237,220,103, 4, 88,198, 54,253,222, 85,254,162, 41, 39,230,130, 51, 54,235,215,173, 3, 2,
-184,111,204,137,157, 0, 0, 10, 85,200,239,181, 67,107, 55,125,243, 94,205,154,161, 77,157, 41,247,151, 74,169,212,229, 11, 15,
- 79,159,159, 67,235, 53, 86,101,231, 91, 9, 23,175, 74, 72,124,254, 0,187,214,255,186,157,179,216,102, 95, 56,177,119,254,202,
-205,135, 62,233, 28,209, 31, 91,126,251,215,143,185,153, 47,137,214,249, 98,106,213,240,173,155, 54, 4, 9,197, 18,208, 12, 7,
-154,229, 29,223, 12,139,188,188,124,208, 12, 7,169,220, 5, 12, 71,128,102, 57,208, 12, 7,171,141, 81, 76, 24,209,115,146, 5,
-184, 85, 82, 58, 3,107,183, 63, 35,146, 72,170,240,112,156, 93,203,243, 60, 18,179,204,164,191,191,255, 78, 0,144, 72, 36,144,
- 72, 36,224, 56, 14,247, 98,212, 95,120,135,134, 76, 68, 33,193, 99,237,182,228,130,164,235,221,223,245,238,126,126,126,189,223,
- 36, 89, 22,139, 5, 6,131, 1, 87,111,220,113,219,180,109,127, 68, 98,114, 90,117,142,119,179,186,168,170,119,215,231,196,247,
-126, 87,126,234,179, 99, 38,185,134,141, 37,191,155, 60,178,230,234,173,199,111,191, 56, 51,175,212, 56,173,106,157,127,176,125,
- 55,254,227,102,139, 86,109,126,158,127,253,247,111,202, 42, 35,129, 64, 32, 84,171,213, 47,219,247,154,141,187,154,221,143, 73,
-239,183,114,197, 74,233,189,120, 61, 30, 39,102, 96,100,151,202,142, 25,142, 19,229,174,240,173,238, 29, 92,163,198,206,117,171,
- 22, 9,158,103, 88,176,246,224,109, 68, 30,249,253,106, 86,206,173, 8,100,103,154,223,167, 15,249, 7,136,214, 59,109, 94,124,
-164,129,193,194,192,106, 99, 64,115, 60,116, 38, 26, 57, 5, 54,232, 76,118, 24,204, 12, 70,118,173, 92,226,115,101,240, 17, 31,
-130, 32,142,243, 60,223,139,231,249, 46, 0,196, 69,215,142, 49,155, 56, 94, 72,200, 94,187,158, 62,125,250, 79, 11, 23, 46,140,
- 46,250,109,209,253,162,223,150,118,191,216,243, 94, 63,254,248, 99,253, 69,139, 22, 45, 8, 15, 15,223,253,247,223,127, 39, 0,
-200,119,214,125, 40, 40,254, 50,199,143, 31, 47, 43,163,171,219,105,187,196, 85, 38, 68,112,181,202, 24,253,211, 22,239,191, 22,
-141,201,145,138, 5,212,169, 83,167, 60,115,109, 74,144, 36,229,244, 20, 69,233, 83,171,149, 72, 36, 62,177,108,217, 50, 12,233,
-221, 86,150,162,161, 13,143, 82,204,217, 70, 27, 24,149, 79,136,120,222,130, 69,202, 69,139,151, 76, 62,126,148, 43, 48,100, 63,
- 89, 82,178,139,175,217, 93,138, 40, 22,131, 69, 16,224, 57, 54, 45, 63,233, 78, 51, 0,248,144, 88, 44,131,133, 6, 85, 24, 91,
- 67, 16,128,201,194,128,162,136,156,130,152,189, 79,134,205,157,215,105,251,238,115, 25, 60,233,174, 55, 26, 19,229,112,156, 57,
- 88,110, 88,108, 44,172, 52,139,232,135,247,208, 46,172, 46, 90, 53,171, 13,147,133,133,201,202,160, 90,141, 80, 0,240, 46,177,
-224, 40, 50,129,103,105, 11,207,179, 46,189,154,251, 64,229, 46,134,191,135, 4, 18,177, 0, 52, 3,152,109, 28, 44, 54, 22, 73,
- 57,102,232,205, 50, 52,104, 63, 40,216,203,255,174, 53, 43, 73,118, 56, 47,229,238,128, 82,201, 41,203, 98,235,206,253, 53, 51,
- 50,178,251,158, 60,188, 67,162,214,209,120,148,100, 68, 78,129, 21,160,124, 48,115,193, 90,201, 15,223,140,235,183,117,215,129,
-228,206,109, 91, 38,151,247,157, 77,234,152,237,123,247,237,255,189, 87,175,126,178,232, 91, 39,241,252,193,133,249,198,156,114,
-197,103,145,141, 26, 53, 98,198,141, 27,167, 95,176, 96, 65,208,209,163, 71,171,169,213,234, 7, 0,104,119,119,247,218, 33, 53,
-171, 60, 60,123,250, 84, 96,207,126,131,132,105, 26, 51,220,228, 34, 84, 81,201,113,227,234, 25, 90, 44, 22,150, 24,111, 82,232,
- 30, 28,138,206,223,227,232,141,132,136,232, 92,233,165,177, 99, 70, 38,159,189, 18,147,187,102,219,217,127, 5, 42,233, 7, 82,
- 78,189,230,110,179, 26,126,211,191, 28,129,133,171,183,227,242,189,152, 28, 35,233, 63, 63,211,202,156,123,183,148, 14, 8, 40,
- 2, 46, 50, 33,140, 58,181, 54,238,254,233,144,127, 72,166, 30,121,246,240,118, 50, 79, 79, 35, 85, 99, 33, 50,242,244, 96, 57,
- 30,238,114, 17, 24,142, 71, 65,158,134,216,177,125, 27,238,220,185, 65,130, 34, 63, 7, 48,171,212, 12, 37, 28,174, 66,165, 84,
-232, 80,132,100,142,111,154,229, 16, 90,179, 6, 54,172, 89,238,234,173,242, 69,155,118,206,199, 70,187,120, 85,105,180,251,207,
- 53,184,244,247,253, 14,151, 87,174,109,174, 12,240, 89, 77, 16,236, 82,240,176, 88,237, 44,180, 5,249, 16,219, 82,209, 34, 80,
- 13, 79, 57,139, 36,157, 63,162,178,158, 43,203,234,240,115,163, 14, 61, 32,248,126, 51,246, 31,139, 92,216,189,107, 7, 68, 37,
-233, 32, 19, 11, 32, 21, 83,144,138, 41, 8, 9, 22,203,215,255, 78,231,107,245,189,114,163,143,104,222,163,126,158, 47,156,253,
- 58,200, 29,107,240,217,190,122,198, 95, 99,191, 95,220, 61,162,255, 40, 34,234,206,197,159, 76,192, 5,231, 38,122,188, 83,247,
- 56,206,249, 49, 78,234,226,189,106,202, 15,243,166,116,235, 53, 8, 20, 37, 0, 77,211, 56,176,103, 59,254, 92, 59,243,153,205,
-144, 59, 10, 0,103,203,161,198,237,221,190,126,208,247,191, 46, 39,234, 55,106,209,242, 98,230,219,199,209,114, 20,241,199,167,
- 99,198, 15,246,245,245,117,121,165,104,241, 8, 9,173,139, 30,125, 62,198,153, 35,135,240, 36,250, 17, 56,222, 65,152, 56,142,
- 71, 65,126,110, 22, 67,219,182,190,211,227, 33,149, 86,217,242,231,182, 90, 36, 73,188, 60, 64,254,155, 73,163,109, 19,190,254,
-169, 77,143,110,237,163,197, 20,116, 73, 41,153,238, 55,238, 63,109,192, 9,149, 65, 99,166, 46, 23, 89,172, 44,180, 38, 26, 39,
- 55,191,155,235, 72, 61, 42,135, 87,109,218, 99,204,132, 95, 54, 72, 36, 20,105,175, 23, 18,148,208, 62,172, 94,106,229, 0,111,
-253,156, 69,107, 91, 92,187,117,191,199, 39,195,198, 72, 71,214,110, 74, 4,120,201, 92, 70, 15,235,223,144,101,236,159,154,242,
- 82,223,185,191,160, 80,238, 81, 80,185, 90, 77,211, 43,197, 40,228, 32,193, 35,248, 53,230, 65, 32,193,156, 29, 59, 0, 0,252,
- 3, 42, 91,132, 18, 87,125, 57, 20, 24, 30, 0, 86,111,220,213,236, 97,108,198,216, 21, 43, 86,202,239,197,235,241, 32, 94, 11,
-137,136,132,157,230, 64, 56, 41,106,115, 60, 53,254,231, 31,167,187,230, 27, 89, 92,122,164, 70,244,221,139,188,205, 96, 25, 38,
-103, 92, 7, 64,229,242, 41,128, 26, 0,226, 8,130,255,195,152,237,119, 4,184,204,148,183,222,115,156, 99,190,236,234, 83, 61,
-152, 21, 72,122, 8,197,138,112,130,224,235, 17, 60, 60, 0, 62, 61,175,112, 76,117,150,169, 25,179, 99,177,120,193,175, 88,181,
-233, 16, 50,114, 45,112, 99, 83,113,100,243, 60,124,183,112, 39,204,214,119, 71, 53,148,197, 71, 74, 34, 70,111, 18,174,162,191,
-139,126,183,112,225,194, 94,111,148, 77,175,119,148,217, 91,191, 43,122,126,209,162, 69, 11,138,253,187,201, 89,146,245,146,104,
- 21,189, 84, 25,100, 43,196,199,191,202,223, 71, 14, 31,244,200, 55,216, 33, 21, 81,168, 92,173, 38,102,173, 57,226,243, 81, 51,
-111,104,236,110,216,181, 97,105,158,197,164,223,227, 84,103,161, 10,109, 41, 83, 42, 78, 30, 60,112, 8,213, 43,171, 68, 59,174,
-230, 37,222, 79, 48,191,148,122,117,234,100,113, 53, 87,147, 96, 64,255,254,242, 11,145, 23,191, 54, 0, 37, 18, 45,138,160, 42,
-109,220,118, 64,229, 34, 19,130, 32, 0,189,153,193,216, 79, 63,254,240, 97,140,231,168, 49,163, 70,130, 40, 36, 89,186,220, 44,
-252,244,195, 36,139,130,126,254, 36, 37, 41, 37,189, 75,239,239, 46,232, 12,132,101,240,136, 73,119,158,196, 46,204, 55,153,222,
-239,144, 31,171,141,133,213,206, 33, 62, 62, 14,223,140,236, 10, 33, 69,130,162, 56, 71,176, 52,243,238,202,104,200,136,205,131,
-159,104,224,246,101, 95,108, 12,240, 85,121, 41, 21, 50, 94, 41,151, 16,245,106,215, 18,133,133,181, 18, 87, 11,109, 40,186,250,
-212,140, 20,181, 25, 9, 25, 90, 72,124, 27, 11,134,116,250, 8,219, 87, 78,237,144,151,114,151,196,219, 65,138,175,225,220,165,
-155,189, 55,173, 95, 33,201, 46,176,227, 89,138, 1, 89,249, 22,100,230, 91,145,149,103,129, 82, 38, 68,187, 62,227, 36, 39,142,
-252,209,187,115,219,150,171,223,231,189, 19, 18, 18, 79, 36,165,103, 14,106,216,164, 5,182,255,245,103, 91,119,247,106,174, 5,
- 5,137, 58,103, 75,103,222,188,121,226, 69,139, 22, 9,214,172, 89,163, 11, 11, 11,243,251,241,199, 31,187,231,228,228,220,174,
- 90,181,106,232,153,131, 91, 35, 27,183,235,219, 28,156,221,167,109,251,142, 34, 9, 39,192,217,227,199,237,123,247,236,200, 53,
-155,245, 19, 74, 37, 28,114,183,121,217, 6, 2, 62,129,129,209, 74, 49,219, 85, 64, 22,196,230,159,158,178, 45, 31, 56, 88, 61,
-226,203,243, 23,239,198,196, 54,187,151,164,138,188,247, 34, 39,207,100, 15,137, 63,253, 93,169, 29, 47, 69, 16, 16, 82, 36, 92,
-100, 2,144,133,189,170, 50,160,225, 11, 16,132, 79,145,114, 74,128, 40,252, 6, 8, 2, 25,249, 41, 15,156,136,217, 32,120,142,
- 7, 98,210,140, 48, 88, 28,210,124, 37,111, 57,212,217,105,248,109,245, 86,220,191,123, 7,221, 62,234,131,117, 27,119, 96,236,
-167,131, 44,101,205,126, 72,178, 80,209, 42,166,102, 41,101, 2, 0, 4, 10,140, 52, 14, 92, 75, 69,141, 96,210,233,129, 1, 0,
- 92,148,114,104,245,102,144, 34, 23,196,221, 59, 41, 63,117,241,214,143, 51,230,174,152,150,159,249, 40,229,197,227,171, 8,245,
-214, 34, 56,208,142,232, 44, 87,220,205,173,134,208,154,213, 65,138,238, 56,101, 91, 19,221, 96,241, 17,242, 64,175,102,141,235,
-134, 87, 81,185,195,108, 99, 11, 85, 45, 10,127,110,217,134,164,196,180, 49,185, 79,142,220,255, 39, 24,173, 49, 39, 65, 45, 81,
-213,156,252,248,214,133,132,254,195, 38,195, 63,176,114,163,130,148, 7, 78,135, 45, 56,115,143,117,146,104,137,228,238, 63,126,
-243,243,191,166,116,235, 57, 16, 55,175, 94,192,131,232, 56,180,108,217, 28, 31,245, 27, 2,189, 46,175,246,190,109, 43,187, 50,
- 38,253, 25,129,132,153,210,162, 85, 39,130, 99, 89, 60,127, 22, 21, 87,146, 45,115,102,204,131, 27,153, 49,174,175,185,167,188,
-107, 55, 82,186,121, 62,176,218, 89,164,167,167,225,250,223,151,154,152, 51, 99, 30,148, 39,191, 36, 34, 10,103,239,231,192, 94,
-120,134,105,187,246, 93,109, 34,210,218,118,254,138, 45, 97,153, 25,153,164,194,213,155,243, 12,172, 35,242,151,216,173, 15,227,
-181, 34, 59,205,161,122,128,162, 84,155, 62, 1, 53, 23, 76,157,250, 77, 29, 74, 36,131,222,104,181,101,102,164,251,109,216,117,
-209,240,244,217,227,192, 74, 42, 55,215,127,173,252, 67,164,179, 16,200,209, 90,145,167,215, 17,195,198,127, 31,176,105,237,194,
-225,165, 17,173, 18,194, 69,130, 79,156,189, 90,219,195, 69, 68, 24, 44, 12,151,171,179,179,195,250,125,216,162,203, 66,146, 53,
-110,197,242,149,242,251,241,122, 60,140,215, 66, 42,162, 32, 22,145,176,209, 28,156,108, 78,164,159,202,111, 66,171,102, 13,112,
-230,129, 6, 20, 69,194,172,207, 55, 9,144, 27,219,172, 67, 55,121,211, 22, 97,232,216,161, 61, 94,196,198, 84, 62,126,244, 64,
-231, 27,215, 47,103, 49,246,144, 47,140,234,216, 67,229, 18, 22, 76, 38,138, 22,251,141,246, 15,172,218,122,192,144,209,110, 85,
- 42, 7, 18, 42,111, 47, 48,188, 0,227, 62,253,216,233,150,239, 32,230,192,162,185, 63,194,106,181,193,199, 93, 12,158, 7,182,
-172,158, 5,155,205,134, 0, 47, 9,180,198,119,159, 38, 87, 22, 31,121,151, 10, 85,174,216,147, 98,100,172,180,251, 4, 65, 28,
-159, 62,125,250, 79, 0,248,233,211,167,255, 84,116,189,112,225, 66, 51,128,140, 50, 92,135, 27, 94, 35, 90, 69, 47,247,238,214,
- 45, 10,245,246,242,191,113,246,204,105,183,195, 15, 57,220, 60,116, 23, 61, 91,250, 67, 36, 32, 33,119, 11,192,195, 68, 45, 78,
- 28, 92, 95,112,100,247, 31,233, 86,171,117, 73,217,190,230,154,205,148,114,197,153,191,182,239,225,188,189,188,200,223,206,170,
-227,115,245,204, 75,151, 86,236,173,163,220,221, 51, 27,252,121, 16,167,165, 82,105, 77,155,205,230, 81, 86,193,110, 57,155, 92,
- 24,196, 75,252, 19,125, 43, 8,138, 98,183,239,216, 14,111, 87, 49,172, 52,135,233,211,190, 50,143,236,166, 44, 24,246,201,144,
- 78, 29,123, 76,137, 20, 42,106, 93,104,213,164, 22,223,184,113,227, 2,138,162,156, 10,165, 80,169, 84,179, 72,146, 28, 42, 22,
-139, 93,108, 54,155,222,198, 89,228, 70,139, 13, 22, 59, 96, 50, 89, 32, 20, 57,200,162,144, 34, 96,182,216, 96, 50,219, 74,111,
- 24, 89, 81,215, 0,132,232,138,105, 74, 23,158, 86, 23,239,220,119,228,171,129,159, 12,158, 17,216,168,159, 50, 49, 83, 11, 17,
- 97, 71,243, 58,254,184,120,250, 16,159,150, 20,251, 77, 89, 36, 11, 0,114,212,121, 65, 62, 62,190,184,159, 96, 64,122,174, 25,
- 89,133, 36, 43, 51,223, 10,189, 89,143,134, 85, 2, 80,160,213, 6,189,119,254, 2,135,206,156, 57, 51,168, 71,223,193,152, 50,
-109,118,155,205,235,151, 62, 82,136,133,159, 25,179,159, 95,114,134,104, 69, 69, 69,229,253,240,195, 15, 53, 54,110,220, 72, 14,
- 31, 62,220,220,160, 65, 3,233,136, 17, 35,218,108,219,182, 77, 42,151, 75,205, 15,175, 30,157,241,249,151,211,251,110, 88, 53,
-175, 81,126,126, 62,193,208,244, 41,123,126,254,116, 67, 25,100, 46,245,232, 79,207,102,198,219, 71,117,109,235,115,212, 83, 78,
-214,147,240,182, 33,168, 51,107, 15,158,206,178,199,159, 94,163,151, 13, 90,246,101, 70, 1,247,179,133, 84,205, 47,139,100, 1,
- 0, 73, 17,176, 49, 44, 92,100, 66,144, 36, 89, 68,226,253,255,220,115, 74,238,227, 38,134,144, 34, 33,160, 8,232, 76, 52, 52,
- 58, 59, 38,143,118,118,135, 16,158, 99, 88, 30,102, 27, 3, 83,225,236, 80,175,211,224,199,105,223,226,163,222,253,241,249,132,
-111,145,111, 6,238, 38,232, 97,167,233, 50, 27, 5, 73,144, 48, 89, 25,124,214,173, 10,242, 12,118, 24,205, 12,108, 12, 7,185,
- 88, 0,161,128,132, 66, 42,128,171, 92, 8,240,188,168,168, 51, 17, 10,133, 22,154,166,183,151, 50,163, 71,181, 32, 95,152,105,
- 18, 45, 6, 47, 69,151,240, 16, 68, 95, 59, 32,184,124,243,113,240,215,211,126,198, 87, 99,123, 99,255,179, 26,240, 84, 85,129,
- 82, 33, 3,205,147, 0,120, 39, 3,246,102,113,164,189,255,208,223, 55,110,137,153,243,235,116,105,129,145,128, 68, 68, 33,242,
-194,121,220,184,117,119,149,230,201,145,237,248, 7, 33,228, 73, 95, 87, 87, 87, 72,197, 20,108,118,171,205,249,208, 5, 30, 60,
-208, 68,161, 10,249,189,112,198,223,132,229, 80,194,189,178,137,150, 64,234, 58,253,139,105,115, 22,116,235, 57, 16,103,143,239,
-199,190,253,123,216,240,136, 49,212,142, 63,215,163, 77,151, 62,104,211,109, 48, 78, 29,218,246,173,145, 35,234,142,155, 50, 99,
-110,187, 78, 61,112,246,196,126,100,103,165, 45,115, 54,189,148,144,152,210,169,107,111, 88,108, 44,218,118,238,133,211,199, 14,
-125,137,194, 69, 22,206, 15, 98,111,244,207, 32,153,111,191,153, 34,204, 41,176, 9,213, 58, 27,210,212, 38, 36,102,155,112,100,
-247,102,222,249,254,194,214,188, 93,195, 74,194,113,139, 35, 83,131, 42,249, 91,133, 86,179, 44, 54, 46,190,246,231,163, 71, 10,
-131,107,214, 38,115,180, 86,168,181, 86,104,180, 86, 24, 44, 12,106, 86,170, 69,210, 12, 17, 94,222,114,246,118, 19, 11,215, 29,
- 75,128,171, 66,136, 86,181,223,127,161, 45,199,113,175, 72,214, 10, 7,201,122,148,160,133, 68, 68, 65, 34, 34, 33, 17, 81, 96,
- 88,222,169,137,139, 76, 21,210, 99,242, 23,147, 2,108, 12,144,171,181, 65, 64, 17, 80,121,123, 40,154, 55, 26,138, 45, 75,191,
- 4, 0,140,253,225, 55,124,254,217, 8,212,169,215, 0, 5,249,249,126, 67, 7,246, 88, 1,224,144,179,105, 61,121,246, 82,229,
-179, 87,238,255, 48,121,234, 76,229, 39,189, 59, 82, 15,226,181,200,204,179, 34, 46, 86,189,197,216,208, 0, 0, 32, 0, 73, 68,
- 65, 84, 95, 46,229, 13, 0, 24,150, 3, 15, 30, 91,247, 28,135, 76, 44,128, 90,107, 7,207,243,152,183,102, 47, 92,100, 66,100,
-230, 59,220,253,165,161, 84, 62, 82,138, 34, 85, 14,181,177, 23, 28,177, 92, 62,206, 42, 90, 11, 23, 46,140, 94,184,112, 97,137,
- 10, 89, 49,146,245,126,135, 74,139, 68,138,218,174, 94,222, 55,207,158, 62,233,114,232, 33,139,139, 15,115, 49,176,109, 37, 24,
-242, 82,176,100,218, 39,121, 4,120, 27, 73, 81, 5, 86,179,233,160,217,108,156, 15,192, 94,106,165,241, 11,105,162,144, 42,207,
-175,219,240, 23,227,173, 82, 97,251,213,188,180,124, 35, 67,191,114, 91,209,196,221, 51, 27,130, 25,142,142,176,100,191,184, 83,
-214, 76,156,227, 33, 90,184,254, 8, 0, 30, 28,199,129,231, 56, 8,165, 74,133,119,245,176,236,194,142, 78, 42, 32, 9, 75,241,
- 30,128,231,152, 52, 77, 66,233, 50, 40, 1,192, 77, 46,196,158,203,233, 0,144, 77,233,239, 61, 29,246,137,195, 93,104,177, 73,
-117,245,106,212,224,155, 55,111, 94, 32,147, 57,181,253, 21,229,235,235,123,123,198,140, 25,181, 63,255,252,115,137, 88, 44, 6,
-195, 48,158,127,108,216,192,109,152, 63, 22, 3,190, 92, 7,145, 88, 2,179,197, 14,161, 80,128,124,173, 1, 5, 58, 19,244, 38,
-186,252, 53, 40, 62,222,166, 6, 22, 31, 62, 36,238,223, 93,217,176,133,152, 20,161,105,168, 63, 46,158, 57,204,223, 60,189,101,
-172, 57, 39,246, 47, 39, 43, 34, 12, 22, 26, 25,185, 22,164,231, 90,144,149,111, 65, 86,158, 21, 89,249, 22, 16, 4, 1,139,141,
-249,160,129,203,152, 19,179,111,251, 95,155,250, 88,237, 24,210,174, 91,127,124, 59,115, 93,149,237,191, 47, 58,159,192,147,173,
-157, 12,180,101,163,163,163,147, 70,143, 30,221,104,215,174, 93, 84,253,250,245,205, 79,159, 62,149, 23,146, 72,187, 82, 41,151,
-109, 94,187,240, 76,139, 22, 45,118,167,199, 62,139, 44,244,167,151,217,177, 87,105, 63, 74, 34,179,223, 31, 87, 89,209,170,123,
-117, 63, 57, 42, 43,244,221,107, 43, 31, 46,201,237,244,213, 2,117,228,170,156, 76, 43,115, 78,109,166, 26,167, 27,132, 78,197,
-224,209, 86, 75,242,128,129, 67, 64, 17, 36,236, 22, 83,114, 81,229, 82,185,137, 49,107,199, 51, 40,165, 66,184,200, 4, 80,202,
-132,104, 83,215, 19,229,232,207,120,154,229, 96,178,178, 48, 91, 25, 88,108, 12,188,131, 60,176,113,251, 62,164,228,152,113,228,
-142, 6, 49,201,122,212,170,164, 0,207,151,221, 77,114, 44,109,236,253,241,112, 23,138, 36, 64,145, 4, 89,183,118, 8,242, 12,
-118,136, 4, 36, 68, 82, 25, 20, 18, 1, 92,101, 66,136, 68, 66,228,228,228,192,106,181,162,114,229,202,210,210,169, 32, 15, 23,
-165, 12,181,130, 3, 96,167, 25,156,188,242, 4,243,191, 25,128,174,237,154,129, 16, 42,241,204,218, 4, 46,158, 46,224, 72, 18,
-118,134,131,205,206, 2, 32, 45,239,178, 23, 20, 20,212, 73,161, 80, 40, 76, 38,147, 62, 37, 37,229, 82, 86,204,161, 20,150,234,
- 59,238,244,217,200,237,189, 62,234,138,251,143,162,177,255,208,209,171, 26, 47,237,212,162,103,234,213,171, 23,230,237,237,173,
-204,205,205,213, 69, 69, 69,221,126,223,121, 1, 79,146, 95,135,183,233, 0, 67, 65, 14,178, 83, 19,157,158, 69,215,169,226,130,
- 95, 22,174,107, 26, 26, 18,218,148,229, 29,196,171,110,101, 23,124, 55,115,117,211, 26,181, 66,154, 22, 45, 8,169, 83,185,244,
-109,217, 4,114,151,110,159,126,254,237,194, 62, 3, 71, 33,242,236, 81, 44,159, 63,109,187,194,205,167,142,167,135, 91,227,250,
- 97,221,112,245,252, 81, 72, 93,252,224,225,229,215,102,248,103, 95,116, 25, 56,124, 60,110, 92, 61,143, 85,139,126,218,198, 90,
-245, 59,157, 73,171, 66, 21,236,211,168, 73,139, 97, 46,158,190, 40,208,234,225,226,161, 66,157,134,205,135, 61,121,104,253,193,
-152,147,160,126,111,210,193,243,176,218,121,228, 27,236, 72, 85,155,145,148,229, 32, 90, 28, 87,142,152, 32,150, 35,148, 82,129,
-192,147,126, 81,249,241,249, 72,190, 74,144, 47,177,120,238, 52,202, 14, 41,212, 5, 14,146,165,214,217,160,214,218, 96,176,208,
-240, 84, 8,192,177, 92,185,103,221,249, 6, 59, 92,228, 66,184,201, 69, 78,171,140, 37, 97,253,159,123, 66, 31,198,102,244, 91,
-190,124,165,252, 65, 66, 49,146, 37,116,168, 89, 18, 17, 5,150,227, 0, 39, 90,188, 80, 32,156,210,183, 71, 23,164,106,204,142,
- 85,203, 36,129, 90, 13, 90,192, 91,198,161,243,224,233, 0,128,222, 61, 28,161,109, 9,153, 70, 28,187,169, 6, 94, 15,236, 46,
-189, 47, 54,155,169, 13, 59, 78,124,189,111,239,110, 55, 11, 43,192, 31,167,146, 96,178, 50,144,138, 40, 72, 68, 20,100, 34,234,
-181,120,236,178,137,150, 35,230, 46, 69, 67,195,100,177, 64,103,166,193, 3,184,253,194, 0,179,141,129,214, 72, 35,172,182,199,
-135, 9, 33, 4,113,130,231,249,158,111, 18,162, 55,201, 82, 49, 69,170, 36, 27,119,138,219, 40,250,253,187,136, 92,241,152, 45,
- 0,229, 90,193, 37,120,147, 57, 22,191, 22, 41, 60,234,184,185,184,221, 60,125,234,184,242,208, 67, 14,151, 30, 57, 72, 22,109,
-214, 96,217, 15, 67,211,116, 5,154,142, 0,226,157,253,207,228,222,117, 26, 74,197,146,200,127,173,252,195,174,242, 13,228, 14,
-222, 44,200,209,154,216,215,216, 4,107,181,146, 60,199,139, 44,217, 47,156,242, 33,144, 36, 97,159,249,101,127,112, 60,143, 89,
- 43,247, 97,193,212,193, 80,202,134,203, 9,130,144, 27, 45, 12,190,153,189, 9,203,126, 25,227, 34,151, 8, 64, 16,142,152,168,
- 79,135,244,119,174, 2, 90, 24,196,221,218,101,208, 39, 28,127, 90,220, 93,216,178,205, 71,119, 91,182,108, 89,224,225,225, 1,
-153, 76,246, 74,169,120, 7,124,125,125,127,153, 57,115,102,232,132, 9, 19, 94,110,246, 41, 16, 8, 48,121,210, 36,146,101,121,
-156, 58,181, 5, 62, 85,155,224,232,185,155,136,232,212, 28, 6,147, 5,121, 5,122,112,160,222,187, 34,234, 11, 52,145, 89, 73,
-143, 91,180,238,216, 27,151,206, 28,230,111,158,218, 60,182, 60,123,244,120,120,122,164,222,123, 28, 87,135, 32, 60, 29,138, 86,
- 33,201,178,209, 28,170,248,202,145,154, 20, 7,119, 55,183, 84,103,237,201,124, 66,251, 18, 36, 63,129, 0,191,197,152,253,124,
- 31, 0,222,152,249,116,232,190,157, 27, 30, 69, 71, 61,152,223,107,216, 20, 65,183,129,147,168,223, 23,126,241, 19, 0,103, 55,
-222,179,199,196,196, 60, 25, 51,102, 76,171, 27, 55,110,176, 0, 76, 4, 65,208, 20, 69,201,109, 54,155,168, 99,199,142,218,103,
-207,158, 93, 70,201, 65,139,175,161,205,232,125,222,132, 68,255,145,152,179, 15,173,226,162,239,218,177,109, 56,194,235, 5, 33,
-181,109, 56, 0, 76, 73, 54, 40, 67, 45, 53, 54,237,161, 25,217,201,223,255, 60,182, 96,236,224, 46,223,108, 23,204, 90,158,121,
-124, 86,169,129,168,169, 79, 47,119, 47,137,198, 11, 40, 18, 46, 50, 33,148, 50, 1, 92,100, 66,184, 72,133,160, 25,190, 60, 51,
- 71,158,102, 56,135,162,101, 99, 96, 48, 51,136,124,144,141, 44,173, 13, 5,122, 59,204,118, 22, 60,120,199,108,212,137,222, 92,
-253,226,186,123,209, 72,234, 94,185,137,118,195,154,165,174, 7,174,165,189, 92,209,231, 38, 23,195, 69,238, 88,141,125,229,202,
- 21,120,121,149, 61,219,231, 56, 14,251, 79,223,198,242,173,145, 56,189,229,123, 72, 69, 20, 26,246,157,141, 81,253, 90,130,227,
- 57,196,197, 68,103,215,170,219,200,151, 36,101, 32, 9, 2, 86,154, 3,192,191, 51, 63,109, 54,155, 87, 74, 74,138,174,102,205,
-154,126, 1, 1, 1, 3, 41,138,226,161,127, 96, 61,188, 59,207,116,225,248, 78,185,209,108,101,229,140,118, 75,205, 76,115, 79,
-212,172, 9,130, 32,120, 87, 87, 87, 81,100,100,164,161, 65,131, 6, 62,239,217,148, 72,153, 42,100,213,231, 19,191, 30, 88,163,
-122,117,236,219,185, 5, 60, 79, 28,112,246,225, 29,199,110, 96,238,143,175,175, 48,252,110,230,234,166,203,102, 79,121,237,222,
-196, 31,151,151,186,234, 80, 38, 81, 78, 29, 48,116, 28,238,222,254, 27, 75,102,127,183,219,106,200, 27, 69, 51,244,160,188,204,
-132,221,193,117, 91,130,183,235,113,118,239, 82, 12, 30, 49, 86,210,173,215, 64,220,184,122, 30, 11,126,154,184,195, 84,144, 51,
- 26, 78, 6, 57,115,188,112, 66,199,238,253,132,102,171, 29,171, 23,255,138,241, 83,231, 35,172, 83,111, 97,212,131,155, 19, 0,
-204,113, 58, 28,194,206,162, 99, 3,111, 7,121,166, 57, 28, 77,160, 4, 37,213, 64, 1, 69,144,141,171,187,195,108, 99,160, 43,
- 99, 82, 41, 16, 9,179, 10,180,186,170,107, 23,124, 77, 25, 45, 12,212, 90, 27,114,180, 86,104, 10, 94, 17, 44,141,214, 10,181,
-214, 6,161,128, 64,108,124, 50, 72,161,160,220,241,121,249, 6, 26, 45, 66, 60, 28,109,244, 61,189, 35,180,192,181,229,233,203,
- 15, 7, 44, 95,190, 66,250, 48, 81,143, 71, 9,186, 66, 37,139,130, 68, 72, 66, 92,248, 55,203, 57, 98, 35, 75,131,171, 79,245,
-224,145,159, 14,239,236,170,148, 33,227,121, 14, 4,148, 99,139, 24, 55, 85, 16,220, 36, 22,124, 49,113, 28,188,189,220,145,162,
-177, 98,213,161, 88, 60,122,242, 2,156,185,124,175,189,250,143,221, 17,159, 79,254,206,157, 20,138,177,237, 76,162, 35,157, 20,
-139,103, 55,143, 89, 50,226, 30, 27, 13,186, 92, 30, 60,235,100, 12, 50,193, 51,172,163,186, 45,152, 53, 29,187,183,254,134, 51,
-247,114, 94,214,192,107, 7,150,225,235, 31,231, 65,163,179,161,164,122, 89, 26, 31, 1,160, 46,166, 68,189,117, 93,140, 28,149,
-116, 77, 20, 94,219,222, 97,195,246, 6,185,178,189,113,223,246,134,189,146,246,254,219, 80,166,235,240, 45, 82,228,238, 83, 95,
- 46, 85,252,125,234,212, 49,197,225, 71,252, 75,146,101, 55,105,248,249, 83,122,167,233, 10,212,221,202, 69,178,124,106,213,151,
-200, 37,151,103,204, 91,101,245, 13,172,202,156,124,160,203,213, 91, 88,230,237, 24, 4, 5,171,112,243,177, 8,196,146,229, 66,
-179,237, 87,141,230,169,177, 44,229,137,227,121, 28,191,149, 5,158,119, 76,145,246, 94, 73, 71,225,204, 28, 44,231,112,171,156,
-123,144, 3, 65, 97, 28,138,179,242,247,250, 63,126,211,245,108,160, 53, 14, 91, 48,235,165,187, 48,172,145, 67,201,114,117,117,
-133,187,187, 59,148, 74, 37,202,114, 29, 18, 4,241,233,231,159,127,254,214,236, 63, 39, 39, 7, 93, 58,119,196,154,223, 54,162,
- 81,231,145, 56,119,253, 12,236, 52,135,134,117,171,163,106,128, 7, 82,179,245,239,213,208, 21,190,161,147, 91,116,236,247, 83,
-155, 78,189, 17,121,250, 32,127,243,244,159,227,202,187, 17, 98,207, 46,173,142,205,157, 59, 43,120,198,252,181, 18, 23,169, 0,
- 79, 13, 54,144, 4,129, 42,190,114,120, 41, 72, 92, 58,188,205, 50,184,119, 43,167, 55,199, 11, 10, 10,220,190,108,205, 6,197,
-178, 69,179, 59,222,189, 71, 68, 26, 50, 98,243, 0,192,148, 29,179,248, 25,240,164,210,223,103, 79, 54,106,223, 31,190, 1,213,
-187, 38,100, 63,115,154,108, 0, 48,197,199,199, 39,204,152, 49, 35,116,209,162, 69, 60, 69, 81, 28, 0,201,202,149, 43, 77,207,
-159, 63,127, 0,199,210, 92,148, 53,216,116,238, 90,239, 27,165,152, 13,243,148,147,245,170,251,201, 17, 94,207,225, 21, 29,220,
-179, 13,130, 42, 87, 70,124,150,169,113,158,137, 19, 26,108, 84,245,117,127, 60,186, 83,205,155, 26,203,152,109, 79, 0, 28, 41,
-111,249, 16,120, 21, 32, 95,164,102,185,200,132,224, 28,117,165, 92, 68,203,106,103, 97,182,178, 48,219, 24, 24,109, 44, 76, 54,
- 22, 28,239,104, 19, 4, 65,192,206,112,112,106,218,252, 70,221,119,245,244, 70,245,106, 4, 92,229,142,180,185, 22,110,247, 64,
- 0,240,242,242,130, 74,165,114, 74, 21,181,217, 29, 77,220, 70,115, 47,221,250, 54, 59, 3,158,231, 17, 27, 27,243,125, 82, 66,
- 66,223,154,181,106,182,171,219,176,145,167, 92, 66, 2,192, 59,137,150,201,100, 98, 93, 92, 92, 84,158,158,158,100,122,122,250,
- 75,242, 92,179,113, 71,230,208,193, 3, 24, 48,160,191,225,233,237,135, 47,151,184,155,205,102,162,117,235,214,174, 65, 65, 65,
-164,213,106,213,149,183,152, 20, 62, 33,253, 60,188, 60,231,127, 58,122,124, 72,199, 46, 17,184,120,225, 44,142, 28,220,245,151,
- 73, 29,123,214, 89, 35,161,161,181,223, 90,117, 88,163, 86,200, 91,171, 14,171, 6,215, 42,149,104,213,109,216,188, 37, 79, 8,
-112,230,248, 94,222, 66,218, 39, 2,224, 88,139,126,239,158,245,191,204, 25, 58,225,199, 26, 61,250, 12,197,167, 35, 70, 65, 32,
-160,112,233,220, 49, 44,155,253,237, 9,131, 54,103,164, 51, 97, 2, 14,233,173,142, 40, 80, 22,244, 85,229, 26,245,113,239,230,
- 85,196,197, 70, 69, 63,188,115,163, 94,205, 6, 97,240, 9,168,242, 85,178, 55,181, 8, 79,159,218,203, 50, 99,179, 88,146, 71,
-141, 28,129,226,171, 14,195,155,132,122, 17,111, 54, 0, 0, 38,125,142,125,243,210,111,158, 23,173, 58,228,236,182,228,119,217,
-213,230,171,247, 95,186,126,107,106,223,158, 17,164, 70,103,115, 40, 88, 90, 91,225,199, 10, 77,209,223, 58, 43,106, 5, 40, 17,
- 19,125,143,179,104, 53, 7,202,217, 46, 45,163, 6,117,127, 82, 84,119, 57,142, 7, 1, 88,202,237,150, 18,186,142, 91,188,100,
-185,244, 97,130, 1,143, 18,117, 14, 87,161,144,114, 16, 44, 33,249,146,116, 57, 86,179,151,161, 14, 17,212,130,207, 70, 14,129,
- 70,103, 7,199, 1, 2,138, 44,252,136,144,162, 39,144,170, 55, 65,147,175, 70, 66, 82, 50, 10,178,226, 64,146, 36,188, 3, 66,
-156,222, 73,154,229,197,254, 38, 27,223, 96, 96,207,118,130,131,127,103, 66, 46, 17,192,170,207,198,169, 61, 75,213, 86,131,110,
-190,217,100, 56,232,204,126,142,175, 66, 16, 8,181,206, 96,241,149, 8, 41,236,219,186, 22,131, 70, 77,124,173,247,253,254,231,
-185, 0, 73, 32, 47, 95, 15,130, 32,212,229,235,151,136, 59,165, 93,191,167, 50,246,193, 54, 74, 32, 91,111, 79, 20,222, 61, 27,
-229, 79,157, 61,125, 76,113, 45, 73,130,219, 49,153,133, 36, 75,205,205,251,178,103,154, 94,155,215, 29, 64,108,249,230,133,100,
-247,193,159, 77,141,174, 30, 82,215,122, 49,202,144, 88, 96,164,223, 25,231, 16, 62,112, 70,244,221, 19,107,122,104,233,248, 73,
- 10,255,186, 44,199, 48,139,205,234,216,217,239,112, 29,138,103,175,218,247,210,109,248,195,162,109,142,191, 89, 22, 44,207,129,
-231,128, 47,126, 89, 15,134, 99,193,177, 44, 56,150, 7,205,242,242,178,146,171, 10,168,122, 48,255,217,222,218,195,230,188,237,
- 46,116,119,119,135,151,151, 23,188,188,188,224,234,234, 90, 38,209, 18, 10,133, 74,129,224,245,172, 78, 78, 78, 70, 82, 82, 18,
- 92, 93, 93,193,115, 52,108, 52, 80, 63,172, 27, 30,199, 69,225,252,181, 7,224, 57, 22, 10,101,249, 79,121, 81,248,134, 78,106,
-222,161,239,218, 78,125,198,224,220,193, 63,248, 59, 87,142,141, 55,231,196,110,114, 90,161,103, 89,130,166,105,244,236,214, 33,
-249,126,244,139,211, 63, 79,157, 16,209,170,215,120, 73,120,104, 32, 44, 54, 22,105, 73,113,184,116,248, 79, 75, 72,176,255,153,
-206,109, 91, 38,211, 52, 13,150,101,203, 28,200, 45, 54,187,134, 18,202, 20, 67,134, 12, 19,222,185,125,251,128,194,167,214, 62,
-150, 32, 31, 18, 60,215,144,224,249, 1, 13, 27,214,129,157,230, 96, 50,233,242,203,251,206,122,189, 62, 97,203,150, 45,193, 35,
- 71,142,148,215,173, 91, 87, 24, 23, 23,135,101,203,150,229,234,245,250, 4,103,109,156,189, 18,179, 82, 64,228, 63, 47, 82,180,
- 82,218,132, 99, 72,175, 54,216,125,226, 26, 46, 93,189,129,100,131,242,129,129, 17, 28, 78, 77,206,176,214,243,212, 29,232, 19,
- 94,149,218,183, 53,255, 64,116,135,233,159,240,188,228,172,230,242, 44,163,243,141, 27,208,155,105,184,202, 29,251, 61, 21, 41,
- 91, 20, 65, 56,205,136, 8, 32,225,234,141,123,245,155,213,170,139,251, 9, 90,228, 20, 88, 97,182, 50,224, 56, 30, 28,120,120,
-185,136, 33, 21,145, 72, 73, 74, 0,199,219, 19,203, 57, 84,168,219,183,107, 47, 0, 8, 16, 4, 47, 16, 10, 4,224,225,216, 95,
- 81, 38,147, 25, 84, 42,149, 83,138,150,157, 97, 48, 32,162, 37,194,154, 55, 68,223,241,142, 61, 51, 47,252, 53, 29, 30, 74, 33,
-118,111,223,132,212, 43, 43,183, 7,135, 79, 56, 27,245, 56,250,227,232,251,127, 15,251,168,169,172,177,159, 32, 67,244, 46,153,
-212,104, 52, 30, 0, 32, 22,137, 68, 17,237,218,181,243, 60,112,224, 64,129,183,183, 55, 39, 22,137,212,125,122,247,226,132, 34,
- 81, 94,209,111,175, 95,191, 46, 28, 63,126,188, 75,126,126,126, 74,118,118,246, 13, 0,116,233, 19,193,208, 46, 32,177, 11, 4,
- 33, 85,202,228,201,213,170, 85, 15,104, 30,214,210,173,223,128, 65,144,136, 37, 56,119,246, 52, 86,175, 88,180,215,144,249,244,
-179,242,228,228, 63,181,234, 48, 45, 37, 49,193,100,182, 54,168,223,172, 3,113,245,236,225, 41,118,120,175,160, 36,246,165, 93,
- 6, 76,172,145,144, 97,192,234,133,223,195,195, 77,129,196,184,103,230,231, 79, 31,175,167, 45,186,239,157, 38, 89, 0,228,185,
-236,199,225, 35, 34, 60,172,118, 22, 87, 34, 79, 88, 56,134,139,184,113,249,100, 92,165,144,230,210,250,205, 59,123,104,142,108,
- 26, 96, 2,118,151,101, 39,253,217,219, 10, 46,111, 43, 72,188, 16,121,222,205,183, 74, 61,138, 0, 1,187,213, 2,117,252, 29,
-198,148,253, 76,167, 75,143,114,106, 21,110,110, 42,126,249,113,230,191, 38, 53,111,214, 76,193, 67,250,154,130, 85, 68,176, 52,
- 58, 27,188, 93,196, 48,235,212,120,126,231,180,197,164,166, 74,221,239,140,177, 25,229,154,156,108,241,171,112,134,216,176,210,
-126,175,201,201, 22, 51, 54,163,188,236,161,142,130,171, 66,140,199,137,233, 47, 3,223, 37, 66, 71,108,150, 88, 72,189,140,211,
- 42,234, 11,202, 64, 7,145,212, 29,233,185, 22, 16,224,193,177, 12, 24,218, 6,189, 78,135,244,140, 44,100,103,101, 67,175, 47,
-128, 92,233,129,250,141, 91,192, 69, 33,197,195, 75,123,193,243,188, 83,251, 26,210,132, 48,180,121, 88, 91, 73, 84,146, 35, 22,
- 75, 42,228,113,108,215,162, 92,131, 46,167,173, 33,243,249,243,242,246,197, 12,203,158,127,244,228,121,189, 74,254,213,136, 7,
-113, 90,108,223,184, 6,182, 66,101,147,166, 89, 68,165, 24,145,153,103, 66, 74,252, 83,158, 99,217,243,248, 31,129,224,221, 2,
- 32, 4, 13,235,215, 65,183,225,253,240,219,111,235, 17,159,144,196,205,159,210, 35,197,160, 47,248,168, 28, 36,171, 11, 10,247,
-218, 48,101,199, 44, 54,123, 52, 79, 59,122, 63,143, 52,219,248, 82, 3,124,164, 62, 85,208,246,179,101,103,204,250, 60, 49,107,
- 53, 9,142,109,255,108, 87, 73, 54, 29, 12, 26,182,249,223, 13,134, 82, 38, 0, 65, 16, 40,114, 23,174,155, 59, 14,114,137,195,
-183,108,182, 50, 24,254,205,114,108, 95,254, 45,120, 0, 67, 7, 93, 51,189, 43,157,112,156, 93,248,133, 63,110, 87, 74, 78,202,
- 73,239,210,251,187, 11, 22,187,196,218,171,255,200,187,205,154, 53, 43,144,201,100,144,201,100,112,117,117,133,135,135, 7,220,
-221,221,203,124,119,154,166, 13, 54,155,205, 75, 44, 22,131,227, 56, 36, 38, 38, 34, 49, 49, 17, 90,173, 22,106,181, 26, 70,131,
-142,185,125, 97,159,160,126,120, 15, 4, 84,111,128, 42,181, 26, 65, 72, 17, 16, 8, 72, 92, 58,186,241, 93,233, 44,153,100,181,
-239,179,174,115,223,207,113,238,224, 6,254,206,149, 99, 19,204, 57,177, 27,157, 45,163, 66,119,207,195, 1, 3, 6, 52, 24, 63,
-126,188,104,230,212,241,103, 78,156,189, 20,187,239,248,134,222,249,249, 5, 65, 60,207,195,221,205, 45,117,112,239, 86,199, 58,
-182,110,158,124,225,194, 5,110,215,174, 93, 86,130, 32, 30,151,102,211,209, 73,229,252,117,225,124,228,172,182,237, 59, 96,211,
-214, 93,237,163,159, 60,109, 31, 23,247, 28, 65, 85,170,163, 90,112, 45,152, 8, 15, 68, 94,190, 10, 67, 65,206, 95,206,164,243,
- 13, 85,139,200,207,207,255,123,240,224,193,221,174, 93,187, 70, 14, 30, 60,216,164,209,104,174, 23, 83,177,248,178,108,222,248,
-189,191, 26,192, 95, 85,218,143,218,155,110, 47,248, 10,192,162,202, 85, 42,227,210,213, 27,184,113,237,214,122,141,188,242,236,
-207,134,143, 30, 87,181, 15,245,121,159,240,170,148,202, 67,142,157, 27,150, 81, 71,111, 36, 45, 79,202,101, 55, 45,186, 60,107,
-174, 51,101,244,114,224,208,219,209,186,142, 39,104,150, 7,199, 59, 58, 92, 23,169,240, 93, 29,239, 91, 54, 5, 54,201,103, 19,
-198,143,143,171,223,176,241,215,195, 71, 79, 16, 53,174, 30,132,219, 47, 10, 0,130,128,167,159, 2,153,153,153,184,178,127, 3,
-147,159,254,108, 61, 69,113,115,202,145,159,200, 79,126, 80,179,216,229, 56,141, 70,131, 75,151, 46,161,136, 96,249,248,248,188,
-139,104,189,102, 51, 55, 59,227,250,220, 37,127,180, 30,251,105,127,244,234, 80, 15,151,239,196,193, 86,184, 95, 83,209, 82,242,
-132, 27,191,139,191, 26, 92,221, 54,105, 64,136,206, 76,139,147,126, 73,212, 94,129,227, 12, 86,238, 29,233,180,229,229,229, 29,
-141,137,137,105,211,168, 81,163,170, 39, 79,158,204,139,190,117,102, 74,241, 68,124,247,221,119,202,223,126,251, 77,206,243,252,
-117,155,205, 22,239,212,187,147,216,121,239,238, 93, 47, 59,205,225,234,173,135,117, 58,183,110, 12,142, 7,238,220,185,131, 77,
-155, 55, 89, 30, 63,122,176,212,152,237, 55,167, 20,242, 82, 98,126,178, 31,182,234,240,165,205,204,244,164,165,231, 78,236,223,
-222,188,125,111, 12,251, 98,206,156, 75, 39,118,205,106,218,182, 23, 89,167,121, 55,220,187, 17,137,243, 39, 79,255,203,110,200,
-155,133,178, 99, 71, 74, 76,167, 68, 38,255,178,110,211,246, 72, 73, 78, 66,226,243,168,191, 44,121, 47, 50,146,227,168,191, 50,
-210,146, 39, 4,215,107,141,107,103,118, 79, 41,133,104,149, 90,231,131,124,100, 27, 78, 30, 63, 58, 36, 45,237,119, 63,163,217,
- 34,225,121,222, 34, 17, 11,178,148,164,126,143,206,233,116, 62,181,171, 51,170, 14, 24, 52,124,194,137,213,171, 87, 8,125,221,
-229,200,202,183, 64,103,182, 67,111,178,131, 36, 8,212, 12, 80,192,164,207,195,229,253, 75,104,155, 33,127, 48, 16,103,127,151,
- 77,133, 42,116, 94,254,139,200, 47,190,155,120, 17, 98,183,160,128,106,157,126, 44, 85,173,211,167, 63,232,253,221,196, 99,161,
- 60,207,119, 86,168, 66,245,198,156,152, 25,239,122,119,130,112,180,239, 97, 29,131, 96,103, 28,251,143, 49, 28,192,114, 92,161,
-202, 7,240, 47,253,249, 68, 25,239, 78,112,123, 78, 92, 71, 70,118, 1,204, 54, 26, 86, 27, 3, 59,205,130,164, 40,184,123,184,
-163, 86,181, 38,112,115,119, 69,118, 86, 6,110, 92, 56,138,216, 71,151,175, 19, 60,102,155,213,207, 47, 56, 83, 70, 34,153,123,
-168,127,128, 31,153,169,179, 65, 38,166,240,224,242, 73, 59,109,179, 46,117,146,100,189,101,179, 32, 55,111,249,215, 83,167, 13,
-253,115,203, 86,191, 6,193,174, 72,211,152,145,166,182, 64,111,161, 11,137, 24, 7,171, 65,131, 71,145, 91,179, 88,139,126, 57,
-254, 71,240, 78,162,197,216, 45,250, 3,167,111,123, 77,159,181,132,122, 17, 23, 79,207,251,170,103,154,217,160,235, 81,110, 37,
-171, 24,254,156, 28,188,251,223,241, 18,111,185, 11,121, 14, 28,207,227,216,173,172,151,238, 66,174, 48,242,242,126, 92,233,199,
- 8, 22, 63,187,176, 67,143, 41,231, 30,197,232,119,152,205,217,110,207, 94, 44,205, 7, 0,138,162, 94,126,138, 98,179, 44, 22,
-139,173, 12, 23,202,182,141, 27, 55,254, 48, 97,194, 4, 73,106,106, 42,226,226,226, 80, 80, 80, 0,169, 84,138,211,167, 79,211,
-224,152,165,143,174, 29, 74,140,185,119,246,215,208,102,221, 42, 53, 8,239, 1,185, 92, 1, 1,239,124, 48,166, 92, 21, 50,164,
- 89,251, 62,107, 59,247, 27,139,243,135, 54,242,119, 46, 31,157,104, 86,199,110, 40,111, 94, 22, 20, 20, 68, 3,120,190,116,233,
-210,198,155, 54,109, 10,158, 58,117,106,252,182,181,179, 86, 3, 64,110,110, 46, 0,224,254,253,251,252,196,137, 19,173, 22,139,
- 37, 33, 63, 63,255, 30,202, 88, 0, 1, 0,102,181,124,193,166,117,139,234,167,166,103,246,175, 94,191, 5,124,130, 91,192,175,
-102, 75,228,235,237,184,253, 34, 3,241, 79, 47,224,233,213,253, 39, 77, 74,102, 22,202,185,191,113,163, 70,141,130, 72,146,172,
-102, 48, 24,252,234,214,173,219, 72,161, 80,220,111,212,168, 81, 19,129, 64,144,118,247,238,221,164,242,216, 74,190,188,213, 90,
-165,253,168, 85,201,122,151,142,241, 89,166, 38,201,122,151,251, 38,137,219,183,234,200, 85,214, 63,169,192,229,188, 93, 19,189,
-111,171,238,192,206, 13,203,168,225,227,190, 99,163,180, 30, 95, 9,100,226,115,229,147,171,201,204, 73, 35,251,190,218,222,161,
- 80,201, 42,252,219, 41,153, 94,171,125,164, 5,240,195,163, 39,194,181, 81, 95,141,159,219,176,121,235, 17,237, 62, 26, 76, 50,
- 34, 37,206, 28,250,157, 79,120, 20,185, 79,192,179, 63,155,157, 56, 13,160, 76,119,144,205,230, 12,201,122, 59,141,169,138, 14,
-251,118,109, 30,117,224,208,193,133,253,250,244,245, 90,247,203, 39, 88,242,199, 97, 40,100, 18,240, 28,135, 79, 58, 6, 13,252,
-245,243,218,189,131,124,165,129, 7, 46,166, 93,249, 98, 69,212, 15, 38,147, 61,214, 9, 37,134,215,104, 52, 87,149, 74,165,186,
- 77,155, 54, 97, 18,137,132,208,104, 52, 2,149, 74,197,184,185,185,217,210,210,210, 76, 86,171,245, 0,128,114,109, 59,110,167,
- 57, 36,102, 91,112,228,224, 1, 60,188,117, 1, 79,159,198,232,159, 62,121,186,134, 16,240, 43,140,217,207,243,128,114, 79,240,
-193,149,184,234,144, 47,247,170, 67,214,170,223,185,109,253,188, 78, 38,139,117, 84,163, 86, 61, 81,181, 78,107,210, 78,179,120,
-124,231, 34, 46,238, 95,177,196,110,200,155,254, 33,101, 28, 80, 41,184, 22, 79,137,241,247,165, 19,224, 57,110, 61, 0,240, 28,
-183,254,254,181,147, 19, 90,246,248, 28,158,170,170,141, 10, 82,238, 19,120,143,221,195, 69, 2,210,120,234,192,159,135, 18, 19,
- 19,241,236,217, 51,188,120,241, 2,121,121,121,216,185, 51,177, 92,229, 99,202, 79, 58, 23,251,132,236,254,241, 39,195,142, 13,
- 28,242,169, 52,184, 86, 3, 50,180,146, 7,188,148, 2,196,188, 72, 66,236,221, 71, 92,204,237,147, 22,187, 46,167,159, 57, 63,
-233,157,196, 79,238, 93,199, 23, 96,167, 23,157, 93, 24, 30,222, 58,116,218,252,133, 97, 94, 62,170, 18,251,241, 92,117,142,248,
-251, 47,142,134,222,184,249,183, 83,103, 29,114, 44,155, 59,110,212, 96,142,114, 28, 20,138,151, 58,117, 97,238, 57, 38, 83,142,
-251, 60,199,148,169,224,143,238,223, 22, 12,199,193,104,182, 67,103,180, 66,171,183, 32, 51, 39, 23, 15, 31, 61,194,229, 99, 71,
- 17, 23,243, 48,129,182,217,206,146, 36,177,223,156, 29,123,185,124,158, 38, 65,176,151,167, 39, 18,242, 12,144,138, 5, 72,138,
-189,107, 53,234,180, 59,222,183, 30,153,115,159,103,230, 80, 68,183,193,131,135,156,238,212,189,143, 91,243, 86, 93,228,222,174,
-238, 16, 9,120, 60, 79,204,192,189,235,167,141,241, 15,175,232,104,155, 33,226,159, 56,245,229, 63, 28,101,175, 58,180, 91,141,
-189,135,246,109,127,144,162, 4, 98,142, 99,172,118,155,245,227, 15, 33, 89,255, 46,240, 60,155, 54,106,104,255,215,230, 6, 12,
-199,203,134, 14, 58, 99, 46, 62, 87,160, 89, 94, 62,116,208,117,147,163, 3,121,119, 96,159,191,191,103,207,162,179, 11,147,147,
-115,239,228,229, 89, 47, 2, 72,179, 88, 44,239,157,198,236,236,236,185,243,231,207,239,101, 50,153,106,119,232,208, 65,226,234,
-234,138,220,220, 92,156, 61,123,150, 62,126,252,248,147,156,156,156, 95,129, 28,198,140, 38,127, 61,178, 28, 26, 25,115,247,236,
-175,181,155,117,175,212,160, 85, 15,231, 59, 51,137,108,108,167, 62, 99,136,243,135, 55,242,183, 47, 29,158,100, 86, 63,255,227,
- 3,178,213,110,177, 88,110, 89, 44,150,168,159,127,254,185,185,175,175,175,239,175,191,254, 42,213,233,116,194,117,235,214, 89,
- 52, 26, 77,150, 78,167,187,129, 82,226,105,222,198,125, 90,155,142, 1,167, 14,108,236,200, 31,216,216,213,221, 59,176,155,155,
- 79,165, 26, 5,234,244, 4,173, 58,227, 44,128,243,133, 27, 69,150, 11,141, 27, 55,174, 78, 16,196, 96, 0,245, 21, 10, 69, 77,
-165, 82, 41,225,121,190, 54, 65, 16,209, 28,199, 61,170, 91,183,238,241, 39, 79,158,148,107, 51,217,228,203, 91,173, 65,161,173,
-119,229,153, 56,145,141, 20,237, 74,190,188,213, 10, 0, 57,231,166,153, 0, 28,121,210,225,135, 1, 71,111, 36,173,142,206,119,
-155,162,190,180,240,104,121,211,172, 77,123, 88,243,159,170,255,150,204, 39,105, 0, 70, 61,186,139,101,143,239,223,152, 73,240,
- 16,178, 96,230,153,115, 94,220,253, 39,236, 11,133, 66, 75, 96, 96, 96,137,171, 11, 37, 18,137,197,106, 45, 77, 64,185,204, 24,
- 50,177, 9,104,191,245,224,222,173,163, 14, 31, 61,178,176, 93,231,126, 94,210, 74,149, 80, 77, 69, 96,235,244,166, 83, 46,220,
- 87,223,238, 51,237,202,111,241, 25,150, 71, 40,103, 60,140,193, 96,136, 5,144,111, 48, 24,250,242, 60,159, 74, 16, 68, 80,126,
-126,254, 3,154,166, 31,151,155, 16,112, 24, 22, 30,222, 98, 39, 65, 16, 2,158,225, 22,223, 16, 82,187, 44,153, 79,211,240,129,
-199,146, 52,168,230,138,111,126, 93,213,180, 70,205,144,166, 69,103, 29,214,171,234,130,241, 63, 44,107, 90, 53,184, 86,211, 87,
-231, 31,150, 25, 38,192,211,166,252,207, 14,110, 94,124,229,254,205,139, 63,121,251, 87,173,154,149, 22,255, 52,245,197,131,185,
-172, 69,119,240, 67,203, 57,241, 69,244,138, 77, 75,127,152,154,153,158,176,201,164,126, 30, 5, 0, 38,245,243,168,167,247,240,
-139, 38, 43,109,106,110, 78,252,210,247,205, 11,163,209,152,177, 99,199, 14,247,214,173, 91,147,190,190,190, 80,171,213,184,120,
-241, 34,199,113, 92,122,185,109,229, 37, 92, 52,230, 17,158,127,253,177,118,177, 72,225,210,131, 97,152, 0,158, 7, 4, 2, 65,
-166,205,164, 59,173, 39, 21,211,144,159,100, 41,125,204,224, 8, 0,100,209,217,133, 28,199, 17,139, 87,111, 77, 18, 74, 93, 74,
-220, 12,145,182,232,229, 28,199, 57,125,214, 97, 65,202,189, 26,255, 84,251, 38,120,126,118,163,102, 97, 63,209,180,221, 82,216,
- 62, 44, 0, 44, 60,143, 92,146, 36, 46, 83, 28,125, 70,247, 1,147, 41,130,128, 43, 79, 8,224, 34, 19,128, 0, 1,131, 54,143,
- 47, 79, 76, 86,137,132, 56, 39, 54,218,148,211,190,202, 41,219,222,145,145,231, 78, 14, 98, 89,182, 90,161,102,144,104, 53, 27,
-247, 25, 50, 61,254, 2,238, 50,248,191,143, 19, 69,100,139,248, 55,255, 71, 78,185, 81,254,147,108,134, 6,203,250, 86, 10,244,
- 29,153,152,148,115, 59, 62,213,244, 23, 94, 63, 86,231, 67,210, 73,249,250,250,254, 66, 16,196, 8,177, 88,172,180,217,108, 70,
-158,231,183,101,103,103,207,197, 91,135,255, 54, 17,202, 84,230,145, 98,169,124,134,221, 98,252,219,148, 19, 59,172,172,119,151,
-251,132,116,147, 42, 20, 63, 88,204,198,109,166,236,216,173,255,112,126,186, 73, 36,146, 38, 74,165, 82,168,209,104,110, 1,208,
-254, 39,149,123,163, 70,141, 42,147, 36, 89,141,227, 56, 95, 0,110,112,172, 10,209, 8, 4,130,244, 66, 69,139, 47,175,205, 54,
-163,247,121,119,238, 90,239,155,179, 87, 98, 86, 22,186, 21, 95, 34,112,224,114,233,136, 30, 29,255, 63,246,238, 59,172,169,235,
-255, 3,248, 59, 11, 18, 72, 32,236, 61, 84,134,184,192,162,181, 78,220,171,226,182,110,173,187, 86,127, 90,173,117, 87,176, 85,
-235,168,117,213,182,246,107,213, 58,234,174, 85,220,180,206,186,131, 34, 56, 0, 65, 4,100,143,144, 1, 36, 33,201,249,253,193,
- 40,181, 76, 71, 91,237,231,245, 60,121, 88, 55,239,220,155,220, 27, 62, 57,247,220,115, 62,254,241,240, 47,149, 93,117,248,218,
-237,243,127, 95,102, 71,190,196, 57,251,125,174,169,116, 89, 87,191,162,130,236,212,167, 83, 47,221,205,186, 14, 64,249, 34,235,
-105, 98, 98, 50, 74,167,211,153,153,152,152, 20,234,116,186,221,255,150,109, 55,115,240,155,192, 5,171,245,204, 20, 70,112,110,
- 61,115,209,202,155,178, 47,241,252,253,253, 59,152,152,152,120, 24, 12, 6,115,173, 86, 91, 80, 88, 88,248, 56, 49, 49,241, 10,
-170,158,248,252,149,174,167,216,193,119,157,137,137,112, 38, 0,232,116,154, 13,234,204,216, 89,213,221,177,154,229, 95,235,215,
-200,174,126,203, 88, 62, 79, 96,143,210,129,185,141,122,125, 86, 70,194, 77,223,127,112, 61,201,115,190,184,148, 73,153,148, 73,
-153,207,226,210,243, 73,153,255,100,166,200,185,177,187,200,185,113,173, 7, 93,174, 98,121,122, 62, 73,153,201,149,220, 0,212,
- 98,192, 82, 66, 8,121, 5,140,244, 20,144,127, 82, 81,218,253,228, 87,185, 60,249,207,169,178, 79, 52,167,154,170,180, 46, 77,
-130,207, 83,217,134, 83, 38,101, 82, 38,101, 82, 38,101, 82,230,127, 46,179,166,236,215,241,148,228,228,103,126, 62, 14,224,111,
-233,240, 79,205,170,148, 73,153,148, 73,153,148, 73,153,148,249, 95, 83, 94,120,113,233,185, 32,132, 16, 66, 8,121, 53,168,143,
- 22, 33,132, 16, 66,200,139,169,236,212, 33, 21, 90,132, 16, 66, 8, 33, 47, 65,149,157,225,233,212, 33, 33,132, 16, 66,200,139,
- 41,107,209,114,198, 51,195, 59, 80,161, 69, 8, 33,132, 16,242,114,164,161,178,214,173,176,176, 48, 86,217,247,132, 16, 66, 8,
- 33,127,135,215,188, 22,169,216,146, 53,185,244,103, 0, 21, 90,180,168,192, 34,132, 16, 66,200,191,165,216,122,205,148,181,100,
-149,221,210,254, 82,104, 5, 7, 7,115,168,216, 34,132, 16, 66,200, 63,229, 77,172, 69,184,207,110, 32,189,204,132, 16, 66, 8,
-249, 39,139,173, 55,105,123,104,120, 7, 66, 8, 33,132,144, 23,227, 12,160, 79,133,159,255,182, 41,120, 8, 33,132, 16, 66,222,
-116,147,171,250,153, 90,180, 8, 33,132, 16, 66, 94,126,177, 69, 8, 33,132, 16, 66, 94,103, 52,179, 57,101, 82, 38,101, 82, 38,
-101, 82, 38,101,190,233,202,198,209, 2,170, 26, 71,139, 16, 66, 8, 33,132, 60,151, 62, 40, 25, 63,107,114,233,215, 62, 84,104,
- 17, 66, 8, 33,132,188, 92,127,153,126,135, 10, 45, 66, 8, 33,132,144,151, 91, 96,125, 79,133, 22, 33,132, 16, 66,200, 43, 70,
-133, 22, 33,132, 16, 66,200, 43,194, 65,213, 87, 14,132,215, 33,231,121,174, 62, 8,167, 76,202,164, 76,202,164, 76,202,164,204,
-255, 92,102, 77,217,225,120,253,148,141, 12,127, 28,127,116,132,255,254,239,120, 96,186,244,149, 50, 41,147, 50, 41,147, 50, 41,
-147, 50,223,116,147,159,249, 90,142, 78, 29, 18, 66, 8, 33,132,188,220, 98,139,166,224, 33,132, 16, 66, 8,121, 73,170, 60, 77,
- 72, 45, 90,132, 16, 66, 8, 33, 47,166,202, 73,165,169,208, 34,132, 16, 66, 8,121, 53, 5, 23, 21, 90,132, 16, 66, 8, 33, 47,
-177,200,154, 92,233, 95,195,194,194, 24, 61, 71,132, 16, 66, 8,249,167,188,177,181, 72,217,134, 81,177, 69, 8, 33,132, 16,170,
- 69,234,204, 25,127, 92,109, 56,185,244,103, 0,116,213, 33, 33,132, 16, 66,200,139,234,131, 63, 95,121, 56,185,236,103, 42,180,
- 8, 33,132, 16, 66, 94,220,228,106,255, 74,167, 13, 9, 33,132, 16,242, 79,122, 19,107, 17, 14,189,172,132, 16, 66, 8, 33, 47,
-164,178,214,172,239,233,105, 33,132, 16, 66, 8,121,181, 5, 23, 33,132, 16, 66, 8,121, 21, 69,214,171, 30,176,148,102, 54,167,
- 76,202,164, 76,202,164, 76,202,164,204,255, 74,145, 85,113,136, 7, 0,116,213, 33, 33,132, 16, 66,200,139,162, 73,165, 9, 33,
-132, 16, 66, 94, 17,154, 84,154, 16, 66, 8, 33,228,111, 46,184,168,208, 34,132, 16, 66, 8,121,137, 69,214,159,138, 45,234,163,
- 69, 8, 33,132, 16,242, 98,170,236,163,197, 65,213, 87, 14,132,215,225, 1,158,231,234,131,112,202,164, 76,202,164, 76,202,164,
- 76,202,252,207,101,214,148, 29,142,215,223,100,252, 77, 3,150,210,165,175,148, 73,153,148, 73,153,148, 73,153,148,249, 95, 67,
-195, 59, 16, 66, 8, 33,132,188,236,194,234, 89, 84,104, 17, 66, 8, 33,132,188, 24, 26, 71,139, 16, 66, 8, 33,228, 21,113, 70,
- 73,171, 86,217,215, 64, 42,180, 8, 33,132, 16, 66, 94,142, 62, 40,105,213, 42,251, 74,133, 22, 33,132, 16, 66,200, 75, 84,233,
- 56, 90, 28, 0, 8, 11, 11, 99,165, 63,119, 10, 14, 14,190, 64,207, 21, 33,132, 16, 66,254, 78,111,106, 45, 82,222,162, 21, 28,
- 28,204, 98,130,209,125, 0, 0, 32, 0, 73, 68, 65, 84, 1,112,158, 94,106, 66, 8, 33,132,252, 19,222,196, 90,132,251, 76, 37,
-217,137, 94,102, 66, 8, 33,132,252, 19,222,196, 90,132,255, 76, 21, 73, 8, 33,132, 16,242,143,120,141,107, 17,103,148,116,132,
- 63, 94,250, 21, 40, 29,242,129,198,209, 34,132, 16, 66, 8,121, 49,101, 87, 27,254,101,234, 29,106,197, 34,132, 16, 66, 8,121,
- 49,149,141, 12,255, 61, 61, 45,132, 16, 66, 8, 33,175, 16,181,104, 17, 66, 8, 33,132,188,184,138,173, 90,127, 91,107, 22,205,
-108, 78,153,148, 73,153,148, 73,153,148, 73,153,255,165, 34,235, 79, 63,211,200,240,132, 16, 66, 8, 33,175, 8, 93,117, 72, 8,
- 33,132, 16,242, 98,202,174, 56,172,248, 51, 21, 90,132, 16, 66, 8, 33, 47,177,216,250, 11, 58,117, 72, 8, 33,132, 16,242, 98,
- 38, 87,245, 7, 42,180, 8, 33,132, 16, 66, 94, 81,193,197, 65,213, 87, 14,132,215, 33,248,121,174, 62, 8,167, 76,202,164, 76,
-202,164, 76,202,164,204,255, 92,102, 77,217,225,120,253,252, 99, 3,150,210,165,175,148, 73,153,148, 73,153,148, 73,153,148,249,
-159, 69,167, 14, 9, 33,132, 16, 66,254, 5,133,150, 61,159,207, 95,104,102,102,246,141,153,153,217, 22, 62,159,255, 37, 0,235,
-186, 62,160, 88, 44,158,225,228,228,244,192,201,201, 41,197,195,195,227,132,133,133,249, 71, 94, 66, 4, 1, 16,188,164,237,241,
- 3,240,145,153,153,217,125,145, 72,148, 8, 96, 23,128,143, 0,216,189, 72,240,231, 46, 24, 28, 53,179,255,145,207, 93, 48,248,
-153, 63,245,113,116,116,188, 4,160,199,203,122, 81,134,155,163,219, 16, 49,146,134,136,145, 52,220,252,249, 63, 53, 88, 88, 88,
-140,118,118,118,190,106,107,107,251,212,217,217,249,119,145, 72, 52,164,142, 17, 14,142,142,142,107,220,221,221, 99, 92, 92, 92,
-214,163,100,118,242,127,173, 14, 66,116,104, 45, 68, 86, 27, 83, 40,219,153,226,155, 54,166,232,222, 29, 48,127,206,184,246, 0,
- 14, 90, 90, 90,222,230,243,249, 97, 0, 6,149,238, 95,131,248,124,126,152,165,165,229,109, 0, 7, 75,151,123,158,253,116, 13,
-128,167, 0, 86,148,254,252,127,238,238,238,202,128,128,128,196,128,128,128,237, 62, 62, 62, 99,106, 27,102,110,110,222,221,221,
-221,253,144,135,135, 71, 98,155, 54,109,114, 93, 93, 93, 31,186,185,185,237, 16, 10,133,157,232, 45,142, 16, 66,254,253,250, 2,
-248, 2,192,166,200,200, 72, 25, 99, 76,198, 24,147, 69, 70, 70,202, 0,124, 3, 96, 37,170,110, 66,252,211,239,109,109,109,151,
- 46, 91,182,172, 40, 45, 45,141,101,101,101,177,152,152, 24,182,110,241, 60, 99, 79, 27, 62,243,178,183, 46,112,118,118,126,228,
-233,230,182,183,169,132, 59, 15,128,119,109, 50, 43,176, 54, 51, 51,187,190,120,241, 98,213,165, 75,151, 84, 90,173, 86,101, 52,
- 26, 85,169,169,169,170,240,240,112, 85,187,118,237, 84, 0,102, 1,224,213, 33,179,220,103, 46,184,192,126,248,148,125,230,130,
- 11, 21,127,223,168, 81,163,123, 70,163,145, 13, 30, 60, 88, 3,192,181, 46,153,207,114, 5, 68, 77, 45, 97, 53, 68,130, 12,253,
-142,207, 25,219, 60,135, 13, 17, 35,233,121, 50, 29, 28, 28,126,153, 49, 99,134,226,233,211,167, 76,163,209,176,164,164, 36, 54,
-101,202,148,124, 7, 7,135,221,181,220,118, 91,127,127,255,140,171, 87,175, 26,229,114, 57, 59,127,254,188,177, 89,179,102, 25,
-181, 44,182,186, 61,179, 46,223,187,184,184,156,168,203,205,193,193, 97,107, 93, 95,163,119,132, 72,210,201,206, 49,118,243, 12,
- 59, 58,184, 13, 91,215,210,141, 13,178, 49,149,183, 55,197,255,117,172,124, 40,147,170, 50,223,235,216,177,163,250,238,221,187,
-134,156,156, 28,118,239,222, 61,227,164, 73,147,138, 0, 68, 79,154, 52,169,232,222,189,123,198,156,156, 28,118,247,238, 93, 67,
-199,142, 29,213, 0, 38,214, 97, 61,185, 0,182,133,134,134, 50,198, 24, 91,182,108, 25, 11, 8, 8, 96, 93,186,116, 97, 42,149,
-138, 49,198, 18, 25, 99,219,245,122,253,251,181,201,148, 74,165,163,103,204,152,161, 42, 40, 40, 96,101,140, 70, 35,147,203,229,
-108,211,166, 77,106, 39, 39,167, 19, 85,124,200,160, 83, 30,148, 73,153,148,249,111,203,124,157, 57,163,164,159, 86,217,173,214,
- 13, 19, 35,230,205,155, 87, 86, 84,157,108,223,190,253,141,247,223,127, 95,246,254,251,239,203,218,183,111,127, 30,192,233, 91,
-183,110,201,230,206,157, 43, 3, 48,162,134, 23,194,186,109,219,182,242,244,244,116,230,235,235,203,234,213,171,199,210,211,211,
- 25, 99,140,221,124,175, 5,251,181, 49, 88,242,197,147,236,204,207, 7,217, 36,103, 62,235,224, 44, 45,118,118,114,202,177,179,
-179, 91,142, 63,207,201, 88,217,139, 59,176,113,227,198,202,232,232,104, 85,108,108,172,106,233,210,165,170, 46, 93,186,168,252,
-253,253, 85,131, 6, 13, 82,109,220,184, 81,165,211,233, 84, 91,183,110, 85, 89, 90, 90, 70, 87, 82,108, 61,119,161,197,231,243,
- 55, 68, 70, 70,178, 71,143, 30,177,210, 86,138,170, 50,165, 86, 86, 86,189,172,173,173,103, 89, 89, 89,245, 2, 32, 5, 0, 95,
- 64,210, 92, 10,143,255,107,238,213, 40,108, 68, 55,239, 77,221,222,110, 49,196,130, 43, 47,254,122, 14, 99,131, 61,158,171,208,
-146, 74,165,163, 63,250,232, 35,165, 70,163, 97, 5, 5, 5, 76,165, 82,177,130,130, 2,166, 84, 42,217,136, 17, 35, 20, 34,145,
-104, 96, 77,153,118,118,118,159, 95,188,120, 81,159,158,158,206, 46, 94,188,200, 78,156, 56,193, 54,111,222,108,116,112,112,248,
-170,174, 7,160,147,147,211,217, 51,103,206,200, 34, 34, 34,100,215,175, 95,151, 21, 23, 23,203,116, 58,157, 76,167,211,201,194,
-194,194,100,135, 15, 31,150,237,219,183, 79,166,213,106,101, 90,173, 86,166,209,104,100, 13, 26, 52, 56, 85,215,215,168,149, 16,
-201,218, 75, 71, 25,251,106, 26,203, 95, 53,149,201,103,191,203, 50,167, 4,177,111,222,118, 99, 65,102, 56,134,191,206,237, 89,
-105,166, 64, 32,184,144,152,152,104, 92,176, 96,129,182, 73,147, 38,249,227,199,143, 47,210,104, 52,140, 49,198, 52, 26, 13, 27,
- 63,126,124, 81,147, 38, 77,242, 23, 44, 88,160,125,252,248,177,145,207,231,135,215, 97, 61, 87,150, 21, 89, 23, 46, 92, 96, 21,
-169, 84, 42,214,165, 75,151,196,128,128,128,237,245,235,215, 31, 89, 83,166, 68, 34,233, 63,127,254,124, 21,171, 68,113,113, 49,
- 83, 42,149,236,241,227,199,198,122,245,234,165, 2,176,165, 55,115,202,164, 76,202,164, 66,235,149,153, 92,195,207,149, 63,137,
-115,231,206,149, 49,198,100,139, 22, 45,146,149,182,108,153, 0,144,148,222,248, 0,134,207,159, 63, 95,198, 24,147,205,155, 55,
-175,108,153,170, 94,136,190, 7, 14, 28,208,173, 95,191,158, 57, 58, 58, 50, 39, 39, 39,182, 97,195, 6,102, 52, 26, 89,122,216,
-110,246,107, 99,176,251, 11,199, 50,198, 24,139, 89, 62,157,253,218, 24, 44,254,219,207,216,168, 81,163, 10,204,205,205, 71, 84,
-243,226,218,180,104,209, 66, 89, 88, 88,168,218,177, 99,135,202,220,220,252, 38,128, 38, 40, 57, 21,201, 41, 93,215, 49, 77,154,
- 52, 81, 68, 69, 69,169,126,250,233, 39, 21,128,165,181,220, 97,188, 1,116, 22,139,197,131,230,187, 10, 98,217, 15,159,178,249,
-142,184, 11,160, 25, 0,251,210,101, 92,230,205,155,199, 24, 99,204,221,221,253, 98, 21,153, 82,127,127,255,121,177,177,177, 33,
-197,197,197, 33, 17, 17, 17, 33, 13, 27, 54, 92,208,175,129,115,155, 35, 35,186, 7,230,127, 54, 53,144,173,157,237,255,101,239,
- 86,221,246, 14,235, 52, 98, 92,125,187, 75,227, 29, 68, 5, 67,165, 60,229, 51,167, 14,107,181, 99,187,186,186, 94, 79, 74, 74,
- 42, 47,174,148, 74, 37,123,250,244, 41, 75, 72, 72, 96,151, 46, 93, 98,206,206,206,191,214,148,233,228,228,116, 47, 41, 41,137,
-125,187,110, 29, 27,220,172, 17, 11,178,178, 96, 29,173, 45, 88, 75,137, 72,221, 24,104, 89,215, 66,235,246,237,219, 50, 0, 50,
- 0,178,156,156, 28, 89, 78, 78,142, 44, 47, 47,175,252,119, 0,100,249,249,249,178,252,252,124,153, 86,171,149,121,121,121,213,
-185,208,106, 39, 66,187,119, 68,200,109, 35, 68, 97, 95, 87,187,212,169, 13,236, 12,215, 70,180, 97,121,211,186,176,245,129,174,
-172,189, 41,254,175,150,153,125, 77, 77, 77,207, 3,152, 83, 90,148,143,237,213,171, 87, 1, 99,140,245,234,213,171, 0,192,216,
-210,223,127, 84, 90,100,245,170,229,122,114,125,124,124,212,101, 45, 89, 0,174,248,248,248,168, 3, 2, 2, 88, 64, 64, 0,115,
-119,119, 87,150,102,215,234, 13,205,219,219, 59,166,176,176,176,188, 0,148,203,229, 44, 53, 53,149,197,199,199,179,232,232,104,
-118,243,230, 77,150,152,152,200,246,239,223,111,176,178,178, 58, 78,111,230,148, 73,153,148, 73,133,214, 43, 45,180,158,189,253,
- 89, 88, 88, 24,123,230, 87,171,110,221,186, 37,155, 63,127,190,172,134,202,108,242,162, 69,139,202, 90,189,190,168,230,159,255,
-214,152,152, 24, 54,118,236, 88,230,231,231,199,252,252,252,216,251,239,191,207,242,243,243,153, 42, 46,138,253,218, 24,236,230,
-208,150,140, 49,198,148,247, 35,216,175,141,193,100,163,218,178, 59,119,238, 48, 55, 55,183, 51,213, 60,254,177,223,127,255, 61,
-107,247,238,221,233, 40,233,143, 37, 0,208, 26,192, 6, 51, 51,179,109, 40, 57, 93, 88, 15,128,181,175,175,111,110, 65, 65,129,
-106,240,224,193, 42, 0, 30,213,100,118,244,243,243,123,180,117,235, 86,150,153,153,201,114,115,115,217,234,118, 13, 25,251,225,
- 83,182,172,101, 61,227,183,223,126,171,153, 51,103,142,218,198,198, 38, 12,128,203,224,193,131,245,140, 49, 22, 20, 20,148, 81,
- 89,152,149,149, 85,175,216,216,216,144,162,162,162, 16,185, 92, 30,146,155,155, 27,114,244,200,145,144,158,205, 26,142,205,255,
-108,106,224,145, 17,221, 3,123,187, 90, 15,250,170,199,219, 31, 60, 93, 48,113,240,162,182, 77,238, 23,173,156,121,238,189, 6,
-142,107,158,231,213,182,183,183, 79,211,104, 52, 12,192, 95,110,143, 30, 61, 98,182,182,182, 73, 53,101,216,216,216, 44,250,104,
-248, 48,195,192,122,174,236,209,250,197,172,248,236, 79,172,248,196, 14, 22,183,106, 54,235,231,100,167,104,109,194,157, 95,219,
-245,113,114,114, 58,123,253,250,245, 63, 21, 90,121,121,121,149, 22, 90, 10,133, 66,166,213,106,101, 62, 62, 62,167, 94,116,175,
-111,109, 10,175,142,102,188,155, 17, 99, 59,176,172,169, 93, 88, 47,169, 32,241, 5,226,134, 3, 56, 15, 96, 84, 29,239,199, 5,
-176,178,172,160, 90,181,106, 21, 99,140, 49, 31, 31, 31, 53, 94,236, 98, 20,105,163, 70,141, 18, 38, 78,156,168,111,220,184,113,
-102,187,118,237,228, 55,110,220, 96, 23, 46, 92, 96, 39, 78,156, 96, 7, 15, 30,100, 81, 81, 81,236,233,211,167, 44, 38, 38,134,
-245,233,211, 71, 14,160, 35,189, 23, 18, 66,254,205, 42,169, 69, 94,123,220,178, 13, 11, 14, 14,230, 84,216, 64, 41, 0, 81,203,
-150, 45,179, 86,174, 92,185, 22, 37, 99, 65,112,252,121,120,175,139, 25,255, 78, 23, 51,254, 29,127, 30,222, 43,109, 49,250,126,
-249,242,229,159, 7, 4, 4,164, 1, 48, 3,224, 84,217, 3, 49,198, 58,216,218,218, 34, 41, 41, 9, 82,169, 20, 82,169, 20, 73,
- 73, 73, 96,140, 65,207,128, 98, 6,104,116, 58, 20, 22, 22,162,200,200, 80,104, 4, 20, 42, 21,156,156,156,160,211,233,188,170,
- 88,255,230, 67,135, 14,245,242,247,247,207,154, 59,119,110, 42, 74,250,202,108,155, 48, 97,194,217, 43, 87,174,248,171, 84,170,
-220,232,232,232,162,102,205,154,245, 2,224, 20, 27, 27, 59,122,211,166, 77, 24, 59,118, 44,170,249,167,211,172, 79,159, 62, 39,
-162,162,162,188, 70,141, 26,133,243,231,207, 99,245,234,213,200,206,206,102, 0,160,209,104,152,193, 96,208,181,109,219, 86,183,
-126,253,250, 86, 65, 65, 65,215, 27, 52,104,192, 3,128,132,132,132,184,202, 2, 57, 28, 78, 67, 79, 79, 79,104, 52, 26,100,101,
-101, 33, 42, 42, 10, 22, 82, 41, 34, 83,179, 29, 59,125,245,109,206,194, 35,103, 5,195, 91,249,219,204,234,222, 78,179,226,204,
-121,223, 38, 46,142,142, 90, 93,177, 83, 76, 90, 70,234,243,188,168, 38, 38, 38, 73,217,217,217,208,106,181, 40, 44, 44,132, 66,
-161, 64, 78, 78, 14,178,179,179,145,154,154, 10, 19, 19,147, 71, 53,101, 88,230,230, 94, 76,248,253, 2,103,255,119,171,224,165,
-207, 5,255,208, 6,240,127,249, 6,222,218, 44,108, 89, 60,197, 66,107,107, 31,106,105, 97,145,103,101,101,245, 61, 0,159,154,
-242, 2, 3, 3,145,147,147,131,156,156, 28,216,218,218,194,218,218, 26,214,214,214,144,203,229,200,207,207,135, 66,161,128,175,
-175, 47,154, 55,111,142,157, 59,119,190,148,157,251,154, 22,241,122, 24,166,158,125,152, 10, 19,177, 24, 13,172, 37,158,111, 75,
- 96, 83,205, 93,186, 8, 4,130, 3, 54, 54, 54,103, 0, 76, 3, 32, 6, 48,205,198,198,230,140, 64, 32, 24, 0, 96, 25,128,221,
-117, 92,141, 21,161,161,161,243, 98, 99, 99,205,239,220,185,131,185,115,231, 98,233,210,165,136,139,139,251, 26,128,177,116,153,
- 15,109,109,109,195,184, 92,238,255, 0,188, 11,160,151,179,179,115,215, 26,114, 7,204,153, 51,167,168, 69,139, 22, 49,247,239,
-223, 31,240,251,239,191,183,156, 61,123,118,254,147, 39, 79, 16, 19, 19, 3,103,103,103,184,187,187, 67,165, 82, 33, 47, 47, 15,
- 3, 6, 12,144, 90, 90, 90,142,160,183,113, 66,200,191,185,200,122,166, 22,121,221, 90,180, 42,253,185,210, 79,212,230,230,230,
-161, 50,153,172, 77, 64, 64, 0, 31,192,126, 0,240,231, 97,200,128,182,111,109, 59,242,253,170,128,195,235, 23, 7,244, 12,240,
-221,230,207, 67,217, 85,108, 97, 45, 91,182,180,150,201,100,109,133, 66,225,255, 85,177, 18, 12, 0,172,173,173, 33,149, 74, 97,
-101,101, 5,107,107,107, 24,141, 70,168, 10,138,160, 54, 0,202, 34, 45,242,243,243,161, 44,253, 89,165,209, 65,173, 86,151,223,
-183, 18,157, 38, 78,156,152,181,105,211,166,204,180,180,180, 85, 0,154,141, 29, 59,182,255,198,141, 27,241,219,111,191, 21,189,
-235,231,109,187,188,195, 91,159, 55, 73,139, 11,241, 19, 96, 18,128,139, 23, 47, 94, 68,219,182,109,193,225,112,134, 85, 22,104,
-102,102,246,205,222,189,123,205,162,163,163,225,237,237, 29, 61,108,216,176,247, 86,173, 90,229, 37, 86,229, 94, 6, 0,125, 78,
-122,244,244,233,211, 63, 93,190,124,121, 86, 86, 86,150,174,160,160,192,161, 95,191,126, 72, 74, 74,194,211,167, 79,175, 84, 81,
-100,198, 68, 68, 68,176,252,252,124,196,199,199, 35, 34, 34,194,236,211, 79, 63,109,101,224,114,251,167,192, 98,220,216,118, 45,
- 91,141,106,253, 22,118, 95,189, 99,114,233, 97,130, 85,203,122,174,214,183,147,211,234, 23,115,240,232,121, 94,109,165, 82,185,
-225,243,207, 63, 87,169, 84, 42,164,164,164,224,238,221,187,184,127,255, 62, 18, 19, 19,177,122,245,106, 85,110,110,238,198,154,
- 50, 92, 68,252,143,215,204,158,192,225,223,187, 2,220,185, 0, 20, 40,129, 66, 21, 52, 15,100,216,254, 32, 29,155, 15,253,108,
-250, 36, 41,201,106,223,190,125, 19, 61, 60, 60,100, 0,124,171,203, 99,172,228, 37,228,114,185,207, 22,161,224,114,185, 74, 0,
-233, 98,177, 56,217,194,194, 34,153,203,229,166, 51,198,212, 47,229,147,132, 30, 58,240,120,128,169, 25,184,130,106,167,246,124,
-111,216,176, 97,123,147,147,147,123,198,199,199,183,217,184,113,227,231, 34,145, 40,114,227,198,141,159,199,199,199,183, 73, 78,
- 78,238, 57,108,216,176,189, 0,198,212,229,241,125,124,124,166,135,132,132, 96,245,234,213,104,222,188, 57,124,125,125, 11, 66,
- 67, 67, 55, 0, 88, 12,224,255,124,124,124, 46, 79,159, 62,125,124,102,102,166, 83, 74, 74, 74,243,175,191,254,122,202,134, 13,
- 27,222, 78, 77, 77, 21,213, 16,221,190, 71,143, 30, 56,121,242, 36, 0,164, 1,136,207,201,201,209,167,166,166,162, 81,163, 70,
-104,213,170, 21, 84, 42, 21, 84, 42, 21,228,114, 57, 60, 61, 61, 97, 52, 26,219,208, 91, 57, 33,132,252,173, 5, 87,229,133,150,
- 72, 36,178, 14, 12, 12, 68,131, 6, 13,172, 81,122,181,150,173, 41,127,193,172,137,195,205, 37,178, 83,224, 68,252,138, 97, 29,
-154,154,219,154,242, 23,148,222,133,239,233,233, 41, 12, 12, 12,132, 88, 44,118,173,226,193,207,167,167,167, 35, 48, 48, 16, 86,
- 86, 86,144, 74,165, 8, 12, 12,132, 78,167, 67,190, 82, 9,181, 1, 40, 40, 54, 34, 63, 63, 31,185, 89, 25, 40, 48, 0,122, 11,
- 91, 36, 38, 38,130,199,227, 37, 84,145,233,236,237,237,157, 21, 25, 25,153, 5,224, 34,128, 15,150, 46, 93,138,249,243,231, 99,
-201,146, 37,123,205,211, 30,247,216,123,242, 23,219, 61,161, 31,218,251,154,114,134, 3,208, 37, 39, 39,195,202,202, 10, 98,177,
-184,210,194, 32, 40, 40,168,133, 88, 44,198,142, 29, 59, 88, 74, 74, 74, 59,148, 92,194,159,192,225,148, 20,123,102, 92,228, 3,
-216, 32,147,201,222,249,244,211, 79, 31,118,235,214, 77,208,186,117,107, 44, 91,182, 12, 0,194, 42,203,148,203,229,215,198,140,
- 25,163, 61,119,238, 28, 30, 60,120, 32, 62,114,228,200,144,101,203,150, 53,125,242,228,137,240,216,137, 83,189,119, 37, 43,134,
-172, 58,115, 73,180,252,244,249,107,118,150,226, 38,245,237,108, 16,241,228,169,137,129,135, 27, 53,189,162,239, 8,120, 19, 59,
-137,248, 17, 29,132,220,180, 78, 34,190,236,109, 1,111,130, 82,169,220,119,244,232,209,211,179,103,207, 86,101,102,102,194,194,
-194, 2, 57, 57, 57, 88,177, 98,133, 42, 34, 34,226,144, 86,171, 61, 86, 83,174,193,200, 90,184,215,243, 0, 30, 69,150,255, 78,
-103,100,184,161, 53, 65,240, 7, 51,225,215,168, 17,180, 90, 45,154, 53,107,198, 89,186,116,169, 88, 42,149,126, 82, 99,209,195,
-253,203,238,166,231,112, 56,233,140,177,167, 42,149, 42,197,204,204,236,137,137,137,201,147,220,220,220, 20,198, 88,198,203,168,
-179, 24, 23, 31,183,109,230, 3, 8,205,240, 36, 71,149,122, 83,133,220,202, 22,180,176,176,152,176,121,243,102,209, 15, 63,252,
- 80, 60,125,250,116,205,148, 41, 83, 4,133,133,133, 14, 83,166, 76, 17, 76,159, 62, 93,243,195, 15, 63, 20,111,222,188, 89, 36,
-145, 72, 6, 61,207,138, 20, 23, 23, 35, 50, 50,114, 85, 92, 92,156, 24, 37,195,141,204, 12, 13, 13, 29, 27, 27, 27, 43,218,180,
-105, 19, 14, 30, 60,136,131, 7, 15,162,127,255,254,152, 49, 99, 6, 66, 66, 66,170,139, 51, 15, 8, 8, 8,180,181,181,197,133,
- 11, 23, 82, 1, 60, 1,208, 66, 34,145, 88,244,239,223, 31, 61,123,246, 68, 81, 81, 17,116, 58, 93,121,161,197,227,241, 96,101,
-101,101, 75,239,129,132, 16,242,202,139,172, 63, 21, 91,124, 0, 40,107,170, 11, 14, 14,230, 84,247,143,209,144,151, 9,185,186,
- 0,137,249, 5, 72,202, 51,254,233,111, 70,163,177,218, 71, 79, 77, 77, 61,118,245,234,213, 9,129,129,129,252,212,212,146, 51,
- 98,129,129,129, 40, 40, 40, 64,234,157,235, 80, 27, 1,177,183, 63,212,106, 53,242,238,223,134, 36,160, 13,108,251,140,194, 87,
-155, 54,105,114,114,114,190,171, 44,211,212,212, 84,224,230,230,150,149,144,144,160, 7,144, 43,149, 74,123,120,120,120,224,252,
-249,243, 0,176,155, 1,107, 16,113, 14,184,112, 24,172,164, 73, 69,226,233,233,137,204,204, 76,168, 84,170,243,149,101, 94,189,
-122, 53,182,184,184,184, 89,191,126,253, 56, 63,254,248,227,126,133, 66,177, 4,192, 93,141, 17,188, 59,201, 25, 80, 27, 32, 2,
-208,221,218,218,250,163,144,144,144,174,211,167, 79,199,209,163, 71,113,230,204, 25, 29, 74,250,130, 93,173, 36, 54, 63, 62, 62,
-126,203,156, 57,115, 90,115,185,220, 15,206,158, 61,171,247,245,245, 85,232,116, 58, 67, 67, 63, 63,238,146,165,159,153, 76,251,
- 96,178, 85, 78, 1,238,245,108,232,220,150,195, 1,238, 61,205,124, 18,167, 66, 78,117,207,105,144, 41, 47,108, 64,187,128,160,
- 9,195,250, 74,196,222, 77,160,142,186,238,180,229,192,137,175,204, 34, 98,131, 47,100,102,246, 63,122,244,232,144,243,231,207,
- 79,211,106,181, 13,132, 66,225, 35,185, 92,190, 94,165, 82,213, 88,100,241,120,188, 62, 26,103, 55,107,121,110, 46, 68,165, 45,
- 81,138, 98, 35,178, 53,122, 60,176,242,197, 8, 55,247,242,211,160,233,233,233,112,114,114,226, 24, 12,134,190,213,101,158, 57,
-115, 6,193,193,193,101,133, 39, 56, 28, 14, 56, 28, 78,182,159,159, 95,134, 80, 40,204, 49, 49, 49, 81,172, 89,179,166,168,168,
-168, 8,124, 62, 95,100, 48, 24,120, 47,178,183,183, 50,135,131,144,113,190,153,210,175,115,183,230, 77, 26,177,139, 55,239,112,
-242, 10,138,182, 87,211, 10,248,181,143,143, 15, 63, 55, 55,247, 24,128, 7,197,197,197,123,246,239,223, 47, 26, 61,122,116,209,
-129, 3, 7, 70, 2,240, 90,187,118,237, 16,149, 74, 85,167, 41, 21,226,226,226,190, 94,190,124,249,188, 69,139, 22, 97,231,206,
-157,211,227,226,226,230,151,182,116,245, 15, 9, 9,193,154, 53,107,176,115,231, 78,227,131, 7, 15, 78, 24,141,198,184,217,179,
-103, 7, 56, 58, 58,102,167,165,165,197, 85, 19,219,178, 87,175, 94,154,203,151, 47,155, 42,149,202, 75, 0, 62,154, 58,117,234,
-196,119,222,121, 71, 49,108,216, 48, 73,110,110,174,220,220,220,220,116,235,214,173,214,124, 62, 31,106,181, 26, 28, 14, 7, 74,
-165, 82, 75,239,131,132,144,127,171,170,106,145,215, 68,149,255, 27,248,149,109, 96, 65, 65, 65, 70, 82, 82, 82,163,167, 79,159,
-234, 1,232, 1, 32, 71,171,255, 98,249,214,195, 63, 12,106,237, 35, 78, 43, 46,198,145,155,209, 5, 57, 90,125, 89,231,119,253,
-211,167, 79,149, 79,158, 60,177, 40, 44, 44, 84, 85,241, 88, 87,190,249,230,155,194,115,231,206, 89,196,199,199,195, 96, 48,160,
- 69,139, 22,136,137,137, 65,222,131, 72,136, 27,181,128,184, 99, 48,162,101, 55, 17,113, 38, 28,143, 85, 90,253,195,197,203,243,
- 85,106,117,136, 78,167, 59, 82, 89,160, 64, 32,200, 5,192, 24, 99, 6, 0, 80, 40, 20,119, 85, 42, 85, 7, 71, 71, 71,220,187,
-119, 79,172, 54, 96,198,144, 5, 95,109,100,140, 25, 76, 74,174,230,154, 53,108,216, 48,220,186,117, 11, 0,110, 85,150,169, 80,
- 40,166, 79,154, 52,233,220,142, 29, 59,248,241,241,241, 61,127,248,225,135,158, 15, 31, 62,100,156,220, 36,195,229, 2, 1,188,
-198,206,120,251, 91, 79,191, 51,193,193,193,112,118,118,198,214,173, 91,177,126,253,250,226, 15, 63,252, 48,118,253,250,245,111,
-103,102,102,238,169, 98,251,243,229,114,249, 41, 91, 91,219,105, 77,155, 54, 85,170,213,106,228,228,228, 32, 53, 53, 21, 54,182,
-182, 92, 61,184,109,237,173,172,246, 28, 75, 87,138,249,167,174,225,122, 74, 90,181,173, 89,173, 5,188, 49,131,130,222, 10,250,
-191, 69, 11, 36,184,124, 4,156, 73, 33, 96, 63,124,142,153,239, 15,177, 40,210,236,233,168,190,147, 56, 90,166, 80,236, 82, 40,
- 20, 7,235,184,179,244,106,219,182,237,222,229,203,151,155, 45, 92,189, 28,107, 27,185, 66,159,147,131, 44,141, 1,217, 26, 61,
- 20,121, 15,112,239, 94, 52,108,109,237,240,248,241, 99, 20, 21, 21,225,254,253,251,140,199,227, 29,171,169, 69,167, 76,133,211,
-133,114,161, 80,152, 35, 16, 8, 50,248,124,126,110,124,124,188,186,168,168, 8, 92, 46, 87,108, 48, 24,204,106,177,174,110,118,
-118,118,179, 81, 50,152,232, 81,101,118,246,134, 64, 1,172,192, 71, 39, 79, 59,219,222,139,167,140,182,243,112,113,144,199,199,
- 62, 42,254,238,244,239,217, 69,154,170, 47,214, 0, 16,150,155,155, 91,222, 34,121,224,192,129,153, 7, 14, 28,152, 8, 96, 27,
- 74,230,221, 10,151,203,229,223, 62,199,193,183,248,208,161, 67,243, 22, 45, 90, 4, 51, 51,179,242,193, 83,205,204,204, 68, 0,
-240,211, 79, 63,225,222,189,123,239,160,180,191,150,209,104,220,155,150,150, 86, 83,166,151,191,191,127,252,225,195,135, 77, 1,
-184, 76,157, 58,181,205,198,141, 27,241,254,251,239,103, 69, 71, 71,183, 6,144, 0,192,235,131, 15, 62,184,177,115,231, 78,107,
-163,209,136,188,188, 60,104,181,218, 4,122, 43, 39,132, 80,177,245, 74, 4, 2,136, 64,201,248, 89,125, 0, 28, 71, 73,183,142,
- 42,185,151, 86,103,167, 1,244, 43,251,255, 88, 69,103,120,160,228,138,172, 83, 0,254, 7,192,177,170, 80, 91, 91,219, 79,198,
-142, 29, 91,156,146,146,194,210,211,211,217,193,131, 7,217,172, 9, 99, 13,221,189, 93,140,222, 46,142,106,123,123,251, 24,103,
- 59,155,237,111,153, 99, 22, 0,183, 90,108,216,216,135, 15, 31, 78, 30, 59,118,236,132,210,199,157,176,119,239, 94,213,217,179,
-103, 85, 60, 30, 47, 12, 37, 67, 59,148, 21,148, 99,250,246,237,171,210,104, 52, 42, 63, 63,191, 92,148,116,220,175,202,144, 78,
-157, 58,229,157, 60,121,146, 25, 12,134,191,140, 81,148,149,149,197,206,156, 57,195,218,181,107, 39, 7, 48,186,107,215,174,231,
-127,255,253,247,243,237,219,183, 63, 84,211, 10,219,217,217, 45,184,115,231,206,173,196,196, 68,217,241,227,199,101,123,246,236,
-145,125,240,193, 7,119, 3, 2, 2, 10, 99, 99, 99,141,122,189,158,221,185,125,155,249, 53,108,168, 6,224, 89, 85, 78, 23, 51,
-254, 13,197,214,207, 89,209,178,247, 89,209, 0,119, 6,128, 41,191,250,132,101, 76,239,198, 98,166,245,102,157, 69,188,171,207,
-179,167,216,216,216,156,190,117,235, 22, 83, 42,149, 44, 42, 42,138,141, 9,238,201,174, 78,236,198, 78,245,244, 97, 59, 59,214,
-103, 95,245, 8, 96, 61, 59,118, 96,223,124,243, 13, 59,124,248, 48, 91,176, 96,129,209,206,206, 78,137,106,250,104, 57, 57, 57,
-157,221,191,127,191, 12,128,140,199,227,201, 20, 10,133, 76,169, 84, 30, 75, 78, 78,222,236,231,231, 55,175,105,211,166, 35, 27,
- 53,106,212,165,115,125,207,121, 93, 45,132, 49,221, 44, 69,143, 26, 74,204,191,194, 95,199,189, 42, 39, 5, 60,189,189,188,148,
- 23, 46, 92, 48,106, 52, 26,118,233,210, 37, 99,227,134,190, 69,107,135,246, 58,244,120,235,202, 67, 69, 39,127, 60, 93,240,203,
-247,191, 31, 24, 23, 28,217,201,156,251, 99, 27,113,249,112, 28,207,107, 56,128, 35,248,227,170,195,177, 0,126, 65,245, 87, 33,
-114, 1,108, 91,182,108, 89,197, 43, 13, 1,128, 27, 16, 16, 32, 99,140,201, 2, 2, 2,100,117, 93, 17,115,115,243,217, 71,143,
- 30, 13,245,240,240, 88, 61,108,216,176,173,114,185,252,248,200,145, 35, 35, 81,114, 49, 8, 7, 37,179, 35,244,117,115,115,203,
-138,136,136, 96,231,207,159,103,131, 7, 15, 86,154,152,152,140,162,183,113, 66, 8,121, 37, 38, 87,241,181, 90,203, 35, 35, 35,
-203,198,208,154, 90, 93,248,252,249,243,101,183,110,221,146,161,100,148,248,106,241,249,252,159, 63,252,240, 67,230,232,232,168,
-114,112,112,248, 89,192,227, 77,116, 55, 67, 32,158,239, 82,247, 14,187,118,237,234,255,245,215, 95,247, 1,240, 14, 0,129,171,
-171,107,106,122,122,186,234,247,223,127, 87,181,107,215, 78,101,103,103,151,233,239,239,175, 90,187,118,173,170,184,184, 88, 53,
-123,246,108, 21,254, 58,222, 87,101, 68, 0,166,153,154,154,254,220,184,113,227,200,197,253,186, 20,175,158, 49,145,141,245,177,
- 87, 1,248, 26,192,135, 0,172, 0, 8,134, 12, 25,242,235,253,251,247, 79,251,251,251,111,169, 69,174, 75,211,166, 77,127,219,
-187,119,239,173,195,135, 15,203, 62,249,228,147, 91,182,182,182, 41,177,177,177,198,162,162, 34,150,151,151,199,228,114, 57, 59,
-126,252,184,193,198,198,102, 83,149, 27, 46,228,165,177, 51,187, 43, 29,194, 33,121,209, 40,214,206,148,251,244,121,246, 20,177,
- 88,156,155,147,147,195,210,211,211, 89,124,124, 60, 59,116,232, 16,235,213,182, 21,219,247,193, 32,182,123, 66,127,182,166, 87,
- 43,246,142,133, 72,237,100, 33,185,101, 97, 97,145, 89,155,171, 14,157,156,156,206,106, 52,154,242,225, 27,220,220,220,100,126,
-126,126,135,253,253,253,191, 58,122,244,232,204,117,235,214,245,239, 92,223,115,222,138,158,109, 11, 11,194, 15, 48,229,254,175,
-217,252, 22,190, 69,165,197,124,165, 92,109,109,118, 93, 56,127,222, 88, 86,252,234,245,122,118,228,231,159,217,208,222,221, 35,
-243, 79,253,244,191, 75, 33,211,247,206,110,225,123,164,157, 8,195,171, 43,216,202, 63,138, 72, 96, 27,100,201,221,252,174,135,
- 77, 90, 7, 41,247,235,214, 22,127,154, 94,106,168,175,175,111, 60, 99, 44,173, 81,163, 70,241, 0,118, 55,106,212,168,226,207,
-227,170,136, 45, 31,156, 52, 52, 52,148,149, 30, 31, 92, 0, 75,150, 47, 95, 46, 99,140,201,124,124,124, 46, 3, 64,115, 49,236,
- 58, 74,185,255,235,231,229,152,211, 81,202,253, 95,115,113,229, 83, 70,121,154,160, 97, 7,123,243, 75,253,125,156,149,157, 92,
-165, 23,119,111,255, 97,245,187,239,190,187, 21,192, 38, 0,159,219,218,218, 94, 26, 62,124,248,189,157, 59,119,222, 91,187,118,
-173, 46, 54, 54,150,141, 31, 63, 94, 45, 20, 10, 63,167,247, 65, 66, 8,121,101,202, 70,134,119,174, 75,161,213,119,222,188,121,
- 50,198, 88,217, 88, 90,163, 43, 89,166,223,162, 69,139,100,140,177,178,209,225,159, 29,192,172,178, 1,205, 66, 55,111,222,204,
-132, 66,225,255,158,115, 99, 42,102, 58, 13, 24, 48,160,181, 66,161,120,219,209,209,241,237,210,150, 43,119, 59, 59,187,248, 61,
-123,246,168, 10, 11, 11, 85,140, 49,149, 94,175, 87,221,186,117, 75,213,169, 83, 39, 85,133, 79,253, 53,173,231,159, 44,116,194,
-229,155,139, 39,176,133, 78,184,252,204,159, 70,109,219,182,237,100, 66, 66,194, 49, 75, 75,203,185,181,204,116,183,183,183, 95,
- 98, 99, 99,115,218,206,206,110,161,141,141, 77,154, 78,167, 99,121,121,121, 44, 38, 38,134,157, 63,127,158, 93,189,122,149,217,
-216,216,164, 84,181,158, 93,205,248,215,242, 86, 79, 99,198,109,203,153,118,227, 2, 6,128,201,215,205,103,217,223, 44,101, 55,
- 39,245,100,157, 68,188, 43,207,241,124,194,202,202,234,251,159,127,254,217, 24, 23, 23,199,194,194,194,216,241,227,199,217,140,
- 25, 51, 88, 67, 23,103, 77,107, 83,110, 70, 7, 33,255,244,243, 12, 88,170,209,104,100, 10,133, 66,166, 82,169,100,141, 27, 55,
-150,181,106,213,234,112,235,214,173,191, 58,112,224,192,204, 21, 43, 86,244,239,106, 33,140, 41, 8, 63,192,216, 39,189, 25,155,
-214,158, 61,154,216,137,117, 49,227,223,169, 50,211,209, 49,165,108,180,118,181, 90,205, 46, 94,188,200,126,251,237, 55,230,100,
-103,167, 8, 50,227, 77,110, 39, 68,199,118,150,176,170,237,122,118,150,114,183, 95,251,230, 11, 67,225,201,157,236,167,177,189,
-245,157,172,184,155, 43, 44,183,143, 49,150, 54,120,240,224,199,140,177,180, 67,135, 14, 37, 51,198,210, 6, 13, 26,244,152, 49,
-150, 6, 96,111,101,153,207, 12, 78,186,173,180,200,154, 22, 26, 26, 42, 99,140,201, 66, 67, 67,101, 64,201, 32,170, 29,165,220,
- 29,215,183,172, 49,106,142,239, 96, 7,198,247, 49,116,148,114,119, 84,186,158, 86,252, 99, 17,219,214, 49,237,233,221,236,231,
- 25, 35, 13,237,157, 44, 47,248,250,250,174,153, 57,115,230,225,171, 87,175,222, 53, 24, 12,247,226,227,227,239,109,218,180,233,
- 94,155, 54,109, 46,219,218,218, 70,154,154,154,126, 88,211,107,244,146, 80, 38,101, 82, 38,101,146,103, 27,152,170,249,219,177,
- 85,171, 86,137, 25, 99,179,135, 12, 25,130,149, 43, 87, 14,109,218,180,233,112, 87, 87, 87,123, 0, 72, 77, 77, 45,136,138,138,
- 82, 12, 25, 50, 4, 75,150, 44,193,234,213,171,191, 66, 73, 95,150,191, 83,250,145, 35, 71,220,166, 79,159,158,185, 98,197, 10,
-227,248,241,227, 27, 1,136,202,206,206,110, 56,114,228,200,105,124, 62,127,136,167,167,167,127, 90, 90, 90, 86, 97, 97,225,110,
- 0, 91, 80,195, 57,211,170, 8,185, 48,180,172,231,140,211, 92, 24, 42,252,186,247,146, 37, 75,134, 13, 26, 52, 72,183,110,221,
- 58,189, 66,161, 56, 90,203,184,228,172,172,172,207,202,126,176,177,177,113,186,115,231,206,135, 14, 14, 14,220,248,248,120,104,
- 52, 26,196,197,197, 25, 81,114,106,170, 82, 42, 61,219,240,237,161,179,126,179, 71, 5, 91, 22, 60,184, 13, 19, 30, 15,197, 2,
- 83,164, 95, 59,141,109, 23, 31, 40,212, 58,108,124,158,237,148,203,229, 95,206,152, 49, 99,228,220,185,115, 69,158,158,158,156,
- 43, 87,174, 96,255,254,253,154,204,204,204, 94, 0, 46,252, 49,244, 83,221, 24,141, 70,152,154,154, 2, 0,230,207,159, 15, 46,
-151, 43,200,204,204, 52,229,112, 56, 66, 14,135, 99,206,225,112,120,197, 9,247, 96, 84,228, 33, 35, 79,142,228, 12,121,181,121,
- 6,163,113,255,245,235,215,103,189,245,214, 91,220,155, 55,111, 34, 43, 43, 11,113,113,113,204,192,216,222,139,133,134,146, 78,
-137,154,218,175,159,185,141,237,128,230,214, 66,174,233,246, 37, 8,210,114,121,223, 25, 49, 24, 37, 99,105, 1,192, 54, 14,135,
- 99, 2, 32,167,113,227,198,157,239,223,191,111,214,184,113,227,194, 7, 15, 30,156,228,112, 56,174, 0,118, 84,150,105,102,102,
-150, 13, 32,251,208,161, 67, 0, 48, 9, 37, 79, 94,139,144,144,144,180,139, 23, 47, 34, 52, 52, 52, 3,192,102, 0,144, 88,219,
-246,243,151,154,112, 76,127, 12, 69, 27, 13,184, 27,141,172,210, 86, 87,137,131, 99,151,166, 98, 46, 4, 63,124,138,183,157,252,
-184,166,122, 93,179,165, 75,151, 94, 84,169, 84,154,125,251,246,105,199,141, 27,199,139,141,141,189, 1,224, 18,128, 67, 40,237,
- 99, 73, 8, 33,228,149,122,182, 5,171,198, 62, 90,207, 86,173, 43, 1,124,251,240,225,195,242, 73,165, 31, 62,124, 40, 3,240,
- 29, 74, 70,131,239, 91,135,138,119,113,105,139,214,150,231,220,152,103, 51, 69,129,129,129,102,247,239,223, 55, 65,229,147, 56,
-114,158, 35,243, 47, 42,155,235,208,215,215,119,125,113,113,241,225,239,190,251,238, 0,143,199, 27,249, 2,213,190,167,143,143,
- 79,222,158, 61,123,140, 97, 97, 97,108,241,226,197, 6,103,103,231, 60,252,181,143,214,159, 50,131, 76,121, 7,231, 52,114, 85,
-220, 26,221,158, 61,154,217,143, 93, 26,213,137, 77,118,149, 40,130, 68,188,253, 47,248,169,196, 71, 42,149,110, 51, 51, 51, 83,
- 88, 90, 90,158, 5,208,246, 69, 94, 35, 91, 91,219,157, 78, 78, 78,103, 43,222, 28, 29, 29, 15,219,219,219,127,109,103,103,183,
-216,202,202,106,138,151,200,116,221,204,134, 46, 69,145, 3, 26,179,240,118,246,108,148,157,233,179,167, 14,159, 93, 79,103, 47,
- 47,175,156, 93,187,118, 25,143, 29, 59,198, 22, 44, 88, 96,172, 87,175,158, 2,213,244,107,171,182, 69,203,138,183,255,224,160,
-214,198,140, 62,174,108,101, 35, 11, 99,103,107, 94, 85, 87, 40,142, 42, 45,128,199,214,148,233,237,237,253, 29, 99,108,251,178,
-101,203,182,227,143,185, 64,187, 47, 93,186, 52,132, 49, 22,178,116,233,210, 16, 0, 61, 1, 32, 72,202,221,181,187,127, 75, 67,
-234,187, 46,236,139, 70, 18, 67,144,148,187,171,210,150, 76, 27,254,145, 95, 38,246, 49,166, 77,108,199,150,248,136, 13,173,109,
-132,191,154,154,154,206, 68, 73,139,115, 43, 0,166,244,169,153, 50, 41,147, 50,169, 69,235, 95, 87,120,213,138,147,141,141,205,
-182, 6, 13, 26, 28,240,244,244, 60, 32,145, 72,190, 66, 73,167,249,186,190, 16, 94,203,151, 47, 87, 72,165,210,230, 47,241,197,
-117, 0,224,138,191, 78,156,251,210,118,152,207,156, 49, 61,118,238,208, 59,159, 57, 99,122,133, 95,183,106,212,168,209, 23, 40,
- 25,205,251, 69,119, 66, 79, 27, 27,155, 77, 54, 54, 54, 41,165,125,179, 60,107,147,217,146,199, 27,217, 89,196,187,210,214,148,
-155,222, 89,196,255,253,109, 30,111,196,107,122, 0, 86,119,177, 69, 85,153,110,118,118,118,235,108,108,108, 82,237,236,236, 54,
-213,177,200,250, 83,102,115, 51, 56,119,177,226, 29,105,107,193, 81,119,145,242, 14,181, 52,175,250,162,142, 58,108,123, 96,104,
-104,232,251,140,177,247, 93, 92, 92,134, 84, 40,252,253,151, 44, 89, 18,204, 24, 11, 46, 27, 1,190,149, 57, 28, 58, 89,241,246,
-180,179,228,200, 59, 89,241,246,180, 50,135, 67, 85,235,217,217,138,183,191,157, 37, 71, 30,100,201,221,227, 33, 68, 61,122, 51,
-167, 76,202,164, 76, 42,180,222,140, 66,139,118, 24,202,164, 76,202,164, 76,202,164, 76,202,164, 66,171,242,194,170,226,173,252,
- 12, 27,159,158, 27, 66, 8, 33,132,144, 23, 82,229,128,165,156,106,170,210,186,116,108,127,158,202, 54,156, 50, 41,147, 50, 41,
-147, 50, 41,147, 50,255,115,153, 53,101,255,221, 23,214, 19,174,245,180, 0, 0, 32, 0, 73, 68, 65, 84,189,214,168, 89,149, 50,
- 41,147, 50, 41,147, 50, 41,147, 50,255,179,184,244, 20, 16, 66, 8, 33,132,188,144,192,210,175,207, 14, 92, 90,121, 31, 45,126,
-171,101, 25,122,189,222, 1, 0,248,124,126,102,241,141,197,206,213,165, 11,128,174,250,146,233,119,192, 7, 38,233,129,179,149,
-100,158,213,235,245,214,165,153,121,197, 55, 22,247,172, 54,179,213,178,211, 21,151,215,223, 88,220,253,217,101, 24,192, 19,180,
- 90,150,250,204,186,186,212,246, 89,225,224, 79, 99, 98,189,178,245,124, 93, 50,255,203, 4,239, 44,203, 40, 46, 46,217,143, 4,
- 2,126,166,238,122,245,251,145,201, 59,203, 82, 43, 46, 95,124,125,177, 99,117,153,230,102,194, 28,111, 87,251,175,170,203,140,
- 79,205,158,173, 46, 40,178,173, 46,179,174,199,166,187,179,115, 87, 67,233,177,201, 3, 38,165,164,165,157,253,151,237, 75, 45,
- 1, 44, 6, 96, 89,225,119,145, 0, 62,162,189,146, 16,242,154, 21, 90, 17, 40,153,231,240,251,210, 98,235,251, 42, 11, 45,189,
- 94,239, 32,251, 57, 4,106, 13,208,117,204, 50, 7,175, 1, 91,254, 50, 81,178,190, 40,207, 84, 30,189,207,159, 87,172,176,182,
-231,235, 44, 83, 83, 83, 57, 0,192,225,112,254, 7,192,163,146, 76,107,217,207, 33, 40,208, 2, 65,195,151, 90,123, 0,150, 89,
- 38, 38, 31,155,137,197,157, 11, 11, 11,155, 2,128,153,153, 89,116,161, 90,125,206, 94,167, 91,251,236,242, 85,109, 89,197,117,
-237, 50,122,153, 67,163, 1, 91,102, 24,140, 70,211,167, 55,191, 11, 42,202,142,229, 11,244,154,205, 11,129,147, 33,149, 20, 85,
- 85,228,253,241,184,239, 45,176, 21, 0, 93, 76, 69,162,230, 86,214,214, 29,140,140, 53, 54, 26,141, 28,131, 94,127, 79,145,159,
-127,201,168,215,223,209,107,213,182,178,163, 95, 24,171, 91,207,103,183,229, 61,128,255, 51, 48, 68, 44,145,116,230, 9, 4,109,
- 1,192, 80, 92,124, 69,173, 82,157, 27, 8, 28,172,205,182,215,246,249,121,222,229,255,107,138,139,245, 14, 9,167, 67,160, 41,
- 6, 2, 7,127,225, 16, 48,242,199, 61, 0,160,205,188,227,168,138, 61,250, 14, 0,136,189,131,175, 11,157, 2, 51, 0,128,255,
- 36,205, 33, 38,108, 17, 52,197, 64,227,224,165, 14, 53,101,142, 91,178,223,118,238,228, 65, 66, 0, 56,115,232,235,134,191, 29,
-254,182, 55, 0,116, 25, 52,245,100,143,193,211, 99, 0, 96,245,247,135,109,247,126, 49,180,218,204,218, 29,155,249, 38,249,177,
- 97, 62, 90, 69,154,149,187,152,239, 20, 27, 27,203, 5, 0, 23, 23,151, 90, 29,155,110,128, 52, 13,152,198,229,241, 58,120,251,
-248, 4, 2, 96,241,143, 30, 69, 24,244,250,203,206,192,230,151,188, 47,205, 96,236,207,131,179,114, 56, 28,218, 33, 9, 33,175,
-155,227,165,197,213,241,191,124,152,173,234, 30,106, 13,112, 33, 14,232,216, 58, 0,147, 71,190, 43,169,248,183,131, 91,150,122,
-196,222,252,165,209, 15, 63,174,229, 6, 4, 4, 32, 33, 33,161, 86,107, 81,160, 5,206,199, 2,144,223,183,200, 19,139, 31,173,
- 91,179,198,178,123,247,238,124, 23, 23, 23,112, 56, 28,164,167,167,183, 14, 15, 15,111, 57,107,214,172, 15, 32,191,159, 87,160,
-133,242,124,108,205,185,101,235,218,180, 97, 61, 44,158, 62, 84, 10, 0, 11,199,108,110,121,243, 97,134,205,163, 71,143,186,206,
-155, 55, 47,135,119,238,220,183,118,192,246, 12, 32,185, 54,235,185,243,216,117,145, 52,237, 39,175, 81,211,167, 31,242,241,241,
-145,120,122,122,114, 44, 44, 44,192,227,241,144,151,151,231, 17, 21, 21,213,251,198,141, 27,234,240, 11,255, 51,189,117,163, 95,
-124,166,232,157,162, 90,109,123, 97,170,232,140,133, 69,244,232,129, 3,221,134, 14, 29, 42,242,246,246, 6, 0, 60,122,244,200,
-247,224,193,131,195, 15, 29, 58,180, 4,133,169,250, 2, 45,138,106,218,246,242, 76, 0, 34,160,173,149,131,195, 40,158, 64,208,
- 84,175,215,187,150,182, 54, 60, 53, 20, 23, 71,203, 51, 51,119, 63,187, 60,249, 43, 77, 49,112, 63, 13,232,214, 33, 16,163, 7,
-117, 19, 3,192,188, 97,203, 91, 63,121, 28,103,162,213,106,209,208,175,113,187,207,191,248,234, 52,184, 92,236, 58, 28, 94,190,
-124,109, 50, 35,239, 39, 32,228,243,117, 72,189,123,176,181, 33, 63,174,179, 82,145,207, 3, 0, 75,169,116,208,193,125, 63,157,
-115,241, 31,114, 45, 46, 91, 87,171,204,234,142,205, 83,251, 54, 57,167, 68,157,107,242,205,153,109, 2, 15, 15, 15,220,189,123,
-183,110,199,102,254, 67, 11,163,179,243,189,181,159,124,226, 20, 20, 20, 4,137, 68, 2, 62,159, 15,189, 94,223,237,242,229,203,
-221, 66, 66, 66,166, 34,255,161,186,182,199,102, 45,172,229,112, 56,157,199, 77,158,225,252,110,255, 33, 24,212,171, 29,237,136,
-132,144,215, 77, 89,235, 85,197, 43, 15,191,175,182,208,226,243,249,153,221,199,174,112,232,240, 78, 51,220,188, 19,147,159,152,
-148,166, 42,251, 91,110,244,193,134,253,219,185, 54,185,120,241, 2, 52, 26, 13,174, 92,185,130, 59,119,238,224,241,227,199,152,
- 50,101,138,166,244,212, 97,101,153,121, 65,195,151, 90, 35, 63, 86,226,107,250,176,126,248,131, 7,188,162,162, 34, 92,188,120,
- 17,121,121,121, 48, 53, 53,133,155,155, 27,122,244,232,193,127,240,224,129, 77,215,238,189,164, 65,189, 70, 36, 64,234,171,226,
-243,249,121, 85,205, 35,194,231,243, 51,187,142, 89,230,208,196,183, 30, 30, 37,166,230, 47,254,226, 7,149,209,200,248,241,143,
-159,232, 46, 92,184,128,192,192, 64,156, 61,123,214, 54, 55, 55,247,211,205,155, 55, 47, 22,172,250,102, 67,177, 54,103, 14,170,
-206,203, 11, 26,190,212,218, 54,243,128,231,111,167,142,152, 68, 71, 71,155,124,247,221,119,200,201,201,129,169,169, 41,172,172,
-172,224,228,228,132,134, 13, 27,114, 22, 46, 92, 40, 9, 14,142,198,255, 77, 26,226,169,243,154,248,176,170,245, 44,223,118,213,
- 19,115, 59,197, 25,239,195,199,143,115,219,183,111,255,167,143,237, 13, 26, 52, 64,207,158, 61, 69,163, 70,141,242, 30, 58,124,
-164, 49,168,207,184, 71,144,120, 22,212,152,169, 78, 54,179, 45,184,234,210,109,248,240,163, 75,151, 46,181,114,114,114,130, 88,
- 44, 6, 0,228,231,231,187, 37, 38, 38,182, 94,178,100,201,224,235,145,251,248, 65,193,201,169, 16,187, 23, 86,247,124,254, 87,
- 9, 4,252,204,178, 86, 36, 11,177, 89, 94,114, 74,134, 26, 0,180, 90, 45,180, 90, 45, 52, 26, 13, 62,156, 58,133, 55,105,112,
- 43, 31,207, 14, 51,110, 63,126,154,145,219, 56,252,154, 77,217,125,139,107,200,228, 23, 60,150,203,147,126,157, 20,242,201, 39,
- 78,142,142,127,156, 17,220,181,115, 39, 47, 55, 55,183, 91, 72, 72, 72, 19,102,222, 73,222, 56,120,169, 85,117,153,213, 29,155,
-242,152,227,245, 63,159,222,179,249,150, 47,194, 96, 48, 24,112,245,234, 85, 92,188,120, 17, 95,125,245, 21, 59,121,242,100,190,
-165, 88, 60, 9,213, 30,155, 15, 45,218, 59,167,123,173, 90,117,136, 35, 20, 10,241,203, 47,191,224,193,131, 7,224,114,185, 8,
- 8, 8,192,232,209,163,209,173, 91, 55,167,201,147,167,176,160, 94,195,226, 33,245, 83,190,224,190,196, 5, 48, 99, 65,200, 42,
-231, 49, 19,167, 97,245,231, 11,169,208, 34,132,188,206,173, 89, 85, 14,241,128,176,176, 48, 86,122,235, 8, 0, 12,224, 54, 24,
-176,101,239,129, 91,198,227, 13, 6,108,217,203, 0, 46, 3,184,150, 64,189,183,222,122,171, 88, 46,151,179, 27, 55,110,176, 15,
- 63,252, 80,189, 97,195,134,115,199,143, 31, 63,168,215,233,182,186, 56, 59,127,201,170,232, 96,207, 0,174, 39, 32, 53, 55, 55,
-207, 74, 74, 74, 98, 39, 78,156, 96,161,161,161,108,247,238,221,236,228,201,147, 44, 60, 60,156,157, 60,121,146,237,221,187,151,
- 69, 70, 70,178,152,152, 24, 38, 22,139,179, 60, 1,105, 53,153, 60, 6,240, 26, 14,248,110,206,161,155,197, 75,253, 6,108,153,
-197, 0,158, 53,208,232,173,183,222, 50, 28, 60,120,144,237,218,181,139,253,248,227,143, 44, 50, 50,146,101,103,103, 51,190, 80,
-156, 85,118,191,170,214,147, 1, 92, 87, 87,215, 44,185, 92,206,220,221,221,153,169,169, 41,115,116,116,100, 13, 27, 54,100,173,
- 91,183,102,189,123,247,102, 35, 71,142,100,159,126,250, 41,147,203,229, 76, 36, 18,101,148,221,175,170,204, 64,192, 76, 44, 22,
- 39,201,100, 50, 86,149,194,194, 66,150,157,157,205, 78,159, 62,205,196, 98,113, 82, 32, 96, 86, 93,166, 25,208,194,223,223, 63,
- 43, 59, 59,155,233,116, 58,150,148,148,196,162,162,162,216,131, 7, 15, 88, 82, 82, 18, 43, 44, 44, 44,207,142,137,137, 97, 94,
- 94, 94, 89,102, 64, 11, 70, 23, 65, 84,185, 47, 61,123,243,112,116,236,237,228,228, 84,120,232,208, 33,246,244,233, 83,182, 99,
-199, 14,198, 5,150, 63,187, 92,117,153,166, 64,143,246,237,219, 27,174, 94,189,202,110,223,190,205,230,207,159,207,122,246,236,
-201,122,245,234,197, 66, 66, 66, 88, 74, 74, 10, 75, 73, 73, 97,189,123,247, 54,152, 2, 61,106,218, 63, 43, 59, 54,165,128, 71,
-112,112,112,161, 78,167, 99,241,241,241,172,105,211,166, 41, 60, 96,148, 24,104,210, 17, 16,214,180,127,186, 2,214,206,206,206,
-105, 87,175, 94,101,135, 15, 31,102,158,158,158, 89, 60, 96,156, 37,208,192, 18,104,192, 3,198, 53,104,208, 32,235,234,213,171,
- 44, 39, 39,135,121,120,120,164,185, 2,214, 47,176, 47,113, 1,108, 91, 16,178,138, 61, 76, 81,179, 5, 33,171, 24,128, 36,198,
- 24, 67, 37,125, 60, 9, 33,111,190,103,107,145, 55, 69,249,155,100,112,112, 48, 7,192,249,234, 22, 46,228,241, 86,172, 94,189,
-154, 95, 84, 84,132, 31,126,248, 65,249,222,224,193, 7, 58,118,232, 16, 95,223,211, 83,206,225,114,107,156,109, 56, 75, 40,156,
-185,122,245,106, 43,173, 86,139, 91,183,110,161,101,203,150,112,114,114,130, 68, 34,129, 68, 34,129,131,131, 3,252,252,252,144,
-153,153, 9, 11, 11, 11,204,157, 59, 87,154, 37, 20,206,172, 41,215,104,100,124, 0, 48, 24,141,166, 38,192,100,175,183,223,190,
-181,100,201, 18,174,173,173, 45,108,108,108, 32,145, 72,240,224,193, 3,104,181, 90,152,155,153,215,106,144, 86, 46,151,203,149,
- 72, 36,248,237,183,223, 48, 99,198, 12,180,109,219, 22, 86, 86, 86,176,176,176, 64,211,166, 77,209,163, 71, 15, 76,154, 52, 9,
-241,241,241,224,212,162, 83,201, 61, 62,127,218,164, 73,147, 28, 2, 3, 3, 43,253,123, 81, 81, 17,228,114, 57,178,178,178,224,
-230,230,134, 33, 67,134, 56,220,227,243,167, 85,149,103, 11, 56,185,249,250, 30,189,113,227,134,157, 88, 44,198,174, 93,187,112,
-228,200, 17,156, 58,117, 10, 39, 78,156, 64, 88, 88, 24,126,249,229, 23,100,101,101, 1, 0,124,125,125,177,127,255,126, 59,137,
-131, 67,152, 45,224, 68,135,116,237, 60,201,200, 56,211, 52, 61,221,110,212,200,145,151, 84, 42, 21, 70,141, 26,133, 21, 43, 87,
- 46, 20, 0,179,106,115,127, 63, 64,106,227,236,188,125,213,170, 85,220,244,244,116, 12, 28, 56, 48,123,237,202,149, 19, 34, 78,
-159,246,150,157, 58,229,189, 98,233,210, 9, 29, 59,118,204, 78, 73, 73,193,206,157, 59,185,142, 30, 30,219,253, 0,105, 93,215,
- 83, 9,204, 88,191,126,189,168,168,168, 8,221,187,119,143, 55, 70, 71,251,233,129,159, 84,192,131,243,128,174,166,251,167, 1,
-211,230,206,157,235, 36, 20, 10,241,241,199, 31,103, 23, 60,121,210, 76, 15,252,152, 15, 36,230, 3,137,122,224, 71,101, 66, 66,
-179, 49, 99,198,100, 11,133, 66,172, 91,183,206, 41,237,143, 73,183,107,171, 37,128,163, 0, 46, 0, 72, 29, 55,121,198,184,192,
- 86,109,176,115,235,102,124,177,116,222,118, 0,239,113, 56,156,221, 0,230,208,158, 71,200,127, 83,109,106,145,127,169, 42,167,
-220,225, 87,172, 36, 1,116,170, 46,197,218,214,182,101,179,102,205,112,241,226, 69,248,251,251,223,176,178,178,210,155, 8,133,
- 16, 8, 4, 96,198, 26,235, 44,152,137,197, 93,187,117,235,198,191,118,237, 26,188,188,188, 96,102,102, 6,129, 64,240,167,155,
-137,137, 9,156,157,157,161, 80, 40,208,181,107, 87,193,198,141, 27,187, 66,163,249,188,198,127,136,177, 81,146,172,107,171, 70,
-254,111,199,246, 6, 65, 65, 65,200,207, 87,192,104, 52,194,220,220, 28, 90,173, 22,124, 62,191,228, 20, 80, 49, 83,212,230, 25,
- 51, 24, 12, 6, 30,143, 7, 47, 47, 47,172, 88,177, 2, 69, 69, 69, 48, 49, 49, 1, 0, 40, 20, 10,200,229,114, 68, 69, 69, 33,
- 49, 49, 17,165,159,194,171,101, 33,149,190, 59,116,232,208, 74, 39,252,213,104, 52,200,207,207, 71,126,126, 62,228,114, 57,138,
-138,138,208,166, 77, 27,211,227, 97, 97,239, 34, 39,103,109,165,247, 17,137, 6,239,220,185,211,193,212,212, 20,133,133,133, 80,
- 42,149, 72, 78, 78,198,147, 39, 79,138, 50, 51, 51,245, 22, 22, 22, 92, 79, 79, 79,174, 80, 40, 20, 14, 24, 48,128,163, 80, 40,
-192,225,112, 16, 28, 28,108,187,103,215,174,161,208,106,191,162, 67,186,118,206, 0,154, 22, 90,109,223,119, 90,181,250,237,198,
-205,155,129, 51,103,206, 68,100,100,228, 42,243,125,251, 46, 20, 0,119,170,187,111, 60, 48,237,203, 10, 5, 12,123,242,196, 95,
- 7,100, 85, 88, 36,209, 51, 33,225,212,152, 49, 99,238, 70, 70, 70,218,173, 91,183,206,233,189,129, 3,167, 1, 88, 94,151,117,
-180,144, 74,223,118,118,118,198,201,147, 39,145,244,248,241, 60, 61, 80, 88,167, 79, 92, 60, 94,251,160,160, 32,252,242,203, 47,
- 72,121,242,100,158,254,207,235, 88,242, 65, 9,200,226,199,199,207,219,190,125,251,182,241,227,199,131,199,231,183,135,190, 78,
- 39, 14,255,210,241,125,252,148,153,216,254,253,198,237, 0, 38, 2, 48, 2,184, 65,123, 28, 33,255,237, 86,173,154,106,145,215,
-168,216,250,190,206, 45, 90, 14, 14, 14,174, 18,137, 4,169,169,169,104,220,168, 81,166, 80, 40,132,169, 64, 0,145,169,105,173,
-214,160,160,160,192,223,197,197, 5,249,249,249,176,179,179,131,137,137, 73,249,205,212,212,180,252,123, 11, 11, 11,112,185, 92,
-120,120,120,160,160,160,192,191,198,220,140, 40,135,125, 27,167,126,120,245,194,201, 6, 3, 7, 14,130,181,181, 13,220,221,221,
-224,224,224, 0, 51, 51, 51,184,187,187,195,219,219,155,173, 93,187, 22,230, 14, 1,181,122, 35,175, 88, 60,241,249,124, 24, 12,
- 6,100,100,100,224,225,195,135,136,140,140,196,213,171, 87,113,251,246,109, 40,149, 74,212,162,206, 66, 65, 97, 97,115, 62,159,
- 95,105,145, 37,151,203, 33,151,203,203, 11,173,172,172, 44, 36, 38, 38, 66,165, 86,191, 85, 77,209, 59,168, 89,179,102, 60, 0,
- 48, 51, 51,195, 91,111,189,133, 45, 91,182,232,143, 29, 57, 50,172,201,213,171, 54,238,167, 79, 91,253,239,187,239,134, 13, 25,
- 50,196,112,237,218, 53, 40, 20, 10,220,191,127, 31,246,246,246,124, 83,145,104, 40, 29,206,117, 35, 3,212,118, 74,101,175,182,
-109,219, 38,228,231,231, 99,205,154, 53, 92,129,133,197,247, 75,171, 56,197, 87,142,199,107, 23, 20, 20,132,163, 71,143, 34,245,
-201,147,249, 79, 42, 41, 96,158, 0, 89, 73,241,241,243,183,111,223,142, 30, 61,122,128,195,231,215,185,163, 82,235,214,173,155,
- 25,141, 70,220,189,123, 23, 86,192,245,186,222,223,219,199, 39,176,172,229, 87, 12, 92,170,106, 57, 49,112, 41, 34, 34, 2,102,
-102,102,104,220,164, 73,139, 58, 62,204, 90, 14,135,147, 54,126,202, 76, 28, 62,245, 59, 0, 96,251,247, 27, 51, 42, 20, 89,132,
- 16,106,209,122, 93, 91,180,202, 10,171,138, 55,252,169,208,170,101,241, 1, 0, 16, 8, 4, 48, 21, 10, 97,106,106, 90, 82, 32,
- 9,133,181,206,224,112, 56, 16,137, 68,229,133, 85,197, 2,171,226,247,230,230,230,181, 42, 96, 0, 32, 47,238, 84,135,137, 19,
-198,155, 10,133, 66,104,181, 26, 48,198, 32, 20,138, 96,101,101, 5, 47, 47, 47, 40, 20, 10,180,109,215, 81,147, 44, 55, 9,179,
-109, 60, 32,242,121,158, 61,189, 94, 15,181, 90,141,188,188, 60,228,230,230, 66,161, 80,160,176,176,176,214,151,162, 27,141, 70,
- 94,114,114, 50,126,250,233, 39,228,228,228, 0, 40,233,104, 93, 86, 92,149,125, 77, 72, 72,192,174, 93,187,240,248,241,227, 58,
-189, 62, 29, 58,116, 64, 88, 88, 24,175, 83,215,174, 91,207,122,122,166,158,245,244, 76,237,212,181,235,214,163, 71,143,242, 92,
- 93, 93,145,152,152,136, 91,183,110, 33, 47, 47, 15,140, 49,186,126,254, 57, 60, 2,242, 10,114,115,199, 47, 92,184,144, 73, 36,
- 18,172,249,242,203,230,203,129, 17,181, 45, 96,164,213, 20, 48,210, 23, 43, 96,192, 24,131,209,104,132,193, 96,120,174,109,227,
-112, 56, 28,129, 64, 80,215,161, 21,234,178,112,121,199,247,185,159,174,192,137, 95, 14,150,253, 62,150,138, 44, 66,200, 27,160,
-202,142,240,252, 10, 21,100,249,215,170,100,100,100, 60, 85,171,213, 13, 60, 61, 61,145,146,146,226,224,225,225,241,196, 84, 32,
-128,137,169, 41, 56,220,154,107, 2,115,115,243,187,169,169,169,237, 92, 93, 93,161,215,235,203,139,170,103, 79, 29,150,181,210,
-220,190,125, 27,230,230,230,119, 81, 84,237,200, 9, 48,104,243,234,181,104,209,162,188,101,200,202,202, 10, 86, 86, 82, 8,133,
- 34, 44, 90,180,200,184,110,237,218,205, 30, 93,150,230,191, 63,107, 33, 91,184,124,235, 75,125,102,107,251,143,201,220,220,252,
-174,187,187,123, 27,169, 84,138,195,135, 15, 35, 49, 49, 17,121,121,121, 40, 40, 40,128, 70,163, 65, 65, 65, 1,180, 90, 45, 68,
- 34, 17,154, 52,105, 2, 75, 75, 75,132,135,135,223,133, 70, 83,121,113,153,147,115,248,238,221,187,109, 90,181,106, 85,222,162,
-210,185,115,103, 78,231,206,157,237,202, 91,209, 10, 10,144,157,157,141, 27, 55,110, 32, 60, 60, 28, 28, 14, 7,177,177,177, 6,
- 77, 97,225, 94, 58, 38,158, 79, 17,112,133,183,125,251,182, 15, 62,248, 96, 66,187,118,237, 96, 0,122, 3,216,245, 15, 22, 48,
- 0,128,171, 87,175, 70, 25, 12,134,118, 13, 27, 54,132, 28,120, 7,192, 47,117, 42, 34,227,226, 34,244,122,125,215,230,205,155,
-227,240,129, 3, 29, 0, 36, 86,182,156, 26,232, 16, 24, 24,136,194,194, 66,220,191,119, 79, 86,135, 34,107,235,130,144, 85,227,
-198, 76,156,134,157, 91, 55, 99,251,247, 27,147,183,109,217,224,142, 90,244, 31, 35,132,252,167, 90,179,106,172, 69,254,165, 38,
- 87, 85,124,241,235,146,146,159,151, 39,139,136,136,104,208,162, 69, 11,108,221,186,181, 85,219, 54,109,158,154,152,154,234, 77,
- 77, 76,192,173,197, 63,146, 66,181,250,215, 95,127,253,245,157, 1, 3, 6,240,175, 93,187, 6, 39, 39,167,242, 66,171,236, 43,
-159,207, 7, 99, 12,230,230,230,248,249,231,159,117,133,106,245,175, 53,182, 22, 25,140, 6,110,105,161,199, 24,131, 92, 46,135,
-137,137, 9,190,250,106, 29, 54,173, 93, 59,210, 0, 28,244, 21,219,127, 2, 64,244,143,253,131, 46, 40,248,237,196,137, 19, 45,
-151, 44, 89, 34,112,115,115,131, 92, 46, 71, 94, 94, 30,114,114,114,160, 80, 40,160, 80, 40,144,151,151, 7,185, 92, 14,145, 72,
-132,200,200,200,226,162,130,130,223,170,202, 19, 22, 21, 29, 26, 59,118,236,220,136,136, 8,103, 62,159,143,226,226, 98, 24,141,
- 70, 24,141, 70,232,116, 58,196,197,197, 33, 58, 58, 26, 15, 30, 60, 64,110,110, 46, 4, 2, 1,120, 60, 30,110,223,190,157, 39,
- 46, 46, 62,160,165, 99,250,185, 9,128,195,151, 47, 95,158, 48,122,244,104,184,184,185,117, 68, 74, 74,173, 10,152, 35,213, 20,
- 48,249,207, 87,192,252, 81, 0, 41,149, 55, 19, 18, 18,218,117,234,212, 9,206,110,110,171,154,164,164,156,189, 87,135,126, 90,
- 6,189,254,210,229,203,151,187,142, 25, 51, 6, 91,183,110, 93,101,159,144,112, 42,235,153,211,156,246,128,125,125,111,239, 85,
-227,198,141,195,153, 51,103, 96,208,235, 47, 85, 19, 89,113,196,247,122,227, 38,207,112,127,166,227,251, 22, 14,135, 51, 29,192,
- 26,218,163, 8, 33,111,114,139, 86,157, 78, 29,154, 25, 12, 11,230,204,153, 83,204,229,114, 49,104,208, 32,139, 95,142, 30, 29,
-114,251,206, 29,175,204,204, 76, 43,131,193, 80, 99,150,189, 70,179, 97,206,156, 57,114,173, 86, 11, 63, 63, 63,228,230,230,194,
- 96, 48,128,207,231,131,207,231,131,195,225,128,203,229, 66, 34,145, 32, 34, 34, 2,219,182,109, 83,216,107, 52, 27,106,252, 39,
- 97, 48,220,221,181,107, 23,120, 60, 30, 19,137, 68,224,112, 56,224,243,249, 88,183,110, 93,230, 38,224, 48, 0,240,184, 92, 45,
- 0,112,185,156,218,246,222,173,241,188,165,169,169, 41,140, 37, 23, 1,212,184,172,181, 70,179,126,245,234,213,202,251,247,239,
- 67,173, 86,151,183,190,169, 84,170,242,206,245,114,185, 28, 28, 14, 7,106,181, 26, 71,143, 30, 85, 90,107, 52,235,171,202,203,
- 1,210, 83, 98, 99,251,181,106,213, 42, 39, 33, 33, 1,249,249,249,184,123,247, 46,194,195,195,177,127,255,126,156, 57,115, 6,
-113,113,113,208,235,245,112,117,117, 5, 99, 12, 71,142, 28,201,215, 43,149,189,115,128,116, 58, 38,170, 86,207,201,169,171,163,
-131, 67,146,189,157, 93, 74, 61, 39,167,174,207,254, 93, 10,196,196,196,196, 64,175,215,195,203,203,203,166,186,126, 90, 76,175,
-191,124,249,242,101,140, 25, 51, 6,238, 13, 26,172,244, 4,236,159, 93,198, 19,176,247,244,246, 94, 89, 86,192, 48,189,254,114,
- 93,215,217, 2,216,248,201, 39,159, 20,154,152,152, 96,223,190,125, 94,197, 62, 62, 15,248,192, 8, 9,208,168, 19, 96, 82,211,
-253,157,129,205,159,126,250,105, 58,135,195,193,238,221,187,237,164,222,222, 81,124, 96,172, 20,168, 39, 5,234,241,129,177, 82,
-111,239,168,125,251,246,217,233,245,122,204,154, 53, 43,221, 25,216, 92, 77,228, 12,198, 88, 95,198, 88, 16, 99,204,125,219,150,
- 13, 56,241,203,193,178, 34,107, 34, 74, 58,189,143, 6, 16, 69,123, 28, 33,228, 77, 86,105, 51, 20,191,213,178, 12,128, 57,116,
-108, 29,128,155,119, 30,230,219, 89, 91,158, 46,251, 91,110,244,193,134, 93,252, 45, 3,190,249,230, 27, 8, 4, 2, 36, 39, 39,
-227,222,189,123,176,180,180,196,200,145, 35, 53,133, 74,101,191, 10,115, 29,118, 3, 16, 94,154, 89, 50,159, 90,126,172,196,155,
- 31,217,224,212,137, 48,158, 84, 42,133, 74,165, 2,151,203,133, 72, 36,130,185,185, 57,204,204,204,112,235,214, 45,244,233,219,
-223,144,101, 30,244,199,128,165,127,204,167, 86,158, 89, 54,214,208, 59,128,121, 4,240,177,131,139,203,156,197,139, 23,155,245,
-236,217, 19, 38, 38, 38,112,171,231,155,238,213,107,205, 70, 46,151,163, 79,201, 81, 44,242,174,231, 34,189, 23,155, 8,128,147,
- 89,124, 99,177, 75,133,185, 14,255,178,158, 30,218, 11, 94, 63,255,184,214,242,173,183, 74,250,163,203,229,114,100,100,100, 32,
- 51, 51, 19,114,185, 28,106,181, 26, 0, 16, 22, 22,134, 19, 23, 31, 40, 10,221,134,196, 87,181,158,127,108,251, 67, 11, 23,221,
-245,250,123,118,253,200,179,183,183, 71, 70, 70, 6,178,178,178, 32,151,203, 81, 88, 88, 8,131,193,128,220,220, 92,252,176,253,
- 71, 67,142, 36,232,113,249,128,144,213,101,170,147,205,108, 84,191,187, 6, 54,241,100, 19, 38, 76,176,176,180,180,132,209,104,
- 68, 94, 94, 30,146,146,146,144,144,144,128,139, 23, 47,170, 51,229, 90,168,237,186,167,148, 15, 88, 90, 73,230, 75,244,218,101,
- 86, 28,183,202,197,217, 57,245,201,147, 39, 14, 6,131, 1,174,174,174,122,121,110,238, 74, 83,224,140, 5,144, 6,128,101, 3,
-139,215,111,220, 56,190,127,255,254,120,251,237,183,147,211, 51, 50,234, 87,182, 47, 49,128,231, 7, 72, 11,220,220,162,111,220,
-184,225,148,148,148,132, 49, 99,198,100, 63,121,244,104,126, 89,127,173,124,160,131,167,183,247,202,125,251,246,217, 53,104,208,
- 0,254,254,254,233,162,164,164,166, 15,129,252, 42,246,207, 42,143, 77,121,204,241,250, 83, 7, 54,123,251,195, 15, 63,132, 94,
-175,199,197,139, 23,113,253,250,117, 60,121,242, 4,191,255,254,187,220, 82, 44, 30, 86, 97,174,195, 74,247,207,222,190,106,175,
-221,187,119,113, 76, 76, 76,176,125,251,118, 68, 68, 68, 0, 0, 2, 3, 3, 49,110,220, 56,232,245,122,140, 26, 53,154, 29,127,
-104, 22, 95,221,254, 9,160, 25,128, 47, 81, 82,228,189,205, 24, 19,113, 56,156, 84, 0,238,168, 91,159, 44,218, 63, 41,147, 50,
-255, 59,153,111,164, 26,231, 58, 92,246, 45,164,127,158,230, 99, 82,234,193, 45, 75,249,237, 59, 4, 53, 90, 26, 26,194,109,213,
-170, 21,220,221,221, 17, 24, 24,136,164,164, 36,161,149,149, 85, 77,243,169,169,130,122,141, 72, 8, 8, 8,176,154, 63,127,190,
-180, 71,143, 30, 2,119,119,119, 48,198, 16, 17, 17,129,195,135, 15,235,182,110,221,170, 40,112,236, 43,151,157,251, 73, 85,155,
-249,212,174, 3, 5, 0, 62,115, 75, 77,253,126,218,212,169, 33,111,181,104, 49, 33, 52, 52,148, 43, 49, 55, 19,172, 88, 52, 81,
- 4, 0,203,190,222, 47,237, 63,100, 36,214,251, 0, 29, 71, 84, 62,143, 92,197,245, 76, 74,153,244,228,221,129, 93,125, 62,158,
- 62,222, 48,116,232, 80,177,165,165, 37,220,221,221, 97,109,109,141,248,248,120,164,164,164,176, 99,199,142,169,174,222,142, 17,
- 28, 57,115,243,137, 72,234, 92,155,121, 9,149, 65, 61,223,123,252,238,187,239, 90,143, 29, 59,214,162,101,203,150, 2,161, 80,
- 8,161, 80,136,140,140, 12,196,197,197,233,142, 29, 59,166, 42,112,232,157, 39, 59,183, 79, 89,203,185, 14, 11,131,134, 47,141,
-187,116, 54,116, 86,244,221,187,163,141, 64,115,157, 78,231,106, 48, 24, 56, 92, 46, 55,205,104, 52,222,213, 41,149,219, 52,129,
-161,235,104,174,195,218, 49, 24, 12, 38, 6,131, 1,114,185, 28,103,207,158,229, 63,122,244,104,241,157, 59,119, 22,167,166,166,
-162,184,184, 24,131, 7, 15, 70, 96, 96, 32,206,157, 59,135,172,140,140, 99,213,101, 61, 4,242,133, 41, 41,227, 38, 77,154,116,
-114,215,174, 93,220, 59,119,238,216,109,223,190,253,135,202, 10,152,209,163, 71, 27, 51,146,146,198,105,128,252,106,246,207,234,
-142,205,236, 83,251, 54,221, 25, 48,104, 72,147,208, 37,139, 5,109,219,182,133,157,157, 29, 58,116,232, 0,157, 78,103,213,184,
-113,227,154,142, 77,101, 80,175, 97,241,205,155, 55, 23,175, 91,183,206,105,252,248,241,152, 62,125, 58, 0,160,176,176, 16,103,
-206,156,193,172, 89,179,210,147,248,239,168,107,218, 63, 75, 91,170,202, 10,176, 11, 0,130, 0,196,131, 58,190, 19, 66,222, 76,
-101,147, 74, 59,163,100, 98,233,227, 40,249,112, 94,243, 92,135,151,174, 71,161,226, 52, 31, 37,156,239,233, 61,198, 62,154, 50,
-103,165, 63,175, 88, 97, 45,224, 20, 89,198,198,196,112,106,154,243,176,124, 62, 53,169,175,202, 54, 97,111,171, 21,203,150,205,
- 92,191,126,125,215,178, 33, 28,204,205,205,239, 22,170,213,191,218,107, 52, 27, 10,164,190,191,214,117,110,190, 20, 32, 3,192,
- 84,107,153,108, 99,112,255,193,171, 69, 54, 94,130,133,203,183, 22,241,184, 92,109, 92,106, 22,214,251, 0,226, 90, 92, 32, 89,
-160, 5,162,229,206,250, 12,219, 33, 15, 63,253,228,147,143,151,125,246, 89, 43,137, 68,210, 81,167,215,251, 26,141, 70,192,104,
-140, 45, 80,171, 47, 48,157,238,134, 38,112,201, 90,145,212,153,213,122, 94, 66,171,198, 74,155,199, 7, 91,237,216,182,109,198,
-129, 3, 7,254,178,237,182, 26,205,198, 2,171,198,225,181,217,246,138,203, 20, 1, 87,144,153,121,165,186,166, 75,154,235,176,
-150,159, 62,140,198,201,214,214,214, 59,187,118,237, 42,234,214,173, 27,250,244,233,131,182,109,219,194,104, 52,130, 49, 6,165,
- 82,137,253,251,247, 99,245,234,213,177,245,129,207,106,202,211, 0,191, 10, 79,156,232,221,188,121,243,237,213, 21, 48,165, 69,
- 86,141,125, 18,171, 63, 54,133,177,122,105,191,196,225,211, 86,248,104, 21,105, 86,182,230,122,167,232,168,187,220,218, 31,155,
-126, 74, 67,196,254,119, 6, 15, 28, 56,141,199,231,119, 40,189, 2,146,221,191,119, 79, 86, 54,169, 52, 2,199,157,173,227,190,
- 84, 54,118, 29,117,124, 39,132,188,233,133, 86, 31,148,244,215, 42,159,146,167,202,185, 14,203, 90,125,248,124,126,102,252,145,
- 41, 35,171, 75, 23, 0, 93, 75, 91,178, 80,227, 92,135,165,223, 39, 2, 74,104, 52,159,255,105, 48,210, 10, 87, 23, 10,158, 89,
-190, 46,195, 34,230, 1, 15,161,215, 4, 35,243, 30,112,116,106, 73, 94,171,101,243, 42,110, 83,149,255,100,255,244,184, 38,185,
- 69,192, 37,168, 84,151,160, 82, 85,218,105, 87,192, 55,201,173,105, 61,159,221,246, 36, 64,241,162,219,254,108,102,141,197,195,
- 11, 60,159,255, 53, 79,179,179,143, 0,144,184,133,133, 57,158, 10, 11, 27,250,241,236,217,131,157, 93, 92,188,237,236,236,172,
- 45, 44, 44,184,215,174, 93, 75,208, 23, 21,109,124, 11,216, 81,218,154, 90, 35, 13,240,171, 95, 82, 82,211,247, 6, 14,156,198,
-225,243,219, 87, 44, 96,152, 94,255,187, 23,176,185,186,150,172,231, 61, 54,221,133,206, 93, 75, 91,178,192, 3, 38,213,102,223,
- 72, 41, 89,143,229,208,235,151, 35, 50,178,146,125,190,206,251,210, 50, 14,135,163, 4,117,124, 39,132,188,185,202,230, 59, 60,
-254,119, 63,112, 55,202,164,204, 55, 40,147,135,146,171,232,232,249,164, 76,202,164, 76,202, 36,181,194,167,167,128,144, 90, 51,
-224,143,211, 96,132, 16, 66, 72,153,178,190, 89, 21,125, 15,148,116,221,169,170, 42,173,203,213, 4,207, 83,217,134, 83, 38,101,
- 82, 38,101, 82, 38,101, 82,230,127, 46,179,166,236,215,241,106,198,178, 62, 89,229,125,179,254, 46,212,172, 74,153,148, 73,153,
-148, 73,153,148, 73,153,111, 58,231,210, 34,171,226, 13, 64, 29, 7, 44, 37,132,144, 55, 85,104, 40,184,140,129,195, 88, 40,151,
-177, 3, 60,198,134,240, 24,195, 11, 77, 5, 50,100, 72,229,131,217,254,223, 72,107, 11,122,198, 9,121,163,164,161,138, 73,165,
-169,143,214, 63,203,195,201,201,105, 11, 0, 78,122,122,250,100, 0, 73,244,148,252,251,216,216,216,116,213,235,245, 80, 40, 20,
-191,190,137,219,215,196, 27, 3, 25, 23,141,203,127,193,144,116, 63, 14, 59, 43, 91,182,177, 15,198,128,243,199, 88, 92, 28, 35,
-238,223,123,132,159,235,240,112,220,222,221,220, 55, 3,192,201,240,228,105,120, 53,227,106, 53,180,183,183, 63,205,231,243,249,
- 6,131, 97,106,102,102,102, 88,213,133,208, 16, 30, 0, 8,216,185, 5,242,116,135,249, 31,125,192, 17, 20,104,182,201, 53,133,
-234,124,158,128,247, 88, 40,112,186, 60,101, 60,247,100,158,170,205,189,202,238,127,240,224,193, 42,103,241,110,234,131,222, 92,
- 67,147,190,129,205, 18,226,191,220,208,106,125, 71, 47, 59, 65, 66,242,109,201,170,239,242,183,152, 90,121,246, 29, 51,148, 19,
-198, 55,231,140,222,182, 45, 71, 69, 71, 89,237,173, 0,108,116,128,191, 64, 40,116, 55,232,245,142, 28,128,241,248,252,140, 98,
-141, 38,217, 4,136, 92, 0,200,223,244, 76, 19,161,208,205,160,215, 59, 2,192,191,113, 61,201,159, 85, 89,104, 73, 36,146, 91,
- 92, 46,215,173,226,100,184,101,243, 9,150,253,174,226,223, 56, 28, 14, 12, 6, 67, 74, 94, 94, 94,203, 58, 60,190, 37,128,161,
- 0,202, 46, 81,223, 3, 96, 63,158,191,195,177,165,137,137,201, 28,177, 88,220,165,176,176,176, 41, 0,152,153,153, 69,171,213,
-234,223,116, 58,221,151,207,153,203, 7,240,158, 68, 34,233,204,229,114, 59, 51,198, 56,140,177,115, 42,149,234, 55, 0, 7, 0,
- 60,207, 72, 9,102, 14, 14, 14,203,109,108,108, 70, 44, 88,176, 32,199,214,214,214,111,214,172, 89, 55,115,115,115,127,202,206,
-206, 94,132, 58,204, 81,247,138,121, 59, 57, 57,237, 17, 8, 4,188,228,228,228,206, 0,224,238,238,126, 78,171,213, 26, 50, 51,
- 51, 71, 2,120, 84,199, 60, 49,128,214, 18,137,164,165, 68, 34, 9, 50, 24, 12,141, 75,231,103,188,175, 82,169, 46,234,116,186,
- 91, 0,174, 1, 80,255,139,142, 17, 11, 62,159,191,171,116, 95,247, 5,160,124,211,222, 4, 24, 23,141,239, 69, 63,240, 43, 47,
-188,154, 54,170,122, 97, 14, 60, 42, 89,182,214,133, 86,151,142,206,125,251,245,235,206, 5, 0,109,241,201,190,191, 93, 72,251,
-229, 37,111, 78,195, 65,131, 6, 93,217,181,107,151,181, 70,163,193,228,201,147,247,132,135,135,111, 86, 40, 20, 11,170,125,227,
-144, 88,207, 90,179,238,140, 57,135,195, 5, 0, 7,163,209,224,240,244,233, 35,223,123, 81, 87,122, 69, 71, 95, 93, 81,248,224,
-183,107, 70,142, 96,138, 14, 29, 30,212,102, 37, 26,123, 33,184,239,224,129,125, 62,251, 44, 20, 35,134,141,168, 23, 29, 93,100,
-230,106, 25,111,154, 91, 40,246,177,181,119,232,247,217,178,131,156,203,151,142,244,219,181,125,233,111,227,199,219,118,161, 98,
-171, 86, 56,203,248,252,214, 82, 31,159,160, 97, 71,142, 64,226,238,206,231, 11,133, 92, 0,208,107, 52,238,170,228,100,231,125,
-253,250,189, 19, 26, 19,115, 62, 20,184, 78,153,255, 72, 38,169, 75,161,197,229,114,221,158, 62,125,234, 32, 22,139, 75,222,140,
- 25,131,193, 96,128,193, 96, 40,159,188,152, 49, 86,254, 85,175,215,163, 81,163, 70,181,250, 68, 11,160, 11,128,247, 59,117,234,
- 52,228,203, 47,191, 20,248,251,251,151, 77, 25,210, 97,225,194,133, 95, 71, 68, 68, 28, 2,176, 3, 37,131, 55,214,246, 19,111,
- 79,177, 88,188,123,205,154, 53,150,221,187,119,231,187,184,184,128,195,225, 32, 61, 61,189,117,120,120,120,203, 89,179,102, 77,
- 85,171,213,163, 0,156,174,195,243,211,204,194,194,226,224,192,129, 3,221, 58,118,236, 40,106,210,164, 9, 12, 6, 3,110,223,
-190, 61,254,214,173, 91,195, 15, 29, 58, 20,162, 84, 42,135,160,246,243,181,113, 36, 18,201, 88, 75, 75,203,229, 75,150, 44,177,
- 25, 53,106,148,105, 84, 84, 84,158,151,151, 23,231,242,229,203,246,251,247,239,159,186,114,229,202,247, 20, 10,197, 34,149, 74,
-245, 35,106, 49,135,162,133,133,197, 45, 46,151,235, 86,155, 66, 24, 64, 93,138,225,183,234,215,175,191,255,210,165, 75,245, 19,
- 19, 19, 13, 3, 6, 12,216, 9, 0,191,253,246,155,127,113,113, 49,167, 71,143, 30, 39, 83, 82, 82,134, 2,184, 93,203,109, 15,
-176,177,177,249,101,196,136, 17, 54,222,222,222,230,245,235,215,231,136,197, 98,240,120, 60,228,231,231,187, 68, 69, 69,117,187,
-126,253,122, 97,120,120,120,174, 70,163,233, 7, 32,178, 14,175, 83, 91, 7, 7,135,209, 2,129,160,153, 94,175,119, 5, 0, 62,
-159,255,180,184,184, 56, 42, 51, 51,115, 23,128, 43,207,123,128, 56, 58, 58,110, 90,190,124,185, 93,102,102, 38, 91,185,114,229,
- 38,165, 82, 57,246, 77,125, 51,216,243,211, 1,220,186,121, 29, 40,153, 54,135, 83,201,254,199, 1, 96,242,209, 71,179,209,242,
-237,119, 48,114,196,123, 53,102,190,219,213,109,141,192,212,196,182,168,168,232, 74,126,129,230,128,216, 92, 52,116,196,240,224,
- 88, 0, 56,121,234,252,208, 86,173,172,207, 73,205,133,239,137, 68,162,182,197, 90, 93,206,137, 95, 83, 62,169, 75, 81,229,234,
-234,122,218,218,218,218, 60, 55, 55, 55, 61, 43, 43,235,219,190,125,251, 46,219,177, 99,135,117, 66, 66, 2,146,147,147, 49,115,
-230, 76, 73, 74, 74,202,180,200,200,200,171, 90,173,182,202,150, 45,165, 50,119,195,194,249,253,151, 72,165,118, 60,177,185, 37,
- 44,164, 54,240,242,110,142,214,109,251,162,119,159, 9,136,139,141,104,189, 99,251,103, 17, 79,159,134,127, 33,177,105,176, 76,
- 46,175, 95,229,251, 82,147,134,232,216,111, 96, 73,145,181,100,201,255,179,119,221, 97, 81, 92,237,247,204,246, 70,135,165,131,
- 5,169, 2, 54,140,177,197,134, 21,236, 37, 38, 26, 77,212, 88, 98, 98,141,209,104,108, 41, 26, 99, 18, 53, 49,177, 36,177, 97,
- 98,195, 18,172,168, 8,246, 40, 88,232, 32,210,100, 23,118, 41, 91,216,222,230,247,135, 44, 31, 18, 96, 23,163,223, 47,201,183,
-231,121,246,217,221,217,153,179,247,206,189, 51,247,204,123,223,251,190,107,145,155,157, 45, 47, 42,164,188,127,250, 4,141, 59,
-124, 80, 40,203,160, 45, 47,186,118,245, 68,187, 62,125,199, 0, 64,212,129, 61,235, 46,191,255,166,243,160,239, 14,214,200,109,
- 67, 82,243,247,206,245,116,250,180,161,223,126,235,222,117,238, 92, 70,109, 97,161,174, 96,199, 14,101, 69, 74,138,145,198, 98,
-145,126,195,134, 17,252, 1, 3,216,115,179,178, 24,215, 55,110,124,141,190,110, 93,192, 74,157, 46,206,198,249, 95,229,252, 95,
-135,217, 9,190,225,234,195, 93, 45, 10, 45,130, 32,192,227,241,112,232,208, 33,208,233,116,208,104, 52,181,187, 27,129, 0, 0,
- 32, 0, 73, 68, 65, 84,208,233,244,102, 63,251,251,251, 91, 83,144,113,158,158,158,223,111,223,190,221, 99,232,208,161, 96,179,
-217,245, 63, 80,169, 84, 12, 30, 60, 24,209,209,209,116,129, 64, 48,249,208,161, 67,147,191,248,226,139, 10,137, 68, 50, 31,117,
-137,161, 91,192,128,144,144,144,248, 11, 23, 46,112,212,106, 53, 82, 82, 82, 80, 83, 83, 3, 38,147, 9, 95, 95, 95, 12, 25, 50,
-132,150,157,157,237, 50,120,240,224,248,220,220,220, 88, 0, 73, 86,148, 53,202,221,221, 61,249,200,145, 35,236,206,157, 59, 19,
-249,249,249,232,218,181, 43, 0, 64, 42,149, 98,204,152, 49,236, 41, 83,166,116,152, 60,121,242, 45,145, 72,212, 15,192, 93, 11,
-124,221, 60, 61, 61,247,141, 29, 59,214,251,139, 47,190,112,176,183,183, 71, 81, 81,145,208,211,211, 51,200,124,190, 39, 79,158,
-204, 28, 57,114,164,215,166, 77,155,182, 30, 61,122,244, 67,145, 72, 52, 13, 64,106,139,170,181, 78, 16,115,185, 92, 84, 84, 84,
-224,224,193,131,120,239,189,247, 64,165, 82, 33, 18,137,112,248,240, 97,188,255,254,251,102, 65, 99,149, 24,230,114,185,209,129,
-129,129, 63, 95,190,124,217,215,201,201, 9,222,222,222,148, 79, 62,249, 36, 34, 32, 32,128,211,182,109, 91,170, 80, 40, 68,124,
-124,124,192,212,169, 83, 79,150,148,148,188,163,209,104, 44, 78,169,121,120,120,252,114,250,244,105,255,140,140, 12,236,216,177,
- 3,213,213,213, 96, 50,153,112,114,114,130,167,167, 39,130,130,130,136,229,203,151,115, 71,142, 28,201,157, 63,127,254, 47, 90,
-173,182,139, 21,109,212,217,221,221,125,231,128, 1, 3, 2,214,173, 91,231,228,233,233, 9,243,131,129, 84, 42,245, 45, 42, 42,
-122,117,245,234,213, 19,238,222,189,251, 88, 36, 18,205, 6,112,191,149, 23, 78,151,142, 29, 59,198,142, 25, 51,134, 42, 20, 10,
-113,224,192,129, 88,185, 92,222,165, 21,226,242, 31,133,187,119,110,227,221,121, 11,106,189,253,252, 24, 23,206,255, 60,238,232,
-241,224, 59, 78,156,167, 9,169, 37, 42,232, 38,140,205,237, 62,100,232, 12,198,136,152, 49,181,187,126,216,106,103,141,208,162,
- 51, 25,174, 7,227,190, 41,185,122,237,110, 68,226,197,219,195,198,141, 26, 69, 50, 24, 78, 1, 0,240,225,162,133,244,248, 83,
-167,246, 12,142,238, 33,232,219, 39,170,228,205, 41,139,253, 91, 81,220,224,224,224,224, 43,105,105,105, 30, 44, 22, 11,213,213,
-213,174,187,118,237,250,166, 79,159, 62,148,130,130, 2,100,103,103,163,176,176, 16, 82,169, 20,131, 7, 15,182, 75, 77, 77,253,
- 17, 64,179, 66, 75, 71, 25,248,185,119, 91,253, 54, 87, 14,175,157,206, 40,115, 39,245,194,142,137,167, 19, 59,253,118, 64,213,
-213,195, 43, 52,104,250,219,107,176,254,179, 99,244, 95, 15,126,185,250,210,197,223, 0, 74,187,230, 51, 2,144,232,245,241,202,
- 21,144,201, 53,152,242,198, 44, 76,125, 99,150, 43, 9,173, 23,105, 84,243,180,170, 26, 39,123, 70, 86,194,246,159,190, 25, 11,
-192,183,129,216,186,100, 19, 91,205, 99, 61,141,214, 35,246,251,239,249, 17, 51,103,178,238,175, 91,167,168, 76, 73, 81, 5,142,
- 24, 81,211,117,206, 28, 13, 0,200, 11, 11, 25,185,107,214,112,249,175,189,198,233,185,116,169,179, 81,171,245, 92,191,126,253,
- 43,171,159, 38, 47,111, 21,167,255,164, 73,198,213,123,246,116, 79, 89,188,184, 63,161,215, 83,135,245,236,121,111,227,129, 3,
-101,127,133,243, 69,150, 83,144,156,172,169, 14, 8, 64,215, 49, 99,170,252,221,221, 53, 47,178,238,127,165,156, 54,212,195,236,
-171,245,110,195, 39, 84, 36, 36, 36,244, 3,112, 5,192,186,216,216,216,181, 0,224,232,232, 88, 33,145, 72,220,227,227,227, 45,
-138, 44, 58,157, 14, 47, 47, 47, 4, 5, 5,137, 68, 34,145, 71, 11, 5, 40, 53,153, 76,190, 36, 73,214, 91, 95,154,131, 70,163,
- 65, 94, 94, 30, 58,117,234,244, 4, 79, 19,209, 54,107,212,225,114,185, 5,217,217,217,110,153,153,153,184,123,247, 46, 2, 2,
- 2,224,236,236, 12, 58,157, 14,189, 94, 15,153, 76,134,144,144, 16,176, 88, 44,116,235,214,173, 82,161, 80, 4, 88,152, 2, 98,
-241,120,188,188,228,228,100,191,174, 93,187,226,143, 63,254,128,159,159, 31, 60, 61, 61, 1, 0,133,133,133,184,118,237, 26, 70,
-140, 24,129,180,180, 52,140, 31, 63,190, 84,161, 80, 4, 1,208, 52, 71,232,226,226, 34,188,124,249,242,147,200,200, 72,181, 66,
-161,160, 84, 84, 84,208, 83, 82, 82, 12,114,185,220, 78, 42,149,210, 37, 18, 9, 93, 38,147,209, 20, 10, 5,157, 66,161, 48, 84,
- 42, 21,253,210,165, 75, 84,157, 78,215, 98,128, 76,115, 59,157, 58,117, 10,145,145,145,136,143,143,199,146, 37, 75,112,253,250,
-117,248,249,249,225,200,145, 35, 88,186,116, 41,114,114,114,224,230,230,134,142, 29, 59, 90,106, 35,116,232,208, 33,255,225,195,
-135, 29, 24, 12,134, 57,175,163, 57, 95, 30,196, 98, 49, 30, 61,122,132,178,178, 50, 4, 6, 6,226,141, 55,222,120, 84, 86, 86,
- 22,104,169,231,249,248,248,136, 51, 50, 50,220, 58,117,234,132,138,138, 10, 56, 57, 57,193,209,209, 17, 78, 78, 78,245,159, 3,
- 2, 2,176,120,241, 98,120,122,122,138,212,106,181,135, 37, 17, 20, 25, 25,121,254,210,165, 75,110, 14, 14, 14, 40, 47, 47,135,
- 76, 38, 3,141, 70, 3,151,203,133,155,155, 91,189,144,207,203,203, 67, 76, 76, 76,101, 65, 65,193,208, 86,136, 36,138,135,135,
- 71,246,131, 7, 15,130, 72,146, 68, 73, 73, 9,114,114,114, 48,111,222,188, 60,181, 90, 29,138,127, 81,206,190, 6,126, 87,140,
-105,111,191,203, 24, 59,186,151, 54, 43, 35,129, 96,153,114,208, 37,194, 65, 10, 0,247,210,101,142, 26, 74, 8,194,194, 99,201,
-227, 39,111, 48,247,237,221, 69,135, 9, 30, 32,144,147,149,135, 79,155,227, 30, 50,192,107,230,194,133,239, 68,244,239,211,143,
- 34, 87, 40,220,127,252,241,219,110, 5, 5, 89,238, 0, 16, 16, 16, 38,154, 59,119, 81,170, 61,143, 39,186,114, 45,217,180,101,
-203, 47,233, 23,146,132, 63, 89, 81,228,128,160,160,160,155,167, 78,157,114,115,119,119,135,163,163, 35, 20, 10, 5,116, 58, 29,
- 50, 51, 51,213,135, 14, 29,210, 59, 56, 56,216,151,151,151, 67, 34,145,128, 32, 8,156, 58,117,170, 4, 64,155,198, 68,102, 31,
- 45, 0,152, 55, 60,140,222,113, 96,144, 51,131,101,224,112,232,185, 94, 32,140, 44,130,180,243, 56,123,254, 94,167,179,137,127,
-188, 57,118,220, 18,126,223,126, 99,177,122,213, 4,189, 64, 80,210, 85,135,190,217, 77,249,104,133, 6, 98,224,152,241, 99, 39,
-174, 95,191, 22,107, 87,175, 67,194,169, 19, 82, 59, 30, 69,227,224, 68,119,124,237,213,222,234,197,239,141, 46,173,173, 21,248,
-173,223,116,232,141,152,209,139,125,251,244, 29,131,107, 87, 79,224,192,158,117,119, 9, 14,105,155, 70,108,132,181,128,179, 83,
- 64,192,236, 15,242,242, 24,247,215,174,173, 53, 8, 4, 53, 81,139, 22, 85, 54,181,239,147,196, 68, 30,211,219,219,193,121,212,
- 40,151,173,109,218,144,122,145,104,103, 83, 62, 70, 77,113, 94,180,179,115,250,237,236,217, 65, 36,157,222,111,217, 71, 31,113,
- 98, 99, 99, 33,147,201,112,236,216, 49,236,220,177, 67,227,229,229,245,208, 59, 61, 61, 45, 66, 38, 91,101, 45,103,212,162, 69,
-149, 70,163,145,152,184,116,233,224,140,194,194,129,229, 34, 81, 91, 0,240,114,113, 41,141, 10, 8,184,251, 75, 66, 66,206,119,
-237,218,153,172, 45,231,238,115,231, 60,142, 22, 21,205,116,113,113,225, 84,136, 68, 52, 22,147, 89,245,106,199,142, 71,126, 88,
-185,242,138,225,193, 3, 6,219,215,215,193, 49, 54,182,213,117,143, 90,180,168,178, 90, 46,167,125,240,217,103,189,139, 43, 42,
-218,214,106, 52,129, 18,185,220,211,168,215, 83, 28,184,220,170,246, 33, 33, 34, 85, 74,138,176,189, 82,185,224, 39, 64,244,178,
-218,186, 41, 45,242, 15, 66,227, 56, 90,127,202,117,120, 37, 54, 54,246, 79,171,107, 72,146,180,202,154, 69,167,211,159,153,166,
-106, 1, 12,130, 32,144,154,154, 10, 87, 87, 87,120,122,122,130,197,122, 54,249,160, 88, 44,198,245,235,215,145,149,149,133,206,
-157, 59,155,167, 49,154, 87, 68, 44,214,194, 77,155, 54, 57,105,181, 90,220,189,123, 23, 81, 81, 81, 96,177, 88, 96, 48, 24,207,
-136, 64,145, 72,132,240,240,112, 44, 91,182,204,241,139, 47,190, 88,168,209,104,154,125, 34,165,209,104,243,103,205,154,229,110,
-182, 96,149,150,150,162, 91,183,110,245,191,243,249,124,220,187,119, 15, 81, 81, 81,240,245,245,197,132, 9, 19,220, 15, 28, 56,
- 48,223, 96, 48,108,110,142,147,201,100, 82, 34, 35, 35,187, 3, 0,143,199, 3,133, 66,201,117,112,112,224,123,120,120,240, 28,
- 28, 28,254, 84,199, 61,123,246, 72, 40, 20,138,222,162, 26,160, 80, 80, 94, 94,142,136,136, 8, 72,165, 79, 51,184, 40, 20, 10,
- 4, 6, 6, 66, 38,147,213,139, 86,111,111,111,168, 84, 45,187,126,117,234,212,105,109,104,104,232, 16, 30,143,199,162,211,233,
-184,127,255, 62,186,118,237,138, 67,135, 14,193,223,223, 31, 92, 46, 23,121,121,121,136,140,140, 68,114,114, 50,248,124, 62,194,
-195,195, 89,238,238,238, 87,171,171,171,147,138,139,139,215,182, 80, 78,138,157,157, 29,146,147,147,241,203, 47,191,160,176,176,
- 16, 2,129, 0,246,246,246,232,210,165, 11, 58,118,236,136, 94,189,122, 33, 47, 47, 15,132,229,206,228, 25, 20, 20,148,240,199,
- 31,127,184,145, 36,137, 3, 7, 14,160,182,182, 22, 90,173, 22, 20, 10, 5,108, 54, 27,206,206,206, 24, 56,112, 32,248,124, 62,
-130,130,130,112,248,240, 97,183,225,195,135,159, 17,137, 68, 93, 0,148, 91, 58,175,206,206,206, 11,214,172, 89,227,231,238,238,
-142,162,162, 34, 72,165, 82,120,120,120,160,127,255,254, 62, 23, 47, 94, 92,160,215,235,191,253,183, 12,100, 13, 28,223,137, 11,
-231,127, 30, 23,212,190, 38,178,115, 8,215, 47, 62,193,195,239, 80,130, 40, 28, 0, 34,194, 60, 50,198,197,114, 75,239,103, 36,
-148, 94, 56,127,226,110, 86, 46,226, 97,197,212,182, 84,169, 57,146,120,241,246,176,174,157,187,153, 54,125,185, 52,230,189,121,
- 51, 89,238, 30, 51, 80, 81,114, 2, 23, 47,167,250, 47, 93, 50,139,191,249,235,221,103, 19, 47,222,166, 72,149,154, 85,214,153,
-178,252,191,219,251, 67, 47, 55,121,229, 81,228,103, 51,193,177,143, 64, 64, 64, 48,100, 50, 25,216,108, 54,251,141, 55,222, 48,
-174, 88,177, 66,233,224,224,192, 37, 8, 2, 73, 73, 73, 34, 0, 67, 45,241,170,221,157, 73,163, 78,111, 32,153, 84, 19, 73,216,
-171, 8, 99, 53, 51, 61,243, 49,134, 68, 15,168,232,211, 35,226,139, 21,235,191,254, 56, 40,184, 43,255,157,153,235,232,159,173,
-125,115, 7, 8,244,109,138, 39, 59, 31,151,137, 35,199, 57, 0, 98,214,127,186, 22, 5, 5,121,206,239, 78,151,172,163,177, 56,
-222,161,109,122,219,239,248, 37,105, 88, 96, 96,187,182,139,231, 79, 56,253,205,247,223,196, 52,180,108,237,221,179,230, 36,128,
- 65,214,156,219,255, 33,116,154,154,144,128,218,146, 18,125,245,213,171,234, 65,223,127, 95,233, 55,116,232,183, 90,157,206,205,
-124,171,160, 16, 4, 8,179,235,132,201, 68,208,150, 45,163,144, 52, 26,244,206,206,211, 81, 83, 19,108,137,115,137, 80, 56,238,
-205,153, 51, 99, 78,158, 59,135,118,237,218,213,143,103, 78, 78, 78, 88,186,116, 41, 22, 45, 90,196,186,119,239,222, 43, 71,143,
- 30,125,101,243, 87, 95,121, 0, 24,103, 77, 57, 47,220,186,229, 60,103,253,250,149,157,163,162,252,247, 31, 60,200,234,208,161,
- 3, 0,224,209,163, 71, 65, 95,110,220,216, 38, 34, 50,178,226,139,133, 11,247,102,172, 88, 17, 14,224,106, 75,156,229, 41, 41,
-218,163, 69, 69, 51, 47, 39, 37, 57, 69, 68, 68, 0, 0,114,114,114,220,183,110,221, 58, 43,124,194,132, 41,235,231,206, 93, 21,
-171, 86, 75, 28,196, 98, 86,236,119,223,209,126,155, 56,209, 34,167,185,156, 0,208,255,157,119, 22,246, 29, 48,160,227,184,153,
- 51, 93,252,253,253, 9, 59, 59, 59,232,116, 58, 8, 4, 2,231,140,140,140, 14, 9,114,185,236,248,173, 91, 7, 96, 52, 14,126,
-137,109,221,164, 22,249,135, 89,178,254,172, 41,234,222,251, 39, 36, 36,144, 0,250,199,198,198, 38,155, 7,112,163,209,104,149,
-200,162,209,104, 32, 8,194, 90,177, 5,146, 36, 81, 89, 89,137,202,202,202,250,169, 35,145, 72,132,203,151, 47, 35, 47, 47, 15,
-116, 58, 29, 12, 6, 3, 58,157,229, 28,180, 60, 30, 47, 58, 58, 58,154,118,235,214, 45, 4, 4, 4,128,195,225,212,151,203,252,
- 98, 48, 24,240,242,242,130, 76, 38,195,160, 65,131,232,219,182,109,139,110, 73,104, 57, 58, 58,142,152, 52,105, 18,211,252,189,
-182,182, 22, 84, 42,181, 94,180,212,214,214,162,186,186, 26, 18,137, 4,106,181, 26, 61,123,246,100, 38, 36, 36,140,168,170,170,
-218,108, 77,253,149, 74,101,173, 72, 36,114,234,219,183,175,243,222,189,123,115,122,246,236, 25,242, 76, 79,187,114, 69,173, 86,
-171,233, 20, 10,197,170, 60,122,113,113,113,245,231,190,172,172, 12, 59,118,236,168,255, 45, 47, 47, 15,219,182,109, 3, 73,146,
- 32, 73,178,197, 54, 10, 13, 13, 29,126,224,192,129,168,253,251,247,215, 80,169, 84,228,228,228,224,224,193,131, 32, 73, 18,124,
- 62, 31, 74,165, 18, 21, 21, 21, 72, 74, 74,130,193, 96,128,157,157, 29,124,124,124,216,243,231,207,239,179,110,221, 58,122, 75,
- 66,203,104, 52, 26,169, 84, 42,218,180,105,131,213,171, 87, 67,173, 86,131,193,120,170, 47,101, 50, 25, 36, 18, 9,210,210,210,
- 80, 84, 84, 4,146, 36, 91, 28,100,216,108,246,132,253,251,247,187, 51,153, 76,168, 84, 42,200,229,114,148,150,150,162,184,184,
- 88, 45, 18,137, 12,246,246,246,148, 54,109,218, 80, 88, 44, 22,107,204,152, 49,132, 89,112,198,198,198,186, 30, 56,112,224,117,
-173, 86,107, 73, 36,241, 61, 61, 61, 63,158, 53,107, 22,187, 97,159, 45, 47, 47,199,184,113,227,184, 55,110,220, 88, 33,147,201,
- 14, 2, 16,255,203, 6, 52,242,232,241,224, 59,119, 47,230, 68,198, 39,120,248, 21, 63, 49,246, 94,250,225,215, 52, 0,216,181,
-115, 67,239,248,132,178,235,161,237, 42, 74,143, 30, 15,190,227,236,156,101, 73, 8, 80, 6,246,243, 26,201,227,178, 39,141, 27,
- 53,138,252,241,199,111,187,189, 55,111, 38,171, 77,240,210,167, 22, 78,186, 59, 6, 25, 62, 37,148,170, 71,236, 31,127,252,182,
-219,184, 81,227,211, 10, 11,139,118, 14,236,199, 58,124, 57, 89,248,123, 75, 22, 67,119, 87,182, 15,151,165,128, 79, 64, 71,132,
-132,241,112,239,126, 14,142, 29,185,137,176,240, 87,161,209,104, 96, 48, 24,120, 35, 71,142, 84, 30, 58,116, 72,157,155,155, 43,
- 87,169, 84,253, 0,228, 90,170,252,147, 39,153,166, 16,207, 87,117, 12, 14,203, 32,151, 50,148,203, 87, 29,157,216,173,199,144,
- 40,103, 47, 31, 58,159,103,250,125,248,224, 87, 14,254,242,211,234, 69,171,214, 28, 68,247, 87,134,244,204,202,185,218, 17,192,
-195, 38,197,107, 1, 18, 40,199,142, 27, 10,242,243, 99,138,139,138,158, 4,123,120,106, 31, 73, 72,253,130,229,187, 7,247,237,
- 55,161, 83,135,176,215,152, 89,153,201,196,234,101,175,255,186,126,211, 55,111,152,197,214,165,196, 95,251, 77,159,126,147,185,
-119,111,243,214,241,255, 53, 48, 88, 44, 95,187, 54,109,104,133,123,247,170, 2, 70,142,172, 1, 0,173, 78,231, 86, 88, 84,228,
-200,229,114, 65,146, 36,244,122,253, 51, 62,196,102,191,225,136,144, 16, 15,107, 56, 11, 63,249,164,211,178,101,203, 80, 94, 94,
- 14,131,193, 0, 58,157,222,248,158, 13,133, 66,129,233,211,167,227,187,175,190,122,213, 26, 78,163,209, 72,204, 89,191,126,229,
- 71, 43, 87,118,152, 61,123, 54,165,225,189,215,197,197, 5, 71,143, 29, 99,110,223,190,221,247,227,239,190,155,254, 38,139, 85,
- 0,141,166, 69,206,202,192, 64,184, 84, 84,112,204, 34, 11, 0, 66, 66, 66,176, 99,199, 14,214,140, 25, 51,152, 35, 71,142,252,
-250, 94,231,206, 91,191,237,211, 39,223, 53, 56,216,129,201, 98,249, 90,226, 52,159, 79, 0,144,171,213, 17,223,110,221,234,124,
-251,246,109, 84, 84, 84,160,188,252,233,243, 40, 65, 16,232,222,189, 59, 49,117,234, 84,199,246,126,126,175,192,104,124,153,205,
-253, 39, 45,242, 15,194,187, 77,108,251,143,143, 86, 93,133,136,186, 10, 18, 13, 6,199,103, 4,139, 37,161,245, 60,144, 72, 36,
-144, 72, 36,248,233,167,159,192, 96, 48,234, 7, 95, 0,208,106,181,214,136,150, 72,111,111,111, 72,165, 82, 4, 7, 7, 63, 99,
-201, 98, 48, 24,160,209,104, 96, 48, 24, 96,177, 88,208,104, 52,240,247,247,135, 82,169,140,108,137, 83,165, 82,117,113,113,113,
-169, 31, 96, 53,117,157, 85,163,209,212,151, 87,171,213,162,166,166, 6,181,181,181,144,203,229, 80, 40, 20, 93,173,169,175,201,
-100, 66,122,122,250,163,144,144,144, 46, 84, 42, 21,118,118,118, 60,133, 66, 81,239, 91, 84, 93, 93,141,125,251,246, 41,222,122,
-235, 45,183, 83,167, 78, 89, 20, 90, 4, 65,224,253,247,223, 7,139,197,130, 82,169,196,143, 63,254,136, 15, 62,248, 0, 12, 6,
- 3,114,185, 28, 59,118,236,192,226,197,139, 65,163,209,160,213,106,177,117,235,214,102,185, 50, 51, 51, 11,111,221,186,213,181,
- 91,183,110,206,199,143, 31, 23, 15, 30, 60,152, 63,116,232, 80,112, 56, 28,168, 84, 42,232,245,122,188,250,234,171, 8, 13, 13,
-133, 72, 36,194,217,179,103, 43,131,130,130,220,110,223,190,109, 42, 47, 47, 47,182, 32,174,201, 6, 22, 67, 24,141, 70, 84, 84,
- 84, 64, 34,145, 64, 44, 22, 67, 32, 16,224,201,147, 39,160,209,104,176,160,179,224,234,234, 58, 62, 34, 34,130, 10, 0, 28, 14,
- 7, 93,186,116,193,202,149, 43, 13, 42,149,106, 18,128,179,117,187, 13,223,189,123,247,241,107,215,174,209,188,189,189,145,157,
-157, 13, 62,159, 79, 99,179,217, 22,133,150,167,167,231,158,223,127,255,221,197, 44,174,205,231, 89,169,124,218, 28,227,198,141,
-115,217,191,127,255, 30,131,193, 48,226,223, 54,168, 57,113,192,232, 18,225, 32, 61,148, 32, 10, 95,250,225,215,180,208,136,167,
- 15,175,239,206, 6,109,243, 87, 75,194,167,140,118, 56,237,196,145, 49, 44,241, 12,143,246,219, 62,106,212, 96,202, 27,147, 99,
-243, 24, 12,167,128,157,187,214,185,187,123,204,104, 32,195, 28,224,234,230,128,128, 54, 76,226,232,233, 44,247,229, 43, 62,213,
-196,237,255,166,224,215,223, 18,134, 49,233,137, 67,206, 94, 44,157,219, 28,119,238, 35,201, 41,165,134, 29, 38,171,122, 64,184,
-120,244, 70,151,206, 33,112,231,215, 96,247,158, 67,104,215,190, 59, 52, 26, 13, 28, 28, 28,184, 70,163, 81, 71,165, 82,227,172,
- 17, 89, 0,112,233,146,196, 20, 30, 46,209, 82,229, 38,195,123, 31,108, 30, 59,120,248,168,142, 3, 7, 70,155, 46, 36, 94,208,
-245,238,170, 19, 14, 31,218,165,226, 92,226,246, 60,161,224,113, 80,120,100, 31,100,102, 36, 13, 35, 73,164, 19, 68,211,214,167,
-140,124,156, 83,155, 50,147, 14, 29,122,215,164, 50,165,113, 62,251,252,225,240,152,152,105, 17,175,245,125,205,148,120,241,178,
-150,137,202, 44,135, 62,189,202,222,155, 57,252,248,207,113, 91,135,156, 59,187, 39, 80, 42, 43, 78,176,137,172, 70, 15,105, 6,
-131, 7,141,197,162,136,147,146, 12,145, 51,102,104,204,215, 35,151,203,197,201,147, 39,193,100, 50,235, 95, 12, 6,163,254,179,
-135,135, 7,136,186,101,164,214,112, 2,128, 80, 40, 68,121,121, 57, 28, 29, 29,193,231,243, 81, 94, 94,142, 27, 55,110, 32, 55,
- 55, 23,116, 58, 29,195,134, 13, 3,165, 25,223,230,198,156, 19,151, 46, 29, 28, 22, 25,233,223, 88,100, 1,128, 78,167, 67,117,
-117, 53, 70,143, 30, 77, 57,123,246,172,231,185,146,146, 81, 0,226, 90,226,236, 26, 19, 83, 85,113,244,104,147,255,221,173, 91,
- 55,226,250,245,235,172, 97, 67,135, 46, 90,242,249,231,219,191,219,191,191,212,104, 48,120,182,166,238, 20, 10,133, 66, 16, 4,
-252,252,252, 80, 93, 93,141,218,218,167, 51,216,118,118,118,112,118,118,134, 94,175,135,137, 36,233, 47,179,173,155,211, 34,255,
- 16,236,106, 32,184,118,253,201,162, 85, 87, 41, 0,232,223,112, 96, 49,153, 76, 86,137, 44, 58,157,110,209,231,202, 26, 43, 87,
- 99, 88, 35,180,204,101,101,179,217,245, 23, 90, 67,129,101, 46, 39,133, 66, 1,149, 74,181, 56,136,215,137, 33,170, 92, 46,199,
-177, 99,199,208,175, 95,191,250,105, 41,169, 84, 10,137, 68, 2,169, 84, 10,181, 90,141,194,194, 66, 92,186,116, 9,129,129,129,
-128,149,193, 95, 11, 10, 10,238,182,107,215, 46,202, 60,136, 15, 24, 48,192,119,239,222,189,130, 17, 35, 70,120,147, 36,137, 85,
-171, 86, 85,190,250,234,171,110, 13, 7,121, 75,160, 82,169,184,113,227, 6, 2, 3, 3, 65,146, 36, 24, 12, 6,114,114,114,224,
-238,238, 14,147,201, 4, 26,141, 6,177, 88, 12,123,251,150, 99, 36,166,167,167,191,253,206, 59,239, 8, 28, 29, 29, 59, 85, 85,
- 85, 9, 89, 44, 86,223,148,148, 20, 63,157, 78, 7, 7, 7, 7, 56, 56, 56,224,204,153, 51,112,114,114,194,194,133, 11, 75, 84,
- 42,213, 13, 30,143,231,161, 82,169, 30,148,151,151,175,106, 77,123, 27, 12, 6, 40, 20, 10,212,212,212,160,186,186, 26, 50,153,
- 12,106,181,218, 98, 25,155, 66,223,190,125,145,144,144, 64,221,176, 97,195,207, 5, 5, 5, 0,128,128,128, 0, 44, 92,184,144,
-234,227,227,131,194,194, 66,220,189,123, 23, 58,157, 14, 36, 73,182,120,241,210,104,180, 1,111,189,245, 86, 31,127,127,127, 66,
-167,211,193,100, 50, 65,163,209,192,252,185,164,164, 4, 97, 97, 97,148, 54,109,218,244, 44, 40, 40, 24, 0,235, 22, 86,216, 0,
-160,162,228, 4,124,232,238, 0,197, 1,164,234, 4,170, 42,159, 47,138,139, 72, 36,250,124,217, 39,215,103,124,183, 73,231,241,
- 68, 8,132, 68,140, 65, 80,199, 65,120,123,170, 1, 27,190, 58, 6,255, 54, 33, 40, 46, 46,198,128, 1, 3, 24, 2,129,224,157,
-218,218,218,165,214,114, 39, 38,222, 50, 94, 56,115,118,194,196,215,167, 69, 69, 71,143, 48,156, 63,127, 6,233, 15,206,103,188,
-243,250,120, 17,105,170, 37, 92,156, 56,105, 57,217,119,130, 58,117,233, 15,173,193,216, 23, 88,187, 9, 88, 75, 54,127,189, 67,
-123,250,180, 23,229,244,137, 61, 83,223,152, 50,189,243,160, 65, 67,244,231, 19,127,199,221,155,137,247,191,222, 52, 43,121,195,
-214,195, 3, 6, 15, 27, 31,206,247,184,113, 38, 34, 88, 51,211,207,213,241,209,238,189,213,182,206,210,212,181,201,102,155, 80,
-119, 95,164, 16, 4, 72,146,124, 70,100, 53, 22, 90, 20, 10,197,162, 1,160, 33,103,195,177,200,252, 64,189,115,231, 78,176, 88,
- 44, 48,153, 76,208,233,116,139,238, 23, 13, 57, 51, 10, 11, 7,238,139,139, 99, 53, 37,178,170,170,170, 80, 85, 85,133,218,218,
- 90, 76,158, 60,153,177,238,206,157,110,168,115,253,104,142,211,223,203, 75,195,227,112, 42, 50, 51, 51,189, 59,118,236,248, 76,
-121,101, 50, 25, 56, 28, 14,226, 14, 30,100,196,198,196,204, 27,116,230,204,215,176, 16,255,170,169,186, 19, 4, 1,119,119,119,
- 56, 59, 59,131, 32, 8, 24, 12, 6,148,151,151, 35, 35, 35, 3,119,238,220, 1,149, 32, 12, 47,179,141,155,210, 34,255, 64,171,
-214,174, 38,167, 14,155,155, 19,109,141,208,162, 82,169,207,109,213,106, 14,214, 76, 29,114,185,220,135, 2,129,160,183,143,143,
- 15, 12, 6, 67,189,208,106, 60,117,104,182,126,220,187,119, 15, 92, 46,247,161, 90,173,110,145,147, 36,201,158,175,188,242, 10,
-226,227,227,145,148,148,132,199,143, 31, 67,169, 84, 66,163,209, 64,165, 82, 33, 35, 35, 3, 38,147, 9, 17, 17, 17,224,241,120,
-224,114,185, 15, 53,154,150, 31, 68, 21, 10,133,144, 78,167,135,112, 56,156,250,109, 94, 94, 94,168,170,170, 50,233,245,122,236,
-219,183, 79,230,233,233,201,227,112, 56, 86, 11, 87,130, 32, 32, 18,137,224,235,235, 91,239,163, 37,151,203,225,238,238,110, 22,
- 22,208,104, 52,176,183,183,183, 56,117, 8, 64,157,159,159,191,164,193,247,238, 19, 39, 78,252,245,208,161, 67,237, 47, 94,188,
-136,219,183,111,131,207,231,227,139, 47,190,120, 92, 84, 84,244, 6,128, 59, 34,209,139,245,139,180,166, 15, 85, 85, 85, 29,123,
-248,240, 97,207, 87, 94,121,165,254, 46, 49, 96,192, 0, 98,192,128, 1,110, 13, 77,253, 98,177, 24,127,252,241, 7, 46, 94,188,
- 8,130, 32,144,151,151,103, 84,169, 84,191,182, 52, 75,225,227,227,179,119,229,202,149,118, 6,131,161,190,111,115, 56, 28,176,
-217,108, 48, 24, 12, 80,169, 84, 20, 21, 21, 97,244,232,209,142,223,127,255,253, 30,141, 70,211, 1,128, 14,255, 18, 72, 84,208,
-221, 75,151, 57, 70,132,121,100,236,218,185,161,247,187,179, 97,158, 58, 52, 68,132,185,103,220, 75,175,112,140,114,183, 92,223,
-179, 23, 75,223,211,234,207,142, 60,123,238,202,164, 15, 23, 45,164, 7, 4,132,137, 46, 94, 78,245, 31,100,248,148,112,117,115,
- 64, 85,165, 12, 69, 37, 21, 40, 40,214,146, 1, 1, 97,162,187,127, 60,100,125,245,237,150, 32,133, 82,109,158, 58,108,177,159,
- 94,189,241,120,204,215,219, 88,201,211,222,233,206,228,112,188, 81, 93,249, 16,254,254,124,140,142,237,132, 95,246,223,128,163,
-163, 11, 60, 60, 60, 64,161, 80,120,214,214,189,178,178,146, 56,246,219,213, 25,111, 77,159,245,234,208, 33, 49,134,115,231, 79,
-211,146, 46,156,186,177,103,215,199,199, 73,170,130, 75,144,114, 78,219,118,158, 15, 30,229,223,123, 99, 96,244,100,112, 24,246,
-129, 64,104,147, 29,182,126,129, 1,137,146,248, 67,107,217,111, 77,127,183,215,208,161,163, 12,231,207,159,192,249, 51,251,111,
-173, 89,211,246,204,227,178,131,140,155,119,158,176,199, 76,152, 91,147,112, 54, 75, 59,126,100,187, 92,111, 94, 23, 21,240,216,
-166,170, 26, 62, 72,210,104, 21, 6,141,198,207,119,232, 80,170,178,184,152,110,231,225, 97, 0, 0,189, 94,111, 81,104,161,153,
- 41,232,198,156,214,150, 69,169, 84,194,212, 76,236,196,198,156,229, 34, 81,219,186,135,240,122,232,245,250,122,145, 85, 85, 85,
- 5,137, 68, 2, 30,143, 7,177, 70,227, 97, 13,231,144, 30, 61,246,173, 91,187,118,233,209, 99,199, 24, 13, 69,150,249, 69,167,
-211,241,229,166, 77,140, 15, 62,252,112,238, 60, 26,109, 1, 12, 6,171,207,167,249,161,157, 74,165,130, 70,163,161,184,184, 24,
- 37, 37, 37, 40, 46, 46, 70,113,113, 49, 56, 28, 14,200,151,188, 8,232, 31,236,159,101, 22, 89, 13,223,235,173, 92, 45,134,119,
-104,141, 51,188,181,194,192,216,138,249, 93,107,132,150, 66,161,184,120,233,210,165, 30, 99,198,140,161,221,186,117, 11,158,158,
-158,245, 66,203,252,110,158,142,226,114,185, 56,126,252,184, 78,161, 80, 92,180,112, 49, 93, 58,115,230, 76,212,234,213,171,233,
-111,191,253, 54, 50, 51, 51, 49,123,246,108, 72, 36, 18,200,100, 50, 84, 85, 85, 65,169, 84,162, 71,143, 30, 96,179,217,120,240,
-224,129, 94,169, 84, 94,178, 96,177, 35, 69, 34, 81, 45,159,207,247,106,252,219,132, 9, 19, 60,126,248,225, 7,101,118,118,182,
-190,119,239,222, 14,214, 10, 14, 51,126,251,237,183,122, 75, 93,110,110, 46,126,248,225,135,122,159,172,212,212, 84,108,222,188,
-185, 62,246, 89, 43,113,167,178,178,210,160,215,235, 17, 24, 24, 8, 31, 31, 31,168,213,106,108,217,178,197, 0,224,206,255, 87,
-111, 86,171,213, 71,167, 77,155,246, 81, 90, 90,154, 23,141, 70,123,106,210,174,171,159, 78,167, 67,126,126, 62, 50, 50, 50,144,
-157,157,141,234,234,234,250, 7,129,123,247,238,213,232,245,250,195,205,241,242,249,252, 85,191,252,242,139, 39,151,203,125,166,
- 63,155,173,161,102, 43,169, 88, 44,134,147,147, 19, 6, 13, 26,228,126,233,210,165, 85, 26,141,102,245,191,100, 76, 35, 38,140,
-205,237,254,193,123, 99, 48, 46,150, 91, 26,159, 80,118,125,243, 87, 75,234,156,225,221, 51,198,197,250,148,222,207,113,194,132,
-177, 39,186, 3,120,130,150, 29,182, 77,151,147,133, 39, 95,121,197, 57, 41,254,212,169, 61, 43,150, 45, 74, 93,186,100, 22, 95,
-169,122,196, 14,104,195, 36, 0,160,160, 88, 75, 62,200, 52,169, 55,127,189, 40,117,195,166,239, 41, 21, 85,146,217,127,252,209,
-124,120,131,134,226,133, 66, 1, 59, 32,180,159, 32, 40,184, 79,187, 91, 55,226, 96,199, 85, 33, 36,180, 59,134, 14,233,137,164,
- 43,247, 80, 46, 86, 67, 40, 20, 66,163,209,180, 24, 46, 33,251,193,241,169, 36, 65,250, 19, 36, 81, 66, 80, 72,246,212,105, 51,
-251,198,196,140, 34, 19, 18, 78, 25, 78, 28,143,187,118,248,192,182,163, 20, 6,157,166,210, 58,106, 9, 66, 45, 5, 37, 61,179,
- 86,241,244,129,134,206, 98, 52,111,126,173, 11,236,218, 49, 60,212,115,234,180,217,142, 35,134,143, 38,207,156, 57, 97, 58,124,
-104, 95,210,225,159, 34,227, 76, 20, 25, 67, 88,170,100, 73,101,122, 41, 73, 48,157,106,101, 38,101, 69, 65, 7,181,119,204, 4,
- 29,112,212,166,174, 26,142, 3, 26,205,147,218,210, 82, 47,151,126,253, 88,249,107,215,114, 61,122,244, 80, 19,117, 62,196, 45,
- 9, 45, 42,149, 10, 80, 40, 38,107, 56,173, 45,139, 74,165,130, 9,208, 63, 15,167,193, 96,120, 70,100,153,133,150,249,122,177,
-134,115,215,154, 53,183,252,135, 14,173,190,114,229,138, 71,255,254,253, 9,185, 92, 14,185, 92,254,140,216,242,246,246, 38, 58,
- 70, 68,112,127, 75, 74, 10,176,246,124, 90, 83,119, 10,133,242,210,133,214, 63, 28,205, 38,146,110, 49, 5,143,217,162,101,141,
-208,178,210,162,165,215,235,245,112,119,119, 71,101,101,101,179, 3, 63,133, 66, 1,135,195, 49,207, 17,183,184,242, 78,163,209,
-108, 89,186,116,233,252,225,195,135,187,133,132,132, 64, 44, 22,195,195,195, 3,108, 54,187,222,119,204,204,151,154,154,138, 95,
-126,249, 69,166,209,104,182, 88,224,252,118,211,166, 77,239,141, 27, 55,206,197,211,211, 19,206,206,206,120,240,224, 1,156,157,
-157, 33,147,201,144,147,147, 3,123,123,251,122,191,157, 83,167, 78,201, 53, 26,205,183, 22,196, 27,153,146,146,162,179,183,183,
-127, 32, 22,139,169,213,213,213,180,154,154, 26,154, 76, 38,163, 75,165, 82,250,185,115,231,220, 28, 29, 29,149,151, 47, 95, 22,
-251,251,251, 83, 31, 63,126, 76,213,235,245, 22,213, 43, 65, 16, 88,176, 96, 1, 24, 12, 6, 52, 26, 13,182,108,217,130,165, 75,
-151,214,251,100,109,218,180, 9, 43, 87,174,172, 23,206,187,119,239,110, 85,207, 33, 73, 18, 58,157, 14,122,189, 30,122,189,222,
- 42,241,251, 87, 96,165, 96, 47,207,203,203,139,125,229,149, 87, 46, 28, 57,114,196,181, 46, 38, 25, 42, 42, 42, 80, 81, 81, 1,
-177, 88,140,218,218, 90, 24, 12, 6,248,248,248,160,162,162, 2, 39, 78,156,144,202,229,242,161,104, 97,197, 33,149, 74,157,214,
-183,111, 95, 90,227, 50,152,159,242,204,226,157,197, 98, 65, 32, 16, 96,192,128, 1,204, 43, 87,174, 76, 3,240,143, 22, 90, 13,
-195, 59, 12, 25, 58,131, 17, 22,222, 75,123, 63, 35,161, 52,180, 93, 69,233,148,209, 14,167, 1,224, 94,122,133,227,253, 28, 39,
-132,133,199,146, 67,134, 58, 71, 85,148,239,138, 4,160,107, 41, 93, 15, 0, 56,114, 89, 19, 7, 71,247, 16,216,243,120,148,205,
- 95,239, 62,251,227,143,223,118, 59,122,250, 63,225, 29, 54,127,253, 52,188,195,224,232, 30,166,236,172,236,137, 0,126,178, 86,
-188,196,198,142, 76,251,101,239, 47,200,206,184,236,253,209,130, 78,204,234, 10, 61, 56,118,126,136,234,226,129, 93,123, 31,226,
-254,253,251,229, 90,173,118, 64,139,253,155, 32,253, 51, 50,211,131, 35,195, 59,122, 78,157,246,174, 67,108,236,104, 36, 36,156,
-196,129,125, 63,165,140,159, 60,238,231,178, 26, 25,213,157,206,101,112, 73, 19,147,202,112,164, 49, 88, 28,145, 86,251,116, 13,
- 4,157,206,118, 0, 38,182, 56,240,204,121,119,138,227,192,232,209, 56,125,230, 36, 14,236,219,149,252, 73,248,132,159,218,117,
- 13, 35,122,116,251,106,110,187,246,237,218, 40,106, 43,100, 20,130,169, 83,171, 77,246, 95,237, 43,250,166, 96,229,180, 2, 0,
- 95,195,182,234,176, 33, 30, 28, 24, 49,226,149, 15, 30, 61, 98,240,251,244,225, 8,146,146,184,117,153, 72, 90, 20, 90, 52, 26,
- 13,100,243, 83, 93,207,112, 18,251,247, 83, 0,180,184, 8,139,193, 96, 64,169, 84, 66,223,188, 5,251, 25, 78,175,243,231, 75,
- 31, 61,122, 20,228,226,226,242,140,200,170,174,174,174,255,172, 86,171,161, 84, 42,193,225,112, 50, 84, 77,207,136, 60,195, 89,
-145,146,162,222,184, 96,193,234, 55, 38, 79,222,118,241,210, 37,182,171,171, 43,164, 82,233, 51, 66, 75,171,213, 98,224,160, 65,
-140, 77,105,105, 83, 33,147,173,177,230,124,122, 12, 24, 96,209, 31,152, 74,165,194,244,146,167, 14,255, 5,120,183, 41,225, 69,
-177, 52,133, 99,237,170,195,102, 6,200,198,217,189, 87, 70, 69, 69,169,115,115,115,225,239,239, 95, 47, 86, 26,254,167,131,131,
- 3,156,156,156,144,154,154,138,207, 63,255, 92, 5, 96,165, 5, 78,185, 82,169,124,125,240,224,193, 42, 26,141,134,208,208,208,
-250,248, 89, 38,147, 9, 76, 38, 19, 60, 30, 15,105,105,105, 24, 57,114,164, 82,169, 84,190,142, 63,199,208,106,204, 41, 85, 42,
-149,111, 14, 25, 50, 68,153,153,153,137,190,125,251,226,254,253,251,168,173,173, 69,109,109, 45, 10, 11, 11,209,177, 99, 71, 40,
-149, 74,252,240,195, 15, 42,165, 82,249, 38, 0,105, 75,156,114,185,124,228,210,165, 75,169,191,254,250,107, 59, 31, 31,159,240,
-238,221,187,135, 12, 26, 52,168,195,216,177, 99,219,140, 24, 49,194, 43, 40, 40, 72, 61,116,232, 80,254,240,225,195,249, 74,165,
-146,126,253,250,117,161, 94,175, 31,110,161,156,245,226, 36, 55, 55,183,126,170,144, 70,163,161,178,178,178, 62,114,191,249,166,
-212,140, 16,142,182, 36,182,205, 2,203, 44,184,172,240,115,107,138,211,226, 65, 76, 38,211,108,241, 36,173,224,188,151,149,149,
- 53,184, 95,191,126,247,102,204,152, 33, 47, 47, 47,135,189,189, 61, 2, 2, 2, 16, 28, 28, 12, 55, 55, 55,232,116, 58, 28, 63,
-126, 92,113,226,196,137,135, 82,169,116, 0,254, 28, 67, 43,186,209,121, 44,108,234, 38,107,182,102,153,133, 22,155,205,134,143,
-143,143,249,220, 22,182,230,124, 62, 39, 94, 46,103,157,128, 25, 52,112,104,251, 17, 49, 99, 28,143,159,188,193,220,182,253,196,
-195,168,104,236,118,109, 43, 59,229,218, 86,118, 42, 42, 26,187,183,109, 63,241,240,248,201, 27,204, 17, 49, 99, 28, 7, 13, 28,
-218, 62, 51, 35, 59,164, 97,222,195,166,202,201,102,179,123,245,237, 19, 85,115,229, 90,178,105,195,166,239, 41, 3, 7,140, 79,
-251,233,231,227,199,127,250,249,248,241,129, 3,198,167,109,216,244, 61,229,202,181,100, 83,223, 62, 81, 53,108, 54,187,151, 53,
-117,159,243,238, 20,199,152, 17,163,145,144,112,220,112,244,183, 31, 54, 29, 58,150,215,111,230,252,148,138,220,220,251,164,232,
-201,121,208, 41,197,200,202,202,146,214,137,172, 92,107, 56,103,207,154,210, 80,100, 93,117,245,236,187, 59, 43, 11,198,196,196,
-223,245,151, 46,165,169,174,222, 19, 73,239,102, 86, 86, 11,196,213,143,101,178, 42,173,201,100,132,209,104,164,174, 91, 87,239,
-176,219,100, 27,245,238,221, 31,151, 47, 30,196,190,189, 59,165, 38, 19,212, 19,143, 30, 53, 78,156,184,150,108,211,182,109,155,
-184,223, 14, 18,177,163,198, 56,146,128,105,228,184,209, 78,191, 30,250,149,104, 31,216,190,109, 64, 64,125, 72,155,127, 94, 95,
-122, 9,156,107,129, 26, 89,113,113,114,234,247,223,107, 60, 94,127,221,133,233,225,225, 0,163,145, 48,223,223,155,123,209,104,
-180,198, 22,152,102, 57,125,220,220,202, 78,157, 58,133,224,224, 96,248,248,248,160,161,143,172, 57, 32,183,171,171, 43,142, 29,
- 59, 6,242,217,224,212,205,114,118,109,215, 46,245,203,141, 27,181, 38,147, 9, 53, 53, 53,127,178,102,213,212,212,192,100, 50,
-225,204,233,211, 90,217,211, 76, 32, 86,213,125, 0,149, 90,251,198,107,175,109,136,137,137,209, 61,122,244, 8, 38,147, 9, 13,
- 45, 91, 34,145, 8,118,118,118, 80,107, 52,126, 0,184,214,112,138,206,157,227,193,194,125,189, 9,139,214,203,104,247,127,186,
-200,106,152, 80,250, 93,171, 44, 90, 6,131, 1,126,126,126,207,164,116,161, 80, 40,207,188, 90,185,226,112,127,102,102,230,249,
-161, 67,135,174,126,245,213, 87,231,172, 94,189,154, 26, 18, 18, 2,169, 84, 10,103,103,103,184,187,187, 35, 39, 39, 7,167, 78,
-157, 50, 86, 86, 86,238,116,181, 93, 44, 0, 0, 32, 0, 73, 68, 65, 84, 0,176, 30,214, 45,161, 79,202,203,203,139,237,212,169,
-211,161,229,203,151, 59, 14, 25, 50,132,238,231,231, 7,146, 36,145,150,150,134,248,248,120,221, 79, 63,253, 36,171, 19, 89,214,
- 58, 47, 95, 16, 8, 4,227,135, 15, 31, 30, 55,109,218, 52,123,163,209, 72, 47, 44, 44,132, 70,163,129, 94,175, 71, 73, 73,137,
- 46, 33, 33,161, 86,169, 84, 78, 1,112,193, 10,190, 84,137, 68,210, 49, 49, 49,113,218,245,235,215, 63,159, 49, 99,134,235,160,
- 65,131, 24, 6,131, 1,215,174, 93, 19,119,237,218,213, 93, 36, 18,233,142, 29, 59, 86,165, 86,171, 87, 26,141, 70,171, 82,240,
- 16, 4, 1,153, 76, 6, 55, 55, 55,104, 52, 26,152, 76, 38,104,181, 90,216,217,217,213,167, 77, 34, 73, 18,173,113,174,111,212,
- 7,168, 58,157, 14,147, 39, 79,134,201,100,194,150, 45, 91, 96, 48, 24, 90, 77,230,232,232,120,247,222,189,123,177, 93,186,116,
-169, 23, 47,230, 62,196, 98,177,224,230,230, 6, 87, 87, 87, 36, 36, 36,128, 78,167,223,181,228,239, 86,135,251,149,149,149, 93,
- 19, 19, 19,123, 61,124,248,240, 45, 0, 93,116, 58,157,143,209,104, 36, 40, 20,138,144, 36,201, 7, 50,153,236,103, 88,153,130,
- 71, 36, 18,125, 62,125,250,244,174, 7, 15, 30,180,163,209,254,115,105,208,104, 52,176, 88, 44,152,131, 99,146, 36, 9,173, 86,
-139, 85,171, 86,201, 20, 10,197,231,255,150,187, 68, 84,247, 30,216,245,195, 86,187, 75,151,207,139,179,242, 16,223, 68, 8,135,
- 39, 21,229,187, 34, 5,165,165,118, 81,221,123, 88,197,169,215,234,170,222,156,178,216,191, 46, 5,207,170,194,194,162,157,113,
-251,191, 41, 0,128,175,190,221, 18, 84, 81, 37,153,157,157,149, 61,113,231,206,223,122,233,181,186, 42,107, 56,255, 35, 94,226,
-164, 32,161, 6,112, 59,237, 97, 69,187,145,175,159, 91, 25,216,222, 97,148,168, 74, 85, 86, 91,171,124, 31, 64,129,181,117,239,
-211,187, 31, 46, 95,248, 21, 7,246,197,201, 72, 19, 85,237,230,230, 70, 2, 64, 86,150, 27,153,149, 37, 33,255,227, 87,236,164,
-160,147,247,215, 47,126,127,208, 98,169,172,250,219, 45, 63,180, 60,149,210,169,243,171,232,212,249, 85,204,127,255, 99,199,142,
-225,161,254, 0,112,244, 40,140,225,129,153,191,175,254,100,237,168,245,235,215, 66, 38,215,192,156,174, 39, 39, 61,243,116, 65,
- 1,180,182, 49,235, 89,172, 54, 24,110, 99,241,226, 32,101,117, 53,191,207, 71, 31,185,209, 62,252,144,210,146, 51,124,195,235,
-215, 26,206, 59, 15, 30,156,158, 61,115,102,217,154,213,171,135,238,216,185,147, 19, 25, 25,137,242,242,114,132,134,134,194,199,
-199, 7,137,137,137, 56,118,248,176, 66, 34,151,175, 4,240,163, 53,156,251,207,156,201, 9, 9, 15,175,220,185,115,167,119, 76,
- 76, 12,161, 80, 40, 32,149, 74, 33,149, 74,161,209,104, 80, 23, 16,154,204,205,203,203,210,235,245, 59,172,173,187, 81, 44,102,
-175,239,209,227, 9,195,100,250,114,252,184,113, 75,215,127,250, 41,171,125,251,246,132, 70,163,169,183,106,233,116, 58,216,217,
-217,233,180, 90,173, 43, 0,165, 53,156,172,159,126, 50,136,197, 98,240,249,252,250,112, 77, 13,227, 18,202,229,114,144, 36,105,
- 11,166,251, 28,104, 86, 33, 57, 59, 59,223,165,209,104,190, 13,173, 91, 77,229,206,107,184, 77,175,215, 63,169,172,172,140,106,
-164,120,155,243,135, 10, 0,240,197,192,129, 3,199, 47, 89,178,132,184,114,229, 10, 78,156, 56, 65, 22, 20, 20, 28,173,179, 98,
- 21,180,240,164,211, 28,167, 61,139,197, 90,200,227,241,162,205, 33, 28,184, 92,238, 67,133, 66,113,177,110,186, 80,254, 28,156,
- 14, 44, 22,107, 1,143,199, 27, 92,151,126, 5,246,246,246,247, 20, 10, 69,162, 70,163,217,138,230, 19, 85,183,196,201,113,116,
-116,252,220,205,205,237,205, 15, 63,252,208, 53, 37, 37, 69,120,249,242,101,134, 68, 34, 57,168,213,106, 91, 74, 42,253, 39, 78,
- 23, 23,151,187, 84, 42,213,247, 37,181, 17, 58,117,234,148, 48,114,228,200,152, 41, 83,166, 64,175,215,227,199, 31,127, 68, 98,
- 98,226,233,252,252,252, 88, 11, 79,163,141, 57,221,124,125,125,175,204,153, 51,167,205,228,201,147,185,206,206,206,160,209,104,
- 80, 40, 20,200,207,207, 71, 90, 90, 26,121,242,228,201,218,212,212,212, 39, 74,165,178, 63,128,202, 86,156,207,191,242,212,252,
- 12, 39,141, 70,235,231,231,231,247,219,154, 53,107,236, 7, 15, 30,204,113,117,117, 5,149, 74,133, 94,175,135, 80, 40, 68,122,
-122, 58,206,159, 63,175, 56,122,244,168,162,170,170,106, 50,128,228,255,143,114,190, 72,206,176, 32,124,210, 40, 81,116,179,209,
-222, 45,236,107,177,156, 3,251,121,141,158, 56,126,248, 48, 0, 56,114,236,236, 57, 43,146, 74, 55, 91, 78, 75,101,181,134, 51,
- 52,144,178, 38, 35, 51,253,153,128,150,225, 29, 35,114,195, 34,199,125,102, 13, 81,131,200,240,207,212,189,193,116,108, 67,155,
-238, 51,211,172, 97, 1,136, 29, 61,113,108,204,199, 43, 87,224,139,207, 55,224,228,145,227,167,179, 10,158, 73, 19,244,143,235,
- 75, 47,153,147,248,140, 70,123,149,235,229,245,218, 22,147,105,197,253,244,116,187,134, 15,108,102,203,115,195,135, 74,111,111,
-111,145, 80, 40,244,176,134, 51,246,187,239,116, 74, 30,143,181,226,203, 47,251,213,170,213,253,214,175, 95, 79,187,115,231, 14,
-126,248,254,123,131,250,201,147, 56, 49,176,160,153,217,144,102, 57,219, 44, 88,192, 94,246,195, 15,111, 7, 4, 6,186,191,245,
-214, 91,116, 58,157, 14,133, 66,129,210,210, 82, 92, 56,127, 94,155,153,149,149, 41,147,201, 70, 1, 16, 88,203, 25,251,221,119,
- 58,167,128, 0,112,249,124,242, 82, 82,146,227,236,133, 11,231,180,109,215,206,113,232,176, 97,116, 7, 7, 7,212,212,212,160,
-176,176, 16,199,143, 31, 23,213,214,214,122, 3, 48, 90,195, 25,119,253,122,167, 51,201,201, 19, 62,251,236, 51,102, 68, 68, 4,
- 28, 29, 29, 33,151,203,145,158,158,142,228,228,100,205,142, 29, 59,164, 82,169,116,142,209,104, 60,245, 18,219,253,223, 96,213,
- 50, 99,151, 69,161,245, 95,188, 0,163, 0,124, 82,247,249, 83, 88,206, 25,248,111,186,249,248,187,184,184,236, 82,171,213,164,
- 74,165,154, 13,160,228,111, 88, 78, 90, 84, 84,212, 15, 34,145,168, 23, 73,146,112,116,116,188,145,145,145, 49, 15,205,172,188,
-177,192, 73, 5,208,203,206,206,174,135,189,189,125, 63,141, 70, 19, 86, 55,253,150,165, 80, 40,146,117, 58,221,237, 58,235,147,
-241,255,185,238, 84, 0,131,189,189,189,103,154, 76,166, 64,130, 32,156,140, 70, 35,244,122,189,196,100, 50,229, 75,165,210,159,
- 0, 36,254, 13,202,249, 66, 56, 59,118,192, 88,146,130,176,230, 4,193, 51, 66,171,145,128, 32, 76,200,202,124,132,227,173, 40,
- 39,101,120,180,223,118,224,233,202, 68, 88,118,174,253,143,208,178, 66,188,180, 90,100,118,160, 78, 39, 9,242, 25, 78,130, 36,
- 74, 66, 59,141, 61,240, 87,132,150,181,232, 24,140,126, 32,209,203, 68,226,118,118, 62, 46,255,139,239,117, 47,140,243, 11,192,
-229,123,103,231, 27, 20, 26,205, 19, 0,165,206,250, 98, 50, 17,132,145, 36, 8, 67,195,233,173, 70, 15,150, 45,114,234,128, 72,
- 58,139,229,103, 52, 24, 60,202, 1,187, 51, 70, 99, 55, 53, 73,214,250, 2,159,220, 3,114,158,167,156, 58, 32,146,202, 98,249,
-159, 33,201,209, 98, 30,175,147, 72,165,226, 3, 32,237,120,188, 44,153, 66,177, 79,173, 86,111,199,159,103, 46, 44,114, 50, 88,
- 44, 95,163,193,224, 1, 0, 20, 26, 77,116, 72,163,241,123,226,224,240,150, 90,163,105, 99,103,103,167,215,106,181, 50,181, 90,
- 61,197, 96, 48, 92,106, 77,221,243, 13,134,142,215, 41,148,190, 58, 30,207, 85, 71, 16, 60,173,193,160,211,234,116,165,106,181,
-250, 33,128,111, 0, 60,122,201,237,110,195,115, 94, 44, 54, 78, 27,167,141,211,198,105,227,180,113,218, 56, 95, 62, 39, 23,128,
-127,221,195,226, 63,177,238,255, 38, 88,231,163,101,131, 13, 54,216, 96,131, 13, 54,252, 99,160, 68, 19, 62, 89, 54,252,255,130,
-104, 65,149,182,198, 36,248, 60,202,246,162,141,211,198,105,227,180,113,218, 56,109,156, 54,206,255, 57, 78, 75,220,255,196, 41,
-201,102,115, 29,190,108,216,204,191, 54, 78, 27,167,141,211,198,105,227,180,113,218, 56,255,103, 65,177,157,130,102,225, 81,247,
-122,209,251,218,240,239,238, 11,255, 13,248,212,189, 90,179,191,151,173, 25,109,176,193, 6, 27,254, 55,132,150,181,131,214, 95,
- 25,220,254,234,192,184,129, 32, 32, 32, 8, 8, 0,108,120,129,251, 90,130,183,155,155,219, 7, 29, 59,118,140,243,240,240,152,
- 15,192,189,149,199, 7,113,185,220,173, 60, 30,239, 10,143,199,187,194,229,114,183, 2, 8,122, 65,237, 70, 0,152,205, 98,177,
-146,188,188,188,202,152, 76,102, 18,128, 57,120,254,149,171, 33,120, 26, 39,237, 83, 0,157, 90,115,160,123,248,232,195,252,240,
-209, 15,248,225,163,211, 93, 35, 70, 6,241,195, 71,167,243,195, 71, 63,112, 15, 31,125,248, 37,244,215, 23,217,190, 47,170, 60,
- 37, 4,129, 18, 43,203,243, 13, 1,148, 18, 4,158,252, 77,202,111,131, 13, 54,216, 96, 67,179, 42,192,219,123,188,151,151,215,
- 69, 47, 47,175, 68,111,111,239,241, 86, 28, 18,221,196, 32, 97, 36, 8, 24, 45,220,244, 91,218,207,146,185,178,225,177,155,173,
-172, 90, 67, 78, 15,130,128,145,172, 3, 65,192,228,238,238,190,205,203,203,107, 67,227,151,187,187,251, 54,130,128,169,193,190,
-198, 6, 2,175,181,102, 85,143,169, 83,167, 30,169,169,169, 73,208,106,181, 9,121,121,121, 9,253,251,247, 63,212,200, 18,209,
- 44, 39,155,205,126,227,149, 30,189, 82,147,175,221,206,203,205, 47, 18,100,230, 60, 46,250,253,220,165, 59, 17,145,157,254, 96,
-179,217,111,180,162,141, 8, 0,179,105, 52, 90,146,157,157,221, 19, 26,141,150, 4, 96, 46,149, 74, 61,181,113,227,198,162,140,
-140,140,138,235,215,175, 75,146,147,147,203,102,204,152,145, 79, 16,196,239, 77, 8,246,104, 43, 44, 48,171,139,139,139,207, 9,
-133,194,243, 28, 14,231,115, 43,246,175,231,228,135,143,126, 32,146,234, 72,145, 84, 71,242,195, 71,147, 13, 62, 63,104,229, 57,
-183,212, 70,127,234, 11, 44, 22,203,223,130,160,127,153, 38,250, 63,149, 7,128,103,221,111, 81, 0,190,171,123,153,151,179,123,
-178, 89,172, 23,213, 63, 95,196,249,180,113,218, 56,109,156, 54,206,127, 43,186,214,189,123,225,169,191, 86,253,216,221,218, 85,
-135,239,229,229,229,217, 1, 64,112,112,240, 60, 0,199, 90, 35, 36, 8, 2,203, 76, 38,146, 2, 0, 20, 10,241,209,128, 1, 3,
-187,114, 56,156,103,162, 32,171, 84, 42,102, 82,210,229, 65, 38, 19, 73,212,237,183,140, 36,177, 21, 64,133,181,255,161,213,106,
- 40,116, 58, 19, 20, 10,177, 56, 34, 34,178,109,101,101,101, 10,133, 66,137, 43, 43, 43,171,105,181, 25,135, 32,176,123,247,238,
- 96, 47, 47,175, 63, 69,107, 22, 10,133,204,209,163, 71,181,138,111, 58,192,210,176, 88, 61, 24, 4,225,101, 52, 24,156, 0,128,
- 70,163,213,220, 97, 50,163,190,248,236, 51, 46, 65, 16,166,170,170, 42,168, 84, 42, 44, 90,180,136,147,153,153, 57,166,178,178,
-114,187, 5,218,224, 78,157,187, 46, 58,127,254, 92,152,172,186, 70,189,251,219,157,169, 42, 26, 67,217,174, 99, 40,227,135, 93,
-251,156,223,125,123,202,251,217,217, 25,247,208,116, 58,146,134,160, 0, 56,190,112,225,194,240,216,216, 88,166, 92, 46,103,171,
- 84,170,182,113,113,113,171,162,162,162,236,186,116,233,194,252,237,183,223, 8,169, 84, 10,146, 36,185,161,161,161,228,164, 73,
-147,212,135, 14, 29,154, 15, 96, 91, 11,194,119,217,211,115, 73,217, 18, 18, 18,178, 6, 0,242,242,242, 24, 13,206, 49, 61, 44,
- 44,140, 7, 0, 57, 57, 57,235, 72,210,180, 16, 0, 72, 18,155, 0,172,104,194,180,150, 23,222,103, 34, 64, 32, 48,227,218, 17,
-118,120,223,137,106,144,200, 39,128,188,186, 7,130,245, 64,131,184, 80,207, 34, 75, 32, 16, 60, 87,110,194,152,152, 88,130, 32,
-136,163,169,169,169,199, 68, 34, 81, 59,147,201, 56,171,165,114, 54,215, 86,124, 62,255,188,209,104,212, 84, 87, 87,215, 7,202,
-228,119, 26,219,203,213,158, 55, 72, 92, 35, 79,169,202, 60,153,108,101,223, 36, 92, 93, 93,167, 87, 86, 86,110, 0, 48, 51, 43,
- 43,171, 43, 0,132,133,133, 49, 0,220,117,112,112,232,173,211,106, 9,219,253,207, 6, 27,108,176,225,191, 34,180,210, 0,196,
-224, 63, 41,120,118, 61,143,208, 98, 2, 64, 74, 74, 10, 0,176,158,163, 32, 68, 67, 1,179, 96,193, 2,120,121,121, 53, 22, 47,
-184,114, 37,233,175, 84,246,153,255,248,244,211, 79,237, 36, 18, 73,244,207, 63,255,252, 26, 73,146,155, 5, 2,193, 45, 11,199,
- 87,144, 36, 54, 81, 40,196, 71, 4, 65,128,197, 98,231,206,153, 51, 39,173,238,183,182,191,255,254, 59,119,228,200,145, 74, 0,
- 69, 0,192, 98,177,125,168, 84, 74, 48, 73,146,230, 1,183, 89, 65, 56, 1, 8, 48, 48,153, 3,103,127,247,157,161,219,200,145,
- 52, 30,159, 79, 0, 64, 81,118,182,235,166,175,190,234, 93, 83, 80,192, 84,185,186, 86, 85, 41, 20,170,220,220, 92,176, 88, 44,
-130, 74,165,118,179, 84, 97, 30,143,247,193,103, 95,124,201,147, 85, 75, 84,106,153, 92, 75, 53,232, 53,246, 28,174,177,162, 92,
- 84,101,199,225, 41, 63,250,100, 45,243,189, 89,211, 62, 80, 40, 20,243, 44, 80,205, 95,188,120,113,216, 43,175,188,226,115,248,
-240, 97, 66, 42,149,130, 70,163,217,117,233,210, 5, 81, 81, 81,198,203,151, 47, 19,237,218,181, 67, 68, 68, 4,174, 93,187,134,
- 27, 55,110, 16, 93,187,118,229,198,199,199, 79,213,235,245,219, 44,137,107, 42,149,178, 40, 52, 52,180, 11,143,199,211, 6, 7,
- 7, 99,214,172, 89, 32, 73, 18,209,209,209, 17,118,118,118,199, 20, 10, 5, 51, 39, 39,251, 53, 75, 34, 91,148,113,114,146,217,
-178, 5, 32, 18, 36,242,197, 25, 39, 27, 78, 63,134,229,228,228,188, 90, 83, 83,131,167,237, 66,214, 39, 48,127,237,181,215, 90,
-211,151, 42, 72, 18,155, 70,142,140,253, 8, 32,136,232,232,104,201,252,249,243, 41,217,217,217,111,142, 29, 59, 38, 34, 47, 47,
- 31,173,124, 24, 8, 30, 50,100,200,181, 51,103,206,184, 6, 7, 7,139,171,171,171,235,127,240,116,117, 26,154, 28,191,229,131,
-207,183,198,133,238, 39, 9,137, 56,235,196, 67, 11,125,147,152, 62,253,237, 10, 59, 59,187,113, 71,143, 30,205, 17, 10,133, 52,
- 6,163, 94,187, 82,221,221,221,249,193,193,193,115, 93, 92, 92, 68, 84, 10,197,157, 4, 73, 90,234,159, 54,216, 96,131, 13, 54,
- 60, 55, 78,215,137,171,211,141,127,160, 1, 64, 66, 66, 66,125,100,218,216,216,216,102,159,128, 73,146,172,184,127,255,190,159,
- 82,169, 4, 73,146,214,220,176, 27, 46,209,172, 32, 8,202, 15, 20, 10, 49,143, 32, 8, 68, 68, 68, 62,222,178,101, 75, 83, 57,
-189,180, 17, 17,145,143,169, 84, 74,123,146, 36, 65, 16,148, 31, 73,210, 84,209, 12,103,147, 3, 17,147,201, 90, 6, 0,158,158,
- 94, 5,103,207,158,213, 78,152, 48, 1, 95,125,245, 21, 99,249,242,229, 75,105, 52,218,252,146,146,146,242, 22,202, 9, 0, 43,
-248,124,119,238,238,221,187,131,231,204,153,147, 38, 20, 10, 87, 0,128,151,151,215, 6, 0, 29, 1, 20, 53,216,134, 29, 59, 14,
-149,205,154, 53, 43, 87, 36, 18,173,104,142,115, 28,208,193, 47, 52,116,224,250,148, 20,146,162,209, 16,149, 87,175,202,196, 21,
- 21,250, 71, 98, 49,119,239,221,187,177,171, 54,108,160,251,249,251,227,202,169, 83,110,149, 74,165, 88,170,209,168, 43, 42, 42,
- 72,131,193,112,195,138,186,135,187,243,221,185, 59,191,249,241,142, 61,157,106,114,247,245, 33,232, 46, 46, 52, 10,215,129, 73,
-165, 81, 52,237,219, 6, 49, 1,132, 91,106, 35, 6,131, 49,117,200,144, 33,220, 67,135, 14, 17, 17, 17, 17,112,114,114,194,213,
-171, 87,113,239,222, 61,212,212,212, 80,244,122, 61,186,119,239,142, 47,191,252, 18,254,254,254,144, 72, 36, 40, 41, 41,113, 99,
- 50,153,124,189, 94,223,220,249,124,166, 63, 45, 91,182, 12, 94, 94, 94, 48, 24, 12,168,174,174,134,193, 96,128,157,157, 29, 0,
-224,201,147, 39, 56,117,234,164, 53,125,201, 34, 72,146, 68,207,158, 61,229, 4, 65,100, 53,182,104,181,134,211,199,199,231, 55,
-177,184,114,248,192,129, 3, 81, 83, 83,163, 95,187,118, 45, 58,117,234,132,224,224, 96,139,229,244,246,246,158,109, 48, 24, 86,
- 3,128, 78,167,219,203,102,179,223, 57,112,224,128,107,195, 20, 33,102, 75, 86,133,168,170,230,198,157,140,156,197,179, 39,244,
- 79,185,149, 94,170,163,143, 46,145, 62, 56, 41,109,162,156, 43, 24, 12,230,207,109,218,180,249,102,193,130, 5, 94, 46, 46, 46,
-208,104, 52,171,202,203,203, 49,119,238, 92, 0,192,136, 17, 35, 58,209,233,244,179, 51,102,204, 64,187,118,237,202,170,171,171,
- 75, 82, 83, 83,103, 41,149,202,244,231, 61,159, 86,194,198,105,227,180,113,218, 56,159, 27,214,106,145,191, 41,132,120, 54,156,
-195,174,103,132, 86,108,108, 44,145,144,144, 64, 90, 81,177, 42, 95, 95, 95, 63, 14,135, 3, 0, 85,173, 45,133,201,100,154,239,
-234,234, 42, 90,177, 98, 69,159,224,224, 96,237,252,249,243,211,139,138,138, 86, 54,220,167,109,219,182,159,127,255,253,247,200,
-205,205, 45,218,176, 97,195,181,170,170,170,214,230, 49, 91, 78,146,216, 82,103, 29,171, 60,117,234, 84,167,148,148,148,121,223,
-126,251, 45,255,189,247,222, 99,124,240,193, 7, 83, 0,124,101,137,132, 74,165, 42,155,154, 46,108, 10, 94, 94, 94, 90, 42,149,
-218,108,144,184, 88,128,195,102, 50, 7,172, 79, 73, 33,181, 69, 69,202, 95,190,254,218,126,231, 31,127,172,209,147,164,135,187,
-187, 59,250,246,238, 93,203,166, 82, 43, 69,229,229, 38,247, 14, 29,168,133,103,207,186,169,152, 76,193,161, 67,135,164, 85, 85,
- 85, 39, 44,154,240, 8, 66,102, 34, 73,173,157,175,191,126,194,152,193, 17,119,110,223,203,182,119,119,163,116,237, 18,209, 41,
- 59,183, 40, 21, 38,147,142, 32, 8,153, 37, 30, 71, 71,199,224,170,170, 42,200,100, 50,240,249,124,108,217,178, 5,158,158,158,
- 80, 42,149,200,200,200, 32,125,125,125,137,148,148, 20,248,250,250, 66, 44, 22, 67,171,213, 66, 46,151,139, 52, 26, 77,115,185,
- 25, 43, 40, 20,234, 30, 10,133,120,155, 32, 8,180,111, 31, 80,188,125,251,118,173,201,100, 66, 88, 88, 24,198,142, 29,139,248,
-248,120,100,100,100,152, 45, 79,218, 54,109,218, 22, 83, 40, 68,155, 58,173,244,220, 22, 24,115,106, 31,129, 64, 48,238, 57, 47,
- 26,138,183,183,247,148,192,192,192,121,111,188,241,134,158,201,100, 66,161, 80,152,207,133,126,248,240, 17,146,145, 35, 99, 29,
- 79,159, 62,221,108, 57,117, 58,221,234,178,178, 50, 47,149, 74,133, 97,195,134,125,176,121,243,102, 30,147,201, 4, 0, 24,141,
-198,103, 44, 89,159,125,187,255,252,194,213,219,147,206,255,246,165,247,103,203,223,233, 63,101,254,231, 73, 0,206, 53, 85, 48,
-173, 86, 91, 32,149, 74,103, 46, 94,188, 56,110,199,142, 29,206, 43, 87,174,132,201,100, 2, 73,146, 48, 24, 12,245,137,196, 77,
- 38, 19,142, 31, 63,142, 71,143, 30,125,222, 72,100,217, 96,131, 13, 54,252,237,208, 10, 45,242,119,132, 23,158, 78, 27,162,177,
-216,250,175, 71,134,167, 82,169, 59, 47, 92,184,208,229,181,215, 94,163, 13, 26, 52, 40,226,220,185,115, 17,101,101,101,233,117,
-214,131,136, 65,131, 6, 69,184,187,187, 99,235,214,173, 74, 42,149,186,243, 57,255,166,126,208, 43, 47, 47, 79, 3,176, 57, 62,
- 62,126,211,236,217,179,225,233,233,217, 81, 40, 20,254, 87,235,236,192, 98,117,157,177,101,139,129,174,215, 83,190,219,188,217,
-225,235,164,164, 77,135,143, 28,161,245,236,217,147, 32, 73, 18, 15, 31, 60,224,124,185,109, 27,119,242,152, 49, 69, 57, 5, 5,
-134,147,231,207,235, 43,202,202,170,203,196,226,213, 0,170, 45,241,235,245,250,155,121,121,121,222,125,251,245,244, 73,254, 35,
-253,222,132, 49, 35, 6,210,105, 20, 34,191,232,201, 93, 47, 79, 55,199, 43, 73, 23, 85,122,189,254,166, 37, 30,133, 66, 81,104,
- 48, 24, 92, 72,146,228, 95,185,114, 5,124, 62, 31, 53, 53, 53,208,235,245,208,106,181, 90,165, 82,201,174,170,170,130, 90,173,
-134, 70,163,129,131,131, 3, 30, 62,124, 88, 97, 48, 24, 46, 55,199,105, 52, 26,103,176, 88,172, 79,233,116, 58,147,193, 96, 8,
-238,222,189, 11,153, 76,214,214,201,201,233, 43,131,193, 0,129, 64,128,148,148,148, 15, 29, 28, 28,138, 0,128,205,102,131,201,
-100,185,106, 52, 26, 3,128,178,231, 61,231, 36, 73, 62,119,123,121,122,122,250,115, 56,156,245, 31,125,180, 44,172,115,231, 46,
- 16,139,197, 48,153, 76,224,241,120, 80, 42,149,112,112,112, 64,175, 94,189, 10,215,175, 95, 47, 36, 73,188,219,130, 24,164,214,
-181, 15,102,207,158,205,115,112,112, 64,105,105, 41, 66, 67, 67,235,133,150, 80, 92,245,240,250,157,244,236,197,115, 38,246, 59,
-120, 42, 41,235,252,149,187, 89, 99,134,245,238, 76, 16,100,219,150,202, 40, 18,137,196, 52, 26,109,254,236,217,179, 63, 13, 14,
- 14,110, 79,146, 36,130,130,130, 48,100,200, 16,156, 61,123, 22,185,185,185, 80, 40, 20,198, 91,183,110,253, 42, 20, 10,127,183,
-221,194,109,176,193, 6, 27, 94, 42,254,228,155,245,140, 69,235,191, 9,145, 72, 36,206,206,206, 62,151,154,154, 26, 59,105,210,
- 36, 92,185,114,101, 58,128,197, 0,192, 98,177,166, 79,154, 52, 9,169,169,169,200,206,206, 62, 39, 18,137,196, 47,226, 63,153,
- 76,166, 90,171,125,106,156, 98,179,217,236, 86, 30,222,182,110,202, 16, 0,218,182,176,173,121,211, 8,141,230, 21, 57,108, 24,
-173,230,222, 61,217,238,219,183, 63,141,139,139,163,245,233,211,135,208,235,116, 48,154, 76, 8, 8, 8, 32, 6, 69, 71,243,246,
-196,197,185, 24, 21,138,148,207, 62,250,232,234,174, 25, 51,106,243,234,252,192, 44, 65,163,209,108,155, 55,119,102,116,210,149,
-171, 62, 29, 67, 59,184,156,187,144,148,230,234,234,200, 13, 14, 12,228, 85,213, 84, 27, 87, 46,255,144,166,209,104,190,179,196,
-163, 82,169,142, 95,188,120,113,140,159,159, 31, 63, 61, 61, 29, 90,173, 22, 70,163, 17,131, 6, 13, 2, 73,146, 44, 0, 38, 26,
-141,134,236,236,108,232,116, 58, 81, 94, 94,158, 32, 63, 63,159, 5, 96,163,133,242, 21,107, 52, 26,100,101, 61,157,181,243,245,
-245, 29, 28, 19, 19, 3,131,193,128, 97,195,134,225,228,201,147,131,179,178,178,190,110,168,249,254,106,155,215, 89,200,194,188,
-189,189,227,235, 54, 89,229, 4,239,227,227, 19, 17, 16, 16,176, 99,227,198,141, 12, 95, 95, 95,144, 36, 9,103,103, 39, 40,149,
- 74, 84, 86, 86,161, 99,199,142,240,243,243,195,198,141, 27, 1,224,215,150, 44,110, 38,147, 9, 66,161, 16,133,133,133, 40, 40,
- 40,128,159,159, 31, 8,130,128, 92, 46,135,193,240, 52, 39, 55, 87, 46, 59,253,253,158,223, 7, 28,217,177, 58,188, 71,100,144,
-255,237,180, 76,209,212,113,131,185, 65,237,252,131,197,233,107, 41,192,218,102,147, 46, 11, 4,130,124,129, 64, 48, 73, 36, 18,
- 49, 36, 18, 73,212,224,193,131,183, 70, 71, 71, 35, 45, 45, 13, 87,175, 94,157,204, 98,177, 68, 58,157,206,224,233,233,249, 46,
- 65, 16, 14, 58,157,238, 96, 85, 85,149,208,118, 63,180,193, 6, 27,108,120,225, 48,251,104,161,193,123,235, 44, 90, 97, 97, 97,
-188,162,162,162,183,218,182,109,203, 4, 0, 14,135,211, 49, 32, 32, 96,105, 65, 65,129,188,181,165, 81, 42,149,135,227,226,226,
-134,124,243,205, 55,140, 17, 35, 70,116,136,143,143,127, 5, 0, 70,140, 24,209,193,222,222, 30,113,113,113, 58,165, 82,249,194,
- 98, 34,233,245,250,215,186,119,239,142,234,234,106, 20, 21, 21,181,106, 10,229,247,223,127,231,226,169, 95, 86,139,219, 90,130,
- 65,171,117,118,242,241,161,148, 37, 37,233,170,101, 50,175,215,250,245, 35,244, 58, 29, 40, 20, 10,170,170,170, 80, 82, 82, 2,
- 71, 39, 39, 34, 59, 47,207,238,167,101,203,126,111,219,185, 51,211,168,213,186,182,162,152,138, 74, 81,197,219,239,207,127,239,
-248,193,131,191,242, 37, 50,217, 35, 14,135,171, 97,177, 24,158, 11,222,127,223, 88, 93, 93, 61, 13, 64,173, 21, 60, 27, 15, 30,
- 60, 56,108,216,176, 97, 15,252,253,253,221,197, 98,177,167, 68, 34, 49, 86, 87, 87, 83,241,212,215,138, 0,128,164,164, 36,200,
-100, 50,131,209,104, 76,193,211, 88, 88, 90,107, 11,218,166, 77, 27,199,168,168,168,254,124, 62, 31, 82,169, 20,174,174,174,232,
-210,165, 75,127, 42,149,250,115,113,113,177,244, 69,246,250,196,196, 68,123,146, 36, 95, 37, 73, 18,195,134, 13,179,234, 24,163,
-209,248, 78, 76, 76, 12,131, 32, 8,168, 84, 74,176,217, 28,240,120,118,176,183,119, 64,112,112, 8, 4, 2, 1,134, 14, 29,170,
-125,244,232,209, 15, 66,161,240,176, 5, 46, 8, 4, 2,136,197, 98,148,148,148,160,178,178, 18, 0, 80, 89, 89, 89,239,156,255,
- 34, 32,149, 74, 71,247,234,213,107,201,220,185,115, 97, 48, 24, 48,122,244,104,148,150,150,126, 93, 88, 88,120,200,219,219,123,
-202, 59,239,188,195,119,117,117,197,146, 37, 75, 56, 0,214,217,238,135, 54,216, 96,131, 13, 47, 28,141,125,180,254,108,209,106,
-105, 78,212,211,211,179, 47, 65, 16,171, 84, 42, 21,211, 60, 37, 67, 16, 4,147,207,231,159, 84,169, 84, 27,132, 66, 97,171,156,
-226, 36, 18,137,236,241,227,199, 39,111,222,188, 57,113,220,184,113, 72, 76, 76,156, 6, 0,227,198,141,195,205,155, 55,241,248,
-241,227,147, 18,137, 68,246, 34,106,238,227,227, 51,188, 95,191,126,227,186,119,239,142,132,132, 4, 24,141,198, 27,173, 57,190,
-225, 10, 67, 52,177,234,208,188,205, 42, 50, 42, 21, 4, 65,212, 91, 51, 42,197, 98,228,230,228,160,186,166, 6, 26,181, 26, 10,
-165,210, 24,220,174,157, 74,170,213,210, 9,160,181,115, 95,197,169,119,110,149, 40, 21, 10,119, 87,103, 23, 21,151,203,130, 68,
- 38,101,220,189,115,171, 22,192, 35, 43, 57,180, 36, 73,246, 59,123,246,236,106, 42,149, 58,201,206,206, 14,243,230,205,163,246,
-239,223, 31, 12, 6, 3, 26,141, 6, 18,137, 4,113,113,113, 98,163,209,216,190,238, 24, 59, 46,151,187,143, 74,165, 62,145,203,
-229,171, 44,254,129, 86, 59, 34, 54, 54,150,166,213,106,241,217,103,159, 97,205,154, 53, 24, 54,108, 24,237,206,157, 59, 35, 0,
- 28,124, 81, 61,222,100, 50, 97,240,224,193, 13,157,225,179,172, 57,142, 78,167, 71, 4, 6, 6, 66, 44, 22, 67, 44, 22,131,207,
-231,195,219,219, 27,158,158,158,248,250,235,175,201,173, 91,183,158,211,233,116, 63, 84, 86, 86, 86, 88, 83,134,130,130,130,122,
-203,160, 90,173,134, 66,161, 64,105,105,105,253,212,161,138,231, 48,108,254,219, 35, 59, 43, 84, 42,229,237,135,121, 37,171, 62,
-152,210, 83,161, 82, 41,243, 10, 75,114,129,109, 38, 43,250,247,187,211,166, 77,123,119,226,196,137,168,173,173,197,205,155, 55,
-209,187,119,111,108,218,180,201, 43, 37, 37,101,113,247,238,221, 65,167,211,113,229,202, 21, 24, 12,134, 82,219,189,208, 6, 27,
-108,248, 59,227, 31,234,159,213, 34, 90,180,104,249,249,249, 57, 25,141,198, 15, 99, 98, 98, 6,143, 25, 51, 6, 67,135, 14,125,
-230,247,131, 7, 15,218, 31, 59,118,108,195,182,109,219,134,233,116,186,141,173,153,234, 51,153, 76,199, 15, 30, 60, 56,162,103,
-207,158,220, 1, 3, 6, 4, 0, 0,139,197,210, 30, 60,120, 80,105, 50,153,142, 63, 71, 93,204,129, 24, 43, 0,192,219,219,187,
- 19,141, 70, 27, 55,124,248,240, 78,111,191,253, 54, 50, 50, 50, 16, 23, 23,151, 31, 28, 28,124,173,162,162, 85,254,213, 69, 22,
- 86, 29,110,176,100,221,162, 50,153, 85,146,242,114, 39, 59,127,127,186,179,189,189, 48, 33, 33,193, 47, 58, 58,154, 40, 45, 45,
- 69, 77, 77, 13,212,106, 53,238,220,185, 99,162, 1,197, 52,103,103,162,248,230, 77,130,202,100, 86,225,217,149,124, 22,225,231,
-229, 28,244,201,242, 57,109,213, 26,117,184, 84, 42, 53,208,232,116,186,175,167, 83,105,206,163, 86,205,196,105,184, 92,110, 20,
- 0,154,201,100, 82,186,184,184,112, 47, 92,184, 0, 38,147, 9,130, 32, 16, 25, 25, 9, 54,155,205, 32, 73,178, 4, 0,236,237,
-237,153, 59,119,238,116,156, 50,101,202, 85, 75,196, 93,187,118,165,179, 88,172, 81,193,193,193,184,121,243, 38,210,211,211,139,
-111,222,188,217,166,107,215,174,240,247,247, 31,229,229,229,117, 36, 45, 45, 77,255, 34, 58,246,211, 21,171,173,119,134, 55, 26,
-141, 38,130, 32, 64,161, 80, 96, 50,153, 32, 22,139,209,190,125,123,108,223,190, 29, 91,182,108,249, 76, 40, 20,158,106, 5,151,
- 81, 38,147,129,199,227, 33, 61, 61, 93, 19, 19, 19,195,162, 80, 40,200,207,207,175, 23, 90,238,110, 46, 29,123,119,143, 8,253,
-236,219,253,231,121, 44, 22,107,104,255,168,176,204,188,226, 39, 36, 73, 88,156, 54, 14, 11, 11, 99,180,111,223,126,218,196,137,
- 19, 81, 80, 80,128, 13, 27, 54, 84, 10,133,194,164,243,231,207,143,159, 59,119, 46,181,119,239,222,168,170,170,194,158, 61,123,
- 12,119,239,222,253,165,188,188,124,191,237, 54,110,131, 13, 54,216,240, 55, 17, 90,126,126,126, 19, 25, 12,198,146,215, 95,127,
-157, 26, 18, 18,130,138,138, 10, 56, 56, 56,232, 9,130,160, 3,128,147,147,147,158,195,225, 96,206,156, 57,232,220,185,115,223,
-101,203,150,245,166,209,104,219, 5, 2,193, 62,107,254, 88, 36, 18, 41, 41, 20,202,209,121,243,230,109,188,119, 47,173, 61, 0,
-252,241,199, 31,143, 5, 2,193,114,145, 72,164,108,101, 61,204, 65, 49, 9, 22,139,125, 59, 40, 40,168, 48, 42, 42,202, 97,204,
-152, 49,224,243,249, 72, 77, 77,197,151, 95,126,153,167,213,106, 87, 39, 39, 39, 27,254,219, 39,217,160,209,148,223, 61,113,194,
-190,255,155,111, 58, 44,136,137,217,252,222,188,121,223,124,242,201, 39,180,144,144, 16, 66,169, 84,226,246,237,219,228,177, 99,
-199,244,123, 62,253,116, 11,120, 60,250,205, 99,199,152, 90,173,182,184,149,150,187,126,125, 94,235, 27,178,249,155,109, 80,171,
-106,113,251,198,105,212,212,136,177,115, 87,124,136,143, 15,217,175,172,172, 44,217, 90, 46,130, 32,130, 19, 19, 19,221, 73,146,
- 4,147,201,196,250,245,235,225,237,237, 13, 7, 7, 7,200,229,114, 44, 94,188,216,113,225,194,133,142, 0,144,145,145, 81, 31,
-158,193, 18, 4, 2, 65,175, 57,115,230,216, 27, 12, 6,156, 59,119, 78, 75, 16,196,170,139, 23, 47,254, 28, 25, 25,201,236,219,
-183,175,253,254,253,251,123, 3,184,242,162,132,214,115, 30,151,127,225,194,133,238,147, 38, 77, 34,233,116, 58, 33,145, 72,224,
-228,228,132,237,219,183, 43,132, 66,225,233, 86,114,173, 95,190,124,249,234,186,207,123, 87,173, 90, 53,115,227,198,141,252,242,
-242,242,122,171,166,168,178,250,114,175,152,247,141, 85, 18,169,246,151,111,151, 77,224,176, 89,204, 85, 27,127,185,162,167,226,
-150,197,126,101, 48, 48,185, 92, 46,147, 36, 73, 28, 61,122, 20,197,197,197,239, 84, 85, 85,149, 27,141,198,248, 15, 63,252,112,
-105, 72, 72, 72,187,156,156,156, 98,185, 92,190, 73, 36, 18, 21,218,110,119, 54,216, 96,131, 13, 47, 13,102, 39,120,243,234,195,
-211,120, 58,157,216,188,208, 50, 26,141,115,206,159, 63, 79, 53,153, 76,216,181,107, 23,238,222,189, 75,114,185,220, 85, 92, 46,
-247,123, 14,135, 99, 84,169, 84,179,103,205,154, 53,101,205,154, 53,148,190,125,251,226,230,205,155,148,246,237,219, 79, 3,208,
- 80,104, 69,163,133, 88, 27, 82,169,244, 78, 69, 69,121,251, 6, 1, 42,219,179, 88,236, 59, 22, 42,211,152,179,113, 80,204, 30,
-235,215,175, 87,120,121,121,105,211,211,211,177, 99,199, 14,211,221,187,119,147,152, 76,230, 78,161, 80,168,177,146,243, 69,160,
-158,147,105, 48,164, 30, 88,186, 52,172,219,232,209,166,153, 75,150,212, 50, 56,156, 15, 54,111,219,182, 76, 34,151,123,131, 32,
- 72, 87, 71,199,226, 93,235,215,111, 24, 54,106, 84,109, 70,114, 50,251, 94, 98, 34,157,175,215,223,111, 77, 57,203,202,202,146,
-175, 92,185,138,189,187,191,129, 78,167,129,176,236,169, 78,171,172,146,194,130,200,250, 19,167,193, 96,144,142, 31, 63,158, 1,
-128, 51,117,234, 84,166, 72, 36, 66,135, 14, 29, 0, 0, 50,153, 12,167, 79,159, 70,104,104, 40, 0,224,225,195,135,245,159, 45,
-149,147,199,227,141,234,221,187, 55,138,139,139,145,145,145,113, 73, 40, 20, 86, 1,184, 84, 90, 90, 58,162,123,247,238, 56,126,
-252,248,200, 22,132, 86,171,218,200, 74,161,245, 39, 78, 14,135,179, 60, 62, 62,254,157, 27, 55,110, 76, 90,186,116, 41,125,208,
-160, 65, 0, 0,185, 92,174, 4, 96,108, 13,167, 74,165,218, 9,160,126,229,108, 81, 81,209,129, 37, 75,150,164, 44, 90,180,136,
-111, 46,159, 56,243,212, 77, 49,112, 51,188,255, 59,159,244,234, 30, 30,242,249,214,184,243, 37,165, 21,113,210,172,147, 82,107,
-234, 78,146, 36,244,122, 61, 76, 38, 19, 92, 92, 92, 20, 85, 85, 85, 16,137, 68,133, 34,145,104,222,163, 71,143, 90, 85,247, 23,
-217,231,109,156, 54, 78, 27,167,141,243,127, 20,214, 71,134, 39, 73,210, 96, 50,153,112,229,202, 21,196,199,199, 27,117, 58,221,
-187, 66,161,176, 97,180,234,109,169,169,169,137,227,199,143,223,151,147,147, 67,205,204,204, 4, 73,146,198,214,148, 70,173, 86,
-235, 9,226,207,219,254,106, 45,247,238,221,139,242,242,114, 93,105,105,233, 69,131,193,112,252, 47,174, 94,252,203,171, 14,247,
- 2,154, 55,180,218,139,107,250,244, 25,188, 58, 49,145, 53,243,227,143, 53,211,223,126,251, 67,163, 86,171,167, 50, 24, 38, 38,
-143, 71, 49,178, 88,244,140,228,100,246,214,185,115, 93, 84, 26,205,185,184, 86, 56,152,155, 45, 90,253,251,247,197,244,153,139,
-160,106, 96,209,186,121, 39, 23, 26, 29, 90,101,209,210,104, 52,225, 66,161, 16,108, 54,187, 4,128,231, 91,111,189, 5,147,201,
- 4,149, 74, 5,185, 92, 14,129, 64, 32,125,251,237,183,141,117,226,137, 54,110,220, 56, 7,107,120, 3, 2, 2,188,233,116, 58,
-206,157, 59, 7, 58,157,126, 26, 0,232,116,250,233,196,196,196, 17,147, 39, 79,134,143,143, 79, 64, 65, 65, 1, 1, 11,254,105,
-238,225,163, 15,147, 64, 16, 8, 4, 62, 53,193, 33,144, 31, 62,250, 1, 1,228,213, 69,141,207,234,218,181, 43, 96,165, 95, 86,
- 67,212, 45,238,216,162,215,235,143, 44, 91,182,108, 94,143, 30, 61,134,172, 89,179,134, 64, 93,168,134,191,136,220,178,178,178,
-215, 86,172, 88,113,158, 36,201,103, 68,191,168,178,250,114,207,216,249,164, 68, 34,189, 39,206, 58,245,176, 85, 22, 83,131,225,
- 47,133,179,176,193, 6, 27,108,176,225,133, 89,181,254,132,102,133, 22, 65, 16,187,250,245,235,247, 46, 0, 42, 65, 16, 59, 4,
- 2,193,159,110,254, 66,161, 48,215,219,219,251,171,118,237,218,205, 6, 64, 18, 4,177,171,149,133,170, 32, 73,124, 73,161, 16,
-203,158,138,187,231, 10, 80,105, 78, 75,178, 12, 0, 65,161, 80,247,165,165,165,125, 92, 82, 82, 34,182,210, 2,209, 34, 94,196,
-170, 67, 0,248, 21, 40,124,189,184,248,252,146,136,136,232, 97,115,231,162,211,176, 97, 14,222,109,218, 24, 85, 58,157,233,225,
-181,107,196,141,163, 71, 25,247, 18, 19,233, 42,141,230,220,113,160,164,181,229, 44, 43, 43, 75,190,156,148,124, 97,194,184, 17,
- 67, 2,218,121, 63, 21, 13,133, 2, 84, 86, 75, 47,180, 70,100, 53, 18,189,163,183,111,223,126,138,193, 96,208, 26,166,178,209,
-233,116,213, 26,141, 38, 28, 0,106,106,106,188,119,237,218,245, 27,133, 66, 41,182,196,151,153,153,121,114,245,234,213,227,138,
-138,138, 46,148,150,150, 22, 1, 64, 73, 73, 73,145, 94,175,223, 39, 20, 10,199, 21, 23, 23, 31,131, 21,139, 0, 72, 32, 40,227,
-218,145, 72, 0, 8,239, 51, 17, 25,215,142,176, 1, 68,134,247,153, 8, 0,120,222, 92,134, 13, 81, 23, 6, 97,213,205,155, 55,
- 15, 14, 25, 50,100, 22,254, 66, 76,175,198, 98, 75,167,211,181,105,188,209,108,217,106, 13,145, 86,171,213,171, 84, 42,131,209,
-104,164,233,116, 58, 82,171,213,234,109,247, 57, 27,108,176,225,223, 10,146, 36,187, 3,224,155,111,155,117,239,252, 70,159,181,
-168, 75, 23,104,190, 85,214,125, 23, 19, 4,113,167, 1, 71,253,118, 43,142, 5,128, 74, 0, 15, 8,130,104,206, 8,178,171,185,
-239,205, 10, 45,129, 64,112, 12, 86, 36,141,182,118,191, 22,176,162, 46, 11,222,235,141, 0, 0, 32, 0, 73, 68, 65, 84, 79, 28,
-240,252,121,216,234, 57,140, 70, 99, 69, 73, 73,201, 95,110, 80, 10,133, 82, 56,114,228,200, 86,237,111,105,159, 67, 64,241,251,
- 26,205,254,132,239,190,235,114,110,199, 14, 31,163,193,224, 74, 0, 36,149,201,172,210,106,181, 69,124,189,254,126,107, 45, 89,
-207, 88, 99, 30,151, 13, 45,120, 92,134,192,192, 64, 50, 63, 63,255,169,173,231,175,225,190, 66,161,240,179,212, 5,148, 74,101,
- 95, 43,197,224,175,101,101,101,191, 54, 33,216,127, 19, 10,133,191, 89, 91,168,250,164,210, 0,197, 68,152, 38,132,247,153,120,
- 20,128,201,156, 84,250, 69,162,188,188, 60, 7,117,113,222,254,110, 40, 46, 46,214, 16, 4,113,224,203, 47,191,156,122,239,222,
-189, 67, 2,129, 64, 99,187, 21,219, 96,131, 13,255,102,145, 69, 16, 68, 66,221,247,216, 58,163, 80, 66,227,207,230,125,204,251,
- 53,220,199,204,209,120,123, 75,199, 2,192,242,229,203, 63,222,176, 97, 3, 23,128,181,201,152,159, 59,169,244,203, 66,197,223,
-132,163,161, 40,216,253, 50, 42,250, 29,160,133,193,112, 11,134, 6, 62,249,250, 23,107,136,200,207,207, 39,254,205, 23,156, 57,
-169,116, 3, 68,252,175,222,124,138,138,138,182,251,251,251,239, 20, 8, 4, 6,216, 96,131, 13, 54,252,123,193,111, 74, 24, 53,
- 35,202, 98, 91,250,253,153, 7,247, 38,246,107,234, 59, 65, 16, 9, 27, 54,108,136,109, 69,121,235, 45, 90, 20, 91,219,217, 96,
-195, 63, 27,255, 31, 43,105,109,176,193, 6, 27,254, 13,104,108,197, 50,139,175,198,223,151, 47, 95,254, 49, 90,158,113,242,194,
- 83, 43,150, 87,221,247,122,127, 45, 2, 79, 87, 14, 52,133,214,172, 38,136,126,142,250, 93,180,113,218, 56,109,156, 54, 78, 27,
-167,141,211,198,249, 63,199,105,137,251, 98, 19,130, 40,166,185,169,190,150,166, 17, 27,127,182,116,172,165,125, 9,130,104, 46,
-204,143,121,170,176,241,251, 75, 71,180,141,211,198,105,227,180,113,218, 56,109,156, 54, 78, 27,231, 95, 1, 73,146,221, 73,146,
-140,193,211, 5, 83, 36, 73,146, 49, 36, 73, 14, 91,190,124,249, 10,243,182,229,203,151,175, 32, 73,114,144,121,191,186,125,234,
-143, 49,111,107,252,222,120, 91, 75,251,182, 80,196,119, 27,125,174,255,254,119,241,209,178,193, 6, 27,108,176,193, 6, 27,108,
-104, 18,230, 21,131, 13,172, 77, 98, 0, 15, 55,108,216, 80,211,192,119, 74, 12,224, 62,128,206,117,251,137,235, 68, 90, 67,223,
- 42,109,221,119,109, 19,251,104,173,217,183, 25,236,106,230,179, 77,104, 53,135,206,158,148, 79,253,125,221,163,234, 26, 0,100,
- 93, 18, 96, 83, 93,188, 34,210, 28,184,200,100, 2, 73,146, 16,136, 36,169, 15, 69,248,228,121,255, 47,216, 27, 46,238,108,246,
- 22, 19, 73,246,169,219,148, 44,173,210, 44,202,144, 65, 98, 45, 71,168, 7,194,216, 20,124,104, 34,209, 9, 0, 40, 4, 30,168,
- 77,248, 42,187,162,245,241,164,154,234,231,225,124,188,203,228,112, 95,119,116,114, 14,172,169,169,204,211,169, 53, 71, 50,197,
-216,137,214,231,101, 68,128, 51, 94, 53,145,248, 24, 0,133, 78,193,215,121,213, 86,175,228,176,193, 6, 27,108,248,171,214,145,
-191, 20, 23,143, 32, 8, 99, 19,156,196, 95,228,180, 5,195,179, 66,108, 53,177,249,143, 38,182,221,249, 59,149,187, 85, 66,171,
- 35, 31,115, 65, 96, 45, 0, 18, 36,214,101,138,241, 99,171,142,247, 66, 52,155, 74,253, 9, 0, 85,173, 51, 46, 33, 77, 72,105,
-242,100, 82,240, 26,155, 65,253, 26,128, 73,109, 52,206,200, 20, 90,239, 47, 22,238,131, 97, 52, 19,229,128,137, 36,233, 70, 19,
-185, 15, 36, 18,236, 24,184,126,171, 12,234,214,148,213,223,215, 61,234,196, 31,194, 33, 73, 63, 46, 64,143, 78, 29, 64, 26,255,
-143,189,243, 14,143,162,106,184,248,153,153,173,217,244,178,233,133,158, 70,104, 2,161, 55, 65, 90,248, 40,130, 52, 1,225,165,
-136, 40, 34,138, 10, 10, 8, 74, 81,105, 74, 7,149, 38, 29, 41, 1, 41, 81,122,137,244, 84, 2, 9,164,247,158,108,182, 77,185,
-223, 31, 41, 38,144,182, 1,245,149,119,126,207, 51,207,108, 61, 59, 51,119,118,230,204,185,101, 56, 64, 96,161,234,254, 17,126,
- 91, 51, 1,129,126,158, 32, 2, 11, 8, 28, 44, 6,126,139,129, 1,214, 36, 44,179, 97,247,193,246,118,133,157,151,131, 99,248,
-182,109,219,157, 93,155,250, 83, 2,103,196,131, 63,206,142,127,127,222,194, 62, 45, 81, 16, 80, 31,179,213,218, 5,255,241,108,
-228,243,209,156,197,171, 25, 23, 87, 15,115,129,213,115,233, 79,162,218,125,247,245,194,195, 50, 58, 97,213,253, 52,108,175,239,
-190,236,175,198,116,137, 66, 62,202, 76,105,222,188,164,164,232, 17,111,100, 15,210, 82,201,128,111,190, 93,219,182, 87,191, 65,
- 22,124, 81, 58,205, 10,240, 63,176,127,159,215,247, 27, 54, 14, 10, 79,227,255, 15,128, 96,202, 58, 11, 4,243, 98,118, 77, 27,
- 36,149, 48,148,223,228,109, 12,192, 53,200,104,249, 57, 98, 44, 69, 80,231,240, 18,132,194,229,168, 76,236,109,200,111,248, 58,
-226, 7,138,192, 27, 20, 14, 81, 4,251, 34,179,144, 41, 30,242, 68, 68, 94, 46,104,154, 62, 47, 8, 66,239, 23,108, 12, 58, 17,
- 66,110,136, 91,247,127, 27,211, 18, 45, 10, 95, 70,196, 38,217,130, 55,162,165,119,211,165,128,105, 70, 75,201, 48, 59,111, 62,
-204,112, 6,103,196,182,175,102,238, 55,176, 0,199, 26,193,115, 44,120,142, 5,199, 25,193,179, 44, 8,171,199,194, 31,207, 3,
-134, 34,180, 15,104,177, 19,224, 93,234,251, 27, 82, 66,239,190,125,229,172, 29,101, 40,192,222, 77,203,223, 77,202, 42,126, 55,
-228,126,106,182,191,163,246,211,200, 76,252,100,138, 33, 56,191,121, 54,246,252,114, 50,121,221, 15,154,104,129, 16,216, 89,153,
-249,140, 15,138,240,216,117,236,124,210,218,157,186,104, 0,176, 54,151,251, 76,188,255,208,243,121, 10,193, 81,169, 92,187,101,
-227,247,206, 46,246,102, 20,119,109, 5, 56,158,135,135,215, 96,230,211, 89,227, 93,190, 92,179,125, 13, 10,245,147,106,251,190,
-143, 35,252, 27, 53,246,155,187,243,228, 53, 79, 77, 97,166,225,236,207,243, 99,161, 7,235,236,230, 39, 93,186,124, 53,179,224,
-227,217, 31, 24,248,228,208, 7,153,136,172,235, 88,227,231,136, 99,203, 87,124,219,186,207,192, 32, 11,161, 56,139,209,105,138,
-189,183,253,184,125,177,111,235,142,170,238, 1,238,178,204,131, 51, 40,109, 81, 46,140,180, 82,209,167,101, 95, 43,237,155, 99,
-216,109, 59,246,204,138,204,196,119,166,172, 51, 79,254,220,247, 4,161,225,163,174, 83, 4,221,239,222, 56, 63,157, 79,189, 9,
-194,179, 0,111,172,152,131,103, 65,132,210,121,224,140, 31, 1, 52,204,104,209, 4,175,133, 92,185,233,146,145,158,214, 97,205,
-183,203, 62, 37, 55,111,254, 10, 30,187,163,114,113,209, 84,131, 9,192,187,137, 61,115,134,229,161, 79,202,231,189,203, 95,236,
-227,173,232,226, 98, 65,189,154, 88, 64, 93,186, 28,171,189, 40, 30,154, 68, 68,254,145,196,132, 35,132, 72, 94,176,230, 32, 66,
-200,169,231,148,249, 8,192,127,202, 30,111, 7,240,205, 11, 88, 52,119, 0,206,101,143,211, 1, 36,139,123,192,115,241,116,227,
-247, 6,143,163,165, 4, 17,128, 67,195, 0,192,204,212,165, 32,128, 18, 20, 3,176, 26, 12, 29,216, 15, 14,142,206, 0, 91, 2,
- 24, 75, 0, 86, 11,176, 26,128,213, 34, 59, 45, 1, 48,106,128,184, 95,193, 17,162, 48,121,117,245, 5, 64,204, 65,188,218,206,
- 19,106,107, 37,102, 15,245,119,216,122, 58,102,251,246,179, 15,250, 70,102, 98,116,189,150,149, 16, 4,182,106,142,117,219, 53,
-209, 39,238,100,245, 7,128, 65,109,236, 79, 7,250,123,121,172,221,169,139, 62, 21,150, 55, 0, 0, 6,180,180,250,181,163,143,
-139,167,128,134,167,190, 2, 33,221, 93, 27, 53,167,248,187, 91, 32, 20, 38,163,176, 80,139,228, 39,187, 96,235,246, 10,205, 11,
-232, 89,215,247,205, 24,124,242,222,130,149,210,146,194, 12,131, 96,204,226,213, 76, 30, 35,145, 11, 20, 82, 46,234,139,133,124,
-126,206,180, 9,220,220,207,191,250, 4,192,248,218,116,252, 29, 49,107,213,170,181,173,186,182,247,117, 76, 63, 60,155, 42,206,
-203, 0,199,168, 20, 67, 59,119,133, 77, 11,127, 33,227,194, 42, 74,222,180, 47,108,236,155, 34,229,218,207,136,191,113,132,234,
-214,110,132,226,167,189,178, 55, 1, 99,181, 70,171,185, 3,186,245,239,209,113,127, 83, 79, 87, 23, 66, 4, 8, 2, 1, 17,120,
- 20,235, 88,124,122, 32, 14, 60,207,227,245,254,221, 94, 53,151, 83, 68, 16, 4, 16, 34, 32, 41, 61,167,228,247,208,232, 87,227,
-242, 16, 90,159,164,170, 77,167,222,221,238,223,190,225,203,198,156, 64,251,241,203,163, 41,224, 74,165,125,174,219,157, 51, 63,
-249, 2, 63, 54,220,203, 81,224,227, 79,175,128,103,143,105,204,150,189,167,213, 5, 89, 41, 19, 15,239,218, 56,114,211,150, 45,
-123,162, 51, 49,195, 20,147,245,126, 15,249,149, 53,191, 23,218,119,110,106,158,149, 84, 41,167,108, 98, 75,247,223,124, 42,242,
-189,235, 75, 2,125, 23,156, 36,249,151, 98,117, 97,226,113, 75, 68,228,239,133, 16,242,194,205, 86, 66, 66, 66,234,243,152, 45,
- 55, 55,183, 30, 41, 41, 41, 95,151,183, 86,161, 40,234,235, 70,141, 26, 45,252,243, 66,181,202,181, 94, 1,207,243,227, 83, 82,
- 82, 46,213,166, 57,120,240, 96,215,147, 39, 79, 54,174,164,217, 24, 64,227,234, 62,107, 99, 99,195,119,233,210, 37,254,228,201,
-147,169,226, 30,210, 32,195,101,178,209,138, 78, 60, 56,187,157, 62,173, 24, 0,162,235,241,249, 42, 85,126, 58,150, 95,177, 99,
-241,132, 21, 45, 27,217,161, 72, 99,192,217, 91,241,224,121, 22, 60,199,149, 37, 91, 28,120,142, 69,255, 54, 14,232,162,155,129,
-239,130, 31,128,227,133,229,181,105, 62,141,145, 8, 99,219,246,125,227,128, 32, 16,185, 66, 74, 23,120,123,216, 59,206,125,189,
- 13, 61,123,104, 75,104,141,220, 27, 63, 95,136,253, 61, 42, 19,219,234,165, 41, 60, 59, 60, 17,169,238, 53,158,171,115,221,107,
- 73,163, 2,251,246,234,110, 69,244, 5, 96,179,227, 80, 84,194, 34, 46,135, 69,186, 46, 31, 10, 42,173, 94,154, 2, 65,107,119,
- 55, 23,213,213,253, 31, 63,177,103, 10, 37,142, 12, 39,147,211, 28,120,129, 48, 36, 63, 82,111,231,219, 79, 90,222,110,171,182,
-229, 52, 83, 89, 78,232,241,218, 96,235,196,159,167, 81,102,222,253,225,216,206, 3, 79, 46,237, 64,230,173, 96,228,164,198, 83,
- 86,186,124, 56,217, 55,195,192,241,163,241,205,232, 14, 40, 42, 44, 2,147, 22,107, 45,151, 42,108, 0, 99,181,154,132,199,248,
- 85, 43,191,114,145, 48,116,233,246, 44,159,120, 22, 90,189, 30,224, 57, 40, 37, 2, 40, 82,254, 30, 11,158, 53,170, 90,143,248,
-120, 38,192,135,214,181,238, 81,153,216,235,175, 70,119, 8,172, 47, 97,181,160,128, 43,145, 89,127,154, 31, 63, 71,140,125,165,
-255, 91,221, 9,133,203, 13, 41,163, 0,123, 4,181,111,108, 97,110, 94, 24,141,228, 67,239, 34, 22, 74,226,212,245, 63, 24, 59,
-121,150,106,235,214,173, 67, 0,242, 54,170,182, 81,171,208,244,117, 98,166,179, 60, 22, 2,128,150, 37, 59, 44,229,212,228, 85,
-251,174,219,131,249,243, 14, 15,229, 73, 86,108,142,144,103, 60,255,217,131, 78,115,131,123,181,186,219, 43,137,162, 20,137, 23,
- 31,233, 11, 76,217,151, 76, 68,212, 20, 53,255,114, 77, 43, 43,171, 38,141, 26, 53, 90,200,178,108, 15,153, 76,230,100, 52, 26,
- 33, 8, 66,186, 92, 46,191, 28, 31, 31,191,164,176,176,240,241,127,219,186,223,191,127,223, 20,179, 85,167,166, 84, 42,197,131,
- 7, 15, 30,153, 96,182, 66,158,250,254,238, 43, 87,174,224,192,129, 3, 0,128,152,152, 24,180,104,209,194,188,186, 47, 62,121,
-242,196,188, 87,175, 94,187, 1,120,212,166, 25, 22, 22,214,228,196,137, 19, 56,116,232, 16, 0,224,193,131, 7,240,246,246,174,
-118, 97,174, 92,185,194,140, 27, 55,174, 9,128,212,191,161,140, 94, 6,147, 85,121,254,167,209, 10, 14, 14, 38, 65, 65, 65,212,
-211,143,171, 33,206,211, 86,222, 14, 58, 30, 0,226, 76, 93,130,168, 12,172, 92,183,235,204,128,223, 14,109,232,161,148,209, 88,
-180,109,110, 82, 86,110, 81, 39, 9, 85, 90,253,194, 17,208,182, 22,242,235,203, 39,182,241,204, 43,214,225,248, 31, 41,151, 34,
- 51, 77,139, 72, 35,211,112, 14, 16,108, 74,159,241,208,105, 51,189, 39,126,115,110,223,190, 79, 6,180,158, 51,180, 53,142, 93,
-139,159, 3,112,117,142,250, 78, 4, 1, 68,224, 42, 26,191,151, 93, 58, 0, 66,213, 27,248, 10, 32,165,175, 9,166, 37, 90, 61,
- 1, 73,158, 35, 6, 90,170,228,235,167, 79,159,106,197,102, 61, 68,174, 65,134,164, 60, 29,210,181, 82, 20, 75, 28,145, 18, 29,
-198,211, 20,206,213, 25,185, 80, 40, 36,156,206,198, 86,110, 65, 7,244,155,233, 86,120,122,126,158,156,226, 24,171,225, 95,218,
-100,255,182, 58,158,211,100,105, 40, 10,117, 14, 63,111,109,109,211, 66,151, 19,207, 20,228,101,195,198,185, 37, 6,188, 17,132,
- 47, 6,251,163,168, 80,131,172,220,235,164,185,139, 21,149,112,121, 15, 22, 12,244, 67, 78, 70, 26,244, 44, 64,105,244,185, 58,
-131,174,184,198,237, 72, 99,203,251, 31,206, 27,235,229,162, 54, 47,239, 84, 64, 4, 30,109,252,154,162, 95,143, 64,156,187,114,
- 21, 55,195, 98, 32,148,117, 42, 32,130,128,228,204,188, 12,157,145,223, 97,210, 6,229, 57, 16, 86, 87,173, 17, 67, 3,170, 12,
- 3, 28,161,226,129,207, 59, 52,177,156,242, 73,144,151,165,185,130,130,142,229,161, 51,176, 40,186,186, 30,246,141, 90, 65,165,
- 84, 82,237,160,149,220, 65,245,219, 86,199, 98,225,227,180,124, 23, 20,167, 99, 92,191,150,239,237, 92,254,142, 57,165, 44,221,
- 53, 89,190,106,146,117,117,113,135, 51,227,150, 30, 61,127,224,224, 24,215,111, 62,154,208,171,255, 7, 59,206, 3, 56, 45, 30,
-183, 68,254,141,140, 28, 57, 82,153,145,145,113,193,195,195,195,191, 95,191,126,170,238,221,187, 67,163,209,224,236,217,179,208,
-104, 52, 94, 30, 30, 30, 94,103,207,158, 29,145,152,152, 24,233,238,238,222,235,208,161, 67,245,110, 67, 91,102,128,152,138, 67,
- 48,192, 81, 20,133,178,215,168,178,215, 26,124,159, 91,185, 92,142,132,132,132, 23,158,108,165,164,164, 60,106, 72,178, 85, 92,
- 92, 44,115,115,115,131, 90,173, 6,207,243,208,104, 52, 56,122,244, 40, 10, 10, 10, 32, 8, 2,204,204,204,240,229,170,109,136,
-190,115, 1,161,161,161, 40, 40, 40,144,213,165,153,156,156, 76,181,105,211, 6,122,189, 30, 28,199, 65,167,211, 33, 36, 36,164,
-226,185, 68, 34,193,188,165,107, 16,115,235, 2,238,222,189,139,228,228,228,191,229,110, 35, 38,120,145,255, 70,106, 28, 51,235,
-111,239,117,200,243,220,167, 91,119,238,187,254,233,140,209,152, 53,166,175,199,146, 13, 71,250, 70,101, 99, 39, 0,248, 57, 96,
-226,155,189,155,123,218,168,164,248,226,231, 91, 0, 33,159, 62,239,239, 69,228, 34,198,223, 73,152,243, 75,104,194,133,249,163,
-219,161,169,139, 85,139, 60,121,174, 60, 46,174, 30,247, 20, 20, 56,216, 90, 40,124, 6,181,177, 63, 13, 65,128,141,165,194, 23,
- 60, 7, 27, 11,133,207,128,150, 86,191, 2,128,149, 74,234, 91, 93,242, 85, 19,237, 61,164,211, 84, 10,201, 52,115, 75, 27,207,
- 73, 67,250,153, 13, 26, 50,194,204, 66,202, 33, 39,244, 44, 10,165,238, 96,237,188,160,103,115,145,252, 56,150,255,237, 70, 84,
- 74,118,145,126,110,157,139, 73,112, 41,229,241, 3,117,147,214,253,108,179,131, 23,100, 54,121,235,231,198, 52, 4,186,104,207,
-240, 12,115,199,142,102,127,196, 61, 46, 22, 72,181,137, 78, 21, 10, 11, 10,226, 89, 30, 46, 90, 94, 98, 25,123,254, 39,124, 50,
-176, 21,242,114, 51,161, 51,114, 40,208,114, 70,103, 27,165, 66,255, 56, 28,122, 35, 7, 3, 43, 64,106,227,134,179,215,195,178,
- 5,150,253,181, 38,205,184, 28,220,141, 59,122,215,162,242,107, 77, 29,208,230, 99, 43,179,187, 96,181, 72, 72, 78,197,206,147,
-215,219,197,229,224,238,243,148, 51, 17,184,210,234,231, 74, 73, 22, 69,208,189, 33,141,224,125, 29,209, 81,166,148,125,255,245,
-156,113,254,157,189,237, 20, 66,242,117, 80,130, 17,230,188, 4, 90, 57, 15,107,143,166, 16, 12, 69,164, 68,167,203,143, 0,106,
- 43,124, 6, 0,136, 81,131,111, 38,180, 52,167,108,155,130,143, 59, 13, 73,219,105, 96,203,210,254,216, 28, 33,204,120,254,179,
-232, 46, 31,158,232,185,244, 92,239,168,212,147,139,162,220, 70,174,111, 3,236,104, 36,158,174, 69,254,141,248,248,248, 56,167,
-164,164, 68,124,248,225,135,118,195,135, 15,199, 47,191,252,130,194,194, 66,236,216,177, 3,107,215,174,197,226,197,139,193,178,
- 44,182,110,221,170, 58,124,248,112,199,141, 27, 55, 38,123,122,122,182, 76, 76, 76, 76,175,195, 96, 81, 0, 20, 0,164,101,231,
- 46, 10,128,112,234,212, 41, 12, 26, 52, 8,167, 78,157, 18,202, 94,227, 81,122,241,211,160,123,127,202,229,114,200,229,114, 20,
- 20, 20,188, 16,179, 37,149, 74, 97, 97, 97, 1,185, 92,142,162,162, 34,147,205, 22,199,113, 76,114,114, 50, 10, 10, 10,208,111,
-200, 16,172, 89,190, 28,189,123,247, 70,191,126,253, 64, 8, 65, 72, 72, 8,250,118, 13,192,232,255,235,133,168,168, 40,112, 28,
- 87,175,229, 77, 79, 79, 71, 70, 70, 6, 6, 12, 25,130,109, 27, 55, 34, 48, 48, 16, 62, 62, 62,224, 56, 14, 23, 46, 92,192,200,
-254, 93,161, 28,214, 23, 49, 49, 49,226, 78, 93,255, 52,235,133,180,209,122,110, 34,178,112, 67, 56,118, 49,120, 76,255,142, 65,
- 67,186,249, 99,219,254,223,190,130,186,112, 31, 0,216,235, 21, 95, 78,232,221, 20,145,137,121,248,237,110,106,112, 84, 54, 94,
- 72,111, 13,129,135,131,189,149, 10, 96,228,208, 26, 5,206, 42,174,238, 6,204, 2, 33, 80,245,248, 24,111, 14,137,244, 8,244,
-247,240, 40,239,117,104, 49,104, 53, 38,134, 61,242,236,224,227,236, 9,158, 5,120, 22, 86,163,127, 6,150,154,215,185, 28, 93,
- 27,203,207,189, 63,123,118,151,129,195,222, 48,147,171,172,193, 23, 38,129, 77, 15, 67,206,195, 75,208,168, 90, 32, 61, 33, 14,
- 7,206,132, 22, 60, 76,206, 41,164,105,156,205, 40,208,127, 20,151,135,226,186,116,117, 44,150, 47, 92, 48,119,240,129,125,251,
- 45, 21, 77,187, 81,177,235, 7, 21,200, 37,156, 66,221,248, 21,186, 68,233, 64,150,237,216,111,165, 49, 96, 69, 93, 58, 37,154,
-194, 35, 33,103, 79,143,110,222,164,155,229,147,155, 39,161,213,233,161,103,129,150, 29,123,129,231,137,156,162, 41,193,138, 97,
-168,204,156, 60, 80, 44,159,113,249,222,147,180, 43,247,226, 24,189, 37, 86,212, 58,186,200,211,238,158, 98,222, 27,210,171, 45,
-192,106,241,127, 61, 90, 97,205,158,223,222, 5,248,183,158,175,144, 75, 19, 45, 2,116,243, 87, 99, 51, 33,232,118,235,232, 90,
-223,246,195,222,135, 41,137, 86, 75, 7, 12,244,107,226,250,211,154, 47, 63,182,179,119,111,193, 80, 2, 11,226,220, 26, 40, 76,
- 38, 84,242,117, 88,187, 5,130,119,237,138,173,223,125, 91, 44, 8,100, 31,106, 25,218,130, 23, 0, 33,241, 34,248,232, 95, 16,
- 23, 23, 7, 7,175, 91, 0, 69,131, 52,122, 2, 35, 87,250, 53,189,145,156, 92,183,227, 68,239,143,250, 44,111, 57,196, 87,226,
-121,253, 94,108,230, 27,147, 93, 85,157, 60, 25,239,200, 52,115, 58, 91,163, 17,196,227,151,200,191, 9,157, 78,119,100,229,202,
-149,118, 65, 65, 65,229,137, 12,174, 95,191,142,237,219,183,195,220,188,234,113,114,208,160, 65, 32,132,216, 45, 90,180,232, 8,
-128,206, 53,105,118,233,210,101,200,221,187,119, 83,219,182,109, 27, 87,102,182,100, 0,232,240,240,112, 58, 41, 41,137,178,181,
-181, 37,174,174,174,108,106,106,170, 0,128,159, 60,121, 50,115,240,224,193,230, 26,141,230, 98, 67,141,150, 92, 46,127, 33,109,
-182,164, 82, 41, 40,138,130, 92, 46,135, 76, 38, 3, 33,196, 36,179,197,243,188,228,212,169, 83,184,117,235, 22, 22,183,109,139,
- 57,110,110,176,179,179,195,133, 11, 23, 64, 8,129,185,185, 57,114,115,115,177,111,223, 62,244,233,211, 7, 28,199,201,234,163,
-123,232,208, 33,220,190,125, 27, 75,219,183,199, 28,107,107, 88, 88, 88, 32, 36,164,180, 54, 80,161, 80, 32, 33, 33, 1, 33, 33,
- 33,232,213,171,151,184, 83, 63, 39,245,222,121,122, 2,146, 92, 10,206, 70,131, 22,132, 35, 0, 5, 87, 63, 63,200,162,162,170,
- 54,206,169, 15, 52,141, 5,223,237, 12, 30,188,250,253, 33,212,180,161,237, 92,151,252,116,254,109, 0,152,242,186,183,155, 74,
- 33,193,186, 99,145,132,166,177,224, 69,172,160,159, 31,100, 84, 14,222,238, 23,232,131,212,124, 3, 98, 83,243,127,143, 2,234,
-117, 23,231,223, 86,191,137, 93,199, 47, 36,173,221,165,139, 38,132,192,198, 66,225, 51,241,126,172,231, 79,167,110, 39,174, 58,
-160,139, 38, 2,129,141, 74,234,251, 86, 84,215, 58,123, 29,182,247,144, 78,251, 96,238,220,174, 67,223,250, 80,201, 69, 31,132,
- 33,246, 12, 4,163, 22,133, 70, 25,242, 25,103, 36, 39, 38, 98,217,214,224,164, 66,141, 97,116, 68,150,105, 6,243, 97, 14,138,
- 37, 84,225,240,101, 95,204, 63,183,252,203, 69, 22,218,184, 11,197, 12,197,105,153, 70, 61, 37, 95, 46, 94, 77, 21,233, 13,111,
-196,229,161,168, 46, 29,189, 37, 86,172, 92,245,221,224,169,227, 71, 68,123,183,232,105,207,167, 62,182,215, 21, 22,102,254,124,
-250,182,115,217,149, 34, 5, 0,177,201, 57,200, 42,208,112, 60,199, 94,180,148, 98, 73,100,125,210,193, 50,154, 56, 66, 29,212,
-173,229, 56,181,165, 12,218,226,124, 56, 90, 74,209, 63,176,217, 56,246,143,152,143, 31,103,154, 98,215,158, 54, 90, 44, 8,171,
-197,141, 21,125,124, 9,207,250,130,103, 97,188,191,219,244,100,140,194,156, 89, 61, 44,172,108, 13, 79,104,104,204, 1, 51, 7,
- 80, 86, 94,128,117, 99, 74,234,247, 6, 82,227, 34,184,119,199,141,207,121, 28,159,252,131,131, 89,237,213,218,172, 64, 32,196,
- 95, 64,113, 70, 44,194, 83,141,104,153, 89, 90,219,110,149,113, 7,188, 56, 98,142,200, 75, 74, 66, 66,194,132, 79, 63,253,244,
- 74, 96, 96,160,147,131,131, 3, 90,181,106,133,227,199,143,227,195, 15, 63,172,248, 76,219,182,109, 65, 8, 65,110,110, 46, 86,
-174, 92,153,158,154,154, 58,161,214, 11,244,136,136,232, 93,187,118,245,240,247,247, 55,202,100,178,124, 0,138,252,252,124,101,
-110,110, 46,165,211,233, 32, 8,130, 96,109,109,205,167,166,166,178,163, 71,143,214, 95,187,118,173,153, 70,163, 73,120,158, 68,
-203,195,195, 35, 60, 39, 39,167,128,162,168,231, 30,250,161,220,100, 57, 56, 56,168,139,139,139, 5, 0,121, 13, 25,250,129,227,
- 56,180,111,223, 30,103, 46,221,193,169,223,174,161, 48,245, 1,222,158, 58, 1,173, 90,181,194,153, 51,103, 26, 92,102,109,218,
-180,193,233,144, 43,184,114,235, 30, 18, 98,238,227,221,183,167,162,101,203,150, 56,125, 90,108,189, 96, 2, 39, 81,181,109,214,
-201,167,141, 86,175,224,224,224,242, 67,255, 51,246,213,215, 1,109,164, 54,242,221,139, 6, 54,243,147,246, 91, 4, 74,106,134,
-131, 45, 78,119, 93,176,108,125, 52,227,152, 48, 62, 60,179,238,222, 97, 85,254, 52,153,136, 32,161,209,123,239, 69,249,142,251,
-191, 64, 15,108, 59,174,250, 28, 0,222,232,222, 4,127, 60,204, 66,104, 76,230,222,200, 44, 68, 60,239, 90, 7, 56, 66,197,103,
- 99,239,202,247,134,246,242,114,119,198,246, 95,174,128,162,112,164, 94, 39, 92, 66, 72,160,191, 23,214,238,122,186,135,161,179,
-231,170, 3,186,232,179, 17, 69, 3, 1,160,159,175,234,215, 14,205,108, 61, 73,229,134, 91,213, 96, 38,151, 76, 31, 56,226, 77,
- 37, 23,115, 28,136, 15, 1,197,233,161, 53, 10, 72,203, 46, 66,137,181, 7, 46, 92,191,167, 45,208, 25,222,143,204,106, 88,138,
- 23,149,141, 56,217,205,123,137,197, 26,173,139, 74,221, 76,199,208,130, 80,172, 39,248, 35, 50,190, 48, 50, 29, 15,234,163, 17,
- 23, 7, 67, 39, 55,174,251,230,157, 7, 22, 74,101,242, 55, 24, 10,148,163,141,185,122,243,234,165,176,180,180,128, 96, 40, 6,
- 52, 89, 24,254,206,178,172,240, 84,182, 9, 0,180,176,135, 69,247, 38,210,157, 18,154, 74, 62, 31,107,252,172,174,223,160, 88,
-204, 24,223,191,173, 84, 48,104,240,222,202,253,216,242,241, 80,188,249,170,159,244,228,213,152, 25, 0,150, 52,180,172, 9,207,
-129,176, 90,116,158,127, 41,154, 2,174, 16,160,219,173, 3, 95,250, 2,119,234,173,209, 14,144,242, 18,202,175,181,167,185, 76,
- 72,190, 10, 33,249, 42, 97, 60,186,130,242,236, 65, 81,206,237,201,247, 95, 47,214,108,219,182,253,172, 64,227,139,122, 12,149,
- 1, 94, 0,178, 99,174,192, 96, 48,128,229, 1,157, 78, 7,141, 70, 3,243,216,211, 21,109,180,100, 82,106,192,236, 73, 67,218,
-144,226,212,146, 19,209, 92,226,246,169,190,157, 73,113,106,201,141, 68, 62, 38, 91,163, 23,211, 44,145,127, 35,113,169,169,169,
- 3, 6, 13, 26,244,219,153, 51,103,236, 2, 2, 2, 0, 0,183,110,221, 42,189,232,108,223, 30,222,222,222,200,200,200,192,152,
- 49, 99,178,211,210,210, 6,160,142, 54,191, 69, 69, 69,143, 15, 29, 58,228,164,209,104,218,126,246,217,103,153, 94, 94, 94,133,
- 58,157,142,202,207,207, 23, 56,142,131,173,173,173,188,109,219,182,232,210,165, 75,241,245,235,215, 27, 37, 37, 37, 21, 1,136,
-111,200,194, 15, 29, 58, 20,151, 46,149,118,218,123, 17,227,106,201,100, 50, 4, 4, 4,184,197,197,197,165,148,157, 91, 76, 62,
-198, 87, 62,189,220,187,119, 15, 23,239, 36, 67, 98,208, 66,158,149,138, 27,191, 28,194,144,233, 51,193,113, 13,191,183,252,189,
-123,247,112, 52,228, 6,204, 21, 18, 60,120, 16,129, 67,135, 14,225,237,183,223,126, 46,205, 6, 82,171, 23,249, 47, 39, 13, 53,
-180,211,146, 0, 64, 80, 80,208,197,242,180,162, 50, 77,155, 66,174, 40,198,162,126,237,220,230,189,209,173, 25,195, 22,166, 66,
-224, 5, 48, 82,192,209,193, 10,187,119,239,109,178,119,255,254,235, 27, 55,108,252, 78,224,184, 5,225,153, 40, 49, 97,161, 22,
-173,222,127,229,141,221,115,123, 73,222, 30,232,107, 7, 0, 50, 9,141,117,199, 35, 56, 0,139,158,103,109, 59,185, 65, 89,204,
- 98,154,163,189,245,231,159,254,103,176, 93,175,246,222,184, 24, 26,142,239, 14, 93,191, 36,207,196,174,122,239,220, 2,139,167,
-253, 83,117,189, 14, 33,212,221,238,146,231,137,179,204,220, 22,198,248,243,128, 81, 7,157,222,136,164, 28, 30, 73,185, 58, 72,
- 84, 50,220,138, 73,214,218,167, 35,248, 57, 86,155, 50, 87, 41, 93, 23,126,181,202, 93,167, 45,230, 10,243,178, 57,153,252,134,
- 84,101,166, 72, 51,165,169,194,141, 20,232,122, 52,150,190, 2, 8,140, 92, 73, 74,230,127, 48,201, 60, 37,242, 12,154,211,169,
-160, 8,129,153,223, 96, 88,154, 49,178,110,141,164,137, 0, 96,110,174,146,175,252,226, 67,235,247, 63,254,162,206, 54, 96,126,
-128,204,187,169,243,251, 1, 94,182,184,116, 59, 26,151,194, 18, 34, 46,221,122,208,178,119, 43, 87,120,187,219,204,150,231,229,
-175,136,130,233, 9,105,105,193,112, 0,171,171,232,117,232,231,136,177, 29,222,248,172,166,222,134,213,210, 24, 16, 98,120, 2,
-138, 97, 0,138, 46,237, 1,153,116, 21, 18,155,166,100,239,129,163, 37,219,183,239, 90, 26,149, 93,255,206, 25, 44, 15,190,176,
-176, 16,230,230,230, 56, 29,195,233,223,236, 47, 83,208, 52,141,164,152, 59,127, 54,134,183,163,253,101,189,191,244,189,186,184,
-195, 25, 75, 57,165,112, 29,252,133, 31, 23,182, 43,185,161, 39, 9, 17,145,255, 6, 10, 10, 10,238, 71, 69, 69,245,111,221,186,
-245,142,247,222,123,207,114,252,248,241,174, 83,167, 78,165, 1, 32, 35, 35, 67, 88,187,118,109,234,247,223,127, 95,144,157,157,
-253, 22,203,178,245, 25,202,132,164,165,165, 93,251,225,135, 31,178, 46, 95,190,220,178, 99,199,142,138, 87, 94,121, 69,176,181,
-181,149, 40, 20, 10,222, 96, 48,232, 98, 98, 98,248,184,184, 56,151,252,252,252, 71, 0, 98,209,128, 59, 86,148,165, 87, 75, 24,
-134, 89, 72, 8, 9,120, 17,109,180, 84, 42,149, 43,128, 71, 20, 69, 53, 55,181,218,240,153, 19,182, 68,130,188,188, 60,148,164,
- 71, 64,153,252, 16,173,205,105,248,219, 90,192,202,202,234,185, 76, 81, 65, 65, 1,160, 73,193,149, 43,247, 0,142,131,181,181,
- 53,172,173,173,255,118,163, 85,147, 23,249,151, 48,173,154,215,106,111,163,229,175,198,219,102, 6,172,157, 62,184,153,172,177,
-167, 59,244,201,183,112, 47,169, 24, 11, 58,117,140,100, 20,150,186,233, 19,134,182, 31, 49,178, 17,122,117,233, 64, 53,118,177,
-158,189, 98,245,166,119,252,145,253, 97,100, 38,214,213,103,137, 34,179,240, 88, 64,230,246,243,247,147,103,184,171,180, 16, 4,
-130,243, 97,105, 8,139,207,219, 30,157,133,199,166,172,157,191, 11,250, 74, 64,239, 39,132, 40,173,205,205,139,252,189,221, 29,
-250,118,110, 67, 15,232,217, 30, 50, 6,184,242,199, 61,204, 89,125,228,134, 32,144,193,119,234, 89,109, 88,218,195,176,170,129,
- 42,237, 97,200, 86,233, 97, 72, 8, 33,165,189, 14,107, 15, 31, 24,134, 74, 47, 73,184,233, 44,181,111, 1,109,236,121,196,231,
- 9, 72,200, 44, 66,161,196, 25,250,148, 20,128, 8,137, 23,107,111, 88, 93, 43, 14, 14, 14,142, 77,252,189,155,173,223,121, 8,
-198,146, 2, 60,190,176, 3,197,121,105,248,114,243,241,102,110,110,246, 61, 83, 82, 82, 46,154,112,176,241,254, 45,120,175, 35,
- 8,192, 72, 21, 56,185,241, 0,178,237,205,224,160,146, 65,208,102, 97,250,251,227,173, 7,246, 27,111, 13, 0, 9, 15,238,194,
- 75,165,173,151,174,209, 30, 35,222,232,237, 99, 3, 86,139,157,167,239,234,104, 96,192,174,179, 17,177,189,125,109,148,111,116,
-243,178, 93,146,154,255, 58,114, 26, 54,168,104,121,162, 85,145,240, 53,160,183,225, 33,128,247, 21, 16,187,255, 90,166,249,200,
-126,175,168,100, 18,138, 34,197, 41, 32,102, 14,216,180,243, 96,177,156, 53,237, 78,236, 2,176, 36,112,249,227,133,165,251, 9,
-118, 12, 92,126,235, 63,231, 62,239,164, 78, 79, 79,135,177,172,238,240,113,174,240,251,132,126,254,124,114,129, 96, 56,187, 98,
-248, 72,202, 76, 45,255,232,155, 93, 23, 8, 32,142, 38, 45,242,175, 70,171,213,222,214,106,181,173, 62,250,232,163,177,243,231,
-207,239, 97,110,110,222, 4, 0, 52, 26,205, 99,150,101, 47,149,253, 63, 77,233, 29, 72, 0, 60,138,141,141,125, 28, 27, 27,235,
-180,103,207, 30, 27, 0,202,178,247,116, 0,242, 1,100,224, 57,122, 28,150,155, 42,138,162, 22,190,168,237, 80,110,170, 40,138,
-106,222,144,239,211, 52,205, 83, 20, 5,138,162,160, 80, 40,112,249,242,101,140, 26,220, 15, 81, 39,243, 17, 96, 99,129,142,111,
- 77,199,254,115,231,192, 48, 12, 40,138, 2,195, 48, 38,157, 71, 36, 18, 9,174, 92,185,130, 55,199,140,132, 66, 2, 88, 91, 91,
-227,163,143, 62,194,177, 99,199, 32,145,136,119,233, 51,129,173,149, 12, 87, 61,199,209,162,176,228,220,142,101, 50,240, 44, 78,
-236,248, 22,193,225,197,134, 7, 89, 88,224,147,133,181,135, 80, 36,100,173,222, 53,227,220,149,240,111, 38,143, 14, 82,245,233,
-221, 15,125,122,245,150,180,236,208,243,115,160,138,209,234,139, 90,198,218,224, 5, 44,221,122, 58,122,250,254, 11, 49, 20,140,
- 69, 24,253, 90, 7,194, 11, 88, 90,199,202, 60,163,105,109,102,177,255,202,245,235,182, 48, 22, 35,254,238,239,202, 70, 77,154,
- 1,188, 17,143, 30, 61,196,247, 59,127, 17, 46,252,241, 96,183,129,195,123,113,121,208,212, 87,179,244, 76,201,193,218, 92,238,
- 51,160,165,213,175, 2, 8,108, 84, 50, 95, 34,240,176, 81, 73,125,251,249,170,126, 37,132, 16, 75, 51,169, 47,225,217, 58, 53,
-181, 6,110,203,206, 31,183,175,154, 50,101,138,121,118,114, 58, 82, 11,195, 81, 44,119, 3,171,242, 64,236,221, 75,218, 18, 61,
- 87,159,147,120,141,219, 51, 59, 59, 59,243,118,104, 46,246,111, 94, 14,214,160, 71,102,114,169, 87, 77,205, 46,132,149,131,219,
-245,148,148,148,122,107, 26, 57,161, 96,196,248,105, 50, 51, 75,152,189, 57, 34, 72, 30,155,163, 71, 59, 87,203,210,131, 70,113,
- 22,162, 66,174,160, 87, 89, 27,211,184, 36, 26, 94,109, 92,235,181,156,150, 74,217,123, 3, 95,113,195,227,196, 52, 92,142, 72,
-217,249, 56, 23,169,124,116,218,206,216,212,252, 25, 67, 59,121, 98,205,177,200,119, 1,118,175, 41,235,238,231,136,177,132,160,
- 91,105, 99,120, 45, 8,208,205,207, 17, 99,235,217,211,240, 25, 77,137, 12,227, 86,253,154,240,217,193,155,217, 67,231,141,235,
-110,213,165,203, 32, 57, 56, 3,138,180,122, 54, 42, 31,133,166,104, 22,106,133, 45, 0,182,148,191,113, 59, 89,216,221,125,209,
-245, 75,123,167,122,168,203,189,250,165, 88,253,117, 0,215, 39, 7,154,125, 46,235,253,165,207,245, 37,129,103,194,210,132, 61,
-151, 98, 43,198,208,170,243,127,212, 64, 68, 77, 81,243,239,208,228, 1,236,102, 89,118,119,126,126,254,139,212, 76,197,179,227,
- 58, 61,215,186, 87,174, 38, 36,132, 72,202,210,172,186, 26,195,215,170, 89,185,154,144, 16,114,170, 44,205,170, 43,213,170,162,
- 41, 8, 66,106,251,246,237,237,134, 12, 25, 2,158,231,241,240,225, 67, 36, 36, 37,161,239,140,119, 97, 99, 99,131, 75,247,239,
-227,193,131, 7, 88,184,112, 33, 88,150,197,209,163, 71,147,235,210,148, 72, 36,198,102,205,154,201,134, 13, 27, 6,142,227, 16,
- 23, 23,135,148,148, 20,204,153, 51, 7,214,214,214,184,125,251,118,133,102,118,118, 54, 36, 18,137,177,154,116,235,175,216,151,
-254,237, 60, 99,178,106, 55, 90, 0, 15,158, 69,193,185, 69, 88,119, 25, 70, 35, 11,223,200, 44, 60,137,252, 51,145,218,196,132,
-222, 63,113, 63, 60,250,241,237,171,125,228,200, 12,131,169, 87, 18, 15,115,144,102,169, 44, 42,130,177,200, 10,113,191,226, 73,
- 70, 81,241,195, 28,164,153,124,197, 32,240, 20,140, 37, 64,218, 45, 92,187,116, 17, 23,110,220,195,205,176,104,254,218,237,152,
-253,180,128,165, 81, 57,120,216,128,171, 16, 88, 12, 94,131, 73, 97,143, 60, 59,120, 59,121,130,231, 64, 4, 22,214,163,247,226,
-173,200, 46,158, 29,154,218,120,150, 38, 89, 44,108,255,243, 59,176, 74, 89,171,222,173, 36,118,171,252,216,153,215,139,242,115,
- 58,189,218,179,179,185,181,223, 64,100, 63,138,193,195,123, 87,180,183,195, 99,175,221, 74, 98,183, 62, 79,233,186,185,185,245,
-120,181,167, 15, 70, 79,255, 20,198,146, 2,196, 93,248, 17,197,185,233,184,124,221, 2,209,133,133,157, 1,212, 59,209,186,158,
-200,181, 68, 98, 30,186, 54,146, 38, 90, 66,239, 60, 33,104, 8, 20,148, 14,130,190, 16, 84, 73, 54, 98, 83, 12, 5,175,111, 78,
-226, 1, 64,165,160, 36,230,164,192,170, 94,201,163,151,125, 11, 21,195, 98,215,185, 8, 8, 66,233,237,155, 4, 1,155,118,253,
- 30, 59, 99,233,155,237,224,239,105,219,230,110, 74, 38, 5, 19, 34,127,138,160,251,205,253, 95,248,234,126,251, 28, 16,140,184,
- 50,219,206,183,251,186,220,238,104,224,237,118,194, 83,145, 2, 96, 6, 36, 37, 91,102,175, 59,253,121,251,115,145,221,230,254,
-103,168, 21,200, 11,233,161, 27, 19,153,206,247, 8, 92,145,112, 70, 32, 85,235,115, 75,147, 45, 63,146, 90, 72,238, 94,138,213,
-139,163,194,139,136,136, 0, 0,138,139,139,167,191,245,214, 91, 91,164, 82,169, 26, 0, 37, 8, 2, 4, 65,144,124,243,205, 55,
- 82,158,231,105,154,166,121,134, 97,184, 83,167, 78,177, 60,207,103,233,116,186,233,117,105,114, 28, 23, 59,115,230,204,102,117,
-245, 80,220,183,111, 95,185,201,138, 21, 75,162, 94, 38,171,242,188, 34,229,146,212, 18,210,126,209,245,205, 69,139, 0, 80, 32,
- 88, 28,153,133, 39, 79,127, 36, 44, 23,169,254,140,113, 78,203, 14, 61, 23,149,127,199,212, 37,211,241,252,200, 14,173,188,247,
- 1,128,158,240,111, 54,100,237, 10,245,218, 55,218,118,232,188, 95, 32, 68,194, 17,178,157, 22,112, 88,199, 33,170, 62, 61,237,
-106, 34, 53, 51,255,246,192, 0,107, 2,148, 86, 25, 86, 84, 23,150, 13,227, 64, 8, 33, 21,213,133,223, 42,145, 93,160,175,115,
- 28,168,171, 79, 12,253, 12,220,205,105,103,175,222,157,206,243,196,153, 97,168,116,173,129,219,242,188, 38, 11, 0, 82, 82, 82,
- 46,134,156, 75, 57,123,191,141,211,107, 14,170,178,148,171, 4,200, 46,193,217,148,172,226,139, 13,209,204,211,176, 67,113, 22,
- 77, 53, 0, 0, 32, 0, 73, 68, 65, 84,231,175, 61,118, 92, 46,101, 36, 32,164,116, 64, 81, 66,160, 51,242,185,215, 19,185,150,
- 0,208,202, 14,174, 31, 29,229,246, 49, 12,149, 80,151, 94,232,131,180, 53,163, 87,132,124, 24, 17,159,183, 61, 62, 31,225, 0,
- 16,159,143,240, 3, 87,158,124, 30,155, 94,244, 97,120, 66,222,183, 48,177, 93, 5,161,112,185,195,232, 69,207,188,246,188,219,
- 51, 58, 13,247, 0, 12, 7,146,251,141,158,251,253, 92,138,194,139,186,253, 68,140,214, 72,188,158,126,177, 60,217, 18,143, 85,
- 34, 34,255, 29,148,167, 90, 52, 77, 47,121,129,154,167, 40,138, 26, 4,224,145, 9, 95, 11, 45, 46, 46,110,245,130, 87, 47,135,
-227,184,156,250,124,240, 31,104, 16,255,111,101,235, 63,245,195,125, 69,205,191, 95,179,121,243,230,196, 4,195, 34,110, 79, 81,
- 83,212, 20, 53,255,167, 52, 9, 33,204,243, 76, 53,104, 82,207, 51,137,101,244,175,103, 90, 77,207,197,150,110, 47, 33,143, 30,
- 61,162,196,173, 32, 34, 34, 34, 82, 61, 20, 69,241,127,129,166, 56, 58,158, 72,185,193,170,146,110,209,226, 54, 17, 17, 17, 17,
- 17, 17, 17, 17,121, 33, 38,171,242,188,212,132,163,230,248,207,148,222, 4, 13,137, 16, 67, 68, 77, 81, 83,212, 20, 53, 69, 77,
- 81, 83,212,252,159,211,172, 75, 91,236,205,248, 23, 27, 48, 81, 83,212, 20, 53, 69, 77, 81, 83,212, 20, 53,255,247, 52,255,205,
-212,216, 70, 75,172, 58, 20, 17, 17, 17, 17, 17, 17, 17,249,139, 16, 27,195,139,136,136,136,136,136,136,136, 60, 31,117,222, 84,
- 90, 68, 68, 68, 68, 68, 68, 68, 68,164, 97,212,126, 83,105, 17, 17, 17, 17, 17, 17, 17, 17,145, 6, 99,250, 77,165, 69, 68, 68,
- 68, 68, 68, 68, 68, 68,234,197, 86,113, 19,136,136,136,136,136,136,136,136,252, 61, 84,237,117, 24, 28, 28, 76, 42,207, 69, 68,
- 68, 68, 68, 68, 68, 68,254, 78, 94, 86, 47, 34, 86, 29,138,136,136,136,136,136,136,136, 60, 31,211, 68,163, 37, 34, 34, 34, 34,
- 34, 34, 34,242,215, 80, 99, 27,173,242, 1, 75,123,149, 69,117,189,196,109, 37, 34, 34, 34, 34, 34, 34,242, 15,240,114,123, 17,
-177,125,150,136,136,136,136,136,136,136,232, 69, 68, 68, 68, 68, 68, 68, 68, 68, 68,254,155, 16,239,117, 40, 34, 34, 34, 34, 34,
- 34, 34,242, 55, 27,174,191,220,104,137,119, 54, 23, 53, 69, 77, 81, 83,212, 20, 53, 69, 77, 81,243,127,201,100, 85, 49, 91, 98,
-175, 67, 17, 17, 17, 17, 17, 17, 17,145,231,163,206, 94,135, 34, 34, 34, 34, 34, 34, 34, 34, 34, 13, 99, 26,128,160,178,199, 65,
-168,148,106,137,137,150,136,136,136,136,136,136,136,200,243,177, 21,128, 75,153,193, 58, 9, 32, 77, 52, 90, 34, 34, 34, 34, 34,
- 34, 34, 34, 47,134,202,237,178, 6, 87, 50, 95,162,209, 18, 17, 17, 17, 17, 17, 17, 17,121, 78,106,108,163, 69,161,230,158, 3,
- 33, 38,252, 64, 67,122, 31,132,136,154,162,166,168, 41,106,138,154,162,166,168,249, 63,167, 89,151,118, 8,254,125, 76, 51,197,
-124,189, 72,196,174,175,162,166,168, 41,106,138,154,162,166,168, 41,106,254,207,242,194,123, 29,182, 3,204,196,205,250, 82,226,
- 84, 54,137,136,136,136,136,136,136,212,206, 95,211,235,208, 15,248,207,248, 0,245,102, 54, 60,203, 42, 28, 40,169,237,179,106,
-181,122,139, 74,165, 26, 95, 82, 82,162,161, 40, 74, 40,127,157, 16, 2, 0,149,239,117, 20,151,149,149,213,189,174,223,150,203,
-229,107,157,156,156,254, 83, 92, 92, 92, 66, 81, 20,161, 40, 10, 20, 69, 1,192, 51,115,158,231,147,115,114,114,218,255,171,139,
-144, 16,198,193,201,233, 15, 41,195,184,153,250, 85, 94, 16,158,100,102,100,116, 54,225, 43,203, 41, 10,243, 74,127, 22, 95, 3,
-248,244,101,251, 71, 16,128,169,207,231, 2, 0,203, 24, 96, 52, 79,211,239, 74,129, 13,122, 65,216, 12, 0, 20,192, 55,244,183,
-245,161,104, 70, 17,180,161, 40, 88, 19,130, 2, 66,225,158, 34, 16,177,255,208,166, 24, 33,149, 74,135, 90, 89, 89, 89,228,228,
-228, 92, 4,176, 15,192, 24,123,123,251,158,133,133,133,197, 44,203, 30, 3,112,164, 33,194,221,219,224, 99,185, 76, 58, 89,103,
-100, 87, 94,189,135, 31,123,182,131, 61, 39, 96,133, 82, 38,233,174, 55,112, 95, 95,185,143,237, 38, 74, 82,101, 83,249, 49,195,
-228,123,164, 29,172,103,185, 3,192, 81, 91, 91,111,133,218,234, 55,169,156,121,146,159, 81, 60,126,100,102,102,210,168,231, 40,
-247,255, 70, 28, 28, 28, 38,209, 52,253, 21, 33, 4, 60,207, 47,200,205,205,221,241,130,164, 23, 0,176, 41,123,156, 15,224,171,
-231,212, 75, 0,224, 89,246, 56, 17,128,151,120, 94,111, 48,155,126,249,229,151, 25,189,123,247,198,154, 53,107,176,105,211,166,
-248,172,172,172, 21, 0,118, 2, 48,252, 3, 58, 34, 53,225, 15, 12,250,166,127, 32,207,254,180, 84,168,244,114,223, 26,254,204,
- 63, 76,152, 48,193, 72, 8, 33, 15, 30, 60, 32, 6,131,129,176, 44, 75, 56,142, 35, 28,199, 17,150,101, 43, 38, 55, 55,183,148,
-167,190,254,140, 38, 77,211,235, 94,127,253,245, 34, 66, 8,185,117,235, 22,209,106,181, 68,175,215, 19,131,193, 64,116, 58, 29,
-209,106,181, 85, 38, 39, 39,167,140,218, 52,173,172,172,110,217,218,218,102,216,218,218,102,216,217,217,101,216,217,217,101,216,
-219,219, 87, 76, 14, 14, 14, 21,147, 90,173,206, 80,171,213, 25,118,118,118,183,234, 90,206, 50,250, 3,184, 88,143,169,127, 53,
-223,237, 91,217,104,185,184,184,100,144, 6,224,238,238,158, 84,143,229, 44,199,137,162,192,151,127,151,162, 32, 40, 20, 10,207,
-202,239,227,217,164,171,206, 72,217,213,213,245,117, 23, 23,151, 16, 23, 23,151,115,174,174,174,175,215, 99, 23,171,162,105,105,
-105,121,203,193,193, 33,195,217,217, 57,179,124,114,113,113,169, 50,185,186,186, 86, 76, 78, 78, 78, 25,182,182,182, 53,150, 17,
- 1,152,154,166, 11,128, 68, 1,244,145, 48, 76,176,147,147, 83, 97, 88, 88, 24, 79, 8, 33, 52, 77,167,148,127,198,148,117,127,
-218,100,149, 92,193,130,236,243,138,208,226, 39, 43, 10,178,207, 43, 66, 75,174, 96,129, 62, 20,205, 26,170, 89, 79,170,211,156,
- 56,113,226,196,123, 25, 25, 25, 41,249,249,249,105,155, 55,111,142, 81, 42,149, 87, 54,111,222, 28,147,159,159,159,150,145,145,
-145, 50,113,226,196,123, 0,102,154,160, 9, 0,232,220, 6,157,166,140,112, 41,185,119,244,205,146, 62, 29, 36,119,187, 6, 32,
-168, 95,103, 89,202,250, 79,252, 74, 46,109,235, 86,210,251, 21, 58,220, 68, 77, 74, 34,145,116,241,244,244,156,172, 86,171, 39,
-148, 77,111,150, 79,206,206,206,111, 58, 59, 59,191,105,107,107, 59,170, 54,205,131, 0, 83,159,201, 67,169,236, 50,170,137,103,
- 73,194,146,197, 36,236,253,119,201,228,166, 30,133, 35, 29, 29, 27,253, 3,101,244,151,106, 58, 58, 58,166,178, 44, 75,140, 70,
- 35,177,183,183, 79,125,129,203,249, 45, 33,228, 91, 66,200,183, 0,190,125, 1,154, 21,199, 51, 19, 12,118,109,154, 74, 9, 77,
-207, 85,201,229,231, 20, 18, 73,166, 66, 34,201, 84,201,229,231, 36, 52,253, 33, 0,229,127, 83, 25,253, 5,154, 22,106,181,250,
-241,218,181,107, 73, 73, 73, 9, 41, 41, 41, 33,107,215,174, 37,106,181,250, 49, 0, 11, 19, 52, 27,170,243, 50, 37, 88, 79, 79,
- 47, 46,209,242, 3,218,247,105,211,252,240,236, 73,163, 33, 28, 90, 75,213,113,197,244, 67,231,246,237, 39,239,220,185, 19, 0,
- 48,126,232, 80,188,214,177, 35, 44, 45,204, 33,151,151, 46, 14, 69, 40,200,164, 50, 12,155,243, 65,125,126,254,235, 97,195,134,
-141, 59,116,232,144, 5, 0,108,218,180, 9, 35, 70,140,128,157,157, 29, 84, 42, 21,100, 50, 25,164, 82,105,149,121, 93, 48, 12,
-227,158,146,146,226,168, 84, 42, 43, 82, 54, 65, 16,170, 76,132,144,242,244, 13, 28,199,161, 69,139, 22,245,221, 92,159, 20, 20,
- 20,244,208,104, 52, 21, 26,213, 77, 77,154, 52, 1,128, 51,245, 17,252,234,203,165, 16, 56, 13, 36, 18,128,227, 0,189,145,134,
- 64,170, 53, 55,152, 57,115,102,197,114, 55,132,193,131,131, 40,138,162, 14,221,190,125,251,112,102,102,102, 99, 65,224,167, 54,
- 48,233,122,231,225,195,135, 22, 0,224,237,237, 61, 19,192, 97, 83,150, 67, 34,145,184,223,191,127,223, 81,161, 80,212,152, 92,
- 86, 74, 48, 97, 52, 26,209,174, 93, 59,206,148,223,112, 2, 60,115,105,122,106,219, 87, 94,153,182,104,216, 48,229, 31,127,252,
-161,164,105, 26, 28,199,225,155,111,190,225, 8, 33, 54,254,128, 85, 36, 80, 88,139,204,124, 0,147,202, 78, 6,219, 1,124, 83,
-197, 45, 16,180,209,178,138,160,184,226, 97, 29, 3, 27,125,140,200,136,176,142, 77, 45,142,194, 82,162,143, 5,254,222, 84,203,
-202,202,106,232,154, 53,107,212,219,183,111, 47,124,240,224,129,113,243,230,205,234,233,211,167, 91, 26,141, 70,204,152, 49, 35,
-203,199,199, 71,182,102,205, 26,245,145, 35, 71,250,104, 52,154,141, 38,149, 23,133,165, 99,134,190, 6, 29, 75,131,101, 57,181,
-139,218,114,247,236,137,189,164,132, 24,176,235,216,109,176,156,240,163,137, 73, 86,231,145, 35, 71, 54,221,187,119,175, 36, 58,
- 58, 90,226,235,235, 11, 65, 16,192,243, 60, 88,150, 5, 0, 8,130,128,230,205,155, 63,247,118,153, 12,120, 59, 56,217,157,235,
- 60,104,160,153,139, 82, 1,187,188, 44, 76,145, 73, 44,119,168,244,123, 0,116,121,169,146, 93, 66, 32,145, 72,144,148,148, 4,
- 71, 71, 71, 51, 65, 16,210, 0, 44,206,203,203,219,138,151,151,142,114,137,228,240,174, 31,215, 57, 7,118,233,194, 56,185, 56,
- 34,230, 97, 34, 36, 20,223,247,254,205,219,189, 38,191, 61,119,182,129,227, 94, 7,240,199,203,182,226,206, 93,102, 14,167,104,
-102, 19, 69, 4,124,177,254,120,209,242,175,215,170,102, 76,157,200,204,153, 51, 7, 30, 30, 30,141,135, 15, 31,254, 53,128,183,
-235,212, 9,156, 57, 28, 12,189, 9,132, 96,209,247,199,139,150,125,189, 86,245,118, 3,116,254,229,212,248, 31,121,110,163,229,
- 7, 52,109,233,225,120,118,249,188,183,165,228,215,159,232,146,156,204, 26, 63,171, 86,171,183, 12, 24, 48, 96,252,142, 29,127,
-166,209,157, 3, 2, 48,188, 79, 55, 56,218, 91, 67,101, 46, 47, 61, 29, 9, 20,238, 61,120, 82, 47, 67,224,225,225, 49,227,240,
-225,195, 22,149,205,132, 76, 38,171,152, 42,155,172,242,169,252, 4, 92, 27, 74,165, 18, 33, 33, 33,144, 72, 36, 96, 24, 6, 18,
-137,164, 98,170,252,156, 97, 24, 56, 57,153,212,116,105,133,181,181,117,235,162,162, 34,171,252,252,124,120,122,122, 22, 2,184,
- 95,233,253,214, 89, 89, 89, 86,166, 8, 10,156, 6,115,166,248, 65,106,184, 1,131,180, 35,180,146,174,184,118, 51, 10,193,103,
- 46, 34, 37, 53, 29,221, 58,181,197,132,177, 35,113,238,220, 57,240,188,201, 53, 29, 25,132,224,235, 33, 67,130, 62, 6, 40,170,
-111,223,190,249,179,102,205,162,163,163,163,199, 13, 31, 62, 44,224,225,195, 71,101,169, 34, 53,143, 16,172, 3,144, 81, 79, 93,
- 57, 0, 92,186,116, 9, 0, 20, 13,217,247, 20, 10, 5,174, 95,191,142,242,106, 98,154,166, 65,211, 52, 24,134,193,137, 71, 14,
-208, 24,104,148,100,132,227,221, 32, 79, 52,105,210, 4, 52, 93,119,147,196, 94,128,242, 26, 48,156,146, 74,231,184,184,186, 54,
-238,217,180,169, 42, 36, 36,132, 1, 0, 47, 47, 47,146,150,150,150,127,236,216,177, 34, 9,176,201,139,144,157,181,153, 44, 15,
- 15,143,174, 41, 41, 41, 95,149,111,115,138,162,190,110,212,168,209,194,138,114, 19, 4, 44,254, 81, 35,157, 61,251,125, 89, 96,
-175,207, 0, 0,129, 67,246,162, 48,110,185, 31,149, 59,223,250,239, 62, 74, 20, 22, 22,238,111,222,188, 57,147,147,147,115, 13,
- 64, 2,203,178,159,236,222,189,219,113,202,148, 41,153,123,246,236, 89, 1,192,117,229,202,149,189, 52, 26,205, 1, 83,116,187,
-181,198,160, 87, 90, 7,116,242,244,240,192,197,107,127, 64, 38,151,218,204,156, 20, 4, 11, 11, 9,190,221,126, 82, 72, 72,206,
-157,117,229, 62,118,154, 96,178, 58,142, 28, 57,178,241,222,189,123,229, 0,112,255,254,125,164,167,167, 67,173, 86,195,204,204,
- 12, 82,169, 20, 12,195, 64, 42,149,190, 16,147,101,237, 97, 31,122,244,232, 49, 51, 59, 59, 27,172,255, 96, 54, 38,100,102,192,
-198,210, 2,108,177,166,241, 75,118,162,240,238,222,189,187,146,231,121,104, 52, 26, 92,184,112,193,218,204,204,204,218,221,221,
-125, 17, 76,232, 61,165, 84, 42, 51,116, 58,157, 99,217,227, 76,157, 78,231, 4,160, 80,161, 80,148, 31,167,139,203,230,245,173,
- 78, 76,192,179,213,132,137, 20, 69, 85,126,173,161,116,232,216,161,117,200,145, 67, 63, 91, 20, 20,165,195,198, 54, 19, 52, 10,
-176,117,235, 6,152,153, 89, 97,209,162,249,146, 39,125,251,184,245, 31,244,122, 72, 68, 84, 76,223,151,206,108, 17,106,107,223,
- 33,227,237,204, 84,150,101,231, 18, 22, 59,182,205, 6, 77,211, 88,184,112, 33, 90,182,108, 57, 45, 34, 34,226, 51, 0,185,181,
-203, 96,107,171, 30,111,216,201,149,165, 69, 44,240, 44, 54,239,251,176, 84,231,211,233, 24, 51,164,201,180,143, 70, 62, 62,221,
-178, 41,138,202, 46,204,181, 82, 26,137, 84, 32, 42, 12, 67,112,112,112,207,160,160,160,139, 53, 61,255, 23,224,130, 63,199,207,
-170, 98,190, 36,193,193,193, 36, 40, 40,136,170,180,114, 85,158,215, 70, 27,192,193,214, 90, 21,178,105,241,108, 11,201,141,147,
-140, 54,241, 17, 82,117, 85, 78,228, 85,186,104,170, 84,170,241, 59,118,236,168, 18, 41,121, 58, 57, 66, 38,147, 66, 42,163, 96,
-211,189,116,244,250,252,203,193,160,168, 26, 77, 86, 21, 77,141, 70,163,187,123,247,174,197,246,237,219,225,232,232,136,198,141,
- 27, 67,165, 82, 65,169, 84, 86, 49, 87,149, 13, 87, 53, 70,171,138,102,249,251, 18,137, 4, 52, 77,227,220,185,115,224, 56, 14,
- 35, 71,142,124,198,100, 73, 36,146,154,140, 91, 77,221, 83,207, 0,184, 79, 8,233, 81,118, 2,190, 15,160,103,165,247,251,171,
-213,234, 79, 0,172,168,175, 38,195, 16, 48,186,107, 16,220,215, 66,146, 52, 27, 6,105, 27,156,191,114, 27, 59,182,172, 1, 0,
- 52,246,237,128, 81,195,131, 42,210,184,122, 46,103, 5,110,110,110,251,178,178,178, 7,246,233,211, 7,121,121,121,236,226,197,
-139,209,186,117,107,120,123,123,215,171,140,106,184,114,206,184,127,255,190,135, 86,171, 5, 33,164, 62,230,236, 25, 77,138,162,
-176,123,247,110,232,116,186,103, 62,108,219,115, 25, 62, 28,225,133,183,222,221,137,175, 31, 28,192,198,141, 27,107, 93,119, 21,
-208, 90,103,221,124,157,156,225, 90,175,152,255,142, 98,194,132, 9,204, 91,111,189,133,196,196, 68, 76,153, 50, 69,119,238,220,
- 57, 67,122, 90,218, 49,185, 32,172, 55, 86, 53,198, 53,106, 42, 20,138, 93,103,206,156,193,129, 3,165,190, 36, 38, 38, 6, 45,
- 90,180, 48,175, 98,146,115, 15,162, 40, 97, 61, 66, 79, 68, 35,112,200, 94,132,158, 24, 11, 62,255,164,180,125, 11, 20,152,178,
- 61, 27, 64,117,154, 7,114,114,114, 42, 76,212,158, 61,123,204,246,236,217, 51, 12,192,113, 0, 7, 0, 32, 55, 55,119,181,137,
-154, 0,133,183,222, 24, 49, 12, 18,153, 37,162, 31, 37,163,103,231,118,112,114,116,196,253,168, 88, 36,164,228,102, 80, 20, 38,
-245,239, 34, 95,161,213, 26, 62,187,124, 15, 63,212,161, 73,185,187,187,123, 31, 60,120, 80, 86, 41,129,174,248,143, 51, 12, 83,
-241,188,220,120, 55,100,255, 44, 55, 89,150,238, 22,161, 75, 55,116, 53, 15, 13,219,131, 22, 94,131, 96, 59, 40, 8, 63,156, 61,
-139,135, 17,145, 58, 67, 9,247,234, 63, 80, 70,127,149,166,247,136, 17, 35,174,253,252,243,207, 54, 73, 73, 73,184,116,233, 18,
- 26, 55,110,140,146,146,146,250, 92,240, 86,209,212,233,116,142,229,223,161, 40,202,177, 60,120, 55, 24, 12,229,133, 81,254, 71,
-180,169,244, 57,155, 90, 52, 61, 43,125,174,220, 92,121,189,128,117,151, 43,101,178,131, 71,143,236,179,136,140,190,132,182,109,
- 58,193,194,218, 31, 2,159,142,156,220, 98,228, 61, 74,197,151, 95,126,141, 69,139, 23,224,248, 47,135, 44,124,252,218, 28, 54,
-112, 92,115, 0,186,151,166,220, 41, 50, 45,228,196,158, 77, 20, 17,160,205,136, 86, 72, 53,143, 85,227,199,190,206,140, 30, 61,
- 26,199,143, 31, 71, 68, 68,196,166, 90, 76, 86, 72,165,100,126, 90,248,165, 3,155, 64, 8,180,153,209, 10,153,246,177,106,226,
-184, 81,204,132, 49,175,225,198,239,235,240, 90,219,199,225,174,142, 24,158, 87,102,177, 37, 12,114, 20, 74, 92, 37,161,184, 81,
-201,108, 93, 0, 64, 85, 50, 88, 23,240,103, 27,204,127, 3,131,203,140,213,180,167, 47, 76, 36, 13, 49, 88, 0,208, 2,176,160,
-228,178,208, 29,139,222,113, 85, 37, 70, 72,244,225,215,145,170, 23,200,230,120, 78,104, 7,152,221, 1,180, 79,127,167,164,164,
- 68, 19, 27, 27,107, 54,105,248,112,116, 9, 8,128,139,189, 61,154,187,187,195, 76, 33,135, 92, 38,173,114,201, 90,239, 58, 4,
-138, 34, 62, 62, 62, 24, 50,100, 8,164, 82, 41, 84, 42, 21, 44, 44, 44, 32,151,203,171, 77,179,234,123,149, 75, 8, 1,195, 48,
- 8, 15, 15, 71, 66, 66, 2,108,108,108,112,245,234, 85,188,250,234,171,207,164, 90,149,205,153, 41, 17,125, 53, 39,254,114, 35,
-118,198, 20, 45,158,167, 80, 76,218, 64, 25, 63, 11, 37, 84, 59,232,245, 28,244,122, 61,126,184, 98,196, 31,177, 26, 24,141, 6,
-232,245,250,218,126,179, 38,104, 87, 87,215,241,205,155, 55,159, 57,118,236, 88, 86, 46,151, 67,163,209,160,164,164, 4, 17, 17,
- 17,236,192,129,131,242,135, 12, 9,178, 62,121,242, 36, 41,171, 58,204, 48, 65, 59,199,205,205,205,163,172,122, 54,167, 33,123,
- 53, 69, 81, 21, 38,230,105, 38,173,142,132,132, 41, 45,147, 77,155, 54,129,231,121, 16, 66,106, 44, 36, 29, 69,253,182,120,217,
- 42,235,149,107,127,132,181,157, 19, 46, 94,188,200,159, 62,125,186,136, 2, 98, 30, 70, 68,172,254, 63,224,212, 65,192,104,202,
-242,229,229,229,153, 53,110,220, 24,238,238,238, 16, 4, 1, 44,203, 86,164, 47, 57, 57, 57,208,106,181,176, 51,207, 71, 51,123,
-119,112, 69, 23,144, 22,254, 5, 92, 44,162,177,243,140,129,125,197, 27,247,254, 11, 14, 28, 63,149, 77,207,121,213, 12, 55, 71,
-103, 15,208,132, 69,106,102, 14,134, 13,126, 13,140,204, 2, 79,146,178,209,198,191,169,203,184,255,235,234,194, 80, 28,230,173,
-216, 59, 19, 16,126,168, 75,174,184,184,152,143,142,142,198,253,251,165,126,215,202,202, 10,230,230,230, 85,254,227, 52, 77, 63,
- 87,162, 85,110,178,150,109,122,213,156,150,106, 80,200,135, 96,251,238,219,104,227, 19,132,205,161, 55,117,124, 70,110,223,111,
-117,186,152,125,255,226, 48,195,217,217,121,186, 32, 8,139, 8, 33,249,221,186,117,115,218,187,119,175,109, 74, 74, 10,110,223,
-190,141,133, 11, 23,102,241, 60,207, 17, 66, 40, 66,200, 23, 47,224,231,132, 74, 6,235, 69, 34, 85, 41,241,174,131, 21, 53, 84,
- 66, 91, 53,230, 10,139,159,100, 27,200,177, 18, 78,248, 30, 0, 91,235,193,141,166,255,115,104,255, 38, 87, 7,181,128, 94,234,
- 62, 72,203, 48, 98,217, 7, 19,145,147, 83,132, 31,182, 45, 7, 32,135,145, 99,208,163,215,235,112,116,116,195,180,169,211,156,
- 55,109,217,252, 14, 39, 8,223,226, 37, 33,253,218,198, 95, 0,132,168,213,234,136,119,166, 77, 83, 55,110,252, 38,148, 74, 37,
-246,237,219,135,189,235,215,243,107,129, 81, 10,224,252, 12,224,151, 90,117, 66,255,212,153, 61, 99,134,218,207,111, 6, 20, 10,
- 5,126, 63,253, 19,116,233,187,139, 6,119,129,177, 68,135,193,141,134, 16,187,248, 19, 84,174, 84,138, 71, 0, 32, 85, 34, 13,
-192,211,213, 96,255, 54,131, 85,206, 73,252,217, 46,107, 90,149, 68,171,193,199, 78,169, 60,108,219,251, 99,188,156,160,167, 12,
- 87, 78, 32, 69, 47,240, 43, 31, 26,153, 59, 5,228,195,168,106, 76, 86,217,142, 45,120,122,122,162, 79,251,246, 24,222,189, 59,
- 36, 18, 9,148,114, 25, 44,149,102, 32,124,105,146, 85, 94,117, 88,203, 57, 17,213,165, 79,246,246,246,144,201,100, 21, 6,203,
-132, 52,171, 90, 77, 65, 16, 32,145, 72,112,255,254,125,116,235,214, 13, 30, 30, 30, 56,112,224, 0,250,247,239,255, 76, 85,162,
-169, 38,171,220,104, 61, 85,141,215, 31, 64,121,146,101,146,209,210, 25, 40,100, 27,218,128,162, 2,192,113, 0, 79, 0,189, 78,
- 7, 66, 0, 66, 0,214,104,128, 78,167,171,248,205,250, 84,201, 58, 59, 59,123,154,153,153, 45,249,248,227,121,126,109,218,180,
- 69, 86, 86, 22, 4, 65,128,185,185, 57, 74, 74, 74, 96,101,101,133, 46, 93,186, 60, 89,178,100, 73, 26, 33,152,102,162,201,122,
-110,202,183,249,217,179,103,171, 84, 27,150, 79,154,180,100,188,245,222, 30,200, 37,165, 85, 75,229,109,120,106, 59,238,246,238,
-209, 21,215,238,196,112,255,153,183, 78, 47,205,185,189,194, 89, 16,118, 36, 63,199,122, 17, 66,144,157,157,141,140,140, 12, 12,
- 29, 54, 12,123,127,254, 25,241,241,241,240,247,247, 71,239,222,189,225,232,232,136,248,248,120,252,113, 89, 15,125, 94, 46,114,
- 13,183,161,178, 12,196,209,139,177,250,133,155,140,177,255,224, 1, 99, 40,128,137, 86, 86, 86, 77, 74, 74, 74,210, 56,142, 59,
- 8,224, 32,128, 81, 18,137,100,148, 74,165,114, 41, 44, 44,124,140,210,222, 68,199,234, 18, 51, 83, 42,237, 21, 74, 43, 8,156,
- 30, 18,137, 4, 30, 30,141, 65,120, 3,242, 10,181,152, 52,122, 8,238,220,143,194,233,243, 55, 56,150, 21,190,171,207,102,101,
- 24,134,120,123,123, 35, 51, 51, 19, 82,169, 20,102,102,102,176,176,176,192,167,159,126,138,245,235,215, 87,152,172,134, 26,173,
-201,128,183,149,167,197,141,175, 54,148,154,172,244,212, 52,100, 36, 75,161,182,119,194,119,235,215,106,242,226,211, 3,127, 4,
- 98,254,237, 39, 89, 65, 16,190, 72, 73, 73,113,148, 72, 36,206, 28,199, 33, 41, 41, 9,183,110,221,194,172, 89,179, 50,114,114,
-114,122,161,129,235,168, 84, 42, 51,203,147,172,178,170,195,154,170, 19,243, 43, 37, 89,249,181, 72,214, 84, 77,216,180,177,187,
-229,185,109,107,230,120,118, 8,236, 66,171, 36, 86,121,197,143,210,187, 93,185,116,177,203,172, 53, 63,188,147,144, 87,252, 26,
-128,184,154, 68, 21, 82,233,192, 78, 93,187, 74, 64, 50, 32,145,119,195,215, 43, 71, 35, 43,187, 16,121,185, 69,144,201,204, 97,
- 96, 25,240, 2,133, 46,221,186,227,167,157,251,209,114,234, 20, 70, 46,149,246,227, 12,134,151,198,104,149,177,252,251,239,191,
-247,244,241,241,193,142, 29, 59,112,126,215, 46, 76, 40, 40,192, 69,154,102, 88,169,212,225, 20,203,110, 69, 29, 70,171,178, 78,
-203,150, 45,241,227,143, 63, 98,247,238,221,137,227, 95,205, 60, 60,103, 60, 28,141, 70, 12,184,253, 0,118,141,134, 0,183, 31,
-192,238, 21, 31, 52,231, 36,120, 68, 81, 85,135,131, 10, 14, 14,238, 89,121,254, 47, 35, 13, 53, 84,177, 75, 0,244, 10, 14, 14,
- 38,149,231,117, 30, 56,213, 45,102, 44,127,173,137, 87, 64, 51, 79,138, 61,176, 14, 73, 26,206,240,217, 3,163,252, 97, 49,153,
- 19, 5,172,173,229, 10,130, 48, 12, 3, 75, 51, 51,168,109,108, 74, 99,126,154, 6, 4, 64, 96, 1,138, 47, 53, 0, 68,160, 64,
-120,147, 14, 24,144,203,229,213, 54,124, 55,181,109, 86,101,205,162,162, 34, 60,121,242, 4,211,166, 77,131, 74,165, 42,117,238,
-233,233,240,242,242,130, 68, 34, 65, 74, 74, 10,126,255,253,119, 52,105,210, 4, 10,133,194, 36,183, 85, 41, 93,106,141,210, 94,
-134,173,211,210,210,172, 92, 92, 92, 96,114,162, 37, 16,148,232, 41, 24, 12, 60, 30, 62,124,136,212,212, 84, 60,121,252, 8, 29,
- 52,133, 32, 96, 64, 8, 49, 41,209,114,115,115, 11,104,218,180,233,230, 21, 43, 86,200,220,221,221, 65, 8,129,173,173, 13, 74,
- 74, 74,144,157,157, 3,127,127,127,120,120,120, 96,197,138, 21, 0,176,247,239, 54, 89, 79,237, 83, 21, 70,171,178,225,122,239,
-255, 60,145,155,107, 1,134,161, 43,140,115, 29,109,180,100, 0,208,235,181, 17,146,115,167, 79,153,115,192,146,116,134, 89, 34,
-169,187, 28, 89, 94, 16, 84, 53,189,159,148,148, 4,169, 84,138, 67, 7, 15, 34, 55, 35, 3,109,218,180, 65,199,142, 29,241,232,
-209, 35,220,185,115, 7,246,246,246, 80,187,119,198,197,199, 70, 68,166,106, 97,109,109,141,216,100,250,159, 28, 50, 96,106,223,
-190,125, 23,174, 94,189,218,209,217,217, 89,154,149,149,229,179, 97,195,134, 54, 27, 54,108,152,253,206, 59,239, 56,189,243,206,
- 59,182,106,181, 90,146,158,158,238,253,193, 7, 31,188, 18, 18, 18,210, 4,192,170,218, 4,205,205, 45,237, 24,153, 57, 40, 74,
- 2, 27,107, 91, 72,228,230, 16, 56, 9,120, 1,176,178, 86,227,218,157, 67,184, 26, 86, 52, 61, 51, 7, 7,235,149,143,149,149,
-187,189,189,253, 51, 73,245,172, 89,179,176,109,219,182,138,106,196,134,154,172,101, 27, 94,181,160,202, 76, 86,122,146, 4,148,
-190, 9, 78,252,114, 61, 63, 47, 62,189,219,203, 96,178,202,143,113,132, 16, 60,126,252, 24, 37, 37, 37,184,124,249, 50,190,248,
-226,139,172,167, 77,150,163,163,227, 84, 43, 43,171,197,197,197,197, 95,167,167,167,175,171,243,194,175,212, 68,149, 63, 46,159,
- 87, 91,157, 88,207, 69,245,170, 46,201,242,112, 81,158,185,115,121,143,151, 53,185, 71, 33, 97, 26,240,176, 48,194, 50,212,177,
-199,160, 14,131,233,118, 27,151, 54,234, 56,253,211, 51, 73,133, 58,159,154,146, 45,129,231,219,153, 91, 88, 2,200,196,237, 91,
- 23, 42, 76, 86, 78,110, 1,244, 70, 6,122, 3, 5,157,145, 70,159,190, 3,176,126,243,110,164,100,230,130,231,249, 86, 47,153,
-201,178, 11, 8, 8,152, 49,106,212, 40, 44, 89,178, 4, 33,171, 87, 27,222,166,168, 66, 9, 64, 78,242, 60, 4, 66, 40,186,126,
-141,216,171,232,124,251,237,183,191, 0, 24,179, 98, 22, 58,231, 21, 99,146,235, 16, 98,215,104, 72,233, 7, 71,126, 76, 0,192,
- 46, 43,164,234, 41, 51, 40, 40,136, 42,175, 89, 51,181,134,237,191, 29, 73, 80, 80,208,197,224,224, 96, 84,158,215,246, 5, 75,
- 39,159, 65, 31,205,157,185,178, 67,255,238, 84,218,220,126,200, 45,212,113,243, 35,141,242,100,109,237, 38,171, 50, 31,109,216,
-128, 59, 49,165,255, 99,119, 71, 71,204, 27, 55, 14,132, 3,174, 70, 68, 98,127, 72, 8, 70,247,237, 11,115,165,178,222,201,134,
- 32, 8,213,166, 88,149,211, 44, 83, 83,167,252,252,124, 28, 60,120, 16, 29, 59,118,132, 74,165,130, 68, 34, 65,235,214,173, 17,
- 21, 21,133,166, 77,155,130,162, 40, 28, 61,122, 20,195,135, 15, 71, 92, 92, 28, 58,119,238,108,145,144,144, 96,178,209,138,140,
-140,180, 34,132,244, 40, 79, 63, 26,138, 94,175, 71,116,116, 52,134, 12, 25, 2, 91, 91, 91,184,185,237, 69,200,153, 61, 80, 5,
- 76, 0, 69,193, 36,163,197,243,252,228,193,131, 7,203, 40,138,130, 86, 91, 2,165,210, 12,230,230, 22,176,180,180,130,183,183,
- 15, 82, 83, 83,209,191,127,127, 67,108,108,236,198,180,180,180, 3,166, 46,171,159,159,159,121,124,124,252,132, 70,141, 26,201,
- 1,192,204,204,204,191,105,211,166, 31,198,197,197, 21,153,154,106,149, 27, 44,138,162,192, 48, 76,133,209,146,208, 52, 92,156,
- 29, 43,158,151,181, 79,163,106,209, 42, 76,201,209, 43, 0,192,211,211, 19,235,183, 28,167, 7, 15, 30,140,217,179,103,131,101,
- 89,108,220, 88,218,201,110,236,216,177, 48, 26,141, 56,124,184,180,147,164, 68, 34,169, 53, 54,185,117,235, 22,110,223,190, 13,
-150,101, 81, 80, 80,128, 95,127,253, 21, 23, 47, 93,194,190,163,191, 33,254,241, 35,180,246,241,194,148, 41,147, 33,149, 74,177,
-115,231, 78,116,235,214,237, 31, 61, 32, 72,165,210,241,219,182,109,115,217,177, 99, 71,254,209,163, 71, 53,157, 58,117, 82,172,
- 93,187,214,113,253,250,245,106,131,193,128,247,223,127, 63,243,198,141, 27,250, 97,195,134,153,111,221,186,213,165, 89,179,102,
-253, 56,142,171,206,104,153, 3, 24, 13,224,205,188, 34,131, 36,191, 72, 11,129, 51,224,113,252, 19, 20, 20, 27, 32,240, 70, 36,
- 38,167,162, 88,199, 35, 39,183, 8,173,219,189,246,253,133, 11, 23, 22, 24,141,198,249, 0,130,235, 90,206,136,136, 8,220,184,
-113, 3,241,241,241,120,252,248,113, 85,167, 56,117, 42,118,239,222,109,114,162, 85,189,201, 98, 64,233,155, 34,248,104,104,126,
-230,163,180,151,198,100,149, 29,131, 22,185,184,184, 44,114,113,113, 81,158, 61,123,214,186, 81,163, 70,224, 56,206,240,116,146,
-213,171, 87,175,207,182,109,219,230,210,180,105,211, 89, 0,214,253, 55, 44, 59, 77, 99,234,215,155,102, 56, 88,202, 19, 83,241,
-112, 85,217, 88,130, 12, 80, 82, 8, 92,248, 25,146,174,159, 63,153, 53,236, 99,219, 79,118, 44,153, 42, 64,168,177,135,108,108,
- 92, 18, 54,109, 90,143, 57,239, 79,194, 79, 63,124, 13, 65,144, 64,207, 50,240,108,220, 9,122,163, 0,138,150,160, 77,187,246,
- 56,127,225, 50,164, 52,112,112,199,166,151,204,103, 33, 55, 60, 60,124,227,209,163, 71,223,157, 61,123, 54, 4, 65,144, 47,222,
-180, 73,155,149,149,181, 28,166,141,127,245,180,206,240, 77,155, 54,197,124,178, 62,235,151, 57,227,193,196,159,160,114,111, 63,
-128,221,200,143, 9, 14,173,164,240,138, 15,114, 85,213,159,226, 47, 61, 53,127, 57,140, 86,185,147,172, 60,175,142,118, 45,154,
- 44,181,182,179,157, 76, 91,186, 57,204,155,253,182, 36, 46, 93,135,195,141,198, 21,255,190,235, 59,243,116, 78,241,125, 44,116,
-107, 77,249,225,253,191,255, 94,241,248,155,189,123,171,125, 47,109,228,200,122, 95,153,213,148, 98,153,154,100, 1,128, 74,165,
-178,233,215,175, 31, 94,125,245, 85,188,254,250,235, 21,109,178,218,182,109,139,125,251,246, 97,196,136, 17,184,123,247, 46, 92,
- 92, 92,224,235,235, 11, 95, 95, 95,156, 58,117,202,212,131, 28,120,158, 71, 64, 64, 64,121,175,195,214,201,201,201, 86, 13, 45,
- 72,189, 94,143,156,156, 28,216,217,217, 65, 46,151, 35, 48,176, 35,222,125, 47, 16, 14, 46, 63, 34,192,207, 7, 26,141,166,162,
-251,123, 61, 78,182, 1,205,155, 55, 71, 86, 86, 22,178,178,178,160, 86,171,225,234,234, 10,103,103,103,172, 90,181,138,172, 91,
-183,238,180,209,104,220,152,157,157,109,114,146,229,236,236,220,157,162,168,207,180, 90,173,188,210, 21,174, 92,173, 86, 31,211,
-106,181,203,211,210,210,234,221, 16,148,162, 40, 24,141, 70, 80, 20,133,147,143, 93,161, 49, 80, 40, 76,190,141,217,255,231, 85,
-197,120, 73,165,210, 58,171, 75, 9, 33,154, 49, 99,198, 56,122,120,184, 35, 41, 54, 2,135, 14, 17,172, 94,189,186,188, 87, 36,
- 98,202, 46, 12,202,159,247,238,221, 27,141, 27, 55, 6, 49, 97,172, 12, 65, 16,112,255,254,125,236, 61,118, 17, 46, 94,126, 72,
-124, 24,141, 59,167, 78,160,145,218, 14, 45,219,181, 7,203,178,207, 53,244,198,139,128,101,217,237, 45, 90,180, 32, 6,131,225,
- 34,128,245, 97, 97, 97,147,210,210,210,222, 63,126,252,184,235,168, 81,163, 82, 79,156, 56,177, 22,192,142,176,176,176, 25, 95,
-126,249,229,171, 28,199, 85,219, 91,144, 97,152,159, 62,248,224,131, 94,163, 70,141,162,100, 52,107, 56,123,102,167,132,227, 88,
-234,163,249,219,249, 11, 87, 46,210, 28,199, 82,175,143,249, 64, 56,245,123, 24, 61,253,189,111,248,182,157, 6, 35, 60, 60,220,
- 57, 40, 40,232, 75,150,101,107, 53, 90,229, 73, 85, 77, 9, 37,195, 48,152, 52,105, 18,246,237,171,127, 11,170, 41, 64, 83, 43,
- 47,139, 27,203, 54,244,181,160, 36,197,149, 76, 86, 51, 4, 31, 13,205,207,120,152,250, 82,153, 44, 0,200,201,201,217, 2, 96,
-139, 32, 8, 25,230,230,230, 40, 42, 42,170,110,255, 83,134,133,133, 41,229,114, 57, 94,123,237, 53,187,144,144,144, 24,154,166,
-215,165,166,166,214,232, 56,170,171, 38,172,174, 58, 17,207,209,235,208, 86,141,160,192,238,237, 44, 31, 88, 47,177, 84, 74,116,
-119, 27,197, 40,173, 40, 0, 5,122,167,199,215, 18, 70, 23, 82,153,138,182,237,123,191, 2, 43,137,121, 80, 62, 87, 84,173,209,
-162, 25,230, 78, 65, 94,254,192,194, 34, 3,174, 92, 13,199,152,209,205,161, 55, 82, 16, 4, 26,197, 26, 61,192, 72, 65, 3, 24,
- 59,110, 34, 8, 37, 65,110, 70, 42, 24,134, 9, 3,199,225, 37,227,211, 25, 51,102, 12,156, 63,127,126,147,121,243,230, 97,222,
-188,121, 94,219,182,109,219,178,108,217,178,121, 89, 89, 89,173, 80,199,224,227,181,232, 52, 58,177,239,243,185,199, 46,111, 46,
- 24,220, 69,251,240, 21,159,210,228,235, 21, 31,228, 74,165,120, 36, 97,144, 67, 72,213,102, 70, 65, 65, 65, 61, 43,207,255,101,
- 60,221, 8,190,226,121,189,218,104, 53,111,226, 54,160, 93,219,128,247, 22,204, 95, 96, 25,117,237, 2, 62, 89,186,158,180,104,
-223,175,104,203,229, 59,134, 98,243,198, 3,139,179, 31, 93,173,175,191, 0,128, 1,125, 70,160,181,127,199,103,222,236,214,187,
-116,176,246, 43,231,111, 33, 35, 43,165,222, 39,219, 50,115, 80,109,155,172,250,116,233,127, 26,173, 86,155, 31, 30, 30,238,152,
-156,156, 92,165,225,123,227,198,141, 65, 81, 20, 66, 67, 67,113,227,198, 13,140, 25, 51, 6, 18,137, 4, 82,169, 20, 23, 47, 94,
- 52, 41,141,169,148, 46,149,247, 58,236,239,238,238, 94, 83,111,195, 58,181,180, 90, 45, 10, 10, 10,112,230,204, 25, 52,111,222,
- 28,203,150, 45,131,171,139, 19, 22, 44,152, 11, 65, 16, 80, 88, 88, 8,158,231,235,155,104, 9,229,105,145, 32, 8,200,202,202,
- 66,147, 38, 77,176, 97,195, 6,172, 93,187,246,203,180,180,180,227,166, 46,163,135,135,135, 13,207,243, 31, 13, 30, 60,184,223,
-176, 97,195,208,191,127,213,241, 88,127,254,249,103,203,195,135, 15, 47,255,238,187,239, 6, 24,141,198, 21,153,153,153, 89,245,
-209,253,241,199,210,225,151, 84,157, 22,225,147, 81,141,240,230,204,157, 88,181,234, 8, 20, 10, 69,149, 19,239,146, 37, 75,106,
- 53, 49, 2, 33, 45,100,217,215, 82,231,126,252,173,227,242,229, 33, 8, 9,201, 4, 77,211,112,113,113, 1, 77,211,120,242,228,
- 9,104,154,134,151,151, 23,104,154, 70, 74, 74, 74,121,155,192, 60, 84,211,235,177,250,171,112, 26, 58,157, 14, 73,137,241, 72,
-142,141,129, 69, 97, 58,212, 86, 42,228, 69,220, 71,235, 41, 83, 43,198,127,250,135,217,109, 48, 24,118, 87,122,254,237,137, 19,
- 39, 12, 20, 69,189,142,210,118, 26,229,137,198,151, 28,199,125, 89,147, 72,167, 78,157,218,206,159, 63, 95, 90, 62,220,134,171,
-231, 87,156,209,104, 20, 0,192,167,117,143, 42,110,255,209,163, 71, 88,181,106, 21, 52, 26, 13,100, 50,153,172, 62,219, 65, 16,
-132,138, 30,134,213,153, 48, 83, 76, 22, 0,216,123,185,127, 31,122,251, 34,127, 47,118,179, 54,236,193,175,102,105,137, 52,104,
-195,203,107,178,158, 78,182,220,221,221, 23, 9,130, 64, 8, 33,159, 87,122, 75,225,233,233,121,249,236,217,179,246, 28,199,225,
-187,239,190,179, 73, 79, 79,183,233,209,163,199, 39, 0,106, 52, 90,213, 85, 19, 86, 87,157,136, 74,189, 14, 21, 10,133,157,193,
- 80, 99,120,242, 76,175, 67,158,135,183,149,165, 13,242,144, 12,189, 3,219, 54,223,158,203, 61,151, 54,245,174,107, 66, 59,127,
-115,158,109, 66, 23, 26,224,166,178,129, 64, 72,141, 93,163,245, 44,251,235,221,219,119, 94,243,244,104,206, 28, 15,190,132,161,
-195, 71, 65,175,167,161, 99, 41, 80,140, 20, 20, 35, 67,171,214,237,224,219,178, 53, 8,128, 91,127, 92,227, 12, 44,123,238,101,
- 42,123,151,174,239,142,161, 40,172, 3, 17, 72, 53,227,104, 53, 25, 62,124,248,114, 0,239,213,165,227,216,233,221, 49, 52, 93,
-170, 83,121, 28,173, 15,222,157,129,136, 63,164,214,151,110,175,148,245,239,132,147, 89, 33, 20, 84,202, 63,123, 29, 74,233,231,
- 26,154,227,223, 98,184,234, 54, 90, 30, 30, 30, 54, 86, 10,229,143,239, 76,153,108,153,112,239, 58,210, 35, 67,113,245, 82, 76,
-222,254,195, 71,114, 53, 57,153, 83, 76, 48, 89, 21,213,124,246,206,141,208,216,239, 89,163,165,180, 80, 3, 0, 26,251,117, 4,
- 99,110,218, 48, 66,213,165, 89, 13, 49, 89,149, 15,216,213,141,161, 53,125,250,116,108,219,182, 13, 93,187,118, 69,139, 22, 45,
- 42, 14,246,166,166,102,213,164, 75, 38,247, 54,172, 76, 81, 81, 17,188,188,188,176,117,235, 86,132,133,133,193,210,210, 18, 99,
-198,140, 65, 81, 81, 81,133,193,170,111, 99,120, 66,200,163,179,103,207,118,120,227,141, 55,136, 84, 42,165,242,243,243, 97, 99,
- 99,131, 13, 27, 54,104,210,210,210, 78,101,142,174, 25, 0, 0, 32, 0, 73, 68, 65, 84, 54,192,100,141,146,201,100,115, 71,143,
- 30,205,248,248,248, 32, 35, 35, 3, 86, 86, 86, 44, 69, 81, 82, 0,176,177,177, 97,205,204,204, 48, 99,198, 12,180,105,211,166,
-251,188,121,243,186, 74, 36,146, 13,169,169,169, 59,107,219,151, 40,138,170, 56,161, 78, 89, 23, 13,131,161,244, 4,189,113,227,
- 70,148,181,117,251,179,138, 32, 54, 22,168, 71, 79, 22, 11, 11, 11,180,104,209,162,218,178,239,222,189, 59,110,221,186, 85, 90,
- 53, 41,145,192,209,209, 17, 87,175, 94,173, 87, 79,170,242,129, 32,195,195,195,225,215,216, 1, 97, 33,103,225,160,146,162,141,
-171, 51,220,187,247, 68, 76, 76,204, 63,153,102, 81, 40,109,135,209,183,108, 31,220, 14, 96,122,165,231, 27, 0,124,111,138, 32,
-199,113,132,166,105, 42, 41, 41,201,168, 82,169, 40, 59, 59, 59,137, 66,161,128, 94,175,175, 48, 92,143, 30, 61, 66,112,112, 48,
-146,147,147, 97,103,103, 71, 91, 91, 91,195,104, 52,230,213, 71,223,219,219, 27,206,206,206, 85, 26,190, 79,153, 50,165, 65, 38,
-107, 18, 16,176,237,171, 21,141, 20, 52, 99,237,231, 48, 0,143,163,159,232,104, 3,148,255, 11, 38, 11, 0,242,243,243,183, 0,
-216, 82,254,220,193,193,225, 45,134, 97, 22,232,245,122,235,139, 23, 47,218,168,213,106,106,231,206,157,236,231,159,127,158,207,
- 48, 76, 30, 69, 81,107,254,121,115,136,200,236,130, 88, 47,169,173,171,112, 79, 71,174,189,159,244,137,111,158,180,185,154,106,
- 25,128,225,153, 81, 87,222,226, 98,187,100,164,165,211, 4, 66,100, 45,199,224,237,159,204, 95,242, 81, 76,244, 29, 79,165,149,
- 18,211,103,204,199,201,211,231, 65,209, 82, 92,190, 22, 10,131,145, 71,118,110, 1, 70,143, 29, 15,119, 23, 7, 68,222, 56,147,
-197, 9,194,134,151,203,100, 11,235, 95, 27,250,150,173,194, 76, 85,182, 77,120,236,254, 97, 46,104,122, 29, 22, 46, 92,136,128,
-128,128,153,225,225,225, 95,160,142,113,180, 40, 74, 88,223,170,231, 88, 91,153,162, 84,135, 8, 60,182, 30,252,164,108, 28,173,
- 57,216,176,229,112,171,150,141, 31, 47,174,109, 28,173,151,200,100, 85,158,215,110,180,188,188,188, 20,230, 82, 76,147, 50,146,
-121,239,140, 27,166,206,140,141, 64,114,212,157,210,234, 5,163,214,152,254, 48,170, 62, 67,161,247, 69,213,241, 59, 72,109, 85,
- 87, 58, 93,189,174,232,171,104,150,159,112,159, 78,179, 76, 52, 89,207,104, 86, 54, 91,149,199,205,242,240,240,192,242,229,203,
-235, 51,142,214,211,235, 94, 78,127,148, 54,128,175,220, 24,190,127, 61, 77, 86,181,154,106,181, 26, 57, 57,165, 35, 36,244,234,
-213, 11,189,122,253,217,159,193,104, 52, 86,164, 88,150,150,150,213, 37, 90,207,104,154,153,153,125,114,228,200,145,201,215,174,
- 93,123,227,195, 15, 63,148,190,250,234,171,229,102,174, 4,245,187,183, 91, 21, 77,158,231,103,156, 57,115,134, 17, 4, 1, 91,
-183,110,197,173, 91,183,136, 74,165,250, 76,165, 82,173, 55, 51, 51,227,181, 90,237,244,169, 83,167,142, 95,188,120, 49,221,189,
-123,119, 92,191,126,157,110,210,164,201, 68,160,202, 32,150,213,174,123,104,104, 40,104,154, 6,151,155,136,153,159,236,135,185,
-153, 4,209,209,209,200,205,205,125,102, 16,211,250,108,207,202, 73, 73,249,212,189,123,247,138,106,200,192,192, 64, 48, 12,131,
-187,119,239,214, 84, 13, 91, 89,147,216,219,219, 87,236, 31, 50,153, 12,231,207,159,199,210,165, 75,225,105,103,131,188,168, 48,
- 56,247,234,131,126,147,167, 98,204,152, 49, 96, 24, 6,118,118,118, 21,201,111, 61,246,165,231,161,178,230,100, 63, 63,191,137,
-145,145,145,238,173, 90,181,114, 9, 15, 15,239, 29, 16, 16,224, 21, 22, 22, 86,254, 92,129,250,181,205,169,208,188,121,243,230,
-161,245,235,215,207,152, 52,105,146, 76, 16, 4, 62, 33, 33,129, 5, 64, 57, 59, 59, 51, 55,111,222, 20,142, 31, 63, 14,173, 86,
- 11,119,119,119,218,205,205,141, 58,119,238,156, 16, 21, 21, 21, 74, 8,153, 95,159,117,231,121,190,202, 48, 14,229,143,127,254,
-249,103,147,255,239,141,124,189,151,189,218,195,199, 35, 59,245, 46,210, 82, 98,193, 23,168,141,193, 71, 79,232, 77, 52, 89,127,
-117, 25,253,157,154, 75, 30, 62,124,232,166,215,235, 33,151,203,177,113,227, 70,227,242,229,203, 35,179,179,179,187,161,250, 30,
-229, 85, 52, 27,216,235, 48,183, 22,205,103,122, 29, 22,228,224,228,209, 99, 55, 59, 88, 12,223,142,153,169, 89, 21, 13, 27, 9,
- 69,217, 29,113,242,239,166,234,216, 42,133, 62,181,136, 46,226, 75, 78,214,178,238, 6,173,193, 48,106,248,136,177,191,237,219,
-183,215,226,243, 69,139,112, 53, 52, 12, 57,249,197, 16, 8, 3,129,162,176, 96,193,231,112,118,176, 67, 97,234,195, 18,189,209,
- 56, 28, 85,199,208,250,215,151, 59, 69,209,179,206, 29,223,185,142,166, 32,104, 50, 30, 40,152,162, 88,213,155, 99,134, 75, 70,
-141, 26,133, 35, 71,142, 32, 60, 60,124,115, 45, 38,171, 66,147, 16,122, 86,216,197,253,235, 40, 64,208,102, 61, 80, 72,138, 31,
-171, 38,142, 27, 46, 25, 51,102, 12,126, 9,190,134,125, 39, 30,111,218,119, 2, 39,240,114, 99,250,200,240,150, 18,132,119,243,
-111,234,214,189, 93, 75,165,132,215, 34, 57, 42, 22,185, 26, 29,206, 69, 36,228,211,132,110,240,216, 58,165, 7, 72, 25, 18, 19,
- 31, 86,115,101,165, 44, 59,161,235, 76,210,164,105,186, 74,154,245, 60, 73, 86,229,229,116,114,114,170,114, 59,151,202, 39,238,
-242, 54, 64, 13, 24,218,225,147,196,196, 68,171,196,196, 68, 16, 66, 16, 26, 26,106, 21, 24, 24,248,201,243,164, 89,115,231,206,
-173, 72,173,158,158, 87,247, 90, 93,148, 53, 74, 95,203,178,236,193,121,243,230,205, 12, 12, 12,124,109,209,162, 69, 20, 76,184,
- 1,239, 83,105, 14, 39, 8, 2, 46, 92,184,128, 35, 71,142,240, 70,163,113, 90, 90, 90, 90, 88,165,143,124,119,251,246,237,115,
- 35, 70,140,216,249,224,193, 3, 38, 50, 50, 18,132,212,221,239, 84,171,213,162, 69,139, 22,224, 56, 14, 43,103,122,160,168,168,
- 21, 56,142, 3,207,243, 48, 55, 55,175, 72,241, 42,155,231,186,246, 35,158,231,159, 49, 90,161,161,161, 96, 24, 6,221,186,117,
-195,157, 59,119, 42, 18,173,186, 18, 40,163,209,152,232,228,228,228,180,100,201,146,138,229,202,202,202,194,217,179,103,209,169,
-115, 23,248, 79,155,142,212,212, 84,172, 89,179, 6,174,174,174, 88,182,108, 25,114,115,115,193,113,220,223, 29,167, 15,140,140,
-140,116, 31, 55,110, 92,102, 88, 88,152,123,112,112,176, 77, 80, 80,144,249,216,255,103,239,186,195,154,200,218,239,153, 76, 26,
- 36,161,119, 1, 21, 81, 96, 81,172,168,235,138,139, 29,187,107,175,107,239, 13, 59,174,186,150,181,174,186,186,186,246,142,189,
-187, 98, 23,197,134, 93, 20, 20, 65,165, 9, 33,244, 80,210,147,201,204,239, 15,202, 15,149, 18,208, 45,223,247,229, 60, 79,158,
- 36, 51,147,147, 59,247,206,220,123,230,125,239,125,223, 33, 67, 50, 34, 35, 35, 93, 8,130,248, 14, 85,156, 4, 77,211,244,130,
-133, 11, 23, 94, 89,181,106, 85,208,244,233,211, 91,142, 28, 57,146,195,225,112,104,177, 88, 76, 29, 61,122,148,240,240,240, 96,
-113,185, 92,226,234,213,171,244,227,199,143, 31, 82, 20,181, 22,192,221,170, 88,156, 75,139, 44,146, 36, 13, 21, 89, 31, 33,208,
-158, 63,194,140,149,233,247,199,182,213, 44, 47, 55, 23,109,240,209,107,201,119, 31,188,141, 35,213, 84,224,190, 10, 66, 3,252,
- 55,131, 36,201, 19,222,222,222,163,166, 78,157,106, 26, 16, 16,192, 95,186,116,105, 94, 65, 65, 65,121, 34,171,140, 7,230,191,
-101,213,225,222, 5,115, 66, 2,103, 53, 28,229, 62,214,177, 54,110,200, 51, 32,101,147, 44,115, 75, 22,154,214, 34, 81,144,245,
-206,238, 66,232,129, 4, 0,149,197,101,123,242,236,101, 84,199, 6, 13,155,156, 94,187,106,173,253,162,249,243, 56,167, 67, 46,
-131,161,180,120,116,251, 54, 68, 92, 61, 19,253,236, 70,186, 90,171,249, 1,255,133, 41,120, 36,247,183, 28, 3,112,222,218,218,
-250,197,232,145, 35, 61,188,189,135, 64, 32, 16,224,212,169, 83, 56,180,121,179,126, 19, 48,144, 15, 60,159, 88, 73, 60,189,140,
-135, 37, 60, 17,227, 70,143,246,108,218,116, 44, 4, 2, 1, 78,158, 60,137,131,155, 54, 25,204,243, 31,142,226,200,240, 23,241,
-255, 17,226, 43,153,163,197, 34, 10, 30,190, 77,146, 61,122,155, 36, 3,205, 48, 52,195,168, 89, 44, 36,203,181,218, 85,111,227,
-197,213, 18, 5,197,174,195, 21, 43,167,126, 61,159, 71, 41,241, 83,221, 37,221,101,136,172,148,210, 57,210, 74, 15,210,229,125,
-214,233,116, 41, 6,210,175,169, 89,179,230,103,219,170,111,250,101,170, 36,178, 12,141,163, 5, 0,217,217,217, 18, 0,139, 30,
- 60,120,112,164,115,231,206,227, 0,136,171,217, 70,187,252,253,253,199, 3, 32, 9,130,216,145,154,154, 26,249,217, 13, 47,145,
-196,214,168, 81, 99,157,155,155,219,132,194, 7, 83, 98, 87, 37, 3,121,124,195,134, 13,181,101,181, 69,121,223,105,154,174,180,
-141,114,115,115,209,162, 69,139,207,114, 90, 50, 12,131,164,164,164, 98,139, 83, 73,221, 87, 36,224,100, 50,217,132,105,211,166,
-237,228,112, 56, 53, 1, 16,197, 34, 87,175,215,147, 91,182,108, 49,209,235,245, 36, 0,130,197, 98, 81, 28, 14, 71,117,230,204,
- 25,138,162,168, 15,106,181,122,194,223,220, 65,156, 36, 10, 83, 49,200, 95,191,126,237, 85,100,201, 74,137,138,138,138, 56,118,
-236,152, 29,128,227,213,228,189,171, 80, 40,238,174, 94,189,186,205,182,109,219, 22, 76,152, 48,161,197,224,193,131,217,109,219,
-182,197,197,139, 23,245, 97, 97, 97,143,148, 74,229,154,170, 8,172,162,182,204,115,117,117, 45, 17, 92,149,220,203, 21, 78,228,
-181,169,197,255, 99,216,164, 26, 38,187,214, 92,147,101,165,106,194,117, 50,205, 79, 7,128, 40,252, 15, 35, 61, 61,125, 14,128,
-197, 27, 55,110, 76,109,220,184, 49,159,203,229,106, 12, 21, 89,127, 35, 40, 58, 87,214,237,183, 78,253,207,251, 47,156,230,214,
-169,157,159,192,181,182,189,115,244,251,116,188,123,112, 81,254,226,194,202, 68, 70, 45,237, 13,192,144,153,235,143,213, 90,109,
-189,217,243,102, 79,230,113, 56,157,245,122,125,163, 14,215,207, 49, 36, 73, 70,106,116,186,235, 69,238, 66,213,127,113,147,175,
- 88,183,110,157,135,183,183, 55, 78,157, 58,133,235,135, 15, 99, 80, 86, 22,110,145, 36,201,226,114,109, 46,104,181,235, 97,152,
- 64, 90,177, 97,195, 6, 79, 31, 31, 31,156, 56,113, 2, 87, 15, 30,196,192,234,241,148, 55,214, 53, 7, 96, 87,244, 53, 11, 64,
- 12,128,102, 0, 76, 1,168, 81,152,218,201,182,244, 16, 86,180,175,120,255, 29,130, 32,254,202,137,176,149, 71,134,255, 20, 81,
-239, 18,155,125,237, 82, 40,149,202, 28, 15, 15,143, 42,173,185,214,233,116, 21,250,112, 41,138, 74,113,119,119, 55,216,106, 97,
-136, 40,202,201,201,241,253, 11, 27,227,139,230, 98,125, 52,136,208,116,162,147,147, 19, 93, 60,232,151, 37,194,202,218,198, 0,
- 9, 85,249,159,180,180,180, 24, 0,179,170, 91,206,212,212,212,211, 48, 32,105,180,161,199, 1,128, 84, 42,253,234,201,124, 9,
-134, 17, 47, 93,186,180, 74, 2, 27, 12, 83,145,248,140,148,201,100, 45, 13,249,111,173, 86,139,127, 16, 39,138, 94,172,168,168,
-168,113, 4, 65, 4,160,208, 37,176, 3, 95, 39,154,247,221,252,252,252,187,191,254,250,107,155, 93,187,118, 5, 50, 12,131,252,
-252,252, 77, 85, 21, 88, 37, 79,207, 25, 25, 23,191,214,137,231,164,107,110, 30,221,145,210, 94,153,171, 13,220, 45,211, 28,132,
- 17, 37,198, 40,134, 97,246, 15, 31, 62,252, 91, 0, 7,190,148,172,156, 85,135, 95,138, 4, 90,154,215,248,214,236, 95, 70,223,
-178, 52,235, 14, 61,219, 11, 26,214, 5,104,178, 47, 2,216, 7,195,166, 57,148,156, 47, 69,211, 27, 40,141,102, 67,169,193,229,
-127,161,157,173,125,124,124, 2, 71,141, 26,133,197,139, 23,227,234,250,245,218, 73, 4,145,199, 1,152, 43,133, 15,154, 44, 2,
-152,111, 40,207,136, 17, 35,176,120,241, 98, 92, 90,187,182,186, 60, 21,193,142, 32,136, 16, 0, 8, 10, 10,250,105,245,234,213,
- 86, 11, 22, 44,104,180,102,205,154, 85, 69,223, 95, 21,239, 47, 26,235,122, 44, 88,176,160, 65,169,253, 5, 0,158,252,197,245,
- 89,102,100,248,191, 26, 29,141,156, 70, 78, 35,167,145,211,200,105,228, 52,114, 26, 57,191, 4, 12,195,116, 47,124, 43,255,189,
-188,207,165,222,255, 17,176, 97,132, 17, 70, 24, 97,132, 17, 70, 24,241, 31,136,210, 86,172,234,236,255,138, 40,158,163, 85, 26,
-187,128,194,101,221,229,169,210,170,172,122,168,142,178,189, 97,228, 52,114, 26, 57,141,156, 70, 78, 35,167,145,243,127,142,179,
- 50,238,207,126,207, 48, 76,119,130, 32, 66, 24,134,233, 81,222,123,177,176,250,244,115,169,247,175, 54,237,160, 12, 20,207,205,
-250,108,142,214, 95, 13,163, 89,213,200,105,228, 52,114, 26, 57,141,156, 70, 78, 35,231, 23,161,216, 5, 8,128, 9, 10, 10, 90,
-240, 47,116, 29, 58, 21,137,172,210, 47, 0, 21,184, 14, 25,230, 36, 41, 22,195,156,199, 19,112, 1, 64,163, 81,104,157,157,145,
- 79, 16, 3,254,201,132,183, 70,252,103,162,120,185,119,250, 87, 62,214, 8, 35,140, 48,194,136,255, 13,100, 22, 91,170, 0,100,
- 2, 32,138,190,107,138,222, 51,139, 4,217,167,159, 63,218,255, 23, 66,130,114, 44, 89,236,242, 68, 86, 86,150,192,150,205,150,
-122,234,245,170,111, 0,128,205,102,189,201,202,178,138,101,152,147, 89,213, 17, 91,182,246,246,207, 56, 36,233,108,200,177, 58,
-189, 94,156,149,158,254,113,232,120,130,248,111, 16,120,134,138,136, 47, 17, 27,127,185, 80,177,181,181,117,112,112,112,232,101,
-110,110,222, 42, 55, 55,247,113,102,102,230,217, 10,242, 30,174, 38, 8,204, 43,188,174,240, 43,128, 5, 21, 80, 87,229,216, 79,
-225, 33, 16, 8, 38, 19, 4,225, 83,116,131, 69, 41, 20,138,109, 0,222,254, 15,118, 72,166, 0,126, 96,179,217, 35,108,109,109,
- 91,164,165,165, 45, 5, 80,221,104,222,108, 0,179, 45, 45, 45, 7, 89, 90, 90,186,231,228,228,196,229,231,231,159, 0,176, 1,
- 64,165, 75,165,151, 78,119,106,213, 54,160,237,162,176,171, 97, 43,150,110,150, 60,248,108,255,108, 39,155,206,157, 90, 47, 14,
-187, 16,190,252,167,173,169, 57, 85, 44, 27,171,232, 5, 20,174,142,100,240,121,176,215, 47, 5, 7, 64, 79, 0,109, 1,132, 1,
-184, 96,200,121,151,131,111, 1,252, 84, 84,230, 13, 0,110,253,203,175, 35,161,131,131,195, 90, 0, 61,217,108,246,107,177, 88,
- 60, 30, 64,202, 63, 92, 38, 54,128,230, 0,124, 80, 24,134,227, 9, 12, 11,225, 80, 41,108,108,108,122,176,217,236,201, 69,161,
- 93,182,101,103,103,135,252, 91, 27,134,199,227,109,114,116,116, 28,171, 84, 42, 21, 4, 65, 48,165,227, 61, 82, 20,149,146,149,
-149,229,251,223,214,169, 17, 4,241,228, 95, 94,196,241,101,108, 43, 63,142,150, 88, 12,115, 54, 91,234,153,145, 22, 57, 40, 85,
-242,114, 32, 0,212,112,106,116,194,222,177,225,113,177,152,167,117,244,234, 35,226, 8,216,219, 72,146,211, 68,165, 81,219,114,
-216,156, 44, 45,165,139, 96,105,152,201,105, 49,103,203, 12,182,200, 33, 73,231,196,216, 91,246,148, 54, 7, 28,147, 26,224,152,
-214, 44,183,180, 53,106,212,168,214, 89, 90, 89,185,155,105,249, 38,129, 28, 14,217,137,102, 40, 31,134, 6, 88, 4, 39,138,210,
-235, 66,185,106,245,111, 82,105, 92, 65,117,107,208,203, 6,142, 12, 48, 24, 4, 58,129,193,117, 2, 56, 22,147,141,180, 42, 80,
- 24, 42, 34,190, 68,108,148,254,237, 70, 0,115,190,246,149,228,236,236,108,213,163, 71,143, 77,191,252,242,139,169, 72, 36, 34,
- 62,124,248, 16, 48,127,254,252,239,159, 62,125, 58, 75, 44, 22,167,126, 42,250, 8, 2,243,104,154, 97, 1, 0,139, 69,204,183,
-179,179, 23,144, 36,249, 89,108, 35,189, 94, 47,200,204,204,152, 74,211, 12, 81,116,236, 60,134,193,239,134, 8, 70, 19, 19,147,
- 33, 62, 13,155,204, 90,187,110,131,200,193,222, 94, 72,233,105,109, 66, 82,162, 96, 81,208,156,150,239,223,189,253, 93,165, 82,
- 29,173,206,125, 77,146,228, 32, 62,159,223, 3,128,119,209,182,104,181, 90, 29,162,215,235,143, 27, 58,160, 59, 56, 56,220, 33,
- 73,178,118, 85,254, 88,175,215,127, 72, 79, 79,247,171,102, 19, 13,168, 89,179,230, 62,127,127,127, 65,139, 22, 45,192,227,241,
-176,120,241,226,217, 18,137,164, 50,161,197, 6, 48, 91, 32, 16, 12, 18, 10,133,238, 50,153,236,189, 82,169, 60,205,227,241, 58,
-254,254,251,239,174,173, 91,183, 54, 75, 79, 79, 39, 72,146,116,184,116,233,210,143,155, 54,109, 10,160, 40,170, 67,101,131, 92,
-222,123,102, 17,191,167,119,155,188,247,183, 22, 1,232,250,233,126, 74,101, 50,130, 33, 93,123, 40,153,231,201, 69,226,195, 96,
-145,197,225,112,126,119,116,116, 28,165, 42,140, 21,192,124, 58,224, 0,128, 70,163,145,230,230,230,122, 85,231,150, 7, 48,198,
-210,210,114,212,220,185,115,173,186,118,237,138,195,135, 15, 79,217,189,123,183, 52, 63, 63,127, 63, 10, 3, 97,198, 84,145,115,
- 94, 90, 90, 90, 55, 14,135, 67,184,186,186,146, 74,165,178, 42, 66,203, 19,133, 73,152,159, 0,216,134,194,208, 5,237,128,194,
-251, 29,192,175,197,194,141,197, 98,109,243,242,242,234, 21, 29, 29,189, 29,192,138,234,222,235,142,142,142, 59,183,110,221, 58,
-176,119,239,222,100,102,102,166,115,227,198,141,143,164,165,165,181,249, 10,221,200,104, 62,159, 63,179, 81,163, 70,245, 99, 98,
- 98, 98,243,243,243, 55, 20,213,103, 69,247,148, 11,128,142,150,150,150, 29, 22, 46, 92, 40,234,209,163, 7,118,237,218,213,109,
-247,238,221,178,130,130,130, 80, 20,206,233,249, 34, 17,200,102,179, 39,167,164,164,216, 50, 12, 3, 39, 39,167,201, 0,254,149,
- 66,139,197, 98,253,222,183,111,223, 81, 71,142, 28, 17, 36, 38, 38, 10,156,157,157, 75,130,103, 19, 4, 81,237,241,211,136, 47,
-198,174, 82,130,171,242, 56, 90, 60,158,128,171,215,171,190, 73,149,188, 28,248,189,255, 22, 11, 0,184,115,123,218, 64,123,199,
- 6, 81, 60,158, 32,150,111,110,114,166,111,207,142, 77,250,247,240, 39, 92,156,236,145, 34,201,112,216,123,236,106,151,144,171,
-183,206,160, 48,128, 88,153,160,180, 57, 48,213,222, 64,204,189,205,176,109,155,138, 63, 46,165,224,193,139, 4, 40,242,178, 80,
-219,209, 20,235, 2, 59,195,209, 74, 80,189, 71, 47,123,143,118, 20,155,127,124,232,144,225, 22,189,126,240,230,212,114,116, 4,
-195,240, 17,251, 94,246,221,229,107,183,154,159, 62,121,116,178,144,227, 49, 72,158,241,214,224,206,173,169, 19, 76,229, 90,252,
-192, 38,137, 31, 91,251,214,239, 48,164, 91, 27, 86,125,239,122,120,253, 42,186,243,249,155,143,214,177,194, 95,133, 82,122, 38,
- 88,200,197,185,231,146, 10, 3,250,125, 38, 56, 58,116,232,216,134,207,231,127, 20, 60, 73,173, 86,115, 67, 67,111,124, 91, 29,
-177, 81,252, 31, 26,141,154,197,225,240,192, 98, 17,179,124,124, 26,122,103,101,101,221, 34, 8, 98, 95,106,106,213,172, 5,211,
- 0,158,148,205,110,198,226,243,157,244, 26,141, 13, 0, 16, 60,158, 52,129,197,106,184,240,167,159, 68, 36, 73,210,217,217,217,
- 80, 40, 20,196,184,113,227, 76,222,191,127,223, 87, 44, 22,111,174,228,137, 4,187,119,239,246,116,114,114,250, 44,123,172, 68,
- 34,225,245,238,221,171, 58, 77,239,217,168,113,211,153, 87,175, 94,241,206,207,145,170,118,111,220,249, 76,103, 34, 80,215,241,
-246,226,108,219,117,208, 98,252,168, 97,211,222,188,121, 21,129,170,229,171,171,105,106,106,122,102,253,250,245, 62,237,218,181,
-227,216,219,219, 35, 61, 61, 29,209,209,209, 62, 55,111,222,252,225,224,193,131,179,149, 74,101, 95,192,160,132,168, 30,161,193,
-251,236,133,214, 54,208,235,116,168,209,168,105, 73,124,179,119, 55,175,129,210,106, 65,235,116,240,238,241, 67,145, 53,153,129,
-183,183,119,117,163,238,214,104,208,160,193,161, 85,171, 86,113,213,106, 53, 30, 61,122,132, 91,183,110,209, 18,137,164,178,128,
-184,108,130, 32,174, 45, 89,178,196,197,207,207,207, 44, 43, 43, 11,122,189,222,246,220,185,115,147,155, 52,105, 98,238,234,234,
-202, 11, 14, 14,134, 76, 38, 3, 69, 81,214,238,238,238,214, 67,134, 12,209, 4, 7, 7,207, 6,176,182, 60, 75, 86,254,123,102,
-145,132,112,239,226,213,108, 4,210,136, 43, 93,102,118,193,101,243,186, 68,137,101,171,139,187,187, 89,190, 88, 48, 95,100,222,
-208, 58, 95,124, 99,126, 23,119,247,221, 87,226, 12,122, 24, 98, 21, 13, 54, 67,143, 29, 59, 38,136,142,142, 22,120,123,123,131,
-166,233,146, 8,252,197, 1,103, 61, 60, 60,170, 83,143,107, 38, 78,156, 56,127,224,192,129,104,212,168, 81, 73, 80,212,159,127,
-254, 25,243,231,207,183,186,115,231,206,236,163, 71,143,206, 62,123,246,236, 90, 0, 65, 85,180,198, 20,163,170,109,188, 44, 62,
- 62,126,192,153, 51,103,134,205,155, 55,207, 3,192, 84, 0,139,179,179,179,253,139,172, 49,188, 34,161, 53,122,246,236,217,147,
-130,130,130,208,173, 91,183,197,143, 30, 61, 90, 89, 77, 43, 31, 73, 81, 84,183,222,189,123,147, 58,157, 14, 66,161, 16, 58,157,
-174,238,151, 26, 37, 0,108,157, 48, 97,194,164,137, 19, 39,194,202,202, 10, 58,157,206,243,216,177, 99,187, 23, 47, 94,220, 10,
-192,152,114,202, 58, 98,210,164, 73,253,134, 15, 31, 14, 95, 95, 95,176,217,133,213,184,126,253,122, 44, 95,190, 92,116,237,218,
-181, 31,130,131,131,127, 56,127,254,252,105,124,156,182,171, 74,160,105, 26,108, 54, 27,201,201,201,176,183,183,231,211, 52,125,
-149, 32,136, 93, 57, 57, 57,103,255, 69,131,249,175, 3, 6, 12, 24,122,228,200, 17, 17, 0,172, 91,183, 14, 51,103,206,132,131,
-131, 3, 68, 34,145, 81,234,252,123, 44, 90,227, 43,181,104, 85, 6,133, 66,209,116,193,244, 31,193, 98, 21, 62, 53,214,171, 83,
- 19,171,127, 26, 79,156, 15,185,218,180, 66, 27,188, 73, 13,196,220,219, 12,190,107, 32,212, 58, 10, 15, 95,196,227,250,186,128,
-194,209,178,235, 66,168,181, 29,138, 7, 27,107,158,169,233,175, 26,189,254, 62, 28, 29, 31, 33, 41, 41,179, 50,145,101,231,232,
- 16,178, 99,199, 90, 83,159,186, 94,208, 82, 58,136, 51,196, 32, 8, 62, 92,156,205, 48,122, 68, 87,142,191,127, 13,219,101,203,
-118, 94, 76,163,209, 71,145,245,182,210,128,161,158,182, 56,208,212,199, 99,224,144,238,126,252,134, 62, 13,192,229,155,150,236,
-107,230,235,139,102,190,190,172, 32, 89, 65,167,199, 79,158,117, 58,117,237,161, 90,161, 75, 58, 17,155,133,145,149,116, 50, 37,
-130, 99,198,140, 25,112,112,112,248,232,128,244,244,116,220,188, 25, 90,230,111,170,208,145,149,252,199,202,149, 43,205,164, 82,
-105,215, 61,123,246,180,167,105,122,101, 90, 90,218, 61, 67, 72,134, 3,181,243,248,252, 14,163, 54,108,160,155,244,234, 69, 90,
- 58, 58,178,104,189,158, 72,141,139,179,217,184,121,115,219,156,119,239, 76,229,214,214, 57, 82,165, 82, 17, 27, 27, 11, 19, 19,
- 19,130,205,102, 55, 47,131, 42,157, 97,240, 43,139, 69,204, 39, 8, 2,124,190, 73,236,196,137, 19,159, 23,237,171,125,225,194,
- 5, 65,207,158, 61, 21, 0, 18, 1,128,207, 55,113, 38, 73,150,103, 97, 36,118,252,106,136,192, 20, 10,133,211, 87,172, 90, 43,
-204,207,201, 85,106,229,114,157,157,185,136, 32, 68,102,100,126, 94, 65,129, 88,146,169, 94,184,116, 57, 57, 97,244,240,233,114,
-185,124,178,161, 34,171,113,227,198,143,207,156, 57, 99,111, 99, 99,131,220,220, 92,100,103,103,227,241,227,199,160,105, 26,125,
-251,246,229,127,215,178, 69,211,159, 22, 46,122,144, 44, 22,183, 50, 68,108, 9,173,109,177,206,175, 73,225, 96,157,152, 93,210,
- 62,187, 6,244, 40, 57,102,121, 74, 94,177,117,238, 75, 82, 72,181,234,208,161, 3, 23, 0,198,140, 25,147, 95, 80, 80,176, 26,
-192, 17, 84, 30,209,127,246,162, 69,139,156,235,212,169, 83,235,200,145, 35,144,201,100, 0, 96, 95,167, 78, 29,120,122,122,234,
-195,194,194,224,233,233, 9, 51, 51, 51,220,185,115, 7, 15, 30, 60,128,175,175,175, 25,151,203, 29,168,213,106,203, 20, 90,109,
- 3,218, 46,226,247,244,110,227,213,108, 4, 68,230, 78,216,125,244, 56, 98,158, 29,108,163,214, 70, 47,226,234,111, 15, 87, 50,
-252,145,153, 31, 68, 65,181,125,253,109,234, 53,232,133, 90,205,158,219,170,244,119,227, 23,117,170,179,134,109,162, 58,184,116,
-131, 36,187, 60,145, 5, 96, 93,223,190,125, 7, 28, 59,118,204, 18, 0, 34, 35, 35,145,158,158, 14, 59, 59, 59,152,152,152,128,
-195,225,148,228, 39,173, 38, 70,110,219,182,173, 68,180, 81, 20, 85,146, 5, 64, 32, 16,224,251,239,191, 71,147, 38, 77,112,246,
-236,217,145,229, 8, 45,191,150, 45, 91, 30,174, 85,171,150,107,233,141,114,185, 28,131, 7, 15, 6, 0,248,251,251,119, 48, 53,
- 53,101,138, 5,161, 68, 34,145, 61,121,242,164, 19,128, 71,229, 40, 75,165, 88, 44,198,220,185,115,145,144,144, 48,101,199,142,
- 29, 73, 0, 76,120, 60, 94,201,243, 49, 0,207, 6, 13, 26,252, 62,115,230, 76,188,127,255, 30,175, 95,191,126,140,234,187, 82,
-245, 66,161,240,157, 78,167,243,165, 40, 10, 74,165, 18,125,250,244, 49, 57,125,250,116, 58, 73,146,111,178,178,178,134,161,112,
- 78,138,161, 48, 1,176, 97,226,196,137,147,230,205,155,135,208,208, 80,156, 63,127, 30,195,135, 15, 71, 96, 96, 32, 68, 34,209,
-168,192,192,192, 7, 40, 76,104,254, 41, 58,108,219,182, 13,122,189,254,179,123,195,196,196, 4,126,126,126,168, 95,191, 62,206,
-159, 63,223,225, 11,132, 86, 45, 63, 63, 63, 30, 77,211,144,203,229, 8, 11, 11, 19,153,154,154,138, 92, 92, 92,198, 1,248,215,
- 8,173, 90,181,106, 77, 60,118,236,152,168,180,247,135,207,231,163,212,117, 96,196, 63,111,209,170,240, 9,171, 4, 26,141, 66,
-203,102,179,222,212,112,106,116,226,206,237,105, 37,174, 67,128,245, 70,163, 81,104, 1, 64, 79, 51,200, 87, 80, 48,229,179,144,
-152, 86,128, 87,113, 89,101, 81,125,180, 68,147, 99, 90, 19,252, 22,137, 96, 24, 6, 26,173, 30,234,188, 52,172,190,168, 64,116,
-138, 10, 26,185, 20, 26,109,225, 52, 44, 91, 91, 91,246,213,171,151,103,222,184,113,115,210,254,253,251,201, 20, 11,139,215, 5,
- 64,211,178, 56,173,172,220,205,104, 30,239,196,246, 29,139, 77, 25, 50, 14,177, 31,228,168,231,210, 2,182,150,174, 72,203,146,
-227,254,235, 75,120,243, 54, 4,117,156,106, 33,112,122, 23,147, 21,171,142, 28,231, 82,110, 53,115,115, 19,242,203, 43,103,241,
- 83,212,206, 43,177,160,114,226,160,207,126, 15,125, 65,234,103, 7,136,236,106,162, 89, 59,103,216,185,214,229,143, 12, 92, 62,
- 2,248, 72,104,149,230, 76, 39, 8,214,118, 22,139,152, 68, 16, 4, 26, 53,106,156,178, 97,195,134,178, 66,129,107, 27, 53,106,
-156, 66,146, 44,151,194,142,157,181,141, 97,232,244, 74,202,249,145,168,225,241,248,243, 10,205,254, 78,201, 23, 47, 94,212, 14,
- 24, 48, 0,235,215,175,231,205,159, 63,127, 33, 73,146, 99,202,112,239,125,196,217, 7,168,105, 89,183,110,231,149,247,239, 51,
- 28,157,142,200,121,252, 56, 63, 87, 34,161,210, 10, 10,120, 39,223,188,233, 54,118,206, 28,158,171,171, 43,238,133,132,216,100,
-202,229, 76,174, 90,173,204,205,205,101, 40,138,122, 92, 14,231, 2, 59, 59,123,193,238,221,187, 61, 39, 78,156,248, 92, 34,145,
- 44, 0, 0, 39, 39,167,213, 0,234, 3, 72, 44,181, 13, 59,118, 28, 23,143, 27, 55, 46, 54, 35, 35, 99, 65, 69,229, 44,133, 6,
-246,118,246,130,163, 59,131, 95, 90,155,153,178,236, 92,106,176, 56,150,150,108,138,103,202,165, 1,101, 29,215,186, 66, 0, 13,
-202,249,237,167,156,132,169,169,233,153, 63,255,252,211,158,195,225, 64,175,215,195,206,206, 14, 9, 9, 9,200,205,205, 69, 65,
- 65, 1,226,223, 68,195,205,213, 21,203,130,230, 59, 77,157, 31,116, 70,161, 80,248,126, 50,152,125,158, 0, 89,167,253,204,178,
- 87, 86, 22,131, 79,221, 94, 6,182,123,105, 36,124,248,240, 1, 34,145, 8, 62, 62, 62,162,251,247,239,223,173, 64,100,149, 78,
- 2, 60,176,117,235,214,102, 71,142, 28,129,175,175, 47, 44, 44, 44, 16, 22, 22,134,200,200, 72,104,181, 90,150, 76, 38,131, 72,
- 36,194,154, 53,107, 80,179,102, 77, 20, 20, 20, 32, 49, 49,209,134,195,225,216,126, 18,209,190,132, 51,236,106,216,138,188,247,
-183, 22,165, 17, 87,186,236, 62,122, 28,227,134, 12,130, 35, 19,119,215,162, 46,177,162,115,207,214, 63, 51,164,107, 15,161, 89,
- 35, 43, 15,159,158,224,242, 68,152, 58,111, 57, 98,163, 46, 88, 41, 10, 94, 78, 33,244,201,174, 75, 55,156,156, 81,198,185, 19,
- 0, 88,174,174,174, 99, 79,158, 60,105, 86, 98,122, 33,201,146,156,135,165,147,192, 87,144,240,189,210,250, 36, 8, 2, 9, 9,
- 9,176,183,183,135, 72, 36, 42, 73, 32, 30, 29, 29,141,135, 15, 31,162, 56, 27, 69, 57,156,195,110,220,184,225, 42, 20, 10, 63,
- 58,128, 97, 24,100,101,101,129,162, 40, 8, 4, 2,232,245,122,104,181, 90,232,116, 58,168, 84, 42, 81,253,250,245, 39,235,116,
-186, 71,101,113,210, 52, 61,107,224,192,129,173, 31, 61,122,228,190,121,243,102,104, 52,154,117,105,105,105,232,215,175, 31,104,
-154, 70,135, 14, 29,190,101, 24, 38,102,225,194,133, 0,128,153, 51,103,234,228,114,249,196,234,156,123, 17,234, 55,107,214,204,
- 61, 52, 52, 20,109,218,180,129, 90,173,198,250,245,235,205,119,236,216, 97, 30, 28, 28,108, 55,111,222,188,125,153,153,153, 1,
-149,112, 18, 0,214, 57, 58, 58, 78,106,219,182,173,105, 81, 14, 83, 28, 60,120, 16,203,150, 45, 59, 6, 96,225,229,203,151,151,
-156, 63,127,126,196,216,177, 99,177,108,217,178,192,220,220,220, 61,229,113,198,199,199,195,206,206, 14,230,230,230,133,157,165,
- 86,139,136,136, 8, 92,191,126, 29,223,124,243,141, 33,231, 84, 94, 57,107,245,237,219,119,223,209,163, 71,205,146,147,147,113,
-231,206, 29,184,185,185, 65,161, 80, 24,146, 27,246,198, 95, 48, 96,151,203,169, 84, 42, 85, 31, 62,124, 16,173, 93,187, 22, 78,
- 78, 78,168, 85,171, 22, 76, 76, 76, 64, 16, 4,116, 58, 93, 69,233,213, 42, 45,167,191, 63,216, 89, 98,171,222, 22,150, 86, 83,
- 24,134, 97,231,229, 73,119,106,145,123, 42, 46, 14,154,191,241,220,255,147,209, 20,192,115,124,156,243, 80, 82, 34,180, 66, 66,
- 66,152, 30, 61,122, 16,197,239,206,206,200,207,202,178,138,181,119,108,120,220,222,177, 65, 81,222, 47,214, 27,146,180,138,117,
-112, 80,228, 3,128,150, 98, 16,254, 38, 23, 47,223,165, 33,242, 93, 26,132,124,195,140, 47,106, 45, 85, 56, 99,149, 97,160,146,
-253,255, 67,171, 86, 33,133, 90, 91, 56,221, 67,163, 86, 32, 47,243, 53, 49,160, 79, 39,147, 73,147, 38,192,201,201,217,174, 60,
- 62, 45,223, 36,112,234,204,110,150,214,150, 28,132,220,191,130,111,191,233, 3, 19, 62, 7,217,121, 42,128, 0,222,198, 93, 7,
-104, 51, 68,197,126, 64,203, 6, 2, 4,116,246, 22,157, 61, 21, 51, 7,192, 98, 67,202, 75,165, 60, 6,215,163, 43, 56,122, 29,
-116, 89, 49,160,115,147, 0,161, 35,148,132, 8,217,146, 36,188,185,123,218,160,103, 70,154,166,167,216,218,218,230, 46, 92,184,
-176,109,189,122,245,180,147, 39, 79,126,145,148,148, 52,235,147,167,149,223,182,109,219,134,119,239,222,137, 87,174, 92, 25,150,
-149,149,181,168,138, 13, 29,196, 48,216, 84,228,138,203, 58,119,238, 92,179,219,183,111, 7,110,218,180,201, 97,218,180,105,188,
-105,211,166,141, 6,240, 75, 69,238,194,124, 62,191,227,202, 59,119, 24, 42, 37, 69,125,104,203, 22,222,214,240,240,133, 90,154,
-174, 97,107,111, 79,124,215,178,165, 92,192, 98,101,101,167,167, 83,118,238,238,100,194,245,235, 54,140,169,105,234,229,203,151,
-243,101, 50, 89,185,169,115, 72,146, 84,148,229, 46, 44, 11, 78, 78, 78,154,178,230,112, 85, 48, 32,230,211, 12,163,181,172, 83,
-135,233,220,161, 85,189,119, 49,113,113, 38,150,150,164, 71, 61, 55,175, 87,111, 18, 30, 51,122,189,138, 32,136,124,131,124, 37,
- 36, 57,104,211,166, 77, 13,205,205,205, 65,211, 52, 44, 44, 44,144,153,153, 9,141, 70,131,252,252,124,104, 10,242,160,201,203,
- 67,100, 82, 2, 90,183,109,139, 1, 93, 58,123, 7,159,251,115,144, 94,175, 63, 86,161, 63,175, 81,211, 18, 75,214,242,218, 54,
-255,239, 11, 74,206, 45, 17, 93,107,155,122,128, 43, 18,161,211,172,160, 47,185,209,159, 95,188,120,241, 82,223,190,125,187,205,
-153, 51,135, 37,145, 72,174, 36, 36, 36,180, 6,240,186,162, 31,137, 68,162,186, 89, 89, 89,144,201,100,176,176,176,192,166, 77,
-155,224,224,224, 0,133, 66,129, 39, 79,158, 48, 46, 46, 46, 68, 88, 88, 24, 92, 92, 92,144,157,157, 13,173, 86, 11,165, 82,153,
-166,209,104,202,117,151, 23,185, 7,187,206,236,130,203, 49,207, 14,182,113, 38,226,159, 12,156,237,255, 46, 38,242,205,135,107,
-215,239,255, 66,169, 76,146,115, 83,110,204,175,211,252,185,237,148,185,203,240,199,186, 37,136,121,116, 39,199,161,102,254, 86,
- 83, 66,125,160,162,242,202,229,114,213,155, 55,111,204, 94,188,120, 1,130, 32, 96, 97, 97, 1,129, 64, 80,166,216,170, 6, 88,
-165, 45, 80,114,185, 28, 92, 46, 23, 54, 54, 54,216,179,103, 79,201,192,235,230,230, 86, 17,199,206, 78,157, 58, 13,170, 89,179,
-166, 89,233,141,205,155, 55,199,132, 9, 19,176,125,251,118,132,135,135,127,148, 79, 51, 45, 45, 77,162,211,233, 42, 58,239,220,
-244,244,244, 46,125,250,244,121,118,247,238, 93,243, 61,123,246,128,162,168, 50, 95,187,119,239,198,195,135, 15, 23, 3,120, 83,
-205,235,232,155,126,253,250,221, 57,124,248,176,101,102,102, 38,138,175, 13,185, 92, 14,189, 94, 15, 47, 47, 47,130,162,168,202,
-230,189,177, 72,146, 60,183,101,203,150,158,227,198,141, 3,155,205,134, 70,163,193,150, 45, 91, 48,127,254,252,244,162,135, 82,
- 45,128,133, 7, 14, 28, 24,209,171, 87, 47, 52,110,220,216,251,214,173,242,103,118,200,100, 50,200,100, 50,112, 56, 28, 56, 58,
- 58, 98,197,138, 21,208,104, 10,187, 21, 79, 79,207,146,219, 24,192, 78, 79, 79,207,158,177,177,177,235, 81, 56,119,237, 51, 56,
- 58, 58,246, 97, 24,102,188, 94,175, 47,104,211,166,141,205,209,163, 71,205,196, 98, 49,158, 61,123,134,197,139, 23, 75,105,154,
-214,211, 52, 77, 40,149,202,120,123,123,251,103,124, 62,223, 84,161, 80,228,100,103,103,175, 2,112,229,159, 26,201, 9,130, 32,
- 56, 28, 14,198,140, 25, 3, 54,155, 13, 83, 83, 83,168, 84, 42,232,116,186, 18, 49,143, 42,186,165,235,213, 19,217,176,193, 29,
-103,101, 86, 63,112,192,140, 30,118, 78, 53,156, 97,105,206, 71,116,244,235,214, 55, 67,175,111,225,177, 99,118,208, 26,221,142,
-152,196,188,191, 60,217,253,167, 90,228, 63, 84,104,125,150,243,144, 93,118, 99, 14,208, 51,204,201, 44,177,152,167,229,241, 4,
-177,197, 86, 46, 7, 7, 69, 62, 65, 12,208,219, 53,232, 13, 74,171, 43,234, 40,152,162,151,129, 66, 75,167,199,187,152, 40,220,
-189,246, 39,108, 21, 98,100,197, 55, 1,184, 13,161, 81,230, 65,165,209, 22,137, 18, 61, 94, 60, 11, 69,126, 94, 14,124,124,123,
- 0, 44,214,195,242,248, 44,108,136, 30,223, 53,107, 68,190,251, 16,133,230,158,253,225,238,210, 6, 73,146,124,228,202,212,144,
-230,171,208,196, 39, 8,153, 82, 37,242, 21, 42,188,126, 23, 12,231, 26,238, 44,130, 29,215,193, 80,161,165,126,125, 6,234, 55,
-231,193,173,213, 26, 60,175, 94, 32,107,249,225,195,203, 91,120,113,121, 35, 82, 94,221, 3, 67,235,225,228,217,194,208,155,100,
-203,149, 43, 87, 90,180,110,221,154,221,177, 99,199,198,151, 46, 93,106, 44,145, 72, 94, 20, 9,140,198, 29, 59,118,108,108,103,
-103,135,223,127,255, 93, 73, 16,196,150,106, 54,118,137, 5, 44, 35, 35,227, 49,128,149,103,206,156,217, 50, 97,194, 4,216,219,
-219, 55, 76, 77, 77, 45,247,135,153, 28, 78,227,145,171, 86, 49, 28,146,100,142,253,241, 7,119,217,149, 43, 27,246, 31, 56,192,
-109,223,174, 29,193, 48, 12, 34, 34, 34, 4,107,255,248, 67, 48,180,119,239,196,164,140, 12,234,118,120,184, 86,146,146, 82,144,
- 33,151, 47,147, 72, 36,105,255,196,149,173,211,233, 30,196, 39,196, 59,251,182,108, 98,226,180,160, 87, 0, 0, 32, 0, 73, 68,
- 65, 84,247, 60, 58,254, 85, 64,251,239,190, 99,177, 88,172,152,184,164,112, 59, 59,115,193,245,107,215,181, 58,157,238,129, 33,
- 92,124, 62,191, 71,251,246,237,217, 82,169, 20, 53,106,212, 64,102,102, 38,196, 98,113,161,197, 33, 79, 10,109, 94, 30,116,249,
-185,208,203,101,136,127,242, 24, 77,220,235,240, 79,242,249, 61, 20, 10, 69,133, 66,171,248, 41,179,172, 68,215,197,219,120,102,
-102,224,137, 68, 32,170,238, 54,236,109,105,105, 57, 63, 55, 55,247, 18,128, 21, 90,173,118,234,252,249,243,155,111,222,188,217,
-118,229,202,149,230,227,199,143, 63, 41,147,201,154,160, 48,169,106,121, 3,216,123,138,162,108, 0, 56,132,134,134,194,222,222,
- 30,121,121,121,197,150, 22,141, 66,161, 48,201,206,206,134, 90,173,134, 70,163,129,185,185, 57,158, 62,125,154, 67, 81,212,133,
-202, 10,103, 94,151, 88,161,214, 70, 47,178,241, 22,166,106, 41, 43,255,140, 28, 90,186,116,131,100, 57,128, 13, 93,220,221,119,
-107,233, 59,241,111,163, 46, 88, 37, 60, 9,203, 73,125, 43,119,223,115, 41,190,162, 57, 90, 12, 0,154, 32, 8,198,211,211, 19,
-153,153,153, 32, 73, 18, 2,129, 0, 34,145, 8, 11, 22, 44,192,150, 45, 91,170, 35,180, 76,132, 66,225, 42, 22,139, 53,136,197,
- 98,217,233,245,122, 4, 5, 5,161,103,207,158,224,241,120,208,106,181, 37, 22,205, 98, 43, 85, 37,150,142,136,135, 15, 31,154,
- 63,124,248, 81,183,213,206,214,214,246,166, 90,173, 70, 92, 92, 28,206,157, 59,215, 22,192,237, 42,182,117, 92, 68, 68, 68, 23,
- 63, 63,191,131,205,154, 53,171,203, 48, 12, 26, 54,108,136,193,131, 7, 35, 56, 56, 24, 47, 94,188, 64, 94, 94, 30,125,253,250,
-245,253, 0,214, 87,117, 12, 47,170, 95,175,126,253,250,221, 59,114,228,136, 85,118,118, 54,148, 74, 37,228,114, 57, 78,158, 60,
-137,214,173, 91,195,214,214, 22,135, 15, 31,166, 24,134,169,168,237, 89, 44, 22,107,207,142, 29, 59,122,142, 29, 59, 22, 91,183,
-110,197,177, 99,199,208,171, 87, 47, 12, 26, 52, 8,153,153,153, 14,235,214,173, 27, 81,228, 38, 92, 50,120,240, 96,200,100, 50,
- 60,121,242, 36,218,192,123, 30,185,185,185,200,205,205,133,169,169,105,233,123,140, 0, 16,188,113,227,198, 33,129,129,129,112,
-119,119, 95, 18, 31, 31,191, 17,101,172, 18,165,105,122,162, 88, 44,182, 98,179,217, 54, 20, 69, 33, 57, 57, 25, 79,159, 62,197,
-148, 41, 83,114,114,114,114, 38, 0, 72, 2,176,112,204,152, 49, 43,102,205,154, 85,114, 45,205,154, 53, 43,228,210,165, 75, 93,
-254,110,107,142,167,167,101, 3, 30,201,159, 33, 45, 32,109,164, 82,105, 73,223,161,209,104,160, 86,171, 63,178,100,113,185, 28,
-155,230, 77,106, 94, 84, 42, 10,126,122,253, 54,183,220, 4,233,222,117, 45, 26, 9,132, 22,129,173,219,180, 31,214,185,203, 15,
- 36,165,211,225,234,213, 11,216,187,119, 27,218,249,121,194,189, 94, 67, 76,155, 62,195, 66,173,161,130,174, 95,191, 50,223,242,
-225,221, 43, 5,249,185, 11, 42,226,252, 31,199,197, 34,113,117,177, 76,215, 97, 89, 10,178, 40,132,131,180,232,171,173,149,149,
-213, 31,122,189,190,157,185,185, 57,232,220, 88,188,126,250, 8, 57, 82, 14,212, 74, 61,104,166, 80,108, 25, 36, 92,212, 26,220,
-185,122, 30,155, 54,110, 64,118,118, 54,252,190,111, 11, 25,219, 21, 53, 93,107, 66,165, 84, 20,221, 52,128, 86,163,131,157, 67,
- 45, 60,127,254, 66,151, 47,151,151,219, 33,113, 77,180,222, 53, 29, 60,161,214,182,130, 9,143,135,188, 2, 13,164, 69, 34,235,
-240,169,129, 80, 43,148,160, 52, 90, 80, 26, 29,236,106,246,195, 55, 14,237, 65,235, 47, 52,168, 82,245,209,122,104, 19,238, 64,
-155,112, 7,166,173,166,227,207,213, 67, 62, 25, 72, 13,203,187,155,153,153,153,241,234,213,171, 11, 17, 17, 17,125, 6, 14, 28,
-136, 91,183,110,141, 7, 48,169,200,125, 51,126,224,192,129,136,136,136,192,171, 87,175, 46,100,102,102,102,124,141,150,231,241,
-120, 74,181,186,112,140, 21, 8, 4, 38,149, 28,235,220,188,111, 95, 86,222,243,231,249, 27,239,223, 95,178,123,207, 30,110,199,
- 14, 29, 8, 29, 69,129,214,235, 81,207,195,131,232,220,185,179, 48,248,196, 9, 27, 82,167,123, 56,119,234,212,208,237,195,135,
- 23, 60,150,203, 13,157,104, 94,187,200,101, 8, 0,181, 43,216,102, 48,212,106,245,230,137,227, 70,117,188,125,231,158,107, 77,
- 87,103,243,171,215,111,191,224,155,242, 88,238,110,117, 73,105, 94, 14,123,249,146,159, 76,213,106,181,161,162,213,219,214,214,
- 22,105,105,105,120,247,238, 29,212,106, 53,116, 58, 29,104,133, 28, 26,105, 46, 52,121, 57, 32, 84, 74,240,245,122,168,178,210,
- 81,219,189, 14,240,255, 43, 18, 43,117, 69,149, 37,180,138,223, 77,204,205,193, 21,138,192,226,112, 12, 78,142, 14,160, 89,139,
- 22, 45, 78,156, 62,125,154, 59,122,244,232,150, 55,110,220,248, 3, 64,146, 88, 44,238,176,120,241,226,199,127,252,241, 7,127,
-194,132, 9, 94,235,215,175, 31, 1, 96,103,121, 36, 42,149,234,196,197,139, 23,135,214,170, 85,203, 33, 50, 50, 18, 42,149, 10,
- 52, 77,163,107,215,174, 64,225,220, 26, 0, 64, 76, 76,140, 82,165, 82,101, 68, 69, 69,229, 39, 37, 37,105, 97,192, 42,193,165,
-155, 37, 15,242,211,238,244,117,112,116,126,104, 98, 90,219,141,145, 61,239, 51,179,191,243,186,141,167,196,170, 43,113,113, 5,
-139, 58,213, 89, 35, 47,120, 57,197,210, 69,182,245, 74, 72,188, 33, 19,225, 75, 86, 23,218,216,216,128,205,102,131,195,225,128,
-203,229,130, 32, 8, 76,159, 62, 29,187,118,237,170,204,117,248,145,200, 50, 51, 51,123,181,108,217, 50,151, 9, 19, 38,112, 77,
- 76, 76, 32,149, 74,113,248,240, 97,140, 25, 51, 6,123,247,238, 45,115,254,139, 1, 46,165, 79,173,165,129,195,135, 15,135, 70,
-163,193,224,193,131,177,123,247,238, 64,189, 94,127,187, 26,183,244,195, 23, 47, 94,120,188,120,241,194, 28, 64,175, 65,131, 6,
- 29,232,215,175, 31,110,223,190,141, 11, 23, 46,180, 69,225,162, 15, 37,128,213, 0,236,139,222, 43,186, 63,133, 14, 14, 14,219,
-104,154,238,101,103,103,247,194,211,211,211,231,200,145, 35,150, 25, 25, 25,197,139, 31,144,144,144,128,125,251,246, 73,246,236,
-217,147,175,215,235,109, 88, 44,214,197,220,220,220, 5, 21, 8,182, 61, 27, 55,110, 28, 85,228, 14,196,233,211,167,153, 13, 27,
- 54, 16,139, 23, 47,134, 84, 42, 69,187,118,237,176, 99,199,142, 25, 50,153,172,241,134, 13, 27,198, 13, 24, 48, 0,203,151, 47,
-135, 92, 46,223, 88,217,195, 74, 5,226,139, 0,240,221,198,141, 27,107, 5, 6, 6,226,244,233,211,104,214,172,153,105,124,124,
-252,118, 0, 99,203,106, 63,134, 97, 16, 31, 31, 15,133, 66,129,123,247,238, 97,201,146, 37,210, 82, 34,107,198,164, 73,147, 86,
-204,152, 49, 3,171, 86,173, 98, 34, 35, 35, 51,250,245,235,231,176,107,215, 46,178, 94,189,122, 51, 20, 10,197,223, 38,180,188,
-234, 89,175,105,222,172,205,124, 39,231,122, 56,124,228, 40,114,114,114, 74,234,164,184, 94, 24,134, 65, 65, 65, 1,210,210,210,
- 96, 97,110,134,117,235, 87,116,155, 60,126,148, 43, 10,195, 96,124,110,178,116,183, 90,223,111,208,232,217,131,135,142, 66,228,
-139,103, 8, 62,176, 19, 81,145, 17, 37,124,148, 78,139,216,232,167,136,141,126, 10, 7,199, 90,232,220,177, 45, 49,100,200,144,
-174,195,135, 14,178, 3,240,151,133,142,248, 15,182,102, 1,159,199,209,218,245,145,208,170,196, 92,103,107,101,101,245,234,248,
-241,227, 54,126,126,126, 36, 69, 81,184,114,245, 42,166, 76,250, 17, 35,134, 7, 65, 11, 43, 80, 26, 46,104,174,137, 65, 37, 81,
- 42, 21, 96,192, 64, 46,151, 35, 60, 60, 28, 12, 77, 33,120,215, 6, 48, 12, 93, 34,180, 0, 6, 26,173, 22,206, 53,189,176,109,
-247, 74, 10, 28,206, 99,232,202, 14, 93,147,159, 77,234,117, 20, 3,113,198, 7,124,144, 68,193,194,172, 38,216,156,154,200,206,
- 85,128,205,114,132, 78, 21, 3,125,209,111, 21,242, 20, 40,181, 95,214,126,250, 50,172,167, 76, 21, 58, 93,165, 82,121,232,208,
-161, 67,221,126,251,237, 55, 94,247,238,221, 61, 79,157, 58,245, 29, 0,116,239,222,221,211,220,220, 28,135, 14, 29,210, 40,149,
-202, 67, 95,209,226,211,190, 69,139, 22,144, 74,165, 72, 72, 72,120, 81,225,185,105, 52, 54, 34,123,123, 50,227,214, 45, 93,166,
- 84,234,218,190,125,123, 66, 71, 81, 96, 17, 4,114,242,242,144,148,152, 8, 75, 75, 75,226, 85, 76,140,104,203,180,105,103, 61,
-125,124,216,197, 43, 18, 13,193,133, 11, 23, 4, 40,156,151, 85,225,182, 42, 66,158,145,158, 54,106,234,212,169,103, 15, 29, 58,
-108,145,158,145, 30,203,231,241, 40,145,200,164,198,240, 97,147,217,185,185,185, 67, 1,200, 12, 37,147, 74,165,136,143,143,135,
-169,169, 41,184, 28, 14,104,165, 2,122,185, 12,170,156, 76,144, 90, 13,120,122, 61,172, 5,124,184, 58, 56,160,166,157,173, 65,
-156,239,110, 94, 43,153,248, 94,218, 93,184,174,133, 55,120, 66, 17,120,102, 34, 76, 14, 9, 43,122, 26,229, 2,139,127, 49,132,
-214,214,217,217,249,207, 35, 71,142,112, 51, 51, 51, 17, 17, 17,241, 2, 64, 30, 0, 51, 0,116,116,116,244,141,168,168,168, 30,
- 69,171,238, 42, 91, 45,182,225,204,153, 51,157,252,252,252, 40, 55, 55, 55, 97, 70, 70,134,171, 84, 42,165, 37, 18,201, 71, 38,
-161,107,215,174,241, 11, 10, 10,228, 52, 77,159, 45, 18, 89,149,198, 47,154,217,223,217, 36,252, 57,166,251, 7,212,110,104,110,
-219, 8, 57,212,243,134, 15, 95, 72,166,207,236,239,188,121,227, 41,177,202,148, 80, 31, 32,244,201,174,108, 19,149,161,147,152,
- 25,160,112,174, 84,120,120, 56,146,146,146, 16, 31, 31,255,145,160, 26, 63,126, 60,130,131,131, 13,178,104, 9,133,194, 85, 75,
-151, 46,117, 9, 12, 12,228,150, 18, 69,152, 58,117, 42,242,242,242,176,123,247,110, 76,157, 58,181,202, 3,255, 39,168,211,190,
-125,251,238, 78, 78, 78,200,206,206,134,163,163, 35,252,252,252,122,222,190,125,219, 13, 64, 66, 53,175,251,201, 1, 1, 1, 43,
-150, 45, 91, 6,157, 78,135, 49, 99,198,224,237,219,183, 39,222,190,125,187,169,102,205,154,211,231,205,155,231,224,224,224,128,
-129, 3, 7, 10, 41,138,234, 91, 30,137,181,181,245,234,157, 59,119, 14,237,222,189, 59, 75,171,213,126,127,243,230, 77, 36, 38,
- 38, 66,163,209,128,162, 40,188,127,255, 30, 83,167, 78,149, 20,173,110,124,111, 64,185, 70, 47, 92,184,112,212,244,233,211,177,
-118,237, 90, 44, 93,186,116,191,133,133,133, 79,147, 38, 77,154, 46, 93,186, 20,115,231,206, 69,173, 90,181, 96, 99, 99,243,205,
-226,197,139,189,103,205,154,133,205,155, 55, 99,201,146, 37,251, 1,236,171, 78, 69,208, 52, 77,172, 89,179,166,241,198,141, 27,
-157,138, 69, 22,139,197,194,241,227,199,241,252,249,243,158,113,113,113,101,253,102,135,163,163,227,120, 39, 39, 39,222,245,235,
-215, 69,181,106,213, 2, 69, 81,186, 34,145,181,165,102,205,154, 83,222,191,127,143,238,221,187, 35, 46, 46,238, 16,128, 17, 22,
- 22, 22,242, 89,179,102, 9, 76, 77, 77, 45, 20, 10,197,223, 53,120,131,100, 17, 35, 87, 45,159,139, 39,207, 99,112,230, 12, 23,
- 79,158, 60,129,131,131, 3,248,124, 62, 24,134,129, 90,173, 70,102,102, 38,116, 90, 53, 26, 54,168,131,131,123,214, 32, 35, 35,
- 19, 96, 17,229, 78,185, 33, 88,196,176, 81, 63,246,193,221,123, 87,177,125,251, 78,200,100,242,114, 30,190, 77, 80,207,211, 27,
-206, 53,236,145,156,146, 12,130, 5,219,191,242, 92,255,195, 93,135, 37, 93, 16, 12, 9,239, 80, 26,150,150,150,155,142, 29, 59,
-102,211,174, 93, 59, 82, 46,151,131,166,105,180,241,243,195,244,192, 64, 92, 56,114, 4, 30, 45, 7,131,208,136, 64, 9, 12, 91,
-245,160, 82, 42, 80,191,233,119, 24, 48,112, 16, 62, 36, 37, 33,160, 71, 63,168, 84,138,146, 39,140, 98,139,150, 70,163,133,173,
-189, 43,174, 93,187, 70, 98,204,152,215,216, 82,182, 81, 66,175,229,189,140,125,175,106,157,171,124,142,240, 39,193,208,170,181,
-104,216,112, 49,180,180, 13,236, 93,198, 67,167, 59,135,252,204,155,133,110, 12,155,118, 72,249,240, 1, 44,146,251,170,186, 53,
- 72,203, 51,191,168,211,205,203,203,203,139,143,143, 63, 21, 30, 30, 62,172,111,223,190,184,118,237,218, 56, 0,232,219,183, 47,
-194,195,195, 17, 31, 31,127, 42, 47, 47, 47,239,107,180,182,147,147, 83,175,182,109,219, 14,110,222,188, 57, 66, 66, 66,192, 48,
-204, 93,131,110,108, 14,135, 97,177, 88,160,105, 26, 4,128,236,220, 92,188,125,251, 22,217, 89, 89,208,233,116,144,203,100,180,
-183,167,167,140,161,105,179,170,148,167,244, 10, 67,148,177,234,176,120, 91, 53, 78, 53,233,241,195,251, 31, 10,100, 50, 59, 43,
- 75,171, 2, 30,143,167,151,230,230,230,189,126, 21,169, 49,112,112, 40, 70,116, 84, 84,148, 79,106,106, 42, 62,124,248, 0, 74,
- 94, 0, 82,173, 1, 75,173, 64,135,239, 90,193, 20, 12, 76, 64,131, 67,235,192, 33, 57, 40, 40, 92,157, 87,169,187, 67, 95,234,
- 33,161, 88,100, 17, 4, 81,232, 46, 20, 10,193, 19,153,125,100,225, 50,228,122,226,243,249, 71, 78,158, 60,233,228,236,236,140,
-229,203,151,195,197,197,229,155, 26, 53,106, 40, 44, 44, 44, 76, 29, 28, 28, 80,191,126,125,124,247,221,119,184,124,249, 50, 12,
-168, 3,138, 97,152,206,119,239,222,157,125,255,254,253, 1, 66,161,144,152, 54,109, 26,187,107,215,174,224,243,249, 80, 40, 20,
-144, 74,165, 56,122,244,104, 22, 77,211,197,139, 82,108, 4, 2,193, 62,130, 32, 18,228,114,121,224,167,132, 7,127,107, 88, 35,
- 35,135, 30,195,200, 4,125,252, 3,106, 55,108, 31,208, 17,117, 60,218,163,125,192, 7, 0, 88, 99,205, 78, 28,252,235, 66,203,
-179,150,102,196,190,107, 87,174, 47,241,243,111,191,112,190,236,214,138,181,187,114, 43,157, 79, 71, 16, 4,104,154,254, 40,118,
-208,167,251, 71,140, 24,129,227,199,143, 87, 90,143, 44, 22,107,208,132, 9, 19,184,159, 88,158, 33, 22,139,209,163, 71, 15,244,
-237,219,247, 35,161,101,107,107, 11, 71, 71, 71, 36, 38, 38, 2, 64,182,129,215,213,244,209,163, 71, 19, 74,165, 18, 99,199,142,
-197,238,221,187, 49,120,240, 96,226,246,237,219,211, 1, 4, 86,245, 98,103,177, 88,235,230,205,155, 55,123,234,212,169,200,201,
-201,193,165, 75,151,208,181,107, 87, 28, 63,126,220,238,210,165, 75,171,218,181,107, 7,146, 36, 17, 18, 18, 2,138,162, 42,140,
-245,197,229,114,123,117,239,222,157,149,156,156, 12, 46,151, 11, 95, 95, 95,164,164,164, 64,161, 80, 64, 44, 22, 99,198,140, 25,
-105,217,217,217,109, 13,189,143,184, 92,110,224,244,233,211,113,236,216, 49, 4, 5, 5, 29, 0, 48, 54, 47, 47,111,192,253,251,
-247,143,245,238,221, 27, 98,177, 24,103,207,158,197,146, 37, 75,136, 17, 35, 70, 96,235,214,173,152, 49, 99,198,254, 34,171, 83,
-121, 23,126, 65, 70, 70,134, 69,221,186,117,145,158,158, 14,153, 76,134,179,103,207,218, 95,190,124,217,205,217,217,217, 60, 62,
- 62, 94,255,203, 47,191,240, 2, 3, 3,177,105,211, 38, 68, 68, 68, 32, 56, 56, 24,237,219,183,167,226,226,226,202,180,146, 21,
-133,108, 56,203, 48,204,117,161, 80,136,130,130,130,226,251,110, 78, 80, 80,208,212,213,171, 11,141,236,169,169,169, 24, 57,114,
-228,240,208,208, 80,186, 93,187,118, 2, 46,151, 11,149, 74, 37,255, 59, 71,109, 90, 79, 3,160,225,230, 42,194,213, 11,123,240,
-236, 69, 28,158,189,136, 2,143, 95, 56, 9, 94,169, 84,160,105,195,122,104,233,219, 2,169, 18, 49, 14, 5,239,129,181,173,115,
-133,253, 8,195, 48,224,178,245,240,246,116,196,145,224,157, 8,185, 20,138,224, 67, 71, 75,230,188,177,217, 28, 52,105,218, 18,
-190,190,126,136,139,127,143, 61,123,182,195,206,222,213,232, 28,172, 38, 74, 92,135,165,223, 63, 81,254,237,253,252,252, 72,153,
- 76, 6,149, 74,133,180,180, 52, 36, 38, 38,194,210,202, 18,113,169, 9,104, 43,208, 34,141,206, 71,244,139, 87,122,130,228, 68,
- 84,246,135,221,253,155, 0,254, 77, 48,101,244,224, 10, 30, 89, 25, 8,205,109, 11, 93, 55, 20,245, 14,155, 55, 83,229, 9, 45,
- 74,175,187,113,245,250,205, 22,163, 71,244,226, 92,187,185, 27, 58, 13, 13,165,206, 2,114,149, 6,114, 45, 7, 44,139,174, 64,
-214,109,144,108, 62,190,109, 92, 15,103,207, 92,214, 50,148, 46,212,224, 10,114,240, 1,149, 30, 85, 74,104,101,124,226,119,176,
- 54,216,117, 88, 50,240,234,245,199, 15, 31, 62,252, 67,171, 86,173, 4,237,218,181,171, 91, 52,112,106, 15, 31, 62,172, 40, 10,
-134, 89, 85,124, 20, 13,222,209,209,177, 41,151,203, 29,220,181,107,215,166,163, 70,141,194,235,215,175,113,232,208,161,216,122,
-245,234,221,146, 72,202, 95,145, 77,242,120,217,178,140, 12, 75,145,155, 27,219,202,204, 44,245,242,165, 75,181, 58,118,234, 68,
-124,248,240, 1,217,217,217, 80,169, 84,136,120,241,130,225,144,100, 10, 97,110,206,138,121,254,156, 69,242,120,217,229, 89, 27,
-203, 64, 98, 37,171, 14, 87, 87,215,186,229,234,100, 85,119, 73,208,196, 58, 42,181,202, 39, 63, 63,159, 98,115, 56, 28, 23, 71,
-203,164,152,247,134,247,137,106,181, 58,228,198,141, 27, 63,116,236,216,145, 31,251, 50, 2, 84, 94, 30, 52,121, 82,112,105, 61,
-172,155, 54, 6,169, 85, 3, 26, 29,156,189, 25,168,114, 5,184,253, 40, 70,167, 86,171, 43, 13,106, 88, 44,180, 88,159, 8, 3,
-158, 72, 4,190,153, 57,248, 34,209,167,130,161,178, 39, 57, 65,231,206,157, 59,124,251,237,183, 96, 24, 6,187,118,237,130, 86,
-171,229,105,181, 90,104, 52, 26,104,181, 90,228,231,231, 35, 56, 56, 24,219,182,109,187, 15, 96,191, 1,167, 79,153,154,154,246,
- 38, 8,194,158,205,102, 43,236,236,236,132,199,143, 31, 47, 9, 55,209,164, 73, 19,152,153,153,113, 81, 20, 20,210,222,222,158,
-179,119,239, 94,203,158, 61,123,222, 41,211,221,209,240,155,185,117, 40, 43,127, 19,211,218,110,230,182,141, 80,199,163, 61, 0,
-160, 83,143,209,168, 83,175, 38,242,179, 94,186,169,148,137,125,184,108,169,213,171,205,226,215,166,221,125, 70,201, 51,194,222,
-162,236,229,253,101, 14, 20, 44, 22,171, 92,119,172, 33, 34,171, 80,179,176,236,138,231,249, 0, 64,118,118, 54, 36, 18, 9,162,
-163,163,225,229,229,133,156,156, 28, 56, 59, 59, 67,163,209,160,121,243,230, 80, 42,149,216,184,113, 35,238,221,187,119, 31,192,
- 12, 3,254,195,212,195,195, 99,100,211,166, 77,113,233,210, 37, 60,121,242, 68,124,245,234, 85,103, 63, 63, 63,184,185,185,141,
- 74, 72, 72,248,169,200,213,103, 40,132,126,126,126,211,166, 78,157,138,168,168, 40, 76,156, 56, 49, 59, 57, 57,249,236,137, 19,
- 39,198, 46, 89,178,132, 21, 16, 16, 0,137, 68,130,117,235,214,233,239,221,187,183, 30,192,242, 74,234,241, 77,114,114,178,139,
- 74,165, 66, 78, 78, 14, 40,138,130, 66,161,192,229,203,151, 17, 28, 28,156, 94, 36,178,222, 25, 90,184,198,141, 27,215,103,177,
- 88, 56,118,236, 24, 0, 44, 66, 97,196,254,179,125,250,244, 17,255,242,203, 47,206, 11, 22, 44,192,184,113,227,160,213,106,177,
-118,237, 90, 44, 88,176,224, 98,145,200,170,168, 19,253,205,209,209,113,252,196,137, 19,191,153, 53,107, 22,194,195,195,237,159,
- 62,125,234, 27, 17, 17, 1, 87, 87, 87,100,103,103,179,109,108,108,176,105,211, 38,204,156, 57,243, 52,128,172, 7, 15, 30, 12,
-138,143,143, 95, 13, 96, 93, 37,162,125,135,179,179,243,120,134, 97, 24,133, 66,145, 24, 20, 20,180,110,229,202,149,152, 57,115,
- 38, 94,189,122,133,188,188, 60,152,153,153, 17,243,230,205, 27,185,104,209, 34,140, 25, 51,134,145,203,229,219,254,238,129,154,
- 97,244, 80, 72,163,160, 87, 91,161, 73, 67, 47, 52,241,169,141,171, 55,159, 1, 0, 58,244,243,131, 66, 94,128, 3, 7,118,225,
-221,187,183, 96,115, 56,176,180,118, 52,196, 18, 8, 77,254, 27,228,106, 37,232,216,206, 23, 93, 3,218, 98,255,193,227,160,116,
- 90,140, 29, 61, 20,210,220, 92, 28, 60,184, 7,113,241,239,193,230,112, 96, 99,251,215, 7, 66,173, 72,139,252,199, 11, 45, 3,
-220, 79,160,105, 26, 98,177, 24, 79,159, 62, 69, 66, 66, 2, 4, 2, 1,148,148,158,222,126,227, 30, 77, 16,220, 20,154, 97,238,
- 51, 84, 73,148,226,207, 57,244,122,113,169,136,181, 22, 86, 86, 86, 60,181, 90, 9,138,210,149, 26, 85, 8,128, 0,184,108,192,
-169, 70, 29, 36,127, 72,102, 84, 42, 85, 88,133, 79, 80,106,213,166,243,103, 79, 78,253,174,181,159,109,215, 14,203,112,246,220,
- 98, 72,243,243,161,210,114, 32, 87,105,161, 80, 1,150,214,158,104,222,176, 17, 82, 83,179,241,242,201,109, 25, 91,173, 48,100,
-162,232,219, 45, 11, 71,123,140,158, 50, 23,166,181, 90, 67, 29,125, 22,180, 44,189,196,162,101, 34,178,130,117, 77,111,228,202,
-213, 56, 25,250, 12,168, 66,170,151,140,140, 12, 5, 73,146,135,167, 78,157,186,246,217,179,167, 46, 0,240,236,217,179, 20,137,
- 68, 50, 63, 35, 35,163,170, 54,233,226,104,240,132,137,137,233,179,122,245,234,165,250,250,250, 90,244,233,211, 7,182,182,182,
-136,136,136,192,234,213,171,223,104,181,218,185,183,111,223,174,208,213,163,209,104,196,207,206,157, 51,111,251,227,143,150,115,
-123,246, 92, 55,117,234,212, 77,203,151, 47,231,120,120,120, 16, 58,173, 22,145,145,145,204,145,195,135,117,219, 22, 44,216,200,
- 19, 10,217,143,207,159,231, 80,106,181,248,159,190,136,157,157,157,253,253,190,111,227,189,254,183,205, 80, 41,101,120, 20,126,
- 17, 82,105, 38,118,238, 58,227,237,236,204,248,139,197,226,219,134, 10,224,125,251,246,205,110,217,180,105, 83,119, 87, 87, 68,
- 38, 37,128, 71,235,193,165, 40,144, 90, 53, 88,148, 10,174, 62, 12, 8,150, 25, 36,105,249, 88,121,236, 84,148, 33,194,248,155,
-110,189,176, 60, 37, 15, 4, 65, 96, 67, 43, 31,240,204, 68,224, 10, 69,152,252,231,205, 18, 97, 16,178,124, 1,120, 34, 17,234,
-182, 52, 40, 32,188,226,214,173, 91, 79, 35, 35, 35,155,251,248,248, 96,246,236,217, 72, 76, 76, 4, 77,211, 72, 79, 79, 87, 73,
- 36, 18,113,102,102,102, 34, 10,227,255,236,174,100, 16, 43,173, 58,156,111,223,190, 93,226,110, 8, 13, 13, 69,141, 26, 53, 96,
- 97, 97,129,252,252,124, 76,152, 48,193,242,231,159,127, 6, 0, 60,125,250, 20,165, 5,202,167,136,124, 22,189, 62,183,128,145,
- 50,178,231,125,114,168,231, 13,219, 7, 36,163, 83,143, 81,184, 30,178, 31, 55,175,222,128, 53, 59, 49, 1,194,130,203, 89, 9,
- 89,249, 41,114,143, 29,222,205,198,146, 18,249,213, 29,211,122,197,146, 78, 78,244,201, 5,219,243,115, 43, 42,171,135,135, 7,
- 28, 28, 28, 74,230,104,177,217,108,140, 25, 51, 6, 12,195, 24, 42,178,138,198, 26, 58, 83,165, 82, 57,152,152,152, 32, 45, 45,
- 13,239,223,191, 71, 92, 92, 92, 73,232, 0,154,166,117,115,230,204,225, 76,155, 54, 13,219,183,111, 71, 88, 88,216,125, 0,203,
- 0, 24,250,176, 54,116,224,192,129,102, 26,141, 6, 71,143, 30,165, 0,244, 56,121,242,228,211,230,205,155,179,187,116,233, 98,
-182,117,235,214,161, 69,109,100,176,208, 50, 55, 55,231,106,181, 90,108,221,186, 21,201,201,201,254, 0,162, 31, 63,126,188, 99,
-224,192,129,219,124,124,124,234, 69, 69, 69,189,149,201,100,147, 1,188,172,140, 44, 61, 61,125,180,175,175,239, 73,154,166,107,
-117,236,216, 81,248,219,111,191,153,199,196,196,192,197,197, 5, 52, 77, 71,162,138, 41,172,222,190,125, 27, 45,145, 72,188,219,
-182,109,139,203,151, 47,175,209,235,245,171, 0,172,157, 52,105,146,115, 82, 82, 18,154, 54,109, 10,107,107,107,196,196,196, 20,
- 72, 36,146,109, 40, 76, 73, 84,153, 9, 55, 30,192,252, 29, 59,118, 52,218,177, 99,199, 96,107,107,235,111, 35, 34, 34,112,247,
-238, 93,172, 95,191, 30, 63,255,252, 51,218,180,105,131,217,179,103,103, 1, 24, 12,128,138,143,143, 55, 40,110, 94,177,101, 11,
- 0,154, 53,107,150,186,122,245,106,140, 29, 59,150,217,187,119,239,239,135, 15, 31, 14, 28, 58,116,104,201, 24, 56,114,228, 72,
-230,208,161, 67, 35, 81,152,134,233,239,132, 78,171,213,192,220,186, 14,100,185, 31,144,153, 28, 14,129,153, 35, 2,218, 55,134,
- 66,169,193,133,243,167,241, 50,242, 5, 88, 44, 22, 28, 28, 93, 97,105,101,139,216,216,183, 64,197,171,141,117, 90,173, 22,102,
- 86,181, 33,203, 75,134, 38,227, 25, 76, 69,246, 24,245, 99, 31, 40,148, 90,156, 57,123, 26, 81, 81, 47, 65,146, 36, 28,157, 92,
- 97, 97, 89,200, 73, 48, 21,175, 96, 54, 2, 64, 25,241,180, 42, 21, 90, 36, 73,222,186,114,229, 74,255,150, 45, 91,178,223,189,
-123,135,119,239, 10, 31,110,164, 82, 41, 69, 64,127, 42, 35,242,252,144, 10,126,222, 17, 69,171, 51, 74,231, 46, 20,153,153,137,
- 99,222, 68, 59, 72,115,210,241,226,249, 61,188,139,141, 68, 66, 92, 52,180, 90, 21, 72, 22, 11, 44,146,133,218,117, 26,224,222,
-253,112,141,138,162,194,203,227, 44, 44, 71, 92,129,208,222, 99,208,138,229, 63,133,204,156,187,212,116, 64,255,237,120, 25,243,
- 26, 50,202, 17, 12, 3, 56,218, 8,209,196,125, 30,196,169,153, 56,182,127,171,130,214,106,135,125, 18, 67,235, 51, 78, 0,112,
-200, 66,253,109,187,246,143,217, 29,124,100,233,220,105, 19, 28,122,247, 29, 6, 94,206,107,232, 82,159,161, 78,243,174, 32,248,
-150,184,116,237, 38,110, 63,125,157, 78,235,153,165, 14,217,216, 27, 91, 9,103,105,228,230,230, 62, 72, 75,147,184,148,138, 2,
-239,194,231,155, 84,182, 58,238, 83,206,143, 34,206,147, 36,171,217,138, 21, 43,116, 14, 14, 14,218,168,168, 40,108,223,190,157,
-126,246,236,217, 53, 22,139,181, 69, 34,145,168, 42,227,180,211,233, 94, 28, 9, 10,170,223,162,111, 95,102,200,180,105, 10,240,
-249,211,215,109,216, 16,148, 41,149,214, 96,104, 26,118,214,214, 41,235, 22, 44, 88,221,127,224, 64,233,171,123,247, 76,195,207,
-157, 51,229, 81,212, 51, 3,202,249, 53, 80, 46,167, 88, 44,190, 29, 22,118, 23, 7,118,255, 6,173, 86, 13,137, 56, 9, 0,144,
-149,157,135, 74, 68,214,167,156,140, 66,161,232,187,232,231,159, 31, 46,154, 25,232,248,125,135,142,248,240, 34, 2,218,156, 76,
- 16, 58, 10, 28,130, 13,121,134, 0, 25,233, 50,204, 63,116, 34, 67,166, 80,244, 45, 99,144, 40,179,156,197, 22, 43,190,185, 25,
-184, 66, 17,120, 34,179,143,172, 88, 38,230,230,224, 9, 69, 96,243,120,101, 77,224,254,140, 83, 38,147,245,235,223,191,255,203,
-199,143, 31, 91,141, 29, 59, 22,223,125,247,221,115,165, 82,217, 14, 64, 65,117,235,147,166,105,241,247,223,127,207, 34, 8, 66,
- 52,108,216, 48,126,102,102,102, 73,100,117,153, 76,134,203,151, 47,195,203,171,112, 85,255,171, 87,175,208,160, 65,131,114, 57,
-199,205,143, 18, 3, 88, 62,179,191,243,186,135, 47, 36,211, 1,172,169, 83,207, 21, 55,175,222,192,221,155,225, 65,223,250,208,
-155,187, 13,107,254,139,160,221,192,185,222,205,198,146, 34,115, 39, 28, 60,115,154,140,126,182,103,165, 66, 17, 89, 23,219,207,
-206, 41,175,156, 4, 65,128, 97,152,207, 66, 57,144, 36,137,195,135, 15, 87,245,220, 79,236,222,189,123,210,196,137, 19,185, 18,
-137, 4,111,222,188,129, 92, 46,135,137,137, 9,174, 94,189, 74, 1,216,122,248,240,225,171,135, 15, 31,238,130,194,213, 68,161,
- 85,185, 62,133, 66,225,212,128,128, 0,188,121,243, 6, 79,158, 60, 57, 13,224,229,243,231,207, 79,191,123,247,110, 80,155, 54,
-109,176,127,255,254,169, 74,165,114,119, 85, 56,105,154, 46, 29, 51,169, 56,227,195, 11,153, 76,246,109,120,120,120, 85,219, 93,
-146,157,157,221,186, 72, 88, 39, 59, 56, 56,152,191,120,241, 2, 53,107,214,132, 86,171,109, 89,213,107, 41, 47, 47,239,183, 45,
- 91,182,236, 29, 61,122, 52,126,249,229,151, 97, 39, 78,156, 24,214,173, 91, 55,116,239,222, 29,251,246,237,195,203,151, 47,215,
-192,176,180, 98,101,157,251, 75, 0, 47, 29, 28, 28,166,184,186,186, 98,253,250,245,136,140,140, 92,189,124,249,242, 5, 47, 95,
-190,132,151,151, 23, 63, 58, 58,154,170, 78, 31, 2, 0,230,230,230,230, 58,157, 14,231,206,157,123, 4, 96,230,176, 97,195,236,
- 55,109,218, 52, 88, 36, 18, 33, 39, 39, 71, 25, 21, 21, 53, 20,192,249,191,187,175, 99, 8, 98,225,216,113,211,119,140, 27, 59,
-212,196,183, 89, 19, 40,242, 83,160,148,165, 67, 81,144,134, 45,187,175,129, 32, 88,176,179,115,130,189,163, 11,146,146, 62,224,
-254,197, 75, 26,185, 66,185,137,167,163,215, 84,204, 57,173,144,179,105, 33,167, 66,158, 1,165, 44,163,132,211,222,190, 70, 17,
-103, 18,238,133, 95, 82, 41,229,242,223, 52, 12,241,235, 95,124,238,255,201,168, 90,174,195,210,144, 74,165, 51, 38, 76,152,208,
-110,254,252,249, 54, 20, 69,145,214,214,214, 72, 74, 74,162, 78,157, 58,149, 35,147,201,102, 84,167, 52,108, 14,231,165,135,167,
- 87,187,222,189,123, 83,189,122,245,228, 14, 31,221,133,109,103,111,143,188,220,108,196,190,137, 64,204,235,103,240,240,106,140,
- 37,203, 55, 2,150,150,149, 38,146, 44, 74,171,211, 99,217,162, 57,199, 91,251,119, 54,247,106,208,152,219,164,174, 5,180, 58,
- 10, 41, 41, 41, 56,127,238,133, 54,234,233,221,124,154,210, 12, 82,100, 25,150,130,231, 54, 64, 33, 27, 59,125,236,181,135, 87,
-173,219, 50,123,235,206, 3,115,231, 79, 31, 43,108,227,215, 9,145, 55,246,227,116,200,113,185, 74,173, 89,199, 37,177, 33, 42,
- 27,138,216, 42,214,129, 74,165,210,126, 58,158,170, 84, 42,237,151,182,244,190,125,251,144,158,158,174, 73, 76, 76,188, 66, 81,
-212,137, 10,146, 61,127,134, 45,128,166,143, 90,125, 99,145,159, 95,151, 69, 87,175,154,140,156, 55, 79, 51,108,248,240, 57, 80,
-171,181,224,241, 24,182, 80,200, 2,159,207,121,117,239,158,233,239,147, 38, 89, 19, 26,205,245, 3, 21,132, 13, 40, 3, 95,125,
-213, 97,177, 69,171,109,219, 54, 24, 57,118, 38,148,165, 44, 90, 15,158,196, 66,173,133,193, 22,173, 34,124, 72, 76, 78,254,118,
-250,194, 69,103, 6, 5,116,240,246,169, 85,155,111,231, 86, 27, 34, 71, 71,100,103,102,226,222,147, 24,221,242,227,103,162,138,
- 68,150, 65,113,101,104,154, 46,156,228, 14,160,195,140,249, 32, 72, 18, 40, 10,227, 80,188,114,200,173,249,119, 32,216,108,232,
- 25, 26,106,181,218,144, 73,127, 41,239,223,191,239, 55,108,216,176,208,144,144, 16, 86, 64, 64, 64,147,179,103,207,210, 95,114,
-237, 40,149,202,111, 1,192,196,196, 36,193,210,210,210,121,244,232,209,208,233,116, 80, 40, 20,200,203,203, 67, 74, 74, 74,238,
-232,209,163,181, 0, 96,106,106,202,235,223,191,191,121,101,156, 27, 79,137, 85, 51,251, 59,111,182,102, 39, 14,206,207,122,233,
-102,205, 78, 76,248,214,135,222,188,241,148, 88,101, 94, 67,190, 34, 43,241,118,172, 68,126,117,199,193, 51,167,201, 17,125,250,
-233, 93, 68,111,131, 76,236,153, 83,149,241, 18, 4,241, 89,112, 82, 3, 69,214, 71, 40, 40, 40, 88,176,120,241,226,238, 82,169,
-212,165, 75,151, 46, 92,111,111,111, 60,124,248, 16, 33, 33, 33,212,131, 7, 15,146,229,114,249, 79, 0, 84, 0,174, 85,167, 78,
- 61, 61, 61,221,216,108,118,177, 43,237,143,162,205,127,156, 61,123,118,208,216,177, 99, 81,187,118,237,250,209,209,209,124, 84,
-225, 62, 98, 24,166,196,203,240, 53, 65, 16, 68,220,239,191,255,238,236,232,232, 72, 92,190,124,153, 34, 73,178, 58,150,155,125,
-123,246,236,105,169,211,233,198,141, 31, 63, 30,254,254,254,160, 40, 10,135, 14, 29,194,158, 61,123, 12, 21, 89, 21, 34, 54, 54,
-246, 89,114,114,242,247,115,230,204,193,250,245,235, 23,204,153, 51, 7,201,201,201,136,141,141,141,248, 18,222,252,252,124,229,
-135, 15, 31, 4,173, 90,181,242,141,138,138,138,106,215,174, 93,131,177, 99,199, 98,205,154, 53, 76, 88, 88, 88,127, 0,151,255,
-137,209, 59,230, 93, 78, 48, 71,207,190,186,124,197,111, 63,215,117,119,155, 56,102,212, 64,210,211,163, 1,228,121, 41,176,177,
-117,128,139,107, 29,100,102,100,225,202,149,203,250,172,172,220,125,122, 22,177,236,221,187,156,212, 47,225,116,118,169,131,140,
-140, 12, 92,186,116, 73,159, 43,205,223, 5, 29,107,121,116, 82,110, 58,140, 48,196,146, 53, 30, 21, 68,137,175, 8,182, 86, 86,
- 86, 71,205,205,205,211,205,205,205,211,173,172,172,142, 2, 6,173, 62,232, 88,170,119, 32, 63,122,245,239,111, 2, 19,147,111,
-193,102,207,178,180,178,186,108, 97, 97,145,221,182,109, 91,205,142, 29, 59, 84,209,209,175,104,177, 56,153,177,176,176,200, 43,
- 57,190, 44,206, 79, 96,101,229,110, 38,116,106,240,179,133, 75,147,123, 34,167,250, 5, 34,167,250, 5, 22, 46,141,239, 11,157,
-234, 47,181,178,114, 55, 51,168,156,229,160,142, 61,236, 60,108,177,213,203,142, 80,122,216, 98,107, 29,123,216, 25,124,238, 21,
-187,253,244, 4, 1, 61, 10,151, 97,163, 26,156,197, 28, 52, 73,146, 7, 92, 92, 92,156, 80,181,128,117,159,113, 14, 7,106, 15,
-231,243,199,157, 12, 10, 26,153, 16, 22, 54, 44, 63, 62,126, 72, 94, 92,220,192,136,227,199, 7,253, 49,104,208,240, 33,124,254,
-248,254,128,187,161,156, 78, 78, 78,171,159, 61,123, 22, 98,232,171,148,240, 50,184, 62,221,235, 56, 95, 13,232,216,146,153, 58,
-161, 47, 51,117, 66, 95, 38,160, 99, 75,198,189,142,243,213, 47,104, 35,130, 36,201,193, 2,129,224,168, 80, 32,136, 20, 10, 4,
-145, 2,129,224, 40, 73,146,131, 81,241, 28,170,143, 56,109,108,108,158, 58, 56, 56,164, 87,229,101,107,107,251,188, 10,229, 28,
-226,230,230,150,204, 98,177, 54, 86,241,158,174,136,211,195,212,212, 52, 78, 40, 20,166,148,126,153,154,154,150, 14, 12,101, 35,
- 16, 8, 46, 8,133,194, 77,134,112,254,186,176,193,207,247,175, 77,121,249,235,194, 6, 63,127,186,111,218, 15, 86,163, 31,134,
- 46,203,158,246,131,213,104, 67,202,105,111,111, 31,102,111,111, 47,177,183,183,151, 56, 56, 56, 84,248,178,181,181,125,106, 0,
-167,137,153,153,217, 38, 51, 51,179,116,161, 80,168, 23,137, 68,233, 66,161,112, 35, 74,133,182,168,110,125,178, 88,172, 53,245,
-235,215, 87,145, 36,185,247,147, 93,235,235,214,173,171, 98,179,217,235,170,200,105,222,166, 77, 27,253,139, 23, 47, 24,127,127,
-127, 6,128,213, 87,108,119, 71, 43, 43,171,203,230,230,230, 31,204,204,204,182, 0, 16, 86,147,147, 0, 48,216,217,217, 57,162,
-125,251,246, 10,103,103,231,112, 0,189,191, 98, 57,187,255,240,195, 15,244,135, 15, 31, 24,134, 97,152, 15, 31, 62, 48, 63,252,
-240, 3,141,194, 64,145, 95,210, 39, 47,156, 52,105, 18,243,224,193, 3,230,193,131, 7, 76,120,120, 56,211,189,123,119, 26,192,
-143, 95,216,207,227,107,157,187,119, 29, 91,247,111,234, 89,157, 24,218,207,143,190,118,126, 35,179,228,167,137, 76, 39,255, 6,
-140, 87, 93,171, 51, 30, 30, 54, 30, 95,131,243,231,159, 38, 48, 29,191,175, 79,123,187, 91, 29,247,174, 99,235,254, 55,159,251,
-127,163, 85, 11,127,245,132,179,255, 55, 45,126, 44,150,202, 70,141, 26, 53,144,157,221,210,132,205,246,227,243,249,237, 88, 36,
-121, 43, 39, 51, 51,176,232,113, 75,255,119,153,106, 43, 28,208,221,193,171, 32, 37, 65,117, 56, 63,154,200, 94, 77,206,170,112,
- 24,196, 89, 94, 82,105, 90,173, 78,181,161,168,167, 91, 80, 97, 29,124,196,233,236,236, 60,142,166,105, 55, 67, 11,196, 98,177,
- 18,196, 98,241,238,234,212,103,189,122,245,152, 34,247, 54,241, 53,219,253,175,184,150,254,151, 56, 15,254,214,176,134, 87,195,
-111,230, 70, 62,139, 94, 95,228, 86, 44,193,210,105, 86,102,126,237,219, 46,190,119, 51,236,151,165, 91,164, 5,255,240,185,179,
- 96,224,156,182,175,192, 89, 28, 36,180, 74,156, 28, 14,103, 71,139, 22, 45,198, 61,124,248,112,175, 94,175, 31,255, 63,122,125,
-118, 39, 73,114,142,167,167,103,147,216,216,216, 8,189, 94,191, 30,101, 4,138,172, 70, 57,127,114,115,115,155,204,229,114,249,
- 50,153, 76,154,154,154,186, 24,192,137,127, 91,125,122,215,179,246,101,152,146,160,219, 43,223,188,207,121,252,213, 56, 25, 90,
- 79, 51,228,138,216,248,236,231,255, 64,187,255,183,137,172, 93,127,199, 31,119, 52,114, 26, 57,141,156, 70, 78, 35,231, 87,231,
- 52, 53, 62,225,159, 41, 0, 0, 32, 0, 73, 68, 65, 84,214,167,145,243,191,144,243,191, 18,108, 99, 21, 24, 97,132, 17, 70,252,
-199, 65,105,172, 2, 35,140,248,215,161,180, 85,171,196,154, 69, 84,160, 74,171, 98, 18,172,142,178,189, 97,228, 52,114, 26, 57,
-141,156, 70, 78, 35,167,145,243,127,142,243,191, 85,100,237,170,224,251, 95, 6,163, 89,213,200,105,228, 52,114, 26, 57,141,156,
- 70, 78, 35,231,255,130,208, 42,243,187,209,117,104,196, 95,142,205,125,224, 12, 0,211,207, 66,252, 87, 28,111,132, 17, 70, 24,
- 97,132, 17,255, 48,118,161, 28,215,225,191, 65,104,213, 0,240, 45, 10, 19,223,198, 0,184, 11, 64,250, 5,124,182, 0, 6, 18,
- 4, 49, 0, 0, 24,134, 57,137,194, 85, 35, 89,134,252,216,196,196, 36, 93,165, 82,217, 23,125,206, 80,169, 84,165,115, 25, 16,
-248,124, 53, 27, 83,234, 85, 38,220,220,220,210,213,106,181,189, 1,127,159,199, 48,204, 75, 22,139, 21, 41, 18,137,110,198,198,
-198,134, 84,229,196,219,181,107, 55,146, 36,201,149, 0,160,215,235, 23,222,186,117,235,192, 95,216,110, 45, 93,107, 56,238,215,
-234,180, 84,122,102,206, 98,124, 30,200, 15, 0,176,181, 7, 86, 19, 20,230, 22,125, 94, 55, 37,164,226, 56, 58, 85, 61,190, 2,
-248,114, 56,156,169, 14, 14, 14, 93, 83, 82, 82,158, 2,152, 7, 84, 30,213,216,213,213,245, 71, 54,155, 61, 76,175,215,187,147,
- 36, 25, 71, 81,212,225,228,228,228, 96, 99, 31, 98,132, 17, 70, 24, 97,132, 1, 98,235, 51, 84, 73,104,121,217,192,145, 1, 6,
-131, 64, 39, 48,184, 78, 0,199, 98,178,145,102,232,239,187,121, 65,167,163, 10,255,147,203,130,254,242,123,214,174,174, 93,187,
-186, 76,155, 54, 13,223,125,247, 29, 30, 62,124,216,106,223,190,125,163, 79,156, 56,241,146,166,233, 91, 0, 30, 2, 6,133, 82,
- 16,162, 48, 78,203,208,174, 93,187,118, 92,185,114, 37,217,160, 65, 3, 40,149, 74,132,133,133,249,173, 91,183,110,211,253,251,
-247,111, 0, 56, 82, 36, 8,202, 77,128,167, 82,169,236,139,147,113, 18, 4, 97,223,191,127,255,199,165,197, 85, 81,126, 53,130,
- 97,152, 7, 4, 65,132,235,245,250,135,167, 78,157, 74,246, 2, 90, 78,112,227,158, 10, 76,208,186,124,202,169, 86,171,237,207,
-253,186, 10,108, 62, 31,234,130,124,180, 26,245,255,162,247,250,207,115, 65,208, 20, 72, 48,210,118, 43, 54,189, 4, 16,153,154,
-154,250,210,223,223, 63,161,170, 45, 76,146,228,202, 43, 87,174, 56, 49, 12,131,128,128,128,149, 0,254, 42,161,197,255,214,183,
-241,173, 11,167,143,154,200,114,210,209,165,247,160,195,111,147, 51, 70, 2, 56,253,145,104,234, 10, 7,130,192,220, 73,171,142,
-144, 0,176,237,167,161,243, 54,118,198,230,153,215,144, 6,160, 93,145,248, 1,128, 95, 1,220,218,218, 21, 14, 0,230, 79, 90,
-117,132, 0,128,237, 63, 13,157,187,181, 43,126,159,114,185,202, 97, 43, 38,143, 28, 57,114,243,202,149, 43, 73, 39, 39, 39,136,
-197,226, 46,245,235,215,247,204,207,207,175,143, 10, 38, 17,215,174, 93,251,120,155,246, 61,235,244, 29, 48, 88, 96,103,107,133,
- 84, 73,150,249,241,163,123, 39,144, 15,194,186, 38, 38, 38, 14, 50,246, 33, 70, 24, 97,132, 17, 70,148,131,234, 71,134,111,234,
- 4, 83,185, 22, 63,176, 73,226,199,214,190,245, 59, 12,233,214,134, 85,223,187, 30, 94,191,138,238,124,254,230,163,117,172,240,
- 87,161,148,158, 9, 22,114,113,238,185,164,226,149, 48, 58, 10,236,107,231,142, 20,142,132,163,135,146,143, 31, 63,174,215,172,
- 89,179,146,212, 48, 29, 58,116, 64,135, 14, 29,136,109,219,182, 53,190,118,237, 90,227, 61,123,246,104, 67, 67, 67,247,163,226,
-248, 40, 83,235,214,173,187,110,243,230,205,124,127,127,127,240,249,252,146, 29, 34,145, 8, 61,123,246, 68,207,158, 61,201,212,
-212,212,128, 11, 23, 46, 4,252,250,235,175,154,164,164,164, 57,248,255, 40,205, 21, 98,241,226,197,190,101,108,190, 66, 16,196,
-123,138,162, 34, 26, 55,110,156,236, 9,212,155,208,237,187,235,147, 91,123, 8, 3, 23,236, 43,147,135,205,227,225,224,200,194,
-177,186,180,208, 74,184,121, 25, 34,115,179,108,129,153,217, 75, 0,145, 0, 94, 50, 12, 19, 25, 23, 23, 23,253, 13,208,248, 91,
- 43,214,254,189, 82,186, 81, 21,196, 22,146,147,147, 97, 97, 97, 97,234,239,239, 47, 33, 8, 98,105, 88, 88,216,215,158,144,215,
-114,233,220,201, 92,105,226, 75,164,189,121,128, 89, 3,252, 4,129, 91,254,252, 69,165,209,157,174,232, 71, 4,193, 98,253, 26,
- 78, 7,161, 48, 25,239,226,236,236,108,127, 0,176,177,177,225, 1,184,181,241, 17,186,205,108, 77,124, 73,108, 55, 46, 73,146,
- 91,247,237,219, 55,246,199, 31,127, 44, 76, 29,113,239, 30, 68, 34, 17,150, 47, 95, 94,123,246,236,217,171, 41,138,154, 81,158,
- 37,171, 77,251,158,117,126, 95,255, 75,253,130,156, 60,245,206,173, 39,158,212,240,241, 98, 77,154, 58,219,236,119,173,218, 81,
-175,215,255,104,180,108, 25, 97,132, 17, 70, 24, 81, 21,107, 86,165, 66,203,211, 22, 7,154,250,120, 12, 28,210,221,143,223,208,
-167, 1,184,252,255, 15,221,210,204,215, 23,205,124,125, 89, 65,178,130, 78,143,159, 60,235,116,234,218, 67,181, 66,151,116, 34,
- 54, 11, 35, 13, 45, 85,113, 82,218,149,189, 29,218,203,115, 51, 76, 0, 64,104,105,175,250,233, 92,218,205,214,173, 91,195,197,
-197,133, 27, 26, 26, 58,166, 18,161,245, 83, 76, 76, 12,159, 36, 43,142,135, 90,163, 70, 13,244,239,223, 31, 94, 94, 94,188,182,
-109,219,254, 84,158,208, 50, 49, 49,201, 32, 8,194, 30, 0,172,173,173,245, 75,151, 46,141, 96, 10, 1, 0, 12,195, 48, 15, 88,
- 44,214, 67,154,166, 31,253,249,231,159, 41,245, 1,251, 46,205,188,238, 78, 30,222, 95,192,156,218, 84,174, 72, 80,229,231,151,
-185, 93, 32, 18,102,154, 10,133, 47,249, 2,147, 72, 20,230,242,138,116,113,113,137,174, 15,184,180,240,114,187,182,109,230, 80,
-179,189,227,127,169,180, 46,155, 54,109,234,217,168, 81, 35, 19,189, 94, 15,185, 92,142,237,219,183, 91,152,154,154, 90,116,237,
-218,117, 73,233, 11,192, 27,104,216,175, 6, 57,126, 89,170,126, 74, 53, 46, 36,203, 54,173,124, 19,251,247,236,106,238,251,109,
- 27,188,189,117, 8, 57, 57, 5,200,203,149,129,166,233,207,226,250, 76,185,140,244,173, 61,176,110,219,130,161,243, 9, 22,139,
-104,220,103, 30,122, 57,230, 77,223,177, 99,199, 43, 0, 28, 30,143, 87,250, 58,172, 97,234,236,179,174, 94,231, 54,216,190,112,
- 56, 24,154,102, 0,172,171,130, 53,203,222,204,204,236,252,181,107,215, 90, 54,111,222, 28, 15, 31, 62, 68,124,124, 60, 38, 79,
-158,172,153, 50,101, 10,119,196,136, 17,196,172, 89,179,166,253,250,235,175,167, 0,220,255,236, 70, 96,179,135,245,238, 59,136,
- 39,203,205, 87,105,212, 90,141,181,173, 37,173,150,171, 20, 89,210,124,213,160,161,227, 52,175,158, 63, 26, 6,224, 51,161,245,
-133,245,105,132, 17, 70, 24, 97,132, 1, 96, 24,166, 57, 0, 59, 0,153, 4, 65, 60, 41,253,189,232,144,226,108, 45,159,126,207,
- 66,161, 87,202,166, 20, 93, 22, 10,167,251,216, 1,208, 3,120, 76, 16,132,244, 11,139, 88,241, 42,195,144,144, 16,166,244,123,
- 41,161,197, 48, 12,195,232,178,223, 51,234,216,203,140,226,201,238,207, 94,202, 87,167, 25,201,227, 19,204,163, 35, 63, 51,158,
-182, 21,103, 97,239,230, 5,221,208, 70, 96, 38, 53, 7, 51,163,173,165,234,241,227,199,161, 52, 77,135, 4,181, 1,195,188, 62,
-194, 48,175,143, 48, 51, 91,129, 57,117,234,212,149,213,171, 87,135, 4, 7, 7,135, 0,168,108,158, 82,122,193,147,112,230,145,
- 61,152,242, 16, 19, 19,195,236,216,177,131, 89,176, 96, 1,179,119,239, 94, 6,149, 68, 80, 15, 8, 8, 8,139,138,138, 98, 70,
-140, 24, 17,129, 10, 2, 3,122, 3,194, 97,181, 29,223,168,143,111,210,106,126,108,200, 72,191, 55, 41,243,252,157,156,156, 62,
- 42,207, 26, 15, 71,230,143, 22, 30,204,129, 78,205,210, 24,134,185,194, 48,204, 26,134, 97, 6, 49, 12,227, 5, 0, 77, 1,243,
-222, 78, 54,239, 84, 39,126, 87,106,198,127, 91,105,222,187,166, 77,155,122,206,153, 51, 39, 71,163,209, 48, 9, 9, 9,204,206,
-157, 59,153,235,215,175, 51,231,206,157, 99,252,252,252, 82, 75,149,215, 97,180, 87,173,116,205,158,101,234,234, 92, 69, 28,146,
-252,227,201,245, 83,204,187,187, 39,153,199,199, 86, 51,135, 23, 13, 97,166,245,110,169, 53, 55,229,171, 0,180, 47,239,119, 83,
- 90,163,158, 87,109,187,216,164,164, 36, 70,171,213, 50,163, 70,141, 98, 2, 2, 2,152,206,157, 59, 51, 29, 59,118,100, 58,116,
-232,192,180,111,223,158,185,121,243, 38,147,154,154,202,116,108,211, 76,222,195, 27,190, 85, 40,154, 79,173, 90,181,210, 18, 18,
- 18, 24,173, 86,203,132,134,134, 50,135, 14, 29, 98, 66, 67, 67,153,160,160, 32, 6,192,129, 73,147, 38, 41,165, 82, 41, 19, 16,
- 16,144,130, 50,162,198,215,170, 85, 43, 58, 42, 54, 57,121,227,170,221, 55, 15,254,113,244,230,153, 83,215,111,158,191,250,248,
-226,185,171, 79, 78, 60,122, 17,119,174, 86,173, 90,209,101,180,255, 23,213,167, 17, 70, 24, 97,132, 17,149,107,145, 34,161,213,
-189,200,216,209,157, 97,152,142,159,124,239, 94, 36,156, 62,251, 30, 20, 20,180,160,244,247,226, 99,130,130,130, 22, 0, 96, 90,
-181,106,117,148, 97,152,122, 95,161,248,227,203,120, 85,110,209, 42, 6,149,242, 24, 92,143,174,224,232,117,208,101,197,128,206,
- 77, 2,132,142, 80, 18, 34,100, 75,146,240,230,238,233,138, 19, 73, 20,225, 82, 12, 56, 0, 66,163,163,163,241,230,205, 27, 36,
- 39, 39, 67, 32, 16,124,118,220,189,123,247, 96,106,106, 10, 39, 39, 39,195,148,174,230,227,113,238,101,179, 90, 16,181,242, 71,
-214,144,137, 8, 13, 13, 69, 70, 70, 6,184, 92, 46,120, 60, 30, 40,138,170,148,143,197, 42,204,248, 91,108,197, 42,235, 24,127,
-128,205,183, 22, 93,216,182,100,134, 27,235, 65, 8, 71,249,225, 29, 82, 85,122,195, 44,121, 34, 33, 4, 66,129,196,212, 84, 80,
-226, 46, 4, 16, 73, 16,196,219,166, 0, 71, 40, 50,185,176,127,197, 44, 71,242,121,168,137,242,221,203, 50, 57, 58,118,236, 56,
- 1,192, 18,134, 97,114, 27, 53,106,228,176,114,229, 74, 43,177, 88,140,215,175, 95,227,196,137, 19,153, 84,225,137, 18, 12,195,
- 44, 3,128,111, 1, 19, 75, 59,203,171,127,252, 60,195, 12,183,142,243,170,115, 21, 89,120,247,188,216,111,196,164, 41,155,103,
-244,132,188, 64,137, 35,215,159,255, 31,123,215, 29, 22,197,181,190,223,153,221,157,173, 32,210,139, 10, 86,148,162,160, 40, 54,
- 20, 73, 52, 49, 17,141, 37,198, 18, 75, 98,162,215,222, 35,106,140, 37,137,144,104,108, 81,163, 38, 49,150, 27, 11,118,177,183,
-128,177, 43, 74, 81,196,134,128,176, 32,157, 5,182,207,156,223, 31, 44, 43, 34, 11, 11,154,223,205,205,221,247,121,246,153,157,
-157,153,111,207,156, 51,115,206,123,222,243,157,239,224,228,173, 71, 3, 0,252,137, 26,252,222, 54, 92,194, 67, 32,231,237,193,
-131, 7,223,142,137,137,113,248,229,151, 95,160,215,235,171,253,252,242,203, 47, 56,123,241,214, 52, 0, 55,205, 76,150, 91,179,
-102,205,206, 94,187,118,205, 81, 42,149,226,204,153, 51, 40, 44, 44, 52, 42, 89, 99,199,142,165, 10, 11, 11,135,255,244,211, 79,
- 67,158, 62,125,186,242,226,197,139,121, 40, 95, 11,242,165, 7,129,199,227, 61,210,235,181, 94,174,222,173,248, 67,251,247,232,
- 81,146, 23, 7, 43,123, 63, 92,185,243,232,104, 97, 65,158,146,199,227, 61,170,124,254,155,200, 79, 11, 44,176,192, 2, 11,234,
- 6,138,162,162, 8, 33,161, 20, 69, 69, 85,253,173,234,247,138,243,194,195,195,141,251, 21,215, 68, 68, 68, 44,175,180, 95,246,
-134,146, 87,163, 51,124, 47, 3,131,236, 85,221, 73,234,187, 7,160, 78, 58, 12,198,163, 59,132,109, 6,128,231, 17,132,180,184,
- 11,184,115, 98, 53,158, 37,254, 9,194,177,112,109, 29,104,110, 66, 84, 94, 94, 94, 80,169,202, 93,179,212,106, 53, 24,153,173,
-106,214,248,145, 98, 0,224,248, 98,117, 37, 6,107,150, 65,235,238, 33, 8,204, 38,184,238, 92, 46, 84, 4,102,151, 95,247,205,
- 39,159,128, 97, 24, 48, 12, 3,202,224,250, 99, 14,209,162, 12, 39,115,229,195, 87,213, 37,130, 42, 19, 9,126,223,189,120, 74,
-160,232,105,188, 80,157,112, 5,153,106,142, 28,205,102,143,153,147, 94,169, 76,154, 33,145, 74,227, 37, 86, 50, 35,209,162, 40,
-234, 17, 0, 16,129, 96,199,206,165, 83,252,100,217,143,101,170, 27,231, 32, 87,113, 90, 19,102,150,158, 56,113,194,137,207,231,
-187,176, 44,139,180,180, 52, 36, 38, 38, 98,237,218,181,217, 10,133,162, 87,108,108,108,114,101,238,200, 74,132,123,119, 44,155,
-222,156, 31, 23, 45, 86, 63, 74,168,243,211,227,208,118,224,187, 3,122,249, 31,155, 48,106, 33, 6,190,255, 14,198,244,242, 33,
- 41,153,249, 42, 0,103, 12,210,107,109,200,136,141,141,237,211,179,103,207,127,183,111,223,222,155, 16,130,118,237,218, 97,248,
-240,225,216,177, 99, 7,238,220,185,131,226,226, 98,237,233,211,167,215, 0,216,106,102,178,164,182,182,182, 39,207,159, 63,239,
- 40,149, 74,113,250,244,105, 40,149, 74,184,186,186, 98,242,228,201,194,136,136,136,237,197,197,197, 67,195,195,195,197, 41, 41,
- 41,235, 79,157, 58,213, 20,229,235,206,189,242, 16,104, 52,154, 45,191,239,216,182,110,242,148,169,141,206, 95,189,123, 78, 93,
-162,176,241,240, 72, 47,118,180,181,178, 94,243,221, 82,119,141, 70, 51,161,250,252,252,163, 94,249,105,129, 5, 22, 88, 96,193,
- 43,168,145,139, 84, 38, 79, 85,201, 86, 93, 72, 26, 0,101, 88, 88,216, 2,138,162,162,194,194,194, 22,132,135,135, 43, 1,100,
-254, 21, 36,203, 72,180, 66, 67, 67,163,163,162,162, 16, 26, 26, 26,109,210, 4,199, 66,155, 18, 3,109, 74, 12, 36, 93,167,225,
- 72,248,136, 42, 55,207,213, 59,117,253,151,157, 57,175, 86,171,249,219,182,109, 51,250,109, 1, 0,203,178,111,188, 20,235, 66,
-180, 12, 68,239,149, 68, 52, 19, 89, 69,111,153, 57,180,139, 61, 91, 38,208,252,121, 20, 25,106, 78,191,242,161,182,236, 70, 33,
-249,222,148,205, 67, 51, 38, 32,253,226, 89, 72,173,172,210, 63,139,137, 55,170, 88, 6,146,245, 4, 0,154,138,172,207,109,154,
- 62, 48,200,133, 1,163, 57, 22,137, 76, 53,167,222,244, 84,183,213,196,195, 6, 66, 8,158, 60,121,130,178,178, 50, 92,190,124,
- 25,251,247,239,207,169,134,100,161,153,200,234,143, 95,191,248,184,115, 3, 69, 22,163,185,113, 22,153,106,206,172,161, 46,135,
-118, 3,187, 51, 52,117,154,162,121,146,183,187,180,198,140,207, 7, 97,245,175, 71,244, 26,167, 30,161,235, 14, 31,255,168, 68,
-173, 93, 96, 38,201, 50,138,141,177,177,177, 62,177,177,177, 34, 0, 33,195,135, 15, 63, 62,100,200, 16, 68, 71, 71,227,232,209,
-163,158, 0,228,134,243,150,161,124,161,236,239, 1, 60, 54, 37, 60, 50, 12,179,251,236,217,179,190,110,110,110, 56,123,246, 44,
-148, 74, 37, 38, 78,156,168,153, 50,101, 10, 51,118,236, 88,170,168,168,200,168,100, 93,190,124, 57,207, 20,201, 2,128,140,140,
-140, 19,251,247,238,236,214,179,103,207, 65,205, 61,219, 52,120,172, 40,126, 46,149,138, 37, 23,163, 47, 48, 55,174, 93, 90,159,
-145,145,113,189,250,252, 60,103,118,126, 90, 96,129, 5, 22, 88, 96, 26,102,113,145, 42,202, 84, 93, 80,233, 58, 65,120,120,120,
- 98,120,120,248, 75,138,215,107,162,234,172,195, 99, 21,109, 90,189,226,104,177, 69,105,175,222, 0,199,213,229,102, 95,249,205,
-214,214, 86, 47,145, 72, 94, 34, 90,156,153, 54,243, 15,238,194,227, 73, 35,141, 74, 86,133,178,133,190, 99, 95,139,104,113, 28,
-119, 25,192, 75,137,144, 58,181, 30,177,166,191,119,119,159,230,141,104,221,222,181,120, 86,166, 87, 45,190,175, 85, 37, 41,200,
-128,123,213, 56, 89, 27,109,234,117, 16,203, 36,169, 18, 43, 89, 85,146,245, 20, 0,100,206,158, 67, 86,190,215,166,151,127,155,
-150,180,126,207, 42,100,148,233, 74,194,238,105,181,143, 75,201, 1, 19,121,184,248,157,119,222, 89,108,111,111, 47, 94,183,110,
-157,141,135,135, 7,244,122,189,166, 42,201,146, 58,181, 30,177,118, 96,219,238,173, 93,108,105,221,190, 31,145,174,100,203,214,
- 62,214,109, 55,135,100, 57,216, 88,157,218,180,124,146, 68, 42, 18, 64,165, 82, 33, 98,227, 62,156,190,148, 16,154,155,112,232,
- 20,128, 83,175,241, 64,126, 22, 26, 26,186,122,217,178,101,208,233,116, 24, 55,110, 28, 30, 61,122,116,250,254,253,251,107,221,
-221,221,231,124,241,197, 23,110, 46, 46, 46,248,232,163,143, 24,157, 78, 55,214,132,141,239,126,255,253,247, 80,127,127,127, 68,
- 71, 71,163,176,176, 16,174,174,174,152, 50,101,138, 48, 60, 60,124,123,113,113,241,208,229,203,151,139,159, 60,121, 82,163,146,
-245,210,115,205,178,223,108, 94, 61,105, 78,167, 46, 65,244,195,135,201,250,180,192, 96,250,194,217,163, 49,246,246,246,219,211,
-210,210, 94,228,231,160,118,117,206, 79, 11, 44,176,192, 2, 11,222, 12, 40,138, 58,102,240,187,122, 73,229,170, 74,194, 42, 20,
-171,202,251, 85,207, 55, 28,127, 19,157,229, 45,213, 16,175,151,195, 59,132,134,134,154, 61,173,158, 43,205, 49,139, 60, 85,197,
-251,109,160,107,100, 5,254,130, 96, 26,140,204, 86,213,127,217,153,243,166,206,149,201,100,102, 43, 90,156, 90, 85, 91,161,212,
-137,104, 25,124,180, 78, 18, 66, 94, 34, 90, 54,206,173,131,231,125, 49,125, 77,208,144,190,116,246,231, 93, 81, 88,162, 86,127,
-113, 87,207, 61, 43,171,153,100,149,183,226,186, 20,169,204, 42, 94, 44,147, 86, 38, 89,105, 0, 32,118,106, 25, 56,119,198,228,
-141,111,141,232, 79,229, 76, 12, 66, 65,161, 82, 61, 39, 81, 79,101, 40,201,208,123,192,133,234,204,157, 63,127,126, 51,128,205,
-193,193,193,217, 50,153, 12, 37, 37, 37,175,148, 65, 69,122,187, 15,233, 75,103,127,214, 25,249,165, 90,245, 23,137,122,100, 42,
-185,221,181,145, 44,199,134,214,167, 54,125, 59, 73,154,249,236, 41, 24,134,129,149,149, 21,206,252, 25,143,220,196,195,175, 67,
-176, 64,211,244,146,176,176,176,197,147, 39, 79, 70, 94, 94, 30,142, 30, 61,138,247,223,127, 31,187,118,237,242, 56,126,252,248,
-234,144,144, 16,240,120, 60, 68, 69, 69, 65,167,211, 61, 48, 97,102,208,248,241,227,231, 12, 25, 50, 4,215,175, 95,135, 92, 46,
-127, 73,201, 42, 44, 44, 28,190,113,227,198, 33, 41, 41, 41,181, 42, 89, 85, 16,216,172,101, 7,102,254,162, 31,160, 46,123,206,
-207,201,184, 26,125,238, 12,125, 37, 63, 63, 95, 10,160,168,190,249,105,129, 5, 22, 88, 96,129,217,170,150, 41, 46,146, 99, 32,
- 81, 57,213,237, 87, 34, 88,213,237, 83, 85, 84, 48, 77,149,227,119,254,202,123, 50, 75,209,226, 59,183,133, 62, 59,161, 18,209,
-122,254,210,113,177,181,157, 89, 67,135, 58, 61,248,155,182, 26,227,104,137,243,242,242,196, 14, 14, 14,170,202, 4, 65, 42,149,
-194,205,205, 13, 5, 5, 5,216,178,101, 11, 80,187, 83,180,190,193,144, 81, 8, 28, 49, 14, 55, 26, 11, 65,116, 90,163,178,181,
-233,147, 79, 94, 34, 91, 12,195, 84,248,134,213,214,232, 94, 51, 40, 77, 87, 0,144, 14,158,205,191, 22,203,100,159,136, 29,154,
- 56,204,152,244,153, 32,229,185, 26,231,131,230, 23,238,251,110,158, 85, 58,177,154,156,134,162, 75,181,216,123,252,193, 79, 59,
-171, 42, 89,207,218,123, 54, 95, 40,150,138, 63, 23,218, 53,117, 9,155, 53, 73,144,146,173,166,206, 7,126, 81,188,255,251, 47,
-164, 79, 96, 61,231, 25, 10, 47,152, 81, 60,139,223,127,255,253,197,132, 16,194,113,220, 34, 0,168,156,222, 89, 83, 62, 23, 60,
-206, 82,225, 92,208,194,130,253,223,205,179, 78, 71,205,233,117,104, 55,176,187,179,109,131, 83,155,150, 79,150,202, 51, 82, 33,
- 18,137, 96,109,109,141,244,236, 34, 8,248, 60,229,107, 62,111,162, 30, 61,122,204,155, 52,105, 18,226,227,227, 49,113,226, 68,
-121, 90, 90,218,129, 61,123,246, 76,252,234,171,175,248,239,190,251, 46,228,114, 57, 86,172, 88,161,251,243,207, 63,151, 3, 88,
- 81,237,243,200,231,127,246,245,215, 95,147,204,204, 76,234,201,147, 39,112,117,117,197,212,169, 83,133,203,151, 47, 55,250,100,
-213, 69,201,170, 64, 70, 70, 70,244,233,179, 87, 48,224,196, 26,232,117,234,232,194,188,180,152,164,199, 5,209,118, 66,225,236,
- 70, 29,218,213, 43, 63, 45,176,192, 2, 11, 44,120, 35, 42,214,141,154,246,255, 6,168,110,232,208, 44,162,245,224,199,133,159,
-122,126, 58,121, 46, 36, 30,221,161,190,119, 16, 92, 73,182, 81,209, 18, 91,217,194,206,221, 27,133,165,106, 68,158,187, 5, 0,
- 15,234,146, 42,133, 66,129,128,128, 0,108, 24,219,250, 45,149, 34, 79, 44, 1,160, 22, 53, 80, 29, 18,246, 56,127,252,248,241,
- 50,142,227,118, 3, 56, 94,139,153, 37,190,190,190,235,127,248,225, 7,161,247,136, 79, 81,114,245, 98, 85, 5, 5, 18,137, 4,
- 34,145, 8,113,113,113, 56,127,254,188, 6,192,146, 90, 10,244,154, 94,175,191,179,103,207,158,103,173,154, 55,234, 27,208,222,
-111,218,130,249, 97,214,119, 47,158,198,162,229,235,185, 86, 29,223, 45,138,216,117, 72, 81,100,229,254,182, 82,126,255,182, 25,
-183,122,167, 10,201,202,244,106,214,228,173,246,109,125,231, 46, 90,180,176, 65,226,197, 51,248,234,251, 77,196,211,191,119,209,
-247,251, 15, 23,231, 74,155,190,163,122,158,116,221,156, 60,140,142,142,222, 12, 96,115,197,126,213,244,134, 45, 91,203,181,238,
-212,183, 32, 98,215,254,210, 98,107,247,222, 53,165,215,209,123, 80,183,198,142,182,167,126,252,230, 95,210,172,140, 52,136, 68,
- 34, 88, 89, 89, 33, 77, 94,136,197,107,246,150,106, 57,174,239,235, 18, 45,107,107,107,145, 86,171,197,134, 13, 27,144,150,150,
-214, 21, 64,218,205,155, 55, 55, 13, 27, 54,108, 93,187,118,237,188, 18, 19, 19, 31,148,148,148, 76, 6,144,100,202, 72,195,134,
- 13,187, 58, 58, 58, 82, 87,174, 92,193,191,254,245, 47,205,212,169, 83,153, 49, 99,198, 80, 5, 5, 5,245, 85,178, 0, 0,141,
- 26, 53, 10,238,243,118, 23,116,239, 51, 49, 90,163, 42,140, 73, 73,218, 30, 77,147, 75,226,250,230,167, 5, 22, 88, 96,129, 5,
-255, 51,168, 95, 96,240, 96,128,223,218, 30, 19,124, 27, 49, 89, 59,190,155, 74, 20,143, 47, 19,229,245,205,164,248,224,231,228,
-216,138, 49,228,248,143, 51,200,196,126,190,196,203,137,202,106,109,143, 9,193,175, 18,183,151, 86,247,126,191, 13,116,125, 90,
-130,244,105, 9,210,175, 53,116, 0, 22,116,232,208,225,208,148,192, 23,113,180,166, 4,130, 0,248, 23, 0, 43, 19,201,170,110,
-197,112, 87, 0, 91, 2, 2, 2,244, 23, 46, 92, 32,247,135,246, 38,177, 94, 14,100,242,228,201,228,171,175,190, 34, 35, 71,142,
- 36,142,142,142,122, 67, 70,184,214,102,115,192,128, 1,141, 1,160, 73,147, 38, 13, 59,122,183,202,138, 59,119,148,196,236, 88,
- 71,126,157, 50,152,116,110,231,157,235,226,213,243,142,196,181, 77,251, 90,178,207,104,211,197,197,101, 62, 33,164, 47, 33,196,
- 21, 0, 60, 61,237,173, 58,120,181,202,188,115,246, 40,185,184,115, 61,249,117,202, 96,210,197,207, 39,175,177,119, 72,146,216,
-201, 43,208, 28,155,213,161,218,244,182,245,202,117,110,213,237,118, 13,233, 53,218,108, 30,248,209,225,103,153,217,228,218,181,
-107,228,248,241,227,228,226,197,139,100,199,158,195,196,189,211,208, 18,135,118, 3,187,215,225,209, 49,149, 78,155,126,253,250,
-145, 7, 15, 30,144,247,222,123,143, 0,176,169,167,205, 67, 41, 41, 41, 36, 33, 33,129, 44, 88,176,128, 0,216, 54,105,210, 36,
-101, 81, 81, 17,233,221,187,119,154,129, 96,241,235,147,206, 22,205, 26, 69, 12,234,223, 99,201,148,127, 13, 9,126,221,252,124,
-131,176,216,180,216,180,216,180,216,252, 95,176,249,223, 12, 87,131,170, 85,177,237, 96,150,162, 21, 13,232,145,135,205,109,157,
-180,255, 94,190,226,199,217, 27, 54,111,155, 59,111,218,103,178, 30, 65,125, 16,127,246, 55,236,143,218, 83,170, 82,107, 86, 48,
- 60,252,144,144,135,178,228, 90, 82, 97,136,163,245, 18, 98, 99, 99,165,118, 45, 95,196, 96,122, 88, 30,155,117, 83, 29,111, 80,
- 14, 96,252,173, 91,183,126, 8, 9, 9,249,246,243,238,129,131,167,116,123, 11, 58,157, 14, 59,118,236, 64,106,106,234, 1, 0,
- 11,205, 85,220,226,227,227,115,125, 90,122, 76, 23,240,248,115, 39,143, 28,228,152,243,232, 46,158,221,139, 5, 0,168,213, 74,
- 93,214,131, 24,255,186, 36, 78, 34,145, 92,115,116,116,188,239,232,232, 88,208,186,121,147,241, 34, 8, 22, 77, 28,254,129, 83,
- 94, 74, 18,210, 19,203, 71, 70,213,170, 50,237,179, 7, 23,188,234, 83,186, 30, 30, 30, 34,153, 0, 19,170, 77,175, 70,165,203,
-126,152,212,222, 28, 59,101,106,205,242,165,171,119,188,243,205,220, 79, 68, 13, 26, 52,192,173,132,135, 88,180,106, 87,169, 82,
-163,235,155, 27,127,232,141, 12,143, 17, 66,160,211,233,204,158,232, 96, 2,243,252,253,253,219,124,251,237,183,158, 99,199,142,
-197,235, 42, 89,149,241, 56, 37, 35,172, 81,147, 22, 62, 15,239,223, 10,177,147, 48,255,126,157,252,180,192, 2, 11, 44,176,224,
-127, 6,253, 12, 98,206,248, 74,219,216, 90,137, 86, 5, 18,158,163, 12,192,178,230,188,146, 77,243,191, 93,189,152,166,214,124,
-194, 17,242,155,158,198,210, 39,121,200,121,205,196,149, 9,248,208,191, 51,112, 36, 31, 0, 4,252,250, 53,144, 6, 60, 0, 48,
-228,231, 75,215, 59,253,124,233,250,151,134,223,190, 1, 80,167,177, 92,107, 62, 18,130,124, 90, 52,234,209,193, 87,204, 99,149,
-120,118,239, 17,242, 75, 85, 56,147,152, 90, 72, 19,250,183,186, 38,234,201,147, 39,127, 0,128,179,141,244, 94, 15,159,150,238,
- 61, 3,124,165, 2, 74,131,103,119,111,161, 72,169,193,233,196,212, 34, 80, 84,189, 29,170,223, 84,122,179,227, 15,223, 56, 2,
-170, 55, 69, 81,103, 23, 76, 25, 33, 90,188,106,247, 27, 37, 89, 0,202, 50, 50, 50,242,202,202,202,236, 51, 51, 51, 53,168,127,
-144,184,135,197,197,197,237,102,204,152,177,108,206,156, 57,115,191,251,238, 59,166, 62, 62, 89,166, 80,144,145,122,176,167,239,
-155, 43,127, 11, 44,176,192, 2, 11,254, 39, 48,190,202, 22,102, 19, 45, 35, 97,120,142, 28, 0,147, 91,180, 32,179, 30, 63,134,
-230, 77,165,172, 58,165,235, 53,113, 3, 64,255,122, 95, 77, 83,138,171, 15, 82, 75,174, 61, 72, 45, 1, 71, 8, 71,136,154,166,
-145, 94,170,213, 46,127,240, 36,163,254,179,238, 40,138,189,241, 48, 77,121,243, 81,186,138,112, 28,225, 8,209, 80, 20,178,116,
- 58,110,121,226,147,212,195,127,135,244,230,198, 31,186, 20,165,167,122, 92,186,150, 48,171,180, 84,187, 62,247,222,161,203,111,
-176, 92,116,241,241,241, 31,119,237,218,245, 83,150,101, 55, 1,208,189,134, 45,141, 94,175,159, 23, 17, 17,113, 32, 62, 62,126,
-239,229,203,151,229,111,130,100,253,165,229,111,129, 5, 22, 88, 96,193, 63, 21,245, 91, 84,218, 20,222, 36,201,250, 59, 34,225,
-225,211,128,191,194,110,226,195,167,109,255, 27,210,155,125,239,224,205,108, 96,248, 95,148,189,167, 89,150, 61,253, 38, 73,245,
-201,147, 39,155,161,154,101,117,254,110,229,111,129, 5, 22, 88, 96,193, 63, 22,227, 77,145, 47,190, 37,111, 44,248, 7,128,188,
- 41,146,101,129, 5, 22, 88, 96,129, 5,245,128, 73, 69,139,130,233,153, 3,103,235,240, 7,245,153,125,112,214, 98,211, 98,211,
- 98,211, 98,211, 98,211, 98,211, 98,243,127,206,230, 63, 17,174, 40,119,136, 63,102,216,214, 72,190,222, 36, 44, 83, 95, 45, 54,
- 45, 54, 45, 54, 45, 54, 45, 54, 45, 54, 45, 54,255,233,168,214, 17, 30, 40,119, 30,182,192, 2, 11, 44,176,192,130,255, 38,136,
- 12,159,250, 30,183,192,130,191,154,108, 25, 9, 87,125,124,180, 90, 25,182, 15,255,194,196, 78,113,117,117, 29,239,231,231,231,
-205, 48, 12,173, 80, 40,150, 94,184,112, 97, 73,213,147,122,248,240,111,242,104, 52,126,241, 11, 5, 80, 60,128,166,193, 18, 60,
-187, 24,167,236,104, 41,247,191, 53, 60, 36, 13, 28,143, 80, 52, 79,200,234,181, 96,117, 90,148,187, 91,149,131,227,244,169,172,
- 86,253,174,169,139, 93,252, 7,185,235, 89,238, 59,128,108, 0,232, 73, 0,183,145, 2,127, 34,129,254, 39, 10,188,127,129, 71,
-190, 7, 75,125,193, 23,240,230,203, 99,247,165,255, 19, 50, 44, 50, 50,146,247, 58,215, 15, 29, 58,180,218, 5, 68,221,220,220,
-162,164, 82,105, 75, 83,215,149,150,150,202,229,114,121,200, 63,252,121,236, 9,224, 71, 0,190, 85,126, 79, 2, 48, 29,192,185,
-215,253,131, 96,128,239, 12, 76, 96,128, 47, 0, 64, 11,124,159, 13,108,142,254, 27,249, 24, 58, 58, 58,198,240,249,124,207,210,
-210,210, 82,133, 66,209,194,218,218,250,177, 76, 38,147,233,245,250, 7, 57, 57, 57, 61,107,186,150,148, 79, 74,169, 21,109, 1,
-235,100, 96, 24, 75,211, 83, 5,192, 6, 53,199,109, 50,212,224,230, 44,112, 59, 9, 47,150,231,154, 11, 96, 99, 29,143, 91, 96,
-193, 95,129,215,154,117,216,186,188,126, 64, 48,128,158,157, 58,117,114, 46, 45, 45, 69, 82, 82, 82, 54,128, 24, 0,209,134, 79,
-242,155, 72, 41, 77,211, 43, 87,175, 94, 61,123,234,212,169,198,197,160,227,226,226,224,239,255,106,140, 80, 30,141,198, 23,142,
-158,117,186, 17,159,140, 78,189, 63, 52, 16, 45, 26, 40,149, 35,164, 79, 96,125,147, 96,109,107,107,187,148,162,168,161, 52, 77,
-215, 90,105,112, 28,199, 18, 66, 34, 11, 10, 10, 22, 3, 80,212,229,143,100, 82,145, 78,207,178,213,254, 7,159,199, 99, 75,203,
-212, 38,195, 94,216,217,217, 93,166,105,186,121,229, 5,179,129,151, 23,208, 54,117, 76,175,215, 63,203,205,205, 53,135,132,138,
-105, 62, 51,157,162,152, 62,160,185,214, 0, 5, 10,116, 50,199,106,206,112,122,237, 90, 0,170,215, 33, 89,174, 77, 90, 92,156,
-185, 48,162,113,194,189, 36, 44,152, 50, 18,223,253,184, 13,243,167,127,138,181, 91,118, 97,250,248, 17,240,241,241,173,177,214,
-229,192, 44, 95, 56,109,104,239,240, 13,123,131,230, 79, 30, 42, 10,223, 16,217, 99,193,148, 97,194,229,235,247,246, 88, 48,229,
- 35, 81,248,250,189, 65,243,167, 13,149, 44,223,184,143, 3, 48,170, 62,137, 28,225,233, 86, 74,233,245,213,246,140, 9,159,175,
-222,245, 32, 83,246,159,120,163,199,142, 29,235,167, 84, 42,111,141,236,211, 33,162,125,235, 70, 25,213,157,147,151,149,209,232,
-241,253,216, 48, 1, 35, 9,248, 32,108, 91, 92,141,242,128, 72,212, 60, 41, 41,201,147,227, 56,176, 44, 11,189, 94,111,220,106,
- 52, 26,244,236,217,243, 77, 77,156,233, 15, 96,105,249,203,138,112, 0,123, 95,195,150, 21,159,207,159, 41, 20, 10,131,245,122,
-189, 55, 0, 8, 4,130,123,106,181, 58, 90,175,215,175, 6, 80, 82, 71,123,107, 50, 50, 50,124,172,172,172,160,213,106,141, 11,
-208,243,120, 60, 47,119,119,247, 13, 42,149,202,243,117,111,222, 25,152,208, 45, 40,104,237,152,217,179,121,202,152, 24,172,221,
-186,117, 13,138,139, 1, 96, 67,109,215, 10,133,194, 83, 52, 77,123,212,229,255, 56,142, 75,213,104, 52,239,214,229, 26, 62,159,
-239,153,153,153,233,228,230,230, 6,133, 66, 1,153, 76, 38,171,216,127, 29, 68, 3, 84, 95,160,167,158,199,155, 97,239,224,208,
-227,214,233,211,178,182,109,219,210, 60, 30,111, 62,204, 15, 82, 45, 2,176,130, 16, 34, 49,180, 23,107,187,116,233,210,149,162,
- 40, 61, 0,194,113, 28,125,237,218,181, 17, 28,199,241, 13,117,222, 10, 0, 91, 1,168, 45, 60,192,130,255, 7, 53,107, 75, 93,
-137,214,113, 0,193,157, 58,117,146, 12, 31, 62, 28,193,193,193,240,244,244,132, 88, 44, 46,175,196,243,242,156,111,223,190,253,
- 81, 76, 76,204, 71, 71,143, 30,197,221,187,119,149, 0,254, 4, 80,237, 75,253,118,104,208, 84,177,149,104, 29, 0,228, 60,203,
-147, 63,123,242,124,157, 92, 46, 95, 1,160,114,136,240, 22,163, 70,141,154, 53,109,218, 52, 68, 69, 69, 97,215,174, 93, 80,171,
-213, 80, 40,106,224, 47,101,207, 81,112, 62, 2,144,165, 0,105,209,128,212, 9,144, 57,215, 59,167,108,109,109,151, 78,159, 62,
-125,134,143,143,143, 49,138,185, 78,167,131, 94,175,135, 78,167, 67, 65, 65, 1,102,205,154, 85,222,208, 18, 2,142,227,112,226,
-196,137,169,227,199,143, 71, 65, 65,193,204,234,108,118, 9,104,114,147,166,232,198, 21, 90, 13, 97,217,103, 87,111, 63,235,168,
-103, 89,158, 74,165,173,118,165,114,177,152,169,145,228, 9, 4,130,198,119,143, 28,113,162,133, 66, 16,150, 5, 56, 14,132,227,
- 12,217,105,248,144,242,223, 8,203,129,232, 88,112,122, 14,122,165, 26,129,147, 38,153,147, 21,221, 4, 66,201,174,143, 63,159,
-237,210,185, 75, 23, 65,211, 38,110,208,179, 28, 30,165, 60,115,185,117,243,106,247,200,237, 27, 38,106,148,138, 17, 0,234, 21,
-103, 75, 40,109,112,122,253, 79, 63, 55,190,113, 59, 1,231, 46,196,224,236,249,104, 0,192,169, 11,151, 43, 8,119,173, 69, 5,
-125, 73,187,233,227, 6,138, 34,214,239, 22, 76, 31, 55,136,247,221,250, 61,130,105,159,126,192,139, 88,183,139,153,246,233, 7,
-188,136, 31,119, 49,211,198, 13,228,133,175,253,213, 15,128, 45,128, 2, 83,198, 76,149, 17,165,215,139,254,253, 56,155, 7, 0,
- 57,155, 54, 65,247,252, 57,220, 22, 47, 6, 0,124,220,194,217,236,161, 9, 7, 7,135,155, 2,129,160,113,109,231,233,116,186,
- 90, 73,240,216,177, 99,253,149, 74,229, 77,189, 94, 79,248,124,126,216,200, 65,239, 28,234,219,195, 63,175,242, 57,113,113,119,
-236,151, 47, 63, 50,112,239, 45, 5,249, 40,192,250, 86,212,202,177, 29, 67,231,108,187, 83, 67,131, 76,171,213,106, 60,120,240,
- 0,149, 23,121,175, 4,182,158,175, 20, 13, 96,173,189,189,125,231,188,188,188,143, 1, 44, 40, 46, 46,246,227,241,120,176,179,
-179, 91,160,209,104, 30,217,216,216,252, 82, 84, 84,116,217,160, 26,153,187,100, 64,207, 6, 13, 26,236, 56,120,240,160,109,135,
- 14, 29,232,220,220, 92, 52,107,214, 12,249,249,249,129, 49, 49, 49, 1,227,198,141, 27,167, 80, 40, 70, 27, 58,131,230,162,141,
- 84, 42, 37, 99,198,140,161, 88,246,197,237,254,250,235,175,120,183,173,190,165, 99, 67,105,153, 74, 67,138,206, 61,176,249, 23,
-195, 48,127,166,166,166, 22,213, 53, 51, 24,224,139, 49,179,103,243,172,158, 62,133,213,157, 59,248,184,184,152,255, 93,185,186,
- 85, 43,209,162,105,218, 99,199,174,223, 60,133, 66, 33,244,122,189,145, 12, 86,212, 81, 58,157, 14, 90,173, 22, 58,157, 14, 44,
-203, 66,167,213, 33,252,155,239,235, 93, 23, 74,165, 82,169,171,171,107,182, 84, 42,149,190, 38,185,116,207,167,233,207,219, 7,
- 4,140, 95, 60,112,160,248,250,245,235, 98,154,166,161,215,235,177, 98,197, 10, 61, 33,164,161, 15,208,224, 46, 80, 92, 87,219,
- 34,145,136,191,125,251,246, 17, 66,161, 16, 0,160,209,104,208,182,109, 91,202,210,230, 91,240, 31, 36, 91,175,168, 92, 53, 17,
-173,247,138,139,139,193,178, 44,172,173,173,193,227,189,220,238,219,219,219,163, 79,159, 62,232,217,179, 39,134, 15, 31,142,187,
-119,239, 74,134, 15, 31,222,199,148,177,145,179, 67,209,196,211,217,208,152,112,174,151,142,221,142,248,245,235,125,142, 89, 89,
- 89,179, 43,157, 54,110,194,132, 9, 84, 94, 94, 30,134, 14, 29, 26,163, 86,171, 7,160,134,151,143,229,240, 44,100,248,199,224,
- 8, 37, 89,125,237,103, 74,163, 82, 18,154,166,149, 21, 67,135,245,201, 37,138,162,134,186,185,185, 97,247,238,221,208,104, 94,
- 13, 23,214,160, 65, 3, 36, 38, 38,190, 80,213,120, 60,116,233,210,133, 71, 81,212, 80, 0, 51,171,183, 73, 55,190,116,227,169,
- 83,197,126,104, 31, 95,166, 75, 0,157,157,153, 93, 74, 0, 80, 11, 23, 46, 52, 18, 55, 0, 88,186,116,169, 57,233, 4, 45, 16,
- 32, 39, 58,250, 69, 69,204,167, 65, 51, 20, 40, 1, 64,243,203, 71, 81, 65, 0,194, 2,156, 30,224,116,128,216,181,137, 57,217,
- 16,216,200,221, 51,106,249,170,141, 13,213, 58,130,221,135,207, 33, 37,229, 9,120, 52,141, 22, 45, 61,241, 78,175, 30,130,128,
- 78, 93,155,124,191,100,246,209,204,180,135,239, 1,184, 94,231,140,230,136,184,165,187, 3,126,249,245, 22, 28,109,173, 48,116,
-224,251,144,136, 69,248,238,199,223,240,205,252, 41,240, 57,211, 49,121, 0, 0, 32, 0, 73, 68, 65, 84,108,225,129,205,107,190,
- 53,121,185,141,141,205, 50,111,207,150, 30, 27,183, 31,131,183,151, 23,111,227,142, 99,240,246, 49,108,125,189,121, 27,119, 28,
-131,143,175, 15,111,227,142, 99,240,243,109,211,244,166,252,218,178,252,252,252, 41,166,243,179, 74, 25,189, 83, 94, 70,130, 18,
-206, 88,105, 63,157, 56, 17, 0,140, 68,171, 46, 16, 8, 4,141, 51, 51, 51,157,106, 59,175, 54,213,192,160,100,221,212,235,245,
-120,254,252, 57, 85, 88, 88, 72, 26, 54,108, 56,240,228,230, 5, 7,223, 13,242,207, 7,128, 59,119,238,216,133,135, 47, 31,184,
-231,102, 49,148, 87,215, 83,255, 62, 18,205,125, 60, 32,248,230,225,136,177, 1, 48, 44, 9, 81, 21,106,181, 58,165,125,251,246,
-196,240,189,145, 72, 36, 98,170, 60,111,110,173, 90,181,122, 69,181, 54, 99, 72,113,237,149, 43, 87,166,248,248,248,192,203,203,
-235,114,231,206,157, 27,200,100, 50,156, 60,121, 18,222,222,222,190, 13, 26, 52,184, 22, 25, 25, 41,152, 55,111,158,255,214,173,
- 91, 1, 96,170, 25,217,217, 59, 36, 36,100,119, 84, 84,148,152, 97, 24, 40,149, 74, 36, 38, 38,194,198,198, 6, 66,161, 16, 31,
-124,240, 1,175,123,247,238,246,189,122,245,218,159,156,156, 60, 2,117,152, 1,165, 82,169,200,130, 5, 11, 32,149, 74, 33,149,
- 74, 33,147,201, 32,147,201, 96, 37, 6,181,105,186,187,100,218,150, 66,201,204,197,155, 34,118,108, 92,114,161, 73, 19,238,171,
-244,244,244,194,186, 62, 11,202,152, 24, 88,221,185, 3, 84,122,119,205,133,141,204, 14, 97, 97, 97,181, 41, 82, 96, 24, 6,221,
-186,117,171,213,158,157,157,221, 1, 62,159,255, 82,207, 84,175,215,139,195,194,194,216,228,228,100, 25, 77,211, 50,142,227, 16,
- 22, 22,198,234,245,122,177,147,147,211,101,142,227,178,115,115,115, 7,215,100,183, 23, 32,190, 12, 12,162, 4,130,153,174,110,
-110,205,130, 91,180,144,158, 61,123,150, 7, 0, 30, 30, 30, 68, 46,151, 23, 30, 62,124, 88,193, 7,126,242, 32,100,123, 29, 72,
-150, 26,192, 92,154,166,215,138, 68, 34,126,211,166, 77, 83, 23, 45, 90,116,197,160,144,130, 16, 66, 55,109,218, 52, 80, 34,145,
-120,168,213,106, 61,202,135, 14, 45,106,214, 63, 0,132,144,128,114,222,110,132, 6,128,176, 66,192, 47,111,237,224, 80,229,119,
- 0,200, 53,116, 20,157, 77,236,231, 1,184, 11,160, 13, 0, 39,195,177, 27, 20, 69,229,215, 35,153,166, 21,173,168,168, 40, 99,
- 23, 54, 52, 52,212,216,176, 88, 91, 91,227,198,141, 27,160, 40, 10,214,214,214,104,208,160, 1,108,108,108, 80, 92, 92,140,187,
-119,239, 34, 41, 41, 9, 79,159, 62, 5, 69, 81,104,209,162, 5, 42, 30,246, 74, 48, 86,112,191,255, 16, 5,177,149, 8, 20, 5,
-116,120,203, 15,126, 61,219,162,211,245,199,211,111,158,165,182,200,229,242, 7, 0,248,109,219,182, 29,215,165, 75, 23,172, 90,
-181, 10,106,181,122,149, 9,146,101,180,121,241,174,190, 35, 0,184,186,186,206,217,121,242,145,116, 84,223,150,101,114,185,124,
-101, 61, 50,231,165,138, 56, 55, 55,215,236,181,248, 56,142, 67, 65, 65, 65,141, 54,171, 42, 4,171,215,174,111,168, 40,202,198,
-215,223,237,132, 78,167,195,236,217,179,193,113,156,241, 83, 88, 88,104, 86, 58, 9,203,190,170, 29,208,229,163,167, 20, 31,112,
- 31, 86,206, 43,210,118,175, 7, 69, 0,138, 5,240,234,125, 85,109,132,196, 60, 70,178,103,201,119,235, 26,198, 38, 61,195,225,
-115,177,208, 22,103, 64,126,231, 96,185,228,216,109, 4,246,170,121,232,236,215, 18, 51, 22,126,111,251,229,140,209,123, 52, 74,
-133, 23, 94, 30, 70, 60, 91,251, 75,195,226,235,101,203,176,101,221, 42,124,191,106, 29,138,139, 10, 33, 16, 56, 24, 42,122, 22,
- 44,203,214,124,239,132,244, 13,155,254, 9,245,221, 79, 7, 16,232,227,138,253, 39,175, 35,168,189, 7, 14,158,190,137,158, 1,
-205,112,248,108, 44,222,234,220, 18,199,163, 19, 48, 99,194, 8,106,196,169,173,125,235, 82, 70,107,214,172,111,168, 40,206, 70,
-212,183,219,241,124,195, 6,164, 78,153,130, 64,195, 57,215, 41, 10, 76,227,198, 0, 83,123, 25, 85,197,189,123,247,160, 86,171,
-171,235,153,195,219,219,187,214,114, 87, 42,149,183,244,122, 61,201,206,206,166,178,179,179, 33,147,201,168,196,196, 4,214,215,
-183,237, 32,146,180,239,103, 0, 8, 15, 95, 62,104,239,173, 98,148, 93, 94, 7,229,149, 31,193, 52,139,163,183, 44,157,160, 29,
-191,120,243,173, 74,239,232, 75,233,204,202,202,122, 47, 43, 43, 11, 0,208,188,121,243,164,228,228,228, 54, 21, 67,205,134, 33,
- 68, 70,175,215,123, 86, 12, 39,234,245,122,168,213,106,244,238,221,155, 87,211,189,219,218,218,118,241,246,246, 70,108,108, 44,
-214,173, 91,103, 23, 18, 18,130,135, 15, 31,130,162, 40, 44, 95,190,156,242,241,241, 17,228,230,230,226,221,119,223,197,129, 3,
- 7,186, 21, 23, 23,215,150,159,214, 50,153,108,235,209,163, 71,197, 52, 77, 67,161, 80,128,227, 56,116,239,222, 29, 52, 77, 35,
- 33, 33, 1, 11, 23, 46,196,129, 3, 7,112,232,208, 33, 73, 64, 64,192,214,178,178, 50,111,188, 60,172,111,170,140,136, 74,165,
- 34, 34,145, 8, 34,145, 8, 98,177, 24, 98,177, 24, 66,161, 16, 37, 42, 96,252,234, 84, 53, 79,236,192,249,182, 15,106,249,201,
-180,229,244,202, 69,159,158, 7,112,216,220,103, 30, 40,247,201, 90,251,219,111,235, 62, 46, 42,162, 1,224, 23,138,226,180,132,
-124,111,206,251, 14, 0, 37,170, 34,120,180,104,140,253,123, 14, 97,200,176,129,213,146, 44,129,128, 1, 35, 16,160,129,157,172,
- 86,155, 12,195, 56, 39, 37, 37,217, 11, 4, 2, 16, 66,192,178, 44,180, 90,109,246,151, 95,126,233,216,175, 95, 63,235, 19, 39,
- 78,208,253,250,245,227,108,109,109, 75,175, 95,191,254, 92,175,215,219,247,232,209,195,164, 77, 41,224,167,178,105,181, 86,200,
-211,251, 69, 44,152, 44, 26, 61,122, 52,239,147, 79, 62, 65, 90, 90, 26,198,141, 27,167, 58,115,230,140, 38, 75, 46, 63, 44,228,
-184,245, 90, 32,206,220, 58,185, 10, 54,250,249,249,117, 56,120,240,224,167, 97, 97, 97, 55,231,204,153,243,117,229,131, 43, 86,
-172, 88,118,252,248,113,143, 65,131, 6,237,184,115,231,206,198,186,212, 75,175,219,118, 88,108,190, 30, 76,113,145, 10,113,148,
-162,168,168, 74,117,118,104,197,126, 88, 88,216,130,240,240,240, 68,138,162,162, 42,255, 94,113,158,161,179, 24, 85,221,190,225,
- 90,187,249,243,231,183,141,136,136, 88,222,181,107,215,221,151, 47, 95,126, 2,160,174, 68,171,102, 31,173,138, 27,170,124,147,
- 85, 26, 53, 20, 23, 23,163,184,184, 24,233,233,233,216,180,105,147,225,133, 22,128,207,231,131,207,231, 27,253, 25, 76,225, 92,
-212,159, 63, 2,248,177, 67,135, 14,130,248, 43,145, 39,190,216, 50,237,237,142,189, 59,240,110,157,139,255, 16,229,235, 17,190,
- 55,102,204, 24, 7, 0,216,190,125,123, 46,128, 19,255, 33,214, 28,249,224,193,131, 25,174,174,174, 70, 31,149,202,195,135,122,
-189, 30, 98,177, 24, 21,190, 44, 42,149, 10,155, 54,109,210, 19, 66, 34,107,176,137,228,196,243,120,144,120,161,252, 58,142, 3,
-199,190,184,126,201,146, 37, 32,132, 24, 27,251,137, 6,229,164, 86,146, 87, 93,158,147, 42,219, 42,191, 19,150,173,101,120,130,
-153,246,225,232, 41,174, 28,197,199,145,243,183, 33, 16, 8,192, 85, 82, 51, 5,188,242,222,114,226,195, 76,184, 57,251, 98,192,
-136, 9, 46, 7,119,172,159,166,215,170,190,171,107, 94,123,249,117,197,244, 25, 51,240,243,150, 45, 88,184,120,153,145, 1,232,
- 89, 22,250, 90,211, 73,211,189,187,183,133,190, 36, 19, 60, 30, 15,111, 5,182, 4,143,199, 67,159,174,173,193,227,241,240,110,
-119, 47,240,249,124,244, 13,242, 65,171, 86,173,192,231,243,233, 90,202, 29,201,137,231,240, 32,241,143, 74,164,151,128, 0,208,
-202,229,175,156,175,147,203, 65,220,237,235,250,108, 97,220,184,113,133,233,233,233,218,170,199,154, 52,105,194,196,196,196, 52,
- 52, 49,108,103,132, 68, 34, 9,224,243,249,183,242,243,243, 57,169, 84, 74,115, 28,203,249,250,182,229,157,220,188,224, 96,197,
- 57,243,231, 47, 56,248, 81, 64,131, 65, 59, 35,163, 8,211, 52,136,162, 4, 34,253,231,139, 55, 51, 2, 70, 18, 0, 40,205,233,
- 60,208,106,181, 26,247,239,223, 71,109,233, 33,132,212, 56, 76, 83, 80, 80, 48,198,219,219, 59,230,199, 31,127,180,163, 40, 10,
- 23, 47, 94, 4,143,199, 51,126, 30, 63,126, 12,154,166,241,197, 23, 95,104,139,139,139, 63,171, 45,109,124, 62,127,198,254,253,
-251,109,132, 66, 33, 20, 10,133,241,189,225,241,120, 72, 74, 74,194,202,149, 43, 49,102,204, 24,164,165,165,193,205,205, 13,179,
-103,207,182,138,136,136,152,161,213,106,151,153, 81, 68,113, 26,141,166,163, 84, 42,133, 88, 44, 70, 5,225, 2,128,211,137,130,
- 4,165, 82,217,206,222,190,204,197, 49, 58,234, 72,183,144, 1,254,246,142,174, 93,229,114,121,157,150,206,122, 4,108, 73, 97,
-217, 47,223, 59,120,208,233,210,193,131,220,213,163, 71,159,137, 20,138,205,102, 63, 67, 58, 26,169,143,159, 33, 32, 32, 0,183,
-110,221, 66, 64, 64, 64,101,210, 4,161, 80, 8,134, 97,192, 48, 12, 28,108,205,114,161, 32, 52, 77,227,210,165, 75, 96, 89, 22,
- 26,141, 6, 26,141, 6, 62, 62, 62,249, 23, 46, 92,176, 2,128,199,143, 31,147, 81,163, 70, 21, 94,187,118, 13,237,219,215,188,
-158,186,138,162,206, 45, 89,254,131,205,119,107,182,194,198,206, 25,209,209,209,236,201,147, 39, 21, 20,144,252, 32, 49,113,213,
- 0,224,120, 36,160,173, 75,158, 57, 59, 59,199,240,120,188,166,149,127,203,203,203,179, 29, 60,120, 48, 10, 10, 10,222, 31, 60,
-120,112,144,161, 78,200,216,183,111,223, 40, 0, 16, 10,133,160,105,154,133, 5,255, 85,168,141,139, 84, 38, 74, 85, 9, 87,120,
-120,120,104,213,223, 42,147,170,234,190, 87,190, 54, 34, 34, 98,121, 37,219,202,122, 36,191,118, 31,173,168,168, 40, 82, 13,131,
- 52, 27,181, 17,173, 10,196,198,198,234,220,220,220,126,126,112,251,233,219, 45,253, 90, 64, 34, 19,189, 3,224, 71,145, 72, 52,
-107,244,232,209,184,122,245, 42, 18, 18, 18,126,197,107,206,194,105,219,182,237, 41,145, 72,228, 97, 98,152, 36, 53, 33, 33,225,
- 93, 19, 13,195,226,163, 71,143,162, 38,103,248,243,231,207, 87,110,148, 42, 59,195, 87,255, 96,112, 4, 58,173, 14,165,101,202,
- 23,141,184,129,104,149,150,150, 98,216,176, 97, 47, 41, 90,207,159, 63,175,245,254, 40,138,194,202,195,135,113, 38, 50, 18,239,
-251,251,227,192,245,235,136, 24, 61, 18, 94, 30,141, 64, 88, 10,132, 2,210,118,173, 71, 94,113, 9,126, 63,119, 9,249,138, 50,
-124,220,163, 7, 60, 27, 56,212,108, 87,192,244, 9,236,210,149, 57,123,249, 46, 4, 2, 62,104,112, 32,186, 50,184,121,247, 2,
-143,166, 97,227,220, 12,140, 64, 0,129,128,143,199,233,185,240,110,219, 73, 24, 37, 20,247,169, 15,209,106,226,209, 12, 44,203,
- 98,204,152, 49,216,189,123, 55,236, 93, 60, 96,211,164, 45,190, 89,181, 5,239,247,238, 81,235,253, 87,244,224,249,124, 62,120,
- 60,222, 43,219,138,239,230,168,147,132, 35,208, 86, 45, 35,142, 0,132,160,241,183,223,162,241,183,223,226,186,225, 63,125, 74,
- 75,161, 84, 42,129,206,190,117, 34, 89, 26,141, 6,233,233,233,218,172,172, 44,231,106,142,103,107, 52,154, 90,137,205,182,109,
-219,226,198,142, 29,219,209,206,206,238,102,220,157, 59, 58, 63,127,127,193,137, 77, 11, 14, 85, 12, 27, 2,128,191,191,127,254,
-130, 5, 11, 14,141, 26, 26, 58,112, 99,216,112,118,210,178, 29,124,145, 68,210, 49,116,206,182,184, 93, 67,135,214, 62, 54,163,
- 86,167,248,249,249, 17,115,238,171,172,172, 44,171,134,195,253, 1, 44,237,208,161, 67,131,144,144, 16,196,196,196, 96,200,144,
- 33,106,173, 86,251, 0, 0,250,245,235,215,250,247,223,127, 23,222,189,123, 23,142,142,142,130,212,212,212,173,168,197, 65, 94,
- 40, 20,246,234,212,169, 19,173, 86,171, 95, 33, 89, 17, 17, 17, 24, 49, 98, 4, 90,183,110, 13,142,227, 80, 82, 82,130,144,144,
- 16,193,186,117,235,122,153, 73,180,166,123,121,121,173, 68,249,172,195,202,117,225, 61,195, 16, 20,242,242,242,178,110, 95, 59,
-151,216,163,247,224,142, 77, 91,181,117, 77,136,187, 85,163, 65, 39, 39,167,249, 52, 77,127,196,113, 28,175,184,184, 56,253,182,
- 70,211,202,199,195,195,185,251,192,129, 40, 18, 8,120,107,207,157,163,179, 21, 10, 43, 0,102, 13, 65,170,116,165,240,104, 81,
-238,234, 55,100,216, 64,220,186,117, 11, 31, 14, 31, 4,134, 97,192,231, 11,202,223, 77,166, 92,209,106,232,208,192,172,103, 83,
-167,211, 25,235,240, 10, 63, 47,173, 86,139, 10,215, 44,169, 84,106, 60,166, 86,171, 65, 81, 84, 77,207, 6, 29,210,179, 59, 46,
-199, 38,235, 63,251, 98,173, 90,144,119, 43,194,133,227,182, 61, 3,178, 95,163, 58,247,220,187,108,145,147,164,129, 13, 88,157,
- 14,190, 3, 63, 52,190, 39,215,126,217, 40, 1,199, 73, 10, 83, 83, 48, 53,242,232,155, 94, 51,215,130,255, 0,106,227, 34,149,
-137,210,235,130,162,168,168,176,176,176, 5, 0, 72, 88, 88,216,130,138,253,240,240,112, 37,128,140,122,146,173, 87, 84, 46,254,
-155, 32, 89, 21,195, 11, 53, 33, 36, 36,100,170,181,181,245,186,138,253,244,171, 25, 72,191,154, 1,239, 54,190,221, 59,248,119,
- 44, 26, 49, 98, 4,236,237,237, 49,103,206, 28, 2,224,215,186,254,255,227,228, 68, 43, 0,196,213,213,117,142,161, 66,246,191,
-126,253,186,227,141, 27, 55,208,169, 83,167, 23,210,189, 86,139,160,160,160,154, 76, 41, 12, 78,237, 51,223,156, 74,198, 65,171,
-213,162,172, 76, 9,141, 70, 11,189,142,131, 94,175, 71,128,175, 53,118,108, 9, 43,255, 77, 95,161,158,149,171,102,141, 93,172,
- 97,109, 37,208,209, 52,165,188, 25,151, 85,109,141,169,209,104, 16,151,154,138, 59, 79,159, 2, 0, 6,132,215,236,248,186,227,
- 92, 12,124,124,124,106, 75,109,203,198,110, 46,200, 60, 19, 87, 94,121, 43,211,113,227,207,189,176,182,182, 2, 0,248, 6,127,
- 12,134, 41, 39, 90,165, 74, 45, 28,218, 52, 1, 69,136,201,176, 0, 82, 91,151, 83,124, 70,236, 65, 88, 14,132,112, 32, 28, 11,
- 66, 56,240, 4,140,116,234,196, 79,193,113, 44, 2, 3, 3, 65,241,120, 96,117,106, 12,237,223, 7, 5, 69, 10,216, 55, 52,175,
-145, 96, 24, 6,193,193,193, 18, 83,199, 31, 62,124,168,172, 76,204,106, 46, 35, 29, 74, 75,149, 80,171,213,208,106,244,208,234,
-244, 96,155, 51,248,250,203,145,208,107,245, 40, 27,222, 21, 90,157, 30,220,140, 65,208,106,116, 72,147,210,180,159,183,131,142,
- 6,165,188,125, 47,167, 65,109, 68,171,130, 28,152, 66,117, 62,129, 38,200,214,157,177, 99,199, 6,248,249,251,223,250,168,183,
-255, 15,241, 9,137,153,241, 9,137,175,156,231,209,218, 63,101, 82,196,238,217, 2, 70, 18, 16, 58,167,230, 89,135,149, 81,121,
- 24,241, 53,177, 64,161, 80,248, 89, 89, 89, 33, 57, 57, 25, 60, 30, 15, 20, 69, 61, 4,224, 7, 0,174,174,174,143,248,124,126,
- 11, 30,143,135, 13, 27, 54, 80,124, 62,191, 93,215,174, 93, 23,168, 84,170,189, 53,116,232,188,173,173,173, 95, 82,179, 24,134,
- 65, 88, 88, 24, 70,141, 26,101, 36, 89, 12,195, 96,219,182,109,232,216,177, 35, 52, 26,141,183,153,233,189, 1,160,135, 25,138,
- 31,101, 32,231,181,146, 81,189, 94, 63, 54,239,163,143, 90, 33, 58, 26,221, 91,180,240, 9, 8, 8,128, 86,251, 66,208,105,209,
-162, 69, 19,133, 66,145,165, 84, 42,255,141,242, 48, 4,183,107, 36, 69, 42, 14,169,143,203,221, 79,111,221,186,133,192,192, 64,
-163,130, 85, 89,205, 98, 24, 6, 18,161, 85,157,136, 22,199,149,215, 75, 10,133,130,142,142,142,118,240,242,242,162, 0,192,203,
-203,139,186,125,251,182,157, 84, 42,205,109,217,178,101,109, 29, 96, 6, 0,122,189, 51,152,127,230,228,113,153, 30, 88,150,197,
-227, 45,227,215, 90, 71, 18, 29,203,113, 38,157,238, 37, 13,108,176,109,236, 48, 0,192, 87,189,251, 26, 59, 91, 39,151, 46,128,
- 64, 32,192,219,115, 22,188,242, 46,113, 28,199,131, 5,255, 40,146, 85,157,162,245,122,109,243, 11, 69, 43, 60, 60, 60, 49, 60,
- 60,252, 21,117,172,142,168, 93,209,170, 44,221,213, 21, 21, 47,171, 41,172, 90,181, 10,237,218,181,171,177, 33, 90,183,110, 29,
-118,238,220,185, 10,192,227, 58, 75,142,111,119,240,197,234,131,137, 45, 90,251, 82, 0,176,108, 70,127,186,180,180, 20,151, 46,
- 93,130,141,141, 13, 30, 62, 52, 59,236,151,181,141,141,205, 82,154,166,135,242,170,206, 0,168,158, 96,178, 28,199, 69, 22, 21,
- 21,153, 12,239, 64, 8,160,213,233, 81, 90,166,130, 70,163,193,140, 47,214,215,154,136,112,128,210,106, 20,252,224,158, 93, 37,
-166, 20,157,192,118,189, 48,121,180,213, 43,141, 55,143, 6,104, 26,104, 31, 88,174,184,220,190,158, 8,142, 3, 88, 14,112,112,
-178,197,175,187,126,168,145,228,235, 89,206,208, 59,102, 81,162,102,225,221, 37, 20,207,238, 69, 27, 21, 36, 33, 83, 62,100,204,
- 8, 4,224, 8, 85, 30,245,193, 84,173, 43,148,120, 20,200, 31,123,110,137,138,199,248,208,118,216,119, 54, 14, 31,246,246,195,
-133,107,119, 17,210,217, 7,137, 15,158,194,215,179, 41, 54,108,141, 4, 33, 80,252,180,250,155,172, 23, 13,154, 62,213, 28, 69,
-235,234,213,171,202,170, 42, 86,229, 45,169,189, 61, 4, 33, 47, 20, 45,165, 74,141, 57,243,205, 10,189, 83, 94, 70, 61,186, 72,
-204, 57,185, 38,197,202, 28, 34, 86, 85,217, 66, 45,225, 89,154, 3,232, 8,204,251, 79, 86,156, 44,203,226,216,177, 99,198,242,
-168,174, 28, 43,151,157, 25, 36, 7,169,169,169, 72, 76, 76, 68,151, 46, 93, 80, 84, 84, 4, 1, 77, 99,118,124, 60,124, 70,143,
-134,134, 97,192,113, 28,132, 66, 33, 38, 76,152, 96,118,126,214,177,118, 54, 56, 94,179,181, 25,255,161,107,215,174,173,146, 75,
- 75,145,152,148,132,222, 75,150, 0, 0,142, 31, 63,254,210, 51, 49,107,214, 44,225,221,187,119,199,221,188,121,115, 92,102,102,
-230, 42, 0,179, 77,214,179, 68,109,244,209,250,104,228, 16,180,242,106,142,157,191,237, 50, 30,159, 53,119, 58, 4, 2, 6, 2,
- 70,128,134, 54, 13,205,186, 27,157, 78,103, 36,173,101,101,101,244,241,227,199, 27,247,233,211,135,153, 62,125, 58, 5, 0, 59,
-119,238,164,127,252,241, 71,217,153, 51,103,152, 70,141, 26,201,107, 81, 8,138, 51,242,212, 34, 0,112,119,119,199,250,205, 71,
-232,126,253,250, 97,250,244,233,208,233,116,216,184,177,252,189, 26, 49, 98, 4,180, 90, 45,246,239,223, 95,241, 30,215,168, 70,
-233,181,218, 87,158, 27,138,162, 32, 16, 8,192, 8, 25,128,227, 64, 81,148,108,197,138, 21,203, 18, 19, 19, 59,121,121,121, 65,
-173, 86,143, 70,249,228, 15, 75, 28,173,255, 50,178, 85, 19, 23,169,206,215,202,160, 74,153, 66, 78,101,191, 45, 83, 68,173,178,
-207, 22,234, 55,129,194, 60, 31,173,234,192,227,241,106, 85,171, 42,166,234,214,132, 89,179,102,193,218,218,218, 84, 3, 68,226,
-227,227,239,202,229,242, 45, 0,214,215,171,112,206,197, 38, 46,157, 57, 72, 1,195,216,106,195,134, 13,115,223,122,235,173, 18,
- 0,218,189,123, 95,238, 32,171,213,106,147, 13,184,141,141,205,210, 95,126,249,101,218,192,129, 3,233,170, 33, 6, 42, 15,239,
- 85,124,116, 58, 29,246,238,221, 59,109,222,188,121, 40, 42, 42,154, 89, 83, 35, 94, 86,170,132,210,224, 8,253, 40, 97,159,185,
-149,186,201, 67, 86, 13, 93,209,184,185,159,201,198,132,102,202,125,136,156,221, 95, 52, 96,214,214, 98,176, 53,216,164, 40,250,
-241,211,180,204, 70, 77, 92,236,240, 40, 61, 7,206, 77,219,161, 32,227, 69, 62,240,249, 60, 8, 12, 67,135, 13, 27,200,144,243,
-252, 57,104,154, 87, 35, 49,254,230,247, 88, 92, 75,120,138,253,103,111, 67,171, 42,197,234,237, 39,161, 85,151, 64,171, 42,133,
- 86, 85,190, 93, 62,239,115, 80, 20,178,116,234,210,214,117, 41,119, 62,159,143,206,157, 59,155, 36, 58, 25, 25, 25,102, 42, 90,
-196,168,104, 41, 85,117, 44, 35,243,122, 78, 53, 42, 86, 21,199,235, 75, 12, 42, 66, 62, 72, 36,146,142,219,182,153, 14,227, 80,
- 29, 92, 92, 92, 78, 88, 89, 89, 53, 51,247,252, 58, 4, 47, 93,222,176, 97,195,165, 94, 94, 94,222,171, 87,175, 22,240,120, 60,
-188,253,246,219,173, 93, 92, 92, 82, 1,192,215,215,215,173,162,142,153, 52,105, 18,185,122,245,106, 66,121, 31,195, 52,132, 66,
- 97,146,141,141, 77,199,144,144, 16, 20, 21, 21, 33, 61, 61, 29, 50,153, 12, 62, 63,252,128,248, 73,147,224,191,105, 19,232,183,
-222, 2, 69, 81, 16, 10,133,136,143,143,135, 68, 34, 73, 82,169, 76,134,124,235, 12,224,123, 0,221,241, 98,184,144, 0,184,132,
-242,176, 11,215,170,169,239,104, 0, 96, 57,174,182,194, 26, 57,103,206, 28, 20, 10, 4, 64,191,126, 96, 30, 63,134, 86,171, 69,
-151, 46, 93,140, 42,123,151, 46, 93,192,231,243,225,231,231, 7, 55, 55, 55,108,216,176, 97,100, 77, 68, 75, 85,162, 69,234,227,
-103,232,218,181,171, 81,185,234,215,175,159, 81,209, 18, 8, 4, 70,101,139, 98,107, 39,174, 20, 69,145,202,157,100,150,101, 41,
- 62,159,207,159, 57,115, 38, 53,100,200, 16,162,209,104, 56,161, 80, 72,239,223,191,159,186,112,225, 2,191,180,180,180, 54,181,
-161,116,248,240,225, 78, 77,154, 52, 70,250,163, 68,236,219, 71,176,106,213, 42,196,196,148, 71,217, 72, 78, 46,159,184, 90,177,
- 31, 18, 18,130,102,205,154,129,212,242,224,183, 29, 52, 20, 95,245,121,175,188, 62,105,230, 8, 1, 35,128,144, 97, 48, 39,233,
-153,177,172, 27,108,219, 45,140,136,136,248,208,203,203,171,124,104, 31,224, 91,226,104,253,119,161, 22,161, 39,167, 10, 73,210,
- 84,218,207, 1, 64, 25,246,115, 42, 17,170, 28,138,162,110, 16, 66, 58, 85, 57,183,226,184,166,202,182,226,248,157,122, 36,191,
- 98,173,195, 87,200, 87, 77, 61,226, 7, 87,174, 92,241, 12, 8, 8, 64, 90, 90,218, 43, 51,225, 42, 26, 46,153, 76, 6,137, 68,
-130,203,151, 47, 3,192, 3, 83,198, 46, 92,184,240, 35,202,163, 46,195, 48,108,208, 53,228,163, 94,151, 3,251,118,194,239,225,
-187,138,228,114,185, 31, 94,196,208,161,220,220,220, 70, 9,132,252, 97, 45,218,186, 7,131,227,190, 63,119,244,210,146,154,238,
-176, 69,107,223, 18, 0,202,138, 89,135,245,156,125, 8,154,166,135, 14, 28, 56,144,190,123,247, 46,134, 13, 27,134,157, 59,119,
-154, 60,119,212,168, 81,216,189,123, 55, 6, 14, 28, 72,207,159, 63,223,100,120,135,151,213, 18,205, 27,123, 40,147, 31,222,193,
-142,221,191,152,244, 65,114,114, 42,247,199,122,254, 60,215,248, 91,167,128,154, 71, 70, 56,189,230, 76,236,205,235, 93,187,245,
-124,155, 73,207, 46, 4,167, 87, 67,165,120,113,125, 89, 97, 54,136, 94, 5, 70,106, 7, 23, 7, 27,220,186,114, 90,163,213,168,
-206,212,100,115,218, 64, 95, 76,234,239, 13, 16, 14,131,102,255,138,168,245, 83,141, 61,232,160, 33,211,113,110,239, 90,179,125,
-252,170, 66, 32, 16, 32, 62, 62, 94,105, 74,205,226,241,120,230,196,228, 50,168,142, 58,148,149, 41, 81,166, 84,189,201,186,195,
-209,217,217,249, 39, 91, 91, 91,177, 9, 34,229,232,232,232,248,147,189,189,189,216,220,161, 67, 83, 36,203, 16, 87,235,230,216,
-177, 99,235, 68,182, 68, 34, 81,179, 7, 15, 30, 24,131,149,214,180,213,104, 52, 8, 9, 9, 49, 55,120,233, 81, 0, 79, 92, 93,
- 93, 47,249,248,248,216, 60,122,244, 8,187,118,237, 98, 4, 2,129,123, 69,253,161, 80, 40,192,227,241,240,252,249,115, 29,128,
- 79, 81,203,208,153, 90,173,142,142,142,142,110,223,191,127,127, 94, 82, 82, 18,120, 60, 94,121,186,186,118,133,255,166, 77, 72,
-152, 57, 19,193, 79,159, 66,165,213, 66, 44, 22,227,212,169, 83,218,178,178,178,104, 83,246, 36, 18,201,150,148,148, 20, 95,177,
- 88, 12,173, 86, 11,142,227, 64,211, 52,197,231,243,131, 26, 54,108,184, 14, 64,167, 42,133,229,228,223, 41,164, 13,171,215,179,
-242,180, 71, 57,181,101, 64, 94, 94, 30,142, 30, 61,138, 46, 93,186, 32, 56, 56, 24, 25, 25, 25,120,252,248, 49,222,127,255,125,
-227, 57,119,238,220, 65,108,108, 44, 90,182,108, 89,187,162, 71,235,208,178, 77, 51, 48, 12, 83,174,230, 8, 24, 67,199, 71, 96,
- 84,178, 24, 1, 3, 1, 95, 0,177, 68,108,182,162, 69, 81, 20,104,154, 6, 69, 81,144, 72, 36, 21,157,108,174,113,227,198,242,
-252,252,124, 87, 0, 60,137, 68, 2,150,101,107,236,180,112,132,120, 50,185,151, 51,103,207, 91,233, 20, 30,126, 22,103,207, 62,
- 7, 77,211,112,117,117, 5, 77,211, 72, 73, 73, 1, 77,211,240,240,240, 0, 77,211,200,200,200,168, 32,137, 5, 48, 77,134,141,
-239, 13, 69, 81, 70,146,197, 8, 25,163,178, 5, 0,133,133,133,170,129, 3, 7,254, 91,173, 86,127,130,250,173,122, 98,193,223,
- 24, 20, 69,221,248, 79, 92, 91, 7,244, 51, 16,171, 87,156,226,107,122, 24,223,239,214,173,219,166, 17, 35, 70,188,189,102,205,
- 26, 88, 89, 89, 65, 46,151, 27, 27, 68,161, 80,136, 38, 77,154, 32, 63, 63, 31,155, 55,111,198,179,103,207,206, 3,152, 96,110,
-138,228,114,249,213,135,183, 31,228,133,124,216,205,222,183, 91,155,134,233, 15,158,117,145,203,229,151, 13, 36,235,215, 17,179,
-222,255, 36,100,112, 32, 24,161, 0,233, 15,179,112,238,232,165,255,151,194,228,241,120, 60,138,162, 48,108,216, 48,179,206, 31,
- 62,124, 56,162,163,163, 81,211, 48, 35, 87,161,104,149,169, 80,170,124,115, 29,171,201, 83, 71, 97,242,212, 81, 70, 50, 97,206,
-208, 11, 0,184,185,237,169,129,104,105,215, 68,237,217, 60,190, 67, 96, 87,143,142,190,205,112,237,230,109,252,190,233,133,200,
-176,245,199,101,248,110,235,121, 52,113,182,133, 86, 93,138, 19,251,126,206,210,170,203,214,212, 83,148, 43, 39,183, 20, 5, 66,
-184, 58,221,123, 5,121, 18, 8, 4,104,219,182,173, 73, 69, 43, 63, 63, 95, 89,155,154,101, 44, 35,141, 14, 37,165, 74, 40,203,
-222, 24,209,242, 15, 10, 10, 58, 19, 25, 25,105,239,228,228,132,204,204,204,170, 68,203,191,123,247,238,103, 34, 35, 35,237,157,
-157,157,145,158,158,110,118, 88,145,106, 72, 22,114,114,114,168,130,130, 2,206,214,214,182, 78,100,139,166,105,168,213,106,220,
-187,119,207,220,191, 53,123, 54,151,141,141,205,182,221,187,119,219,228,230,230,130,199,227,225,222,189,123, 47,205, 58,172,248,
-252,250,235,175,204,160, 65,131,126, 41, 44, 44,172,113, 90,155, 94,175, 95, 53,106,212,168,113, 25, 25, 25,182, 78, 78, 78,144,
-203,229, 16, 10,133, 32,132,128, 10, 9, 65,143, 39, 79,160,101, 89, 72, 36, 18, 36, 39, 39, 99,203,150, 45,165,134, 80, 49,213,
- 10,100, 20, 69,121, 50, 12,131,143, 63,254,248,165, 3,219,183,111,199,128,142,188,142,142, 54,252, 18, 61,196,234,108,201,123,
- 39,120, 60, 30,229,223,249,173,214,157,123,246,107,123, 63,225,218,163,156,236,103,181, 85, 74, 58,141, 70, 3, 47, 47, 47,220,
-184,113, 3,103,207,158,197, 91,111,189,133,224,224, 96,196,197,197,225,244,233,211,136,141,141, 5, 69, 81,176,183,183,175,112,
-191,168,209, 7, 67, 83,166,199,243,204,188, 87,212,171,170,251, 12,195, 64,173, 52,111,114, 95, 82, 82, 18,110,220,184, 97, 12,
- 45,195,227,241,244,163, 71,143, 6, 33,132,164,164,164,192,218,218,154,140, 29, 59,150,229,243,249,250,140, 12,243,252,131,173,
-172,172,224,233,233,249, 82,199,167,226,211,163, 71, 15,220,188,121, 19, 52, 77,131,207,231,195,201,201, 9,151, 46, 93,170,245,
-193,175, 32, 85, 21, 36,139,207, 8, 94, 34,125, 28,199, 41,226,226,226,198, 3,136, 51, 40, 89,128, 37,142,150, 5,255,127, 56,
-134, 87, 23,150,174, 85,209,122, 2,160,247,174, 93,187, 70, 30, 58,116,104,213,186,117,235, 28, 67, 67, 67, 81, 80, 80, 0, 15,
- 15, 15,184,186,186, 34, 42, 42, 10,199,143, 31,207,101, 89,118, 54,128,234,164,159,222,168, 33,102, 77,198, 35,121,164,186,164,
-100, 82, 64,176, 55,206,239,189, 24,238,226,226, 50,129,199,227,205, 24,187,224,131, 79,122, 13,236,132,228,216, 20, 92, 61, 29,
-143,236,180,220, 90,109, 86,117,134,111,216,176,225, 56,169, 84, 42, 68, 53, 83,137,171,153,117,104,180,201,178, 44,171,209,104,
-176,103,207, 30,179,200,214,174, 93,187,160, 82,169,192,190, 58,190,106,180, 73, 56, 66,241, 5, 34,184, 53,241,130, 86, 91, 10,
-142,171,247,132, 74,163,205,138, 30,232, 35,161, 16, 78,185,185,184,118,237,154,121,148,187, 95,191,218,202, 72,165, 81, 41, 62,
- 94,251,237,156,168, 41, 97,223, 55,124,171, 91,123,124,245,195,118,104,181, 91, 65,243,104, 72, 68, 12, 2, 2,187,131, 7, 53,
-126,138,152, 91, 88, 86, 92,240, 49, 94, 93,138,231, 37,155,164,166, 17, 22, 2,176, 28,135,179, 49,215,205,190,247, 74,195, 28,
-224,243,249,120,248,240,161,178,186,217,134, 60, 94,249, 48,103, 69, 79,189, 38,155,132,227, 40, 1, 35, 70, 19, 15, 31,104,212,
- 37,111,164,140,156,156,156,230, 30, 60,120,208,190, 34, 84, 66, 92, 92, 28, 40,138,186,247, 66,113, 44, 63,174, 84, 42,145,144,
-144,128,184,184, 56,160,124,134,155,217,239, 81,133,146,149,147,147, 67,201,229,114, 72,165, 82, 58, 46, 46, 78,237,231,231,119,
-179,150,247,219,104, 83,165, 82, 61, 53,229, 63,169, 82,169, 26,137,197, 98, 65,149, 6,207,173, 85,171, 86,201,213, 12, 33,190,
-146,206,162,162,162,107,243,230,205, 11,232,219,183, 47,230,206,157,155,111,107,107,107,253,211, 79, 63,241,121, 60, 30, 53,101,
-202, 20,246,249,243,231, 37, 63,255,252,179,205,161, 67,135, 80, 88, 88,120,217,140,123, 87,168, 84,170,241,221,186,117,219,126,
-242,228, 73,169,167,167, 39,138,139,139, 65, 8,193,182,109,219, 48,101,202, 20,136,197, 98, 36, 39, 39, 99,192,128, 1,101,101,
-101,101,227,241,170,239,100,133, 77,138,162, 40,194,113, 28, 22, 45, 90,100, 12, 78, 90, 17,172,212, 90, 66, 97,203,172,230,178,
-233, 63, 23,201, 70,126,245,243,104, 0, 96,245,122,246,126,194,181, 71,219,214,127,117,129, 97,152,152, 90,202,104,225,244,233,
-211,127,234,215,175,159,196,202,202, 10,249,249,249,184,116,233, 18,174, 92,185,130,171, 87,175, 66,163,209,192,222,222, 30,182,
-182,182,144,203,229, 72, 74, 74, 82, 2, 88, 88,147, 77,161, 84,128, 22,173, 43,102,254,150, 43, 88,130, 74,179, 13, 43,171, 91,
-140, 64, 96,214,123,212,179,103, 79,116,238,220,185,130,172,176,169,169,169,114,181, 90, 77, 85, 34,253, 25, 21,132,220,221,221,
- 93,191,115,231, 78, 82,155, 77,142,227, 94, 33,211, 61,122,244, 48,118, 10, 59,119,238, 12, 30,143,135,219,183,111,155,114, 77,
-121,201,230,213, 45, 27,112,242,235,133, 16, 50, 12,102,223, 75, 55,146,174,237,111,117,128, 64,200,192,187,255,144,202,215,110,
- 68,249,112, 33,170,144,172,154,218,163,215,126,223, 45, 54,255,231, 33, 71, 61,150,224,169,192,239, 42,149,234,196,231,159,127,
- 30,225,239,239,255,249,234,213,171, 41,134, 97,176,100,201, 18,146,153,153,249,155,161,199, 80, 80,159, 84, 17, 66,126,251,227,
-192,229,137, 99,194, 6, 82,179,214,140, 13,186,121, 46, 33,169, 93, 55, 79,180,235,230,137,155,231,239, 98,253,130, 93, 59, 89,
- 29,187, 40, 43, 43, 43,173, 22, 83,234,222,221,219, 84,117,134,183,143,190,112,206,190,174,179, 14, 57,142,139,220,181,107,215,
-180,193,131, 7,211,215,175, 95,127,197, 39,171, 98,217, 29,142,227,112,230,204, 25,104,181, 90,252,246,219,111, 28,199,113,166,
-227,104,129, 28, 94,187, 38, 98,204,111, 59, 14, 11,133, 12,133, 43, 49,251, 81, 84, 80,243,172, 46,134, 17,224,215,109, 7,180,
- 12, 35,184, 95,221,113,173, 86,155,126,238,220, 57,231,119, 89, 86, 64,211,116,117, 4,170, 90, 68, 70, 70,234, 56,142, 75,173,
-229,180,203,217,207,210,250,127, 51,247,211, 93,253, 62,250,220,185, 91,183, 32,129,131,147, 51, 40,138,194,243,236,231, 72, 78,
-184,174, 59,177,255,151,236,210, 50,243,150,224,249,116,229, 31, 70,159, 44, 0, 8,157,178,206,232,159, 5, 0,253,199,206, 67,
- 72, 23, 95, 80,230, 72, 79, 47, 72, 22,167,215,235, 33,147,201,160,215,235,171, 13,241, 96, 99, 99, 35, 81,169, 84, 74, 67, 32,
-198, 26,123,204, 4,120,227,101,196,178,172,119, 65, 65, 1, 74, 75, 75,113,229,202, 21,242,237,183,223,230,228,228,228, 24,157,
- 54,117, 58,157,119,126,126, 62, 74, 74, 74,112,249,242,101, 18, 17, 17,145,147,151,151,183,160, 46,239,144, 68, 34,233,200,231,
-243,111, 22, 20, 20,112, 82,169,148,214,233,116, 58, 63, 63, 63,145, 68, 34, 49,123, 65,117,185, 92,222,215,212,177, 22, 45, 90,
- 60,120,240,224, 65, 43,150,101, 43,175,129,200,168, 84, 42,207,110,221,186,153, 83,127, 76,223,186,117, 43, 14, 28, 56, 16, 88,
- 92, 92, 60, 42, 53, 53,117, 59,128, 64, 62,159,143,219,183,111,223, 83,169, 84, 35, 6, 15, 30,188,173,160,160,224, 26,202,151,
-224, 49, 7, 39,147,147,147, 63,246,246,246,222,186,116,233, 82,171,224,224, 96,190,155,155, 27, 58,117,234,132,228,228,100, 28,
- 59,118, 76,183,113,227,198,210,178,178,178, 79, 1,156,169,185,216, 65,233,245,122, 8,133, 66,227, 71, 36, 18,129, 97, 24, 40,
-148, 4,159,253,240, 88,169,135, 68,185,106,201,248, 99, 4,160,178,210, 31,231, 62,207, 74,191, 70, 81, 84,140, 92, 46, 47, 50,
-145,103, 66,149, 74,213,158, 16,194,163, 40,106,141, 86,171, 29, 59,117,234, 84,215,229,203,151,163, 77,155, 54,200,205,205,133,
- 76, 38,131,167,167, 39,114,114,114,112,253,250,117,182,172,172,108, 19,128,101, 48,248,143,152, 66, 97,110, 49, 26,187,184,191,
-164,124, 18, 66, 64, 88, 64,167,102,193,106, 9, 52,148, 14, 2,129, 14, 12,195,152, 51,164, 66, 56,142, 67,129,171, 43,184,132,
- 4, 92,189,122, 21,132, 16,147,170,154,151,151,151, 89, 10, 41,203,178,175, 16,173,107,215,174,129,199,227, 33, 40, 40, 8,177,
-177,177, 70, 69,203, 44,191, 68,194, 65, 40, 18,190, 52, 92, 72, 81, 20, 24,161, 16, 2, 33, 83,221,108, 28,139,138,101,193,223,
- 6,230,142, 99, 23, 2,152,112,231,206,157,237,189,122,245,138, 34,132, 8, 80, 62, 30,121,241,117,254, 60, 43, 43,235,214,229,
- 99,183,230, 59, 55,182,141,120,111, 84, 16,218,180,247, 0,171,103,113,233,248,109,252,182,252,208,238,140,244,140,177, 48, 99,
-237, 51,142,227, 46,116,239,216,134, 70,165, 88,221,110,110,110, 92,125,102, 29, 22, 21, 21, 45,158, 61,123, 54,230,206,157, 91,
-159, 89,135,213, 34, 62, 41,103, 2, 5,210,184,255,123, 61,222, 5, 69, 19,141, 70, 93, 67,197, 7, 99,228, 82,134, 17,220,191,
- 17, 39,247,171,238,188,156,156,156,119, 63,249,228,147, 51,124, 62,191, 89, 93,242,156,227,184,212,236,236,236,183,107, 63, 83,
-127, 73,173, 44,246, 60,186,123,243,204,147, 7,182,190,203,113,108, 75, 10, 0,143,207, 60,210,105,181,167,212,202,226,213, 48,
-115, 81,233, 21, 19,186, 98,250,218,211,216, 48,183, 63,166, 70,236,197, 47,139, 62,195,252, 31,118,225,251,185,211,241,237,186,
-127,227,171,233, 31,227,195,145,159,112,132,162,255, 52,247, 62,120, 60,222,201,205,155, 55,143,249,236,179,207,140,147, 22, 8,
- 33, 47, 85,194, 58,157, 78,201,113, 28, 54,109,218,196, 1, 56, 89,147,189,151,203,136, 34, 53,249, 75,153, 91, 70,197,197,197,
-159,118,237,218,117, 27, 0, 17, 33,228, 97, 65, 65,193,191,128, 23, 75, 67,149,148,148,124,218,173, 91,183,109,132, 16, 17, 69,
- 81,175, 28, 55, 7,134, 80, 15, 29,109,109,109,111, 26,148, 44, 81,125, 28,226,107,202,234, 26,134, 21,205, 25, 66,228, 0, 76,
-173, 20,241,125,121, 96, 96, 96,229, 69,165,239, 21, 20, 20,116,172, 71,186,206, 40,149, 74,223, 69,139, 22,205, 20,139,197, 33,
-101,101,101,173, 1, 64, 38,147, 37,171,213,234, 11, 74,165,114, 53,106,143, 77,165,225, 56, 46, 89,175,215,183,117,116,116, 44,
-159, 81,107, 32, 91, 0,112,228, 38,123, 19, 96, 59,149,139,226,191,155,157,176,227,199,143, 55,181,181,181,125,135,162,168, 15,
- 9, 33, 94, 10,133, 66,189,104,209,162,203,145,145,145, 69,205,154, 53,123,175, 95,191,126,148,157,157, 29,110,220,184, 65,242,
-242,242,246, 3, 88, 0, 51,102, 90,115, 28,151,186, 98,197, 10,212,245,125,175,233,184, 86,171,205, 58, 32,240, 92,174, 0, 0,
- 32, 0, 73, 68, 65, 84,126,252,184, 67,223,231,207,249, 28,199,161,127,255,254, 47, 17,184,170,184,127,255, 62,212,106,117,173,
-193, 28, 11, 11, 11, 17, 24, 24,248, 82, 7,181,226,147,154,154, 10, 59, 59,187,151,254,167,182, 62,150,186,168, 0,111,205,156,
- 7, 24,102,148, 86,160, 92,201, 34, 32, 26, 11,175,178,224,239,139,191,122,241, 77,179,164, 69, 87, 87,215, 97, 98,153,104,178,
- 71,107, 87,191,204,199,207,239, 42,138,202,118,202,229,242,205, 38, 42,114,179,108,214, 49, 96,169, 69,254,253,139,108,190,136,
-163,197,130, 16, 22,132, 35, 32,132, 3,199,177,229, 11, 94, 19, 14,132,101, 41,138,194,159, 26,101,141,145,193,171,166,211,214,
-193,193, 97, 25, 33,164, 47,143,199,163, 43, 87,212,149,191, 27,148,172,147, 57, 57, 57, 95, 85,163,188,254,215,229,103,100,100,
-100,181,228,223,220, 89,135, 67,135, 14,101,235,248,110, 94,144,201,100,174,213, 29, 43, 45, 45, 77,147,203,229,239,252, 77,242,
-179,242,140,193,186,216,172,243,172,195,218,108,122,120,120,136,180, 90,109, 7, 0,158, 20, 69, 53, 4,144,175,213,106, 79,229,
-230,230,102, 3,232, 8, 96,145,225,154,175, 1,220,252, 15,191,239, 18, 7, 7,135,173, 52, 77, 55, 54,231, 98,189, 94,175,201,
-207,207, 31, 83,165, 67,240, 98, 8, 30,224,137, 25,230, 58,104,186, 81,117,239,163,169,239, 32, 36,163, 84,169, 12,164, 94,212,
-249, 70,155,246,246,246, 55,249,124,126, 99, 51,210,246, 44, 47, 47,175,163,165, 78,254,175,182,249,223,140,170, 78,240, 38, 35,
-197,255, 21, 68,203, 98,211, 98,211, 98,211, 98,211, 98,211, 98,211, 98,211, 98,243,159, 78,180,170,221,183, 76,129,181,192, 2,
- 11, 44,176,192, 2, 11, 44,120, 61, 28,171, 66,182,142, 85,124,161,106, 96,165,117,145, 4,235,195,108,207, 90,108, 90,108, 90,
-108, 90,108, 90,108, 90,108, 90,108,254,207,217,180,224, 13,194, 34,171, 90,108, 90,108, 90,108, 90,108, 90,108, 90,108, 90,108,
-254,211, 97,114,232,144,182,228,141, 5, 22, 88, 96,129, 5, 22, 88, 96,193, 95, 3,179,137,150,204,217,203,219,193,195,111,155,
-109,227,118,113,182,141,219,197, 57,120,248,109,147, 57,123,121,255,143,230,155, 4,192, 72, 62,159,127,198,197,197,165, 24, 38,
-150,222,249, 7,160, 1,128, 15, 81, 30,223,103, 16, 0,233,155, 52, 30, 12,240,135, 1,147, 71, 3,105,163,129,180, 97,192,228,
-224,127,160,223,224,146,105,174, 93, 99, 78,140, 60,177,100,154,107,215,106,143,207,118,181,191,122,122,232,218,229,147,221,236,
-222,208, 95, 90, 59, 57, 57,109,113,118,118,126,234,228,228,148,234,228,228,180, 21,128,141,165,186,179,192, 2, 11, 44,248,203,
- 80,225,163, 85,241, 49,250,104,241, 1, 32, 42, 42, 42, 24,192, 31, 0,122,133,134,134, 70, 87,189,218,214,189,237,103, 45,155,
-183,156,251,205,146, 5,148,139,147,131, 84,207,114,218,148,167,233, 62,139,191,137,216,151, 41,228,175, 42, 72, 75,248,165, 30,
-137,162,120, 60,222, 48,145, 72, 20, 10,160,130,176,221, 83,171,213, 81, 44,203,238,129,121,211,180,225,236,236, 28,195,227,241,
-154,214,229,143, 89,150, 77,203,206,206, 14,170,103,102, 14,117,119,119,223, 26, 28, 28, 44, 13, 12, 12,132, 80, 40,196,162, 69,
-139,102,203,229,242,213,230, 26,176,181,109, 97,173, 21,137,103,240,133,194, 62, 68,167,105, 75, 64, 0, 90,148,192,233,213,231,
- 24,181,122, 85, 65,193, 99,133,153,166, 22, 0, 24,107,200,171, 95, 0,172,120,157,167,100, 76,123,232,116,108,249, 51,193,240,
-193, 30,126, 98,243,199,194,133, 11,249,161,161,161,248,229,151, 95,130,182,108,217, 50, 94,161, 80,156, 3,112, 4,192,163,215,
-125, 42,157,129, 9,221,130,130,214,142,153, 61,155,167,140,137,193,218,173, 91,215,160, 60,222,210,134,186, 62, 75, 12,131, 15,
- 29, 28, 4,161,132,160, 3, 5, 80, 20,112, 59, 39,143, 59,174,213,178,123, 96, 70, 44,182, 26, 48, 18, 47, 79,199,255,189,174,
- 6,138, 30,145, 47, 69,253,189,123, 20, 61,186,240, 37,128,247,170, 30,215,171,196, 99, 8,175, 73,168,146,196,166, 3,248,225,
- 53,179, 85,234,232,232, 24,119,248,240,225,198,129,129,129,124, 0,184,121,243,230,232,208,208,208,183,114,114,114,218, 2, 40,
-254, 15, 85, 66, 98, 62, 77, 79, 22, 10, 4,125, 88,150,109, 7, 0, 60, 30, 47, 94,163,211,157,209,115,220, 6,152, 25,147,205,
- 2, 11, 44,248,231,162, 54, 46,242, 55,135,201,200,240, 21, 55, 71, 42,111, 43, 67,230,212,198,167,203,219, 67,238, 23, 41,202,
- 84, 79,159,102, 20,204,154,252,237,153,241,211, 87, 30,250,225,231,168,227,209,215,238, 93,245, 14,124,231,174,204,169,141,143,
- 9,211,166,198,112,221, 37, 18,201,173,141, 27, 55,106,147,147,147, 73, 97, 97, 33,185,127,255, 62,217,191,127, 63,153, 56,113,
-162, 74, 34,145,220, 2,224,110,142, 77,103,103,231,236,251,231, 79,147,103,113,177, 36,245,230, 53,162,211,233,136, 86,171, 37,
- 90,173,150,220, 61, 25, 69,226,142, 28, 32,183,247,239, 33, 26,141,134,104, 52, 26,162, 86,171, 73,243,230,205, 51,205, 76,103,
- 85,184,249,250,250,106,162,162,162,200,190,125,251,200,236,217,179,137,191,191, 63, 11, 96,138,185,247, 46,115,242, 12,177,110,
-228,151,243, 89,216, 6,237,177,203,167, 72,226,147,219, 36,241,201, 3, 18,121,246, 30, 25, 59,103,157,214,186,145,127,142,204,
-201, 51,164,182,123,183,181,181,237, 66, 81, 20,169, 0, 0,210,180,105,211,146,202, 31,119,119,247,151, 62, 77,154, 52, 41,105,
-214,172,217, 35,123,123,251, 14,213,217, 28,209, 14,132,220,253,157,144,187,191,147,133, 61, 65, 18, 19, 19,175, 18, 66,254,168,
-248, 40,149,202, 63, 14, 30, 60,248,199, 7, 31,124,240, 7,128, 1, 53,228,147, 89,249, 57, 26, 72, 83, 28, 62, 76,200,234,213,
-132, 4, 7,147,123, 0, 25, 13,164,213,209,102,115, 23, 23,193,237,149, 43,198,107, 14, 31,254,141,156, 56,113,140, 28, 63, 30,
- 69, 14, 29,220, 74,214,172,158,172,117,118, 22, 36, 0,104, 85, 7,155,124, 0,223, 2, 88,133,114,229, 50, 57, 39, 39,135,100,
-101,101, 17, 0,201,134,223, 86, 57, 58, 58,254,128,234,213,183,222,149,149,172,153,125, 93, 78,124,244, 94, 16, 81, 20,101,146,
-143,222, 11, 34, 51,251,186,188,164,108,245,109,209,194,122,106,255,118, 57,137, 55,119,178, 83,251,183,203,233,219,162,133,117,
- 61,243,147, 66,249, 58,161, 27,207,159, 63,175, 39,149,160,211,233,200,246,237,219, 89, 91, 91,219,223,234, 96,179,181,163,163,
- 99,170,157,157, 93,114,229, 31, 29,253, 6,117,243,234, 49,122,177,189,207, 7,193,117, 72,103,160,152, 97,158,157,217,251, 19,
-155,151, 22, 79, 52,202,108, 82,244, 48,150, 60,187,119,149,108,223,188, 74, 39,228,243,159, 1, 8,124,157,103,169,142,176,216,
-180,216,180,216,252, 27,218,172,137,139,252, 55,131, 95,245, 6,171, 66, 36, 18,134, 45, 94, 56,143, 42,204, 43, 84,170,138, 21,
- 26,157, 74,165,162, 25,162,138,191,251,228, 57,205,231, 21,206,156, 62,205, 58,108,254,194,176, 82,224, 99, 51,255,211,221,223,
-223,255,250,129, 3, 7,156,236,236,236, 80, 84, 84,132,188,188, 60, 92,191,126, 29,132, 16, 12, 30, 60, 88,212,185, 83,167, 14,
- 95, 46, 90,116,229, 89, 70, 70, 87,152,110,120, 95,144, 23, 59, 7,172, 8, 42, 95,139,246,171,167,121,229,173, 14, 69, 97,203,
-208, 80,227, 57,203,158,149,175,150, 33, 22,139,141, 11, 18,215, 3, 93,223,126,251,109, 6, 0,198,141, 27, 87,172, 80, 40,194,
- 13, 10,135, 89, 43,173,202,156, 60, 67, 28, 92,221,162,126,218,180, 66,210,174,165, 39,180, 58, 61, 82,179, 50,193, 23, 52, 68,
-227,198, 12, 62,249,184,143,160,103, 55, 59,135,111,191,222,114, 44,139,195,160,178,220, 7,167, 76,217,106,216,176,225,246, 61,
-123,246, 96,239,222,189, 0,128,228,228,100,120,122,122,202,106, 75, 67, 66, 66, 66,139, 1, 3, 6,236,206,203,203,107, 85,219,
-185, 85, 3,227,139, 68, 34, 4, 5, 5,193,199,199, 7,135, 15, 31,238,101, 80,182, 94, 11,202,152, 24, 88,221,185, 3, 68,215,
-171,243,210, 60, 32,192,227,234,241, 99, 59, 29,142, 29,191,135, 31,126,216,138, 71,143,202,133,182, 22, 45, 90, 96,228,136,161,
-130,248,248,203,190, 31,126, 56,242,242,197,139,143,130, 12, 68,169, 54, 44,253,249,231,159, 23, 52,107,214, 12, 31,126,248,225,
- 80, 95, 95, 95,151, 6, 13, 26, 96,243,230,205,112,117,117,109,161,209,104, 30, 30, 62,124,216, 45, 43, 43, 11,211,166, 77, 67,
-118,118,246,108, 83,134,122,189,219,235, 75, 81,127,239, 30,109, 2,198,192,170,129, 43,126,222,181, 7,247,111,109,239,161,214,
-222,251,146, 97,163, 71, 41,137,104,108, 78,154, 85, 88,211,142,193,246,173,124, 7,192, 35, 32,214, 65,197, 94,124,242,101,159,
-230, 17,124,177,106,251,146, 31,228,121,175, 24,253, 48,146,215,182, 56,201, 46,225, 12,242,128, 37, 92, 5,193, 50,170,181, 4,
- 3,122,246,236,105, 44,184,167, 79,159, 66,173, 86,195,219,219,155,214,104, 52, 33,102,230,107,235,119,222,121,231,207,227,199,
-143,219,183,110,221, 58, 39, 63, 63,223,120,192,197,190,225,187,209, 7,214, 76,251,118,237,191,189,118, 16,170, 48,231,222,161,
-248, 90,108, 5,118,239, 18,112,246,196,129,157, 86, 84, 73, 58,132, 13,115, 1, 46, 15,143,119,255, 10, 74,106,135, 97, 19,103,
-241, 67,222,126,171, 81,159,247,134,156,189,255,224,209,219, 0,110, 88,250,245, 22, 88,240, 63,173,106,145,127,218, 61, 25,137,
- 86,104,104, 40, 85,221, 13,114,132,243,115,118,178,151,172, 89,185,237, 6, 79,171,209,200, 26,218,104, 4, 54, 13, 56,202,218,
-134,167,213,232, 74, 60, 90,120, 8, 57,194,249,153,176, 95,117,138, 39, 37,145, 72, 14, 28, 57,114,196, 73, 32, 16,128,227, 56,
- 56, 58, 58, 34, 37, 37, 5,133,133,133, 80, 40, 20,120,116,239, 30,154,185, 55,193,146,176,121,174,211,230,133, 29, 40, 43, 43,
-235,136,151,135, 17, 95,153, 54,202,234, 94, 94, 55,186, 98, 9,150, 87,186,252,134,223,170, 57,102,238, 84,212,148,180,180, 52,
- 88, 89, 89,161,109,219,182, 86,151, 46, 93,186, 88, 3,201,122,201,166,173,109, 11,107, 78, 36,220,187,241,167, 69, 18,173, 46,
- 1,119, 31,231,163, 77,179, 30,112,182,119, 71,102,190, 6, 87,175, 31, 65, 66,220,239,104,217,200, 29, 83, 38,190, 37,142, 88,
-177,111, 15,163,111,230, 94, 88,152, 82, 92,157,205,226,226, 98,171,230,205,155,195,221,189,124,221, 51,150,101,113,247,238, 93,
-176, 44,107,220,175,188,221,182,255, 60,244,197,169, 24, 51,122, 52,242,242,242,172,170,179, 41,224, 65, 63,107,252, 72,190, 68,
- 0, 8,101,118,154,146,146, 18,227, 50, 28, 90,173, 22,183,111,223, 70,215,174, 93,131, 35, 35, 35,107, 99, 69,102,229,167, 22,
-248,126,237,111,191,173,251,184,168,136, 6,128, 95, 40,138,211, 18,242,189,185,207,146,147,147, 96,255,201, 19, 59, 28,120,116,
- 18,236,108,190,195,245,235,169,208,106,203,211,155,151,247, 28, 83, 39, 23,131, 17, 88,227,240,225,127,219,123,123, 7,237,207,
-202,210,182,197,203,195,136,213,165, 83,124,226,196, 9, 76,157, 58, 21,119,239,222,117,171, 88,163, 77, 34,145, 96,229,202,149,
- 60,111,111,111, 55,153, 76,134,147, 39, 79, 34, 59, 59,155,170, 41,157,127,156,250,227,155,162, 71, 23,190,204,162, 78,246,253,
-121,215, 30,124, 62, 98, 24, 92,200,227,139, 54, 45,169,111,222,233,223,253, 43,194,107, 18, 42,179,246,179,245,108,219, 31,140,
-208, 10, 83,190, 88,134,228,132,163,182,101,138,184,201, 20,155,222,100,201, 15,145,211, 95, 73,231,190,161,236,184,223, 47, 5,
-156,113,191,225,113,231,246,248,107,242,216, 45,113, 47,136, 86, 11, 62, 69,179, 54, 64,249,178, 38, 15, 31, 62,196,163, 71,143,
-192,231,243,161, 84, 42,161,215,235,171, 77,167,155,155,219, 4,189, 94,255,149,161,156,183,137,197,226, 79,119,238,220,105, 95,
-153,104, 59,250, 13,234,102,111, 45,123, 59,251,121, 94,193,229, 27,137,247,103, 77,248,176, 87,204,213,132,116,173,224,131,180,
-162,184,195, 69, 38,242, 83, 44, 17, 10,247,159, 60,248,111, 43,221,147,243,144,121,247,130,192,202, 19,172, 46, 3,101, 5,165,
- 80, 60,146, 67,253,211,122,180,159, 60, 19, 71, 15,237,179,242,109,215, 49, 82,173,211,121, 2,208,212,227,221,172, 11, 44, 54,
- 45, 54, 45, 54,255,158, 54, 77,114, 17, 66, 72, 0, 0,103,195,110,158,129, 23, 56, 0,200, 69,249,138, 2,206,134,186, 67, 88,
-233,178,170,251,149,207,173,186, 95,249,123,158,225,187,147, 97,123,131,162,168,252, 90,146,238,138,242,165, 9,143, 25,182,128,
- 97, 40,177, 86,199, 99,138,162,139, 89,150, 19, 49,142, 78,170,113, 31,189,221,238,244,217,155,183,165, 14, 13,248,239,246,234,
- 16,124, 61,254,201, 21,138,166,116, 20, 69,155,229,247,193,227,241,134,173, 89,179,166, 93,131, 6, 13,192,113, 28,108,108,108,
-144,147,147, 3,141, 70,131,162,162, 34,168, 21,197,208, 42,138,113, 39,253, 41,186, 7,247,194,144,190,239,120,255,251,208,145,
- 97, 44,203,238,174,201,174,155, 95, 7,163,146,181,172,169,253, 11,105, 34,189,208, 72,186,190,235,224, 9,198,202, 10,125,102,
-133,189,206, 51, 16,123,236,216,177, 19,131, 7, 15,126,111,206,156, 57,180, 92, 46, 63,153,146,146,210, 29,192,221, 90, 73,133,
- 72, 60, 99,210,140, 80, 91, 91, 43,130,200, 51, 71,208,179,195, 8, 72,133, 60,228, 21,107, 65, 81,192,189,196, 3,160, 40, 59,
-196, 37,203,209,163,125, 3,188,243,174,183,213,161,125,247,230,224,133,127,208, 43, 69, 83, 80, 80,128,231,207,159, 67,167,211,
- 65,167,211,225,195,161, 67,177, 99,251,118,148,150,150, 66,169, 84, 66,163,209,128,101, 89,208, 52,141, 51, 81,145, 72,127,114,
- 15,221,186,118, 5, 76, 44,189,180,253, 54, 4, 0,174,222,191,127, 31,247,238,221,195,179,103,207, 32, 22,139,225,226,226,130,
-101,203,150, 65,173, 46, 95, 79,108,232,208,161,193, 0,226, 95,247,133,122, 4,108, 73, 97,217, 47,223, 59,120,208,233,210,193,
-131,220,213,163, 71,159,137, 20,138,205,230, 92,203, 48,248,112,197,247, 19,219,200,100, 50, 60, 75, 91, 3, 47, 47, 6,179,103,
-218, 35,252,187, 92, 0,192,180,169,141,209,169,163, 3,138, 11,247,193,193,105, 1,214,173,155,222,114,236,216, 85,163,203,202,
-216,109,181,152,254,242,200,145, 35, 67, 60, 61, 61, 27,197,198,198, 82, 66,161, 16, 18,137, 4, 18,137, 4, 98,177, 24,207,159,
- 63, 71, 74, 74, 10, 89,177, 98, 69, 6,128, 47,107, 50,180,100,157,252, 10,128,247,102,246,197,137,251,183,182,247,104,196,123,
-114,103,200,148,160,167,113, 87, 99, 21,167,207, 92,250, 90,175, 18,167, 23, 62, 59, 59,175,121,167, 88,135,201,115,151, 98,253,
-138,197,184,127, 45, 38,223,217,189,120,131,132, 82, 87,155,206,224,224, 37,124, 87,103, 59,253,132,177, 67, 26, 30,117,190, 60,
-225, 56,159,202,201,202,189,181, 18, 41,177, 74, 81,171, 14,163, 90,183,160, 53,231,207,159,151,244,236,217, 19, 42,149,202,168,
- 76,238,220,185,147,211,235,245, 23,170,125, 54,181,218,175, 50, 50, 50, 92,149, 74, 37,250,246,237, 59,109,229,202,149,178,138,
-245,228, 88,150,125, 73,201,250,102,245,142, 83, 51,190,218,112,225,212,238,239,220,190, 9,251,180,215,199, 83,190,189, 0, 19,
-235, 72,242,105,122,242,209,131, 91, 93,196,182, 58, 72,236,222,129, 42, 91,137,251, 91, 62, 71, 89,177, 10,157,190, 89, 10, 64,
- 8,141,142,198,230,254, 31, 66, 96,239,134,197,159,125,234,182,112,243,207, 19, 57,142, 91, 99,233,215, 91, 96,129, 5, 85,224,
- 76, 81, 84, 20, 0,132,133,133, 45, 8, 15, 15, 79,164, 40, 42,138, 16, 18,106, 16, 80,162, 8, 33,161, 21,231, 24,200,217, 43,
-251, 21,231, 86,221,175,250,125,254,252,249,190, 17, 17, 17,203,187,254, 31,123,215, 29, 23,197,181,182,159,153,237, 21, 88, 58,
- 11,168,128, 34,168, 32, 16, 17,177,163, 70, 18,187, 70, 44, 81, 44,209,104, 18, 75, 52,137,221,216, 75,188, 70, 19, 91,212, 88,
-162,198, 94,162, 98, 87, 20,123, 5, 21, 5, 5,233,189,195,178,189,204,204,247,135, 64,208, 80, 22,147,220,155,251, 93,158,223,
-111, 88,118,119,230,217,115,166,156,243,156,247,188,239,123,130,131, 15,222,190,125, 59, 25, 64,125, 66,171,111,133,176,250,195,
-210, 59,100,165,130,172,254,250,134, 69,139,166,175, 39, 38,167,170,123,247, 10,114,137,136,122,250, 96,220,184,190, 61,135,247,
-239, 26,154,146, 94, 20,215,188,169,163,237,179,103, 79, 45,104,154,190,110,206, 89,226,243,249,253,122,244,232,193, 46, 41, 41,
-129, 72, 36, 66, 65, 65, 1,178,178,178, 96, 48, 24,160, 45, 43,133,174,172, 20,218,210, 18, 24,202, 74,240,234,225,125,180,109,
-238,193,175,112,150,175, 19,149, 86,151,183, 45, 85,213, 45, 91, 60,169, 20,124,169, 20, 68,195,167, 13, 7, 90, 89, 89,221,173,
-236, 84, 13, 6,195, 23,179,103,207, 46,164,105, 26, 43, 86,172,176,144, 72, 36, 71, 0,240,235, 35,145,218,177,250, 5,251,251,
-144,241, 41, 79,208,217,111, 12, 90,186,247, 65, 74,158, 6,133,229, 6,228,151, 26, 16,216,117, 35,154,249, 45,129,171,255, 42,
-196,165, 21, 67,238,236, 73,130,205,175,115,241,231,140,140,140, 55,222, 31, 60,112, 0,106,181, 26,205,155, 55,199,200,145, 35,
- 49,123,246,108,140, 28, 57, 18,114,185, 28,163,134, 13,192,162, 69,139,144,155,155, 91, 95, 81,117, 45, 91,182,212, 53,109,218,
- 84,215,180,105, 83,157,193, 96,128, 82,169, 68,105,105,233,219,231,123,122, 67, 79,164,189,189,253, 92, 71, 71,199, 39,246,246,
-246,207,248,124,254,217, 24,130,136,215, 54,109,234,208,105,208, 32,162,245,176, 97,172, 52,161,144,136, 2, 36,230,112,217, 90,
-115,250,134,244,248,144, 87, 90,178,171,202, 72, 53,126,156, 29,110, 70,181,193,173, 27,237, 48,245,139,230, 32, 72, 1, 8,146,
- 7,181, 42, 18, 65,237,131,185, 86, 86, 68,125,247,210,199, 0, 98, 58,117,234, 36,159, 50,101, 10,193,231,243, 49,109,218, 52,
-195,132, 9, 19, 18, 70,142, 28,153,112,229,202, 21,170,105,211,166,112,117,117, 37, 92, 93, 93,157, 0,196, 84, 28, 83, 39, 44,
-154, 19,203,117,134,184, 27, 86,158,226,100, 10,182, 29,149, 70,254,208,197,223,231, 20, 45,223,146,252,125,202, 11,181,199,139,
-123,215,139, 18, 98, 79,211, 41, 15,174, 21,102, 39,148,123, 44,223,146,252,253,188,205,217, 53, 62,212, 81, 81,160,143, 71, 68,
- 25,212, 42, 53,123, 80,255, 16,245,164, 79,134,183,180,150,180,217, 7,231,222,126,205,154,184,140, 90,180,114,131, 97,194,103,
- 95, 26,118,236,220,197,148,151,151, 67,161, 80, 96,195,134, 13,166,211,167, 79,103, 81, 20,245,101,109, 99, 32, 0, 48, 26,141,
-152, 52,105,146,216,194,194, 2, 25, 25, 25, 85, 22, 81, 0,200, 41, 40,122,122,235, 65,108,252,204,201, 97,221, 84, 58,157,238,
-194,181,135,113,173, 61,155,186, 16, 4, 83,107, 32, 10,143,195,121,191, 93, 80, 16,139, 97, 74, 65,176,155,224,213,158,127, 65,
-145, 91, 12, 69,126, 49, 88, 28, 49, 76,224,195, 72,243, 96,213,182, 61, 94, 62,136,134,179,157, 3,155,207,225,132, 54,246, 39,
-141,104,196,255, 38,234,210, 34,213,197,210,234,213,171, 87,214,245,125,181, 87,253, 91,239,171,132,212,219, 34,172,250,255, 0,
-176,122,245,234,149, 12,195,244,187,125,251,246, 1, 0, 26, 51,171,240,105,181, 87,243,243,104,177,180,250, 85, 95,207, 94, 0,
-153,165,208,178,125,128,167,227,201,243, 81, 15,175,223,126, 24,215,204,213,214,142, 49,234,101,107,214,109,114, 33,212,154,213,
-102, 22,162,149,173,173, 45, 12, 6, 3, 18, 19, 19,145,153,153, 9,131,193, 0,147, 74, 5, 93,105, 41,180, 37, 37,160, 84,229,
-224, 82, 20, 52, 5,249,176, 17, 9,128,223, 35, 18,235,177,188, 17, 53, 10,173,202, 87,129,133, 5,248, 82, 11,144, 28, 78,189,
- 43,197, 87,195,123,237,219,183, 63, 28, 27, 27, 27,212,171, 87,175,101,120, 29, 34,159,150,149,149,213,115,225,194,133, 58, 7,
- 7, 7, 76,154, 52,201, 11,192,152,122, 69, 38, 79,223,170,169,163, 23, 90,122,140, 65, 51,215, 30, 40, 85, 25, 81,160, 48, 34,
-191,212,128,109, 27,131,113,108, 71,123,220, 60,214, 5,177, 23,222, 71,169,209, 17, 18,249, 64, 48,148,190, 77, 93,156,151, 46,
- 93,194,210,165, 75,177,108,217, 50,172, 88,177, 2,203,150, 45, 67, 86, 86, 22,124,124,124,144,158,158,142,115,231,206, 33, 39,
- 39, 7,182,182,182,184,127,255, 62,214,175, 95,143,155, 55,111,214, 91,233, 74,225,106,198, 62, 13,154, 75, 55,153, 76, 99,115,
- 6, 13,242,205,179,182,110, 29, 16, 16,240,225,180,105,211, 60, 58,117,234, 84,245,189,135,135, 71, 19,161, 80,152,139,215, 17,
-148,254,117,113,209, 64,128,157,157, 15,244,186,248,138,107,204, 1, 65, 8,208,227,253, 56,116,234,242, 16, 6, 35, 23, 36,193,
- 7, 73, 10, 96, 50, 21, 65, 38,147,131, 97, 8,159,122,138,184,176,160,160,192,243,242,229,203,100, 74, 74, 10, 4, 2, 1, 0,
-164, 46, 94,188,120,211,247,223,127,255,220,198,198,134,138,136,136,192,111,191,253,134,126,253,250,177, 38, 76,152,224,233,234,
-234,186,181,190,122, 47,222,144,115,103,255,186,115, 35, 56, 70,153,191, 64,216,204, 13, 42,201,192,207,187,217,138, 1,224,124,
- 82, 82,185,125, 19,197,106, 85,249,147,116, 43, 23,229,119,231,147,234,139, 56, 93, 76, 63, 74,136,191,187,255,196,249,178,252,
-188, 18, 78,128,111, 27,205,170,165,223,112,155,185,181, 88,179,104,246,100,199, 44,133,160,244,253,105,231,226,143,159,191,175,
- 28, 61,110,162,233,147, 79,167,104,207,157,191,116,130,166,105, 95,212, 18,113, 72,211, 52,114,114,114,240,236,217, 51, 36, 37,
- 37,161,160,160, 0,133,133,133, 40, 47, 47,175,154,110, 20,149, 43,206,108,218,125,250,177, 88, 40, 20, 5,249,122, 54,185, 23,
-253, 60, 95, 44, 20,138, 60,221,154,180, 4, 22,215,216,142, 80, 20,229, 43, 16, 9, 1, 16, 40,141,189, 14,101,137, 18,202, 82,
- 37,202,139,149,208, 25, 88,208,234, 72,104,244, 36,154,118,235, 13,165, 74, 11,101, 81, 25,104,138,242,107,236,110, 26,209,136,
- 70,212,209,215, 71,204,153, 51,103,158,153,251,154, 61,189,249,182,240,154, 51,103,206, 60,130, 32, 34,230,206,157,219, 6,181,
- 7, 84, 85,199,246, 26, 54, 0,102,164,119, 40, 42, 74, 80, 74,137, 86, 67,102,204,250,246,220,129,157, 27,237,117, 58,117,186,
-141, 76, 66, 73, 68, 60,219, 79, 38,173, 64,185,178,100,176,202,252,116, 4, 40, 41, 41, 65,114,114, 50,132, 66, 33,184, 28, 14,
- 40,141, 6,148, 70, 5, 77, 73, 17, 72,131, 14, 92,138,130,181, 72,136,166,114, 71, 52,115,112, 52,139, 51, 49,242, 98,149,227,
-123,245,233,194,127,181,111, 5,158, 88, 2,158, 84,130,207, 35,174, 1, 0,184, 92, 46,176,112,153, 89, 70, 19,103,103,231, 83,
-251,247,239,231, 22, 20, 20, 32, 38, 38,230, 49,128, 50, 0, 82, 0,116, 92, 92,220,229,216,216,216,126,158,158,158, 0,208,188,
- 62, 50, 69, 33, 73, 25, 77, 12, 50,114, 83,145,146, 25, 13,107, 75,119,112, 68, 45,145, 95,106, 0, 95,232, 14,163,238,247,217,
- 71,173, 34, 13, 26, 3,203,172,186,235,245,122,152, 76, 38,152, 76, 38,232,245,122,124,250,233,167,184,117,251, 54, 14,254,118,
- 5,201,175, 94,194,203,205, 17,225,225,163,209,190,125,123,220,190,125,187, 78,174, 49,254, 48, 58, 75,192, 94,247, 33, 9,158,
-196, 70,215, 97,246,133,123,245,137, 45,130, 32, 24,212, 50, 21,249, 22,190, 15, 14, 14,110,241, 82,165,194,179,248,120,244, 90,
-188, 24, 0,112,246,236,217, 55,234, 50,115,230, 76,222,243,231,207, 63,121,248,240,225, 39,217,217,217,235, 0,212,236,108,206,
- 0,103,206,220,193,228,201,207, 81, 80, 80, 0, 0, 56,116,224,119, 93,154,146,108,192, 7,125, 95,207,104, 89, 89, 89, 97,221,
- 58, 31,179,206, 39, 69, 81,216,190,125,123,213,116, 33, 0,176,217,236, 78, 51,103,206, 28, 82,211,254, 45, 90,180,224,214,199,
- 57, 99,168,179,224,230, 99,230, 11,203, 22,205,218, 88,216,182, 69,145, 49,218, 39, 58, 43,103,234,140,161,206, 63,172, 63,154,
-165, 21, 18,186, 95, 8, 42,195,149, 45,208,238, 49,167,140, 73,231, 55,234,139,154,142,221,147, 91,160,152, 63,101,226,199, 54,
- 22, 86,246,170, 29,155, 86,201, 72, 22,201,156,122,104, 40,109,227, 97, 99, 53,176,195,143,202,201, 51, 22, 70,235, 77, 25, 83,
-144,113,234, 37,234, 72,113, 65, 81, 20,178,179,179, 81, 80, 80,128,244,244,116, 20, 22,190,158,126, 45, 44, 44, 4, 77,211,127,
-166, 65,132, 38, 61, 29,105, 39,118,160,217,232,209, 8, 92,182, 20, 20,205,134, 70, 77, 97, 93,199,158, 40, 41,211, 64, 71, 19,
-144,191,215, 17, 19,207,222, 0,201, 80,192,182,205,141, 61, 73, 35, 26,241, 63, 10,115,210, 59, 84, 10,162, 85,171, 86,245,251,
-171,127,191,186,216, 90,181,106,213,179, 85,171, 86, 53,228,183,222,158, 50,172,122, 95,233,163,117,173,154, 3,218, 31, 58,205,
-242,194,184,164,231,207,217,217, 42,141, 74,228, 96,111,167, 19, 9,248,116,153,162,156, 21,253,244,177, 65,149,251,234, 69, 3,
-234, 17, 23, 27, 27,235,147,157,157,141,244,180, 52,152, 52, 42,144, 58, 61, 24,173, 26,189, 58,119,132, 0,128,128, 36,192,165,
- 13, 96,179,120, 40, 87, 42, 0, 32,174,222,206,209,104,252,131,101,139, 32, 8,240,164, 82,240,196, 98,240, 36,210, 55, 44, 92,
-230, 88,108,248,124,254,254, 35, 71,142, 56, 57, 59, 59, 99,233,210,165,112,113,113,241,150,203,229,106, 75, 75, 75,161,131,131,
- 3, 90,183,110,141,142, 29, 59,226,220,185,115,128, 25, 57,165,140, 38,193,147, 23,169,232, 84, 88,124, 27, 55,174,253, 4,189,
- 70,135,128,110, 63,193,192,110, 6,187, 54, 75, 64, 39,238,131, 58,247,228,107,235,129, 99,127,100,166,167,130, 96,241,158,153,
-107,121,170,252,255,241,227,199, 56,112, 50, 10, 78, 77, 91, 33, 61, 33, 30,241, 87, 47,227,150,157, 13,154,182,106, 93, 53, 13,
- 84,107, 25, 41,176,151,111,126,157, 38,106,193, 23, 31,243,139,139,139,249,214,214,214,186,202,115,231,228,228,244,103,196,214,
-199, 95,127,253, 53, 74, 57, 28,160,111, 95,112,147,146, 96, 48, 24,208,161, 67, 7, 4, 6, 6, 2, 0, 58,116,232, 0, 54,155,
-141,182,109,219, 66, 46,151, 99,243,230,205, 31,215, 38,180, 72, 2, 49, 38, 83,145,183,135,135, 71,149,208,218,179,183, 0,209,
- 15,223, 7, 1, 30, 54,108, 74,172,218,183, 73,147, 38,200,205, 73, 2, 65, 48,177,245,148,113,153,163,163,227, 66, 39, 39, 39,
-143,239,191,255,158, 37, 16, 8,240,217,103,159,185, 43,149,202,102, 21,166,100,204,157, 59, 23, 0,176,104,209, 34, 44, 94,188,
- 24, 58,157, 78, 93, 27,217,158,117,190,242,252, 98,250, 19, 70, 41, 26, 28, 98,219,204,183, 71,104, 47,184,123,246, 64,143,208,
-116, 0, 88,105,205, 78, 29,182,102,190,213, 9, 43, 41,177,235,226,249, 75,139, 58,119,235, 49,127,182,242,234,242,239,182,151,
-214,235,243, 88,150,246, 75,249, 11,222,240,245, 27,183,238, 93,255,237,220,233,130,244, 2,125, 73, 86, 9,163,148,240,217,146,
-230, 14,132,100,234,172,101,201,217,217, 73, 95, 33,227,124,189,145,150, 52, 77, 35, 41, 41,169,202,167, 79,171,213, 66,165, 82,
- 33, 35, 35,163,234,158,209,136, 45, 62,152, 50,174,191,159, 74,163, 81,223,123,154,144,190, 96,218,168, 96,149, 70,163, 78, 72,
- 73,127, 9,108,168, 81,141,145, 36,249, 84, 93,174,238,165, 46,213,162, 32,230, 5, 92,122, 54,133,209, 68, 64,111,162, 80, 80,
- 84, 14,157, 9,160, 72, 14,218, 12, 11, 7, 69,176, 81,152,157, 5,146,197,122,140, 55,157,246, 27,209,136, 70,252,239,160, 78,
- 45, 82,105,209, 10, 14, 14, 62, 88,221,234, 84,249, 63, 0, 29,234,118,229, 41,168, 46,166, 42,167, 19,107,251,157,183,120,205,
-197, 31,124,180,234, 77,239, 80,249,155,174,150, 10,249,191, 22,141,114,161, 77, 38,175,252,194, 60, 19,155,205,231,184, 90,106,
-114,138,211,205,255,117,157, 78, 23,113,249,242,229, 65,239,191,255, 62, 63,225,233, 99,232,203,202,160, 47, 43, 5,135, 54,193,
- 90,216, 14,164, 65, 7, 66,175,135,179, 55, 13,109,185, 16, 81,183, 98,141, 58,157, 46,194, 92,161, 69,178, 88,111,250,101, 73,
- 36,224, 75, 45,192,151, 72,222,158, 90,172, 79, 20,136,122,247,238,221,179, 67,135, 14, 96, 24, 6,219,183,111,135,193, 96,224,
- 25, 12, 6,232,245,122, 24, 12, 6, 40, 20, 10,236,221,187, 23, 91,182,108,185, 5, 96,119,189,157,153, 73,127,249,194,165,200,
-246,227, 71,245,227,156,141, 88, 7,147,158,130,134,112,129, 74,101,132, 82, 47, 2,101, 51, 26,200, 59, 3, 22, 91,128,224,182,
-238, 56,121,244,184, 1, 38,221, 21, 51, 85,248, 27, 86,161,140,244, 84,100,190,122, 9,137, 34, 23,118, 22, 34,168,147, 94, 34,
- 32,124,204, 59, 89, 39, 92, 93, 93, 65,211, 52, 66, 66, 66,170,156,171,223, 85,108, 21, 21, 21,225,244,233,211,232,208,161, 3,
-186,117,235,134,172,172, 44, 36, 37, 37,161, 79,159, 62, 85,251, 60,126,252, 24,209,209,209,104,222,188,110, 35, 97, 97,177,241,
-108,102, 70, 76,216,192,129, 3,185,119,239,222, 5,195, 48,240,244,180,128,133, 84, 12,130,228,163, 85, 43,123, 0,175,199, 0,
-221,187,119,135, 66,145,100, 42, 41, 97,206,214, 83,221,253, 0,126,211,235,245,137, 93,187,118,149,191,122,245, 10, 51,102,204,
- 96, 31, 58,116,168,210,148,140, 57,115,222, 12,166,208,104,106,159,186,247,242,245,254,198,221, 36,235, 38, 16, 54,115,179,176,
-109, 11,119,207, 30, 0,128,247,251,141,135,123,139, 38, 80, 20, 62,113,211,106, 82, 7,115,217, 37,178, 39, 27,178,158, 11,251,
-250,140,211,230, 95, 75,192,235,169,211,122, 47,187, 38,225, 80, 94, 58,103,244,225,223, 78,157,155,212,167,223, 0,142,145, 50,
-153,124,154,114,172,142,156, 56,147,159,149,150,254, 35,210,207,199,254,110,255,171,211,138, 71, 41, 20, 10,136,197, 98,196,198,
-198,234,250,246,237,203, 39, 73, 18,137,137,137, 85, 66,203,222,214,186,117,167, 64, 31,239,229,235,247, 94, 16,243,249,252,208,
-238,237, 90, 61, 79, 72,203,100, 24, 34,181, 86,107,171,209,120,233,105,204,227, 16, 59,121, 11, 86,210,181,187,176,233,210, 7,
- 58, 29, 9,141,158,134,206, 4,152, 88, 92, 56,249, 7,193,170,121, 43, 48, 0, 30,220,189,101,212, 25,141, 23, 26,251,154, 70,
- 52,226,127,218,170,197,212, 37,146, 42,254, 47, 6,144,186,106,213,170,194,106,214,166, 2, 0,143, 1,248, 85,236, 87,240,214,
-113, 5, 4, 65, 60, 96, 24, 38,176, 26, 79, 65, 53,193, 85,253,127,253, 91,251, 60,110,128,200,170,254,250,166,208,170, 45,164,
- 18, 0,108,109,109,237, 3, 2,218, 53,255,121,231, 97, 48, 12,131, 23,209,107, 81,146, 31,143,133, 43,239, 52,119,118,118,238,
-150,149,149, 21,101, 78, 9, 40,138, 58,180,107,215,174,175,130,222, 11, 8,112,115,113,193,227,212, 20,112, 25, 10, 92,138, 2,
-105,208,129, 77,233,225,226, 67,129, 36, 36,200,206, 46,195,234,253,135, 99, 43,178,196,215, 9,239, 62, 3,176, 52,179, 12, 4,
- 65,224,251, 96, 31,240,164, 18,112,197, 18,124,126, 42,178, 74, 92, 69, 44,157, 11,158, 68,130,230, 65,102, 37,132, 87, 95,189,
-122,245,225,211,167, 79, 3,125,124,124,240,213, 87, 95, 33, 53, 53, 21, 52, 77, 35, 47, 47, 79,155,147,147,147, 85, 80, 80,144,
- 10,224, 4,128,159, 97, 70,230,113,174, 78,251, 67,196,177, 61, 83,130, 59,119,179, 29, 56,120, 11,126, 59, 58, 19,165,101, 10,
-168, 77, 66,168,180, 38,168,116, 44, 88,219,248, 34,168,109, 91,100,103,229,227,217,221, 11, 74,182, 78,189,182, 33, 55, 40, 65,
- 16,136,142,142,134,135, 92,138,151, 55,162, 96, 43,226,192, 79,238, 8,121,167,206, 85,249,165,234, 2,135, 5,211,199, 31,127,
- 92,149, 25,190,119,239,222, 41,163, 71,143,118,154, 57,115, 38,118,238,220,137, 91,183,110,253,193, 65,187, 91,183,110,184,126,
-253,250, 18, 0,139,234, 51,234,233,245,122,120,123,123,227,193,131, 7,184,124,249, 50,122,244,232,129,110,221,186,225,201,147,
- 39,184,120,241, 34,162,163,163, 65, 16, 4,108,108,108, 96,124, 45,158,141,181,145, 25, 12, 56,242,221,154, 93,243,214,175,223,
-210,102,212,168, 81, 56,118,236, 32,198,143,243, 2, 65,242, 65, 16,124, 12,232,239,133,165,203, 30, 32, 40,168, 59,108,109, 57,
- 88,191,238,100,178, 70, 67,237, 53,227, 52, 46,191,120,241,162, 92,171,213,162,180,180,148,145, 72, 36, 68, 81,209,235,136,214,
-154, 44, 90,106,181, 90, 80, 27,209,211, 71,113,107, 75,203,153, 18, 70, 25, 61,184,216, 20,237,219, 35, 52, 3,239,247, 27,135,
- 75, 17,187, 17,121,225, 50,172,217,169, 41, 16,151,159, 43, 76, 41, 84,228,168, 60,183,182,122,111, 2, 43, 83,117, 97,235,212,
- 1, 47, 89, 78, 78,244,145,185, 63, 41, 74,235, 18, 90, 0,136,226,231,251, 78,157, 96, 48,160, 99,112, 80, 11,159, 38, 78,188,
-146,194,124,230,232,201,115,177,134,148, 99,167,171, 9, 44,166, 30,161,190,116,206,156, 57,223, 86,252,255,203,130, 5, 11, 38,
-172, 94,189,218, 46, 55, 55,183,202, 71, 43,191,176, 56,178, 99,223,169, 84, 81,105,153,126,215,250, 89, 67,133, 2, 62,111,193,
-234, 93,215,140, 44,220,173,141,215, 68,211,155,135,205, 88, 56, 61,225, 69,180,115, 51, 33, 15, 39,103, 45,194,227,139, 87, 97,
- 36,185,152,124,249, 30,116, 6, 10,165,133, 69,184,242,201, 23,144, 56,200,176,229,218,177, 60,154,166,127,106,236,106, 26,209,
-136,255, 93,212,166, 69, 8,130,168, 41,199, 94, 94, 13,159, 61,168,235,184, 90,120,254, 10,212,154, 21,222,172, 16,188,194,194,
-194,252,235,215,239,225, 90,196,114, 68, 69, 44,199,179,232,199,200,206,210, 35, 43, 79, 11, 11, 11,139, 59,117, 28,250,118,230,
- 88, 70,173, 86, 15, 89,176,240,219, 92,129, 80,132,174, 61,123,194,209,206, 30, 34, 46, 7, 44, 19, 13, 22,193,129,178,192, 10,
- 47,159,168, 49,123,215,190,124,165, 90, 61,164,134, 78,162, 87,109, 34,131, 32, 8,240, 45,164,224, 73,164,224, 75, 45,222,152,
- 70, 20, 88, 88, 64, 32,181, 0,155,199,171,201, 25,254, 15,156, 74,165,242,163,161, 67,135,150,148,149,149, 97,194,132, 9,136,
-138,138,138,190,112,225,130,197,147, 39, 79,132, 5, 5, 5, 45, 0,244, 6,176,173, 14,145,245, 6,103, 73, 73, 82, 57, 99,210,
- 13, 95,245,237,151, 26,173,201, 6, 97, 99, 14, 65, 76,102,192, 68,209, 96, 0,200,173,121,232,212,107, 25,242,245, 29,113,104,
-235, 10, 53,109,208,142,122, 43,135,214, 27,156, 12,195, 48, 14, 14, 14,127, 56, 7,151, 47, 95, 70,216,208,143, 16, 58,120, 16,
-236,220, 60, 96,223,171, 15, 66, 39, 76,198,214,173, 91, 65,146, 36,108,109,109,223,238,120,171, 56,247,196,128,115,224, 41,136,
- 3, 79, 65,252, 18, 13, 54,128,240,125,251,246,125,231,231,231,119,245,214,173, 91,107, 1, 12,175,254, 91,213,176,248, 45,107,
- 86, 77,215,104,254,244,233,211, 53, 9, 9, 9, 16,139,197, 48,153, 76,184,117,235, 22,182,108,217,130,239,191,255, 30,209,209,
-209,176,177,177, 65,243,230,205,161,211,233,240,224,193, 3, 13,128,249,117,112,210, 5, 5,166,143, 54,108, 88, 93,212,175, 95,
- 23,236,218,181, 9,142,142, 29,193, 97, 59,130,205,177,131, 88,226,141, 29, 63,127,135, 15, 63, 12,192,169,147,135,139, 11,139,
- 76, 31, 1, 48,153,113, 47,105,239,221,187,135,173, 91,183, 98,232,208,161, 89, 97, 97, 97, 84, 89, 89, 89,149, 69,139, 97, 24,
- 48, 12,131,197, 21, 62,102, 58,157,142, 95, 27,231,196,217,177, 89,179, 86, 60, 91,154,151,155,213, 33,234,234,157,143, 35, 47,
- 92, 70,114, 66, 36, 34, 47, 92,198,141,200,219,115,242,114,179, 58, 4,180,111,201, 29, 50, 97,202, 55,123,142, 31, 99, 73, 44,
-156,176,231,248, 49,214,200,169, 95,174,104, 23,218, 99,126,125,247,124,197,117,100,148,249,121,115, 87,174,221,168, 52, 25,180,
-228,191,126,220,156,173, 41,200,153, 95,237,190,100,234,187, 63, 53, 26,205, 54,173, 86, 43,215,106,181,114,157, 78, 55, 63, 53,
- 53,181,235, 87, 95,125, 85, 64, 81, 84,149,181,180,224,249,169, 59,241, 55,127, 89,105,111, 43, 19,118, 12,108,227,181,110,219,
-209,107,233, 25,121,191, 86,203,161, 85, 83, 57,181, 74,141,246,163, 65, 67, 70,171, 74, 75,116, 8,254,114, 14,104,129, 4, 58,
- 10, 48, 50, 44,152, 8, 50,219, 13, 77, 0, 0, 32, 0, 73, 68, 65, 84, 54,158, 46, 95, 7,161,181, 20,251, 83, 30,169,203,140,
-134,143,240,102, 14,173,186,234,254,103,208,200,217,200,217,200,249,207,228,252,111,134, 19,222, 92,235,208,233, 13,139, 86,125,
- 33,149,206,206,206, 93, 7, 14,232,133,238,253, 22,128, 97, 24,196, 63, 90,131,146,130, 23,112,118,228, 35, 41, 93, 17, 12, 32,
-170, 1,133, 73, 79,205,200,232, 48,125,254,130,227, 97,189,123,182,242,113,115,227, 55,107,214, 20, 98,123,123, 20, 22, 22,224,
-230,221,231,198, 21, 7,142,196, 86,136, 44,179, 38, 38,105,154,126,237,228, 14,160,231,244,217, 32, 88, 44,160, 34,141, 67,101,
-199,232, 22,216, 17, 4,155, 13,138,161,161,211,233,204,137,150,203,124,245,234,213, 71,163, 70,141,186, 18, 17, 17, 65,134,134,
-134,250,159, 56,113,226,207,172,153, 7, 85,126,194, 85, 0,253, 86,204,157,116,168, 67,143, 65, 22,158,109,218,113,219, 53, 99,
-193, 96, 36,144,157,149,134,136,227,247, 13,207,239, 93, 80, 48, 38,237,112,117, 97,194,213,186,184, 12, 6, 67,122,139, 22, 45,
- 28,182,110,221, 90,229, 12, 79, 81, 20, 10, 11, 11,113,231,206, 29,248, 6, 6,161,213,184, 79, 80, 80, 80,128, 13, 27, 54,160,
- 73,147, 38,232,223,191, 63,138,139,139, 97, 50,153,204,157,240,165, 0, 92,168,216,240,150,200, 34, 42,150, 0,170,115,218,208,
-195,195,131,167,213,106,253, 25,134, 97, 17, 4,241,131, 94,175, 31, 59,119,238, 92,167,149, 43, 87,194,203,203, 11,133,133,133,
- 16,139,197,240,244,244, 68, 65, 65, 1,238,223,191, 79,169,213,234,173,120,189,144,117, 65, 61,229, 75,188,127, 63,165,195,180,
-105,159, 31,255,110,245, 36, 79,173,174, 59,207,218,186, 51, 24,198,132,130,130, 84,148, 43,110, 25,150, 45,221,253, 42, 47,223,
- 56, 4, 64,130,153,117, 94, 52,101,202, 20, 0, 16, 0, 88,144,148,148, 20,211,170, 85, 43,207,218, 44, 90,230, 96,253,209, 44,
- 45,128, 3, 31,133,202,103, 40, 10,159,120, 90,179, 83, 83, 58,248,208, 27,214, 31,205,210, 90,200, 85,203, 11, 83,163, 94,230,
-168, 46,108,221,115,252, 24,107,204,224,143, 40, 23, 73,194, 28,129, 61,115,212, 12,106,198,207,207,207,149, 32,138,221,243,139,
- 94, 60, 28, 63, 97,210, 48, 75,174,230,172,159, 75, 81,115,178, 73,128, 32, 58, 58, 58, 5, 13,140, 12,173,192,203,172,172,172,
-174,115,231,206,189,192, 48,204, 27,190, 9,249,133,197,145,193,253,166, 48,165,165,101, 49, 5,113,167,204,201,165,118,255,254,
-163,232,158, 62,190, 1,199,190, 91,185,218,161,251,244,175,216, 47,175, 94, 3, 40, 35,210,162,174,129,226,235,233,117,183, 47,
-229,149, 25, 12,131,209,152, 21,190, 17,141,248,159,183,102,213,165, 69,254,225,232,139, 90,156,225,205,174,140,135,187,243, 5,
- 47,207,102,189,155,184,216, 1, 0,146, 82,178,145,148,146,117, 49, 41, 57, 43,180, 30,197, 91, 91,120,101,213,162,210, 68, 69,
- 10, 7,198,188, 69,165,223,224,180,177,177,121,200,102,179, 93, 26,114, 54, 40,138,202, 46, 44, 44, 12, 48,179,156, 35,221,220,
-220, 86,167,165,165, 29,167,105,122, 70, 3,213,126,141,156,149,139, 74,147,108, 94, 47,198,164,247, 5, 0,130,205, 51,103, 81,
-233,234,156,190, 18,137,100, 27,135,195,105, 82,121, 29, 43,125,176, 40,138, 98, 25, 12, 6, 1, 69, 81, 44, 0, 4, 73,146, 38,
- 14,135,163, 37, 8,194,100, 50,153,210,117, 58,221, 36,252,158,112,180,174,186,215,219,209, 87, 8, 45,212, 96,209,186, 12, 0,
- 9, 9, 9, 45,101, 50,217,112,130, 32,134, 50, 12,227, 93, 94, 94,174, 91,184,112, 97,244,145, 35, 71, 20,110,110,110, 31,244,
-237,219,151,120,242,228, 9, 98, 99, 99,153,162,162,162,163, 21, 86,172,164, 6,222, 75, 36,159,207, 26, 97,109, 77,246,101, 24,
-248,129, 1, 65,144,120, 90, 86, 70,159, 85,171,169, 95, 43, 4, 99, 67,239,207, 74,124,220,172, 89,179,221, 41, 41, 41,156,218,
- 44,169,181,213,253,109,172,153,223,102, 65,112,151, 46, 31,221,185,113,227,196,172, 21,207,150, 86,255,110,234, 32,217,248,145,
- 95, 76, 95,115, 96,243,143,179, 54,254, 86,178,203,156,114,250,251,251,123, 16, 4, 49, 28,128, 15,195, 48, 45, 24,134, 16, 16,
- 4, 83, 66, 16,196, 51, 0, 79,244,122,125,196,243,231,207, 51,255, 68,221,223,101,132, 91, 27,103,213,162,210,160,168,182, 20,
-192,152,185,168,244,191,187,156,141,156,141,156,141,156,255, 57,206,255,102,124, 90,195,103,230,101,134,175, 68, 82,114, 86,104,
- 82,114, 22, 90,180,104,193, 36, 38, 38, 54, 72,164,213,214, 73, 83, 20,117, 80,173, 86, 31,252, 51, 36, 69, 69, 69,237,254,230,
-147,119, 32, 37, 37,229,192, 95, 73, 88, 33,164,150, 86,108,239,138,167, 74,165, 50,200,220,157, 13, 6,195,223,113,110,136, 10,
-107,214,146,218,118,232,221,187,119,154,193, 96,184, 12, 32,131, 32, 8, 43, 0,197, 6,131,225,130,201,100,202, 75, 76, 76,108,
-183,110,221,186,202,204,247,203, 0, 60,124,199,114,208, 58, 29,181, 63, 59,155,218,255, 55,212,113,191, 94,175,159,105, 99, 99,
-211, 92,171,213,242,180, 90, 45,183,122,240,129, 80, 40, 44,168,203, 33,190, 58,172,164,196, 47, 92,118,137,141,149,148,120, 91,
- 72,193,218, 25,199, 52,170, 88, 47,107,103, 28, 51,183, 96, 49, 49, 49, 73,126,126,126,251, 72,146,116, 99, 24,198, 1, 96, 44,
- 25, 6, 5, 12,195, 20,178,217,236,172,231,207,159,103,253,131, 26, 33,173,137,166,215,154,244,250,223,253, 14, 27,163, 11, 27,
-209,136, 70,252,255, 65,173, 62, 90,236,134, 50, 37, 38, 38, 18,141,231,179, 17,213,197, 86, 93, 95,166,165,165,233, 0,220,174,
-216,222,198, 67, 0,253,255,233, 21,204,201,201, 9,168,237, 59,115, 69, 22,240,218,103, 11,136,173, 49, 59,251,226,141, 37,229,
-216,120,252,155,134,150,237,241,227,199,233, 48,115,138,189, 17,141,104, 68, 35, 26,241,183,225,207, 91,180, 26,209,136, 70, 52,
-162, 17,141,104, 68, 35, 26, 81, 35,182, 87, 19, 92,111, 88,183, 8,212, 30, 57,208,144,185,215,119,137, 62,184,220,200,217,200,
-217,200,217,200,217,200,217,200,217,200,249, 63,199,249,255, 21,127, 16, 89,255, 14, 52,134,190, 54,114, 54,114, 54,114, 54,114,
- 54,114, 54,114, 54,114,254, 47,136,172,183, 55, 0,141, 83,135,141,104, 68, 35,254,135,113,228,200, 17,179, 22, 21, 29, 49,107,
- 71, 63,137, 68,182, 80,169, 40, 91,125,112,237,248, 19,149,159,135,133,133, 81,141,103,177, 17,141,104, 4,222,197, 25,222,221,
-221,165, 53, 73,209,157, 24,134,100, 49, 36, 99, 36, 20,154, 67, 73, 37, 37,111,164, 29,112,117,117,181,226,144,232, 79, 48,140,
-152, 32,104,138,102,145,183,146,147, 51,159, 55,160, 96, 60,153, 76, 54,133,203,229,246,210,235,245, 46, 36, 73,102,234,116,186,
-203,106,181,122, 19,254,152,184,240, 63,134,150, 45, 91,142,188,118,237,154, 85,231,206,157,117, 66,161,208,164,209,104,216,231,
-207,159,231,127,248,225,135,165,175, 94,189,122,167,136, 68,185, 92,222, 99,199,142, 29,238,161,161,161,104,209,162,133,106,248,
-240,225,220,224,224, 96,238,132, 9, 19,146,179,179,179, 35, 27, 72,215,154, 32,136,189, 4, 65,176,104,154, 14,199,239,169, 27,
-254,106,144, 36, 73, 78, 34, 8, 98, 48,195, 48, 30, 4, 65, 36, 49, 12,115,130,166,233,186, 18,183,214,133,143, 0,244, 33, 73,
- 50, 0, 0,104,154,142, 6,112, 22, 48, 63,242,238,223,201, 41, 18,137,252, 1, 64,173, 86,199,252, 85,156, 4, 65,248, 3, 0,
-195, 48,239,202, 57, 78, 40, 20, 78, 4, 0,141, 70,243, 51,204, 88, 14,234,109, 48, 91,189,153,128, 37,241, 0,128,232, 69,222,
- 0,128,134,188, 39, 38,199, 19, 13,249,173,154,248, 26,194, 81, 3,250,140, 26, 53,106,229,175,191,254,186, 8,192,201,191,227,
-198,119,116,116,221,244,253,143,219,229, 95, 78,249,100, 53, 94,175, 8, 81,247, 3, 9,188,207, 99,177, 6,232, 41,234,198,115,
-224, 8, 0,182,181,181,245, 72, 30,143,215, 85,175,215, 59,177,217,236, 28,189, 94,127,189,172,172,236, 0,234, 88, 1,193,236,
-243, 26, 7,153, 65, 13, 71,130,254,125,157, 55,134,132,142, 43, 66, 46,209, 10, 37,255,128,102,148, 4, 48,189,162,174, 59, 81,
-123, 58,143,186, 26,159, 47,229,114,249, 96,133, 66,161,102,177, 88, 12, 94, 71, 61,191,254,243,250,123,130,166,233,252,226,226,
-226,240,250,184,196, 77,224,197, 19, 19,123, 41, 35, 52, 38, 29,243,153, 42, 3,241, 18, 87,116,100,128,112, 6,112, 35, 89,164,
- 29, 77,211, 57, 0, 34, 73, 19, 78, 43,179,145,248, 15,237,220,155, 86,156,215,102, 21,239, 57, 0, 28, 0, 60, 1,240, 37, 0,
-101,163,254,249,183,225,109,103,248, 51, 0,114,170,132, 86,181,116,247,221,251,245,235, 23,229,238,238,210,122,232,160, 33, 43,
- 39, 79,250,140, 96,177, 72,196, 62,123,198,254, 56,124, 92,111,153, 76,230, 44,209,233, 90,129, 32,104,181, 64, 16,171, 80,148,
-101, 29, 57,240,171,212,219,203,139,162, 40, 26, 91,183,253,244,225,209,223,142,207, 51, 83,108,181,116,116,116,220, 59,103,206,
- 28,199, 1, 3, 6,176, 28, 29, 29,145,154,154,106,117,240,224, 65,175,141, 27, 55, 14, 43, 41, 41, 9, 7,240,242, 29, 42,219,
-197,209,154,236, 45, 21, 18, 61, 81, 78,161,220,136, 43,185, 26, 92, 4,112,227, 93,207,158, 90,173,158,170, 86,171,131, 2, 3,
- 3,153,157, 59,119, 18, 99,199,142,101, 8,130, 32, 52, 26,205, 47, 0,222, 73,104,137,197,226,205,161,161,161,158,158,158,158,
- 73,175, 94,189,234,115,248,240,225,179, 99,198,140,241, 16,139,197, 9, 0, 90, 54,144,110,119, 81, 81,145,159, 70,163,129,139,
-139,203, 78, 0,239,253, 13, 55, 17,193, 98,177, 78, 56, 59, 59, 51,107,214,172, 57,233,231,231,231, 80, 92, 92,108,250,230,155,
-111,122,221,189,123,247, 67,138,162, 6, 52, 64,108,201, 8,130,216,230,224,224, 96,187,122,245,234,196,118,237,218, 61,225,243,
-249,188,132,132, 4,209,204,153, 51,103,188,124,249,114, 24,195, 48,147,128, 6,117, 16, 50,130, 32,182,201,229,114,219,149, 43,
- 87,166, 6, 4, 4,196,114,185, 92,110, 66, 66,130,120,246,236,217, 95,198,199,199,191, 19, 39, 73,146, 91,131,130,130,100,139,
- 22, 45,138,243,242,242,186,205, 98,177,120,153,153,153,228,226,197,139,167, 92,186,116, 41,140,166,233,201,239, 82, 78,123,123,
-123,217,226,197,139,227,130,131,131,239,114,185, 92,238,139, 23, 47,200, 57,115,230, 76, 73, 76, 76, 52,187,156,214,214,214, 33,
- 4, 65,108,207,205,205,101, 3,128,147,147, 83,123, 11, 11,139,141,213,215,180,172, 76, 69, 97, 52, 26,203,181, 90,237,168,226,
-226,226, 26, 19,225,142,157,187,161, 63, 0,108, 52, 84,190,127,253, 90,223,123, 96,235,105,115, 42,237,239,248, 58, 47,222,247,
-170,241,131, 0, 96,100,197, 82,225,223,171, 0, 54,155, 77,251, 59,126,201,196,228, 54, 40,101,204,192, 30, 61,122, 44,142,140,
-140,252,169,123,247,238,179,247,237,219,103,159,145,145,241,221,141, 27, 55, 92, 71,140, 24, 49,246,202,149, 43,171, 10, 11, 11,
-143,254, 85, 55, 63,143,203,231, 19, 36, 1,161, 64,100, 97,206,254, 28,146,236,119,123,224,192,137, 63,191,120, 17,176, 49, 62,
-222, 93,229,228, 20, 52,109,218, 52,135, 33, 67,134,144,174,174,174, 72, 76, 76,180,217,183,111, 95,171,159,127,254,121,112,105,
-105,233,116, 0,105,127, 70,100,169, 74,225,171,211, 35,128, 97, 96, 85,245,192, 18, 40,229, 27, 16,205,196,225,233, 63, 64,108,
-125,187,123,247,238, 69,137,137,137, 88,181,106, 21, 0,108,106,224,241, 51, 7, 14, 28,216,247,248,241,227,194, 35, 71,142, 8,
- 3, 3, 3,225,232,232,136,138,193, 84, 85, 98,106,119,119,119,243,206, 25,141,239,127, 56, 59,254,189,216,226,115,216, 60, 36,
-119,149,208, 5,166,142, 3, 61, 7,247, 27, 27, 0, 75, 59, 17, 4, 18, 54, 74,139, 20, 62, 47,162, 51, 66,175, 30, 78,252, 46,
-241, 81,193,106, 85, 58,190, 69,237, 57,249,254, 35,176,177,177,217,153,156,156, 28, 34, 22,139,223,248, 60, 41, 41,201,223,211,
-211,179, 12,192, 87, 13, 21,110,118,118,118,251,105,154,214, 21, 21, 21,125, 2, 0, 82,169,244, 87,177, 88, 44,203,201,201,153,
-247,119, 13,100, 42,241,182, 22,249, 47,183,104, 85,249,107,213,180,214, 33, 65, 82,116,167,201,147, 62, 35,134,143, 28,145,155,
-152,148, 76,179, 57,188,145,231, 47, 92, 16,181,110,221,154,212,109,218, 4, 83, 65, 1,140, 51,102,116,188,124,249,178, 49,108,
-228,104, 13,135, 69,236,246,112,119, 19, 29, 58,112,208,241,248,177,163,157, 0,212, 39,180,120,142,142,142,123,175, 93,187,230,
-236,238,238,142,210,210, 82,164,166,166, 66,165, 82, 97,216,176, 97,156, 78,157, 58, 57, 15, 29, 58,116,111, 89, 89, 89,231, 6,
- 88,182, 28, 90,184,176, 35, 38,141, 27,210,242,195,222,157,196,206,174,205,193,228,106,145,241, 42, 62, 48,226,218,221,105,187,
-143,157,125,153, 88,198,244, 67,205,107, 35,213,137,194,194,194, 89,131, 7, 15, 62, 22, 18, 18, 98,199,231,243, 33,151,203,137,
- 1, 3, 6,228,103,103,103, 47,121,103,213, 82,177,132, 13, 73,146, 84,245,215, 26,150, 7, 50, 7, 46, 50,153, 12, 50,153, 12,
- 0,156,255,236,200,211,202,202,106,147, 84, 42, 29,170, 80, 40, 52, 36, 73, 50, 4, 65, 48,122,189, 94, 40,147,201, 30,199,197,
-191,148,235,116,186, 22,107,127,248,249,199, 30, 93,252, 44, 46, 93,186,132, 33, 67,134, 48, 23, 47, 94,156,100,238, 58,117, 4,
- 65,108, 27, 60,120,176,122,225,194,133,218,196,164, 84,231,184,151, 73,132, 88,192,163,109,109,109, 57,247,239,223,103,175, 95,
-191, 94,176,120,241,226,109, 12,195, 12,109,192,249,220, 54, 98,196, 8,195,215, 95,127,157,243, 34, 49,217,254,105, 92, 34, 35,
- 17,112, 76,182,182, 54,172,187,119,239,210,239,194, 73,146,228,214, 89,179,102, 41, 38, 77,154, 84, 82, 84, 92,230, 88,162, 80,
- 50,124, 14,203,232,232,232,200, 62,121,242,164,110,255,254,253,228,196,137, 19,183,210, 52, 29,214,128,243,187,117,192,128, 1,
-229,115,230,204, 41, 77, 72, 74,113,124,250,252, 37, 68,124,142,209,193,193,158,245,224,193, 3,195,218,181,107,201,229,203,151,
-155, 85, 78,177, 88,188,231,240,225,195,236,147, 39, 95,183,125,119,238,220, 33, 61, 60, 60, 68,213,247,209,104,117, 32, 9,160,
-176,176, 80, 20, 28, 28,188, 7,192, 31,146,251, 6, 44,137,199,216,185,192,212,169, 83,115, 26,122,179, 4, 56, 77,171,119, 31,
-234, 39,111,102,189,122,252, 32, 54,155, 77, 79,156, 56, 49,247,237,239,181, 90, 45, 1, 96, 0,190, 51, 95,108,245,233,211,103,
-254,153, 51,103,154,239,219,183,111,221,254,253,251,245, 0, 32, 16, 8,108, 15, 30, 60,184,106,216,176, 97, 24, 54,108,216,194,
-163, 71,143,254,101, 66,139, 98, 40, 3, 0,240, 5,124,126,124,124, 60,225,237,237, 93,103,198,125, 3, 77, 63,252,249,197,139,
-118,159,123,123, 7, 22,211,116, 11,238,135, 31, 42,103,206,156, 89,168, 80, 40,144,154,154, 10,131,193,128,177, 99,199,178,186,
-119,239, 46, 31, 54,108,216,134,242,242,242,143, 0, 24,204,184, 39,215, 58, 59, 59,127, 90, 86, 86,166,172,180,234,116, 14,167,
-216, 93,253, 77,252,182, 45,140, 60, 46,203,196,237, 63,131, 38, 46,110, 34, 84,222,238,184, 9, 0, 92, 53, 10, 26, 56, 24,168,
- 17, 22, 46,112,167, 56, 88,110,231, 34,236, 81,144,166, 89,170, 74,175, 83, 44,125, 36, 22,139, 7,169, 84,170,163, 21,157,115,
-203,126,253,250,225,238,221,187, 0,208,169, 66,104,245, 32, 73,242, 99,154,166,119, 0,168,107, 41,183,105, 3, 7, 14,124,255,
-248,241,227, 82, 0, 56,122,244, 40,140, 70, 35, 60, 60, 60,192,229,114,193,227,241,192,225,112,170, 86, 7, 49, 19, 78,118,118,
-182,176,181,228, 64,102, 45,254,112,246,150,129,236, 38,173, 45,144, 79, 61, 67, 49, 83, 10, 19,163, 3,215, 70, 12,175, 80, 43,
- 4,244,238, 65,158,222, 26, 59,239,244,230,184,118,106, 18,253,145, 6,221, 63,165,103, 39, 73,146,255,228,201, 19,200,229,242,
- 55, 62,103,177, 88, 0,208,245, 29, 40, 23, 38, 37, 37, 5, 63,122,244, 8, 33, 33, 33, 11,125,125,125, 63,136,138,138,114, 44,
- 42, 42, 66, 72, 72,200,134,204,204,204,147,127,119,157,170,107,145,255, 47,166, 46,242, 45, 37,217,253,245, 40,152,100,177, 88,
- 36,146,147, 82,141, 33, 33, 61,199,164,167,167, 75,130,130,130, 72, 14,135, 3, 85,100, 36,180, 15, 30, 64, 34,145, 96,240,224,
-193,156,235,215,175, 91, 88, 72, 44, 38,164, 36,167,148,179, 88, 36, 24,134,172,215,231, 65, 38,147, 77,153, 55,111,158,163,167,
-167, 39, 76, 38, 83, 85, 70,115,147,201,132,140,140, 12, 72, 36, 18,132,135,135,219,139, 68,162, 41,102,214,163, 89, 75, 15,251,
-232,107,103,183,189, 55,115,114, 31,113, 75,209, 37,136, 51,166, 67,114,244,115,180,202, 62,143, 57,131,130,196, 23, 55, 47, 12,
-104, 46,183,142,174,102, 98, 53, 27, 58,157,238,102,108,108,236,132,168,168, 40, 26, 0,174, 94,189,202,196,197,197, 77,250, 51,
-163, 80,154,166, 81, 90, 90, 10,154,166, 89, 21,239, 43, 95,255,163,247,131,133,133,197,214, 15, 62,248, 96, 68, 90, 90,154,240,
-220,185,115, 54,233,233,233,182, 41, 41, 41,118, 45, 91,182,100,175, 90,181,234,140, 86,103, 96, 25, 41, 70,111,162,140,229, 57,
-207,158, 37,149,228,229, 69,239,218,181, 75, 67, 16,196, 96, 51,127,227, 35, 39, 39, 39,155,185,115,231,130,224,136,218,123,181,
-242,245,100,113,132,150, 36,135,103,169,209,104,169,228,228,228,140,185,115,231,186,249,249,249,201,241,122,122,205, 44, 78,185,
- 92,110,251,245,215, 95,131,205,151,250,183,245, 11,104,206,227,139,165, 44,142, 80, 26, 20, 20,212, 61, 41, 41, 41,123,206,156,
- 57, 78,129,129,129, 13,226, 12, 12, 12,148, 77,156, 56,209, 36, 16, 74,131,221,221, 61, 90,181,109,211,170,111,203,150, 45, 7,
-177,217,108, 83, 65, 65, 65, 90,120,120,184, 83,255,254,253, 29, 26,194,105,111,111, 47,155, 51,103,142,201,181,169, 71,104,232,
-251,189, 59,112,133, 82, 75, 54, 79,108,165, 86,107,169, 23, 47, 94,164, 45, 88,176,192,201,223,223,223,222, 28, 78,181, 90,205,
-177,181,181,133,143,143, 15, 90,123,120,160,172,172, 12,199,143, 31,199,238,221,187,177, 99,199, 14, 28, 56,112, 0,237, 58,247,
-134, 84, 42, 69,118,118, 54, 20, 10, 5,231,223,125, 67, 81, 63,121, 51, 27,245,159, 14,248,236,179,207,178, 39, 78,156,152, 43,
- 20, 10,233,183, 55,107,107,107,106,212,168, 81,121,225,179,127, 24, 80, 57,181, 88,143, 37,235,201,217,179,103, 95,237,219,183,
- 15,173, 91,183, 70,104,104, 40, 15, 0,166, 76,153,194, 27, 54,108, 24, 14, 31, 62,140,163, 71,143, 62,247,244,244,188, 5, 96,
-160, 57,229, 12, 15, 15,239, 28, 22, 22,118, 35, 44, 44, 44,102,248,240,225,219, 39, 77,154,244, 70,207,149,147,157,249, 80,175,
-215,195, 47, 32, 80,180,108,231,189, 81,245,241,197, 1,251,182,199,199,239, 94,253,236, 89,218,194,214,173,173,154,166,164, 88,
-255,178,118,173,109,229, 34,221, 70,163, 17, 25, 25, 25,144,201,100, 24, 53,106,148, 45,159,207, 15, 55,163,152,235, 7, 14, 28,
- 56, 46, 61, 61, 93,242,243,207, 63, 59,197,196,196,200,115,114,114,156,174, 92,190, 96,247,205, 87, 83,164,150, 18, 30, 47,187,
-128, 33, 0, 32, 37, 27,226,248,100,116,102, 24, 88, 85,159, 78,124, 39, 56, 65, 40,116,193,198,230,157,173, 94,126,125,216,127,
-248,156,136, 0, 91,153, 19,127,110, 29, 71,180, 93,179,102,205,145,211,167, 79,143,236,220,185,243, 49, 0,194, 26,246, 17,180,
-107,215,238,248,225,195,135,199,117,233,210,229, 38, 0,159, 90, 71,145, 46, 46,131,127,251,237, 55,155,202,247,182,182,182, 16,
- 8, 4,127, 16, 89, 92, 46, 23, 36, 73, 54,184,122, 43, 14,142,100, 91,183,210, 33,182,228, 44, 14,175,121,130, 53, 31,190,160,
- 87,118, 76,209,109, 10,143,199,197,195, 79,144,143, 39,232,243,121,115,140, 92,224,215, 75, 68, 97,249, 63,169, 3, 47, 40, 40,
-248,184,107,215,174, 71,250,244,233,163,123,244,232, 17, 10, 10, 10,224,236, 92, 53,214,206,125, 7, 74,107,145, 72, 4, 87, 87,
- 87,120,122,122,142,188,126,253,186,163,209,104, 68, 74, 74, 10,242,243,243,163,255, 29,117,170,174, 69,254,203,240,182, 35,252,
-153, 63, 8,173,138,181,133,174, 1, 0, 67, 16,170, 39,177,177, 28, 22,143, 55,250,215,253,251,249, 92, 46, 23,105,105,105,120,
-254,252, 57,212, 87,174, 64,115,251, 54,242,242,242,160, 84, 42,225,224,224,128,109, 59,119,138,245, 20, 51,254,197,203,151, 44,
-134,100,170,251, 27,212, 24,226,201,231,243,123, 13, 25, 50,164, 86, 65,150,157,157,141, 62,125,250,112, 88, 44, 86, 77, 81, 13,
-111,115, 18,114, 59,226,244,149, 99,203,156,156,120,207,129,196,153, 64,121, 52,192,232, 0,147, 30,200,122, 10,156, 89,130,166,
-202,120,226,194,178, 49,142,206, 34,246,233, 26,148,114,125,161,168, 30,222,222,222, 59, 70,143, 30, 77, 2, 64,143, 30, 61, 8,
-111,111,239,237, 0, 60,234, 56,230,114, 61,157,228,221,146,146, 18, 12, 27, 54,204,166,121,243,230,151,135, 13, 27,102, 83,249,
-249,187,114, 86, 90,147, 91,183,110, 93, 36, 16, 8, 14, 0,102, 53,176, 85,156, 86, 86, 86,155,250,244,233, 51,116,255,254,253,
- 92, 0,184,118,237, 26, 78,159, 62,141,103,207,158, 33, 33, 33,129, 14, 8, 8,176,251, 97,199,145,173,155,126,218,179,126, 80,
- 39, 63,121,247,246, 1,173, 36,202, 18,165,131,131, 67, 39,134, 97, 60,204, 44,103,159, 37, 75,150, 60,143,123,149,102, 73,178,
- 57,108, 46,135,205,183,176, 16, 59,200,164, 98, 23,107,145,192,153, 79, 18, 18,181, 90,157,123,224,192, 1, 26, 64, 31,115, 57,
-151, 45, 91,150, 28,151,152,102, 69,144,108, 54,135,205,225, 74, 36, 34,171, 15, 67, 67, 2, 1,128, 11,134,171, 80, 40,242,118,
-239,222,109,104, 8,231,162, 69,139, 98,139, 75,149, 50, 54,135,195, 97,179, 89, 85,231, 82, 44, 20,218,137,248,124,158, 78,167,
-203,250,241,199, 31, 53, 13,225, 92,178,100,201,243, 23,175,210,173, 73,130, 96, 17, 4,201,182,144,138,109,108, 44, 69,118,118,
- 18,161,173,136,205,226, 41, 20,138,172,189,123,247,154,197,105, 48, 24,184,121,121,121,136,139,139,131,107, 96, 32, 46, 93,186,
-132, 38, 77,154, 96,216,176, 97, 24, 49, 98, 4,132, 66, 33,122, 4,251, 98,238,220,185,120,245,234, 21, 12, 6, 3,191, 38,206,
- 74, 63,169,183, 33,151,203, 31,213,119,243,188,117,236, 27,229,244,119, 4,179, 81,255,233,128,234, 2,171, 54,126,107,107,107,
-170, 38,107,215,219,156,125,250,244,153,127,229,202,149,230,123,247,238, 29, 16, 30, 30,126,115,239,222,189,232,208,161, 3,226,
-226,226,224,230,230,134, 95,126,249, 5, 35, 70,140,184,185, 97,195,134, 1,143, 30, 61,242,115,119,119,159, 87, 31,231,240,225,
-195,191,240,247,247,143,204,205,205, 13, 46, 46, 46,246, 57,126,252,248,248,193,131, 7, 39,143, 28, 57,178,103,149, 96, 52, 26,
-247,159, 57,117, 12,125, 7, 12,129, 87, 27,159,173, 99,231,237,243,173,231,217,100,158, 1,219,119,231,228, 20,236,215,106,213,
-195, 56, 28,145,232,222, 61,235,163, 63,253,100, 91,125,101,129,172,172, 44,244,239,223,159,195,229,114,187,212, 83,206, 53,131,
- 6, 13, 26,118,252,248,113, 89,165, 85,231,246,237,219,120,250,244, 41, 82, 83, 83, 81, 90, 90,138,158,147,148,248,108,213,107,
-238,207, 86, 49,232, 61,133, 17,191, 99, 27, 82, 5, 97, 19, 56,218, 88,176,111,141,255,209,107,202,167, 91, 91,179, 37,214, 28,
-252, 58, 59, 1,133, 41,186,163,181,112, 18,193,193,193,251,194,194,194, 8,189, 94, 15,189, 94,175, 7, 80, 99, 86, 95,103,103,
-103, 65,219,182,109, 49,105,210, 36,210,194,194, 98, 67,109,229, 84,169, 84,186,179,103,207, 34, 60, 60, 28,211,167, 79, 71,139,
- 22, 45, 32,147,201,192,225,112,176,103,223, 33,219, 17,227, 39,183,124,175,115, 87,191,214,239,117,104, 91,174, 99, 5,114,132,
-178,137,181, 88, 67,106,172,187,210,254, 17, 98, 83,238, 96,227,128, 76,250,254, 47,106,229, 55, 31,255, 43,254, 69, 84,222,179,
-121, 97,219, 99,153, 59, 29, 11,247,125,153,142, 60, 99, 28,186, 12,107, 10,119,127,217, 12,177, 43,188,223,245,124,154,137, 6,
-113,250,250,250,118,190,127,255, 62,191,107,215,174, 72, 75, 75, 3,135, 83, 53,158,162,254, 76, 57,151, 44, 89,194,215,106,181,
-120,252,248, 49,198,140, 25,147,101, 48, 24,102,252,153,114, 54,196,162, 85,169, 69,254,203,176,253,173, 45,167, 54,139,214, 18,
- 0, 48,210, 56, 61,122,204,120,117, 68, 68,132,136,199,227, 33, 45, 45, 13, 57, 57, 57,216,179,123, 55,213,195,222,190, 60,212,
-217, 89,177,103,247,110, 70,175,215,131, 97, 24,120,123,123, 99,232,208,161,194,143,134,141,204, 39, 20,154, 67,102, 76,243, 56,
- 85,206,175,143, 31, 63,254, 15,223,127,243,205, 55,176,176,176, 0, 65, 16,142,102, 84, 46,108,218,146, 65, 46, 50,119,171, 60,
- 38,119, 79, 49, 88, 2,128, 45, 5,216, 22,128,192, 18,224, 75, 1,158, 8,186, 71,145,197, 36, 19,154, 58,164,203, 39,206, 0,
- 26, 50,213, 3,185, 92,190, 48, 50, 50,210,238,209,163, 71,140, 66,161, 64, 78, 78, 14,179,114,229, 74, 59,185, 92,190,240, 93,
-175, 72,118,118,246,178,190,125,251,230,141, 25, 51,198,242,252,249,243,174, 99,198,140,177,236,219,183,111, 94,118,118,246,178,
- 63,115,165,185, 92, 46,235,217,179,103,214,203,151, 47, 31, 1,224, 97,155, 54,109,138,156,157,157, 31,226,181,211,100,157,144,
- 74,165, 85, 34,171,210,186,198,102,179,193,225,112, 32,151,203,245,197,197,197, 84,151,247, 60,132,222,150,164, 81,206,231, 10,
-173,133, 2, 23,169,133,101, 80, 81, 81,209, 19,130, 32,146,204,156,226,243,111,223,190, 61,135, 98, 56,244,103,163,123,200,167,
-140, 11,177,223,178,124, 98,147, 31,151,125,234,188,102,241, 4,239,101,179, 70,133,144, 52,173,117,115,115,115,172,116,104, 55,
-195,124, 30,208,174, 93, 59, 54, 13, 14,226, 94,166,230,165,101,102,149,191,223, 61,184,202,114,217,218, 63, 32,212,206,206,174,
-171,183,183,119, 59,130, 32,204, 10, 73, 22, 10,133,254, 94, 94, 94,108,146,197, 33,108,100, 82, 87,169, 68,232, 80, 53,133, 98,
-101,213,209,218,206, 46,140,100,152, 50, 39, 39, 39,123,161, 80,232,223,128,186,179,105,112,225, 96,111,109,105,103,107, 37, 9,
- 13,233,212, 34,184, 99,112, 75,223,160, 14,193,109,222,107,247, 17, 97, 50, 41, 60, 60, 60,236, 43,157,228,235,177,180, 10,246,
-239,223,143,229,203,151,163,109,211,166,112,118,118,134,189,189, 61,110,223,190,141,251,247,239, 67, 38,147, 33, 63, 63, 31,107,
-215,174,197,137, 19, 39, 96, 48, 24,164, 13,189,159,204, 17, 91,117,193,100, 50,145,111, 11,172,218,248,133, 66, 33, 93,233, 36,
- 95, 27,206,158, 61,187,175,210,146,245,229,151, 95,118,254,225,135, 31,110,198,199,199, 67, 34,145,224,254,253,251, 24, 63,126,
-252,205, 13, 27, 54,116,158, 60,121, 50,118,239,222,141,228,228,228,157,117,241, 13, 31, 62,124,241,132, 9, 19,126,140,138,138,
- 34, 29, 28, 28, 32,147,201, 48,104,208, 32,236,220,185,147,109, 50,153,118,133,133,133,197,132,133,133,197, 80, 25, 23,231, 31,
-217,177,242,118,236,147, 24,124, 49,237,107,158,222,100,156, 99, 70,245, 25,141, 68, 82,110,234,218,181,248,176,209,168, 30,206,
-229,138, 44, 99, 98,172, 79,239,218, 85, 37,182,230,206,157, 11, 75, 75, 75,224,181, 3, 51,234,176,234,124,122,226,196,137,170,
-246,208,198,198, 6, 60, 30, 15, 92, 46, 23, 28, 14, 7, 44, 22, 11,151,183,138,241,211,220,215,250,226,167,185, 4, 46,110, 34,
- 84,127,230,218,137,156,225, 35,115,224,197,124,254, 75, 27, 63,159,158, 54,184,125, 48, 23, 43,251, 62,202,188,127,184, 96,166,
- 54, 31,223,215,114,216,123,223,124,243, 77,235,252,252,124, 60,120,240, 0, 15, 30, 60,168,205, 2,164, 61,117,234,212,119, 74,
-165, 18,238,238,238, 24, 56,112, 96, 87, 0,129,181, 60, 55,104,215,174, 29,250,247,239,143,144,144, 16,180,109,219, 22,122,131,
-137, 19, 54,250, 83,175,103,201, 5,206, 43,215,174, 20, 69, 94, 61, 78,222,188, 25,197,218,119,236,162,101,112, 72,239, 31,185,
- 82,167,187, 16,218, 56,153, 83, 79, 53, 85, 4,127,167, 15,177,253,202, 52,114,227,181, 49,146, 61,167, 55,122, 72,165, 82, 34,
-250, 65,140,113,207,230,195,233, 62,226,129,249,119, 15, 22, 65, 77,228,162,231, 56,119,146, 6,134,254, 83,122,118,129, 64,240,
- 67, 84, 84,148,163,193, 96, 64,108,108, 44,166, 79,159,174,253,147,148, 85, 6, 16, 87, 87, 87, 92,187,118, 13,163, 70,141,210,
-230,229,229,221,249,119,213,169,186, 22,249,255, 2,118, 53, 5, 89,133,140,140,140, 82,153, 76,230,236,229,229, 69,234,245,250,
-215, 83, 18, 71,143, 82, 59,118,237, 58,163,213,106,167, 1,224,110,218,178,101,171,179,139, 75,200,232,240,112,194,104, 52,162,
-111,223,190,188,136,136, 8,155,164,252,252,114, 51, 58,156, 55,126,111,236,216,177,248,225,135, 31, 0, 0, 83,167, 78,173, 50,
-173, 19,102, 56, 44, 73, 44,209, 39,180, 95, 59,139, 12,241, 70, 11, 67, 71,163,178,217, 43,233, 93,177, 82,216, 14, 36,143, 13,
- 1, 11,180,193,104, 74,200, 31,252,240, 85, 66,171,214,194,226, 34,183, 94,109,186, 97,199,165,189,125,212,148,246,176,217, 13,
-142, 72,212, 94, 34,145,224,225,195,135,197,237,218,181, 43,101, 24,198,114,217,178,101,182, 34,145,168,253,159, 56,247, 41, 47,
- 95,190,236,218,169, 83,167, 41, 36, 73,246,162,105,250,114, 94, 94,222, 38, 0, 41,102, 30,255, 25,128, 69, 0,170, 70,150,122,
-189, 30, 36, 73,130, 97, 24, 12, 31, 62, 28,115,231,206,109,253,244,233, 83, 68, 70, 70, 90,247,234,213,235, 46,128, 82, 0,159,
- 0,168,209,106,166, 80, 40, 52,247,239,223, 23, 70, 70, 70,130,166,105, 88, 91, 91,195,194,194, 2,124, 62, 31,131, 6, 13,146,
-204,153, 51,167,231,133, 11, 23,242, 21,205,154,176, 4, 57, 89, 42,190, 68, 34,133,163,115,151,201, 35, 63,142,103, 24,230, 68,
- 3, 26, 7,158,144,109,210, 18,148,142, 92,243,237, 6, 82,196,229, 18, 2, 46, 27,124, 90,141,249,223,173, 32,184, 12,197, 70,
- 3,231,231,185, 92, 46, 87,202,135,158,197, 99, 25, 69, 4,152,191,226,225, 96,177, 88, 60, 1,183,118,127, 12, 14, 73,146, 36,
- 73,114, 1,152,189,104, 31,159,207,231, 74,249, 76,173,156, 66, 22,193, 34, 8,130,135, 90, 34,209,252, 29,193, 84, 90,145,120,
-211,146,116,213, 69,113,151, 46, 93,112, 38,242, 33,142,158,190,140,194,180, 39, 88, 48,251, 75, 4, 6, 6, 34, 34, 34,162,206,
- 50, 85,250,104,213,102, 93,150,203,229,143,178,179,179,223,171,237,216,186,166, 12,107,177, 82,253,145,255, 91, 75, 4, 44,137,
- 71, 61, 62, 90, 3,187,116,233,242,197,254,253,251,245, 31,124,240, 1,111,248,240,225,240,241,241,233, 60,110,220, 56, 0, 64,
-175, 94,189,240,195, 15, 63,116, 30, 55,110, 28, 14, 29, 58,132,227,199,143,235,186,119,239, 62,251,218,181,107, 89,120, 29,209,
-249, 7,208, 52,221,127,219,182,109,111, 91, 10, 97, 50,153, 96, 52, 26,157, 76, 38,147, 83, 69, 91,132, 31,127,220, 80,120,241,
- 66, 4,102,207, 91, 2,123, 59, 71,127, 51,239, 33, 98,236,215, 95, 23,254,178,118, 45,214, 30, 58,132,175,221,220, 68,123,159,
- 63,199, 69,173, 22,135, 35, 35, 11, 43,126,167, 94,223, 76,149, 74,165, 57,123,246,172,197,225,195,135, 97,101,101,133, 22, 45,
- 90,192,218,218, 26, 28, 14, 7, 36, 75, 8, 22, 87, 6,175, 54,237, 1,220, 7, 0,184,201,161,242,118,199, 77,130, 64, 41, 67,
- 54,220,167,136,223, 4,205,108, 93, 4, 81, 95,236,246,177,178,176,231,226,252,166,116, 92,216,152,113, 66, 91,136,117, 48,225,
- 5,106,247,249,106,231,238,238,142,252,252,124,156, 61,123, 86, 5,212, 42,200, 64,211,244,119, 91,182,108,249,102,222,188,121,
-124,111,111,111, 0,240, 7,240,160,166,125,197, 98, 49,156,157,157,171,132,229,240, 49,147, 61, 38,205,156, 44, 28,220, 59, 4,
-108,182, 45, 74, 85, 70, 20,149, 27, 33,179,149, 96,246,204, 48,193,229,118,206,129,219, 54,252,122, 74,163, 65, 32,240,199,246,
-128, 32,240,224,222,147,155,190, 2,111,128, 32,129, 12,242, 42, 8, 16, 80, 18, 70, 16, 44, 22, 67, 81, 20,210,211,211,193, 48,
- 12, 70, 13, 30,159,241,233,202,227,246,157, 71, 41,224,234, 37, 7,193,160,219, 63, 69, 8,216,216,216,248, 23, 21, 21, 33, 37,
- 37, 5, 99,198,140,201, 42, 44, 44,188,164, 82,169,198,103,103,103, 3, 64,241, 59, 80, 86,137,121,127,127,127,180,111,223, 30,
-195,134, 13, 19,168,213,234, 48, 15, 15, 15,231,130,130,130,142,127,103,125,222,214, 34,255,175,132, 86,141, 15,154,209,232,165,
-219,186, 21,170,203,151,193,187,120, 17,135,229,114,165, 86,171,253, 10, 64, 70,197,131,255,229,238, 95,126,185, 53,224,206, 29,
- 11,125,124, 60, 60,158, 62, 5,199,202,202,191,161, 5,216,181,107, 23, 20, 10, 5,202,202,202, 0, 0, 27, 55,110,132, 66,161,
-128,201,204, 5,103,217, 92,116,118,180,119, 67, 46, 18, 64,179, 73, 73,170,151,186,131, 68, 43,205,118, 78,119, 80,149,145,206,
-136, 79, 11, 18,107,138,244, 29, 8,150, 30,218, 66, 53,156, 59,181, 0, 27,236,206, 13, 41, 99,229,188, 63,155,205, 46,126,249,
-242,101,255,150, 45, 91,158, 6, 96,251, 46,254, 0,111, 33, 49, 47, 47,111,218,187, 28,200, 98,177, 22, 37, 39, 39,219,239,220,
-185,115,202,178,101,203,152,234, 66,171,242,127, 54,155, 13,134, 97, 96,105,105, 9, 14,135,227,112,251,246,109,135,160,160,160,
-205, 52, 77,251,215, 82, 79,198,199,199, 7,201,201,201, 96,179,217,176,180,180, 4,109, 50, 96,201,204,201,160, 88,124,246,172,
- 89,179,252,135, 12, 25, 18,187,115,231, 78,163, 69,112,167,142, 69, 69, 69,207,190, 24, 53, 58,246,228,201,147,250,138, 20, 15,
-245, 15,241, 25, 38, 38, 33, 33,129,229, 34,119, 96, 49, 38, 53, 45,230, 2,130, 39, 63, 50, 60,137, 35, 4,108, 22,195, 37, 72,
-240, 5, 66,203,148,204,204, 34,154,166,227,204,225,164,105, 58, 58, 57, 57, 89,232, 96,111,195, 86,107,244, 74, 33,135,225,165,
- 70, 63, 76,106, 22,208,206, 3, 0,180,209,247,175,241,189, 90, 9, 83,243, 10,196,110,110,110,102,113,106, 52,154,152,172,172,
- 44,150,131,131, 3, 59, 45, 35,243,148,149, 68,108,103, 97,101,213, 1, 0, 12,229,101,247, 73,157,174,128,197, 97, 59, 20, 20,
- 21, 21,107, 52,154,100,115,235,254,234,213, 43,182,147,147, 61,235,252,197, 43,167, 29, 68,124,123, 41,143,109,193, 39, 8, 66,
-196, 34, 20, 92, 19, 93, 40, 16,137,236, 83, 50, 51,139, 25,134,169,213, 66,184,186,116,244,224,215,215,107,201,161,106,220,120,
-242,228, 9,206,221,140,131,152,209,131,208,150,225,226,238,159, 49,106,214,188, 63,237,247, 87,159,216,122, 39,107,214,182, 86,
-143,222,226, 71, 78, 61,142,240,163, 70,141, 90,178,111,223,190, 42, 7,148,184,184, 56,244,232,209,163,114,154, 3,161,161,161,
- 8, 10, 10, 66, 92, 92, 28, 60, 61, 61, 17, 25, 25,201,103,177, 88,252,209,163, 71,175,252,245,215, 95,207,214,107,247,223,190,
- 29,227,199,143,175,201,177,250, 21, 0, 45, 33,243, 86,206, 93,189,199,182,184,168, 16,249, 5,185, 49,230,158, 7,130, 32, 48,
-246,235,175, 11,183,233,245,216,127,239, 30,194,197, 98,209, 47,137,137,232, 27, 20, 4,223, 30, 61, 10,205,105,235, 42,173, 58,
- 90,173, 22, 28, 14, 7, 22, 22, 22,176,177,177, 1,151,203, 5,139, 35, 7,155,231, 7,146,203, 69, 64, 23, 63,172,253, 74,172,
- 30,243, 33, 54, 16, 4, 74,249, 60, 68,115, 69,181,250,234, 16,226, 38, 24,196, 48, 80,168, 51,112,181, 82,144, 88, 54,133, 37,
- 71,202,185, 56, 97,179,183,149,133, 61, 23,231, 54,164,225,226,230,204, 99,218, 92, 44,168, 56, 23,116, 29, 3, 9, 95, 43, 43,
- 43,100,100,100, 32, 61, 61,253, 57,234,118,240, 87,199,197,197, 37,241,249,252,214,118,118,118, 0,224, 94,219,192,156,166,233,
- 42, 63,172,189,251,143,216,250,119,245, 16,188,223,185, 53,246,156, 94,129,207,195, 54,128,195, 34, 64, 81, 6,172,251,161, 31,
- 40,157, 18, 97, 3, 62, 37,186,245,242,244,187,124, 90, 63,193,168, 41,249,249, 15, 3, 1, 54,150,255,107,196,109, 43,190,132,
-244, 5, 77, 88,217,218,218,139,185, 92, 46,108, 44,156,244,243, 38,205,158,147,240,216, 0, 0, 32, 0, 73, 68, 65, 84,200, 97,
- 24,166,234,185,225,176,184, 70,178,220, 90, 83,148,171, 20, 90,113, 52, 0, 67, 54,123,183,108, 54,127, 61, 50, 51, 51,167,117,
-237,218,117,101,121,121,121,137, 74,165, 26, 5, 0,238,238,238, 77, 73,146,228, 3,168,107,118,164, 41,106, 78, 11,193,125,250,
-244, 41,164, 82, 41,178,178,178,170, 27, 95, 64,211,244, 63, 38, 8,224, 31,138, 0, 0,209, 0,156, 0,244, 69,181,244, 14,100,
-133,169,174, 91, 68, 68, 4, 19, 17, 17,209,173,170,243, 98, 24,218, 84, 92, 12, 70,247,250,220,114, 56, 28, 6, 64,245,136, 38,
-145,149,149, 21,193,113,113, 1,193,127,237,250,193,252,133,161,175, 70,163,121,169,101,104, 10, 44, 16, 6, 48,213, 6, 45, 42,
- 1,129, 21,182, 61, 49,141,183, 16,185, 60,171,234, 61, 29, 96, 98, 64,129,102, 53,176, 56,140, 74,165,130,201,100,146, 53,111,
-222,252,140,201,100,146, 85,116,110,204,127,234,138, 82, 20,149,196, 98,177, 48,101,202, 20, 84, 90,127,244,122, 61,114,115,115,
-161,211,233,160,215,235,145,156,156,140,178,178, 50,232,245,122, 60,123,246, 12,238,238,238, 96,177, 88, 78,117, 52,230, 12,195,
- 48,112,117,117, 69,179,102,205,192, 34, 24,236, 88,179, 24,243,167, 79,198, 8,119, 26,187, 54,173, 67,247,238,221, 91,185,185,
-185, 5,179,217,108,202,209,209,145,123,252,248,241, 83, 20, 69, 13,130,249, 45,207,217,185,115,231, 54,107,211,166,141,189,149,
-133,212,200,231,177,192, 51,170, 24,190,174,136, 97,171, 11,225,234,218,212, 4,161,200, 51, 60, 60,156,170,205, 10, 81, 19,231,
- 87, 95,125,229,228,237,237,109, 41,179,146,170,120, 28, 86, 62, 23, 76, 97,217,147, 7,119, 1,128,103,103,175,133, 64,212,122,
-204,152, 49,166,134,112, 46, 92,184,208,221,206,206,206,138, 4, 83, 78, 25, 12,191,207,183,235,244, 69, 4,135,163, 1,151,215,
-110,234,212,169, 68, 67, 56,191,249,230, 27,183,214,173, 91, 91, 89, 89,136,149,108, 14, 43,135, 75,211, 57, 2,208,185, 28,189,
-161, 68, 96,103,171,134, 72, 18, 16, 30, 30, 94, 43,103,165, 53,107,206,156, 57, 25,111, 9,111, 20, 23, 23, 67,155, 27, 11,110,
- 86, 60,252, 36, 28, 4,218,201,192,231,243,171, 66,223,107,187, 93,107,243,209,170, 73,108,153,123,108,187,165,117, 76, 1,110,
-107,245,232,237,188, 89,217,217,217,112,114,114,170,243,121,250,245,215, 95,231,133,132,132,228,135,134,134,234,207,156, 57, 3,
-130, 32, 16, 25, 25,137,172,172, 44,132,134,134,130, 97,152,202,168, 54,196,196,196,160, 87,175, 94,250,174, 93,187,102, 85,228,
-215,170, 23,227,199,143,135,209,104,132, 82,169, 68,113,113, 49, 34, 34, 34,224,231,231,199,136, 68,162, 33, 44,215,222, 43,194,
- 38,204,235,232,211,214, 31,155, 55,172,213,243,216,156,213, 13,121, 94, 9,130,192,152,175,190, 42, 44, 11, 8, 40,222,171, 82,
-169,199, 90, 88,136,154,103,100, 88, 63,188,112,193,214, 96, 48,152,197, 81,105,213,113,113,113,169, 18, 89, 92, 46, 23,108,158,
- 29, 88, 98, 95,240,108, 66, 33,114, 28,130,171,209,124,157,165, 24, 39,164, 18,156, 23, 91,213,158,218, 65,228,138, 21, 29,135,
- 59, 29,239, 52,194,233,138,168, 9,118, 86,244, 7, 36,195, 38,142,143, 91,215,178,185, 93, 51, 33,238, 28,201,197,197,205,153,
-191,105,115,177, 24, 64, 98,125,207,185,193, 96,208, 82, 20, 5,146, 36,193,102,179,171,251, 4,222,250,237,183,223,240,240,225,
- 67,160, 90,218,158,242,242,114,138,197, 98, 65, 32, 16, 0,128,164,142,246, 14, 28, 14, 7, 28, 14, 7,215,238, 94,183, 25,241,
- 81, 63,226,246,227, 75,232,228, 55, 18, 69, 74, 3,242,202, 12, 40, 85, 3,109, 2, 23,192,167,215, 9, 60, 73, 46,135,127, 91,
- 31, 22,139, 39, 30, 83, 19,159, 54, 5, 25,170,116, 12, 45,122, 78,183,208,103, 10,207,221, 57, 25,247,252,250,209, 39,207, 14,
-110, 57,157,216, 49,176,171,170,194,152, 0,165, 82,201, 16, 4,193,204,152, 56, 47,105,239,248, 18,106,195,168, 39, 52, 91, 39,
-120,245,111,108,234,155,218,217,217,221,182,177,177,137,172, 16, 71, 77,165, 82,233, 45, 39, 39,167,120,188, 14,244, 56,153,147,
-147,227,173, 82,169, 58,225,117,112, 86, 90, 81, 81, 81,143, 10,203, 83, 90, 29,150,176,157, 10,133,226, 75,138,162, 6, 84,108,
- 31, 82, 20,229,159,144,144,208,218,223,223,255,185,135,135, 71,140,135,135,199, 57, 15, 15,143, 83, 30, 30, 30,167, 66, 66, 66,
-126,168, 76,247,240, 55, 79, 27,254, 65,139,252,151, 9, 45, 84,136,172,237, 21,175,168, 18, 90, 0,174,189,237,128,102,226,243,
-159,153,190,248, 2, 86,167, 78,129,147,144,128,113, 99,198, 88,136, 68,162, 13,120,157,163,169,147, 68, 34,217,188,120,241, 98,
-169,237,170, 85,144, 95,191,142,212,136, 8, 24, 57,156, 7,239, 82, 58,141, 70, 3, 54,155, 93,101,137, 17,139,197,160, 40, 10,
- 53,153,124,255,240, 0,154,112, 39, 43, 47, 30, 60, 52, 3, 13, 70,121, 94,209,245,222,200,164, 5,246, 17, 10,119,207, 68, 21,
-215,115,169, 93, 7,251, 13, 77, 59,223, 83, 17,108, 37,207, 74,128,244,244, 12, 80,160, 27, 52,223,172,213,106,203, 84, 42, 21,
-252,253,253,109, 30, 62,124,216,220,207,207,207,186,226,243,251,127,242,194, 4,203,229,242, 35,206,206,206, 41,114,185,252, 8,
-128,224, 6, 28,187,243,198,141, 27, 96,177, 88, 88,188,120, 49,202,203,203, 97, 48, 24, 80, 84, 84,132,244,244,116,232,245,122,
-100,102,102,226,197,139, 23,208,235,245, 72, 77, 77,133, 78, 87,255,128,132,166,105, 88, 88, 88, 64,171, 81,226,167, 21,243,177,
-112,206, 76,148,189,122,132,204,236, 60, 88, 89,138, 49,109,218, 52,150, 76, 38,163,105,154,110, 70, 81, 84, 47,154,166,183,154,
-115,157,170,221,111, 55, 93, 93, 93,125,214,172, 89,211,122,254,138,173, 92, 11,182,146,225, 75, 5, 52, 79,202,103,120,173, 58,
- 96,252,130, 13,220, 31,215,127,255,242,206,157, 59, 89, 48, 47,121, 39, 9,224,102, 64, 64, 64,203,172,172, 44, 63,111,111,111,
- 47,219,166,110,124,190,147,115, 41,215,169,137,130,209,105,239, 17,206, 77,186,108,221,186, 53,246,214,173, 91,217, 13,225, 20,
-139,197,173,246,236,217,227,227,224,224,224,195, 17, 10, 5,234,178,178,195, 38,181,234, 8,203, 74, 38, 32, 45,172, 62, 60,113,
-226,196,163, 99,199,142,229, 54,132,211,211,211,211,123,197,138, 21,109,124,125,125,219, 56,186, 55,231, 11,157, 93,139, 4, 46,
- 77,139,132,190,126,124,184, 52,251, 96,243,230,205, 49,119,238,220, 49,139,147,197, 98,153, 72,146, 4,135,195,129, 72, 36,194,
-249,243,231,241,197,132,145,112,117,182,129,151,183, 55,122,126,254, 37,142, 29, 59, 86,229,195,195, 98,177,106,237,209,127, 89,
- 53,237,116,128, 19,241, 8,219, 90, 61,194,182, 86,143, 2,156,136, 71,181,138,173,138,239,107,218,199,172,214,168,150,233, 70,
- 51,196,214,217,107,215,174,125, 55,118,236, 88, 94,159, 62,125,112,239,222, 61,140, 31, 63,254,230,241,227,199, 1, 0,247,238,
-221,195,140, 25, 51,110, 94,185,114, 5,147, 39, 79, 70,143, 30, 61,120, 55,110,220,216, 12, 51,114,255,152, 76, 38,236,218,181,
- 11, 38,147, 9, 18,137, 4,214,214,214,232,215,175, 31, 98, 99, 99, 39,239,222,189, 59,158,197,225,124,220,119,192, 71, 56,115,
-234, 56, 94, 60,139,157,252,203,202,209, 13, 78, 10, 76,146, 36,250,140, 25, 83, 88,216,166, 77,241, 47, 10,133,250, 19,153, 76,
-228,157,155,107,125,245,200, 17, 91, 51,132, 26, 65, 81, 84,149,184,170, 20, 29,149, 27,155,103, 7,182,216, 7,108,105, 32,158,
- 36,114,141,220, 32, 68,243, 2, 17, 87, 87,254, 44, 14,143, 28, 63,100,190, 59,134,204,119,199,192, 89,110,227, 68, 77,176, 67,
-220, 4,159,245,153,222, 44,196, 35,208, 18,138,124, 3, 34,214,165,166,105,139,176, 10,192, 11,115,158,115,154,166,159,103,101,
-101,129,199,227,161, 73,147, 38, 45, 1, 84,250, 5,238,156, 56,113,226,212,165, 75,151,206, 4,176,180,226, 51, 73, 72, 72, 72,
- 27,165, 82,137,132,132, 4, 0,120, 88,135, 53,184, 42,202,176, 88,145,202,119,147,251,194,175,213, 36,200,100,109,145, 85,172,
- 71,118,177, 30, 59,126, 26,132, 71, 55,150,227,225,197,112,164,229,230, 66,232, 56, 24,148, 73,231, 99,198,160, 94,254,248,241,
- 99,226,198,141, 27, 4, 77,211, 48, 26,141, 76,185, 66,193, 68,223,188, 9, 77, 84, 20, 97, 97, 97, 65,116,110,223, 85,249,203,
-242, 51,247, 79,108,186,249,208,160,110,240, 64,253,207, 96, 97, 82, 82, 82,240,145, 35, 71, 66, 0, 44,244,245,245,189,147,158,
-158,222,241,250,245,235, 94, 46, 46, 46, 27,222,149,180, 50, 45, 68,106,106,234, 27, 91, 69, 90, 8,125,133,104,232, 83, 33,230,
- 6, 2,152,129, 63, 17,101,223, 0, 92,251, 47,118,134, 63,131,183,162, 13,223, 22, 90,213, 19,133,193, 67, 38,147, 26,141,134,
-204, 75,151, 46, 25, 72,146,132, 72, 36,194,216,241,227,201,159,182,108,233, 50, 50, 56, 56,242,211,247,223, 63, 23,121,229, 74,
- 64, 80, 80, 16, 24,134, 1, 73,146, 56,116,232,144, 70,171,213, 20,185,186,186, 90,153,211,104, 84,127,128, 20, 10, 69,149,208,
- 42, 43, 43,131,131,131,131,217, 83,135, 42, 5, 46, 95, 57,255,168,132,161, 62, 79,239,147,184,222,176, 58,119, 80, 80, 41, 77,
-177,203, 40, 35,202, 52, 12,202,181, 96,223, 35,173,131,198,122, 14, 54, 36,247, 10,122, 17, 21,127,187, 72, 75,105, 27, 20, 45,
-145,159,159, 63, 63, 44, 44,172,200,201,201,137,176,176,176,128,179,179, 51, 57,112,224,192,194,140,140,140,165,239,122, 69,108,
-108,108, 70,132,132,132,156,206,202,202, 26, 26, 21, 21,213,236,250,245,235, 67, 67, 66, 66, 78,219,216,216,140, 48,147,226,240,
-188,121,243, 84, 60, 30, 15, 29, 58,116, 64,121,121, 57, 42,162,124,234,220,204,153, 34,229,114,185,216,182,102, 17, 22,206,153,
-137,226,248,123,120,114,243, 18,174,229, 18, 88,176,226,123,112,185,220,119,202,245,213,194, 78,228,235, 43,151,198,205, 24, 63,
- 60,123,238,156, 57,210,152,152, 24,206,212,233, 51,152,212,156, 98,240,250,172,101,161,219,124,242,177,202, 14,125, 63,236,137,
-197, 11,191,246,173, 72,218, 89, 39, 90,217,137,124,125,228,210,231, 95,127, 58, 50,105,250,244,233,194,213,171, 87,107,131,131,
-131, 53,121,121,121, 66,177,204,218,155,109,105,229,147,154,147, 43, 9, 14, 14, 78,254,252,243,207, 75, 27,202,185, 96,193, 2,
-209,133, 11, 23,216, 97, 97, 97,166,146,146, 18, 9, 71, 40,244, 39,248,130,246, 5, 37, 37,150, 67,195,194, 18,135, 14, 29,170,
-174, 72, 88,106, 54,231,183,223,126, 43,122,241,226, 5, 59, 56, 56,216,152,155,155, 43, 21,219,216,250,177,172,172, 3, 83,114,
-242, 44,218, 7, 5,189,154, 58,117,170,170,174,114, 86, 23, 41, 82,169, 52,171, 83,167, 78, 88,183,110, 29,126,252,241, 71,124,
-240,193, 7,136,125, 22,139,190, 83,103,162,245,103, 51,112,234,246, 93,100,101,101, 97,217,178,101,240,243,243, 3,151,203,125,
- 81,227,243, 56, 57,158,136,201, 5, 17,147, 11,130,152, 28, 79, 84,190,175,213,178,181,180, 12,213,247,175,105,191,135,223,214,
-108,233, 10,112, 34, 30,213,229,135, 85,159,216, 26, 58,116,232, 23,149, 41, 28, 62,249,228,147,155, 27, 54,108,232,252,201, 39,
-175, 7,218, 29, 58,116,192,242,229,203, 59, 47, 88,176,224,230,138, 21, 43,208,179,103, 79,120,120,120,212, 27,248, 66, 81, 20,
- 76, 38, 19, 70,142, 28, 9,147,201,132,130,130, 2,188,124,249, 18,219,183,111, 7,195, 48, 2, 0,112,146,187,180,227,241,120,
-120, 28,253, 64,189,240,147,160, 95, 27, 96,201, 34,170, 15, 98,148, 74, 37,134,126,246, 89, 97,102,139, 22,197, 91, 11, 11,213,
- 19,100, 50,145, 91, 90,154,181, 84,175,119, 70, 29,126,137, 4, 65,128,166,233, 42, 97, 85, 41,184,222,222, 42, 58, 74,179, 96,
- 80,211,103,175,239,203, 6, 0,116, 29, 45,199,192, 89,110,227,156, 60, 69, 27,187,140,122,109,244, 62,182, 60,137, 41,207,166,
- 86,195,136,231, 13,176, 88,223,187,119,239, 30,172,172,172, 16, 22, 22,198, 39, 73,114, 85,229,120, 21,175,115,103,173,175,228,
-226,243,249,107,195,195,195,201,210,210, 82, 60,121,242, 4, 0,174,212,214, 46, 49, 12, 83, 85,119,101, 49, 1,138,230,225, 86,
-244,121, 92,188,126, 20, 41, 89, 5, 72,203,215, 2,108, 75,104, 85,153, 48,104,178,160, 47,141,134, 66, 39, 50,171,192, 92, 46,
-183,192,215,215,151, 9, 12, 12,100, 24,134,193,171, 87,175, 76,169,105,105,166, 7, 63,252,192, 60,157, 52,137,144,190,124,201,
- 21, 10,133,132,187,187, 59, 4, 2, 1, 45, 16, 8,138,254,141,157,247,223,146,110,225,111, 72, 11,241, 87, 90,181, 24,252,119,
- 34, 7,111, 70, 27, 86, 37, 48,173, 41, 97, 41, 24, 11,225,240,163,155,127,178, 12, 27, 57, 90,229,231,231, 39,115,118,118, 6,
- 65, 16, 24, 52,120, 48, 17, 18, 21, 37,229,200,229,176,121,239,189,170,233,136,203,151, 46,225,252,249,243,170, 51,191,157,112,
- 30, 63, 97, 66,127, 0,123,234, 40, 12,155,207,231, 87,253,110, 78, 78, 14,248,124,126,149, 79,132, 66,161,128,157,157, 29,114,
-114,114, 96,230,204,220,222,185,115,238,206,201, 15,154,239, 30, 36,229, 16,231, 84,185,160, 24, 6, 28,130, 2, 52, 12,140, 20,
-160, 51, 50,104,231,198,178,190,168, 49,201, 34,238, 29, 79, 6,176,183, 33,103, 79,167,211, 93,141,137,137,153, 68,211,244, 81,
- 0,100, 84, 84, 20,253,252,249,243, 47, 96,190,227,250, 31,205,246, 34,209,172,200,200, 72,235, 89,179,102,149, 68, 68, 68,148,
-245,235,215,207,114,251,246,237,214, 61,122,244,152, 85, 84, 84,116,208, 28, 67, 96,122,122,250,158,140,140,140, 47, 2, 3, 3,
- 81, 92, 92, 12,131,193,128, 71,143, 30,193,211,211, 19, 15, 31, 62, 68,203,150, 45,241,224,193, 3,120,121,121,129,162, 40,104,
-181, 90,208, 52, 77,213,215,152, 23, 23, 22, 0, 69,233,200,190,119, 14, 47,159, 62, 66,100, 54,129, 77, 7, 79,163, 73, 51,247,
-119,202, 83,211,210, 94,212,198,201,206,230,226,234, 37,223,218,167, 94, 61,132,227,187, 54,209,215,206,157,107,205,147, 98, 82,
-183,145, 95,126,164, 55,162, 41, 0, 94,199,160, 64,244,145,189,160, 68,205,144, 27,249,188,238, 4,139, 45,237, 69,109, 28,108,
-109, 46,252,107,213, 82,233,171,243,191,224,240,182,117,204,177,125, 7,252,180, 64, 80,155, 54,109,250,144, 36,105, 5, 64, 91,
-225,231,101,214,210, 54, 53,113, 94, 62,125, 58, 64, 11, 4,157, 60,121,178,143, 72, 36,114, 4, 96, 84,171,213, 73,127,134,243,
- 74, 68, 68, 64,101, 57, 9,130,176, 7, 96, 96, 24,230, 21, 26,184, 4,207,176, 97,195,150,207,152, 49, 99, 14, 69, 81,118,213,
- 70,231,172,181,107,215,178,105,154,102, 49, 12, 99, 32, 73,210,112,225,194, 5,202,100, 50,101,107,181,218,207,254, 76, 43,242,
-209, 71, 31,225,238,221,187, 75,240, 58, 8,195, 92,107,245, 27,126, 90, 21, 75,246,188, 51,127, 84, 84,212,178,143, 63,254,120,
-238,193,131, 7, 95,110,216,176, 97,192,228,201,147,113,232,208, 33,180,104,209, 2,143, 31, 63,198,252,249,243, 1,160,243,130,
- 5, 11, 78,237,220,185,211, 35, 53, 53,117,173, 25, 22, 13,152, 76, 38, 28, 56,112, 0,131, 6, 13,130,157,157, 29,228,114, 57,
- 8,130,184, 58, 97,194,132, 45, 0,192, 34, 88, 92, 0,208,105,117, 58,111,239, 64,179, 45,184, 92, 46,183,170,173,203,205,205,
-173,138, 20,236,253,241,199,133, 59, 86,175,198,175, 26, 13, 38,200,100,162, 76, 23, 23,167, 83,175, 94,125,250,236,117,227,204,
-212,101,213,169, 79,100,153,235,210,160,201,193,188,223, 86,166, 56, 2,248,160,235,104, 57,186,142,150, 35,112,160, 61, 65,178,
- 8, 60,189, 88,132,216,203,197,199,140, 10, 92, 69,195,150,203,121,190,106,213,170, 83,221,186,117, 27,208,170, 85, 43, 76,156,
- 56,241,243, 93,187,118,113,141, 70,227,116,252,158,230,193,146, 36,201,165,219,182,109,251,212,218,218, 26, 55,110,220,192,245,
-235,215,175, 2, 72,175,173, 93, 2, 80,149, 51,171,137,107, 75,237,139, 84,165, 40, 63,235, 22,110,222,248, 13, 45,252,190,132,
-208,177, 63,172,189, 87,192, 16,255, 35,244, 69, 23, 97,237,218, 15,153,169,175,192, 98,243, 99,235,115, 66, 97, 24,230, 89,102,
-102,166,135,135,135, 7,145,146,146, 98, 2,192, 80, 20,197, 24,186,116, 49,182, 94,189,154, 19,251,249,231, 68,199, 23, 47, 88,
- 12, 65,208,143, 30, 61, 2,128,184,255, 68, 47, 94,153,110, 33, 54, 54,182,182,116, 11, 13,130,175,175,111,231,235,215,175,243,
-181, 90, 45,174, 93,187,134,246,237,171, 98,187,254,163,217,239,171,107,145,255, 50,124, 90,195,103,219,223,176,104,189,113, 99,
-211, 4,199,171,101, 75,138, 75, 98,247,160,254,253,213, 49, 49, 49, 85,163, 62,237,253,251, 80,157, 63, 15,138,162,192, 48, 12,
-174, 71, 69, 33,124,244,104, 37,135, 69,236,112,115,107,198, 16,204, 27,185, 91,122,213, 48,122, 8, 11, 11, 11,171,106,124, 50,
- 50, 50, 32, 22,139,193,227,241, 64,211, 52, 76, 38, 19, 88, 44, 22, 44, 45, 45, 97, 50,153,106, 50,193,188,205,105,164,138, 85,
- 67,119,246, 29,149, 35, 87, 26,152, 73, 86,110,104,202, 21, 86, 61,156,142, 22, 4, 6,248,113, 96,203,206,103,174,172,125, 63,
-155,214, 21, 13,197, 31, 35,186,234, 11,249,111,217,182,109,219, 45,225,225,225, 36, 0,244,234,213,139,108,219,182,237, 70,212,
-189, 84, 78,157,156, 2,129,128, 15, 0,167, 79,159, 46,126,249,242,229, 7,167, 79,159, 46,174,254,185,153,156,219,215,172, 89,
- 3,145, 72, 4,147,201, 4,189, 94, 95,229,159, 85,253,213, 96, 48,192,214,214, 22,103,206,156, 1, 69, 81,103,234, 43,167,107,
-211,102, 32,236,154, 99,207,233, 72, 92, 47,228,190,139,200,170,226,108,238, 40,246,114,180,181,185,244,175,149,203,236, 74, 18,
- 31, 33, 51, 51,147,185,112,254,204, 29, 45,144, 85, 86,142,133,165, 42,120,105,244, 16,180,247, 64,250,165,109,179,153, 5, 93,
- 97, 68,205, 81,131, 85,156,173, 29,197, 94,206,118, 54, 23,190,255,215, 74,105,105,226, 35,228,228,230,226,236,153,211, 49, 90,
-160,114,186,113, 28, 77,211, 62, 52, 77,251, 0, 24, 87,135,120,105, 16,167, 90,173,246, 85,171,213,190,127, 37, 39,195, 48,190,
- 12,195,152,205, 89,221, 39,106,253,250,245,241, 57, 57, 57,225,249,249,249,161,149, 91, 73, 73, 73, 47,165, 82,217, 93,173, 86,
-119,209,172,111,102,169, 86,171,237,149, 74,165,147, 86,171,109, 7,224, 81, 3,238,249, 42, 84,207, 58,157,147,147,179, 56,231,
-255,216,187,242,240, 38,170,246,123,102, 38,251,210,180, 77,219,164, 41, 45,101, 45, 91,203, 82,144,125, 21, 20,164, 40,202,250,
- 67, 16, 16, 44, 32,138,128,130,168,168,236, 8,226,135, 11,178, 20, 80, 22, 17, 89,101,119, 1,100,151, 29, 4, 74,161, 44, 45,
-221,151, 52, 75,155, 52,205, 54, 51,191, 63,154,196,180,116, 73, 74, 81,248,190,156,231,153, 39,153,100,114,114,231,206,204,189,
-231,190,247,189,239,155,157, 77, 84, 87, 78,106, 82, 18,177,229,139,247,126, 94,179,102,141,234, 17,249,203,148, 83,173, 86,239,
-216,186,117,107,155, 6, 13, 26, 52, 28, 59,118, 44, 86,175, 94,141,175,191,254,218, 12, 0,235,215,175, 55,187, 89,178, 34, 82,
- 83, 83,159,169,100,218,176,143,155,181,100,211,243,207, 63,207,158, 56,113, 2, 47,191,252,178, 43,144,232,218,181,107, 97,183,
-219, 11,123,247,238,205, 0,128,169,164,184,144,101, 88, 88,172,149,206,191, 63, 84,159,124, 62,255, 5,247,120,129,206, 96,204,
-124, 62, 31, 44,203,162,105,215,174,106, 93,235,214,154,239,244,250,226, 57, 45, 91,202,226,155, 53, 27,219, 28, 24, 85, 17, 39,
- 65, 16,101,172, 58,229, 55, 47, 44, 89,238,229,204, 51,101,225,141,159, 23,165,252,226,180,108, 9,165, 28,148, 20,217,177,251,
-179,148,252,146,124,172,173, 76,252, 84,117,238, 26,141,230,237,207, 62,251,204, 28, 24, 24,136,193,131, 7, 99,225,194,133,227,
-187,118,237,170, 87, 40, 20,103, 27, 55,110,124,109,248,240,225,217,151, 46, 93,122,187, 87,175, 94, 72, 78, 78,198, 23, 95,124,
-161,211,106,181, 35,171,226, 36, 8,194,101,201, 27, 24,215, 71,179,234,155,255, 48,189,123, 76,134, 88, 36,131,141, 27, 1,141,
-193, 6,173,145,133, 69,208, 1,124,158, 0,125, 59, 69,227,236,175, 27,138,105,139,113, 99,117,247,188,193, 96,216, 57,102,204,
-152, 66, 30,143, 7,139,197,194,114,185, 92, 8, 74,253,142, 25,110,191,126,214,206,137,137,118,154,101, 25,130, 32,240,238,187,
-239, 26,181, 90,237,214,154, 60, 71, 94,192,157,179,182,194, 45,244, 41,215,255,212, 70, 88,136,199,113,238, 79, 51, 18, 42,216,
-254,182,104, 57,151, 84, 58, 95, 9,130,161,105,154, 65,253, 6,245,253, 82, 83,210, 86, 12, 27, 54,116, 92,255,254,113,226,184,
-184, 56, 97,116, 82,233,104,116,223,190,125,216,181,107, 87,241,111,191,253, 86, 40,224, 82,235, 35,234, 70, 40,105,154, 1, 65,
- 48, 85,170, 97, 63, 63,191,119, 62,252,240, 67,145, 94,175,199,215, 95,127,205,180,105,211,134,148, 72, 36,176, 90,173, 88,191,
-126,189, 45, 58, 58,154, 75,146, 36,244,122, 61, 72,146,188,229,225, 9,254,165, 79,203,236,187,178,215,160, 93,207,188,245,122,
- 80,139, 94,157, 3,123, 70,212,129,173, 45,139,172,244, 20,220, 62,242,155,246,198,175, 95, 22,160, 36,119, 16,170, 79, 15, 84,
- 81, 71,240,233,111,191,253,166,120,251,237,183,217,146,146, 18, 34, 45, 45,141, 93,180,104,145,226,141, 55,222,248, 52, 43, 43,
-235,255,106,120, 81, 8,157, 78, 7,130, 32, 24, 71, 67,226, 28,245,123, 51, 47,119,125,227,198,141,123, 94,121,229,149,129,189,
-123,247, 70, 82, 82,146,107,138,208, 93,104, 57, 87, 31, 46, 94,188, 88, 7,224,131,234, 72,185, 92, 46,190,222,184, 3, 58,173,
- 26, 74,101, 24,132, 34, 17,106,186,194,146, 79,146,115,150,204,255, 68,161,190,121,150,184,254,231, 81,102,251, 95,185,121,118,
-154,173, 56,226,127, 81, 22,235, 80,255, 85,143,102, 72,106,206,146, 69,243,252,157,211,154, 91, 47,103, 23, 18, 52,251,246, 35,
- 61, 34, 79, 11,231, 63,140,176,176, 48,100,103,103, 19, 97, 97, 97,172,195, 71,139,173, 66,104,149,189,193, 75,167,203,136,170,
-166, 13,107,202,127,255,254,253, 69,109,219,182,125, 47, 57, 57,121,123,139, 22, 45, 38, 2,168,107, 54,155,117,179,103,207,254,
-124,253,250,245,227, 60,177,100, 1,192, 79, 63,253,244,229,235,175,191,254,203,139, 47,190,248, 62,195, 48,173,220, 58,246,251,
- 10,133,194, 53,133,155,159,155, 51,107,194,184, 17,179, 12, 6,173,199,113,238,164, 82,105,252,236,217,179,133, 70,163, 17,223,
-126,251, 45, 19, 29, 29, 77, 58, 7, 69,155, 55,111,182, 55,105,210,132, 51,116,242,100,245,242,156, 28, 44, 56,121,210, 56, 43,
- 38,166,205,119,183,111,183, 3,195,108,170,204,170, 83,145, 37,203,233,118, 81, 67,100, 57,196,214, 90, 0,253, 58, 15, 11,197,
-158,165, 41,208,166, 90, 62,135, 29,119,225, 65, 90,160, 10,144,177,115,231,206,190,185,185,185,123, 62,249,228, 19,255,118,237,
-218, 33, 38, 38,134, 43,149, 74, 59, 56,195,197,232,245,122, 28, 62,124, 24,171, 87,175,182,220,184,113,227,149,170,166,171,104,
-154,206,107,210,164,137,179, 30, 88,130, 32, 10, 10,205,132,255,182,230, 29,164, 99, 39,108, 39, 78, 93, 56,131, 44, 43, 3,179,
-141, 65,253, 6,177,232,217,111, 57,246, 30,186, 70,103,165, 38, 38,218, 76,218,117, 30,148,247,238,157, 59,119,118,207,159, 63,
-127,216,251,239,191, 47, 82,171,213,180,217,108,102,118,236,216, 65,141, 29, 59,150,102, 57, 28,134,199,225,224,157,119,222, 49,
-233,116,186,159,129,127, 52,193,244, 99, 9,183,240, 24,194, 66,212,154, 53,203,253,245,191, 5, 21, 62,161, 12, 69,158, 94,189,
-102,213, 11, 63,253,184, 53,148,162,200,208,187,247,238, 93,120,105,208,144,204,223,127,255, 93,206,243,247,111, 15,128,177, 76,
-156,248,167,213,108,210,236,223,179, 39,178,126,253,122,173, 29, 73,165, 89,134, 34, 79, 87,245,135, 6,131,193,120,242,228,201,
-226, 15, 62,248,128, 72, 79, 79,223,162, 84, 42,135, 31, 58,116, 72, 58,104,208, 32, 83, 82, 82,210,206,208,208,208,129,189,122,
-245,242,123,239,189,247,204, 6,131,193,155,196,163,137,108,190,182,249,249, 79,150,189,122,126,233,170,231,192,161,186,192,204,
- 5, 24,219,105, 88,139,126, 7,176, 5, 94,196, 59,114,135, 68, 34,105, 45, 22,139,113,229,202, 21,109,135, 14, 29, 44, 37, 37,
- 37,188,133, 11, 23, 6, 73, 36,146,214, 53,173,120,150,101, 89,173, 86, 11,134, 97, 56, 0, 8,199, 43, 24,239,215,226,255,223,
- 75, 47,189,180,103,219,182,109,207,199,197,197,161, 97,195,134,176,217,108,104,210,164, 9, 44, 22, 11,162,162,162, 96, 54,155,
- 49,119,238, 92,232,245,250,233,168, 34,231, 25, 65, 16,176,219,237, 46,103,219, 58,225,145,165,113,122, 30, 33,140,133,132, 75,
- 54,188,181,255, 59,228, 21,168,153,109, 87,115,115,139,173,116,223, 59,249,197, 55,202, 31, 87, 76,195,216,107,236,148, 76, 0,
- 48, 51, 85,103,156,151,240,209,240,246,129,181,200,205, 83,227,167,203,217, 58,163,149,233,119,187, 2, 78,175,202,249,148,112,
-198,206, 77,194,144, 41,158, 31,251, 40,240, 84, 80, 85,134, 43, 57, 32, 46,138,191, 99,177,230,187, 10, 99,100, 61, 34,255,158,
-228,228,228, 61, 0,144,152,152,152, 62, 98,196,136, 89, 41, 41, 41,243, 1, 28, 76, 77, 77, 93,227, 13,209,119,223,125,151, 12,
-224,245,170,142,217,186,236,245,221, 0,118,123,195, 91, 84, 84, 84,114,233,210,165,146,247,222,123,143, 72, 79, 79, 63, 20, 26,
- 26,250,252, 47,191,252, 34, 30, 52,104,144,249,250,245,235, 71,194,194,194,186,247,233,211, 71,122,240,220,185,204,226,187,119,
-247,239, 79, 73, 9,183, 49,204,254,170,158,207, 90, 22, 89,101,196,214,238, 5, 41, 75,246, 44, 73,233,195,152,177,211,162,197,
-159, 0, 50, 30,129,243,196,233,211,167, 91,140, 26, 53,106,219,128, 1, 3, 58,183,104,209, 2,117,235,214,197,237,219,183,145,
-159,159,143,191,254,250, 11,251,246,237,219, 87, 82, 82, 82,109, 66,109,141, 70,243,112,122, 34,161, 60,108,195,183,115,246, 93,
- 56,213,190, 73,183,184, 49,162,152, 48, 6, 22, 43,139,244, 7,119, 49,247,227,117,197,217, 15,146, 19,173,118,235, 43,240,112,
-161,142,201,100, 74,248,234,171,175,184,251,247,239,143, 91,177, 98,133, 95,100,100, 36,197,227,241, 72, 0,236,197,139, 23,217,
- 41, 83,166, 24,213,106,245,129,194,194,194,132,127,184,143, 62,113,239,222,189, 88,138,162,106, 53,220,194, 35,132,133,240,161,
- 54,209,160, 65,120,139, 70,145, 97, 19, 27,214, 13,159,220, 32, 50, 98,116, 69, 78,238, 13, 3, 3,253, 26,212,171, 19,223,176,
-110,248,228, 70,145, 97, 19, 27, 52, 8,111,225,129,105,177,161, 76, 38, 59,164, 82,169,218, 0,128,191,191,255,192,128,128,128,
- 27,254,254,254, 3, 29,163,192,129, 82,169,244,102,116,116,244, 27,255,160,185,178, 74,206, 38, 77,154,140, 48, 24, 12,111, 54,
-105,210,100,132,115,255,238,221,187,174,253,154,112, 70, 68, 68,244,190,120,241,226,255, 45, 91,182,108,112,227,198,141, 7, 46,
- 90,180,104,240,207, 63,255,252,127,225,225,225,237,106,192, 41, 0,240, 3,151,203,205,229,243,249,121, 92, 46, 55,215,185,113,
- 56,156, 92,138,162,114, 1,172,169,196, 90,214,199,109,148,115, 74,169, 84,166, 42,149,202,212,208,208,208,212,208,208,208, 84,
-149, 74,245,208, 22, 28, 28,124,202,211,250,108, 22, 42,237,218,161,174,223,233,150, 42,233,169,230, 74, 73,179,218,184, 70,205,
- 66,165, 93,219,215,245, 63,221, 82,229,119,242,127,141,179, 77, 40, 88,118,117, 51,150, 93,221,140,109, 19, 10,182,186,253,218,
- 52,251,171, 84, 42, 86,165, 82,205,121, 92, 83, 9,149,240,255,227,207,123, 45,114, 54,244,243,243,219, 90,183,110, 93,103, 91,
-247,162, 76, 38,251, 67, 42,149,190,232,104,235, 94,148, 72, 36,199,163,163,163,199, 84,199, 41,151,203, 47, 42, 20,138, 28,199,
-150,173, 84, 42,179,149, 74,101,182, 66,161,200, 82, 40, 20, 89, 33, 33, 33,153,206, 45, 32, 32,224,108, 13,207, 93, 1,160, 35,
-128,118, 0,100,181, 88,159, 13, 0, 76,112,180, 65,159, 1,120, 3, 64,171, 90,184, 70, 4, 87, 36,159, 36, 8,136, 56,205,149,
-134, 20,113,165, 33, 69, 2,255,240,211, 85,164,224,241,132,179,169, 92, 46, 95, 40,147,201,126,246,243,243, 59,233,231,231,183,
- 39, 56, 56,120, 17,128,166,255,210,189, 36, 5,176, 30,165,241,153, 14,162,116, 42,124, 15, 74, 23, 21, 68, 62,129,247,252,255,
- 50,226,255,173, 63,238,227,227,244,113,250, 56,125,156, 62, 78, 31,231, 83,200, 73,250,234,211, 39,180,188, 20, 90,229, 55, 0,
- 85, 68,134,247,193, 7, 31,124,240,193,135,255, 97, 48,190, 42,240,193, 75, 84, 56,181, 76, 84,161, 74,189,137, 53, 85, 19,101,
-123,216,199,233,227,244,113,250, 56,125,156, 62, 78, 31,231,255, 28,167, 15,181, 8,159, 89,213,199,233,227,244,113,250, 56,125,
-156, 62, 78, 31,231,127, 59,124, 83,135, 62,248,224,131, 15, 62,248,224,131, 15,143, 9, 9,110,130,171,204, 20,162, 79,104,121,
- 15, 18,192,155, 0,134, 0,104,132,210,108,246, 59, 0,172, 68,205,230,244,101, 0,102, 1,232,130,210,213, 57,247, 1,156, 68,
-233,234, 28,131,175,186, 43, 70,112,112,240,135, 92, 46, 55, 0, 40, 77,109,226,124,117,127, 79,211,180,174,176,176,112,209, 99,
- 42, 2, 5, 15, 35, 40, 59,203,234, 94, 54,247, 87,155,205,246, 56,203,233,195,147,137, 38,114,185,252, 7,141, 70, 51, 18,110,
- 73,150,125,240,225,191, 1, 33, 33, 33, 19,173, 86,235,108, 30,143,183, 48, 63, 63,127,213,255,208,169, 63, 36,178,202, 8,173,
-253,251,247, 31, 7,128, 1, 3, 6,244, 0,128,128,128,128, 51, 36, 73, 54,240,230, 31, 24,134,185,175,211,233, 42, 13,160, 22,
- 16, 16,112,134,162,168,135, 56,109, 54,155, 31,135,195, 41,170,232, 55,118,187, 61,163,176,176,176,221, 19, 82,137, 4,128,253,
-129,129,129, 37,243,231,207, 95,217,179,103,207,136,172,172, 44,251,204,153, 51,187, 95,189,122, 53, 14,192, 11, 94,138,173, 78,
- 4, 65,108,104,211,166,205,238,209,163, 71,111,235,208,161, 3,191,160,160,192,111,199,142, 29,117, 54,110,220,120,137, 97,152,
-145,168, 34,209,234,255, 50,184, 92,110, 64, 70, 70,134, 31, 80,154,154,196, 33,172, 96,179,217, 96,179,217, 96, 52, 26,209,186,
-117,235, 90,255,223,208,208,208, 88,130, 32, 86, 72,165,210,118, 6,131,225, 2,128,201,217,217,217, 87,189, 41,171,221,110, 7,
-203,178,174,114,182,104,209,194,119, 65,189,195,120, 62,159,223, 47, 42, 42,170,189,217,108,214,222,191,127,255, 60, 77,211,159,
-160,246,114,180,249, 3,248, 68, 32, 16,116,104,212,168, 81, 68,114,114,114,186,213,106, 61,135,210,100,200,250,218, 16, 89, 61,
-122,244, 56,245,237,183,223, 6, 77,154, 52,233,212,201,147, 39,187,250,196,150, 15,255, 22, 34, 34, 34, 2,140, 70,227, 58, 0,
-177, 92, 46, 55, 84, 40, 20, 66, 36, 18,229, 8, 4,130, 43, 34,145,104,220,233,211,167,117,222,114,210, 52,253, 73,106,106,106,
-104,199,142, 29,151, 42, 20,138,185,106,181,186,196,106,181, 30,209,106,181,211, 1, 20, 86,245,219,242, 90,228, 41, 19, 89,238,
-175,112,138, 46,142,227,196, 88, 0, 61,203, 40, 48, 14, 39,252,193,131, 7, 10,161, 80, 8,134, 97, 92,157, 89,249,205,249,185,
-197, 98, 65, 76, 76,140,181,154, 14, 39, 34, 61, 61, 93,193,231,243, 93,159, 89, 44, 22,212,169, 83,135,201,200,200, 80, 56,210,
- 30,184, 96, 54,155, 17, 30, 30,254, 36,229, 60,122, 83, 46,151,235,211,210,210, 91,151,152,173,243,222,120,251,131, 15, 71, 14,
-121, 46,240,204,153, 51,204, 11, 47,188, 96, 62,126,252,248,155, 40, 77,156,234, 81, 99, 78, 16,196,198,153, 51,103,206, 21,138,
-101, 65, 71,207, 36,154, 55,238, 56,144,217,166, 73,125, 98,250,244,233,212,148, 41, 83, 78,196,198,198,254,192, 48, 76, 91,120,
- 97,217, 10, 12, 12,252, 69, 32, 16,212,115,212, 95,154, 86,171,125,254, 9,188, 33, 57,120, 56,120,108, 69,159, 85,139,130,130,
- 2,152, 76,166,135,182, 22, 45, 90,120,154, 43,211,171,114,115,185,220, 61,139, 23, 47,174,147,147,157,141,255, 44, 95,222, 17,
-165,150,204,142,158,252, 56, 47, 47,239,161,114, 54,107,214, 12, 62,120,133, 89,115,231,206, 93,252,234,171,175,130,166,105,152,
- 76,166,176, 59,119,238, 68,207,158, 61,251,149,187,119,239,182, 7,112,239, 81, 7,227, 81, 81, 81, 73, 83,167, 78,149,183,111,
-223, 30,142, 44, 21, 97, 39, 79,158,236,184,126,253,250,215,210,210,210,154, 1,200,127,148, 63,144,203,229, 63,172, 93,187, 54,
- 72, 44, 22, 99,239,222,189, 65,189,123,247, 62,121,249,242,229,110,143, 32,182,200,160,160,160, 41, 0,158,101, 24,134, 15,224,
-156, 86,171, 93, 0,239,163,186,171,164, 82,233, 78,146, 36,235, 3,127, 71,163, 39, 73, 50,152, 32, 8,181,243, 51,130, 32, 20,
- 12,195,252,169,209,104, 58,251,110,199,167, 27, 65, 65, 65,227,115,115,115,191, 21, 8, 4,188,192,192, 64,136,197, 98,112, 56,
- 28,112, 56,156,186, 2,129,160,174, 64, 32,232,223,171, 87,175,201,127,252,241, 71,149, 17,246, 59,181, 81,142, 5, 73,204,163,
- 8,146, 2, 0,146, 43,145,249,251,251, 99,222,188,121,146,129, 3, 7, 74, 0,224,212,169, 83,163,199,140, 25,211, 59, 35, 35,
- 35,166, 50,177, 85,145, 22,121,138,144, 80, 85,135, 7,135,122, 60, 94,230,201, 37, 73,240,249,124,156, 61,123, 22,158, 4, 43,
-119,166, 72,168,178, 53,112, 68, 24,191,122,245,111, 3,128,179,163,225,243,249, 56,125,186,108, 80,249, 78,157, 58,185, 30,246,
-127, 10, 67, 90,148, 6,121,220,254, 86,105,185,134,174, 40,141,174,189,253,173,102,232,254,197, 3, 12,153, 50,103,120,113,137,
-245, 25, 0, 70,157, 86,171,189,176,107, 87, 86,155, 38, 77,120, 63,252,240, 67,251, 58,117,234, 12,241, 66,104,205,106,219,182,
-237, 78, 74,228, 31, 60,122,204,216,209,227, 56,164,245,181, 9,239, 45, 76,207, 86, 27,227,227,227,119,237,221,187,119,244,146,
- 37, 75,110,206,152, 49, 99, 22,128,143, 60, 45,191, 80, 40,172,119,235,214,173, 40,154,166,209,162, 69,139, 39, 49,141, 65, 27,
-148, 6,223,123, 21,192,143,142,207, 70,160, 52,114,127, 44,128, 43,222,144, 57, 45, 88, 21,109,181,141, 58,117,234, 52, 27, 53,
-106, 84,176, 70,173,198,127,150, 47,119,126,220, 14,213, 76, 35, 58,159, 31,139,197,130,193,131, 7,143,162,105,154,227, 20,129,
-102,179,217,162,215,235, 75,240,183, 99,105, 62,128,231, 60, 40, 78, 3,137, 68,242, 57,128, 88,147,201, 84, 7, 0, 36, 18, 73,
- 38,195, 48,187,141, 70,227, 71,248, 59,129,175,215, 3, 92, 0,209,168, 60, 21, 20,187,120,241,226,228, 15, 62,248,224,222,191,
-192, 89, 79,169, 84, 46, 26, 58,116, 40, 14, 28, 56,128,131, 7, 15,218, 68, 34, 17,103,204,152, 49,196,228,201,147, 3,167, 78,
-157,218, 31,192, 87,143,120,153,251,207,157, 59, 87,222,188,121,115,236,216,177, 3,127,253,245,151, 41, 42, 42, 74,212,179,103,
- 79,112, 56, 28,249,135, 31,126,248, 2,128, 13,143,242, 7, 26,141,102,193,123,239,189,183,241,199, 31,127,244,187,127,255, 62,
- 86,172, 88, 17, 60,124,248,240,227,105,105,105, 61,188, 16, 91, 2, 0, 83, 0,244,162, 40,170,219,152, 49, 99,236,111,191,253,
- 54,151, 36, 73,219,242,229,203, 67,214,175, 95, 63,156,203,229,198, 22, 20, 20,120, 50, 72, 35, 1,204, 27, 55,110,220,235,127,
-252,241, 71,224,249,243,231,249, 65, 65, 65,160,105,218,101, 41,102, 24, 70,225,188,103,237,118, 59,154, 53,107, 22,238,246,123,
-209,211, 42, 52, 72,146,180, 50, 12,195, 5, 32, 4, 96,174,110,255,191, 73,100,201,229,242, 73, 26,141,102,101,104,104, 40,148,
- 74,229, 67,125,173,217,108,134, 80, 40,228,133,134,134,174, 29, 56,112, 32,119,207,158, 61,149, 78, 1, 18, 20,241,201,222,173,
-243,235,200, 3,253, 0, 0, 95,174,254,181, 24, 0,126,254,249,103,100,101,101, 33, 48, 48, 16, 49, 49, 49,212,252,249,243, 85,
-211,167, 79,255,143, 86,171, 29, 87, 25, 87,121, 45,242,148, 89,180, 18, 42,218,175,210, 71,139,101, 89, 87,158, 60, 15,111,218,
-242, 31, 29, 46,199, 71, 88, 44, 22,148,183,104, 57, 31, 94, 46,151, 91,222,252, 8,130, 32,216,170, 56, 43,192, 24,137,101, 26,
-113, 91, 0, 0, 32, 0, 73, 68, 65, 84, 68,210,218,104, 52,126,227,197,232,214,197,185,253,173,102,216, 40,152, 57,194,153,137,
-180,255,123,165,175, 27, 1,156, 73, 25,183,226,219, 30, 61,234, 76,249,248,235, 57,166,130, 44,245,135,163, 94,172, 23, 21, 26,
- 36,146,232,242,244,242,166, 77,251,150,179,200, 84, 87,206,238,163, 71,143,222,244,219,217, 84, 66, 40,228,241, 56, 20,197,237,
-218,178, 73, 80,132, 63,229,239, 7,248,167,223, 75, 62, 51,118,236,216,150, 51,102,204,232,230, 5, 39, 28, 29, 46, 54,111,222,
- 12,130, 32, 72,111,206,189, 22,113,184, 42,145,197,178, 44, 8,130,216,226,214,169,108,113,124,118,217, 77,108,113,170,170, 79,
-167, 53,213, 41,170,198,140, 25, 51,202,110,183,115,220, 26,137,242, 2,166, 34, 17,227,209,185,171, 84,170,223, 0, 60, 71, 16,
- 4, 44, 37, 37,150,207,191,248,194,253,235,139,229, 68,214,225,202,158, 37,155,205, 6,154,166, 57,151, 47, 95,230,186,221,235,
- 92, 0, 18, 0,193, 44,203,130, 36,201,107, 30,212,103, 51,177, 88,124,102,223,190,125,178,118,237,218, 17,124, 62, 31,118,187,
- 29,215,175, 95,143, 88,178,100,201,132,195,135, 15,191, 96, 52, 26, 91,224,225,228,233,158, 92,163,232,147, 39, 79, 26, 27, 54,
-108, 88,161,112, 44, 44, 44,228, 52,105,210,164, 71, 37,162,232,113,115,102,228,230,230,190,252,220,115,207, 77,204,201,201, 73,
-178,219,237,239, 3,136, 9, 14, 14,190, 60,104,208, 32,136, 68,162, 94, 38,147,233,171, 71,185,231, 21, 10,197,192,206,157, 59,
- 99,197,138, 21, 88,178,100, 73, 31, 0, 71, 0,244, 46, 44, 44, 60,252,210, 75, 47, 33, 32, 32,224,101,157, 78,183,225, 17,158,
-163, 38,221,187,119, 95, 59,111,222, 60,191, 3, 7, 14, 32, 42, 42, 10, 69, 69, 69,120,247,221,119, 21,159,126,250,233, 49,157,
- 78,215,211,237,185,168,140,179,133, 64, 32,216,240,227,143, 63, 74, 27, 54,108,216,144,199,227,145, 13, 27, 54,132, 70,163, 65,
- 73, 73,137, 96,225,194,133, 45, 69, 34,209,213,175,190,250,106, 3,128, 65,213,148,147, 4,176, 96,205,154, 53, 19,227,227,227,
- 3, 70,141, 26, 69, 91, 44, 22,108,219,182, 13, 20, 69,129,203,229, 66, 44, 22,187,146, 87,243,120, 60, 52,109,250, 80,144,244,
-189, 85,156,175, 30,165,126,168, 1,240,110,218,245,112, 21,124,174,169, 15, 46,151, 11,161, 80, 8,161, 80, 8,129, 64,128, 91,
-183,110,125, 44, 20, 10,151, 19, 4, 97,247,132,147,248, 91, 93,180, 6,112,190,186,125, 60,236, 26,242, 79,182,159, 78,132, 19,
- 4,241, 37,128, 94,165,221, 46,121, 60, 56, 56,248,157,220,220,220, 7,158,114,170, 84,170,160,130,130,130,175, 84, 42, 21,148,
- 74,165,171,255,174, 83,167, 14,108, 54, 27,114,115,115,193,178, 44,116, 58, 29,196, 98, 49,194,194,194,190,138,143,143,223,145,
-144,144, 80, 80, 33, 39,131, 37, 47, 13,159,253, 9, 69, 81, 36, 0, 80, 28,169,116,234, 7, 64,189,122,245,208,181,107, 87,148,
-148,148, 64,175,215, 35, 58, 58,154, 67, 16,196,104,130, 32,100, 44,203,174, 2,112,244,191,208, 80, 88,169, 51,252,220,242,243,
-162,206,108,241, 60, 30,207, 35,161,229, 56,190, 58, 11, 10,105,179,217,192,227,241,202, 88, 36, 8,130, 0, 77,211,101, 62,119,
- 10,173,154, 8,245,201,147, 39, 51,107,215,174,157,168,213,106, 87,163,134, 83, 9,163, 71,143,126,200,223, 99,250,244,233, 25,
-121,121,121,236,224,190,173, 37, 73,135,178,178, 27, 5, 74, 69, 33,126,126,245,133,129,242,128,130,130,130, 63, 29,141,137,167,
-104,220,182,109, 91,209,198, 93, 39, 51,222,152,182,120,126,187,134, 65,178, 86,225,193,129,161,254, 34,190,148, 36,140, 66,187,
- 45, 67, 46,151, 71,121, 91,110,103,187, 32, 22,139, 65,146,228,147,100,209,226, 56, 69,150, 70,163,193,129, 3, 7, 16, 23, 23,
-119,217, 41, 66, 10, 11, 11,145,157,157, 13,149, 74,117,217, 97,249,168,118, 26,145, 97, 24, 88,173, 86, 88,173, 86,151,128,113,
-187,135, 92, 2,198,121, 44, 69, 81,215,106, 88,246,249,129,129,129,221,123,245,234,197,223,186,109, 27,159,101, 89, 35, 74,115,
-168, 25, 88,182,146, 4,217,229, 96,183,219, 93, 86, 54, 46,151,139,180,180, 52, 87,199,229,204, 45, 41, 20, 10, 61, 51,101, 8,
- 4,239,253,244,211, 79,178,246,237,219, 19, 5, 5, 5, 96, 24,198,213, 72,174, 92,185, 82, 56,100,200,144, 58,151, 46, 93,250,
-208,108, 54,207,173,193,185, 18,149, 9, 34, 0,144,201,100,118,120, 22, 49,187, 90, 78,187,221, 78,116,233,210,101,134, 90,173,
-110,105, 50,153, 22,122, 82,141, 0,246,102,100,100,184,119,236, 87,147,146,146, 76,195,134, 13, 19,213,175, 95,191, 67, 98, 98,
-226, 35,221,164, 77,154, 52,233,196,229,114,113,238,220, 57, 51, 0,231,200,250,248, 95,127,253,101, 30, 52,104,144, 32, 34, 34,
-162,147, 78,231,177,203, 74,147,102,205,154,253,174, 80, 40, 68,206, 54, 52, 36, 36,132,155,144,144,224,151,153,153, 9,171,213,
-138, 89,179,102, 97,192,128, 1, 8, 14, 14,198,244,233,211,149, 75,151, 46,253,193, 96, 48,180,173,202,104,205,231,243, 55,221,
-185,115, 39, 74,165, 82,137,206,158, 61,139, 86,173, 90, 65,173, 86, 35, 39, 39, 7, 6,131, 1, 57, 57, 57, 24, 55,110,156,226,
- 63,255,249, 79,152, 7,150, 44,151,200, 74, 72, 72,208,237,220,185,147, 90,183,110,157, 31,151,203,117, 9, 45, 14,135,227, 18,
- 90,206,220,138, 53,152,105,208, 57, 68, 91,128, 94,175,127, 20, 63, 55, 1, 0,190,187,200, 18, 8, 4, 16, 8, 4, 16, 10,133,
-143,148,151,245, 41, 65, 29,130, 32, 18,121, 60,158, 64, 44, 22,243, 72,146,132, 64, 32,232, 43,151,203,111,196,196,196,196,252,
-254,251,239,169,158,144,148,148,148,108, 18, 8, 4, 92,133, 66, 1, 0,136,138,138, 66,171, 86,173, 96, 52, 26, 25,189, 94,143,
-128,128, 0,242,193,131, 7, 48,153, 76,200,206,206, 70,100,100, 36,151, 36,201, 77, 40,245, 67,126, 8,103, 46,231,172, 6,176,
-218,185, 31, 28, 28,156,235,110,233, 20, 10,133,168, 83,167, 14, 50, 51, 51,225,231,231, 71,125,250,233,167,131,182,109,219,246,
-202,153, 51,103, 70, 3,216,236, 70, 53,247, 41,246,209,114,138, 44,247,215,191,133,214,128, 1, 3,230,236,223,191,191, 71, 69,
-163,112, 46,151, 91,107,190, 46, 78, 65, 37,147,201,202, 91,173,192, 48, 76,101, 22, 45,175,255, 71, 40, 20,138, 38, 77,154, 84,
-180,106,213, 42,175,197,214,208, 21, 73, 46, 43,214, 67,195,200, 22, 45,206,124,248,225,135, 3,255,248,227,143,204,118, 13,235,
-115, 36, 89, 15, 12, 66, 89, 64, 0,194,235,198,141,121,121,208, 95, 40, 93,125,232, 41,238, 20, 21, 21,137, 26,133,139, 45, 36,
- 89, 66,212, 21,112,252, 84, 18,158, 32, 52, 48,176, 14,207, 98,206,147, 5, 6,242,205,102,179, 14, 85, 36,129, 6, 0,165, 82,
-249,171, 72, 36,138,116,238, 7, 6, 6,250,179, 44, 11,177, 88, 12,149, 74, 37,165, 40,234,182,219,195,245, 32, 55, 55,183,111,
-117, 5, 11, 8, 8,248, 85, 32, 16, 68,146, 36, 9,130, 32, 64, 81, 20, 72,146, 4, 73,146,174,247, 20, 69,129, 32, 8, 20, 23,
- 23, 63, 72, 77, 77,237,235,193,249,218, 1,196, 18, 4,113,249,192,129, 3,232,208,161, 3, 14, 29, 58,132,126,253,250, 65,175,
-215,227,250,245,235,232,222,189, 59, 80, 58,165,232, 17,220,157,223,157,131,130, 91,183,110,185,132,139,251,230,231,231,247, 40,
- 38,246, 83, 67,135, 14,197,218,181,107, 89,199, 96, 66, 66, 16, 68, 43,127,127,255, 91, 55,111,222,244,200, 15,134,101, 89, 88,
-173,127, 31,234,236,188, 28,254, 16, 94, 37, 7,166, 40,170,111,219,182,109, 9,189, 94,239, 20,144,224,112, 56,160, 40, 10, 20,
- 69,225,219,111,191, 21,181,111,223,126,182, 64, 32,152,193,227,241, 10,109, 54,219,214,146,146,146,133, 0,116, 79, 82,139,212,
-173, 91,183,105,233,233,233, 3, 34, 35, 35,247, 61, 2, 13,107,179,217, 44, 0, 68, 20, 69,113,107,161,141,162, 28,247, 86,137,
-155,216,183, 59,246, 5, 40,157, 38,246, 8,193,193,193, 63, 28, 60,120, 48, 60, 50, 50, 18, 54,155, 13,118,187, 29, 6,131, 1,
-199,143, 31,135,217,108,134,221,110, 71, 84, 84, 20, 62,249,228,147,146,119,222,121, 71,184,102,205,154, 60,131,193, 48,178, 26,
-218,119,118,236,216, 33, 81,169, 84, 34,147,201,132,123,247,238,161,109,219,182, 40, 42, 42,130,209,104, 68,113,113, 49,172, 86,
- 43, 10, 11, 11, 3,104,154,182, 84,195,245,177,187,200,154, 48, 97,194, 53, 62,159,223,246,237,183,223, 70, 70, 70,134,235,153,
-127,227,141, 55,160, 84, 42, 93,207,146,163, 77,246,170, 97,230,112, 56, 16, 8, 4,224,241,120,186,186,117,235,130, 32, 8,225,
-131, 7, 15,106, 50, 21, 39, 3, 80,200,229,114,249,238, 2, 75, 32, 16,224,220,185,115, 31,242,249,252,202,172, 89,149, 61,151,
-172, 55,251,255, 54, 8,130,248,146,199,227, 9,228,114, 57,207,109,192,201,147, 74,165, 80, 40, 20, 43, 0,244,247,240,188,219,
-200,229,114, 87,251,222,186,117,107,164,167,167,239,214,235,245,175,229,229,229,129, 36,201, 77, 36, 73,190,226, 28,164,106,181,
- 90, 68, 68, 68,180,169,140,175,115,108,232, 68, 16,108, 25,139, 86,185, 1, 26,100, 50, 25, 82, 82, 82, 96, 52, 26,217,228,228,
-100, 98,210,164, 73,132,197, 98,249,254,210,165, 75,127,162,116,181,125,165, 90,228, 41,129,247, 62, 90, 78,139,150,167, 29, 0,
- 65, 16,213,142, 38,108, 54,155, 52, 58, 58,186, 34,135, 47,162, 34,161,229,152, 78,170,209,141,206,229,114,253,106, 42,182,202,
- 99,223,206, 31,149, 75, 62,153,245,137, 60,172,126,163, 25, 51, 62,230,188,248,226,139,103, 55,110,220, 72,203,155,247,239,125,
-244,215,205,202,175,222,157,121,232,224,193,131, 64,169, 99,180,167, 56,181,127,255,254,208,233, 83, 38,227,147,247,222,249, 69,
- 22, 21,204,151, 18,114,137,208,108,204,151,130, 53, 9, 26, 55, 27,176,107,223,190,108, 0,151,170, 34, 17,139,197,145,137,137,
-137, 81,238, 11, 9, 44, 22, 11,196, 98, 49,142, 30, 61, 26, 34, 18,137, 66, 0,192,100, 50, 33, 38, 38,198, 83,139, 73,228,237,
-219,183,163,252,252,252, 80, 92, 92, 12,179,217, 12,155,205, 6,134, 97, 64, 16, 4,184, 92, 46,248,124, 62, 36, 18,137,183, 43,
-251,174, 0,120, 53, 46, 46,110,203,161, 67,135, 16, 29, 29, 13,173, 86,139,164,164, 36,167,200,242,202, 71,203,105, 37,114,247,
-199,226,112, 56,248,161, 97, 67,188,145,149,229, 18, 48, 95,250,251,227, 19,166,102,217, 52, 98, 98, 98,216, 83,167, 78,225,151,
- 95,126,193, 75, 47,189, 68,236,217,179,199, 74,211, 52, 47, 43, 43,235, 90, 86, 86,150, 71, 28, 12,195,184,202,234,108,183,221,
- 5,150,183, 66,203,110,183,251,241,249,124,148,148,148,192,105,121,112,223, 26, 52,104, 0,141, 70,195, 41, 44, 44,228,100,101,
-101,137, 23, 44, 88,240,246,177, 99,199, 84, 69, 69, 69, 35,254,205, 86,104,213,170, 85,145,111,188,241, 70, 26,135,195, 97,251,
-245,235, 55,234,193,131, 7, 47,171, 84,170, 35,127,252,241,199, 23, 0,154,120,203, 23, 28, 28,124,145,195,225,132, 23, 22, 22,
-242,182,111,223,110, 43, 42, 42,226,133,132,132,228, 58,219, 14,103, 93,219,108, 54,143, 86, 46, 7, 7, 7, 95, 84,171,213,188,
-111,190,249,198, 86, 80, 80,192, 83, 42,149,185, 78, 30,157, 78,199,219,190,125,187,173,176,176,144,231,239,239,127, 81,175,215,
- 87,203,167, 86,171, 71,142, 30, 61,250,228,145, 35, 71,130, 41,138,194,131, 7, 15, 80, 80, 80,128,128,128, 0,108,218,180, 9,
-145,145,145,216,177, 99,135, 70,163,209,140,255,252,243,207,103, 59, 68, 86,117, 62, 90,221, 59,116,232, 16,169,211,233, 16, 16,
- 16, 0,163,209,136,139, 23, 47,162, 69,139, 22,200,202,202, 2, 73,146, 8, 8, 8,192,202,149, 43,139, 9,130,208, 84, 69, 36,
- 18,137, 94,142,143,143, 15, 0,128,248,248,248,128,248,248,248, 10, 59,184, 78,157, 58, 97,197,138, 21,229,133,150, 55, 3, 3,
-151,213,201, 77, 28,149,116,236,216, 17,199,142, 29,155,233,165, 56,178, 56, 69, 91,121,107,150, 64, 32,240,122, 49, 13,195, 48,
- 60,148,186, 52, 16,158,236, 63, 1,232, 33, 18,137,120,229, 63, 44, 46, 46,230,169, 84,170,110, 94, 8,223, 32,145,168,212,224,
- 20, 25, 25, 9,189, 94, 79, 91, 44,150,225,155, 55,111,182, 1, 64,108,108,236,112,154,166, 75,236,118, 59,197,231,243, 97, 52,
- 26,161, 80, 40,130,170,176,141,190,191,119,235,130,208,242, 62, 90, 42,149, 10,177,177,177, 48,155,205,200,206,206,198,241,227,
-199,109, 52, 77,111, 89,181,106, 21, 19, 18, 18,242,250,224,193,131,169, 75,151, 46,189, 5, 96, 90,101, 90,228, 41,179,102, 37,
- 84, 42,180, 28, 10,242, 24,128,158,229, 79,178,188,248,169, 74,104, 85, 55,117,200,231,243,117,105,105,105, 18,247, 78,197,110,
-183, 35, 44, 44,140, 97, 89,150,168, 72,104, 61,138, 41,152,203,229,250,125,240,193, 7,186, 85,171, 86,141, 76, 73, 73,153,227,
-201,111,182,191,213, 12, 27,203,137,172,213, 75,230,173,248,102,201, 2,249,221, 95,190,199,186,175,151,209, 52,141, 75, 45, 91,
-182,236,102, 48, 24, 56,254, 18, 27,212, 58, 28,114,136, 44, 79, 69, 33, 9,224,187,243,231,207, 95,234,223,191,255,233,239,126,
-218, 37,207,186,119,239, 79, 65,161, 58, 91,214, 56,138,195,171, 19,249, 74, 81, 73, 9,111,248,240,225, 33, 0, 6, 87,215,136,
-233,116, 58,228,228,228,148, 23, 96,184,117,235,214, 67,199,122, 84, 56,146, 4, 77,211,216,185,115, 39,196, 98, 49, 36, 18, 73,
-153,205, 41,178,106,184, 80,225, 54, 0,244,235,215, 15, 26,141, 6, 82,169,212,227,114,149, 23, 47, 44,203,194, 98,177,192, 98,
-177,192,106,181,210, 0,184, 28, 14, 7,227, 50, 50, 92, 86, 30,111, 4, 76,121,180,108,217,146, 61,115,230, 12, 78,159, 62, 13,
-163,209,136,111,190,249, 6, 42,149,234, 89, 0, 31,123,203,229,230,164, 79, 23, 22, 22,114, 11, 11, 11, 93,214, 65, 46,151,235,
-178, 30,120,104,201,227,113, 56, 28,215,104,212,185,185, 91,181, 40,138,130, 82,169, 68,104,104, 40, 86,175, 94,205,171, 95,191,
-254,128,127,179, 5, 90,186,116,105,227, 47,191,252,114,253,198,141, 27, 15,141, 28, 57,114,219,245,235,215,199,250,251,251, 95,
- 59,122,244,232, 2,129, 64,192,212,240,249, 14,207,202,202, 82,184,127,196, 48,140,216,110,183,187,132,109,113,113,177,199, 3,
- 12, 46,151, 27,158,152,152, 40, 6,128, 5, 11, 22,112, 1,136,157,206,224, 78,206,226,226, 98,110,139, 22, 45,194, 61,189,215,
- 79,158, 60,217,173, 79,159, 62,103,126,255,253,247,192,200,200, 72,100,102,102, 34, 51, 51, 19,141, 27, 55,198,162, 69,139,140,
-133,133,133, 93, 0,220, 54, 24, 12,123, 60,228, 12, 11, 12, 12,228,166,165,165,193,110,183,163, 77,155, 54, 88,185,114, 37,134,
- 15, 31,142,152,152, 24, 20, 22, 22, 34, 49, 49, 17, 27, 54,108, 8,228,241,120, 85,182, 29, 38,147,105, 79, 66, 66, 66, 68,121,
-139,214,168, 81,163, 36,185,185,185,174,123,114,222,188,121,101,166, 16,189,105,147, 29, 83, 91,149,110, 53,129,221,110,151, 9,
-133,194, 66,129, 64,192,119,250,103, 29, 63,126,220,107,107, 86,185, 1,160, 55,251,255, 26,156,162,181,130,190, 21,161,161,161,
- 30,243, 8, 4, 2,194,217, 54,218,237,118,232,245,122, 90,165, 82,185,166,247, 47, 95,190, 76,215,171, 87,143,166, 40,138,226,
-243,249, 32, 8, 2, 98,177,184,210, 6,159,165,217,121, 47, 14,255,184,204,170,195,169, 31, 0, 86,171, 21,151, 47, 95,134,213,
-106,197,241,227,199,109,159,127,254,121,150, 78,167,155, 10,128,243,235,175,191,142,158, 57,115, 38,165, 80, 40,250,228,229,229,
-161, 58, 45,242, 20,137,173,135,172, 92,206, 94,232,216,128, 1, 3, 8,199,210, 74,194, 41,156,188, 17, 90,142,135,175,218,158,
-151, 32, 8,100,103,103,187,246, 21, 10,133,215,255,229, 41,130,130,130,140,157, 58,117,242, 83,171,213,123,150, 46, 93, 90, 35,
- 75,214,234, 37,243, 86, 44,158,255,169, 92,115,243, 44, 50,178,178,161,201,179, 93, 58,117, 45,101, 55,128,221, 0,128, 53,205,
-143, 17, 19,147,190,245,148,179, 89,176,168, 53,151,199,217,253, 92,255, 1, 17,195,226,167,145,111,190,249,102,215,209,163, 71,
-235, 71,142, 28, 57, 69, 42,149, 54,177, 90,173,218, 93, 7, 14,164, 14, 27, 54,172, 62, 77,211,163, 81, 77,204, 17,147,201,244,
-160,103,207,158,238,245, 41, 59,124,248,176, 50, 53, 53, 21,147, 39, 79,206,207,204,204,212,185, 31,235, 73, 25,173, 86,235,131,
-214,173, 91, 87, 58, 93,232,156, 82, 4,128,162,162,162, 7, 94, 84,233, 8, 56, 28,223, 11, 10, 10,112,235,214, 45,112, 56, 28,
-116,236,216, 17,167, 78,157, 66,215,174, 93, 47,123, 99,213, 42, 41, 41, 65,100,100, 36, 74, 74, 74, 96, 52, 26,139, 1, 8, 54,
-213,175, 15, 0,120,171,160, 0, 23, 63,255, 28,103, 23, 47,134,251,253,236, 41, 90,181,106,197,158, 61,123, 22,215,174, 93,131,
-217,108,198,248,241,227, 1,128,112,220,187,222,132,204,104, 72, 81, 84,191,254,253,251,135, 1,128,209,104, 36,206,159, 63, 15,
-161, 80,232,122, 22,246,237,219,135,204,204, 76, 16, 4,129,192,192,192,112,173, 86, 91, 31, 64, 74, 21,102,127, 34, 37, 37, 5,
-159,125,246, 25, 24,134,193,204,153, 51, 17, 21, 21,229, 18, 88, 15, 30, 60,192,130, 5, 11, 64,211, 52, 62,253,244, 83, 52,110,
-220, 24, 54,155, 77,136, 26,134,208,168, 13, 76,159, 62,253,238,238,221,187, 15,165,167,167,191,176,100,201,146, 30, 4, 65, 48,
- 51,102,204,248, 76, 38,147,209,143,194,171,213, 23,225,214,157, 7, 46, 33, 84,126, 11, 9,150,123,205,151,124, 47,221,245,123,
-154,118,231,163, 17, 36, 15,244,182,136,197, 54,155,205,248,202, 43,175, 4,236,220,185,147,104,220,184, 49,238,223,191,239,180,
- 12, 21,195,251,144, 14,153, 26,141, 38,138,162, 40,222,157, 59,119, 80,175, 94, 61,116,232,208, 1, 11, 23, 46,132, 90,173,134,
-221,110,135, 66,161, 96,108, 54,219,101,171,213,122,162, 26,174,121, 19, 38, 76,224, 1,152,232,176,108,181,156, 58,117, 42,179,
-108,217, 50, 92,190,124,217,101,193,114,119,134,247,118,234,208,221,234,228,190, 29, 63,126,124, 38,159,207,103, 1,156,131,247,
-129,158, 45,229, 45, 90, 53,177,102, 61, 46, 60,206,149,140, 42,149,234,184,159,159,223, 0,173, 86, 91,198,170,213,165, 75, 23,
-171, 82,169, 60,233, 41,143, 84, 42,213, 82, 20, 21, 4, 0,153,153,153,144, 72, 36,188,123,247,238, 45, 70,105,240,108,212,175,
- 95,127,177, 70,163,225,213,119,180,167,161,161,161,176, 88, 44,149,186,177,252,121, 37,247,123, 0,223, 59,247,229,114,121,182,
- 94,175, 23, 45, 91,182,204,176,120,241, 98, 19, 77,211,102, 0, 71,117, 58,157, 43,142, 86, 78, 78,142,158,203,229,202, 3, 2,
- 2,234, 56,133, 86, 69, 90,228, 41, 67,229, 22, 45,135,146,100,203, 11, 34,130, 32, 30,114, 80,175, 70,104, 85, 43,178,104,154,
- 46, 99,101,112, 58,188, 87,244, 95,142, 78,189, 70, 83,135, 14,145, 37,220,181,107,215,166,165, 75,151,158,243,244,119,238, 62,
- 90,107,190,152,191,196, 41,178,254, 58,253, 59,246, 36,233,213, 51, 23, 47,255,178,166, 87,160,121,176,184,149, 82, 25,116,236,
-243, 69,243,100,119,127,217,128,109,107,254,195,254,117,225, 66,251, 11, 23, 46,188, 54,121,242,228,186,142, 27, 75, 3,224, 42,
-128, 97,240, 96,149, 78,102,102,102,223,114,157,240,109, 30,143,167, 20,139,197,200,204,204, 52, 36, 39, 39,123, 61, 37,163, 86,
-171,251, 62,134, 27,144,227, 20, 89,106,181, 26,137,137,137,232,213,171, 23, 0,224,212,169, 83,232,210,165, 11, 46, 93,186,132,
-182,109,219, 94, 6,240, 12,170, 9,212,106,179,217,116,205,155, 55,119, 89,183,244,122, 61, 3, 0,241,217,217, 72, 80,169,192,
-225,112,112,118,241, 98,124,100,179, 97,161,151, 2,190,117,235,214,236,249,243,231,145,154,154, 10,187,221,142,129, 3, 7,162,
-134, 15,125, 76,179,102,205, 14, 31, 61,122, 52, 68, 42,149,194,104, 52,194, 96, 48, 96,204,152, 49, 24, 62,124, 56,204,102, 51,
-182,111,223,142,189,123,247,194,207,207, 15, 70,163, 17, 70,163, 49, 48, 46, 46,238,204,237,219,183,187, 3,184, 83,137,208, 98,
-251,246,237,139,147, 39, 79,130,162, 40,180,111,223, 30, 5, 5,127, 47, 6, 82, 42,149, 21,125, 71,253,155, 66,139,195,225,176,
-199,143, 31, 95,210,163, 71, 15,164,167,167,191,208,182,109,219,111,198,142, 29,155,249,168,188,129,254,126,104,221,162, 33,204,
-102, 51,204,102, 51,194,194,194, 80, 84, 84,132,187,119,239,194,108, 54, 67,169, 8,240,154, 47, 54,166,177,139, 79,161, 80,192,
-104, 52, 34, 37, 37, 5, 22,139, 5,193,193, 94, 9,173,136,190,125,251,254,177,101,203,150,160, 13, 27, 54, 88,122,246,236,201,
-255,230,155,111, 8,153, 76, 6,183,142,197, 91, 28, 63,117,234, 84,100,159, 62,125,154,222,188,121, 19,199,143, 31,135,197, 98,
- 65,108,108, 44,146,147,147,209,169, 83, 39, 24, 12,134,115, 23, 46, 92,216,235,137, 97, 24,192,236, 9, 19, 38,192, 41,182, 78,
-158, 60,137,236,236,108,248,249,249, 61, 36,180,156,190,143,142, 85,227, 97,158, 20,214, 41,136,220, 44, 79, 31, 5, 4, 4, 88,
- 1,124, 89, 67,235, 19, 0, 32, 61, 61, 93,208,178,101, 75,179, 80, 40,228, 59, 68,219,242, 71,225,171, 77,212,194, 74,198, 74,
- 17, 26, 26, 58, 53, 56, 56,184, 79,131, 6, 13,144,155,155,203,227,243,249,232,210,165,139,245,153,103,158,177,134,134,134,190,
-229, 41,143, 64, 32,184,201,227,241,186,151, 14, 38,104,164,165,165,129,101,217,153, 49, 49, 49,239, 20, 21, 21,161,160,160,128,
- 47,147,201, 92,131,234,166, 77,155,194,108, 54,223,244,194,242, 54,175, 94,189,122,179,121, 60,222, 66,181, 90, 93, 81, 88, 8,
-126, 64, 64,128,140,199,227,193,106,181,150, 17,155,229,181,200,211, 46,178,202, 8, 45, 55, 21, 89, 70,232,120, 99,209,242,196,
-106,224,116,176,119,223,119,138,186,242,255, 85,211, 24, 90,254,254,254,102,167,200, 90,184,112,225,185,154,112,236,216,178, 89,
-229,207, 20, 71,100,157, 59,136,219,215, 46, 97,119,162, 78, 61,115,241,242, 41, 47, 14, 30,145, 91, 94,152,121,130,168, 16,113,
-140, 82, 17,116,236,139,165,139,101,154,155,103,145,157,147,131,131,231, 46, 92,178, 2,137, 0,102,214,166,105, 25, 40,157, 58,
-164, 40,234, 73,186, 97, 93,206,240,217,217,217, 78,145, 21, 11, 0, 93,187,118,189,236, 16, 89,240,212,162,165,211,233,202,167,
-172,233, 3, 32,216,121,254, 28, 14, 7, 93,102,207,246, 90,100, 1, 96, 47, 93,186, 4,141, 70,227, 28, 41,214, 84,100, 33, 52,
- 52,244,189,163, 71,143,134,124,247,221,119,133, 27, 55,110, 44, 96, 24,134,219,186,117,235,240,118,237,218, 17,155, 54,109, 2,
- 0, 12, 27, 54, 12, 51,103,206,196,141, 27, 55, 32,145, 72,208,181,107, 87,122,206,156, 57,138,169, 83,167,190,149,155,155, 59,
-165,194,222,145, 97,120, 66,161,240, 8,128,103,111,222,188, 9, 0,103, 80,154,194,201,105, 69,168,244, 59, 79, 58,223,162,162,
- 34,174,159,159, 95,133,161, 33,120,165,163, 33,111, 45, 16, 46,206,211,167, 79,127,246,197, 23, 95,236,126,247,221,119,239, 60,
- 34,103,133, 22,173, 1, 3, 6,192,100,182, 34, 35, 87, 15,154,182,195,100,205,243,154,207,221,162, 53, 96,192, 0, 20,151, 88,
-144,150,173,129,221, 78,163,200,228,113, 95, 46,126,238,185,231,126,221,186,117,107,232,159,127,254, 9,154,166,153,228,228,228,
-148, 87, 94,121, 69, 54, 99,198,140,160, 71, 88,100,244,245,136, 17, 35,134,156, 62,125, 90,211,180,105, 83,249,185,115,231,144,
-151,151, 7,187,221,142,103,159,125, 22,124, 62, 63,109,241,226,197, 60, 0, 95,123,122,109, 28, 98,203,122,225,194,133, 55,206,
-158, 61, 43,151,203,229,124,166, 89, 51,100,255,254, 59,118,238,220,249,208, 15,214,172, 89, 3,120, 24,133,223,105,113, 58,127,
-254,124,173, 8,172, 50, 61, 53,159, 95,227,233,199,167, 21,231,207,159,207,124,243,205, 55, 91,200,100,178, 47,187,117,235,214,
- 43, 40, 40,136, 12, 12, 12, 60, 94,167, 78,157,119, 90,183,110,237,241,236, 2,151,203, 29, 43,145, 72,238,218,237,118,202, 96,
- 48,192,104, 52,150, 54,210,118, 59,159, 36, 73,212,175, 95,223,213,151,180,111,223, 30,161,161,161,116, 82, 82,210, 88, 79,249,
-243,243,243,203,172, 66,172, 0, 19,186,116,233,194, 49,155,205, 72, 77, 77, 61,229,254, 69, 69, 90,228, 41, 65,124,149,226,203,
-121, 82,238, 39, 87,167, 78,157,116,155,205,198, 38, 2,236,213,171, 87,217,248,248,248, 42,183,146,146, 18, 86,161, 80,100, 87,
-208,249,193,157,211,108, 54,151,249,157,217,108,102,149, 74, 37,109, 50,153, 30,226, 52,153, 76,108,120,120,120,102, 85,156, 21,
- 96,204,149, 43, 87, 86,125,244,209, 71, 29,188,168, 32, 23, 39,187,186, 25,187, 97,195,134,255, 99, 89,182, 71,183, 22,145,215,
-134,182, 86,178, 93,162, 20, 89,123,119,108, 25,206,178,108,143,242,155, 51,192,105, 85,156,205,148,146,230,189,163,235,106,255,
-250,229, 71,246,232,178,183,217, 47, 6, 70,177,109,195,253,116,205,130, 69,222,230,136,169, 54, 91,122,116,116,244,109,134, 97,
- 88,139,197,194, 70, 71, 71, 39,215, 6,103, 13, 80, 21,103, 27,148,250,178,141,168,224,179, 54,143, 80,206,191, 88,150,101, 53,
- 26, 13,107, 48, 24, 88,179,217,204,210, 52,205,186, 3,192, 95, 30,112,178, 86,171,149,213,106,181, 44, 60,247,185,171,144, 83,
-165, 82,165,220,187,119,143,109,212,168, 81,186,195, 28, 63,213,104, 52,178,229, 97, 52, 26,217, 94,189,122,177,201,201,201,108,
-189,122,245, 74,146,147,147, 89,149, 74,117,171,154,114, 54,136,136,136, 56, 18, 28, 28,124, 28, 64,148, 23,223, 85, 89,159,219,
-183,111,111,200,178,236,120,150,101,227, 43,217,198,179, 44,219,236,223,230,116,212,111, 46,203,178,108,113,113, 49,171,209,104,
-216,172,172, 44,182,184,184,152, 53, 24, 12,236,149, 43, 87,216, 63,255,252,147,189,118,237, 26, 43,151,203,115, 61,225,116,242,
- 89, 44, 22,182,176,176,144,205,203,203, 99, 77, 38, 19,107, 52, 26,217,235,215,175,179, 23, 47, 94,100,111,222,188, 89, 17,223,
- 67,156, 65, 65, 65,107,114,114,114, 12,103,206,156, 41, 94,189,122,117,113,104,104,232, 77, 0,145, 0,154, 4, 6, 6,230,188,
-253,246,219,172, 84, 42,125, 80,195,231,168, 5,151,203,189,178,100,201,146,243,251,247,239,207,221,187,119,175,101,253,250,245,
- 25,147, 39, 79, 62,193,225,112,174, 0,104, 81,195,231, 72, 17, 16, 16,112,230,220,185,115,118,173, 86,203,234,116, 58,182,176,
-176,144, 53, 26,141,172,201,100, 98, 45, 22, 11,107,179,217,216, 19, 39, 78,176, 74,165,210,125, 90,242,253, 42, 6,214,211, 88,
-150,125,143,101, 89, 78,109,183,117,110,220,221,106,139,179, 54,218, 58,146, 36,173,142,182,163, 99,233,110,213,251,255, 86, 57,
-123,247,238,253,233,240,225,195,217,126,253,250,177,177,177,177, 15,109,109,219,182,101, 39, 77,154,196,238,223,191,159,253,252,
-243,207, 63,173,133,114,114, 80,186,232,101, 81,239,222,189,109, 39, 79,158,100,135, 13, 27,198, 2,232, 91,149, 22,249,111, 16,
- 92,206,240, 14,132,251, 43, 0, 88,173,214,244,219,183,111,171,154,218,237, 20, 0,124,251,237,183, 15, 89,166,220,113,242,228,
- 73, 59, 65, 16,119,171,250,119,171,213,154,126,244,232, 81,229,138, 21, 43,184,110, 38, 96,216,237,118, 38, 43, 43,139,252,230,
-155,111,202, 28,127,236,216, 49,187,221,110, 79,243,242, 36, 55,180,105,211,102, 67,109,212,214,137, 27,169,239,252,122,240,231,
-224,142, 29,186,233,100,114,121,133,163,176,237,111, 53, 3, 49,177,106,171, 22,193, 33, 23, 46, 89, 52, 47,192, 57, 5,249,211,
-229, 28, 93,137,153,238,149,164, 54,253, 85,219, 87,216, 96, 48,164, 58, 87, 2, 26,141,198,180, 39,240, 38,188,130,210, 24, 87,
-246,114,159, 61,131, 71,116, 58,101, 24, 6,254,254,254, 46,107,104, 13, 44,162,172,211,194,234,188,116,143, 82, 30,150,101, 79,
- 95,191,126,189,222,152, 49, 99,252, 54,110,220,120,143,166,105,238,184,113,227,172,161,161,161,188, 83,167, 78,217, 0, 16, 61,
-122,244,224,228,228,228,176,153,153,153,154,151, 94,122,169,232,141, 55,222, 8,186,122,245, 42,159, 97,152,234,130, 22,222, 79,
- 79, 79,239, 93,131,239,170,196,208,161, 67,239,225,209,211,216, 60,118, 78, 39, 52,186, 66,220, 75,205,116, 68, 48,103, 64, 63,
-200,117,249, 85,217,108,118,104, 10, 11,188,182,104,221, 77,201,116,164, 24,163, 65,211, 89, 14,190, 82,135,120, 86, 91, 92,125,
-111,194,225,116,157, 51,103, 78,127,146, 36,201,179,103,207,154,151, 46, 93,154,158,159,159, 63, 16, 64, 26, 0,104,181,218,158,
- 27, 54,108,248,193,131, 80, 14,149, 33,209,102,179,117,122,255,253,247,167, 0,232, 10,160,174,131,251,148,195,146, 85,211, 8,
-230,121, 58,157,238,249,254,253,251,255, 78, 81, 84,125,183,231, 40, 24,128,218,249, 92,176, 44,171,200,205,205,125,193, 19, 66,
-130, 32,150, 63,174,134,228,113,114, 63, 98, 59,244, 84,172,100, 60,114,228,200,220,129, 3, 7,114, 34, 35, 35, 63,140,140,140,
- 36,181, 90, 45, 12, 6, 3, 72,146, 68,104,104, 40,162,163,163, 17, 26, 26,202,220,188,121,115,209,172, 89,179,170,141,201,215,
-188,121,243,134, 54,155,173, 17, 73,146, 13, 1, 52,100, 89,182, 33, 65, 16, 13, 1,200, 1, 64, 38,147,201,234,213,171,199,233,
-216,177, 35, 58,116,232,128, 99,199,142, 97,199,142, 29,223, 3,248,213,221,154, 85, 94,139, 60, 9, 72,108, 3,182,197, 21, 16,
- 55,218,162, 7,193,224, 24, 75,162,103,244, 37, 87,156,189,242, 34,171,242,164,210, 21,152,254,250, 62,251,236,179,174, 7,206,
-131, 78, 37,181,186,135, 47, 63, 63,191,239,216,177, 99,203,112,210, 52,109, 46, 40, 40,120,179,115,231,206, 43, 41,138, 18,148,
-187, 97, 31,228,229,229,253,163,185,250,202,199,209,234,219,255,101,245,163,114, 74,121,100,163,219, 7,214, 34, 55, 79,141,159,
- 46,231,104,139, 44,116,207,100,117,241,245,199, 81,254, 7, 15, 30,244,123, 10, 20,127, 69,162,245, 81,147,103,231,123, 16,144,
-180,186, 28,117,132, 35,156, 72,173, 60,228, 57, 57, 57,203,102,207,158,253,252,162, 69,139, 66, 14, 29, 58, 36,115, 14, 80, 6,
- 13, 26,148,119,253,250,245,110, 0, 4, 37, 37, 37,135, 23, 45, 90, 20, 50,111,222,188, 32, 0, 65, 0, 16, 23, 23,151,155,155,
-155,187, 2, 62, 84, 9,155,205,150, 17,221,188,169,107,224,231, 30,210,193,253,189,221,110,207,240,134,175, 34, 30,247,125,154,
-166,171,228,163, 40,234,221, 14, 29, 58, 80,239,190,251,110,238,161, 67,135,156,137,116,221, 21,218,237,106,130,146,122, 2, 51,
-128,165,142,173, 54, 97,212,104, 52,157,188,252, 13,237,187, 27, 43, 28, 80,122,179,255,175, 96,207,158, 61, 31, 15, 27, 54,108,
-131, 92, 46,223,220,176, 97,195,166, 74,165, 82, 38, 18,137, 96, 54,155,139, 44, 22,203,173,219,183,111,143,252,248,227,143,239,
-123,100,225,216,176,129, 2,192, 99, 24, 70, 72,146,164, 4,128,140, 32,136, 64,167,208, 34, 8, 2, 86,171, 21,169,169,169,248,
-232,163,143,232, 35, 71,142,124, 14,224, 83, 47, 6,174,207, 0, 8,113,107,199, 67, 0, 88, 80, 26,192, 54,159, 32,136, 11,143,
-187,190, 8, 6,199, 90, 92, 1,145,216, 6, 21,245, 19, 85, 39,149,174,236,129,203,207,207,239, 84,219, 15,113,101,156,249,249,
-249,145, 79,202, 19, 50,218,188,244, 71,172, 89, 90, 38,207,161, 83,132, 85,180, 95, 29,244, 38,251,228,175,127,189,177,204,108,
-103, 25,171,157,121, 61, 57,191, 56,209,215, 14,213, 58,158,171,173,103,169, 22,203,116, 61, 41, 41,169,243,228,201,147, 63, 22,
-139,197,237, 1,160,184,184,248,108, 86, 86,214,124, 56, 86, 21, 86,247,189, 15,149, 67,173, 86,183,123, 18,249, 44, 22,203, 59,
-157, 59,119,254,138,166,233, 47,236,118,251,169,255,129, 75, 81,226,187, 27,159, 94,108,219,182,237, 62,128, 78, 0, 48,100,200,
- 16, 10, 0,118,236,216,225,181,120, 30, 51,102, 12,205,178,172,213,113, 63, 24, 81,186,186, 80,235,108, 83,141, 70,163, 54, 43,
- 43,235, 38, 77,211, 55, 1,252, 0,239, 87,220,134, 16, 4,177,159,101,217, 1, 14,225,182,159,101,217, 1,238,159, 61,110,171,
- 86, 53,135, 84,239, 12,239, 67, 41,118, 36,130, 40, 63, 21, 88,221,126,117,184,157,107, 60, 14,160,173,175,118,255, 39,113, 47,
- 43, 43,107,244, 35,124,239,195,211,135, 52,139,197, 50,240,127,232,124,245,190, 75,254, 95,210,255,213, 64, 96, 57,113,243,230,
-205,199,230, 34,240,111,163,197,149,178, 3,240,242,251,110,136,175, 72,120,249,132,150, 15, 62,248,224,131, 15,143, 2,157,175,
- 10,124,248,111,134,211, 55,203,185, 95,137,143, 86,121,255, 44,215, 62,129,202, 87, 14,120,147,149,188, 38,171, 36, 14,251, 56,
-125,156, 62, 78, 31,167,143,243, 95,231, 12, 0, 80, 15,192,146,106,142, 43,191,186, 48, 23,128, 26,128,205, 87,159, 62,206, 71,
-208, 15, 30,129,101,217,184,170,166, 14, 9,130, 56,240,184,132,150,203, 25,190, 13,230, 68, 95,193, 28,231,190,167, 66,235,113,
-163,143,143,211,199,233,227,244,113,250, 56,125,156, 62, 78, 31,231, 35, 10,173, 94,179,102,205,250, 0,165,161, 49,216, 89,179,
-102,125,192,178,108, 92,233, 87,108,220,227,252,239, 27,109,209, 35,177, 13, 88,231,118,163, 45,122, 84,114,104,188,219,230,130,
-111,234,208, 7, 31,124,240,193, 7, 31,124,120,210,113,102,241,226,197,197,139, 23, 47,118, 58,190,231, 3, 32, 28, 22,174,252,
-199,249,199,142,105, 66, 79, 22, 74, 85,157,130,231, 95, 64, 24,201,225,141,226,242, 4,189,192, 50,209, 0, 0,146,186, 65, 91,
- 74,254,176,219,173,155, 1,100,213,148,184, 25,208,188,113,128,104,175,153,166,121,233, 69,150, 33, 73,165,105, 14,188,198, 16,
-160,139,128,207,255, 77, 16, 16, 32,170,232,123,179, 78,103, 50, 91, 44,207,239, 0, 78,251,158, 1, 31,124,240,193, 7, 31,158,
- 18, 72, 2, 3, 3,143,144, 36, 25,233,252,192, 61,238, 96,249, 24,132, 52, 77,103,107, 52,154,231, 81, 58, 85,252, 79,114,186,
-255,222,130, 26,246,229,181, 13,111,167, 14, 57, 64,153, 40,172,255, 72,198,108,138, 43,120,195,207, 63, 96,225,255,141,125, 39,
- 40,170, 73, 83, 34, 34,162, 14,192, 2,105,233, 25,202,187,119,146,123,111,219,248,245,244, 66,189,230, 35,155,217,188,214, 91,
-238,230,128,164,174, 84,112,106,237,172, 87, 3, 56,176, 99,196,130, 45,191, 16, 6,107,196,205,210,229,166, 94,137,172,128,160,
-160, 95, 23, 31, 62, 44, 10,108,213,170,204,119, 44,203,150,230,215,251,235, 47,209,135,207, 63,255,235, 16,141,166,175, 79,108,
-253, 87, 34, 84, 38,147, 77,229,114,185, 61,173, 86,107, 36,159,207, 79,167,105,250,184, 86,171,253, 18, 64,166,175,122,254,187,
-209, 52, 84,210,173,105,195,200, 45, 89, 57,185,151, 11, 75, 44,227,110,103, 25, 52,190, 90,241, 26, 85,229,215,252,215,114,111,
- 2,128, 84, 42,189, 72,146,100,184,187, 8,112,230,236,117,238,151,127,101, 24,230,190, 70,163,233, 92, 5,109, 67,185, 92,190,
- 18,192, 51,213, 5, 76,118,196,102,187,160,209,104,222, 68,229,171,245,252, 2, 3, 3,231, 18, 4, 49,148, 36, 73,170,186,115,
- 98, 24,134,102, 89,118,187, 86,171,253, 20, 64, 81,101,199, 5, 6, 6, 30, 78, 74, 74,122, 70,161, 80, 84,107,165,177,219,237,
- 72, 75, 75, 11,105,223,190,253, 9,141, 70,211,236,113,114,254,211, 90,164,166,168, 98,213, 97,165, 55, 58,128, 50,249,133, 30,
-107, 68, 86,158, 80,186,183, 83,247,190,189, 38, 77,121, 87,114,229,250, 45,252,118,236, 79, 20, 26,205,160, 72, 18, 1,126, 98,
- 52,105,210,136, 88,158,176, 51,248,251,213,203,191, 56,123,242,247,184, 18,163,254, 37,175,100,186,152,243,209,204, 87,218, 75,
-130,228, 52,192,208,120,175,127,107,201,135,251, 47,127,132, 98,251, 7, 94,139,172, 35, 71,196,121,185,185,152, 23, 22, 6,142,
-221, 14, 33, 73, 66, 72, 16, 16,146, 36, 36, 66, 33,250,173, 95,143,249,135, 14,137, 63,126,225, 5,159,216,250, 47,131, 84, 42,
- 29, 27, 22, 22,182,116,221,186,117, 65, 13, 26, 52,128, 68, 34,129, 70,163, 9,190,125,251,118,155,105,211,166,141,206,206,206,
-158, 93, 88, 88,184,198, 87, 83,255,189, 96, 24,140,250,110,225,155,117,178, 31,220,169, 51, 97,209,143, 77,136, 32,186,231,173,
- 2, 83,142,175,102, 60, 70, 27, 0,151,248,250,153, 97, 0, 0, 32, 0, 73, 68, 65, 84, 81,113,254,210,170,190,171, 20, 66,161,
- 48,183,164,164, 68, 81,213, 49,124, 62, 63,207, 98,177, 40,171,227, 34, 73, 50, 60, 51, 51, 83, 33, 22,139, 65,211,180, 35, 27,
- 0,227, 26, 72,187,103, 63,113, 4,170, 69,179,102,205,172, 85,113,250,249,249,125,155,151,151,215,199,153, 39,208, 77, 80, 85,
-136,204,204,204, 62, 45, 90,180,248,182,168,168,232,249, 74,196,203,220, 41, 83,166, 76,141,137,137,113, 90,129, 28, 89, 16, 74,
- 95,213,106, 53, 38, 79,158,236,250, 15,134, 97,240,251,239,191, 79, 25, 59,118, 44,180, 90,237,180, 42,206, 61, 82,161, 80, 16,
-142,132,226,149, 98,206,156, 57,152, 51,103, 14,190,254,250,107,130,203,229, 6, 84, 83,159,181,194,249, 79,105,145,154, 88,176,
-170,137, 12,127, 0,101,125,179, 14, 60, 36,180,254, 9, 80, 92,193,235,207,116,238,211,115,242,212,153,146, 31,127, 62,138,219,
- 55,255, 66,210,169,173,101,142,105,247,252, 88,228,168,139, 48,118,210,123, 82,130,226,244, 60,121,120,207,235, 54,179,233, 59,
- 15,173, 89,202, 72, 1,255,237,142,237,163,185,153,162,219, 8, 13, 20,161,107,219,198,220,136, 95,175,189,109,132,253,171,155,
-165,171,100,188, 18, 89,235, 94,125, 21,221,108, 54, 40, 40, 10, 20, 65,128, 2, 64, 18, 4, 74,204,102, 92, 24, 53, 10,237, 55,
-109,194,167,251,246,137,231,190,248,162, 87, 98, 75, 34,145, 92, 33, 8, 34,208, 96, 48,196,161, 52,177,244,211,128, 22, 82,169,
-244, 0,203,178, 90,163,209,216,230, 9, 42,151, 10,165,115,244,229, 71,199, 60,148,174,168,242, 42,179,176, 64, 32,120, 99,200,
-144, 33,203, 87,172, 88, 33,206,205,205, 69, 86, 86, 22,104,154,134, 80, 40, 68, 84, 84, 20,113,248,240,225,160,153, 51,103, 46,
- 59,112,224,128,160,168,168,232, 43,111, 6, 54, 92, 46, 55, 65, 46,151,191,160, 84, 42, 37,121,121,121,197, 58,157,238,119,179,
-217,252, 6,106,158, 54,133,228,114,185, 35,235,213,171,247,114, 88, 88,152, 50, 51, 51, 83,157,145,145,177,215,108, 54,127,143,
- 26, 38,106,118,171,211, 86,112, 68,171, 7,144, 93,175, 94,189, 27,169,169,169,121,181,200,153, 85,175, 94,189,196, 26,112, 74,
- 0,108, 3, 16, 86,205,113, 89, 0,134,193, 75,107,182,171, 98, 89,230,224,130, 47,215,141,155, 55,166, 43,241,221,180, 62, 81,
- 19,191, 62,252, 39,201, 99,187,223,204, 46, 73,247,105, 40,207, 68,150, 35,165, 85,121, 65, 85,213,119, 85,194,108, 54,135, 88,
-173, 86,112, 43, 73, 22,111, 52, 26,225,231,231, 23,226,105, 33, 69, 34, 17,182,110,221, 10, 46,151, 11, 46,151, 11,173, 86,139,
-240,240,112,215, 62,143,199,115,189,175, 91,183,110,181,124, 52, 77,183,167, 40, 10, 6,131, 1, 52, 77,187, 54,157, 78, 7,150,
-101, 33, 16, 8, 64,211,165,233,156,220,190,111, 95, 25, 31, 65, 16, 67,195,194,194,240,227,143, 63,194, 98,177, 60,244,189, 76,
- 38,195,245,235,127, 39, 25,161, 40, 10, 29, 58,116, 32, 9,130, 24, 10, 96, 90, 21,188, 44, 0,196,199,199,131,162, 40, 80, 20,
- 5,146, 36, 93,239,157, 27, 77,211,152, 51,103, 14,202,165, 38,251,199, 56,159, 52, 84, 19, 25, 62, 27,149,248,104,145,143,185,
- 92,238, 75, 60,195,196, 18,217,103,111,190,243,158,244,192,137,107, 72, 75, 79,123, 72,100, 1,192,197,223,190, 71,118, 86, 38,
- 46, 39,101, 96,228,235,111, 73,101,178,128,207,202, 53,168,149, 46, 27,245,247,227,125, 62,107, 88, 87,161,193,150,133,162, 64,
-128,106,200, 7, 87,108,196,204, 1,173, 4, 50, 63,222, 82, 79,202, 41,224,243,127, 91,124,248,176, 75,100,117, 49,155, 33,160,
-105,216,105,218, 37,178, 44,118, 59, 76, 22, 11, 84, 6, 3,238,142, 29, 11,214,102,195,236,221,187,197, 2, 62,255, 55, 79,202,
- 9, 0, 60, 30, 79,181,119,239,222,186, 45, 91,182, 60, 6,207,131,153, 30,126,204,215,168, 42,180,109,221,186,245,241, 77,155,
- 54,213,229,241,120,170,218,224, 20, 10,133,131, 37, 18, 73,190, 80, 40, 28, 92,195,114,146, 0, 22,140, 27, 55,238, 82,163, 70,
-141,142, 58,132,149, 75,212, 52,106,212,232,240,184,113,227,174, 0,152, 83,201,189, 94, 17,103,157,176,176,176,133, 43, 86,172,
- 16, 39, 39, 39, 35, 51, 51, 19, 54,155, 13, 35, 70,140, 0, 77,211, 48,153, 76,176, 88, 44, 88,178,100,137, 36, 40, 40,232, 35,
-148, 38, 10,246,228,220,121,254,254,254,201, 27, 55,110, 28,146,146,146, 34, 61,122,244, 40,113,253,250,117,201,178,101,203, 6,
- 6, 5, 5,221, 6, 32,168, 65,125,146, 42,149,234,187, 61,123,246,188,121,253,250,245,240, 93,187,118,113,207,158, 61,171, 90,
-189,122,245,120,149, 74,181, 9, 0, 85,195,107,212, 70, 44, 22,247,158, 49, 99, 6,115,230,204,153,204, 51,103,206,100, 46, 95,
-190, 28,221,186,117,235, 50,111,222,188,216, 26,114,182,245,243,243,123,118,198,140, 25,204,201,147, 39,179,206,157, 59,151,177,
-108,217, 50,242,217,103,159,237,186,112,225,194, 86, 94,114,110, 59,115,230, 76,143,244,244,244, 6, 25, 25, 25,245, 51, 50, 50,
-234,101,100,100,212,203,204,204,140,204,206,206,174,155,147,147, 19,145,151,151, 23,113,252,248,241,174, 0,182,120,194,217, 84,
- 41,121,115,218,136, 62,197, 31,189,222,159,253,224,181,231,216,153, 35,122,176, 47,116,111,249, 51,197,225, 16,231, 18,211, 16,
-238, 15,124, 63,249,153,200,136, 96,201,245,104,185,180,201, 19,246,108, 62,105,156, 28,167,144,210,104, 52, 56,112,224, 0, 28,
-214,171, 54,238, 34,171,176,176, 16,217,217,217,206,239, 56,158,148, 83, 38,147, 29, 89,183,110, 29, 91, 82, 82, 2,189, 94,143,
-188,188, 60,164,167,167,227,238,221,187, 40, 40, 40,192,173, 91,183, 32, 22,139,143,120, 82, 78,130, 32, 64,211,180, 75, 72,253,
-254,251,239, 24, 55,110, 28, 52, 26,141,235, 51, 14,135,227,122,239,252, 77,117,156, 78,203, 19, 77,211, 56,119,238, 28, 38, 76,
-152,128,229,203,151, 99,203,150, 45,216,191,127, 63, 52, 26,141, 75,108,217,237,246,106, 57,213,106, 53, 24,198,179, 49, 19,203,
-178,208,235,245, 30, 95,119,119, 1,196,225,112, 30, 18, 69,206,205,155,123,233, 17, 57,159, 88,120, 16, 25,190,242, 17,182,243,
-141,195, 84,215,243,113, 21,146,228,240, 70, 14, 29, 51, 37, 40, 35,175, 16,153,185,122, 80,228,223,253, 94,108,159, 49,224, 80,
- 36,206,255, 90,106,184, 34, 41, 10,122,163, 25, 58,131, 21, 67,198, 76,149,175, 93,254,201, 72,187,181,164,202, 24, 47, 49, 64,
- 84,180, 84,250, 74,139, 22,117,201,155,130, 36,196,190,112, 10, 52, 3,176, 39, 95, 68, 27,173,130,106,246, 27,255, 21, 99,145,
-117,225,117, 32,185, 74,107, 70, 64,128, 40,176, 85, 43,204, 11, 11, 67,119,155, 13, 60,150,197,115,185,185,248,107,234, 84,152,
-119,238, 4, 9,128, 55,120, 48,122,125,249, 37, 78,132,133, 33,212,100,130,110,250,116,132,252,242, 11,120, 50,153, 8,249,158,
- 45,126, 32, 8, 2, 61,123,246,196,225,195,135,131,250,245,235,247,235,181,107,215, 6,217,237,246, 19, 53,169, 91,127,127,255,
-139, 28, 14, 39,188,186,227,236,118,123,134, 94,175,247, 58,205, 8,135,195,233,222,161, 67,135,221,187,118,237, 10,180, 90,173,
-181, 50, 10,225,243,249,253, 6, 14, 28,184,110,213,170, 85,178,241,227,199,175,219,191,127,127,177,197, 98,249,197,155, 91, 10,
-192,130, 53,107,214, 76,140,143,143, 15, 24, 63,126, 60,123,247,238, 93,119,235, 85, 72,183,110,221, 26,173, 91,183, 46,244,153,
-103,158,153, 50, 97,194, 4, 30,128,217,213, 89,121,164, 82,233,164,117,235,214, 5,171,213,106, 24, 12, 6, 87, 35,155,145,145,
- 1,145, 72, 4,146, 36, 65,146, 36,184, 92, 46, 62,251,236,179,160, 73,147, 38, 77,213,104, 52, 83, 61,176,146, 37,172, 92,185,
- 50,228,249,231,159, 39, 83, 82, 82, 64,146, 36,132, 66, 33, 94,125,245, 85,210,100, 50, 5,206,155, 55,111,131,209,104, 28,238,
- 77, 29,114,185,220,145, 9, 9, 9, 77,186,116,233,194, 73, 74, 74, 66,167, 78,157,112,254,252,121, 12, 30, 60,152, 91, 84, 84,
- 84,127,230,204,153,227,204,102,179,183,113, 92, 84, 98,177, 56,230,143, 63,254, 72,143,136,136,112, 53, 44,245,235,215,167,227,
-226,226, 52, 73, 73, 73, 77,207,156, 57, 83,208,185,115,103,111, 18,150,215, 17,139,197,205, 14, 30, 60,152, 61,111,222,188,222,
-107,214,172, 25, 8, 0,237,219,183,223, 59,127,254,252,163, 26,141, 38,250,196,137, 19,154,238,221,187,103,120,200, 23,166, 82,
-169,232,201,147, 39, 75,171, 58,104,253,250,245, 58,148, 38, 92,110, 0,160,202,124,109, 77,235,133,126,180,116,234, 80, 17,104,
- 43, 88,155, 9,176, 22, 3, 86, 3, 24, 75, 49, 8,158, 8,176,153, 16, 34,208, 96,219,164,166,178,247,127,188,119,147,190, 69,
-196, 37,169,139,126,129, 15, 21, 54, 53, 0, 98, 9,130,184,124,224,192, 1,116,232,208, 1, 7, 14, 28, 64, 92, 92,220,101,119,
- 49,112,253,250,117,116,239,222, 29, 14,139,150, 71,190, 90,122,189,126,214,156, 57,115, 78,142, 28, 57, 82, 92,166, 49, 32, 73,
- 4, 4, 4,160,127,255,254, 37, 70,163,113,150,167, 5,165,105, 26, 28, 14, 7, 25, 25, 25, 88,191,126, 61, 22, 45, 90,132,168,
-168, 40,216,108,182,135,196,150,163,221,243,168,241,179,219,237,184,112,225, 2, 54,111,218,132,217, 31,125, 4, 63, 63, 63, 0,
-128,213,106,133, 70,171,133, 80, 40,116,137,177,106,132,211,246, 59,119,238, 76, 13, 15, 15, 47, 51,101,232,124,117,180, 89, 96,
- 24, 6,118,187, 29, 37, 37, 37, 88,190,124,185,157,101,217,237,213,245, 63, 78, 81, 52,117,234, 84,152,205,127, 27,212, 91, 57,
-124,146,235,213,171,135,214,173, 91,187,246, 73,146,100, 61,229, 92,219, 57, 6, 38,183,163,155,206, 89, 6, 0, 8, 15, 15, 71,
-211,166, 77,161, 82,169, 42,229,124,220, 90,164, 38,240, 34, 50,124,229, 66,235,159,200,148,205,229, 9,123, 53,108,220,132, 72,
-203,214,128,195,225, 64,226, 31,140,206, 47, 79, 3, 69,145,144, 6, 4,131,160, 77,127, 43, 98,146, 2,135,226, 64, 83,100, 66,
-189, 6,141, 73,129, 80,212,203, 88,141,208,146,249,115, 87,206, 24,222, 89, 88, 96,207,128,168,174, 16,180,179, 59, 13,227,131,
- 12, 42,194,187,253,162, 68,241,123,175,173,132,222,246,172, 39,229,165,236,118, 40, 40, 10, 86,150,197, 95, 83,167, 34, 54, 33,
- 1,151,157,194, 48, 33, 1,151,227,227, 33,231,114, 33, 32, 73,176, 54,219, 67,115,250,158, 8, 45, 0, 72, 79, 79,199,206,157,
- 59,229, 67,135, 14,221,125,253,250,245,145, 94,138, 13, 39, 87,240,185,115,231, 20, 13, 26, 52,168,244,152,251,247,239,163, 93,
-187,118, 94, 79, 79,241,249,252,126,207, 62,251,236,143, 59,119,238,244, 79, 76, 76,132, 66,161,120,100,161, 37, 16, 8,186,247,
-233,211,231,199,141, 27, 55,202,242,243,243,145,144,144, 32,123,241,197, 23,183, 92,186,116,233,101,179,217,236,137,216, 44, 35,
-178, 18, 18, 18,116,235,215,175, 95,139,178, 83,132,217,235,215,175,255,238,153,103,158,121, 51, 62, 62, 62, 0,192, 68,135,239,
- 64,149, 98, 75, 32, 16,244,108,216,176, 97,153, 81,173, 64, 80,106,108,146, 72, 36,240,247,247, 7,143,199,131,217,108, 70,108,
-108, 44,193,231,243,187,122,114,206,126,126,126,125, 94,121,229, 21,242,212,169, 83,200,201,201, 65, 64, 64, 0,164, 82, 41,104,
-154,198,248,241,227,169,229,203,151,247, 52, 26,189,155,225,138,136,136, 24,216,187,119,111,206,141, 27, 55,144,146,146, 2,179,
-217,140,219,183,111, 67, 38,147,225,181,215, 94,227, 45, 93,186,244,197,204,204, 76,111,133, 86, 76,124,124,124,174,187,200,114,
- 66, 34,145, 16, 77,154, 52,209, 4, 5, 5,181, 5,224,141,208,138,121,235,173,183,242, 22, 47, 94,220,253,240,225,195,174,160,
-151,135, 15, 31,158, 9, 0, 95,125,245,213,201,144,144,144,182, 0, 60, 21, 90, 96, 89,150,249,191,255,251,191, 7,124, 62, 31,
- 92, 46, 23,124, 62,191,204,198,227,241, 64,146,164,159,243,113,174,142,239,102, 74,206,146,241, 51,151, 45,147, 8, 41,238, 59,
- 47,183, 68,221, 0, 30, 32,146,131,215,253,125, 16, 1,165, 70, 75, 86,115, 31,248,237,125,124,241,138,134,140,255,161,228,103,
- 43, 29, 24,114, 79,171, 45,250,151,251,128,103, 0,252, 7,165,201,117, 63, 2,112,238, 9,233,155,174, 0,136,141,139,139,115,
-137,173, 67,135, 14,161, 95,191,126,208,233,116,184,113,227,134,187,200,242, 38,193,242, 21,155,205,118,117,235,214,173,157,135,
- 14, 29, 74,184, 61, 95, 72, 76, 76,196,173, 91,183, 46,123,202, 71,146, 36, 24,134, 1,151,203,197,178,101,203, 96,181, 90,241,
-195, 15, 63, 96,199,142, 29, 32, 73, 18, 4, 65,128, 32, 8,200,100, 50,124,253,245,215, 94,181,123, 52, 77, 99,195,134, 13,120,
-127,230, 76,151,200,114,204,100, 32, 84,169, 68, 80,112, 48,238,221,187, 87,173,208,210,106,181,159,238,219,183, 15, 85, 57,195,
-239,219,183,207,245,190,156, 51,124,245,253, 28, 69,193,108, 54,227,185,231,254, 78, 21,251,214, 91,111,185,222,107, 52, 26, 80,
- 20,229,172, 11,194, 83, 78, 19, 11,188, 44,252,251,179,254,239,190, 91,198, 66, 87, 25,231, 63,161, 69,106,203,186, 85,129,216,
-138,117, 88,103, 85, 0,226, 80,234,163,149, 13,252,131, 62, 90, 44,203, 52, 11,175, 19,134,171,119,175,131, 67, 81,224,251, 7,
-195, 95,174, 4, 99,183, 64,159,151,130, 99,187,190, 5, 0,172,217,176, 29, 36, 73,130,195,161, 96,182,208,136,170, 27, 6,134,
- 97,154, 85,197,221, 28,232,220, 83, 25,220, 33, 34, 50,128,184, 17,152,130, 38,138,160,114, 19, 33, 2, 68,101, 73,137, 78, 82,
- 81,123,173,190,176,243, 77,224, 76,181, 98,128, 36, 65, 18, 4,196, 60, 30,204, 59,119,150,122,109, 38,148,246, 89,151,227,227,
- 65,254,252, 51,252, 4, 2, 80, 4, 1,142,195, 4, 93, 19, 20, 22, 22,130, 32, 8,108,222,188, 57,240,181,215, 94,219,114,227,
-198,141,248,146,146,146,157,222,112,232,116,186,184, 46, 93,186, 28,221,176, 97, 67, 72,104,104,232, 67,223,231,228,228, 96,204,
-152, 49,249, 58,157,206,171,160,110, 66,161,112,240,192,129, 3,215,125,255,253,247,178, 59,119,238,192, 96, 48, 32, 36, 36,228,
- 81,111,133,182, 29, 59,118,220,189,115,231, 78,255,156,156, 28,232,245,122,152,205,102,108,222,188, 57,160,127,255,254, 59,147,
-146,146,250, 1,184, 84, 13,199,199,238, 34,107,194,132, 9,215, 0, 40, 0,172, 44,175, 65, 29,223,181,116, 19, 91,122, 0, 75,
-171, 24,137, 70, 74, 36, 18,228,229,229, 97,204,152, 49, 72, 78,254,219, 0, 26, 22, 22,230, 26,233,221,187,119, 15, 33, 33, 33,
- 32, 8, 66,225,201, 73,135,132,132, 72, 45, 22, 11,198,141, 27,135,244,244,244, 50,156, 25, 25, 25, 32, 8, 66,236,109, 69, 42,
-149, 74,165,201,100, 66,183,110,221, 80, 82, 82,154,215,119,216,176, 97,224,114,185,200,203,203, 3,151,203, 13,174,193,245, 9,
-142,139,139,171, 52,180,138, 76, 38,179, 6, 6, 6, 54,247,146, 51,232,197, 23, 95,204, 76, 72, 72,120,104, 97,203,249,243,231,
- 95,146,203,229,135,229,114,121, 19, 47, 57, 25,119, 81,197,227,241,202, 8, 45, 46,151, 11,146, 36, 61,246, 81, 75,206, 51,174,
-224, 16,217,173, 23, 79,126,126, 76, 93,133, 63, 88, 67, 46,120,207,126,138,171,249, 34, 44, 91,126, 16, 0,240,222,171,237,208,
-170,207, 2, 88,190,127, 30, 83, 59, 81,252, 81, 25,230, 25, 0, 62,254,151,219,252,207, 1, 56, 87,193,173, 2,208,250, 9,234,
-143, 92, 98,235,208,161, 67,136,142,142,134, 86,171, 69, 82, 82, 82, 77, 69,150,179,189,123,127,238,220,185,191, 13, 26, 52, 72,
-226, 28,180,138, 68, 34, 76,159, 62,221,100, 48, 24,222,247,234, 38, 98, 24,112, 56, 28,215, 32, 89, 40, 20, 34, 54, 54,214, 37,
-178, 8,130, 64,113,113, 49, 56, 28,142,115, 69, 34,225, 97, 25,161, 10, 13,133,159,159, 31, 26, 71, 69,225,142,163, 29,113,190,
- 23, 8, 4, 32, 8, 2,118,123,181,134,188, 34,135, 83,251,180,218,238,146,157,162,168, 74,211,113, 88, 24, 24,134,113,138, 76,
-182, 54, 56,131,131,131, 97, 48, 24, 60,229,124, 34, 81,137, 69,203, 41,180,226, 80,234,171,245, 80,120,135, 30, 0,142,225, 49,
- 46,169, 36,192, 18, 12,203,130, 67,145,142,185, 91, 10, 20, 69, 66,147,159,141, 47, 63,157,232, 16, 89, 59,112,224,100, 18,194,
- 27, 70,255, 61,143, 75, 16, 0, 91,245,205, 29,226,207, 75,152, 52,168,163, 40,151,200, 70, 64,152, 24, 66, 97, 57,253, 24,200,
- 3, 81,143,196,228,158,225,226, 11,251, 74, 18,110,234,173,213,118, 20, 66,146, 44,117,126, 39,136, 10,157,123, 72,199,119, 20,
- 65,128,101, 89,176,140,119,126,199, 78, 33, 47, 18,137, 96,181, 90, 65, 81, 20,190,249,230,155,128, 62,125,250,172,244, 86,104,
- 1, 72,204,205,205,237, 63,126,252,248, 67,219,183,111, 15, 14, 14, 14, 46, 51,122, 24, 63,126,188, 58, 55, 55,183, 63,188,116,
-186,231,114,185, 43, 87,173, 90, 37, 75, 77, 77, 69,113,113, 49, 68, 34,145,171,241,169,233,253,217,190,125,251, 95,127,249,229,
-151, 64,189, 94, 15,171,213, 10,145, 72, 4,150,101, 65, 81, 20,126,250,233,167,160, 1, 3, 6, 28, 76, 75, 75,123,182,170,178,
-138, 68,162,151, 29,194, 9,241,241,241, 1,241,241,241, 61,128, 74, 35,245,186, 16, 31, 31, 31, 48,109,218,180, 23, 77, 38,211,
-210, 42,206, 57, 93,163,209,132,138, 68, 34,236,218,181, 11, 82,169, 20, 98,177, 24, 97, 97, 97,208,104, 52, 16,139,197, 96, 89,
- 22, 54,155,205,217, 88, 20,120,114,226,249,249,249, 6,187,221,238,127,232,208, 33, 20, 20,252,253,147,186,117,235, 66,167,211,
-129, 97,152, 98,111, 43, 51, 43, 43, 43,151, 32,136,136,171, 87,175, 34, 53, 53, 21,253,250,245,195,207, 63,255,140,118,237, 74,
-103,135, 45, 22, 75, 77,130,248,209, 20, 69,177, 85,220,183, 4,128,192,218,228,116,116, 94, 94,113, 50, 12,195, 56, 69,150,251,
-171,187,248,170,230, 63,203, 60,206,205,149,210,245,139, 39,245, 30,243,124,116, 48, 76,249, 41, 16,250, 5,131, 8,168,135,101,
-203, 15,226,198,253,210,235,181,108,203, 69,252, 56,175, 63, 32,146,163,169,191, 26,161,126,156, 87,110,229,253,235, 66,203,223,
-125,156,240,164,118, 76,253,250,245,131, 70,163,129, 84, 42,173, 13,255,156, 63, 77, 38,211,237, 61,123,246,180,141,139,139, 3,
-159,207,199,237,219,183,113,233,210,165, 36, 0,127,122, 43,180,184, 92, 46,230,206,157,139,137, 19, 39, 66,169, 84,226,253,247,
-223, 7,135,195,113,109, 4, 65,184, 44, 92,222, 64,161,172,122,225,163,211, 33,190, 58, 99,184,191,191,255, 92,146, 36,135, 82,
- 30, 84, 28, 77,211, 52,195, 48,219,245,122,125,149,225, 29,156,142,235,158, 92, 11,247, 58,168,166, 79,123,100,206,127, 66,139,
-212, 4,229, 87, 27, 86, 98,209,114,174, 58,124, 40, 21,144,243, 44,143, 57, 76,118,199, 30, 87, 65, 9,146,186,149,145,153,133,
-160, 64,169, 67,100, 57, 54,146, 68,171,232,210,193,236,129,147, 73, 8,111, 16, 13, 14, 69,129, 67, 81,144,138, 4,200,205,201,
- 6,135, 67,222,170,140, 55,134,194,160, 65, 77, 34,234, 5, 6,113,161, 14,177, 64,165,172,196, 48,208,214, 15,225, 42, 62,250,
- 6, 9, 35, 99, 40, 12,170,218,250,198,186,132,150,213,110, 7,111,240, 96,215,116,225,229,248,120,196, 38, 36,128, 30, 56, 16,
- 70,171,181,140,169,184,166, 66, 75, 36, 18,161,168,168, 8, 35, 71,142,212,216,108,182, 55,107, 88,197,151, 10, 10, 10,134,140,
- 26, 53,170,192, 41, 96,172, 86, 43, 70,141, 26, 85, 80, 80, 80, 48,196, 3, 43,209, 67,176,217,108,111,182,107,215, 78,163, 86,
-171, 93,229,172, 73,131,227,132, 92, 46, 63,176,126,253,122,185,217,108,134,221,110,119,113,138, 68, 34, 80, 20,133,144,144, 16,
-252,248,227,143, 33,114,185,188,202,156, 85, 38,147,105, 79, 66, 66,130, 14, 0, 18, 18, 18,116, 4, 65, 28, 39, 8, 98, 53, 65,
- 16,171,202,109,171, 9,130, 56,238,126,172,201,100,218, 93, 21,183,197, 98, 57,158,148,148,196,138,197, 98, 80, 20, 5,171,213,
- 10,161, 80,232, 50,137, 23, 22, 22,194,100, 42,157,230,190,116,233, 18,108, 54,219, 41, 79,206,189,168,168,232,200,134, 13, 27,
-152,186,117,235, 34, 58, 58, 26,177,177,177,232,216,177, 35, 34, 35, 35, 49,127,254,124,218,104, 52,122,253,236,101,101,101, 29,
-216,182,109,155, 45, 34, 34, 2,109,219,182,133, 64, 32, 64,171, 86,173, 16, 22, 22,134, 69,139, 22, 89,244,122,253,161, 26, 92,
-166,180,235,215,175, 83, 85,136, 92, 25, 60, 88,189, 91, 14,233, 23, 46, 92,160, 58,118,236,184,183,252, 23,237,219,183,223, 43,
-149, 74,253,157, 38,118,111, 70,228,238,226, 74, 32, 16,184, 54,231,231, 28, 14,199,147,209, 15,217, 92, 41, 93,255,217,196, 94,
- 99,158,143, 14,196,222, 35,231,192,179,234, 0, 75, 21, 51,130,180, 13, 4, 79, 2,165, 63, 55,252, 9,232, 3,166, 2,184,134,
-210, 56, 76,239,227,201,130,203,241,189,160,160, 0, 73, 73, 73,184,116,233, 18, 58,118,236,136, 83,167, 78, 1,127, 59,200,123,
- 13,189, 94,255,254,188,121,243,140,206,149,124, 31,125,244,145,169,168,168,232,125,111,219, 96,150,101,193,229,114,209,180,105,
- 83, 76,155, 54, 13, 7, 15, 30,196,237,219,183, 97,179,217, 92, 66,200,233,147,233,141, 69,139,199,227, 65,169, 84,194,102,179,
-185,172, 89, 0,112, 39, 57, 25, 28, 14, 7, 12,195,192, 98,177, 84,107,209,242,247,247,159,187,110,221,186, 41,106,181, 90,149,
-159,159,175,112,223,114,115,115, 21,217,217,217,138,204,204, 76, 69,122,122,186,226,193,131, 7,138,148,148, 20,213,146, 37, 75,
-166,248,251,251,207,245,164,156, 20, 69,161, 85,171, 86,120,235,173,183, 92,219,138, 21, 43, 92,219,177, 99,199,188,118, 94,167,
- 40, 10, 77,231, 44, 67,255,124,214,181, 29, 12, 33, 92,219,141,247, 38, 84,197,249,216,181, 72,141,244,139, 99,181,161,123, 98,
-233, 10,224, 92,117,232,108,203, 92,110, 27,229,157,225, 31, 27,236,150,146,163,247,239, 38,247,106, 26,243, 12,153,163, 54,148,
- 89,254, 25,219,115, 8, 8,130, 64,157, 6,209,160, 56, 28, 80, 20, 9, 14, 69, 33, 64, 38, 68,210,213,171,140,217,100, 58, 90,
- 17,103, 15,128,195, 23,241, 87,188,218,183,149, 48,139,159,135, 16,149, 4, 60,110,169,118,100,239, 15, 41,215, 67,112,128, 24,
- 63,140,205, 12, 18, 29,205, 45, 89, 17,104,180,238, 61, 94,201, 8,144, 97, 24, 72, 5, 2,148,152,205, 48,217,237,232,249,229,
-151,174,233, 66,146, 32,112, 5, 64,203, 47,191,196,153,157, 59, 33,227,243, 1,129,192,227, 85, 33, 21, 9, 45,181, 90,141,209,
-163, 71, 23,100,103,103,191, 86, 19, 31, 45, 39,204,102,243,137,156,156,156,215,134, 12, 25,178,121,215,174, 93,242, 33, 67,134,
-104,114,114,114, 94,243,208,239,233, 33,148,148,148,236, 76, 79, 79, 47, 30, 61,122,244,166, 45, 91,182, 4, 5, 7, 7,187, 70,
- 34, 53,186, 89, 9, 66,221,187,119,111,129, 39,199, 85,115,200, 60,135,115,251, 68,135,101,171,229,132, 9, 19,206,160,212,255,
-202, 29,115,214,172, 89, 51,204,109,138,113, 53,128, 47,171, 34, 46, 44, 44, 92, 53,109,218,180,215, 79,156, 56, 17, 44, 20, 10,
- 65, 16, 4,120, 60, 30, 26, 55,110,236, 90, 69,195,229,114,193,178, 44,222,125,247, 93,117, 94, 94,222, 87, 30, 94,155, 9,243,
-230,205,235, 94, 82, 82, 18, 56,122,244,104, 74, 40, 20, 34, 55, 55, 23,203,151, 47,167,191,255,254,123,157,209,104, 28, 83, 3,
- 33,188,225,147, 79, 62,233,105, 48, 24, 26,140, 31, 63,158,167,215,235, 97, 50,153, 48, 99,198, 12,203,119,223,125,151, 97, 50,
-153,188, 14,248,219,169, 83,167,187, 15, 30, 60,232, 90, 92, 92,172, 21,139,197,229,173,125,132, 68, 34,121, 6,192, 38,111, 56,
- 99, 99, 99,239,165,165,165,117, 92,176, 96,193,113,155,205,198, 61,127,254,188,203, 25,254,155,111,190, 57, 38, 20, 10,123,195,
-203,228,171, 4, 65, 48, 2,129,160,140, 5,171,252,123, 14,135, 83,109,155,214, 44, 84,188,224,179, 55,186,143,121,174,185, 63,
-246, 28,185,136,121,187,239,223,138, 26, 19,210,180, 81, 96, 62,152,252, 36,188,247,106, 59, 44,219,114, 17, 64,233,212, 33,147,
-119, 3,172,246, 30, 88,191, 8,164,104,212, 89, 79, 64, 31,112, 12,165, 33, 51,158, 52,148, 17, 89, 55,110,220, 64,175, 94,189,
- 0, 0,167, 78,157, 66,151, 46, 93,112,234,212, 41,116,237,218,213,235, 88, 90, 14,252, 81, 88, 88,248,224,216,177, 99, 45, 34,
- 34, 34,240,231,159,127,166, 0,248,195,219, 66, 58,133, 22,135,195,193,136, 17, 35,208,167, 79, 31,212,173, 91,183,204,106, 67,
-231,123,111,196,134,221,110, 71, 76, 76, 12,204, 22, 11,120, 60,158,107,106,146,195,225, 32, 68,161,192,221,187,119, 61,178,104,
-145, 36, 57,244,229,151, 95, 38, 19, 19, 19, 49,124,248,112,108,222,188,185,210, 99, 71,141, 26,133,173, 91,183,226,229,151, 95,
- 38, 63,248,224,131, 42,195, 59, 56,157,208, 61, 57, 39,103, 63, 93, 93,187, 95, 91,156,143, 91,139, 60, 10,220, 66, 59, 84, 56,
-105, 82,193,103, 9,101,132,150, 91,144,176,199, 35,180,236,214,205, 63,255,240,237,180,142, 43,187,134,168, 20,254,208,232, 77,
- 46,177,117,249,216, 14, 0,192,160, 9, 11,193,161, 74,167, 20,101, 82, 33, 68, 60, 10, 59, 55,126,165,182, 90, 75, 42,188,187,
-138,184,228,196, 15, 58, 55,246,231, 75,108, 40, 12,101, 17, 29,242,119,166, 28,162,193,142,135, 5, 87,155, 64, 4,223,208,226,
-213, 70, 82,217, 87,137,186,137,176, 49, 43, 30,234, 16,117, 58,147,238,234, 85, 81,191,117,235,112,254,181,215, 80,135,166,113,
- 60, 44, 12,114, 46, 23,254, 2, 1, 72,130,128,105,255,126,156,217,181, 11, 74,129, 0,240,243,131,125,254,124,152,147,146, 96,
- 43, 42, 50,213, 96,100,134, 97,195,134,169,213,106,245, 16,139,197,114,226, 81,235,217,100, 50,253,146,158,158, 62,177, 83,167,
- 78, 43,109, 54,219,155, 38,147,233,145, 86, 70, 89, 44,150, 95,114,114,114, 6, 15, 27, 54,108,199,238,221,187,131, 3, 2, 2,
-106,204, 85, 80, 80,208,174,150,110, 39, 6,192,108,135,115,251,255,183,119,245, 65, 81, 93, 87,252,247,222,219, 15, 88, 62,205,
-194,146,240, 17, 37,208, 20,218,105,163, 65, 76,211,194, 8,109,136, 38,109,167,116,172, 17, 71,193,182,160, 41, 67,167,181,244,
-143,142,211,152, 80,181,227,180, 83, 2, 54, 99, 70,173, 24, 99, 90,199,113,162, 77,169, 14, 96,204, 4,153,132,182,124,164, 90,
- 80, 19,151, 12, 24, 2, 11,187, 32,187,203,178,236, 46,239,237,235, 31,187, 15,215,101, 23,246,193,125,176,144, 61, 51,111,100,
- 21,127,156,123,207,185,188,223, 61,231,222,115,126,182,103,207,158, 85,109,109,109, 63,173,171,171,123,221, 99, 55,145, 80, 90,
- 90,186,219,139,100,205,121,235, 16,192,221,225,225,225,131,149,149,149,191,175,174,174,142, 18, 14,190, 95,191,126, 29, 44,203,
- 66, 46,151,131,227, 56,148,150,150,142,143,140,140,252, 9,254, 43, 58,207,112, 45,147,201,244,248,161, 67,135,234,106,107,107,
- 11, 24,134,137,228, 56,206, 50, 49, 49,209, 60, 57, 57,249, 99,204,175,142,150, 83,175,215,239,218,191,127,255,174,154,154,154,
- 31,210, 52,157,192,178,172,193,108, 54,215, 91,173,214, 83,152, 71, 42,169,181,181, 85,191, 99,199,142, 79,245,122,253, 87, 82,
- 82, 82,140, 81, 81, 81,118,187,221,206,168, 84,170,152,200,200,200, 44, 0,173, 20, 69,221, 20,131,217,217,217,169, 43, 43, 43,
-235,181,217,108,153,199,142, 29,107,137,137,137,185, 74, 81, 20,165, 80, 40, 30, 82,169, 84,223, 6,208, 76, 81,212, 29, 49,152,
- 52, 77, 59, 61,163, 87,222,231,179,148, 74,101, 64,103,180,210, 52, 17, 63, 41,120, 92,134,119,222,107,199,129,119,238,158,230,
-120,254,194,133,206,123,255,252, 77, 14,224, 56,191, 3,107,183,158,113,165, 11, 1, 56,135,187,224, 56, 95, 12, 42, 34, 30, 45,
-159,203, 97,180, 58, 46, 33, 36,190,100,186,188,131,193, 96, 64,119,119,183, 64,178,178, 0, 32, 55, 55,183, 83, 32, 91, 29, 29,
- 29, 88,191,126,125, 39, 0,185, 88,127, 53,153, 76,149, 59,119,238,108,112,111,142, 43,231,177,241,155, 38, 90, 2,161, 90,189,
-122,245,244,103,207,199,227,140, 86, 64,194,113, 28, 20, 10, 5,100, 50, 25, 18,147,146,166,127, 22,207,243,208,106,181, 24, 29,
- 29, 13,136,104, 49, 12,195, 80, 20,133,162,162,192, 46, 36,111,223,190, 29,205,205,205, 96, 2,100,133, 12,195, 32, 53, 53,117,
-206,239, 17,120,105,160,152, 41, 41, 41,243,198,148,154,139,204,151, 96,249,250,218, 23,169,242,183, 32, 22, 75, 6,198,199,141,
- 47,189,121,242,181,234,210,242, 95, 71,117,245, 12,193, 56,110, 3,195,208,158,191, 60, 33,147, 49,136,137, 12,199,163,143,196,
-226,111,127,121,213,108, 54,141,237,135,159,190,135,171,163, 21, 47, 62,179,225, 75, 97,138, 68, 11, 50,159,216, 6, 38,252, 62,
- 9,224,117,126,178,131, 57, 77,120,254,174, 37,252,239,119, 45, 47,126,116,207, 62,147,104,217,237,155,126,187,121,115,227,129,
-203,151, 35,158, 58,125, 26, 61,165,165, 72,178, 90, 17,230, 78, 37,210, 20,133, 40,133, 2, 81, 10,133,139,100,213,212,192,202,
-178,168, 45, 41,153,176,217,237,155,197, 44,242,145,145, 17, 20, 22, 22,234, 7, 6, 6,190,139,121,164,246,252,137,197, 98,121,
- 27,192,219,164,240,108, 54,219,181,254,254,254,231, 11, 11, 11, 47, 55, 52, 52,104,130,164,200,156, 64,182, 28,109,109,109,187,
- 91, 90, 90,122,240, 96, 99,209,177,150,150,150,158,178,178, 50,170,174,174,238, 20,128,151, 17, 96, 1, 79,139,197,242,218,149,
- 43, 87,176,113,227,198,151, 15, 31, 62, 28,151,157,157,141,132,132, 4,152,205,102,116,116,116, 96,239,222,189,163, 38,147,233,
-240,216,216, 88,181, 72,157, 29, 54,155,173,216,243, 42, 53,137,121,176,217,108,111, 12, 14, 14,190, 65, 10,176,162,162,226,186,
- 86,171, 29,209,104, 52,223, 80, 40, 20, 79,192,117, 14, 72, 7,224,148, 88, 66, 36, 72,121,121,249,127,181, 90,173, 33, 57, 57,
-249,105, 55,230, 42,184,218, 24,157,156, 7,230, 64,123,123,123,202,134, 13, 27,104,185, 92,206, 51, 12, 3,185, 92,206,203,100,
- 50,222,125,174,134, 7,128,250,250,250, 48, 0,179,182,205,233, 25,182, 30, 42,126,245,131,125, 55,117,147, 23,110, 13, 77,252,
- 10, 0,127,190, 43,162,105,173,134,217,180, 41,163, 31,182, 19,185,160, 98, 92,133, 42,249,241, 65, 80,145, 15,163,223,153,140,
-170,127,220,214,177,160,254, 24,226, 84,190,247,213,112,151,119, 24, 28, 28,244, 36, 89, 66,212, 42, 43, 55, 55,183,211, 77,178,
-132,127,155,207,249,178,119,157, 78,231,130,222, 97, 60,207,227,192,129, 3, 56,126,252, 56,230,170,104,238,190,221, 71,205,133,
- 39, 68,180, 56,142,131,195,225, 64, 87, 87,215,116,205, 46, 33, 93, 40,148,118, 96, 89,118,214,219,234, 28,199,113,118,187, 29,
-231,206,157, 11,136,108,157, 61,123, 22,147,147,147,224,230, 96,112,158,165, 24,214,173, 91,135,209,209,209,233,203, 62, 89, 89,
-247, 75,229, 57, 28, 14, 81,196, 85,192,204,204,204,132,193, 96,128,112, 94,248,209,146,251,193, 30,214, 98, 89,169,126,239, 55,
-162,181,232,111,204,176,136,152,134,236,111, 21,228,148,236,222, 27, 57,110,227,208,219,219, 7,253,240, 32,104,138, 70, 98,114,
- 10,214,172, 73,133, 74, 73,227,173, 19,213,150,206, 15,175,126, 48,110,190,247,156, 63,172,239,197, 42, 62,172,249, 81,206,211,
-233,233,209, 20,216, 41,128,155, 2,216, 41,192,233,254, 83,248, 59,231,131, 62,215,221, 61,198,239,251,104,244, 95,151,140, 14,
-159, 61,171,182, 2, 57,171,212,234,198,170,250,250, 8,167,195,129,145,202, 74, 68,176, 44,194,221,187, 18,215, 64,194,192, 30,
- 60,232, 34, 89,197,197, 19,198,177, 49, 81, 45,120,226,227,227,219, 41,138,138,215,235,245,203,170, 50,188, 70,163,185,196,243,
-188,193, 96, 48,100, 7,145, 94, 9, 0,198, 0, 56,124,108, 36, 52, 16,127,254, 71,144, 84,141, 70,179,143,166,233,111,242, 60,
- 31, 71,211,244, 61,167,211,217, 58, 60, 60,252, 7, 0,218,208,251,116,201, 68,168, 12,255,216, 28,223, 55, 12,224,151,112, 29,
- 10,238, 13, 20,124,109,108,108,172, 77, 57,117,241, 7, 95, 11,203,127, 33, 43, 22,105,143, 68, 67,174, 8,199,128,137,197,187,
- 55, 77, 56,249,190,238, 51,235, 20,247,253, 79,244, 19,255, 11,153, 98, 86, 33,222,130,135,164,168,213,234,127, 55, 54, 54,102,
-167,165,165,209,158, 7,222,133, 90,121, 66,122, 75, 38,115,113,185,107,215,174,177, 69, 69, 69,173, 67, 67, 67, 27,253, 97, 70,
- 71, 71, 55,221,184,113,227, 89,163,209, 56,131, 80,121, 86,138, 23, 62, 91, 44, 22,148,151,151, 95,241,215,130, 39, 54, 54,182,
-166,186,186,250, 23, 91,182,108,161,133,114, 20,158,143,208, 46, 72,120, 28, 14, 7,206,156, 57,227, 60,114,228,200,159,141, 70,
-163,223,212, 97, 98, 98,226,103, 3, 3, 3, 41, 66,169,133, 64,138,138,166,166,166, 14,246,245,245, 37, 45, 38,230, 50, 38, 92,
- 15, 68,183,150, 36, 52, 33, 87,169, 42,162,163, 30,122,101,203,206,159,199,165,166,127,153,122, 56, 49, 25, 20,104, 12,233, 62,
- 71,223,167,159,240, 23,255,122,116,196, 98, 26,253,157,213,106, 57, 58, 27,206, 87,129,244,199, 98, 20,231,149, 28, 50, 32, 16,
- 32,175,254, 84, 51,118, 28, 0, 28,114,250,118,175,121,106,219,205, 89,210, 62, 2,217,122,233,226,197, 8,101, 70,198,140, 66,
-113, 78,167, 19,182, 91,183, 80, 91, 82, 34,154,100,133, 36, 36, 33, 33, 34,105,152,187, 70,214, 20, 92,245,185,196, 70, 76,168,
-204,132,200,109, 60,240, 2, 13,231,215,105,138, 82,178, 60, 62, 6,143,166, 8,217,196,235,157,131,176,134,166, 63, 32, 9,218,
-166,210, 0, 34,213,106,245, 85,134, 97,214, 8, 17, 25,207,104,189,143,134,210,189, 67, 67, 67,207, 0,152,237,134,112,122,116,
-116,244, 81,142,227,158, 10,164,169, 52,195, 48,255, 49,155,205, 21,152,165,169,180, 20,183, 14,227,226,226,180,125,125,125,233,
-194, 45,106,207,119,165,175,155,229,119,238,220, 65, 94, 94, 94,159, 78,167, 75, 93, 76,204, 96, 21, 63,183, 14,131, 39,162,229,
- 33, 73,138,176,168, 93, 74, 85,248,119,156, 83,108, 38, 40, 64, 38,151,223,182, 79, 90,223,179, 89,199,223,132,159,116,225, 98,
-202, 86, 32, 39, 76,169,108, 82,196,196,168,124,145,182, 41,179,217,106,179,219, 55,133, 72, 86, 72, 66, 18,146,144,132,100, 25,
- 73,134, 90,173,110,148,203,229, 97,158,100,210,251,107, 65, 88,150,157,212,235,245,207, 1,248,120,145, 49,191,152, 34,242,144,
- 90, 65,160,152,238, 39, 47,216, 49, 37, 28, 59, 79, 16, 51,207,141, 89,181, 76,244,204, 11, 86, 76, 97,188, 34,112, 11,196,248,
- 17,169,249,244,208,147, 39,173,167, 84,152,164,214,145, 15, 61,121, 9,236, 94,181, 76,244,204, 11, 54, 76,111,255, 9, 16, 87,
- 20,102,128, 62, 37, 86, 79,158,180,158, 82, 97, 46,116, 29,205,162, 39,191, 80, 95,242, 99,251, 42, 44, 67,233,126, 18,124,247,
-147,224,187,214,251,172,219,184,199,223,255, 19,117,144, 80,170,155, 0, 66,217,125, 55, 62, 21,172,152,158,243, 64,178, 85,128,
- 4,109, 7,222, 39,141,233, 53,159,164,164,202,125,195,164, 25, 1, 20, 28, 21, 51,118, 18,118,247, 26, 43, 17,220,121,144, 44,
- 81,152,164,252, 94,106, 76, 82,107,201, 27,147,132,223,251,178,187,132, 54, 34,165, 39,145,181, 36,133,207,251,240,159, 5,227,
-122, 99,146, 88, 75,222,152, 36,252,126, 49, 48, 73,172, 37, 95,152, 36,252,222,159,237,151,107,160, 73, 72, 23,186, 75, 60, 80,
- 1,144,173, 19, 0, 64,207,103,210, 36,140,148,229,147,198, 36,173,179, 20,100, 83, 68, 4,102,201, 49, 9,219,168,202,141, 73,
-114,119,147, 79,202, 70, 82,248,187, 39, 38, 41,124,111, 28, 18,118,242,133,185, 80,125,253,232, 73,124,236, 11,245,251,197,194,
- 36,108, 35, 34,107,201, 11, 51,159,240,102, 32,223,227,115, 21, 73, 76, 82,107,201,135,158, 11,182,147, 47,204,133,234,235, 71,
- 79,226, 99, 39,241, 14,145, 10,119, 41, 35, 90, 60,237,215, 39, 78,120, 61,139, 66, 52,150, 44, 37, 39, 18,123, 69, 97,138, 76,
-207, 20, 72, 96,251, 37,213,147, 36,166,183,142, 36,211, 61, 82,234, 73, 18, 83,132,174, 43, 14,115,185,217, 61, 24,231,211, 31,
-222, 66,210, 82,254,162,163, 82,232, 73, 18, 51, 64,236, 21,129,185, 0,219,175, 56,145, 5,139, 34,194,196, 19,222,153,128,112,
- 4, 70,178,113, 19,214, 51, 95,138, 8,161, 4, 66, 92, 79,247, 78,249, 21, 9,198,190, 89, 87, 78,217, 0, 0, 0, 46, 73, 68,
- 65, 84, 92,230, 52,180,150, 66,107, 41,232,214,146,151, 79,230, 19,140, 20, 17,141, 60,123, 99,146,248, 25,158, 24,164,124, 84,
-234,177,147, 92, 75, 82,216,126,185,201,255, 1, 22, 74, 86,152, 88,239,214,181, 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, 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,
0};
diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h
index 4e8aadecfc7..27c61e98e21 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -41,7 +41,7 @@ struct wmWindowManager;
/* space_image.c, exported for transform */
struct Image *ED_space_image(struct SpaceImage *sima);
-void ED_space_image_set(struct bContext *C, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima);
+void ED_space_image_set(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima);
struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void **lock_r);
void ED_space_image_release_buffer(struct SpaceImage *sima, void *lock);
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 414ca671ef2..d2ac24cd9da 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -240,6 +240,7 @@ int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me, const char *name
int ED_mesh_uv_texture_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
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);
#ifdef __cplusplus
}
diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h
index 7993e11ea55..bd746e36ef4 100644
--- a/source/blender/editors/include/ED_sculpt.h
+++ b/source/blender/editors/include/ED_sculpt.h
@@ -40,7 +40,7 @@ struct wmWindowManager;
/* sculpt.c */
void ED_operatortypes_sculpt(void);
void sculpt_get_redraw_planes(float planes[4][4], struct ARegion *ar,
- struct RegionView3D *rv3d, struct Object *ob);
+ struct RegionView3D *rv3d, struct Object *ob);
void ED_sculpt_force_update(struct bContext *C);
/* paint_ops.c */
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 2b4c213bc52..0666884351a 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -33,19 +33,26 @@
struct ARegionType;
struct EditFace;
struct Image;
+struct Main;
+struct ImageUser;
struct MTFace;
struct Object;
struct Scene;
+struct SpaceImage;
struct bContext;
+struct bNode;
struct wmKeyConfig;
/* uvedit_ops.c */
void ED_operatortypes_uvedit(void);
void ED_keymap_uvedit(struct wmKeyConfig *keyconf);
-void ED_uvedit_assign_image(struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma);
+void ED_uvedit_assign_image(struct Main *bmain, struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma);
int ED_uvedit_minmax(struct Scene *scene, struct Image *ima, struct Object *obedit, float *min, float *max);
+int ED_object_get_active_image(struct Object *ob, int mat_nr, struct Image **ima, struct ImageUser **iuser, struct bNode **node);
+void ED_object_assign_active_image(struct Main *bmain, struct Object *ob, int mat_nr, struct Image *ima);
+
int ED_uvedit_test_silent(struct Object *obedit);
int ED_uvedit_test(struct Object *obedit);
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index c7afe2fb28f..4ac5a6eed4a 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -394,8 +394,8 @@ DEF_ICON(LAMP_AREA)
#ifndef DEF_ICON_BLANK_SKIP
DEF_ICON(BLANK617)
DEF_ICON(BLANK618)
- DEF_ICON(BLANK619)
#endif
+DEF_ICON(META_EMPTY)
DEF_ICON(META_PLANE)
DEF_ICON(META_CUBE)
DEF_ICON(META_BALL)
@@ -588,8 +588,8 @@ DEF_ICON(MOD_SMOKE)
DEF_ICON(MOD_SOLIDIFY)
DEF_ICON(MOD_SCREW)
DEF_ICON(MOD_VERTEX_WEIGHT)
+DEF_ICON(MOD_DYNAMICPAINT)
#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK161)
DEF_ICON(BLANK162)
DEF_ICON(BLANK163)
DEF_ICON(BLANK164)
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 02b8cc9e2c6..35fabb3b80e 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -727,7 +727,7 @@ void uiTemplateDopeSheetFilter(uiLayout *layout, struct bContext *C, struct Poin
void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
const char *newop, const char *openop, const char *unlinkop);
void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
- const char *newop, const char *openop, const char *unlinkop);
+ const char *newop, const char *openop, const char *unlinkop);
void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
const char *newop, const char *openop, const char *unlinkop, int rows, int cols);
void uiTemplateAnyID(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
@@ -744,7 +744,7 @@ void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, const char
void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type, int levels, int brush);
void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int value_slider, int lock, int lock_luminosity, int cubic);
void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
- PointerRNA *used_ptr, const char *used_propname, int active_layer);
+ PointerRNA *used_ptr, const char *used_propname, int active_layer);
void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr, int compact);
void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
@@ -758,6 +758,8 @@ void uiTemplateKeymapItemProperties(uiLayout *layout, struct PointerRNA *ptr);
void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *activeptr, const char *activeprop, const char *prop_list, int rows, int maxrows, int type);
void uiTemplateNodeLink(uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
void uiTemplateNodeView(uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
+void uiTemplateTextureUser(uiLayout *layout, struct bContext *C);
+void uiTemplateTextureShow(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop);
void uiTemplateMovieClip(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, int compact);
void uiTemplateTrack(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname);
@@ -800,6 +802,7 @@ void UI_buttons_operatortypes(void);
uiBut *uiContextActiveButton(const struct bContext *C);
void uiContextActiveProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
void uiContextActivePropertyHandle(struct bContext *C);
+struct wmOperator *uiContextActiveOperator(const struct bContext *C);
void uiContextAnimUpdate(const struct bContext *C);
void uiFileBrowseContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
void uiIDContextProperty(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
@@ -818,16 +821,6 @@ uiStyle* UI_GetStyle(void);
/* linker workaround ack! */
void UI_template_fix_linking(void);
-/* translation */
-int UI_translate_iface(void);
-int UI_translate_tooltips(void);
-const char *UI_translate_do_iface(const char *msgid);
-const char *UI_translate_do_tooltip(const char *msgid);
-
-/* Those macros should be used everywhere in UI code. */
-#define IFACE_(msgid) UI_translate_do_iface(msgid)
-#define TIP_(msgid) UI_translate_do_tooltip(msgid)
-
/* UI_OT_editsource helpers */
int UI_editsource_enable_check(void);
void UI_editsource_active_but_test(uiBut *but);
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index e5092c82304..81b42277055 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -90,50 +90,6 @@
static void ui_free_but(const bContext *C, uiBut *but);
-/* ************* translation ************** */
-
-int UI_translate_iface(void)
-{
-#ifdef WITH_INTERNATIONAL
- return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_IFACE);
-#else
- return 0;
-#endif
-}
-
-int UI_translate_tooltips(void)
-{
-#ifdef WITH_INTERNATIONAL
- return (U.transopts & USER_DOTRANSLATE) && (U.transopts & USER_TR_TOOLTIPS);
-#else
- return 0;
-#endif
-}
-
-const char *UI_translate_do_iface(const char *msgid)
-{
-#ifdef WITH_INTERNATIONAL
- if(UI_translate_iface())
- return BLF_gettext(msgid);
- else
- return msgid;
-#else
- return msgid;
-#endif
-}
-
-const char *UI_translate_do_tooltip(const char *msgid)
-{
-#ifdef WITH_INTERNATIONAL
- if(UI_translate_tooltips())
- return BLF_gettext(msgid);
- else
- return msgid;
-#else
- return msgid;
-#endif
-}
-
/* ************* window matrix ************** */
void ui_block_to_window_fl(const ARegion *ar, uiBlock *block, float *x, float *y)
@@ -318,7 +274,7 @@ void ui_bounds_block(uiBlock *block)
if(bt->x1 < block->minx) block->minx= bt->x1;
if(bt->y1 < block->miny) block->miny= bt->y1;
- if(bt->x2 > block->maxx) block->maxx= bt->x2;
+ if(bt->x2 > block->maxx) block->maxx= bt->x2;
if(bt->y2 > block->maxy) block->maxy= bt->y2;
bt= bt->next;
@@ -407,7 +363,7 @@ static void ui_popup_bounds_block(const bContext *C, uiBlock *block, int bounds_
oldheight= oldheight > 0 ? oldheight : MAX2(1, height);
/* offset block based on mouse position, user offset is scaled
- along in case we resized the block in ui_text_bounds_block */
+ * along in case we resized the block in ui_text_bounds_block */
startx= window->eventstate->x + block->minx + (block->mx*width)/oldwidth;
starty= window->eventstate->y + block->miny + (block->my*height)/oldheight;
@@ -677,7 +633,7 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut
}
/* copy hardmin for list rows to prevent 'sticking' highlight to mouse position
- when scrolling without moving mouse (see [#28432]) */
+ * when scrolling without moving mouse (see [#28432]) */
if(ELEM(oldbut->type, ROW, LISTROW))
oldbut->hardmax= but->hardmax;
@@ -703,7 +659,7 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut
}
/* needed for temporarily rename buttons, such as in outliner or fileselect,
- they should keep calling uiDefButs to keep them alive */
+ * they should keep calling uiDefButs to keep them alive */
/* returns 0 when button removed */
int uiButActiveOnly(const bContext *C, uiBlock *block, uiBut *but)
{
@@ -756,6 +712,9 @@ static int ui_but_is_rna_undo(uiBut *but)
return TRUE;
}
}
+ else if (but->rnapoin.type && !RNA_struct_undo_check(but->rnapoin.type)) {
+ return FALSE;
+ }
return TRUE;
}
@@ -1931,8 +1890,8 @@ static void ui_free_but(const bContext *C, uiBut *but)
if(but->func_argN) MEM_freeN(but->func_argN);
if(but->active) {
/* XXX solve later, buttons should be free-able without context ideally,
- however they may have open tooltips or popup windows, which need to
- be closed using a context pointer */
+ * however they may have open tooltips or popup windows, which need to
+ * be closed using a context pointer */
if(C)
ui_button_active_free(C, but);
else
@@ -2465,14 +2424,13 @@ void ui_block_do_align(uiBlock *block)
}
/*
-ui_def_but is the function that draws many button types
-
-for float buttons:
- "a1" Click Step (how much to change the value each click)
- "a2" Number of decimal point values to display. 0 defaults to 3 (0.000) 1,2,3, and a maximum of 4,
- all greater values will be clamped to 4.
+ * ui_def_but is the function that draws many button types
-*/
+ * for float buttons:
+ * "a1" Click Step (how much to change the value each click)
+ * "a2" Number of decimal point values to display. 0 defaults to 3 (0.000)
+ * 1,2,3, and a maximum of 4, all greater values will be clamped to 4.
+ */
static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 4bc0963aad4..1ed05bc54f0 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -1326,9 +1326,9 @@ static void ui_draw_but_curve_grid(rcti *rect, float zoomx, float zoomy, float o
static void glColor3ubvShade(unsigned char *col, int shade)
{
- glColor3ub(col[0]-shade>0?col[0]-shade:0,
- col[1]-shade>0?col[1]-shade:0,
- col[2]-shade>0?col[2]-shade:0);
+ glColor3ub(col[0]-shade>0?col[0]-shade:0,
+ col[1]-shade>0?col[1]-shade:0,
+ col[2]-shade>0?col[2]-shade:0);
}
void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect)
@@ -1560,11 +1560,11 @@ void ui_draw_but_TRACKPREVIEW(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wc
/* draw content of pattern area */
glScissor(ar->winrct.xmin+rect.xmin, ar->winrct.ymin+rect.ymin, scissor[2], scissor[3]);
- zoomx= (rect.xmax-rect.xmin) / (scopes->track_preview->x-2.f);
- zoomy= (rect.ymax-rect.ymin) / (scopes->track_preview->y-2.f);
+ zoomx= (rect.xmax-rect.xmin) / (scopes->track_preview->x-2.0f);
+ zoomy= (rect.ymax-rect.ymin) / (scopes->track_preview->y-2.0f);
- off_x= ((int)scopes->track_pos[0]-scopes->track_pos[0]-0.5)*zoomx;
- off_y= ((int)scopes->track_pos[1]-scopes->track_pos[1]-0.5)*zoomy;
+ off_x= ((int)scopes->track_pos[0]-scopes->track_pos[0]-0.5f)*zoomx;
+ off_y= ((int)scopes->track_pos[1]-scopes->track_pos[1]-0.5f)*zoomy;
drawibuf= scale_trackpreview_ibuf(scopes->track_preview, zoomx, zoomy);
glaDrawPixelsSafe(off_x+rect.xmin, off_y+rect.ymin, rect.xmax-rect.xmin+1.f-off_x, rect.ymax-rect.ymin+1.f-off_y, drawibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, drawibuf->rect);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index c871c87983c..7338aa1983f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -3231,7 +3231,7 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, wmNDOF
{
float *hsv= ui_block_hsv_get(but->block);
float rgb[3];
- float sensitivity = (shift?0.15:0.3) * ndof->dt;
+ float sensitivity = (shift ? 0.15f : 0.3f) * ndof->dt;
int color_profile = but->block->color_profile;
@@ -3426,7 +3426,7 @@ static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, wmND
rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
/* Convert current colour on hue/sat disc to circular coordinates phi, r */
- phi = fmodf(hsv[0]+0.25f, 1.0f) * -2.0f*M_PI;
+ phi = fmodf(hsv[0] + 0.25f, 1.0f) * -2.0f * (float)M_PI;
r = hsv[1];
/* sqr= r>0.f?sqrtf(r):1; */ /* UNUSED */
@@ -3439,7 +3439,7 @@ static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, wmND
v[1] += ndof->rx * sensitivity;
/* convert back to polar coords on circle */
- phi = atan2(v[0], v[1])/(2.0f*(float)M_PI) + 0.5f;
+ phi = atan2f(v[0], v[1])/(2.0f*(float)M_PI) + 0.5f;
/* use ndof z rotation to additionally rotate hue */
phi -= ndof->rz * sensitivity * 0.5f;
@@ -5471,6 +5471,38 @@ void uiContextActivePropertyHandle(bContext *C)
}
}
+wmOperator *uiContextActiveOperator(const struct bContext *C)
+{
+ ARegion *ar_ctx= CTX_wm_region(C);
+ uiBlock *block;
+
+ /* scan active regions ui */
+ for(block=ar_ctx->uiblocks.first; block; block=block->next) {
+ if (block->ui_operator) {
+ return block->ui_operator;
+ }
+ }
+
+ /* scan popups */
+ {
+ bScreen *sc= CTX_wm_screen(C);
+ ARegion *ar;
+
+ for (ar= sc->regionbase.first; ar; ar= ar->next) {
+ if (ar == ar_ctx) {
+ continue;
+ }
+ for(block=ar->uiblocks.first; block; block=block->next) {
+ if (block->ui_operator) {
+ return block->ui_operator;
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
+
/* helper function for insert keyframe, reset to default, etc operators */
void uiContextAnimUpdate(const bContext *C)
{
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index aa4158ad4b7..16e0153b910 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -314,7 +314,10 @@ struct uiBlock {
ListBase saferct; // uiSafetyRct list
uiPopupBlockHandle *handle; // handle
-
+
+ struct wmOperator *ui_operator;// use so presets can find the operator,
+ // across menus and from nested popups which fail for operator context.
+
void *evil_C; // XXX hack for dynamic operator enums
struct UnitSettings *unit; // unit system, used a lot for numeric buttons so include here rather then fetching through the scene every time.
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index add023c940b..32bcfe51afc 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -2767,6 +2767,8 @@ void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,in
PointerRNA op_ptr;
uiLayout *row;
+ uiLayoutGetBlock(layout)->ui_operator= op;
+
row= uiLayoutRow(layout, TRUE);
uiItemM(row, (bContext *)C, "WM_MT_operator_presets", NULL, ICON_NONE);
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 9a253952e6d..aa80cb632ec 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -43,6 +43,8 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLF_translation.h"
+
#include "DNA_userdef_types.h"
#include "BKE_context.h"
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 8334986a76f..6e51443fc8d 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_anim_types.h"
+#include "DNA_dynamicpaint_types.h"
#include "DNA_key_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
@@ -40,9 +41,12 @@
#include "BLI_string.h"
#include "BLI_ghash.h"
+#include "BLF_translation.h"
+
#include "BKE_animsys.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
+#include "BKE_dynamicpaint.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -332,7 +336,7 @@ static const char *template_id_browse_tip(StructRNA *type)
return N_("Browse ID data to be linked");
}
-static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag, const char *newop, const char *openop, const char *unlinkop)
+static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, short idcode, int flag, const char *newop, const char *openop, const char *unlinkop)
{
uiBut *but;
uiBlock *block;
@@ -478,6 +482,9 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if((idfrom && idfrom->lib) || !editable)
uiButSetFlag(but, UI_BUT_DISABLED);
}
+
+ if(idcode == ID_TE)
+ uiTemplateTextureShow(layout, C, &template->ptr, template->prop);
uiBlockEndAlign(block);
}
@@ -487,6 +494,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const
TemplateID *template;
PropertyRNA *prop;
StructRNA *type;
+ short idcode;
prop= RNA_struct_find_property(ptr, propname);
@@ -507,14 +515,15 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const
flag |= UI_ID_OPEN;
type= RNA_property_pointer_type(ptr, prop);
- template->idlb= which_libbase(CTX_data_main(C), RNA_type_to_ID_code(type));
+ idcode= RNA_type_to_ID_code(type);
+ template->idlb= which_libbase(CTX_data_main(C), idcode);
/* create UI elements for this template
* - template_ID makes a copy of the template data and assigns it to the relevant buttons
*/
if(template->idlb) {
uiLayoutRow(layout, 1);
- template_ID(C, layout, template, type, flag, newop, openop, unlinkop);
+ template_ID(C, layout, template, type, idcode, flag, newop, openop, unlinkop);
}
MEM_freeN(template);
@@ -684,7 +693,7 @@ static int modifier_can_delete(ModifierData *md)
static int modifier_is_simulation(ModifierData *md)
{
// Physic Tab
- if(ELEM6(md->type, eModifierType_Cloth, eModifierType_Collision, eModifierType_Fluidsim, eModifierType_Smoke, eModifierType_Softbody, eModifierType_Surface)) {
+ if(ELEM7(md->type, eModifierType_Cloth, eModifierType_Collision, eModifierType_Fluidsim, eModifierType_Smoke, eModifierType_Softbody, eModifierType_Surface, eModifierType_DynamicPaint)) {
return 1;
}
// Particle Tab
@@ -2047,6 +2056,13 @@ static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon, int
else if(RNA_struct_is_a(itemptr->type, &RNA_TextureSlot)) {
id= RNA_pointer_get(itemptr, "texture").data;
}
+ else if(RNA_struct_is_a(itemptr->type, &RNA_DynamicPaintSurface)) {
+ DynamicPaintSurface *surface= (DynamicPaintSurface*)itemptr->data;
+
+ if (surface->format == MOD_DPAINT_SURFACE_F_PTEX) return ICON_TEXTURE_SHADED;
+ else if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) return ICON_OUTLINER_DATA_MESH;
+ else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) return ICON_FILE_IMAGE;
+ }
/* get icon from ID */
if(id) {
@@ -2164,6 +2180,25 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
/* nothing else special to do... */
uiItemL(sub, name, icon); /* fails, backdrop LISTROW... */
}
+ else if(itemptr->type == &RNA_DynamicPaintSurface) {
+ char name_final[96];
+ const char *enum_name;
+ PropertyRNA *prop = RNA_struct_find_property(itemptr, "surface_type");
+ DynamicPaintSurface *surface= (DynamicPaintSurface*)itemptr->data;
+
+ RNA_property_enum_name(C, itemptr, prop, RNA_property_enum_get(itemptr, prop), &enum_name);
+
+ BLI_snprintf(name_final, sizeof(name_final), "%s (%s)",name,enum_name);
+ uiItemL(sub, name_final, icon);
+ if (dynamicPaint_surfaceHasColorPreview(surface)) {
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ uiDefIconButR(block, OPTION, 0, (surface->flags & MOD_DPAINT_PREVIEW) ? ICON_RESTRICT_VIEW_OFF : ICON_RESTRICT_VIEW_ON,
+ 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "show_preview", 0, 0, 0, 0, 0, NULL);
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+ uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "is_active", i, 0, 0, 0, 0, NULL);
+ }
+
/* 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,
* this tries to add controls for all properties of the item listed in that string property.
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index 90002611fbd..4581721a776 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -1617,41 +1617,33 @@ void init_userdef_do_versions(void)
}
}
- if (bmain->versionfile < 258 || (bmain->versionfile == 258 && bmain->subversionfile < 1)) {
- bTheme *btheme;
-
- /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead */
- if (U.keyhandles_new == HD_AUTO)
- U.keyhandles_new = HD_AUTO_ANIM;
-
- /* theme color additions */
- for (btheme= U.themes.first; btheme; btheme= btheme->next) {
- /* auto-clamped handles -> based on auto */
- SETCOL(btheme->tipo.handle_auto_clamped, 0x99, 0x40, 0x30, 255);
- SETCOL(btheme->tipo.handle_sel_auto_clamped, 0xf0, 0xaf, 0x90, 255);
- }
- }
-
if (bmain->versionfile < 259 || (bmain->versionfile == 259 && bmain->subversionfile < 1)) {
bTheme *btheme;
-
+
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
btheme->tv3d.speaker[3] = 255;
}
}
- {
+ if (bmain->versionfile < 260 || (bmain->versionfile == 260 && bmain->subversionfile < 3)) {
bTheme *btheme;
- for(btheme= U.themes.first; btheme; btheme= btheme->next) {
+
+ /* if new keyframes handle default is stuff "auto", make it "auto-clamped" instead
+ * was changed in 260 as part of GSoC11, but version patch was wrong
+ */
+ if (U.keyhandles_new == HD_AUTO)
+ U.keyhandles_new = HD_AUTO_ANIM;
+
+ for(btheme= U.themes.first; btheme; btheme= btheme->next) {
if(btheme->tv3d.bundle_solid[3] == 0)
SETCOL(btheme->tv3d.bundle_solid, 200, 200, 200, 255);
-
+
if(btheme->tv3d.camera_path[3] == 0)
SETCOL(btheme->tv3d.camera_path, 0x00, 0x00, 0x00, 255);
-
+
if((btheme->tclip.back[3]) == 0) {
btheme->tclip= btheme->tv3d;
-
+
SETCOL(btheme->tclip.marker_outline, 0x00, 0x00, 0x00, 255);
SETCOL(btheme->tclip.marker, 0x7f, 0x7f, 0x00, 255);
SETCOL(btheme->tclip.act_marker, 0xff, 0xff, 0xff, 255);
@@ -1666,6 +1658,19 @@ void init_userdef_do_versions(void)
SETCOL(btheme->tclip.handle_vertex_select, 0xff, 0xff, 0, 0xff);
btheme->tclip.handle_vertex_size= 4;
}
+
+ /* auto-clamped handles -> based on auto */
+ if(btheme->tipo.handle_auto_clamped[3] == 0)
+ SETCOL(btheme->tipo.handle_auto_clamped, 0x99, 0x40, 0x30, 255);
+ if(btheme->tipo.handle_sel_auto_clamped[3] == 0)
+ SETCOL(btheme->tipo.handle_sel_auto_clamped, 0xf0, 0xaf, 0x90, 255);
+ }
+
+ /* enable (Cycles) addon by default */
+ if(!BLI_findstring(&U.addons, "cycles", offsetof(bAddon, module))) {
+ bAddon *baddon= MEM_callocN(sizeof(bAddon), "bAddon");
+ BLI_strncpy(baddon->module, "cycles", sizeof(baddon->module));
+ BLI_addtail(&U.addons, baddon);
}
}
diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c
index 0c0163d0f24..845cc29c91b 100644
--- a/source/blender/editors/mesh/editmesh_lib.c
+++ b/source/blender/editors/mesh/editmesh_lib.c
@@ -525,9 +525,9 @@ void EM_set_flag_all(EditMesh *em, int flag)
void EM_set_flag_all_selectmode(EditMesh *em, int flag)
{
- EditVert *eve;
- EditEdge *eed;
- EditFace *efa;
+ EditVert *eve;
+ EditEdge *eed;
+ EditFace *efa;
int selvert= 0, seledge= 0, selface= 0;
diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c
index a671de71636..70cbbf5a93c 100644
--- a/source/blender/editors/mesh/editmesh_loop.c
+++ b/source/blender/editors/mesh/editmesh_loop.c
@@ -546,21 +546,21 @@ static float seg_intersect(EditEdge *e, CutCurve *c, int len, char mode, struct
m1=MAXSLOPE;
b1=x12;
}
- x2max=MAX2(x21,x22)+0.001; /* prevent missed edges */
- x2min=MIN2(x21,x22)-0.001; /* due to round off error */
- y2max=MAX2(y21,y22)+0.001;
- y2min=MIN2(y21,y22)-0.001;
+ x2max=MAX2(x21,x22)+0.001f; /* prevent missed edges */
+ x2min=MIN2(x21,x22)-0.001f; /* due to round off error */
+ y2max=MAX2(y21,y22)+0.001f;
+ y2min=MIN2(y21,y22)-0.001f;
/* Found an intersect, calc intersect point */
if (m1==m2){ /* co-incident lines */
/* cut at 50% of overlap area*/
x1max=MAX2(x11, x12);
x1min=MIN2(x11, x12);
- xi= (MIN2(x2max,x1max)+MAX2(x2min,x1min))/2.0;
+ xi= (MIN2(x2max,x1max)+MAX2(x2min,x1min))/2.0f;
y1max=MAX2(y11, y12);
y1min=MIN2(y11, y12);
- yi= (MIN2(y2max,y1max)+MAX2(y2min,y1min))/2.0;
+ yi= (MIN2(y2max,y1max)+MAX2(y2min,y1min))/2.0f;
}
else if (m2==MAXSLOPE){
xi=x22;
@@ -594,7 +594,7 @@ static float seg_intersect(EditEdge *e, CutCurve *c, int len, char mode, struct
}
}
}
- if ((m2<=1.0)&&(m2>=-1.0)) perc = (xi-x21)/(x22-x21);
+ if ((m2 <= 1.0f) && (m2 >= -1.0f)) perc = (xi-x21)/(x22-x21);
else perc=(yi-y21)/(y22-y21); /*lower slope more accurate*/
//isect=32768.0*(perc+0.0000153); /* Percentage in 1/32768ths */
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index 04fe5ed36e3..1965e8e1613 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -1328,7 +1328,7 @@ void MESH_OT_select_similar(wmOperatorType *ot)
int mesh_layers_menu_charlen(CustomData *data, int type)
{
- int i, len = 0;
+ int i, len = 0;
/* see if there is a duplicate */
for(i=0; i<data->totlayer; i++) {
if((&data->layers[i])->type == type) {
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index eb60a32afce..fb2c7c154fc 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -1651,7 +1651,7 @@ static void fill_quad_single(EditMesh *em, EditFace *efa, struct GHash *gh, int
facecopy(em, efa,hold);
if(i+1 != (vertsize-1)/2) {
if(seltype == SUBDIV_SELECT_INNER) {
- hold->e3->f2 |= EDGEINNER;
+ hold->e3->f2 |= EDGEINNER;
}
}
}
@@ -1720,7 +1720,7 @@ static void fill_tri_single(EditMesh *em, EditFace *efa, struct GHash *gh, int n
hold = addfacelist(em, verts[i],verts[i+1],v[op],NULL,NULL,NULL);
if(i+1 != vertsize-1) {
if(seltype == SUBDIV_SELECT_INNER) {
- hold->e2->f2 |= EDGEINNER;
+ hold->e2->f2 |= EDGEINNER;
}
}
facecopy(em, efa,hold);
@@ -2369,7 +2369,7 @@ static void fill_quad_quadruple(EditMesh *em, EditFace *efa, struct GHash *gh, i
}
// Clean up our dynamic multi-dim array
for(i=0;i<numcuts+2;i++) {
- MEM_freeN(innerverts[i]);
+ MEM_freeN(innerverts[i]);
}
MEM_freeN(innerverts);
}
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index ed890fd9b90..46076d0bec4 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -51,6 +51,7 @@
#include "BKE_displist.h"
#include "BKE_image.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_report.h"
@@ -281,7 +282,26 @@ int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me)
CustomDataLayer *cdl;
int index;
- index= CustomData_get_active_layer_index(data, CD_MCOL);
+ index= CustomData_get_active_layer_index(data, CD_MCOL);
+ cdl= (index == -1)? NULL: &data->layers[index];
+
+ if(!cdl)
+ return 0;
+
+ delete_customdata_layer(C, ob, cdl);
+ DAG_id_tag_update(&me->id, 0);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+
+ return 1;
+}
+
+int ED_mesh_color_remove_named(bContext *C, Object *ob, Mesh *me, const char *name)
+{
+ CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
+ CustomDataLayer *cdl;
+ int index;
+
+ index= CustomData_get_named_layer_index(data, CD_MCOL, name);
cdl= (index == -1)? NULL: &data->layers[index];
if(!cdl)
@@ -331,6 +351,7 @@ void MESH_OT_uv_texture_add(wmOperatorType *ot)
static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
Base *base= ED_view3d_give_base_under_cursor(C, event->mval);
@@ -375,7 +396,7 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(me->edit_mesh==NULL)
return OPERATOR_CANCELLED;
- ED_uvedit_assign_image(scene, obedit, ima, NULL);
+ ED_uvedit_assign_image(bmain, scene, obedit, ima, NULL);
if(exitmode) {
load_editMesh(scene, obedit);
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 8d4d29dbe50..9b539871cbc 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -78,6 +78,7 @@
#include "BKE_particle.h"
#include "BKE_report.h"
#include "BKE_sca.h"
+#include "BKE_scene.h"
#include "BKE_speaker.h"
#include "BKE_texture.h"
@@ -92,6 +93,7 @@
#include "ED_curve.h"
#include "ED_mball.h"
#include "ED_mesh.h"
+#include "ED_node.h"
#include "ED_object.h"
#include "ED_render.h"
#include "ED_screen.h"
@@ -322,6 +324,7 @@ Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int en
/* more editor stuff */
ED_object_base_init_transform(C, BASACT, loc, rot);
+ DAG_id_type_tag(bmain, ID_OB);
DAG_scene_sort(bmain, scene);
ED_render_id_flush_update(bmain, ob->data);
@@ -700,7 +703,9 @@ static const char *get_lamp_defname(int type)
static int object_lamp_add_exec(bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
Object *ob;
+ Lamp *la;
int type= RNA_enum_get(op->ptr, "type");
int enter_editmode;
unsigned int layer;
@@ -711,9 +716,16 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer);
- ((Lamp*)ob->data)->type= type;
- rename_id((ID *)ob, get_lamp_defname(type));
- rename_id((ID *)ob->data, get_lamp_defname(type));
+ la= (Lamp*)ob->data;
+
+ la->type= type;
+ rename_id(&ob->id, get_lamp_defname(type));
+ rename_id(&la->id, get_lamp_defname(type));
+
+ if(scene_use_new_shading_nodes(scene)) {
+ ED_node_shader_default(scene, &la->id);
+ la->use_nodes= 1;
+ }
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index b36416151a9..0fbf5a8bd92 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -700,6 +700,9 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
+ /* nullify inverse matrix first */
+ unit_m4(data->invmat);
+
/* try to find a pose channel */
// TODO: get from context instead?
if (ob && ob->pose)
@@ -733,18 +736,15 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
where_is_pose(scene, ob);
}
else if (ob) {
- Object workob;
- /* use what_does_parent to find inverse - just like for normal parenting.
- * NOTE: what_does_parent uses a static workob defined in object.c
- */
+ Object workob = {{0}};
+
+ /* 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);
}
- else
- unit_m4(data->invmat);
-
+
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
-
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 4fbb5e0d51c..c39477cbf6c 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -475,7 +475,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
else if(ob->type==OB_FONT) {
scene->obedit= ob; // XXX for context
ok= 1;
- make_editText(ob);
+ make_editText(ob);
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_TEXT, scene);
}
@@ -536,9 +536,9 @@ static int editmode_toggle_poll(bContext *C)
return 0;
return (ob->type == OB_MESH || ob->type == OB_ARMATURE ||
- ob->type == OB_FONT || ob->type == OB_MBALL ||
- ob->type == OB_LATTICE || ob->type == OB_SURF ||
- ob->type == OB_CURVE);
+ ob->type == OB_FONT || ob->type == OB_MBALL ||
+ ob->type == OB_LATTICE || ob->type == OB_SURF ||
+ ob->type == OB_CURVE);
}
void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
@@ -1461,7 +1461,7 @@ void ED_objects_recalculate_paths(bContext *C, Scene *scene)
/* For the object with pose/action: create path curves for selected bones
* This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
*/
-static int object_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
+static int object_calculate_paths_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
@@ -1469,7 +1469,7 @@ static int object_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
{
/* verify makes sure that the selected bone has a bone with the appropriate settings */
- animviz_verify_motionpaths(scene, ob, NULL);
+ animviz_verify_motionpaths(op->reports, scene, ob, NULL);
}
CTX_DATA_END;
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 5bb1b634fe0..2a827091fde 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -465,8 +465,8 @@ static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *o
invert_m4_m4(ob->imat, ob->obmat);
/* apparently this call goes from right to left... */
- mul_serie_m4(hmd->parentinv, ob->imat, obedit->obmat, NULL,
- NULL, NULL, NULL, NULL, NULL);
+ mul_serie_m4(hmd->parentinv, ob->imat, obedit->obmat, NULL,
+ NULL, NULL, NULL, NULL, NULL);
DAG_scene_sort(bmain, scene);
}
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index d10a6be1988..fce37b7a022 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -296,8 +296,8 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
}
else if(nr==5) {
if(base->object->dup_group==ob->dup_group) {
- base->flag |= SELECT;
- changed = 1;
+ base->flag |= SELECT;
+ changed = 1;
}
}
else if(nr==6) {
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index a59ca5ad954..0d210fa83eb 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -1094,8 +1094,8 @@ static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, in
dm_deform_clear(dm, ob); dm = NULL;
}
}
- } while(wasChange && (distToStart-distToBe)/fabs(distToStart-distToBe) ==
- (dists[bestIndex]-distToBe)/fabs(dists[bestIndex]-distToBe));
+ } while(wasChange && (distToStart-distToBe)/fabsf(distToStart-distToBe) ==
+ (dists[bestIndex]-distToBe)/fabsf(dists[bestIndex]-distToBe));
MEM_freeN(upDown);
MEM_freeN(changes);
MEM_freeN(dists);
diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt
index 382e12cce6c..4d43c618568 100644
--- a/source/blender/editors/physics/CMakeLists.txt
+++ b/source/blender/editors/physics/CMakeLists.txt
@@ -35,6 +35,7 @@ set(INC_SYS
)
set(SRC
+ dynamicpaint_ops.c
particle_boids.c
particle_edit.c
particle_object.c
diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c
new file mode 100644
index 00000000000..550da63d7aa
--- /dev/null
+++ b/source/blender/editors/physics/dynamicpaint_ops.c
@@ -0,0 +1,422 @@
+/*
+ * ***** 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 *****
+ */
+
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "BLI_blenlib.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_dynamicpaint_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_blender.h"
+#include "BKE_context.h"
+#include "BKE_deform.h"
+#include "BKE_depsgraph.h"
+#include "BKE_dynamicpaint.h"
+#include "BKE_global.h"
+#include "BKE_modifier.h"
+#include "BKE_report.h"
+
+#include "ED_mesh.h"
+#include "ED_screen.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+/* Platform independend time */
+#include "PIL_time.h"
+
+#include "WM_types.h"
+#include "WM_api.h"
+
+static int surface_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ DynamicPaintModifierData *pmd = 0;
+ Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ DynamicPaintCanvasSettings *canvas;
+ DynamicPaintSurface *surface;
+
+ /* Make sure we're dealing with a canvas */
+ pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
+ if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED;
+
+ canvas = pmd->canvas;
+ surface = dynamicPaint_createNewSurface(canvas, CTX_data_scene(C));
+
+ if (!surface) return OPERATOR_CANCELLED;
+
+ /* set preview for this surface only and set active */
+ canvas->active_sur = 0;
+ for(surface=surface->prev; surface; surface=surface->prev) {
+ surface->flags &= ~MOD_DPAINT_PREVIEW;
+ canvas->active_sur++;
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+/* add surface slot */
+void DPAINT_OT_surface_slot_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Surface Slot";
+ ot->idname= "DPAINT_OT_surface_slot_add";
+ ot->description="Add a new Dynamic Paint surface slot";
+
+ /* api callbacks */
+ ot->exec= surface_slot_add_exec;
+ ot->poll= ED_operator_object_active_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int surface_slot_remove_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ DynamicPaintModifierData *pmd = 0;
+ Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ DynamicPaintCanvasSettings *canvas;
+ DynamicPaintSurface *surface;
+ int id=0;
+
+ /* Make sure we're dealing with a canvas */
+ pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
+ if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED;
+
+ canvas = pmd->canvas;
+ surface = canvas->surfaces.first;
+
+ /* find active surface and remove it */
+ for(; surface; surface=surface->next) {
+ if(id == canvas->active_sur) {
+ canvas->active_sur -= 1;
+ dynamicPaint_freeSurface(surface);
+ break;
+ }
+ id++;
+ }
+
+ dynamicPaint_resetPreview(canvas);
+ DAG_id_tag_update(&cObject->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, cObject);
+
+ return OPERATOR_FINISHED;
+}
+
+/* remove surface slot */
+void DPAINT_OT_surface_slot_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Remove Surface Slot";
+ ot->idname= "DPAINT_OT_surface_slot_remove";
+ ot->description="Remove the selected surface slot";
+
+ /* api callbacks */
+ ot->exec= surface_slot_remove_exec;
+ ot->poll= ED_operator_object_active_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int type_toggle_exec(bContext *C, wmOperator *op)
+{
+
+ Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Scene *scene = CTX_data_scene(C);
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
+ int type= RNA_enum_get(op->ptr, "type");
+
+ if (!pmd) return OPERATOR_CANCELLED;
+
+ /* if type is already enabled, toggle it off */
+ if (type == MOD_DYNAMICPAINT_TYPE_CANVAS && pmd->canvas) {
+ dynamicPaint_freeCanvas(pmd);
+ }
+ else if (type == MOD_DYNAMICPAINT_TYPE_BRUSH && pmd->brush) {
+ dynamicPaint_freeBrush(pmd);
+ }
+ /* else create a new type */
+ else {
+ if (!dynamicPaint_createType(pmd, type, scene))
+ return OPERATOR_CANCELLED;
+ }
+
+ /* update dependancy */
+ DAG_id_tag_update(&cObject->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, cObject);
+ DAG_scene_sort(CTX_data_main(C), scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void DPAINT_OT_type_toggle(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name= "Toggle Type Active";
+ ot->idname= "DPAINT_OT_type_toggle";
+ ot->description = "Toggles whether given type is active or not";
+
+ /* api callbacks */
+ ot->exec= type_toggle_exec;
+ ot->poll= ED_operator_object_active_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ prop= RNA_def_enum(ot->srna, "type", prop_dynamicpaint_type_items, MOD_DYNAMICPAINT_TYPE_CANVAS, "Type", "");
+ ot->prop= prop;
+}
+
+static int output_toggle_exec(bContext *C, wmOperator *op)
+{
+
+ Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ Scene *scene = CTX_data_scene(C);
+ DynamicPaintSurface *surface;
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
+ int index= RNA_int_get(op->ptr, "index");
+
+ if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED;
+ surface = get_activeSurface(pmd->canvas);
+
+ /* if type is already enabled, toggle it off */
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ int exists = dynamicPaint_outputLayerExists(surface, ob, index);
+ char *name;
+
+ if (index == 0)
+ name = surface->output_name;
+ else if (index == 1)
+ name = surface->output_name2;
+
+ /* Vertex Color Layer */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ if (!exists)
+ ED_mesh_color_add(C, scene, ob, ob->data, name, 1);
+ else
+ ED_mesh_color_remove_named(C, ob, ob->data, name);
+ }
+ /* Vertex Weight Layer */
+ else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
+ if (!exists)
+ ED_vgroup_add_name(ob, name);
+ else {
+ bDeformGroup *defgroup = defgroup_find_name(ob, name);
+ if (defgroup) ED_vgroup_delete(ob, defgroup);
+ }
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void DPAINT_OT_output_toggle(wmOperatorType *ot)
+{
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name= "Toggle Output Layer";
+ ot->idname= "DPAINT_OT_output_toggle";
+ ot->description = "Adds or removes Dynamic Paint output data layer";
+
+ /* api callbacks */
+ ot->exec= output_toggle_exec;
+ ot->poll= ED_operator_object_active_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ prop= RNA_def_int(ot->srna, "index", 0, 0, 1, "Index", "", 0, 1);
+ ot->prop= prop;
+}
+
+
+/***************************** Image Sequence Baking ******************************/
+
+/*
+* Do actual bake operation. Loop through to-be-baked frames.
+* Returns 0 on failture.
+*/
+static int dynamicPaint_bakeImageSequence(bContext *C, DynamicPaintSurface *surface, Object *cObject)
+{
+ DynamicPaintCanvasSettings *canvas = surface->canvas;
+ Scene *scene= CTX_data_scene(C);
+ wmWindow *win = CTX_wm_window(C);
+ int frame = 1;
+ int frames;
+
+ frames = surface->end_frame - surface->start_frame + 1;
+ if (frames <= 0) {BLI_strncpy(canvas->error, "No frames to bake.", sizeof(canvas->error)); return 0;}
+
+ /* Set frame to start point (also inits modifier data) */
+ frame = surface->start_frame;
+ scene->r.cfra = (int)frame;
+ ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
+
+ /* Init surface */
+ if (!dynamicPaint_createUVSurface(surface)) return 0;
+
+ /* Loop through selected frames */
+ for (frame=surface->start_frame; frame<=surface->end_frame; frame++)
+ {
+ float progress = (frame - surface->start_frame) / (float)frames * 100;
+ surface->current_frame = frame;
+
+ /* If user requested stop (esc), quit baking */
+ if (blender_test_break()) return 0;
+
+ /* Update progress bar cursor */
+ WM_timecursor(win, (int)progress);
+
+ /* calculate a frame */
+ scene->r.cfra = (int)frame;
+ ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
+ if (!dynamicPaint_calculateFrame(surface, scene, cObject, frame)) return 0;
+
+ /*
+ * Save output images
+ */
+ {
+ char filename[FILE_MAX];
+ /* make sure output path has ending slash */
+ BLI_add_slash(surface->image_output_path);
+
+ /* primary output layer */
+ if (surface->flags & MOD_DPAINT_OUT1) {
+ /* set filepath */
+ BLI_snprintf(filename, sizeof(filename), "%s%s", surface->image_output_path, surface->output_name);
+ BLI_path_frame(filename, frame, 4);
+ /* save image */
+ dynamicPaint_outputSurfaceImage(surface, filename, 0);
+ }
+ /* secondary output */
+ if (surface->flags & MOD_DPAINT_OUT2 && surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+ /* set filepath */
+ BLI_snprintf(filename, sizeof(filename), "%s%s", surface->image_output_path, surface->output_name2);
+ BLI_path_frame(filename, frame, 4);
+ /* save image */
+ dynamicPaint_outputSurfaceImage(surface, filename, 1);
+ }
+ }
+ }
+ return 1;
+}
+
+
+/*
+* Bake Dynamic Paint image sequence surface
+*/
+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;
+ int status = 0;
+ double timer = PIL_check_seconds_timer();
+ char result_str[80];
+ DynamicPaintSurface *surface;
+
+ /*
+ * Get modifier data
+ */
+ pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
+ if (!pmd) {
+ BKE_report(op->reports, RPT_ERROR, "Bake Failed: No Dynamic Paint modifier found.");
+ return 0;
+ }
+
+ /* Make sure we're dealing with a canvas */
+ canvas = pmd->canvas;
+ if (!canvas) {
+ BKE_report(op->reports, RPT_ERROR, "Bake Failed: Invalid Canvas.");
+ return 0;
+ }
+ surface = get_activeSurface(canvas);
+
+ /* Set state to baking and init surface */
+ canvas->error[0] = '\0';
+ canvas->flags |= MOD_DPAINT_BAKING;
+ G.afbreek= 0; /* reset blender_test_break*/
+
+ /* Bake Dynamic Paint */
+ status = dynamicPaint_bakeImageSequence(C, surface, ob);
+ /* Clear bake */
+ canvas->flags &= ~MOD_DPAINT_BAKING;
+ WM_cursor_restore(CTX_wm_window(C));
+ dynamicPaint_freeSurfaceData(surface);
+
+ /* Bake was successful:
+ * Report for ended bake and how long it took */
+ if (status) {
+ /* Format time string */
+ char time_str[30];
+ double time = PIL_check_seconds_timer() - timer;
+ BLI_timestr(time, time_str);
+
+ /* Show bake info */
+ BLI_snprintf(result_str, sizeof(result_str), "Bake Complete! (%s)", time_str);
+ BKE_report(op->reports, RPT_INFO, result_str);
+ }
+ else {
+ if (strlen(canvas->error)) { /* If an error occured */
+ BLI_snprintf(result_str, sizeof(result_str), "Bake Failed: %s", canvas->error);
+ BKE_report(op->reports, RPT_ERROR, result_str);
+ }
+ else { /* User cancelled the bake */
+ BLI_strncpy(result_str, "Baking Cancelled!", sizeof(result_str));
+ BKE_report(op->reports, RPT_WARNING, result_str);
+ }
+ }
+
+ return status;
+}
+
+static int dynamicpaint_bake_exec(bContext *C, wmOperator *op)
+{
+ /* Bake dynamic paint */
+ if(!dynamicPaint_initBake(C, op)) {
+ return OPERATOR_CANCELLED;}
+
+ return OPERATOR_FINISHED;
+}
+
+void DPAINT_OT_bake(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Dynamic Paint Bake";
+ ot->description= "Bake dynamic paint image sequence surface";
+ ot->idname= "DPAINT_OT_bake";
+
+ /* api callbacks */
+ ot->exec= dynamicpaint_bake_exec;
+ ot->poll= ED_operator_object_active_editable;
+}
diff --git a/source/blender/editors/physics/physics_intern.h b/source/blender/editors/physics/physics_intern.h
index b4a38cfdce4..9d6b5884cbd 100644
--- a/source/blender/editors/physics/physics_intern.h
+++ b/source/blender/editors/physics/physics_intern.h
@@ -93,6 +93,13 @@ void BOID_OT_state_move_down(struct wmOperatorType *ot);
/* physics_fluid.c */
void FLUID_OT_bake(struct wmOperatorType *ot);
+/* dynamicpaint.c */
+void DPAINT_OT_bake(struct wmOperatorType *ot);
+void DPAINT_OT_surface_slot_add(struct wmOperatorType *ot);
+void DPAINT_OT_surface_slot_remove(struct wmOperatorType *ot);
+void DPAINT_OT_type_toggle(struct wmOperatorType *ot);
+void DPAINT_OT_output_toggle(struct wmOperatorType *ot);
+
/* physics_pointcache.c */
void PTCACHE_OT_bake_all(struct wmOperatorType *ot);
void PTCACHE_OT_free_bake_all(struct wmOperatorType *ot);
diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c
index c0f86673e8f..e39b4b97d72 100644
--- a/source/blender/editors/physics/physics_ops.c
+++ b/source/blender/editors/physics/physics_ops.c
@@ -164,6 +164,17 @@ static void operatortypes_pointcache(void)
WM_operatortype_append(PTCACHE_OT_remove);
}
+/********************************* dynamic paint ***********************************/
+
+static void operatortypes_dynamicpaint(void)
+{
+ WM_operatortype_append(DPAINT_OT_bake);
+ WM_operatortype_append(DPAINT_OT_surface_slot_add);
+ WM_operatortype_append(DPAINT_OT_surface_slot_remove);
+ WM_operatortype_append(DPAINT_OT_type_toggle);
+ WM_operatortype_append(DPAINT_OT_output_toggle);
+}
+
//static void keymap_pointcache(wmWindowManager *wm)
//{
// wmKeyMap *keymap= WM_keymap_find(wm, "Pointcache", 0, 0);
@@ -182,6 +193,7 @@ void ED_operatortypes_physics(void)
operatortypes_boids();
operatortypes_fluid();
operatortypes_pointcache();
+ operatortypes_dynamicpaint();
}
void ED_keymap_physics(wmKeyConfig *keyconf)
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index cb42cd786ed..9e2a2f54e0b 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -35,6 +35,8 @@
#include "DNA_sequence_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_windowmanager_types.h"
#include "BLI_utildefines.h"
@@ -50,6 +52,9 @@
#include "ED_object.h"
#include "ED_armature.h"
+#include "WM_api.h"
+#include "UI_interface.h"
+
#include "screen_intern.h"
const char *screen_context_dir[] = {
@@ -62,6 +67,7 @@ const char *screen_context_dir[] = {
"sculpt_object", "vertex_paint_object", "weight_paint_object",
"image_paint_object", "particle_edit_object",
"sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */
+ "active_operator",
NULL};
int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result)
@@ -387,6 +393,28 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
}
+ else if(CTX_data_equals(member, "active_operator")) {
+ wmOperator *op= NULL;
+
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ if(sfile) {
+ op= sfile->op;
+ }
+ else if ((op= uiContextActiveOperator(C))) {
+ /* do nothign */
+ }
+ else {
+ /* note, this checks poll, could be a problem, but this also
+ * happens for the toolbar */
+ op= WM_operator_last_redo(C);
+ }
+ /* TODO, get the operator from popup's */
+
+ if (op && op->ptr) {
+ CTX_data_pointer_set(result, NULL, &RNA_Operator, op);
+ return 1;
+ }
+ }
else {
return 0; /* not found */
}
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index a76be0c3c42..3a0202ad546 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -59,6 +59,7 @@
#include "ED_screen_types.h"
#include "ED_fileselect.h"
#include "ED_clip.h"
+#include "ED_render.h"
#include "UI_interface.h"
@@ -1425,6 +1426,7 @@ void ED_screen_delete(bContext *C, bScreen *sc)
/* only call outside of area/region loops */
void ED_screen_set_scene(bContext *C, Scene *scene)
{
+ Main *bmain= CTX_data_main(C);
bScreen *sc;
bScreen *curscreen= CTX_wm_screen(C);
@@ -1484,9 +1486,10 @@ void ED_screen_set_scene(bContext *C, Scene *scene)
}
CTX_data_scene_set(C, scene);
- set_scene_bg(CTX_data_main(C), scene);
+ set_scene_bg(bmain, scene);
- ED_update_for_newframe(CTX_data_main(C), scene, curscreen, 1);
+ ED_render_engine_changed(bmain);
+ ED_update_for_newframe(bmain, scene, curscreen, 1);
/* complete redraw */
WM_event_add_notifier(C, NC_WINDOW, NULL);
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index ce603ce80b6..e283927b76f 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -79,6 +79,7 @@
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_report.h"
+#include "BKE_scene.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -88,6 +89,7 @@
#include "ED_image.h"
#include "ED_screen.h"
#include "ED_sculpt.h"
+#include "ED_uvedit.h"
#include "ED_view3d.h"
#include "WM_api.h"
@@ -498,6 +500,40 @@ static void image_undo_free(ListBase *lb)
MEM_freeN(tile->rect);
}
+/* get active image for face depending on old/new shading system */
+
+static Image *imapaint_face_image(const ImagePaintState *s, int face_index)
+{
+ Image *ima;
+
+ if(scene_use_new_shading_nodes(s->scene)) {
+ MFace *mf = s->me->mface+face_index;
+ ED_object_get_active_image(s->ob, mf->mat_nr, &ima, NULL, NULL);
+ }
+ else {
+ MTFace *tf = s->me->mtface+face_index;
+ ima = tf->tpage;
+ }
+
+ return ima;
+}
+
+static Image *project_paint_face_image(const ProjPaintState *ps, int face_index)
+{
+ Image *ima;
+
+ if(scene_use_new_shading_nodes(ps->scene)) {
+ MFace *mf = ps->dm_mface+face_index;
+ ED_object_get_active_image(ps->ob, mf->mat_nr, &ima, NULL, NULL);
+ }
+ else {
+ MTFace *tf = ps->dm_mtface+face_index;
+ ima = tf->tpage;
+ }
+
+ return ima;
+}
+
/* fast projection bucket array lookup, use the safe version for bound checking */
static int project_bucket_offset(const ProjPaintState *ps, const float projCoSS[2])
{
@@ -670,6 +706,7 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float
int side;
int face_index;
MTFace *tf;
+ Image *ima;
ImBuf *ibuf;
int xi, yi;
@@ -687,8 +724,9 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float
else { /* QUAD */
interp_v2_v2v2v2(uv, tf->uv[0], tf->uv[2], tf->uv[3], w);
}
-
- ibuf = tf->tpage->ibufs.first; /* we must have got the imbuf before getting here */
+
+ ima = project_paint_face_image(ps, face_index);
+ ibuf = ima->ibufs.first; /* we must have got the imbuf before getting here */
if (!ibuf) return 0;
if (interp) {
@@ -1053,6 +1091,9 @@ static int check_seam(const ProjPaintState *ps, const int orig_face, const int o
/* Only need to check if 'i2_fidx' is valid because we know i1_fidx is the same vert on both faces */
if (i2_fidx != -1) {
+ Image *tpage = project_paint_face_image(ps, face_index);
+ Image *orig_tpage = project_paint_face_image(ps, orig_face);
+
/* This IS an adjacent face!, now lets check if the UVs are ok */
tf = ps->dm_mtface + face_index;
@@ -1061,7 +1102,7 @@ static int check_seam(const ProjPaintState *ps, const int orig_face, const int o
*orig_fidx = (i1_fidx < i2_fidx) ? i1_fidx : i2_fidx;
/* first test if they have the same image */
- if ( (orig_tf->tpage == tf->tpage) &&
+ if ( (orig_tpage == tpage) &&
cmp_uv(orig_tf->uv[orig_i1_fidx], tf->uv[i1_fidx]) &&
cmp_uv(orig_tf->uv[orig_i2_fidx], tf->uv[i2_fidx]) )
{
@@ -1308,9 +1349,10 @@ static float project_paint_uvpixel_mask(
if (ps->do_layer_stencil) {
/* another UV layers image is masking this one's */
ImBuf *ibuf_other;
+ Image *other_tpage = project_paint_face_image(ps, face_index);
const MTFace *tf_other = ps->dm_mtface_stencil + face_index;
- if (tf_other->tpage && (ibuf_other = BKE_image_get_ibuf(tf_other->tpage, NULL))) {
+ if (other_tpage && (ibuf_other = BKE_image_get_ibuf(other_tpage, NULL))) {
/* BKE_image_get_ibuf - TODO - this may be slow */
unsigned char rgba_ub[4];
float rgba_f[4];
@@ -1464,9 +1506,10 @@ static ProjPixel *project_paint_uvpixel_init(
if (ps->tool==PAINT_TOOL_CLONE) {
if (ps->dm_mtface_clone) {
ImBuf *ibuf_other;
+ Image *other_tpage = project_paint_face_image(ps, face_index);
const MTFace *tf_other = ps->dm_mtface_clone + face_index;
- if (tf_other->tpage && (ibuf_other = BKE_image_get_ibuf(tf_other->tpage, NULL))) {
+ if (other_tpage && (ibuf_other = BKE_image_get_ibuf(other_tpage, NULL))) {
/* BKE_image_get_ibuf - TODO - this may be slow */
if (ibuf->rect_float) {
@@ -2684,11 +2727,8 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index
LinkNode *node;
int face_index, image_index=0;
ImBuf *ibuf = NULL;
+ Image *tpage_last = NULL, *tpage;
Image *ima = NULL;
- MTFace *tf;
-
- Image *tpage_last = NULL;
-
if (ps->image_tot==1) {
/* Simple loop, no context switching */
@@ -2706,9 +2746,9 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index
face_index = GET_INT_FROM_POINTER(node->link);
/* Image context switching */
- tf = ps->dm_mtface+face_index;
- if (tpage_last != tf->tpage) {
- tpage_last = tf->tpage;
+ tpage = project_paint_face_image(ps, face_index);
+ if (tpage_last != tpage) {
+ tpage_last = tpage;
for (image_index=0; image_index < ps->image_tot; image_index++) {
if (ps->projImages[image_index].ima == tpage_last) {
@@ -2876,7 +2916,7 @@ static void project_paint_begin(ProjPaintState *ps)
LinkNode *node;
ProjPaintImage *projIma;
- Image *tpage_last = NULL;
+ Image *tpage_last = NULL, *tpage;
/* Face vars */
MFace *mf;
@@ -3210,7 +3250,9 @@ static void project_paint_begin(ProjPaintState *ps)
}
#endif
- if (tf->tpage && ((((Mesh *)ps->ob->data)->editflag & ME_EDIT_PAINT_MASK)==0 || mf->flag & ME_FACE_SEL)) {
+ tpage = project_paint_face_image(ps, face_index);
+
+ if (tpage && ((((Mesh *)ps->ob->data)->editflag & ME_EDIT_PAINT_MASK)==0 || mf->flag & ME_FACE_SEL)) {
float *v1coSS, *v2coSS, *v3coSS, *v4coSS=NULL;
@@ -3283,17 +3325,17 @@ static void project_paint_begin(ProjPaintState *ps)
}
}
- if (tpage_last != tf->tpage) {
+ if (tpage_last != tpage) {
- image_index = BLI_linklist_index(image_LinkList, tf->tpage);
+ image_index = BLI_linklist_index(image_LinkList, tpage);
- if (image_index==-1 && BKE_image_get_ibuf(tf->tpage, NULL)) { /* MemArena dosnt have an append func */
- BLI_linklist_append(&image_LinkList, tf->tpage);
+ if (image_index==-1 && BKE_image_get_ibuf(tpage, NULL)) { /* MemArena dosnt have an append func */
+ BLI_linklist_append(&image_LinkList, tpage);
image_index = ps->image_tot;
ps->image_tot++;
}
- tpage_last = tf->tpage;
+ tpage_last = tpage;
}
if (image_index != -1) {
@@ -4481,7 +4523,7 @@ static int imapaint_paint_stroke(ViewContext *vc, ImagePaintState *s, BrushPaint
) {
ImBuf *ibuf;
- newimage = (s->me->mtface+newfaceindex)->tpage;
+ newimage = imapaint_face_image(s, newfaceindex);
ibuf= BKE_image_get_ibuf(newimage, s->sima? &s->sima->iuser: NULL);
if(ibuf && ibuf->rect)
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 767001ff163..0e65383861b 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -423,15 +423,15 @@ static void paint_draw_alpha_overlay(Sculpt *sd, Brush *brush,
/* save lots of GL state
TODO: check on whether all of these are needed? */
glPushAttrib(GL_COLOR_BUFFER_BIT|
- GL_CURRENT_BIT|
- GL_DEPTH_BUFFER_BIT|
- GL_ENABLE_BIT|
- GL_LINE_BIT|
- GL_POLYGON_BIT|
- GL_STENCIL_BUFFER_BIT|
- GL_TRANSFORM_BIT|
- GL_VIEWPORT_BIT|
- GL_TEXTURE_BIT);
+ GL_CURRENT_BIT|
+ GL_DEPTH_BUFFER_BIT|
+ GL_ENABLE_BIT|
+ GL_LINE_BIT|
+ GL_POLYGON_BIT|
+ GL_STENCIL_BUFFER_BIT|
+ GL_TRANSFORM_BIT|
+ GL_VIEWPORT_BIT|
+ GL_TEXTURE_BIT);
if(load_tex(sd, brush, vc)) {
glEnable(GL_BLEND);
@@ -484,9 +484,9 @@ static void paint_draw_alpha_overlay(Sculpt *sd, Brush *brush,
/* set quad color */
glColor4f(U.sculpt_paint_overlay_col[0],
- U.sculpt_paint_overlay_col[1],
- U.sculpt_paint_overlay_col[2],
- brush->texture_overlay_alpha / 100.0f);
+ U.sculpt_paint_overlay_col[1],
+ U.sculpt_paint_overlay_col[2],
+ brush->texture_overlay_alpha / 100.0f);
/* draw textured quad */
glBegin(GL_QUADS);
@@ -619,7 +619,7 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
visual_strength = 1;
outline_alpha = ((paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ?
- min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f);
+ min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f);
if(sd->draw_anchored) {
final_radius = sd->anchored_size;
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 57f926b0612..7144ae3e31a 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -364,8 +364,9 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
me= get_mesh(ob);
if(me==NULL || me->totface==0) return;
- if(!me->mcol)
- make_vertexcol(ob);
+ if(!me->mcol) make_vertexcol(ob);
+ if(!me->mcol) return; /* possible we can't make mcol's */
+
selected= (me->editflag & ME_EDIT_PAINT_MASK);
@@ -1342,16 +1343,16 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot,
if(vgroup_validmap && total_changed < 0 && total_valid) {
totchange_allowed = total_valid;
}
+ /* the way you modify the unlocked+unchanged groups is different depending
+ * on whether or not you are painting the weight(s) up or down */
+ if(totchange < 0) {
+ totchange_allowed = total_valid - totchange_allowed;
+ }
+ else {
+ totchange_allowed *= -1;
+ }
/* there needs to be change allowed, or you should not bother */
if(totchange_allowed) {
- /* the way you modify the unlocked+unchanged groups is different depending
- * on whether or not you are painting the weight(s) up or down */
- if(totchange < 0) {
- totchange_allowed = total_valid - totchange_allowed;
- }
- else {
- totchange_allowed *= -1;
- }
left_over = 0;
if(fabsf(totchange_allowed) < fabsf(totchange)) {
/* this amount goes back onto the changed, unlocked weights */
@@ -1375,11 +1376,15 @@ static void enforce_locks(MDeformVert *odv, MDeformVert *ndv, int defbase_tot,
odw = defvert_find_index(odv, designatedw);
storedw = ndw->weight;
for(i = 0; i < ndv->totweight; i++) {
- if(change_status[ndw->def_nr] == 2) {
+ if(ndv->dw[i].def_nr == designatedw) {
+ continue;
+ }
+ ndw2 = &ndv->dw[i];
+ if(change_status[ndw2->def_nr] == 2) {
odw2 = &odv->dw[i];
- ndw2 = &ndv->dw[i];
+
if(!designatedw_changed) {
- ndw->weight = (totchange_allowed + odw->weight + odw2->weight)/(1.0f + ndw2->weight/ndw->weight);
+ ndw->weight = (-left_over + odw->weight + odw2->weight)/(1.0f + ndw2->weight/ndw->weight);
designatedw_changed = TRUE;
}
ndw2->weight = ndw->weight * ndw2->weight / storedw;
@@ -1675,8 +1680,14 @@ static void do_weight_paint_vertex( /* vars which remain the same for every vert
if(dv_copy.dw) {
MEM_freeN(dv_copy.dw);
}
+#if 0
/* dv may have been altered greatly */
dw = defvert_find_index(dv, vgroup);
+#else
+ dw = NULL; /* UNUSED after assignment, set to NULL to ensuyre we don't
+ * use again, we thats needed un-ifdef the line above */
+ (void)dw; /* quiet warnigns */
+#endif
if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */
int index_mirr= mesh_get_x_mirror_vert(ob, index);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index ac2efcb2ec2..a63a9256055 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -2450,7 +2450,7 @@ static void sculpt_combine_proxies(Sculpt *sd, Object *ob)
if(!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) {
/* these brushes start from original coordinates */
const int use_orco = (ELEM3(brush->sculpt_tool, SCULPT_TOOL_GRAB,
- SCULPT_TOOL_ROTATE, SCULPT_TOOL_THUMB));
+ SCULPT_TOOL_ROTATE, SCULPT_TOOL_THUMB));
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
for (n= 0; n < totnode; n++) {
@@ -2972,7 +2972,7 @@ static void sculpt_update_brush_delta(Sculpt *sd, Object *ob, Brush *brush)
if(cache->first_time) {
copy_v3_v3(cache->orig_grab_location,
- cache->true_location);
+ cache->true_location);
}
else if(tool == SCULPT_TOOL_SNAKE_HOOK)
add_v3_v3(cache->true_location, cache->grab_delta);
@@ -3246,7 +3246,7 @@ int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float ou
srd.hit = 0;
srd.original = (cache)? cache->original: 0;
BLI_pbvh_raycast(ss->pbvh, sculpt_raycast_cb, &srd,
- ray_start, ray_normal, srd.original);
+ ray_start, ray_normal, srd.original);
copy_v3_v3(out, ray_normal);
mul_v3_fl(out, srd.dist);
@@ -3506,9 +3506,9 @@ static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *even
return OPERATOR_CANCELLED;
stroke = paint_stroke_new(C, sculpt_stroke_get_location,
- sculpt_stroke_test_start,
- sculpt_stroke_update_step,
- sculpt_stroke_done, event->type);
+ sculpt_stroke_test_start,
+ sculpt_stroke_update_step,
+ sculpt_stroke_done, event->type);
op->customdata = stroke;
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index dc81fb1e8bc..f717b827a7e 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -728,8 +728,9 @@ static void actkeys_select_leftright (bAnimContext *ac, short leftright, short s
if (select_mode==SELECT_REPLACE) {
select_mode= SELECT_ADD;
- /* deselect all other channels and keyframes */
- ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ /* - deselect all other keyframes, so that just the newly selected remain
+ * - channels aren't deselected, since we don't re-select any as a consequence
+ */
deselect_action_keys(ac, 0, SELECT_SUBTRACT);
}
@@ -918,8 +919,6 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
KeyframeEditFunc select_cb, ok_cb;
KeyframeEditData ked= {{NULL}};
- /* initialise keyframe editing data */
-
/* set up BezTriple edit callbacks */
select_cb= ANIM_editkeyframes_select(select_mode);
ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME);
diff --git a/source/blender/editors/space_buttons/CMakeLists.txt b/source/blender/editors/space_buttons/CMakeLists.txt
index dbb96b68587..ee118f12062 100644
--- a/source/blender/editors/space_buttons/CMakeLists.txt
+++ b/source/blender/editors/space_buttons/CMakeLists.txt
@@ -38,6 +38,7 @@ set(SRC
buttons_context.c
buttons_header.c
buttons_ops.c
+ buttons_texture.c
space_buttons.c
buttons_intern.h
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index 6d6f73e98d8..9de804d275f 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -54,7 +54,6 @@
#include "BKE_screen.h"
#include "BKE_texture.h"
-
#include "RNA_access.h"
#include "ED_armature.h"
@@ -66,13 +65,6 @@
#include "buttons_intern.h" // own include
-typedef struct ButsContextPath {
- PointerRNA ptr[8];
- int len;
- int flag;
- int tex_ctx;
-} ButsContextPath;
-
static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
{
PointerRNA *ptr;
@@ -373,102 +365,141 @@ static int buttons_context_path_brush(ButsContextPath *path)
return 0;
}
-static int buttons_context_path_texture(ButsContextPath *path)
+static int buttons_context_path_texture(ButsContextPath *path, ButsContextTexture *ct)
{
- Material *ma;
- Lamp *la;
- Brush *br;
- World *wo;
- ParticleSystem *psys;
- Tex *tex;
- PointerRNA *ptr= &path->ptr[path->len-1];
- int orig_len = path->len;
+ if(ct) {
+ /* new shading system */
+ PointerRNA *ptr= &path->ptr[path->len-1];
+ ID *id;
- /* if we already have a (pinned) texture, we're done */
- if(RNA_struct_is_a(ptr->type, &RNA_Texture)) {
- return 1;
- }
- /* try brush */
- if((path->tex_ctx == SB_TEXC_BRUSH) && buttons_context_path_brush(path)) {
- br= path->ptr[path->len-1].data;
-
- if(br) {
- tex= give_current_brush_texture(br);
+ /* if we already have a (pinned) texture, we're done */
+ if(RNA_struct_is_a(ptr->type, &RNA_Texture))
+ return 1;
- RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ if(!ct->user)
+ return 0;
+
+ id= ct->user->id;
+
+ if(id) {
+ if(GS(id->name) == ID_BR)
+ buttons_context_path_brush(path);
+ else if(GS(id->name) == ID_MA)
+ buttons_context_path_material(path, 0);
+ else if(GS(id->name) == ID_WO)
+ buttons_context_path_world(path);
+ else if(GS(id->name) == ID_LA)
+ buttons_context_path_data(path, OB_LAMP);
+ else if(GS(id->name) == ID_PA)
+ buttons_context_path_particle(path);
+ else if(GS(id->name) == ID_OB)
+ buttons_context_path_object(path);
+ }
+
+ if(ct->texture) {
+ RNA_id_pointer_create(&ct->texture->id, &path->ptr[path->len]);
path->len++;
- return 1;
}
- }
- /* try world */
- if((path->tex_ctx == SB_TEXC_WORLD) && buttons_context_path_world(path)) {
- wo= path->ptr[path->len-1].data;
-
- if(wo && GS(wo->id.name)==ID_WO) {
- tex= give_current_world_texture(wo);
- RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
- path->len++;
+ return 1;
+ }
+ else {
+ /* old shading system */
+ Material *ma;
+ Lamp *la;
+ Brush *br;
+ World *wo;
+ ParticleSystem *psys;
+ Tex *tex;
+ PointerRNA *ptr= &path->ptr[path->len-1];
+ int orig_len = path->len;
+
+ /* if we already have a (pinned) texture, we're done */
+ if(RNA_struct_is_a(ptr->type, &RNA_Texture)) {
return 1;
}
- }
- /* try particles */
- if((path->tex_ctx == SB_TEXC_PARTICLES) && buttons_context_path_particle(path)) {
- if(path->ptr[path->len-1].type == &RNA_ParticleSettings) {
- ParticleSettings *part = path->ptr[path->len-1].data;
+ /* try brush */
+ if((path->tex_ctx == SB_TEXC_BRUSH) && buttons_context_path_brush(path)) {
+ br= path->ptr[path->len-1].data;
+
+ if(br) {
+ tex= give_current_brush_texture(br);
- tex= give_current_particle_texture(part);
- RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
- path->len++;
- return 1;
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
}
- else {
- psys= path->ptr[path->len-1].data;
+ /* try world */
+ if((path->tex_ctx == SB_TEXC_WORLD) && buttons_context_path_world(path)) {
+ wo= path->ptr[path->len-1].data;
- if(psys && psys->part && GS(psys->part->id.name)==ID_PA) {
- tex= give_current_particle_texture(psys->part);
+ if(wo && GS(wo->id.name)==ID_WO) {
+ tex= give_current_world_texture(wo);
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
path->len++;
return 1;
}
}
- }
- /* try material */
- if(buttons_context_path_material(path, 1)) {
- ma= path->ptr[path->len-1].data;
+ /* try particles */
+ if((path->tex_ctx == SB_TEXC_PARTICLES) && buttons_context_path_particle(path)) {
+ if(path->ptr[path->len-1].type == &RNA_ParticleSettings) {
+ ParticleSettings *part = path->ptr[path->len-1].data;
- if(ma) {
- tex= give_current_material_texture(ma);
+ tex= give_current_particle_texture(part);
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
+ else {
+ psys= path->ptr[path->len-1].data;
- RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
- path->len++;
- return 1;
+ if(psys && psys->part && GS(psys->part->id.name)==ID_PA) {
+ tex= give_current_particle_texture(psys->part);
+
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
+ }
}
- }
- /* try lamp */
- if(buttons_context_path_data(path, OB_LAMP)) {
- la= path->ptr[path->len-1].data;
+ /* try material */
+ if(buttons_context_path_material(path, 1)) {
+ ma= path->ptr[path->len-1].data;
- if(la) {
- tex= give_current_lamp_texture(la);
+ if(ma) {
+ tex= give_current_material_texture(ma);
- RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
- path->len++;
- return 1;
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
}
- }
- /* try brushes again in case of no material, lamp, etc */
- path->len = orig_len;
- if(buttons_context_path_brush(path)) {
- br= path->ptr[path->len-1].data;
-
- if(br) {
- tex= give_current_brush_texture(br);
+ /* try lamp */
+ if(buttons_context_path_data(path, OB_LAMP)) {
+ la= path->ptr[path->len-1].data;
+
+ if(la) {
+ tex= give_current_lamp_texture(la);
+
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
+ }
+ /* try brushes again in case of no material, lamp, etc */
+ path->len = orig_len;
+ if(buttons_context_path_brush(path)) {
+ br= path->ptr[path->len-1].data;
- RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
- path->len++;
- return 1;
+ if(br) {
+ tex= give_current_brush_texture(br);
+
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
}
}
@@ -530,7 +561,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
found= buttons_context_path_material(path, 0);
break;
case BCONTEXT_TEXTURE:
- found= buttons_context_path_texture(path);
+ found= buttons_context_path_texture(path, sbuts->texuser);
break;
case BCONTEXT_BONE:
found= buttons_context_path_bone(path);
@@ -580,6 +611,8 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
PointerRNA *ptr;
int a, pflag= 0, flag= 0;
+ buttons_texture_context_compute(C, sbuts);
+
if(!sbuts->path)
sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath");
@@ -649,8 +682,9 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
const char *buttons_context_dir[] = {
"world", "object", "mesh", "armature", "lattice", "curve",
"meta_ball", "lamp", "speaker", "camera", "material", "material_slot",
- "texture", "texture_slot", "bone", "edit_bone", "pose_bone", "particle_system", "particle_system_editable",
- "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL};
+ "texture", "texture_slot", "texture_user", "bone", "edit_bone",
+ "pose_bone", "particle_system", "particle_system_editable",
+ "cloth", "soft_body", "fluid", "smoke", "collision", "brush", "dynamic_paint", NULL};
int buttons_context(const bContext *C, const char *member, bContextDataResult *result)
{
@@ -710,7 +744,17 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
return 1;
}
else if(CTX_data_equals(member, "texture")) {
- set_pointer_type(path, result, &RNA_Texture);
+ ButsContextTexture *ct= sbuts->texuser;
+
+ if(ct) {
+ /* new shading system */
+ CTX_data_pointer_set(result, &ct->texture->id, &RNA_Texture, ct->texture);
+ }
+ else {
+ /* old shading system */
+ set_pointer_type(path, result, &RNA_Texture);
+ }
+
return 1;
}
else if(CTX_data_equals(member, "material_slot")) {
@@ -729,23 +773,52 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
return 1;
}
- else if(CTX_data_equals(member, "texture_node")) {
- PointerRNA *ptr;
+ else if(CTX_data_equals(member, "texture_user")) {
+ ButsContextTexture *ct= sbuts->texuser;
- if((ptr=get_pointer_type(path, &RNA_Material))) {
- Material *ma= ptr->data;
+ if(!ct)
+ return 0; /* old shading system */
- if(ma) {
- bNode *node= give_current_material_texture_node(ma);
- CTX_data_pointer_set(result, &ma->id, &RNA_Node, node);
- }
+ if(ct->user && ct->user->ptr.data) {
+ ButsTextureUser *user= ct->user;
+ CTX_data_pointer_set(result, user->ptr.id.data, user->ptr.type, user->ptr.data);
}
return 1;
}
+ else if(CTX_data_equals(member, "texture_node")) {
+ ButsContextTexture *ct= sbuts->texuser;
+
+ if(ct) {
+ /* new shading system */
+ if(ct->user && ct->user->node)
+ CTX_data_pointer_set(result, &ct->user->ntree->id, &RNA_Node, ct->user->node);
+
+ return 1;
+ }
+ else {
+ /* old shading system */
+ PointerRNA *ptr;
+
+ if((ptr=get_pointer_type(path, &RNA_Material))) {
+ Material *ma= ptr->data;
+
+ if(ma) {
+ bNode *node= give_current_material_texture_node(ma);
+ CTX_data_pointer_set(result, &ma->id, &RNA_Node, node);
+ }
+ }
+
+ return 1;
+ }
+ }
else if(CTX_data_equals(member, "texture_slot")) {
+ ButsContextTexture *ct= sbuts->texuser;
PointerRNA *ptr;
+ if(ct)
+ return 0; /* new shading system */
+
if((ptr=get_pointer_type(path, &RNA_Material))) {
Material *ma= ptr->data;
@@ -870,6 +943,16 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
set_pointer_type(path, result, &RNA_Brush);
return 1;
}
+ else if(CTX_data_equals(member, "dynamic_paint")) {
+ PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
+
+ if(ptr && ptr->data) {
+ Object *ob= ptr->data;
+ ModifierData *md= modifiers_findByType(ob, eModifierType_DynamicPaint);
+ CTX_data_pointer_set(result, &ob->id, &RNA_DynamicPaintModifier, md);
+ return 1;
+ }
+ }
else {
return 0; /* not found */
}
diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h
index 27084488163..aa692a940d8 100644
--- a/source/blender/editors/space_buttons/buttons_intern.h
+++ b/source/blender/editors/space_buttons/buttons_intern.h
@@ -31,14 +31,20 @@
#ifndef ED_BUTTONS_INTERN_H
#define ED_BUTTONS_INTERN_H
+#include "DNA_listBase.h"
+#include "RNA_types.h"
+
struct ARegion;
struct ARegionType;
+struct ID;
+struct SpaceButs;
+struct Tex;
struct bContext;
struct bContextDataResult;
-struct SpaceButs;
+struct bNode;
+struct bNodeTree;
struct uiLayout;
struct wmOperatorType;
-struct ID;
/* buts->scaflag */
#define BUTS_SENS_SEL 1
@@ -53,6 +59,42 @@ struct ID;
#define BUTS_SENS_STATE 512
#define BUTS_ACT_STATE 1024
+/* context data */
+
+typedef struct ButsContextPath {
+ PointerRNA ptr[8];
+ int len;
+ int flag;
+ int tex_ctx;
+} ButsContextPath;
+
+typedef struct ButsTextureUser {
+ struct ButsTextureUser *next, *prev;
+
+ struct ID *id;
+
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ struct bNodeTree *ntree;
+ struct bNode *node;
+
+ const char *category;
+ int icon;
+ const char *name;
+
+ int index;
+} ButsTextureUser;
+
+typedef struct ButsContextTexture {
+ ListBase users;
+
+ struct Tex *texture;
+
+ struct ButsTextureUser *user;
+ int index;
+} ButsContextTexture;
+
/* internal exports only */
/* buttons_header.c */
@@ -67,6 +109,9 @@ struct ID *buttons_context_id_path(const struct bContext *C);
extern const char *buttons_context_dir[]; /* doc access */
+/* buttons_texture.c */
+void buttons_texture_context_compute(const struct bContext *C, struct SpaceButs *sbuts);
+
/* buttons_ops.c */
void BUTTONS_OT_file_browse(struct wmOperatorType *ot);
void BUTTONS_OT_directory_browse(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c
new file mode 100644
index 00000000000..4446a2e848a
--- /dev/null
+++ b/source/blender/editors/space_buttons/buttons_texture.c
@@ -0,0 +1,469 @@
+/*
+ * $Id$
+ *
+ * ***** 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) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/space_buttons/buttons_texture.c
+ * \ingroup spbuttons
+ */
+
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_brush_types.h"
+#include "DNA_ID.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_world_types.h"
+
+#include "BKE_context.h"
+#include "BKE_material.h"
+#include "BKE_modifier.h"
+#include "BKE_node.h"
+#include "BKE_paint.h"
+#include "BKE_particle.h"
+#include "BKE_scene.h"
+
+#include "RNA_access.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "ED_node.h"
+#include "ED_screen.h"
+
+#include "../interface/interface_intern.h"
+
+#include "buttons_intern.h" // own include
+
+/************************* Texture User **************************/
+
+static void buttons_texture_user_property_add(ListBase *users, ID *id,
+ PointerRNA ptr, PropertyRNA *prop,
+ const char *category, int icon, const char *name)
+{
+ ButsTextureUser *user = MEM_callocN(sizeof(ButsTextureUser), "ButsTextureUser");
+
+ user->id= id;
+ user->ptr = ptr;
+ user->prop = prop;
+ user->category = category;
+ user->icon = icon;
+ user->name = name;
+ user->index = BLI_countlist(users);
+
+ BLI_addtail(users, user);
+}
+
+static void buttons_texture_user_node_add(ListBase *users, ID *id,
+ bNodeTree *ntree, bNode *node,
+ const char *category, int icon, const char *name)
+{
+ ButsTextureUser *user = MEM_callocN(sizeof(ButsTextureUser), "ButsTextureUser");
+
+ user->id= id;
+ user->ntree = ntree;
+ user->node = node;
+ user->category = category;
+ user->icon = icon;
+ user->name = name;
+ user->index = BLI_countlist(users);
+
+ BLI_addtail(users, user);
+}
+
+static void buttons_texture_users_find_nodetree(ListBase *users, ID *id,
+ bNodeTree *ntree, const char *category)
+{
+ bNode *node;
+
+ if(ntree) {
+ for(node=ntree->nodes.first; node; node=node->next) {
+ if(node->typeinfo->nclass == NODE_CLASS_TEXTURE) {
+ PointerRNA ptr;
+ /* PropertyRNA *prop; */ /* UNUSED */
+
+ RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
+ /* prop = RNA_struct_find_property(&ptr, "texture"); */ /* UNUSED */
+
+ buttons_texture_user_node_add(users, id, ntree, node,
+ category, RNA_struct_ui_icon(ptr.type), node->name);
+ }
+ else if(node->type == NODE_GROUP && node->id) {
+ buttons_texture_users_find_nodetree(users, id, (bNodeTree*)node->id, category);
+ }
+ }
+ }
+}
+
+static void buttons_texture_modifier_foreach(void *userData, Object *ob, ModifierData *md, const char *propname)
+{
+ PointerRNA ptr;
+ PropertyRNA *prop;
+ ListBase *users = userData;
+
+ RNA_pointer_create(&ob->id, &RNA_Modifier, md, &ptr);
+ prop = RNA_struct_find_property(&ptr, propname);
+
+ buttons_texture_user_property_add(users, &ob->id, ptr, prop,
+ "Modifiers", RNA_struct_ui_icon(ptr.type), md->name);
+}
+
+static void buttons_texture_users_from_context(ListBase *users, const bContext *C, SpaceButs *sbuts)
+{
+ Scene *scene= NULL;
+ Object *ob= NULL;
+ Material *ma= NULL;
+ Lamp *la= NULL;
+ World *wrld= NULL;
+ Brush *brush= NULL;
+ ID *pinid = sbuts->pinid;
+
+ /* get data from context */
+ if(pinid) {
+ if(GS(pinid->name) == ID_SCE)
+ scene= (Scene*)pinid;
+ else if(GS(pinid->name) == ID_OB)
+ ob= (Object*)pinid;
+ else if(GS(pinid->name) == ID_LA)
+ la= (Lamp*)pinid;
+ else if(GS(pinid->name) == ID_WO)
+ wrld= (World*)pinid;
+ else if(GS(pinid->name) == ID_MA)
+ ma= (Material*)pinid;
+ else if(GS(pinid->name) == ID_BR)
+ brush= (Brush*)pinid;
+ }
+
+ if(!scene)
+ scene= CTX_data_scene(C);
+
+ if(!(pinid || pinid == &scene->id)) {
+ ob= (scene->basact)? scene->basact->object: NULL;
+ wrld= scene->world;
+ brush= paint_brush(paint_get_active(scene));
+ }
+
+ if(ob && ob->type == OB_LAMP && !la)
+ la= ob->data;
+ if(ob && !ma)
+ ma= give_current_material(ob, ob->actcol);
+
+ /* fill users */
+ users->first = users->last = NULL;
+
+ if(ma)
+ buttons_texture_users_find_nodetree(users, &ma->id, ma->nodetree, "Material");
+ if(la)
+ buttons_texture_users_find_nodetree(users, &la->id, la->nodetree, "Lamp");
+ if(wrld)
+ buttons_texture_users_find_nodetree(users, &wrld->id, wrld->nodetree, "World");
+
+ if(ob) {
+ ParticleSystem *psys= psys_get_current(ob);
+ MTex *mtex;
+ int a;
+
+ /* modifiers */
+ modifiers_foreachTexLink(ob, buttons_texture_modifier_foreach, users);
+
+ /* particle systems */
+ if(psys) {
+ /* todo: these slots are not in the UI */
+ for(a=0; a<MAX_MTEX; a++) {
+ mtex = psys->part->mtex[a];
+
+ if(mtex) {
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ RNA_pointer_create(&psys->part->id, &RNA_ParticleSettingsTextureSlot, mtex, &ptr);
+ prop = RNA_struct_find_property(&ptr, "texture");
+
+ buttons_texture_user_property_add(users, &psys->part->id, ptr, prop,
+ "Particles", RNA_struct_ui_icon(&RNA_ParticleSettings), psys->name);
+ }
+ }
+ }
+
+ /* field */
+ if(ob->pd && ob->pd->forcefield == PFIELD_TEXTURE) {
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ RNA_pointer_create(&ob->id, &RNA_FieldSettings, ob->pd, &ptr);
+ prop = RNA_struct_find_property(&ptr, "texture");
+
+ buttons_texture_user_property_add(users, &ob->id, ptr, prop,
+ "Fields", ICON_FORCE_TEXTURE, "Texture Field");
+ }
+ }
+
+ /* brush */
+ if(brush) {
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ RNA_pointer_create(&brush->id, &RNA_BrushTextureSlot, &brush->mtex, &ptr);
+ prop= RNA_struct_find_property(&ptr, "texture");
+
+ buttons_texture_user_property_add(users, &brush->id, ptr, prop,
+ "Brush", ICON_BRUSH_DATA, brush->id.name+2);
+ }
+}
+
+void buttons_texture_context_compute(const bContext *C, SpaceButs *sbuts)
+{
+ /* gatheravailable texture users in context. runs on every draw of
+ properties editor, before the buttons are created. */
+ ButsContextTexture *ct= sbuts->texuser;
+ Scene *scene= CTX_data_scene(C);
+
+ if(!scene_use_new_shading_nodes(scene)) {
+ if(ct) {
+ MEM_freeN(ct);
+ BLI_freelistN(&ct->users);
+ sbuts->texuser= NULL;
+ }
+
+ return;
+ }
+
+ if(!ct) {
+ ct= MEM_callocN(sizeof(ButsContextTexture), "ButsContextTexture");
+ sbuts->texuser= ct;
+ }
+ else {
+ BLI_freelistN(&ct->users);
+ }
+
+ buttons_texture_users_from_context(&ct->users, C, sbuts);
+
+ /* set one user as active based on active index */
+ if(ct->index >= BLI_countlist(&ct->users))
+ ct->index= 0;
+
+ ct->user = BLI_findlink(&ct->users, ct->index);
+ ct->texture = NULL;
+
+ if(ct->user) {
+ if(ct->user->ptr.data) {
+ PointerRNA texptr;
+ Tex *tex;
+
+ /* get texture datablock pointer if it's a property */
+ texptr = RNA_property_pointer_get(&ct->user->ptr, ct->user->prop);
+ tex = (RNA_struct_is_a(texptr.type, &RNA_Texture))? texptr.data: NULL;
+
+ ct->texture = tex;
+ }
+ else if(ct->user->node && !(ct->user->node->flag & NODE_ACTIVE_TEXTURE)) {
+ ButsTextureUser *user;
+
+ /* detect change of active texture node in same node tree, in that
+ case we also automatically switch to the other node */
+ for(user=ct->users.first; user; user=user->next) {
+ if(user->ntree == ct->user->ntree && user->node != ct->user->node) {
+ if(user->node->flag & NODE_ACTIVE_TEXTURE) {
+ ct->user = user;
+ ct->index = BLI_findindex(&ct->users, user);
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+static void template_texture_select(bContext *C, void *user_p, void *UNUSED(arg))
+{
+ /* callback when selecting a texture user in the menu */
+ SpaceButs *sbuts = CTX_wm_space_buts(C);
+ ButsContextTexture *ct= (sbuts)? sbuts->texuser: NULL;
+ ButsTextureUser *user = (ButsTextureUser*)user_p;
+ PointerRNA texptr;
+ Tex *tex;
+
+ if(!ct)
+ return;
+
+ /* set user as active */
+ if(user->node) {
+ ED_node_set_active(CTX_data_main(C), user->ntree, user->node);
+ ct->texture = NULL;
+ }
+ else {
+ texptr = RNA_property_pointer_get(&user->ptr, user->prop);
+ tex = (RNA_struct_is_a(texptr.type, &RNA_Texture))? texptr.data: NULL;
+
+ ct->texture = tex;
+ }
+
+ ct->user = user;
+ ct->index = user->index;
+}
+
+static void template_texture_user_menu(bContext *C, uiLayout *layout, void *UNUSED(arg))
+{
+ /* callback when opening texture user selection menu, to create buttons. */
+ SpaceButs *sbuts = CTX_wm_space_buts(C);
+ ButsContextTexture *ct= (sbuts)? sbuts->texuser: NULL;
+ ButsTextureUser *user;
+ uiBlock *block = uiLayoutGetBlock(layout);
+ const char *last_category = NULL;
+
+ for(user=ct->users.first; user; user=user->next) {
+ uiBut *but;
+ char name[UI_MAX_NAME_STR];
+
+ /* add label per category */
+ if(!last_category || strcmp(last_category, user->category) != 0) {
+ uiItemL(layout, user->category, ICON_NONE);
+ but= block->buttons.last;
+ but->flag= UI_TEXT_LEFT;
+ }
+
+ /* create button */
+ BLI_snprintf(name, UI_MAX_NAME_STR, " %s", user->name);
+
+ but = uiDefIconTextBut(block, BUT, 0, user->icon, name, 0, 0, UI_UNIT_X*4, UI_UNIT_Y,
+ NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiButSetNFunc(but, template_texture_select, MEM_dupallocN(user), NULL);
+
+ last_category = user->category;
+ }
+}
+
+void uiTemplateTextureUser(uiLayout *layout, bContext *C)
+{
+ /* texture user selection dropdown menu. the available users have been
+ gathered before drawing in ButsContextTexture, we merely need to
+ display the current item. */
+ SpaceButs *sbuts = CTX_wm_space_buts(C);
+ ButsContextTexture *ct= (sbuts)? sbuts->texuser: NULL;
+ uiBlock *block = uiLayoutGetBlock(layout);
+ uiBut *but;
+ ButsTextureUser *user;
+ char name[UI_MAX_NAME_STR];
+
+ if(!ct)
+ return;
+
+ /* get current user */
+ user= ct->user;
+
+ if(!user) {
+ uiItemL(layout, "No textures in context.", ICON_NONE);
+ return;
+ }
+
+ /* create button */
+ BLI_snprintf(name, UI_MAX_NAME_STR, "%s", user->name);
+
+ if(user->icon) {
+ but= uiDefIconTextMenuBut(block, template_texture_user_menu, NULL,
+ user->icon, name, 0, 0, UI_UNIT_X*4, UI_UNIT_Y, "");
+ }
+ else {
+ but= uiDefMenuBut(block, template_texture_user_menu, NULL,
+ name, 0, 0, UI_UNIT_X*4, UI_UNIT_Y, "");
+ }
+
+ /* some cosmetic tweaks */
+ but->type= MENU;
+ but->flag |= UI_TEXT_LEFT;
+ but->flag &= ~UI_ICON_SUBMENU;
+}
+
+/************************* Texture Show **************************/
+
+static void template_texture_show(bContext *C, void *data_p, void *prop_p)
+{
+ SpaceButs *sbuts = CTX_wm_space_buts(C);
+ ButsContextTexture *ct= (sbuts)? sbuts->texuser: NULL;
+ ButsTextureUser *user;
+
+ if(!ct)
+ return;
+
+ for(user=ct->users.first; user; user=user->next)
+ if(user->ptr.data == data_p && user->prop == prop_p)
+ break;
+
+ if(user) {
+ /* select texture */
+ template_texture_select(C, user, NULL);
+
+ /* change context */
+ sbuts->mainb= BCONTEXT_TEXTURE;
+ sbuts->mainbuser= sbuts->mainb;
+ sbuts->preview= 1;
+
+ /* redraw editor */
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
+}
+
+void uiTemplateTextureShow(uiLayout *layout, bContext *C, PointerRNA *ptr, PropertyRNA *prop)
+{
+ /* button to quickly show texture in texture tab */
+ SpaceButs *sbuts = CTX_wm_space_buts(C);
+ ButsContextTexture *ct= (sbuts)? sbuts->texuser: NULL;
+ ButsTextureUser *user;
+
+ /* only show button in other tabs in properties editor */
+ if(!ct || sbuts->mainb == BCONTEXT_TEXTURE)
+ return;
+
+ /* find corresponding texture user */
+ for(user=ct->users.first; user; user=user->next)
+ if(user->ptr.data == ptr->data && user->prop == prop)
+ break;
+
+ /* draw button */
+ if(user) {
+ uiBlock *block = uiLayoutGetBlock(layout);
+ uiBut *but;
+
+ but= uiDefIconBut(block, BUT, 0, ICON_BUTS, 0, 0, UI_UNIT_X, UI_UNIT_Y,
+ NULL, 0.0, 0.0, 0.0, 0.0, "Show texture in texture tab");
+ uiButSetFunc(but, template_texture_show, user->ptr.data, user->prop);
+ }
+}
+
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 4c328d174e9..0c326af406f 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -104,6 +104,12 @@ static void buttons_free(SpaceLink *sl)
if(sbuts->path)
MEM_freeN(sbuts->path);
+
+ if(sbuts->texuser) {
+ ButsContextTexture *ct= sbuts->texuser;
+ BLI_freelistN(&ct->users);
+ MEM_freeN(ct);
+ }
}
/* spacetype; init callback */
@@ -127,6 +133,7 @@ static SpaceLink *buttons_duplicate(SpaceLink *sl)
/* clear or remove stuff from old */
sbutsn->ri= NULL;
sbutsn->path= NULL;
+ sbutsn->texuser= NULL;
return (SpaceLink *)sbutsn;
}
diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c
index 9eb96a9a4c5..630038d4c6b 100644
--- a/source/blender/editors/space_clip/clip_draw.c
+++ b/source/blender/editors/space_clip/clip_draw.c
@@ -936,7 +936,8 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
draw_marker_slide_zones(sc, track, marker, cur_pos, 1, 0, 0, width, height);
draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 0, 0, width, height);
- if(fp) fp+= 2;
+ if(fp)
+ fp+= 2;
}
}
@@ -950,20 +951,19 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
while(track) {
if((track->flag&TRACK_HIDDEN)==0) {
int act= track==act_track;
+ marker= BKE_tracking_get_marker(track, framenr);
- if(!act) {
- marker= BKE_tracking_get_marker(track, framenr);
-
- if(MARKER_VISIBLE(sc, marker)) {
+ if(MARKER_VISIBLE(sc, marker)) {
+ if(!act) {
copy_v2_v2(cur_pos, fp ? fp : marker->pos);
draw_marker_areas(sc, track, marker, cur_pos, width, height, 0, 1);
draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 1, 0, width, height);
}
- }
- if(MARKER_VISIBLE(sc, marker) && fp)
- fp+= 2;
+ if(fp)
+ fp+= 2;
+ }
}
track= track->next;
diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c
index 831b225386a..56ca1632bae 100644
--- a/source/blender/editors/space_clip/clip_graph_ops.c
+++ b/source/blender/editors/space_clip/clip_graph_ops.c
@@ -280,7 +280,7 @@ void CLIP_OT_graph_select(wmOperatorType *ot)
/* properties */
RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX,
- "Location", "Mouse location to select nearest entity closest to", -100.0f, 100.0f);
+ "Location", "Mouse location to select nearest entity", -100.0f, 100.0f);
RNA_def_boolean(ot->srna, "extend", 0,
"Extend", "Extend selection rather than clearing the existing selection");
}
diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c
index c52346fd4b6..d713303ca8b 100644
--- a/source/blender/editors/space_clip/clip_ops.c
+++ b/source/blender/editors/space_clip/clip_ops.c
@@ -555,8 +555,8 @@ static int view_zoom_inout_invoke(bContext *C, wmOperator *op, wmEvent *event, i
ED_space_clip_size(sc, &width, &height);
- sc->xof+= ((co[0]-0.5)*width-sc->xof)*(sc->zoom-oldzoom)/sc->zoom;
- sc->yof+= ((co[1]-0.5)*height-sc->yof)*(sc->zoom-oldzoom)/sc->zoom;
+ sc->xof+= ((co[0]-0.5f)*width-sc->xof)*(sc->zoom-oldzoom)/sc->zoom;
+ sc->yof+= ((co[1]-0.5f)*height-sc->yof)*(sc->zoom-oldzoom)/sc->zoom;
}
return OPERATOR_FINISHED;
@@ -970,7 +970,7 @@ void CLIP_OT_mode_set(wmOperatorType *ot)
/* identifiers */
ot->name= "Set Clip Mode";
- ot->description = "Sets the clip interaction mode";
+ ot->description = "Set the clip interaction mode";
ot->idname= "CLIP_OT_mode_set";
/* api callbacks */
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c
index e5bf053aa1c..e9006f5b1e9 100644
--- a/source/blender/editors/space_clip/tracking_ops.c
+++ b/source/blender/editors/space_clip/tracking_ops.c
@@ -1159,7 +1159,7 @@ void CLIP_OT_select_grouped(wmOperatorType *ot)
{2, "TRACKED", 0, "Tracked tracks", "Select all tracked tracks"},
{3, "LOCKED", 0, "Locked tracks", "Select all locked tracks"},
{4, "DISABLED", 0, "Disabled tracks", "Select all disabled tracks"},
- {5, "COLOR", 0, "Tracks with same color", "Select all tracks with same color as actiev track"},
+ {5, "COLOR", 0, "Tracks with same color", "Select all tracks with same color as active track"},
{6, "FAILED", 0, "Failed Tracks", "Select all tracks which failed to be reconstructed"},
{0, NULL, 0, NULL, NULL}
};
@@ -1317,8 +1317,8 @@ static void track_markers_startjob(void *tmv, short *stop, short *do_update, flo
break;
exec_time= PIL_check_seconds_timer()-start_time;
- if(tmj->delay>exec_time)
- PIL_sleep_ms(tmj->delay-exec_time);
+ if(tmj->delay > (float)exec_time)
+ PIL_sleep_ms(tmj->delay-(float)exec_time);
} else if(!BKE_tracking_next(tmj->context))
break;
@@ -1537,7 +1537,7 @@ static int solve_camera_exec(bContext *C, wmOperator *op)
}
/* could fail if footage uses images with different sizes */
- BKE_movieclip_get_size(clip, NULL, &width, &height);
+ BKE_movieclip_get_size(clip, &sc->user, &width, &height);
error= BKE_tracking_solve_reconstruction(tracking, width, height);
@@ -1546,6 +1546,9 @@ static int solve_camera_exec(bContext *C, wmOperator *op)
else
BKE_reportf(op->reports, RPT_INFO, "Average reprojection error %.3f", error);
+ if(scene->clip)
+ id_us_min(&clip->id);
+
scene->clip= clip;
id_us_plus(&clip->id);
@@ -1659,7 +1662,7 @@ void CLIP_OT_clear_track_path(wmOperatorType *ot)
{
static EnumPropertyItem clear_path_actions[] = {
{TRACK_CLEAR_UPTO, "UPTO", 0, "Clear up-to", "Clear path up to current frame"},
- {TRACK_CLEAR_REMAINED, "REMAINED", 0, "Clear remained", "Clear path at remained frames (after current)"},
+ {TRACK_CLEAR_REMAINED, "REMAINED", 0, "Clear remained", "Clear path at remaining frames (after current)"},
{TRACK_CLEAR_ALL, "ALL", 0, "Clear all", "Clear the whole path"},
{0, NULL, 0, NULL, NULL}
};
@@ -1797,7 +1800,7 @@ void CLIP_OT_set_origin(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Origin";
- ot->description= "Set active marker as origin by moving camera (or it's parent if present) in 3d space";
+ ot->description= "Set active marker as origin by moving camera (or it's parent if present) in 3D space";
ot->idname= "CLIP_OT_set_origin";
/* api callbacks */
@@ -1817,13 +1820,13 @@ static void set_axis(Scene *scene, Object *ob, MovieTrackingTrack *track, char
BKE_get_tracking_mat(scene, NULL, mat);
mul_v3_m4v3(vec, mat, track->bundle_pos);
- if(len_v2(vec)<1e-3)
+ if(len_v2(vec) < 1e-3f)
return;
unit_m4(mat);
if(axis=='X') {
- if(fabsf(vec[1])<1e-3) {
+ if(fabsf(vec[1])<1e-3f) {
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;
@@ -1834,7 +1837,7 @@ static void set_axis(Scene *scene, Object *ob, MovieTrackingTrack *track, char
cross_v3_v3v3(mat[1], mat[2], mat[0]);
}
} else {
- if(fabsf(vec[0])<1e-3) {
+ if(fabsf(vec[0])<1e-3f) {
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;
@@ -1949,7 +1952,7 @@ void CLIP_OT_set_floor(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Floor";
- ot->description= "Set floor based on 3 selected bundles by moving camera (or it's parent if present) in 3d space";
+ ot->description= "Set floor based on 3 selected bundles by moving camera (or it's parent if present) in 3D space";
ot->idname= "CLIP_OT_set_floor";
/* api callbacks */
@@ -2059,7 +2062,7 @@ static int set_scale_exec(bContext *C, wmOperator *op)
sub_v3_v3(vec[0], vec[1]);
- if(len_v3(vec[0])>1e-5) {
+ if(len_v3(vec[0])>1e-5f) {
scale= dist / len_v3(vec[0]);
mul_v3_fl(parent->size, scale);
@@ -2291,8 +2294,8 @@ void CLIP_OT_detect_features(wmOperatorType *ot)
{
static EnumPropertyItem placement_items[] = {
{0, "FRAME", 0, "Whole Frame", "Place markers across the whole frame"},
- {1, "INSIDE_GPENCIL", 0, "Inside grease pencil", "Place markers only inside areas oulined with grease pencil"},
- {2, "OUTSIDE_GPENCIL", 0, "Outside grease pencil", "Place markers only outside areas oulined with grease pencil"},
+ {1, "INSIDE_GPENCIL", 0, "Inside grease pencil", "Place markers only inside areas outlined with grease pencil"},
+ {2, "OUTSIDE_GPENCIL", 0, "Outside grease pencil", "Place markers only outside areas outlined with grease pencil"},
{0, NULL, 0, NULL, NULL}
};
@@ -2383,7 +2386,7 @@ void CLIP_OT_frame_jump(wmOperatorType *ot)
static EnumPropertyItem position_items[] = {
{0, "PATHSTART", 0, "Path Start", "Jump to start of current path"},
{1, "PATHEND", 0, "Path End", "Jump to end of current path"},
- {2, "FAILEDPREV", 0, "Previons Failed", "Jump to previous failed frame"},
+ {2, "FAILEDPREV", 0, "Previous Failed", "Jump to previous failed frame"},
{2, "FAILNEXT", 0, "Next Failed", "Jump to next failed frame"},
{0, NULL, 0, NULL, NULL}
};
@@ -2454,7 +2457,7 @@ void CLIP_OT_join_tracks(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Join Tracks";
- ot->description= "Joint Selected Tracks";
+ ot->description= "Join selected tracks";
ot->idname= "CLIP_OT_join_tracks";
/* api callbacks */
@@ -2734,7 +2737,7 @@ void CLIP_OT_stabilize_2d_set_rotation(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Rotation Track";
- ot->description= "Use active track to compensate rotaiton when doing 2D stabilization";
+ ot->description= "Use active track to compensate rotation when doing 2D stabilization";
ot->idname= "CLIP_OT_stabilize_2d_set_rotation";
/* api callbacks */
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index d91282e768f..41aae64445a 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -177,17 +177,17 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
uiBlockSetFunc(block, file_draw_check_cb, NULL, NULL);
but = uiDefButTextO(block, TEX, "FILE_OT_directory", 0, "",
- min_x, line1_y, line1_w-chan_offs, btn_h,
- params->dir, 0.0, (float)FILE_MAX, 0, 0,
- TIP_("File path"));
+ min_x, line1_y, line1_w-chan_offs, btn_h,
+ params->dir, 0.0, (float)FILE_MAX, 0, 0,
+ TIP_("File path"));
uiButSetCompleteFunc(but, autocomplete_directory, NULL);
uiButSetFlag(but, UI_BUT_NO_UTF8);
if((params->flag & FILE_DIRSEL_ONLY) == 0) {
but = uiDefBut(block, TEX, B_FS_FILENAME, "",
- min_x, line2_y, line2_w-chan_offs, btn_h,
- params->file, 0.0, (float)FILE_MAXFILE, 0, 0,
- TIP_(overwrite_alert ?N_("File name, overwrite existing") : N_("File name")));
+ min_x, line2_y, line2_w-chan_offs, btn_h,
+ params->file, 0.0, (float)FILE_MAXFILE, 0, 0,
+ TIP_(overwrite_alert ?N_("File name, overwrite existing") : N_("File name")));
uiButSetCompleteFunc(but, autocomplete_file, NULL);
uiButSetFlag(but, UI_BUT_NO_UTF8);
@@ -205,16 +205,16 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
if (fnumbuttons && (params->flag & FILE_DIRSEL_ONLY) == 0) {
uiBlockBeginAlign(block);
but = uiDefIconButO(block, BUT, "FILE_OT_filenum", 0, ICON_ZOOMOUT,
- min_x + line2_w + separator - chan_offs, line2_y,
- btn_fn_w, btn_h,
- TIP_("Decrement the filename number"));
- RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", -1);
-
+ min_x + line2_w + separator - chan_offs, line2_y,
+ btn_fn_w, btn_h,
+ TIP_("Decrement the filename number"));
+ RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", -1);
+
but = uiDefIconButO(block, BUT, "FILE_OT_filenum", 0, ICON_ZOOMIN,
- min_x + line2_w + separator + btn_fn_w - chan_offs, line2_y,
- btn_fn_w, btn_h,
- TIP_("Increment the filename number"));
- RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", 1);
+ min_x + line2_w + separator + btn_fn_w - chan_offs, line2_y,
+ btn_fn_w, btn_h,
+ TIP_("Increment the filename number"));
+ RNA_int_set(uiButGetOperatorPtrRNA(but), "increment", 1);
uiBlockEndAlign(block);
}
@@ -235,7 +235,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
static void draw_tile(int sx, int sy, int width, int height, int colorid, int shade)
-{
+{
UI_ThemeColorShade(colorid, shade);
uiSetRoundBox(UI_CNR_ALL);
uiRoundBox((float)sx, (float)(sy - height), (float)(sx + width), (float)sy, 5.0f);
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index e74c7d50adc..6506933df54 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -732,8 +732,9 @@ static void graphkeys_select_leftright (bAnimContext *ac, short leftright, short
if (select_mode==SELECT_REPLACE) {
select_mode= SELECT_ADD;
- /* deselect all other channels and keyframes */
- ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ /* - deselect all other keyframes, so that just the newly selected remain
+ * - channels aren't deselected, since we don't re-select any as a consequence
+ */
deselect_graph_keys(ac, 0, SELECT_SUBTRACT);
}
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 7121e4872eb..77c92b2d9c3 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -804,7 +804,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
RNA_property_update(C, &pprop->ptr, pprop->prop);
}
else if(sima) {
- ED_space_image_set(C, sima, scene, obedit, ima);
+ ED_space_image_set(sima, scene, obedit, ima);
iuser= &sima->iuser;
}
else {
@@ -1420,7 +1420,7 @@ static int image_new_exec(bContext *C, wmOperator *op)
RNA_property_update(C, &ptr, prop);
}
else if(sima)
- ED_space_image_set(C, sima, scene, obedit, ima);
+ ED_space_image_set(sima, scene, obedit, ima);
// XXX other users?
BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_USER_NEW_IMAGE);
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 3b9876329ec..99c190cd2dd 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -47,7 +47,10 @@
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_image.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_scene.h"
#include "BKE_screen.h"
#include "IMB_imbuf_types.h"
@@ -79,9 +82,10 @@ Image *ED_space_image(SpaceImage *sima)
}
/* called to assign images to UV faces */
-void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obedit, Image *ima)
+void ED_space_image_set(SpaceImage *sima, Scene *scene, Object *obedit, Image *ima)
{
- ED_uvedit_assign_image(scene, obedit, ima, sima->image);
+ /* context may be NULL, so use global */
+ ED_uvedit_assign_image(G.main, scene, obedit, ima, sima->image);
/* change the space ima after because uvedit_face_visible uses the space ima
* to check if the face is displayed in UV-localview */
@@ -96,13 +100,10 @@ void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obe
if(sima->image && sima->image->id.us==0)
sima->image->id.us= 1;
- if(C) {
- if(obedit)
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
-
- ED_area_tag_redraw(CTX_wm_area(C));
-
- }
+ if(obedit)
+ WM_main_add_notifier(NC_GEOM|ND_DATA, obedit->data);
+
+ WM_main_add_notifier(NC_SPACE|ND_SPACE_IMAGE, NULL);
}
ImBuf *ED_space_image_acquire_buffer(SpaceImage *sima, void **lock_r)
@@ -572,6 +573,7 @@ static void image_dropboxes(void)
static void image_refresh(const bContext *C, ScrArea *UNUSED(sa))
{
+ Scene *scene = CTX_data_scene(C);
SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
Image *ima;
@@ -586,19 +588,31 @@ static void image_refresh(const bContext *C, ScrArea *UNUSED(sa))
else if(obedit && obedit->type == OB_MESH) {
Mesh *me= (Mesh*)obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
- MTFace *tf;
-
- if(em && EM_texFaceCheck(em)) {
- sima->image= NULL;
-
- tf = EM_get_active_mtface(em, NULL, NULL, 1); /* partially selected face is ok */
+ int sloppy= 1; /* partially selected face is ok */
+
+ if(scene_use_new_shading_nodes(scene)) {
+ /* new shading system, get image from material */
+ EditFace *efa= EM_get_actFace(em, sloppy);
+
+ if(efa)
+ ED_object_get_active_image(obedit, efa->mat_nr, &sima->image, NULL, NULL);
+ }
+ else {
+ /* old shading system, we set texface */
+ MTFace *tf;
- if(tf) {
- /* don't need to check for pin here, see above */
- sima->image= tf->tpage;
+ if(em && EM_texFaceCheck(em)) {
+ sima->image= NULL;
+
+ tf = EM_get_active_mtface(em, NULL, NULL, sloppy);
- if(sima->flag & SI_EDITTILE);
- else sima->curtile= tf->tile;
+ if(tf) {
+ /* don't need to check for pin here, see above */
+ sima->image= tf->tpage;
+
+ if(sima->flag & SI_EDITTILE);
+ else sima->curtile= tf->tile;
+ }
}
}
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c
index c36cb1bf00e..2f69fc5f99f 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -2335,7 +2335,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
str= "Edit Object %t|Add Object %x0|End Object %x1|Replace Mesh %x2|Track to %x3|Dynamics %x4";
uiDefButS(block, MENU, B_REDR, str, xco+40, yco-24, (width-80), 19, &eoa->type, 0.0, 0.0, 0, 0, "");
- yco-= ysize;
+ yco-= ysize;
break;
@@ -2472,9 +2472,9 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
}
str= "Constraint Type %t|Location %x0|Distance %x1|Orientation %x2|Force field %x3";
but = uiDefButS(block, MENU, B_REDR, str, xco+40, yco-23, (width-80), 19, &coa->type, 0.0, 0.0, 0, 0, "");
- yco-= ysize;
+ yco-= ysize;
break;
-
+
case ACT_SCENE:
sca= act->data;
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
index 05d38a63109..49340b31b47 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -376,8 +376,9 @@ static void nlaedit_select_leftright (bContext *C, bAnimContext *ac, short leftr
if (select_mode==SELECT_REPLACE) {
select_mode= SELECT_ADD;
- /* deselect all other channels and keyframes */
- ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ /* - deselect all other keyframes, so that just the newly selected remain
+ * - channels aren't deselected, since we don't re-select any as a consequence
+ */
deselect_nla_strips(ac, 0, SELECT_SUBTRACT);
}
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index 991b35585a6..f33b784c5d2 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -25,6 +25,7 @@ set(INC
../../blenlib
../../blenloader
../../imbuf
+ ../../gpu
../../makesdna
../../makesrna
../../nodes
diff --git a/source/blender/editors/space_node/SConscript b/source/blender/editors/space_node/SConscript
index c4309dcfca3..6b72fd066e0 100644
--- a/source/blender/editors/space_node/SConscript
+++ b/source/blender/editors/space_node/SConscript
@@ -4,7 +4,7 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
-incs += ' ../../nodes ../../render/extern/include ../../blenloader'
+incs += ' ../../nodes ../../render/extern/include ../../blenloader ../../gpu'
incs += ' ../../windowmanager #intern/guardedalloc #extern/glew/include'
defs = []
cf = []
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 648027b9c58..e2e47338eee 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -340,8 +340,9 @@ static void node_buts_normal(uiLayout *layout, bContext *UNUSED(C), PointerRNA *
uiBut *bt;
bt= uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
- (short)butr->xmin, (short)butr->xmin, butr->xmax-butr->xmin, butr->xmax-butr->xmin,
- nor, 0.0f, 1.0f, 0, 0, "");
+ (short)butr->xmin, (short)butr->xmin,
+ butr->xmax-butr->xmin, butr->xmax-butr->xmin,
+ nor, 0.0f, 1.0f, 0, 0, "");
uiButSetFunc(bt, node_normal_cb, ntree, node);
}
#if 0 // not used in 2.5x yet
@@ -627,9 +628,9 @@ static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *
uiButSetFunc(bt, update_group_output_cb, snode, ngroup);
}
else {
- uiDefBut(gnode->block, LABEL, 0, sock->name,
- sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
- NULL, 0, 31, 0, 0, "");
+ uiDefBut(gnode->block, LABEL, 0, sock->name,
+ sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
+ NULL, 0, 31, 0, 0, "");
}
}
@@ -994,6 +995,54 @@ static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA
}
}
+static void node_shader_buts_attribute(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "attribute_name", 0, "Name", ICON_NONE);
+}
+
+static void node_shader_buts_tex_image(uiLayout *layout, bContext *C, PointerRNA *ptr)
+{
+ //uiItemR(layout, ptr, "image", 0, "", ICON_NONE);
+ uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL);
+ uiItemR(layout, ptr, "color_space", 0, "", ICON_NONE);
+}
+
+static void node_shader_buts_tex_sky(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "sun_direction", 0, "", ICON_NONE);
+ uiItemR(layout, ptr, "turbidity", 0, NULL, ICON_NONE);
+}
+
+static void node_shader_buts_tex_gradient(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "gradient_type", 0, "", ICON_NONE);
+}
+
+static void node_shader_buts_tex_magic(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "turbulence_depth", 0, NULL, ICON_NONE);
+}
+
+static void node_shader_buts_tex_wave(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "wave_type", 0, "", ICON_NONE);
+}
+
+static void node_shader_buts_tex_musgrave(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "musgrave_type", 0, "", ICON_NONE);
+}
+
+static void node_shader_buts_tex_voronoi(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "coloring", 0, "", ICON_NONE);
+}
+
+static void node_shader_buts_glossy(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "distribution", 0, "", ICON_NONE);
+}
+
static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA *ptr)
{
Main *bmain= CTX_data_main(C);
@@ -1080,6 +1129,37 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case SH_NODE_GEOMETRY:
ntype->uifunc= node_shader_buts_geometry;
break;
+ case SH_NODE_ATTRIBUTE:
+ ntype->uifunc= node_shader_buts_attribute;
+ break;
+ case SH_NODE_TEX_SKY:
+ ntype->uifunc= node_shader_buts_tex_sky;
+ break;
+ case SH_NODE_TEX_IMAGE:
+ ntype->uifunc= node_shader_buts_tex_image;
+ break;
+ case SH_NODE_TEX_ENVIRONMENT:
+ ntype->uifunc= node_shader_buts_tex_image;
+ break;
+ case SH_NODE_TEX_GRADIENT:
+ ntype->uifunc= node_shader_buts_tex_gradient;
+ break;
+ case SH_NODE_TEX_MAGIC:
+ ntype->uifunc= node_shader_buts_tex_magic;
+ break;
+ case SH_NODE_TEX_WAVE:
+ ntype->uifunc= node_shader_buts_tex_wave;
+ break;
+ case SH_NODE_TEX_MUSGRAVE:
+ ntype->uifunc= node_shader_buts_tex_musgrave;
+ break;
+ case SH_NODE_TEX_VORONOI:
+ ntype->uifunc= node_shader_buts_tex_voronoi;
+ break;
+ case SH_NODE_BSDF_GLOSSY:
+ case SH_NODE_BSDF_GLASS:
+ ntype->uifunc= node_shader_buts_glossy;
+ break;
case NODE_DYNAMIC:
ntype->uifunc= node_shader_buts_dynamic;
break;
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index a932f1b10d9..36cba15e5f2 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -585,8 +585,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
UI_ThemeColor(color_id);
if(node->flag & NODE_MUTED)
- UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
-
+ UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
+
uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD);
@@ -758,7 +758,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
/* body */
UI_ThemeColor(color_id);
if(node->flag & NODE_MUTED)
- UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
+ UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
/* outline active and selected emphasis */
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 745611c6251..23855ff24e1 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -61,6 +61,7 @@
#include "BKE_material.h"
#include "BKE_modifier.h"
#include "BKE_paint.h"
+#include "BKE_scene.h"
#include "BKE_screen.h"
#include "BKE_texture.h"
#include "BKE_report.h"
@@ -89,6 +90,8 @@
#include "RNA_enum_types.h"
+#include "GPU_material.h"
+
#include "node_intern.h"
static EnumPropertyItem socket_in_out_items[] = {
@@ -269,13 +272,14 @@ bNode *node_tree_get_editgroup(bNodeTree *nodetree)
/* assumes nothing being done in ntree yet, sets the default in/out node */
/* called from shading buttons or header */
-void ED_node_shader_default(Scene *UNUSED(scene), ID *id)
+void ED_node_shader_default(Scene *scene, ID *id)
{
bNode *in, *out;
- bNodeSocket *fromsock, *tosock;
+ bNodeSocket *fromsock, *tosock, *sock;
bNodeTree *ntree;
bNodeTemplate ntemp;
int output_type, shader_type;
+ float color[3], strength = 1.0f;
ntree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0);
@@ -284,24 +288,42 @@ void ED_node_shader_default(Scene *UNUSED(scene), ID *id)
Material *ma= (Material*)id;
ma->nodetree = ntree;
- output_type = SH_NODE_OUTPUT;
- shader_type = SH_NODE_MATERIAL;
+ if(scene_use_new_shading_nodes(scene)) {
+ output_type = SH_NODE_OUTPUT_MATERIAL;
+ shader_type = SH_NODE_BSDF_DIFFUSE;
+ }
+ else {
+ output_type = SH_NODE_OUTPUT;
+ shader_type = SH_NODE_MATERIAL;
+ }
+
+ copy_v3_v3(color, &ma->r);
+ strength= 0.0f;
break;
}
case ID_WO: {
World *wo= (World*)id;
wo->nodetree = ntree;
- output_type = SH_NODE_OUTPUT;
- shader_type = SH_NODE_MATERIAL;
+ output_type = SH_NODE_OUTPUT_WORLD;
+ shader_type = SH_NODE_BACKGROUND;
+
+ copy_v3_v3(color, &wo->horr);
+ strength= 1.0f;
break;
}
case ID_LA: {
Lamp *la= (Lamp*)id;
la->nodetree = ntree;
- output_type = SH_NODE_OUTPUT;
- shader_type = SH_NODE_MATERIAL;
+ output_type = SH_NODE_OUTPUT_LAMP;
+ shader_type = SH_NODE_EMISSION;
+
+ copy_v3_v3(color, &la->r);
+ if(la->type == LA_LOCAL || la->type == LA_SPOT || la->type == LA_AREA)
+ strength= 100.0f;
+ else
+ strength= 1.0f;
break;
}
default:
@@ -322,6 +344,17 @@ void ED_node_shader_default(Scene *UNUSED(scene), ID *id)
fromsock= in->outputs.first;
tosock= out->inputs.first;
nodeAddLink(ntree, in, fromsock, out, tosock);
+
+ /* default values */
+ if(scene_use_new_shading_nodes(scene)) {
+ sock= in->inputs.first;
+ copy_v3_v3(((bNodeSocketValueRGBA*)sock->default_value)->value, color);
+
+ if(strength != 0.0f) {
+ sock= in->inputs.last;
+ ((bNodeSocketValueFloat*)sock->default_value)->value= strength;
+ }
+ }
ntreeUpdateTree(ntree);
}
@@ -567,6 +600,8 @@ static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
{
+ int was_active_texture = (node->flag & NODE_ACTIVE_TEXTURE);
+
nodeSetActive(ntree, node);
if(node->type!=NODE_GROUP) {
@@ -590,6 +625,15 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
ED_node_generic_update(bmain, ntree, node);
}
+ /* if active texture changed, free glsl materials */
+ if((node->flag & NODE_ACTIVE_TEXTURE) && !was_active_texture) {
+ Material *ma;
+
+ for(ma=bmain->mat.first; ma; ma=ma->id.next)
+ if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree))
+ GPU_material_free(ma);
+ }
+
WM_main_add_notifier(NC_MATERIAL|ND_NODES, node->id);
}
else if(ntree->type==NTREE_COMPOSIT) {
@@ -2211,9 +2255,7 @@ bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, bNodeTemplate
node->id = &scene->id;
}
else if(ELEM3(node->type, CMP_NODE_MOVIECLIP, CMP_NODE_MOVIEDISTORTION, CMP_NODE_STABILIZE2D)) {
- if(G.main->movieclip.first == G.main->movieclip.last) {
- node->id= G.main->movieclip.first;
- }
+ node->id = (ID *)scene->clip;
}
ntreeCompositForceHidden(snode->edittree, scene);
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index d752dd79a19..6dd5eeba832 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -229,7 +229,7 @@ static void node_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
static void node_menu_add_foreach_cb(void *calldata, int nclass, const char *name)
{
uiLayout *layout= calldata;
- uiItemMenuF(layout, IFACE_(name), 0, node_add_menu, SET_INT_IN_POINTER(nclass));
+ uiItemMenuF(layout, name, 0, node_add_menu, SET_INT_IN_POINTER(nclass));
}
static void node_menu_add(const bContext *C, Menu *menu)
diff --git a/source/blender/editors/space_node/node_templates.c b/source/blender/editors/space_node/node_templates.c
index b877bea6be9..fedb12f747c 100644
--- a/source/blender/editors/space_node/node_templates.c
+++ b/source/blender/editors/space_node/node_templates.c
@@ -40,6 +40,8 @@
#include "BLI_string.h"
#include "BLI_utildefines.h"
+#include "BLF_translation.h"
+
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_library.h"
@@ -215,6 +217,11 @@ static void node_socket_add_replace(Main *bmain, bNodeTree *ntree, bNode *node_t
}
}
+ /* also preserve mapping for texture nodes */
+ if(node_from->typeinfo->nclass == NODE_CLASS_TEXTURE &&
+ node_prev->typeinfo->nclass == NODE_CLASS_TEXTURE)
+ memcpy(node_from->storage, node_prev->storage, sizeof(NodeTexBase));
+
/* remove node */
node_remove_linked(ntree, node_prev);
}
@@ -432,7 +439,7 @@ static void node_menu_column_foreach_cb(void *calldata, int nclass, const char *
NodeLinkArg *arg = (NodeLinkArg*)calldata;
if(!ELEM(nclass, NODE_CLASS_GROUP, NODE_CLASS_LAYOUT))
- ui_node_menu_column(arg, nclass, IFACE_(name));
+ ui_node_menu_column(arg, nclass, name);
}
static void ui_template_node_link_menu(bContext *C, uiLayout *layout, void *but_p)
@@ -503,6 +510,10 @@ void uiTemplateNodeLink(uiLayout *layout, bNodeTree *ntree, bNode *node, bNodeSo
but->flag |= UI_TEXT_LEFT|UI_BUT_NODE_LINK;
but->poin= (char*)but;
but->func_argN = arg;
+
+ if(sock->link && sock->link->fromnode)
+ if(sock->link->fromnode->flag & NODE_ACTIVE_TEXTURE)
+ but->flag |= UI_BUT_NODE_ACTIVE;
}
/**************************** Node Tree Layout *******************************/
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 96b5548a8c5..cf9bf3de1b8 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -1016,6 +1016,8 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto
case eModifierType_WeightVGMix:
case eModifierType_WeightVGProximity:
UI_icon_draw(x, y, ICON_MOD_VERTEX_WEIGHT); break;
+ case eModifierType_DynamicPaint:
+ UI_icon_draw(x, y, ICON_MOD_DYNAMICPAINT); break;
default:
UI_icon_draw(x, y, ICON_DOT); break;
}
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 8575d0348ab..5fd3d3b45d6 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -170,7 +170,7 @@ static void proxy_startjob(void *pjv, short *stop, short *do_update, float *prog
BLI_mutex_unlock(&pj->queue_lock);
seq_proxy_rebuild(pj->main, pj->scene, seq,
- stop, do_update, progress);
+ stop, do_update, progress);
seq_free_sequence_recurse(pj->scene, seq);
}
@@ -195,7 +195,7 @@ static void seq_proxy_build_job(const bContext *C, Sequence * seq)
seq = seq_dupli_recursive(scene, scene, seq, 0);
steve = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C),
- sa, "Building Proxies", WM_JOB_PROGRESS);
+ sa, "Building Proxies", WM_JOB_PROGRESS);
pj = WM_jobs_get_customdata(steve);
@@ -209,9 +209,9 @@ static void seq_proxy_build_job(const bContext *C, Sequence * seq)
WM_jobs_customdata(steve, pj, proxy_freejob);
WM_jobs_timer(steve, 0.1, NC_SCENE|ND_SEQUENCER,
- NC_SCENE|ND_SEQUENCER);
- WM_jobs_callbacks(steve, proxy_startjob, NULL, NULL,
- proxy_endjob);
+ NC_SCENE|ND_SEQUENCER);
+ WM_jobs_callbacks(steve, proxy_startjob, NULL, NULL,
+ proxy_endjob);
}
BLI_mutex_lock(&pj->queue_lock);
@@ -250,9 +250,9 @@ static void UNUSED_FUNCTION(change_plugin_seq)(Scene *scene, char *str) /* calle
sh.free(last_seq);
sh.init_plugin(last_seq, str);
- last_seq->machine = MAX3(last_seq->seq1->machine,
- last_seq->seq2->machine,
- last_seq->seq3->machine);
+ last_seq->machine = MAX3(last_seq->seq1->machine,
+ last_seq->seq2->machine,
+ last_seq->seq3->machine);
if( seq_test_overlap(ed->seqbasep, last_seq) ) shuffle_seq(ed->seqbasep, last_seq, scene);
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index 720081d946b..07ca56cde8b 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -184,7 +184,7 @@ void sequencer_keymap(wmKeyConfig *keyconf)
regular number keys */
{
int keys[] = { ONEKEY, TWOKEY, THREEKEY, FOURKEY, FIVEKEY,
- SIXKEY, SEVENKEY, EIGHTKEY, NINEKEY, ZEROKEY };
+ SIXKEY, SEVENKEY, EIGHTKEY, NINEKEY, ZEROKEY };
int i;
for (i = 1; i <= 10; i++) {
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index 565d531975b..62cd4fedf0e 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -105,7 +105,7 @@ int text_get_total_lines(struct SpaceText *st, struct ARegion *ar);
/* text_ops.c */
enum { LINE_BEGIN, LINE_END, FILE_TOP, FILE_BOTTOM, PREV_CHAR, NEXT_CHAR,
- PREV_WORD, NEXT_WORD, PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE };
+ PREV_WORD, NEXT_WORD, PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE };
enum { DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_NEXT_WORD, DEL_PREV_WORD };
void TEXT_OT_new(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index 6ea7a94b288..b3baccde5c9 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -125,12 +125,14 @@ static void time_draw_cache(SpaceTime *stime, Object *ob)
case PTCACHE_TYPE_SMOKE_HIGHRES:
if (!(stime->cache_display & TIME_CACHE_SMOKE)) continue;
break;
+ case PTCACHE_TYPE_DYNAMICPAINT:
+ if (!(stime->cache_display & TIME_CACHE_DYNAMICPAINT)) continue;
+ break;
}
if(pid->cache->cached_frames == NULL)
continue;
-
/* make sure we have stc with correct array length */
if(stc == NULL || MEM_allocN_len(stc->array) != len*2*sizeof(float)) {
if(stc) {
@@ -187,6 +189,10 @@ static void time_draw_cache(SpaceTime *stime, Object *ob)
col[0] = 0.2; col[1] = 0.2; col[2] = 0.2;
col[3] = 0.1;
break;
+ case PTCACHE_TYPE_DYNAMICPAINT:
+ col[0] = 1.0; col[1] = 0.1; col[2] = 0.75;
+ col[3] = 0.1;
+ break;
}
glColor4fv(col);
@@ -634,7 +640,7 @@ static void time_init(wmWindowManager *UNUSED(wm), ScrArea *sa)
/* enable all cache display */
stime->cache_display |= TIME_CACHE_DISPLAY;
stime->cache_display |= (TIME_CACHE_SOFTBODY|TIME_CACHE_PARTICLES);
- stime->cache_display |= (TIME_CACHE_CLOTH|TIME_CACHE_SMOKE);
+ stime->cache_display |= (TIME_CACHE_CLOTH|TIME_CACHE_SMOKE|TIME_CACHE_DYNAMICPAINT);
}
static SpaceLink *time_duplicate(SpaceLink *sl)
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 670943afdd3..1bc55b8d73f 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -40,11 +40,12 @@
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
-#include "DNA_object_types.h"
#include "BKE_DerivedMesh.h"
#include "BKE_effect.h"
@@ -52,6 +53,7 @@
#include "BKE_material.h"
#include "BKE_paint.h"
#include "BKE_property.h"
+#include "BKE_scene.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -64,6 +66,7 @@
#include "GPU_material.h"
#include "ED_mesh.h"
+#include "ED_uvedit.h"
#include "view3d_intern.h" // own include
@@ -399,6 +402,13 @@ static int draw_tface__set_draw_legacy(MTFace *tface, int has_mcol, int matnr)
return 1; /* Set color from mcol */
}
}
+
+static int draw_mcol__set_draw_legacy(MTFace *UNUSED(tface), int has_mcol, int UNUSED(matnr))
+{
+ if (has_mcol) return 1;
+ else return 2;
+}
+
static int draw_tface__set_draw(MTFace *tface, int has_mcol, int matnr)
{
Material *ma= give_current_material(Gtexdraw.ob, matnr+1);
@@ -619,7 +629,7 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
ddm->release(ddm);
}
-void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int faceselect)
+void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags)
{
Mesh *me= ob->data;
@@ -641,7 +651,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, &data);
}
- else if(faceselect) {
+ 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);
else
@@ -649,7 +659,10 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
}
else {
if(GPU_buffer_legacy(dm)) {
- dm->drawFacesTex(dm, draw_tface__set_draw_legacy);
+ if (draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW)
+ dm->drawFacesTex(dm, draw_mcol__set_draw_legacy);
+ else
+ dm->drawFacesTex(dm, draw_tface__set_draw_legacy);
}
else {
if(!CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL))
@@ -666,7 +679,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
draw_textured_end();
/* draw edges and selected faces over textured mesh */
- if(!(ob == scene->obedit) && faceselect)
+ if(!(ob == scene->obedit) && (draw_flags & DRAW_FACE_SELECT))
draw_mesh_face_select(rv3d, me, dm);
/* reset from negative scale correction */
@@ -676,3 +689,179 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
+/************************** NEW SHADING NODES ********************************/
+
+typedef struct TexMatCallback {
+ Scene *scene;
+ Object *ob;
+ Mesh *me;
+ DerivedMesh *dm;
+} TexMatCallback;
+
+static void tex_mat_set_material_cb(void *UNUSED(userData), int mat_nr, void *attribs)
+{
+ /* all we have to do here is simply enable the GLSL material, but note
+ that the GLSL code will give different result depending on the drawtype,
+ in texture draw mode it will output the active texture node, in material
+ draw mode it will show the full material. */
+ GPU_enable_material(mat_nr, attribs);
+}
+
+static void tex_mat_set_texture_cb(void *userData, int mat_nr, void *attribs)
+{
+ /* texture draw mode without GLSL */
+ TexMatCallback *data= (TexMatCallback*)userData;
+ GPUVertexAttribs *gattribs = attribs;
+ Image *ima;
+ ImageUser *iuser;
+ bNode *node;
+ int texture_set= 0;
+
+ /* draw image texture if we find one */
+ if(ED_object_get_active_image(data->ob, mat_nr, &ima, &iuser, &node)) {
+ /* get openl texture */
+ int mipmap= 1;
+ int bindcode= (ima)? GPU_verify_image(ima, iuser, 0, 0, mipmap): 0;
+ float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+
+ if(bindcode) {
+ NodeTexBase *texbase= node->storage;
+
+ /* disable existing material */
+ GPU_disable_material();
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, zero);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, zero);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
+
+ /* bind texture */
+ glEnable(GL_COLOR_MATERIAL);
+ glEnable(GL_TEXTURE_2D);
+
+ glBindTexture(GL_TEXTURE_2D, ima->bindcode);
+ glColor3f(1.0f, 1.0f, 1.0f);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf(texbase->tex_mapping.mat);
+ glMatrixMode(GL_MODELVIEW);
+
+ /* use active UV texture layer */
+ memset(gattribs, 0, sizeof(*gattribs));
+
+ gattribs->layer[0].type= CD_MTFACE;
+ gattribs->layer[0].name[0]= '\0';
+ gattribs->layer[0].gltexco= 1;
+ gattribs->totlayer= 1;
+
+ texture_set= 1;
+ }
+ }
+
+ if(!texture_set) {
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+
+ /* disable texture */
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_COLOR_MATERIAL);
+
+ /* draw single color */
+ GPU_enable_material(mat_nr, attribs);
+ }
+}
+
+static int tex_mat_set_face_mesh_cb(void *userData, int index)
+{
+ /* faceselect mode face hiding */
+ TexMatCallback *data= (TexMatCallback*)userData;
+ Mesh *me = (Mesh*)data->me;
+ MFace *mface = &me->mface[index];
+
+ return !(mface->flag & ME_HIDE);
+}
+
+static int tex_mat_set_face_editmesh_cb(void *UNUSED(userData), int index)
+{
+ /* editmode face hiding */
+ EditFace *efa= EM_get_face_for_index(index);
+
+ return !(efa->h);
+}
+
+void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, DerivedMesh *dm, int draw_flags)
+{
+ if((!scene_use_new_shading_nodes(scene)) || (draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW)) {
+ draw_mesh_textured_old(scene, v3d, rv3d, ob, dm, draw_flags);
+ return;
+ }
+
+ /* set opengl state for negative scale & color */
+ if(ob->transflag & OB_NEG_SCALE) glFrontFace(GL_CW);
+ else glFrontFace(GL_CCW);
+
+ glEnable(GL_LIGHTING);
+
+ if(ob->mode & OB_MODE_WEIGHT_PAINT) {
+ /* weight paint mode exception */
+ int useColors= 1;
+
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions,
+ ob->data, useColors, GPU_enable_material, NULL);
+ }
+ else {
+ Mesh *me= ob->data;
+ TexMatCallback data = {scene, ob, me, dm};
+ int (*set_face_cb)(void*, int);
+ int glsl;
+
+ /* face hiding callback depending on mode */
+ if(ob == scene->obedit)
+ set_face_cb= tex_mat_set_face_editmesh_cb;
+ else if(draw_flags & DRAW_FACE_SELECT)
+ set_face_cb= tex_mat_set_face_mesh_cb;
+ else
+ set_face_cb= NULL;
+
+ /* test if we can use glsl */
+ glsl= (v3d->drawtype == OB_MATERIAL) && GPU_glsl_support();
+
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
+
+ if(glsl) {
+ /* draw glsl */
+ dm->drawMappedFacesMat(dm,
+ tex_mat_set_material_cb,
+ set_face_cb, &data);
+ }
+ else {
+ float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+
+ /* draw textured */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, zero);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, zero);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 0);
+
+ dm->drawMappedFacesMat(dm,
+ tex_mat_set_texture_cb,
+ set_face_cb, &data);
+ }
+
+ GPU_end_object_materials();
+ }
+
+ /* reset opengl state */
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_LIGHTING);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glFrontFace(GL_CCW);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+
+ /* faceselect mode drawing over textured mesh */
+ if(!(ob == scene->obedit) && (draw_flags & DRAW_FACE_SELECT))
+ draw_mesh_face_select(rv3d, ob->data, dm);
+}
+
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index e5797e1a14a..70cdefddc72 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -36,6 +36,7 @@
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
#include "DNA_constraint_types.h" // for drawing constraint
+#include "DNA_dynamicpaint_types.h"
#include "DNA_lamp_types.h"
#include "DNA_lattice_types.h"
#include "DNA_material_types.h"
@@ -108,7 +109,7 @@
/* this condition has been made more complex since editmode can draw textures */
#define CHECK_OB_DRAWTEXTURE(vd, dt) \
- ((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
+ ((ELEM(vd->drawtype, OB_TEXTURE, OB_MATERIAL) && dt>OB_SOLID) || \
(vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
static void draw_bounding_volume(Scene *scene, Object *ob, char type);
@@ -252,6 +253,8 @@ int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt)
return 0;
if(ob==OBACT && (ob && ob->mode & OB_MODE_WEIGHT_PAINT))
return 0;
+ if(scene_use_new_shading_nodes(scene))
+ return 0;
return (scene->gm.matmode == GAME_MAT_GLSL) && (dt > OB_SOLID);
}
@@ -1476,7 +1479,7 @@ static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d,
glPushMatrix();
glTranslatef(track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]);
- glScalef(v3d->bundle_size/0.05, v3d->bundle_size/0.05, v3d->bundle_size/0.05);
+ glScalef(v3d->bundle_size/0.05f, v3d->bundle_size/0.05f, v3d->bundle_size/0.05f);
if(v3d->drawtype==OB_WIRE) {
glDisable(GL_LIGHTING);
@@ -1717,8 +1720,8 @@ static void drawspeaker(Scene *UNUSED(scene), View3D *UNUSED(v3d), RegionView3D
glBegin(GL_LINE_LOOP);
for(i = 0; i < 16; i++) {
- vec[0] = cosf(M_PI * i / 8.0f) * (j == 0 ? 0.5f : 0.25f);
- vec[1] = sinf(M_PI * i / 8.0f) * (j == 0 ? 0.5f : 0.25f);
+ vec[0] = cosf((float)M_PI * i / 8.0f) * (j == 0 ? 0.5f : 0.25f);
+ vec[1] = sinf((float)M_PI * i / 8.0f) * (j == 0 ? 0.5f : 0.25f);
glVertex3fv(vec);
}
glEnd();
@@ -2573,7 +2576,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E
copy_v3_v3(v1, eed->v1->co);
copy_v3_v3(v2, eed->v2->co);
- interp_v3_v3v3(vmid, v1, v2, 0.5f);
+ mid_v3_v3v3(vmid, v1, v2);
if(do_global) {
mul_mat3_m4_v3(ob->obmat, v1);
@@ -2935,13 +2938,29 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
Mesh *me = ob->data;
Material *ma= give_current_material(ob, 1);
const short hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO));
- const short is_paint_sel= (ob==OBACT && paint_facesel_test(ob));
int draw_wire = 0;
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;
if(!dm)
return;
+
+ /* check to draw dynamic paint colors */
+ if ((md = modifiers_findByType(ob, eModifierType_DynamicPaint)))
+ {
+ /* check if target has an active dpaint modifier */
+ if(md && (md->mode & eModifierMode_Realtime))
+ {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
+ /* if canvas is ready to preview vertex colors */
+ if (pmd->canvas && pmd->canvas->flags & MOD_DPAINT_PREVIEW_READY &&
+ DM_get_face_data_layer(dm, CD_WEIGHT_MCOL)) {
+ draw_flags |= DRAW_DYNAMIC_PAINT_PREVIEW;
+ }
+ }
+ }
if (ob->dtx&OB_DRAWWIRE) {
draw_wire = 2; /* draw wire after solid using zoffset and depth buffer adjusment */
@@ -2955,7 +2974,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
// Unwanted combination.
- if (is_paint_sel) draw_wire = 0;
+ if (draw_flags & DRAW_FACE_SELECT) draw_wire = 0;
if(dt==OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
@@ -2969,14 +2988,14 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
else if(dt==OB_WIRE || totface==0) {
draw_wire = 1; /* draw wire only, no depth buffer stuff */
}
- else if( (is_paint_sel || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
+ else if( (draw_flags & DRAW_FACE_SELECT || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
CHECK_OB_DRAWTEXTURE(v3d, dt))
{
- if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || is_paint_sel) && !draw_wire) {
+ if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || (draw_flags & DRAW_FACE_SELECT)) && !draw_wire) {
draw_mesh_object_outline(v3d, ob, dm);
}
- if(draw_glsl_material(scene, ob, v3d, dt)) {
+ if(draw_glsl_material(scene, ob, v3d, dt) && !(draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW)) {
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
dm->drawFacesGLSL(dm, GPU_enable_material);
@@ -2987,10 +3006,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glFrontFace(GL_CCW);
}
else {
- draw_mesh_textured(scene, v3d, rv3d, ob, dm, is_paint_sel);
+ draw_mesh_textured(scene, v3d, rv3d, ob, dm, draw_flags);
}
- if(!is_paint_sel) {
+ if(!(draw_flags & DRAW_FACE_SELECT)) {
if(base->flag & SELECT)
UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
else
@@ -3026,6 +3045,38 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
/* since we already draw wire as wp guide, dont draw over the top */
draw_wire= 0;
}
+ else if (draw_flags & DRAW_DYNAMIC_PAINT_PREVIEW) {
+ /* for object selection draws no shade */
+ if (flag & (DRAW_PICKING|DRAW_CONSTCOLOR)) {
+ dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material);
+ }
+ else {
+ /* draw outline */
+ if((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire && !ob->sculpt)
+ draw_mesh_object_outline(v3d, ob, dm);
+
+ /* materials arent compatible with vertex colors */
+ GPU_end_object_materials();
+
+ GPU_enable_material(0, NULL);
+
+ /* set default spec */
+ glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
+ glEnable(GL_COLOR_MATERIAL); /* according manpages needed */
+ glColor3ub(120, 120, 120);
+ glDisable(GL_COLOR_MATERIAL);
+ /* diffuse */
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_COLOR_MATERIAL);
+
+ dm->drawMappedFaces(dm, NULL, NULL, 1, GPU_enable_material, NULL);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_LIGHTING);
+
+ GPU_disable_material();
+ }
+ }
else {
Paint *p;
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 51bbf591bb3..edcaed43de6 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -448,7 +448,7 @@ static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
if(usys) {
int i= bUnit_GetBaseUnit(usys);
*grid_unit= bUnit_GetNameDisplay(usys, i);
- grid_scale = (grid_scale * (float)bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
+ grid_scale = (grid_scale * (float)bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
}
}
@@ -1267,11 +1267,24 @@ static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
BLI_assert(ar->regiontype == RGN_TYPE_WINDOW);
if(base && (base->object->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT) ||
- paint_facesel_test(base->object)));
+ paint_facesel_test(base->object)))
+ {
+ /* do nothing */
+ }
else if((base && (base->object->mode & OB_MODE_TEXTURE_PAINT)) &&
- scene->toolsettings && (scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE));
- else if((base && (base->object->mode & OB_MODE_PARTICLE_EDIT)) && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT));
- else if(scene->obedit && v3d->drawtype>OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT));
+ scene->toolsettings && (scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE))
+ {
+ /* do nothing */
+ }
+ else if((base && (base->object->mode & OB_MODE_PARTICLE_EDIT)) &&
+ v3d->drawtype > OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT))
+ {
+ /* do nothing */
+ }
+ else if(scene->obedit && v3d->drawtype>OB_WIRE &&
+ (v3d->flag & V3D_ZBUF_SELECT)) {
+ /* do nothing */
+ }
else {
v3d->flag &= ~V3D_INVALID_BACKBUF;
return;
@@ -2229,11 +2242,17 @@ CustomDataMask ED_view3d_datamask(Scene *scene, View3D *v3d)
{
CustomDataMask mask= 0;
- if((v3d->drawtype == OB_TEXTURE) || ((v3d->drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX))) {
+ if(ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) || ((v3d->drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX))) {
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
- if(scene->gm.matmode == GAME_MAT_GLSL)
- mask |= CD_MASK_ORCO;
+ if(scene_use_new_shading_nodes(scene)) {
+ if(v3d->drawtype == OB_MATERIAL)
+ mask |= CD_MASK_ORCO;
+ }
+ else {
+ if(scene->gm.matmode == GAME_MAT_GLSL)
+ mask |= CD_MASK_ORCO;
+ }
}
return mask;
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 7331959ef51..0329b6c3739 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -99,6 +99,7 @@ void ED_view3d_camera_lock_init(View3D *v3d, RegionView3D *rv3d)
int ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
{
if(ED_view3d_camera_lock_check(v3d, rv3d)) {
+ ObjectTfmProtectedChannels obtfm;
Object *root_parent;
if((U.uiflag & USER_CAM_LOCK_NO_PARENT)==0 && (root_parent= v3d->camera->parent)) {
@@ -117,7 +118,10 @@ int ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
mul_m4_m4m4(diff_mat, v3d->camera->imat, view_mat);
mul_m4_m4m4(parent_mat, root_parent->obmat, diff_mat);
+
+ object_tfm_protected_backup(root_parent, &obtfm);
object_apply_mat4(root_parent, parent_mat, TRUE, FALSE);
+ object_tfm_protected_restore(root_parent, &obtfm, root_parent->protectflag);
ob_update= v3d->camera;
while(ob_update) {
@@ -127,7 +131,10 @@ int ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
}
}
else {
+ object_tfm_protected_backup(v3d->camera, &obtfm);
ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
+ object_tfm_protected_restore(v3d->camera, &obtfm, v3d->camera->protectflag);
+
DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
WM_main_add_notifier(NC_OBJECT|ND_TRANSFORM, v3d->camera);
}
@@ -346,6 +353,7 @@ typedef struct ViewOpsData {
double timer_lastdraw;
float oldquat[4];
+ float viewquat[4]; /* working copy of rv3d->viewquat */
float trackvec[3];
float mousevec[3]; /* dolly only */
float reverse, dist0;
@@ -408,6 +416,7 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
ED_view3d_camera_lock_init(vod->v3d, vod->rv3d);
vod->dist0= rv3d->dist;
+ copy_qt_qt(vod->viewquat, rv3d->viewquat);
copy_qt_qt(vod->oldquat, rv3d->viewquat);
vod->origx= vod->oldx= event->x;
vod->origy= vod->oldy= event->y;
@@ -643,13 +652,13 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
q1[0]= cos(phi);
mul_v3_fl(q1+1, sin(phi));
- mul_qt_qtqt(rv3d->viewquat, q1, vod->oldquat);
+ mul_qt_qtqt(vod->viewquat, q1, vod->oldquat);
if (vod->use_dyn_ofs) {
/* compute the post multiplication quat, to rotate the offset correctly */
copy_qt_qt(q1, vod->oldquat);
conjugate_qt(q1);
- mul_qt_qtqt(q1, q1, rv3d->viewquat);
+ mul_qt_qtqt(q1, q1, vod->viewquat);
conjugate_qt(q1); /* conj == inv for unit quat */
copy_v3_v3(rv3d->ofs, vod->ofs);
@@ -671,7 +680,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
const float sensitivity = 0.0035f;
/* Get the 3x3 matrix and its inverse from the quaternion */
- quat_to_mat3( m,rv3d->viewquat);
+ quat_to_mat3( m,vod->viewquat);
invert_m3_m3(m_inv,m);
/* Determine the direction of the x vector (for rotating up and down) */
@@ -682,7 +691,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
phi = sensitivity * -(y - vod->oldy);
q1[0] = cos(phi);
mul_v3_v3fl(q1+1, xvec, sin(phi));
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+ mul_qt_qtqt(vod->viewquat, vod->viewquat, q1);
if (vod->use_dyn_ofs) {
conjugate_qt(q1); /* conj == inv for unit quat */
@@ -696,7 +705,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
q1[0] = cos(phi);
q1[1] = q1[2] = 0.0;
q1[3] = sin(phi);
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+ mul_qt_qtqt(vod->viewquat, vod->viewquat, q1);
if (vod->use_dyn_ofs) {
conjugate_qt(q1);
@@ -711,7 +720,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
int i;
float viewquat_inv[4];
float zaxis[3]={0,0,1};
- invert_qt_qt(viewquat_inv, rv3d->viewquat);
+ invert_qt_qt(viewquat_inv, vod->viewquat);
mul_qt_v3(viewquat_inv, zaxis);
@@ -736,7 +745,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
* for testing roll */
rotation_between_vecs_to_quat(viewquat_align, zaxis_test, zaxis);
normalize_qt(viewquat_align);
- mul_qt_qtqt(viewquat_align, rv3d->viewquat, viewquat_align);
+ mul_qt_qtqt(viewquat_align, vod->viewquat, viewquat_align);
normalize_qt(viewquat_align);
invert_qt_qt(viewquat_align_inv, viewquat_align);
@@ -766,7 +775,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
}
}
- copy_qt_qt(rv3d->viewquat, quat_best);
+ copy_qt_qt(vod->viewquat, quat_best);
rv3d->view= view; /* if we snap to a rolled camera the grid is invalid */
break;
@@ -777,7 +786,11 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
vod->oldy= y;
/* avoid precision loss over time */
- normalize_qt(rv3d->viewquat);
+ normalize_qt(vod->viewquat);
+
+ /* use a working copy so view rotation locking doesnt overwrite the locked
+ * rotation back into the view we calculate with */
+ copy_qt_qt(rv3d->viewquat, vod->viewquat);
ED_view3d_camera_lock_sync(vod->v3d, rv3d);
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 5aa8d95912d..fa2d5db21df 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -58,6 +58,10 @@ struct wmNDOFMotionData;
#define DRAW_CONSTCOLOR 2
#define DRAW_SCENESET 4
+/* draw_mesh_fancy/draw_mesh_textured draw_flags */
+#define DRAW_DYNAMIC_PAINT_PREVIEW 1
+#define DRAW_FACE_SELECT 2
+
/* view3d_header.c */
void view3d_header_buttons(const struct bContext *C, struct ARegion *ar);
void VIEW3D_OT_layers(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 012e08f98cb..b2707db806f 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -781,7 +781,7 @@ static void bundle_midpoint(Scene *scene, Object *ob, float vec[3])
}
if(ok) {
- interp_v3_v3v3(vec, min, max, 0.5);
+ mid_v3_v3v3(vec, min, max);
}
}
@@ -977,7 +977,7 @@ void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
ot->poll= ED_operator_view3d_active;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* **************************************************** */
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 7de1f2a85bb..cc0e93740ea 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -370,6 +370,7 @@ static int view3d_setcameratoview_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ ObjectTfmProtectedChannels obtfm;
copy_qt_qt(rv3d->lviewquat, rv3d->viewquat);
rv3d->lview= rv3d->view;
@@ -377,7 +378,12 @@ static int view3d_setcameratoview_exec(bContext *C, wmOperator *UNUSED(op))
rv3d->lpersp= rv3d->persp;
}
+ object_tfm_protected_backup(v3d->camera, &obtfm);
+
ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
+
+ object_tfm_protected_restore(v3d->camera, &obtfm, v3d->camera->protectflag);
+
DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
rv3d->persp = RV3D_CAMOB;
@@ -1062,14 +1068,14 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
float dfac;
if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
- if(winx>winy) dfac= (sensor_x * 2.0) / (fac*winx*lens);
- else dfac= (sensor_x * 2.0) / (fac*winy*lens);
+ if(winx>winy) dfac= (sensor_x * 2.0f) / (fac*winx*lens);
+ else dfac= (sensor_x * 2.0f) / (fac*winy*lens);
}
else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
- dfac= (sensor_x * 2.0) / (fac*winx*lens);
+ dfac= (sensor_x * 2.0f) / (fac*winx*lens);
}
else {
- dfac= (sensor_y * 2.0) / (fac*winy*lens);
+ dfac= (sensor_y * 2.0f) / (fac*winy*lens);
}
x1= - *clipsta * winx*dfac;
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 1014c6f8b40..a50a1a6910e 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -513,7 +513,7 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
{NUM_MODAL_INCREMENT_UP, "INCREMENT_UP", 0, "Numinput Increment Up", ""},
{NUM_MODAL_INCREMENT_DOWN, "INCREMENT_DOWN", 0, "Numinput Increment Down", ""},
{TFM_MODAL_PROPSIZE_UP, "PROPORTIONAL_SIZE_UP", 0, "Increase Proportional Influence", ""},
- {TFM_MODAL_PROPSIZE_DOWN, "PROPORTIONAL_SIZE_DOWN", 0, "Decrease Poportional Influence", ""},
+ {TFM_MODAL_PROPSIZE_DOWN, "PROPORTIONAL_SIZE_DOWN", 0, "Decrease Proportional Influence", ""},
{TFM_MODAL_AUTOIK_LEN_INC, "AUTOIK_CHAIN_LEN_UP", 0, "Increase Max AutoIK Chain Length", ""},
{TFM_MODAL_AUTOIK_LEN_DEC, "AUTOIK_CHAIN_LEN_DOWN", 0, "Decrease Max AutoIK Chain Length", ""},
{0, NULL, 0, NULL, NULL}};
@@ -4691,7 +4691,7 @@ static int createSlideVerts(TransInfo *t)
uv_new = tf->uv[k];
if (ev->tmp.l) {
- if (fabsf(suv->origuv[0]-uv_new[0]) > 0.0001f || fabs(suv->origuv[1]-uv_new[1]) > 0.0001f) {
+ if (fabsf(suv->origuv[0]-uv_new[0]) > 0.0001f || fabsf(suv->origuv[1]-uv_new[1]) > 0.0001f) {
ev->tmp.l = -1; /* Tag as invalid */
BLI_linklist_free(suv->fuv_list,NULL);
suv->fuv_list = NULL;
@@ -5462,7 +5462,7 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d,
else
#endif
{
- val= (float)( floor(val+0.5f) );
+ val= floorf(val+0.5f);
}
/* convert frame out of nla-action time */
@@ -5548,13 +5548,13 @@ static void headerTimeTranslate(TransInfo *t, char *str)
/* apply snapping + frame->seconds conversions */
if (autosnap == SACTSNAP_STEP) {
if (doTime)
- val= floor(val/secf + 0.5f);
+ val= floor((double)val/secf + 0.5f);
else
val= floor(val + 0.5f);
}
else {
if (doTime)
- val= val / secf;
+ val= (float)((double)val / secf);
}
if (autosnap == SACTSNAP_FRAME)
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 0a6f49f7c9f..e19c115b194 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -1256,7 +1256,7 @@ static void createTransArmatureVerts(TransInfo *t)
static void createTransMBallVerts(TransInfo *t)
{
MetaBall *mb = (MetaBall*)t->obedit->data;
- MetaElem *ml;
+ MetaElem *ml;
TransData *td;
TransDataExtension *tx;
float mtx[3][3], smtx[3][3];
@@ -5396,7 +5396,7 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
TransDataTracking *tdt;
int framenr = sc->user.framenr;
- if(clip && !BKE_movieclip_has_frame(clip, &sc->user)) {
+ if(!clip || !BKE_movieclip_has_frame(clip, &sc->user)) {
t->total = 0;
return;
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 53e379a2d27..3a8c2e80351 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -197,8 +197,9 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
clip = 0;
if(axis & 1) {
- if(fabs(iloc[0])<=tolerance[0] ||
- loc[0]*iloc[0]<0.0f) {
+ if(fabsf(iloc[0])<=tolerance[0] ||
+ loc[0]*iloc[0]<0.0f)
+ {
loc[0]= 0.0f;
clip = 1;
}
@@ -206,14 +207,16 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
if(axis & 2) {
if(fabs(iloc[1])<=tolerance[1] ||
- loc[1]*iloc[1]<0.0f) {
+ loc[1]*iloc[1]<0.0f)
+ {
loc[1]= 0.0f;
clip = 1;
}
}
if(axis & 4) {
if(fabs(iloc[2])<=tolerance[2] ||
- loc[2]*iloc[2]<0.0f) {
+ loc[2]*iloc[2]<0.0f)
+ {
loc[2]= 0.0f;
clip = 1;
}
@@ -619,6 +622,65 @@ static void recalcData_nla(TransInfo *t)
}
}
+/* helper for recalcData() - for Image Editor transforms */
+static void recalcData_image(TransInfo *t)
+{
+ if (t->obedit && t->obedit->type == OB_MESH) {
+ SpaceImage *sima= t->sa->spacedata.first;
+
+ flushTransUVs(t);
+ if(sima->flag & SI_LIVE_UNWRAP)
+ ED_uvedit_live_unwrap_re_solve();
+
+ DAG_id_tag_update(t->obedit->data, 0);
+ }
+}
+
+/* helper for recalcData() - for Movie Clip transforms */
+static void recalcData_clip(TransInfo *t)
+{
+ SpaceClip *sc= t->sa->spacedata.first;
+ MovieClip *clip= ED_space_clip(sc);
+ MovieTrackingTrack *track;
+
+ if(t->state == TRANS_CANCEL) {
+ track= clip->tracking.tracks.first;
+ while(track) {
+ if(TRACK_VIEW_SELECTED(sc, track)) {
+ MovieTrackingMarker *marker= BKE_tracking_ensure_marker(track, sc->user.framenr);
+
+ marker->flag= track->transflag;
+ }
+
+ track= track->next;
+ }
+ }
+
+ flushTransTracking(t);
+
+ track= clip->tracking.tracks.first;
+ while(track) {
+ if(TRACK_VIEW_SELECTED(sc, track)) {
+ if (t->mode == TFM_TRANSLATION) {
+ if(TRACK_AREA_SELECTED(track, TRACK_AREA_PAT))
+ BKE_tracking_clamp_track(track, CLAMP_PAT_POS);
+ if(TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH))
+ BKE_tracking_clamp_track(track, CLAMP_SEARCH_POS);
+ }
+ else if (t->mode == TFM_RESIZE) {
+ if(TRACK_AREA_SELECTED(track, TRACK_AREA_PAT))
+ BKE_tracking_clamp_track(track, CLAMP_PAT_DIM);
+ if(TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH))
+ BKE_tracking_clamp_track(track, CLAMP_SEARCH_DIM);
+ }
+ }
+
+ track= track->next;
+ }
+
+ DAG_id_tag_update(&clip->id, 0);
+}
+
/* helper for recalcData() - for 3d-view transforms */
static void recalcData_view3d(TransInfo *t)
{
@@ -853,60 +915,13 @@ void recalcData(TransInfo *t)
recalcData_nla(t);
}
else if (t->spacetype == SPACE_IMAGE) {
- if (t->obedit && t->obedit->type == OB_MESH) {
- SpaceImage *sima= t->sa->spacedata.first;
-
- flushTransUVs(t);
- if(sima->flag & SI_LIVE_UNWRAP)
- ED_uvedit_live_unwrap_re_solve();
-
- DAG_id_tag_update(t->obedit->data, 0);
- }
+ recalcData_image(t);
}
else if (t->spacetype == SPACE_VIEW3D) {
recalcData_view3d(t);
}
else if (t->spacetype == SPACE_CLIP) {
- SpaceClip *sc= t->sa->spacedata.first;
- MovieClip *clip= ED_space_clip(sc);
- MovieTrackingTrack *track;
-
- if(t->state == TRANS_CANCEL) {
- track= clip->tracking.tracks.first;
- while(track) {
- if(TRACK_VIEW_SELECTED(sc, track)) {
- MovieTrackingMarker *marker= BKE_tracking_ensure_marker(track, sc->user.framenr);
-
- marker->flag= track->transflag;
- }
-
- track= track->next;
- }
- }
-
- flushTransTracking(t);
-
- track= clip->tracking.tracks.first;
- while(track) {
- if(TRACK_VIEW_SELECTED(sc, track)) {
- if (t->mode == TFM_TRANSLATION) {
- if(TRACK_AREA_SELECTED(track, TRACK_AREA_PAT))
- BKE_tracking_clamp_track(track, CLAMP_PAT_POS);
- if(TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH))
- BKE_tracking_clamp_track(track, CLAMP_SEARCH_POS);
- }
- else if (t->mode == TFM_RESIZE) {
- if(TRACK_AREA_SELECTED(track, TRACK_AREA_PAT))
- BKE_tracking_clamp_track(track, CLAMP_PAT_DIM);
- if(TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH))
- BKE_tracking_clamp_track(track, CLAMP_SEARCH_DIM);
- }
- }
-
- track= track->next;
- }
-
- DAG_id_tag_update(&clip->id, 0);
+ recalcData_clip(t);
}
}
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index 88a2163164a..9367826e102 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -791,7 +791,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
float mat[4][4];
/* Rotation of MetaElem is stored in quat */
- quat_to_mat4( mat,ml_sel->quat);
+ quat_to_mat4( mat,ml_sel->quat);
copy_v3_v3(normal, mat[2]);
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 62b875c82de..173ab809b53 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -37,7 +37,9 @@
#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
+#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
#include "DNA_scene_types.h"
#include "BLI_math.h"
@@ -50,11 +52,16 @@
#include "BKE_depsgraph.h"
#include "BKE_image.h"
#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
#include "BKE_mesh.h"
+#include "BKE_node.h"
#include "BKE_report.h"
+#include "BKE_scene.h"
#include "ED_image.h"
#include "ED_mesh.h"
+#include "ED_node.h"
#include "ED_uvedit.h"
#include "ED_object.h"
#include "ED_screen.h"
@@ -87,9 +94,46 @@ int ED_uvedit_test(Object *obedit)
return ret;
}
+/**************************** object active image *****************************/
+
+static int is_image_texture_node(bNode *node)
+{
+ return ELEM(node->type, SH_NODE_TEX_IMAGE, SH_NODE_TEX_ENVIRONMENT);
+}
+
+int ED_object_get_active_image(Object *ob, int mat_nr, Image **ima, ImageUser **iuser, bNode **node_r)
+{
+ Material *ma= give_current_material(ob, mat_nr);
+ bNode *node= (ma && ma->use_nodes)? nodeGetActiveTexture(ma->nodetree): NULL;
+
+ if(node && is_image_texture_node(node)) {
+ if(ima) *ima= (Image*)node->id;
+ if(iuser) *iuser= NULL;
+ if(node_r) *node_r= node;
+ return TRUE;
+ }
+
+ if(ima) *ima= NULL;
+ if(iuser) *iuser= NULL;
+ if(node_r) *node_r= node;
+
+ return FALSE;
+}
+
+void ED_object_assign_active_image(Main *bmain, Object *ob, int mat_nr, Image *ima)
+{
+ Material *ma= give_current_material(ob, mat_nr);
+ bNode *node= (ma && ma->use_nodes)? nodeGetActiveTexture(ma->nodetree): NULL;
+
+ if(node && is_image_texture_node(node)) {
+ node->id= &ima->id;
+ ED_node_generic_update(bmain, ma->nodetree, node);
+ }
+}
+
/************************* assign image ************************/
-void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *previma)
+void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *ima, Image *previma)
{
EditMesh *em;
EditFace *efa;
@@ -109,35 +153,46 @@ void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *pre
BKE_mesh_end_editmesh(obedit->data, em);
return;
}
-
- /* ensure we have a uv layer */
- if(!CustomData_has_layer(&em->fdata, CD_MTFACE)) {
- EM_add_data_layer(em, &em->fdata, CD_MTFACE, NULL);
- update= 1;
+
+ if(scene_use_new_shading_nodes(scene)) {
+ /* new shading system, assign image in material */
+ int sloppy= 1;
+ EditFace *efa= EM_get_actFace(em, sloppy);
+
+ if(efa)
+ ED_object_assign_active_image(bmain, obedit, efa->mat_nr, ima);
}
+ else {
+ /* old shading system, assign image to selected faces */
+
+ /* ensure we have a uv layer */
+ if(!CustomData_has_layer(&em->fdata, CD_MTFACE)) {
+ EM_add_data_layer(em, &em->fdata, CD_MTFACE, NULL);
+ update= 1;
+ }
- /* now assign to all visible faces */
- for(efa= em->faces.first; efa; efa= efa->next) {
- tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ /* now assign to all visible faces */
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if(uvedit_face_visible(scene, previma, efa, tf)) {
- if(ima) {
- tf->tpage= ima;
-
- if(ima->id.us==0) id_us_plus(&ima->id);
- else id_lib_extern(&ima->id);
- }
- else {
- tf->tpage= NULL;
- }
+ if(uvedit_face_visible(scene, previma, efa, tf)) {
+ if(ima) {
+ tf->tpage= ima;
+
+ if(ima->id.us==0) id_us_plus(&ima->id);
+ else id_lib_extern(&ima->id);
+ }
+ else
+ tf->tpage= NULL;
- update = 1;
+ update = 1;
+ }
}
- }
- /* and update depdency graph */
- if(update)
- DAG_id_tag_update(obedit->data, 0);
+ /* and update depdency graph */
+ if(update)
+ DAG_id_tag_update(obedit->data, 0);
+ }
BKE_mesh_end_editmesh(obedit->data, em);
}
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 29a9ae84cd5..11cd50a7d4e 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -51,6 +51,7 @@
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_image.h"
+#include "BKE_main.h"
#include "BKE_mesh.h"
#include "PIL_time.h"
@@ -73,6 +74,7 @@
static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
{
+ Main *bmain= CTX_data_main(C);
EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
EditFace *efa;
MTFace *tf;
@@ -118,7 +120,7 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
}
if(ima)
- ED_uvedit_assign_image(scene, obedit, ima, NULL);
+ ED_uvedit_assign_image(bmain, scene, obedit, ima, NULL);
/* select new UV's */
for(efa=em->faces.first; efa; efa=efa->next) {
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 22cae058b2a..8d72bd64e29 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -468,11 +468,11 @@ void GPU_drawobject_free(DerivedMesh *dm)
}
typedef void (*GPUBufferCopyFunc)(DerivedMesh *dm, float *varray, int *index,
- int *mat_orig_to_new, void *user_data);
+ int *mat_orig_to_new, void *user_data);
static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
- int vector_size, int size, GLenum target,
- void *user, GPUBufferCopyFunc copy_f)
+ int vector_size, int size, GLenum target,
+ void *user, GPUBufferCopyFunc copy_f)
{
GPUBufferPool *pool;
GPUBuffer *buffer;
@@ -546,8 +546,8 @@ static GPUBuffer *gpu_buffer_setup(DerivedMesh *dm, GPUDrawObject *object,
while(uploaded == GL_FALSE) {
(*copy_f)(dm, varray, cur_index_per_mat, mat_orig_to_new, user);
/* glUnmapBuffer returns GL_FALSE if
- the data store is corrupted; retry
- in that case */
+ * the data store is corrupted; retry
+ * in that case */
uploaded = glUnmapBufferARB(target);
}
}
@@ -924,8 +924,8 @@ static GPUBuffer *gpu_buffer_setup_type(DerivedMesh *dm, GPUBufferType type)
}
buf = gpu_buffer_setup(dm, dm->drawObject, ts->vector_size,
- gpu_buffer_size_from_type(dm, type),
- ts->gl_buffer_type, user_data, ts->copy);
+ gpu_buffer_size_from_type(dm, type),
+ ts->gl_buffer_type, user_data, ts->copy);
return buf;
}
@@ -1144,8 +1144,8 @@ void GPU_buffer_unbind(void)
}
}
GLStates &= !(GPU_BUFFER_VERTEX_STATE | GPU_BUFFER_NORMAL_STATE |
- GPU_BUFFER_TEXCOORD_STATE | GPU_BUFFER_COLOR_STATE |
- GPU_BUFFER_ELEMENT_STATE);
+ GPU_BUFFER_TEXCOORD_STATE | GPU_BUFFER_COLOR_STATE |
+ GPU_BUFFER_ELEMENT_STATE);
for(i = 0; i < MAX_GPU_ATTRIB_DATA; i++) {
if(attribData[i].index != -1) {
@@ -1310,8 +1310,8 @@ void GPU_update_mesh_buffers(GPU_Buffers *buffers_v, MVert *mvert,
/* Build VBO */
glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffers->vert_buf);
glBufferDataARB(GL_ARRAY_BUFFER_ARB,
- sizeof(VertexBufferFormat) * totvert,
- NULL, GL_STATIC_DRAW_ARB);
+ sizeof(VertexBufferFormat) * totvert,
+ NULL, GL_STATIC_DRAW_ARB);
vert_data = glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
if(vert_data) {
@@ -1359,7 +1359,7 @@ GPU_Buffers *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
/* Generate index buffer object */
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, buffers->index_buf);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB,
- sizeof(unsigned short) * tottri * 3, NULL, GL_STATIC_DRAW_ARB);
+ sizeof(unsigned short) * tottri * 3, NULL, GL_STATIC_DRAW_ARB);
/* Fill the triangle buffer */
tri_data = glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
@@ -1429,8 +1429,8 @@ void GPU_update_grid_buffers(GPU_Buffers *buffers_v, DMGridData **grids,
if(buffers->vert_buf) {
glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffers->vert_buf);
glBufferDataARB(GL_ARRAY_BUFFER_ARB,
- sizeof(DMGridData) * totvert,
- NULL, GL_STATIC_DRAW_ARB);
+ sizeof(DMGridData) * totvert,
+ NULL, GL_STATIC_DRAW_ARB);
vert_data = glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
if(vert_data) {
for(i = 0; i < totgrid; ++i) {
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 78f5eb52d52..35ef48250cc 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -909,7 +909,7 @@ static void gpu_node_input_socket(GPUNode *node, GPUNodeStack *sock)
gpu_node_input_link(node, sock->link, sock->type);
}
else {
- link = GPU_node_link_create(0);
+ link = GPU_node_link_create(0);
link->ptr1 = sock->vec;
gpu_node_input_link(node, link, sock->type);
}
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 4c828264061..05b980cd88c 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -62,7 +62,7 @@
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_object.h"
-
+#include "BKE_scene.h"
#include "BLI_threads.h"
#include "BLI_blenlib.h"
@@ -596,7 +596,7 @@ static void gpu_verify_repeat(Image *ima)
{
/* set either clamp or repeat in X/Y */
if (ima->tpageflag & IMA_CLAMP_U)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
else
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
@@ -775,7 +775,7 @@ int GPU_update_image_time(Image *ima, double time)
if (ima->lastupdate<0)
ima->lastupdate = 0;
- if (ima->lastupdate>time)
+ if (ima->lastupdate > (float)time)
ima->lastupdate=(float)time;
if(ima->tpageflag & IMA_TWINANIM) {
@@ -783,7 +783,7 @@ int GPU_update_image_time(Image *ima, double time)
/* check: is the bindcode not in the array? Then free. (still to do) */
- diff = (float)(time-ima->lastupdate);
+ diff = (float)((float)time - ima->lastupdate);
inc = (int)(diff*(float)ima->animspeed);
ima->lastupdate+=((float)inc/(float)ima->animspeed);
@@ -809,11 +809,11 @@ void GPU_free_smoke(SmokeModifierData *smd)
if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain)
{
if(smd->domain->tex)
- GPU_texture_free(smd->domain->tex);
+ GPU_texture_free(smd->domain->tex);
smd->domain->tex = NULL;
if(smd->domain->tex_shadow)
- GPU_texture_free(smd->domain->tex_shadow);
+ GPU_texture_free(smd->domain->tex_shadow);
smd->domain->tex_shadow = NULL;
}
}
@@ -952,15 +952,17 @@ static struct GPUMaterialState {
} GMS = {NULL};
/* fixed function material, alpha handed by caller */
-static void gpu_material_to_fixed(GPUMaterialFixed *smat, const Material *bmat, const int gamma, const Object *ob)
+static void gpu_material_to_fixed(GPUMaterialFixed *smat, const Material *bmat, const int gamma, const Object *ob, const int new_shading_nodes)
{
- if (bmat->mode & MA_SHLESS) {
+ if(new_shading_nodes || bmat->mode & MA_SHLESS) {
copy_v3_v3(smat->diff, &bmat->r);
smat->diff[3]= 1.0;
- if(gamma) {
+ if(gamma)
linearrgb_to_srgb_v3_v3(smat->diff, smat->diff);
- }
+
+ zero_v4(smat->spec);
+ smat->hard= 0;
}
else {
mul_v3_v3fl(smat->diff, &bmat->r, bmat->ref + bmat->emit);
@@ -1001,6 +1003,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
GPUBlendMode alphablend;
int a;
int gamma = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT;
+ int new_shading_nodes = scene_use_new_shading_nodes(scene);
/* initialize state */
memset(&GMS, 0, sizeof(GMS));
@@ -1032,7 +1035,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
/* no materials assigned? */
if(ob->totcol==0) {
- gpu_material_to_fixed(&GMS.matbuf[0], &defmaterial, 0, ob);
+ gpu_material_to_fixed(&GMS.matbuf[0], &defmaterial, 0, ob, new_shading_nodes);
/* do material 1 too, for displists! */
memcpy(&GMS.matbuf[1], &GMS.matbuf[0], sizeof(GPUMaterialFixed));
@@ -1049,7 +1052,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
for(a=1; a<=ob->totcol; a++) {
/* find a suitable material */
ma= give_current_material(ob, a);
- if(!glsl) ma= gpu_active_node_material(ma);
+ if(!glsl && !new_shading_nodes) ma= gpu_active_node_material(ma);
if(ma==NULL) ma= &defmaterial;
/* create glsl material if requested */
@@ -1062,7 +1065,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
}
else {
/* fixed function opengl materials */
- gpu_material_to_fixed(&GMS.matbuf[a], ma, gamma, ob);
+ 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)
@@ -1223,6 +1226,7 @@ void GPU_end_object_materials(void)
int GPU_default_lights(void)
{
+ float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f}, position[4];
int a, count = 0;
/* initialize */
@@ -1248,27 +1252,28 @@ int GPU_default_lights(void)
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
- glLightfv(GL_LIGHT0, GL_POSITION, U.light[0].vec);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, U.light[0].col);
- glLightfv(GL_LIGHT0, GL_SPECULAR, U.light[0].spec);
-
- glLightfv(GL_LIGHT1, GL_POSITION, U.light[1].vec);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, U.light[1].col);
- glLightfv(GL_LIGHT1, GL_SPECULAR, U.light[1].spec);
-
- glLightfv(GL_LIGHT2, GL_POSITION, U.light[2].vec);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, U.light[2].col);
- glLightfv(GL_LIGHT2, GL_SPECULAR, U.light[2].spec);
-
for(a=0; a<8; a++) {
if(a<3) {
if(U.light[a].flag) {
glEnable(GL_LIGHT0+a);
+
+ normalize_v3_v3(position, U.light[a].vec);
+ position[3]= 0.0f;
+
+ glLightfv(GL_LIGHT0+a, GL_POSITION, position);
+ glLightfv(GL_LIGHT0+a, GL_DIFFUSE, U.light[a].col);
+ glLightfv(GL_LIGHT0+a, GL_SPECULAR, U.light[a].spec);
+
count++;
}
- else
+ else {
glDisable(GL_LIGHT0+a);
-
+
+ glLightfv(GL_LIGHT0+a, GL_POSITION, zero);
+ glLightfv(GL_LIGHT0+a, GL_DIFFUSE, zero);
+ glLightfv(GL_LIGHT0+a, GL_SPECULAR, zero);
+ }
+
// clear stuff from other opengl lamp usage
glLightf(GL_LIGHT0+a, GL_SPOT_CUTOFF, 180.0);
glLightf(GL_LIGHT0+a, GL_CONSTANT_ATTENUATION, 1.0);
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index e1a89daf7e2..184eac9519e 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -1208,7 +1208,7 @@ GPUPixelBuffer *gpu_pixelbuffer_create(int x, int y, int halffloat, int numbuffe
pb->numbuffers = numbuffers;
pb->halffloat = halffloat;
- glGenBuffersARB(pb->numbuffers, pb->bindcode);
+ glGenBuffersARB(pb->numbuffers, pb->bindcode);
if (!pb->bindcode[0]) {
fprintf(stderr, "GPUPixelBuffer allocation failed\n");
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 9344b4e680a..397c0e32c69 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -1337,8 +1337,8 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
if(world) {
/* exposure correction */
if(world->exp!=0.0f || world->range!=1.0f) {
- linfac= 1.0 + pow((2.0*world->exp + 0.5), -10);
- logfac= log((linfac-1.0f)/linfac)/world->range;
+ linfac= 1.0f + powf((2.0f*world->exp + 0.5f), -10);
+ logfac= logf((linfac-1.0f)/linfac)/world->range;
GPU_link(mat, "set_value", GPU_uniform(&linfac), &ulinfac);
GPU_link(mat, "set_value", GPU_uniform(&logfac), &ulogfac);
@@ -1415,29 +1415,33 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
if(((GPUMaterial*)link->data)->scene == scene)
return link->data;
+ /* allocate material */
mat = GPU_material_construct_begin(ma);
mat->scene = scene;
if(!(scene->gm.flag & GAME_GLSL_NO_NODES) && ma->nodetree && ma->use_nodes) {
+ /* create nodes */
ntreeGPUMaterialNodes(ma->nodetree, mat);
}
else {
+ /* create material */
outlink = GPU_blender_material(mat, ma);
GPU_material_output_link(mat, outlink);
}
- if(gpu_do_color_management(mat))
- if(mat->outlink)
- GPU_link(mat, "linearrgb_to_srgb", mat->outlink, &mat->outlink);
+ if(!scene_use_new_shading_nodes(scene)) {
+ if(gpu_do_color_management(mat))
+ if(mat->outlink)
+ GPU_link(mat, "linearrgb_to_srgb", mat->outlink, &mat->outlink);
+ }
- /*if(!GPU_material_construct_end(mat)) {
- GPU_material_free(mat);
- mat= NULL;
- return 0;
- }*/
GPU_material_construct_end(mat);
+ /* note that even if building the shader fails in some way, we still keep
+ it to avoid trying to compile again and again, and simple do not use
+ the actual shader on drawing */
+
link = MEM_callocN(sizeof(LinkData), "GPUMaterialLink");
link->data = mat;
BLI_addtail(&ma->gpumaterial, link);
@@ -1514,7 +1518,7 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l
if(lamp->mode & LA_HALO)
if(lamp->spotsi > 170.0f)
lamp->spotsi = 170.0f;
- lamp->spotsi= cos(M_PI*lamp->spotsi/360.0);
+ lamp->spotsi= cosf((float)M_PI*lamp->spotsi/360.0f);
lamp->spotbl= (1.0f - lamp->spotsi)*la->spotblend;
lamp->k= la->k;
@@ -1535,7 +1539,7 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l
/* makeshadowbuf */
angle= saacos(lamp->spotsi);
- temp= 0.5f*lamp->size*cos(angle)/sin(angle);
+ temp= 0.5f*lamp->size*cosf(angle)/sinf(angle);
pixsize= (lamp->d)/temp;
wsize= pixsize*0.5f*lamp->size;
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl
index c5c822d9224..4a9d793aaad 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl
@@ -108,6 +108,7 @@ void linearrgb_to_srgb(vec4 col_from, out vec4 col_to)
}
#define M_PI 3.14159265358979323846
+#define M_1_PI 0.31830988618379069
/*********** SHADER NODES ***************/
@@ -1802,3 +1803,319 @@ void shade_alpha_obcolor(vec4 col, vec4 obcol, out vec4 outcol)
outcol = vec4(col.rgb, col.a*obcol.a);
}
+/*********** NEW SHADER UTILITIES **************/
+
+float fresnel_dielectric(vec3 Incoming, vec3 Normal, float eta)
+{
+ /* compute fresnel reflectance without explicitly computing
+ the refracted direction */
+ float c = abs(dot(Incoming, Normal));
+ float g = eta * eta - 1.0 + c * c;
+ float result;
+
+ if(g > 0.0) {
+ g = sqrt(g);
+ float A =(g - c)/(g + c);
+ float B =(c *(g + c)- 1.0)/(c *(g - c)+ 1.0);
+ result = 0.5 * A * A *(1.0 + B * B);
+ }
+ else
+ result = 1.0; /* TIR (no refracted component) */
+
+ return result;
+}
+
+float hypot(float x, float y)
+{
+ return sqrt(x*x + y*y);
+}
+
+/*********** NEW SHADER NODES ***************/
+
+#define NUM_LIGHTS 3
+
+/* bsdfs */
+
+void node_bsdf_diffuse(vec4 color, vec3 N, out vec4 result)
+{
+ /* ambient light */
+ vec3 L = vec3(0.2);
+
+ /* directional lights */
+ for(int i = 0; i < NUM_LIGHTS; i++) {
+ vec3 light_position = gl_LightSource[i].position.xyz;
+ vec3 light_diffuse = gl_LightSource[i].diffuse.rgb;
+
+ float bsdf = max(dot(N, light_position), 0.0);
+ L += light_diffuse*bsdf;
+ }
+
+ result = vec4(L*color.rgb, 1.0);
+}
+
+void node_bsdf_glossy(vec4 color, float roughness, vec3 N, vec3 I, out vec4 result)
+{
+ vec3 L = vec3(0.0);
+
+ /* directional lights */
+ for(int i = 0; i < NUM_LIGHTS; i++) {
+ vec3 H = gl_LightSource[i].halfVector.xyz;
+ vec3 light_specular = gl_LightSource[i].specular.rgb;
+
+ float bsdf = pow(max(dot(N, H), 0.0), 1.0/roughness);
+ L += light_specular*bsdf;
+ }
+
+ result = vec4(L*color.rgb, 1.0);
+}
+
+void node_bsdf_anisotropic(vec4 color, float roughnessU, float roughnessV, vec3 N, vec3 I, out vec4 result)
+{
+ node_bsdf_diffuse(color, N, result);
+}
+
+void node_bsdf_glass(vec4 color, float roughness, float ior, vec3 N, vec3 I, out vec4 result)
+{
+ node_bsdf_diffuse(color, N, result);
+}
+
+void node_bsdf_translucent(vec4 color, vec3 N, out vec4 result)
+{
+ node_bsdf_diffuse(color, N, result);
+}
+
+void node_bsdf_transparent(vec4 color, out vec4 result)
+{
+ /* this isn't right */
+ result.r = color.r;
+ result.g = color.g;
+ result.b = color.b;
+ result.a = 0.0;
+}
+
+void node_bsdf_velvet(vec4 color, float sigma, vec3 N, out vec4 result)
+{
+ node_bsdf_diffuse(color, N, result);
+}
+
+/* emission */
+
+void node_emission(vec4 color, float strength, vec3 N, out vec4 result)
+{
+ result = color*strength;
+}
+
+/* closures */
+
+void node_mix_shader(float fac, vec4 shader1, vec4 shader2, out vec4 shader)
+{
+ shader = mix(shader1, shader2, fac);
+}
+
+void node_add_shader(vec4 shader1, vec4 shader2, out vec4 shader)
+{
+ shader = shader1 + shader2;
+}
+
+/* fresnel */
+
+void node_fresnel(float ior, vec3 N, vec3 I, out float result)
+{
+ float eta = max(ior, 0.00001);
+ result = fresnel_dielectric(I, N, eta); //backfacing()? 1.0/eta: eta);
+}
+
+/* geometry */
+
+void node_geometry(vec3 I, vec3 N, mat4 toworld,
+ out vec3 position, out vec3 normal, out vec3 tangent,
+ out vec3 true_normal, out vec3 incoming, out vec3 parametric,
+ out float backfacing)
+{
+ position = (toworld*vec4(I, 1.0)).xyz;
+ normal = N;
+ tangent = vec3(0.0);
+ true_normal = N;
+ incoming = I;
+ parametric = vec3(0.0);
+ backfacing = 0.0;
+}
+
+void node_tex_coord(vec3 I, vec3 N, mat4 toworld,
+ vec3 attr_orco, vec3 attr_uv,
+ out vec3 generated, out vec3 uv, out vec3 object,
+ out vec3 camera, out vec3 window, out vec3 reflection)
+{
+ generated = attr_orco;
+ uv = attr_uv;
+ object = I;
+ camera = I;
+ window = gl_FragCoord.xyz;
+ reflection = reflect(N, I);
+
+}
+
+/* textures */
+
+void node_tex_blend(vec3 co, out float fac)
+{
+ fac = 1.0;
+}
+
+void node_tex_clouds(vec3 co, float size, out vec4 color, out float fac)
+{
+ color = vec4(1.0);
+ fac = 1.0;
+}
+
+void node_tex_distnoise(vec3 co, float size, float distortion, out float fac)
+{
+ fac = 1.0;
+}
+
+void node_tex_environment(vec3 co, sampler2D ima, out vec4 color)
+{
+ float u = (atan(co.y, co.x) + M_PI)/(2.0*M_PI);
+ float v = atan(co.z, hypot(co.x, co.y))/M_PI + 0.5;
+
+ color = texture2D(ima, vec2(u, v));
+}
+
+void node_tex_image(vec3 co, sampler2D ima, out vec4 color)
+{
+ color = texture2D(ima, co.xy);
+}
+
+void node_tex_magic(vec3 p, float turbulence, float n, out vec4 color)
+{
+ float turb = turbulence/5.0;
+
+ float x = sin((p.x + p.y + p.z)*5.0);
+ float y = cos((-p.x + p.y - p.z)*5.0);
+ float z = -cos((-p.x - p.y + p.z)*5.0);
+
+ if(n > 0.0) {
+ x *= turb;
+ y *= turb;
+ z *= turb;
+ y = -cos(x-y+z);
+ y *= turb;
+
+ if(n > 1.0) {
+ x= cos(x-y-z);
+ x *= turb;
+
+ if(n > 2.0) {
+ z= sin(-x-y-z);
+ z *= turb;
+
+ if(n > 3.0) {
+ x= -cos(-x+y-z);
+ x *= turb;
+
+ if(n > 4.0) {
+ y= -sin(-x+y+z);
+ y *= turb;
+
+ if(n > 5.0) {
+ y= -cos(-x+y+z);
+ y *= turb;
+
+ if(n > 6.0) {
+ x= cos(x+y+z);
+ x *= turb;
+
+ if(n > 7.0) {
+ z= sin(x+y-z);
+ z *= turb;
+
+ if(n > 8.0) {
+ x= -cos(-x-y+z);
+ x *= turb;
+
+ if(n > 9.0) {
+ y= -sin(x-y+z);
+ y *= turb;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(turb != 0.0) {
+ turb *= 2.0;
+ x /= turb;
+ y /= turb;
+ z /= turb;
+ }
+
+ color = vec4(0.5 - x, 0.5 - y, 0.5 - z, 1.0);
+}
+
+void node_tex_marble(vec3 co, float size, float turbulence, out float fac)
+{
+ fac = 1.0;
+}
+
+void node_tex_musgrave(vec3 co, float size, float dimension, float lacunarity, float octaves, float offset, float gain, out float fac)
+{
+ fac = 1.0;
+}
+
+void node_tex_noise(vec3 co, out vec4 color, out float fac)
+{
+ color = vec4(1.0);
+ fac = 1.0;
+}
+
+void node_tex_sky(vec3 co, out vec4 color)
+{
+ color = vec4(1.0);
+}
+
+void node_tex_stucci(vec3 co, float size, float turbulence, out float fac)
+{
+ fac = 1.0;
+}
+
+void node_tex_voronoi(vec3 co, float size, float weight1, float weight2, float weight3, float weight4, float exponent, out vec4 color, out float fac)
+{
+ color = vec4(1.0);
+ fac = 1.0;
+}
+
+void node_tex_wood(vec3 co, float size, float turbulence, out float fac)
+{
+ fac = 1.0;
+}
+
+/* light path */
+
+void node_light_path(
+ out float is_camera_ray,
+ out float is_shadow_ray,
+ out float is_diffuse_ray,
+ out float is_glossy_ray,
+ out float is_reflection_ray,
+ out float is_transmission_ray)
+{
+ is_camera_ray = 1.0;
+ is_shadow_ray = 0.0;
+ is_diffuse_ray = 0.0;
+ is_glossy_ray = 0.0;
+ is_reflection_ray = 0.0;
+ is_transmission_ray = 0.0;
+}
+
+/* output */
+
+void node_output_material(vec4 surface, vec4 volume, float displacement, out vec4 result)
+{
+ result = surface;
+}
+
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index b551ee9dda1..e284c42532b 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,1254 +1,1453 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 39910;
+int datatoc_gpu_shader_material_glsl_size= 46289;
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, 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,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,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,
+ 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,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,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,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,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,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,
+ 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,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,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,
-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,
+ 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,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,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,
+ 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,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,
+ 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, 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,
+ 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, 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,
+ 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, 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,
+ 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, 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,
+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,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,
+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,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,
+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, 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,
+ 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,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, 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,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,
+ 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, 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,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,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,
+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, 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,
+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,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,118,101, 99, 51, 32, 76, 32, 61, 32,118,101, 99, 51,
+ 40, 48, 46, 48, 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, 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,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,102,108,111, 97,116, 32, 98,115,100,102, 32, 61, 32,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, 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, 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, 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, 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,
+ 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,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,
+ 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,
+ 97,116,101,114,105, 97,108, 40,118,101, 99, 52, 32,115,117,114,102, 97, 99,101, 44, 32,118,101, 99, 52, 32,118,111,108,117,109,
+101, 44, 32,102,108,111, 97,116, 32,100,105,115,112,108, 97, 99,101,109,101,110,116, 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,115,117,114,102, 97, 99,101, 59, 10,125, 10, 10,
0};
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index 2a83052c827..7159c09d703 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -71,7 +71,7 @@ static void initialize_posetree(struct Object *UNUSED(ob), bPoseChannel *pchan_t
if (data->flag & CONSTRAINT_IK_AUTO) break;
if (data->tar==NULL) continue;
if (data->tar->type==OB_ARMATURE && data->subtarget[0]==0) continue;
- if ((con->flag & (CONSTRAINT_DISABLE|CONSTRAINT_OFF))==0 && (con->enforce!=0.0)) break;
+ if ((con->flag & (CONSTRAINT_DISABLE|CONSTRAINT_OFF))==0 && (con->enforce != 0.0f)) break;
}
}
if(con==NULL) return;
@@ -255,7 +255,7 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
if(!(pchan->ikflag & BONE_IK_NO_ZDOF) && !(pchan->ikflag & BONE_IK_NO_ZDOF_TEMP))
flag |= IK_ZDOF;
- if(tree->stretch && (pchan->ikstretch > 0.0)) {
+ if(tree->stretch && (pchan->ikstretch > 0.0f)) {
flag |= IK_TRANS_YDOF;
hasstretch = 1;
}
@@ -320,9 +320,9 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
IK_SetStiffness(seg, IK_Y, pchan->stiffness[1]);
IK_SetStiffness(seg, IK_Z, pchan->stiffness[2]);
- if(tree->stretch && (pchan->ikstretch > 0.0)) {
+ if(tree->stretch && (pchan->ikstretch > 0.0f)) {
float ikstretch = pchan->ikstretch*pchan->ikstretch;
- IK_SetStiffness(seg, IK_TRANS_Y, MIN2(1.0-ikstretch, 0.99));
+ IK_SetStiffness(seg, IK_TRANS_Y, MIN2(1.0f-ikstretch, 0.99f));
IK_SetLimit(seg, IK_TRANS_Y, 0.001, 1e10);
}
}
@@ -389,10 +389,10 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
}
/* do we need blending? */
- if (!resultblend && target->con->enforce!=1.0) {
+ if (!resultblend && target->con->enforce != 1.0f) {
float q1[4], q2[4], q[4];
float fac= target->con->enforce;
- float mfac= 1.0-fac;
+ float mfac= 1.0f-fac;
pchan= tree->pchan[target->tip];
@@ -415,13 +415,13 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
iktarget= iktree[target->tip];
- if(data->weight != 0.0) {
+ if(data->weight != 0.0f) {
if(poleconstrain)
IK_SolverSetPoleVectorConstraint(solver, iktarget, goalpos,
polepos, data->poleangle, (poleangledata == data));
IK_SolverAddGoal(solver, iktarget, goalpos, data->weight);
}
- if((data->flag & CONSTRAINT_IK_ROT) && (data->orientweight != 0.0))
+ if((data->flag & CONSTRAINT_IK_ROT) && (data->orientweight != 0.0f))
if((data->flag & CONSTRAINT_IK_AUTO)==0)
IK_SolverAddGoalOrientation(solver, iktarget, goalrot,
data->orientweight);
@@ -448,20 +448,20 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
float parentstretch, stretch;
pchan= tree->pchan[a];
- parentstretch= (tree->parent[a] >= 0)? ikstretch[tree->parent[a]]: 1.0;
+ parentstretch= (tree->parent[a] >= 0)? ikstretch[tree->parent[a]]: 1.0f;
- if(tree->stretch && (pchan->ikstretch > 0.0)) {
+ if(tree->stretch && (pchan->ikstretch > 0.0f)) {
float trans[3], length;
IK_GetTranslationChange(iktree[a], trans);
length= pchan->bone->length*len_v3(pchan->pose_mat[1]);
- ikstretch[a]= (length == 0.0)? 1.0: (trans[1]+length)/length;
+ ikstretch[a]= (length == 0.0f)? 1.0f: (trans[1]+length)/length;
}
else
ikstretch[a] = 1.0;
- stretch= (parentstretch == 0.0)? 1.0: ikstretch[a]/parentstretch;
+ stretch= (parentstretch == 0.0f)? 1.0f: ikstretch[a]/parentstretch;
mul_v3_fl(tree->basis_change[a][0], stretch);
mul_v3_fl(tree->basis_change[a][1], stretch);
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 3ab199625a4..3586e8f1b5e 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -214,14 +214,14 @@ typedef enum IMB_Proxy_Size {
void IMB_anim_set_index_dir(struct anim * anim, const char * dir);
int IMB_anim_index_get_frame_index(struct anim * anim, IMB_Timecode_Type tc,
- int position);
+ int position);
/* will rebuild all used indices and proxies at once */
void IMB_anim_index_rebuild(struct anim * anim,
- IMB_Timecode_Type build_tcs,
- IMB_Proxy_Size build_preview_sizes,
- int build_quality,
- short *stop, short *do_update, float *progress);
+ IMB_Timecode_Type build_tcs,
+ IMB_Proxy_Size build_preview_sizes,
+ int build_quality,
+ short *stop, short *do_update, float *progress);
/**
* Return the length (in frames) of the given @a anim.
@@ -234,7 +234,7 @@ int IMB_anim_get_duration(struct anim *anim, IMB_Timecode_Type tc);
* and frs_sec and frs_sec_base untouched if none available!)
*/
int IMB_anim_get_fps(struct anim * anim,
- short * frs_sec, float * frs_sec_base);
+ short * frs_sec, float * frs_sec_base);
/**
*
diff --git a/source/blender/imbuf/intern/IMB_indexer.h b/source/blender/imbuf/intern/IMB_indexer.h
index 5c76f33a319..9ce587aa983 100644
--- a/source/blender/imbuf/intern/IMB_indexer.h
+++ b/source/blender/imbuf/intern/IMB_indexer.h
@@ -78,24 +78,26 @@ typedef struct anim_index_builder {
void * private_data;
void (*delete_priv_data)(struct anim_index_builder * idx);
- void (*proc_frame)(struct anim_index_builder * idx,
- unsigned char * buffer,
- int data_size,
- struct anim_index_entry * entry);
+ void (*proc_frame)(struct anim_index_builder * idx,
+ unsigned char * buffer,
+ int data_size,
+ struct anim_index_entry * entry);
} anim_index_builder;
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,
- unsigned long long seek_pos_dts,
- unsigned long long pts);
-
-void IMB_index_builder_proc_frame(anim_index_builder * fp,
- unsigned char * buffer,
- int data_size,
- int frameno, unsigned long long seek_pos,
- unsigned long long seek_pos_dts,
- unsigned long long pts);
+void IMB_index_builder_add_entry(
+ anim_index_builder * fp,
+ int frameno, unsigned long long seek_pos,
+ unsigned long long seek_pos_dts,
+ unsigned long long pts);
+
+void IMB_index_builder_proc_frame(
+ anim_index_builder * fp,
+ unsigned char * buffer,
+ int data_size,
+ int frameno, unsigned long long seek_pos,
+ unsigned long long seek_pos_dts,
+ unsigned long long pts);
void IMB_index_builder_finish(anim_index_builder * fp, int rollback);
@@ -111,7 +113,7 @@ unsigned long long IMB_indexer_get_pts(struct anim_index * idx,
int IMB_indexer_get_duration(struct anim_index * idx);
int IMB_indexer_can_scan(struct anim_index * idx,
- int old_frame_index, int new_frame_index);
+ int old_frame_index, int new_frame_index);
void IMB_indexer_close(struct anim_index * idx);
diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c
index 3adb9a3791f..fb6c85c2408 100644
--- a/source/blender/imbuf/intern/anim_movie.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -530,12 +530,12 @@ static int startffmpeg(struct anim * anim) {
}
if (anim->ib_flags & IB_animdeinterlace) {
- avpicture_fill((AVPicture*) anim->pFrameDeinterlaced,
- MEM_callocN(avpicture_get_size(
- anim->pCodecCtx->pix_fmt,
- anim->x, anim->y),
- "ffmpeg deinterlace"),
- anim->pCodecCtx->pix_fmt, anim->x, anim->y);
+ avpicture_fill((AVPicture*) anim->pFrameDeinterlaced,
+ MEM_callocN(avpicture_get_size(
+ anim->pCodecCtx->pix_fmt,
+ anim->x, anim->y),
+ "ffmpeg deinterlace"),
+ anim->pCodecCtx->pix_fmt, anim->x, anim->y);
}
if (pCodecCtx->has_b_frames) {
@@ -627,9 +627,9 @@ static void ffmpeg_postprocess(struct anim * anim)
}
}
- avpicture_fill((AVPicture*) anim->pFrameRGB,
- (unsigned char*) ibuf->rect,
- PIX_FMT_RGBA, anim->x, anim->y);
+ avpicture_fill((AVPicture*) anim->pFrameRGB,
+ (unsigned char*) ibuf->rect,
+ PIX_FMT_RGBA, anim->x, anim->y);
if (ENDIAN_ORDER == B_ENDIAN) {
int * dstStride = anim->pFrameRGB->linesize;
@@ -641,12 +641,12 @@ static void ffmpeg_postprocess(struct anim * anim)
unsigned char* top;
sws_scale(anim->img_convert_ctx,
- (const uint8_t * const *)input->data,
- input->linesize,
- 0,
- anim->pCodecCtx->height,
- dst2,
- dstStride2);
+ (const uint8_t * const *)input->data,
+ input->linesize,
+ 0,
+ anim->pCodecCtx->height,
+ dst2,
+ dstStride2);
/* workaround: sws_scale bug
sets alpha = 0 and compensate
@@ -691,12 +691,12 @@ static void ffmpeg_postprocess(struct anim * anim)
unsigned char* r;
sws_scale(anim->img_convert_ctx,
- (const uint8_t * const *)input->data,
- input->linesize,
- 0,
- anim->pCodecCtx->height,
- dst2,
- dstStride2);
+ (const uint8_t * const *)input->data,
+ input->linesize,
+ 0,
+ anim->pCodecCtx->height,
+ dst2,
+ dstStride2);
r = (unsigned char*) ibuf->rect;
@@ -890,7 +890,7 @@ static int ffmpeg_seek_by_byte(AVFormatContext *pFormatCtx)
static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
IMB_Timecode_Type tc) {
- int64_t pts_to_search = 0;
+ unsigned long long pts_to_search = 0;
double frame_rate;
double pts_time_base;
long long st_time;
@@ -1024,10 +1024,10 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
}
if (ret < 0) {
- av_log(anim->pFormatCtx, AV_LOG_ERROR,
+ av_log(anim->pFormatCtx, AV_LOG_ERROR,
"FETCH: "
"error while seeking to DTS = %lld "
- "(frameno = %d, PTS = %lld): errcode = %d\n",
+ "(frameno = %d, PTS = %lld): errcode = %d\n",
pos, position, (long long int)pts_to_search, ret);
}
@@ -1125,7 +1125,7 @@ static ImBuf * redcode_fetchibuf(struct anim * anim, int position) {
}
ibuf = IMB_allocImBuf(raw_frame->width * 2,
- raw_frame->height * 2, 32, IB_rectfloat);
+ raw_frame->height * 2, 32, IB_rectfloat);
redcode_decode_video_float(raw_frame, ibuf->rect_float, 1);
diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c
index 3a94c79f48d..9993df61089 100644
--- a/source/blender/imbuf/intern/indexer.c
+++ b/source/blender/imbuf/intern/indexer.c
@@ -48,12 +48,12 @@ static char magic[] = "BlenMIdx";
static char temp_ext [] = "_part";
static int proxy_sizes[] = { IMB_PROXY_25, IMB_PROXY_50, IMB_PROXY_75,
- IMB_PROXY_100 };
+ IMB_PROXY_100 };
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 };
+ IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN };
#endif
#define INDEX_FILE_VERSION 1
@@ -73,9 +73,9 @@ extern void IMB_indexer_dv_new(anim_index_builder * idx);
anim_index_builder * IMB_index_builder_create(const char * name)
{
- anim_index_builder * rv
- = MEM_callocN( sizeof(struct anim_index_builder),
- "index builder");
+ anim_index_builder * rv
+ = MEM_callocN( sizeof(struct anim_index_builder),
+ "index builder");
fprintf(stderr, "Starting work on index: %s\n", name);
@@ -197,13 +197,13 @@ struct anim_index * IMB_indexer_open(const char * name)
* idx->num_entries, "anim_index_entries");
for (i = 0; i < idx->num_entries; i++) {
- fread(&idx->entries[i].frameno,
+ fread(&idx->entries[i].frameno,
sizeof(int), 1, fp);
- fread(&idx->entries[i].seek_pos,
+ fread(&idx->entries[i].seek_pos,
sizeof(unsigned long long), 1, fp);
- fread(&idx->entries[i].seek_pos_dts,
+ fread(&idx->entries[i].seek_pos_dts,
sizeof(unsigned long long), 1, fp);
- fread(&idx->entries[i].pts,
+ fread(&idx->entries[i].pts,
sizeof(unsigned long long), 1, fp);
}
@@ -392,7 +392,7 @@ static void get_proxy_filename(struct anim * anim, IMB_Proxy_Size preview_size,
get_index_dir(anim, index_dir);
BLI_join_dirfile(fname, FILE_MAXFILE + FILE_MAXDIR, index_dir,
- temp ? proxy_temp_name : proxy_name);
+ temp ? proxy_temp_name : proxy_name);
}
static void get_tc_filename(struct anim * anim, IMB_Timecode_Type tc,
@@ -418,7 +418,7 @@ static void get_tc_filename(struct anim * anim, IMB_Timecode_Type tc,
get_index_dir(anim, index_dir);
BLI_join_dirfile(fname, FILE_MAXFILE + FILE_MAXDIR,
- index_dir, index_name);
+ index_dir, index_name);
}
/* ----------------------------------------------------------------------
@@ -533,15 +533,16 @@ static struct proxy_output_ctx * alloc_proxy_output_ffmpeg(
rv->orig_height = st->codec->height;
- if (st->codec->width != width || st->codec->height != height
- || st->codec->pix_fmt != rv->c->pix_fmt) {
+ if (st->codec->width != width || st->codec->height != height ||
+ st->codec->pix_fmt != rv->c->pix_fmt)
+ {
rv->frame = avcodec_alloc_frame();
- avpicture_fill((AVPicture*) rv->frame,
- MEM_mallocN(avpicture_get_size(
- rv->c->pix_fmt,
- round_up(width, 16), height),
- "alloc proxy output frame"),
- rv->c->pix_fmt, round_up(width, 16), height);
+ avpicture_fill((AVPicture*) rv->frame,
+ MEM_mallocN(avpicture_get_size(
+ rv->c->pix_fmt,
+ round_up(width, 16), height),
+ "alloc proxy output frame"),
+ rv->c->pix_fmt, round_up(width, 16), height);
rv->sws_ctx = sws_getContext(
st->codec->width,
@@ -567,12 +568,13 @@ static int add_to_proxy_output_ffmpeg(
return 0;
}
- if (ctx->sws_ctx && frame &&
- (frame->data[0] || frame->data[1] ||
- frame->data[2] || frame->data[3])) {
+ if ( ctx->sws_ctx && frame &&
+ (frame->data[0] || frame->data[1] ||
+ frame->data[2] || frame->data[3]))
+ {
sws_scale(ctx->sws_ctx, (const uint8_t * const*) frame->data,
- frame->linesize, 0, ctx->orig_height,
- ctx->frame->data, ctx->frame->linesize);
+ frame->linesize, 0, ctx->orig_height,
+ ctx->frame->data, ctx->frame->linesize);
}
frame = ctx->sws_ctx ? (frame ? ctx->frame : 0) : frame;
@@ -664,13 +666,13 @@ static void free_proxy_output_ffmpeg(struct proxy_output_ctx * ctx,
}
get_proxy_filename(ctx->anim, ctx->proxy_size,
- fname_tmp, TRUE);
+ fname_tmp, TRUE);
if (rollback) {
unlink(fname_tmp);
} else {
get_proxy_filename(ctx->anim, ctx->proxy_size,
- fname, FALSE);
+ fname, FALSE);
rename(fname_tmp, fname);
}
diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index d9bd0b9cda4..89038d7d1d2 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -219,14 +219,13 @@ static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, size_t
* Note we do *not* do INPUT_SYNC before calling fill_input_buffer,
* but we must reload the local copies after a successful fill.
*/
-#define MAKE_BYTE_AVAIL(cinfo,action) \
- if (bytes_in_buffer == 0) { \
- if (! (*datasrc->fill_input_buffer) (cinfo)) \
- { action; } \
- INPUT_RELOAD(cinfo); \
+#define MAKE_BYTE_AVAIL(cinfo, action) \
+ if (bytes_in_buffer == 0) { \
+ if (! (*datasrc->fill_input_buffer) (cinfo)) \
+ { action; } \
+ INPUT_RELOAD(cinfo); \
}
-
/* Read a byte into variable V.
* If must suspend, take the specified action (typically "return FALSE").
diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c
index 13c381ae9c4..be245baef21 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -190,10 +190,11 @@ int imb_savepng(struct ImBuf *ibuf, const char *name, int flags)
ibuf->encodedsize = 0;
png_set_write_fn(png_ptr,
- (png_voidp) ibuf,
- WriteData,
- Flush);
- } else {
+ (png_voidp) ibuf,
+ WriteData,
+ Flush);
+ }
+ else {
fp = fopen(name, "wb");
if (!fp) {
png_destroy_write_struct(&png_ptr, &info_ptr);
@@ -218,14 +219,14 @@ int imb_savepng(struct ImBuf *ibuf, const char *name, int flags)
// png image settings
png_set_IHDR(png_ptr,
- info_ptr,
- ibuf->x,
- ibuf->y,
- 8,
- color_type,
- PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
+ info_ptr,
+ ibuf->x,
+ ibuf->y,
+ 8,
+ color_type,
+ PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT,
+ PNG_FILTER_TYPE_DEFAULT);
/* image text info */
if (ibuf->metadata) {
diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c
index fe53a883f82..6519e389a21 100644
--- a/source/blender/imbuf/intern/scaling.c
+++ b/source/blender/imbuf/intern/scaling.c
@@ -539,7 +539,7 @@ static void shrink_picture_byte(
*dst++ = (val= (dst_line1[x].a * f) >> 15) > 255 ? 255: val;
}
memset(dst_line1, 0, dst_width *
- sizeof(struct scale_outpix_byte));
+ sizeof(struct scale_outpix_byte));
temp = dst_line1;
dst_line1 = dst_line2;
dst_line2 = temp;
@@ -740,7 +740,7 @@ static void shrink_picture_float(
*dst++ = dst_line1[x].a * f;
}
memset(dst_line1, 0, dst_width *
- sizeof(struct scale_outpix_float));
+ sizeof(struct scale_outpix_float));
temp = dst_line1;
dst_line1 = dst_line2;
dst_line2 = temp;
@@ -803,21 +803,21 @@ static int q_scale_linear_interpolation(
}
if (ibuf->rect) {
- unsigned char * newrect =
- MEM_mallocN(newx * newy * sizeof(int), "q_scale rect");
+ unsigned char * newrect =
+ MEM_mallocN(newx * newy * sizeof(int), "q_scale rect");
q_scale_byte((unsigned char *)ibuf->rect, newrect, ibuf->x, ibuf->y,
- newx, newy);
+ newx, newy);
imb_freerectImBuf(ibuf);
ibuf->mall |= IB_rect;
ibuf->rect = (unsigned int *) newrect;
}
if (ibuf->rect_float) {
- float * newrect =
- MEM_mallocN(newx * newy * 4 *sizeof(float),
- "q_scale rectfloat");
+ float * newrect =
+ MEM_mallocN(newx * newy * 4 *sizeof(float),
+ "q_scale rectfloat");
q_scale_float(ibuf->rect_float, newrect, ibuf->x, ibuf->y,
- newx, newy);
+ newx, newy);
imb_freerectfloatImBuf(ibuf);
ibuf->mall |= IB_rectfloat;
ibuf->rect_float = newrect;
diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c
index 0eaa87542d5..149b5fb9096 100644
--- a/source/blender/imbuf/intern/thumbs_blend.c
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -64,7 +64,7 @@ static ImBuf *loadblend_thumb(gzFile gzfile)
else
return NULL;
- sizeof_bhead = 16 + pointer_size;
+ sizeof_bhead = 16 + pointer_size;
if(buf[8]=='V')
endian= B_ENDIAN; /* big: PPC */
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index b4aa2f6da25..67171c35ca3 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -58,8 +58,8 @@ typedef struct IDProperty {
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.*/
- /*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.*/
+ /* 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
saved.*/
} IDProperty;
diff --git a/source/blender/makesdna/DNA_dynamicpaint_types.h b/source/blender/makesdna/DNA_dynamicpaint_types.h
new file mode 100644
index 00000000000..22a0462985c
--- /dev/null
+++ b/source/blender/makesdna/DNA_dynamicpaint_types.h
@@ -0,0 +1,208 @@
+/**
+* ***** 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 *****
+*/
+#ifndef DNA_DYNAMICPAINT_TYPES_H
+#define DNA_DYNAMICPAINT_TYPES_H
+
+#include "DNA_listBase.h"
+struct CurveMapping;
+struct PaintSurfaceData;
+
+/* surface format */
+#define MOD_DPAINT_SURFACE_F_PTEX 0
+#define MOD_DPAINT_SURFACE_F_VERTEX 1
+#define MOD_DPAINT_SURFACE_F_IMAGESEQ 2
+
+/* surface type */
+#define MOD_DPAINT_SURFACE_T_PAINT 0
+#define MOD_DPAINT_SURFACE_T_DISPLACE 1
+#define MOD_DPAINT_SURFACE_T_WEIGHT 2
+#define MOD_DPAINT_SURFACE_T_WAVE 3
+
+/* surface flags */
+#define MOD_DPAINT_ACTIVE (1<<0) /* Is surface enabled */
+
+#define MOD_DPAINT_ANTIALIAS (1<<1) /* do antialiasing */
+#define MOD_DPAINT_DISSOLVE (1<<2) /* do dissolve */
+#define MOD_DPAINT_MULALPHA (1<<3) /* Multiply color by alpha when saving image */
+#define MOD_DPAINT_DISSOLVE_LOG (1<<4) /* Use 1/x for surface dissolve */
+#define MOD_DPAINT_DRY_LOG (1<<5) /* Use 1/x for drying paint */
+#define MOD_DPAINT_PREVIEW (1<<6) /* preview this surface on viewport*/
+
+#define MOD_DPAINT_WAVE_OPEN_BORDERS (1<<7) /* passes waves through mesh edges */
+#define MOD_DPAINT_DISP_INCREMENTAL (1<<8) /* builds displace on top of earlier values */
+
+#define MOD_DPAINT_OUT1 (1<<10) /* output primary surface */
+#define MOD_DPAINT_OUT2 (1<<11) /* output secondary surface */
+
+/* image_fileformat */
+#define MOD_DPAINT_IMGFORMAT_PNG 0
+#define MOD_DPAINT_IMGFORMAT_OPENEXR 1
+
+/* disp_format */
+#define MOD_DPAINT_DISP_DISPLACE 0 /* displacement output displace map */
+#define MOD_DPAINT_DISP_DEPTH 1 /* displacement output depth data */
+
+/* effect */
+#define MOD_DPAINT_EFFECT_DO_SPREAD (1<<0) /* do spread effect */
+#define MOD_DPAINT_EFFECT_DO_DRIP (1<<1) /* do spread effect */
+#define MOD_DPAINT_EFFECT_DO_SHRINK (1<<2) /* do spread effect */
+
+/* preview_id */
+#define MOD_DPAINT_SURFACE_PREV_PAINT 0
+#define MOD_DPAINT_SURFACE_PREV_WETMAP 1
+
+/* init_color_type */
+#define MOD_DPAINT_INITIAL_NONE 0
+#define MOD_DPAINT_INITIAL_COLOR 1
+#define MOD_DPAINT_INITIAL_TEXTURE 2
+#define MOD_DPAINT_INITIAL_VERTEXCOLOR 3
+
+typedef struct DynamicPaintSurface {
+
+ struct DynamicPaintSurface *next, *prev;
+ struct DynamicPaintCanvasSettings *canvas; /* for fast RNA access */
+ struct PaintSurfaceData *data;
+
+ struct Group *brush_group;
+ struct EffectorWeights *effector_weights;
+
+ /* cache */
+ struct PointCache *pointcache;
+ struct ListBase ptcaches;
+ int current_frame;
+
+ /* surface */
+ char name[64];
+ short format, type;
+ short disp_type, image_fileformat;
+ short effect_ui; /* ui selection box */
+ short preview_id; /* surface output id to preview */
+ short init_color_type, pad_s;
+ int flags, effect;
+
+ int image_resolution, substeps;
+ int start_frame, end_frame, pad;
+
+ /* initial color */
+ float init_color[4];
+ struct Tex *init_texture;
+ char init_layername[40];
+
+ int dry_speed, diss_speed;
+ float depth_clamp, disp_factor;
+
+ float spread_speed, color_spread_speed, shrink_speed;
+ float drip_vel, drip_acc;
+
+ /* wave settings */
+ float wave_damping, wave_speed, wave_timescale, wave_spring;
+
+ int pad_;
+
+ char uvlayer_name[32];
+ char image_output_path[240];
+ char output_name[40];
+ char output_name2[40]; /* some surfaces have 2 outputs */
+
+} DynamicPaintSurface;
+
+/* canvas flags */
+#define MOD_DPAINT_PREVIEW_READY (1<<0) /* if viewport preview is ready */
+#define MOD_DPAINT_BAKING (1<<1) /* surface is already baking, so it wont get updated (loop) */
+
+/* Canvas settings */
+typedef struct DynamicPaintCanvasSettings {
+ struct DynamicPaintModifierData *pmd; /* for fast RNA access */
+ struct DerivedMesh *dm;
+
+ struct ListBase surfaces;
+ short active_sur, flags;
+ int pad;
+
+ char error[64]; /* Bake error description */
+
+} DynamicPaintCanvasSettings;
+
+
+/* flags */
+#define MOD_DPAINT_PART_RAD (1<<0) /* use particle radius */
+#define MOD_DPAINT_USE_MATERIAL (1<<1) /* use object material */
+#define MOD_DPAINT_ABS_ALPHA (1<<2) /* don't increase alpha unless
+ paint alpha is higher than existing */
+#define MOD_DPAINT_ERASE (1<<3) /* removes paint */
+
+#define MOD_DPAINT_RAMP_ALPHA (1<<4) /* only read falloff ramp alpha */
+#define MOD_DPAINT_PROX_PROJECT (1<<5) /* do proximity check only in defined dir */
+#define MOD_DPAINT_INVERSE_PROX (1<<6) /* inverse proximity painting */
+#define MOD_DPAINT_NEGATE_VOLUME (1<<7) /* negates volume influence on "volume + prox" mode */
+
+#define MOD_DPAINT_DO_SMUDGE (1<<8) /* brush smudges existing paint */
+#define MOD_DPAINT_VELOCITY_ALPHA (1<<9) /* multiply brush influence by velocity */
+#define MOD_DPAINT_VELOCITY_COLOR (1<<10) /* replace brush color by velocity color ramp */
+#define MOD_DPAINT_VELOCITY_DEPTH (1<<11) /* multiply brush intersection depth by velocity */
+
+#define MOD_DPAINT_USES_VELOCITY ((1<<8)|(1<<9)|(1<<10)|(1<<11))
+
+/* collision type */
+#define MOD_DPAINT_COL_VOLUME 0 /* paint with mesh volume */
+#define MOD_DPAINT_COL_DIST 1 /* paint using distance to mesh surface */
+#define MOD_DPAINT_COL_VOLDIST 2 /* use both volume and distance */
+#define MOD_DPAINT_COL_PSYS 3 /* use particle system */
+#define MOD_DPAINT_COL_POINT 4 /* use distance to object center point */
+
+/* proximity_falloff */
+#define MOD_DPAINT_PRFALL_CONSTANT 0 /* no-falloff */
+#define MOD_DPAINT_PRFALL_SMOOTH 1 /* smooth, linear falloff */
+#define MOD_DPAINT_PRFALL_RAMP 2 /* use color ramp */
+
+/* wave_brush_type */
+#define MOD_DPAINT_WAVEB_DEPTH 0 /* use intersection depth */
+#define MOD_DPAINT_WAVEB_FORCE 1 /* act as a force on intersection area */
+#define MOD_DPAINT_WAVEB_REFLECT 2 /* obstacle that reflects waves */
+
+/* brush ray_dir */
+#define MOD_DPAINT_RAY_CANVAS 0
+#define MOD_DPAINT_RAY_BRUSH_AVG 1
+#define MOD_DPAINT_RAY_ZPLUS 2
+
+
+/* Brush settings */
+typedef struct DynamicPaintBrushSettings {
+ struct DynamicPaintModifierData *pmd; /* for fast RNA access */
+ struct DerivedMesh *dm;
+ struct ParticleSystem *psys;
+ struct Material *mat;
+
+ int flags;
+ int collision;
+
+ float r, g, b, alpha;
+ float wetness;
+
+ float particle_radius, particle_smooth;
+ float paint_distance;
+
+ /* color ramps */
+ struct ColorBand *paint_ramp; /* Proximity paint falloff */
+ struct ColorBand *vel_ramp; /* Velocity paint ramp */
+
+ short proximity_falloff;
+ short wave_type;
+ short ray_dir;
+ short pad;
+
+ float wave_factor, wave_clamp;
+ float max_velocity, smudge_strength;
+} DynamicPaintBrushSettings;
+
+#endif
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 8e60fe984e6..20001ea6cb6 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -957,4 +957,17 @@ typedef struct WeightVGProximityModifierData {
#define MOD_WVG_MASK_TEX_USE_VAL 7
#define MOD_WVG_MASK_TEX_USE_ALPHA 8
+/* Dynamic paint modifier flags */
+#define MOD_DYNAMICPAINT_TYPE_CANVAS (1 << 0)
+#define MOD_DYNAMICPAINT_TYPE_BRUSH (1 << 1)
+
+typedef struct DynamicPaintModifierData {
+ ModifierData modifier;
+
+ struct DynamicPaintCanvasSettings *canvas;
+ struct DynamicPaintBrushSettings *brush;
+ int type; /* ui display: canvas / brush */
+ int pad;
+} DynamicPaintModifierData;
+
#endif
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 02e57aa0840..07c2885eff7 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -35,6 +35,7 @@
#include "DNA_ID.h"
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
+#include "DNA_texture_types.h"
struct ID;
struct ListBase;
@@ -45,6 +46,7 @@ struct bNodeTreeExec;
struct AnimData;
struct bGPdata;
struct uiBlock;
+struct Image;
#define NODE_MAXSTR 32
@@ -191,6 +193,8 @@ typedef struct bNode {
#define NODE_BACKGROUND (1<<12)
/* automatic flag for nodes included in transforms */
#define NODE_TRANSFORM (1<<13)
+ /* node is active texture */
+#define NODE_ACTIVE_TEXTURE (1<<14)
/* node->update */
/* XXX NODE_UPDATE is a generic update flag. More fine-grained updates
@@ -423,6 +427,65 @@ typedef struct NodeColorspill {
float uspillr, uspillg, uspillb;
}NodeColorspill;
+typedef struct NodeTexBase {
+ TexMapping tex_mapping;
+ ColorMapping color_mapping;
+} NodeTexBase;
+
+typedef struct NodeTexSky {
+ NodeTexBase base;
+ float sun_direction[3];
+ float turbidity;
+} NodeTexSky;
+
+typedef struct NodeTexImage {
+ NodeTexBase base;
+ int color_space, pad;
+} NodeTexImage;
+
+typedef struct NodeTexEnvironment {
+ NodeTexBase base;
+ int color_space, pad;
+} NodeTexEnvironment;
+
+typedef struct NodeTexGradient {
+ NodeTexBase base;
+ int gradient_type;
+ int pad;
+} NodeTexGradient;
+
+typedef struct NodeTexNoise {
+ NodeTexBase base;
+} NodeTexNoise;
+
+typedef struct NodeTexVoronoi {
+ NodeTexBase base;
+ int coloring;
+ int pad;
+} NodeTexVoronoi;
+
+typedef struct NodeTexMusgrave {
+ NodeTexBase base;
+ int musgrave_type;
+ int pad;
+} NodeTexMusgrave;
+
+typedef struct NodeTexWave {
+ NodeTexBase base;
+ int wave_type;
+ int pad;
+} NodeTexWave;
+
+typedef struct NodeTexMagic {
+ NodeTexBase base;
+ int depth;
+ int pad;
+} NodeTexMagic;
+
+typedef struct NodeShaderAttribute {
+ char name[64];
+} NodeShaderAttribute;
+
/* TEX_output */
typedef struct TexNodeOutput {
char name[32];
@@ -434,6 +497,65 @@ typedef struct TexNodeOutput {
#define CMP_NODE_CHANNEL_MATTE_CS_YUV 3
#define CMP_NODE_CHANNEL_MATTE_CS_YCC 4
+/* glossy distributions */
+#define SHD_GLOSSY_BECKMANN 0
+#define SHD_GLOSSY_SHARP 1
+#define SHD_GLOSSY_GGX 2
+
+/* blend texture */
+#define SHD_BLEND_LINEAR 0
+#define SHD_BLEND_QUADRATIC 1
+#define SHD_BLEND_EASING 2
+#define SHD_BLEND_DIAGONAL 3
+#define SHD_BLEND_RADIAL 4
+#define SHD_BLEND_QUADRATIC_SPHERE 5
+#define SHD_BLEND_SPHERICAL 6
+
+/* noise basis for textures */
+#define SHD_NOISE_PERLIN 0
+#define SHD_NOISE_VORONOI_F1 1
+#define SHD_NOISE_VORONOI_F2 2
+#define SHD_NOISE_VORONOI_F3 3
+#define SHD_NOISE_VORONOI_F4 4
+#define SHD_NOISE_VORONOI_F2_F1 5
+#define SHD_NOISE_VORONOI_CRACKLE 6
+#define SHD_NOISE_CELL_NOISE 7
+
+#define SHD_NOISE_SOFT 0
+#define SHD_NOISE_HARD 1
+
+/* voronoi texture */
+#define SHD_VORONOI_DISTANCE_SQUARED 0
+#define SHD_VORONOI_ACTUAL_DISTANCE 1
+#define SHD_VORONOI_MANHATTAN 2
+#define SHD_VORONOI_CHEBYCHEV 3
+#define SHD_VORONOI_MINKOVSKY_H 4
+#define SHD_VORONOI_MINKOVSKY_4 5
+#define SHD_VORONOI_MINKOVSKY 6
+
+#define SHD_VORONOI_INTENSITY 0
+#define SHD_VORONOI_CELLS 1
+
+/* musgrave texture */
+#define SHD_MUSGRAVE_MULTIFRACTAL 0
+#define SHD_MUSGRAVE_FBM 1
+#define SHD_MUSGRAVE_HYBRID_MULTIFRACTAL 2
+#define SHD_MUSGRAVE_RIDGED_MULTIFRACTAL 3
+#define SHD_MUSGRAVE_HETERO_TERRAIN 4
+
+/* wave texture */
+#define SHD_WAVE_BANDS 0
+#define SHD_WAVE_RINGS 1
+
+#define SHD_WAVE_SINE 0
+#define SHD_WAVE_SAW 1
+#define SHD_WAVE_TRI 2
+
+/* image/environment texture */
+#define SHD_COLORSPACE_LINEAR 0
+#define SHD_COLORSPACE_SRGB 1
+
+/* blur node */
#define CMP_NODE_BLUR_ASPECT_NONE 0
#define CMP_NODE_BLUR_ASPECT_Y 1
#define CMP_NODE_BLUR_ASPECT_X 2
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index 2183cdb4406..d45a8f83f76 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -136,6 +136,7 @@ typedef struct EffectorWeights {
#define BPHYS_DATA_VELOCITY 2
#define BPHYS_DATA_SMOKE_HIGH 2
#define BPHYS_DATA_ROTATION 3
+#define BPHYS_DATA_DYNAMICPAINT 3
#define BPHYS_DATA_AVELOCITY 4 /* used for particles */
#define BPHYS_DATA_XCONST 4 /* used for cloth */
#define BPHYS_DATA_SIZE 5
@@ -295,9 +296,9 @@ typedef struct SoftBody {
/* springs */
float inspring; /* softbody inner springs */
float infrict; /* softbody inner springs friction */
- char namedVG_Spring_K[32]; /* along with it introduce Spring_K painting
- starting to fix old bug .. nastyness that VG are indexes
- rather find them by name tag to find it -> jow20090613 */
+ char namedVG_Spring_K[32]; /* along with it introduce Spring_K painting
+ starting to fix old bug .. nastyness that VG are indexes
+ rather find them by name tag to find it -> jow20090613 */
/* baking */
int sfra, efra;
@@ -398,6 +399,7 @@ typedef struct SoftBody {
#define PTCACHE_IGNORE_LIBPATH 2048
/* high resolution cache is saved for smoke for backwards compatibility, so set this flag to know it's a "fake" cache */
#define PTCACHE_FAKE_SMOKE (1<<12)
+#define PTCACHE_IGNORE_CLEAR (1<<13)
/* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */
#define PTCACHE_REDO_NEEDED 258
diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h
index b3593c5e08c..451774b1abb 100644
--- a/source/blender/makesdna/DNA_sensor_types.h
+++ b/source/blender/makesdna/DNA_sensor_types.h
@@ -103,7 +103,7 @@ typedef struct bCollisionSensor {
// struct Material *ma; // XXX remove materialName
short damptimer, damp;
short mode; /* flag to choose material or property */
- short pad2;
+ short pad2;
} bCollisionSensor;
typedef struct bRadarSensor {
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 289c7ac2fc3..01bb6a5235e 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -145,6 +145,8 @@ typedef struct SpaceButs {
void *path; /* runtime */
int pathflag, dataicon; /* runtime */
ID *pinid;
+
+ void *texuser;
} SpaceButs;
typedef struct SpaceSeq {
@@ -861,6 +863,7 @@ enum {
#define TIME_CACHE_PARTICLES 4
#define TIME_CACHE_CLOTH 8
#define TIME_CACHE_SMOKE 16
+#define TIME_CACHE_DYNAMICPAINT 32
/* sseq->mainb */
#define SEQ_DRAW_SEQUENCE 0
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 0cfe9763267..781fe805812 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -133,6 +133,7 @@ const char *includefiles[] = {
"DNA_speaker_types.h",
"DNA_movieclip_types.h",
"DNA_tracking_types.h",
+ "DNA_dynamicpaint_types.h",
"DNA_freestyle_types.h",
"DNA_linestyle_types.h",
@@ -1202,6 +1203,7 @@ int main(int argc, char ** argv)
#include "DNA_speaker_types.h"
#include "DNA_movieclip_types.h"
#include "DNA_tracking_types.h"
+#include "DNA_dynamicpaint_types.h"
#include "DNA_freestyle_types.h"
#include "DNA_linestyle_types.h"
/* end of list */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 1e0231fd4a6..c34f319b0a1 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -197,6 +197,10 @@ extern StructRNA RNA_Driver;
extern StructRNA RNA_DriverTarget;
extern StructRNA RNA_DriverVariable;
extern StructRNA RNA_DupliObject;
+extern StructRNA RNA_DynamicPaintBrushSettings;
+extern StructRNA RNA_DynamicPaintCanvasSettings;
+extern StructRNA RNA_DynamicPaintModifier;
+extern StructRNA RNA_DynamicPaintSurface;
extern StructRNA RNA_EdgeSplitModifier;
extern StructRNA RNA_EditBone;
extern StructRNA RNA_EffectSequence;
@@ -656,6 +660,8 @@ StructRNA *RNA_struct_base(StructRNA *type);
int RNA_struct_is_ID(StructRNA *type);
int RNA_struct_is_a(StructRNA *type, StructRNA *srna);
+int RNA_struct_undo_check(StructRNA *type);
+
StructRegisterFunc RNA_struct_register(StructRNA *type);
StructUnregisterFunc RNA_struct_unregister(StructRNA *type);
void **RNA_struct_instance(PointerRNA *ptr);
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 41483213bd4..509db622b70 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -114,6 +114,8 @@ extern EnumPropertyItem node_filter_items[];
extern EnumPropertyItem ramp_blend_items[];
+extern EnumPropertyItem prop_dynamicpaint_type_items[];
+
extern EnumPropertyItem linestyle_color_modifier_type_items[];
extern EnumPropertyItem linestyle_alpha_modifier_type_items[];
extern EnumPropertyItem linestyle_thickness_modifier_type_items[];
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index 418a41c72ba..1655665efe3 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -326,12 +326,13 @@ typedef enum StructFlag {
/* indicates that this struct is an ID struct, and to use refcounting */
STRUCT_ID = 1,
STRUCT_ID_REFCOUNT = 2,
+ STRUCT_UNDO = 4, /* defaults on, clear for user preferences and similar */
/* internal flags */
- STRUCT_RUNTIME = 4,
- STRUCT_GENERATED = 8,
- STRUCT_FREE_POINTERS = 16,
- STRUCT_NO_IDPROPERTIES = 32 /* Menu's and Panels don't need properties */
+ STRUCT_RUNTIME = 8,
+ STRUCT_GENERATED = 16,
+ STRUCT_FREE_POINTERS = 32,
+ STRUCT_NO_IDPROPERTIES = 64 /* Menu's and Panels don't need properties */
} StructFlag;
typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index 9f248f973a1..c4b3f204b23 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -66,4 +66,6 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
if env['WITH_BF_INTERNATIONAL']:
defs.append('WITH_INTERNATIONAL')
-env.BlenderLib ( 'bf_rna', objs, Split(incs), defines=defs, libtype=['core','player'], priority = [165,20] )
+rnalib = env.BlenderLib ( 'bf_rna', objs, Split(incs), defines=defs, libtype=['core','player'], priority = [165,20] )
+
+Return ('rnalib')
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 8038dc2b04a..f61db894263 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -46,6 +46,7 @@ set(DEFSRC
rna_context.c
rna_controller.c
rna_curve.c
+ rna_dynamicpaint.c
rna_fcurve.c
rna_fluidsim.c
rna_gpencil.c
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 9cb2706886a..b6ddfe39e9d 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -2440,6 +2440,7 @@ static RNAProcessItem PROCESS_ITEMS[]= {
{"rna_context.c", NULL, RNA_def_context},
{"rna_controller.c", "rna_controller_api.c", RNA_def_controller},
{"rna_curve.c", NULL, RNA_def_curve},
+ {"rna_dynamicpaint.c", NULL, RNA_def_dynamic_paint},
{"rna_fcurve.c", "rna_fcurve_api.c", RNA_def_fcurve},
{"rna_fluidsim.c", NULL, RNA_def_fluidsim},
{"rna_gpencil.c", NULL, RNA_def_gpencil},
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 793d0112af7..6f9c7a8f19b 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -549,6 +549,11 @@ int RNA_struct_is_ID(StructRNA *type)
return (type->flag & STRUCT_ID) != 0;
}
+int RNA_struct_undo_check(StructRNA *type)
+{
+ return (type->flag & STRUCT_UNDO) != 0;
+}
+
int RNA_struct_idprops_register_check(StructRNA *type)
{
return (type->flag & STRUCT_NO_IDPROPERTIES) == 0;
diff --git a/source/blender/makesrna/intern/rna_animviz.c b/source/blender/makesrna/intern/rna_animviz.c
index e65b137e846..29133db8101 100644
--- a/source/blender/makesrna/intern/rna_animviz.c
+++ b/source/blender/makesrna/intern/rna_animviz.c
@@ -71,7 +71,7 @@ static void rna_AnimViz_path_start_frame_set(PointerRNA *ptr, int value)
{
bAnimVizSettings *data= (bAnimVizSettings*)ptr->data;
- CLAMP(value, 1, data->path_ef);
+ CLAMP(value, 1, data->path_ef-1);
data->path_sf= value;
}
@@ -79,7 +79,8 @@ static void rna_AnimViz_path_end_frame_set(PointerRNA *ptr, int value)
{
bAnimVizSettings *data= (bAnimVizSettings*)ptr->data;
- CLAMP(value, data->path_sf, (int)(MAXFRAMEF/2));
+ // XXX: watchit! Path Start > MAXFRAME/2 could be a problem...
+ CLAMP(value, data->path_sf+1, (int)(MAXFRAMEF/2));
data->path_ef= value;
}
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index 93fdc2b2136..95f44d86058 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -1394,11 +1394,12 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* not supported yet
- prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
- RNA_def_property_float(prop, NULL, "rot");
- RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
- RNA_def_property_editable_func(prop, texspace_editable);
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");*/
+ prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
+ RNA_def_property_float(prop, NULL, "rot");
+ RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
+ RNA_def_property_editable_func(prop, texspace_editable);
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ */
prop= RNA_def_property(srna, "use_uv_as_generated", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index ff1bfce2d2f..d4756ecfefa 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -654,6 +654,7 @@ StructRNA *RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *
srna->identifier= identifier;
srna->name= identifier; /* may be overwritten later RNA_def_struct_ui_text */
srna->description= "";
+ srna->flag |= STRUCT_UNDO;
if(!srnafrom)
srna->icon= ICON_DOT;
diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c
new file mode 100644
index 00000000000..00a73afb789
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_dynamicpaint.c
@@ -0,0 +1,911 @@
+/**
+ * ***** 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 *****
+ */
+
+#include <stdlib.h>
+#include <limits.h>
+
+#include "RNA_define.h"
+
+#include "rna_internal.h"
+
+#include "BKE_modifier.h"
+#include "BKE_dynamicpaint.h"
+
+#include "DNA_dynamicpaint_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_force.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "WM_types.h"
+
+EnumPropertyItem prop_dynamicpaint_type_items[] = {
+ {MOD_DYNAMICPAINT_TYPE_CANVAS, "CANVAS", 0, "Canvas", ""},
+ {MOD_DYNAMICPAINT_TYPE_BRUSH, "BRUSH", 0, "Brush", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+
+#ifdef RNA_RUNTIME
+
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_particle.h"
+
+
+static char *rna_DynamicPaintCanvasSettings_path(PointerRNA *ptr)
+{
+ DynamicPaintCanvasSettings *settings = (DynamicPaintCanvasSettings*)ptr->data;
+ ModifierData *md= (ModifierData *)settings->pmd;
+
+ return BLI_sprintfN("modifiers[\"%s\"].canvas_settings", md->name);
+}
+
+static char *rna_DynamicPaintBrushSettings_path(PointerRNA *ptr)
+{
+ DynamicPaintBrushSettings *settings = (DynamicPaintBrushSettings*)ptr->data;
+ ModifierData *md= (ModifierData *)settings->pmd;
+
+ return BLI_sprintfN("modifiers[\"%s\"].brush_settings", md->name);
+}
+
+static char *rna_DynamicPaintSurface_path(PointerRNA *ptr)
+{
+ DynamicPaintSurface *surface = (DynamicPaintSurface*)ptr->data;
+ ModifierData *md= (ModifierData *)surface->canvas->pmd;
+
+ return BLI_sprintfN("modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"]", md->name, surface->name);
+}
+
+
+/*
+* Surfaces
+*/
+
+static void rna_DynamicPaint_redoModifier(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
+}
+
+static void rna_DynamicPaintSurfaces_updateFrames(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ dynamicPaint_cacheUpdateFrames((DynamicPaintSurface*)ptr->data);
+}
+
+static void rna_DynamicPaintSurface_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ dynamicPaint_resetSurface((DynamicPaintSurface*)ptr->data);
+ rna_DynamicPaint_redoModifier(bmain, scene, ptr);
+}
+
+static void rna_DynamicPaintSurface_initialcolortype(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ DynamicPaintSurface *surface = (DynamicPaintSurface*)ptr->data;
+
+ surface->init_layername[0] = '\0';
+ dynamicPaint_clearSurface(surface);
+ rna_DynamicPaint_redoModifier(bmain, scene, ptr);
+}
+
+static void rna_DynamicPaintSurface_changePreview(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ DynamicPaintSurface *act_surface = (DynamicPaintSurface*)ptr->data;
+ DynamicPaintSurface *surface = act_surface->canvas->surfaces.first;
+
+ /* since only one color surface can show preview at time
+ * disable preview on other surfaces*/
+ for(; surface; surface=surface->next) {
+ if(surface != act_surface)
+ surface->flags &= ~MOD_DPAINT_PREVIEW;
+ }
+ rna_DynamicPaint_redoModifier(bmain, scene, ptr);
+}
+
+static void rna_DynamicPaintSurface_uniqueName(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ dynamicPaintSurface_setUniqueName((DynamicPaintSurface*)ptr->data, ((DynamicPaintSurface*)ptr->data)->name);
+}
+
+
+static void rna_DynamicPaintSurface_changeType(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ dynamicPaintSurface_updateType((DynamicPaintSurface*)ptr->data);
+ dynamicPaint_resetSurface((DynamicPaintSurface*)ptr->data);
+ rna_DynamicPaintSurface_reset(bmain, scene, ptr);
+}
+
+static void rna_DynamicPaintSurfaces_changeFormat(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ DynamicPaintSurface *surface = (DynamicPaintSurface*)ptr->data;
+
+ surface->type = MOD_DPAINT_SURFACE_T_PAINT;
+ dynamicPaintSurface_updateType((DynamicPaintSurface*)ptr->data);
+ rna_DynamicPaintSurface_reset(bmain, scene, ptr);
+}
+
+static void rna_DynamicPaint_resetDependancy(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ rna_DynamicPaintSurface_reset(bmain, scene, ptr);
+ DAG_scene_sort(bmain, scene);
+}
+
+static PointerRNA rna_PaintSurface_active_get(PointerRNA *ptr)
+{
+ DynamicPaintCanvasSettings *canvas= (DynamicPaintCanvasSettings*)ptr->data;
+ DynamicPaintSurface *surface = canvas->surfaces.first;
+ int id=0;
+
+ for(; surface; surface=surface->next) {
+ if(id == canvas->active_sur)
+ return rna_pointer_inherit_refine(ptr, &RNA_DynamicPaintSurface, surface);
+ id++;
+ }
+ return rna_pointer_inherit_refine(ptr, &RNA_DynamicPaintSurface, NULL);
+}
+
+static void rna_DynamicPaint_surfaces_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ DynamicPaintCanvasSettings *canvas= (DynamicPaintCanvasSettings*)ptr->data;
+ //rna_iterator_array_begin(iter, (void*)canvas->surfaces, sizeof(PaintSurface), canvas->totsur, 0, 0);
+ rna_iterator_listbase_begin(iter, &canvas->surfaces, NULL);
+}
+
+static int rna_Surface_active_point_index_get(PointerRNA *ptr)
+{
+ DynamicPaintCanvasSettings *canvas= (DynamicPaintCanvasSettings*)ptr->data;
+ return canvas->active_sur;
+}
+
+static void rna_Surface_active_point_index_set(struct PointerRNA *ptr, int value)
+{
+ DynamicPaintCanvasSettings *canvas= (DynamicPaintCanvasSettings*)ptr->data;
+ canvas->active_sur = value;
+ return;
+}
+
+static void rna_Surface_active_point_range(PointerRNA *ptr, int *min, int *max)
+{
+ DynamicPaintCanvasSettings *canvas= (DynamicPaintCanvasSettings*)ptr->data;
+
+ *min= 0;
+ *max= BLI_countlist(&canvas->surfaces)-1;
+}
+
+/* uvlayer */
+static void rna_DynamicPaint_uvlayer_set(PointerRNA *ptr, const char *value)
+{
+ DynamicPaintCanvasSettings *canvas= ((DynamicPaintSurface*)ptr->data)->canvas;
+ DynamicPaintSurface *surface = canvas->surfaces.first;
+ int id=0;
+
+ for(; surface; surface=surface->next) {
+ if(id == canvas->active_sur) {
+ rna_object_uvlayer_name_set(ptr, value, surface->uvlayer_name, sizeof(surface->uvlayer_name));
+ return;
+ }
+ id++;
+ }
+}
+
+/* is point cache used */
+static int rna_DynamicPaint_uses_cache_get(PointerRNA *ptr)
+{
+ DynamicPaintSurface *surface= (DynamicPaintSurface*)ptr->data;
+
+ return (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) ? 1 : 0;
+}
+
+static void rna_DynamicPaint_uses_cache_set(PointerRNA *ptr, int value)
+{
+}
+
+/* does output layer exist*/
+static int rna_DynamicPaint_is_output_exists(DynamicPaintSurface *surface, Object *ob, int index)
+{
+ return dynamicPaint_outputLayerExists(surface, ob, index);
+}
+
+
+static EnumPropertyItem *rna_DynamicPaint_surface_type_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free)
+{
+ DynamicPaintSurface *surface= (DynamicPaintSurface*)ptr->data;
+
+ EnumPropertyItem *item= NULL;
+ EnumPropertyItem tmp= {0, "", 0, "", ""};
+ int totitem= 0;
+
+ /* Paint type - available for all formats */
+ tmp.value = MOD_DPAINT_SURFACE_T_PAINT;
+ tmp.identifier = "PAINT";
+ tmp.name = "Paint";
+ RNA_enum_item_add(&item, &totitem, &tmp);
+
+ /* Displace */
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX ||
+ surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
+ tmp.value = MOD_DPAINT_SURFACE_T_DISPLACE;
+ tmp.identifier = "DISPLACE";
+ tmp.name = "Displace";
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ /* Weight */
+ if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+ tmp.value = MOD_DPAINT_SURFACE_T_WEIGHT;
+ tmp.identifier = "WEIGHT";
+ tmp.name = "Weight";
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ /* Height waves */
+ {
+ tmp.value = MOD_DPAINT_SURFACE_T_WAVE;
+ tmp.identifier = "WAVE";
+ tmp.name = "Waves";
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free = 1;
+
+ return item;
+}
+
+#else
+
+/* canvas.canvas_surfaces */
+static void rna_def_canvas_surfaces(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ RNA_def_property_srna(cprop, "DynamicPaintSurfaces");
+ srna= RNA_def_struct(brna, "DynamicPaintSurfaces", NULL);
+ RNA_def_struct_sdna(srna, "DynamicPaintCanvasSettings");
+ RNA_def_struct_ui_text(srna, "Canvas Surfaces", "Collection of Dynamic Paint Canvas surfaces");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_int_funcs(prop, "rna_Surface_active_point_index_get", "rna_Surface_active_point_index_set", "rna_Surface_active_point_range");
+ RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "DynamicPaintSurface");
+ RNA_def_property_pointer_funcs(prop, "rna_PaintSurface_active_get", NULL, NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Surface", "Active Dynamic Paint surface being displayed");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+}
+
+
+static void rna_def_canvas_surface(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ /* Surface format */
+ static EnumPropertyItem prop_dynamicpaint_surface_format[] = {
+ //{MOD_DPAINT_SURFACE_F_PTEX, "PTEX", ICON_TEXTURE_SHADED, "Ptex", ""},
+ {MOD_DPAINT_SURFACE_F_VERTEX, "VERTEX", ICON_OUTLINER_DATA_MESH, "Vertex", ""},
+ {MOD_DPAINT_SURFACE_F_IMAGESEQ, "IMAGE", ICON_FILE_IMAGE, "Image Sequence", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* Surface type - generated dynamically based on surface format */
+ static EnumPropertyItem prop_dynamicpaint_surface_type[] = {
+ {MOD_DPAINT_SURFACE_T_PAINT, "PAINT", 0, "Paint", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* Surface output preview. currently only paint has multiple outputs */
+ static EnumPropertyItem prop_dynamicpaint_surface_preview[] = {
+ {MOD_DPAINT_SURFACE_PREV_PAINT, "PAINT", 0, "Paint", ""},
+ {MOD_DPAINT_SURFACE_PREV_WETMAP, "WETMAP", 0, "Wetmap", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* Initial color setting */
+ static EnumPropertyItem prop_dynamicpaint_init_color_type[] = {
+ {MOD_DPAINT_INITIAL_NONE, "NONE", 0, "None", ""},
+ {MOD_DPAINT_INITIAL_COLOR, "COLOR", ICON_COLOR, "Color", ""},
+ {MOD_DPAINT_INITIAL_TEXTURE, "TEXTURE", ICON_TEXTURE, "UV Texture", ""},
+ {MOD_DPAINT_INITIAL_VERTEXCOLOR, "VERTEX_COLOR", ICON_GROUP_VCOL, "Vertex Color", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* Effect type
+ * Only used by ui to view per effect settings */
+ static EnumPropertyItem prop_dynamicpaint_effecttype[] = {
+ {1, "SPREAD", 0, "Spread", ""},
+ {2, "DRIP", 0, "Drip", ""},
+ {3, "SHRINK", 0, "Shrink", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* Displacemap file format */
+ static EnumPropertyItem prop_dynamicpaint_image_fileformat[] = {
+ {MOD_DPAINT_IMGFORMAT_PNG, "PNG", 0, "PNG", ""},
+#ifdef WITH_OPENEXR
+ {MOD_DPAINT_IMGFORMAT_OPENEXR, "OPENEXR", 0, "OpenEXR", ""},
+#endif
+ {0, NULL, 0, NULL, NULL}};
+
+ /* Displacemap type */
+ static EnumPropertyItem prop_dynamicpaint_displace_type[] = {
+ {MOD_DPAINT_DISP_DISPLACE, "DISPLACE", 0, "Displacement", ""},
+ {MOD_DPAINT_DISP_DEPTH, "DEPTH", 0, "Depth", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+
+
+ /* Surface */
+ srna= RNA_def_struct(brna, "DynamicPaintSurface", NULL);
+ RNA_def_struct_sdna(srna, "DynamicPaintSurface");
+ RNA_def_struct_ui_text(srna, "Paint Surface", "A canvas surface layer");
+ RNA_def_struct_path_func(srna, "rna_DynamicPaintSurface_path");
+
+ prop= RNA_def_property(srna, "surface_format", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_sdna(prop, NULL, "format");
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_surface_format);
+ RNA_def_property_ui_text(prop, "Format", "Surface Format");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurfaces_changeFormat");
+
+ prop= RNA_def_property(srna, "surface_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_surface_type);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_DynamicPaint_surface_type_itemf");
+ RNA_def_property_ui_text(prop, "Surface Type", "Surface Type");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_changeType");
+
+ prop= RNA_def_property(srna, "is_active", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ACTIVE);
+ RNA_def_property_ui_text(prop, "Is Active", "Toggle whether surface is processed or ignored");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "show_preview", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PREVIEW);
+ RNA_def_property_ui_text(prop, "Show Preview", "Display surface preview in 3D-views");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_changePreview");
+
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Name", "Surface name");
+ RNA_def_property_update(prop, NC_OBJECT, "rna_DynamicPaintSurface_uniqueName");
+ RNA_def_struct_name_property(srna, prop);
+
+ prop= RNA_def_property(srna, "brush_group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Group");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Brush Group", "Only use brush objects from this group");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_resetDependancy");
+
+
+ /*
+ * Paint, wet and displace
+ */
+
+ prop= RNA_def_property(srna, "use_dissolve", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DISSOLVE);
+ RNA_def_property_ui_text(prop, "Dissolve", "Enable to make surface changes disappear over time");
+
+ prop= RNA_def_property(srna, "dissolve_speed", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "diss_speed");
+ RNA_def_property_range(prop, 1.0, 10000.0);
+ RNA_def_property_ui_range(prop, 1.0, 10000.0, 5, 0);
+ RNA_def_property_ui_text(prop, "Dissolve Speed", "Approximately in how many frames should dissolve happen");
+
+ prop= RNA_def_property(srna, "dry_speed", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 1.0, 10000.0);
+ RNA_def_property_ui_range(prop, 1.0, 10000.0, 5, 0);
+ RNA_def_property_ui_text(prop, "Dry Speed", "Approximately in how many frames should drying happen");
+
+ /*
+ * Simulation settings
+ */
+ prop= RNA_def_property(srna, "image_resolution", PROP_INT, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_range(prop, 16.0, 4096.0);
+ RNA_def_property_ui_range(prop, 16.0, 4096.0, 1, 0);
+ RNA_def_property_ui_text(prop, "Resolution", "Output image resolution");
+
+ prop= RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
+ RNA_def_property_ui_text(prop, "UV Layer", "UV layer name");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DynamicPaint_uvlayer_set");
+
+ prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "start_frame");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_range(prop, 1.0, 9999.0);
+ RNA_def_property_ui_range(prop, 1.0, 9999, 1, 0);
+ RNA_def_property_ui_text(prop, "Start Frame", "Simulation start frame");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurfaces_updateFrames");
+
+ prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "end_frame");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_range(prop, 1.0, 9999.0);
+ RNA_def_property_ui_range(prop, 1.0, 9999.0, 1, 0);
+ RNA_def_property_ui_text(prop, "End Frame", "Simulation end frame");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurfaces_updateFrames");
+
+ 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_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");
+
+ prop= RNA_def_property(srna, "use_antialiasing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ANTIALIAS);
+ RNA_def_property_ui_text(prop, "Anti-aliasing", "Use 5x multisampling to smoothen paint edges");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ /*
+ * Initial Color
+ */
+
+ prop= RNA_def_property(srna, "init_color_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_init_color_type);
+ RNA_def_property_ui_text(prop, "Initial Color", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW|ND_MODIFIER, "rna_DynamicPaintSurface_initialcolortype");
+
+ prop= RNA_def_property(srna, "init_color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Color", "Initial color of the surface");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ prop= RNA_def_property(srna, "init_texture", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Texture", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ prop= RNA_def_property(srna, "init_layername", PROP_STRING, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Data Layer", "");
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ /*
+ * Effect Settings
+ */
+ prop= RNA_def_property(srna, "effect_ui", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_effecttype);
+ RNA_def_property_ui_text(prop, "Effect Type", "");
+
+ prop= RNA_def_property(srna, "use_dry_log", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DRY_LOG);
+ RNA_def_property_ui_text(prop, "Slow", "Use logarithmic drying. Makes high values to fade faster than low values");
+
+ prop= RNA_def_property(srna, "use_dissolve_log", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DISSOLVE_LOG);
+ RNA_def_property_ui_text(prop, "Slow", "Use logarithmic dissolve. Makes high values to fade faster than low values");
+
+ prop= RNA_def_property(srna, "use_spread", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_boolean_sdna(prop, NULL, "effect", MOD_DPAINT_EFFECT_DO_SPREAD);
+ RNA_def_property_ui_text(prop, "Use Spread", "Processes spread effect. Spreads wet paint around surface");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ prop= RNA_def_property(srna, "spread_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "spread_speed");
+ RNA_def_property_range(prop, 0.001, 10.0);
+ RNA_def_property_ui_range(prop, 0.01, 5.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Spread Speed", "How fast spread effect moves on the canvas surface");
+
+ prop= RNA_def_property(srna, "color_spread_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "color_spread_speed");
+ RNA_def_property_range(prop, 0.0, 2.0);
+ RNA_def_property_ui_range(prop, 0.0, 2.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Color Spread", "How fast colors get mixed within wet paint");
+
+ prop= RNA_def_property(srna, "use_drip", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_boolean_sdna(prop, NULL, "effect", MOD_DPAINT_EFFECT_DO_DRIP);
+ RNA_def_property_ui_text(prop, "Use Drip", "Processes drip effect. Drips wet paint to gravity direction");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ prop= RNA_def_property(srna, "use_shrink", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_boolean_sdna(prop, NULL, "effect", MOD_DPAINT_EFFECT_DO_SHRINK);
+ RNA_def_property_ui_text(prop, "Use Shrink", "Processes shrink effect. Shrinks paint areas");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ prop= RNA_def_property(srna, "shrink_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "shrink_speed");
+ RNA_def_property_range(prop, 0.001, 10.0);
+ RNA_def_property_ui_range(prop, 0.01, 5.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Shrink Speed", "How fast shrink effect moves on the canvas surface");
+
+ prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "EffectorWeights");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Effector Weights", "");
+
+ prop= RNA_def_property(srna, "drip_velocity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "drip_vel");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Velocity", "Defines how much surface velocity affects dripping");
+
+ prop= RNA_def_property(srna, "drip_acceleration", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "drip_acc");
+ RNA_def_property_range(prop, -200.0f, 200.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
+ RNA_def_property_ui_text(prop, "Acceleration", "Defines how much surface acceleration affects dripping");
+
+ /*
+ * Output settings
+ */
+ prop= RNA_def_property(srna, "premultiply", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_MULALPHA);
+ RNA_def_property_ui_text(prop, "Premultiply alpha", "Multiplies color by alpha. (Recommended for Blender input)");
+
+ prop= RNA_def_property(srna, "image_output_path", PROP_STRING, PROP_DIRPATH);
+ RNA_def_property_string_sdna(prop, NULL, "image_output_path");
+ RNA_def_property_ui_text(prop, "Output Path", "Directory to save the textures");
+
+ /* output for primary surface data */
+ prop= RNA_def_property(srna, "output_name", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "output_name");
+ RNA_def_property_ui_text(prop, "Output name", "");
+
+ prop= RNA_def_property(srna, "do_output1", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_OUT1);
+ RNA_def_property_ui_text(prop, "Save layer", "Output name");
+
+ /* output for secondary sufrace data */
+ prop= RNA_def_property(srna, "output_name2", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "output_name2");
+ RNA_def_property_ui_text(prop, "Output name", "Output name");
+
+ prop= RNA_def_property(srna, "do_output2", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_OUT2);
+ RNA_def_property_ui_text(prop, "Save layer", "");
+
+ prop= RNA_def_property(srna, "preview_id", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_sdna(prop, NULL, "preview_id");
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_surface_preview);
+ RNA_def_property_ui_text(prop, "Preview", "");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ /* to check if output name exists */
+ func = RNA_def_function(srna, "output_exists", "rna_DynamicPaint_is_output_exists");
+ RNA_def_function_ui_description(func, "Checks if surface output layer of given name exists");
+ parm= RNA_def_pointer(func, "object", "Object", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+ parm= RNA_def_int(func, "index", 0, 0, 1, "Index", "", 0, 1);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* return type */
+ parm= RNA_def_boolean(func, "exists", 0, "", "");
+ RNA_def_function_return(func, parm);
+
+ prop= RNA_def_property(srna, "depth_clamp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_range(prop, 0.00, 50.0);
+ RNA_def_property_ui_range(prop, 0.00, 5.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Displace", "Maximum level of depth intersection in object space. Use 0.0 to disable");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "displace_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "disp_factor");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_range(prop, -50.0, 50.0);
+ RNA_def_property_ui_range(prop, -5.0, 5.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Displace Factor", "Strength of displace when applied to the mesh");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "image_fileformat", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_image_fileformat);
+ RNA_def_property_ui_text(prop, "File Format", "");
+
+ prop= RNA_def_property(srna, "displace_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "disp_type");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_displace_type);
+ RNA_def_property_ui_text(prop, "Data Type", "");
+
+ prop= RNA_def_property(srna, "use_incremental_displace", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DISP_INCREMENTAL);
+ RNA_def_property_ui_text(prop, "Incremental", "New displace is added cumulatively on top of existing");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_reset");
+
+ /* 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_ui_range(prop, 0.01, 1.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Damping", "Wave damping factor");
+
+ prop= RNA_def_property(srna, "wave_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.01, 3.0);
+ RNA_def_property_ui_range(prop, 0.01, 1.5, 1, 2);
+ RNA_def_property_ui_text(prop, "Speed", "Wave propogation speed");
+
+ prop= RNA_def_property(srna, "wave_timescale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.01, 3.0);
+ RNA_def_property_ui_range(prop, 0.01, 1.5, 1, 2);
+ 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_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");
+
+ prop= RNA_def_property(srna, "wave_open_borders", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_WAVE_OPEN_BORDERS);
+ RNA_def_property_ui_text(prop, "Open Borders", "Passes waves through mesh edges");
+
+
+ /* cache */
+ prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "pointcache");
+ RNA_def_property_ui_text(prop, "Point Cache", "");
+
+ /* is cache used */
+ prop= RNA_def_property(srna, "uses_cache", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_DynamicPaint_uses_cache_get", "rna_DynamicPaint_uses_cache_set");
+ RNA_def_property_ui_text(prop, "Uses Cache", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+}
+
+static void rna_def_dynamic_paint_canvas_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "DynamicPaintCanvasSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Canvas Settings", "Dynamic Paint canvas settings");
+ RNA_def_struct_sdna(srna, "DynamicPaintCanvasSettings");
+ RNA_def_struct_path_func(srna, "rna_DynamicPaintCanvasSettings_path");
+
+ /*
+ * Surface Slots
+ */
+ prop= RNA_def_property(srna, "canvas_surfaces", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_funcs(prop, "rna_DynamicPaint_surfaces_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", NULL, NULL, NULL, NULL);
+ RNA_def_property_struct_type(prop, "DynamicPaintSurface");
+ RNA_def_property_ui_text(prop, "Paint Surface List", "Paint surface list");
+ rna_def_canvas_surfaces(brna, prop);
+}
+
+static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ /* paint collision type */
+ static EnumPropertyItem prop_dynamicpaint_collisiontype[] = {
+ {MOD_DPAINT_COL_PSYS, "PARTICLE_SYSTEM", ICON_PARTICLES, "Particle System", ""},
+ {MOD_DPAINT_COL_POINT, "POINT", ICON_META_EMPTY, "Object Center", ""},
+ {MOD_DPAINT_COL_DIST, "DISTANCE", ICON_META_EMPTY, "Proximity", ""},
+ {MOD_DPAINT_COL_VOLDIST, "VOLUME_DISTANCE", ICON_META_CUBE, "Mesh Volume + Proximity", ""},
+ {MOD_DPAINT_COL_VOLUME, "VOLUME", ICON_MESH_CUBE, "Mesh Volume", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_dynamicpaint_prox_falloff[] = {
+ {MOD_DPAINT_PRFALL_SMOOTH, "SMOOTH", ICON_SPHERECURVE, "Smooth", ""},
+ {MOD_DPAINT_PRFALL_CONSTANT, "CONSTANT", ICON_NOCURVE, "Constant", ""},
+ {MOD_DPAINT_PRFALL_RAMP, "RAMP", ICON_COLOR, "Color Ramp", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_dynamicpaint_brush_wave_type[] = {
+ {MOD_DPAINT_WAVEB_DEPTH, "DEPTH", 0, "Obstacle", ""},
+ {MOD_DPAINT_WAVEB_FORCE, "FORCE", 0, "Force", ""},
+ {MOD_DPAINT_WAVEB_REFLECT, "REFLECT", 0, "Reflect Only", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_dynamicpaint_brush_ray_dir[] = {
+ {MOD_DPAINT_RAY_CANVAS, "CANVAS", 0, "Canvas Normal", ""},
+ {MOD_DPAINT_RAY_BRUSH_AVG, "BRUSH", 0, "Brush Normal", ""},
+ {MOD_DPAINT_RAY_ZPLUS, "Z_AXIS", 0, "Z-Axis", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna = RNA_def_struct(brna, "DynamicPaintBrushSettings", NULL);
+ RNA_def_struct_ui_text(srna, "Brush Settings", "Brush settings");
+ RNA_def_struct_sdna(srna, "DynamicPaintBrushSettings");
+ RNA_def_struct_path_func(srna, "rna_DynamicPaintBrushSettings_path");
+
+ /*
+ * Paint
+ */
+ prop= RNA_def_property(srna, "paint_color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "r");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Paint Color", "Color of the paint");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "paint_alpha", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "alpha");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
+ RNA_def_property_ui_text(prop, "Paint Alpha", "Paint alpha");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_USE_MATERIAL);
+ RNA_def_property_ui_text(prop, "Use object material", "Use object material to define color and influence");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "mat");
+ RNA_def_property_ui_text(prop, "Material", "Material to use. If not defined, material linked to the mesh is used");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "absolute_alpha", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ABS_ALPHA);
+ RNA_def_property_ui_text(prop, "Absolute Alpha", "Only increase alpha value if paint alpha is higher than existing");
+
+ prop= RNA_def_property(srna, "paint_wetness", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "wetness");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
+ RNA_def_property_ui_text(prop, "Paint Wetness", "Paint wetness. Visible in wetmap. Some effects only affect wet paint");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "paint_erase", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ERASE);
+ RNA_def_property_ui_text(prop, "Erase Paint", "Erase / remove paint instead of adding it");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "wave_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_brush_wave_type);
+ RNA_def_property_ui_text(prop, "Brush Effect", "");
+
+ prop= RNA_def_property(srna, "wave_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, -2.0, 2.0);
+ RNA_def_property_ui_range(prop, -1.0, 1.0, 5, 2);
+ RNA_def_property_ui_text(prop, "Factor", "Multiplier for wave influence of this brush");
+
+ prop= RNA_def_property(srna, "wave_clamp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.00, 50.0);
+ RNA_def_property_ui_range(prop, 0.00, 5.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Clamp Waves", "Maximum level of surface intersection used to influence waves. Use 0.0 to disable");
+
+ prop= RNA_def_property(srna, "do_smudge", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DO_SMUDGE);
+ RNA_def_property_ui_text(prop, "Do Smudge", "Makes this brush to smudge existing paint as it moves");
+
+ prop= RNA_def_property(srna, "smudge_strength", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
+ RNA_def_property_ui_text(prop, "Smudge Strength", "Smudge effect strength");
+
+ prop= RNA_def_property(srna, "max_velocity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0001, 10.0);
+ RNA_def_property_ui_range(prop, 0.1, 2.0, 5, 2);
+ RNA_def_property_ui_text(prop, "Max Velocity", "Velocity considered as maximum influence. (Blender units per frame)");
+
+ prop= RNA_def_property(srna, "velocity_alpha", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_ALPHA);
+ RNA_def_property_ui_text(prop, "Multiply Alpha", "Multiply brush influence by velocity color ramp alpha");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "velocity_depth", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_DEPTH);
+ RNA_def_property_ui_text(prop, "Multiply Depth", "Multiply brush intersection depth (displace, waves) by velocity ramp alpha");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "velocity_color", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_COLOR);
+ RNA_def_property_ui_text(prop, "Replace Color", "Replace brush color by velocity color ramp");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ /*
+ * Paint Area / Collision
+ */
+ prop= RNA_def_property(srna, "paint_source", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_sdna(prop, NULL, "collision");
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_collisiontype);
+ RNA_def_property_ui_text(prop, "Paint Source", "");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "paint_distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "paint_distance");
+ RNA_def_property_range(prop, 0.0, 500.0);
+ RNA_def_property_ui_range(prop, 0.0, 500.0, 10, 3);
+ RNA_def_property_ui_text(prop, "Proximity Distance", "Maximum distance from brush to mesh surface to affect paint");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "proximity_ramp_alpha", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_RAMP_ALPHA);
+ RNA_def_property_ui_text(prop, "Only Use Alpha", "Only reads color ramp alpha");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "proximity_falloff", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_sdna(prop, NULL, "proximity_falloff");
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_prox_falloff);
+ RNA_def_property_ui_text(prop, "Falloff", "Proximity falloff type");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "proximity_project", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PROX_PROJECT);
+ RNA_def_property_ui_text(prop, "Project", "Brush is projected to canvas from defined direction within brush proximity");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "ray_direction", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "ray_dir");
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_brush_ray_dir);
+ RNA_def_property_ui_text(prop, "Ray Direction", "Defines ray direction to use for projection. If brush object is located in that direction it's painted");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "proximity_inverse", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_INVERSE_PROX);
+ RNA_def_property_ui_text(prop, "Inner Proximity", "Proximity falloff is applied inside the volume");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "negate_volume", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_NEGATE_VOLUME);
+ RNA_def_property_ui_text(prop, "Negate Volume", "Negate influence inside the volume");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+
+ /*
+ * Particle
+ */
+ prop= RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "psys");
+ RNA_def_property_struct_type(prop, "ParticleSystem");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Particle Systems", "The particle system to paint with");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_resetDependancy");
+
+
+ prop= RNA_def_property(srna, "use_particle_radius", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PART_RAD);
+ RNA_def_property_ui_text(prop, "Use Particle Radius", "Uses radius from particle settings");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "solid_radius", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "particle_radius");
+ RNA_def_property_range(prop, 0.01, 10.0);
+ RNA_def_property_ui_range(prop, 0.01, 2.0, 5, 3);
+ RNA_def_property_ui_text(prop, "Solid Radius", "Radius that will be painted solid");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "smooth_radius", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "particle_smooth");
+ RNA_def_property_range(prop, 0.0, 10.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 0);
+ RNA_def_property_ui_text(prop, "Smooth Radius", "Smooth falloff added after solid radius");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+
+ /*
+ * Color ramps
+ */
+ prop= RNA_def_property(srna, "paint_ramp", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "paint_ramp");
+ RNA_def_property_struct_type(prop, "ColorRamp");
+ RNA_def_property_ui_text(prop, "Paint Color Ramp", "Color ramp used to define proximity falloff");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+
+ prop= RNA_def_property(srna, "velocity_ramp", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vel_ramp");
+ RNA_def_property_struct_type(prop, "ColorRamp");
+ RNA_def_property_ui_text(prop, "Velocity Color Ramp", "Color ramp used to define brush velocity effect");
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
+}
+
+void RNA_def_dynamic_paint(BlenderRNA *brna)
+{
+ rna_def_dynamic_paint_canvas_settings(brna);
+ rna_def_dynamic_paint_brush_settings(brna);
+ rna_def_canvas_surface(brna);
+}
+
+#endif
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 35513e12872..809127258c5 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -136,6 +136,7 @@ void RNA_def_constraint(struct BlenderRNA *brna);
void RNA_def_context(struct BlenderRNA *brna);
void RNA_def_controller(struct BlenderRNA *brna);
void RNA_def_curve(struct BlenderRNA *brna);
+void RNA_def_dynamic_paint(struct BlenderRNA *brna);
void RNA_def_fluidsim(struct BlenderRNA *brna);
void RNA_def_fcurve(struct BlenderRNA *brna);
void RNA_def_gameproperty(struct BlenderRNA *brna);
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index 629711fcf96..5b71df86f30 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -265,7 +265,7 @@ static void rna_def_lamp_sky_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sun Size", "Sun size");
RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
- prop= RNA_def_property(srna, "backscattered_light", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "backscattered_light", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_ui_text(prop, "Backscattered Light", "Backscattered light");
RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
diff --git a/source/blender/makesrna/intern/rna_linestyle.c b/source/blender/makesrna/intern/rna_linestyle.c
index 58be8fc62c4..736bc67a6ab 100644
--- a/source/blender/makesrna/intern/rna_linestyle.c
+++ b/source/blender/makesrna/intern/rna_linestyle.c
@@ -207,8 +207,8 @@ static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modi
{MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
{MA_RAMP_VAL, "VALUE", 0, "Value", ""},
{MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
- {MA_RAMP_SOFT, "SOFT LIGHT", 0, "Soft Light", ""},
- {MA_RAMP_LINEAR, "LINEAR LIGHT", 0, "Linear Light", ""},
+ {MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
+ {MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem value_blend_items[] = {
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 462156d4acc..fe2cfbd3bc0 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -1955,11 +1955,12 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
/* not supported yet
- prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
- RNA_def_property_float(prop, NULL, "rot");
- RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
- RNA_def_property_editable_func(prop, texspace_editable);
- RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");*/
+ prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
+ RNA_def_property_float(prop, NULL, "rot");
+ RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
+ RNA_def_property_editable_func(prop, texspace_editable);
+ RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
+ */
/* materials */
prop= RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c
index 2b847084e10..323fb6780fb 100644
--- a/source/blender/makesrna/intern/rna_meta.c
+++ b/source/blender/makesrna/intern/rna_meta.c
@@ -317,11 +317,12 @@ static void rna_def_metaball(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
/* not supported yet
- prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
- RNA_def_property_float(prop, NULL, "rot");
- RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
- RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable");
- RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");*/
+ prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
+ RNA_def_property_float(prop, NULL, "rot");
+ RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
+ RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
+ */
/* materials */
prop= RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 5eb317ede3e..32665bef065 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -46,6 +46,7 @@
#include "BKE_animsys.h"
#include "BKE_bmesh.h" /* For BevelModifierData */
+#include "BKE_dynamicpaint.h"
#include "BKE_multires.h"
#include "BKE_smoke.h" /* For smokeModifier_free & smokeModifier_createType */
@@ -94,6 +95,7 @@ EnumPropertyItem modifier_type_items[] ={
{eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
{eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
{eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
+ {eModifierType_DynamicPaint, "DYNAMIC_PAINT", ICON_MOD_DYNAMICPAINT, "Dynamic Paint", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -192,6 +194,8 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
return &RNA_VertexWeightMixModifier;
case eModifierType_WeightVGProximity:
return &RNA_VertexWeightProximityModifier;
+ case eModifierType_DynamicPaint:
+ return &RNA_DynamicPaintModifier;
default:
return &RNA_Modifier;
}
@@ -2008,6 +2012,31 @@ static void rna_def_modifier_smoke(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Smoke_set_type");
}
+static void rna_def_modifier_dynamic_paint(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "DynamicPaintModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "Dynamic Paint Modifier", "Dynamic Paint modifier");
+ RNA_def_struct_sdna(srna, "DynamicPaintModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_DYNAMICPAINT);
+
+ prop= RNA_def_property(srna, "canvas_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "canvas");
+ RNA_def_property_ui_text(prop, "Canvas Settings", "");
+
+ prop= RNA_def_property(srna, "brush_settings", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "brush");
+ RNA_def_property_ui_text(prop, "Brush Settings", "");
+
+ prop= RNA_def_property(srna, "ui_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, prop_dynamicpaint_type_items);
+ RNA_def_property_ui_text(prop, "Type", "");
+}
+
static void rna_def_modifier_collision(BlenderRNA *brna)
{
StructRNA *srna;
@@ -2880,6 +2909,7 @@ void RNA_def_modifier(BlenderRNA *brna)
rna_def_modifier_weightvgedit(brna);
rna_def_modifier_weightvgmix(brna);
rna_def_modifier_weightvgproximity(brna);
+ rna_def_modifier_dynamic_paint(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_movieclip.c b/source/blender/makesrna/intern/rna_movieclip.c
index afdf3cd9c46..91e082cdeae 100644
--- a/source/blender/makesrna/intern/rna_movieclip.c
+++ b/source/blender/makesrna/intern/rna_movieclip.c
@@ -66,24 +66,6 @@ static void rna_MovieClip_size_get(PointerRNA *ptr, int *values)
values[1]= clip->lastsize[1];
}
-static void rna_MovieClip_resolution_get(PointerRNA *ptr, float *values)
-{
- MovieClip *clip= (MovieClip*)ptr->id.data;
- ImBuf *ibuf;
-
- ibuf= BKE_movieclip_get_ibuf(clip, NULL);
- if (ibuf) {
- values[0]= ibuf->ppm[0];
- values[1]= ibuf->ppm[1];
-
- IMB_freeImBuf(ibuf);
- }
- else {
- values[0]= 0;
- values[1]= 0;
- }
-}
-
#else
static void rna_def_movieclip_proxy(BlenderRNA *brna)
@@ -93,9 +75,9 @@ static void rna_def_movieclip_proxy(BlenderRNA *brna)
static const EnumPropertyItem clip_tc_items[]= {
{IMB_TC_NONE, "NONE", 0, "No TC in use", ""},
- {IMB_TC_RECORD_RUN, "RECORD_RUN", 0, "Record Run", "use images in the order as 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, "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"},
{0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "MovieClipProxy", NULL);
@@ -235,10 +217,6 @@ static void rna_def_movieclip(BlenderRNA *brna)
RNA_def_property_int_funcs(prop, "rna_MovieClip_size_get" , NULL, NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop= RNA_def_float_vector(srna, "resolution" , 2 , NULL , 0, 0, "Resolution" , "X/Y pixels per meter" , 0 , 0);
- RNA_def_property_float_funcs(prop, "rna_MovieClip_resolution_get", NULL, NULL);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-
prop= RNA_def_property(srna, "display_aspect", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "aspx");
RNA_def_property_array(prop, 2);
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 7e74c490e5c..55693f8e53f 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -108,6 +108,27 @@ EnumPropertyItem node_filter_items[] = {
{6, "SHADOW", 0, "Shadow", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem prop_noise_basis_items[] = {
+ {SHD_NOISE_PERLIN, "PERLIN", 0, "Perlin", ""},
+ {SHD_NOISE_VORONOI_F1, "VORONOI_F1", 0, "Voronoi F1", ""},
+ {SHD_NOISE_VORONOI_F2, "VORONOI_F2", 0, "Voronoi F2", ""},
+ {SHD_NOISE_VORONOI_F3, "VORONOI_F3", 0, "Voronoi F3", ""},
+ {SHD_NOISE_VORONOI_F4, "VORONOI_F4", 0, "Voronoi F4", ""},
+ {SHD_NOISE_VORONOI_F2_F1, "VORONOI_F2_F1", 0, "Voronoi F2-F1", ""},
+ {SHD_NOISE_VORONOI_CRACKLE, "VORONOI_CRACKLE", 0, "Voronoi Crackle", ""},
+ {SHD_NOISE_CELL_NOISE, "CELL_NOISE", 0, "Cell Noise", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem prop_noise_type_items[] = {
+ {SHD_NOISE_SOFT, "SOFT", 0, "Soft", ""},
+ {SHD_NOISE_HARD, "HARD", 0, "Hard", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem prop_wave_items[] = {
+ {SHD_WAVE_SINE, "SINE", 0, "Sine", "Uses a sine wave to produce bands"},
+ {SHD_WAVE_SAW, "SAW", 0, "Saw", "Uses a saw wave to produce bands"},
+ {SHD_WAVE_TRI, "TRI", 0, "Tri", "Uses a triangle wave to produce bands"},
+ {0, NULL, 0, NULL, NULL}};
/* Add any new socket value subtype here.
* When adding a new subtype here, make sure you also add it
@@ -762,6 +783,12 @@ static EnumPropertyItem node_ycc_items[] = {
{ 2, "JFIF", 0, "Jpeg", ""},
{0, NULL, 0, NULL, NULL}};
+static EnumPropertyItem node_glossy_items[] = {
+{SHD_GLOSSY_SHARP, "SHARP", 0, "Sharp", ""},
+{SHD_GLOSSY_BECKMANN, "BECKMANN", 0, "Beckmann", ""},
+{SHD_GLOSSY_GGX, "GGX", 0, "GGX", ""},
+{0, NULL, 0, NULL, NULL}};
+
#define MaxNodes 50000
enum
@@ -1093,6 +1120,212 @@ static void def_sh_geometry(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
}
+static void def_sh_attribute(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeShaderAttribute", "storage");
+
+ prop = RNA_def_property(srna, "attribute_name", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "name");
+ RNA_def_property_ui_text(prop, "Attribute Name", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+}
+
+static void def_sh_tex(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(srna, "texture_mapping", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "base.tex_mapping");
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_ui_text(prop, "Texture Mapping", "Texture coordinate mapping settings");
+
+ prop= RNA_def_property(srna, "color_mapping", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "base.color_mapping");
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_ui_text(prop, "Color Mapping", "Color mapping settings");
+}
+
+static void def_sh_tex_sky(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeTexSky", "storage");
+ def_sh_tex(srna);
+
+ prop = RNA_def_property(srna, "sun_direction", PROP_FLOAT, PROP_DIRECTION);
+ RNA_def_property_ui_text(prop, "Sun Direction", "Direction from where the sun is shining");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "turbidity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Turbidity", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+}
+
+static void def_sh_tex_environment(StructRNA *srna)
+{
+ static const EnumPropertyItem prop_color_space_items[]= {
+ {SHD_COLORSPACE_SRGB, "SRGB", 0, "sRGB", "Image is in sRGB color space"},
+ {SHD_COLORSPACE_LINEAR, "LINEAR", 0, "Linear", "Image is in scene linear color space"},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_struct_type(prop, "Image");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Image", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+ RNA_def_struct_sdna_from(srna, "NodeTexImage", "storage");
+ def_sh_tex(srna);
+
+ prop= RNA_def_property(srna, "color_space", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, prop_color_space_items);
+ RNA_def_property_ui_text(prop, "Color Space", "Image file color space");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_sh_tex_image(StructRNA *srna)
+{
+ static const EnumPropertyItem prop_color_space_items[]= {
+ {SHD_COLORSPACE_LINEAR, "LINEAR", 0, "Linear", "Image is in scene linear color space"},
+ {SHD_COLORSPACE_SRGB, "SRGB", 0, "sRGB", "Image is in sRGB color space"},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_struct_type(prop, "Image");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Image", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+ RNA_def_struct_sdna_from(srna, "NodeTexImage", "storage");
+ def_sh_tex(srna);
+
+ prop= RNA_def_property(srna, "color_space", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, prop_color_space_items);
+ RNA_def_property_ui_text(prop, "Color Space", "Image file color space");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_sh_tex_gradient(StructRNA *srna)
+{
+ static EnumPropertyItem prop_gradient_type[] = {
+ {SHD_BLEND_LINEAR, "LINEAR", 0, "Linear", "Creates a linear progression"},
+ {SHD_BLEND_QUADRATIC, "QUADRATIC", 0, "Quadratic", "Creates a quadratic progression"},
+ {SHD_BLEND_EASING, "EASING", 0, "Easing", "Creates a progression easing from one step to the next"},
+ {SHD_BLEND_DIAGONAL, "DIAGONAL", 0, "Diagonal", "Creates a diagonal progression"},
+ {SHD_BLEND_SPHERICAL, "SPHERICAL", 0, "Spherical", "Creates a spherical progression"},
+ {SHD_BLEND_QUADRATIC_SPHERE, "QUADRATIC_SPHERE", 0, "Quadratic sphere", "Creates a quadratic progression in the shape of a sphere"},
+ {SHD_BLEND_RADIAL, "RADIAL", 0, "Radial", "Creates a radial progression"},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeTexGradient", "storage");
+ def_sh_tex(srna);
+
+ prop= RNA_def_property(srna, "gradient_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, prop_gradient_type);
+ RNA_def_property_ui_text(prop, "Gradient Type", "Sets the style of the color blending");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_sh_tex_noise(StructRNA *srna)
+{
+ RNA_def_struct_sdna_from(srna, "NodeTexNoise", "storage");
+ def_sh_tex(srna);
+}
+
+static void def_sh_tex_magic(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeTexMagic", "storage");
+ def_sh_tex(srna);
+
+ prop= RNA_def_property(srna, "turbulence_depth", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "depth");
+ RNA_def_property_range(prop, 0, 10);
+ RNA_def_property_ui_text(prop, "Depth", "Level of detail in the added turbulent noise");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_sh_tex_musgrave(StructRNA *srna)
+{
+ static EnumPropertyItem prop_musgrave_type[] = {
+ {SHD_MUSGRAVE_MULTIFRACTAL, "MULTIFRACTAL", 0, "Multifractal", ""},
+ {SHD_MUSGRAVE_RIDGED_MULTIFRACTAL, "RIDGED_MULTIFRACTAL", 0, "Ridged Multifractal", ""},
+ {SHD_MUSGRAVE_HYBRID_MULTIFRACTAL, "HYBRID_MULTIFRACTAL", 0, "Hybrid Multifractal", ""},
+ {SHD_MUSGRAVE_FBM, "FBM", 0, "fBM", ""},
+ {SHD_MUSGRAVE_HETERO_TERRAIN, "HETERO_TERRAIN", 0, "Hetero Terrain", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeTexMusgrave", "storage");
+ def_sh_tex(srna);
+
+ prop= RNA_def_property(srna, "musgrave_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "musgrave_type");
+ RNA_def_property_enum_items(prop, prop_musgrave_type);
+ RNA_def_property_ui_text(prop, "Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_sh_tex_voronoi(StructRNA *srna)
+{
+ static EnumPropertyItem prop_coloring_items[] = {
+ {SHD_VORONOI_INTENSITY, "INTENSITY", 0, "Intensity", "Only calculate intensity"},
+ {SHD_VORONOI_CELLS, "CELLS", 0, "Cells", "Color cells by position"},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeTexVoronoi", "storage");
+ def_sh_tex(srna);
+
+ prop= RNA_def_property(srna, "coloring", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "coloring");
+ RNA_def_property_enum_items(prop, prop_coloring_items);
+ RNA_def_property_ui_text(prop, "Coloring", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_sh_tex_wave(StructRNA *srna)
+{
+ static EnumPropertyItem prop_wave_type_items[] = {
+ {SHD_WAVE_BANDS, "BANDS", 0, "Bands", "Uses standard wave texture in bands"},
+ {SHD_WAVE_RINGS, "RINGS", 0, "Rings", "Uses wave texture in rings"},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeTexWave", "storage");
+ def_sh_tex(srna);
+
+ prop= RNA_def_property(srna, "wave_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "wave_type");
+ RNA_def_property_enum_items(prop, prop_wave_type_items);
+ RNA_def_property_ui_text(prop, "Wave Type", "");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
+}
+
+static void def_glossy(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "custom1");
+ RNA_def_property_enum_items(prop, node_glossy_items);
+ RNA_def_property_ui_text(prop, "Distribution", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+}
/* -- Compositor Nodes ------------------------------------------------------ */
@@ -2707,6 +2940,16 @@ static void rna_def_node_socket(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "Socket name");
RNA_def_struct_name_property(srna, prop);
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroupSocket_update");
+
+ prop = RNA_def_property(srna, "group_socket", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "groupsock");
+ RNA_def_property_struct_type(prop, "NodeSocket");
+ RNA_def_property_ui_text(prop, "Group Socket", "For group nodes, the group input or output socket this corresponds to");
+
+ prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SOCK_COLLAPSED);
+ RNA_def_property_ui_text(prop, "Expanded", "Socket links are expanded in the user interface");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, NULL);
}
static void rna_def_node_socket_subtype(BlenderRNA *brna, int type, int subtype, const char *name, const char *ui_name)
@@ -2715,7 +2958,7 @@ static void rna_def_node_socket_subtype(BlenderRNA *brna, int type, int subtype,
PropertyRNA *prop=NULL;
PropertySubType propsubtype= PROP_NONE;
- #define SUBTYPE(socktype, stypename, id, idname) { PROP_##id, #id, 0, #idname, ""},
+ #define SUBTYPE(socktype, stypename, id, idname) { PROP_##id, #socktype "_" #id, 0, #idname, ""},
static EnumPropertyItem subtype_items[] = {
NODE_DEFINE_SUBTYPES
{0, NULL, 0, NULL, NULL}
@@ -2842,6 +3085,11 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Node");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Parent", "Parent this node is attached to");
+
+ prop = RNA_def_property(srna, "show_texture", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", NODE_ACTIVE_TEXTURE);
+ RNA_def_property_ui_text(prop, "Show Texture", "Draw node in viewport textured draw mode");
+ RNA_def_property_update(prop, 0, "rna_Node_update");
}
static void rna_def_node_link(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index 2545826cd46..78be14ebf7e 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -53,7 +53,39 @@ DefNode( ShaderNode, SH_NODE_INVERT, 0, "INVER
DefNode( ShaderNode, SH_NODE_SEPRGB, 0, "SEPRGB", SeparateRGB, "Separate RGB", "" )
DefNode( ShaderNode, SH_NODE_COMBRGB, 0, "COMBRGB", CombineRGB, "Combine RGB", "" )
DefNode( ShaderNode, SH_NODE_HUE_SAT, 0, "HUE_SAT", HueSaturation, "Hue/Saturation", "" )
-
+
+DefNode( ShaderNode, SH_NODE_OUTPUT_MATERIAL, 0, "OUTPUT_MATERIAL", OutputMaterial, "Material Output", "" )
+DefNode( ShaderNode, SH_NODE_OUTPUT_LAMP, 0, "OUTPUT_LAMP", OutputLamp, "Lamp Output", "" )
+DefNode( ShaderNode, SH_NODE_OUTPUT_WORLD, 0, "OUTPUT_WORLD", OutputWorld, "World Output", "" )
+DefNode( ShaderNode, SH_NODE_FRESNEL, 0, "FRESNEL", Fresnel, "Fresnel", "" )
+DefNode( ShaderNode, SH_NODE_LAYER_WEIGHT, 0, "LAYER_WEIGHT", LayerWeight, "LayerWeight", "" )
+DefNode( ShaderNode, SH_NODE_MIX_SHADER, 0, "MIX_SHADER", MixShader, "Mix Shader", "" )
+DefNode( ShaderNode, SH_NODE_ADD_SHADER, 0, "ADD_SHADER", AddShader, "Add Shader", "" )
+DefNode( ShaderNode, SH_NODE_ATTRIBUTE, def_sh_attribute, "ATTRIBUTE", Attribute, "Attribute", "" )
+DefNode( ShaderNode, SH_NODE_BACKGROUND, 0, "BACKGROUND", Background, "Background", "" )
+DefNode( ShaderNode, SH_NODE_HOLDOUT, 0, "HOLDOUT", Holdout, "Holdout", "" )
+DefNode( ShaderNode, SH_NODE_BSDF_DIFFUSE, 0, "BSDF_DIFFUSE", BsdfDiffuse, "Diffuse Bsdf", "" )
+DefNode( ShaderNode, SH_NODE_BSDF_GLOSSY, def_glossy, "BSDF_GLOSSY", BsdfGlossy, "Glossy Bsdf", "" )
+DefNode( ShaderNode, SH_NODE_BSDF_GLASS, def_glossy, "BSDF_GLASS", BsdfGlass, "Glass Bsdf", "" )
+DefNode( ShaderNode, SH_NODE_BSDF_TRANSLUCENT, 0, "BSDF_TRANSLUCENT", BsdfTranslucent, "Translucent Bsdf", "" )
+DefNode( ShaderNode, SH_NODE_BSDF_TRANSPARENT, 0, "BSDF_TRANSPARENT", BsdfTransparent, "Transparent Bsdf", "" )
+DefNode( ShaderNode, SH_NODE_BSDF_VELVET, 0, "BSDF_VELVET", BsdfVelvet, "Velvet Bsdf", "" )
+DefNode( ShaderNode, SH_NODE_VOLUME_TRANSPARENT, 0, "VOLUME_TRANSPARENT", VolumeTransparent,"Transparent Volume","" )
+DefNode( ShaderNode, SH_NODE_VOLUME_ISOTROPIC, 0, "VOLUME_ISOTROPIC", VolumeIsotropic, "Isotropic Volume", "" )
+DefNode( ShaderNode, SH_NODE_EMISSION, 0, "EMISSION", Emission, "Emission", "" )
+DefNode( ShaderNode, SH_NODE_NEW_GEOMETRY, 0, "NEW_GEOMETRY", NewGeometry, "Geometry", "" )
+DefNode( ShaderNode, SH_NODE_LIGHT_PATH, 0, "LIGHT_PATH", Light_path, "Light_path", "" )
+DefNode( ShaderNode, SH_NODE_TEX_IMAGE, def_sh_tex_image, "TEX_IMAGE", TexImage, "Image Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_ENVIRONMENT, def_sh_tex_environment, "TEX_ENVIRONMENT", TexEnvironment, "Environment Texture","" )
+DefNode( ShaderNode, SH_NODE_TEX_SKY, def_sh_tex_sky, "TEX_SKY", TexSky, "Sky Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_GRADIENT, def_sh_tex_gradient, "TEX_GRADIENT", TexGradient, "Gradient Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_NOISE, def_sh_tex_noise, "TEX_NOISE", TexNoise, "Noise Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_MAGIC, def_sh_tex_magic, "TEX_MAGIC", TexMagic, "Magic Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_WAVE, def_sh_tex_wave, "TEX_WAVE", TexWave, "Wave Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_MUSGRAVE, def_sh_tex_musgrave, "TEX_MUSGRAVE", TexMusgrave, "Musgrave Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_VORONOI, def_sh_tex_voronoi, "TEX_VORONOI", TexVoronoi, "Voronoi Texture", "" )
+DefNode( ShaderNode, SH_NODE_TEX_COORD, 0, "TEX_COORD", TexCoord, "Texture Coordinate","")
+
DefNode( CompositorNode, CMP_NODE_VIEWER, 0, "VIEWER", Viewer, "Viewer", "" )
DefNode( CompositorNode, CMP_NODE_RGB, 0, "RGB", RGB, "RGB", "" )
DefNode( CompositorNode, CMP_NODE_VALUE, 0, "VALUE", Value, "Value", "" )
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 0acff2a5790..c4508c718e5 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -76,7 +76,7 @@
/* copied from Mesh_getFromObject and adapted to RNA interface */
/* settings: 0 - preview, 1 - render */
-static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_modifiers, int settings)
+Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_modifiers, int settings)
{
Mesh *tmpmesh;
Curve *tmpcu = NULL;
@@ -284,7 +284,7 @@ static void dupli_render_particle_set(Scene *scene, Object *ob, int level, int e
dupli_render_particle_set(scene, go->ob, level+1, enable);
}
/* When no longer needed, duplilist should be freed with Object.free_duplilist */
-static void rna_Object_create_duplilist(Object *ob, ReportList *reports, Scene *sce)
+void rna_Object_create_duplilist(Object *ob, ReportList *reports, Scene *sce)
{
if (!(ob->transflag & OB_DUPLI)) {
BKE_report(reports, RPT_ERROR, "Object does not have duplis");
@@ -306,7 +306,7 @@ static void rna_Object_create_duplilist(Object *ob, ReportList *reports, Scene *
/* ob->duplilist should now be freed with Object.free_duplilist */
}
-static void rna_Object_free_duplilist(Object *ob)
+void rna_Object_free_duplilist(Object *ob)
{
if (ob->duplilist) {
free_object_duplilist(ob->duplilist);
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index 44faefed27b..592c3baec46 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -640,6 +640,22 @@ static char *rna_EffectorWeight_path(PointerRNA *ptr)
if (smd->domain->effector_weights == ew)
return BLI_sprintfN("modifiers[\"%s\"].settings.effector_weights", md->name);
}
+
+ /* check dynamic paint modifier */
+ md = (ModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
+ if (md) {
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
+
+ if (pmd->canvas) {
+ DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
+
+ for(; surface; surface=surface->next) {
+ if (surface->effector_weights == ew)
+ return BLI_sprintfN("modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"].effector_weights",
+ md->name, surface->name);
+ }
+ }
+ }
}
return NULL;
}
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 530d162b1fe..f00b97994d5 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -233,7 +233,7 @@ static void rna_RenderLayer_rect_get(PointerRNA *ptr, float *values)
memcpy(values, rl->rectf, sizeof(float)*rl->rectx*rl->recty*4);
}
-static void rna_RenderLayer_rect_set(PointerRNA *ptr, const float *values)
+void rna_RenderLayer_rect_set(PointerRNA *ptr, const float *values)
{
RenderLayer *rl= (RenderLayer*)ptr->data;
memcpy(rl->rectf, values, sizeof(float)*rl->rectx*rl->recty*4);
@@ -255,7 +255,7 @@ static void rna_RenderPass_rect_get(PointerRNA *ptr, float *values)
memcpy(values, rpass->rect, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels);
}
-static void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values)
+void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values)
{
RenderPass *rpass= (RenderPass*)ptr->data;
memcpy(rpass->rect, values, sizeof(float)*rpass->rectx*rpass->recty*rpass->channels);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 24b70446468..9c4a0984596 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -576,6 +576,7 @@ static int rna_SceneRender_file_ext_length(PointerRNA *ptr)
static void rna_SceneRender_file_ext_get(PointerRNA *ptr, char *str)
{
RenderData *rd= (RenderData*)ptr->data;
+ str[0]= '\0';
BKE_add_image_extension(str, rd->imtype);
}
@@ -3467,7 +3468,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_full_sample", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FULL_SAMPLE);
- RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL);
+ RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL);
RNA_def_property_ui_text(prop, "Full Sample",
"Save for every anti-aliasing sample the entire RenderLayer results "
"(this solves anti-aliasing issues with compositing)");
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index bb07fa86f3a..31f3d59e643 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -102,7 +102,8 @@ EnumPropertyItem viewport_shade_items[] = {
{OB_BOUNDBOX, "BOUNDBOX", ICON_BBOX, "Bounding Box", "Display the object's local bounding boxes only"},
{OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"},
{OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display the object solid, lit with default OpenGL lights"},
- {OB_TEXTURE, "TEXTURED", ICON_POTATO, "Textured", "Display the object solid, with face-assigned textures"},
+ {OB_TEXTURE, "TEXTURED", ICON_POTATO, "Texture", "Display the object solid, with a texture"},
+ {OB_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "Material", "Display objects solid, with GLSL material"},
{OB_RENDER, "RENDERED", ICON_SMOOTH, "Rendered", "Display render preview"},
{0, NULL, 0, NULL, NULL}};
@@ -114,13 +115,14 @@ EnumPropertyItem viewport_shade_items[] = {
#include "BLI_math.h"
-#include "BKE_screen.h"
#include "BKE_animsys.h"
#include "BKE_brush.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_paint.h"
+#include "BKE_scene.h"
+#include "BKE_screen.h"
#include "ED_image.h"
#include "ED_node.h"
@@ -461,10 +463,12 @@ static EnumPropertyItem *rna_SpaceView3D_viewport_shade_itemf(bContext *UNUSED(C
RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_WIRE);
RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_SOLID);
RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_TEXTURE);
+
+ if(scene_use_new_shading_nodes(scene))
+ RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_MATERIAL);
- if(type->view_draw) {
+ if(type->view_draw)
RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_RENDER);
- }
RNA_enum_item_end(&item, &totitem);
*free= 1;
@@ -510,7 +514,7 @@ static void rna_SpaceImageEditor_image_set(PointerRNA *ptr, PointerRNA value)
SpaceImage *sima= (SpaceImage*)(ptr->data);
bScreen *sc= (bScreen*)ptr->id.data;
- ED_space_image_set(NULL, sima, sc->scene, sc->scene->obedit, (Image*)value.data);
+ ED_space_image_set(sima, sc->scene, sc->scene->obedit, (Image*)value.data);
}
static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *UNUSED(C), PointerRNA *ptr,
@@ -2385,6 +2389,11 @@ static void rna_def_space_time(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_SMOKE);
RNA_def_property_ui_text(prop, "Smoke", "Show the active object's smoke cache");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
+
+ prop= RNA_def_property(srna, "cache_dynamicpaint", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_DYNAMICPAINT);
+ RNA_def_property_ui_text(prop, "Dynamic Paint", "Show the active object's Dynamic Paint cache");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
}
static void rna_def_console_line(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c
index 15ded001237..2c6384c75d8 100644
--- a/source/blender/makesrna/intern/rna_tracking.c
+++ b/source/blender/makesrna/intern/rna_tracking.c
@@ -242,7 +242,7 @@ static void rna_def_trackingSettings(BlenderRNA *brna)
prop= RNA_def_property(srna, "frames_limit", PROP_INT, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_int_sdna(prop, NULL, "frames_limit");
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, SHRT_MAX);
RNA_def_property_ui_text(prop, "Frames Limit", "Amount of frames to be tracked during single tracking operation");
/* adjust frames */
@@ -418,7 +418,7 @@ static void rna_def_trackingTrack(BlenderRNA *brna)
static EnumPropertyItem tracker_items[] = {
{TRACKER_SAD, "SAD", 0, "SAD", "Sum of Absolute Differences tracker"},
- {TRACKER_KLT, "KLT", 0, "KLT", "Kanade–Lucas–Tomasi racker"},
+ {TRACKER_KLT, "KLT", 0, "KLT", "Kanade–Lucas–Tomasi tracker"},
{0, NULL, 0, NULL, NULL}};
rna_def_trackingMarker(brna);
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 9ff56f1aeb0..366ba1daf85 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -465,6 +465,9 @@ void RNA_api_ui_layout(StructRNA *srna)
parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ func= RNA_def_function(srna, "template_texture_user", "uiTemplateTextureUser");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
func= RNA_def_function(srna, "template_keymap_item_properties", "uiTemplateKeymapItemProperties");
parm= RNA_def_pointer(func, "item", "KeyMapItem", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 9dc125bbdcc..8406f232653 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -316,6 +316,7 @@ static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeFontStyle", NULL);
RNA_def_struct_sdna(srna, "uiFontStyle");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Font Style", "Theme settings for Font");
prop= RNA_def_property(srna, "points", PROP_INT, PROP_NONE);
@@ -366,6 +367,7 @@ static void rna_def_userdef_theme_ui_style(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeStyle", NULL);
RNA_def_struct_sdna(srna, "uiStyle");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Style", "Theme settings for style sets");
/* (not used yet)
@@ -410,6 +412,7 @@ static void rna_def_userdef_theme_ui_wcol(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeWidgetColors", NULL);
RNA_def_struct_sdna(srna, "uiWidgetColors");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Widget Color Set", "Theme settings for widget color sets");
prop= RNA_def_property(srna, "outline", PROP_FLOAT, PROP_COLOR_GAMMA);
@@ -465,6 +468,7 @@ static void rna_def_userdef_theme_ui_wcol_state(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeWidgetStateColors", NULL);
RNA_def_struct_sdna(srna, "uiWidgetStateColors");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Widget State Color", "Theme settings for widget state colors");
prop= RNA_def_property(srna, "inner_anim", PROP_FLOAT, PROP_COLOR_GAMMA);
@@ -512,6 +516,7 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeUserInterface", NULL);
RNA_def_struct_sdna(srna, "ThemeUI");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme User Interface", "Theme settings for user interface elements");
prop= RNA_def_property(srna, "wcol_regular", PROP_POINTER, PROP_NONE);
@@ -927,6 +932,7 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeView3D", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme 3D View", "Theme settings for the 3D View");
rna_def_userdef_theme_spaces_main(srna, SPACE_VIEW3D);
@@ -1064,6 +1070,7 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeGraphEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Graph Editor", "Theme settings for the graph editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_IPO);
@@ -1148,6 +1155,7 @@ static void rna_def_userdef_theme_space_file(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeFileBrowser", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme File Browser", "Theme settings for the File Browser");
rna_def_userdef_theme_spaces_main(srna, SPACE_FILE);
@@ -1197,6 +1205,7 @@ static void rna_def_userdef_theme_space_outliner(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeOutliner", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Outliner", "Theme settings for the Outliner");
rna_def_userdef_theme_spaces_main(srna, SPACE_OUTLINER);
@@ -1210,6 +1219,7 @@ static void rna_def_userdef_theme_space_userpref(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeUserPreferences", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme User Preferences", "Theme settings for the User Preferences");
rna_def_userdef_theme_spaces_main(srna, SPACE_USERPREF);
@@ -1224,6 +1234,7 @@ static void rna_def_userdef_theme_space_console(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeConsole", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Console", "Theme settings for the Console");
rna_def_userdef_theme_spaces_main(srna, SPACE_CONSOLE);
@@ -1267,6 +1278,7 @@ static void rna_def_userdef_theme_space_info(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeInfo", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Info", "Theme settings for Info");
rna_def_userdef_theme_spaces_main(srna, SPACE_INFO);
@@ -1282,6 +1294,7 @@ static void rna_def_userdef_theme_space_text(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeTextEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Text Editor", "Theme settings for the Text Editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_TEXT);
@@ -1350,6 +1363,7 @@ static void rna_def_userdef_theme_space_node(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeNodeEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Node Editor", "Theme settings for the Node Editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_NODE);
@@ -1419,6 +1433,7 @@ static void rna_def_userdef_theme_space_logic(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeLogicEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Logic Editor", "Theme settings for the Logic Editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_LOGIC);
@@ -1439,6 +1454,7 @@ static void rna_def_userdef_theme_space_buts(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeProperties", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Properties", "Theme settings for the Properties");
rna_def_userdef_theme_spaces_main(srna, SPACE_BUTS);
@@ -1458,6 +1474,7 @@ static void rna_def_userdef_theme_space_time(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeTimeline", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Timeline", "Theme settings for the Timeline");
rna_def_userdef_theme_spaces_main(srna, SPACE_TIME);
@@ -1483,6 +1500,7 @@ static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeImageEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Image Editor", "Theme settings for the Image Editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_IMAGE);
@@ -1510,6 +1528,7 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeSequenceEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Sequence Editor", "Theme settings for the Sequence Editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_IMAGE);
@@ -1601,6 +1620,7 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeDopeSheet", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme DopeSheet", "Theme settings for the DopeSheet");
rna_def_userdef_theme_spaces_main(srna, SPACE_ACTION);
@@ -1686,6 +1706,7 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeNLAEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme NLA Editor", "Theme settings for the NLA Editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_NLA);
@@ -1739,6 +1760,7 @@ static void rna_def_userdef_theme_colorset(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeBoneColorSet", NULL);
RNA_def_struct_sdna(srna, "ThemeWireColor");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Bone Color Set", "Theme settings for bone color sets");
prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR_GAMMA);
@@ -1773,6 +1795,7 @@ static void rna_def_userdef_theme_space_clip(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ThemeClipEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme Clip Editor", "Theme settings for the Movie Clip Editor");
rna_def_userdef_theme_spaces_main(srna, SPACE_CLIP);
@@ -1881,6 +1904,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
srna= RNA_def_struct(brna, "Theme", NULL);
RNA_def_struct_sdna(srna, "bTheme");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Theme", "Theme settings defining draw style and colors in the user interface");
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
@@ -2014,6 +2038,7 @@ static void rna_def_userdef_addon(BlenderRNA *brna)
srna= RNA_def_struct(brna, "Addon", NULL);
RNA_def_struct_sdna(srna, "bAddon");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Addon", "Python addons to be loaded automatically");
prop= RNA_def_property(srna, "module", PROP_STRING, PROP_NONE);
@@ -2057,6 +2082,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
srna= RNA_def_struct(brna, "UserSolidLight", NULL);
RNA_def_struct_sdna(srna, "SolidLight");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Solid Light", "Light used for OpenGL lighting in solid draw mode");
prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
@@ -2106,6 +2132,7 @@ static void rna_def_userdef_view(BlenderRNA *brna)
srna= RNA_def_struct(brna, "UserPreferencesView", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "View & Controls", "Preferences related to viewing data");
/* View */
@@ -2321,6 +2348,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
srna= RNA_def_struct(brna, "UserPreferencesEdit", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Edit Methods", "Settings for interacting with Blender data");
/* Edit Methods */
@@ -2599,12 +2627,13 @@ static void rna_def_userdef_system(BlenderRNA *brna)
{0, "DEFAULT", 0, "Default (Default)", ""},
{1, "ENGLISH", 0, "English (English)", "en_US"},
{8, "FRENCH", 0, "French (Français)", "fr_FR"},
- {9, "SPANISH", 0, "Spanish (Español)", "es_ES"},
+ {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_ES"},
{0, "", 0, "In progress", ""},
{2, "JAPANESE", 0, "Japanese (日本語)", "ja_JP"},
{3, "DUTCH", 0, "Dutch (Nederlandse taal)", "nl_NL"},
- {4, "ITALIAN", 0, "Italian (Italiano)", "it_IT"},
{5, "GERMAN", 0, "German (Deutsch)", "de_DE"},
{6, "FINNISH", 0, "Finnish (Suomi)", "fi_FI"},
{7, "SWEDISH", 0, "Swedish (Svenska)", "sv_SE"},
@@ -2612,7 +2641,6 @@ static void rna_def_userdef_system(BlenderRNA *brna)
{11, "CZECH", 0, "Czech (Český)", "cs_CZ"},
{12, "BRAZILIAN_PORTUGUESE", 0, "Brazilian Portuguese (Português do Brasil)", "pt_BR"},
{14, "TRADITIONAL_CHINESE", 0, "Traditional Chinese (繁體中文)", "zh_TW"},
- {15, "RUSSIAN", 0, "Russian (Русский)", "ru_RU"},
{16, "CROATIAN", 0, "Croatian (Hrvatski)", "hr_HR"},
{17, "SERBIAN", 0, "Serbian (Српском језику)", "sr_RS"},
{18, "UKRAINIAN", 0, "Ukrainian (Український)", "uk_UA"},
@@ -2632,6 +2660,7 @@ static void rna_def_userdef_system(BlenderRNA *brna)
srna= RNA_def_struct(brna, "UserPreferencesSystem", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "System & OpenGL", "Graphics driver and operating system settings");
/* Language */
@@ -2876,6 +2905,7 @@ static void rna_def_userdef_input(BlenderRNA *brna)
srna= RNA_def_struct(brna, "UserPreferencesInput", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "Input", "Settings for input devices");
prop= RNA_def_property(srna, "select_mouse", PROP_ENUM, PROP_NONE);
@@ -3031,6 +3061,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
srna= RNA_def_struct(brna, "UserPreferencesFilePaths", NULL);
RNA_def_struct_sdna(srna, "UserDef");
RNA_def_struct_nested(brna, srna, "UserPreferences");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "File Paths", "Default paths for external files");
prop= RNA_def_property(srna, "show_hidden_files_datablocks", PROP_BOOLEAN, PROP_NONE);
@@ -3148,6 +3179,7 @@ void rna_def_userdef_addon_collection(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "Addons");
srna= RNA_def_struct(brna, "Addons", NULL);
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "User Addons", "Collection of addons");
func= RNA_def_function(srna, "new", "rna_userdef_addon_new");
@@ -3184,6 +3216,7 @@ void RNA_def_userdef(BlenderRNA *brna)
srna= RNA_def_struct(brna, "UserPreferences", NULL);
RNA_def_struct_sdna(srna, "UserDef");
+ RNA_def_struct_clear_flag(srna, STRUCT_UNDO);
RNA_def_struct_ui_text(srna, "User Preferences", "Global user preferences");
prop= RNA_def_property(srna, "active_section", PROP_ENUM, PROP_NONE);
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index 805cd913aa0..e8ecc75ca60 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -55,6 +55,7 @@ set(SRC
intern/MOD_curve.c
intern/MOD_decimate.c
intern/MOD_displace.c
+ intern/MOD_dynamicpaint.c
intern/MOD_edgesplit.c
intern/MOD_explode.c
intern/MOD_fluidsim.c
diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h
index 1feee9ccf8a..8ffb7803bb1 100644
--- a/source/blender/modifiers/MOD_modifiertypes.h
+++ b/source/blender/modifiers/MOD_modifiertypes.h
@@ -74,6 +74,7 @@ extern ModifierTypeInfo modifierType_NavMesh;
extern ModifierTypeInfo modifierType_WeightVGEdit;
extern ModifierTypeInfo modifierType_WeightVGMix;
extern ModifierTypeInfo modifierType_WeightVGProximity;
+extern ModifierTypeInfo modifierType_DynamicPaint;
/* MOD_util.c */
void modifier_type_init(ModifierTypeInfo *types[]);
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index 95e16f3bea4..d2d875150e8 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -110,7 +110,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
DagNode *curNode = dag_get_node(forest, amd->object);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Armature Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Armature Modifier");
}
}
@@ -169,7 +169,7 @@ static void deformMatricesEM(
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
- amd->deformflag, NULL, amd->defgrp_name);
+ amd->deformflag, NULL, amd->defgrp_name);
if(!derivedData) dm->release(dm);
}
@@ -183,7 +183,7 @@ static void deformMatrices(ModifierData *md, Object *ob, DerivedMesh *derivedDat
if(!derivedData) dm = CDDM_from_mesh((Mesh*)ob->data, ob);
armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
- amd->deformflag, NULL, amd->defgrp_name);
+ amd->deformflag, NULL, amd->defgrp_name);
if(!derivedData) dm->release(dm);
}
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index f56eda674c5..ce052b2c1bd 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -116,25 +116,25 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
DagNode *curNode = dag_get_node(forest, amd->start_cap);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
}
if (amd->end_cap) {
DagNode *curNode = dag_get_node(forest, amd->end_cap);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
}
if (amd->curve_ob) {
DagNode *curNode = dag_get_node(forest, amd->curve_ob);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
}
if (amd->offset_ob) {
DagNode *curNode = dag_get_node(forest, amd->offset_ob);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Array Modifier");
}
}
@@ -275,8 +275,8 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
unit_m4(obinv);
mul_serie_m4(result_mat, offset,
- obinv, amd->offset_ob->obmat,
- NULL, NULL, NULL, NULL, NULL);
+ obinv, amd->offset_ob->obmat,
+ NULL, NULL, NULL, NULL, NULL);
copy_m4_m4(offset, result_mat);
}
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index 1828781690b..e502878fca5 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -85,7 +85,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
DagNode *curNode = dag_get_node(forest, bmd->object);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Boolean Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Boolean Modifier");
}
}
diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c
index 266bff35bbd..119934ea2f0 100644
--- a/source/blender/modifiers/intern/MOD_build.c
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -106,7 +106,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
faceMap = MEM_callocN(sizeof(*faceMap) * maxFaces, "build modifier faceMap");
for(i = 0; i < maxFaces; ++i) faceMap[i] = i;
- frac = BKE_curframe(md->scene) - bmd->start / bmd->length;
+ frac = (BKE_curframe(md->scene) - bmd->start) / bmd->length;
CLAMP(frac, 0.0f, 1.0f);
numFaces = dm->getNumFaces(dm) * frac;
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index bdf67c25e74..261d0c6c0d3 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -106,7 +106,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
DagNode *curNode = dag_get_node(forest, cmd->object);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Curve Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Curve Modifier");
}
}
@@ -120,7 +120,7 @@ static void deformVerts(ModifierData *md, Object *ob,
CurveModifierData *cmd = (CurveModifierData*) md;
curve_deform_verts(md->scene, cmd->object, ob, derivedData, vertexCos, numVerts,
- cmd->name, cmd->defaxis);
+ cmd->name, cmd->defaxis);
}
static void deformVertsEM(
diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c
index a7a25fbb00e..da90879ed6d 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -157,13 +157,13 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
DagNode *curNode = dag_get_node(forest, dmd->map_object);
dag_add_relation(forest, curNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
}
if(dmd->texmapping == MOD_DISP_MAP_GLOBAL)
dag_add_relation(forest, obNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
}
@@ -244,7 +244,7 @@ static void deformVerts(ModifierData *md, Object *ob,
DerivedMesh *dm= get_cddm(ob, NULL, derivedData, vertexCos);
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
- vertexCos, numVerts);
+ vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
@@ -257,7 +257,7 @@ static void deformVertsEM(
DerivedMesh *dm= get_cddm(ob, editData, derivedData, vertexCos);
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
- vertexCos, numVerts);
+ vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c
new file mode 100644
index 00000000000..c6b9e5752e0
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c
@@ -0,0 +1,180 @@
+/*
+* ***** 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 *****
+*
+*/
+
+#include <stddef.h>
+
+#include "DNA_dynamicpaint_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_dynamicpaint.h"
+#include "BKE_modifier.h"
+
+#include "depsgraph_private.h"
+
+#include "MOD_util.h"
+
+
+static void initData(ModifierData *md)
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+
+ pmd->canvas = NULL;
+ pmd->brush = NULL;
+ pmd->type = MOD_DYNAMICPAINT_TYPE_CANVAS;
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*)md;
+ DynamicPaintModifierData *tpmd = (DynamicPaintModifierData*)target;
+
+ dynamicPaint_Modifier_copy(pmd, tpmd);
+}
+
+static void freeData(ModifierData *md)
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+ dynamicPaint_Modifier_free(pmd);
+}
+
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*)md;
+ CustomDataMask dataMask = 0;
+
+ if (pmd->canvas) {
+ DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
+ for(; surface; surface=surface->next) {
+ /* tface */
+ if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ ||
+ surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) {
+ dataMask |= (1 << CD_MTFACE);
+ }
+ /* mcol */
+ if (surface->type == MOD_DPAINT_SURFACE_T_PAINT ||
+ surface->init_color_type == MOD_DPAINT_INITIAL_VERTEXCOLOR) {
+ dataMask |= (1 << CD_MCOL);
+ }
+ /* CD_MDEFORMVERT */
+ if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
+ dataMask |= (1 << CD_MDEFORMVERT);
+ }
+ }
+ }
+
+ if (pmd->brush) {
+ if (pmd->brush->flags & MOD_DPAINT_USE_MATERIAL) {
+ dataMask |= (1 << CD_MTFACE);
+ }
+ }
+ return dataMask;
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+
+ return dynamicPaint_Modifier_do(pmd, md->scene, ob, dm);
+}
+
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *scene,
+ Object *ob,
+ DagNode *obNode)
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+
+ /* add relation from canvases to all brush objects */
+ if(pmd && pmd->canvas)
+ {
+ Base *base = scene->base.first;
+
+ for(; base; base = base->next) {
+ DynamicPaintModifierData *pmd2 = (DynamicPaintModifierData *)modifiers_findByType(base->object, eModifierType_DynamicPaint);
+
+ if(pmd2 && pmd2->brush && ob!=base->object)
+ {
+ DagNode *brushNode = dag_get_node(forest, base->object);
+ dag_add_relation(forest, brushNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Dynamic Paint Brush");
+ }
+ }
+ }
+}
+
+static int dependsOnTime(ModifierData *UNUSED(md))
+{
+ return 1;
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob,
+ IDWalkFunc walk, void *userData)
+{
+ DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+
+ if(pmd->canvas) {
+ DynamicPaintSurface *surface = pmd->canvas->surfaces.first;
+
+ for(; surface; surface=surface->next) {
+ walk(userData, ob, (ID **)&surface->brush_group);
+ walk(userData, ob, (ID **)&surface->init_texture);
+ }
+ }
+ if (pmd->brush) {
+ walk(userData, ob, (ID **)&pmd->brush->mat);
+ }
+}
+
+static void foreachTexLink(ModifierData *UNUSED(md), Object *UNUSED(ob),
+ TexWalkFunc UNUSED(walk), void *UNUSED(userData))
+{
+ //walk(userData, ob, md, ""); /* re-enable when possible */
+}
+
+ModifierTypeInfo modifierType_DynamicPaint = {
+ /* name */ "Dynamic Paint",
+ /* structName */ "DynamicPaintModifierData",
+ /* structSize */ sizeof(DynamicPaintModifierData),
+ /* type */ eModifierTypeType_Constructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_UsesPointCache
+ | eModifierTypeFlag_Single,
+
+ /* copyData */ copyData,
+ /* deformVerts */ 0,
+ /* deformMatrices */ 0,
+ /* deformVertsEM */ 0,
+ /* deformMatricesEM */ 0,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ 0,
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ freeData,
+ /* isDisabled */ 0,
+ /* updateDepgraph */ updateDepgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
+ /* foreachObjectLink */ 0,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ foreachTexLink,
+};
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index 939ce123613..a4097d8967b 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -1029,12 +1029,17 @@ static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
vert2 = smoothvert_copy(vert, mesh);
- /* replace vert with its copy in visited_faces (must be done after
- * edge replacement so edges have correct vertices)
- */
- repdata.find = vert;
- repdata.replace = vert2;
- BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
+ /* bug [#29205] which is caused by exactly the same reason as [#26316]
+ this check will only prevent crash without fixing actual issue and
+ some vertices can stay unsplitted when they should (sergey) */
+ if(vert2) {
+ /* replace vert with its copy in visited_faces (must be done after
+ * edge replacement so edges have correct vertices)
+ */
+ repdata.find = vert;
+ repdata.replace = vert2;
+ BLI_linklist_apply(visited_faces, face_replace_vert, &repdata);
+ }
/* copying and replacing is done; the mesh should be consistent.
* now propagate the split to the vertex at the other end
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index ad1a636589f..30e801c9b42 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -170,7 +170,7 @@ static void deformVerts(ModifierData *md, Object *ob,
}
invert_m4_m4(ob->imat, ob->obmat);
mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv,
- NULL, NULL, NULL, NULL, NULL);
+ NULL, NULL, NULL, NULL, NULL);
modifier_get_vgroup(ob, dm, hmd->name, &dvert, &defgrp_index);
max_dvert = (dvert)? numVerts: 0;
diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c
index 9ef5e501aca..4d5c63986a5 100644
--- a/source/blender/modifiers/intern/MOD_lattice.c
+++ b/source/blender/modifiers/intern/MOD_lattice.c
@@ -98,7 +98,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
DagNode *latNode = dag_get_node(forest, lmd->object);
dag_add_relation(forest, latNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Lattice Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Lattice Modifier");
}
}
@@ -115,7 +115,7 @@ static void deformVerts(ModifierData *md, Object *ob,
modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
lattice_deform_verts(lmd->object, ob, derivedData,
- vertexCos, numVerts, lmd->name);
+ vertexCos, numVerts, lmd->name);
}
static void deformVertsEM(
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index b36850da786..2e744337b97 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -91,7 +91,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
DagNode *latNode = dag_get_node(forest, mmd->mirror_ob);
dag_add_relation(forest, latNode, obNode,
- DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mirror Modifier");
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Mirror Modifier");
}
}
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index edd16c045f6..2eaa142db47 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -225,7 +225,7 @@ static void deformVerts(
DerivedMesh *dm= get_dm(ob, NULL, derivedData, NULL, 0);
smoothModifier_do((SmoothModifierData *)md, ob, dm,
- vertexCos, numVerts);
+ vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
@@ -238,7 +238,7 @@ static void deformVertsEM(
DerivedMesh *dm= get_dm(ob, editData, derivedData, NULL, 0);
smoothModifier_do((SmoothModifierData *)md, ob, dm,
- vertexCos, numVerts);
+ vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index b7883eea4d8..38abb96aa7c 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -105,7 +105,7 @@ void get_texture_coords(MappingInfoModifierData *dmd, Object *ob,
char uvname[32];
MTFace *tf;
- validate_layer_name(&dm->faceData, CD_MTFACE, dmd->uvlayer_name, uvname);
+ CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, dmd->uvlayer_name, uvname);
tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname);
/* verts are given the UV from the first face that uses them */
@@ -176,25 +176,6 @@ void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3])
/* lattice/mesh modifier too */
}
-void validate_layer_name(const CustomData *data, int type, char *name, char *outname)
-{
- int index = -1;
-
- /* if a layer name was given, try to find that layer */
- if(name[0])
- index = CustomData_get_named_layer_index(data, type, name);
-
- if(index < 0) {
- /* either no layer was specified, or the layer we want has been
- * deleted, so assign the active layer to name
- */
- index = CustomData_get_active_layer_index(data, type);
- strcpy(outname, data->layers[index].name);
- }
- else
- strcpy(outname, name);
-}
-
/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */
DerivedMesh *get_cddm(Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3])
{
@@ -296,5 +277,6 @@ void modifier_type_init(ModifierTypeInfo *types[])
INIT_TYPE(WeightVGEdit);
INIT_TYPE(WeightVGMix);
INIT_TYPE(WeightVGProximity);
+ INIT_TYPE(DynamicPaint);
#undef INIT_TYPE
}
diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h
index 4de767358e4..262f27f0f1b 100644
--- a/source/blender/modifiers/intern/MOD_util.h
+++ b/source/blender/modifiers/intern/MOD_util.h
@@ -47,7 +47,6 @@ struct TexResult;
void get_texture_value(struct Tex *texture, float *tex_co, struct TexResult *texres);
void get_texture_coords(struct MappingInfoModifierData *dmd, struct Object *ob, struct DerivedMesh *dm, float (*co)[3], float (*texco)[3], int numVerts);
void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]);
-void validate_layer_name(const struct CustomData *data, int type, char *name, char *outname);
struct DerivedMesh *get_cddm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]);
struct DerivedMesh *get_dm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco);
void modifier_get_vgroup(struct Object *ob, struct DerivedMesh *dm, const char *name, struct MDeformVert **dvert, int *defgrp_index);
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index d5dd0078a80..df528a0cb11 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -174,7 +174,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
if(!CustomData_has_layer(&dm->faceData, CD_MTFACE)) return dm;
/* make sure we're using an existing layer */
- validate_layer_name(&dm->faceData, CD_MTFACE, umd->uvlayer_name, uvname);
+ CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, umd->uvlayer_name, uvname);
/* calculate a projection matrix and normal for each projector */
for(i = 0; i < num_projectors; ++i) {
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index 6aac7077447..80dd0c0a720 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -196,7 +196,7 @@ static void wavemod_get_texture_coords(WaveModifierData *wmd, Object *ob,
char uvname[32];
MTFace *tf;
- validate_layer_name(&dm->faceData, CD_MTFACE, wmd->uvlayer_name, uvname);
+ CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, wmd->uvlayer_name, uvname);
tf = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname);
/* verts are given the UV from the first face that uses them */
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 69e7f9cac6b..1b327edbc9f 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -25,6 +25,7 @@
set(INC
.
+ ../blenfont
../blenkernel
../blenlib
../blenloader
@@ -128,6 +129,38 @@ set(SRC
shader/nodes/node_shader_valToRgb.c
shader/nodes/node_shader_value.c
shader/nodes/node_shader_vectMath.c
+ shader/nodes/node_shader_attribute.c
+ shader/nodes/node_shader_background.c
+ # shader/nodes/node_shader_bsdf_anisotropic.c # XXX, why not included?
+ shader/nodes/node_shader_bsdf_diffuse.c
+ shader/nodes/node_shader_bsdf_glossy.c
+ shader/nodes/node_shader_bsdf_glass.c
+ shader/nodes/node_shader_bsdf_translucent.c
+ shader/nodes/node_shader_bsdf_transparent.c
+ shader/nodes/node_shader_bsdf_velvet.c
+ shader/nodes/node_shader_emission.c
+ shader/nodes/node_shader_fresnel.c
+ shader/nodes/node_shader_layer_weight.c
+ shader/nodes/node_shader_geometry.c
+ shader/nodes/node_shader_holdout.c
+ shader/nodes/node_shader_volume_transparent.c
+ shader/nodes/node_shader_volume_isotropic.c
+ shader/nodes/node_shader_light_path.c
+ shader/nodes/node_shader_mix_shader.c
+ shader/nodes/node_shader_add_shader.c
+ shader/nodes/node_shader_output_lamp.c
+ shader/nodes/node_shader_output_material.c
+ shader/nodes/node_shader_output_world.c
+ shader/nodes/node_shader_tex_gradient.c
+ shader/nodes/node_shader_tex_coord.c
+ shader/nodes/node_shader_tex_environment.c
+ shader/nodes/node_shader_tex_image.c
+ shader/nodes/node_shader_tex_magic.c
+ shader/nodes/node_shader_tex_musgrave.c
+ shader/nodes/node_shader_tex_noise.c
+ shader/nodes/node_shader_tex_sky.c
+ shader/nodes/node_shader_tex_voronoi.c
+ shader/nodes/node_shader_tex_wave.c
shader/node_shader_tree.c
shader/node_shader_util.c
diff --git a/source/blender/nodes/NOD_composite.h b/source/blender/nodes/NOD_composite.h
index f1415a8c8f0..6deea004417 100644
--- a/source/blender/nodes/NOD_composite.h
+++ b/source/blender/nodes/NOD_composite.h
@@ -1,21 +1,21 @@
/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
- * This program is free software(ListBase *lb); you can redistribute it and/or
+ * 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(ListBase *lb); either version 2
+ * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY(ListBase *lb); without even the implied warranty of
+ * 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(ListBase *lb); if not, write to the Free Software Foundation,
+ * 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.
diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h
index 83352698e38..996660fcb8b 100644
--- a/source/blender/nodes/NOD_shader.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -71,6 +71,41 @@ void register_node_type_sh_seprgb(ListBase *lb);
void register_node_type_sh_combrgb(ListBase *lb);
void register_node_type_sh_hue_sat(ListBase *lb);
+void register_node_type_sh_attribute(ListBase *lb);
+void register_node_type_sh_geometry(ListBase *lb);
+void register_node_type_sh_light_path(ListBase *lb);
+void register_node_type_sh_fresnel(ListBase *lb);
+void register_node_type_sh_layer_weight(ListBase *lb);
+void register_node_type_sh_tex_coord(ListBase *lb);
+
+void register_node_type_sh_background(ListBase *lb);
+void register_node_type_sh_bsdf_diffuse(ListBase *lb);
+void register_node_type_sh_bsdf_glossy(ListBase *lb);
+void register_node_type_sh_bsdf_glass(ListBase *lb);
+void register_node_type_sh_bsdf_translucent(ListBase *lb);
+void register_node_type_sh_bsdf_transparent(ListBase *lb);
+void register_node_type_sh_bsdf_velvet(ListBase *lb);
+void register_node_type_sh_emission(ListBase *lb);
+void register_node_type_sh_holdout(ListBase *lb);
+void register_node_type_sh_volume_transparent(ListBase *lb);
+void register_node_type_sh_volume_isotropic(ListBase *lb);
+void register_node_type_sh_mix_shader(ListBase *lb);
+void register_node_type_sh_add_shader(ListBase *lb);
+
+void register_node_type_sh_output_lamp(ListBase *lb);
+void register_node_type_sh_output_material(ListBase *lb);
+void register_node_type_sh_output_world(ListBase *lb);
+
+void register_node_type_sh_tex_image(ListBase *lb);
+void register_node_type_sh_tex_environment(ListBase *lb);
+void register_node_type_sh_tex_sky(ListBase *lb);
+void register_node_type_sh_tex_voronoi(ListBase *lb);
+void register_node_type_sh_tex_gradient(ListBase *lb);
+void register_node_type_sh_tex_magic(ListBase *lb);
+void register_node_type_sh_tex_wave(ListBase *lb);
+void register_node_type_sh_tex_musgrave(ListBase *lb);
+void register_node_type_sh_tex_noise(ListBase *lb);
+
#endif
diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript
index 0cbc7b80933..d7dbed51282 100644
--- a/source/blender/nodes/SConscript
+++ b/source/blender/nodes/SConscript
@@ -11,7 +11,7 @@ incs += '#/intern/guardedalloc ../editors/include ../blenlib ../makesdna'
incs += ' ../render/extern/include ../makesrna '
incs += ' ../imbuf ../avi '
incs += ' ../blenloader'
-incs += ' ../blenkernel ../renderconverter '
+incs += ' ../blenfont ../blenkernel ../renderconverter '
incs += ' ../gpu #/extern/glew/include '
incs += ' ' + env['BF_OPENGL_INC']
diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c
index 06f88002a70..1a1d744fb1b 100644
--- a/source/blender/nodes/composite/node_composite_tree.c
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -39,6 +39,8 @@
#include "BLI_listbase.h"
#include "BLI_threads.h"
+#include "BLF_translation.h"
+
#include "BKE_animsys.h"
#include "BKE_colortools.h"
#include "BKE_fcurve.h"
@@ -70,16 +72,16 @@ static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
static void foreach_nodeclass(Scene *UNUSED(scene), void *calldata, bNodeClassCallback func)
{
- func(calldata, NODE_CLASS_INPUT, "Input");
- func(calldata, NODE_CLASS_OUTPUT, "Output");
- func(calldata, NODE_CLASS_OP_COLOR, "Color");
- func(calldata, NODE_CLASS_OP_VECTOR, "Vector");
- func(calldata, NODE_CLASS_OP_FILTER, "Filter");
- func(calldata, NODE_CLASS_CONVERTOR, "Convertor");
- func(calldata, NODE_CLASS_MATTE, "Matte");
- func(calldata, NODE_CLASS_DISTORT, "Distort");
- func(calldata, NODE_CLASS_GROUP, "Group");
- func(calldata, NODE_CLASS_LAYOUT, "Layout");
+ func(calldata, NODE_CLASS_INPUT, IFACE_("Input"));
+ func(calldata, NODE_CLASS_OUTPUT, IFACE_("Output"));
+ func(calldata, NODE_CLASS_OP_COLOR, IFACE_("Color"));
+ func(calldata, NODE_CLASS_OP_VECTOR, IFACE_("Vector"));
+ func(calldata, NODE_CLASS_OP_FILTER, IFACE_("Filter"));
+ func(calldata, NODE_CLASS_CONVERTOR, IFACE_("Convertor"));
+ func(calldata, NODE_CLASS_MATTE, IFACE_("Matte"));
+ func(calldata, NODE_CLASS_DISTORT, IFACE_("Distort"));
+ func(calldata, NODE_CLASS_GROUP, IFACE_("Group"));
+ func(calldata, NODE_CLASS_LAYOUT, IFACE_("Layout"));
}
static void free_node_cache(bNodeTree *UNUSED(ntree), bNode *node)
@@ -601,7 +603,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
if(nodeexec) {
node = nodeexec->node;
if(ntree->progress && totnode)
- ntree->progress(ntree->prh, (1.0 - curnode/(float)totnode));
+ ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode));
if(ntree->stats_draw) {
char str[64];
sprintf(str, "Compositing %d %s", curnode, node->name);
diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c
index 0356ed394f1..ddd55790436 100644
--- a/source/blender/nodes/composite/node_composite_util.c
+++ b/source/blender/nodes/composite/node_composite_util.c
@@ -762,7 +762,7 @@ void premul_compbuf(CompBuf *img, int inversed)
drect= img->rect;
if(inversed) {
for(x=img->x*img->y; x>0; x--, drect+=4) {
- if(fabs(drect[3]) < 1e-5f) {
+ if(fabsf(drect[3]) < 1e-5f) {
drect[0]= 0.0f;
drect[1]= 0.0f;
drect[2]= 0.0f;
@@ -1314,7 +1314,7 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
int i, x, y, sz;
// <0.5 not valid, though can have a possibly useful sort of sharpening effect
- if (sigma < 0.5) return;
+ if (sigma < 0.5f) return;
if ((xy < 1) || (xy > 3)) xy = 3;
@@ -1326,10 +1326,10 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
// see "Recursive Gabor Filtering" by Young/VanVliet
// all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200
- if (sigma >= 3.556)
- q = 0.9804*(sigma - 3.556) + 2.5091;
+ if (sigma >= 3.556f)
+ q = 0.9804f*(sigma - 3.556f) + 2.5091f;
else // sigma >= 0.5
- q = (0.0561*sigma + 0.5784)*sigma - 0.2568;
+ q = (0.0561f*sigma + 0.5784f)*sigma - 0.2568f;
q2 = q*q;
sc = (1.1668 + q)*(3.203729649 + (2.21566 + q)*q);
// no gabor filtering here, so no complex multiplies, just the regular coefs.
diff --git a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
index 17038fd6780..0f341335783 100644
--- a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
@@ -62,13 +62,14 @@ static bNodeSocketTemplate cmp_node_bilateralblur_out[]= {
#define KERNEL_ELEMENT_C3(k) \
temp_color = src + deltas[k]; \
ref_color = ref + deltas[k]; \
- w = weight_tab[k] + COLOR_DISTANCE_C3(ref, ref_color )*i2sigma_color; \
+ w = weight_tab[k] + \
+ (double)COLOR_DISTANCE_C3(ref, ref_color ) * i2sigma_color; \
w = 1.0/(w*w + 1); \
mean0 += w; \
- mean1[0] += temp_color[0]*w; \
- mean1[1] += temp_color[1]*w; \
- mean1[2] += temp_color[2]*w; \
- mean1[3] += temp_color[3]*w;
+ mean1[0] += (double)temp_color[0]*w; \
+ mean1[1] += (double)temp_color[1]*w; \
+ mean1[2] += (double)temp_color[2]*w; \
+ mean1[3] += (double)temp_color[3]*w;
/* write blurred values to image */
#define UPDATE_OUTPUT_C3 \
@@ -137,8 +138,8 @@ static void node_composit_exec_bilateralblur(void *UNUSED(data), bNode *node, bN
sigma_color= nbbd->sigma_color;
sigma_space= nbbd->sigma_space;
- i2sigma_color= 1. / (sigma_color * sigma_color);
- i2sigma_space= 1. / (sigma_space * sigma_space);
+ i2sigma_color= 1.0f / (sigma_color * sigma_color);
+ i2sigma_space= 1.0f / (sigma_space * sigma_space);
INIT_3X3_DELTAS(deltas, step, pix);
diff --git a/source/blender/nodes/composite/nodes/node_composite_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c
index d0ddfb47f08..816aacbe61c 100644
--- a/source/blender/nodes/composite/nodes/node_composite_blur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_blur.c
@@ -77,7 +77,7 @@ static float *make_bloomtab(int rad)
bloomtab = (float *) MEM_mallocN(n * sizeof(float), "bloom");
for (i = -rad; i <= rad; i++) {
- val = pow(1.0 - fabs((float)i)/((float)rad), 4.0);
+ val = powf(1.0f - fabsf((float)i)/((float)rad), 4.0f);
bloomtab[i+rad] = val;
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
index 10f0afb6cf6..6597ceaeee2 100644
--- a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
@@ -49,18 +49,18 @@ static void do_normalized_rgba_to_ycca2(bNode *UNUSED(node), float *out, float *
{
/*normalize to the range 0.0 to 1.0) */
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
- out[0]=(out[0])/255.0;
- out[1]=(out[1])/255.0;
- out[2]=(out[2])/255.0;
+ out[0]=(out[0])/255.0f;
+ out[1]=(out[1])/255.0f;
+ out[2]=(out[2])/255.0f;
out[3]=in[3];
}
static void do_normalized_ycca_to_rgba2(bNode *UNUSED(node), float *out, float *in)
{
/*un-normalize the normalize from above */
- in[0]=in[0]*255.0;
- in[1]=in[1]*255.0;
- in[2]=in[2]*255.0;
+ in[0]=in[0]*255.0f;
+ in[1]=in[1]*255.0f;
+ in[2]=in[2]*255.0f;
ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
out[3]=in[3];
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
index 25891aeaa68..9aadfdf363b 100644
--- a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
@@ -50,14 +50,14 @@ static void do_rgba_to_ycca_normalized(bNode *UNUSED(node), float *out, float *i
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
//normalize to 0..1.0
- out[0]=out[0]/255.0;
- out[1]=out[1]/255.0;
- out[2]=out[2]/255.0;
+ out[0]=out[0]/255.0f;
+ out[1]=out[1]/255.0f;
+ out[2]=out[2]/255.0f;
//rescale to -1.0..1.0
- out[0]=(out[0]*2.0)-1.0;
- out[1]=(out[1]*2.0)-1.0;
- out[2]=(out[2]*2.0)-1.0;
+ out[0]=(out[0]*2.0f)-1.0f;
+ out[1]=(out[1]*2.0f)-1.0f;
+ out[2]=(out[2]*2.0f)-1.0f;
// out[0]=((out[0])-16)/255.0;
// out[1]=((out[1])-128)/255.0;
@@ -68,13 +68,13 @@ static void do_rgba_to_ycca_normalized(bNode *UNUSED(node), float *out, float *i
static void do_ycca_to_rgba_normalized(bNode *UNUSED(node), float *out, float *in)
{
/*un-normalize the normalize from above */
- in[0]=(in[0]+1.0)/2.0;
- in[1]=(in[1]+1.0)/2.0;
- in[2]=(in[2]+1.0)/2.0;
+ in[0]=(in[0]+1.0f)/2.0f;
+ in[1]=(in[1]+1.0f)/2.0f;
+ in[2]=(in[2]+1.0f)/2.0f;
- in[0]=(in[0]*255.0);
- in[1]=(in[1]*255.0);
- in[2]=(in[2]*255.0);
+ in[0]=(in[0]*255.0f);
+ in[1]=(in[1]*255.0f);
+ in[2]=(in[2]*255.0f);
// in[0]=(in[0]*255.0)+16;
// in[1]=(in[1]*255.0)+128;
@@ -98,27 +98,27 @@ static void do_chroma_key(bNode *node, float *out, float *in)
theta=atan2(c->key[2], c->key[1]);
/*rotate the cb and cr into x/z space */
- x=in[1]*cos(theta)+in[2]*sin(theta);
- z=in[2]*cos(theta)-in[1]*sin(theta);
+ x=in[1]*cosf(theta)+in[2]*sinf(theta);
+ z=in[2]*cosf(theta)-in[1]*sinf(theta);
/*if within the acceptance angle */
- angle=c->t1*M_PI/180.0; /* convert to radians */
+ angle=c->t1*(float)M_PI/180.0f; /* convert to radians */
/* if kfg is <0 then the pixel is outside of the key color */
- kfg=x-(fabs(z)/tan(angle/2.0));
+ kfg= x-(fabsf(z)/tanf(angle/2.0f));
out[0]=in[0];
out[1]=in[1];
out[2]=in[2];
- if(kfg>0.0) { /* found a pixel that is within key color */
- alpha=(1.0-kfg)*(c->fstrength);
+ if(kfg>0.0f) { /* found a pixel that is within key color */
+ alpha=(1.0f-kfg)*(c->fstrength);
beta=atan2(z,x);
- angle2=c->t2*M_PI/180.0;
+ angle2=c->t2*(float)(M_PI/180.0);
/* if beta is within the cutoff angle */
- if(fabs(beta)<(angle2/2.0)) {
+ if(fabsf(beta) < (angle2/2.0f)) {
alpha=0.0;
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
index b226e562799..66dc9ff0304 100644
--- a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
@@ -57,13 +57,13 @@ static void do_color_key(bNode *node, float *out, float *in)
if(
/* do hue last because it needs to wrap, and does some more checks */
- /* sat */ (fabs(in[1]-c->key[1]) < c->t2) &&
- /* val */ (fabs(in[2]-c->key[2]) < c->t3) &&
+ /* sat */ (fabsf(in[1]-c->key[1]) < c->t2) &&
+ /* val */ (fabsf(in[2]-c->key[2]) < c->t3) &&
/* multiply by 2 because it wraps on both sides of the hue,
* otherwise 0.5 would key all hue's */
- /* hue */ ((h_wrap= 2.0f * fabs(in[0]-c->key[0])) < c->t1 || (2.0f - h_wrap) < c->t1)
+ /* hue */ ((h_wrap= 2.0f * fabsf(in[0]-c->key[0])) < c->t1 || (2.0f - h_wrap) < c->t1)
) {
out[3]=0.0; /*make transparent*/
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
index eb75802c0a6..f7de5801a5e 100644
--- a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
@@ -61,7 +61,7 @@ DO_INLINE float colorbalance_cdl(float in, float offset, float power, float slop
float x = in * slope + offset;
/* prevent NaN */
- CLAMP(x, 0.0, 1.0);
+ CLAMP(x, 0.0f, 1.0f);
return powf(x, power);
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_curves.c b/source/blender/nodes/composite/nodes/node_composite_curves.c
index 6f4d32f6573..2e54836e042 100644
--- a/source/blender/nodes/composite/nodes/node_composite_curves.c
+++ b/source/blender/nodes/composite/nodes/node_composite_curves.c
@@ -141,9 +141,9 @@ static void do_curves(bNode *node, float *out, float *in)
static void do_curves_fac(bNode *node, float *out, float *in, float *fac)
{
- if(*fac>=1.0)
+ if(*fac >= 1.0f)
curvemapping_evaluate_premulRGBF(node->storage, out, in);
- else if(*fac<=0.0) {
+ else if(*fac <= 0.0f) {
copy_v3_v3(out, in);
}
else {
@@ -175,7 +175,7 @@ static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeS
curvemapping_set_black_white(node->storage, in[2]->vec, in[3]->vec);
- if(in[0]->data==NULL && in[0]->vec[0] == 1.0)
+ if(in[0]->data==NULL && in[0]->vec[0] == 1.0f)
composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_curves, CB_RGBA);
else
composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_curves_fac, CB_RGBA, CB_VAL);
diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c
index 2232c4a489e..9b32e0f6f3f 100644
--- a/source/blender/nodes/composite/nodes/node_composite_defocus.c
+++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c
@@ -58,8 +58,8 @@ typedef struct BokehCoeffs {
static void makeBokeh(char bktype, char ro, int* len_bkh, float* inradsq, BokehCoeffs BKH[8], float bkh_b[4])
{
float x0, x1, y0, y1, dx, dy, iDxy;
- float w = MAX2(1e-5f, ro)*M_PI/180.f; // never reported stangely enough, but a zero offset causes missing center line...
- float wi = (360.f/bktype)*M_PI/180.f;
+ float w = MAX2(1e-5f, ro)*(float)(M_PI/180); // never reported stangely enough, but a zero offset causes missing center line...
+ float wi = (360.f/bktype)*(float)(M_PI/180);
int i, ov, nv;
// bktype must be at least 3 & <= 8
@@ -81,7 +81,7 @@ static void makeBokeh(char bktype, char ro, int* len_bkh, float* inradsq, BokehC
BKH[i].x0 = x0;
BKH[i].y0 = y0;
dx = x1-x0, dy = y1-y0;
- iDxy = 1.f / sqrt(dx*dx + dy*dy);
+ iDxy = 1.f / sqrtf(dx*dx + dy*dy);
dx *= iDxy;
dy *= iDxy;
BKH[i].dx = dx;
@@ -146,6 +146,7 @@ static float RI_vdC(unsigned int bits, unsigned int r)
// single channel IIR gaussian filtering
// much faster than anything else, constant time independent of width
// should extend to multichannel and make this a node, could be useful
+// note: this is an almost exact copy of 'IIR_gauss'
static void IIR_gauss_single(CompBuf* buf, float sigma)
{
double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3];
@@ -156,14 +157,14 @@ static void IIR_gauss_single(CompBuf* buf, float sigma)
if (buf->type != CB_VAL) return;
// <0.5 not valid, though can have a possibly useful sort of sharpening effect
- if (sigma < 0.5) return;
+ if (sigma < 0.5f) return;
// see "Recursive Gabor Filtering" by Young/VanVliet
// all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200
- if (sigma >= 3.556)
- q = 0.9804*(sigma - 3.556) + 2.5091;
+ if (sigma >= 3.556f)
+ q = 0.9804f*(sigma - 3.556f) + 2.5091f;
else // sigma >= 0.5
- q = (0.0561*sigma + 0.5784)*sigma - 0.2568;
+ q = (0.0561f*sigma + 0.5784f)*sigma - 0.2568f;
q2 = q*q;
sc = (1.1668 + q)*(3.203729649 + (2.21566 + q)*q);
// no gabor filtering here, so no complex multiplies, just the regular coefs.
@@ -260,7 +261,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
Camera* cam = (Camera*)camob->data;
cam_lens = cam->lens;
cam_fdist = dof_camera(camob);
- if (cam_fdist==0.0) cam_fdist = 1e10f; /* if the dof is 0.0 then set it be be far away */
+ if (cam_fdist==0.0f) cam_fdist = 1e10f; /* if the dof is 0.0 then set it be be far away */
cam_invfdist = 1.f/cam_fdist;
}
@@ -362,7 +363,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
// scale crad back to original maximum and blend
crad->rect[px] = bcrad + wts->rect[px]*(scf*crad->rect[px] - bcrad);
*/
- crad->rect[px] = 0.5f*fabs(aperture*(dof_sp*(cam_invfdist - iZ) - 1.f));
+ crad->rect[px] = 0.5f*fabsf(aperture*(dof_sp*(cam_invfdist - iZ) - 1.f));
// 'bug' #6615, limit minimum radius to 1 pixel, not really a solution, but somewhat mitigates the problem
crad->rect[px] = MAX2(crad->rect[px], 0.5f);
@@ -530,12 +531,13 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
}\
}\
}
+
i = ceil(ct_crad);
j = 0;
T = 0;
while (i > j) {
Dj = sqrt(cR2 - j*j);
- Dj -= floor(Dj);
+ Dj -= floorf(Dj);
di = 0;
if (Dj > T) { i--; di = 1; }
T = Dj;
@@ -548,26 +550,26 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
lwt = wt*Dj;
if (i!=j) {
// outer pixels
- AAPIX(x+j, y+i);
- AAPIX(x+j, y-i);
+ AAPIX(x+j, y+i)
+ AAPIX(x+j, y-i)
if (j) {
- AAPIX(x-j, y+i); // BL
- AAPIX(x-j, y-i); // TL
+ AAPIX(x-j, y+i) // BL
+ AAPIX(x-j, y-i) // TL
}
if (di) { // only when i changed, interior of outer section
- CSCAN(j, i); // bottom
- CSCAN(j, -i); // top
+ CSCAN(j, i) // bottom
+ CSCAN(j, -i) // top
}
}
// lower mid section
- AAPIX(x+i, y+j);
- if (i) AAPIX(x-i, y+j);
- CSCAN(i, j);
+ AAPIX(x+i, y+j)
+ if (i) AAPIX(x-i, y+j)
+ CSCAN(i, j)
// upper mid section
if (j) {
- AAPIX(x+i, y-j);
- if (i) AAPIX(x-i, y-j);
- CSCAN(i, -j);
+ AAPIX(x+i, y-j)
+ if (i) AAPIX(x-i, y-j)
+ CSCAN(i, -j)
}
j++;
}
@@ -600,7 +602,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
fxe = fxe*ct_crad + x;
xs = (int)floor(fxs), xe = (int)ceil(fxe);
// AA hack for first and last x pixel, near vertical edges only
- if (fabs(mind) <= 1.f) {
+ if (fabsf(mind) <= 1.f) {
if ((xs >= 0) && (xs < new->x)) {
lwt = 1.f-(fxs - xs);
aacol[0] = wtcol[0]*lwt;
@@ -619,7 +621,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
}
}
}
- if (fabs(maxd) <= 1.f) {
+ if (fabsf(maxd) <= 1.f) {
if ((xe >= 0) && (xe < new->x)) {
lwt = 1.f-(xe - fxe);
aacol[0] = wtcol[0]*lwt;
@@ -676,7 +678,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
fys = fys*ct_crad + y;
fye = fye*ct_crad + y;
// near horizontal edges only, line slope <= 1
- if (fabs(mind) <= 1.f) {
+ if (fabsf(mind) <= 1.f) {
int iys = (int)floor(fys);
if ((iys >= 0) && (iys < new->y)) {
lwt = 1.f - (fys - iys);
@@ -696,7 +698,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
}
}
}
- if (fabs(maxd) <= 1.f) {
+ if (fabsf(maxd) <= 1.f) {
int iye = ceil(fye);
if ((iye >= 0) && (iye < new->y)) {
lwt = 1.f - (iye - fye);
diff --git a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
index 17156ab3492..3b2a2342167 100644
--- a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
@@ -53,12 +53,12 @@ static void do_diff_matte(bNode *node, float *outColor, float *inColor1, float *
float difference;
float alpha;
- difference= fabs(inColor2[0]-inColor1[0])+
- fabs(inColor2[1]-inColor1[1])+
- fabs(inColor2[2]-inColor1[2]);
+ difference= fabs(inColor2[0]-inColor1[0]) +
+ fabs(inColor2[1]-inColor1[1]) +
+ fabs(inColor2[2]-inColor1[2]);
/*average together the distances*/
- difference=difference/3.0;
+ difference=difference/3.0f;
copy_v3_v3(outColor, inColor1);
diff --git a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
index 591870d0911..802ef2d8e12 100644
--- a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
@@ -48,7 +48,7 @@ static CompBuf *dblur(bNode *node, CompBuf *img, int iterations, int wrap,
if ((dist != 0.f) || (spin != 0.f) || (zoom != 0.f)) {
void (*getpix)(CompBuf*, float, float, float*) = wrap ? qd_getPixelLerpWrap : qd_getPixelLerp;
const float a= angle * (float)M_PI / 180.f;
- const float itsc= 1.f / pow(2.f, (float)iterations);
+ const float itsc= 1.f / powf(2.f, (float)iterations);
float D;
float center_x_pix, center_y_pix;
float tx, ty;
@@ -62,14 +62,14 @@ static CompBuf *dblur(bNode *node, CompBuf *img, int iterations, int wrap,
center_x_pix= center_x * img->x;
center_y_pix= center_y * img->y;
- tx= itsc * D * cos(a);
- ty= -itsc * D * sin(a);
+ tx= itsc * D * cosf(a);
+ ty= -itsc * D * sinf(a);
sc= itsc * zoom;
rot= itsc * spin * (float)M_PI / 180.f;
/* blur the image */
for(i= 0; i < iterations; ++i) {
- const float cs= cos(rot), ss= sin(rot);
+ const float cs= cosf(rot), ss= sinf(rot);
const float isc= 1.f / (1.f + sc);
unsigned int x, y;
float col[4]= {0,0,0,0};
diff --git a/source/blender/nodes/composite/nodes/node_composite_displace.c b/source/blender/nodes/composite/nodes/node_composite_displace.c
index 02a1d203bef..a55a6093f12 100644
--- a/source/blender/nodes/composite/nodes/node_composite_displace.c
+++ b/source/blender/nodes/composite/nodes/node_composite_displace.c
@@ -49,7 +49,7 @@ static bNodeSocketTemplate cmp_node_displace_out[]= {
/* minimum distance (in pixels) a pixel has to be displaced
* in order to take effect */
-#define DISPLACE_EPSILON 0.01
+#define DISPLACE_EPSILON 0.01f
static void do_displace(bNode *node, CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *UNUSED(veccol), CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale)
{
diff --git a/source/blender/nodes/composite/nodes/node_composite_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c
index 2bb600db99d..ad377799dea 100644
--- a/source/blender/nodes/composite/nodes/node_composite_gamma.c
+++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c
@@ -50,7 +50,7 @@ static void do_gamma(bNode *UNUSED(node), float *out, float *in, float *fac)
int i=0;
for(i=0; i<3; i++) {
/* check for negative to avoid nan's */
- out[i] = (in[i] > 0.0f)? pow(in[i],fac[0]): in[i];
+ out[i] = (in[i] > 0.0f)? powf(in[i],fac[0]): in[i];
}
out[3] = in[3];
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_glare.c b/source/blender/nodes/composite/nodes/node_composite_glare.c
index f4391a1af77..b7cc1d3c92d 100644
--- a/source/blender/nodes/composite/nodes/node_composite_glare.c
+++ b/source/blender/nodes/composite/nodes/node_composite_glare.c
@@ -253,7 +253,7 @@ static void streaks(NodeGlare* ndg, CompBuf* dst, CompBuf* src)
const float p4 = pow(4.0, (double)n);
const float vxp = vx*p4, vyp = vy*p4;
const float wt = pow((double)ndg->fade, (double)p4);
- const float cmo = 1.f - pow((double)ndg->colmod, (double)n+1); // colormodulation amount relative to current pass
+ const float cmo = 1.f - (float)pow((double)ndg->colmod, (double)n+1); // colormodulation amount relative to current pass
float* tdstcol = tdst->rect;
for (y=0; y<tsrc->y; ++y) {
for (x=0; x<tsrc->x; ++x, tdstcol+=4) {
diff --git a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
index 3c73d07d96c..711560a0a94 100644
--- a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
+++ b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
@@ -48,12 +48,12 @@ static void do_hue_sat_fac(bNode *node, float *out, float *in, float *fac)
{
NodeHueSat *nhs= node->storage;
- if(*fac!=0.0f && (nhs->hue!=0.5f || nhs->sat!=1.0 || nhs->val!=1.0)) {
+ if(*fac!=0.0f && (nhs->hue!=0.5f || nhs->sat!=1.0f || nhs->val!=1.0f)) {
float col[3], hsv[3], mfac= 1.0f - *fac;
rgb_to_hsv(in[0], in[1], in[2], hsv, hsv+1, hsv+2);
hsv[0]+= (nhs->hue - 0.5f);
- if(hsv[0]>1.0) hsv[0]-=1.0; else if(hsv[0]<0.0) hsv[0]+= 1.0;
+ if(hsv[0]>1.0f) hsv[0]-=1.0f; else if(hsv[0]<0.0f) hsv[0]+= 1.0f;
hsv[1]*= nhs->sat;
hsv[2]*= nhs->val;
hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
diff --git a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
index f18eca3dfcc..acb70f13ec2 100644
--- a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
+++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
@@ -61,7 +61,7 @@ static void do_huecorrect(bNode *node, float *out, float *in)
f = curvemapping_evaluateF(node->storage, 2, hsv[0]);
hsv[2] *= (f * 2.f);
- hsv[0] = hsv[0] - floor(hsv[0]); /* mod 1.0 */
+ hsv[0] = hsv[0] - floorf(hsv[0]); /* mod 1.0 */
CLAMP(hsv[1], 0.f, 1.f);
/* convert back to rgb */
@@ -89,7 +89,7 @@ static void do_huecorrect_fac(bNode *node, float *out, float *in, float *fac)
f = curvemapping_evaluateF(node->storage, 2, hsv[0]);
hsv[2] *= (f * 2.f);
- hsv[0] = hsv[0] - floor(hsv[0]); /* mod 1.0 */
+ hsv[0] = hsv[0] - floorf(hsv[0]); /* mod 1.0 */
CLAMP(hsv[1], 0.f, 1.f);
/* convert back to rgb */
diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index 41427c42286..672d2af0646 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -358,41 +358,41 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in
static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty)
{
- if(out[RRES_OUT_Z]->hasoutput)
- out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_Z);
- if(out[RRES_OUT_VEC]->hasoutput)
- out[RRES_OUT_VEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_VECTOR);
- if(out[RRES_OUT_NORMAL]->hasoutput)
- out[RRES_OUT_NORMAL]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_NORMAL);
- if(out[RRES_OUT_UV]->hasoutput)
- out[RRES_OUT_UV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_UV);
-
- if(out[RRES_OUT_RGBA]->hasoutput)
- out[RRES_OUT_RGBA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RGBA);
- if(out[RRES_OUT_DIFF]->hasoutput)
- out[RRES_OUT_DIFF]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE);
- if(out[RRES_OUT_SPEC]->hasoutput)
- out[RRES_OUT_SPEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SPEC);
- if(out[RRES_OUT_SHADOW]->hasoutput)
- out[RRES_OUT_SHADOW]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SHADOW);
- if(out[RRES_OUT_AO]->hasoutput)
- out[RRES_OUT_AO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_AO);
- if(out[RRES_OUT_REFLECT]->hasoutput)
- out[RRES_OUT_REFLECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFLECT);
- if(out[RRES_OUT_REFRACT]->hasoutput)
- out[RRES_OUT_REFRACT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFRACT);
- if(out[RRES_OUT_INDIRECT]->hasoutput)
- out[RRES_OUT_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDIRECT);
- if(out[RRES_OUT_INDEXOB]->hasoutput)
- out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB);
+ if(out[RRES_OUT_Z]->hasoutput)
+ out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_Z);
+ if(out[RRES_OUT_VEC]->hasoutput)
+ out[RRES_OUT_VEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_VECTOR);
+ if(out[RRES_OUT_NORMAL]->hasoutput)
+ out[RRES_OUT_NORMAL]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_NORMAL);
+ if(out[RRES_OUT_UV]->hasoutput)
+ out[RRES_OUT_UV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_UV);
+
+ if(out[RRES_OUT_RGBA]->hasoutput)
+ out[RRES_OUT_RGBA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_RGBA);
+ if(out[RRES_OUT_DIFF]->hasoutput)
+ out[RRES_OUT_DIFF]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_DIFFUSE);
+ if(out[RRES_OUT_SPEC]->hasoutput)
+ out[RRES_OUT_SPEC]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SPEC);
+ if(out[RRES_OUT_SHADOW]->hasoutput)
+ out[RRES_OUT_SHADOW]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_SHADOW);
+ if(out[RRES_OUT_AO]->hasoutput)
+ out[RRES_OUT_AO]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_AO);
+ if(out[RRES_OUT_REFLECT]->hasoutput)
+ out[RRES_OUT_REFLECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFLECT);
+ if(out[RRES_OUT_REFRACT]->hasoutput)
+ out[RRES_OUT_REFRACT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_REFRACT);
+ if(out[RRES_OUT_INDIRECT]->hasoutput)
+ out[RRES_OUT_INDIRECT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDIRECT);
+ if(out[RRES_OUT_INDEXOB]->hasoutput)
+ out[RRES_OUT_INDEXOB]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXOB);
if(out[RRES_OUT_INDEXMA]->hasoutput)
out[RRES_OUT_INDEXMA]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_INDEXMA);
- if(out[RRES_OUT_MIST]->hasoutput)
- out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST);
- if(out[RRES_OUT_EMIT]->hasoutput)
- out[RRES_OUT_EMIT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_EMIT);
- if(out[RRES_OUT_ENV]->hasoutput)
- out[RRES_OUT_ENV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_ENVIRONMENT);
+ if(out[RRES_OUT_MIST]->hasoutput)
+ out[RRES_OUT_MIST]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_MIST);
+ if(out[RRES_OUT_EMIT]->hasoutput)
+ out[RRES_OUT_EMIT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_EMIT);
+ if(out[RRES_OUT_ENV]->hasoutput)
+ out[RRES_OUT_ENV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_ENVIRONMENT);
}
static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
diff --git a/source/blender/nodes/composite/nodes/node_composite_invert.c b/source/blender/nodes/composite/nodes/node_composite_invert.c
index daf2ee0cbe7..d98f5a1c64b 100644
--- a/source/blender/nodes/composite/nodes/node_composite_invert.c
+++ b/source/blender/nodes/composite/nodes/node_composite_invert.c
@@ -65,7 +65,7 @@ static void do_invert_fac(bNode *node, float *out, float *in, float *fac)
do_invert(node, col, in);
/* blend inverted result against original input with fac */
- facm = 1.0 - fac[0];
+ facm = 1.0f - fac[0];
if(node->custom1 & CMP_CHAN_RGB) {
col[0] = fac[0]*col[0] + (facm*in[0]);
diff --git a/source/blender/nodes/composite/nodes/node_composite_levels.c b/source/blender/nodes/composite/nodes/node_composite_levels.c
index 54e48bb749d..f3e4f0db8b6 100644
--- a/source/blender/nodes/composite/nodes/node_composite_levels.c
+++ b/source/blender/nodes/composite/nodes/node_composite_levels.c
@@ -63,7 +63,7 @@ static void fill_bins(bNode* node, CompBuf* in, int* bins)
/* get the pixel */
qd_getPixel(in, x, y, value);
- if(value[3] > 0.0) { /* don't count transparent pixels */
+ if(value[3] > 0.0f) { /* don't count transparent pixels */
switch(node->custom1) {
case 1: { /* all colors */
rgb_tobw(value[0],value[1],value[2], &value[0]);
@@ -120,7 +120,7 @@ static float brightness_mean(bNode* node, CompBuf* in)
/* get the pixel */
qd_getPixel(in, x, y, value);
- if(value[3] > 0.0) { /* don't count transparent pixels */
+ if(value[3] > 0.0f) { /* don't count transparent pixels */
numPixels++;
switch(node->custom1)
{
@@ -172,7 +172,7 @@ static float brightness_standard_deviation(bNode* node, CompBuf* in, float mean)
/* get the pixel */
qd_getPixel(in, x, y, value);
- if(value[3] > 0.0) { /* don't count transparent pixels */
+ if(value[3] > 0.0f) { /* don't count transparent pixels */
numPixels++;
switch(node->custom1)
{
@@ -233,7 +233,7 @@ static void draw_histogram(bNode *node, CompBuf *out, int* bins)
for(y=0;y<out->y; y++) {
/* get normalized value (0..255) */
- value=((float)bins[x]/(float)max)*255.0;
+ value=((float)bins[x]/(float)max)*255.0f;
if(y < (int)value) { /*if the y value is below the height of the bar for this line then draw with the color */
switch (node->custom1) {
diff --git a/source/blender/nodes/composite/nodes/node_composite_mapUV.c b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
index 5dc6d1c3aaa..b596f67a886 100644
--- a/source/blender/nodes/composite/nodes/node_composite_mapUV.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
@@ -73,40 +73,40 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr
/* adaptive sampling, red (U) channel */
/* prevent alpha zero UVs to be used */
- uv_l= uv[-1]!=0.0f? fabs(uv[0]-uv[-3]) : 0.0f;
- uv_r= uv[ 5]!=0.0f? fabs(uv[0]-uv[ 3]) : 0.0f;
+ uv_l= uv[-1]!=0.0f? fabsf(uv[0]-uv[-3]) : 0.0f;
+ uv_r= uv[ 5]!=0.0f? fabsf(uv[0]-uv[ 3]) : 0.0f;
//dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3]));
dx= 0.5f*(uv_l + uv_r);
- uv_l= uvprev[-1]!=0.0f? fabs(uv[0]-uvprev[-3]) : 0.0f;
- uv_r= uvnext[-1]!=0.0f? fabs(uv[0]-uvnext[-3]) : 0.0f;
+ uv_l= uvprev[-1]!=0.0f? fabsf(uv[0]-uvprev[-3]) : 0.0f;
+ uv_r= uvnext[-1]!=0.0f? fabsf(uv[0]-uvnext[-3]) : 0.0f;
//dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3]));
dx+= 0.25f*(uv_l + uv_r);
- uv_l= uvprev[ 5]!=0.0f? fabs(uv[0]-uvprev[+3]) : 0.0f;
- uv_r= uvnext[ 5]!=0.0f? fabs(uv[0]-uvnext[+3]) : 0.0f;
+ uv_l= uvprev[ 5]!=0.0f? fabsf(uv[0]-uvprev[+3]) : 0.0f;
+ uv_r= uvnext[ 5]!=0.0f? fabsf(uv[0]-uvnext[+3]) : 0.0f;
//dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3]));
dx+= 0.25f*(uv_l + uv_r);
/* adaptive sampling, green (V) channel */
- uv_l= uv[-row+2]!=0.0f? fabs(uv[1]-uv[-row+1]) : 0.0f;
- uv_r= uv[ row+2]!=0.0f? fabs(uv[1]-uv[ row+1]) : 0.0f;
+ uv_l= uv[-row+2]!=0.0f? fabsf(uv[1]-uv[-row+1]) : 0.0f;
+ uv_r= uv[ row+2]!=0.0f? fabsf(uv[1]-uv[ row+1]) : 0.0f;
//dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1]));
dy= 0.5f*(uv_l + uv_r);
- uv_l= uvprev[-1]!=0.0f? fabs(uv[1]-uvprev[+1-3]) : 0.0f;
- uv_r= uvnext[-1]!=0.0f? fabs(uv[1]-uvnext[+1-3]) : 0.0f;
+ uv_l= uvprev[-1]!=0.0f? fabsf(uv[1]-uvprev[+1-3]) : 0.0f;
+ uv_r= uvnext[-1]!=0.0f? fabsf(uv[1]-uvnext[+1-3]) : 0.0f;
//dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3]));
dy+= 0.25f*(uv_l + uv_r);
- uv_l= uvprev[ 5]!=0.0f? fabs(uv[1]-uvprev[+1+3]) : 0.0f;
- uv_r= uvnext[ 5]!=0.0f? fabs(uv[1]-uvnext[+1+3]) : 0.0f;
+ uv_l= uvprev[ 5]!=0.0f? fabsf(uv[1]-uvprev[+1+3]) : 0.0f;
+ uv_r= uvnext[ 5]!=0.0f? fabsf(uv[1]-uvnext[+1+3]) : 0.0f;
//dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3]));
dy+= 0.25f*(uv_l + uv_r);
diff --git a/source/blender/nodes/composite/nodes/node_composite_math.c b/source/blender/nodes/composite/nodes/node_composite_math.c
index a0e7beff1ab..27fdcfc1d4e 100644
--- a/source/blender/nodes/composite/nodes/node_composite_math.c
+++ b/source/blender/nodes/composite/nodes/node_composite_math.c
@@ -103,10 +103,10 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
} else {
float y_mod_1 = fmod(in2[0], 1);
/* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */
- if (y_mod_1 > 0.999 || y_mod_1 < 0.001) {
- out[0]= pow(in[0], floor(in2[0] + 0.5));
+ if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) {
+ out[0]= powf(in[0], floorf(in2[0] + 0.5f));
} else {
- out[0] = 0.0;
+ out[0] = 0.0f;
}
}
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
index 439616377a1..8411de39353 100644
--- a/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
+++ b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
@@ -45,7 +45,7 @@ static bNodeSocketTemplate cmp_node_moviedistortion_out[]= {
{ -1, 0, "" }
};
-static void exec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
if(in[0]->data) {
if(node->id) {
@@ -57,14 +57,18 @@ static void exec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **
ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
if(ibuf) {
+ RenderData *rd= data;
ImBuf *obuf;
MovieTracking *tracking= &clip->tracking;
int width, height;
float overscan= 0.0f;
+ MovieClipUser user= {0};
+
+ BKE_movieclip_user_set_frame(&user, rd->cfra);
ibuf->rect_float= cbuf->rect;
- BKE_movieclip_get_size(clip, NULL, &width, &height);
+ BKE_movieclip_get_size(clip, &user, &width, &height);
if(!node->storage)
node->storage= BKE_tracking_distortion_create();
diff --git a/source/blender/nodes/composite/nodes/node_composite_rotate.c b/source/blender/nodes/composite/nodes/node_composite_rotate.c
index 96712baf8b0..730c53a1a29 100644
--- a/source/blender/nodes/composite/nodes/node_composite_rotate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_rotate.c
@@ -58,7 +58,7 @@ static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStac
int x, y, yo, xo;
ImBuf *ibuf, *obuf;
- rad= (M_PI*in[1]->vec[0])/180.0f;
+ rad= ((float)M_PI*in[1]->vec[0])/180.0f;
s= sin(rad);
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
index 3b3d57bf442..7944176c5d3 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
@@ -53,9 +53,9 @@ static void do_sepycca_601(bNode *UNUSED(node), float *out, float *in)
rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT601);
/*divided by 255 to normalize for viewing in */
- out[0]= y/255.0;
- out[1]= cb/255.0;
- out[2]= cr/255.0;
+ out[0]= y/255.0f;
+ out[1]= cb/255.0f;
+ out[2]= cr/255.0f;
out[3]= in[3];
}
@@ -66,9 +66,9 @@ static void do_sepycca_709(bNode *UNUSED(node), float *out, float *in)
rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT709);
/*divided by 255 to normalize for viewing in */
- out[0]= y/255.0;
- out[1]= cb/255.0;
- out[2]= cr/255.0;
+ out[0]= y/255.0f;
+ out[1]= cb/255.0f;
+ out[2]= cr/255.0f;
out[3]= in[3];
}
@@ -79,9 +79,9 @@ static void do_sepycca_jfif(bNode *UNUSED(node), float *out, float *in)
rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_JFIF_0_255);
/*divided by 255 to normalize for viewing in */
- out[0]= y/255.0;
- out[1]= cb/255.0;
- out[2]= cr/255.0;
+ out[0]= y/255.0f;
+ out[1]= cb/255.0f;
+ out[2]= cr/255.0f;
out[3]= in[3];
}
@@ -106,9 +106,9 @@ static void node_composit_exec_sepycca(void *UNUSED(data), bNode *node, bNodeSta
}
/*divided by 255 to normalize for viewing in */
- out[0]->vec[0] = y/255.0;
- out[1]->vec[0] = cb/255.0;
- out[2]->vec[0] = cr/255.0;
+ out[0]->vec[0] = y/255.0f;
+ out[1]->vec[0] = cb/255.0f;
+ out[2]->vec[0] = cr/255.0f;
out[3]->vec[0] = in[0]->vec[3];
}
else if ((out[0]->hasoutput) || (out[1]->hasoutput) || (out[2]->hasoutput) || (out[3]->hasoutput)) {
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
index aa8ba12f799..6c7667c6729 100644
--- a/source/blender/nodes/shader/node_shader_tree.c
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -43,6 +43,8 @@
#include "BLI_threads.h"
#include "BLI_utildefines.h"
+#include "BLF_translation.h"
+
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_node.h"
@@ -78,19 +80,19 @@ static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
static void foreach_nodeclass(Scene *scene, void *calldata, bNodeClassCallback func)
{
- func(calldata, NODE_CLASS_INPUT, "Input");
- func(calldata, NODE_CLASS_OUTPUT, "Output");
+ func(calldata, NODE_CLASS_INPUT, IFACE_("Input"));
+ func(calldata, NODE_CLASS_OUTPUT, IFACE_("Output"));
if(scene_use_new_shading_nodes(scene)) {
- func(calldata, NODE_CLASS_SHADER, "Shader");
- func(calldata, NODE_CLASS_TEXTURE, "Texture");
+ func(calldata, NODE_CLASS_SHADER, IFACE_("Shader"));
+ func(calldata, NODE_CLASS_TEXTURE, IFACE_("Texture"));
}
- func(calldata, NODE_CLASS_OP_COLOR, "Color");
- func(calldata, NODE_CLASS_OP_VECTOR, "Vector");
- func(calldata, NODE_CLASS_CONVERTOR, "Convertor");
- func(calldata, NODE_CLASS_GROUP, "Group");
- func(calldata, NODE_CLASS_LAYOUT, "Layout");
+ func(calldata, NODE_CLASS_OP_COLOR, IFACE_("Color"));
+ func(calldata, NODE_CLASS_OP_VECTOR, IFACE_("Vector"));
+ func(calldata, NODE_CLASS_CONVERTOR, IFACE_("Convertor"));
+ func(calldata, NODE_CLASS_GROUP, IFACE_("Group"));
+ func(calldata, NODE_CLASS_LAYOUT, IFACE_("Layout"));
}
static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
@@ -233,7 +235,8 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
@note: preserve material from ShadeInput for material id, nodetree execs change it
fix for bug "[#28012] Mat ID messy with shader nodes"
*/
- Material *mat = shi->mat; bNodeThreadStack *nts = NULL;
+ Material *mat = shi->mat;
+ bNodeThreadStack *nts = NULL;
bNodeTreeExec *exec = ntree->execdata;
/* convert caller data to struct */
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c
index 0c86d8fd5e4..d601c205682 100644
--- a/source/blender/nodes/shader/node_shader_util.c
+++ b/source/blender/nodes/shader/node_shader_util.c
@@ -117,6 +117,8 @@ void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mo
*texco |= TEXCO_NORM|NEED_UV; break;
case GEOM_OUT_VCOL:
*texco |= NEED_UV; *mode |= MA_VERTEXCOL; break;
+ case GEOM_OUT_VCOL_ALPHA:
+ *texco |= NEED_UV; *mode |= MA_VERTEXCOL; break;
}
}
}
@@ -242,6 +244,29 @@ static void data_from_gpu_stack_list(ListBase *sockets, bNodeStack **ns, GPUNode
node_data_from_gpu_stack(ns[i], &gs[i]);
}
+bNode *nodeGetActiveTexture(bNodeTree *ntree)
+{
+ /* this is the node we texture paint and draw in textured draw */
+ bNode *node;
+
+ if(!ntree)
+ return NULL;
+
+ /* check for group edit */
+ for(node= ntree->nodes.first; node; node= node->next)
+ if(node->flag & NODE_GROUP_EDIT)
+ break;
+
+ if(node)
+ ntree= (bNodeTree*)node->id;
+
+ for(node= ntree->nodes.first; node; node= node->next)
+ if(node->flag & NODE_ACTIVE_TEXTURE)
+ return node;
+
+ return NULL;
+}
+
void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs)
{
bNodeExec *nodeexec;
@@ -285,3 +310,22 @@ void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs)
}
}
}
+
+void node_shader_gpu_tex_mapping(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *UNUSED(out))
+{
+ NodeTexBase *base= node->storage;
+ TexMapping *texmap= &base->tex_mapping;
+ float domin= (texmap->flag & TEXMAP_CLIP_MIN) != 0;
+ float domax= (texmap->flag & TEXMAP_CLIP_MAX) != 0;
+
+ if(domin || domax || !(texmap->flag & TEXMAP_UNIT_MATRIX)) {
+ GPUNodeLink *tmat = GPU_uniform((float*)texmap->mat);
+ GPUNodeLink *tmin = GPU_uniform(texmap->min);
+ GPUNodeLink *tmax = GPU_uniform(texmap->max);
+ GPUNodeLink *tdomin = GPU_uniform(&domin);
+ GPUNodeLink *tdomax = GPU_uniform(&domax);
+
+ GPU_link(mat, "mapping", in[0].link, tmat, tmin, tmax, tdomin, tdomax, &in[0].link);
+ }
+}
+
diff --git a/source/blender/nodes/shader/node_shader_util.h b/source/blender/nodes/shader/node_shader_util.h
index 3a0c97511e4..48e54d9d0b4 100644
--- a/source/blender/nodes/shader/node_shader_util.h
+++ b/source/blender/nodes/shader/node_shader_util.h
@@ -40,6 +40,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_color_types.h"
+#include "DNA_customdata_types.h"
#include "DNA_ID.h"
#include "DNA_image_types.h"
#include "DNA_material_types.h"
@@ -91,7 +92,8 @@ typedef struct ShaderCallData {
#define GEOM_OUT_UV 4
#define GEOM_OUT_NORMAL 5
#define GEOM_OUT_VCOL 6
-#define GEOM_OUT_FRONTBACK 7
+#define GEOM_OUT_VCOL_ALPHA 7
+#define GEOM_OUT_FRONTBACK 8
/* input socket defines */
@@ -122,6 +124,7 @@ void nodestack_get_vec(float *in, short type_in, bNodeStack *ns);
void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, struct bNodeStack *ns);
void node_data_from_gpu_stack(struct bNodeStack *ns, struct GPUNodeStack *gs);
+void node_shader_gpu_tex_mapping(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, int do_outputs);
diff --git a/source/blender/nodes/shader/nodes/node_shader_add_shader.c b/source/blender/nodes/shader/nodes/node_shader_add_shader.c
new file mode 100644
index 00000000000..d715971e618
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_add_shader.c
@@ -0,0 +1,66 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_add_shader_in[]= {
+ { SOCK_SHADER, 1, "Shader"},
+ { SOCK_SHADER, 1, "Shader"},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_add_shader_out[]= {
+ { SOCK_SHADER, 0, "Shader"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_add_shader(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_add_shader", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_add_shader(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_ADD_SHADER, "Add Shader", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_add_shader_in, sh_node_add_shader_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_add_shader);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_attribute.c b/source/blender/nodes/shader/nodes/node_shader_attribute.c
new file mode 100644
index 00000000000..4b238f72117
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_attribute.c
@@ -0,0 +1,63 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_attribute_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_attribute(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeShaderAttribute *attr = MEM_callocN(sizeof(NodeShaderAttribute), "NodeShaderAttribute");
+ node->storage = attr;
+}
+
+/* node type definition */
+void register_node_type_sh_attribute(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_ATTRIBUTE, "Attribute", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, NULL, sh_node_attribute_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_attribute);
+ node_type_storage(&ntype, "NodeShaderAttribute", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, NULL);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_background.c b/source/blender/nodes/shader/nodes/node_shader_background.c
new file mode 100644
index 00000000000..b2bd837d66b
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_background.c
@@ -0,0 +1,61 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_background_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Strength", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_background_out[]= {
+ { SOCK_SHADER, 0, "Background"},
+ { -1, 0, "" }
+};
+
+/* node type definition */
+void register_node_type_sh_background(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BACKGROUND, "Background", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_background_in, sh_node_background_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, NULL);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c
new file mode 100644
index 00000000000..c71696b351c
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c
@@ -0,0 +1,67 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_bsdf_anisotropic_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Roughness U", 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Roughness V", 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_bsdf_anisotropic_out[]= {
+ { SOCK_SHADER, 0, "BSDF"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_bsdf_anisotropic(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_bsdf_anisotropic", in, out, GPU_builtin(GPU_VIEW_NORMAL), GPU_builtin(GPU_VIEW_POSITION));
+}
+
+/* node type definition */
+void register_node_type_sh_bsdf_anisotropic(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BSDF_ANISOTROPIC, "Glossy Anisotropic BSDF", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_bsdf_anisotropic_in, sh_node_bsdf_anisotropic_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_bsdf_anisotropic);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.c
new file mode 100644
index 00000000000..737f77d923e
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.c
@@ -0,0 +1,65 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_bsdf_diffuse_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_bsdf_diffuse_out[]= {
+ { SOCK_SHADER, 0, "BSDF"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_bsdf_diffuse(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_bsdf_diffuse", in, out, GPU_builtin(GPU_VIEW_NORMAL));
+}
+
+/* node type definition */
+void register_node_type_sh_bsdf_diffuse(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BSDF_DIFFUSE, "Diffuse BSDF", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_bsdf_diffuse_in, sh_node_bsdf_diffuse_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_bsdf_diffuse);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
new file mode 100644
index 00000000000..7d3b91d34d4
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
@@ -0,0 +1,67 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_bsdf_glass_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Roughness", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "IOR", 1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_bsdf_glass_out[]= {
+ { SOCK_SHADER, 0, "BSDF"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_bsdf_glass(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_bsdf_glass", in, out, GPU_builtin(GPU_VIEW_NORMAL), GPU_builtin(GPU_VIEW_POSITION));
+}
+
+/* node type definition */
+void register_node_type_sh_bsdf_glass(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BSDF_GLASS, "Glass BSDF", NODE_CLASS_SHADER, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_bsdf_glass_in, sh_node_bsdf_glass_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_bsdf_glass);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
new file mode 100644
index 00000000000..5ccc1cf4a61
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
@@ -0,0 +1,67 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_bsdf_glossy_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Roughness", 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_bsdf_glossy_out[]= {
+ { SOCK_SHADER, 0, "BSDF"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_bsdf_glossy(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ /* todo: is incoming vector normalized? */
+ return GPU_stack_link(mat, "node_bsdf_glossy", in, out, GPU_builtin(GPU_VIEW_NORMAL), GPU_builtin(GPU_VIEW_POSITION));
+}
+
+/* node type definition */
+void register_node_type_sh_bsdf_glossy(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BSDF_GLOSSY, "Glossy BSDF", NODE_CLASS_SHADER, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_bsdf_glossy_in, sh_node_bsdf_glossy_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_bsdf_glossy);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.c
new file mode 100644
index 00000000000..2836714f477
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.c
@@ -0,0 +1,65 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_bsdf_translucent_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_bsdf_translucent_out[]= {
+ { SOCK_SHADER, 0, "BSDF"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_bsdf_translucent(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_bsdf_translucent", in, out, GPU_builtin(GPU_VIEW_NORMAL));
+}
+
+/* node type definition */
+void register_node_type_sh_bsdf_translucent(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BSDF_TRANSLUCENT, "Translucent BSDF", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_bsdf_translucent_in, sh_node_bsdf_translucent_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_bsdf_translucent);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.c
new file mode 100644
index 00000000000..5352bd9be30
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.c
@@ -0,0 +1,65 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_bsdf_transparent_in[]= {
+ { SOCK_RGBA, 1, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_bsdf_transparent_out[]= {
+ { SOCK_SHADER, 0, "BSDF"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_bsdf_transparent(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_bsdf_transparent", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_bsdf_transparent(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BSDF_TRANSPARENT, "Transparent BSDF", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_bsdf_transparent_in, sh_node_bsdf_transparent_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_bsdf_transparent);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.c
new file mode 100644
index 00000000000..dfcf3b68d67
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.c
@@ -0,0 +1,66 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_bsdf_velvet_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Sigma", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_bsdf_velvet_out[]= {
+ { SOCK_SHADER, 0, "BSDF"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_bsdf_velvet(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_bsdf_velvet", in, out, GPU_builtin(GPU_VIEW_NORMAL));
+}
+
+/* node type definition */
+void register_node_type_sh_bsdf_velvet(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_BSDF_VELVET, "Velvet BSDF", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_bsdf_velvet_in, sh_node_bsdf_velvet_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_bsdf_velvet);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_emission.c b/source/blender/nodes/shader/nodes/node_shader_emission.c
new file mode 100644
index 00000000000..6ef82890559
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_emission.c
@@ -0,0 +1,66 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_emission_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Strength", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_emission_out[]= {
+ { SOCK_SHADER, 0, "Emission"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_emission(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_emission", in, out, GPU_builtin(GPU_VIEW_NORMAL));
+}
+
+/* node type definition */
+void register_node_type_sh_emission(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_EMISSION, "Emission", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_emission_in, sh_node_emission_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_emission);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_fresnel.c b/source/blender/nodes/shader/nodes/node_shader_fresnel.c
new file mode 100644
index 00000000000..c5d55c9a1c8
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_fresnel.c
@@ -0,0 +1,65 @@
+/**
+ * $Id: node_shader_fresnel.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** Fresnel ******************** */
+static bNodeSocketTemplate sh_node_fresnel_in[]= {
+ { SOCK_FLOAT, 1, "IOR", 1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_fresnel_out[]= {
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_fresnel(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ /* todo: is incoming vector normalized? */
+ return GPU_stack_link(mat, "node_fresnel", in, out, GPU_builtin(GPU_VIEW_NORMAL), GPU_builtin(GPU_VIEW_POSITION));
+}
+
+/* node type definition */
+void register_node_type_sh_fresnel(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_FRESNEL, "Fresnel", NODE_CLASS_INPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_fresnel_in, sh_node_fresnel_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_fresnel);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_geom.c b/source/blender/nodes/shader/nodes/node_shader_geom.c
index 5c4ba75ae67..6547194b33a 100644
--- a/source/blender/nodes/shader/nodes/node_shader_geom.c
+++ b/source/blender/nodes/shader/nodes/node_shader_geom.c
@@ -45,6 +45,7 @@ static bNodeSocketTemplate sh_node_geom_out[]= {
{ SOCK_VECTOR, 0, "UV"},
{ SOCK_VECTOR, 0, "Normal"},
{ SOCK_RGBA, 0, "Vertex Color"},
+ { SOCK_FLOAT, 0, "Vertex Alpha"},
{ SOCK_FLOAT, 0, "Front/Back"},
{ -1, 0, "" }
};
@@ -91,10 +92,13 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(i
}
copy_v3_v3(out[GEOM_OUT_VCOL]->vec, scol->col);
- out[GEOM_OUT_VCOL]->vec[3]= 1.0f;
+ out[GEOM_OUT_VCOL]->vec[3]= scol->col[3];
+ out[GEOM_OUT_VCOL_ALPHA]->vec[0]= scol->col[3];
}
- else
+ else {
memcpy(out[GEOM_OUT_VCOL]->vec, defaultvcol, sizeof(defaultvcol));
+ out[GEOM_OUT_VCOL_ALPHA]->vec[0]= 1.0f;
+ }
if(shi->osatex) {
out[GEOM_OUT_GLOB]->data= shi->dxgl;
diff --git a/source/blender/nodes/shader/nodes/node_shader_geometry.c b/source/blender/nodes/shader/nodes/node_shader_geometry.c
new file mode 100644
index 00000000000..63f6ba3928f
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_geometry.c
@@ -0,0 +1,68 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_geometry_out[]= {
+ { SOCK_VECTOR, 0, "Position", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Tangent", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "True Normal", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Incoming", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Parametric", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Backfacing", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_geometry(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_geometry", in, out,
+ GPU_builtin(GPU_VIEW_POSITION), GPU_builtin(GPU_VIEW_NORMAL),
+ GPU_builtin(GPU_INVERSE_VIEW_MATRIX));
+}
+
+/* node type definition */
+void register_node_type_sh_geometry(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_NEW_GEOMETRY, "Geometry", NODE_CLASS_INPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, NULL, sh_node_geometry_out);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_geometry);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_holdout.c b/source/blender/nodes/shader/nodes/node_shader_holdout.c
new file mode 100644
index 00000000000..747519c861e
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_holdout.c
@@ -0,0 +1,60 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_holdout_in[]= {
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_holdout_out[]= {
+ { SOCK_SHADER, 0, "Holdout"},
+ { -1, 0, "" }
+};
+
+
+/* node type definition */
+void register_node_type_sh_holdout(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_HOLDOUT, "Holdout", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_holdout_in, sh_node_holdout_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, NULL);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_layer_weight.c b/source/blender/nodes/shader/nodes/node_shader_layer_weight.c
new file mode 100644
index 00000000000..16b58e18761
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_layer_weight.c
@@ -0,0 +1,66 @@
+/**
+ * $Id: node_shader_layer_weight.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** Layer Weight ******************** */
+
+static bNodeSocketTemplate sh_node_layer_weight_in[]= {
+ { SOCK_FLOAT, 1, "Blend", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_layer_weight_out[]= {
+ { SOCK_FLOAT, 0, "Fresnel", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Facing", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_layer_weight(GPUMaterial *UNUSED(mat), bNode *UNUSED(node), GPUNodeStack *UNUSED(in), GPUNodeStack *UNUSED(out))
+{
+ return 0;
+}
+
+/* node type definition */
+void register_node_type_sh_layer_weight(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_LAYER_WEIGHT, "Layer Weight", NODE_CLASS_INPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_layer_weight_in, sh_node_layer_weight_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_layer_weight);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_light_path.c b/source/blender/nodes/shader/nodes/node_shader_light_path.c
new file mode 100644
index 00000000000..d399a0bddd4
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_light_path.c
@@ -0,0 +1,66 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_light_path_out[]= {
+ { SOCK_FLOAT, 0, "Is Camera Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Is Shadow Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Is Diffuse Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Is Glossy Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Is Singular Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Is Reflection Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Is Transmission Ray", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_light_path(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_light_path", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_light_path(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_LIGHT_PATH, "Light Path", NODE_CLASS_INPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, NULL, sh_node_light_path_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_light_path);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_mapping.c b/source/blender/nodes/shader/nodes/node_shader_mapping.c
index 35007724037..2fa885dcdd3 100644
--- a/source/blender/nodes/shader/nodes/node_shader_mapping.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mapping.c
@@ -91,7 +91,7 @@ void register_node_type_sh_mapping(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", 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_mapping_in, sh_node_mapping_out);
node_type_size(&ntype, 240, 160, 320);
node_type_init(&ntype, node_shader_init_mapping);
diff --git a/source/blender/nodes/shader/nodes/node_shader_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c
index 13ee1f79fe6..1c15c49a7da 100644
--- a/source/blender/nodes/shader/nodes/node_shader_math.c
+++ b/source/blender/nodes/shader/nodes/node_shader_math.c
@@ -241,7 +241,7 @@ void register_node_type_sh_math(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MATH, "Math", 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_math_in, sh_node_math_out);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
diff --git a/source/blender/nodes/shader/nodes/node_shader_mixRgb.c b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
index 7692956368c..5d7ec9a23ab 100644
--- a/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
@@ -78,7 +78,7 @@ void register_node_type_sh_mix_rgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", 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_mix_rgb_in, sh_node_mix_rgb_out);
node_type_size(&ntype, 100, 60, 150);
node_type_label(&ntype, node_blend_label);
diff --git a/source/blender/nodes/shader/nodes/node_shader_mix_shader.c b/source/blender/nodes/shader/nodes/node_shader_mix_shader.c
new file mode 100644
index 00000000000..5ce2a03f464
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_mix_shader.c
@@ -0,0 +1,67 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_mix_shader_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_SHADER, 1, "Shader"},
+ { SOCK_SHADER, 1, "Shader"},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_mix_shader_out[]= {
+ { SOCK_SHADER, 0, "Shader"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_mix_shader(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ return GPU_stack_link(mat, "node_mix_shader", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_mix_shader(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MIX_SHADER, "Mix Shader", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_mix_shader_in, sh_node_mix_shader_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_mix_shader);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_output_lamp.c b/source/blender/nodes/shader/nodes/node_shader_output_lamp.c
new file mode 100644
index 00000000000..2c954d1cf8f
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_output_lamp.c
@@ -0,0 +1,55 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_output_lamp_in[]= {
+ { SOCK_SHADER, 1, "Surface", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+/* node type definition */
+void register_node_type_sh_output_lamp(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_OUTPUT_LAMP, "Lamp Output", NODE_CLASS_OUTPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_output_lamp_in, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, NULL);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_output_material.c b/source/blender/nodes/shader/nodes/node_shader_output_material.c
new file mode 100644
index 00000000000..0059489fcc7
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_output_material.c
@@ -0,0 +1,68 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_output_material_in[]= {
+ { SOCK_SHADER, 1, "Surface"},
+ { SOCK_SHADER, 1, "Volume"},
+ { SOCK_FLOAT, 1, "Displacement", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_output_material(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ GPUNodeLink *outlink;
+
+ GPU_stack_link(mat, "node_output_material", in, out, &outlink);
+ GPU_material_output_link(mat, outlink);
+
+ return 1;
+}
+
+
+/* node type definition */
+void register_node_type_sh_output_material(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_OUTPUT_MATERIAL, "Material Output", NODE_CLASS_OUTPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_output_material_in, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_output_material);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_output_world.c b/source/blender/nodes/shader/nodes/node_shader_output_world.c
new file mode 100644
index 00000000000..20bb3ab8f58
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_output_world.c
@@ -0,0 +1,56 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_output_world_in[]= {
+ { SOCK_SHADER, 1, "Surface", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_SHADER, 1, "Volume", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+/* node type definition */
+void register_node_type_sh_output_world(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_OUTPUT_WORLD, "World Output", NODE_CLASS_OUTPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_output_world_in, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, NULL);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.c b/source/blender/nodes/shader/nodes/node_shader_rgb.c
index 67c0ec165ca..58a00ed92e5 100644
--- a/source/blender/nodes/shader/nodes/node_shader_rgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_rgb.c
@@ -71,7 +71,7 @@ void register_node_type_sh_rgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS);
- 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_rgb_out);
node_type_init(&ntype, node_shader_init_rgb);
node_type_size(&ntype, 140, 80, 140);
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_coord.c b/source/blender/nodes/shader/nodes/node_shader_tex_coord.c
new file mode 100644
index 00000000000..a33e5599d77
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_coord.c
@@ -0,0 +1,72 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+#include "DNA_customdata_types.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_tex_coord_out[]= {
+ { SOCK_VECTOR, 0, "Generated", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "UV", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Object", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Camera", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Window", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 0, "Reflection", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_tex_coord(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
+{
+ GPUNodeLink *orco = GPU_attribute(CD_ORCO, "");
+ GPUNodeLink *mtface = GPU_attribute(CD_MTFACE, "");
+
+ return GPU_stack_link(mat, "node_tex_coord", in, out,
+ GPU_builtin(GPU_VIEW_POSITION), GPU_builtin(GPU_VIEW_NORMAL),
+ GPU_builtin(GPU_INVERSE_VIEW_MATRIX), orco, mtface);
+}
+
+/* node type definition */
+void register_node_type_sh_tex_coord(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_COORD, "Texture Coordinate", NODE_CLASS_INPUT, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, NULL, sh_node_tex_coord_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_coord);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_environment.c b/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
new file mode 100644
index 00000000000..ecf5a053ad3
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
@@ -0,0 +1,89 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_tex_environment_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_environment_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_environment(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexEnvironment *tex = MEM_callocN(sizeof(NodeTexEnvironment), "NodeTexEnvironment");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->color_space = SHD_COLORSPACE_SRGB;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_environment(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ Image *ima= (Image*)node->id;
+ ImageUser *iuser= NULL;
+
+ if(!ima) {
+ float black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ GPUNodeLink *vec = GPU_uniform(black);
+ return GPU_stack_link(mat, "set_rgba", out, out, vec);
+ }
+
+ if(!in[0].link)
+ in[0].link = GPU_builtin(GPU_VIEW_POSITION);
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_environment", in, out, GPU_image(ima, iuser));
+}
+
+/* node type definition */
+void register_node_type_sh_tex_environment(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_ENVIRONMENT, "Environment Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_environment_in, sh_node_tex_environment_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_environment);
+ node_type_storage(&ntype, "NodeTexEnvironment", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_environment);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
new file mode 100644
index 00000000000..d78a5e9693a
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
@@ -0,0 +1,81 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 Gradienter Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** BLEND ******************** */
+
+static bNodeSocketTemplate sh_node_tex_gradient_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_gradient_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_gradient(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexGradient *tex = MEM_callocN(sizeof(NodeTexGradient), "NodeTexGradient");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->gradient_type = SHD_BLEND_LINEAR;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_gradient(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_ORCO, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_gradient", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_tex_gradient(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_GRADIENT, "Gradient Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_gradient_in, sh_node_tex_gradient_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_gradient);
+ node_type_storage(&ntype, "NodeTexGradient", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_gradient);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.c b/source/blender/nodes/shader/nodes/node_shader_tex_image.c
new file mode 100644
index 00000000000..75b5f26b252
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.c
@@ -0,0 +1,89 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_tex_image_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_image_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_image(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexImage *tex = MEM_callocN(sizeof(NodeTexImage), "NodeTexImage");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->color_space = SHD_COLORSPACE_SRGB;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_image(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ Image *ima= (Image*)node->id;
+ ImageUser *iuser= NULL;
+
+ if(!ima) {
+ float black[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ GPUNodeLink *vec = GPU_uniform(black);
+ return GPU_stack_link(mat, "set_rgba", out, out, vec);
+ }
+
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_MTFACE, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_image", in, out, GPU_image(ima, iuser));
+}
+
+/* node type definition */
+void register_node_type_sh_tex_image(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_IMAGE, "Image Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_image_in, sh_node_tex_image_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_image);
+ node_type_storage(&ntype, "NodeTexImage", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_image);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_magic.c b/source/blender/nodes/shader/nodes/node_shader_tex_magic.c
new file mode 100644
index 00000000000..6c021a7f900
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_magic.c
@@ -0,0 +1,86 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_tex_magic_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { SOCK_FLOAT, 1, "Scale", 5.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Distortion", 1.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_magic_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_magic(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexMagic *tex = MEM_callocN(sizeof(NodeTexMagic), "NodeTexMagic");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->depth = 2;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_magic(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ NodeTexMagic *tex = (NodeTexMagic*)node->storage;
+ float depth = tex->depth;
+
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_ORCO, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_magic", in, out, GPU_uniform(&depth));
+}
+
+/* node type definition */
+void register_node_type_sh_tex_magic(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_MAGIC, "Magic Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_magic_in, sh_node_tex_magic_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_magic);
+ node_type_storage(&ntype, "NodeTexMagic", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_magic);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c b/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
new file mode 100644
index 00000000000..4aefea3e383
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
@@ -0,0 +1,87 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** MUSGRAVE ******************** */
+
+static bNodeSocketTemplate sh_node_tex_musgrave_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { SOCK_FLOAT, 1, "Scale", 5.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Detail", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 16.0f},
+ { SOCK_FLOAT, 1, "Dimension", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Lacunarity", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Gain", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_musgrave_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_musgrave(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexMusgrave *tex = MEM_callocN(sizeof(NodeTexMusgrave), "NodeTexMusgrave");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->musgrave_type = SHD_MUSGRAVE_FBM;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_musgrave(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_ORCO, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_musgrave", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_tex_musgrave(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_MUSGRAVE, "Musgrave Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_musgrave_in, sh_node_tex_musgrave_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_musgrave);
+ node_type_storage(&ntype, "NodeTexMusgrave", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_musgrave);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_noise.c b/source/blender/nodes/shader/nodes/node_shader_tex_noise.c
new file mode 100644
index 00000000000..6c27384a24d
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_noise.c
@@ -0,0 +1,83 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** NOISE ******************** */
+
+static bNodeSocketTemplate sh_node_tex_noise_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { SOCK_FLOAT, 1, "Scale", 5.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Detail", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 16.0f},
+ { SOCK_FLOAT, 1, "Distortion", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_noise_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_noise(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexNoise *tex = MEM_callocN(sizeof(NodeTexNoise), "NodeTexNoise");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_noise(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_ORCO, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_noise", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_tex_noise(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_NOISE, "Noise Texture", NODE_CLASS_TEXTURE, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_noise_in, sh_node_tex_noise_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_noise);
+ node_type_storage(&ntype, "NodeTexNoise", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_noise);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_sky.c b/source/blender/nodes/shader/nodes/node_shader_tex_sky.c
new file mode 100644
index 00000000000..1abcec86b12
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_sky.c
@@ -0,0 +1,83 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_tex_sky_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_sky_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_sky(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexSky *tex = MEM_callocN(sizeof(NodeTexSky), "NodeTexSky");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->sun_direction[0] = 0.0f;
+ tex->sun_direction[1] = 0.0f;
+ tex->sun_direction[2] = 1.0f;
+ tex->turbidity = 2.2f;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_sky(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_ORCO, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_sky", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_tex_sky(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_SKY, "Sky Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_sky_in, sh_node_tex_sky_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_sky);
+ node_type_storage(&ntype, "NodeTexSky", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_sky);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
new file mode 100644
index 00000000000..6be3a2e928b
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
@@ -0,0 +1,82 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** VORONOI ******************** */
+
+static bNodeSocketTemplate sh_node_tex_voronoi_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { SOCK_FLOAT, 1, "Scale", 5.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_voronoi_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_voronoi(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexVoronoi *tex = MEM_callocN(sizeof(NodeTexVoronoi), "NodeTexVoronoi");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->coloring = SHD_VORONOI_INTENSITY;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_voronoi(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_ORCO, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_voronoi", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_tex_voronoi(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_VORONOI, "Voronoi Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_voronoi_in, sh_node_tex_voronoi_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_voronoi);
+ node_type_storage(&ntype, "NodeTexVoronoi", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_voronoi);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_wave.c b/source/blender/nodes/shader/nodes/node_shader_tex_wave.c
new file mode 100644
index 00000000000..ed0aa230721
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_tex_wave.c
@@ -0,0 +1,85 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** WAVE ******************** */
+
+static bNodeSocketTemplate sh_node_tex_wave_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
+ { SOCK_FLOAT, 1, "Scale", 5.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Distortion", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { SOCK_FLOAT, 1, "Detail", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 16.0f},
+ { SOCK_FLOAT, 1, "Detail Scale", 1.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_tex_wave_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Fac", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_init_tex_wave(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
+ NodeTexWave *tex = MEM_callocN(sizeof(NodeTexWave), "NodeTexWave");
+ default_tex_mapping(&tex->base.tex_mapping);
+ default_color_mapping(&tex->base.color_mapping);
+ tex->wave_type = SHD_WAVE_BANDS;
+
+ node->storage = tex;
+}
+
+static int node_shader_gpu_tex_wave(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+{
+ if(!in[0].link)
+ in[0].link = GPU_attribute(CD_ORCO, "");
+
+ node_shader_gpu_tex_mapping(mat, node, in, out);
+
+ return GPU_stack_link(mat, "node_tex_wave", in, out);
+}
+
+/* node type definition */
+void register_node_type_sh_tex_wave(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEX_WAVE, "Wave Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_tex_wave_in, sh_node_tex_wave_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, node_shader_init_tex_wave);
+ node_type_storage(&ntype, "NodeTexWave", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_tex_wave);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
index 4d41e62b242..94afd09274a 100644
--- a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
@@ -117,7 +117,7 @@ void register_node_type_sh_rgbtobw(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", 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_rgbtobw_in, sh_node_rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_shader_exec_rgbtobw);
diff --git a/source/blender/nodes/shader/nodes/node_shader_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c
index 4a8aa6c9cf4..8f490f4953b 100644
--- a/source/blender/nodes/shader/nodes/node_shader_value.c
+++ b/source/blender/nodes/shader/nodes/node_shader_value.c
@@ -71,7 +71,7 @@ void register_node_type_sh_value(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS);
- 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_value_out);
node_type_init(&ntype, node_shader_init_value);
node_type_size(&ntype, 80, 50, 120);
diff --git a/source/blender/nodes/shader/nodes/node_shader_vectMath.c b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
index b3f995dcdce..bb56037b4d4 100644
--- a/source/blender/nodes/shader/nodes/node_shader_vectMath.c
+++ b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
@@ -135,7 +135,7 @@ void register_node_type_sh_vect_math(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", 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_vect_math_in, sh_node_vect_math_out);
node_type_size(&ntype, 80, 75, 140);
node_type_label(&ntype, node_vect_math_label);
diff --git a/source/blender/nodes/shader/nodes/node_shader_volume_isotropic.c b/source/blender/nodes/shader/nodes/node_shader_volume_isotropic.c
new file mode 100644
index 00000000000..9f4c1447f65
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_volume_isotropic.c
@@ -0,0 +1,66 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_volume_isotropic_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Density", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_volume_isotropic_out[]= {
+ { SOCK_SHADER, 0, "Volume"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_volume_isotropic(GPUMaterial *UNUSED(mat), bNode *UNUSED(node), GPUNodeStack *UNUSED(in), GPUNodeStack *UNUSED(out))
+{
+ return 0;
+}
+
+/* node type definition */
+void register_node_type_sh_volume_isotropic(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VOLUME_ISOTROPIC, "Isotropic Volume", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_volume_isotropic_in, sh_node_volume_isotropic_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_volume_isotropic);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/shader/nodes/node_shader_volume_transparent.c b/source/blender/nodes/shader/nodes/node_shader_volume_transparent.c
new file mode 100644
index 00000000000..910933bb5fa
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_volume_transparent.c
@@ -0,0 +1,66 @@
+/**
+ * $Id: node_shader_output.c 32517 2010-10-16 14:32:17Z campbellbarton $
+ *
+ * ***** 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 *****
+ */
+
+#include "../node_shader_util.h"
+
+/* **************** OUTPUT ******************** */
+
+static bNodeSocketTemplate sh_node_volume_transparent_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Density", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
+ { -1, 0, "" }
+};
+
+static bNodeSocketTemplate sh_node_volume_transparent_out[]= {
+ { SOCK_SHADER, 0, "Volume"},
+ { -1, 0, "" }
+};
+
+static int node_shader_gpu_volume_transparent(GPUMaterial *UNUSED(mat), bNode *UNUSED(node), GPUNodeStack *UNUSED(in), GPUNodeStack *UNUSED(out))
+{
+ return 0;
+}
+
+/* node type definition */
+void register_node_type_sh_volume_transparent(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VOLUME_TRANSPARENT, "Transparent Volume", NODE_CLASS_SHADER, 0);
+ node_type_compatibility(&ntype, NODE_NEW_SHADING);
+ node_type_socket_templates(&ntype, sh_node_volume_transparent_in, sh_node_volume_transparent_out);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, NULL);
+ node_type_storage(&ntype, "", NULL, NULL);
+ node_type_exec(&ntype, NULL);
+ node_type_gpu(&ntype, node_shader_gpu_volume_transparent);
+
+ nodeRegisterType(lb, &ntype);
+};
+
diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c
index 84bb53e2215..e863e9f6e0f 100644
--- a/source/blender/nodes/texture/node_texture_tree.c
+++ b/source/blender/nodes/texture/node_texture_tree.c
@@ -39,6 +39,8 @@
#include "BLI_threads.h"
#include "BLI_utildefines.h"
+#include "BLF_translation.h"
+
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_node.h"
@@ -64,15 +66,15 @@ static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
static void foreach_nodeclass(Scene *UNUSED(scene), void *calldata, bNodeClassCallback func)
{
- func(calldata, NODE_CLASS_INPUT, "Input");
- func(calldata, NODE_CLASS_OUTPUT, "Output");
- func(calldata, NODE_CLASS_OP_COLOR, "Color");
- func(calldata, NODE_CLASS_PATTERN, "Patterns");
- func(calldata, NODE_CLASS_TEXTURE, "Textures");
- func(calldata, NODE_CLASS_CONVERTOR, "Convertor");
- func(calldata, NODE_CLASS_DISTORT, "Distort");
- func(calldata, NODE_CLASS_GROUP, "Group");
- func(calldata, NODE_CLASS_LAYOUT, "Layout");
+ func(calldata, NODE_CLASS_INPUT, IFACE_("Input"));
+ func(calldata, NODE_CLASS_OUTPUT, IFACE_("Output"));
+ func(calldata, NODE_CLASS_OP_COLOR, IFACE_("Color"));
+ func(calldata, NODE_CLASS_PATTERN, IFACE_("Patterns"));
+ func(calldata, NODE_CLASS_TEXTURE, IFACE_("Textures"));
+ func(calldata, NODE_CLASS_CONVERTOR, IFACE_("Convertor"));
+ func(calldata, NODE_CLASS_DISTORT, IFACE_("Distort"));
+ func(calldata, NODE_CLASS_GROUP, IFACE_("Group"));
+ func(calldata, NODE_CLASS_LAYOUT, IFACE_("Layout"));
}
static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index fa8238badaa..d42ad630e75 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -4,7 +4,7 @@
Import ('env')
-incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes'
+incs = '. ../editors/include ../makesdna ../makesrna ../blenfont ../blenlib ../blenkernel ../nodes'
incs += ' ../imbuf ../blenloader ../gpu ../render/extern/include ../windowmanager'
incs += ' ../freestyle/intern/python'
incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include'
@@ -44,5 +44,8 @@ if env['BF_BUILDINFO']:
if env['WITH_BF_INTERNATIONAL']:
defs.append('WITH_INTERNATIONAL')
+if env['WITH_BF_CYCLES']:
+ defs.append('WITH_CYCLES')
+
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/noise_py_api.c b/source/blender/python/generic/noise_py_api.c
index c12cc1ccdd2..c84aab83b7e 100644
--- a/source/blender/python/generic/noise_py_api.c
+++ b/source/blender/python/generic/noise_py_api.c
@@ -263,10 +263,10 @@ 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);
+ 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);
+ nb) - 1.0f);
}
static PyObject *Noise_vector(PyObject *UNUSED(self), PyObject *args)
@@ -442,10 +442,10 @@ static PyObject *Noise_voronoi(PyObject *UNUSED(self), PyObject *args)
return NULL;
voronoi(x, y, z, da, pa, me, dtype);
return Py_BuildValue("[[ffff][[fff][fff][fff][fff]]]",
- da[0], da[1], da[2], da[3],
- pa[0], pa[1], pa[2],
- pa[3], pa[4], pa[5],
- pa[6], pa[7], pa[8], pa[9], pa[10], pa[11]);
+ da[0], da[1], da[2], da[3],
+ pa[0], pa[1], pa[2],
+ pa[3], pa[4], pa[5],
+ pa[6], pa[7], pa[8], pa[9], pa[10], pa[11]);
}
/*-------------------------------------------------------------------------*/
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index 3fe8aada3ae..73b2285ca13 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -25,6 +25,7 @@
set(INC
..
+ ../../blenfont
../../blenkernel
../../blenlib
../../blenloader
@@ -96,6 +97,10 @@ if(WITH_AUDASPACE)
add_definitions(-DWITH_AUDASPACE)
endif()
+if(WITH_CYCLES)
+ add_definitions(-DWITH_CYCLES)
+endif()
+
if(WITH_INTERNATIONAL)
add_definitions(-DWITH_INTERNATIONAL)
endif()
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index ffa9e5cc27c..7dee2ce6fb4 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -174,6 +174,8 @@ void BPY_context_set(bContext *C)
/* defined in AUD_C-API.cpp */
extern PyObject *AUD_initPython(void);
+/* defined in cycles/blender */
+extern PyObject *CYCLES_initPython(void);
static struct _inittab bpy_internal_modules[]= {
{(char *)"noise", BPyInit_noise},
@@ -184,6 +186,9 @@ static struct _inittab bpy_internal_modules[]= {
#ifdef WITH_AUDASPACE
{(char *)"aud", AUD_initPython},
#endif
+#ifdef WITH_CYCLES
+ {(char *)"bcycles", CYCLES_initPython},
+#endif
{(char *)"gpu", GPU_initPython},
{NULL, NULL}
};
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index 44e26a56db6..15a9ba44552 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -77,7 +77,7 @@
#include "../generic/py_capi_utils.h"
#ifdef WITH_INTERNATIONAL
-#include "UI_interface.h" /* bad level call into editors */
+#include "BLF_translation.h"
#endif
#define USE_PEDANTIC_WRITE
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index 3f0a5d55ec2..51ab5b50919 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -945,7 +945,7 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
angle= PyFloat_AsDouble(value);
- if (angle==-1.0 && 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;
diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index 3518c8008c6..a0a6ba277cf 100644
--- a/source/blender/python/mathutils/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -420,7 +420,7 @@ static PyObject *M_Geometry_intersect_line_plane(PyObject *UNUSED(self), PyObjec
return NULL;
}
- if ( BaseMath_ReadCallback(line_a) == -1 ||
+ if ( BaseMath_ReadCallback(line_a) == -1 ||
BaseMath_ReadCallback(line_b) == -1 ||
BaseMath_ReadCallback(plane_co) == -1 ||
BaseMath_ReadCallback(plane_no) == -1
@@ -559,7 +559,7 @@ static PyObject *M_Geometry_intersect_line_sphere_2d(PyObject *UNUSED(self), PyO
return NULL;
}
- if ( BaseMath_ReadCallback(line_a) == -1 ||
+ if ( BaseMath_ReadCallback(line_a) == -1 ||
BaseMath_ReadCallback(line_b) == -1 ||
BaseMath_ReadCallback(sphere_co) == -1
) {
@@ -686,7 +686,7 @@ PyDoc_STRVAR(M_Geometry_intersect_point_quad_2d_doc,
" 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"
"\n"
" :arg pt: Point\n"
-" :type v1: :class:`mathutils.Vector`\n"
+" :type pt: :class:`mathutils.Vector`\n"
" :arg quad_p1: First point of the quad\n"
" :type quad_p1: :class:`mathutils.Vector`\n"
" :arg quad_p2: Second point of the quad\n"
@@ -717,6 +717,42 @@ static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyOb
return PyLong_FromLong(isect_point_quad_v2(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
}
+PyDoc_STRVAR(M_Geometry_distance_point_to_plane_doc,
+".. function:: distance_point_to_plane(pt, plane_co, plane_no)\n"
+"\n"
+" Returns the signed distance between a point and a plane "
+" (negative when below the normal).\n"
+"\n"
+" :arg pt: Point\n"
+" :type pt: :class:`mathutils.Vector`\n"
+" :arg plane_co: First point of the quad\n"
+" :type plane_co: :class:`mathutils.Vector`\n"
+" :arg plane_no: Second point of the quad\n"
+" :type plane_no: :class:`mathutils.Vector`\n"
+" :rtype: float\n"
+);
+static PyObject *M_Geometry_distance_point_to_plane(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *pt, *plene_co, *plane_no;
+
+ if (!PyArg_ParseTuple(args, "O!O!O!:distance_point_to_plane",
+ &vector_Type, &pt,
+ &vector_Type, &plene_co,
+ &vector_Type, &plane_no)
+ ) {
+ return NULL;
+ }
+
+ if ( BaseMath_ReadCallback(pt) == -1 ||
+ BaseMath_ReadCallback(plene_co) == -1 ||
+ BaseMath_ReadCallback(plane_no) == -1)
+ {
+ return NULL;
+ }
+
+ return PyFloat_FromDouble(dist_to_plane_v3(pt->vec, plene_co->vec, plane_no->vec));
+}
+
PyDoc_STRVAR(M_Geometry_barycentric_transform_doc,
".. function:: barycentric_transform(point, tri_a1, tri_a2, tri_a3, tri_b1, tri_b2, tri_b3)\n"
"\n"
@@ -1103,6 +1139,7 @@ static PyMethodDef M_Geometry_methods[]= {
{"intersect_line_plane", (PyCFunction) M_Geometry_intersect_line_plane, METH_VARARGS, M_Geometry_intersect_line_plane_doc},
{"intersect_line_sphere", (PyCFunction) M_Geometry_intersect_line_sphere, METH_VARARGS, M_Geometry_intersect_line_sphere_doc},
{"intersect_line_sphere_2d", (PyCFunction) M_Geometry_intersect_line_sphere_2d, METH_VARARGS, M_Geometry_intersect_line_sphere_2d_doc},
+ {"distance_point_to_plane", (PyCFunction) M_Geometry_distance_point_to_plane, METH_VARARGS, M_Geometry_distance_point_to_plane_doc},
{"area_tri", (PyCFunction) M_Geometry_area_tri, METH_VARARGS, M_Geometry_area_tri_doc},
{"normal", (PyCFunction) M_Geometry_normal, METH_VARARGS, M_Geometry_normal_doc},
{"barycentric_transform", (PyCFunction) M_Geometry_barycentric_transform, METH_VARARGS, M_Geometry_barycentric_transform_doc},
diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m
index 279192e9692..4307529002c 100644
--- a/source/blender/quicktime/apple/qtkit_import.m
+++ b/source/blender/quicktime/apple/qtkit_import.m
@@ -311,11 +311,11 @@ int startquicktime (struct anim *anim)
[QTMovie enterQTKitOnThread];
attributes = [NSDictionary dictionaryWithObjectsAndKeys:
- [NSString stringWithCString:anim->name
- encoding:[NSString defaultCStringEncoding]], QTMovieFileNameAttribute,
- [NSNumber numberWithBool:NO], QTMovieEditableAttribute,
- nil];
-
+ [NSString stringWithCString:anim->name
+ encoding:[NSString defaultCStringEncoding]], QTMovieFileNameAttribute,
+ [NSNumber numberWithBool:NO], QTMovieEditableAttribute,
+ nil];
+
anim->qtime->movie = [QTMovie movieWithAttributes:attributes error:NULL];
if (!anim->qtime->movie) {
diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c
index 77cc45664a4..5c0460d4e74 100644
--- a/source/blender/quicktime/apple/quicktime_export.c
+++ b/source/blender/quicktime/apple/quicktime_export.c
@@ -657,9 +657,12 @@ static void check_renderbutton_framerate(RenderData *rd, ReportList *reports)
CheckError(err, "SCGetInfo fr error", reports);
if( (rd->frs_sec == 24 || rd->frs_sec == 30 || rd->frs_sec == 60) &&
- (qtdata->gTemporalSettings.frameRate == 1571553 ||
- qtdata->gTemporalSettings.frameRate == 1964113 ||
- qtdata->gTemporalSettings.frameRate == 3928227)) {;}
+ (qtdata->gTemporalSettings.frameRate == 1571553 ||
+ qtdata->gTemporalSettings.frameRate == 1964113 ||
+ qtdata->gTemporalSettings.frameRate == 3928227))
+ {
+ /* do nothing */
+ }
else {
if (rd->frs_sec_base > 0)
qtdata->gTemporalSettings.frameRate =
diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c
index f88cba51ac3..d7ef371873a 100644
--- a/source/blender/quicktime/apple/quicktime_import.c
+++ b/source/blender/quicktime/apple/quicktime_import.c
@@ -381,8 +381,9 @@ ImBuf * qtime_fetchibuf (struct anim *anim, int position)
//add alpha to ibuf
boxsize = anim->x * anim->y * 4;
crect = (unsigned char *) rect;
- for( index = 0; index < boxsize; index+=4, crect+=4 )
- crect[3] = 0xFF;
+ for( index = 0; index < boxsize; index+=4, crect+=4 ) {
+ crect[3] = 0xFF;
+ }
}
#endif
@@ -522,8 +523,8 @@ int startquicktime (struct anim *anim)
anim->qtime->have_gw = TRUE;
SetMovieGWorld(anim->qtime->movie,
- anim->qtime->offscreenGWorld,
- GetGWorldDevice(anim->qtime->offscreenGWorld));
+ anim->qtime->offscreenGWorld,
+ GetGWorldDevice(anim->qtime->offscreenGWorld));
SetMoviePlayHints(anim->qtime->movie, hintsHighQuality, hintsHighQuality);
// sets Media and Track!
@@ -780,7 +781,7 @@ bail:
if( depth < 32 && (**desc).cType != kGIFCodecType) {
for(i = 0; i < box; i++, arect+=4)
- arect[3] = 0xFF;
+ arect[3] = 0xFF;
}
#endif
@@ -799,25 +800,25 @@ bail:
#if 0
struct ImageDescription {
- long idSize;
- CodecType cType;
- long resvd1;
- short resvd2;
- short dataRefIndex;
- short version;
- short revisionLevel;
- long vendor;
- CodecQ temporalQuality;
- CodecQ spatialQuality;
- short width;
- short height;
- Fixed hRes;
- Fixed vRes;
- long dataSize;
- short frameCount;
- Str31 name;
- short depth;
- short clutID;
+ long idSize;
+ CodecType cType;
+ long resvd1;
+ short resvd2;
+ short dataRefIndex;
+ short version;
+ short revisionLevel;
+ long vendor;
+ CodecQ temporalQuality;
+ CodecQ spatialQuality;
+ short width;
+ short height;
+ Fixed hRes;
+ Fixed vRes;
+ long dataSize;
+ short frameCount;
+ Str31 name;
+ short depth;
+ short clutID;
};
#endif // 0
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index b065546e30f..2e6e8fa2099 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -234,7 +234,7 @@ void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce
/* ancient stars function... go away! */
void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
- void (*vertexfunc)(float*), void (*termfunc)(void));
+ void (*vertexfunc)(float*), void (*termfunc)(void));
/* display and event callbacks */
void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 9f8b5ac2763..f93e3c9fd20 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -48,6 +48,7 @@ struct RNode;
struct Render;
struct MTex;
struct ImBuf;
+struct DerivedMesh;
// RADIO REMOVED, Maybe this will be useful later
//void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem, struct Render *re);
@@ -63,5 +64,11 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen
void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result);
void antialias_tagbuf(int xsize, int ysize, char *rectmove);
+/* dynamicpaint.c */
+struct Material *RE_init_sample_material(struct Material *orig_mat, struct Scene *scene);
+void RE_free_sample_material(struct Material *mat);
+void RE_sample_material_color(struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3],
+ int face_index, short hit_quad, struct DerivedMesh *orcoDm, struct Object *ob);
+
#endif /* RE_RENDER_EXT_H */
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index 36dec3801cd..dd0a0f308ce 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -90,7 +90,7 @@ typedef struct ShadeInputUV {
} ShadeInputUV;
typedef struct ShadeInputCol {
- float col[3];
+ float col[4];
char *name;
} ShadeInputCol;
diff --git a/source/blender/render/intern/include/pointdensity.h b/source/blender/render/intern/include/pointdensity.h
index 910f011b467..7ceb24e9ece 100644
--- a/source/blender/render/intern/include/pointdensity.h
+++ b/source/blender/render/intern/include/pointdensity.h
@@ -40,6 +40,7 @@
struct Render;
struct TexResult;
+void cache_pointdensity(struct Render *re, struct Tex *tex);
void make_pointdensities(struct Render *re);
void free_pointdensities(struct Render *re);
int pointdensitytex(struct Tex *tex, float *texvec, struct TexResult *texres);
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index a702e890c3b..a8d13077680 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -70,9 +70,9 @@ struct ImBuf;
void do_halo_tex(struct HaloRen *har, float xn, float yn, float col_r[4]);
void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float hor[3], float zen[3], float *blend, int skyflag, short thread);
-void do_material_tex(struct ShadeInput *shi);
+void do_material_tex(struct ShadeInput *shi, struct Render *re);
void do_lamp_tex(LampRen *la, const float lavec[3], struct ShadeInput *shi, float col_r[3], int effect);
-void do_volume_tex(struct ShadeInput *shi, const float xyz[3], int mapto_flag, float col[3], float *val);
+void do_volume_tex(struct ShadeInput *shi, const float xyz[3], int mapto_flag, float col[3], float *val, struct Render *re);
void init_render_textures(Render *re);
void end_render_textures(Render *re);
diff --git a/source/blender/render/intern/include/voxeldata.h b/source/blender/render/intern/include/voxeldata.h
index 11ac60baa12..aa4a9fdb845 100644
--- a/source/blender/render/intern/include/voxeldata.h
+++ b/source/blender/render/intern/include/voxeldata.h
@@ -42,6 +42,7 @@ typedef struct VoxelDataHeader
int frames;
} VoxelDataHeader;
+void cache_voxeldata(Tex *tex, int scene_frame);
void make_voxeldata(struct Render *re);
void free_voxeldata(struct Render *re);
int voxeldatatex(struct Tex *tex, const float texvec[3], struct TexResult *texres);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index b7fe4a2e024..8e729b827cd 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -2291,7 +2291,7 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve
shi->displace[0]= shi->displace[1]= shi->displace[2]= 0.0;
- do_material_tex(shi);
+ do_material_tex(shi, re);
//printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2],
//vr->co[0], vr->co[1], vr->co[2]);
@@ -3665,7 +3665,7 @@ static void area_lamp_vectors(LampRen *lar)
float xsize= 0.5f*lar->area_size, ysize= 0.5f*lar->area_sizey, multifac;
/* make it smaller, so area light can be multisampled */
- multifac= 1.0f/sqrt((float)lar->ray_totsamp);
+ multifac= 1.0f/sqrtf((float)lar->ray_totsamp);
xsize *= multifac;
ysize *= multifac;
@@ -3845,7 +3845,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
if(lar->mode & LA_HALO) {
if(lar->spotsi>170.0f) lar->spotsi= 170.0f;
}
- lar->spotsi= cos( M_PI*lar->spotsi/360.0f );
+ lar->spotsi= cosf( (float)M_PI*lar->spotsi/360.0f );
lar->spotbl= (1.0f-lar->spotsi)*la->spotblend;
memcpy(lar->mtex, la->mtex, MAX_MTEX*sizeof(void *));
@@ -4072,8 +4072,8 @@ void init_render_world(Render *re)
re->wrld.misi= 1.0f;
}
- re->wrld.linfac= 1.0 + pow((2.0*re->wrld.exp + 0.5), -10);
- re->wrld.logfac= log( (re->wrld.linfac-1.0)/re->wrld.linfac )/re->wrld.range;
+ re->wrld.linfac= 1.0f + powf((2.0f*re->wrld.exp + 0.5f), -10);
+ re->wrld.logfac= logf((re->wrld.linfac-1.0f)/re->wrld.linfac) / re->wrld.range;
}
@@ -4126,7 +4126,7 @@ static void set_phong_threshold(ObjectRen *obr)
if(tot) {
thresh/= (float)tot;
- obr->ob->smoothresh= cos(0.5*M_PI-saacos(thresh));
+ obr->ob->smoothresh= cosf(0.5f*(float)M_PI-saacos(thresh));
}
}
@@ -5321,11 +5321,11 @@ static void speedvector_project(Render *re, float zco[2], const float co[3], con
/* angle between (0,0,-1) and (co) */
copy_v3_v3(vec, co);
- ang= saacos(-vec[2]/sqrt(vec[0]*vec[0] + vec[2]*vec[2]));
+ ang= saacos(-vec[2]/sqrtf(vec[0]*vec[0] + vec[2]*vec[2]));
if(vec[0]<0.0f) ang= -ang;
zco[0]= ang/pixelphix + zmulx;
- ang= 0.5f*M_PI - saacos(vec[1]/sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]));
+ ang= 0.5f*M_PI - saacos(vec[1]/sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]));
zco[1]= ang/pixelphiy + zmuly;
}
@@ -5353,7 +5353,7 @@ static void calculate_speedvector(const float vectors[2], int step, float winsq,
/* maximize speed for image width, otherwise it never looks good */
len= zco[0]*zco[0] + zco[1]*zco[1];
if(len > winsq) {
- len= winroot/sqrt(len);
+ len= winroot/sqrtf(len);
zco[0]*= len;
zco[1]*= len;
}
@@ -5563,7 +5563,7 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
// maximize speed as usual
len= zco[0]*zco[0] + zco[1]*zco[1];
if(len > winsq) {
- len= winroot/sqrt(len);
+ len= winroot/sqrtf(len);
zco[0]*= len; zco[1]*= len;
}
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 6ea62828601..62cb29c3d5f 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -601,31 +601,31 @@ static int envcube_isect(EnvMap *env, float *vec, float *answ)
}
else {
/* which face */
- if( vec[2]<=-fabs(vec[0]) && vec[2]<=-fabs(vec[1]) ) {
+ if( vec[2] <= -fabsf(vec[0]) && vec[2] <= -fabsf(vec[1]) ) {
face= 0;
labda= -1.0f/vec[2];
answ[0]= labda*vec[0];
answ[1]= labda*vec[1];
}
- else if( vec[2]>=fabs(vec[0]) && vec[2]>=fabs(vec[1]) ) {
+ else if (vec[2] >= fabsf(vec[0]) && vec[2] >= fabsf(vec[1])) {
face= 1;
labda= 1.0f/vec[2];
answ[0]= labda*vec[0];
answ[1]= -labda*vec[1];
}
- else if( vec[1]>=fabs(vec[0]) ) {
+ else if (vec[1] >= fabsf(vec[0])) {
face= 2;
labda= 1.0f/vec[1];
answ[0]= labda*vec[0];
answ[1]= labda*vec[2];
}
- else if( vec[0]<=-fabs(vec[1]) ) {
+ else if (vec[0] <= -fabsf(vec[1])) {
face= 3;
labda= -1.0f/vec[0];
answ[0]= labda*vec[1];
answ[1]= labda*vec[2];
}
- else if( vec[1]<=-fabs(vec[0]) ) {
+ else if (vec[1] <= -fabsf(vec[0])) {
face= 4;
labda= -1.0f/vec[1];
answ[0]= -labda*vec[0];
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index d1f7059416d..785d9ac69d8 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -1092,7 +1092,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float tex
if (tex->imaflag & TEX_FILTER_MIN) {
// make sure the filtersize is minimal in pixels (normal, ref map can have miniature pixel dx/dy)
- const float addval = (0.5f * tex->filtersize) / (float)MIN2(ibuf->x, ibuf->y);
+ const float addval = (0.5f * tex->filtersize) / (float)MIN2(ibuf->x, ibuf->y);
if (addval > minx) minx = addval;
if (addval > miny) miny = addval;
}
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index 7434425d24b..e20fd85d0f0 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -321,7 +321,7 @@ static void occ_face(const OccFace *face, float co[3], float normal[3], float *a
if(co) {
if(vlr->v4)
- interp_v3_v3v3(co, vlr->v1->co, vlr->v3->co, 0.5f);
+ mid_v3_v3v3(co, vlr->v1->co, vlr->v3->co);
else
cent_tri_v3(co, vlr->v1->co, vlr->v2->co, vlr->v3->co);
@@ -1034,8 +1034,8 @@ static float occ_quad_form_factor(float *p, float *n, float *q0, float *q1, floa
/* dot */
vresult.v = (vec_splat_float(n[0])*gx +
- vec_splat_float(n[1])*gy +
- vec_splat_float(n[2])*gz)*vangle;
+ vec_splat_float(n[1])*gy +
+ vec_splat_float(n[2])*gz)*vangle;
result= (vresult.f[0] + vresult.f[1] + vresult.f[2] + vresult.f[3])*(0.5f/(float)M_PI);
result= MAX2(result, 0.0f);
@@ -1623,7 +1623,7 @@ static void *exec_strandsurface_sample(void *data)
if(face[3]) {
co4= mesh->co[face[3]];
- interp_v3_v3v3(co, co1, co3, 0.5f);
+ mid_v3_v3v3(co, co1, co3);
normal_quad_v3( n,co1, co2, co3, co4);
}
else {
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index dacbb6c7a89..d4cd6e1da92 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -163,7 +163,7 @@ static void stats_background(void *UNUSED(arg), RenderStats *rs)
megs_peak_memory = (peak_memory)/(1024.0*1024.0);
fprintf(stdout, "Fra:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->cfra,
- megs_used_memory, mmap_used_memory, megs_peak_memory);
+ megs_used_memory, mmap_used_memory, megs_peak_memory);
if(rs->curfield)
fprintf(stdout, "Field %d ", rs->curfield);
@@ -1838,7 +1838,7 @@ static void do_render_3d(Render *re)
if(render_scene_needs_vector(re))
RE_Database_FromScene_Vectors(re, re->main, re->scene, re->lay);
else
- RE_Database_FromScene(re, re->main, re->scene, re->lay, 1);
+ RE_Database_FromScene(re, re->main, re->scene, re->lay, 1);
/* clear UI drawing locks */
if(re->draw_lock)
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index 36709408496..a78cc3e2288 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -331,7 +331,7 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz,
/* halo being intersected? */
if(har->zs> zz-har->zd) {
t= ((float)(zz-har->zs))/(float)har->zd;
- alpha*= sqrt(sqrt(t));
+ alpha*= sqrtf(sqrtf(t));
}
}
@@ -351,7 +351,7 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz,
rc= hashvectf + (ofs % 768);
- fac= fabs( rc[1]*(har->rad*fabs(rc[0]) - radist) );
+ fac= fabsf( rc[1]*(har->rad*fabsf(rc[0]) - radist) );
if(fac< 1.0f) {
ringf+= (1.0f-fac);
@@ -360,7 +360,7 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz,
}
if(har->type & HA_VECT) {
- dist= fabs( har->cos*(yn) - har->sin*(xn) )/har->rad;
+ dist= fabsf( har->cos*(yn) - har->sin*(xn) )/har->rad;
if(dist>1.0f) dist= 1.0f;
if(har->tex) {
zn= har->sin*xn - har->cos*yn;
@@ -379,7 +379,7 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz,
if(har->hard>=30) {
dist= sqrt(dist);
if(har->hard>=40) {
- dist= sin(dist*M_PI_2);
+ dist= sinf(dist*(float)M_PI_2);
if(har->hard>=50) {
dist= sqrt(dist);
}
@@ -418,8 +418,8 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz,
angle= atan2(yn, xn);
angle*= (1.0f+0.25f*har->starpoints);
- co= cos(angle);
- si= sin(angle);
+ co= cosf(angle);
+ si= sinf(angle);
angle= (co*xn+si*yn)*(co*yn-si*xn);
@@ -427,7 +427,7 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz,
if(ster>1.0f) {
ster= (har->rad)/(ster);
- if(ster<1.0f) dist*= sqrt(ster);
+ if(ster<1.0f) dist*= sqrtf(ster);
}
}
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index c3a4ca9bf7d..5b81ea85914 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -239,7 +239,7 @@ static void pointdensity_cache_object(Render *re, PointDensity *pd, Object *ob)
dm->release(dm);
}
-static void cache_pointdensity(Render *re, Tex *tex)
+void cache_pointdensity(Render *re, Tex *tex)
{
PointDensity *pd = tex->pd;
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index b5386dde623..afc52f7c92a 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -38,6 +38,7 @@
#include "BLI_rand.h"
#include "BLI_utildefines.h"
+#include "DNA_anim_types.h"
#include "DNA_texture_types.h"
#include "DNA_object_types.h"
#include "DNA_lamp_types.h"
@@ -55,10 +56,12 @@
#include "BKE_node.h"
#include "BKE_plugin_types.h"
-
+#include "BKE_animsys.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_scene.h"
#include "BKE_library.h"
#include "BKE_image.h"
@@ -66,6 +69,8 @@
#include "BKE_key.h"
#include "BKE_ipo.h"
+#include "MEM_guardedalloc.h"
+
#include "envmap.h"
#include "pointdensity.h"
#include "voxeldata.h"
@@ -320,7 +325,7 @@ static float wood_int(Tex *tex, float x, float y, float z)
wi = waveform[wf]((x + y + z)*10.0f);
}
else if (wt==TEX_RING) {
- wi = waveform[wf](sqrt(x*x + y*y + z*z)*20.0f);
+ wi = waveform[wf](sqrtf(x*x + y*y + z*z)*20.0f);
}
else if (wt==TEX_BANDNOISE) {
wi = tex->turbul*BLI_gNoise(tex->noisesize, x, y, z, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
@@ -328,7 +333,7 @@ static float wood_int(Tex *tex, float x, float y, float z)
}
else if (wt==TEX_RINGNOISE) {
wi = tex->turbul*BLI_gNoise(tex->noisesize, x, y, z, (tex->noisetype!=TEX_NOISESOFT), tex->noisebasis);
- wi = waveform[wf](sqrt(x*x + y*y + z*z)*20.0f + wi);
+ wi = waveform[wf](sqrtf(x*x + y*y + z*z)*20.0f + wi);
}
return wi;
@@ -654,7 +659,7 @@ static float voronoiTex(Tex *tex, float *texvec, TexResult *texres)
if (sc!=0.f) sc = tex->ns_outscale/sc;
voronoi(texvec[0], texvec[1], texvec[2], da, pa, tex->vn_mexp, tex->vn_distm);
- texres->tin = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->tin = sc * fabsf(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
if (tex->vn_coltype) {
float ca[3]; /* cell color */
@@ -694,11 +699,11 @@ static float voronoiTex(Tex *tex, float *texvec, TexResult *texres)
/* calculate bumpnormal */
voronoi(texvec[0] + offs, texvec[1], texvec[2], da, pa, tex->vn_mexp, tex->vn_distm);
- texres->nor[0] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->nor[0] = sc * fabsf(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
voronoi(texvec[0], texvec[1] + offs, texvec[2], da, pa, tex->vn_mexp, tex->vn_distm);
- texres->nor[1] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->nor[1] = sc * fabsf(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
voronoi(texvec[0], texvec[1], texvec[2] + offs, da, pa, tex->vn_mexp, tex->vn_distm);
- texres->nor[2] = sc * fabs(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
+ texres->nor[2] = sc * fabsf(tex->vn_w1*da[0] + tex->vn_w2*da[1] + tex->vn_w3*da[2] + tex->vn_w4*da[3]);
tex_normal_derivate(tex, texres);
rv |= TEX_NOR;
@@ -1445,9 +1450,9 @@ void texture_rgb_blend(float in[3], const float tex[3], const float out[3], floa
case MTEX_DIFF:
fact*= facg;
facm= 1.0f-fact;
- in[0]= facm*out[0] + fact*fabs(tex[0]-out[0]);
- in[1]= facm*out[1] + fact*fabs(tex[1]-out[1]);
- in[2]= facm*out[2] + fact*fabs(tex[2]-out[2]);
+ in[0]= facm*out[0] + fact*fabsf(tex[0]-out[0]);
+ in[1]= facm*out[1] + fact*fabsf(tex[1]-out[1]);
+ in[2]= facm*out[2] + fact*fabsf(tex[2]-out[2]);
break;
case MTEX_DARK:
@@ -1552,7 +1557,7 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen
break;
case MTEX_DIFF:
- in= facm*out + fact*fabs(tex-out);
+ in= facm*out + fact*fabsf(tex-out);
break;
case MTEX_DARK:
@@ -2141,7 +2146,7 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
return rgbnor;
}
-void do_material_tex(ShadeInput *shi)
+void do_material_tex(ShadeInput *shi, Render *re)
{
CompatibleBump compat_bump;
NTapBump ntap_bump;
@@ -2159,7 +2164,7 @@ void do_material_tex(ShadeInput *shi)
compatible_bump_init(&compat_bump);
ntap_bump_init(&ntap_bump);
- if (R.r.scemode & R_NO_TEX) return;
+ if (re->r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
@@ -2395,7 +2400,7 @@ void do_material_tex(ShadeInput *shi)
float len= normalize_v3(texres.nor);
// can be optimized... (ton)
mul_mat3_m4_v3(shi->obr->ob->obmat, texres.nor);
- mul_mat3_m4_v3(R.viewmat, texres.nor);
+ mul_mat3_m4_v3(re->viewmat, texres.nor);
normalize_v3(texres.nor);
mul_v3_fl(texres.nor, len);
}
@@ -2428,7 +2433,7 @@ void do_material_tex(ShadeInput *shi)
ImBuf *ibuf = BKE_image_get_ibuf(ima, &tex->iuser);
/* don't linearize float buffers, assumed to be linear */
- if (ibuf && !(ibuf->rect_float) && R.r.color_mgt_flag & R_COLOR_MANAGEMENT)
+ if (ibuf && !(ibuf->rect_float) && re->r.color_mgt_flag & R_COLOR_MANAGEMENT)
srgb_to_linearrgb_v3_v3(tcol, tcol);
}
@@ -2473,7 +2478,7 @@ void do_material_tex(ShadeInput *shi)
texres.nor[0] = -texres.nor[0];
texres.nor[1] = -texres.nor[1];
}
- fact = Tnor*fabs(norfac);
+ fact = Tnor*fabsf(norfac);
if (fact>1.f) fact = 1.f;
facm = 1.f-fact;
if(mtex->normapspace == MTEX_NSPACE_TANGENT) {
@@ -2498,12 +2503,12 @@ void do_material_tex(ShadeInput *shi)
if(mtex->normapspace == MTEX_NSPACE_CAMERA);
else if(mtex->normapspace == MTEX_NSPACE_WORLD) {
- mul_mat3_m4_v3(R.viewmat, nor);
+ mul_mat3_m4_v3(re->viewmat, nor);
}
else if(mtex->normapspace == MTEX_NSPACE_OBJECT) {
if(shi->obr && shi->obr->ob)
mul_mat3_m4_v3(shi->obr->ob->obmat, nor);
- mul_mat3_m4_v3(R.viewmat, nor);
+ mul_mat3_m4_v3(re->viewmat, nor);
}
normalize_v3(nor);
@@ -2651,9 +2656,9 @@ void do_material_tex(ShadeInput *shi)
if(shi->amb<0.0f) shi->amb= 0.0f;
else if(shi->amb>1.0f) shi->amb= 1.0f;
- shi->ambr= shi->amb*R.wrld.ambr;
- shi->ambg= shi->amb*R.wrld.ambg;
- shi->ambb= shi->amb*R.wrld.ambb;
+ shi->ambr= shi->amb*re->wrld.ambr;
+ shi->ambg= shi->amb*re->wrld.ambg;
+ shi->ambb= shi->amb*re->wrld.ambb;
}
}
}
@@ -2667,7 +2672,7 @@ void do_material_tex(ShadeInput *shi)
}
-void do_volume_tex(ShadeInput *shi, const float xyz[3], int mapto_flag, float col[3], float *val)
+void do_volume_tex(ShadeInput *shi, const float *xyz, int mapto_flag, float *col, float *val, Render *re)
{
MTex *mtex;
Tex *tex;
@@ -2676,7 +2681,7 @@ void do_volume_tex(ShadeInput *shi, const float xyz[3], int mapto_flag, float co
float co[3], texvec[3];
float fact, stencilTin=1.0;
- if (R.r.scemode & R_NO_TEX) return;
+ if (re->r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
@@ -2716,9 +2721,9 @@ void do_volume_tex(ShadeInput *shi, const float xyz[3], int mapto_flag, float co
mul_m4_v3(ob->imat_ren, co);
}
}
- else if(mtex->texco==TEXCO_GLOB) {
- copy_v3_v3(co, xyz);
- mul_m4_v3(R.viewinv, co);
+ else if(mtex->texco==TEXCO_GLOB) {
+ copy_v3_v3(co, xyz);
+ mul_m4_v3(re->viewinv, co);
}
else continue; // can happen when texco defines disappear and it renders old files
@@ -3026,7 +3031,7 @@ void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float h
/* only works with texture being "real" */
/* use saacos(), fixes bug [#22398], float precision caused lo[2] to be slightly less then -1.0 */
if(lo[0] || lo[1]) { /* check for zero case [#24807] */
- fact= (1.0f/(float)M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1]));
+ fact= (1.0f/(float)M_PI)*saacos(lo[2])/(sqrtf(lo[0]*lo[0] + lo[1]*lo[1]));
tempvec[0]= lo[0]*fact;
tempvec[1]= lo[1]*fact;
tempvec[2]= 0.0;
@@ -3472,4 +3477,257 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
shi->vcol[3]*= texr.ta;
}
+/* A modified part of shadeinput.c -> shade_input_set_uv()
+* Used for sampling UV mapped texture color */
+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;
+ 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; }
+
+ /* compute u,v and derivatives */
+ t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2];
+ t10= v3[axis1]-v2[axis1]; t11= v3[axis2]-v2[axis2];
+
+ detsh= 1.0f/(t00*t11-t10*t01);
+ t00*= detsh; t01*=detsh;
+ t10*=detsh; t11*=detsh;
+
+ uv[0] = (hit[axis1]-v3[axis1])*t11-(hit[axis2]-v3[axis2])*t10;
+ uv[1] = (hit[axis2]-v3[axis2])*t00-(hit[axis1]-v3[axis1])*t01;
+
+ /* u and v are in range -1 to 0, we allow a little bit extra but not too much, screws up speedvectors */
+ CLAMP(uv[0], -2.0f, 1.0f);
+ CLAMP(uv[1], -2.0f, 1.0f);
+}
+
+/* Generate an updated copy of material to use for color sampling. */
+Material *RE_init_sample_material(Material *orig_mat, Scene *scene)
+{
+ Tex *tex = NULL;
+ Material *mat;
+ int tex_nr;
+
+ if (!orig_mat) return NULL;
+
+ /* copy material */
+ mat = localize_material(orig_mat);
+
+ /* update material anims */
+ BKE_animsys_evaluate_animdata(scene, &mat->id, mat->adt, BKE_curframe(scene), ADT_RECALC_ANIM);
+
+ /* strip material copy from unsupported flags */
+ for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
+ if(mat->septex & (1<<tex_nr)) continue;
+
+ if(mat->mtex[tex_nr]) {
+ MTex *mtex = mat->mtex[tex_nr];
+
+ /* only keep compatible texflags */
+ mtex->texflag = mtex->texflag & (MTEX_RGBTOINT | MTEX_STENCIL | MTEX_NEGATIVE | MTEX_ALPHAMIX);
+
+ /* depending of material type, strip non-compatible mapping modes */
+ if (mat->material_type == MA_TYPE_SURFACE) {
+ if (!ELEM4(mtex->texco, TEXCO_ORCO, TEXCO_OBJECT, TEXCO_GLOB, TEXCO_UV)) {
+ /* ignore this texture */
+ mtex->texco = 0;
+ continue;
+ }
+ /* strip all mapto flags except color and alpha */
+ mtex->mapto = (mtex->mapto & MAP_COL) | (mtex->mapto & MAP_ALPHA);
+ }
+ else if (mat->material_type == MA_TYPE_VOLUME) {
+ if (!ELEM3(mtex->texco, TEXCO_OBJECT, TEXCO_ORCO, TEXCO_GLOB)) {
+ /* ignore */
+ mtex->texco = 0;
+ continue;
+ }
+ /* strip all mapto flags except color and alpha */
+ mtex->mapto = mtex->mapto & (MAP_TRANSMISSION_COL | MAP_REFLECTION_COL | MAP_DENSITY);
+ }
+
+ /* if mapped to an object, calculate inverse matrices */
+ if(mtex->texco==TEXCO_OBJECT) {
+ Object *ob= mtex->object;
+ if(ob) {
+ invert_m4_m4(ob->imat, ob->obmat);
+ copy_m4_m4(ob->imat_ren, ob->imat);
+ }
+ }
+
+ /* copy texture */
+ tex= mtex->tex = localize_texture(mtex->tex);
+
+ /* update texture anims */
+ BKE_animsys_evaluate_animdata(scene, &tex->id, tex->adt, BKE_curframe(scene), ADT_RECALC_ANIM);
+
+ /* update texture cache if required */
+ if(tex->type==TEX_VOXELDATA) {
+ cache_voxeldata(tex, (int)scene->r.cfra);
+ }
+ if(tex->type==TEX_POINTDENSITY) {
+ /* set dummy values for render and do cache */
+ Render dummy_re = {0};
+ dummy_re.scene = scene;
+ unit_m4(dummy_re.viewinv);
+ unit_m4(dummy_re.viewmat);
+ unit_m4(dummy_re.winmat);
+ dummy_re.winx = dummy_re.winy = 128;
+ cache_pointdensity(&dummy_re, tex);
+ }
+
+ /* update image sequences and movies */
+ if(tex->ima && ELEM(tex->ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+ if(tex->iuser.flag & IMA_ANIM_ALWAYS)
+ BKE_image_user_calc_frame(&tex->iuser, (int)scene->r.cfra, 0);
+ }
+ }
+ }
+ return mat;
+}
+
+/* free all duplicate data allocated by RE_init_sample_material() */
+void RE_free_sample_material(Material *mat)
+{
+ int tex_nr;
+
+ /* free textures */
+ for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
+ if(mat->septex & (1<<tex_nr)) continue;
+ if(mat->mtex[tex_nr]) {
+ MTex *mtex= mat->mtex[tex_nr];
+ free_texture(mtex->tex);
+ MEM_freeN(mtex->tex);
+ mtex->tex = NULL;
+ }
+ }
+
+ free_material(mat);
+ MEM_freeN(mat);
+}
+
+
+
+/*
+* Get material diffuse color and alpha (including linked textures) in given coordinates
+*
+* color,alpha : input/output color values
+* volume_co : sample coordinate in global space. used by volumetric materials
+* surface_co : sample surface coordinate in global space. used by "surface" materials
+* face_index : surface face index
+* hit_quad : whether point is on second "half" of a quad
+* orcoDm : orco state derived mesh
+*/
+void RE_sample_material_color(Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3], int face_index, short hit_quad, DerivedMesh *orcoDm, Object *ob)
+{
+ MFace *mface;
+ int v1, v2, v3;
+ MVert *mvert;
+ float uv[3], normal[3];
+ ShadeInput shi = {0};
+ Render re = {0};
+
+ /* Get face data */
+ mvert = orcoDm->getVertArray(orcoDm);
+ mface = orcoDm->getFaceArray(orcoDm);
+
+ if (!mvert || !mface || !mat) return;
+ v1=mface[face_index].v1, v2=mface[face_index].v2, v3=mface[face_index].v3;
+ if (hit_quad) {v2=mface[face_index].v3; v3=mface[face_index].v4;}
+ normal_tri_v3( normal, mvert[v1].co, mvert[v2].co, mvert[v3].co);
+
+ /* generate shadeinput with data required */
+ shi.mat = mat;
+
+ /* fill shadeinput data depending on material type */
+ if (mat->material_type == MA_TYPE_SURFACE) {
+ /* global coordinates */
+ copy_v3_v3(shi.gl, surface_co);
+ /* object space coordinates */
+ copy_v3_v3(shi.co, surface_co);
+ mul_m4_v3(ob->imat, shi.co);
+ /* orco coordinates */
+ {
+ float l;
+ /* Get generated UV */
+ textured_face_generate_uv(uv, normal, shi.co, mvert[v1].co, mvert[v2].co, mvert[v3].co);
+ l= 1.0f+uv[0]+uv[1];
+
+ /* calculate generated coordinate */
+ shi.lo[0]= l*mvert[v3].co[0]-uv[0]*mvert[v1].co[0]-uv[1]*mvert[v2].co[0];
+ shi.lo[1]= l*mvert[v3].co[1]-uv[0]*mvert[v1].co[1]-uv[1]*mvert[v2].co[1];
+ shi.lo[2]= l*mvert[v3].co[2]-uv[0]*mvert[v1].co[2]-uv[1]*mvert[v2].co[2];
+ }
+ /* uv coordinates */
+ {
+ int i, layers = CustomData_number_of_layers(&orcoDm->faceData, CD_MTFACE);
+ int layer_index = CustomData_get_layer_index(&orcoDm->faceData, CD_MTFACE);
+
+ /* for every uv layer set coords and name */
+ for (i=0; i<layers; i++) {
+ if(layer_index >= 0) {
+ float *uv1, *uv2, *uv3;
+ float l;
+ CustomData *data = &orcoDm->faceData;
+ MTFace *tface = (MTFace*) data->layers[layer_index+i].data;
+ float uv[3];
+ /* point layer name from actual layer data */
+ shi.uv[i].name = data->layers[i].name;
+ /* Get generated coordinates to calculate UV from */
+ textured_face_generate_uv(uv, normal, shi.co, mvert[v1].co, mvert[v2].co, mvert[v3].co);
+ /* Get UV mapping coordinate */
+ l= 1.0f+uv[0]+uv[1];
+
+ uv1= tface[face_index].uv[0];
+ uv2= (hit_quad) ? tface[face_index].uv[2] : tface[face_index].uv[1];
+ uv3= (hit_quad) ? tface[face_index].uv[3] : tface[face_index].uv[2];
+
+ shi.uv[i].uv[0]= -1.0f + 2.0f*(l*uv3[0]-uv[0]*uv1[0]-uv[1]*uv2[0]);
+ shi.uv[i].uv[1]= -1.0f + 2.0f*(l*uv3[1]-uv[0]*uv1[1]-uv[1]*uv2[1]);
+ shi.uv[i].uv[2]= 0.0f; /* texture.c assumes there are 3 coords */
+ }
+ }
+ /* active uv layer */
+ shi.actuv = CustomData_get_active_layer_index(&orcoDm->faceData,CD_MTFACE) - layer_index;
+ shi.totuv = layers;
+ }
+
+ /* apply initial values from material */
+ shi.r = mat->r;
+ shi.g = mat->g;
+ shi.b = mat->b;
+ shi.alpha = mat->alpha;
+
+ /* do texture */
+ do_material_tex(&shi, &re);
+
+ /* apply result */
+ color[0] = shi.r;
+ color[1] = shi.g;
+ color[2] = shi.b;
+ *alpha = shi.alpha;
+ }
+ else if (mat->material_type == MA_TYPE_VOLUME) {
+ ObjectInstanceRen obi = {0};
+ obi.ob = ob;
+ shi.obi = &obi;
+ unit_m4(re.viewinv);
+ copy_v3_v3(color, mat->vol.reflection_col);
+ *alpha = mat->vol.density;
+
+ /* do texture */
+ do_volume_tex(&shi, volume_co, (MAP_TRANSMISSION_COL | MAP_REFLECTION_COL | MAP_DENSITY),
+ color, alpha, &re);
+ }
+}
+
/* eof */
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index f3eb2234778..8cb7009f756 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -1083,7 +1083,7 @@ static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int
else {
/* got warning on this for 64 bits.... */
/* but it's working code! in this case rz is not a pointer but zvalue (ton) */
- zsamp= GET_INT_FROM_POINTER(rz);
+ zsamp= GET_INT_FROM_POINTER(rz);
}
/* tricky stuff here; we use ints which can overflow easily with bias values */
@@ -1267,7 +1267,7 @@ static float readshadowbuf_halo(ShadBuf *shb, ShadSampleBuf *shsample, int xs, i
else {
/* same as before */
/* still working code! (ton) */
- zsamp= GET_INT_FROM_POINTER(rz);
+ zsamp= GET_INT_FROM_POINTER(rz);
}
/* NO schadow when sampled at 'eternal' distance */
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index b4d0e689c35..f2a053e89d9 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -469,17 +469,20 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
scol->col[0]= cp[3]/255.0f;
scol->col[1]= cp[2]/255.0f;
scol->col[2]= cp[1]/255.0f;
+ scol->col[3]= cp[0]/255.0f;
}
if(shi->totcol) {
shi->vcol[0]= shi->col[shi->actcol].col[0];
shi->vcol[1]= shi->col[shi->actcol].col[1];
shi->vcol[2]= shi->col[shi->actcol].col[2];
+ shi->vcol[3]= shi->col[shi->actcol].col[3];
}
else {
shi->vcol[0]= 0.0f;
shi->vcol[1]= 0.0f;
shi->vcol[2]= 0.0f;
+ shi->vcol[3]= 0.0f;
}
}
@@ -512,6 +515,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
shi->vcol[0]= 1.0f;
shi->vcol[1]= 1.0f;
shi->vcol[2]= 1.0f;
+ shi->vcol[3]= 1.0f;
}
}
}
@@ -528,6 +532,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
shi->vcol[0]= 1.0f;
shi->vcol[1]= 1.0f;
shi->vcol[2]= 1.0f;
+ shi->vcol[3]= 1.0f;
}
}
@@ -1093,10 +1098,10 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->actcol= obr->actmcol;
if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP)) {
- float alpha[8];
for (i=0; (mcol=RE_vlakren_get_mcol(obr, vlr, i, &name, 0)); i++) {
ShadeInputCol *scol= &shi->col[i];
char *cp1, *cp2, *cp3;
+ float a[3];
shi->totcol++;
scol->name= name;
@@ -1104,19 +1109,29 @@ void shade_input_set_shade_texco(ShadeInput *shi)
cp1= (char *)(mcol+j1);
cp2= (char *)(mcol+j2);
cp3= (char *)(mcol+j3);
-
- scol->col[0]= (l*((float)cp3[3]) - u*((float)cp1[3]) - v*((float)cp2[3]))/255.0f;
- scol->col[1]= (l*((float)cp3[2]) - u*((float)cp1[2]) - v*((float)cp2[2]))/255.0f;
- scol->col[2]= (l*((float)cp3[1]) - u*((float)cp1[1]) - v*((float)cp2[1]))/255.0f;
- alpha[i]= (l*((float)cp3[0]) - u*((float)cp1[0]) - v*((float)cp2[0]))/255.0f;
+ /* alpha values */
+ a[0] = ((float)cp1[0])/255.f;
+ a[1] = ((float)cp2[0])/255.f;
+ a[2] = ((float)cp3[0])/255.f;
+ scol->col[3]= l*a[2] - u*a[0] - v*a[1];
+
+ /* sample premultiplied color value */
+ scol->col[0]= (l*((float)cp3[3])*a[2] - u*((float)cp1[3])*a[0] - v*((float)cp2[3])*a[1])/255.f;
+ scol->col[1]= (l*((float)cp3[2])*a[2] - u*((float)cp1[2])*a[0] - v*((float)cp2[2])*a[1])/255.f;
+ scol->col[2]= (l*((float)cp3[1])*a[2] - u*((float)cp1[1])*a[0] - v*((float)cp2[1])*a[1])/255.f;
+
+ /* if not zero alpha, restore non-multiplied color */
+ if (scol->col[3]) {
+ mul_v3_fl(scol->col, 1.0f/scol->col[3]);
+ }
}
if(shi->totcol) {
shi->vcol[0]= shi->col[shi->actcol].col[0];
shi->vcol[1]= shi->col[shi->actcol].col[1];
shi->vcol[2]= shi->col[shi->actcol].col[2];
- shi->vcol[3]= shi->mat->vcol_alpha ? alpha[shi->actcol] : 1.0f;
+ shi->vcol[3]= shi->col[shi->actcol].col[3];
}
else {
shi->vcol[0]= 0.0f;
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 0432ab43e04..5182cf4d4b5 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -174,7 +174,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
VECCOPY(npos, p1); // npos is double!
/* pre-scale */
- npos[2]*= lar->sh_zfac;
+ npos[2] *= (double)lar->sh_zfac;
}
else {
VECCOPY(npos, lar->sh_invcampos); /* in initlamp calculated */
@@ -204,11 +204,11 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
maxz*= lar->sh_zfac;
maxy= lar->imat[0][1]*p1[0]+lar->imat[1][1]*p1[1]+lar->imat[2][1]*p1[2];
- if( fabs(nray[2]) < FLT_EPSILON ) use_yco= 1;
+ if( fabsf(nray[2]) < FLT_EPSILON ) use_yco= 1;
}
/* scale z to make sure volume is normalized */
- nray[2]*= lar->sh_zfac;
+ nray[2] *= (double)lar->sh_zfac;
/* nray does not need normalization */
ladist= lar->sh_zfac*lar->dist;
@@ -260,7 +260,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
/* intersction point with -ladist, the bottom of the cone */
if(use_yco==0) {
- t3= (-ladist-npos[2])/nray[2];
+ t3= ((double)(-ladist)-npos[2])/nray[2];
/* de we have to replace one of the intersection points? */
if(ok1) {
@@ -413,7 +413,7 @@ float fresnel_fac(float *view, float *vn, float grad, float fac)
if(t1>0.0f) t2= 1.0f+t1;
else t2= 1.0f-t1;
- t2= grad + (1.0f-grad)*pow(t2, fac);
+ t2= grad + (1.0f-grad)*powf(t2, fac);
if(t2<0.0f) return 0.0f;
else if(t2>1.0f) return 1.0f;
@@ -698,7 +698,7 @@ static float WardIso_Spec( float *n, float *l, float *v, float rms, int tangent)
angle = tan(saacos(nh));
alpha = MAX2(rms, 0.001f);
- i= nl * (1.0f/(4.0f*M_PI*alpha*alpha)) * (exp( -(angle*angle)/(alpha*alpha))/(sqrt(nv*nl)));
+ i= nl * (1.0f/(4.0f*(float)M_PI*alpha*alpha)) * (expf( -(angle*angle)/(alpha*alpha))/(sqrtf(nv*nl)));
return i;
}
@@ -777,7 +777,7 @@ static float OrenNayar_Diff(float nl, float *n, float *l, float *v, float rough
b*= 0.95f; /* prevent tangens from shooting to inf, 'nl' can be not a dot product here. */
/* overflow only happens with extreme size area light, and higher roughness */
- i = nl * ( A + ( B * t * sin(a) * tan(b) ) );
+ i = nl * ( A + ( B * t * sinf(a) * tanf(b) ) );
return i;
}
@@ -864,16 +864,22 @@ void shade_color(ShadeInput *shi, ShadeResult *shr)
{
Material *ma= shi->mat;
- if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) {
+ if(ma->mode & (MA_FACETEXTURE)) {
shi->r= shi->vcol[0];
shi->g= shi->vcol[1];
shi->b= shi->vcol[2];
if(ma->mode & (MA_FACETEXTURE_ALPHA))
shi->alpha= shi->vcol[3];
}
+ else if(ma->mode & (MA_VERTEXCOLP)) {
+ float neg_alpha = 1.0f - shi->vcol[3];
+ shi->r= shi->r*neg_alpha + shi->vcol[0]*shi->vcol[3];
+ shi->g= shi->g*neg_alpha + shi->vcol[1]*shi->vcol[3];
+ shi->b= shi->b*neg_alpha + shi->vcol[2]*shi->vcol[3];
+ }
if(ma->texco)
- do_material_tex(shi);
+ do_material_tex(shi, &R);
if(ma->fresnel_tra!=0.0f)
shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
@@ -1630,9 +1636,9 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
static void wrld_exposure_correct(float diff[3])
{
- diff[0]= R.wrld.linfac*(1.0f-exp( diff[0]*R.wrld.logfac) );
- diff[1]= R.wrld.linfac*(1.0f-exp( diff[1]*R.wrld.logfac) );
- diff[2]= R.wrld.linfac*(1.0f-exp( diff[2]*R.wrld.logfac) );
+ diff[0]= R.wrld.linfac*(1.0f-expf( diff[0]*R.wrld.logfac) );
+ diff[1]= R.wrld.linfac*(1.0f-expf( diff[1]*R.wrld.logfac) );
+ diff[2]= R.wrld.linfac*(1.0f-expf( diff[2]*R.wrld.logfac) );
}
void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
@@ -1655,15 +1661,21 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* material color itself */
if(passflag & (SCE_PASS_COMBINED|SCE_PASS_RGBA)) {
- if(ma->mode & (MA_VERTEXCOLP|MA_FACETEXTURE)) {
+ if(ma->mode & (MA_FACETEXTURE)) {
shi->r= shi->vcol[0];
shi->g= shi->vcol[1];
shi->b= shi->vcol[2];
if((ma->mode & (MA_FACETEXTURE_ALPHA)) || ma->vcol_alpha)
- shi->alpha= (shi->mode & MA_TRANSP) ? shi->vcol[3] : 1.0f;
+ shi->alpha= shi->vcol[3];
+ }
+ else if(ma->mode & (MA_VERTEXCOLP)) {
+ float neg_alpha = 1.0f - shi->vcol[3];
+ shi->r= shi->r*neg_alpha + shi->vcol[0]*shi->vcol[3];
+ shi->g= shi->g*neg_alpha + shi->vcol[1]*shi->vcol[3];
+ shi->b= shi->b*neg_alpha + shi->vcol[2]*shi->vcol[3];
}
if(ma->texco){
- do_material_tex(shi);
+ do_material_tex(shi, &R);
if (!(shi->mode & MA_TRANSP)) shi->alpha = 1.0f;
}
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index 29eea081672..8b3c3ec5c3d 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -285,7 +285,7 @@ static inline int lc_to_ms_I(int x, int y, int z, int *n)
/* *** multiple scattering approximation *** */
/* get the total amount of light energy in the light cache. used to normalise after multiple scattering */
-static float total_ss_energy(VolumePrecache *vp)
+static float total_ss_energy(Render *re, int do_test_break, VolumePrecache *vp)
{
int x, y, z;
int *res = vp->res;
@@ -301,12 +301,14 @@ static float total_ss_energy(VolumePrecache *vp)
if (vp->data_b[i] > 0.f) energy += vp->data_b[i];
}
}
+
+ if (do_test_break && re->test_break(re->tbh)) break;
}
return energy;
}
-static float total_ms_energy(float *sr, float *sg, float *sb, int *res)
+static float total_ms_energy(Render *re, int do_test_break, float *sr, float *sg, float *sb, int *res)
{
int x, y, z;
float energy=0.f;
@@ -321,16 +323,19 @@ static float total_ms_energy(float *sr, float *sg, float *sb, int *res)
if (sb[i] > 0.f) energy += sb[i];
}
}
+
+ if (do_test_break && re->test_break(re->tbh)) break;
}
return energy;
}
-static void ms_diffuse(float *x0, float *x, float diff, int *n) //n is the unpadded resolution
+static void ms_diffuse(Render *re, int do_test_break, float *x0, float *x, float diff, int *n) //n is the unpadded resolution
{
int i, j, k, l;
const float dt = VOL_MS_TIMESTEP;
- const float a = dt*diff*n[0]*n[1]*n[2];
+ size_t size = n[0]*n[1]*n[2];
+ const float a = dt*diff*size;
for (l=0; l<20; l++)
{
@@ -345,7 +350,11 @@ static void ms_diffuse(float *x0, float *x, float diff, int *n) //n is the unpad
) / (1+6*a);
}
}
+
+ if (do_test_break && re->test_break(re->tbh)) break;
}
+
+ if (re->test_break(re->tbh)) break;
}
}
@@ -359,6 +368,7 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
int x, y, z, m;
int *n = vp->res;
const int size = (n[0]+2)*(n[1]+2)*(n[2]+2);
+ const int do_test_break = (size > 100000);
double time, lasttime= PIL_check_seconds_timer();
float total;
float c=1.0f;
@@ -374,7 +384,7 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
total = (float)(n[0]*n[1]*n[2]*simframes);
- energy_ss = total_ss_energy(vp);
+ energy_ss = total_ss_energy(re, do_test_break, vp);
/* Scattering as diffusion pass */
for (m=0; m<simframes; m++)
@@ -409,21 +419,26 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
}
}
}
+
+ if (do_test_break && re->test_break(re->tbh)) break;
}
+
+ if (re->test_break(re->tbh)) break;
+
SWAP(float *,sr,sr0);
SWAP(float *,sg,sg0);
SWAP(float *,sb,sb0);
/* main diffusion simulation */
- ms_diffuse(sr0, sr, diff, n);
- ms_diffuse(sg0, sg, diff, n);
- ms_diffuse(sb0, sb, diff, n);
+ ms_diffuse(re, do_test_break, sr0, sr, diff, n);
+ ms_diffuse(re, do_test_break, sg0, sg, diff, n);
+ ms_diffuse(re, do_test_break, sb0, sb, diff, n);
if (re->test_break(re->tbh)) break;
}
/* normalisation factor to conserve energy */
- energy_ms = total_ms_energy(sr, sg, sb, n);
+ energy_ms = total_ms_energy(re, do_test_break, sr, sg, sb, n);
fac *= (energy_ss / energy_ms);
/* blend multiple scattering back in the light cache */
@@ -449,6 +464,8 @@ static void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Materi
vp->data_b[i] = origf * vp->data_b[i] + fac * sb[j];
}
}
+
+ if (do_test_break && re->test_break(re->tbh)) break;
}
MEM_freeN(sr0);
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index 577671af684..4b1894236fc 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -289,7 +289,7 @@ float vol_get_density(struct ShadeInput *shi, const float co[3])
float density_scale = shi->mat->vol.density_scale;
if (shi->mat->mapto_textured & MAP_DENSITY)
- do_volume_tex(shi, co, MAP_DENSITY, NULL, &density);
+ do_volume_tex(shi, co, MAP_DENSITY, NULL, &density, &R);
// if meta-object, modulate by metadensity without increasing it
if (shi->obi->obr->ob->type == OB_MBALL) {
@@ -311,11 +311,11 @@ static void vol_get_reflection_color(ShadeInput *shi, float ref_col[3], const fl
copy_v3_v3(ref_col, shi->mat->vol.reflection_col);
if (shi->mat->mapto_textured & (MAP_SCATTERING+MAP_REFLECTION_COL))
- do_volume_tex(shi, co, MAP_SCATTERING+MAP_REFLECTION_COL, ref_col, &scatter);
+ do_volume_tex(shi, co, MAP_SCATTERING+MAP_REFLECTION_COL, ref_col, &scatter, &R);
/* only one single float parameter at a time... :s */
if (shi->mat->mapto_textured & (MAP_REFLECTION))
- do_volume_tex(shi, co, MAP_REFLECTION, NULL, &reflection);
+ do_volume_tex(shi, co, MAP_REFLECTION, NULL, &reflection, &R);
ref_col[0] = reflection * ref_col[0] * scatter;
ref_col[1] = reflection * ref_col[1] * scatter;
@@ -330,7 +330,7 @@ static void vol_get_emission(ShadeInput *shi, float emission_col[3], const float
copy_v3_v3(emission_col, shi->mat->vol.emission_col);
if (shi->mat->mapto_textured & (MAP_EMISSION+MAP_EMISSION_COL))
- do_volume_tex(shi, co, MAP_EMISSION+MAP_EMISSION_COL, emission_col, &emission);
+ do_volume_tex(shi, co, MAP_EMISSION+MAP_EMISSION_COL, emission_col, &emission, &R);
emission_col[0] = emission_col[0] * emission;
emission_col[1] = emission_col[1] * emission;
@@ -350,7 +350,7 @@ static void vol_get_sigma_t(ShadeInput *shi, float sigma_t[3], const float co[3]
float scattering = shi->mat->vol.scattering;
if (shi->mat->mapto_textured & (MAP_SCATTERING+MAP_TRANSMISSION_COL))
- do_volume_tex(shi, co, MAP_SCATTERING+MAP_TRANSMISSION_COL, transmission_col, &scattering);
+ do_volume_tex(shi, co, MAP_SCATTERING+MAP_TRANSMISSION_COL, transmission_col, &scattering, &R);
sigma_t[0] = (1.0f - transmission_col[0]) + scattering;
sigma_t[1] = (1.0f - transmission_col[1]) + scattering;
diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c
index 57ff5f4237a..ce5561b3e34 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -309,7 +309,7 @@ static void init_frame_smoke(VoxelData *vd, float cfra)
#endif
}
-static void cache_voxeldata(struct Render *re, Tex *tex)
+void cache_voxeldata(Tex *tex, int scene_frame)
{
VoxelData *vd = tex->vd;
FILE *fp;
@@ -317,7 +317,7 @@ static void cache_voxeldata(struct Render *re, Tex *tex)
char path[sizeof(vd->source_path)];
/* only re-cache if dataset needs updating */
- if ((vd->flag & TEX_VD_STILL) || (vd->cachedframe == re->r.cfra))
+ if ((vd->flag & TEX_VD_STILL) || (vd->cachedframe == scene_frame))
if (vd->ok) return;
/* clear out old cache, ready for new */
@@ -329,7 +329,7 @@ static void cache_voxeldata(struct Render *re, Tex *tex)
if (vd->flag & TEX_VD_STILL)
curframe = vd->still_frame;
else
- curframe = re->r.cfra;
+ curframe = scene_frame;
BLI_strncpy(path, vd->source_path, sizeof(path));
@@ -338,7 +338,7 @@ static void cache_voxeldata(struct Render *re, Tex *tex)
load_frame_image_sequence(vd, tex);
return;
case TEX_VD_SMOKE:
- init_frame_smoke(vd, re->r.cfra);
+ init_frame_smoke(vd, scene_frame);
return;
case TEX_VD_BLENDERVOXEL:
BLI_path_abs(path, G.main->name);
@@ -373,7 +373,7 @@ void make_voxeldata(struct Render *re)
/* XXX: should be doing only textures used in this render */
for (tex= re->main->tex.first; tex; tex= tex->id.next) {
if(tex->id.us && tex->type==TEX_VOXELDATA) {
- cache_voxeldata(re, tex);
+ cache_voxeldata(tex, re->r.cfra);
}
}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 03b0d637de1..4342c9f4bff 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -457,14 +457,14 @@ void WM_event_print(wmEvent *event)
RNA_enum_identifier(event_value_items, event->val, &val_id);
printf("wmEvent - type:%d/%s, val:%d/%s, "
- "shift:%d, ctrl:%d, alt:%d, oskey:%d, keymodifier:%d, "
- "mouse:(%d,%d), ascii:'%c', utf8:'%.*s', "
- "keymap_idname:%s, pointer:%p\n",
- event->type, type_id, event->val, val_id,
- event->shift, event->ctrl, event->alt, event->oskey, event->keymodifier,
- event->x, event->y, event->ascii,
+ "shift:%d, ctrl:%d, alt:%d, oskey:%d, keymodifier:%d, "
+ "mouse:(%d,%d), ascii:'%c', utf8:'%.*s', "
+ "keymap_idname:%s, pointer:%p\n",
+ event->type, type_id, event->val, val_id,
+ event->shift, event->ctrl, event->alt, event->oskey, event->keymodifier,
+ event->x, event->y, event->ascii,
BLI_str_utf8_size(event->utf8_buf), event->utf8_buf,
- event->keymap_idname, (void *)event);
+ event->keymap_idname, (void *)event);
}
else {
printf("wmEvent - NULL\n");
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index f12dec6459a..4367a8b03ef 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -3062,8 +3062,8 @@ static int radial_control_get_path(PointerRNA *ctx_ptr, wmOperator *op,
if(*r_prop && (len = RNA_property_array_length(r_ptr, *r_prop)) != req_length) {
MEM_freeN(str);
BKE_reportf(op->reports, RPT_ERROR,
- "Property from path %s has length %d instead of %d",
- name, len, req_length);
+ "Property from path %s has length %d instead of %d",
+ name, len, req_length);
return 0;
}
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 5ac36f5eaca..79696b4d408 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -47,6 +47,7 @@ struct CSG_VertexIteratorDescriptor;
struct ColorBand;
struct CurveMapping;
struct Curve;
+struct DerivedMesh;
struct EditBone;
struct EditFace;
struct EditMesh;
@@ -68,6 +69,7 @@ struct MCol;
struct MenuType;
struct Mesh;
struct ModifierData;
+struct MovieClip;
struct MultiresModifierData;
struct NodeBlurData;
struct Nurb;
@@ -78,11 +80,13 @@ struct RenderEngine;
struct RenderEngineType;
struct RenderLayer;
struct RenderResult;
+struct Scene;
struct SceneRenderLayer;
struct ScrArea;
struct SculptSession;
struct ShadeInput;
struct ShadeResult;
+struct SpaceClip;
struct SpaceImage;
struct SpaceNode;
struct Tex;
@@ -127,6 +131,11 @@ int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osa
int multitex_ext_safe(struct Tex *tex, float *texvec, struct TexResult *texres){return 0;}
int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres, short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex) {return 0;}
+struct Material *RE_init_sample_material(struct Material *orig_mat, struct Scene *scene) {return (struct Material *)NULL;}
+void RE_free_sample_material(struct Material *mat) {}
+void RE_sample_material_color(struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3],
+ int face_index, short hit_quad, struct DerivedMesh *orcoDm, struct Object *ob) {}
+
/* nodes */
struct RenderResult *RE_GetResult(struct Render *re){return (struct RenderResult *) NULL;}
struct Render *RE_GetRender(const char *name){return (struct Render *) NULL;}
@@ -194,7 +203,7 @@ int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit){r
int ED_space_image_show_render(struct SpaceImage *sima){return 0;}
int ED_space_image_show_paint(struct SpaceImage *sima){return 0;}
void ED_space_image_paint_update(struct wmWindowManager *wm, struct ToolSettings *settings){}
-void ED_space_image_set(struct bContext *C, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima){}
+void ED_space_image_set(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima){}
struct ImBuf *ED_space_image_buffer(struct SpaceImage *sima){return (struct ImBuf *) NULL;}
void ED_screen_set_scene(struct bContext *C, struct Scene *scene){}
void ED_space_clip_set(struct bContext *C, struct SpaceClip *sc, struct MovieClip *clip){}
@@ -375,6 +384,8 @@ void uiTemplateWaveform(struct uiLayout *layout, struct PointerRNA *ptr, char *p
void uiTemplateVectorscope(struct uiLayout *_self, struct PointerRNA *data, char* property, int expand){}
void uiTemplateNodeLink(struct uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input) {}
void uiTemplateNodeView(struct uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input) {}
+void uiTemplateTextureUser(struct uiLayout *layout, struct bContext *C) {}
+void uiTemplateTextureShow(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop) {}
void uiTemplateKeymapItemProperties(struct uiLayout *layout, struct PointerRNA *ptr){}
void uiTemplateMovieClip(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, int compact){}
void uiTemplateTrack(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname){}
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 8cec2fed252..89dbf740739 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -752,6 +752,16 @@ if(WITH_MOD_FLUID)
list(APPEND BLENDER_LINK_LIBS bf_intern_elbeem)
endif()
+if(WITH_CYCLES)
+ list(APPEND BLENDER_LINK_LIBS
+ cycles_render
+ cycles_bvh
+ cycles_device
+ cycles_kernel
+ cycles_util
+ cycles_subd)
+endif()
+
#if(UNIX)
# Sort libraries
set(BLENDER_SORTED_LIBS
@@ -771,7 +781,6 @@ endif()
bf_editor_space_outliner
bf_editor_space_script
bf_editor_space_sequencer
- bf_editor_space_sound
bf_editor_space_time
bf_editor_space_userpref
bf_editor_space_view3d
@@ -834,7 +843,6 @@ endif()
extern_minilzo
extern_lzma
extern_colamd
- extern_libmv
ge_logic_ketsji
extern_recastnavigation
ge_phys_common
@@ -856,6 +864,13 @@ endif()
bf_blenfont
bf_intern_audaspace
bf_intern_mikktspace
+ bf_intern_cycles
+ cycles_render
+ cycles_bvh
+ cycles_device
+ cycles_kernel
+ cycles_util
+ cycles_subd
)
if(WITH_LIBMV)
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
index ecf9427eddd..aa62479d420 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
@@ -177,8 +177,9 @@ void BL_ShapeActionActuator::BlendShape(Key* key, float srcweight)
dstweight = 1.0F - srcweight;
for (it=m_blendshape.begin(), kb = (KeyBlock*)key->block.first;
- kb && it != m_blendshape.end();
- kb = (KeyBlock*)kb->next, it++) {
+ kb && it != m_blendshape.end();
+ kb = (KeyBlock*)kb->next, it++)
+ {
kb->curval = kb->curval * dstweight + (*it) * srcweight;
}
}
diff --git a/source/gameengine/Expressions/IntValue.h b/source/gameengine/Expressions/IntValue.h
index bae3eb11298..e6802b6ad04 100644
--- a/source/gameengine/Expressions/IntValue.h
+++ b/source/gameengine/Expressions/IntValue.h
@@ -36,8 +36,8 @@ public:
CIntValue();
CIntValue(cInt innie);
CIntValue(cInt innie,
- const char *name,
- AllocationTYPE alloctype=CValue::HEAPVALUE);
+ const char *name,
+ AllocationTYPE alloctype=CValue::HEAPVALUE);
virtual CValue* Calc(VALUE_OPERATOR op,
CValue *val);
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.h b/source/gameengine/GameLogic/SCA_MouseSensor.h
index 4bac9c10e13..91352ce58bc 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.h
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.h
@@ -88,9 +88,9 @@ class SCA_MouseSensor : public SCA_ISensor
bool isValid(KX_MOUSESENSORMODE);
SCA_MouseSensor(class SCA_MouseManager* keybdmgr,
- int startx,int starty,
- short int mousemode,
- SCA_IObject* gameobj);
+ int startx,int starty,
+ short int mousemode,
+ SCA_IObject* gameobj);
virtual ~SCA_MouseSensor();
virtual CValue* GetReplica();
diff --git a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
index cc7630b7afd..df1bf31ec12 100644
--- a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
@@ -451,14 +451,14 @@ MakeScreenShot(
// png image settings
png_set_IHDR(png_ptr,
- info_ptr,
- GetWidth(),
- GetHeight(),
- 8,
- color_type,
- PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
+ info_ptr,
+ GetWidth(),
+ GetHeight(),
+ 8,
+ color_type,
+ PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT,
+ PNG_FILTER_TYPE_DEFAULT);
// write the file header information
png_write_info(png_ptr, info_ptr);
diff --git a/source/gameengine/Ketsji/BL_Action.cpp b/source/gameengine/Ketsji/BL_Action.cpp
index 931e5412338..1d5a3dd461a 100644
--- a/source/gameengine/Ketsji/BL_Action.cpp
+++ b/source/gameengine/Ketsji/BL_Action.cpp
@@ -309,8 +309,9 @@ void BL_Action::BlendShape(Key* key, float srcweight, std::vector<float>& blends
dstweight = 1.0F - srcweight;
//printf("Dst: %f\tSrc: %f\n", srcweight, dstweight);
for (it=blendshape.begin(), kb = (KeyBlock*)key->block.first;
- kb && it != blendshape.end();
- kb = (KeyBlock*)kb->next, it++) {
+ kb && it != blendshape.end();
+ kb = (KeyBlock*)kb->next, it++)
+ {
//printf("OirgKeys: %f\t%f\n", kb->curval, (*it));
kb->curval = kb->curval * dstweight + (*it) * srcweight;
//printf("NewKey: %f\n", kb->curval);
diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp
index aea33246a3f..682b42cc3cf 100644
--- a/source/gameengine/Ketsji/BL_Shader.cpp
+++ b/source/gameengine/Ketsji/BL_Shader.cpp
@@ -451,7 +451,7 @@ void BL_Shader::Update( const RAS_MeshSlot & ms, RAS_IRasterizer* rasty )
const MT_Matrix4x4& view = rasty->GetViewMatrix();
if(mAttr==SHD_TANGENT)
- ms.m_mesh->SetMeshModified(true);
+ ms.m_mesh->SetMeshModified(true);
BL_UniformVecDef::iterator it;
for(it = mPreDef.begin(); it!= mPreDef.end(); it++)
diff --git a/source/gameengine/Ketsji/KX_Dome.cpp b/source/gameengine/Ketsji/KX_Dome.cpp
index 44cfd4bddbc..828c327a228 100644
--- a/source/gameengine/Ketsji/KX_Dome.cpp
+++ b/source/gameengine/Ketsji/KX_Dome.cpp
@@ -425,21 +425,21 @@ void KX_Dome::GLDrawWarpQuads(void)
if (warp.nodes[i][j].i < 0 || warp.nodes[i2][j].i < 0 || warp.nodes[i2][j+1].i < 0 || warp.nodes[i][j+1].i < 0)
continue;
- glColor3f(warp.nodes[i][j].i,warp.nodes[i][j].i,warp.nodes[i][j].i);
- glTexCoord2f((warp.nodes[i][j].u * uv_width), (warp.nodes[i][j].v * uv_height));
- glVertex3f(warp.nodes[i][j].x,warp.nodes[i][j].y,0.0);
+ glColor3f(warp.nodes[i][j].i,warp.nodes[i][j].i,warp.nodes[i][j].i);
+ glTexCoord2f((warp.nodes[i][j].u * uv_width), (warp.nodes[i][j].v * uv_height));
+ glVertex3f(warp.nodes[i][j].x,warp.nodes[i][j].y,0.0);
- glColor3f(warp.nodes[i2][j].i,warp.nodes[i2][j].i,warp.nodes[i2][j].i);
- glTexCoord2f((warp.nodes[i2][j].u * uv_width), (warp.nodes[i2][j].v * uv_height));
- glVertex3f(warp.nodes[i2][j].x,warp.nodes[i2][j].y,0.0);
+ glColor3f(warp.nodes[i2][j].i,warp.nodes[i2][j].i,warp.nodes[i2][j].i);
+ glTexCoord2f((warp.nodes[i2][j].u * uv_width), (warp.nodes[i2][j].v * uv_height));
+ glVertex3f(warp.nodes[i2][j].x,warp.nodes[i2][j].y,0.0);
- glColor3f(warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i);
- glTexCoord2f((warp.nodes[i2][j+1].u * uv_width), (warp.nodes[i2][j+1].v * uv_height));
- glVertex3f(warp.nodes[i2][j+1].x,warp.nodes[i2][j+1].y,0.0);
+ glColor3f(warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i);
+ glTexCoord2f((warp.nodes[i2][j+1].u * uv_width), (warp.nodes[i2][j+1].v * uv_height));
+ glVertex3f(warp.nodes[i2][j+1].x,warp.nodes[i2][j+1].y,0.0);
- glColor3f(warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i);
- glTexCoord2f((warp.nodes[i2][j+1].u * uv_width), (warp.nodes[i2][j+1].v * uv_height));
- glVertex3f(warp.nodes[i2][j+1].x,warp.nodes[i2][j+1].y,0.0);
+ glColor3f(warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i,warp.nodes[i2][j+1].i);
+ glTexCoord2f((warp.nodes[i2][j+1].u * uv_width), (warp.nodes[i2][j+1].v * uv_height));
+ glVertex3f(warp.nodes[i2][j+1].x,warp.nodes[i2][j+1].y,0.0);
}
}
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.h b/source/gameengine/Ketsji/KX_IpoActuator.h
index fa26bbaa6e1..6b172ba8603 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.h
+++ b/source/gameengine/Ketsji/KX_IpoActuator.h
@@ -123,15 +123,15 @@ public:
int m_type;
KX_IpoActuator(SCA_IObject* gameobj,
- const STR_String& propname,
- const STR_String& framePropname,
- float starttime,
- float endtime,
- bool recurse,
- int acttype,
- bool ipo_as_force,
- bool ipo_add,
- bool ipo_local);
+ const STR_String& propname,
+ const STR_String& framePropname,
+ float starttime,
+ float endtime,
+ bool recurse,
+ int acttype,
+ bool ipo_as_force,
+ bool ipo_add,
+ bool ipo_local);
virtual ~KX_IpoActuator() {};
virtual CValue* GetReplica() {
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.h b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
index 277af87f9f2..43bf6bc5302 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.h
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
@@ -121,7 +121,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
/**
* The focus mode. 1 for handling focus, 0 for not handling, 2 for focus on any object
*/
- int m_focusmode;
+ int m_focusmode;
/**
* Flags whether the previous test showed a mouse-over.
diff --git a/source/gameengine/Ketsji/KX_NearSensor.h b/source/gameengine/Ketsji/KX_NearSensor.h
index 26adcb993b8..a81d621e8fc 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.h
+++ b/source/gameengine/Ketsji/KX_NearSensor.h
@@ -49,12 +49,12 @@ protected:
KX_ClientObjectInfo* m_client_info;
public:
KX_NearSensor(class SCA_EventManager* eventmgr,
- class KX_GameObject* gameobj,
- float margin,
- float resetmargin,
- bool bFindMaterial,
- const STR_String& touchedpropname,
- PHY_IPhysicsController* ctrl);
+ class KX_GameObject* gameobj,
+ float margin,
+ float resetmargin,
+ bool bFindMaterial,
+ const STR_String& touchedpropname,
+ PHY_IPhysicsController* ctrl);
/*
public:
KX_NearSensor(class SCA_EventManager* eventmgr,
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index 9b8f7f27d80..20743504dad 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -1247,9 +1247,10 @@ KX_Camera* KX_Scene::FindCamera(KX_Camera* cam)
{
list<KX_Camera*>::iterator it = m_cameras.begin();
- while ( (it != m_cameras.end())
- && ((*it) != cam) ) {
- it++;
+ while ( (it != m_cameras.end())
+ && ((*it) != cam) )
+ {
+ it++;
}
return ((it == m_cameras.end()) ? NULL : (*it));
@@ -1260,9 +1261,10 @@ KX_Camera* KX_Scene::FindCamera(STR_String& name)
{
list<KX_Camera*>::iterator it = m_cameras.begin();
- while ( (it != m_cameras.end())
- && ((*it)->GetName() != name) ) {
- it++;
+ while ( (it != m_cameras.end())
+ && ((*it)->GetName() != name) )
+ {
+ it++;
}
return ((it == m_cameras.end()) ? NULL : (*it));
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index 76bdd36a70f..22aa781ebc2 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -2130,8 +2130,8 @@ btCollisionShape* CcdShapeConstructionInfo::CreateBulletShape(btScalar margin, b
{
compoundShape = new btCompoundShape();
for (std::vector<CcdShapeConstructionInfo*>::iterator sit = m_shapeArray.begin();
- sit != m_shapeArray.end();
- sit++)
+ sit != m_shapeArray.end();
+ sit++)
{
collisionShape = (*sit)->CreateBulletShape(margin, useGimpact, useBvh);
if (collisionShape)
@@ -2156,8 +2156,8 @@ void CcdShapeConstructionInfo::AddShape(CcdShapeConstructionInfo* shapeInfo)
CcdShapeConstructionInfo::~CcdShapeConstructionInfo()
{
for (std::vector<CcdShapeConstructionInfo*>::iterator sit = m_shapeArray.begin();
- sit != m_shapeArray.end();
- sit++)
+ sit != m_shapeArray.end();
+ sit++)
{
(*sit)->Release();
}
diff --git a/source/gameengine/VideoTexture/Texture.h b/source/gameengine/VideoTexture/Texture.h
index 4dce0021509..32801a2c38e 100644
--- a/source/gameengine/VideoTexture/Texture.h
+++ b/source/gameengine/VideoTexture/Texture.h
@@ -79,7 +79,7 @@ extern PyTypeObject TextureType;
// load texture
void loadTexture (unsigned int texId, unsigned int * texture, short * size,
- bool mipmap = false);
+ bool mipmap = false);
// get material
RAS_IPolyMaterial * getMaterial (PyObject *obj, short matID);