diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c1ed8567c6903cac002e95774376ef2ed8baf153..95d03dc2c1a383edbce9a26fd663de93fda1182a 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,8 @@ -4.8.0 (Work-in-progress): new interactive and fully parametrizable definition of +4.8.1 (Work-in-progress): new quasi-structured quad algorithm (replaces the +"packing of parallelogram" algorithm); improved performance when transforming +many OCC entities. + +4.8.0 (March 2, 2021): new interactive and fully parametrizable definition of boundary conditions, materials, etc. through ONELAB variables; new API functions for creating trimmed BSpline/Bezier patches, perform raw triangulations and tetrehedralizations, get upward adjacencies, and create extruded boundary layers @@ -6,13 +10,14 @@ and automatic curve loops in built-in kernel; improved performance of high-order meshing of OCC models; improved handling of high resolution displays; new structured CGNS exporter; new transfinite Beta law; added support for embedded curves in HXT; added automatic conversion from partitioned MSH2 files to new -partitioned entities; fixed order of Gauss quadrature for quads and hexas; code -modernization (C++11); further uniformization of option names to match the -documented terminology (Mesh.Point -> Mesh.Node, ...; old names are still -accepted, but deprecated); deprecated Mesh.MinimumElementsPerTwoPi: set value -directly to Mesh.MeshSizeFromCurvature instead; Python and Julia APIs now also -define "snake case" aliases for all camelCase function names; small bug fixes -and improvements. +partitioned entities; element groups can now be imported from UNV files; fixed +order of Gauss quadrature for quads and hexas; code modernization (C++11); +further uniformization of option names to match the documented terminology +(Mesh.Point -> Mesh.Node, ...; old names are still accepted, but deprecated); +deprecated Mesh.MinimumElementsPerTwoPi: set value directly to +Mesh.MeshSizeFromCurvature instead; Python and Julia APIs now also define "snake +case" aliases for all camelCase function names; small bug fixes and +improvements. * Incompatible API changes: new optional arguments to mesh/classifySurfaces, occ/addBSplineSurface, occ/addBezierSurface, occ/addPipe and view/probe; diff --git a/CMakeLists.txt b/CMakeLists.txt index a5ee5e270735bb8fc32e96d33a701861a20d0880..b8990a166fc63fc12077b2a46defe219eddd6682 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,7 @@ opt(POST "Enable post-processing module (required by GUI)" ${DEFAULT}) opt(POPPLER "Enable Poppler for displaying PDF documents (experimental)" OFF) opt(PRIVATE_API "Enable private API" OFF) opt(PRO "Enable PRO extensions" ${DEFAULT}) +opt(QUADMESHINGTOOLS "Enable QuadMeshingTools extensions" ${DEFAULT}) opt(QUADTRI "Enable QuadTri structured meshing extensions" ${DEFAULT}) opt(REVOROPT "Enable Revoropt (used for CVT remeshing)" OFF) opt(RPATH "Use RPATH in dynamically linked targets" ON) @@ -105,7 +106,7 @@ opt(ZIPPER "Enable Zip file compression/decompression" OFF) set(GMSH_MAJOR_VERSION 4) set(GMSH_MINOR_VERSION 8) -set(GMSH_PATCH_VERSION 0) +set(GMSH_PATCH_VERSION 1) if(NOT GMSH_EXTRA_VERSION) set(GMSH_EXTRA_VERSION "") endif() @@ -322,6 +323,7 @@ if(ENABLE_OPENMP) set_config_option(HAVE_OPENMP "OpenMP") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + list(APPEND EXTERNAL_LIBRARIES "${OpenMP_CXX_LIBRARIES}") elseif(APPLE AND EXISTS "/opt/local/lib/libomp") # official Apple compiler with macports' libomp set_config_option(HAVE_OPENMP "OpenMP[MacPorts]") @@ -1245,6 +1247,12 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/pro AND ENABLE_PRO) add_subdirectory(pro) endif() +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/QuadMeshingTools AND ENABLE_QUADMESHINGTOOLS) + set_config_option(HAVE_QUADMESHINGTOOLS "QuadMeshingTools") + add_subdirectory(contrib/QuadMeshingTools) + include_directories(BEFORE contrib/QuadMeshingTools) +endif() + if(ENABLE_OCC) set(OCC_MINIMAL_VERSION "6.9.1") if(WIN32) @@ -1502,6 +1510,13 @@ if(WALL AND NOT MSVC) # FIXME: remove this when GCC behaves more intelligently set(WF "${WF} -Wno-attributes") endif() + if(WIN32 OR NOT HAVE_64BIT_SIZE_T) + # FIXME: remove printf family warnings on 32 bit systems and windows + check_cxx_compiler_flag("-Wformat=" WFORMAT) + if(WFORMAT) + set(WF "${WF} -Wformat=") + endif() + endif() set_compile_flags(WALL_SRC ${WF}) endif() diff --git a/CREDITS.txt b/CREDITS.txt index d1769d857a77f926c2bedd217f19f8337b657bc2..86b517000b0ae15f7f2e07c8ebf9729afacd109f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -31,9 +31,10 @@ cleanup and performance improvements), Celestin Marot (HXT/tetMesh), Pierre-Alexandre Beaufort (HXT/reparam), Zhidong Han (LSDYNA export), Ismail Badia (hierarchical basis functions), Jeremy Theler (X3D export), Thomas Toulorge (high order mesh optimizer, new CGNS IO), Max Orok (binary PLY), Marek -Wojciechowski (PyPi packaging), Maxence Reberol (automatic transfinite), Michael -Ermakov (Gambit export). See comments in the sources for more information. If we -forgot to list your contributions please send us an email! +Wojciechowski (PyPi packaging), Maxence Reberol (automatic transfinite, quad +meshing tools), Michael Ermakov (Gambit export). See comments in the sources for +more information. If we forgot to list your contributions please send us an +email! Thanks to the following folks who have contributed by providing fresh ideas on theoretical or programming topics, who have sent patches, requests for changes @@ -141,6 +142,14 @@ The colorbar widget (Fltk/colorbarWindow.cpp) was inspired by code from the Vis5d program for visualizing five dimensional gridded data sets, copyright (C) 1990-1995, Bill Hibbard, Brian Paul, Dave Santek, and Andre Battaiola. +The libOL code (Common/libol1.{c,h}) is Copyright 2012-2018 - by Loïc Maréchal / +INRIA. This program is a free software. You can redistribute it and/or modify it +under the terms of the MIT License as published by the Open Source Initiative. + +The Fast & memory efficient hashtable based on robin hood hashing +(Common/robin_hood.h) is Copyright (c) 2018-2020 Martin Ankerl and is licensed +under the MIT License. + In addition, this version of Gmsh may contain the following contributed, optional codes in the contrib/ directory, each governed by their own license: @@ -149,7 +158,7 @@ optional codes in the contrib/ directory, each governed by their own license: * contrib/gmm copyright (C) 2002-2008 Yves Renard; -* contrib/hxt - Copyright (C) 2017-2018 - Universite catholique de Louvain; +* contrib/hxt - Copyright (C) 2017-2020 - Universite catholique de Louvain; * contrib/kbipack copyright (C) 2005 Saku Suuriniemi; @@ -180,4 +189,4 @@ optional codes in the contrib/ directory, each governed by their own license: * contrib/zipper from MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson. -heck the configuration options to see which have been enabled. +Check the configuration options to see which have been enabled. diff --git a/Common/CMakeLists.txt b/Common/CMakeLists.txt index b389bbc11ff91df30d63292ba6e782a901f7e3f4..3e0981d05a9701050bbbffd357f92fd51e966997 100644 --- a/Common/CMakeLists.txt +++ b/Common/CMakeLists.txt @@ -26,6 +26,7 @@ set(SRC GmshRemote.cpp gmshLocalNetworkClient.cpp gmsh.cpp + libol1.c # should do something different for C file ? ) file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp index ef10af645a80b7dcb2faa63c49a624f9e95c49ea..e5cfec08e69e96d309ad9299a6d8c89949f15f02 100644 --- a/Common/CommandLine.cpp +++ b/Common/CommandLine.cpp @@ -109,7 +109,7 @@ std::vector<std::pair<std::string, std::string> > GetUsage() "coordinates (Mesh.SaveParametric)")); s.push_back(mp("-save_topology", "Save model topology (Mesh.SaveTopology)")); s.push_back(mp("-algo string", "Select mesh algorithm: auto, meshadapt, del2d, " - "front2d, delquad, pack, initial2d, del3d, front3d, mmg3d, hxt, " + "front2d, delquad, quadqs, initial2d, del3d, front3d, mmg3d, hxt, " "initial3d (Mesh.Algorithm and Mesh.Algorithm3D)")); s.push_back(mp("-smooth int", "Set number of mesh smoothing steps " "(Mesh.Smoothing)")); @@ -1201,6 +1201,8 @@ void GetOptions(bool readConfigFiles, bool exitOnError) opt_mesh_algo2d(0, GMSH_SET, ALGO_2D_FRONTAL_QUAD); else if(argv[i] == "PackingOfParallelograms" || argv[i] == "pack") opt_mesh_algo2d(0, GMSH_SET, ALGO_2D_PACK_PRLGRMS); + else if(argv[i] == "QuadQuasiStructured" || argv[i] == "quadqs") + opt_mesh_algo2d(0, GMSH_SET, ALGO_2D_QUAD_QUASI_STRUCT); else if(argv[i] == "initial2d") opt_mesh_algo2d(0, GMSH_SET, ALGO_2D_INITIAL_ONLY); else if(argv[i] == "del3d" || argv[i] == "gmsh3d") diff --git a/Common/Context.h b/Common/Context.h index eba5754299dd89fb093f362d9b80f431ff77a195..123dd08daea556ca325bceb9eadce736388c53d7 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -49,12 +49,14 @@ struct contextMeshOptions { unsigned int randomSeed; int nLayersPerGap; double gradation; + int quadqsSizemapMethod, quadqsTopoOptimMethods; std::function<double(int, int, double, double, double)> lcCallback; // mesh IO int fileFormat, firstElementTag, firstNodeTag; double mshFileVersion, medFileMinorVersion, scalingFactor; int medImportGroupsOfNodes, medSingleModel; int saveAll, saveTri, saveGroupsOfNodes, saveGroupsOfElements; + int readGroupsOfElements; int binary, bdfFieldFormat; int unvStrictFormat, stlRemoveDuplicateTriangles, stlOneSolidPerSurface; double stlLinearDeflection, stlAngularDeflection; diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp index 9897f7fd58fca830fa923b8da1001c21ac4efc35..4fdcedde1705a4ce217651ea0928394df3775f61 100644 --- a/Common/CreateFile.cpp +++ b/Common/CreateFile.cpp @@ -362,7 +362,9 @@ void CreateOutputFile(const std::string &fileName, int format, case FORMAT_UNV: GModel::current()->writeUNV - (name, CTX::instance()->mesh.saveAll, CTX::instance()->mesh.saveGroupsOfNodes, + (name, CTX::instance()->mesh.saveAll, + CTX::instance()->mesh.saveGroupsOfElements, + CTX::instance()->mesh.saveGroupsOfNodes, CTX::instance()->mesh.scalingFactor); break; diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index c25201146870fdd233887695ca4c304636f66706..0e2c2dfbd516a2bdd75ff9d8c42f2d85ffe00c7f 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -1191,6 +1191,12 @@ StringXNumber MeshOptions_Number[] = { "Maximum angle between edges/faces within layers of BL triangles/tets " "for the detection of columns in the fast curving algorithm"}, + { F|O, "IgnoreParametrization" , opt_mesh_ignore_parametrization, 0. , + "Skip parametrization section when reading meshes in the MSH4 format." }, + { F|O, "IgnorePeriodicity" , opt_mesh_ignore_periodicity , 1. , + "Skip periodic node section and skip periodic boundary alignement step when " + "reading meshes in the MSH2 format." }, + { F|O, "LabelSampling" , opt_mesh_label_sampling , 1. , "Label sampling rate (display one label every `LabelSampling' elements)" }, { F|O, "LabelType" , opt_mesh_label_type , 0. , @@ -1282,43 +1288,6 @@ StringXNumber MeshOptions_Number[] = { "Import groups of nodes (0: no; 1: create geometrical point for each node)?" }, { F|O, "MedSingleModel" , opt_mesh_med_single_model , 0. , "Import MED meshes in the current model, even if several MED mesh names exist" }, - { F|O, "PartitionHexWeight" , opt_mesh_partition_hex_weight , -1 , - "Weight of hexahedral element for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionLineWeight" , opt_mesh_partition_line_weight , -1 , - "Weight of line element for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionPrismWeight" , opt_mesh_partition_pri_weight , -1 , - "Weight of prismatic element (wedge) for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionPyramidWeight" , opt_mesh_partition_pyr_weight , -1 , - "Weight of pyramidal element for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionQuadWeight" , opt_mesh_partition_qua_weight , -1 , - "Weight of quadrangle for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionTrihedronWeight" , opt_mesh_partition_trih_weight , 0 , - "Weight of trihedron element for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionTetWeight" , opt_mesh_partition_tet_weight , -1 , - "Weight of tetrahedral element for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionTriWeight" , opt_mesh_partition_tri_weight , -1 , - "Weight of triangle element for METIS load balancing (-1: automatic)" }, - { F|O, "PartitionCreateTopology" , opt_mesh_partition_create_topology , 1 , - "Create boundary representation of partitions" }, - { F|O, "PartitionCreatePhysicals" , opt_mesh_partition_create_physicals , 1 , - "Create physical groups for partitions, based on existing physical groups" }, - { F|O, "PartitionCreateGhostCells" , opt_mesh_partition_create_ghost_cells , 0 , - "Create ghost cells, i.e. create for each partition a ghost entity containing " - "elements connected to neighboring partitions by at least one node." }, - { F|O, "PartitionSplitMeshFiles" , opt_mesh_partition_split_mesh_files , 0 , - "Write one file for each mesh partition" }, - { F|O, "PartitionTopologyFile" , opt_mesh_partition_save_topology_file , 0 , - "Write a .pro file with the partition topology" }, - { F|O, "PartitionOldStyleMsh2" , opt_mesh_partition_old_style_msh2 , 1 , - "Write partitioned meshes in MSH2 format using old style (i.e. by not " - "referencing new partitioned entities, except on partition boundaries), " - "for backward compatibility" }, - { F|O, "PartitionConvertMsh2" , opt_mesh_partition_convert_msh2 , 1 , - "When reading partitioned meshes in MSH2 format, create new partition " - "entities"}, - - { F|O, "ReparamMaxTriangles" , opt_mesh_reparam_max_triangles , 250000 , - "Maximum number of triangles in a single parametrization patch" }, { F, "NbHexahedra" , opt_mesh_nb_hexahedra , 0. , "Number of hexahedra in the current mesh (read-only)" }, @@ -1362,6 +1331,40 @@ StringXNumber MeshOptions_Number[] = { "Optimize the mesh using Netgen to improve the quality of tetrahedral " "elements" }, + { F|O, "PartitionHexWeight" , opt_mesh_partition_hex_weight , -1 , + "Weight of hexahedral element for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionLineWeight" , opt_mesh_partition_line_weight , -1 , + "Weight of line element for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionPrismWeight" , opt_mesh_partition_pri_weight , -1 , + "Weight of prismatic element (wedge) for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionPyramidWeight" , opt_mesh_partition_pyr_weight , -1 , + "Weight of pyramidal element for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionQuadWeight" , opt_mesh_partition_qua_weight , -1 , + "Weight of quadrangle for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionTrihedronWeight" , opt_mesh_partition_trih_weight , 0 , + "Weight of trihedron element for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionTetWeight" , opt_mesh_partition_tet_weight , -1 , + "Weight of tetrahedral element for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionTriWeight" , opt_mesh_partition_tri_weight , -1 , + "Weight of triangle element for METIS load balancing (-1: automatic)" }, + { F|O, "PartitionCreateTopology" , opt_mesh_partition_create_topology , 1 , + "Create boundary representation of partitions" }, + { F|O, "PartitionCreatePhysicals" , opt_mesh_partition_create_physicals , 1 , + "Create physical groups for partitions, based on existing physical groups" }, + { F|O, "PartitionCreateGhostCells" , opt_mesh_partition_create_ghost_cells , 0 , + "Create ghost cells, i.e. create for each partition a ghost entity containing " + "elements connected to neighboring partitions by at least one node." }, + { F|O, "PartitionSplitMeshFiles" , opt_mesh_partition_split_mesh_files , 0 , + "Write one file for each mesh partition" }, + { F|O, "PartitionTopologyFile" , opt_mesh_partition_save_topology_file , 0 , + "Write a .pro file with the partition topology" }, + { F|O, "PartitionOldStyleMsh2" , opt_mesh_partition_old_style_msh2 , 1 , + "Write partitioned meshes in MSH2 format using old style (i.e. by not " + "referencing new partitioned entities, except on partition boundaries), " + "for backward compatibility" }, + { F|O, "PartitionConvertMsh2" , opt_mesh_partition_convert_msh2 , 1 , + "When reading partitioned meshes in MSH2 format, create new partition " + "entities"}, { F|O|D, "Points" , opt_mesh_nodes , 0. , "[Deprecated]" }, { F|O|D, "PointNumbers" , opt_mesh_node_labels , 0. , @@ -1370,6 +1373,9 @@ StringXNumber MeshOptions_Number[] = { "[Deprecated]" }, { F|O|D, "PointType" , opt_mesh_node_type , 0. , "[Deprecated]" }, + { F|O, "PreserveNumberingMsh2" , opt_mesh_preserve_numbering_msh2 , 0. , + "Preserve element numbering in MSH2 format (will break meshes with multiple " + "physical groups for a single elementary entity)"}, { F|O, "Prisms" , opt_mesh_prisms , 1. , "Display mesh prisms?" }, { F|O, "Pyramids" , opt_mesh_pyramids , 1. , @@ -1377,8 +1383,23 @@ StringXNumber MeshOptions_Number[] = { { F|O, "Trihedra" , opt_mesh_trihedra , 1. , "Display mesh trihedra?" }, + { F|O, "QuadqsSizemapMethod" , opt_mesh_quadqs_sizemap_method, 0. , + "Size map method in QuadQuasiStructured. 0: default, 1: cross-field," + "2: cross-field + CAD small features adaptation," + "3: from background mesh (e.g. sizes in current triangulation)" + }, + { F|O, "QuadqsTopologyOptimizationMethods" , opt_mesh_quadqs_topo_optim_methods, 0. , + "Topology optimization methods in QuadQuasiStructured. 0: default (all)," + "100: pattern-based CAD faces," + "010: disk quadrangulation remeshing," + "001: cavity remeshing," + "xxx: combination of multiple methods (e.g. 111 for all)" + }, + { F|O, "Quadrangles" , opt_mesh_quadrangles , 1. , "Display mesh quadrangles?" }, + + { F|O, "QualityInf" , opt_mesh_quality_inf , 0.0 , "Only display elements whose quality measure is greater than QualityInf" }, { F|O, "QualitySup" , opt_mesh_quality_sup , 0.0 , @@ -1397,17 +1418,13 @@ StringXNumber MeshOptions_Number[] = { "RandomFactor * size(triangle)/size(model) approaches machine accuracy)" }, { F|O, "RandomFactor3D" , opt_mesh_rand_factor3d , 1.e-12 , "Random factor used in the 3D meshing algorithm" }, - { F|O, "RandomSeed" , opt_mesh_random_seed , 1. , "Seed of pseudo-random number generator" }, - { F|O, "PreserveNumberingMsh2" , opt_mesh_preserve_numbering_msh2 , 0. , - "Preserve element numbering in MSH2 format (will break meshes with multiple " - "physical groups for a single elementary entity)"}, - { F|O, "IgnoreParametrization" , opt_mesh_ignore_parametrization, 0. , - "Skip parametrization section when reading meshes in the MSH4 format." }, - { F|O, "IgnorePeriodicity" , opt_mesh_ignore_periodicity , 1. , - "Skip periodic node section and skip periodic boundary alignement step when " - "reading meshes in the MSH2 format." }, + + + { F|O, "ReadGroupsOfElements" , opt_mesh_read_groups_of_elements , 1. , + "Read groups of elements in UNV meshes (this will discard the elementary " + "entity tags inferred from the element section)"}, #if defined(HAVE_BLOSSOM) { F|O, "RecombinationAlgorithm" , opt_mesh_algo_recombine , 1 , #else @@ -1434,6 +1451,8 @@ StringXNumber MeshOptions_Number[] = { "Number of refinement steps in the MeshAdapt-based 2D algorithms" }, { F|O, "Renumber" , opt_mesh_renumber , 1 , "Renumber nodes and elements in a continuous sequence after mesh generation" }, + { F|O, "ReparamMaxTriangles" , opt_mesh_reparam_max_triangles , 250000 , + "Maximum number of triangles in a single parametrization patch" }, { F, "SaveAll" , opt_mesh_save_all , 0. , "Save all elements, even if they don't belong to physical groups (for some " @@ -1446,7 +1465,7 @@ StringXNumber MeshOptions_Number[] = { { F|O, "SaveParametric" , opt_mesh_save_parametric , 0. , "Save parametric coordinates of nodes" }, { F|O, "SaveGroupsOfElements" , opt_mesh_save_groups_of_elements , 1. , - "Save groups of elements for each physical group (for INP mesh format)" }, + "Save groups of elements for each physical group (for UNV and INP mesh format)" }, { F|O, "SaveGroupsOfNodes" , opt_mesh_save_groups_of_nodes , 0. , "Save groups of nodes for each physical group (for UNV, INP and Tochnog " "mesh formats). For the INP format, a negative value will save a group of node " diff --git a/Common/GmshConfig.h.in b/Common/GmshConfig.h.in index b021061f91ea98f5db640a75f72cf1551a5ce44e..f96189c2eb6179d0084796aff656c3e97128ca00 100644 --- a/Common/GmshConfig.h.in +++ b/Common/GmshConfig.h.in @@ -64,6 +64,7 @@ #cmakedefine HAVE_POST #cmakedefine HAVE_POPPLER #cmakedefine HAVE_QUADTRI +#cmakedefine HAVE_QUADMESHINGTOOLS #cmakedefine HAVE_REVOROPT #cmakedefine HAVE_SALOME #cmakedefine HAVE_SGEOM diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h index 47d900278fa45264efdb697ec3d7aa0f7f5ae3ae..aa55f2f95230a36bcac0697b348220d577ce16d4 100644 --- a/Common/GmshDefines.h +++ b/Common/GmshDefines.h @@ -241,6 +241,7 @@ #define ALGO_2D_FRONTAL_QUAD 8 #define ALGO_2D_PACK_PRLGRMS 9 #define ALGO_2D_PACK_PRLGRMS_CSTR 10 +#define ALGO_2D_QUAD_QUASI_STRUCT 11 // 3D meshing algorithms (numbers should not be changed) #define ALGO_3D_DELAUNAY 1 diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp index 9a8b3ddfad5473ea12f9666ddd15aae1882c3ebc..02f09aed2b41f0c03f349ee1e7ae5a9dd7aa1b3a 100644 --- a/Common/GmshMessage.cpp +++ b/Common/GmshMessage.cpp @@ -1296,6 +1296,22 @@ static void _setStandardOptions(onelab::parameter *p, p->setAttribute("AutoCheck", fopt["AutoCheck"][0] ? "1" : "0"); } +static void _setOtherAttributes(onelab::parameter *p, + std::map<std::string, std::vector<std::string> > &copt) +{ + for(auto it = copt.begin(); it != copt.end(); it++) + if(p->getAttribute(it->first).empty() && + it->first.compare("Name") && + it->first.compare("Label") && + it->first.compare("ShortHelp") && + it->first.compare("Help") && + it->first.compare("Visible") && + it->first.compare("ReadOnly") && + it->first.compare("NeverChanged") && + it->first.compare("ChangedValue")) // Attribute 'it' was not already set + p->setAttribute(it->first, it->second[0]); +} + static std::string _getParameterName(const std::string &key, std::map<std::string, std::vector<std::string> > &copt) { @@ -1419,6 +1435,7 @@ void Msg::ExchangeOnelabParameter(const std::string &key, if(copt.count("NumberFormat")) ps[0].setAttribute("NumberFormat", copt["NumberFormat"][0]); _setStandardOptions(&ps[0], fopt, copt); + _setOtherAttributes(&ps[0], copt); _onelabClient->set(ps[0]); #endif } @@ -1475,6 +1492,7 @@ void Msg::ExchangeOnelabParameter(const std::string &key, if(noMultipleSelection && copt.count("MultipleSelection")) ps[0].setAttribute("MultipleSelection", copt["MultipleSelection"][0]); _setStandardOptions(&ps[0], fopt, copt); + _setOtherAttributes(&ps[0], copt); _onelabClient->set(ps[0]); #endif } diff --git a/Common/OS.cpp b/Common/OS.cpp index 15e9e9cd4184c06f6adefc4684d0732fcb0ae84e..2757ef00fc5942f2bed44647be6c2f612e290116 100644 --- a/Common/OS.cpp +++ b/Common/OS.cpp @@ -624,7 +624,7 @@ int SystemCallExe(const std::string &exe, const std::string &argsOrCommand, } if(!blocking) cmd += " &"; Msg::Info("Calling '%s'", cmd.c_str()); - if(!system(cmd.c_str())) return 1; + return system(cmd.c_str()); #endif return 0; } diff --git a/Common/OctreeInternals.cpp b/Common/OctreeInternals.cpp index 4f6a7c50898b2e13f2acbccb08aa6ffba34632d0..01a25b2e28e9844cca8ea363fe5b847eca1f3997 100644 --- a/Common/OctreeInternals.cpp +++ b/Common/OctreeInternals.cpp @@ -305,7 +305,8 @@ void *searchElement(octantBucket *_buckets_head, double *_pt, ptrBucket = findElementBucket(_buckets_head, _pt); if(ptrBucket == nullptr) { // this is not an error - Msg::Debug("Could not find point in octree"); + // TODO RE ENABLE MSG + // Msg::Debug("Could not find point in octree (in search element)"); return nullptr; } @@ -397,7 +398,7 @@ void *searchAllElements(octantBucket *_buckets_head, double *_pt, ptrBucket = findElementBucket(_buckets_head, _pt); if(ptrBucket == nullptr) { - Msg::Debug("Could not find point in octree"); + Msg::Debug("Could not find point in octree (in search all elements)"); return nullptr; } diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp index 48df581ca4e399c210b74595b9c2d559c97e53e7..0689d2b04ff52eb3071a07db6e3898b683b9e9e6 100644 --- a/Common/OpenFile.cpp +++ b/Common/OpenFile.cpp @@ -387,7 +387,8 @@ int MergeFile(const std::string &fileName, bool errorIfMissing, status = GModel::current()->readParasolidXMT(fileName); } else if(ext == ".unv" || ext == ".UNV") { - status = GModel::current()->readUNV(fileName); + status = GModel::current()->readUNV + (fileName, CTX::instance()->mesh.readGroupsOfElements); } else if(ext == ".vtk" || ext == ".VTK") { status = GModel::current()->readVTK(fileName, CTX::instance()->bigEndian); diff --git a/Common/Options.cpp b/Common/Options.cpp index 61a384decb7f99295e5df8eea618a646b83ef340..b0ba81367af14209baff6e2034ae340bd148bce6 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -5860,7 +5860,7 @@ double opt_mesh_algo2d(OPT_ARGS_NUM) case ALGO_2D_FRONTAL_QUAD: FlGui::instance()->options->mesh.choice[2]->value(5); break; - case ALGO_2D_PACK_PRLGRMS: + case ALGO_2D_QUAD_QUASI_STRUCT: FlGui::instance()->options->mesh.choice[2]->value(6); break; case ALGO_2D_INITIAL_ONLY: @@ -6305,6 +6305,12 @@ double opt_mesh_save_topology(OPT_ARGS_NUM) return CTX::instance()->mesh.saveTopology; } +double opt_mesh_read_groups_of_elements(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) CTX::instance()->mesh.readGroupsOfElements = (int)val; + return CTX::instance()->mesh.readGroupsOfElements; +} + double opt_mesh_save_groups_of_elements(OPT_ARGS_NUM) { if(action & GMSH_SET) CTX::instance()->mesh.saveGroupsOfElements = (int)val; @@ -6568,6 +6574,17 @@ double opt_mesh_ignore_parametrization(OPT_ARGS_NUM) return CTX::instance()->mesh.ignoreParametrizationMsh4; } +double opt_mesh_quadqs_sizemap_method(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) CTX::instance()->mesh.quadqsSizemapMethod = (int)val; + return CTX::instance()->mesh.quadqsSizemapMethod; +} + +double opt_mesh_quadqs_topo_optim_methods(OPT_ARGS_NUM) { + if(action & GMSH_SET) CTX::instance()->mesh.quadqsTopoOptimMethods = (int)val; + return CTX::instance()->mesh.quadqsTopoOptimMethods; +} + double opt_solver_listen(OPT_ARGS_NUM) { if(action & GMSH_SET) CTX::instance()->solver.listen = (int)val; diff --git a/Common/Options.h b/Common/Options.h index fa7045813cc227224430cd70e5d33cb89721a2e3..59c0feb7df70309f0092e7f61c86e5d668dd840a 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -574,6 +574,7 @@ double opt_mesh_save_all(OPT_ARGS_NUM); double opt_mesh_save_element_tag_type(OPT_ARGS_NUM); double opt_mesh_save_parametric(OPT_ARGS_NUM); double opt_mesh_save_topology(OPT_ARGS_NUM); +double opt_mesh_read_groups_of_elements(OPT_ARGS_NUM); double opt_mesh_save_groups_of_elements(OPT_ARGS_NUM); double opt_mesh_save_groups_of_nodes(OPT_ARGS_NUM); double opt_mesh_color_carousel(OPT_ARGS_NUM); @@ -603,6 +604,8 @@ double opt_mesh_renumber(OPT_ARGS_NUM); double opt_mesh_unv_strict_format(OPT_ARGS_NUM); double opt_mesh_reparam_max_triangles(OPT_ARGS_NUM); double opt_mesh_ignore_parametrization(OPT_ARGS_NUM); +double opt_mesh_quadqs_sizemap_method(OPT_ARGS_NUM); +double opt_mesh_quadqs_topo_optim_methods(OPT_ARGS_NUM); double opt_solver_listen(OPT_ARGS_NUM); double opt_solver_timeout(OPT_ARGS_NUM); double opt_solver_plugins(OPT_ARGS_NUM); diff --git a/Common/libol1.c b/Common/libol1.c new file mode 100644 index 0000000000000000000000000000000000000000..19bc6136b5476d3c39f107f7600b85995bda7e3c --- /dev/null +++ b/Common/libol1.c @@ -0,0 +1,3060 @@ +// All libOL code is Copyright 2012-2018 - by Loïc Maréchal / INRIA. +// This program is a free software. +// You can redistribute it and/or modify it under the terms of the MIT License +// as published by the Open Source Initiative. +// +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the MIT License for more details. +// +// You should have received a copy of the MIT License along with this program +// as the file LICENSE.txt; if not, please see: +// https://opensource.org/licenses/MIT +// +// +// MIT License +// +// Copyright (c) 2012-2018 Loïc Maréchal / INRIA +// +// 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. + + +/*----------------------------------------------------------------------------*/ +/* */ +/* LIB OCTREE LOCALISATION V1.70 */ +/* */ +/*----------------------------------------------------------------------------*/ +/* */ +/* Description: Octree for mesh localization */ +/* Author: Loic MARECHAL */ +/* Creation date: mar 16 2012 */ +/* Last modification: feb 03 2021 */ +/* */ +/*----------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------*/ +/* ANSI C headers */ +/*----------------------------------------------------------------------------*/ + +#include <assert.h> +#include <fcntl.h> +#include <limits.h> +#include <float.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include "libol1.h" + + +/*----------------------------------------------------------------------------*/ +/* Defines and macros */ +/*----------------------------------------------------------------------------*/ + +#define MaxItmOct 20 +#define MaxOctLvl 10 +#define MinGrdLvl 5 +#define ItmPerBuc 100 +#define MemBlkSiz 100000 +#define TngFlg 1 +#define AniFlg 2 +#define MaxThr 256 +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#define POW(a) ((a)*(a)) +#define CUB(a) ((a)*(a)*(a)) + + +/*----------------------------------------------------------------------------*/ +/* Local structures */ +/*----------------------------------------------------------------------------*/ + +typedef struct +{ + itg idx; + fpn crd[3]; +}VerSct; + +typedef struct +{ + VerSct *ver[2]; + fpn tng[3], siz; + itg idx; +}EdgSct; + +typedef struct +{ + EdgSct edg[3]; + VerSct *ver[3]; + fpn nrm[3]; + itg idx; + float ani; +}TriSct; + +typedef struct +{ + VerSct *ver[4]; + EdgSct edg[4]; + TriSct tri[2]; + fpn nrm[3]; + itg idx; +}QadSct; + +typedef struct +{ + VerSct *ver[4]; + EdgSct edg[6]; + TriSct tri[4]; + itg idx; + float ani; +}TetSct; + +typedef struct +{ + VerSct *ver[5]; + EdgSct edg[8]; + TriSct tri[5][2]; + itg idx; +}PyrSct; + +typedef struct +{ + VerSct *ver[6]; + EdgSct edg[9]; + TriSct tri[5][2]; + itg idx; +}PriSct; + +typedef struct +{ + VerSct *ver[8]; + EdgSct edg[12]; + QadSct qad[6]; + itg idx; +}HexSct; + +typedef struct LnkSctPtr +{ + itg typ, idx; + struct LnkSctPtr *nex; +}LnkSct; + +typedef struct MemSctPtr +{ + size_t siz; + void *adr; + struct MemSctPtr *nex; +}MemSct; + +typedef struct +{ + VerSct ver[8], BakVer[8]; + EdgSct edg, BakEdg; + TriSct tri, BakTri; + QadSct qad, BakQad; + TetSct tet, BakTet; + PyrSct pyr, BakPyr; + PriSct pri, BakPri; + HexSct hex, BakHex; + char *FlgTab; + itg *TagTab, tag; +}MshThrSct; + +typedef struct +{ + MshThrSct thr[ MaxThr ]; + size_t UsrSiz[ LolNmbTyp ], NmbItm[ LolNmbTyp ]; + fpn aniso, eps; + itg BasIdx; + char *UsrPtr[ LolNmbTyp ]; +}MshSct; + +typedef struct OctSctPtr +{ + union + { + LnkSct *lnk; + struct OctSctPtr *son; + }; + unsigned char NmbVer, NmbEdg, NmbFac, NmbVol, lvl, sub, ani, MaxItm; +}OctSct; + +typedef struct +{ + OctSct *oct; + itg idx; + char pos[3]; +}BucSct; + +typedef struct +{ + VerSct ver[8]; + HexSct hex; + itg tag, *ThrTag; + BucSct **ThrStk; +}OctThrSct; + +typedef struct +{ + OctThrSct thr[ MaxThr ]; + itg MaxLvl, NmbFreOct, NmbOct, GrdLvl, NmbBuc, NmbThr; + size_t MemUse; + fpn eps, MaxSiz, MinSiz, BucSiz, bnd[2][3]; + OctSct oct, *CurOctBlk; + BucSct *grd; + LnkSct *NexFreLnk; + MemSct *NexMem; + MshSct *msh; +}TreSct; + + +/*----------------------------------------------------------------------------*/ +/* Prototypes of octree procedures */ +/*----------------------------------------------------------------------------*/ + +static void SetMshBox (TreSct *, MshSct *); +static void AddVer (MshSct *, TreSct *, OctSct *, fpn *, fpn *); +static void AddEdg (MshSct *, TreSct *, OctSct *, fpn *, fpn *); +static void AddTri (MshSct *, TreSct *, OctSct *, fpn *, fpn *); +static void AddQad (MshSct *, TreSct *, OctSct *, fpn *, fpn *); +static void AddTet (MshSct *, TreSct *, OctSct *, fpn *, fpn *); +static void SubOct (MshSct *, TreSct *, OctSct *, fpn *, fpn *); +static void LnkItm (TreSct *, OctSct *, itg, itg, char); +static OctSct *GetCrd (OctSct *, itg, fpn *, fpn *, fpn *); +static void GetBox (TreSct *, OctSct *, itg, itg *, itg, itg *, + char *, fpn [2][3], fpn, fpn *, fpn *, itg ); +static itg BoxIntBox (fpn [2][3], fpn [2][3], fpn); +static void SetItm (MshSct *, itg, itg, itg, itg); +static void AniTri (MshSct *, itg); +static void SetSonCrd (itg, fpn *, fpn *, fpn *, fpn *); +static void GetOctLnk (MshSct *, itg, fpn *, itg *, fpn *, OctSct *, + fpn *, fpn *, itg (void *, itg), void *, itg); +static void IntRayOct (TreSct *, MshSct *, fpn *, fpn *, itg *, fpn *, + OctSct *, fpn *, fpn *, itg (void *, itg), void *, + itg); +static void GetBucBox (TreSct *, BucSct *, fpn *, fpn *); +static BucSct *GetBucNgb (TreSct *, BucSct *, itg); +static fpn DisVerOct (fpn *, fpn *, fpn *); +static itg VerInsOct (fpn *, fpn *, fpn *); +static char *GetPtrItm (MshSct *, itg, itg); +static void BakMshItm (MshSct *); +static void RstMshItm (MshSct *); + + +/*----------------------------------------------------------------------------*/ +/* Prototypes of meshing procedures */ +/*----------------------------------------------------------------------------*/ + +static itg EdgIntEdg (EdgSct *, EdgSct *, VerSct *, fpn); +static fpn DisVerTri (MshSct *, fpn *, TriSct *); +static fpn DisVerQad (MshSct *, fpn *, QadSct *); +static fpn DisVerTet (MshSct *, fpn *, TetSct *); +static fpn GetTriSrf (TriSct *); +static fpn GetVolTet (TetSct *); +static fpn DisVerEdg (fpn *, EdgSct *); +static void GetTriVec (TriSct *, fpn *); +static void SetTriNrm (TriSct *); +static void SetTmpHex (HexSct *, fpn *, fpn *); +static itg VerInsTet (VerSct *, TetSct *, fpn); +static itg VerInsHex (VerSct *, HexSct *); +static itg EdgIntHex (EdgSct *, HexSct *, fpn); +static itg TriIntHex (TriSct *, HexSct *, fpn); +static itg QadIntHex (QadSct *, HexSct *, fpn); +static itg TetIntHex (TetSct *, HexSct *, fpn); +static itg EdgIntQad (HexSct *, itg, EdgSct *, VerSct *, fpn); +static itg EdgIntTri (TriSct *, EdgSct *, VerSct *, fpn); +static itg VerInsTri (TriSct *, VerSct *, fpn); +static itg VerInsEdg (EdgSct *, VerSct *, fpn); +static void SetEdgTng (EdgSct *); +static fpn GetTriAni (TriSct *); + + +/*----------------------------------------------------------------------------*/ +/* Prototypes of geometric procedures */ +/*----------------------------------------------------------------------------*/ + +static void PrjVerLin (fpn *, fpn *, fpn *, fpn *); +static fpn PrjVerPla (fpn *, fpn *, fpn *, fpn *); +static void LinCmbVec3 (fpn, fpn *, fpn, fpn *, fpn *); +static void ClrVec (fpn *); +static void CpyVec (fpn *, fpn *); +static void AddVec2 (fpn *, fpn *); +static void SubVec2 (fpn *, fpn *); +static void SubVec3 (fpn *, fpn *, fpn *); +static void AddScaVec1 (fpn, fpn *); +static void AddScaVec2 (fpn, fpn *, fpn *); +static void MulVec1 (fpn, fpn *); +static void MulVec2 (fpn, fpn *, fpn *); +static void NrmVec (fpn *); +static void CrsPrd (fpn *, fpn *, fpn *); +static fpn DotPrd (fpn *, fpn *); +static fpn dis (fpn *, fpn *); +static fpn DisPow (fpn *, fpn *); +static fpn DisVerPla (fpn *, fpn *, fpn *); +static fpn GetNrmVec (fpn *); +static fpn VerInsBox (fpn *, fpn *, fpn *, fpn); +static itg LinIntBox (fpn *, fpn *, fpn *, fpn *, fpn); +static void LinIntPla (fpn *, fpn *, fpn *, fpn *, fpn *); + + +/*----------------------------------------------------------------------------*/ +/* Prototypes of memory handling procedures */ +/*----------------------------------------------------------------------------*/ + +static void *NewMem (TreSct *, size_t); +static void FreAllMem (TreSct *); + + +/*----------------------------------------------------------------------------*/ +/* Local mesh connectivity tables */ +/*----------------------------------------------------------------------------*/ + +static const itg TetEdg[6][2] = { {0,1}, {0,2}, {0,3}, {1,2}, {1,3}, {2,3} }; +static const itg TetFac[4][3] = { {1,2,3}, {2,0,3}, {3,0,1}, {0,2,1} }; +static const itg TetFacEdg[4][3] = { {5,4,3}, {2,5,1}, {0,4,2}, {3,1,0} }; +static const itg tvpe[12][2] = { {3,2}, {0,1}, {4,5}, {7,6}, {3,7}, {2,6}, + {1,5}, {0,4}, {3,0}, {7,4}, {6,5}, {2,1} }; +static const itg tvpf[6][4] = { {3,0,4,7}, {5,1,2,6}, {3,2,1,0}, + {5,6,7,4},{3,7,6,2}, {5,4,0,1} }; + + +/*----------------------------------------------------------------------------*/ +/* Allocate and build a new octree from user's data */ +/*----------------------------------------------------------------------------*/ + +int64_t LolNewOctree(itg NmbVer, fpn *PtrCrd1, fpn *PtrCrd2, + itg NmbEdg, itg *PtrEdg1, itg *PtrEdg2, + itg NmbTri, itg *PtrTri1, itg *PtrTri2, + itg NmbQad, itg *PtrQad1, itg *PtrQad2, + itg NmbTet, itg *PtrTet1, itg *PtrTet2, + itg NmbPyr, itg *PtrPyr1, itg *PtrPyr2, + itg NmbPri, itg *PtrPri1, itg *PtrPri2, + itg NmbHex, itg *PtrHex1, itg *PtrHex2, + itg BasIdx, itg NmbThr) +{ + itg i, j, k, t, EdgIdx, TotItmCnt = 0, MaxItmCnt, idx = 0; + fpn crd[3]; + BucSct *buc; + TreSct *tre = NULL; + MshSct *msh; + OctThrSct *OctThr; + MshThrSct *MshThr; + + // Make sure we have a vertex table and a valid base index (0 or 1) + if(!NmbVer || !PtrCrd1 || !PtrCrd2 || (BasIdx < 0) || (BasIdx > 1) ) + return(0); + + NmbThr = MAX(NmbThr, 1); + NmbThr = MIN(NmbThr, MaxThr); + MaxItmCnt = NmbVer; + + // Setup a single octant octree + tre = calloc(1, sizeof(TreSct)); + assert(tre); + + // Setup the mesh structure + msh = NewMem(tre, sizeof(MshSct)); + msh->BasIdx = BasIdx; + + msh->NmbItm[ LolTypVer ] = NmbVer; + TotItmCnt += NmbVer; + msh->UsrPtr[ LolTypVer ] = (char *)PtrCrd1; + msh->UsrSiz[ LolTypVer ] = (char *)PtrCrd2 - (char *)PtrCrd1; + + msh->NmbItm[ LolTypEdg ] = NmbEdg; + MaxItmCnt = MAX(MaxItmCnt, NmbEdg); + TotItmCnt += NmbEdg; + msh->UsrPtr[ LolTypEdg ] = (char *)PtrEdg1; + msh->UsrSiz[ LolTypEdg ] = (char *)PtrEdg2 - (char *)PtrEdg1; + + msh->NmbItm[ LolTypTri ] = NmbTri; + MaxItmCnt = MAX(MaxItmCnt, NmbTri); + TotItmCnt += NmbTri; + msh->UsrPtr[ LolTypTri ] = (char *)PtrTri1; + msh->UsrSiz[ LolTypTri ] = (char *)PtrTri2 - (char *)PtrTri1; + + msh->NmbItm[ LolTypQad ] = NmbQad; + MaxItmCnt = MAX(MaxItmCnt, NmbQad); + TotItmCnt += NmbQad; + msh->UsrPtr[ LolTypQad ] = (char *)PtrQad1; + msh->UsrSiz[ LolTypQad ] = (char *)PtrQad2 - (char *)PtrQad1; + + msh->NmbItm[ LolTypTet ] = NmbTet; + MaxItmCnt = MAX(MaxItmCnt, NmbTet); + TotItmCnt += NmbTet; + msh->UsrPtr[ LolTypTet ] = (char *)PtrTet1; + msh->UsrSiz[ LolTypTet ] = (char *)PtrTet2 - (char *)PtrTet1; + + for(t=0;t<NmbThr;t++) + { + MshThr = &msh->thr[t]; + + MshThr->FlgTab = NewMem(tre, (MaxItmCnt + 1) * sizeof(char) ); + memset(MshThr->FlgTab, 0, (MaxItmCnt + 1) * sizeof(char)); + + MshThr->TagTab = NewMem(tre, (MaxItmCnt + 1) * sizeof(itg) ); + memset(MshThr->TagTab, 0, (MaxItmCnt + 1) * sizeof(itg)); + + MshThr->tag = 0; + } + + // Setup the octree structure + SetMshBox(tre, msh); + tre->msh = msh; + msh->eps = tre->eps; + + // Set the grid size depending on the number of entities in the mesh + tre->GrdLvl = MAX(MinGrdLvl, log((TotItmCnt) / ItmPerBuc) / (3 * log(2))); + tre->NmbBuc = 1<<tre->GrdLvl; + tre->grd = NewMem(tre, CUB(tre->NmbBuc) * sizeof(BucSct)); + tre->NmbThr = NmbThr; + + for(t=0;t<NmbThr;t++) + { + MshThr = &msh->thr[t]; + OctThr = &tre->thr[t]; + + OctThr->ThrStk = NewMem(tre, CUB(tre->NmbBuc) * sizeof(void *)); + OctThr->ThrTag = NewMem(tre, CUB(tre->NmbBuc) * sizeof(itg)); + + // Setup the temporary edge for local geometric calculations + for(i=0;i<2;i++) + MshThr->edg.ver[i] = &MshThr->ver[i]; + + // Setup the temporary triangle for local geometric calculations + for(i=0;i<3;i++) + { + MshThr->tri.ver[i] = &MshThr->ver[i]; + MshThr->tri.edg[i].ver[0] = &MshThr->ver[ (i+1)%3 ]; + MshThr->tri.edg[i].ver[1] = &MshThr->ver[ (i+2)%3 ]; + } + + // Setup the temporary quad for local geometric calculations + for(i=0;i<4;i++) + { + MshThr->qad.ver[i] = &MshThr->ver[i]; + MshThr->qad.edg[i].ver[0] = &MshThr->ver[ i ]; + MshThr->qad.edg[i].ver[1] = &MshThr->ver[ (i+1)%4 ]; + } + + // The quad is made of two triangles + MshThr->qad.tri[0].ver[0] = &MshThr->ver[0]; + MshThr->qad.tri[0].ver[1] = &MshThr->ver[1]; + MshThr->qad.tri[0].ver[2] = &MshThr->ver[2]; + + MshThr->qad.tri[1].ver[0] = &MshThr->ver[3]; + MshThr->qad.tri[1].ver[1] = &MshThr->ver[2]; + MshThr->qad.tri[1].ver[2] = &MshThr->ver[1]; + + for(i=0;i<2;i++) + for(j=0;j<3;j++) + { + MshThr->qad.tri[i].edg[j].ver[0] = MshThr->qad.tri[i].ver[ (j+1)%3 ]; + MshThr->qad.tri[i].edg[j].ver[1] = MshThr->qad.tri[i].ver[ (j+2)%3 ]; + } + + // Setup the temporary tetrahedron for local geometric calculations + for(i=0;i<4;i++) + MshThr->tet.ver[i] = &MshThr->ver[i]; + + for(i=0;i<4;i++) + { + for(j=0;j<3;j++) + MshThr->tet.tri[i].ver[j] = MshThr->tet.ver[ TetFac[i][j] ]; + + for(j=0;j<3;j++) + { + EdgIdx = TetFacEdg[i][j]; + MshThr->tet.tri[i].edg[j].ver[0] = MshThr->tet.ver[ TetEdg[ EdgIdx ][0] ]; + MshThr->tet.tri[i].edg[j].ver[1] = MshThr->tet.ver[ TetEdg[ EdgIdx ][1] ]; + } + } + + for(i=0;i<6;i++) + for(j=0;j<2;j++) + MshThr->tet.edg[i].ver[j] = MshThr->tet.ver[ TetEdg[i][j] ]; + + // Setup the temporary hex for local geometric calculations + for(i=0;i<8;i++) + OctThr->hex.ver[i] = &OctThr->ver[i]; + + for(i=0;i<12;i++) + { + OctThr->hex.edg[i].ver[0] = &OctThr->ver[ tvpe[i][0] ]; + OctThr->hex.edg[i].ver[1] = &OctThr->ver[ tvpe[i][1] ]; + } + + for(i=0;i<6;i++) + for(j=0;j<4;j++) + OctThr->hex.qad[i].ver[j] = &OctThr->ver[ tvpf[i][j] ]; + + for(i=0;i<4;i++) + { + OctThr->hex.edg[i].tng[0] = 1; + OctThr->hex.edg[i].tng[1] = 0; + OctThr->hex.edg[i].tng[2] = 0; + + OctThr->hex.edg[i+4].tng[0] = 0; + OctThr->hex.edg[i+4].tng[1] = 1; + OctThr->hex.edg[i+4].tng[2] = 0; + + OctThr->hex.edg[i+8].tng[0] = 0; + OctThr->hex.edg[i+8].tng[1] = 0; + OctThr->hex.edg[i+8].tng[2] = 1; + } + + OctThr->hex.qad[0].nrm[0] = 1; + OctThr->hex.qad[0].nrm[1] = 0; + OctThr->hex.qad[0].nrm[2] = 0; + + OctThr->hex.qad[1].nrm[0] = -1; + OctThr->hex.qad[1].nrm[1] = 0; + OctThr->hex.qad[1].nrm[2] = 0; + + OctThr->hex.qad[2].nrm[0] = 0; + OctThr->hex.qad[2].nrm[1] = 1; + OctThr->hex.qad[2].nrm[2] = 0; + + OctThr->hex.qad[3].nrm[0] = 0; + OctThr->hex.qad[3].nrm[1] = -1; + OctThr->hex.qad[3].nrm[2] = 0; + + OctThr->hex.qad[4].nrm[0] = 0; + OctThr->hex.qad[4].nrm[1] = 0; + OctThr->hex.qad[4].nrm[2] = 1; + + OctThr->hex.qad[5].nrm[0] = 0; + OctThr->hex.qad[5].nrm[1] = 0; + OctThr->hex.qad[5].nrm[2] = -1; + } + + // Insert each vertex in the octree + for(i=0;i<msh->NmbItm[ LolTypVer ];i++) + { + SetItm(msh, LolTypVer, i + BasIdx, 0, 0); + AddVer(msh, tre, &tre->oct, tre->bnd[0], tre->bnd[1]); + } + + // Insert each edge in the octree + for(i=0;i<msh->NmbItm[ LolTypEdg ];i++) + { + SetItm(msh, LolTypEdg, i + BasIdx, 0, 0); + AddEdg(msh, tre, &tre->oct, tre->bnd[0], tre->bnd[1]); + } + + // Insert each triangle in the octree + for(i=0;i<msh->NmbItm[ LolTypTri ];i++) + { + SetItm(msh, LolTypTri, i + BasIdx, TngFlg | AniFlg, 0); + AddTri(msh, tre, &tre->oct, tre->bnd[0], tre->bnd[1]); + } + + // Insert each quad in the octree + for(i=0;i<msh->NmbItm[ LolTypQad ];i++) + { + SetItm(msh, LolTypQad, i + BasIdx, TngFlg | AniFlg, 0); + AddQad(msh, tre, &tre->oct, tre->bnd[0], tre->bnd[1]); + } + + // Insert each tetrahedron in the octree + for(i=0;i<msh->NmbItm[ LolTypTet ];i++) + { + SetItm(msh, LolTypTet, i + BasIdx, TngFlg, 0); + AddTet(msh, tre, &tre->oct, tre->bnd[0], tre->bnd[1]); + } + + // Setup an acceleration grid whose buckets point to an octant + tre->BucSiz = (tre->bnd[1][0] - tre->bnd[0][0]) / (fpn)tre->NmbBuc; + crd[0] = tre->bnd[0][0] + tre->BucSiz / 2.; + + for(i=0;i<tre->NmbBuc;i++) + { + crd[1] = tre->bnd[0][1] + tre->BucSiz / 2.; + + for(j=0;j<tre->NmbBuc;j++) + { + crd[2] = tre->bnd[0][2] + tre->BucSiz / 2.; + + for(k=0;k<tre->NmbBuc;k++) + { + buc = &tre->grd[ i * POW(tre->NmbBuc) + j * tre->NmbBuc + k ]; + buc->oct = GetCrd(&tre->oct, tre->GrdLvl, + crd, tre->bnd[0], tre->bnd[1]); + buc->pos[0] = i; + buc->pos[1] = j; + buc->pos[2] = k; + buc->idx = idx++; + crd[2] += tre->BucSiz; + } + + crd[1] += tre->BucSiz; + } + + crd[0] += tre->BucSiz; + } + + // Return the octree's unique ID + return((int64_t)tre); +} + + +/*----------------------------------------------------------------------------*/ +/* Free the octants and the links */ +/*----------------------------------------------------------------------------*/ + +size_t LolFreeOctree(int64_t OctIdx) +{ + TreSct *tre = (TreSct *)OctIdx; + size_t MemUse = tre->MemUse; + + FreAllMem(tre); + memset(tre, 0, sizeof(TreSct)); + + return(MemUse); +} + + +/*----------------------------------------------------------------------------*/ +/* Search the octree for mesh entities included in this box */ +/*----------------------------------------------------------------------------*/ + +itg LolGetBoundingBox( int64_t OctIdx, itg typ, itg MaxItm, itg *ItmTab, + fpn MinCrd[3], fpn MaxCrd[3], itg ThrIdx ) +{ + itg i, NmbItm = 0; + fpn box[2][3] = { {MinCrd[0], MinCrd[1], MinCrd[2]}, + {MaxCrd[0], MaxCrd[1], MaxCrd[2]} }; + TreSct *tre = (TreSct *)OctIdx; + + GetBox( tre, &tre->oct, typ, &NmbItm, MaxItm, ItmTab, + tre->msh->thr[ ThrIdx ].FlgTab, box, tre->eps, + tre->bnd[0], tre->bnd[1], ThrIdx ); + + for(i=0;i<NmbItm;i++) + tre->msh->thr[ ThrIdx ].FlgTab[ ItmTab[i] ] = 0; + + return(NmbItm); +} + + +/*----------------------------------------------------------------------------*/ +/* Recusrsive coordinates search */ +/*----------------------------------------------------------------------------*/ + +static OctSct *GetCrd( OctSct *oct, itg MaxLvl, fpn VerCrd[3], + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg SonIdx; + fpn MidCrd[3], OctMin[3], OctMax[3], SonMin[3], SonMax[3]; + + CpyVec(MinCrd, OctMin); + CpyVec(MaxCrd, OctMax); + + // Search for the smallest octant containing + // this vertex but stop at the grid level + while(oct->sub && (oct->lvl < MaxLvl)) + { + LinCmbVec3(.5, OctMin, .5, OctMax, MidCrd); + + SonIdx = ((VerCrd[0] < MidCrd[0]) ? 0 : 1) + | ((VerCrd[1] < MidCrd[1]) ? 0 : 2) + | ((VerCrd[2] < MidCrd[2]) ? 0 : 4); + + SetSonCrd(SonIdx, SonMin, SonMax, OctMin, OctMax); + CpyVec(SonMin, OctMin); + CpyVec(SonMax, OctMax); + oct = oct->son + SonIdx; + } + + return(oct); +} + + +/*----------------------------------------------------------------------------*/ +/* Recusrsive box search */ +/*----------------------------------------------------------------------------*/ + +static void GetBox( TreSct *tre, OctSct *oct, itg typ, itg *NmbItm, + itg MaxItm, itg *ItmTab, char *FlgTab, fpn box[2][3], + fpn eps, fpn MinCrd[3], fpn MaxCrd[3], itg ThrIdx ) +{ + itg i; + LnkSct *lnk; + HexSct hex; + OctThrSct *ThrOct = &tre->thr[ ThrIdx ]; + MshThrSct *ThrMsh = &tre->msh->thr[ ThrIdx ]; + fpn xmid = (MinCrd[0] + MaxCrd[0])/2.; + fpn ymid = (MinCrd[1] + MaxCrd[1])/2.; + fpn zmid = (MinCrd[2] + MaxCrd[2])/2.; + fpn son[8][2][3] = { + { {MinCrd[0], MinCrd[1], MinCrd[2]}, {xmid, ymid, zmid} }, + { {xmid, MinCrd[1], MinCrd[2]}, {MaxCrd[0], ymid, zmid} }, + { {MinCrd[0], ymid, MinCrd[2]}, {xmid, MaxCrd[1], zmid} }, + { {xmid, ymid, MinCrd[2]}, {MaxCrd[0], MaxCrd[1], zmid} }, + { {MinCrd[0], MinCrd[1], zmid}, {xmid, ymid, MaxCrd[2]} }, + { {xmid, MinCrd[1], zmid}, {MaxCrd[0], ymid, MaxCrd[2]} }, + { {MinCrd[0], ymid, zmid}, {xmid, MaxCrd[1], MaxCrd[2]} }, + { {xmid, ymid, zmid}, {MaxCrd[0], MaxCrd[1], MaxCrd[2]} } }; + + if(oct->sub) + { + // Recursively intersect the box with the octree + for(i=0;i<8;i++) + if(BoxIntBox(box, son[i], eps)) + GetBox( tre, oct->son+i, typ, NmbItm, MaxItm, ItmTab, + FlgTab, box, eps, son[i][0], son[i][1], ThrIdx ); + } + else if((lnk = oct->lnk) && (*NmbItm < MaxItm) ) + { + SetTmpHex(&ThrOct->hex, box[0], box[1]); + + // When a terminal octant is reached, add its linked entities + // to the table and flag them to avoid duplicates + do + { + if(lnk->typ != typ) + continue; + + if(lnk->typ == LolTypVer) + { + SetItm(tre->msh, LolTypVer, lnk->idx, 0, ThrIdx); + + if(!VerInsHex(&ThrMsh->ver[0], &ThrOct->hex)) + continue; + } + else if(lnk->typ == LolTypEdg) + { + SetItm(tre->msh, LolTypEdg, lnk->idx, 0, ThrIdx); + + if(!EdgIntHex(&ThrMsh->edg, &ThrOct->hex, tre->eps)) + continue; + } + else if(lnk->typ == LolTypTri) + { + SetItm(tre->msh, LolTypTri, lnk->idx, TngFlg, ThrIdx); + + if(!TriIntHex(&ThrMsh->tri, &ThrOct->hex, tre->eps)) + continue; + } + else if(lnk->typ == LolTypQad) + { + SetItm(tre->msh, LolTypQad, lnk->idx, TngFlg, ThrIdx); + + if(!QadIntHex(&ThrMsh->qad, &ThrOct->hex, tre->eps)) + continue; + } + else if(lnk->typ == LolTypTet) + { + SetItm(tre->msh, LolTypTet, lnk->idx, TngFlg, ThrIdx); + + if(!TetIntHex(&ThrMsh->tet, &ThrOct->hex, tre->eps)) + continue; + } + + if(!FlgTab[ lnk->idx ]) + { + ItmTab[ (*NmbItm)++ ] = lnk->idx; + FlgTab[ lnk->idx ] = 1; + } + }while( (lnk = lnk->nex) && (*NmbItm < MaxItm) ); + } +} + + +/*----------------------------------------------------------------------------*/ +/* Search for the nearest item from a vertex in the octree */ +/*----------------------------------------------------------------------------*/ + +itg LolGetNearest(int64_t OctIdx, itg typ, fpn *VerCrd, fpn *MinDis, fpn MaxDis, + itg (UsrPrc)(void *, itg), void *UsrDat, itg ThrIdx) +{ + TreSct *tre = (TreSct *)OctIdx; + itg i, ins = 0, out = 0, MinItm = 0, ini[3], *tag, len; + fpn MinCrd[3], MaxCrd[3], vec[3]; + MshSct *msh = tre->msh; + BucSct *IniBuc, *buc, *ngb, **stk; + OctThrSct *ThrOct = &tre->thr[ ThrIdx ]; + MshThrSct *ThrMsh = &tre->msh->thr[ ThrIdx ]; + + if( (ThrIdx < 0) || (ThrIdx >= tre->NmbThr) ) + return(0); + + ThrOct->tag++; + ThrMsh->tag = ThrOct->tag; + tag = ThrOct->ThrTag; + stk = ThrOct->ThrStk; + len = tre->NmbBuc; + *MinDis = (MaxDis > 0.) ? POW(MaxDis) : DBL_MAX; + + // Get the vertex's integer coordinates in the grid + // and clip it if it stands outside the bounding box + for(i=0;i<3;i++) + { + ini[i] = (VerCrd[i] - tre->bnd[0][i]) / tre->BucSiz; + ini[i] = MAX(0, ini[i]); + ini[i] = MIN(len-1, ini[i]); + } + + IniBuc = &tre->grd[ ini[0] * POW(len) + ini[1] * len + ini[2] ]; + + // Push the octant containing the starting point on the lifo stack + stk[ ins++ ] = IniBuc; + tag[ IniBuc->idx ] = ThrOct->tag; + + // Flood fill processing of the grid : + // check octant's contents distance against the closest item + while(ins > out) + { + buc = stk[ out++ ]; + GetBucBox( tre, buc, MinCrd, MaxCrd ); + GetOctLnk( msh, typ, VerCrd, &MinItm, MinDis, buc->oct, + MinCrd, MaxCrd, UsrPrc, UsrDat, ThrIdx ); + + // Push unprocessed neighbours on the stack as long as they are not too far + for(i=0;i<6;i++) + { + if( !(ngb = GetBucNgb(tre, buc, i)) || (tag[ ngb->idx ] == ThrOct->tag) ) + continue; + + GetBucBox(tre, ngb, MinCrd, MaxCrd); + + if(DisVerOct(VerCrd, MinCrd, MaxCrd) < *MinDis) + { + stk[ ins++ ] = ngb; + tag[ ngb->idx ] = ThrOct->tag; + } + } + } + + *MinDis = sqrt(*MinDis); + + return(MinItm); +} + + +/*----------------------------------------------------------------------------*/ +/* Find the closest intersected triangle along a line */ +/*----------------------------------------------------------------------------*/ + +itg LolIntersectSurface(int64_t OctIdx, fpn *VerCrd, fpn *VerTng, fpn *MinDis, + fpn MaxDis, itg (UsrPrc)(void *, itg), void *UsrDat, + itg ThrIdx ) +{ + TreSct *tre = (TreSct *)OctIdx; + OctThrSct *ThrOct = &tre->thr[ ThrIdx ]; + MshThrSct *ThrMsh = &tre->msh->thr[ ThrIdx ]; + itg i, ins=0, out=0, MinItm = 0, ini[3], *tag, len; + fpn MinCrd[3], MaxCrd[3], vec[3]; + MshSct *msh = tre->msh; + BucSct *IniBuc, *buc, *ngb, **stk; + + ThrOct->tag++; + ThrMsh->tag = ThrOct->tag; + tag = ThrOct->ThrTag; + stk = ThrOct->ThrStk; + len = tre->NmbBuc; + *MinDis = (MaxDis > 0.) ? POW(MaxDis) : DBL_MAX; + + // Get the vertex's integer coordinates in the grid + // and clip it if it stands outside the bounding box + for(i=0;i<3;i++) + { + ini[i] = (VerCrd[i] - tre->bnd[0][i]) / tre->BucSiz; + ini[i] = MAX(0, ini[i]); + ini[i] = MIN(tre->NmbBuc-1, ini[i]); + } + + IniBuc = &tre->grd[ ini[0] * POW(len) + ini[1] * len + ini[2] ]; + + // Push the octant containing the starting point on the lifo stack + stk[ ins++ ] = IniBuc; + tag[ IniBuc->idx ] = ThrOct->tag; + + // Flood fill processing of the grid : + // check octant's contents distance against the closest item + while(ins > out) + { + buc = stk[ out++ ]; + GetBucBox( tre, buc, MinCrd, MaxCrd); + IntRayOct( tre, msh, VerCrd, VerTng, &MinItm, MinDis, buc->oct, + MinCrd, MaxCrd, UsrPrc, UsrDat, ThrIdx ); + + // Push unprocessed neighbours intersected by the line + // on the stack as long as they are not too far + for(i=0;i<6;i++) + { + if( !(ngb = GetBucNgb(tre, buc, i)) || (tag[ ngb->idx ] == ThrOct->tag) ) + continue; + + GetBucBox(tre, ngb, MinCrd, MaxCrd); + + if(!LinIntBox(VerCrd, VerTng, MinCrd, MaxCrd, tre->eps)) + continue; + + if(DisVerOct(VerCrd, MinCrd, MaxCrd) < *MinDis) + { + stk[ ins++ ] = ngb; + tag[ ngb->idx ] = ThrOct->tag; + } + } + } + + *MinDis = sqrt(*MinDis); + + return(MinItm); +} + + +/*----------------------------------------------------------------------------*/ +/* Project a vertex on a given enitity: vertex, edge, triangle or quad */ +/*----------------------------------------------------------------------------*/ + +itg LolProjectVertex(int64_t OctIdx, fpn *VerCrd, itg typ, + itg MinItm, fpn *MinCrd, itg ThrIdx) +{ + TreSct *tre = (TreSct *)OctIdx; + OctThrSct *ThrOct = &tre->thr[ ThrIdx ]; + MshThrSct *ThrMsh = &tre->msh->thr[ ThrIdx ]; + MshSct *msh = tre->msh; + VerSct TmpVer; + TriSct *tri; + itg i, EdgFlg = 0; + fpn CurDis, MinDis = DBL_MAX; + + if(typ == LolTypVer) + { + // Vertex case, there is only one possible projection: + // the target vertex itself + CpyVec((fpn *)GetPtrItm(msh, LolTypVer, MinItm), MinCrd); + return(1); + } + else if(typ == LolTypEdg) + { + // Edge case, the closest position may be on the edge itself + SetItm(msh, LolTypEdg, MinItm, 0, ThrIdx); + PrjVerLin(VerCrd, ThrMsh->edg.ver[0]->crd, ThrMsh->edg.tng, TmpVer.crd); + + if(VerInsEdg(&ThrMsh->edg, &TmpVer, tre->eps)) + { + CpyVec(TmpVer.crd, MinCrd); + return(2); + } + + // Or one of its two vertices + if(dis(VerCrd, ThrMsh->edg.ver[0]->crd) < dis(VerCrd, ThrMsh->edg.ver[1]->crd)) + CpyVec(ThrMsh->edg.ver[0]->crd, MinCrd); + else + CpyVec(ThrMsh->edg.ver[1]->crd, MinCrd); + + return(1); + } + else if(typ == LolTypTri) + { + // Triangle case, the closest position may be on the triangle itself + SetItm(msh, LolTypTri, MinItm, TngFlg, ThrIdx); + PrjVerPla(VerCrd, ThrMsh->tri.ver[0]->crd, ThrMsh->tri.nrm, TmpVer.crd); + + if(VerInsTri(&ThrMsh->tri, &TmpVer, tre->eps)) + { + CpyVec(TmpVer.crd, MinCrd); + return(3); // the closest projection is inside the triangle + } + + // Or fall inside one of its three edges + for(i=0;i<3;i++) + { + PrjVerLin( VerCrd, ThrMsh->tri.edg[i].ver[0]->crd, + ThrMsh->tri.edg[i].tng, TmpVer.crd ); + + if(VerInsEdg(&ThrMsh->tri.edg[i], &TmpVer, tre->eps) + && (dis(VerCrd, TmpVer.crd) < MinDis) ) + { + MinDis = dis(VerCrd, TmpVer.crd); + CpyVec(TmpVer.crd, MinCrd); + EdgFlg = 2; + } + } + + // Or one of the three vertices + for(i=0;i<3;i++) + { + CurDis = dis(VerCrd, ThrMsh->tri.ver[i]->crd); + + if(CurDis < MinDis) + { + MinDis = CurDis; + CpyVec(ThrMsh->tri.ver[i]->crd, MinCrd); + EdgFlg = 0; + } + } + + if(EdgFlg) + return(2); // the closest projection is on an edge + else + return(1); // the closest projection is on a vertex + } + else if(typ == LolTypQad) + { + SetItm(msh, LolTypQad, MinItm, TngFlg, ThrIdx); + + // Compute the projection on the two triangles + for(i=0;i<2;i++) + { + tri = &ThrMsh->qad.tri[i]; + PrjVerPla(VerCrd, tri->ver[0]->crd, tri->nrm, TmpVer.crd); + + if(VerInsTri(tri, &TmpVer, tre->eps)) + { + CpyVec(TmpVer.crd, MinCrd); + return(3); // the closest projection is inside the quad + } + } + + // Check the projections on the four edges + for(i=0;i<4;i++) + { + PrjVerLin( VerCrd, ThrMsh->qad.edg[i].ver[0]->crd, + ThrMsh->qad.edg[i].tng, TmpVer.crd ); + + if(VerInsEdg(&ThrMsh->qad.edg[i], &TmpVer, tre->eps) + && (dis(VerCrd, TmpVer.crd) < MinDis) ) + { + MinDis = dis(VerCrd, TmpVer.crd); + CpyVec(TmpVer.crd, MinCrd); + EdgFlg = 2; + } + } + + // Or one of the four vertices + for(i=0;i<4;i++) + { + CurDis = dis(VerCrd, ThrMsh->qad.ver[i]->crd); + + if(CurDis < MinDis) + { + MinDis = CurDis; + CpyVec(ThrMsh->qad.ver[i]->crd, MinCrd); + EdgFlg = 0; + } + } + + if(EdgFlg) + return(2); // the closest projection is on an edge + else + return(1); // the closest projection is on a vertex + } + else + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Extract the bounding box from a grid's bucket */ +/*----------------------------------------------------------------------------*/ + +static void GetBucBox( TreSct *tre, BucSct *buc, + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg i; + + for(i=0;i<3;i++) + { + MinCrd[i] = tre->bnd[0][i] + buc->pos[i] * tre->BucSiz; + MaxCrd[i] = tre->bnd[0][i] + (buc->pos[i]+1) * tre->BucSiz; + } + +} + + +/*----------------------------------------------------------------------------*/ +/* Get a bucket's neighbour from the grid */ +/*----------------------------------------------------------------------------*/ + +static BucSct *GetBucNgb(TreSct *tre, BucSct *buc, itg dir) +{ + if( (dir == 0) && (buc->pos[0] > 0) ) + return(&tre->grd[ (buc->pos[0]-1) * POW(tre->NmbBuc) + + buc->pos[1] * tre->NmbBuc + buc->pos[2] ]); + + if( (dir == 1) && (buc->pos[0] < tre->NmbBuc-1) ) + return(&tre->grd[ (buc->pos[0]+1) * POW(tre->NmbBuc) + + buc->pos[1] * tre->NmbBuc + buc->pos[2] ]); + + if( (dir == 2) && (buc->pos[1] > 0) ) + return(&tre->grd[ buc->pos[0] * POW(tre->NmbBuc) + + (buc->pos[1]-1) * tre->NmbBuc + buc->pos[2] ]); + + if( (dir == 3) && (buc->pos[1] < tre->NmbBuc-1) ) + return(&tre->grd[ buc->pos[0] * POW(tre->NmbBuc) + + (buc->pos[1]+1) * tre->NmbBuc + buc->pos[2] ]); + + if( (dir == 4) && (buc->pos[2] > 0) ) + return(&tre->grd[ buc->pos[0] * POW(tre->NmbBuc) + + buc->pos[1] * tre->NmbBuc + buc->pos[2]-1 ]); + + if( (dir == 5) && (buc->pos[2] < tre->NmbBuc-1) ) + return(&tre->grd[ buc->pos[0] * POW(tre->NmbBuc) + + buc->pos[1] * tre->NmbBuc + buc->pos[2]+1 ]); + + return(NULL); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the distance between a point and an octant */ +/*----------------------------------------------------------------------------*/ + +static fpn DisVerOct(fpn VerCrd[3], fpn MinCrd[3], fpn MaxCrd[3]) +{ + itg i; + fpn ClpCrd[3]; + + // Project the vertex on the octant's surface + for(i=0;i<3;i++) + { + ClpCrd[i] = MAX(VerCrd[i], MinCrd[i]); + ClpCrd[i] = MIN(ClpCrd[i], MaxCrd[i]); + } + + // The distance between the projection and the vertex is the shortest + // if this latter stands OUTSIDE the octant + return(DisPow(ClpCrd, VerCrd)); +} + + +/*----------------------------------------------------------------------------*/ +/* Search for the nearest item from a vertex from an octant */ +/*----------------------------------------------------------------------------*/ + +static void GetOctLnk( MshSct *msh, itg typ, fpn VerCrd[3], itg *MinItm, + fpn *MinDis, OctSct *oct, fpn MinCrd[3], fpn MaxCrd[3], + itg (UsrPrc)(void *, itg), void *UsrDat, itg ThrIdx ) +{ + itg i, *IdxTab; + fpn CurDis, SonMin[3], SonMax[3]; + LnkSct *lnk; + MshThrSct *ThrMsh = &msh->thr[ ThrIdx ]; + + if(oct->sub) + { + // Check each sons recursively as long as the minimum distance + // between the vertex and the octant is lower than + // the current distance from the closest entity + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + + if(DisVerOct(VerCrd, SonMin, SonMax) <= *MinDis) + GetOctLnk( msh, typ, VerCrd, MinItm, MinDis, oct->son + i, + SonMin, SonMax, UsrPrc, UsrDat, ThrIdx ); + } + } + else if((lnk = oct->lnk)) + { + // When a leaf octant is reached, compute the distance + // between its linked enities and the vertex + do + { + if(lnk->typ != typ) + continue; + + if(lnk->typ == LolTypVer) + CurDis = DisPow(VerCrd, (fpn *)GetPtrItm(msh, LolTypVer, lnk->idx)); + else if(lnk->typ == LolTypEdg) + { + SetItm(msh, LolTypEdg, lnk->idx, 0, ThrIdx); + CurDis = DisVerEdg(VerCrd, &ThrMsh->edg); + } + else if(lnk->typ == LolTypTri) + { + if(ThrMsh->TagTab[ lnk->idx ] == ThrMsh->tag) + continue; + + ThrMsh->TagTab[ lnk->idx ] = ThrMsh->tag; + + if(UsrPrc && !UsrPrc(UsrDat, lnk->idx)) + continue; + + SetItm(msh, LolTypTri, lnk->idx, 0, ThrIdx); + CurDis = DisVerTri(msh, VerCrd, &ThrMsh->tri); + } + else if(lnk->typ == LolTypQad) + { + if(ThrMsh->TagTab[ lnk->idx ] == ThrMsh->tag) + continue; + + ThrMsh->TagTab[ lnk->idx ] = ThrMsh->tag; + + if(UsrPrc && !UsrPrc(UsrDat, lnk->idx)) + continue; + + SetItm(msh, LolTypQad, lnk->idx, 0, ThrIdx); + CurDis = DisVerQad(msh, VerCrd, &ThrMsh->qad); + } + else if(lnk->typ == LolTypTet) + { + SetItm(msh, LolTypTet, lnk->idx, 0, ThrIdx); + CurDis = DisVerTet(msh, VerCrd, &ThrMsh->tet); + } + + if(CurDis < *MinDis) + { + *MinItm = lnk->idx; + *MinDis = CurDis; + } + }while((lnk = lnk->nex)); + } +} + + +/*----------------------------------------------------------------------------*/ +/* Search for the nearest triangle instersected by a line */ +/*----------------------------------------------------------------------------*/ + +static void IntRayOct( TreSct *tre, MshSct *msh, fpn *crd, fpn *tng, + itg *MinItm, fpn *MinDis, OctSct *oct, fpn MinCrd[3], + fpn MaxCrd[3], itg (UsrPrc)(void *, itg), void *UsrDat, + itg ThrIdx ) +{ + itg i, *IdxTab; + fpn CurDis, SonMin[3], SonMax[3]; + VerSct IntVer; + LnkSct *lnk; + MshThrSct *ThrMsh = &tre->msh->thr[ ThrIdx ]; + + if(oct->sub) + { + // Check each sons recursively as long as the minimum distance + // between the vertex and the octant is lower than + // the current distance from the closest entity + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + + if(!LinIntBox(crd, tng, SonMin, SonMax, msh->eps)) + continue; + + IntRayOct( tre, msh, crd, tng, MinItm, MinDis, oct->son+i, + SonMin, SonMax, UsrPrc, UsrDat, ThrIdx ); + } + } + else if((lnk = oct->lnk)) + { + // When a leaf octant is reached, compute the intersection + // between its linked triangles and the line + do + { + if(lnk->typ != LolTypTri) + continue; + + if(ThrMsh->TagTab[ lnk->idx ] == ThrMsh->tag) + continue; + + ThrMsh->TagTab[ lnk->idx ] = ThrMsh->tag; + SetItm(msh, LolTypTri, lnk->idx, 0, ThrIdx); + + if(UsrPrc && !UsrPrc(UsrDat, lnk->idx)) + continue; + + if(DotPrd(tng, ThrMsh->tri.nrm) != 0.) + { + LinIntPla( crd, tng, ThrMsh->tri.ver[0]->crd, + ThrMsh->tri.nrm, IntVer.crd ); + + if(VerInsTri(&ThrMsh->tri, &IntVer, msh->eps)) + { + CurDis = DisPow(IntVer.crd, crd); + + if(CurDis < *MinDis) + { + *MinItm = lnk->idx; + *MinDis = CurDis; + } + } + } + }while((lnk = lnk->nex)); + } +} + + +/*----------------------------------------------------------------------------*/ +/* Setup an arbitrary geometrical item structure from its index */ +/*----------------------------------------------------------------------------*/ + +static void SetItm(MshSct *msh, itg typ, itg idx, itg flg, itg ThrIdx) +{ + itg i, j, *IdxTab; + const itg TetEdgFac[6][2] = { {2,3}, {1,3}, {1,2}, {0,3}, {0,2}, {0,1} }; + MshThrSct *ThrMsh = &msh->thr[ ThrIdx ]; + + if(typ == LolTypVer) + { + ThrMsh->ver[0].idx = idx; + CpyVec((fpn *)GetPtrItm(msh, typ, idx), ThrMsh->ver[0].crd); + } + else if(typ == LolTypEdg) + { + // Setup the temporary edge structure with this edge's ID + ThrMsh->edg.idx = idx; + IdxTab = (itg *)GetPtrItm(msh, typ, idx); + + for(i=0;i<2;i++) + CpyVec((fpn *)GetPtrItm(msh, LolTypVer, IdxTab[i]), ThrMsh->edg.ver[i]->crd); + + SetEdgTng(&ThrMsh->edg); + } + else if(typ == LolTypTri) + { + // Setup the temporary triangle structure with this triangle's ID + ThrMsh->tri.idx = idx; + IdxTab = (itg *)GetPtrItm(msh, typ, idx); + + for(i=0;i<3;i++) + CpyVec((fpn *)GetPtrItm(msh, LolTypVer, IdxTab[i]), ThrMsh->tri.ver[i]->crd); + + SetTriNrm(&ThrMsh->tri); + + // Set triangle edge tangents only on request + if(flg & TngFlg) + for(i=0;i<3;i++) + SetEdgTng(&ThrMsh->tri.edg[i]); + + // Compute the aspect ratio on demand + if(flg & AniFlg) + ThrMsh->tri.ani = GetTriAni(&ThrMsh->tri); + } + else if(typ == LolTypQad) + { + // Setup the temporary triangle structure with this triangle's ID + ThrMsh->qad.idx = idx; + IdxTab = (itg *)GetPtrItm(msh, typ, idx); + + for(i=0;i<4;i++) + CpyVec((fpn *)GetPtrItm(msh, LolTypVer, IdxTab[i]), ThrMsh->qad.ver[i]->crd); + + // Set quad edge tangents only on request + if(flg & TngFlg) + for(i=0;i<4;i++) + SetEdgTng(&ThrMsh->qad.edg[i]); + + for(i=0;i<2;i++) + { + SetTriNrm(&ThrMsh->qad.tri[i]); + + // Set triangle edge tangents only on request + if(flg & TngFlg) + for(j=0;j<3;j++) + SetEdgTng(&ThrMsh->qad.tri[i].edg[j]); + + // Compute the aspect ratio on demand + if(flg & AniFlg) + ThrMsh->tri.ani = GetTriAni(&ThrMsh->qad.tri[i]); + } + } + else if(typ == LolTypTet) + { + // Setup the temporary tetrahedron structure with this tet ID + ThrMsh->tet.idx = idx; + IdxTab = (itg *)GetPtrItm(msh, typ, idx); + + for(i=0;i<4;i++) + CpyVec((fpn *)GetPtrItm(msh, LolTypVer, IdxTab[i]), ThrMsh->tet.ver[i]->crd); + + for(i=0;i<4;i++) + SetTriNrm(&ThrMsh->tet.tri[i]); + + // Set tet edge tangents only on request + if(flg & TngFlg) + for(i=0;i<6;i++) + { + SetEdgTng(&ThrMsh->tet.edg[i]); + CpyVec(ThrMsh->tet.edg[i].tng, ThrMsh->tet.tri[ TetEdgFac[i][0] ].edg[0].tng); + CpyVec(ThrMsh->tet.edg[i].tng, ThrMsh->tet.tri[ TetEdgFac[i][1] ].edg[1].tng); + } + } +} + + +/*----------------------------------------------------------------------------*/ +/* Save the local mesh entities into their backup position */ +/*----------------------------------------------------------------------------*/ + +static void BakMshItm(MshSct *msh) +{ + memcpy(&msh->thr[0].BakEdg, &msh->thr[0].edg, sizeof(EdgSct)); + memcpy(&msh->thr[0].BakTri, &msh->thr[0].tri, sizeof(TriSct)); + memcpy(&msh->thr[0].BakQad, &msh->thr[0].qad, sizeof(QadSct)); + memcpy(&msh->thr[0].BakTet, &msh->thr[0].tet, sizeof(TetSct)); + memcpy( msh->thr[0].BakVer, msh->thr[0].ver, 4 * sizeof(VerSct)); +} + + +/*----------------------------------------------------------------------------*/ +/* Restore the local entities from the backup to the current position */ +/*----------------------------------------------------------------------------*/ + +static void RstMshItm(MshSct *msh) +{ + memcpy(&msh->thr[0].edg, &msh->thr[0].BakEdg, sizeof(EdgSct)); + memcpy(&msh->thr[0].tri, &msh->thr[0].BakTri, sizeof(TriSct)); + memcpy(&msh->thr[0].qad, &msh->thr[0].BakQad, sizeof(QadSct)); + memcpy(&msh->thr[0].tet, &msh->thr[0].BakTet, sizeof(TetSct)); + memcpy( msh->thr[0].ver, msh->thr[0].BakVer, 4 * sizeof(VerSct)); +} + + +/*----------------------------------------------------------------------------*/ +/* Get a geometric item adress in the user's table */ +/*----------------------------------------------------------------------------*/ + +static char *GetPtrItm(MshSct *msh, itg typ, itg idx) +{ + return(msh->UsrPtr[ typ ] + (idx - msh->BasIdx) * msh->UsrSiz[ typ ]); +} + + +/*----------------------------------------------------------------------------*/ +/* Create a mesh with one hexa enclosing the whole surface */ +/*----------------------------------------------------------------------------*/ + +static void SetMshBox(TreSct *box, MshSct *msh) +{ + itg i, j; + fpn MinCrd[3], MaxCrd[3], MidCrd[3], *CrdTab, siz; + + // Compute the bounding box (rectangular) + CpyVec((fpn *)GetPtrItm(msh, LolTypVer, msh->BasIdx), MinCrd); + CpyVec((fpn *)GetPtrItm(msh, LolTypVer, msh->BasIdx), MaxCrd); + + for(i=1;i<msh->NmbItm[ LolTypVer ];i++) + { + CrdTab = (fpn *)GetPtrItm(msh, LolTypVer, i + msh->BasIdx); + + for(j=0;j<3;j++) + { + MinCrd[j] = MIN(MinCrd[j], CrdTab[j]); + MaxCrd[j] = MAX(MaxCrd[j], CrdTab[j]); + } + } + + // Compute the bounding box + siz = MAX(MaxCrd[0] - MinCrd[0], MaxCrd[1] - MinCrd[1]); + siz = MAX(siz, MaxCrd[2] - MinCrd[2]); + box->eps = siz * FLT_EPSILON; + box->MinSiz = box->MaxSiz = siz; + + // Move the center 1/1000th away + LinCmbVec3(.5, MinCrd, .5, MaxCrd, MidCrd); + AddScaVec1(siz * FLT_EPSILON, MidCrd); + AddScaVec2(-1.02 * siz / 2., MidCrd, box->bnd[0]); + AddScaVec2( 1.02 * siz / 2., MidCrd, box->bnd[1]); +} + + +/*----------------------------------------------------------------------------*/ +/* Add a vertex to leaf octants */ +/*----------------------------------------------------------------------------*/ + +static void AddVer( MshSct *msh, TreSct *tre, OctSct *oct, + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg i; + fpn SonMin[3], SonMax[3]; + + if(oct->sub) + { + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + + if(VerInsOct(msh->thr[0].ver[0].crd, SonMin, SonMax)) + AddVer(msh, tre, oct->son+i, SonMin, SonMax); + } + } + else + { + LnkItm(tre, oct, LolTypVer, msh->thr[0].ver[0].idx, 0); + + if((oct->lvl < tre->GrdLvl) + || ((oct->NmbVer >= oct->MaxItm) && (oct->lvl < MaxOctLvl)) ) + { + SubOct(msh, tre, oct, MinCrd, MaxCrd); + } + } +} + + +/*----------------------------------------------------------------------------*/ +/* Add an edge to leaf octants */ +/*----------------------------------------------------------------------------*/ + +static void AddEdg( MshSct *msh, TreSct *tre, OctSct *oct, + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg i; + fpn SonMin[3], SonMax[3]; + + if(oct->sub) + { + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(EdgIntHex(&msh->thr[0].edg, &tre->thr[0].hex, tre->eps)) + AddEdg(msh, tre, oct->son+i, SonMin, SonMax); + } + } + else + { + LnkItm(tre, oct, LolTypEdg, msh->thr[0].edg.idx, 0); + + if( (oct->lvl < tre->GrdLvl) + || ((oct->NmbEdg >= oct->MaxItm) && (oct->lvl < MaxOctLvl)) ) + { + SubOct(msh, tre, oct, MinCrd, MaxCrd); + } + } +} + + +/*----------------------------------------------------------------------------*/ +/* Add a triangle to leaf octants */ +/*----------------------------------------------------------------------------*/ + +static void AddTri( MshSct *msh, TreSct *tre, OctSct *oct, + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg i; + fpn SonMin[3], SonMax[3]; + + if(oct->sub) + { + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(TriIntHex(&msh->thr[0].tri, &tre->thr[0].hex, tre->eps)) + AddTri(msh, tre, oct->son+i, SonMin, SonMax); + } + } + else + { + LnkItm(tre, oct, LolTypTri, msh->thr[0].tri.idx, msh->thr[0].tri.ani); + + if( (oct->lvl < tre->GrdLvl) + || ((oct->NmbFac >= oct->MaxItm) && (oct->lvl < MaxOctLvl)) ) + { + SubOct(msh, tre, oct, MinCrd, MaxCrd); + } + } +} + + +/*----------------------------------------------------------------------------*/ +/* Add a quad to leaf octants */ +/*----------------------------------------------------------------------------*/ + +static void AddQad( MshSct *msh, TreSct *tre, OctSct *oct, + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg i; + fpn SonMin[3], SonMax[3]; + + if(oct->sub) + { + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(QadIntHex(&msh->thr[0].qad, &tre->thr[0].hex, tre->eps)) + AddQad(msh, tre, oct->son+i, SonMin, SonMax); + } + } + else + { + LnkItm(tre, oct, LolTypQad, msh->thr[0].qad.idx, 0); + + if( (oct->lvl < tre->GrdLvl) + || ((oct->NmbFac >= oct->MaxItm) && (oct->lvl < MaxOctLvl)) ) + { + SubOct(msh, tre, oct, MinCrd, MaxCrd); + } + } +} + + +/*----------------------------------------------------------------------------*/ +/* Add a tetrahedron to leaf octants */ +/*----------------------------------------------------------------------------*/ + +static void AddTet( MshSct *msh, TreSct *tre, OctSct *oct, + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg i; + fpn SonMin[3], SonMax[3]; + + if(oct->sub) + { + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(TetIntHex(&msh->thr[0].tet, &tre->thr[0].hex, tre->eps)) + AddTet(msh, tre, oct->son+i, SonMin, SonMax); + } + } + else + { + LnkItm(tre, oct, LolTypTet, msh->thr[0].tet.idx, msh->thr[0].tet.ani); + + if( (oct->lvl < tre->GrdLvl) + || ((oct->NmbFac >= oct->MaxItm) && (oct->lvl < MaxOctLvl)) ) + { + SubOct(msh, tre, oct, MinCrd, MaxCrd); + } + } +} + + +/*----------------------------------------------------------------------------*/ +/* Subdivide an octant and its content to its sons */ +/*----------------------------------------------------------------------------*/ + +static void SubOct( MshSct *msh, TreSct *tre, OctSct *oct, + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + itg i, j, *IdxTab; + fpn SonMin[3], SonMax[3]; + LnkSct *lnk , *OctLnk = oct->lnk; + OctSct *son; + + // If there is no more free octants, allocate a new bloc + if(!tre->NmbFreOct) + { + tre->CurOctBlk = NewMem(tre, MemBlkSiz * 8 * sizeof(OctSct)); + tre->NmbFreOct = MemBlkSiz; + } + + // The octant points on its first son, the other are consectutive in memory + oct->son = &tre->CurOctBlk[ (MemBlkSiz - tre->NmbFreOct--) * 8 ]; + oct->sub = 1; + tre->NmbOct+=8; + + // Initialize each sons + for(i=0;i<8;i++) + { + son = oct->son+i; + son->lnk = NULL; + son->son = NULL; + son->NmbVer = son->NmbEdg = son->NmbFac = son->NmbVol = 0; + son->ani = 1; + son->MaxItm = MaxItmOct; + son->sub = 0; + son->lvl = oct->lvl + 1; + } + + // Update octree min octant size and max level + tre->MinSiz = MIN(tre->MinSiz, (MaxCrd[0] - MinCrd[0])/2.); + tre->MaxLvl = MAX(tre->MaxLvl, oct->lvl+1); + + // Backup the curent mesh local entities that are being tested + // as the propagation process will call SetItm an all linked items + BakMshItm(msh); + + // Now unlink every items from the father and add them to its sons + while((lnk = OctLnk)) + { + if(lnk->typ == LolTypVer) + { + // Check inclusion of vertices among the 8 sons + SetItm(msh, LolTypVer, lnk->idx, 0, 0); + + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + + if(VerInsOct(msh->thr[0].ver[0].crd, SonMin, SonMax)) + LnkItm(tre, oct->son+i, LolTypVer, lnk->idx, 0); + } + } + else if(lnk->typ == LolTypEdg) + { + // Check the intersection between edge and the 8 sons + SetItm(msh, LolTypEdg, lnk->idx, 0, 0); + + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(EdgIntHex(&msh->thr[0].edg, &tre->thr[0].hex, tre->eps)) + LnkItm(tre, oct->son+i, LolTypEdg, lnk->idx, 0); + } + } + else if(lnk->typ == LolTypTri) + { + // Check the intersection between the triangle and the 8 sons + SetItm(msh, LolTypTri, lnk->idx, TngFlg | AniFlg, 0); + + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(TriIntHex(&msh->thr[0].tri, &tre->thr[0].hex, tre->eps)) + LnkItm(tre, oct->son+i, LolTypTri, lnk->idx, oct->ani); + } + } + else if(lnk->typ == LolTypQad) + { + // Check the intersection between the quad and the 8 sons + SetItm(msh, LolTypQad, lnk->idx, TngFlg | AniFlg, 0); + + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(QadIntHex(&msh->thr[0].qad, &tre->thr[0].hex, tre->eps)) + LnkItm(tre, oct->son+i, LolTypQad, lnk->idx, oct->ani); + } + } + else if(lnk->typ == LolTypTet) + { + // Check the intersection between the tet and the 8 sons + SetItm(msh, LolTypTet, lnk->idx, TngFlg, 0); + + for(i=0;i<8;i++) + { + SetSonCrd(i, SonMin, SonMax, MinCrd, MaxCrd); + SetTmpHex(&tre->thr[0].hex, SonMin, SonMax); + + if(TetIntHex(&msh->thr[0].tet, &tre->thr[0].hex, tre->eps)) + LnkItm(tre, oct->son+i, LolTypTet, lnk->idx, oct->ani); + } + } + + OctLnk = lnk->nex; + lnk->nex = tre->NexFreLnk; + tre->NexFreLnk = lnk; + } + + // Put back the current mesh enities that are being inserted + RstMshItm(msh); +} + + +/*----------------------------------------------------------------------------*/ +/* Add an entity to an octant linked list */ +/*----------------------------------------------------------------------------*/ + +static void LnkItm(TreSct *tre, OctSct *oct, itg typ, itg idx, char ani) +{ + itg i; + LnkSct *lnk; + + + lnk = oct->lnk; + while(lnk) + { + if(lnk->typ == typ && lnk->idx == idx) + return; + lnk = lnk->nex; + } + + + // In case nore more link container are availbable, allocate a new bloc + if(!tre->NexFreLnk) + { + tre->NexFreLnk = NewMem(tre, MemBlkSiz * sizeof(LnkSct)); + + for(i=0;i<MemBlkSiz;i++) + tre->NexFreLnk[i].nex = &tre->NexFreLnk[ i+1 ]; + + tre->NexFreLnk[ MemBlkSiz - 1 ].nex = NULL; + } + + // Get the next free link container and set it with the given item + lnk = tre->NexFreLnk; + tre->NexFreLnk = lnk->nex; + lnk->typ = typ; + lnk->idx = idx; + lnk->nex = oct->lnk; + oct->lnk = lnk; + + // Update the octant local counters + if(typ == LolTypVer) + oct->NmbVer++; + else if(typ == LolTypEdg) + oct->NmbEdg++; + else if( (typ == LolTypTri) || (typ == LolTypQad) ) + { + // Update the octant mean anisotropic factor + // and deduce a max number of item form it + if(typ == LolTypTri) + { + oct->ani = (oct->ani * oct->NmbFac + ani) / (oct->NmbFac + 1); + oct->MaxItm = MIN(MaxItmOct * ani, 255); + } + + oct->NmbFac++; + } + else + oct->NmbVol++; +} + + +/*----------------------------------------------------------------------------*/ +/* Build an octant strucutre from the two corner points */ +/*----------------------------------------------------------------------------*/ + +static void SetSonCrd( itg SonIdx, fpn SonMin[3], fpn SonMax[3], + fpn MinCrd[3], fpn MaxCrd[3] ) +{ + fpn MidCrd[3]; + + LinCmbVec3(.5, MinCrd, .5, MaxCrd, MidCrd); + + switch(SonIdx) + { + case 0 : { + SonMin[0] = MinCrd[0]; + SonMin[1] = MinCrd[1]; + SonMin[2] = MinCrd[2]; + SonMax[0] = MidCrd[0]; + SonMax[1] = MidCrd[1]; + SonMax[2] = MidCrd[2]; + }return; + + case 1 : { + SonMin[0] = MidCrd[0]; + SonMin[1] = MinCrd[1]; + SonMin[2] = MinCrd[2]; + SonMax[0] = MaxCrd[0]; + SonMax[1] = MidCrd[1]; + SonMax[2] = MidCrd[2]; + }return; + + case 2 : { + SonMin[0] = MinCrd[0]; + SonMin[1] = MidCrd[1]; + SonMin[2] = MinCrd[2]; + SonMax[0] = MidCrd[0]; + SonMax[1] = MaxCrd[1]; + SonMax[2] = MidCrd[2]; + }return; + + case 3 : { + SonMin[0] = MidCrd[0]; + SonMin[1] = MidCrd[1]; + SonMin[2] = MinCrd[2]; + SonMax[0] = MaxCrd[0]; + SonMax[1] = MaxCrd[1]; + SonMax[2] = MidCrd[2]; + }return; + + case 4 : { + SonMin[0] = MinCrd[0]; + SonMin[1] = MinCrd[1]; + SonMin[2] = MidCrd[2]; + SonMax[0] = MidCrd[0]; + SonMax[1] = MidCrd[1]; + SonMax[2] = MaxCrd[2]; + }return; + + case 5 : { + SonMin[0] = MidCrd[0]; + SonMin[1] = MinCrd[1]; + SonMin[2] = MidCrd[2]; + SonMax[0] = MaxCrd[0]; + SonMax[1] = MidCrd[1]; + SonMax[2] = MaxCrd[2]; + }return; + + case 6 : { + SonMin[0] = MinCrd[0]; + SonMin[1] = MidCrd[1]; + SonMin[2] = MidCrd[2]; + SonMax[0] = MidCrd[0]; + SonMax[1] = MaxCrd[1]; + SonMax[2] = MaxCrd[2]; + }return; + + case 7 : { + SonMin[0] = MidCrd[0]; + SonMin[1] = MidCrd[1]; + SonMin[2] = MidCrd[2]; + SonMax[0] = MaxCrd[0]; + SonMax[1] = MaxCrd[1]; + SonMax[2] = MaxCrd[2]; + }return; + } +} + + +/*----------------------------------------------------------------------------*/ +/* Test if a vertex is inside an octant */ +/*----------------------------------------------------------------------------*/ + +static itg VerInsOct(fpn VerCrd[3], fpn MinCrd[3], fpn MaxCrd[3]) +{ + itg i; + + for(i=0;i<3;i++) + if( (VerCrd[i] > MaxCrd[i]) || (VerCrd[i] < MinCrd[i]) ) + return(0); + + return(1); +} + + +/*----------------------------------------------------------------------------*/ +/* Setup a temporary test hex from the bounding box limits */ +/*----------------------------------------------------------------------------*/ + +static void SetTmpHex(HexSct *hex, fpn MinCrd[3], fpn MaxCrd[3]) +{ + hex->ver[0]->crd[0] = MinCrd[0]; + hex->ver[0]->crd[1] = MinCrd[1]; + hex->ver[0]->crd[2] = MaxCrd[2]; + hex->ver[1]->crd[0] = MaxCrd[0]; + hex->ver[1]->crd[1] = MinCrd[1]; + hex->ver[1]->crd[2] = MaxCrd[2]; + hex->ver[2]->crd[0] = MaxCrd[0]; + hex->ver[2]->crd[1] = MinCrd[1]; + hex->ver[2]->crd[2] = MinCrd[2]; + hex->ver[3]->crd[0] = MinCrd[0]; + hex->ver[3]->crd[1] = MinCrd[1]; + hex->ver[3]->crd[2] = MinCrd[2]; + hex->ver[4]->crd[0] = MinCrd[0]; + hex->ver[4]->crd[1] = MaxCrd[1]; + hex->ver[4]->crd[2] = MaxCrd[2]; + hex->ver[5]->crd[0] = MaxCrd[0]; + hex->ver[5]->crd[1] = MaxCrd[1]; + hex->ver[5]->crd[2] = MaxCrd[2]; + hex->ver[6]->crd[0] = MaxCrd[0]; + hex->ver[6]->crd[1] = MaxCrd[1]; + hex->ver[6]->crd[2] = MinCrd[2]; + hex->ver[7]->crd[0] = MinCrd[0]; + hex->ver[7]->crd[1] = MaxCrd[1]; + hex->ver[7]->crd[2] = MinCrd[2]; +} + + +/*----------------------------------------------------------------------------*/ +/* Compute/test the intersection between a line and a cube */ +/*----------------------------------------------------------------------------*/ + +static itg LinIntBox(fpn *LinCrd, fpn *LinTng, + fpn *BoxMin, fpn *BoxMax, fpn eps) +{ + itg i; + fpn IntCrd[3], NrmTab[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; + + // Compute the intersections between the edge and the cube's faces + for(i=0;i<3;i++) + { + if(LinTng[i] == 0.) + continue; + + LinIntPla(LinCrd, LinTng, BoxMin, NrmTab[i], IntCrd); + + if(VerInsBox(IntCrd, BoxMin, BoxMax, eps)) + return(1); + + LinIntPla(LinCrd, LinTng, BoxMax, NrmTab[i], IntCrd); + + if(VerInsBox(IntCrd, BoxMin, BoxMax, eps)) + return(1); + } + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the intersection between a line and a plane */ +/*----------------------------------------------------------------------------*/ + +static void LinIntPla( fpn *LinCrd, fpn *LinTng, + fpn *PlaCrd, fpn *PlaNrm, fpn *IntCrd) +{ + fpn u[3]; + + SubVec3(LinCrd, PlaCrd, u); + LinCmbVec3( 1., LinCrd, -DotPrd(PlaNrm, u) / DotPrd(PlaNrm, LinTng), + LinTng, IntCrd); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if a vertex stands inside a bounding box + epsilon */ +/*----------------------------------------------------------------------------*/ + +static fpn VerInsBox(fpn *VerCrd, fpn *BoxMin, fpn *BoxMax, fpn eps) +{ + if((VerCrd[0] < BoxMin[0] - eps) || (VerCrd[1] < BoxMin[1] - eps) + || (VerCrd[2] < BoxMin[2] - eps) || (VerCrd[0] > BoxMax[0] + eps) + || (VerCrd[1] > BoxMax[1] + eps) || (VerCrd[2] > BoxMax[2] + eps) ) + { + return(0); + } + + return(1); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute/test the intersection between an edge and a hex */ +/*----------------------------------------------------------------------------*/ + +static itg EdgIntHex(EdgSct *edg, HexSct *hex, fpn eps) +{ + itg i; + VerSct IntVer; + + // Test if an edge's vertex is included in the octant + if(VerInsHex(edg->ver[0], hex) || VerInsHex(edg->ver[1], hex)) + return(1); + + // Compute the intersections between the edge and the hex's faces + for(i=0;i<6;i++) + if(EdgIntQad(hex, i, edg, &IntVer, eps)) + return(1); + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if an octant is intersected by a triangle */ +/*----------------------------------------------------------------------------*/ + +static itg TriIntHex(TriSct *tri, HexSct *hex, fpn eps) +{ + itg i, j, pos, neg; + fpn CurDis; + VerSct IntVer; + + // If there is no intersection between the bounding box + // of the triangle and the octant it is no use to test, + // the triangle doesn't intersect the octant + if(( (tri->ver[0]->crd[0] < hex->ver[3]->crd[0]) + && (tri->ver[1]->crd[0] < hex->ver[3]->crd[0]) + && (tri->ver[2]->crd[0] < hex->ver[3]->crd[0]) ) + || ( (tri->ver[0]->crd[0] > hex->ver[5]->crd[0]) + && (tri->ver[1]->crd[0] > hex->ver[5]->crd[0]) + && (tri->ver[2]->crd[0] > hex->ver[5]->crd[0]) ) + || ( (tri->ver[0]->crd[1] < hex->ver[3]->crd[1]) + && (tri->ver[1]->crd[1] < hex->ver[3]->crd[1]) + && (tri->ver[2]->crd[1] < hex->ver[3]->crd[1]) ) + || ( (tri->ver[0]->crd[1] > hex->ver[5]->crd[1]) + && (tri->ver[1]->crd[1] > hex->ver[5]->crd[1]) + && (tri->ver[2]->crd[1] > hex->ver[5]->crd[1]) ) + || ( (tri->ver[0]->crd[2] < hex->ver[3]->crd[2]) + && (tri->ver[1]->crd[2] < hex->ver[3]->crd[2]) + && (tri->ver[2]->crd[2] < hex->ver[3]->crd[2]) ) + || ( (tri->ver[0]->crd[2] > hex->ver[5]->crd[2]) + && (tri->ver[1]->crd[2] > hex->ver[5]->crd[2]) + && (tri->ver[2]->crd[2] > hex->ver[5]->crd[2]) ) ) + { + return(0); + } + + // Test if a triangle's vertex is included in the octant + for(i=0;i<3;i++) + if(VerInsHex(tri->ver[i], hex)) + return(1); + + // Check whether the triangle plane intersects the octant + pos = neg = 0; + + for(i=0;i<8;i++) + { + CurDis = DisVerPla(hex->ver[i]->crd, tri->ver[0]->crd, tri->nrm); + + if(CurDis < -eps) + neg = 1; + else if(CurDis > eps) + pos = 1; + else + pos = neg = 1; + } + + if(!pos || !neg) + return(0); + + // Compute the intersections between the triangle edges and the hex faces + for(i=0;i<6;i++) + for(j=0;j<3;j++) + if(EdgIntQad(hex, i, &tri->edg[j], &IntVer, eps)) + return(1); + + // Compute the intersections between the triangle and the hex edges + for(i=0;i<12;i++) + if(EdgIntTri(tri, &hex->edg[i], &IntVer, eps)) + return(1); + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if an octant is intersected by a quad */ +/*----------------------------------------------------------------------------*/ + +static itg QadIntHex(QadSct *qad, HexSct *hex, fpn eps) +{ + if(TriIntHex(&qad->tri[0], hex, eps) || TriIntHex(&qad->tri[1], hex, eps)) + return(1); + else + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if an octant is intersected by a tetrahedron */ +/*----------------------------------------------------------------------------*/ + +static itg TetIntHex(TetSct *tet, HexSct *hex, fpn eps) +{ + itg i, j, pos, neg; + fpn CurDis; + VerSct IntVer; + + // If there is no intersection between the bounding box + // of the tet and the octant it is no use to test, + // the tet doesn't intersect the octant + if(( (tet->ver[0]->crd[0] < hex->ver[3]->crd[0]) + && (tet->ver[1]->crd[0] < hex->ver[3]->crd[0]) + && (tet->ver[2]->crd[0] < hex->ver[3]->crd[0]) + && (tet->ver[3]->crd[0] < hex->ver[3]->crd[0]) ) + || ( (tet->ver[0]->crd[0] > hex->ver[5]->crd[0]) + && (tet->ver[1]->crd[0] > hex->ver[5]->crd[0]) + && (tet->ver[2]->crd[0] > hex->ver[5]->crd[0]) + && (tet->ver[3]->crd[0] > hex->ver[5]->crd[0]) ) + || ( (tet->ver[0]->crd[1] < hex->ver[3]->crd[1]) + && (tet->ver[1]->crd[1] < hex->ver[3]->crd[1]) + && (tet->ver[2]->crd[1] < hex->ver[3]->crd[1]) + && (tet->ver[3]->crd[1] < hex->ver[3]->crd[1]) ) + || ( (tet->ver[0]->crd[1] > hex->ver[5]->crd[1]) + && (tet->ver[1]->crd[1] > hex->ver[5]->crd[1]) + && (tet->ver[2]->crd[1] > hex->ver[5]->crd[1]) + && (tet->ver[3]->crd[1] > hex->ver[5]->crd[1]) ) + || ( (tet->ver[0]->crd[2] < hex->ver[3]->crd[2]) + && (tet->ver[1]->crd[2] < hex->ver[3]->crd[2]) + && (tet->ver[2]->crd[2] < hex->ver[3]->crd[2]) + && (tet->ver[3]->crd[2] < hex->ver[3]->crd[2]) ) + || ( (tet->ver[0]->crd[2] > hex->ver[5]->crd[2]) + && (tet->ver[1]->crd[2] > hex->ver[5]->crd[2]) + && (tet->ver[2]->crd[2] > hex->ver[5]->crd[2]) + && (tet->ver[3]->crd[2] > hex->ver[5]->crd[2]) ) ) + { + return(0); + } + + // Test if a tet's vertex is included in the octant + for(i=0;i<4;i++) + if(VerInsHex(tet->ver[i], hex)) + return(1); + + // Test if a oct's vertex is included in the octant + for(i=0;i<8;i++) + if(VerInsTet(hex->ver[i], tet, eps)) + return(1); + + // Compute the intersections between the tet edges and the hex faces + for(i=0;i<6;i++) + for(j=0;j<6;j++) + if(EdgIntQad(hex, i, &tet->edg[j], &IntVer, eps)) + return(1); + + // Compute the intersections between the tet's face and the hex's edges + for(i=0;i<12;i++) + for(j=0;j<4;j++) + if(EdgIntTri(&tet->tri[j], &hex->edg[i], &IntVer, eps)) + return(1); + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if a vertex is included in an inflated tet */ +/*----------------------------------------------------------------------------*/ + +itg VerInsTet(VerSct *ver, TetSct *tet, fpn eps) +{ + const itg TetEdg[6][2] = { {0,1}, {1,2}, {2,0}, {3,0}, {3,1}, {3,2} }; + const itg TetFac[4][3] = { {3,2,1}, {0,2,3}, {3,1,0}, {0,1,2} }; + itg i, j, ins = 1; + TetSct SubTet; + + // Create 4 subtets from the vertex and a face of the tet. + // Compute the volume of each subtet, if all of them are positive, + // it means that the vertex is indide the tet + SubTet.ver[3] = ver; + + for(i=0;i<4;i++) + { + for(j=0;j<3;j++) + SubTet.ver[j] = tet->ver[ TetFac[i][j] ]; + + if(GetVolTet(&SubTet) <= 0) + { + ins = 0; + break; + } + } + + if(ins) + return(1); + + // If the vertex is not inside the tet, it may be close to one of its faces + for(i=0;i<4;i++) + if(VerInsTri(&tet->tri[i], ver, eps)) + return(1); + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if a vertex is inside a hex */ +/*----------------------------------------------------------------------------*/ + +static itg VerInsHex(VerSct *ver, HexSct *hex) +{ + itg i; + + for(i=0;i<3;i++) + if( (ver->crd[i] > hex->ver[5]->crd[i]) + || (ver->crd[i] < hex->ver[3]->crd[i]) ) + { + return(0); + } + + return(1); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if an edge intersects a quad */ +/*----------------------------------------------------------------------------*/ + +static itg EdgIntQad(HexSct *hex, itg FacIdx, EdgSct *edg, + VerSct *IntVer, fpn eps) +{ + itg i, NmbVer = 0; + fpn sgn[2]; + VerSct *ver=NULL; + EdgSct edg2; + QadSct *qad = &hex->qad[ FacIdx ]; + + // Compute the distance between the edge's vertices and the quad's plane + for(i=0;i<2;i++) + { + sgn[i] = DisVerPla(edg->ver[i]->crd, qad->ver[0]->crd, qad->nrm); + + if(fabs(sgn[i]) < eps) + { + ver = edg->ver[i]; + NmbVer++; + } + } + + // This leads to 3 possible cases + switch(NmbVer) + { + // Both vertices are far from the plane : + // if they stand in the same side of the plane, there is no intersection, + // otherwise we compute the intersection between the edge and the plane + // and test wether it falls inside the quad or not + case 0 : + { + // Test if both vertices stand on opposite sides of the plane + if(sgn[0] * sgn[1] < 0) + { + LinCmbVec3( fabs(sgn[0]) / (fabs(sgn[0]) + + fabs(sgn[1])), edg->ver[1]->crd, + fabs(sgn[1]) / (fabs(sgn[0]) + + fabs(sgn[1])), edg->ver[0]->crd, IntVer->crd); + + return(VerInsHex(IntVer, hex)); + } + }break; + + case 1 : + { + if(VerInsHex(ver, hex)) + { + CpyVec(ver->crd, IntVer->crd); + return(1); + } + }break; + + case 2 : + { + for(i=0;i<4;i++) + { + edg2.ver[0] = qad->ver[i]; + edg2.ver[1] = qad->ver[ (i+1)%4 ]; + SetEdgTng(&edg2); + + if(EdgIntEdg(edg, &edg2, IntVer, eps)) + return(1); + } + }break; + } + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if an edge intersects a triangle */ +/*----------------------------------------------------------------------------*/ + +static itg EdgIntTri(TriSct *tri, EdgSct *edg, VerSct *IntVer, fpn eps) +{ + itg i, NmbVer = 0; + fpn sgn[2]; + VerSct *ver=NULL; + EdgSct edg2; + + // Compute the distance between the edge's vertices and the triangle's plane + for(i=0;i<2;i++) + { + sgn[i] = DisVerPla(edg->ver[i]->crd, tri->ver[0]->crd, tri->nrm); + + if(fabs(sgn[i]) < eps) + { + ver = edg->ver[i]; + NmbVer++; + } + } + + // This leads to 3 possible cases + switch(NmbVer) + { + // Both vertices are far from the plane : + // if they stand in the same side of the plane, there is no intersection, + // otherwise we compute the intersection between the edge and the plane + // and test wether it falls inside the triangle or not + case 0 : + { + // Test if both vertices stand on opposite sides of the plane + if(sgn[0] * sgn[1] < 0) + { + LinCmbVec3( fabs(sgn[0]) / (fabs(sgn[0]) + + fabs(sgn[1])), edg->ver[1]->crd, + fabs(sgn[1]) / (fabs(sgn[0]) + + fabs(sgn[1])), edg->ver[0]->crd, IntVer->crd); + + return(VerInsTri(tri, IntVer, eps)); + } + }break; + + case 1 : + { + if(VerInsTri(tri, ver, eps)) + { + CpyVec(ver->crd, IntVer->crd); + return(1); + } + }break; + + case 2 : + { + for(i=0;i<3;i++) + { + edg2.ver[0] = tri->ver[i]; + edg2.ver[1] = tri->ver[ (i+1)%3 ]; + SetEdgTng(&edg2); + + if(EdgIntEdg(edg, &edg2, IntVer, eps)) + return(1); + } + }break; + } + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if a vertex is included in an inflated triangle */ +/*----------------------------------------------------------------------------*/ + +static itg VerInsTri(TriSct *tri, VerSct *ver, fpn eps) +{ + itg i, ins = 1; + fpn vec[3][3], nrm[3]; + VerSct img; + EdgSct edg; + + // Project the vertex on the triangle's plane and check the distance + if(PrjVerPla(ver->crd, tri->ver[0]->crd, tri->nrm, img.crd) > eps) + return(0); + + // Compare the normals of the three sub triangles against + // the original triangle's normal. If one of them is opposite, + // the vertex does not belong to the triangle + for(i=0;i<3;i++) + SubVec3(tri->ver[i]->crd, img.crd, vec[i]); + + for(i=0;i<3;i++) + { + CrsPrd(vec[ (i+1)%3 ], vec[i], nrm); + + if(DotPrd(nrm, tri->nrm) <= 0) + { + ins = 0; + break; + } + } + + if(ins) + return(1); + + // If the vertex is not inside the triangle, + // it may be close to one of its edges + for(i=0;i<3;i++) + { + edg.ver[0] = tri->ver[i]; + edg.ver[1] = tri->ver[ (i+1)%3 ]; + SetEdgTng(&edg); + + if(VerInsEdg(&edg, &img, eps)) + return(1); + } + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the intersection between coplanar edges */ +/*----------------------------------------------------------------------------*/ + +static itg EdgIntEdg(EdgSct *edg1, EdgSct *edg2, VerSct *IntVer, fpn eps) +{ + itg i, NmbVer = 0; + fpn siz[2]; + VerSct img, *ver=NULL; + + // Compute the distance between the edge1's vertices + // and the edge2 support line + for(i=0;i<2;i++) + { + PrjVerLin(edg2->ver[i]->crd, edg1->ver[0]->crd, edg1->tng, img.crd); + siz[i] = dis(edg2->ver[i]->crd, img.crd); + + if(siz[i] < eps) + NmbVer++; + } + + // This leads to 3 possible cases + if(NmbVer < 2) + { + LinCmbVec3( siz[0]/(siz[0]+siz[1]), edg2->ver[1]->crd, + siz[1]/(siz[0]+siz[1]), edg2->ver[0]->crd, IntVer->crd); + + return(VerInsEdg(edg1, IntVer, eps)); + } + else + { + ver = NULL; + + if(VerInsEdg(edg2, edg1->ver[0], eps)) + ver = edg1->ver[0]; + else if(VerInsEdg(edg2, edg1->ver[1], eps)) + ver = edg1->ver[1]; + else if(VerInsEdg(edg1, edg2->ver[0], eps)) + ver = edg2->ver[0]; + else if(VerInsEdg(edg1, edg2->ver[1], eps)) + ver = edg2->ver[1]; + + if(ver) + { + CpyVec(ver->crd, IntVer->crd); + return(1); + } + } + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Test if a vertex belongs to an edge */ +/*----------------------------------------------------------------------------*/ + +static itg VerInsEdg(EdgSct *edg, VerSct *ver, fpn eps) +{ + itg i; + fpn u[3], v[3]; + VerSct img; + + // Project the vertex on the edge's support line + PrjVerLin(ver->crd, edg->ver[0]->crd, edg->tng, img.crd); + + if(DisPow(ver->crd, img.crd) > POW(eps)) + return(0); + + // Check if the image belongs to the edge + SubVec3(img.crd, edg->ver[0]->crd, u); + SubVec3(img.crd, edg->ver[1]->crd, v); + + if(DotPrd(u, v) < 0) + return(1); + + // If the vertex does not belong to the edge, + // it may be close to one of its vertices + for(i=0;i<2;i++) + if(DisPow(img.crd, edg->ver[i]->crd) < POW(eps)) + return(1); + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the distance between a vertex and a triangle */ +/*----------------------------------------------------------------------------*/ + +static fpn DisVerTri(MshSct *msh, fpn VerCrd[3], TriSct *tri) +{ + fpn ImgCrd[3], TmpCrd[3], u[3], v[3], w[3], nrm[3], SubVol[3], TotVol; + + // Project the vertex on the triangle's plane + PrjVerPla(VerCrd, tri->ver[0]->crd, tri->nrm, ImgCrd); + + // Compute the vectors stemming from the projection to the triangle's nodes + SubVec3(tri->ver[0]->crd, ImgCrd, u); + SubVec3(tri->ver[1]->crd, ImgCrd, v); + SubVec3(tri->ver[2]->crd, ImgCrd, w); + + // Compute the three tets' volumes + CrsPrd(v, w, nrm); + SubVol[0] = -DotPrd(nrm, tri->nrm); + SubVol[0] = MAX(SubVol[0], 0.); + + CrsPrd(w, u, nrm); + SubVol[1] = -DotPrd(nrm, tri->nrm); + SubVol[1] = MAX(SubVol[1], 0.); + + CrsPrd(u, v, nrm); + SubVol[2] = -DotPrd(nrm, tri->nrm); + SubVol[2] = MAX(SubVol[2], 0.); + + // Compute the closest position with the barycentric coordinates + TotVol = SubVol[0] + SubVol[1] + SubVol[2]; + MulVec2(SubVol[0] / TotVol, tri->ver[0]->crd, ImgCrd); + MulVec2(SubVol[1] / TotVol, tri->ver[1]->crd, TmpCrd); + AddVec2(TmpCrd, ImgCrd); + MulVec2(SubVol[2] / TotVol, tri->ver[2]->crd, TmpCrd); + AddVec2(TmpCrd, ImgCrd); + + // Return the square of the distance + return(DisPow(VerCrd, ImgCrd)); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the distance between a vertex and a quad */ +/*----------------------------------------------------------------------------*/ + +static fpn DisVerQad(MshSct *msh, fpn VerCrd[3], QadSct *qad) +{ + return( MIN(DisVerTri(msh, VerCrd, &qad->tri[0]), + DisVerTri(msh, VerCrd, &qad->tri[1])) ); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the distance between a vertex and a tetrahedron */ +/*----------------------------------------------------------------------------*/ + +static fpn DisVerTet(MshSct *msh, fpn *VerCrd, TetSct *tet) +{ + itg i; + fpn CurDis, MinDis = DBL_MAX; + VerSct TmpVer; + + CpyVec(VerCrd, TmpVer.crd); + + if(VerInsTet(&TmpVer, tet, msh->eps)) + return(0.); + + for(i=0;i<4;i++) + { + CurDis = DisPow(VerCrd, tet->ver[i]->crd); + + if(CurDis < MinDis) + MinDis = CurDis; + } + + return(MinDis); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the triangle's surface */ +/*----------------------------------------------------------------------------*/ + +static fpn GetTriSrf(TriSct *tri) +{ + fpn nrm[3]; + + // Compute the cross-product vector and get its size + GetTriVec(tri, nrm); + return(GetNrmVec(nrm) / 2.); +} + + +/*----------------------------------------------------------------------------*/ +/* fpn precision computed volume on fpn coordinates */ +/*----------------------------------------------------------------------------*/ + +static fpn GetVolTet(TetSct *tet) +{ + fpn c[9]; + + // Create the linear system, each column is filled with a vector + c[0] = tet->ver[1]->crd[0] - tet->ver[0]->crd[0]; + c[1] = tet->ver[2]->crd[0] - tet->ver[0]->crd[0]; + c[2] = tet->ver[3]->crd[0] - tet->ver[0]->crd[0]; + + c[3] = tet->ver[1]->crd[1] - tet->ver[0]->crd[1]; + c[4] = tet->ver[2]->crd[1] - tet->ver[0]->crd[1]; + c[5] = tet->ver[3]->crd[1] - tet->ver[0]->crd[1]; + + c[6] = tet->ver[1]->crd[2] - tet->ver[0]->crd[2]; + c[7] = tet->ver[2]->crd[2] - tet->ver[0]->crd[2]; + c[8] = tet->ver[3]->crd[2] - tet->ver[0]->crd[2]; + + // Return the "determinant" of the matrix + return( c[0] * (c[4]*c[8] - c[5]*c[7]) + + c[1] * (c[5]*c[6] - c[3]*c[8]) + + c[2] * (c[3]*c[7] - c[4]*c[6]) ); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the distance between a vertex and an edge */ +/*----------------------------------------------------------------------------*/ + +static fpn DisVerEdg(fpn VerCrd[3], EdgSct *edg) +{ + fpn dis0, dis1, TotSiz = 0.; + VerSct img; + + PrjVerLin(VerCrd, edg->ver[0]->crd, edg->tng, img.crd); + TotSiz = dis(edg->ver[0]->crd, img.crd) + dis(edg->ver[1]->crd, img.crd); + + if( (TotSiz - edg->siz) < .00001 * (TotSiz + edg->siz)) + return(DisPow(VerCrd, img.crd)); + + dis0 = DisPow(VerCrd, edg->ver[0]->crd); + dis1 = DisPow(VerCrd, edg->ver[1]->crd); + + return(MIN(dis0, dis1)); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the triangle's normal vector */ +/*----------------------------------------------------------------------------*/ + +static void GetTriVec(TriSct *tri, fpn w[3]) +{ + fpn u[3], v[3]; + + // Compute the vector product + SubVec3(tri->ver[1]->crd, tri->ver[0]->crd, u); + SubVec3(tri->ver[2]->crd, tri->ver[0]->crd, v); + CrsPrd(v, u, w); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute and set the triangle normal vector */ +/*----------------------------------------------------------------------------*/ + +static void SetTriNrm(TriSct *tri) +{ + // Compute the cross-product vector and normalize it + GetTriVec(tri, tri->nrm); + NrmVec(tri->nrm); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute and store the edge's unit tangent */ +/*----------------------------------------------------------------------------*/ + +static void SetEdgTng(EdgSct *edg) +{ + SubVec3(edg->ver[1]->crd, edg->ver[0]->crd, edg->tng); + edg->siz = GetNrmVec(edg->tng); + + if(edg->siz) + MulVec1(1./edg->siz, edg->tng); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the normal projection of a point on a line */ +/*----------------------------------------------------------------------------*/ + +static void PrjVerLin( fpn VerCrd[3], fpn LinCrd[3], + fpn LinTng[3], fpn ImgCrd[3] ) +{ + fpn dp, u[3]; + + // Compute the scalar product of the projected vector and the edge's vector + SubVec3(VerCrd, LinCrd, u); + dp = DotPrd(u, LinTng); + LinCmbVec3(1., LinCrd, dp, LinTng, ImgCrd); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the normal projection of a vertex on a plane */ +/*----------------------------------------------------------------------------*/ + +static fpn PrjVerPla(fpn VerCrd[3], fpn PlaCrd[3], + fpn PlaNrm[3], fpn ImgCrd[3] ) +{ + fpn DisPla, u[3]; + + // Compute the scalar product between the unit normal N and a vector V + // defined by the vertex to project and the base plane vertex + SubVec3(PlaCrd, VerCrd, u); + DisPla = DotPrd(u, PlaNrm); + MulVec2(DisPla, PlaNrm, ImgCrd); + AddVec2(VerCrd, ImgCrd); + + // Return the absolute ditance on the fly + return(fabs(DisPla)); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute the distance between a vertex and a plane */ +/*----------------------------------------------------------------------------*/ + +static fpn DisVerPla(fpn VerCrd[3], fpn PlaCrd[3], fpn PlaNrm[3]) +{ + fpn vec[3]; + + SubVec3(VerCrd, PlaCrd, vec); + return(DotPrd(vec, PlaNrm)); +} + + +/*----------------------------------------------------------------------------*/ +/* Test the intersection of two bounding boxex + epsilon */ +/*----------------------------------------------------------------------------*/ + +static itg BoxIntBox(fpn box1[2][3], fpn box2[2][3], fpn eps) +{ + if(( ((box1[0][0] > box2[0][0] - eps) && (box1[0][0] < box2[1][0] + eps)) + || ((box1[1][0] > box2[0][0] - eps) && (box1[1][0] < box2[1][0] + eps)) + || ((box1[0][0] < box2[0][0] ) && (box1[1][0] > box2[1][0] ))) + && ( ((box1[0][1] > box2[0][1] - eps) && (box1[0][1] < box2[1][1] + eps)) + || ((box1[1][1] > box2[0][1] - eps) && (box1[1][1] < box2[1][1] + eps)) + || ((box1[0][1] < box2[0][1] ) && (box1[1][1] > box2[1][1] ))) + && ( ((box1[0][2] > box2[0][2] - eps) && (box1[0][2] < box2[1][2] + eps)) + || ((box1[1][2] > box2[0][2] - eps) && (box1[1][2] < box2[1][2] + eps)) + || ((box1[0][2] < box2[0][2] ) && (box1[1][2] > box2[1][2] ))) ) + { + return(1); + } + + return(0); +} + + +/*----------------------------------------------------------------------------*/ +/* Compute a triangle aspect ration */ +/*----------------------------------------------------------------------------*/ + +static fpn GetTriAni(TriSct *tri) +{ + fpn srf, len, MaxLen; + + srf = GetTriSrf(tri); + MaxLen = len = DisPow(tri->ver[0]->crd, tri->ver[1]->crd); + len = DisPow(tri->ver[1]->crd, tri->ver[2]->crd); + MaxLen = MAX(len, MaxLen); + len = DisPow(tri->ver[2]->crd, tri->ver[0]->crd); + MaxLen = MAX(len, MaxLen); + + return(sqrt(MaxLen / srf)); +} + + +/*----------------------------------------------------------------------------*/ +/* Various basic operations on vectors */ +/*----------------------------------------------------------------------------*/ + +// Euclidian distance +static fpn dis(fpn a[3], fpn b[3]) +{ + itg i; + fpn siz = 0; + + for(i=0;i<3;i++) + siz += POW(b[i] - a[i]); + + return(sqrt(siz)); +} + +// Euclidian distance to the power of two +static fpn DisPow(fpn a[3], fpn b[3]) +{ + itg i; + fpn siz = 0; + + for(i=0;i<3;i++) + siz += POW(b[i] - a[i]); + + return(siz); +} + +// V = V - U +static void SubVec2(fpn u[3], fpn v[3]) +{ + itg i; + + for(i=0;i<3;i++) + v[i] -= u[i]; +} + +// W = U - V +static void SubVec3(fpn u[3], fpn v[3], fpn w[3]) +{ + itg i; + + for(i=0;i<3;i++) + w[i] = u[i] - v[i]; +} + +// Euclidian norm +static void NrmVec(fpn u[3]) +{ + itg i; + fpn dp = 0; + + for(i=0;i<3;i++) + dp += u[i] * u[i]; + + if(dp < DBL_MIN) + return; + + dp = 1. / sqrt(dp); + + for(i=0;i<3;i++) + u[i] *= dp; +} + +// Dot Product +static fpn DotPrd(fpn u[3], fpn v[3]) +{ + itg i; + fpn dp = 0; + + for(i=0;i<3;i++) + dp += u[i] * v[i]; + + return(dp); +} + +// Cross product +static void CrsPrd(fpn u[3], fpn v[3], fpn w[3]) +{ + w[0] = u[1] * v[2] - u[2] * v[1]; + w[1] = u[2] * v[0] - u[0] * v[2]; + w[2] = u[0] * v[1] - u[1] * v[0]; +} + +// Linear combinaison: W = a*U + b*V +static void LinCmbVec3(fpn w1, fpn v1[3], fpn w2, fpn v2[3], fpn v3[3]) +{ + itg i; + + for(i=0;i<3;i++) + v3[i] = w1 * v1[i] + w2 * v2[i]; +} + +// U = 0 +static void ClrVec(fpn u[3]) +{ + itg i; + + for(i=0;i<3;i++) + u[i] = 0.; +} + +// V = U +static void CpyVec(fpn u[3], fpn v[3]) +{ + itg i; + + for(i=0;i<3;i++) + v[i] = u[i]; +} + +// V = V + U +static void AddVec2(fpn u[3], fpn v[3]) +{ + itg i; + + for(i=0;i<3;i++) + v[i] += u[i]; +} + +// U = U + [s;s;s] +static void AddScaVec1(fpn s, fpn u[3]) +{ + itg i; + + for(i=0;i<3;i++) + u[i] += s; +} + +// V = U + [s;s;s] +static void AddScaVec2(fpn s, fpn u[3], fpn v[3]) +{ + itg i; + + for(i=0;i<3;i++) + v[i] = u[i] + s; +} + +// U = w*U +static void MulVec1(const fpn w, fpn u[3]) +{ + u[0] *= w; + u[1] *= w; + u[2] *= w; +} + +// V = w*U +static void MulVec2(fpn w, fpn u[3], fpn v[3]) +{ + itg i; + + for(i=0;i<3;i++) + v[i] = w * u[i]; +} + +// Return Euclidian norm +static fpn GetNrmVec(fpn u[3]) +{ + return(sqrt(POW(u[0]) + POW(u[1]) + POW(u[2]))); +} + + +/*----------------------------------------------------------------------------*/ +/* Allocate a chunk of memory and link it to memory allocator's list */ +/*----------------------------------------------------------------------------*/ + +static void *NewMem(TreSct *tre, size_t siz) +{ + MemSct *mem; + + mem = malloc(sizeof(MemSct)); + assert(mem); + mem->adr = malloc(siz); + assert(mem->adr); + mem->siz = siz; + mem->nex = tre->NexMem; + tre->NexMem = mem; + tre->MemUse += siz; + + return(mem->adr); +} + + +/*----------------------------------------------------------------------------*/ +/* Cylct through the linked list of allocated block and free them all */ +/*----------------------------------------------------------------------------*/ + +static void FreAllMem(TreSct *tre) +{ + MemSct *mem = tre->NexMem, *nex; + + while(mem) + { + tre->MemUse -= mem->siz; + nex = mem->nex; + free(mem->adr); + free(mem); + mem = nex; + } +} + + +/*----------------------------------------------------------------------------*/ +/* Fortran 77 API */ +/*----------------------------------------------------------------------------*/ + +int64_t call(lolnewoctree)(itg *NmbVer, fpn *VerTab1, fpn *VerTab2, + itg *NmbEdg, itg *EdgTab1, itg *EdgTab2, + itg *NmbTri, itg *TriTab1, itg *TriTab2, + itg *NmbQad, itg *QadTab1, itg *QadTab2, + itg *NmbTet, itg *TetTab1, itg *TetTab2, + itg *NmbPyr, itg *PyrTab1, itg *PyrTab2, + itg *NmbPri, itg *PriTab1, itg *PriTab2, + itg *NmbHex, itg *HexTab1, itg *HexTab2, + itg *BasIdx, itg *NmbThr) +{ + return(LolNewOctree( *NmbVer, VerTab1, VerTab2, *NmbEdg, EdgTab1, EdgTab2, + *NmbTri, TriTab1, TriTab2, *NmbQad, QadTab1, QadTab2, + *NmbTet, TetTab1, TetTab2, *NmbPyr, PyrTab1, PyrTab2, + *NmbPri, PriTab1, PriTab2, *NmbHex, HexTab1, HexTab2, + *BasIdx, *NmbThr )); +} + +int64_t call(lolfreeoctree)(int64_t *OctIdx) +{ + return(LolFreeOctree(*OctIdx)); +} + +itg call(lolgetboundingbox)( int64_t *OctIdx, itg *typ, itg *MaxItm, + itg *ItmTab, fpn *MinCrd, fpn *MaxCrd, itg *ThrIdx ) +{ + return(LolGetBoundingBox(*OctIdx, *typ, *MaxItm, ItmTab, MinCrd, MaxCrd, *ThrIdx)); +} + +itg call(lolgetnearest)(int64_t *OctIdx, itg *typ, fpn *MinCrd, fpn *MinDis, + fpn *MaxDis, void *UsrPrc, void *UsrDat, itg *ThrIdx) +{ + return(LolGetNearest(*OctIdx, *typ, MinCrd, MinDis, + *MaxDis, UsrPrc, UsrDat, *ThrIdx)); +} diff --git a/Common/libol1.h b/Common/libol1.h new file mode 100644 index 0000000000000000000000000000000000000000..1bcc2c9692ee1f77e56b71eeb25e48e404b1c74a --- /dev/null +++ b/Common/libol1.h @@ -0,0 +1,105 @@ +// All libOL code is Copyright 2012-2018 - by Loïc Maréchal / INRIA. +// This program is a free software. +// You can redistribute it and/or modify it under the terms of the MIT License +// as published by the Open Source Initiative. +// +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the MIT License for more details. +// +// You should have received a copy of the MIT License along with this program +// as the file LICENSE.txt; if not, please see: +// https://opensource.org/licenses/MIT +// +// +// MIT License +// +// Copyright (c) 2012-2018 Loïc Maréchal / INRIA +// +// 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. + +/*----------------------------------------------------------------------------*/ +/* */ +/* LIB OCTREE LOCALISATION V1.70 */ +/* */ +/*----------------------------------------------------------------------------*/ +/* */ +/* Description: Octree for mesh localization */ +/* Author: Loic MARECHAL */ +/* Creation date: mar 16 2012 */ +/* Last modification: feb 03 2021 */ +/* */ +/*----------------------------------------------------------------------------*/ + + +/*----------------------------------------------------------------------------*/ +/* Public defines : type of elements and 32/64 bits int and floating points */ +/*----------------------------------------------------------------------------*/ + +enum TypTag { LolTypVer=1, LolTypEdg, LolTypTri, LolTypQad, + LolTypTet, LolTypPyr, LolTypPri, LolTypHex, LolNmbTyp }; + + +/*----------------------------------------------------------------------------*/ +/* Set integer and floating point sizes: */ +/* default values are 32-bit integers and 64-bit floating points */ +/* define INT64 or REAL32 to override default settings */ +/*----------------------------------------------------------------------------*/ + +#ifdef INT64 +#define itg int64_t +#define utg uint64_t +#else +#define itg int32_t +#define utg uint32_t +#endif + +#ifdef REAL32 +#define fpn float +#else +#define fpn double +#endif + + +/*----------------------------------------------------------------------------*/ +/* Public procedures */ +/*----------------------------------------------------------------------------*/ + +int64_t LolNewOctree (itg, fpn *, fpn *, itg, itg *, itg *, + itg, itg *, itg *, itg, itg *, itg *, + itg, itg *, itg *, itg, itg *, itg *, + itg, itg *, itg *, itg, itg *, itg *, itg, itg); +size_t LolFreeOctree (int64_t); +itg LolGetBoundingBox (int64_t , itg , itg, itg *, fpn [3], fpn [3], itg); +itg LolGetNearest (int64_t, itg, fpn *, fpn *, fpn, itg (void *, itg), + void * , itg); +itg LolIntersectSurface(int64_t, fpn *, fpn *, fpn *, + fpn, itg (void *, itg), void *, itg ); +itg LolProjectVertex (int64_t, fpn *, itg, itg, fpn *, itg); + + +/*----------------------------------------------------------------------------*/ +/* Fortran 77 API */ +/*----------------------------------------------------------------------------*/ + +#if defined(F77_NO_UNDER_SCORE) +#define call(x) x +#else +#define call(x) x ## _ +#endif diff --git a/Common/robin_hood.h b/Common/robin_hood.h new file mode 100644 index 0000000000000000000000000000000000000000..573607f18d056adfba936f0ccee7c14df62e8a3d --- /dev/null +++ b/Common/robin_hood.h @@ -0,0 +1,2429 @@ +// ______ _____ ______ _________ +// ______________ ___ /_ ___(_)_______ ___ /_ ______ ______ ______ / +// __ ___/_ __ \__ __ \__ / __ __ \ __ __ \_ __ \_ __ \_ __ / +// _ / / /_/ /_ /_/ /_ / _ / / / _ / / // /_/ // /_/ // /_/ / +// /_/ \____/ /_.___/ /_/ /_/ /_/ ________/_/ /_/ \____/ \____/ \__,_/ +// _/_____/ +// +// Fast & memory efficient hashtable based on robin hood hashing for C++11/14/17/20 +// https://github.com/martinus/robin-hood-hashing +// +// Licensed under the MIT License <http://opensource.org/licenses/MIT>. +// SPDX-License-Identifier: MIT +// Copyright (c) 2018-2020 Martin Ankerl <http://martin.ankerl.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef ROBIN_HOOD_H_INCLUDED +#define ROBIN_HOOD_H_INCLUDED + +// see https://semver.org/ +#define ROBIN_HOOD_VERSION_MAJOR 3 // for incompatible API changes +#define ROBIN_HOOD_VERSION_MINOR 9 // for adding functionality in a backwards-compatible manner +#define ROBIN_HOOD_VERSION_PATCH 1 // for backwards-compatible bug fixes + +#include <algorithm> +#include <cstdlib> +#include <cstring> +#include <functional> +#include <memory> // only to support hash of smart pointers +#include <stdexcept> +#include <string> +#include <type_traits> +#include <utility> +#if __cplusplus >= 201703L +# include <string_view> +#endif + +// #define ROBIN_HOOD_LOG_ENABLED +#ifdef ROBIN_HOOD_LOG_ENABLED +# include <iostream> +# define ROBIN_HOOD_LOG(...) \ + std::cout << __FUNCTION__ << "@" << __LINE__ << ": " << __VA_ARGS__ << std::endl; +#else +# define ROBIN_HOOD_LOG(x) +#endif + +// #define ROBIN_HOOD_TRACE_ENABLED +#ifdef ROBIN_HOOD_TRACE_ENABLED +# include <iostream> +# define ROBIN_HOOD_TRACE(...) \ + std::cout << __FUNCTION__ << "@" << __LINE__ << ": " << __VA_ARGS__ << std::endl; +#else +# define ROBIN_HOOD_TRACE(x) +#endif + +// #define ROBIN_HOOD_COUNT_ENABLED +#ifdef ROBIN_HOOD_COUNT_ENABLED +# include <iostream> +# define ROBIN_HOOD_COUNT(x) ++counts().x; +namespace robin_hood { +struct Counts { + uint64_t shiftUp{}; + uint64_t shiftDown{}; +}; +inline std::ostream& operator<<(std::ostream& os, Counts const& c) { + return os << c.shiftUp << " shiftUp" << std::endl << c.shiftDown << " shiftDown" << std::endl; +} + +static Counts& counts() { + static Counts counts{}; + return counts; +} +} // namespace robin_hood +#else +# define ROBIN_HOOD_COUNT(x) +#endif + +// all non-argument macros should use this facility. See +// https://www.fluentcpp.com/2019/05/28/better-macros-better-flags/ +#define ROBIN_HOOD(x) ROBIN_HOOD_PRIVATE_DEFINITION_##x() + +// mark unused members with this macro +#define ROBIN_HOOD_UNUSED(identifier) + +// bitness +#if SIZE_MAX == UINT32_MAX +# define ROBIN_HOOD_PRIVATE_DEFINITION_BITNESS() 32 +#elif SIZE_MAX == UINT64_MAX +# define ROBIN_HOOD_PRIVATE_DEFINITION_BITNESS() 64 +#else +# error Unsupported bitness +#endif + +// endianess +#ifdef _MSC_VER +# define ROBIN_HOOD_PRIVATE_DEFINITION_LITTLE_ENDIAN() 1 +# define ROBIN_HOOD_PRIVATE_DEFINITION_BIG_ENDIAN() 0 +#else +# define ROBIN_HOOD_PRIVATE_DEFINITION_LITTLE_ENDIAN() \ + (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +# define ROBIN_HOOD_PRIVATE_DEFINITION_BIG_ENDIAN() (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#endif + +// inline +#ifdef _MSC_VER +# define ROBIN_HOOD_PRIVATE_DEFINITION_NOINLINE() __declspec(noinline) +#else +# define ROBIN_HOOD_PRIVATE_DEFINITION_NOINLINE() __attribute__((noinline)) +#endif + +// exceptions +#if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) +# define ROBIN_HOOD_PRIVATE_DEFINITION_HAS_EXCEPTIONS() 0 +#else +# define ROBIN_HOOD_PRIVATE_DEFINITION_HAS_EXCEPTIONS() 1 +#endif + +// count leading/trailing bits +#if !defined(ROBIN_HOOD_DISABLE_INTRINSICS) +# ifdef _MSC_VER +# if ROBIN_HOOD(BITNESS) == 32 +# define ROBIN_HOOD_PRIVATE_DEFINITION_BITSCANFORWARD() _BitScanForward +# else +# define ROBIN_HOOD_PRIVATE_DEFINITION_BITSCANFORWARD() _BitScanForward64 +# endif +# include <intrin.h> +# pragma intrinsic(ROBIN_HOOD(BITSCANFORWARD)) +# define ROBIN_HOOD_COUNT_TRAILING_ZEROES(x) \ + [](size_t mask) noexcept -> int { \ + unsigned long index; \ + return ROBIN_HOOD(BITSCANFORWARD)(&index, mask) ? static_cast<int>(index) \ + : ROBIN_HOOD(BITNESS); \ + }(x) +# else +# if ROBIN_HOOD(BITNESS) == 32 +# define ROBIN_HOOD_PRIVATE_DEFINITION_CTZ() __builtin_ctzl +# define ROBIN_HOOD_PRIVATE_DEFINITION_CLZ() __builtin_clzl +# else +# define ROBIN_HOOD_PRIVATE_DEFINITION_CTZ() __builtin_ctzll +# define ROBIN_HOOD_PRIVATE_DEFINITION_CLZ() __builtin_clzll +# endif +# define ROBIN_HOOD_COUNT_LEADING_ZEROES(x) ((x) ? ROBIN_HOOD(CLZ)(x) : ROBIN_HOOD(BITNESS)) +# define ROBIN_HOOD_COUNT_TRAILING_ZEROES(x) ((x) ? ROBIN_HOOD(CTZ)(x) : ROBIN_HOOD(BITNESS)) +# endif +#endif + +// fallthrough +#ifndef __has_cpp_attribute // For backwards compatibility +# define __has_cpp_attribute(x) 0 +#endif +#if __has_cpp_attribute(clang::fallthrough) +# define ROBIN_HOOD_PRIVATE_DEFINITION_FALLTHROUGH() [[clang::fallthrough]] +#elif __has_cpp_attribute(gnu::fallthrough) +# define ROBIN_HOOD_PRIVATE_DEFINITION_FALLTHROUGH() [[gnu::fallthrough]] +#else +# define ROBIN_HOOD_PRIVATE_DEFINITION_FALLTHROUGH() +#endif + +// likely/unlikely +#ifdef _MSC_VER +# define ROBIN_HOOD_LIKELY(condition) condition +# define ROBIN_HOOD_UNLIKELY(condition) condition +#else +# define ROBIN_HOOD_LIKELY(condition) __builtin_expect(condition, 1) +# define ROBIN_HOOD_UNLIKELY(condition) __builtin_expect(condition, 0) +#endif + +// detect if native wchar_t type is availiable in MSVC +#ifdef _MSC_VER +# ifdef _NATIVE_WCHAR_T_DEFINED +# define ROBIN_HOOD_PRIVATE_DEFINITION_HAS_NATIVE_WCHART() 1 +# else +# define ROBIN_HOOD_PRIVATE_DEFINITION_HAS_NATIVE_WCHART() 0 +# endif +#else +# define ROBIN_HOOD_PRIVATE_DEFINITION_HAS_NATIVE_WCHART() 1 +#endif + +// workaround missing "is_trivially_copyable" in g++ < 5.0 +// See https://stackoverflow.com/a/31798726/48181 +#if defined(__GNUC__) && __GNUC__ < 5 +# define ROBIN_HOOD_IS_TRIVIALLY_COPYABLE(...) __has_trivial_copy(__VA_ARGS__) +#else +# define ROBIN_HOOD_IS_TRIVIALLY_COPYABLE(...) std::is_trivially_copyable<__VA_ARGS__>::value +#endif + +// helpers for C++ versions, see https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html +#define ROBIN_HOOD_PRIVATE_DEFINITION_CXX() __cplusplus +#define ROBIN_HOOD_PRIVATE_DEFINITION_CXX98() 199711L +#define ROBIN_HOOD_PRIVATE_DEFINITION_CXX11() 201103L +#define ROBIN_HOOD_PRIVATE_DEFINITION_CXX14() 201402L +#define ROBIN_HOOD_PRIVATE_DEFINITION_CXX17() 201703L + +#if ROBIN_HOOD(CXX) >= ROBIN_HOOD(CXX17) +# define ROBIN_HOOD_PRIVATE_DEFINITION_NODISCARD() [[nodiscard]] +#else +# define ROBIN_HOOD_PRIVATE_DEFINITION_NODISCARD() +#endif + +namespace robin_hood { + +#if ROBIN_HOOD(CXX) >= ROBIN_HOOD(CXX14) +# define ROBIN_HOOD_STD std +#else + +// c++11 compatibility layer +namespace ROBIN_HOOD_STD { +template <class T> +struct alignment_of + : std::integral_constant<std::size_t, alignof(typename std::remove_all_extents<T>::type)> {}; + +template <class T, T... Ints> +class integer_sequence { +public: + using value_type = T; + static_assert(std::is_integral<value_type>::value, "not integral type"); + static constexpr std::size_t size() noexcept { + return sizeof...(Ints); + } +}; +template <std::size_t... Inds> +using index_sequence = integer_sequence<std::size_t, Inds...>; + +namespace detail_ { +template <class T, T Begin, T End, bool> +struct IntSeqImpl { + using TValue = T; + static_assert(std::is_integral<TValue>::value, "not integral type"); + static_assert(Begin >= 0 && Begin < End, "unexpected argument (Begin<0 || Begin<=End)"); + + template <class, class> + struct IntSeqCombiner; + + template <TValue... Inds0, TValue... Inds1> + struct IntSeqCombiner<integer_sequence<TValue, Inds0...>, integer_sequence<TValue, Inds1...>> { + using TResult = integer_sequence<TValue, Inds0..., Inds1...>; + }; + + using TResult = + typename IntSeqCombiner<typename IntSeqImpl<TValue, Begin, Begin + (End - Begin) / 2, + (End - Begin) / 2 == 1>::TResult, + typename IntSeqImpl<TValue, Begin + (End - Begin) / 2, End, + (End - Begin + 1) / 2 == 1>::TResult>::TResult; +}; + +template <class T, T Begin> +struct IntSeqImpl<T, Begin, Begin, false> { + using TValue = T; + static_assert(std::is_integral<TValue>::value, "not integral type"); + static_assert(Begin >= 0, "unexpected argument (Begin<0)"); + using TResult = integer_sequence<TValue>; +}; + +template <class T, T Begin, T End> +struct IntSeqImpl<T, Begin, End, true> { + using TValue = T; + static_assert(std::is_integral<TValue>::value, "not integral type"); + static_assert(Begin >= 0, "unexpected argument (Begin<0)"); + using TResult = integer_sequence<TValue, Begin>; +}; +} // namespace detail_ + +template <class T, T N> +using make_integer_sequence = typename detail_::IntSeqImpl<T, 0, N, (N - 0) == 1>::TResult; + +template <std::size_t N> +using make_index_sequence = make_integer_sequence<std::size_t, N>; + +template <class... T> +using index_sequence_for = make_index_sequence<sizeof...(T)>; + +} // namespace ROBIN_HOOD_STD + +#endif + +namespace detail { + +// make sure we static_cast to the correct type for hash_int +#if ROBIN_HOOD(BITNESS) == 64 +using SizeT = uint64_t; +#else +using SizeT = uint32_t; +#endif + +template <typename T> +T rotr(T x, unsigned k) { + return (x >> k) | (x << (8U * sizeof(T) - k)); +} + +// This cast gets rid of warnings like "cast from 'uint8_t*' {aka 'unsigned char*'} to +// 'uint64_t*' {aka 'long unsigned int*'} increases required alignment of target type". Use with +// care! +template <typename T> +inline T reinterpret_cast_no_cast_align_warning(void* ptr) noexcept { + return reinterpret_cast<T>(ptr); +} + +template <typename T> +inline T reinterpret_cast_no_cast_align_warning(void const* ptr) noexcept { + return reinterpret_cast<T>(ptr); +} + +// make sure this is not inlined as it is slow and dramatically enlarges code, thus making other +// inlinings more difficult. Throws are also generally the slow path. +template <typename E, typename... Args> +[[noreturn]] ROBIN_HOOD(NOINLINE) +#if ROBIN_HOOD(HAS_EXCEPTIONS) + void doThrow(Args&&... args) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-array-to-pointer-decay) + throw E(std::forward<Args>(args)...); +} +#else + void doThrow(Args&&... ROBIN_HOOD_UNUSED(args) /*unused*/) { + abort(); +} +#endif + +template <typename E, typename T, typename... Args> +T* assertNotNull(T* t, Args&&... args) { + if (ROBIN_HOOD_UNLIKELY(nullptr == t)) { + doThrow<E>(std::forward<Args>(args)...); + } + return t; +} + +template <typename T> +inline T unaligned_load(void const* ptr) noexcept { + // using memcpy so we don't get into unaligned load problems. + // compiler should optimize this very well anyways. + T t; + std::memcpy(&t, ptr, sizeof(T)); + return t; +} + +// Allocates bulks of memory for objects of type T. This deallocates the memory in the destructor, +// and keeps a linked list of the allocated memory around. Overhead per allocation is the size of a +// pointer. +template <typename T, size_t MinNumAllocs = 4, size_t MaxNumAllocs = 256> +class BulkPoolAllocator { +public: + BulkPoolAllocator() noexcept = default; + + // does not copy anything, just creates a new allocator. + BulkPoolAllocator(const BulkPoolAllocator& ROBIN_HOOD_UNUSED(o) /*unused*/) noexcept + : mHead(nullptr) + , mListForFree(nullptr) {} + + BulkPoolAllocator(BulkPoolAllocator&& o) noexcept + : mHead(o.mHead) + , mListForFree(o.mListForFree) { + o.mListForFree = nullptr; + o.mHead = nullptr; + } + + BulkPoolAllocator& operator=(BulkPoolAllocator&& o) noexcept { + reset(); + mHead = o.mHead; + mListForFree = o.mListForFree; + o.mListForFree = nullptr; + o.mHead = nullptr; + return *this; + } + + BulkPoolAllocator& + // NOLINTNEXTLINE(bugprone-unhandled-self-assignment,cert-oop54-cpp) + operator=(const BulkPoolAllocator& ROBIN_HOOD_UNUSED(o) /*unused*/) noexcept { + // does not do anything + return *this; + } + + ~BulkPoolAllocator() noexcept { + reset(); + } + + // Deallocates all allocated memory. + void reset() noexcept { + while (mListForFree) { + T* tmp = *mListForFree; + ROBIN_HOOD_LOG("std::free") + std::free(mListForFree); + mListForFree = reinterpret_cast_no_cast_align_warning<T**>(tmp); + } + mHead = nullptr; + } + + // allocates, but does NOT initialize. Use in-place new constructor, e.g. + // T* obj = pool.allocate(); + // ::new (static_cast<void*>(obj)) T(); + T* allocate() { + T* tmp = mHead; + if (!tmp) { + tmp = performAllocation(); + } + + mHead = *reinterpret_cast_no_cast_align_warning<T**>(tmp); + return tmp; + } + + // does not actually deallocate but puts it in store. + // make sure you have already called the destructor! e.g. with + // obj->~T(); + // pool.deallocate(obj); + void deallocate(T* obj) noexcept { + *reinterpret_cast_no_cast_align_warning<T**>(obj) = mHead; + mHead = obj; + } + + // Adds an already allocated block of memory to the allocator. This allocator is from now on + // responsible for freeing the data (with free()). If the provided data is not large enough to + // make use of, it is immediately freed. Otherwise it is reused and freed in the destructor. + void addOrFree(void* ptr, const size_t numBytes) noexcept { + // calculate number of available elements in ptr + if (numBytes < ALIGNMENT + ALIGNED_SIZE) { + // not enough data for at least one element. Free and return. + ROBIN_HOOD_LOG("std::free") + std::free(ptr); + } else { + ROBIN_HOOD_LOG("add to buffer") + add(ptr, numBytes); + } + } + + void swap(BulkPoolAllocator<T, MinNumAllocs, MaxNumAllocs>& other) noexcept { + using std::swap; + swap(mHead, other.mHead); + swap(mListForFree, other.mListForFree); + } + +private: + // iterates the list of allocated memory to calculate how many to alloc next. + // Recalculating this each time saves us a size_t member. + // This ignores the fact that memory blocks might have been added manually with addOrFree. In + // practice, this should not matter much. + ROBIN_HOOD(NODISCARD) size_t calcNumElementsToAlloc() const noexcept { + auto tmp = mListForFree; + size_t numAllocs = MinNumAllocs; + + while (numAllocs * 2 <= MaxNumAllocs && tmp) { + auto x = reinterpret_cast<T***>(tmp); + tmp = *x; + numAllocs *= 2; + } + + return numAllocs; + } + + // WARNING: Underflow if numBytes < ALIGNMENT! This is guarded in addOrFree(). + void add(void* ptr, const size_t numBytes) noexcept { + const size_t numElements = (numBytes - ALIGNMENT) / ALIGNED_SIZE; + + auto data = reinterpret_cast<T**>(ptr); + + // link free list + auto x = reinterpret_cast<T***>(data); + *x = mListForFree; + mListForFree = data; + + // create linked list for newly allocated data + auto* const headT = + reinterpret_cast_no_cast_align_warning<T*>(reinterpret_cast<char*>(ptr) + ALIGNMENT); + + auto* const head = reinterpret_cast<char*>(headT); + + // Visual Studio compiler automatically unrolls this loop, which is pretty cool + for (size_t i = 0; i < numElements; ++i) { + *reinterpret_cast_no_cast_align_warning<char**>(head + i * ALIGNED_SIZE) = + head + (i + 1) * ALIGNED_SIZE; + } + + // last one points to 0 + *reinterpret_cast_no_cast_align_warning<T**>(head + (numElements - 1) * ALIGNED_SIZE) = + mHead; + mHead = headT; + } + + // Called when no memory is available (mHead == 0). + // Don't inline this slow path. + ROBIN_HOOD(NOINLINE) T* performAllocation() { + size_t const numElementsToAlloc = calcNumElementsToAlloc(); + + // alloc new memory: [prev |T, T, ... T] + size_t const bytes = ALIGNMENT + ALIGNED_SIZE * numElementsToAlloc; + ROBIN_HOOD_LOG("std::malloc " << bytes << " = " << ALIGNMENT << " + " << ALIGNED_SIZE + << " * " << numElementsToAlloc) + add(assertNotNull<std::bad_alloc>(std::malloc(bytes)), bytes); + return mHead; + } + + // enforce byte alignment of the T's +#if ROBIN_HOOD(CXX) >= ROBIN_HOOD(CXX14) + static constexpr size_t ALIGNMENT = + (std::max)(std::alignment_of<T>::value, std::alignment_of<T*>::value); +#else + static const size_t ALIGNMENT = + (ROBIN_HOOD_STD::alignment_of<T>::value > ROBIN_HOOD_STD::alignment_of<T*>::value) + ? ROBIN_HOOD_STD::alignment_of<T>::value + : +ROBIN_HOOD_STD::alignment_of<T*>::value; // the + is for walkarround +#endif + + static constexpr size_t ALIGNED_SIZE = ((sizeof(T) - 1) / ALIGNMENT + 1) * ALIGNMENT; + + static_assert(MinNumAllocs >= 1, "MinNumAllocs"); + static_assert(MaxNumAllocs >= MinNumAllocs, "MaxNumAllocs"); + static_assert(ALIGNED_SIZE >= sizeof(T*), "ALIGNED_SIZE"); + static_assert(0 == (ALIGNED_SIZE % sizeof(T*)), "ALIGNED_SIZE mod"); + static_assert(ALIGNMENT >= sizeof(T*), "ALIGNMENT"); + + T* mHead{nullptr}; + T** mListForFree{nullptr}; +}; + +template <typename T, size_t MinSize, size_t MaxSize, bool IsFlat> +struct NodeAllocator; + +// dummy allocator that does nothing +template <typename T, size_t MinSize, size_t MaxSize> +struct NodeAllocator<T, MinSize, MaxSize, true> { + + // we are not using the data, so just free it. + void addOrFree(void* ptr, size_t ROBIN_HOOD_UNUSED(numBytes) /*unused*/) noexcept { + ROBIN_HOOD_LOG("std::free") + std::free(ptr); + } +}; + +template <typename T, size_t MinSize, size_t MaxSize> +struct NodeAllocator<T, MinSize, MaxSize, false> : public BulkPoolAllocator<T, MinSize, MaxSize> {}; + +// dummy hash, unsed as mixer when robin_hood::hash is already used +template <typename T> +struct identity_hash { + constexpr size_t operator()(T const& obj) const noexcept { + return static_cast<size_t>(obj); + } +}; + +// c++14 doesn't have is_nothrow_swappable, and clang++ 6.0.1 doesn't like it either, so I'm making +// my own here. +namespace swappable { +#if ROBIN_HOOD(CXX) < ROBIN_HOOD(CXX17) +using std::swap; +template <typename T> +struct nothrow { + static const bool value = noexcept(swap(std::declval<T&>(), std::declval<T&>())); +}; +#else +template <typename T> +struct nothrow { + static const bool value = std::is_nothrow_swappable<T>::value; +}; +#endif +} // namespace swappable + +} // namespace detail + +struct is_transparent_tag {}; + +// A custom pair implementation is used in the map because std::pair is not is_trivially_copyable, +// which means it would not be allowed to be used in std::memcpy. This struct is copyable, which is +// also tested. +template <typename T1, typename T2> +struct pair { + using first_type = T1; + using second_type = T2; + + template <typename U1 = T1, typename U2 = T2, + typename = typename std::enable_if<std::is_default_constructible<U1>::value && + std::is_default_constructible<U2>::value>::type> + constexpr pair() noexcept(noexcept(U1()) && noexcept(U2())) + : first() + , second() {} + + // pair constructors are explicit so we don't accidentally call this ctor when we don't have to. + explicit constexpr pair(std::pair<T1, T2> const& o) noexcept( + noexcept(T1(std::declval<T1 const&>())) && noexcept(T2(std::declval<T2 const&>()))) + : first(o.first) + , second(o.second) {} + + // pair constructors are explicit so we don't accidentally call this ctor when we don't have to. + explicit constexpr pair(std::pair<T1, T2>&& o) noexcept(noexcept( + T1(std::move(std::declval<T1&&>()))) && noexcept(T2(std::move(std::declval<T2&&>())))) + : first(std::move(o.first)) + , second(std::move(o.second)) {} + + constexpr pair(T1&& a, T2&& b) noexcept(noexcept( + T1(std::move(std::declval<T1&&>()))) && noexcept(T2(std::move(std::declval<T2&&>())))) + : first(std::move(a)) + , second(std::move(b)) {} + + template <typename U1, typename U2> + constexpr pair(U1&& a, U2&& b) noexcept(noexcept(T1(std::forward<U1>( + std::declval<U1&&>()))) && noexcept(T2(std::forward<U2>(std::declval<U2&&>())))) + : first(std::forward<U1>(a)) + , second(std::forward<U2>(b)) {} + + template <typename... U1, typename... U2> + constexpr pair( + std::piecewise_construct_t /*unused*/, std::tuple<U1...> a, + std::tuple<U2...> b) noexcept(noexcept(pair(std::declval<std::tuple<U1...>&>(), + std::declval<std::tuple<U2...>&>(), + ROBIN_HOOD_STD::index_sequence_for<U1...>(), + ROBIN_HOOD_STD::index_sequence_for<U2...>()))) + : pair(a, b, ROBIN_HOOD_STD::index_sequence_for<U1...>(), + ROBIN_HOOD_STD::index_sequence_for<U2...>()) {} + + // constructor called from the std::piecewise_construct_t ctor + template <typename... U1, size_t... I1, typename... U2, size_t... I2> + pair(std::tuple<U1...>& a, std::tuple<U2...>& b, ROBIN_HOOD_STD::index_sequence<I1...> /*unused*/, ROBIN_HOOD_STD::index_sequence<I2...> /*unused*/) noexcept( + noexcept(T1(std::forward<U1>(std::get<I1>( + std::declval<std::tuple< + U1...>&>()))...)) && noexcept(T2(std:: + forward<U2>(std::get<I2>( + std::declval<std::tuple<U2...>&>()))...))) + : first(std::forward<U1>(std::get<I1>(a))...) + , second(std::forward<U2>(std::get<I2>(b))...) { + // make visual studio compiler happy about warning about unused a & b. + // Visual studio's pair implementation disables warning 4100. + (void)a; + (void)b; + } + + void swap(pair<T1, T2>& o) noexcept((detail::swappable::nothrow<T1>::value) && + (detail::swappable::nothrow<T2>::value)) { + using std::swap; + swap(first, o.first); + swap(second, o.second); + } + + T1 first; // NOLINT(misc-non-private-member-variables-in-classes) + T2 second; // NOLINT(misc-non-private-member-variables-in-classes) +}; + +template <typename A, typename B> +inline void swap(pair<A, B>& a, pair<A, B>& b) noexcept( + noexcept(std::declval<pair<A, B>&>().swap(std::declval<pair<A, B>&>()))) { + a.swap(b); +} + +template <typename A, typename B> +inline constexpr bool operator==(pair<A, B> const& x, pair<A, B> const& y) { + return (x.first == y.first) && (x.second == y.second); +} +template <typename A, typename B> +inline constexpr bool operator!=(pair<A, B> const& x, pair<A, B> const& y) { + return !(x == y); +} +template <typename A, typename B> +inline constexpr bool operator<(pair<A, B> const& x, pair<A, B> const& y) noexcept(noexcept( + std::declval<A const&>() < std::declval<A const&>()) && noexcept(std::declval<B const&>() < + std::declval<B const&>())) { + return x.first < y.first || (!(y.first < x.first) && x.second < y.second); +} +template <typename A, typename B> +inline constexpr bool operator>(pair<A, B> const& x, pair<A, B> const& y) { + return y < x; +} +template <typename A, typename B> +inline constexpr bool operator<=(pair<A, B> const& x, pair<A, B> const& y) { + return !(x > y); +} +template <typename A, typename B> +inline constexpr bool operator>=(pair<A, B> const& x, pair<A, B> const& y) { + return !(x < y); +} + +inline size_t hash_bytes(void const* ptr, size_t len) noexcept { + static constexpr uint64_t m = UINT64_C(0xc6a4a7935bd1e995); + static constexpr uint64_t seed = UINT64_C(0xe17a1465); + static constexpr unsigned int r = 47; + + auto const* const data64 = static_cast<uint64_t const*>(ptr); + uint64_t h = seed ^ (len * m); + + size_t const n_blocks = len / 8; + for (size_t i = 0; i < n_blocks; ++i) { + auto k = detail::unaligned_load<uint64_t>(data64 + i); + + k *= m; + k ^= k >> r; + k *= m; + + h ^= k; + h *= m; + } + + auto const* const data8 = reinterpret_cast<uint8_t const*>(data64 + n_blocks); + switch (len & 7U) { + case 7: + h ^= static_cast<uint64_t>(data8[6]) << 48U; + ROBIN_HOOD(FALLTHROUGH); // FALLTHROUGH + case 6: + h ^= static_cast<uint64_t>(data8[5]) << 40U; + ROBIN_HOOD(FALLTHROUGH); // FALLTHROUGH + case 5: + h ^= static_cast<uint64_t>(data8[4]) << 32U; + ROBIN_HOOD(FALLTHROUGH); // FALLTHROUGH + case 4: + h ^= static_cast<uint64_t>(data8[3]) << 24U; + ROBIN_HOOD(FALLTHROUGH); // FALLTHROUGH + case 3: + h ^= static_cast<uint64_t>(data8[2]) << 16U; + ROBIN_HOOD(FALLTHROUGH); // FALLTHROUGH + case 2: + h ^= static_cast<uint64_t>(data8[1]) << 8U; + ROBIN_HOOD(FALLTHROUGH); // FALLTHROUGH + case 1: + h ^= static_cast<uint64_t>(data8[0]); + h *= m; + ROBIN_HOOD(FALLTHROUGH); // FALLTHROUGH + default: + break; + } + + h ^= h >> r; + h *= m; + h ^= h >> r; + return static_cast<size_t>(h); +} + +inline size_t hash_int(uint64_t x) noexcept { + // inspired by lemire's strongly universal hashing + // https://lemire.me/blog/2018/08/15/fast-strongly-universal-64-bit-hashing-everywhere/ + // + // Instead of shifts, we use rotations so we don't lose any bits. + // + // Added a final multiplcation with a constant for more mixing. It is most important that + // the lower bits are well mixed. + auto h1 = x * UINT64_C(0xA24BAED4963EE407); + auto h2 = detail::rotr(x, 32U) * UINT64_C(0x9FB21C651E98DF25); + auto h = detail::rotr(h1 + h2, 32U); + return static_cast<size_t>(h); +} + +// A thin wrapper around std::hash, performing an additional simple mixing step of the result. +template <typename T, typename Enable = void> +struct hash : public std::hash<T> { + size_t operator()(T const& obj) const + noexcept(noexcept(std::declval<std::hash<T>>().operator()(std::declval<T const&>()))) { + // call base hash + auto result = std::hash<T>::operator()(obj); + // return mixed of that, to be save against identity has + return hash_int(static_cast<detail::SizeT>(result)); + } +}; + +template <typename CharT> +struct hash<std::basic_string<CharT>> { + size_t operator()(std::basic_string<CharT> const& str) const noexcept { + return hash_bytes(str.data(), sizeof(CharT) * str.size()); + } +}; + +#if ROBIN_HOOD(CXX) >= ROBIN_HOOD(CXX17) +template <typename CharT> +struct hash<std::basic_string_view<CharT>> { + size_t operator()(std::basic_string_view<CharT> const& sv) const noexcept { + return hash_bytes(sv.data(), sizeof(CharT) * sv.size()); + } +}; +#endif + +template <class T> +struct hash<T*> { + size_t operator()(T* ptr) const noexcept { + return hash_int(reinterpret_cast<detail::SizeT>(ptr)); + } +}; + +template <class T> +struct hash<std::unique_ptr<T>> { + size_t operator()(std::unique_ptr<T> const& ptr) const noexcept { + return hash_int(reinterpret_cast<detail::SizeT>(ptr.get())); + } +}; + +template <class T> +struct hash<std::shared_ptr<T>> { + size_t operator()(std::shared_ptr<T> const& ptr) const noexcept { + return hash_int(reinterpret_cast<detail::SizeT>(ptr.get())); + } +}; + +template <typename Enum> +struct hash<Enum, typename std::enable_if<std::is_enum<Enum>::value>::type> { + size_t operator()(Enum e) const noexcept { + using Underlying = typename std::underlying_type<Enum>::type; + return hash<Underlying>{}(static_cast<Underlying>(e)); + } +}; + +#define ROBIN_HOOD_HASH_INT(T) \ + template <> \ + struct hash<T> { \ + size_t operator()(T const& obj) const noexcept { \ + return hash_int(static_cast<uint64_t>(obj)); \ + } \ + } + +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wuseless-cast" +#endif +// see https://en.cppreference.com/w/cpp/utility/hash +ROBIN_HOOD_HASH_INT(bool); +ROBIN_HOOD_HASH_INT(char); +ROBIN_HOOD_HASH_INT(signed char); +ROBIN_HOOD_HASH_INT(unsigned char); +ROBIN_HOOD_HASH_INT(char16_t); +ROBIN_HOOD_HASH_INT(char32_t); +#if ROBIN_HOOD(HAS_NATIVE_WCHART) +ROBIN_HOOD_HASH_INT(wchar_t); +#endif +ROBIN_HOOD_HASH_INT(short); +ROBIN_HOOD_HASH_INT(unsigned short); +ROBIN_HOOD_HASH_INT(int); +ROBIN_HOOD_HASH_INT(unsigned int); +ROBIN_HOOD_HASH_INT(long); +ROBIN_HOOD_HASH_INT(long long); +ROBIN_HOOD_HASH_INT(unsigned long); +ROBIN_HOOD_HASH_INT(unsigned long long); +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic pop +#endif +namespace detail { + +template <typename T> +struct void_type { + using type = void; +}; + +template <typename T, typename = void> +struct has_is_transparent : public std::false_type {}; + +template <typename T> +struct has_is_transparent<T, typename void_type<typename T::is_transparent>::type> + : public std::true_type {}; + +// using wrapper classes for hash and key_equal prevents the diamond problem when the same type +// is used. see https://stackoverflow.com/a/28771920/48181 +template <typename T> +struct WrapHash : public T { + WrapHash() = default; + explicit WrapHash(T const& o) noexcept(noexcept(T(std::declval<T const&>()))) + : T(o) {} +}; + +template <typename T> +struct WrapKeyEqual : public T { + WrapKeyEqual() = default; + explicit WrapKeyEqual(T const& o) noexcept(noexcept(T(std::declval<T const&>()))) + : T(o) {} +}; + +// A highly optimized hashmap implementation, using the Robin Hood algorithm. +// +// In most cases, this map should be usable as a drop-in replacement for std::unordered_map, but +// be about 2x faster in most cases and require much less allocations. +// +// This implementation uses the following memory layout: +// +// [Node, Node, ... Node | info, info, ... infoSentinel ] +// +// * Node: either a DataNode that directly has the std::pair<key, val> as member, +// or a DataNode with a pointer to std::pair<key,val>. Which DataNode representation to use +// depends on how fast the swap() operation is. Heuristically, this is automatically choosen +// based on sizeof(). there are always 2^n Nodes. +// +// * info: Each Node in the map has a corresponding info byte, so there are 2^n info bytes. +// Each byte is initialized to 0, meaning the corresponding Node is empty. Set to 1 means the +// corresponding node contains data. Set to 2 means the corresponding Node is filled, but it +// actually belongs to the previous position and was pushed out because that place is already +// taken. +// +// * infoSentinel: Sentinel byte set to 1, so that iterator's ++ can stop at end() without the +// need for a idx variable. +// +// According to STL, order of templates has effect on throughput. That's why I've moved the +// boolean to the front. +// https://www.reddit.com/r/cpp/comments/ahp6iu/compile_time_binary_size_reductions_and_cs_future/eeguck4/ +template <bool IsFlat, size_t MaxLoadFactor100, typename Key, typename T, typename Hash, + typename KeyEqual> +class Table + : public WrapHash<Hash>, + public WrapKeyEqual<KeyEqual>, + detail::NodeAllocator< + typename std::conditional< + std::is_void<T>::value, Key, + robin_hood::pair<typename std::conditional<IsFlat, Key, Key const>::type, T>>::type, + 4, 16384, IsFlat> { +public: + static constexpr bool is_flat = IsFlat; + static constexpr bool is_map = !std::is_void<T>::value; + static constexpr bool is_set = !is_map; + static constexpr bool is_transparent = + has_is_transparent<Hash>::value && has_is_transparent<KeyEqual>::value; + + using key_type = Key; + using mapped_type = T; + using value_type = typename std::conditional< + is_set, Key, + robin_hood::pair<typename std::conditional<is_flat, Key, Key const>::type, T>>::type; + using size_type = size_t; + using hasher = Hash; + using key_equal = KeyEqual; + using Self = Table<IsFlat, MaxLoadFactor100, key_type, mapped_type, hasher, key_equal>; + +private: + static_assert(MaxLoadFactor100 > 10 && MaxLoadFactor100 < 100, + "MaxLoadFactor100 needs to be >10 && < 100"); + + using WHash = WrapHash<Hash>; + using WKeyEqual = WrapKeyEqual<KeyEqual>; + + // configuration defaults + + // make sure we have 8 elements, needed to quickly rehash mInfo + static constexpr size_t InitialNumElements = sizeof(uint64_t); + static constexpr uint32_t InitialInfoNumBits = 5; + static constexpr uint8_t InitialInfoInc = 1U << InitialInfoNumBits; + static constexpr size_t InfoMask = InitialInfoInc - 1U; + static constexpr uint8_t InitialInfoHashShift = 0; + using DataPool = detail::NodeAllocator<value_type, 4, 16384, IsFlat>; + + // type needs to be wider than uint8_t. + using InfoType = uint32_t; + + // DataNode //////////////////////////////////////////////////////// + + // Primary template for the data node. We have special implementations for small and big + // objects. For large objects it is assumed that swap() is fairly slow, so we allocate these + // on the heap so swap merely swaps a pointer. + template <typename M, bool> + class DataNode {}; + + // Small: just allocate on the stack. + template <typename M> + class DataNode<M, true> final { + public: + template <typename... Args> + explicit DataNode(M& ROBIN_HOOD_UNUSED(map) /*unused*/, Args&&... args) noexcept( + noexcept(value_type(std::forward<Args>(args)...))) + : mData(std::forward<Args>(args)...) {} + + DataNode(M& ROBIN_HOOD_UNUSED(map) /*unused*/, DataNode<M, true>&& n) noexcept( + std::is_nothrow_move_constructible<value_type>::value) + : mData(std::move(n.mData)) {} + + // doesn't do anything + void destroy(M& ROBIN_HOOD_UNUSED(map) /*unused*/) noexcept {} + void destroyDoNotDeallocate() noexcept {} + + value_type const* operator->() const noexcept { + return &mData; + } + value_type* operator->() noexcept { + return &mData; + } + + const value_type& operator*() const noexcept { + return mData; + } + + value_type& operator*() noexcept { + return mData; + } + + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_map, typename VT::first_type&>::type getFirst() noexcept { + return mData.first; + } + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_set, VT&>::type getFirst() noexcept { + return mData; + } + + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_map, typename VT::first_type const&>::type + getFirst() const noexcept { + return mData.first; + } + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_set, VT const&>::type getFirst() const noexcept { + return mData; + } + + template <typename MT = mapped_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_map, MT&>::type getSecond() noexcept { + return mData.second; + } + + template <typename MT = mapped_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_set, MT const&>::type getSecond() const noexcept { + return mData.second; + } + + void swap(DataNode<M, true>& o) noexcept( + noexcept(std::declval<value_type>().swap(std::declval<value_type>()))) { + mData.swap(o.mData); + } + + private: + value_type mData; + }; + + // big object: allocate on heap. + template <typename M> + class DataNode<M, false> { + public: + template <typename... Args> + explicit DataNode(M& map, Args&&... args) + : mData(map.allocate()) { + ::new (static_cast<void*>(mData)) value_type(std::forward<Args>(args)...); + } + + DataNode(M& ROBIN_HOOD_UNUSED(map) /*unused*/, DataNode<M, false>&& n) noexcept + : mData(std::move(n.mData)) {} + + void destroy(M& map) noexcept { + // don't deallocate, just put it into list of datapool. + mData->~value_type(); + map.deallocate(mData); + } + + void destroyDoNotDeallocate() noexcept { + mData->~value_type(); + } + + value_type const* operator->() const noexcept { + return mData; + } + + value_type* operator->() noexcept { + return mData; + } + + const value_type& operator*() const { + return *mData; + } + + value_type& operator*() { + return *mData; + } + + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_map, typename VT::first_type&>::type getFirst() noexcept { + return mData->first; + } + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_set, VT&>::type getFirst() noexcept { + return *mData; + } + + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_map, typename VT::first_type const&>::type + getFirst() const noexcept { + return mData->first; + } + template <typename VT = value_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_set, VT const&>::type getFirst() const noexcept { + return *mData; + } + + template <typename MT = mapped_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_map, MT&>::type getSecond() noexcept { + return mData->second; + } + + template <typename MT = mapped_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<is_map, MT const&>::type getSecond() const noexcept { + return mData->second; + } + + void swap(DataNode<M, false>& o) noexcept { + using std::swap; + swap(mData, o.mData); + } + + private: + value_type* mData; + }; + + using Node = DataNode<Self, IsFlat>; + + // helpers for doInsert: extract first entry (only const required) + ROBIN_HOOD(NODISCARD) key_type const& getFirstConst(Node const& n) const noexcept { + return n.getFirst(); + } + + // in case we have void mapped_type, we are not using a pair, thus we just route k through. + // No need to disable this because it's just not used if not applicable. + ROBIN_HOOD(NODISCARD) key_type const& getFirstConst(key_type const& k) const noexcept { + return k; + } + + // in case we have non-void mapped_type, we have a standard robin_hood::pair + template <typename Q = mapped_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<!std::is_void<Q>::value, key_type const&>::type + getFirstConst(value_type const& vt) const noexcept { + return vt.first; + } + + // Cloner ////////////////////////////////////////////////////////// + + template <typename M, bool UseMemcpy> + struct Cloner; + + // fast path: Just copy data, without allocating anything. + template <typename M> + struct Cloner<M, true> { + void operator()(M const& source, M& target) const { + auto const* const src = reinterpret_cast<char const*>(source.mKeyVals); + auto* tgt = reinterpret_cast<char*>(target.mKeyVals); + auto const numElementsWithBuffer = target.calcNumElementsWithBuffer(target.mMask + 1); + std::copy(src, src + target.calcNumBytesTotal(numElementsWithBuffer), tgt); + } + }; + + template <typename M> + struct Cloner<M, false> { + void operator()(M const& s, M& t) const { + auto const numElementsWithBuffer = t.calcNumElementsWithBuffer(t.mMask + 1); + std::copy(s.mInfo, s.mInfo + t.calcNumBytesInfo(numElementsWithBuffer), t.mInfo); + + for (size_t i = 0; i < numElementsWithBuffer; ++i) { + if (t.mInfo[i]) { + ::new (static_cast<void*>(t.mKeyVals + i)) Node(t, *s.mKeyVals[i]); + } + } + } + }; + + // Destroyer /////////////////////////////////////////////////////// + + template <typename M, bool IsFlatAndTrivial> + struct Destroyer {}; + + template <typename M> + struct Destroyer<M, true> { + void nodes(M& m) const noexcept { + m.mNumElements = 0; + } + + void nodesDoNotDeallocate(M& m) const noexcept { + m.mNumElements = 0; + } + }; + + template <typename M> + struct Destroyer<M, false> { + void nodes(M& m) const noexcept { + m.mNumElements = 0; + // clear also resets mInfo to 0, that's sometimes not necessary. + auto const numElementsWithBuffer = m.calcNumElementsWithBuffer(m.mMask + 1); + + for (size_t idx = 0; idx < numElementsWithBuffer; ++idx) { + if (0 != m.mInfo[idx]) { + Node& n = m.mKeyVals[idx]; + n.destroy(m); + n.~Node(); + } + } + } + + void nodesDoNotDeallocate(M& m) const noexcept { + m.mNumElements = 0; + // clear also resets mInfo to 0, that's sometimes not necessary. + auto const numElementsWithBuffer = m.calcNumElementsWithBuffer(m.mMask + 1); + for (size_t idx = 0; idx < numElementsWithBuffer; ++idx) { + if (0 != m.mInfo[idx]) { + Node& n = m.mKeyVals[idx]; + n.destroyDoNotDeallocate(); + n.~Node(); + } + } + } + }; + + // Iter //////////////////////////////////////////////////////////// + + struct fast_forward_tag {}; + + // generic iterator for both const_iterator and iterator. + template <bool IsConst> + // NOLINTNEXTLINE(hicpp-special-member-functions,cppcoreguidelines-special-member-functions) + class Iter { + private: + using NodePtr = typename std::conditional<IsConst, Node const*, Node*>::type; + + public: + using difference_type = std::ptrdiff_t; + using value_type = typename Self::value_type; + using reference = typename std::conditional<IsConst, value_type const&, value_type&>::type; + using pointer = typename std::conditional<IsConst, value_type const*, value_type*>::type; + using iterator_category = std::forward_iterator_tag; + + // default constructed iterator can be compared to itself, but WON'T return true when + // compared to end(). + Iter() = default; + + // Rule of zero: nothing specified. The conversion constructor is only enabled for + // iterator to const_iterator, so it doesn't accidentally work as a copy ctor. + + // Conversion constructor from iterator to const_iterator. + template <bool OtherIsConst, + typename = typename std::enable_if<IsConst && !OtherIsConst>::type> + // NOLINTNEXTLINE(hicpp-explicit-conversions) + Iter(Iter<OtherIsConst> const& other) noexcept + : mKeyVals(other.mKeyVals) + , mInfo(other.mInfo) {} + + Iter(NodePtr valPtr, uint8_t const* infoPtr) noexcept + : mKeyVals(valPtr) + , mInfo(infoPtr) {} + + Iter(NodePtr valPtr, uint8_t const* infoPtr, + fast_forward_tag ROBIN_HOOD_UNUSED(tag) /*unused*/) noexcept + : mKeyVals(valPtr) + , mInfo(infoPtr) { + fastForward(); + } + + template <bool OtherIsConst, + typename = typename std::enable_if<IsConst && !OtherIsConst>::type> + Iter& operator=(Iter<OtherIsConst> const& other) noexcept { + mKeyVals = other.mKeyVals; + mInfo = other.mInfo; + return *this; + } + + // prefix increment. Undefined behavior if we are at end()! + Iter& operator++() noexcept { + mInfo++; + mKeyVals++; + fastForward(); + return *this; + } + + Iter operator++(int) noexcept { + Iter tmp = *this; + ++(*this); + return tmp; + } + + reference operator*() const { + return **mKeyVals; + } + + pointer operator->() const { + return &**mKeyVals; + } + + template <bool O> + bool operator==(Iter<O> const& o) const noexcept { + return mKeyVals == o.mKeyVals; + } + + template <bool O> + bool operator!=(Iter<O> const& o) const noexcept { + return mKeyVals != o.mKeyVals; + } + + private: + // fast forward to the next non-free info byte + // I've tried a few variants that don't depend on intrinsics, but unfortunately they are + // quite a bit slower than this one. So I've reverted that change again. See map_benchmark. + void fastForward() noexcept { + size_t n = 0; + while (0U == (n = detail::unaligned_load<size_t>(mInfo))) { + mInfo += sizeof(size_t); + mKeyVals += sizeof(size_t); + } +#if defined(ROBIN_HOOD_DISABLE_INTRINSICS) + // we know for certain that within the next 8 bytes we'll find a non-zero one. + if (ROBIN_HOOD_UNLIKELY(0U == detail::unaligned_load<uint32_t>(mInfo))) { + mInfo += 4; + mKeyVals += 4; + } + if (ROBIN_HOOD_UNLIKELY(0U == detail::unaligned_load<uint16_t>(mInfo))) { + mInfo += 2; + mKeyVals += 2; + } + if (ROBIN_HOOD_UNLIKELY(0U == *mInfo)) { + mInfo += 1; + mKeyVals += 1; + } +#else +# if ROBIN_HOOD(LITTLE_ENDIAN) + auto inc = ROBIN_HOOD_COUNT_TRAILING_ZEROES(n) / 8; +# else + auto inc = ROBIN_HOOD_COUNT_LEADING_ZEROES(n) / 8; +# endif + mInfo += inc; + mKeyVals += inc; +#endif + } + + friend class Table<IsFlat, MaxLoadFactor100, key_type, mapped_type, hasher, key_equal>; + NodePtr mKeyVals{nullptr}; + uint8_t const* mInfo{nullptr}; + }; + + //////////////////////////////////////////////////////////////////// + + // highly performance relevant code. + // Lower bits are used for indexing into the array (2^n size) + // The upper 1-5 bits need to be a reasonable good hash, to save comparisons. + template <typename HashKey> + void keyToIdx(HashKey&& key, size_t* idx, InfoType* info) const { + // for a user-specified hash that is *not* robin_hood::hash, apply robin_hood::hash as + // an additional mixing step. This serves as a bad hash prevention, if the given data is + // badly mixed. + using Mix = + typename std::conditional<std::is_same<::robin_hood::hash<key_type>, hasher>::value, + ::robin_hood::detail::identity_hash<size_t>, + ::robin_hood::hash<size_t>>::type; + + // the lower InitialInfoNumBits are reserved for info. + auto h = Mix{}(WHash::operator()(key)); + *info = mInfoInc + static_cast<InfoType>((h & InfoMask) >> mInfoHashShift); + *idx = (h >> InitialInfoNumBits) & mMask; + } + + // forwards the index by one, wrapping around at the end + void next(InfoType* info, size_t* idx) const noexcept { + *idx = *idx + 1; + *info += mInfoInc; + } + + void nextWhileLess(InfoType* info, size_t* idx) const noexcept { + // unrolling this by hand did not bring any speedups. + while (*info < mInfo[*idx]) { + next(info, idx); + } + } + + // Shift everything up by one element. Tries to move stuff around. + void + shiftUp(size_t startIdx, + size_t const insertion_idx) noexcept(std::is_nothrow_move_assignable<Node>::value) { + auto idx = startIdx; + ::new (static_cast<void*>(mKeyVals + idx)) Node(std::move(mKeyVals[idx - 1])); + while (--idx != insertion_idx) { + mKeyVals[idx] = std::move(mKeyVals[idx - 1]); + } + + idx = startIdx; + while (idx != insertion_idx) { + ROBIN_HOOD_COUNT(shiftUp) + mInfo[idx] = static_cast<uint8_t>(mInfo[idx - 1] + mInfoInc); + if (ROBIN_HOOD_UNLIKELY(mInfo[idx] + mInfoInc > 0xFF)) { + mMaxNumElementsAllowed = 0; + } + --idx; + } + } + + void shiftDown(size_t idx) noexcept(std::is_nothrow_move_assignable<Node>::value) { + // until we find one that is either empty or has zero offset. + // TODO(martinus) we don't need to move everything, just the last one for the same + // bucket. + mKeyVals[idx].destroy(*this); + + // until we find one that is either empty or has zero offset. + while (mInfo[idx + 1] >= 2 * mInfoInc) { + ROBIN_HOOD_COUNT(shiftDown) + mInfo[idx] = static_cast<uint8_t>(mInfo[idx + 1] - mInfoInc); + mKeyVals[idx] = std::move(mKeyVals[idx + 1]); + ++idx; + } + + mInfo[idx] = 0; + // don't destroy, we've moved it + // mKeyVals[idx].destroy(*this); + mKeyVals[idx].~Node(); + } + + // copy of find(), except that it returns iterator instead of const_iterator. + template <typename Other> + ROBIN_HOOD(NODISCARD) + size_t findIdx(Other const& key) const { + size_t idx{}; + InfoType info{}; + keyToIdx(key, &idx, &info); + + do { + // unrolling this twice gives a bit of a speedup. More unrolling did not help. + if (info == mInfo[idx] && + ROBIN_HOOD_LIKELY(WKeyEqual::operator()(key, mKeyVals[idx].getFirst()))) { + return idx; + } + next(&info, &idx); + if (info == mInfo[idx] && + ROBIN_HOOD_LIKELY(WKeyEqual::operator()(key, mKeyVals[idx].getFirst()))) { + return idx; + } + next(&info, &idx); + } while (info <= mInfo[idx]); + + // nothing found! + return mMask == 0 ? 0 + : static_cast<size_t>(std::distance( + mKeyVals, reinterpret_cast_no_cast_align_warning<Node*>(mInfo))); + } + + void cloneData(const Table& o) { + Cloner<Table, IsFlat && ROBIN_HOOD_IS_TRIVIALLY_COPYABLE(Node)>()(o, *this); + } + + // inserts a keyval that is guaranteed to be new, e.g. when the hashmap is resized. + // @return index where the element was created + size_t insert_move(Node&& keyval) { + // we don't retry, fail if overflowing + // don't need to check max num elements + if (0 == mMaxNumElementsAllowed && !try_increase_info()) { + throwOverflowError(); // impossible to reach LCOV_EXCL_LINE + } + + size_t idx{}; + InfoType info{}; + keyToIdx(keyval.getFirst(), &idx, &info); + + // skip forward. Use <= because we are certain that the element is not there. + while (info <= mInfo[idx]) { + idx = idx + 1; + info += mInfoInc; + } + + // key not found, so we are now exactly where we want to insert it. + auto const insertion_idx = idx; + auto const insertion_info = static_cast<uint8_t>(info); + if (ROBIN_HOOD_UNLIKELY(insertion_info + mInfoInc > 0xFF)) { + mMaxNumElementsAllowed = 0; + } + + // find an empty spot + while (0 != mInfo[idx]) { + next(&info, &idx); + } + + auto& l = mKeyVals[insertion_idx]; + if (idx == insertion_idx) { + ::new (static_cast<void*>(&l)) Node(std::move(keyval)); + } else { + shiftUp(idx, insertion_idx); + l = std::move(keyval); + } + + // put at empty spot + mInfo[insertion_idx] = insertion_info; + + ++mNumElements; + return insertion_idx; + } + +public: + using iterator = Iter<false>; + using const_iterator = Iter<true>; + + Table() noexcept(noexcept(Hash()) && noexcept(KeyEqual())) + : WHash() + , WKeyEqual() { + ROBIN_HOOD_TRACE(this) + } + + // Creates an empty hash map. Nothing is allocated yet, this happens at the first insert. + // This tremendously speeds up ctor & dtor of a map that never receives an element. The + // penalty is payed at the first insert, and not before. Lookup of this empty map works + // because everybody points to DummyInfoByte::b. parameter bucket_count is dictated by the + // standard, but we can ignore it. + explicit Table( + size_t ROBIN_HOOD_UNUSED(bucket_count) /*unused*/, const Hash& h = Hash{}, + const KeyEqual& equal = KeyEqual{}) noexcept(noexcept(Hash(h)) && noexcept(KeyEqual(equal))) + : WHash(h) + , WKeyEqual(equal) { + ROBIN_HOOD_TRACE(this) + } + + template <typename Iter> + Table(Iter first, Iter last, size_t ROBIN_HOOD_UNUSED(bucket_count) /*unused*/ = 0, + const Hash& h = Hash{}, const KeyEqual& equal = KeyEqual{}) + : WHash(h) + , WKeyEqual(equal) { + ROBIN_HOOD_TRACE(this) + insert(first, last); + } + + Table(std::initializer_list<value_type> initlist, + size_t ROBIN_HOOD_UNUSED(bucket_count) /*unused*/ = 0, const Hash& h = Hash{}, + const KeyEqual& equal = KeyEqual{}) + : WHash(h) + , WKeyEqual(equal) { + ROBIN_HOOD_TRACE(this) + insert(initlist.begin(), initlist.end()); + } + + Table(Table&& o) noexcept + : WHash(std::move(static_cast<WHash&>(o))) + , WKeyEqual(std::move(static_cast<WKeyEqual&>(o))) + , DataPool(std::move(static_cast<DataPool&>(o))) { + ROBIN_HOOD_TRACE(this) + if (o.mMask) { + mKeyVals = std::move(o.mKeyVals); + mInfo = std::move(o.mInfo); + mNumElements = std::move(o.mNumElements); + mMask = std::move(o.mMask); + mMaxNumElementsAllowed = std::move(o.mMaxNumElementsAllowed); + mInfoInc = std::move(o.mInfoInc); + mInfoHashShift = std::move(o.mInfoHashShift); + // set other's mask to 0 so its destructor won't do anything + o.init(); + } + } + + Table& operator=(Table&& o) noexcept { + ROBIN_HOOD_TRACE(this) + if (&o != this) { + if (o.mMask) { + // only move stuff if the other map actually has some data + destroy(); + mKeyVals = std::move(o.mKeyVals); + mInfo = std::move(o.mInfo); + mNumElements = std::move(o.mNumElements); + mMask = std::move(o.mMask); + mMaxNumElementsAllowed = std::move(o.mMaxNumElementsAllowed); + mInfoInc = std::move(o.mInfoInc); + mInfoHashShift = std::move(o.mInfoHashShift); + WHash::operator=(std::move(static_cast<WHash&>(o))); + WKeyEqual::operator=(std::move(static_cast<WKeyEqual&>(o))); + DataPool::operator=(std::move(static_cast<DataPool&>(o))); + + o.init(); + + } else { + // nothing in the other map => just clear us. + clear(); + } + } + return *this; + } + + Table(const Table& o) + : WHash(static_cast<const WHash&>(o)) + , WKeyEqual(static_cast<const WKeyEqual&>(o)) + , DataPool(static_cast<const DataPool&>(o)) { + ROBIN_HOOD_TRACE(this) + if (!o.empty()) { + // not empty: create an exact copy. it is also possible to just iterate through all + // elements and insert them, but copying is probably faster. + + auto const numElementsWithBuffer = calcNumElementsWithBuffer(o.mMask + 1); + auto const numBytesTotal = calcNumBytesTotal(numElementsWithBuffer); + + ROBIN_HOOD_LOG("std::malloc " << numBytesTotal << " = calcNumBytesTotal(" + << numElementsWithBuffer << ")") + mKeyVals = static_cast<Node*>( + detail::assertNotNull<std::bad_alloc>(std::malloc(numBytesTotal))); + // no need for calloc because clonData does memcpy + mInfo = reinterpret_cast<uint8_t*>(mKeyVals + numElementsWithBuffer); + mNumElements = o.mNumElements; + mMask = o.mMask; + mMaxNumElementsAllowed = o.mMaxNumElementsAllowed; + mInfoInc = o.mInfoInc; + mInfoHashShift = o.mInfoHashShift; + cloneData(o); + } + } + + // Creates a copy of the given map. Copy constructor of each entry is used. + // Not sure why clang-tidy thinks this doesn't handle self assignment, it does + // NOLINTNEXTLINE(bugprone-unhandled-self-assignment,cert-oop54-cpp) + Table& operator=(Table const& o) { + ROBIN_HOOD_TRACE(this) + if (&o == this) { + // prevent assigning of itself + return *this; + } + + // we keep using the old allocator and not assign the new one, because we want to keep + // the memory available. when it is the same size. + if (o.empty()) { + if (0 == mMask) { + // nothing to do, we are empty too + return *this; + } + + // not empty: destroy what we have there + // clear also resets mInfo to 0, that's sometimes not necessary. + destroy(); + init(); + WHash::operator=(static_cast<const WHash&>(o)); + WKeyEqual::operator=(static_cast<const WKeyEqual&>(o)); + DataPool::operator=(static_cast<DataPool const&>(o)); + + return *this; + } + + // clean up old stuff + Destroyer<Self, IsFlat && std::is_trivially_destructible<Node>::value>{}.nodes(*this); + + if (mMask != o.mMask) { + // no luck: we don't have the same array size allocated, so we need to realloc. + if (0 != mMask) { + // only deallocate if we actually have data! + ROBIN_HOOD_LOG("std::free") + std::free(mKeyVals); + } + + auto const numElementsWithBuffer = calcNumElementsWithBuffer(o.mMask + 1); + auto const numBytesTotal = calcNumBytesTotal(numElementsWithBuffer); + ROBIN_HOOD_LOG("std::malloc " << numBytesTotal << " = calcNumBytesTotal(" + << numElementsWithBuffer << ")") + mKeyVals = static_cast<Node*>( + detail::assertNotNull<std::bad_alloc>(std::malloc(numBytesTotal))); + + // no need for calloc here because cloneData performs a memcpy. + mInfo = reinterpret_cast<uint8_t*>(mKeyVals + numElementsWithBuffer); + // sentinel is set in cloneData + } + WHash::operator=(static_cast<const WHash&>(o)); + WKeyEqual::operator=(static_cast<const WKeyEqual&>(o)); + DataPool::operator=(static_cast<DataPool const&>(o)); + mNumElements = o.mNumElements; + mMask = o.mMask; + mMaxNumElementsAllowed = o.mMaxNumElementsAllowed; + mInfoInc = o.mInfoInc; + mInfoHashShift = o.mInfoHashShift; + cloneData(o); + + return *this; + } + + // Swaps everything between the two maps. + void swap(Table& o) { + ROBIN_HOOD_TRACE(this) + using std::swap; + swap(o, *this); + } + + // Clears all data, without resizing. + void clear() { + ROBIN_HOOD_TRACE(this) + if (empty()) { + // don't do anything! also important because we don't want to write to + // DummyInfoByte::b, even though we would just write 0 to it. + return; + } + + Destroyer<Self, IsFlat && std::is_trivially_destructible<Node>::value>{}.nodes(*this); + + auto const numElementsWithBuffer = calcNumElementsWithBuffer(mMask + 1); + // clear everything, then set the sentinel again + uint8_t const z = 0; + std::fill(mInfo, mInfo + calcNumBytesInfo(numElementsWithBuffer), z); + mInfo[numElementsWithBuffer] = 1; + + mInfoInc = InitialInfoInc; + mInfoHashShift = InitialInfoHashShift; + } + + // Destroys the map and all it's contents. + ~Table() { + ROBIN_HOOD_TRACE(this) + destroy(); + } + + // Checks if both tables contain the same entries. Order is irrelevant. + bool operator==(const Table& other) const { + ROBIN_HOOD_TRACE(this) + if (other.size() != size()) { + return false; + } + for (auto const& otherEntry : other) { + if (!has(otherEntry)) { + return false; + } + } + + return true; + } + + bool operator!=(const Table& other) const { + ROBIN_HOOD_TRACE(this) + return !operator==(other); + } + + template <typename Q = mapped_type> + typename std::enable_if<!std::is_void<Q>::value, Q&>::type operator[](const key_type& key) { + ROBIN_HOOD_TRACE(this) + return doCreateByKey(key); + } + + template <typename Q = mapped_type> + typename std::enable_if<!std::is_void<Q>::value, Q&>::type operator[](key_type&& key) { + ROBIN_HOOD_TRACE(this) + return doCreateByKey(std::move(key)); + } + + template <typename Iter> + void insert(Iter first, Iter last) { + for (; first != last; ++first) { + // value_type ctor needed because this might be called with std::pair's + insert(value_type(*first)); + } + } + + template <typename... Args> + std::pair<iterator, bool> emplace(Args&&... args) { + ROBIN_HOOD_TRACE(this) + Node n{*this, std::forward<Args>(args)...}; + auto r = doInsert(std::move(n)); + if (!r.second) { + // insertion not possible: destroy node + // NOLINTNEXTLINE(bugprone-use-after-move) + n.destroy(*this); + } + return r; + } + + template <typename... Args> + std::pair<iterator, bool> try_emplace(const key_type& key, Args&&... args) { + return try_emplace_impl(key, std::forward<Args>(args)...); + } + + template <typename... Args> + std::pair<iterator, bool> try_emplace(key_type&& key, Args&&... args) { + return try_emplace_impl(std::move(key), std::forward<Args>(args)...); + } + + template <typename... Args> + std::pair<iterator, bool> try_emplace(const_iterator hint, const key_type& key, + Args&&... args) { + (void)hint; + return try_emplace_impl(key, std::forward<Args>(args)...); + } + + template <typename... Args> + std::pair<iterator, bool> try_emplace(const_iterator hint, key_type&& key, Args&&... args) { + (void)hint; + return try_emplace_impl(std::move(key), std::forward<Args>(args)...); + } + + template <typename Mapped> + std::pair<iterator, bool> insert_or_assign(const key_type& key, Mapped&& obj) { + return insert_or_assign_impl(key, std::forward<Mapped>(obj)); + } + + template <typename Mapped> + std::pair<iterator, bool> insert_or_assign(key_type&& key, Mapped&& obj) { + return insert_or_assign_impl(std::move(key), std::forward<Mapped>(obj)); + } + + template <typename Mapped> + std::pair<iterator, bool> insert_or_assign(const_iterator hint, const key_type& key, + Mapped&& obj) { + (void)hint; + return insert_or_assign_impl(key, std::forward<Mapped>(obj)); + } + + template <typename Mapped> + std::pair<iterator, bool> insert_or_assign(const_iterator hint, key_type&& key, Mapped&& obj) { + (void)hint; + return insert_or_assign_impl(std::move(key), std::forward<Mapped>(obj)); + } + + std::pair<iterator, bool> insert(const value_type& keyval) { + ROBIN_HOOD_TRACE(this) + return doInsert(keyval); + } + + std::pair<iterator, bool> insert(value_type&& keyval) { + return doInsert(std::move(keyval)); + } + + // Returns 1 if key is found, 0 otherwise. + size_t count(const key_type& key) const { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + auto kv = mKeyVals + findIdx(key); + if (kv != reinterpret_cast_no_cast_align_warning<Node*>(mInfo)) { + return 1; + } + return 0; + } + + template <typename OtherKey, typename Self_ = Self> + // NOLINTNEXTLINE(modernize-use-nodiscard) + typename std::enable_if<Self_::is_transparent, size_t>::type count(const OtherKey& key) const { + ROBIN_HOOD_TRACE(this) + auto kv = mKeyVals + findIdx(key); + if (kv != reinterpret_cast_no_cast_align_warning<Node*>(mInfo)) { + return 1; + } + return 0; + } + + bool contains(const key_type& key) const { // NOLINT(modernize-use-nodiscard) + return 1U == count(key); + } + + template <typename OtherKey, typename Self_ = Self> + // NOLINTNEXTLINE(modernize-use-nodiscard) + typename std::enable_if<Self_::is_transparent, bool>::type contains(const OtherKey& key) const { + return 1U == count(key); + } + + // Returns a reference to the value found for key. + // Throws std::out_of_range if element cannot be found + template <typename Q = mapped_type> + // NOLINTNEXTLINE(modernize-use-nodiscard) + typename std::enable_if<!std::is_void<Q>::value, Q&>::type at(key_type const& key) { + ROBIN_HOOD_TRACE(this) + auto kv = mKeyVals + findIdx(key); + if (kv == reinterpret_cast_no_cast_align_warning<Node*>(mInfo)) { + doThrow<std::out_of_range>("key not found"); + } + return kv->getSecond(); + } + + // Returns a reference to the value found for key. + // Throws std::out_of_range if element cannot be found + template <typename Q = mapped_type> + // NOLINTNEXTLINE(modernize-use-nodiscard) + typename std::enable_if<!std::is_void<Q>::value, Q const&>::type at(key_type const& key) const { + ROBIN_HOOD_TRACE(this) + auto kv = mKeyVals + findIdx(key); + if (kv == reinterpret_cast_no_cast_align_warning<Node*>(mInfo)) { + doThrow<std::out_of_range>("key not found"); + } + return kv->getSecond(); + } + + const_iterator find(const key_type& key) const { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + const size_t idx = findIdx(key); + return const_iterator{mKeyVals + idx, mInfo + idx}; + } + + template <typename OtherKey> + const_iterator find(const OtherKey& key, is_transparent_tag /*unused*/) const { + ROBIN_HOOD_TRACE(this) + const size_t idx = findIdx(key); + return const_iterator{mKeyVals + idx, mInfo + idx}; + } + + template <typename OtherKey, typename Self_ = Self> + typename std::enable_if<Self_::is_transparent, // NOLINT(modernize-use-nodiscard) + const_iterator>::type // NOLINT(modernize-use-nodiscard) + find(const OtherKey& key) const { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + const size_t idx = findIdx(key); + return const_iterator{mKeyVals + idx, mInfo + idx}; + } + + iterator find(const key_type& key) { + ROBIN_HOOD_TRACE(this) + const size_t idx = findIdx(key); + return iterator{mKeyVals + idx, mInfo + idx}; + } + + template <typename OtherKey> + iterator find(const OtherKey& key, is_transparent_tag /*unused*/) { + ROBIN_HOOD_TRACE(this) + const size_t idx = findIdx(key); + return iterator{mKeyVals + idx, mInfo + idx}; + } + + template <typename OtherKey, typename Self_ = Self> + typename std::enable_if<Self_::is_transparent, iterator>::type find(const OtherKey& key) { + ROBIN_HOOD_TRACE(this) + const size_t idx = findIdx(key); + return iterator{mKeyVals + idx, mInfo + idx}; + } + + iterator begin() { + ROBIN_HOOD_TRACE(this) + if (empty()) { + return end(); + } + return iterator(mKeyVals, mInfo, fast_forward_tag{}); + } + const_iterator begin() const { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + return cbegin(); + } + const_iterator cbegin() const { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + if (empty()) { + return cend(); + } + return const_iterator(mKeyVals, mInfo, fast_forward_tag{}); + } + + iterator end() { + ROBIN_HOOD_TRACE(this) + // no need to supply valid info pointer: end() must not be dereferenced, and only node + // pointer is compared. + return iterator{reinterpret_cast_no_cast_align_warning<Node*>(mInfo), nullptr}; + } + const_iterator end() const { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + return cend(); + } + const_iterator cend() const { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + return const_iterator{reinterpret_cast_no_cast_align_warning<Node*>(mInfo), nullptr}; + } + + iterator erase(const_iterator pos) { + ROBIN_HOOD_TRACE(this) + // its safe to perform const cast here + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) + return erase(iterator{const_cast<Node*>(pos.mKeyVals), const_cast<uint8_t*>(pos.mInfo)}); + } + + // Erases element at pos, returns iterator to the next element. + iterator erase(iterator pos) { + ROBIN_HOOD_TRACE(this) + // we assume that pos always points to a valid entry, and not end(). + auto const idx = static_cast<size_t>(pos.mKeyVals - mKeyVals); + + shiftDown(idx); + --mNumElements; + + if (*pos.mInfo) { + // we've backward shifted, return this again + return pos; + } + + // no backward shift, return next element + return ++pos; + } + + size_t erase(const key_type& key) { + ROBIN_HOOD_TRACE(this) + size_t idx{}; + InfoType info{}; + keyToIdx(key, &idx, &info); + + // check while info matches with the source idx + do { + if (info == mInfo[idx] && WKeyEqual::operator()(key, mKeyVals[idx].getFirst())) { + shiftDown(idx); + --mNumElements; + return 1; + } + next(&info, &idx); + } while (info <= mInfo[idx]); + + // nothing found to delete + return 0; + } + + // reserves space for the specified number of elements. Makes sure the old data fits. + // exactly the same as reserve(c). + void rehash(size_t c) { + // forces a reserve + reserve(c, true); + } + + // reserves space for the specified number of elements. Makes sure the old data fits. + // Exactly the same as rehash(c). Use rehash(0) to shrink to fit. + void reserve(size_t c) { + // reserve, but don't force rehash + reserve(c, false); + } + + size_type size() const noexcept { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + return mNumElements; + } + + size_type max_size() const noexcept { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + return static_cast<size_type>(-1); + } + + ROBIN_HOOD(NODISCARD) bool empty() const noexcept { + ROBIN_HOOD_TRACE(this) + return 0 == mNumElements; + } + + float max_load_factor() const noexcept { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + return MaxLoadFactor100 / 100.0F; + } + + // Average number of elements per bucket. Since we allow only 1 per bucket + float load_factor() const noexcept { // NOLINT(modernize-use-nodiscard) + ROBIN_HOOD_TRACE(this) + return static_cast<float>(size()) / static_cast<float>(mMask + 1); + } + + ROBIN_HOOD(NODISCARD) size_t mask() const noexcept { + ROBIN_HOOD_TRACE(this) + return mMask; + } + + ROBIN_HOOD(NODISCARD) size_t calcMaxNumElementsAllowed(size_t maxElements) const noexcept { + if (ROBIN_HOOD_LIKELY(maxElements <= (std::numeric_limits<size_t>::max)() / 100)) { + return maxElements * MaxLoadFactor100 / 100; + } + + // we might be a bit inprecise, but since maxElements is quite large that doesn't matter + return (maxElements / 100) * MaxLoadFactor100; + } + + ROBIN_HOOD(NODISCARD) size_t calcNumBytesInfo(size_t numElements) const noexcept { + // we add a uint64_t, which houses the sentinel (first byte) and padding so we can load + // 64bit types. + return numElements + sizeof(uint64_t); + } + + ROBIN_HOOD(NODISCARD) + size_t calcNumElementsWithBuffer(size_t numElements) const noexcept { + auto maxNumElementsAllowed = calcMaxNumElementsAllowed(numElements); + return numElements + (std::min)(maxNumElementsAllowed, (static_cast<size_t>(0xFF))); + } + + // calculation only allowed for 2^n values + ROBIN_HOOD(NODISCARD) size_t calcNumBytesTotal(size_t numElements) const { +#if ROBIN_HOOD(BITNESS) == 64 + return numElements * sizeof(Node) + calcNumBytesInfo(numElements); +#else + // make sure we're doing 64bit operations, so we are at least safe against 32bit overflows. + auto const ne = static_cast<uint64_t>(numElements); + auto const s = static_cast<uint64_t>(sizeof(Node)); + auto const infos = static_cast<uint64_t>(calcNumBytesInfo(numElements)); + + auto const total64 = ne * s + infos; + auto const total = static_cast<size_t>(total64); + + if (ROBIN_HOOD_UNLIKELY(static_cast<uint64_t>(total) != total64)) { + throwOverflowError(); + } + return total; +#endif + } + +private: + template <typename Q = mapped_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<!std::is_void<Q>::value, bool>::type has(const value_type& e) const { + ROBIN_HOOD_TRACE(this) + auto it = find(e.first); + return it != end() && it->second == e.second; + } + + template <typename Q = mapped_type> + ROBIN_HOOD(NODISCARD) + typename std::enable_if<std::is_void<Q>::value, bool>::type has(const value_type& e) const { + ROBIN_HOOD_TRACE(this) + return find(e) != end(); + } + + void reserve(size_t c, bool forceRehash) { + ROBIN_HOOD_TRACE(this) + auto const minElementsAllowed = (std::max)(c, mNumElements); + auto newSize = InitialNumElements; + while (calcMaxNumElementsAllowed(newSize) < minElementsAllowed && newSize != 0) { + newSize *= 2; + } + if (ROBIN_HOOD_UNLIKELY(newSize == 0)) { + throwOverflowError(); + } + + ROBIN_HOOD_LOG("newSize > mMask + 1: " << newSize << " > " << mMask << " + 1") + + // only actually do anything when the new size is bigger than the old one. This prevents to + // continuously allocate for each reserve() call. + if (forceRehash || newSize > mMask + 1) { + rehashPowerOfTwo(newSize); + } + } + + // reserves space for at least the specified number of elements. + // only works if numBuckets if power of two + void rehashPowerOfTwo(size_t numBuckets) { + ROBIN_HOOD_TRACE(this) + + Node* const oldKeyVals = mKeyVals; + uint8_t const* const oldInfo = mInfo; + + const size_t oldMaxElementsWithBuffer = calcNumElementsWithBuffer(mMask + 1); + + // resize operation: move stuff + init_data(numBuckets); + if (oldMaxElementsWithBuffer > 1) { + for (size_t i = 0; i < oldMaxElementsWithBuffer; ++i) { + if (oldInfo[i] != 0) { + insert_move(std::move(oldKeyVals[i])); + // destroy the node but DON'T destroy the data. + oldKeyVals[i].~Node(); + } + } + + // this check is not necessary as it's guarded by the previous if, but it helps silence + // g++'s overeager "attempt to free a non-heap object 'map' + // [-Werror=free-nonheap-object]" warning. + if (oldKeyVals != reinterpret_cast_no_cast_align_warning<Node*>(&mMask)) { + // don't destroy old data: put it into the pool instead + DataPool::addOrFree(oldKeyVals, calcNumBytesTotal(oldMaxElementsWithBuffer)); + } + } + } + + ROBIN_HOOD(NOINLINE) void throwOverflowError() const { +#if ROBIN_HOOD(HAS_EXCEPTIONS) + throw std::overflow_error("robin_hood::map overflow"); +#else + abort(); +#endif + } + + template <typename OtherKey, typename... Args> + std::pair<iterator, bool> try_emplace_impl(OtherKey&& key, Args&&... args) { + ROBIN_HOOD_TRACE(this) + auto it = find(key); + if (it == end()) { + return emplace(std::piecewise_construct, + std::forward_as_tuple(std::forward<OtherKey>(key)), + std::forward_as_tuple(std::forward<Args>(args)...)); + } + return {it, false}; + } + + template <typename OtherKey, typename Mapped> + std::pair<iterator, bool> insert_or_assign_impl(OtherKey&& key, Mapped&& obj) { + ROBIN_HOOD_TRACE(this) + auto it = find(key); + if (it == end()) { + return emplace(std::forward<OtherKey>(key), std::forward<Mapped>(obj)); + } + it->second = std::forward<Mapped>(obj); + return {it, false}; + } + + void init_data(size_t max_elements) { + mNumElements = 0; + mMask = max_elements - 1; + mMaxNumElementsAllowed = calcMaxNumElementsAllowed(max_elements); + + auto const numElementsWithBuffer = calcNumElementsWithBuffer(max_elements); + + // calloc also zeroes everything + auto const numBytesTotal = calcNumBytesTotal(numElementsWithBuffer); + ROBIN_HOOD_LOG("std::calloc " << numBytesTotal << " = calcNumBytesTotal(" + << numElementsWithBuffer << ")") + mKeyVals = reinterpret_cast<Node*>( + detail::assertNotNull<std::bad_alloc>(std::calloc(1, numBytesTotal))); + mInfo = reinterpret_cast<uint8_t*>(mKeyVals + numElementsWithBuffer); + + // set sentinel + mInfo[numElementsWithBuffer] = 1; + + mInfoInc = InitialInfoInc; + mInfoHashShift = InitialInfoHashShift; + } + + template <typename Arg, typename Q = mapped_type> + typename std::enable_if<!std::is_void<Q>::value, Q&>::type doCreateByKey(Arg&& key) { + while (true) { + size_t idx{}; + InfoType info{}; + keyToIdx(key, &idx, &info); + nextWhileLess(&info, &idx); + + // while we potentially have a match. Can't do a do-while here because when mInfo is + // 0 we don't want to skip forward + while (info == mInfo[idx]) { + if (WKeyEqual::operator()(key, mKeyVals[idx].getFirst())) { + // key already exists, do not insert. + return mKeyVals[idx].getSecond(); + } + next(&info, &idx); + } + + // unlikely that this evaluates to true + if (ROBIN_HOOD_UNLIKELY(mNumElements >= mMaxNumElementsAllowed)) { + increase_size(); + continue; + } + + // key not found, so we are now exactly where we want to insert it. + auto const insertion_idx = idx; + auto const insertion_info = info; + if (ROBIN_HOOD_UNLIKELY(insertion_info + mInfoInc > 0xFF)) { + mMaxNumElementsAllowed = 0; + } + + // find an empty spot + while (0 != mInfo[idx]) { + next(&info, &idx); + } + + auto& l = mKeyVals[insertion_idx]; + if (idx == insertion_idx) { + // put at empty spot. This forwards all arguments into the node where the object + // is constructed exactly where it is needed. + ::new (static_cast<void*>(&l)) + Node(*this, std::piecewise_construct, + std::forward_as_tuple(std::forward<Arg>(key)), std::forward_as_tuple()); + } else { + shiftUp(idx, insertion_idx); + l = Node(*this, std::piecewise_construct, + std::forward_as_tuple(std::forward<Arg>(key)), std::forward_as_tuple()); + } + + // mKeyVals[idx].getFirst() = std::move(key); + mInfo[insertion_idx] = static_cast<uint8_t>(insertion_info); + + ++mNumElements; + return mKeyVals[insertion_idx].getSecond(); + } + } + + // This is exactly the same code as operator[], except for the return values + template <typename Arg> + std::pair<iterator, bool> doInsert(Arg&& keyval) { + while (true) { + size_t idx{}; + InfoType info{}; + keyToIdx(getFirstConst(keyval), &idx, &info); + nextWhileLess(&info, &idx); + + // while we potentially have a match + while (info == mInfo[idx]) { + if (WKeyEqual::operator()(getFirstConst(keyval), mKeyVals[idx].getFirst())) { + // key already exists, do NOT insert. + // see http://en.cppreference.com/w/cpp/container/unordered_map/insert + return std::make_pair<iterator, bool>(iterator(mKeyVals + idx, mInfo + idx), + false); + } + next(&info, &idx); + } + + // unlikely that this evaluates to true + if (ROBIN_HOOD_UNLIKELY(mNumElements >= mMaxNumElementsAllowed)) { + increase_size(); + continue; + } + + // key not found, so we are now exactly where we want to insert it. + auto const insertion_idx = idx; + auto const insertion_info = info; + if (ROBIN_HOOD_UNLIKELY(insertion_info + mInfoInc > 0xFF)) { + mMaxNumElementsAllowed = 0; + } + + // find an empty spot + while (0 != mInfo[idx]) { + next(&info, &idx); + } + + auto& l = mKeyVals[insertion_idx]; + if (idx == insertion_idx) { + ::new (static_cast<void*>(&l)) Node(*this, std::forward<Arg>(keyval)); + } else { + shiftUp(idx, insertion_idx); + l = Node(*this, std::forward<Arg>(keyval)); + } + + // put at empty spot + mInfo[insertion_idx] = static_cast<uint8_t>(insertion_info); + + ++mNumElements; + return std::make_pair(iterator(mKeyVals + insertion_idx, mInfo + insertion_idx), true); + } + } + + bool try_increase_info() { + ROBIN_HOOD_LOG("mInfoInc=" << mInfoInc << ", numElements=" << mNumElements + << ", maxNumElementsAllowed=" + << calcMaxNumElementsAllowed(mMask + 1)) + if (mInfoInc <= 2) { + // need to be > 2 so that shift works (otherwise undefined behavior!) + return false; + } + // we got space left, try to make info smaller + mInfoInc = static_cast<uint8_t>(mInfoInc >> 1U); + + // remove one bit of the hash, leaving more space for the distance info. + // This is extremely fast because we can operate on 8 bytes at once. + ++mInfoHashShift; + auto const numElementsWithBuffer = calcNumElementsWithBuffer(mMask + 1); + + for (size_t i = 0; i < numElementsWithBuffer; i += 8) { + auto val = unaligned_load<uint64_t>(mInfo + i); + val = (val >> 1U) & UINT64_C(0x7f7f7f7f7f7f7f7f); + std::memcpy(mInfo + i, &val, sizeof(val)); + } + // update sentinel, which might have been cleared out! + mInfo[numElementsWithBuffer] = 1; + + mMaxNumElementsAllowed = calcMaxNumElementsAllowed(mMask + 1); + return true; + } + + void increase_size() { + // nothing allocated yet? just allocate InitialNumElements + if (0 == mMask) { + init_data(InitialNumElements); + return; + } + + auto const maxNumElementsAllowed = calcMaxNumElementsAllowed(mMask + 1); + if (mNumElements < maxNumElementsAllowed && try_increase_info()) { + return; + } + + ROBIN_HOOD_LOG("mNumElements=" << mNumElements << ", maxNumElementsAllowed=" + << maxNumElementsAllowed << ", load=" + << (static_cast<double>(mNumElements) * 100.0 / + (static_cast<double>(mMask) + 1))) + // it seems we have a really bad hash function! don't try to resize again + if (mNumElements * 2 < calcMaxNumElementsAllowed(mMask + 1)) { + throwOverflowError(); + } + + rehashPowerOfTwo((mMask + 1) * 2); + } + + void destroy() { + if (0 == mMask) { + // don't deallocate! + return; + } + + Destroyer<Self, IsFlat && std::is_trivially_destructible<Node>::value>{} + .nodesDoNotDeallocate(*this); + + // This protection against not deleting mMask shouldn't be needed as it's sufficiently + // protected with the 0==mMask check, but I have this anyways because g++ 7 otherwise + // reports a compile error: attempt to free a non-heap object 'fm' + // [-Werror=free-nonheap-object] + if (mKeyVals != reinterpret_cast_no_cast_align_warning<Node*>(&mMask)) { + ROBIN_HOOD_LOG("std::free") + std::free(mKeyVals); + } + } + + void init() noexcept { + mKeyVals = reinterpret_cast_no_cast_align_warning<Node*>(&mMask); + mInfo = reinterpret_cast<uint8_t*>(&mMask); + mNumElements = 0; + mMask = 0; + mMaxNumElementsAllowed = 0; + mInfoInc = InitialInfoInc; + mInfoHashShift = InitialInfoHashShift; + } + + // members are sorted so no padding occurs + Node* mKeyVals = reinterpret_cast_no_cast_align_warning<Node*>(&mMask); // 8 byte 8 + uint8_t* mInfo = reinterpret_cast<uint8_t*>(&mMask); // 8 byte 16 + size_t mNumElements = 0; // 8 byte 24 + size_t mMask = 0; // 8 byte 32 + size_t mMaxNumElementsAllowed = 0; // 8 byte 40 + InfoType mInfoInc = InitialInfoInc; // 4 byte 44 + InfoType mInfoHashShift = InitialInfoHashShift; // 4 byte 48 + // 16 byte 56 if NodeAllocator +}; + +} // namespace detail + +// map + +template <typename Key, typename T, typename Hash = hash<Key>, + typename KeyEqual = std::equal_to<Key>, size_t MaxLoadFactor100 = 80> +using unordered_flat_map = detail::Table<true, MaxLoadFactor100, Key, T, Hash, KeyEqual>; + +template <typename Key, typename T, typename Hash = hash<Key>, + typename KeyEqual = std::equal_to<Key>, size_t MaxLoadFactor100 = 80> +using unordered_node_map = detail::Table<false, MaxLoadFactor100, Key, T, Hash, KeyEqual>; + +template <typename Key, typename T, typename Hash = hash<Key>, + typename KeyEqual = std::equal_to<Key>, size_t MaxLoadFactor100 = 80> +using unordered_map = + detail::Table<sizeof(robin_hood::pair<Key, T>) <= sizeof(size_t) * 6 && + std::is_nothrow_move_constructible<robin_hood::pair<Key, T>>::value && + std::is_nothrow_move_assignable<robin_hood::pair<Key, T>>::value, + MaxLoadFactor100, Key, T, Hash, KeyEqual>; + +// set + +template <typename Key, typename Hash = hash<Key>, typename KeyEqual = std::equal_to<Key>, + size_t MaxLoadFactor100 = 80> +using unordered_flat_set = detail::Table<true, MaxLoadFactor100, Key, void, Hash, KeyEqual>; + +template <typename Key, typename Hash = hash<Key>, typename KeyEqual = std::equal_to<Key>, + size_t MaxLoadFactor100 = 80> +using unordered_node_set = detail::Table<false, MaxLoadFactor100, Key, void, Hash, KeyEqual>; + +template <typename Key, typename Hash = hash<Key>, typename KeyEqual = std::equal_to<Key>, + size_t MaxLoadFactor100 = 80> +using unordered_set = detail::Table<sizeof(Key) <= sizeof(size_t) * 6 && + std::is_nothrow_move_constructible<Key>::value && + std::is_nothrow_move_assignable<Key>::value, + MaxLoadFactor100, Key, void, Hash, KeyEqual>; + +} // namespace robin_hood + +#endif diff --git a/Fltk/helpWindow.cpp b/Fltk/helpWindow.cpp index 911ba489a4fc6aa1c97a78d738da7a9b6ee74e0a..fc6a8ca3f4c8fc327e6bbde0a94811ba7bdd31ac 100644 --- a/Fltk/helpWindow.cpp +++ b/Fltk/helpWindow.cpp @@ -462,7 +462,8 @@ helpWindow::helpWindow() browser->textsize(FL_NORMAL_SIZE - 2); browser->type(FL_MULTI_BROWSER); browser->callback(browser_cb); - browser->tooltip("Double-click to edit value"); + browser->tooltip("Double-click to edit value; selected lines are copied " + "to the clipboard"); { Fl_Group *g = new Fl_Group(0, height - BH - WB, width, BH); diff --git a/Fltk/messageBrowser.h b/Fltk/messageBrowser.h index c5c21203b66da2edda5c314a784347ef6b456577..6bad75f06c25f9955791512cca50d5577e4c7667 100644 --- a/Fltk/messageBrowser.h +++ b/Fltk/messageBrowser.h @@ -68,6 +68,7 @@ public: _browser->textfont(FL_SCREEN); #endif _browser->type(FL_MULTI_BROWSER); + _browser->tooltip("Selected lines are copied to the clipboard"); _browser->end(); end(); resizable(_browser); diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp index 318324064edd2bb64ae52a1f0fe370b0803315fe..353c56bc6ce635cc144cc2fbb43319b9f66c4985 100644 --- a/Fltk/optionWindow.cpp +++ b/Fltk/optionWindow.cpp @@ -581,9 +581,9 @@ static void mesh_options_ok_cb(Fl_Widget *w, void *data) (o->mesh.choice[2]->value() == 3) ? ALGO_2D_FRONTAL : (o->mesh.choice[2]->value() == 4) ? ALGO_2D_BAMG : (o->mesh.choice[2]->value() == 5) ? ALGO_2D_FRONTAL_QUAD : - (o->mesh.choice[2]->value() == 6) ? ALGO_2D_PACK_PRLGRMS : + (o->mesh.choice[2]->value() == 6) ? ALGO_2D_QUAD_QUASI_STRUCT : (o->mesh.choice[2]->value() == 7) ? ALGO_2D_INITIAL_ONLY : - ALGO_2D_AUTO); + ALGO_2D_AUTO); opt_mesh_algo3d(0, GMSH_SET, (o->mesh.choice[3]->value() == 1) ? ALGO_3D_FRONTAL : (o->mesh.choice[3]->value() == 2) ? ALGO_3D_HXT : @@ -2415,8 +2415,7 @@ optionWindow::optionWindow(int deltaFontSize) {"Frontal-Delaunay", 0, nullptr, nullptr}, {"BAMG (experimental)", 0, nullptr, nullptr}, {"Frontal-Delaunay for Quads (experimental)", 0, nullptr, nullptr}, - {"Packing of Parallelograms (experimental, planar only)", 0, nullptr, - nullptr}, + {"Quasi-structured quad (experimental)", 0, nullptr, nullptr}, {"Initial Mesh Only (no node insertion)", 0, nullptr, nullptr}, {nullptr}}; static Fl_Menu_Item menu_3d_algo[] = { diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp index d5a617ef46427d9171b7f821eb39c6a2bf12f540..35c6f99caa397a1efdef944ae1166b9a560b86c4 100644 --- a/Geo/GEdge.cpp +++ b/Geo/GEdge.cpp @@ -345,6 +345,8 @@ std::string GEdge::getAdditionalInfoString(bool multline) sstream << ", bump " << meshAttributes.coeffTransfinite; else if(std::abs(type) == 3) sstream << ", beta " << meshAttributes.coeffTransfinite; + else if(std::abs(type) == 4) + sstream << ", sizemap " << meshAttributes.coeffTransfinite; } if(meshAttributes.extrude && meshAttributes.extrude->mesh.ExtrudeMesh) sstream << " extruded"; @@ -395,8 +397,12 @@ void GEdge::writeGEO(FILE *fp) fprintf(fp, " Using Progression "); else if(std::abs(meshAttributes.typeTransfinite) == 2) fprintf(fp, " Using Bump "); - else + else if(std::abs(meshAttributes.typeTransfinite) == 3) fprintf(fp, " Using Beta "); + else if(std::abs(meshAttributes.typeTransfinite) == 4) + fprintf(fp, " Using Sizemap "); + else + fprintf(fp, " Using Unknown "); fprintf(fp, "%g", meshAttributes.coeffTransfinite); } fprintf(fp, ";\n"); diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp index 621006ff7eeaee73e4381b43bae7d533b18c7e95..1efb5b5714ed2eda4ace32a096b1ca239f37c42b 100644 --- a/Geo/GFace.cpp +++ b/Geo/GFace.cpp @@ -26,6 +26,11 @@ #include "meshGFace.h" #include "meshGFaceOptimize.h" #include "BackgroundMeshTools.h" +#if 0 +// TEST +#include "meshTriangulation.h" +// TEST +#endif #endif #if defined(HAVE_ALGLIB) @@ -1080,7 +1085,7 @@ void GFace::XYZtoUV(double X, double Y, double Z, double &U, double &V, if(!onSurface) return; if(relax < 1.e-6) - Msg::Error("Could not converge: surface mesh will be wrong"); + Msg::Error("Inverse surface mapping could not converge"); else { Msg::Info("point %g %g %g : Relaxation factor = %g", X, Y, Z, 0.75 * relax); XYZtoUV(X, Y, Z, U, V, 0.75 * relax); @@ -1636,6 +1641,11 @@ void GFace::mesh(bool verbose) if(compound.size()) meshAttributes.meshSizeFactor = CTX::instance()->mesh.compoundLcFactor; + // FIXME TEST +#if 0 + GFaceInitialMesh (tag()); +#endif + meshGFace mesher; mesher(this, verbose); diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index fdda0dbffdd9270d09442c16e2b04de93c968d81..365f3adc0008f311afb8260860fbda33090c591a 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -2320,12 +2320,14 @@ void GModel::_storePhysicalTagsInEntities( } if(ge) { - auto it2 = it->second.begin(); - for(; it2 != it->second.end(); ++it2) { + for(auto it2 = it->second.begin(); it2 != it->second.end(); ++it2) { if(std::find(ge->physicals.begin(), ge->physicals.end(), it2->first) == ge->physicals.end()) { ge->physicals.push_back(it2->first); } + if(it2->second.size() && it2->second != "unnamed") + _physicalNames.insert + (std::make_pair(std::make_pair(dim, it2->first), it2->second)); } } } diff --git a/Geo/GModel.h b/Geo/GModel.h index 6171b976876eb7c36d6d23a9d688df6281a650ed..7367c0441a369b69617d97e7dfbcaca0129acbfd 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -769,9 +769,10 @@ public: double scalingFactor = 1.0); // I-deas universal mesh format - int readUNV(const std::string &name); + int readUNV(const std::string &name, bool readGroupsOfElements = true); int writeUNV(const std::string &name, bool saveAll = false, - bool saveGroupsOfNodes = false, double scalingFactor = 1.0); + bool saveGroupsOfElements = true, bool saveGroupsOfNodes = false, + double scalingFactor = 1.0); // Medit (INRIA) mesh format int readMESH(const std::string &name); diff --git a/Geo/GModelIO_OCC.cpp b/Geo/GModelIO_OCC.cpp index 65674b73593119a03773a41ff978de314b75e91a..992e7cd4c3e1cfae36e432697da055f604a2ff22 100644 --- a/Geo/GModelIO_OCC.cpp +++ b/Geo/GModelIO_OCC.cpp @@ -371,7 +371,7 @@ void OCC_Internals::bind(const TopoDS_Solid &solid, int tag, bool recursive) for(exp0.Init(solid, TopAbs_FACE); exp0.More(); exp0.Next()) { TopoDS_Face face = TopoDS::Face(exp0.Current()); if(!_faceTag.IsBound(face)) { - int t = getMaxTag(3) + 1; + int t = getMaxTag(2) + 1; bind(face, t, recursive); } } @@ -574,6 +574,59 @@ void OCC_Internals::unbind(TopoDS_Shape shape, int dim, int tag, bool recursive) } } +void OCC_Internals::unbindWithoutChecks(TopoDS_Shape shape) +{ + TopExp_Explorer exp0; + for(exp0.Init(shape, TopAbs_SOLID); exp0.More(); exp0.Next()) { + TopoDS_Solid solid = TopoDS::Solid(exp0.Current()); + if(_solidTag.IsBound(solid)) { + int tag = _solidTag.Find(solid); + _solidTag.UnBind(solid); + _tagSolid.UnBind(tag); + } + } + for(exp0.Init(shape, TopAbs_SHELL); exp0.More(); exp0.Next()) { + TopoDS_Shell shell = TopoDS::Shell(exp0.Current()); + if(_shellTag.IsBound(shell)) { + int tag = _shellTag.Find(shell); + _shellTag.UnBind(shell); + _tagShell.UnBind(tag); + } + } + for(exp0.Init(shape, TopAbs_FACE); exp0.More(); exp0.Next()) { + TopoDS_Face face = TopoDS::Face(exp0.Current()); + if(_faceTag.IsBound(face)) { + int tag = _faceTag.Find(face); + _faceTag.UnBind(face); + _tagFace.UnBind(tag); + } + } + for(exp0.Init(shape, TopAbs_WIRE); exp0.More(); exp0.Next()) { + TopoDS_Wire wire = TopoDS::Wire(exp0.Current()); + if(_wireTag.IsBound(wire)) { + int tag = _wireTag.Find(wire); + _wireTag.UnBind(wire); + _tagWire.UnBind(tag); + } + } + for(exp0.Init(shape, TopAbs_EDGE); exp0.More(); exp0.Next()) { + TopoDS_Edge edge = TopoDS::Edge(exp0.Current()); + if(_edgeTag.IsBound(edge)) { + int tag = _edgeTag.Find(edge); + _edgeTag.UnBind(edge); + _tagEdge.UnBind(tag); + } + } + for(exp0.Init(shape, TopAbs_VERTEX); exp0.More(); exp0.Next()) { + TopoDS_Vertex vertex = TopoDS::Vertex(exp0.Current()); + if(_vertexTag.IsBound(vertex)) { + int tag = _vertexTag.Find(vertex); + _vertexTag.UnBind(vertex); + _tagVertex.UnBind(tag); + } + } +} + void OCC_Internals::unbind() { for(int i = 0; i < 6; i++) _maxTag[i] = 0; @@ -3440,7 +3493,7 @@ bool OCC_Internals::booleanOperator( Msg::Debug("BOOL (%d,%d) other", dim, tag); } } - for(int dim = -2; dim <= 3; dim++) _recomputeMaxTag(dim); + for(int d = -2; d <= 3; d++) _recomputeMaxTag(d); // bind all remaining entities and add the new ones to the returned list _multiBind(result, -1, outDimTags, false, true, true); _filterTags(outDimTags, minDim); @@ -3672,11 +3725,26 @@ bool OCC_Internals::_transform( return false; } for(std::size_t i = 0; i < inDimTags.size(); i++) { - // FIXME we should implement rebind(object, result, dim) which would - // unbind/bind all subshapes to the same tags int dim = inDimTags[i].first; int tag = inDimTags[i].second; +#if 0 + // safe, but slow: unbind() has linear complexity with respect to the number + // of entities in the model (due to the dependency checking of upward + // adjencencies and the maximum tag update). Using this in a for loop to + // translate copies of entities leads to quadratic complexity. unbind(inShapes[i], dim, tag, true); +#else + // bypass it by unbinding the shape and all its subshapes without checking + // dependencies: this is a bit dangerous, as one could translate e.g. the + // face of a cube (this is not allowed!) - which will unbind the face of the + // cube. But the original face will actually be re-bound (with a warning) at + // the next syncronization point, so it's not too bad... + unbindWithoutChecks(inShapes[i]); + for(int d = -2; d <= 3; d++) _recomputeMaxTag(d); + + // FIXME: it would be even better to code a rebind() function to reuse the + // tags not only of the shape, but of all the sub-shapes as well +#endif bind(outShapes[i], dim, tag, true); } diff --git a/Geo/GModelIO_OCC.h b/Geo/GModelIO_OCC.h index 55b094d27a736ff2187cf4043c6e5aa4cf77ce8f..4680878619eb9a80cbda3e267a2774120ffc1651 100644 --- a/Geo/GModelIO_OCC.h +++ b/Geo/GModelIO_OCC.h @@ -189,6 +189,7 @@ public: void unbind(const TopoDS_Shell &shell, int tag, bool recursive = false); void unbind(const TopoDS_Solid &solid, int tag, bool recursive = false); void unbind(TopoDS_Shape shape, int dim, int tag, bool recursive = false); + void unbindWithoutChecks(TopoDS_Shape shape); void unbind(); // set/get max tag of entity for each dimension (0, 1, 2, 3), as well as diff --git a/Geo/GModelIO_UNV.cpp b/Geo/GModelIO_UNV.cpp index f7cba2529d7f421cd0a9daff54ebb8319e35b062..b6f292f639c2b93f37984738c4776fba18efa481 100644 --- a/Geo/GModelIO_UNV.cpp +++ b/Geo/GModelIO_UNV.cpp @@ -33,7 +33,7 @@ typedef FILE *gmshFILE; #define gmsheof feof #endif -int GModel::readUNV(const std::string &name) +int GModel::readUNV(const std::string &name, bool readGroupsOfElements) { gmshFILE fp = gmshopen(name.c_str(), "r"); if(!fp) { @@ -44,7 +44,9 @@ int GModel::readUNV(const std::string &name) char buffer[256]; std::map<int, std::vector<MElement *> > elements[7]; std::map<int, std::map<int, std::string> > physicals[4]; - + std::map<int, MElement *> elementTags; + std::map<MElement *, std::vector<int>, MElementPtrLessThan> elementGroups; + std::map<int, std::string> groupNames; _vertexMapCache.clear(); while(!gmsheof(fp)) { @@ -74,7 +76,7 @@ int GModel::readUNV(const std::string &name) std::map<int, int> warn; while(gmshgets(buffer, sizeof(buffer), fp)) { if(strlen(buffer) < 3) - continue; // possible line ending after last fscanf + continue; // possible line ending after last fgets if(!strncmp(buffer, " -1", 6)) break; int num, type, elementary, physical, color, numNodes; if(!CTX::instance()->mesh.switchElementTags) { @@ -137,19 +139,21 @@ int GModel::readUNV(const std::string &name) } } int dim = -1; + MElement *e = nullptr; switch(type) { case 11: case 21: case 22: case 31: - elements[0][elementary].push_back(new MLine(vertices, num)); + e = new MLine(vertices, num); + elements[0][elementary].push_back(e); dim = 1; break; case 23: case 24: case 32: - elements[0][elementary].push_back( - new MLine3(vertices[0], vertices[2], vertices[1], num)); + e = new MLine3(vertices[0], vertices[2], vertices[1], num); + elements[0][elementary].push_back(e); dim = 1; break; case 41: @@ -158,7 +162,8 @@ int GModel::readUNV(const std::string &name) case 74: case 81: case 91: - elements[1][elementary].push_back(new MTriangle(vertices, num)); + e = new MTriangle(vertices, num); + elements[1][elementary].push_back(e); dim = 2; break; case 42: @@ -167,9 +172,9 @@ int GModel::readUNV(const std::string &name) case 72: case 82: case 92: - elements[1][elementary].push_back( - new MTriangle6(vertices[0], vertices[2], vertices[4], vertices[1], - vertices[3], vertices[5], num)); + e = new MTriangle6(vertices[0], vertices[2], vertices[4], + vertices[1], vertices[3], vertices[5], num); + elements[1][elementary].push_back(e); dim = 2; break; case 44: @@ -178,7 +183,8 @@ int GModel::readUNV(const std::string &name) case 71: case 84: case 94: - elements[2][elementary].push_back(new MQuadrangle(vertices, num)); + e = new MQuadrangle(vertices, num); + elements[2][elementary].push_back(e); dim = 2; break; case 45: @@ -187,49 +193,58 @@ int GModel::readUNV(const std::string &name) case 75: case 85: case 95: - elements[2][elementary].push_back(new MQuadrangle8( - vertices[0], vertices[2], vertices[4], vertices[6], vertices[1], - vertices[3], vertices[5], vertices[7], num)); + e = new MQuadrangle8(vertices[0], vertices[2], vertices[4], + vertices[6], vertices[1], vertices[3], + vertices[5], vertices[7], num); + elements[2][elementary].push_back(e); dim = 2; break; case 111: - elements[3][elementary].push_back(new MTetrahedron(vertices, num)); + e = new MTetrahedron(vertices, num); + elements[3][elementary].push_back(e); dim = 3; break; case 118: - elements[3][elementary].push_back(new MTetrahedron10( - vertices[0], vertices[2], vertices[4], vertices[9], vertices[1], - vertices[3], vertices[5], vertices[6], vertices[8], vertices[7], - num)); + e = new MTetrahedron10(vertices[0], vertices[2], vertices[4], + vertices[9], vertices[1], vertices[3], + vertices[5], vertices[6], vertices[8], + vertices[7], num); + elements[3][elementary].push_back(e); dim = 3; break; case 104: case 115: - elements[4][elementary].push_back(new MHexahedron(vertices, num)); + e = new MHexahedron(vertices, num); + elements[4][elementary].push_back(e); dim = 3; break; case 105: case 116: - elements[4][elementary].push_back(new MHexahedron20( - vertices[0], vertices[2], vertices[4], vertices[6], vertices[12], - vertices[14], vertices[16], vertices[18], vertices[1], - vertices[7], vertices[8], vertices[3], vertices[9], vertices[5], - vertices[10], vertices[11], vertices[13], vertices[19], - vertices[15], vertices[17], num)); + e = new MHexahedron20(vertices[0], vertices[2], vertices[4], + vertices[6], vertices[12], vertices[14], + vertices[16], vertices[18], vertices[1], + vertices[7], vertices[8], vertices[3], + vertices[9], vertices[5], vertices[10], + vertices[11], vertices[13], vertices[19], + vertices[15], vertices[17], num); + elements[4][elementary].push_back(e); dim = 3; break; case 101: case 112: - elements[5][elementary].push_back(new MPrism(vertices, num)); + e = new MPrism(vertices, num); + elements[5][elementary].push_back(e); dim = 3; break; case 102: case 113: - elements[5][elementary].push_back( - new MPrism15(vertices[0], vertices[2], vertices[4], vertices[9], - vertices[11], vertices[13], vertices[1], vertices[5], - vertices[6], vertices[3], vertices[7], vertices[8], - vertices[10], vertices[14], vertices[12], num)); + e = new MPrism15(vertices[0], vertices[2], vertices[4], + vertices[9], vertices[11], vertices[13], + vertices[1], vertices[5], vertices[6], + vertices[3], vertices[7], vertices[8], + vertices[10], vertices[14], vertices[12], + num); + elements[5][elementary].push_back(e); dim = 3; break; default: @@ -242,14 +257,111 @@ int GModel::readUNV(const std::string &name) (!physicals[dim].count(elementary) || !physicals[dim][elementary].count(physical))) physicals[dim][elementary][physical] = "unnamed"; + + if(e) { + elementTags[num] = e; + elementGroups[e].push_back(elementary); + elementGroups[e].push_back(physical); + } + } + } + else if(record == 2477 || record == 2452 || record == 2435) { + if(!readGroupsOfElements) { + Msg::Info("Ignoring groups (set Mesh.ReadGroupsOfElements to read " + "groups of elements)"); + } + else { + Msg::Info("Reading groups"); + while(gmshgets(buffer, sizeof(buffer), fp)) { + if(strlen(buffer) < 3) + continue; // possible line ending after last fgets + if(!strncmp(buffer, " -1", 6)) break; + int num, constraint, restraint, load, dof, temperature, contact, n; + if(sscanf(buffer, "%d %d %d %d %d %d %d %d", &num, &constraint, + &restraint, &load, &dof, &temperature, &contact, &n) != 8) + break; + if(!gmshgets(buffer, sizeof(buffer), fp)) break; + char name[256]; + if(!sscanf(buffer, "%s", name)) break; + groupNames[num] = name; + int e = 0; + while(e < n) { + if(!gmshgets(buffer, sizeof(buffer), fp)) break; + int type, tag, leaf, comp, type2, tag2, leaf2, comp2; + int r = sscanf(buffer, "%d %d %d %d %d %d %d %d", &type, &tag, + &leaf, &comp, &type2, &tag2, &leaf2, &comp2); + if(r >= 4) { + e++; + if(type == 8) elementGroups[elementTags[tag]].push_back(num); + } + if(r == 8) { + e++; + if(type2 == 8) elementGroups[elementTags[tag2]].push_back(num); + } + if(r != 4 && r != 8) break; + } + } } } - else if(record == 2477) { // groups elements - Msg::Info( - "Discarding element/node groups: currently still reading physical " - "tags directly from elements"); + } + } + + if(groupNames.size()) { + // if element groups are given, create new elementary entity tags for each + // unique combination of (elementary, physical, group(s)), as (elementary, + // physical) has no garantee to be coherent with the element groups (and is + // usually not - see e.g. the UNV files created by ANSA, where e.g. all + // surface elements can be associated with the same (elementary, physical) + // pair but be split amongst (possibly overlapping) element groups) + std::map<std::vector<int>, int> entity; + std::map<int, std::vector<MElement *> > elementsNew[7]; + + int maxgroup = 0; + for(auto g : groupNames) maxgroup = std::max(g.first, maxgroup); + + for(auto &it : elementGroups) { + MElement *e = it.first; + if(e) { + int elementaryNew = 0; + auto ent = entity.find(it.second); + if(ent == entity.end()) { + elementaryNew = entity.size() + 1; + entity[it.second] = elementaryNew; + } + else + elementaryNew = ent->second; + int t = e->getType(); + int k = (t == TYPE_LIN) ? 0 : (t == TYPE_TRI) ? 1 : (t == TYPE_QUA) ? 2 : + (t == TYPE_TET) ? 3 : (t == TYPE_HEX) ? 4 : (t == TYPE_PRI) ? 5 : -1; + int dim = e->getDim(); + if(k >= 0) { + elementsNew[k][elementaryNew].push_back(e); + if(it.second.size() > 2) { + // we have one or more element groups + for(std::size_t g = 2; g < it.second.size(); g++) { + int physicalNew = it.second[g]; + if(!physicals[dim].count(elementaryNew) || + !physicals[dim][elementaryNew].count(physicalNew)) + physicals[dim][elementaryNew][physicalNew] = + groupNames[physicalNew]; + } + } + else if(it.second.size() > 1){ + int physicalNew = CTX::instance()->mesh.switchElementTags ? + it.second[0] : it.second[1]; + // if the group num exists, add an offset (we could also simply not + // define physical groups other than those in the element + // groups... not sure what's best) + if(groupNames.count(physicalNew)) physicalNew += maxgroup; + if(!physicals[dim].count(elementaryNew) || + !physicals[dim][elementaryNew].count(physicalNew)) + physicals[dim][elementaryNew][physicalNew] = "unnamed"; + } + } } } + for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) + elements[i] = elementsNew[i]; } for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++) @@ -281,7 +393,8 @@ static std::string physicalName(GModel *m, int dim, int num) } int GModel::writeUNV(const std::string &name, bool saveAll, - bool saveGroupsOfNodes, double scalingFactor) + bool saveGroupsOfElements, bool saveGroupsOfNodes, + double scalingFactor) { FILE *fp = Fopen(name.c_str(), "w"); if(!fp) { @@ -319,67 +432,71 @@ int GModel::writeUNV(const std::string &name, bool saveAll, } fprintf(fp, "%6d\n", -1); - std::map<int, std::vector<GEntity *> > groups[4]; - getPhysicalGroups(groups); + // save groups of elements and/or groups of nodes, if requested, for each + // physical group + if(saveGroupsOfNodes || saveGroupsOfElements) { - // save groups of elements (and groups of nodes if requested) for each - // physical - fprintf(fp, "%6d\n", -1); - fprintf(fp, "%6d\n", 2477); - for(int dim = 0; dim <= 3; dim++) { - for(auto it = groups[dim].begin(); it != groups[dim].end(); it++) { - std::vector<GEntity *> &entities = it->second; + std::map<int, std::vector<GEntity *> > groups[4]; + getPhysicalGroups(groups); - std::set<MVertex *, MVertexPtrLessThan> nodes; - if(saveGroupsOfNodes) { - for(std::size_t i = 0; i < entities.size(); i++) { - for(std::size_t j = 0; j < entities[i]->getNumMeshElements(); j++) { - MElement *e = entities[i]->getMeshElement(j); - for(std::size_t k = 0; k < e->getNumVertices(); k++) - nodes.insert(e->getVertex(k)); + fprintf(fp, "%6d\n", -1); + fprintf(fp, "%6d\n", 2477); + for(int dim = 0; dim <= 3; dim++) { + for(auto it = groups[dim].begin(); it != groups[dim].end(); it++) { + std::vector<GEntity *> &entities = it->second; + + std::set<MVertex *, MVertexPtrLessThan> nodes; + if(saveGroupsOfNodes) { + for(std::size_t i = 0; i < entities.size(); i++) { + for(std::size_t j = 0; j < entities[i]->getNumMeshElements(); j++) { + MElement *e = entities[i]->getMeshElement(j); + for(std::size_t k = 0; k < e->getNumVertices(); k++) + nodes.insert(e->getVertex(k)); + } } } - } - - int nele = 0; - for(std::size_t i = 0; i < entities.size(); i++) - nele += entities[i]->getNumMeshElements(); - fprintf(fp, "%10d%10d%10d%10d%10d%10d%10d%10d\n", it->first, 0, 0, 0, 0, - 0, 0, (int)nodes.size() + nele); - fprintf(fp, "%s\n", physicalName(this, dim, it->first).c_str()); - - if(saveGroupsOfNodes) { - int row = 0; - for(auto it2 = nodes.begin(); it2 != nodes.end(); it2++) { - if(row == 2) { - fprintf(fp, "\n"); - row = 0; - } - fprintf(fp, "%10d%10ld%10d%10d", 7, (*it2)->getIndex(), 0, 0); - row++; + int nele = 0; + if(saveGroupsOfElements) { + for(std::size_t i = 0; i < entities.size(); i++) + nele += entities[i]->getNumMeshElements(); } - fprintf(fp, "\n"); - } - { - int row = 0; - for(std::size_t i = 0; i < entities.size(); i++) { - for(std::size_t j = 0; j < entities[i]->getNumMeshElements(); j++) { - MElement *e = entities[i]->getMeshElement(j); + fprintf(fp, "%10d%10d%10d%10d%10d%10d%10d%10d\n", it->first, 0, 0, 0, 0, + 0, 0, (int)nodes.size() + nele); + fprintf(fp, "%s\n", physicalName(this, dim, it->first).c_str()); + + if(saveGroupsOfNodes) { + int row = 0; + for(auto it2 = nodes.begin(); it2 != nodes.end(); it2++) { if(row == 2) { fprintf(fp, "\n"); row = 0; } - fprintf(fp, "%10d%10lu%10d%10d", 8, e->getNum(), 0, 0); + fprintf(fp, "%10d%10ld%10d%10d", 7, (*it2)->getIndex(), 0, 0); row++; } + fprintf(fp, "\n"); + } + if(saveGroupsOfElements) { + int row = 0; + for(std::size_t i = 0; i < entities.size(); i++) { + for(std::size_t j = 0; j < entities[i]->getNumMeshElements(); j++) { + MElement *e = entities[i]->getMeshElement(j); + if(row == 2) { + fprintf(fp, "\n"); + row = 0; + } + fprintf(fp, "%10d%10lu%10d%10d", 8, e->getNum(), 0, 0); + row++; + } + } + fprintf(fp, "\n"); } - fprintf(fp, "\n"); } } + fprintf(fp, "%6d\n", -1); } - fprintf(fp, "%6d\n", -1); fclose(fp); return 1; diff --git a/Geo/GModelParametrize.cpp b/Geo/GModelParametrize.cpp index b00bb8d6c9548410601a4fa61c531e9960e7f9f5..5f9df8831c98480aae48262c329ef392c925d56e 100644 --- a/Geo/GModelParametrize.cpp +++ b/Geo/GModelParametrize.cpp @@ -705,6 +705,20 @@ bool computeParametrization(const std::vector<MTriangle *> &triangles, return true; } +#if 0 +static void debugTriangulation(const std::vector<MTriangle *> &triangles, + const std::string &label) +{ + FILE *fp = Fopen("debug.pos", "w"); + if(!fp) return; + fprintf(fp, "View\"%s\"{\n", label.c_str()); + for(auto t : triangles) t->writePOS(fp, false, true, false, false, false, false); + fprintf(fp, "};\n"); + fclose(fp); + exit(1); +} +#endif + static int isTriangulationParametrizable(const std::vector<MTriangle *> &t, int Nmax, std::ostringstream &why) { @@ -736,6 +750,7 @@ static int isTriangulationParametrizable(const std::vector<MTriangle *> &t, } if(bnd.empty()) { why << "poincare characteristic 2 is not 0"; + //debugTriangulation(t, why.str()); return 2; } diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp index 936968d8a03bb90728e6cba30dd1bcb8df17313a..49750cf952540da6b2836923ad55700fc24943de 100644 --- a/Geo/MElement.cpp +++ b/Geo/MElement.cpp @@ -1698,12 +1698,7 @@ void MElement::writeMATLAB(FILE *fp, int filetype, int elementary, int physical, void MElement::writeUNV(FILE *fp, int num, int elementary, int physical) { int type = getTypeForUNV(); - if(!type) { - Msg::Warning("Unknown element type for UNV export (MSH type %d) - " - "output file might be invalid", - getTypeForMSH()); - return; - } + if(!type) return; int n = getNumVertices(); int physical_property = elementary; diff --git a/Geo/MVertex.h b/Geo/MVertex.h index 234b044820e128f131170761d702ef508980e36d..764320e09be6b4bf39e2c103369d690b8226218b 100644 --- a/Geo/MVertex.h +++ b/Geo/MVertex.h @@ -71,6 +71,12 @@ public: _y = y; _z = z; } + void setXYZ(const SPoint3& pt) + { + _x = pt.x(); + _y = pt.y(); + _z = pt.z(); + } // get/set the parent entity GEntity *onWhat() const { return _ge; } diff --git a/Geo/OCCEdge.cpp b/Geo/OCCEdge.cpp index c8554380e75a760ec9f109996f426bd9cf678cfc..2758747dd279fb71bf9d8e9d53eb72ad8aa4588d 100644 --- a/Geo/OCCEdge.cpp +++ b/Geo/OCCEdge.cpp @@ -198,7 +198,7 @@ bool OCCEdge::_project(const double p[3], double &u, double xyz[3]) const GeomAPI_ProjectPointOnCurve proj(pnt, _curve, umin, umax); if(!proj.NbPoints()) { - Msg::Warning("Projection of point (%g, %g, %g) on curve %d failed", p[0], + Msg::Debug("Projection of point (%g, %g, %g) on curve %d failed", p[0], p[1], p[2], tag()); return false; } diff --git a/Geo/OCCFace.cpp b/Geo/OCCFace.cpp index cdc4b132511f47536f69c125ce21a64e7cfeef05..b138da8348d414fc304c628ad427abe81298c965 100644 --- a/Geo/OCCFace.cpp +++ b/Geo/OCCFace.cpp @@ -252,14 +252,14 @@ bool OCCFace::_project(const double p[3], double uv[2], double xyz[3]) const gp_Pnt pnt(p[0], p[1], p[2]); GeomAPI_ProjectPointOnSurf proj(pnt, _occface, umin, umax, vmin, vmax); if(!proj.NbPoints()) { - Msg::Warning("Projection of point (%g, %g, %g) on surface %d failed", p[0], - p[1], p[2], tag()); + Msg::Debug("Projection of point (%g, %g, %g) on surface %d failed", p[0], + p[1], p[2], tag()); return false; } proj.LowerDistanceParameters(uv[0], uv[1]); if(uv[0] < umin || uv[0] > umax || uv[1] < vmin || uv[1] > vmax) - Msg::Warning("Point projection is out of surface parameter bounds"); + Msg::Debug("Point projection is out of surface parameter bounds"); if(xyz) { pnt = proj.NearestPoint(); @@ -294,7 +294,7 @@ SPoint2 OCCFace::parFromPoint(const SPoint3 &qp, bool onSurface) const if(_project(qp.data(), uv, nullptr)) return SPoint2(uv[0], uv[1]); else - return GFace::parFromPoint(qp); + return GFace::parFromPoint(qp, onSurface); } GEntity::GeomType OCCFace::geomType() const diff --git a/Geo/SOrientedBoundingBox.cpp b/Geo/SOrientedBoundingBox.cpp index 48442dd833149b0a6abf99ee0400c14662e0e171..aec868992eae916c107ac61d1ed75b911b00ea4c 100644 --- a/Geo/SOrientedBoundingBox.cpp +++ b/Geo/SOrientedBoundingBox.cpp @@ -22,7 +22,8 @@ #endif SOrientedBoundingRectangle::SOrientedBoundingRectangle() - : center({0.0, 0.0}), size({0.0, 0.0}), axisX({0.0, 0.0}), axisY({0.0, 0.0}) + : center({{0.0, 0.0}}), size({{0.0, 0.0}}), axisX({{0.0, 0.0}}), + axisY({{0.0, 0.0}}) { } diff --git a/Geo/SPoint2.h b/Geo/SPoint2.h index 3c06e087eb648ff45c9f0e01138399090f8088cd..d1ea0342200c553d5a562b4d1c0176ccfca726fa 100644 --- a/Geo/SPoint2.h +++ b/Geo/SPoint2.h @@ -51,6 +51,8 @@ public: if(other.P[1] < P[1]) return true; return false; } + const double *data() const { return P; } + double *data() { return P; } }; inline SPoint2 operator+(const SPoint2 &a, const SPoint2 &b) diff --git a/Geo/SPoint3.h b/Geo/SPoint3.h index ddc14abc9788eb84f8a6f967fa9ae8abc0d46eac..4e85248a8417116e5f15bbc8e904548813fe7f0b 100644 --- a/Geo/SPoint3.h +++ b/Geo/SPoint3.h @@ -8,6 +8,7 @@ #include <cmath> #include <vector> +#include <array> // A point in 3-space class SPoint3 { @@ -86,6 +87,8 @@ public: } return true; } + // implicit conversion to std::array<double, 3> + operator std::array<double, 3>() const { return {{P[0], P[1], P[2]}}; } }; inline SPoint3 operator+(const SPoint3 &a, const SPoint3 &b) diff --git a/Geo/SVector3.h b/Geo/SVector3.h index 43f9caed733e51d3c5cfd10603e5e1f630830913..c803808766e9b0a9de419c9c5c0d1225cf3819cd 100644 --- a/Geo/SVector3.h +++ b/Geo/SVector3.h @@ -9,6 +9,7 @@ #include "SPoint3.h" #include <string> #include <stdio.h> +#include <array> #include "GmshMessage.h" // concrete class for vector of size 3 @@ -132,6 +133,8 @@ public: { for(int i = 0; i < 3; i++) { P[i] += (a * y[i]); } } + // implicit conversion to std::array<double,3> + operator std::array<double, 3>() const { return {{P[0], P[1], P[2]}}; } }; inline double dot(const SVector3 &a, const SVector3 &b) diff --git a/Geo/gmshEdge.cpp b/Geo/gmshEdge.cpp index d98c670b6ae4c17203e4cd0d24b577a141993c54..6769c306bc8bd01d1390ea362d2f80458540a636 100644 --- a/Geo/gmshEdge.cpp +++ b/Geo/gmshEdge.cpp @@ -426,6 +426,10 @@ void gmshEdge::writeGEO(FILE *fp) fprintf(fp, " Using Progression "); else if(std::abs(meshAttributes.typeTransfinite) == 2) fprintf(fp, " Using Bump "); + else if(std::abs(meshAttributes.typeTransfinite) == 3) + fprintf(fp, " Using Beta "); + else if(std::abs(meshAttributes.typeTransfinite) == 4) + fprintf(fp, " Using Sizemap "); fprintf(fp, "%g", meshAttributes.coeffTransfinite); } fprintf(fp, ";\n"); diff --git a/Mesh/BackgroundMesh.cpp b/Mesh/BackgroundMesh.cpp index 8aebcb5f26a74529a9849791013c337a8623044e..c324bc3efd32b8998e1bcc295935373bf72d5f85 100644 --- a/Mesh/BackgroundMesh.cpp +++ b/Mesh/BackgroundMesh.cpp @@ -544,6 +544,13 @@ void backgroundMesh::updateSizes(GFace *_gf) MVertex *V1 = _2Dto3D[v1]; auto s0 = _sizes.find(V0); auto s1 = _sizes.find(V1); + if(s0 == _sizes.end() || s1 == _sizes.end()) { + // Note: this Warning is disabled because it's too verbose in logs + // is this behavior normal ? Was doing undefined behavior before + // (detected by valgrind) + // Msg::Warning("in backgroundMesh::updateSizes(), vertex not found in maps"); + continue; + } if(s0->second < s1->second) s1->second = std::min(s1->second, _beta * s0->second); else @@ -728,3 +735,172 @@ MElement *backgroundMesh::getMeshElementByCoord(double u, double v, double w, } return _octree->find(u, v, w, 2, strict); } + +/* Global variable instanciation */ +std::vector<std::unique_ptr<GlobalBackgroundMesh> > global_bmeshes; + +bool backgroudMeshExists(const std::string &name) +{ + for(size_t i = 0; i < global_bmeshes.size(); ++i) { + if(global_bmeshes[i]->name == name) return true; + } + return false; +} + +GlobalBackgroundMesh &getBackgroundMesh(const std::string &name) +{ + for(size_t i = 0; i < global_bmeshes.size(); ++i) { + if(global_bmeshes[i]->name == name) return *(global_bmeshes[i]); + } + global_bmeshes.push_back( + std::unique_ptr<GlobalBackgroundMesh>(new GlobalBackgroundMesh(name))); + return *(global_bmeshes.back()); +} + +GlobalBackgroundMesh::~GlobalBackgroundMesh() +{ + Msg::Debug("GlobalBackgroundMesh destructor call"); + for(MVertex *v : mesh_vertices) + if(v) { + delete v; + v = nullptr; + } + mesh_vertices.clear(); + edgeBackgroundMeshes.clear(); + faceBackgroundMeshes.clear(); +} + +int GlobalBackgroundMesh::importGModelMeshes(GModel *_gm, + bool overwriteExisting) +{ + Msg::Debug("GlobalBackgroundMesh: import GModel mesh ..."); + gm = _gm; + + if(overwriteExisting && mesh_vertices.size() > 0) { /* Clear mesh */ + Msg::Debug("- delete existing mesh (for overwrite)"); + for(MVertex *v : mesh_vertices) + if(v) { + delete v; + v = nullptr; + } + mesh_vertices.clear(); + edgeBackgroundMeshes.clear(); + faceBackgroundMeshes.clear(); + Msg::Debug("- import mesh from GModel"); + } + + std::unordered_map<MVertex *, MVertex *> old2new; + + std::set<GVertex *, GEntityPtrLessThan> vertices = gm->getVertices(); + std::set<GEdge *, GEntityPtrLessThan> edges = gm->getEdges(); + for(GFace *gf : gm->getFaces()) { + for(GVertex *e : gf->embeddedVertices()) vertices.insert(e); + for(GEdge *e : gf->embeddedEdges()) edges.insert(e); + } + + /* MVertex from GVertex */ + mesh_vertices.reserve(mesh_vertices.size() + vertices.size()); + for(GVertex *gv : vertices) { + for(size_t i = 0; i < gv->mesh_vertices.size(); ++i) { + MVertex *v = gv->mesh_vertices[i]; + auto it = old2new.find(v); + if(it == old2new.end()) { + mesh_vertices.push_back(new MVertex(v->x(), v->y(), v->z(), gv)); + old2new[v] = mesh_vertices.back(); + } + } + } + + /* MLine from GEdge */ + size_t nlines = 0; + for(GEdge *ge : edges) { + edgeBackgroundMeshes[ge] = BackgroundMeshGEdge(); + BackgroundMeshGEdge &bm = edgeBackgroundMeshes[ge]; + bm.ge = ge; + for(size_t i = 0; i < ge->mesh_vertices.size(); ++i) { + MVertex *v = ge->mesh_vertices[i]; + double t = 0.; + v->setParameter(0, t); + auto it = old2new.find(v); + if(it == old2new.end()) { + mesh_vertices.push_back(new MEdgeVertex(v->x(), v->y(), v->z(), ge, t)); + old2new[v] = mesh_vertices.back(); + } + } + bm.lines.reserve(ge->lines.size()); + for(size_t i = 0; i < ge->lines.size(); ++i) { + MElement *elt = ge->lines[i]; + MVertex *v0 = old2new[elt->getVertex(0)]; + MVertex *v1 = old2new[elt->getVertex(1)]; + if(v0 == NULL || v1 == NULL) { + Msg::Error("GlobalBackgroundMesh: failed to import mesh (1)"); + // Note: some vertex are stored outside the GModel ? + return -1; + } + bm.lines.push_back(MLine(v0, v1)); + nlines += 1; + } + } + + /* MTriangle from GFace */ + size_t ntris = 0; + for(GFace *gf : gm->getFaces()) { + faceBackgroundMeshes[gf] = BackgroundMeshGFace(); + BackgroundMeshGFace &bm = faceBackgroundMeshes[gf]; + bm.gf = gf; + /* Vertices */ + for(size_t i = 0; i < gf->mesh_vertices.size(); ++i) { + MVertex *v = gf->mesh_vertices[i]; + auto it = old2new.find(v); + if(it == old2new.end()) { + double uv0 = 0.; + double uv1 = 0.; + v->getParameter(0, uv0); + v->getParameter(1, uv1); + mesh_vertices.push_back( + new MFaceVertex(v->x(), v->y(), v->z(), gf, uv0, uv1)); + old2new[v] = mesh_vertices.back(); + } + } + + bm.triangles.reserve(gf->triangles.size() + 2 * gf->quadrangles.size()); + /* Triangles */ + for(size_t i = 0; i < gf->triangles.size(); ++i) { + MElement *elt = gf->triangles[i]; + MVertex *v0 = old2new[elt->getVertex(0)]; + MVertex *v1 = old2new[elt->getVertex(1)]; + MVertex *v2 = old2new[elt->getVertex(2)]; + if(v0 == NULL || v1 == NULL || v2 == NULL) { + Msg::Error("GlobalBackgroundMesh: failed to import mesh (2)"); + // Note: some vertex are stored outside the GModel ? + return -1; + } + bm.triangles.push_back(MTriangle(v0, v1, v2)); + ntris += 1; + } + + /* Quads */ + if(gf->quadrangles.size() > 0) { + for(size_t i = 0; i < gf->quadrangles.size(); ++i) { + MElement *elt = gf->quadrangles[i]; + MVertex *v0 = old2new[elt->getVertex(0)]; + MVertex *v1 = old2new[elt->getVertex(1)]; + MVertex *v2 = old2new[elt->getVertex(2)]; + MVertex *v3 = old2new[elt->getVertex(3)]; + if(v0 == NULL || v1 == NULL || v2 == NULL || v3 == NULL) { + Msg::Error("GlobalBackgroundMesh: failed to import mesh (3)"); + // Note: some vertex are stored outside the GModel ? + return -1; + } + bm.triangles.push_back(MTriangle(v0, v1, v2)); + bm.triangles.push_back(MTriangle(v0, v2, v3)); + ntris += 2; + } + } + } + + Msg::Debug("- imported: %li vertices, %li lines, %li triangles", + old2new.size(), nlines, ntris); + + return 0; +} diff --git a/Mesh/BackgroundMesh.h b/Mesh/BackgroundMesh.h index 4ae50cabe4dc820c16f7f9757af31488e377d28f..b535a0aa1ac2156b0f6deba8c6b749523d1814bb 100644 --- a/Mesh/BackgroundMesh.h +++ b/Mesh/BackgroundMesh.h @@ -8,15 +8,21 @@ #include <cmath> #include <vector> +#include <unordered_map> #include <list> +#include <memory> #include "simpleFunction.h" #include "BackgroundMeshTools.h" +#include "MLine.h" +#include "MTriangle.h" #if defined(HAVE_ANN) #include "ANN/ANN.h" class ANNkd_tree; #endif +class GEntity; +class GModel; class MElementOctree; class GFace; class GEdge; @@ -116,4 +122,63 @@ public: } }; +/************************************************************/ +/* Alternative datastructures for storing background meshes */ +/************************************************************/ + +struct BackgroundMeshGEdge { + GEdge *ge = NULL; + std::vector<MLine> lines; +}; + +struct BackgroundMeshGFace { + GFace *gf = NULL; + std::vector<MTriangle> triangles; +}; + +/* @brief Store a collection of GEntity background meshes. + * Deal with the mesh import (see importEntityMeshes()) + * New MVertex* instance are created by the import + * and are deleted by the destructor. + */ +class GlobalBackgroundMesh { +public: + const std::string &name; + GModel *gm; + std::unordered_map<GEdge *, BackgroundMeshGEdge> edgeBackgroundMeshes; + std::unordered_map<GFace *, BackgroundMeshGFace> faceBackgroundMeshes; + std::vector<MVertex *> mesh_vertices; + +public: + GlobalBackgroundMesh(const std::string &_name) : name(_name), gm(NULL) {} + GlobalBackgroundMesh(GlobalBackgroundMesh const &) = delete; + GlobalBackgroundMesh &operator=(GlobalBackgroundMesh const &) = delete; + ~GlobalBackgroundMesh(); /* delete the MVertex instances stored in + mesh_vertices */ + + /** + * @brief Fill the entityMesh map by copying the meshes in the GModel. + * New MVertex, MLine and MTriangle instances are created, the + * background meshes are totally independant from the ones in the GModel after + * this function call. + * Quadrangles in GFace are split into two triangles. + * + * @param gm the GModel containing the GEntity whose meshes are imported + * @param overwriteExisting Delete existing background meshes before importing + * new ones + * + * @warning Only import GVertex, GEdge, GFace for the moment, not GRegion + * + * @return 0 if successful import + */ + int importGModelMeshes(GModel *gm, bool overwriteExisting = true); +}; + +/* Global storage for access deep in meshing algorithms without passing + * reference everywhere. Use getBackgroundMesh(name) instead of direcly + * accessing the global variable. */ +extern std::vector<std::unique_ptr<GlobalBackgroundMesh> > global_bmeshes; +bool backgroudMeshExists(const std::string &name); +GlobalBackgroundMesh &getBackgroundMesh(const std::string &name); + #endif diff --git a/Mesh/CMakeLists.txt b/Mesh/CMakeLists.txt index 53241f650eccdf89367c00a2817c3adf28765b06..b9e7c34178322813cd47594a4fa996e63a05906c 100644 --- a/Mesh/CMakeLists.txt +++ b/Mesh/CMakeLists.txt @@ -19,6 +19,7 @@ set(SRC meshGRegionLocalMeshMod.cpp meshGRegionMMG.cpp meshGRegionBoundaryLayer.cpp meshRelocateVertex.cpp + meshTriangulation.cpp meshMetric.cpp BackgroundMesh.cpp BackgroundMeshTools.cpp qualityMeasures.cpp qualityMeasuresJacobian.cpp @@ -33,6 +34,8 @@ set(SRC filterElements.cpp gmshCrossFields.cpp automaticMeshSizeField.cpp + meshQuadQuasiStructured.cpp + meshOctreeLibOL.cpp ) file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp index 320f9e51a28c1d8fbf5c2cc153c82e4dd17cb138..252497dbb32b96092a9379e3f5448c98869d765f 100644 --- a/Mesh/Field.cpp +++ b/Mesh/Field.cpp @@ -1535,12 +1535,22 @@ public: } return v; } + virtual bool isotropic() const { PView *v = getView(); if(v && v->getData()->getNumTensors()) return false; return true; } + + virtual int numComponents() const + { + PView *v = getView(); + if(v && v->getData()->getNumTensors()) return 9; + if(v && v->getData()->getNumVectors()) return 3; + return 1; + } + double operator()(double x, double y, double z, GEntity *ge = nullptr) { PView *v = getView(); @@ -1550,14 +1560,79 @@ public: _octree = new OctreePost(v); updateNeeded = false; } + double l = 0.; // use large tolerance (in element reference coordinates) to maximize chance // of finding an element - if(!_octree->searchScalarWithTol(x, y, z, &l, 0, nullptr, 0.05)) - Msg::Info("No scalar element found containing point (%g,%g,%g)", x, y, z); + if(numComponents() == 3) { // scaled cross field + double values[3]; + if(!_octree->searchVectorWithTol(x, y, z, values, 0, nullptr, 0.05)) { + if(!_octree->searchVectorWithTol(x, y, z, values, 0, nullptr, .1)) { + Msg::Debug("Field sampling: no vector element found containing point " + "(%g,%g,%g) (for norm)", + x, y, z); + } + else { + l = sqrt(values[0] * values[0] + values[1] * values[1] + + values[2] * values[2]); + } + } + else { + l = sqrt(values[0] * values[0] + values[1] * values[1] + + values[2] * values[2]); + } + } + else if(numComponents() == 1) { + if(!_octree->searchScalarWithTol(x, y, z, &l, 0, nullptr, 0.05)) { + Msg::Debug( + "Field sampling: no scalar element found containing point (%g,%g,%g)", + x, y, z); + } + } + else { + Msg::Error("Field sampling: no view with the right dimension", x, y, z); + } + if(l <= 0 && _cropNegativeValues) return MAX_LC; return l; } + + void operator()(double x, double y, double z, SVector3 &v, GEntity *ge = 0) + { + PView *vie = getView(); + if(!vie) { + Msg::Error("PostViewField: no view"); + v.data()[0] = MAX_LC; + v.data()[1] = MAX_LC; + v.data()[2] = MAX_LC; + return; + } + if(updateNeeded) { + if(_octree) delete _octree; + _octree = new OctreePost(vie); + updateNeeded = false; + } + if(numComponents() == 3) { // scaled cross field + double values[3]; + if(!_octree->searchVectorWithTol(x, y, z, values, 0, nullptr, .05)) { + if(!_octree->searchVectorWithTol(x, y, z, values, 0, nullptr, .1)) { + Msg::Debug("Field sampling: no vector element found containing point " + "(%g,%g,%g)", + x, y, z); + } + else { + v = SVector3(values[0], values[1], values[2]); + } + } + else { + v = SVector3(values[0], values[1], values[2]); + } + } + else { + Msg::Error("Field sampling: no vector element"); + } + } + void operator()(double x, double y, double z, SMetric3 &metr, GEntity *ge = nullptr) { @@ -1572,7 +1647,9 @@ public: // use large tolerance (in element reference coordinates) to maximize chance // of finding an element if(!_octree->searchTensorWithTol(x, y, z, l, 0, nullptr, 0.05)) - Msg::Info("No tensor element found containing point (%g,%g,%g)", x, y, z); + Msg::Debug( + "Field sampling: no tensor element found containing point (%g,%g,%g)", + x, y, z); if(0 && _cropNegativeValues) { if(l[0] <= 0 && l[1] <= 0 && l[2] <= 0 && l[3] <= 0 && l[4] <= 0 && l[5] <= 0 && l[6] <= 0 && l[7] <= 0 && l[8] <= 0) { @@ -2838,17 +2915,19 @@ void BoundaryLayerField::setupFor1d(int iE) if(!found) { GEdge *ge = GModel::current()->getEdgeByTag(iE); - GVertex *gv0 = ge->getBeginVertex(); - if(gv0) { - found = std::find(_pointTagsSaved.begin(), _pointTagsSaved.end(), - gv0->tag()) != _pointTagsSaved.end(); - if(found) _pointTags.push_back(gv0->tag()); - } - GVertex *gv1 = ge->getEndVertex(); - if(gv1) { - found = std::find(_pointTagsSaved.begin(), _pointTagsSaved.end(), - gv1->tag()) != _pointTagsSaved.end(); - if(found) _pointTags.push_back(gv1->tag()); + if(ge) { + GVertex *gv0 = ge->getBeginVertex(); + if(gv0) { + found = std::find(_pointTagsSaved.begin(), _pointTagsSaved.end(), + gv0->tag()) != _pointTagsSaved.end(); + if(found) _pointTags.push_back(gv0->tag()); + } + GVertex *gv1 = ge->getEndVertex(); + if(gv1) { + found = std::find(_pointTagsSaved.begin(), _pointTagsSaved.end(), + gv1->tag()) != _pointTagsSaved.end(); + if(found) _pointTags.push_back(gv1->tag()); + } } } removeAttractors(); @@ -2875,6 +2954,7 @@ bool BoundaryLayerField::setupFor2d(int iF) // OR (better) CHANGE THE PHILOSOPHY GFace *gf = GModel::current()->getFaceByTag(iF); + if(!gf) return false; std::vector<GEdge *> ed = gf->edges(); std::vector<GEdge *> const &embedded_edges = gf->embeddedEdges(); ed.insert(ed.begin(), embedded_edges.begin(), embedded_edges.end()); @@ -2961,16 +3041,18 @@ void BoundaryLayerField::computeFor1dMesh(double x, double y, double z, double distk = 1.e22; for(auto it = _pointTags.begin(); it != _pointTags.end(); ++it) { GVertex *v = GModel::current()->getVertexByTag(*it); - double xp = v->x(); - double yp = v->y(); - double zp = v->z(); - const double dist = - sqrt((x - xp) * (x - xp) + (y - yp) * (y - yp) + (z - zp) * (z - zp)); - if(dist < distk) { - distk = dist; - xpk = xp; - ypk = yp; - zpk = zp; + if(v) { + double xp = v->x(); + double yp = v->y(); + double zp = v->z(); + const double dist = + sqrt((x - xp) * (x - xp) + (y - yp) * (y - yp) + (z - zp) * (z - zp)); + if(dist < distk) { + distk = dist; + xpk = xp; + ypk = yp; + zpk = zp; + } } } @@ -3012,6 +3094,7 @@ void BoundaryLayerField::operator()(DistanceField *cc, double dist, double x, double beta = CTX::instance()->mesh.smoothRatio; if(pp.first.dim == 0) { GVertex *v = GModel::current()->getVertexByTag(pp.first.ent); + if(!v) return; SVector3 t1; if(dist < thickness) { t1 = SVector3(1, 0, 0); } else { @@ -3022,6 +3105,7 @@ void BoundaryLayerField::operator()(DistanceField *cc, double dist, double x, } else if(pp.first.dim == 1) { GEdge *e = GModel::current()->getEdgeByTag(pp.first.ent); + if(!e) return; if(dist < thickness) { SVector3 t1 = e->firstDer(pp.first.u); double crv = e->curvature(pp.first.u); @@ -3043,6 +3127,7 @@ void BoundaryLayerField::operator()(DistanceField *cc, double dist, double x, } else { GFace *gf = GModel::current()->getFaceByTag(pp.first.ent); + if(!gf) return; if(dist < thickness) { double cmin, cmax; SVector3 dirMax, dirMin; diff --git a/Mesh/Field.h b/Mesh/Field.h index 98cd07e8182027cc5342272ceae8a658523ed627..8a56958cb1af932dc62e2685b9bc566271d96dab 100644 --- a/Mesh/Field.h +++ b/Mesh/Field.h @@ -108,10 +108,16 @@ public: int id; std::map<std::string, FieldOption *> options; std::map<std::string, FieldCallback *> callbacks; + virtual int numComponents() const { return 1; } virtual bool isotropic() const { return true; } // isotropic virtual double operator()(double x, double y, double z, GEntity *ge = nullptr) = 0; + // vector value + virtual void operator()(double x, double y, double z, SVector3 &, + GEntity *ge = 0) + { + } // anisotropic virtual void operator()(double x, double y, double z, SMetric3 &, GEntity *ge = nullptr) diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 9aacfdd25925c198fe89e1b5136dd5b9da1145cf..79f2924447c558524db7a215c571c15c613751b8 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -34,6 +34,7 @@ #include "Field.h" #include "Options.h" #include "Generator.h" +#include "meshQuadQuasiStructured.h" #if defined(_OPENMP) #include <omp.h> @@ -553,6 +554,18 @@ static void Mesh2D(GModel *m) Msg::SetNumThreads(prevNumThreads); + if(CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + /* In the quasi-structured pipeline, the quad-dominant mesh + * is subdivided into a full quad mesh */ + /* TODO: - a faster CAD projection approach (from uv) + * - verify quality during projection */ + // bool linear = false; + // RefineMesh(m, linear, true, false); + RefineMeshWithBackgroundMeshProjection(m); + + OptimizeMesh(m, "QuadQuasiStructured"); + } + double t2 = Cpu(), w2 = TimeOfDay(); CTX::instance()->meshTimer[1] = w2 - w1; Msg::StatusBar(true, "Done meshing 2D (Wall %gs, CPU %gs)", @@ -983,7 +996,9 @@ void OptimizeMesh(GModel *m, const std::string &how, bool force, int niter) if(how != "" && how != "Gmsh" && how != "Optimize" && how != "Netgen" && how != "HighOrder" && how != "HighOrderElastic" && how != "HighOrderFastCurving" && how != "Laplace2D" && - how != "Relocate2D" && how != "Relocate3D") { + how != "Relocate2D" && how != "Relocate3D" && + how != "DiskQuadrangulation" && how != "QuadCavityRemeshing" && + how != "QuadQuasiStructured") { Msg::Error("Unknown mesh optimization method '%s'", how.c_str()); return; } @@ -1065,6 +1080,51 @@ void OptimizeMesh(GModel *m, const std::string &how, bool force, int niter) RelocateVertices(gr, niter); } } + else if(how == "DiskQuadrangulation") { + for(GFace *gf : m->getFaces()) + if(gf->meshStatistics.status == GFace::DONE) { + gf->meshStatistics.status = GFace::PENDING; + } + + transferSeamGEdgesVerticesToGFace(m); + optimizeTopologyWithDiskQuadrangulationRemeshing(m); + + for(GFace *gf : m->getFaces()) + if(gf->meshStatistics.status == GFace::PENDING) { + gf->meshStatistics.status = GFace::DONE; + } + } + else if(how == "QuadCavityRemeshing") { + for(GFace *gf : m->getFaces()) + if(gf->meshStatistics.status == GFace::DONE) { + gf->meshStatistics.status = GFace::PENDING; + } + + transferSeamGEdgesVerticesToGFace(m); + optimizeTopologyWithCavityRemeshing(m); + + for(GFace *gf : m->getFaces()) + if(gf->meshStatistics.status == GFace::PENDING) { + gf->meshStatistics.status = GFace::DONE; + } + } + else if(how == "QuadQuasiStructured") { + /* The following methods only act on faces whose status is PENDING */ + for(GFace *gf : m->getFaces()) + if(gf->meshStatistics.status == GFace::DONE) { + gf->meshStatistics.status = GFace::PENDING; + } + + transferSeamGEdgesVerticesToGFace(m); + quadMeshingOfSimpleFacesWithPatterns(m); + optimizeTopologyWithDiskQuadrangulationRemeshing(m); + optimizeTopologyWithCavityRemeshing(m); + + for(GFace *gf : m->getFaces()) + if(gf->meshStatistics.status == GFace::PENDING) { + gf->meshStatistics.status = GFace::DONE; + } + } if(Msg::GetVerbosity() > 98) std::for_each(m->firstRegion(), m->lastRegion(), @@ -1393,8 +1453,6 @@ void GenerateMesh(GModel *m, int ask) m->clearLastMeshEntityError(); m->clearLastMeshVertexError(); - int old = m->getMeshStatus(false); - // Initialize pseudo random mesh generator with the same seed srand(CTX::instance()->mesh.randomSeed); @@ -1403,6 +1461,51 @@ void GenerateMesh(GModel *m, int ask) SetOrder1(m, false, true); FixPeriodicMesh(m); + // Some meshing algorithms require a global background mesh + // and a guiding field (e.g. cross field + size map) + QuadqsContextUpdater *qqs = nullptr; + if(CTX::instance()->mesh.algo2d == ALGO_2D_PACK_PRLGRMS || + CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + int old = m->getMeshStatus(false); + bool doIt = (ask >= 1 && ask <= 3); + bool exists = backgroundMeshAndGuidingFieldExists(m); + if(old == 1 && ask == 1 && exists) doIt = true; + if(old == 1 && ask == 2 && exists) doIt = false; + if(old == 2 && ask == 2 && exists) doIt = true; + if(doIt) { + bool overwriteGModelMesh = false; /* use current mesh if available */ + bool deleteGModelMeshAfter = + true; /* mesh saved in background, no longer needed */ + BuildBackgroundMeshAndGuidingField(m, overwriteGModelMesh, + deleteGModelMeshAfter); + } + + if(CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT + && old == 2 && ask == 2 && exists) { + /* transferSeamGEdgesVerticesToGFace() called by quadqs remove the 1D + * meshes of the seam GEdge, so 2D initial meshing does not work without + * first remeshing the seam GEdge. We delete the whole mesh by security */ + m->deleteMesh(); + } + + if(CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + /* note: the creation of QuadqsContextUpdater modifies many + * meshing parameters */ + qqs = new QuadqsContextUpdater(); + } + + if(CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + std::set<GFace *> faces; + for(GFace *gf : m->getFaces()) + if(gf->edges().size() == 4) { faces.insert(gf); } + double maxDiffRel = 0.34; /* do not deviate more than 34% from size map */ + MeshSetTransfiniteFacesAutomatic(faces, 2.35, true, maxDiffRel); + } + } + + // dimension of previous/existing mesh + int old = m->getMeshStatus(false); + // 1D mesh if(ask == 1 || (ask > 1 && old < 1)) { std::for_each(m->firstRegion(), m->lastRegion(), deMeshGRegion()); @@ -1475,6 +1578,8 @@ void GenerateMesh(GModel *m, int ask) Msg::PrintErrorCounter("Mesh generation error summary"); + if(qqs != nullptr) delete qqs; + CTX::instance()->lock = 0; // ProfilerStop(); } diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp index 4671152241c283d99b5ca080410eabe44b29d263..bd1439d17722c4f98dcffdf7710b532a4fb02393 100644 --- a/Mesh/meshGEdge.cpp +++ b/Mesh/meshGEdge.cpp @@ -621,6 +621,14 @@ int meshGEdgeProcessing(GEdge *ge, const double t_begin, double t_end, int &N, a = 0.; N = 1; } + else if(ge->meshAttributes.method == MESH_TRANSFINITE && + ge->meshAttributes.typeTransfinite == 4) { + // Transfinite (prescribed number of edges) but the points are positioned + // according to the standard size constraints (size map, etc) + a = Integration(ge, t_begin, t_end, F_Lc(), Points, + CTX::instance()->mesh.lcIntegrationPrecision); + N = ge->meshAttributes.nbPointsTransfinite; + } else if(ge->meshAttributes.method == MESH_TRANSFINITE) { a = Integration(ge, t_begin, t_end, F_Transfinite(), Points, CTX::instance()->mesh.lcIntegrationPrecision); @@ -805,7 +813,9 @@ void meshGEdge::operator()(GEdge *ge) mesh_vertices = vv; } - if(CTX::instance()->mesh.algo2d != ALGO_2D_BAMG) + if(CTX::instance()->mesh.algo2d != ALGO_2D_BAMG && + CTX::instance()->mesh.algo2d != ALGO_2D_QUAD_QUASI_STRUCT && + CTX::instance()->mesh.algo2d != ALGO_2D_PACK_PRLGRMS) if(_addBegin.empty() && _addEnd.empty()) filterPoints(ge, filterMinimumN - 2); @@ -828,6 +838,10 @@ void meshGEdge::operator()(GEdge *ge) v0->y() = beg_p.y(); v0->z() = beg_p.z(); } + + Msg::Debug("Meshing curve %d (%s): %li interior vertices", ge->tag(), + ge->getTypeString().c_str(), ge->mesh_vertices.size()); + ge->meshStatistics.status = GEdge::DONE; } diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp index f945b2ec2ead1f059305830bbae6ac1b7875b3d8..ac77288cded92584241e62b57ba591bdce5cfe3a 100644 --- a/Mesh/meshGFace.cpp +++ b/Mesh/meshGFace.cpp @@ -41,6 +41,10 @@ // define this to use the old initial delaunay #define OLD_CODE_DELAUNAY 1 +#ifndef OLD_CODE_DELAUNAY +#include "meshTriangulation.h" +#endif + bool pointInsideParametricDomain(std::vector<SPoint2> &bnd, SPoint2 &p, SPoint2 &out, int &N) { @@ -1368,44 +1372,52 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, } #else { - std::vector<MVertex *> v; - std::vector<MTriangle *> result; - v.insert(v.end(), all_vertices.begin(), all_vertices.end()); + // New Stuff comes here --> it actually does everything + // -- triangulate points + // -- recover edges + // -- color triangles - std::map<MVertex *, SPoint3> pos; - for(std::size_t i = 0; i < v.size(); i++) { - MVertex *v0 = v[i]; - BDS_Point *p0 = recoverMapInv[v0]; - pos[v0] = SPoint3(v0->x(), v0->y(), v0->z()); - v0->setXYZ(p0->u, p0->v, 0.0); + std::vector<GEdge *> temp; + if(replacement_edges) { + temp = gf->edges(); + gf->set(*replacement_edges); } - delaunayMeshIn2D(v, result, 0); + // TEST --> recover and color so most of the code below + // can go away. Works also for periodic faces + GFaceInitialMesh(gf->tag(), 1); + + PolyMesh *pm = GFaceInitialMesh(gf->tag(), 1); + + if(replacement_edges) { gf->set(temp); } - for(std::size_t i = 0; i < v.size() - 4; i++) { - MVertex *v0 = v[i]; - SPoint3 pp = pos[v0]; - v0->setXYZ(pp.x(), pp.y(), pp.z()); + std::map<int, BDS_Point *> aaa; + for(auto it = all_vertices.begin(); it != all_vertices.end(); it++) { + MVertex *here = *it; + aaa[here->getNum()] = recoverMapInv[here]; } - // add the four corners for(int ip = 0; ip < 4; ip++) { - MVertex *vv = v[v.size() - ip - 1]; - BDS_Point *pp = m->add_point(-ip - 1, vv->x(), vv->y(), gf); + PolyMesh::Vertex *v = pm->vertices[ip]; + v->data = -ip - 1; + BDS_Point *pp = + m->add_point(v->data, v->position.x(), v->position.y(), gf); m->add_geom(gf->tag(), 2); - recoverMapInv[vv] = pp; BDS_GeomEntity *g = m->get_geom(gf->tag(), 2); pp->g = g; + aaa[v->data] = pp; } - // add the triangles - for(std::size_t i = 0; i < result.size(); i++) { - MVertex *v0 = result[i]->getVertex(0); - MVertex *v1 = result[i]->getVertex(1); - MVertex *v2 = result[i]->getVertex(2); - BDS_Point *p0 = recoverMapInv[v0]; - BDS_Point *p1 = recoverMapInv[v1]; - BDS_Point *p2 = recoverMapInv[v2]; - m->add_triangle(p0->iD, p1->iD, p2->iD); + + for(size_t i = 0; i < pm->faces.size(); i++) { + PolyMesh::HalfEdge *he = pm->faces[i]->he; + int a = he->v->data; + int b = he->next->v->data; + int c = he->next->next->v->data; + BDS_Point *p1 = aaa[a]; + BDS_Point *p2 = aaa[b]; + BDS_Point *p3 = aaa[c]; + m->add_triangle(p1->iD, p2->iD, p3->iD); } + delete pm; } #endif @@ -1706,7 +1718,8 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS || gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR) { infty = true; - if(!onlyInitialMesh) buildBackgroundMesh(gf, false); + /* New version of PACK / QUADQS use a different background mesh */ + // if(!onlyInitialMesh) buildBackgroundMesh(gf, false); } if(!onlyInitialMesh) @@ -1723,7 +1736,8 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, bowyerWatsonParallelograms(gf); } else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR) { - bowyerWatsonParallelogramsConstrained(gf, gf->constr_vertices); + Msg::Error("ALGO_2D_PACK_PRLGRMS_CSTR deprecated"); + // bowyerWatsonParallelogramsConstrained(gf, gf->constr_vertices); } else if(gf->getMeshingAlgo() == ALGO_2D_DELAUNAY || gf->getMeshingAlgo() == ALGO_2D_AUTO) { @@ -1733,6 +1747,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, bowyerWatson(gf, 15000); meshGFaceBamg(gf); } + if(!infty || !(CTX::instance()->mesh.recombineAll || gf->meshAttributes.recombine)) laplaceSmoothing(gf, CTX::instance()->mesh.nbSmoothing, infty); @@ -1763,7 +1778,8 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, !onlyInitialMesh && CTX::instance()->mesh.algoRecombine <= 1) { bool blossom = (CTX::instance()->mesh.algoRecombine == 1); int topo = CTX::instance()->mesh.recombineOptimizeTopology; - recombineIntoQuads(gf, blossom, topo, true, 0.1); + bool nodeRepositioning = false; + recombineIntoQuads(gf, blossom, topo, nodeRepositioning, 0.1); } computeElementShapes(gf, gf->meshStatistics.worst_element_shape, @@ -2071,6 +2087,12 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, } if(CTX::instance()->debugSurface > 0) debug = true; + // TEST !!! +#ifndef OLD_CODE_DELAUNAY + // PolyMesh * pm = GFaceInitialMesh (gf->tag(), 1); +#endif + // TEST !!! + std::map<BDS_Point *, MVertex *, PointLessThan> recoverMap; std::multimap<MVertex *, BDS_Point *> recoverMultiMapInv; @@ -2753,7 +2775,8 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS || gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR) { infty = true; - buildBackgroundMesh(gf, false, &equivalence, ¶metricCoordinates); + /* New version of PACK / QUADQS use a different background mesh */ + // buildBackgroundMesh(gf, false, &equivalence, ¶metricCoordinates); } bool onlyInitialMesh = (gf->getMeshingAlgo() == ALGO_2D_INITIAL_ONLY); @@ -2779,9 +2802,11 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, bowyerWatsonFrontalLayers(gf, true, &equivalence, ¶metricCoordinates); else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS) bowyerWatsonParallelograms(gf, &equivalence, ¶metricCoordinates); - else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR) - bowyerWatsonParallelogramsConstrained( - gf, gf->constr_vertices, &equivalence, ¶metricCoordinates); + else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR) { + Msg::Error("ALGO_2D_PACK_PRLGRMS_CSTR deprecated"); + // bowyerWatsonParallelogramsConstrained( + // gf, gf->constr_vertices, &equivalence, ¶metricCoordinates); + } else if(gf->getMeshingAlgo() == ALGO_2D_DELAUNAY || gf->getMeshingAlgo() == ALGO_2D_AUTO) bowyerWatson(gf, 1000000000, &equivalence, ¶metricCoordinates); @@ -2807,7 +2832,12 @@ static bool meshGeneratorPeriodic(GFace *gf, int RECUR_ITER, CTX::instance()->mesh.algoRecombine <= 1) { bool blossom = (CTX::instance()->mesh.algoRecombine == 1); int topo = CTX::instance()->mesh.recombineOptimizeTopology; - recombineIntoQuads(gf, blossom, topo, false, 0.1); // no node repositioning + bool nodeRepositioning = true; + if(CTX::instance()->mesh.algo2d == ALGO_2D_PACK_PRLGRMS || + CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + nodeRepositioning = false; + } + recombineIntoQuads(gf, blossom, topo, nodeRepositioning, 0.1); } computeElementShapes(gf, gf->meshStatistics.worst_element_shape, @@ -2899,6 +2929,14 @@ void meshGFace::operator()(GFace *gf, bool print) gf->getMeshMaster()->tag()); } + /* The ALGO_2D_QUAD_QUASI_STRUCT is using ALGO_2D_PACK_PRLGRMS + * to generate a initial quad-dominant mesh */ + bool quadqs = false; + if(CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + quadqs = true; + CTX::instance()->mesh.algo2d = ALGO_2D_PACK_PRLGRMS; + } + const char *algo = "Unknown"; switch(gf->getMeshingAlgo()) { @@ -2970,6 +3008,8 @@ void meshGFace::operator()(GFace *gf, bool print) (*this)(gf, print); gf->unsetMeshingAlgo(); } + + if(quadqs) CTX::instance()->mesh.algo2d = ALGO_2D_QUAD_QUASI_STRUCT; } static bool getGFaceNormalFromVert(GFace *gf, MElement *el, SVector3 &nf) diff --git a/Mesh/meshGFace.h b/Mesh/meshGFace.h index 19817ef9604bb30a5e83bde5b0cc04642f2399bf..3d8bf65049e00c6a9d70ee289dec73a360359715 100644 --- a/Mesh/meshGFace.h +++ b/Mesh/meshGFace.h @@ -56,8 +56,27 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, bool repairSelfIntersecting1dMesh, bool pointInsideParametricDomain(std::vector<SPoint2> &bnd, SPoint2 &p, SPoint2 &out, int &N); +/** + * @brief Automatically set transfinite constraints on curves and faces + * in the candidate_faces if possible. Curves on opposide sides + * of rectangular faces are constrained to reiceive the same number + * of points. + * + * @param candidate_faces The faces which are candidate for transfinite + * @param cornerAngle Threshold on the angle (viewed from face) at corners + * @param setRecombine If true, quads will be built instead of triangles when + * meshing + * @param maxDiffRel Reject transfinite constraints if the relative difference + * on the initial number of lines (from sizing constraints) on opposite sides is + * larger than the maxDiffRel + * @param ignoreEmbedded If true, ignore embedded edges and vertices in faces + * + * @return true if success + */ bool MeshSetTransfiniteFacesAutomatic(std::set<GFace *> &candidate_faces, double cornerAngle = 2.35, - bool setRecombine = true); + bool setRecombine = true, + double maxDiffRel = 1., + bool ignoreEmbedded = false); #endif diff --git a/Mesh/meshGFaceDelaunayInsertion.cpp b/Mesh/meshGFaceDelaunayInsertion.cpp index 407f0bf99bc7fa15047db059f984d0be8ad5c552..4064d81fc7f0baa97e2e1b02f1d4237697a59e3e 100644 --- a/Mesh/meshGFaceDelaunayInsertion.cpp +++ b/Mesh/meshGFaceDelaunayInsertion.cpp @@ -25,6 +25,7 @@ #include "intersectCurveSurface.h" #include "HilbertCurve.h" #include "fullMatrix.h" +#include "gmsh.h" // for debug #if defined(HAVE_DOMHEX) #include "pointInsertion.h" @@ -1436,6 +1437,7 @@ void buildBackgroundMesh(GFace *gf, bool crossFieldClosestPoint, #if defined(HAVE_DOMHEX) if(!old_algo_hexa()) return; #endif + Msg::Debug("build background mesh (Bowyer Watson, fixed size) ..."); quadsToTriangles(gf, 100000); @@ -1605,10 +1607,21 @@ void bowyerWatsonParallelograms( std::vector<MVertex *> packed; std::vector<SMetric3> metrics; + Msg::Debug("- Face %i: bowyerWatsonParallelograms ...", gf->tag()); + if(!gf->haveParametrization()) { + Msg::Error( + "- Face %i: no CAD parametrization available, cannot mesh with algo PACK", + gf->tag()); + return; + } + #if defined(HAVE_DOMHEX) - if(old_algo_hexa()) + if(old_algo_hexa()) { + Msg::Debug("bowyerWatsonParallelograms: call packingOfParallelograms()"); packingOfParallelograms(gf, packed, metrics); + } else { + Msg::Debug("bowyerWatsonParallelograms: call Filler2D::pointInsertion2D()"); Filler2D f; f.pointInsertion2D(gf, packed, metrics); } @@ -1616,6 +1629,8 @@ void bowyerWatsonParallelograms( Msg::Error("Packing of parallelograms algorithm requires DOMHEX"); #endif + Msg::Info("%lu Nodes created --> now staring insertion", packed.size()); + if(!buildMeshGenerationDataStructures(gf, AllTris, DATA)) { Msg::Error("Invalid meshing data structure"); return; @@ -1623,6 +1638,9 @@ void bowyerWatsonParallelograms( // std::sort(packed.begin(), packed.end(), MVertexPtrLessThanLexicographic()); SortHilbert(packed); + Msg::Debug("bowyerWatsonParallelograms: %li candidate points to insert in " + "the triangulation", + packed.size()); MTri3 *oneNewTriangle = nullptr; for(std::size_t i = 0; i < packed.size();) { @@ -1663,6 +1681,10 @@ void bowyerWatsonParallelograms( transferDataStructure(gf, AllTris, DATA); backgroundMesh::unset(); + Msg::Debug( + "bowyerWatsonParallelograms: %li candidate points -> %li inserted vertices", + packed.size(), gf->mesh_vertices.size()); + splitElementsInBoundaryLayerIfNeeded(gf); } @@ -1671,13 +1693,17 @@ void bowyerWatsonParallelogramsConstrained( std::map<MVertex *, MVertex *> *equivalence, std::map<MVertex *, SPoint2> *parametricCoordinates) { + Msg::Error("bowyerWatsonParallelogramsConstrained deprecated"); + return; + std::set<MTri3 *, compareTri3Ptr> AllTris; bidimMeshData DATA(equivalence, parametricCoordinates); std::vector<MVertex *> packed; std::vector<SMetric3> metrics; #if defined(HAVE_DOMHEX) - packingOfParallelogramsConstrained(gf, constr_vertices, packed, metrics); + // packingOfParallelogramsConstrained no longer exists + // packingOfParallelogramsConstrained(gf, constr_vertices, packed, metrics); #else Msg::Error("Packing of parallelograms algorithm requires DOMHEX"); #endif diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp index 5d0611f9b00c3902b4e969cb9a4819ac172ad7ee..e80a98f1f16914e627b7be6f027c810e71580e83 100644 --- a/Mesh/meshGFaceOptimize.cpp +++ b/Mesh/meshGFaceOptimize.cpp @@ -34,6 +34,63 @@ extern "C" int perfect_match(int ncount, CCdatagroup *dat, int ecount, int partialprice, double *totalzeit); #endif +RecombineTriangle::RecombineTriangle(const MEdge &me, MElement *_t1, + MElement *_t2, Field *cross_field) + : t1(_t1), t2(_t2) +{ + n1 = me.getVertex(0); + n2 = me.getVertex(1); + n3 = 0; + n4 = 0; + + if(t1->getVertex(0) != n1 && t1->getVertex(0) != n2) + n3 = t1->getVertex(0); + else if(t1->getVertex(1) != n1 && t1->getVertex(1) != n2) + n3 = t1->getVertex(1); + else if(t1->getVertex(2) != n1 && t1->getVertex(2) != n2) + n3 = t1->getVertex(2); + + if(t2->getVertex(0) != n1 && t2->getVertex(0) != n2) + n4 = t2->getVertex(0); + else if(t2->getVertex(1) != n1 && t2->getVertex(1) != n2) + n4 = t2->getVertex(1); + else if(t2->getVertex(2) != n1 && t2->getVertex(2) != n2) + n4 = t2->getVertex(2); + + MQuadrangle q(n1, n3, n2, n4); + angle = q.etaShapeMeasure(); + + double const a1 = 180 * angle3Vertices(n1, n4, n2) / M_PI; + double const a2 = 180 * angle3Vertices(n4, n2, n3) / M_PI; + double const a3 = 180 * angle3Vertices(n2, n3, n1) / M_PI; + double const a4 = 180 * angle3Vertices(n3, n1, n4) / M_PI; + quality = std::abs(90. - a1); + quality = std::max(std::abs(90. - a2), quality); + quality = std::max(std::abs(90. - a3), quality); + quality = std::max(std::abs(90. - a4), quality); + + if(cross_field) { + SVector3 t1; + SVector3 t2(me.getVertex(1)->x() - me.getVertex(0)->x(), + me.getVertex(1)->y() - me.getVertex(0)->y(), + me.getVertex(1)->z() - me.getVertex(0)->z()); + (*cross_field)(0.5 * (me.getVertex(0)->x() + me.getVertex(1)->x()), + 0.5 * (me.getVertex(0)->y() + me.getVertex(1)->y()), + 0.5 * (me.getVertex(0)->z() + me.getVertex(1)->z()), t1, + NULL); + // double L1 = t1.norm(); + t1.normalize(); + // double L2 = t2.norm(); + t2.normalize(); + SVector3 n = crossprod(t1, t2); + double ErrDir = std::min(fabs(dot(t1, t2)), n.norm()); + // double ErrL = fabs(L1-L2)/(L1); + // printf("quality %g err %g L %g %g\n",quality,ErrL,L1,L2); + quality /= ErrDir; + if(n1->onWhat()->dim() < 2 || n2->onWhat()->dim() < 2) quality /= 10; + } +} + edge_angle::edge_angle(MVertex *_v1, MVertex *_v2, MElement *t1, MElement *t2) : v1(_v1), v2(_v2) { @@ -921,6 +978,9 @@ void laplaceSmoothing(GFace *gf, int niter, bool infinity_norm) } if(!niter) return; + + Msg::Debug("laplacian smoothing ..."); + std::set<MVertex *> vs; getAllBoundaryLayerVertices(gf, vs); v2t_cont adj; @@ -995,6 +1055,17 @@ static void _recombineIntoQuads(GFace *gf, bool blossom, bool cubicGraph = 1) e2t_cont adj; buildEdgeToElement(gf->triangles, adj); + FieldManager *fields = gf->model()->getFields(); + Field *cross_field = NULL; + SVector3 t1; + // double L; /* unused ? */ + if(fields->getBackgroundField() > 0) { + cross_field = fields->get(fields->getBackgroundField()); + if(cross_field->numComponents() != 3) { // we hae a true scaled cross fiel + cross_field = NULL; + } + } + std::vector<RecombineTriangle> pairs; std::map<MVertex *, std::pair<MElement *, MElement *> > makeGraphPeriodic; @@ -1006,8 +1077,8 @@ static void _recombineIntoQuads(GFace *gf, bool blossom, bool cubicGraph = 1) it->first.getVertex(0)) || !std::binary_search(emb_edgeverts.begin(), emb_edgeverts.end(), it->first.getVertex(1)))) { - pairs.push_back( - RecombineTriangle(it->first, it->second.first, it->second.second)); + pairs.push_back(RecombineTriangle(it->first, it->second.first, + it->second.second, cross_field)); } else if(!it->second.second && it->second.first->getNumVertices() == 3) { for(int i = 0; i < 2; i++) { @@ -1340,8 +1411,8 @@ void quadsToTriangles(GFace *gf, double minqual) // std::map<MElement*,MElement*> _toFirst; std::map<MElement *, std::vector<MElement *> > newElemColumns; - for(auto it = _columns->_elemColumns.begin(); it != _columns->_elemColumns.end(); - it++) { + for(auto it = _columns->_elemColumns.begin(); + it != _columns->_elemColumns.end(); it++) { MElement *firstEl = it->first; auto it2 = change.find(firstEl); if(it2 != change.end()) firstEl = it2->second.first; diff --git a/Mesh/meshGFaceOptimize.h b/Mesh/meshGFaceOptimize.h index 90e1922e5802dd761d78baf145b103c43e151f8b..d887b95ddce41c58d5135fbc29f1c2ae4e3cdd31 100644 --- a/Mesh/meshGFaceOptimize.h +++ b/Mesh/meshGFaceOptimize.h @@ -17,6 +17,7 @@ class GFace; class GVertex; class MVertex; +class Field; struct edge_angle { MVertex *v1, *v2; @@ -110,40 +111,7 @@ struct RecombineTriangle { double quality; MVertex *n1, *n2, *n3, *n4; - RecombineTriangle(const MEdge &me, MElement *_t1, MElement *_t2) - : t1(_t1), t2(_t2) - { - n1 = me.getVertex(0); - n2 = me.getVertex(1); - n3 = nullptr; - n4 = nullptr; - - if(t1->getVertex(0) != n1 && t1->getVertex(0) != n2) - n3 = t1->getVertex(0); - else if(t1->getVertex(1) != n1 && t1->getVertex(1) != n2) - n3 = t1->getVertex(1); - else if(t1->getVertex(2) != n1 && t1->getVertex(2) != n2) - n3 = t1->getVertex(2); - - if(t2->getVertex(0) != n1 && t2->getVertex(0) != n2) - n4 = t2->getVertex(0); - else if(t2->getVertex(1) != n1 && t2->getVertex(1) != n2) - n4 = t2->getVertex(1); - else if(t2->getVertex(2) != n1 && t2->getVertex(2) != n2) - n4 = t2->getVertex(2); - - MQuadrangle q(n1, n3, n2, n4); - angle = q.etaShapeMeasure(); - - double const a1 = 180 * angle3Vertices(n1, n4, n2) / M_PI; - double const a2 = 180 * angle3Vertices(n4, n2, n3) / M_PI; - double const a3 = 180 * angle3Vertices(n2, n3, n1) / M_PI; - double const a4 = 180 * angle3Vertices(n3, n1, n4) / M_PI; - quality = std::abs(90. - a1); - quality = std::max(std::abs(90. - a2), quality); - quality = std::max(std::abs(90. - a3), quality); - quality = std::max(std::abs(90. - a4), quality); - } + RecombineTriangle(const MEdge &me, MElement *_t1, MElement *_t2, Field *f); bool operator<(const RecombineTriangle &other) const { diff --git a/Mesh/meshGFaceTransfinite.cpp b/Mesh/meshGFaceTransfinite.cpp index 0b1cc8661a35c99945b3353f17f45a81bf867b31..74cdeb379fdaee3dc4fcb11154d358dd0f88b811 100644 --- a/Mesh/meshGFaceTransfinite.cpp +++ b/Mesh/meshGFaceTransfinite.cpp @@ -582,7 +582,8 @@ bool faceIsValidQuad(GFace *gf, double angle_threshold_rad) std::vector<std::array<int, 2> > vpairs; for(GEdge *ge : gf->edges()) { - vpairs.push_back({ge->getBeginVertex()->tag(), ge->getEndVertex()->tag()}); + vpairs.push_back( + {{ge->getBeginVertex()->tag(), ge->getEndVertex()->tag()}}); } std::vector<int> loop; bool ok = id_loop_from_closed_pairs(vpairs, loop); @@ -663,12 +664,17 @@ GEdge *quad_face_opposite_edge(GFace *face, GEdge *edge) } void build_chords(const std::set<GFace *> &faces, - std::vector<std::set<GEdge *> > &chords) + std::vector<std::set<GEdge *> > &chords, double maxDiffRel, + bool ignoreEmbedded = false) { /* Connectivity */ std::map<GEdge *, std::vector<GFace *> > edge2faces; - for(GFace *gf : faces) + for(GFace *gf : faces) { + if(!ignoreEmbedded && + (gf->embeddedEdges().size() > 0 || gf->embeddedVertices().size() > 0)) + continue; for(GEdge *ge : gf->edges()) { edge2faces[ge].push_back(gf); } + } Msg::Debug("build chords: %li faces, %li edges", faces.size(), edge2faces.size()); @@ -687,10 +693,15 @@ void build_chords(const std::set<GFace *> &faces, while(Q.size() > 0) { GEdge *ge = Q.front(); Q.pop(); + int n = meshGEdgeTargetNumberOfPoints(ge); chord.insert(ge); for(GFace *gf : edge2faces[ge]) { GEdge *ge2 = quad_face_opposite_edge(gf, ge); if(ge2 && done.find(ge2) == done.end()) { + int n2 = meshGEdgeTargetNumberOfPoints(ge2); + if(double(std::abs(n2 - n)) / double(std::max(n, n2)) > maxDiffRel) { + continue; + } Q.push(ge2); done[ge2] = true; } @@ -702,19 +713,24 @@ void build_chords(const std::set<GFace *> &faces, } bool MeshSetTransfiniteFacesAutomatic(std::set<GFace *> &candidate_faces, - double cornerAngle, bool setRecombine) + double cornerAngle, bool setRecombine, + double maxDiffRel, bool ignoreEmbedded) { /* Filter with topology and geometry */ std::set<GFace *> faces; - for(GFace *gf : candidate_faces) + for(GFace *gf : candidate_faces) { + if(!ignoreEmbedded && + (gf->embeddedEdges().size() > 0 || gf->embeddedVertices().size() > 0)) + continue; if(faceIsValidQuad(gf, cornerAngle)) { faces.insert(gf); } + } /* Build the topological chords in quad structure */ Msg::Debug( "transfinite automatic: building chords from %li quadrangular faces ...", faces.size()); std::vector<std::set<GEdge *> > chords; - build_chords(faces, chords); + build_chords(faces, chords, maxDiffRel); Msg::Debug("... found %li chords", chords.size()); /* Determine the number of points, set the transfinite curves */ @@ -739,6 +755,9 @@ bool MeshSetTransfiniteFacesAutomatic(std::set<GFace *> &candidate_faces, ge->meshAttributes.nbPointsTransfinite = N; ge->meshAttributes.typeTransfinite = 1; /* Progression */ ge->meshAttributes.coeffTransfinite = 1.; + if(CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + ge->meshAttributes.typeTransfinite = 4; /* Use size map */ + } ne += 1; } } @@ -747,10 +766,17 @@ bool MeshSetTransfiniteFacesAutomatic(std::set<GFace *> &candidate_faces, std::size_t nf = 0; for(GFace *gf : faces) { bool transfinite = true; + std::vector<int> nPoints(4, 0); + std::size_t count = 0; for(GEdge *ge : gf->edges()) { - if(ge->meshAttributes.method != MESH_TRANSFINITE) transfinite = false; + if(ge->meshAttributes.method != MESH_TRANSFINITE) { + transfinite = false; + break; + } + nPoints[count] = ge->meshAttributes.nbPointsTransfinite; + count += 1; } - if(transfinite) { + if(transfinite && nPoints[0] == nPoints[2] && nPoints[1] == nPoints[3]) { nf += 1; gf->meshAttributes.method = MESH_TRANSFINITE; gf->meshAttributes.transfiniteArrangement = 1; /* Right */ diff --git a/Mesh/meshOctreeLibOL.cpp b/Mesh/meshOctreeLibOL.cpp new file mode 100644 index 0000000000000000000000000000000000000000..deb72c865a405f736ec89614a6df7b1f642d0f83 --- /dev/null +++ b/Mesh/meshOctreeLibOL.cpp @@ -0,0 +1,614 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "meshOctreeLibOL.h" +#include "GFace.h" +#include "discreteFace.h" +#include "MVertex.h" +#include "MTriangle.h" + +extern "C" { +#include "libol1.h" +} + +#include "robin_hood.h" + +// Debug vizu +// #include "geolog.h" + +namespace SurfaceProjectorUtils { + /* Copy useful functions from contrib/QuadMeshingTools/arrayGeometry.h + * because this functions should work without QUADMESHINGTOOLS module */ + using vec2 = std::array<double, 2>; + using vec3 = std::array<double, 3>; + inline vec3 operator-(const vec3 &a, const vec3 &b) + { + return {{a[0] - b[0], a[1] - b[1], a[2] - b[2]}}; + } + inline vec3 operator+(const vec3 &a, const vec3 &b) + { + return {{a[0] + b[0], a[1] + b[1], a[2] + b[2]}}; + } + inline vec3 operator*(const double &a, const vec3 &b) + { + return {{a * b[0], a * b[1], a * b[2]}}; + } + inline vec3 operator*(const vec3 &a, const double &b) + { + return {{a[0] * b, a[1] * b, a[2] * b}}; + } + inline double dot(const vec3 &a, const vec3 &b) + { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + inline double length2(const vec3 &a) { return dot(a, a); } + inline double maxAbs(double x, double y, double z) + { + return std::max(std::abs(x), std::max(std::abs(y), std::abs(z))); + } + inline double maxAbs(const vec3 &a) { return maxAbs(a[0], a[1], a[2]); } + inline void normalizeFast(vec3 &a) + { + a = 1. / std::sqrt(length2(a)) * a; + } /* no check, not safe, not accurate */ + inline void normalize(vec3 &a) + { + double amp = maxAbs(a); + if(amp == 0.) { return; } + a = amp * a; + normalizeFast(a); + } + + inline double project_point_segment_l2(const vec3 &query, const vec3 &a, + const vec3 &b, vec3 &proj, + double &lambda) + { + double l2 = length2(a - b); + double t = dot(query - a, b - a); + if(t <= 0. || l2 == 0.) { + proj = a; + lambda = 1.; + return length2(query - a); + } + else if(t > l2) { + proj = b; + lambda = 0.; + return length2(query - b); + } + lambda = 1. - t / l2; + proj = lambda * a + (1. - lambda) * b; + return length2(query - proj); + } + + /* This function is adapted from a equivalent function in the Geogram library, + * which is based on https://www.geometrictools.com/Source/Distance3D.html */ + inline double project_point_triangle_l2(const vec3 &query, const vec3 &p1, + const vec3 &p2, const vec3 &p3, + vec3 &proj, double lambda[3]) + { + vec3 diff = p1 - query; + vec3 edge0 = p2 - p1; + vec3 edge1 = p3 - p1; + double a00 = length2(edge0); + double a01 = dot(edge0, edge1); + double a11 = length2(edge1); + double b0 = dot(diff, edge0); + double b1 = dot(diff, edge1); + double c = length2(diff); + double det = ::fabs(a00 * a11 - a01 * a01); + double s = a01 * b1 - a11 * b0; + double t = a01 * b0 - a00 * b1; + double sqrDistance; + + // If the triangle is degenerate + if(det < 1e-30) { + double cur_l1; + vec3 cur_closest; + double result; + double cur_dist = + project_point_segment_l2(query, p1, p2, cur_closest, cur_l1); + result = cur_dist; + proj = cur_closest; + lambda[0] = cur_l1; + lambda[1] = 1. - cur_l1; + lambda[2] = 0.0; + cur_dist = project_point_segment_l2(query, p1, p3, cur_closest, cur_l1); + if(cur_dist < result) { + result = cur_dist; + proj = cur_closest; + lambda[0] = cur_l1; + lambda[2] = 1. - cur_l1; + lambda[1] = 0.0; + } + cur_dist = project_point_segment_l2(query, p2, p3, cur_closest, cur_l1); + if(cur_dist < result) { + result = cur_dist; + proj = cur_closest; + lambda[1] = cur_l1; + lambda[2] = 1. - cur_l1; + lambda[0] = 0.0; + } + return result; + } + + if(s + t <= det) { + if(s < 0.0) { + if(t < 0.0) { // region 4 + if(b0 < 0.0) { + t = 0.0; + if(-b0 >= a00) { + s = 1.0; + sqrDistance = a00 + 2.0 * b0 + c; + } + else { + s = -b0 / a00; + sqrDistance = b0 * s + c; + } + } + else { + s = 0.0; + if(b1 >= 0.0) { + t = 0.0; + sqrDistance = c; + } + else if(-b1 >= a11) { + t = 1.0; + sqrDistance = a11 + 2.0 * b1 + c; + } + else { + t = -b1 / a11; + sqrDistance = b1 * t + c; + } + } + } + else { // region 3 + s = 0.0; + if(b1 >= 0.0) { + t = 0.0; + sqrDistance = c; + } + else if(-b1 >= a11) { + t = 1.0; + sqrDistance = a11 + 2.0 * b1 + c; + } + else { + t = -b1 / a11; + sqrDistance = b1 * t + c; + } + } + } + else if(t < 0.0) { // region 5 + t = 0.0; + if(b0 >= 0.0) { + s = 0.0; + sqrDistance = c; + } + else if(-b0 >= a00) { + s = 1.0; + sqrDistance = a00 + 2.0 * b0 + c; + } + else { + s = -b0 / a00; + sqrDistance = b0 * s + c; + } + } + else { // region 0 + // minimum at interior query + double invDet = double(1.0) / det; + s *= invDet; + t *= invDet; + sqrDistance = s * (a00 * s + a01 * t + 2.0 * b0) + + t * (a01 * s + a11 * t + 2.0 * b1) + c; + } + } + else { + double tmp0, tmp1, numer, denom; + + if(s < 0.0) { // region 2 + tmp0 = a01 + b0; + tmp1 = a11 + b1; + if(tmp1 > tmp0) { + numer = tmp1 - tmp0; + denom = a00 - 2.0 * a01 + a11; + if(numer >= denom) { + s = 1.0; + t = 0.0; + sqrDistance = a00 + 2.0 * b0 + c; + } + else { + s = numer / denom; + t = 1.0 - s; + sqrDistance = s * (a00 * s + a01 * t + 2.0 * b0) + + t * (a01 * s + a11 * t + 2.0 * b1) + c; + } + } + else { + s = 0.0; + if(tmp1 <= 0.0) { + t = 1.0; + sqrDistance = a11 + 2.0 * b1 + c; + } + else if(b1 >= 0.0) { + t = 0.0; + sqrDistance = c; + } + else { + t = -b1 / a11; + sqrDistance = b1 * t + c; + } + } + } + else if(t < 0.0) { // region 6 + tmp0 = a01 + b1; + tmp1 = a00 + b0; + if(tmp1 > tmp0) { + numer = tmp1 - tmp0; + denom = a00 - 2.0 * a01 + a11; + if(numer >= denom) { + t = 1.0; + s = 0.0; + sqrDistance = a11 + 2.0 * b1 + c; + } + else { + t = numer / denom; + s = 1.0 - t; + sqrDistance = s * (a00 * s + a01 * t + 2.0 * b0) + + t * (a01 * s + a11 * t + 2.0 * b1) + c; + } + } + else { + t = 0.0; + if(tmp1 <= 0.0) { + s = 1.0; + sqrDistance = a00 + 2.0 * b0 + c; + } + else if(b0 >= 0.0) { + s = 0.0; + sqrDistance = c; + } + else { + s = -b0 / a00; + sqrDistance = b0 * s + c; + } + } + } + else { // region 1 + numer = a11 + b1 - a01 - b0; + if(numer <= 0.0) { + s = 0.0; + t = 1.0; + sqrDistance = a11 + 2.0 * b1 + c; + } + else { + denom = a00 - 2.0 * a01 + a11; + if(numer >= denom) { + s = 1.0; + t = 0.0; + sqrDistance = a00 + 2.0 * b0 + c; + } + else { + s = numer / denom; + t = 1.0 - s; + sqrDistance = s * (a00 * s + a01 * t + 2.0 * b0) + + t * (a01 * s + a11 * t + 2.0 * b1) + c; + } + } + } + } + + // Account for numerical round-off error. + if(sqrDistance < 0.0) { sqrDistance = 0.0; } + + proj = p1 + s * edge0 + t * edge1; + lambda[0] = 1.0 - s - t; + lambda[1] = s; + lambda[2] = t; + return sqrDistance; + } +} // namespace SurfaceProjectorUtils + +using namespace SurfaceProjectorUtils; + +SurfaceProjector::SurfaceProjector(GFace *gf_) : gf(NULL), OctIdx(0) +{ + std::vector<MTriangle *> triangles = gf->triangles; + if(gf->quadrangles.size() > 0) { + Msg::Error("SurfaceProjector: quads not implemented yet, should create " + "fake MTriangle* just for initialize()"); + abort(); + } + bool ok = initialize(gf_, triangles); + if(!ok) { Msg::Error("failed to initialize SurfaceProjector"); } +} + +void SurfaceProjector::clear() +{ + if(OctIdx != 0) { + Msg::Debug("free libOL octree (OctIdx: %li)", OctIdx); + LolFreeOctree(OctIdx); + OctIdx = 0; + } + points.clear(); + triangles.clear(); + triangle_uvs.clear(); +} + +SurfaceProjector::~SurfaceProjector() { clear(); } + +bool SurfaceProjector::setAnalyticalProjection(GFace *gf) +{ + if(gf->geomType() == GFace::GeomType::Sphere) { + double radius = 0.; + SPoint3 center; + if(gf->isSphere(radius, center)) { + analyticalShape = GFace::GeomType::Sphere; + useAnalyticalFormula = true; + analyticalParameters[0] = center.x(); + analyticalParameters[1] = center.y(); + analyticalParameters[2] = center.z(); + analyticalParameters[3] = radius; + return true; + } + } + + Msg::Error( + "Surface projecor: analytical formula for given shape not supported"); + return false; +} + +bool SurfaceProjector::initialize(GFace *gf_, + const std::vector<MTriangle *> &gfTriangles) +{ + clear(); + gf = gf_; + bool paramAvailable = gf->haveParametrization(); + + const int BasIdx = 1; /* indices start at one in libOL */ + + /* If periodic parametrization, get periods */ + bool disableParamPer = false; + if(paramAvailable && (gf->periodic(0) || gf->periodic(1))) { + disableParamPer = true; + } + + /* Collect coordinates and triangle-continuous uv param */ + robin_hood::unordered_map<MVertex *, int32_t> old2new; + int32_t count = 0; + triangles.reserve(gfTriangles.size()); + points.reserve(gfTriangles.size()); + if(paramAvailable) { + triangle_uvs.reserve(gfTriangles.size()); + if(disableParamPer) triangle_no_uv_eval.reserve(gfTriangles.size()); + } + for(MTriangle *f : gfTriangles) { + std::array<int32_t, 3> tri_pts; + std::array<vec2, 3> tri_uvs; + bool check_periodicity = false; + bool no_eval = false; + for(size_t lv = 0; lv < f->getNumVertices(); ++lv) { + MVertex *v = f->getVertex(lv); + auto it = old2new.find(v); + if(it == old2new.end()) { + old2new[v] = count; + tri_pts[lv] = count + BasIdx; + points.push_back(v->point()); + count += 1; + } + else { + tri_pts[lv] = it->second + BasIdx; + } + + if(paramAvailable) { /* Get the uv in GFace */ + bool onGf = (dynamic_cast<GFace *>(v->onWhat()) == gf); + if(onGf) { + v->getParameter(0, tri_uvs[lv][0]); + v->getParameter(1, tri_uvs[lv][1]); + } + else { + check_periodicity = true; + } + } + } + + if(check_periodicity) { + bool found = false; + for(size_t lv = 0; lv < 3; ++lv) { + MVertex *v1 = f->getVertex(lv); + bool onGf = (dynamic_cast<GFace *>(v1->onWhat()) == gf); + if(onGf) { /* If neither of the 3 are on surface, takes random ... */ + MVertex *v2 = f->getVertex((lv + 1) % 3); + MVertex *v3 = f->getVertex((lv + 2) % 3); + SPoint2 param1; + SPoint2 param2; + SPoint2 param3; + reparamMeshEdgeOnFace(v1, v2, gf, param1, param2); + reparamMeshEdgeOnFace(v1, v3, gf, param1, param3); + tri_uvs[(lv + 0) % 3] = {{param1.x(), param1.y()}}; + tri_uvs[(lv + 1) % 3] = {{param2.x(), param2.y()}}; + tri_uvs[(lv + 2) % 3] = {{param3.x(), param3.y()}}; + found = true; + break; + } + } + if(!found) { + /* Triangle with no vertex inside the GFace, difficult to get + * good UV parametrization, we use center projection to get + * a initial guess */ + SPoint3 center = f->barycenter(); + double initialGuess[2] = {0., 0.}; + GPoint proj = gf->closestPoint(center, initialGuess); + if(proj.succeeded()) { + MFaceVertex cv(proj.x(), proj.y(), proj.z(), gf, proj.u(), proj.v()); + MVertex *v1 = f->getVertex(0); + MVertex *v2 = f->getVertex(1); + MVertex *v3 = f->getVertex(2); + SPoint2 paramc; + SPoint2 param1; + SPoint2 param2; + SPoint2 param3; + reparamMeshEdgeOnFace(&cv, v1, gf, paramc, param1); + reparamMeshEdgeOnFace(&cv, v2, gf, paramc, param2); + reparamMeshEdgeOnFace(&cv, v3, gf, paramc, param3); + tri_uvs[0] = {{param1.x(), param1.y()}}; + tri_uvs[1] = {{param2.x(), param2.y()}}; + tri_uvs[2] = {{param3.x(), param3.y()}}; + } + else { + no_eval = true; + tri_uvs[0] = {{0., 0.}}; + tri_uvs[1] = {{0., 0.}}; + tri_uvs[2] = {{0., 0.}}; + } + } + } + + triangles.push_back(tri_pts); + if(paramAvailable) triangle_uvs.push_back(tri_uvs); + if(paramAvailable && disableParamPer) + triangle_no_uv_eval.push_back(no_eval); + // Debug to visualize param + // { + // GeoLog::add({points[tri_pts[0]-1], points[tri_pts[1]-1], + // points[tri_pts[2]-1]}, + // std::vector<double>{tri_uvs[0][0],tri_uvs[1][0],tri_uvs[2][0]}, + // "sp_u"); + // GeoLog::add({points[tri_pts[0]-1], points[tri_pts[1]-1], + // points[tri_pts[2]-1]}, + // std::vector<double>{tri_uvs[0][1],tri_uvs[1][1],tri_uvs[2][1]}, + // "sp_v"); + // } + } + + points.shrink_to_fit(); + triangles.shrink_to_fit(); + triangle_uvs.shrink_to_fit(); + + // Build an octree from a surface mesh + int32_t NmbVer = (int32_t)points.size(); + double *VerTab1 = points[0].data(); + double *VerTab2 = points[1].data(); + // double* VerTab2 = VerTab1[3]; + int32_t NmbTri = (int32_t)triangles.size(); + int32_t *TriTab1 = triangles[0].data(); + // int32_t* TriTab2 = TriTab1[3]; + int32_t *TriTab2 = triangles[1].data(); + Msg::Debug("create libOL octree (%i vertices and %i triangles)", NmbVer, + NmbTri); + OctIdx = LolNewOctree(NmbVer, VerTab1, VerTab2, 0, NULL, NULL, NmbTri, + TriTab1, TriTab2, 0, NULL, NULL, 0, NULL, NULL, 0, NULL, + NULL, 0, NULL, NULL, 0, NULL, NULL, BasIdx, 1); + + return true; +} + +GPoint failedProjection() +{ + GPoint fail(DBL_MAX, DBL_MAX, DBL_MAX, NULL); + fail.setNoSuccess(); + return fail; +} + +GPoint sphereProjection(GFace *gf, const double query[3], + const std::array<double, 10> &analyticalParameters) +{ + vec3 dir = {{query[0] - analyticalParameters[0], + query[1] - analyticalParameters[1], + query[2] - analyticalParameters[2]}}; + if(length2(dir) == 0.) { return failedProjection(); } + normalize(dir); + const vec3 newPos = {{ + analyticalParameters[0] + analyticalParameters[3] * dir[0], + analyticalParameters[1] + analyticalParameters[3] * dir[1], + analyticalParameters[2] + analyticalParameters[3] * dir[2]}}; + return GPoint(newPos[0], newPos[1], newPos[2], gf); +} + +GPoint SurfaceProjector::closestPoint(const double query[3], bool evalOnCAD, + bool projectOnCAD) const +{ + if(useAnalyticalFormula) { + if(analyticalShape == GFace::GeomType::Sphere) { + return sphereProjection(gf, query, analyticalParameters); + } + else { + Msg::Error( + "SurfaceProjector::closestPoint(): no analytical formula for shape"); + return failedProjection(); + } + } + + if(OctIdx == 0) { + Msg::Error("SurfaceProjector::closestPoint(): no octree (face %i, %li " + "points, %li triangles)", + gf->tag(), points.size(), triangles.size()); + return failedProjection(); + } + + const int BasIdx = 1; /* indices start at one in libOL */ + + /* Octree query */ + double crd[3] = {query[0], query[1], query[2]}; + double dis; + int idx = LolGetNearest(OctIdx, LolTypTri, crd, &dis, 0, NULL, NULL, 0); + if(idx <= 0) { + Msg::Warning("SurfaceProjector::closestPoint(): no closest triangle found " + "(face %i, %li triangles)", + gf->tag(), triangles.size()); + return failedProjection(); + } + size_t tri = idx - 1; + + /* Projection to get the barycentric coordinates */ + const vec3 queryv3 = {{query[0], query[1], query[2]}}; + const vec3 &p1 = points[triangles[tri][0] - BasIdx]; + const vec3 &p2 = points[triangles[tri][1] - BasIdx]; + const vec3 &p3 = points[triangles[tri][2] - BasIdx]; + + // { + // int rdi = rand(); + // GeoLog::add({p1,p2,p3},0.,"proj_"+std::to_string(rdi)); + // GeoLog::add(queryv3,double(dis),"proj_"+std::to_string(rdi)); + // } + + double lambda[3]; + vec3 cproj; + project_point_triangle_l2(queryv3, p1, p2, p3, cproj, lambda); + GPoint proj; + if(triangle_uvs.size() > 0) { + double uv[2] = {0., 0.}; + uv[0] = lambda[0] * triangle_uvs[tri][0][0] + + lambda[1] * triangle_uvs[tri][1][0] + + lambda[2] * triangle_uvs[tri][2][0]; + uv[1] = lambda[0] * triangle_uvs[tri][0][1] + + lambda[1] * triangle_uvs[tri][1][1] + + lambda[2] * triangle_uvs[tri][2][1]; + if(projectOnCAD) { + SPoint3 queryp3(query[0], query[1], query[2]); + GPoint cadProj = gf->closestPoint(queryp3, uv); + if(cadProj.succeeded()) { proj = cadProj; } + } + else if(evalOnCAD) { + if(triangle_no_uv_eval.size() > 0 && triangle_no_uv_eval[tri]) { + /* 3D projection */ + SPoint3 queryp3(query[0], query[1], query[2]); + GPoint cadProj = gf->closestPoint(queryp3, uv); + if(cadProj.succeeded()) { proj = cadProj; } + } + else { + proj = gf->point(uv[0], uv[1]); + } + } + else { + proj = GPoint(cproj[0], cproj[1], cproj[2], gf, uv[0], uv[1]); + } + } + else { + proj = GPoint(cproj[0], cproj[1], cproj[2], gf); + } + + return proj; +} diff --git a/Mesh/meshOctreeLibOL.h b/Mesh/meshOctreeLibOL.h new file mode 100644 index 0000000000000000000000000000000000000000..838edf016ec396f7c2e51cd47e335e4b4992125a --- /dev/null +++ b/Mesh/meshOctreeLibOL.h @@ -0,0 +1,90 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. + +#ifndef MESH_OCTREE_LIB_OL +#define MESH_OCTREE_LIB_OL + +#include <vector> +#include <array> +#include <string> +#include "GPoint.h" +#include "GFace.h" + +class MTriangle; + +/** + * @brief Class to project 3D points on a triangulated surface. + * If a parametrization is available, the UV are interpolated + * at the triangle projection. + * Not associated to the mesh elements of a GEntity, so it can be + * used on mesh sub-patches or on background mesh. + */ +class SurfaceProjector { +public: + SurfaceProjector() : gf(NULL), OctIdx(0) {} + SurfaceProjector(GFace *gf); /* read triangles and quads from GFace */ + SurfaceProjector(SurfaceProjector const &) = delete; + SurfaceProjector &operator=(SurfaceProjector const &) = delete; + ~SurfaceProjector(); + + /** + * @brief Fill the triangles and uvs from the triangles, then build the + * octree. Overwrite existing triangulation/octree if there is one. + * + * @param gf The CAD face containing the triangles + * @param triangles The triangles used to build the triangulated geometry + * support + * + * @return true if success + */ + bool initialize(GFace *gf, const std::vector<MTriangle *> &triangles); + + /** + * @brief Clear the triangulation and delete the octree + */ + void clear(); + + /** + * @brief The SurfaceProjector can project with an analytical formula instead + * of a triangulation and a octree Supported shapes: Sphere + * + * @param gf The face containing the analytical parameters + * + * @return true if success + */ + bool setAnalyticalProjection(GFace *gf); + + /** + * @brief Get the query closest point on the triangulated surface. + * + * @param query[3] 3D coordinates of the query point + * @param evalOnCAD If param available, evaluate the face CAD mapping at the + * interpolated UV + * @param projectOnCAD If param available, call closestPoint from the CAD + * geometry engine, with the interpolated UV as initial guess + * + * @return the projection, check GPoint::succeeded() for projection success / + * failure + */ + GPoint closestPoint(const double query[3], bool evalOnCAD = false, + bool projectOnCAD = false) const; + +public: + GFace *gf; + +protected: + std::vector<std::array<double, 3> > points; + std::vector<std::array<int32_t, 3> > triangles; + std::vector<std::array<std::array<double, 2>, 3> > triangle_uvs; + std::vector<bool> triangle_no_uv_eval; /* no eval. at param. singularity */ + int64_t OctIdx; /* pointer to libOL octree (C structure) */ + + /* For simple CAD shapes, we have analytical formula for projection */ + bool useAnalyticalFormula = false; + GFace::GeomType analyticalShape = GFace::GeomType::Unknown; + std::array<double, 10> analyticalParameters; +}; + +#endif diff --git a/Mesh/meshPolyMesh.h b/Mesh/meshPolyMesh.h new file mode 100644 index 0000000000000000000000000000000000000000..47a245f8999df0de3ae9666ff37bb420dcbc8084 --- /dev/null +++ b/Mesh/meshPolyMesh.h @@ -0,0 +1,331 @@ +// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. + +#ifndef MESH_POLYMESH_H +#define MESH_POLYMESH_H + +#include <vector> +#include <stack> +#include <stdio.h> +#include "SVector3.h" + +class PolyMesh { +public: + class HalfEdge; + class Face; + class Vertex; + + class Vertex { + public: + Vertex(double x, double y, double z, int _d = -1) + : position(x, y, z), he(NULL), data(_d) + { + } + SVector3 position; + PolyMesh::HalfEdge *he; // one incident half edge + int data; + }; + + class HalfEdge { + public: + HalfEdge(Vertex *vv) + : v(vv), f(NULL), prev(NULL), next(NULL), opposite(NULL), data(-1) + { + } + Vertex *v; // origin + Face *f; // incident face + HalfEdge *prev; // previous half edge on the face + HalfEdge *next; // next half edge on the face + HalfEdge *opposite; // opposite half edge (twin) + int data; + }; + + class Face { + public: + Face(HalfEdge *e) : he(e), data(-1) {} + HalfEdge *he; // one half edge of the face + int data; + }; + + std::vector<Vertex *> vertices; + std::vector<HalfEdge *> hedges; + std::vector<Face *> faces; + + void reset() + { + for(auto it : vertices) delete it; + for(auto it : hedges) delete it; + for(auto it : faces) delete it; + } + + ~PolyMesh() { reset(); } + + void print4debug(const int debugTag) + { + char name[256]; + sprintf(name, "polyMesh%d.pos", debugTag); + FILE *f = fopen(name, "w"); + fprintf(f, "View \" %s \"{\n", name); + for(auto it : faces) { + HalfEdge *he0 = it->he; + HalfEdge *he1 = it->he->next; + HalfEdge *he2 = it->he->next->next; + fprintf(f, "ST(%g,%g,0,%g,%g,0,%g,%g,0){%d,%d,%d};\n", + he0->v->position.x(), he0->v->position.y(), he1->v->position.x(), + he1->v->position.y(), he2->v->position.x(), he2->v->position.y(), + it->data, it->data, it->data); + } + for(auto it : hedges) { + HalfEdge *he = it; + if(he->data >= 0) { + fprintf(f, "SL(%g,%g,0,%g,%g,0){%d,%d};\n", he->v->position.x(), + he->v->position.y(), he->opposite->v->position.x(), + he->opposite->v->position.y(), he->data, he->data); + } + } + + fprintf(f, "};\n"); + fclose(f); + } + + // compute the degree of a given vertex v + inline int degree(const Vertex *v) const + { + HalfEdge *he = v->he; + size_t count = 0; + do { + he = he->opposite; + if(he == NULL) return -1; + he = he->next; + count++; + } while(he != v->he); + return count; + } + + inline HalfEdge *getEdge(Vertex *v0, Vertex *v1) + { + HalfEdge *he = v0->he; + do { + if(he->next->v == v1) return he; + he = he->opposite; + if(he == NULL) return NULL; + he = he->next; + } while(he != v0->he); + return NULL; + } + + inline void createFace(Face *f, Vertex *v0, Vertex *v1, Vertex *v2, + HalfEdge *he0, HalfEdge *he1, HalfEdge *he2) + { + he0->v = v0; + he1->v = v1; + he2->v = v2; + v0->he = he0; + v1->he = he1; + v2->he = he2; + + he0->next = he1; + he1->prev = he0; + he1->next = he2; + he2->prev = he1; + he2->next = he0; + he0->prev = he2; + he0->f = he1->f = he2->f = f; + f->he = he0; + } + + // swap without asking questions + // + // he1 + // v2 ------->------ v3 + // | \ | + // | \ he0 | he2 + // heo2| \ | + // | heo0 \ | + // | \ | + // v1 -----<------- v0 + // heo1 + // + // he1 + // -------------- + // | / | + // | he0 / | he2 + // heo2| / | + // | /heo0 | + // |/ | + // -------------- + // heo1 + // + + inline int swap_edge(HalfEdge *he0) + { + HalfEdge *heo0 = he0->opposite; + if(heo0 == NULL) return -1; + + HalfEdge *he1 = he0->next; + HalfEdge *he2 = he1->next; + HalfEdge *heo1 = heo0->next; + HalfEdge *heo2 = heo1->next; + + Vertex *v0 = heo1->v; + Vertex *v1 = heo2->v; + Vertex *v2 = heo0->v; + Vertex *v3 = he2->v; + + createFace(he0->f, v0, v1, v3, heo1, heo0, he2); + createFace(heo2->f, v1, v2, v3, heo2, he1, he0); + return 0; + } + + // + // v0 he0 + // ------------------>------ v1 + // | / + // | / + // | v / + // |he2 / + // | / he1 + // | / + // | / + // |/ + // v2 + + inline void initialize_rectangle(double xmin, double xmax, double ymin, + double ymax) + { + reset(); + Vertex *v_mm = new PolyMesh::Vertex(xmin, ymin, 0); + vertices.push_back(v_mm); + Vertex *v_mM = new PolyMesh::Vertex(xmin, ymax, 0); + vertices.push_back(v_mM); + Vertex *v_MM = new PolyMesh::Vertex(xmax, ymax, 0); + vertices.push_back(v_MM); + Vertex *v_Mm = new PolyMesh::Vertex(xmax, ymin, 0); + vertices.push_back(v_Mm); + HalfEdge *mm_MM = new HalfEdge(v_mm); + HalfEdge *MM_Mm = new HalfEdge(v_MM); + HalfEdge *Mm_mm = new HalfEdge(v_Mm); + hedges.push_back(mm_MM); + hedges.push_back(MM_Mm); + hedges.push_back(Mm_mm); + Face *f0 = new Face(mm_MM); + faces.push_back(f0); + createFace(f0, v_mm, v_MM, v_Mm, mm_MM, MM_Mm, Mm_mm); + + HalfEdge *MM_mm = new HalfEdge(v_MM); + HalfEdge *mm_mM = new HalfEdge(v_mm); + HalfEdge *mM_MM = new HalfEdge(v_mM); + hedges.push_back(MM_mm); + hedges.push_back(mm_mM); + hedges.push_back(mM_MM); + Face *f1 = new Face(MM_mm); + faces.push_back(f1); + createFace(f1, v_MM, v_mm, v_mM, MM_mm, mm_mM, mM_MM); + + MM_mm->opposite = mm_MM; + mm_MM->opposite = MM_mm; + } + + inline int split_triangle(double x, double y, double z, Face *f, + int (*doSwap)(PolyMesh::HalfEdge *, void *) = NULL, + void *data = NULL, + std::vector<HalfEdge *> *_t = NULL) + { + Vertex *v = new PolyMesh::Vertex(x, y, z); // one more vertex + + vertices.push_back(v); + + HalfEdge *he0 = f->he; + HalfEdge *he1 = he0->next; + HalfEdge *he2 = he1->next; + + Vertex *v0 = he0->v; + Vertex *v1 = he1->v; + Vertex *v2 = he2->v; + HalfEdge *hev0 = new PolyMesh::HalfEdge(v); + HalfEdge *hev1 = new PolyMesh::HalfEdge(v); + HalfEdge *hev2 = new PolyMesh::HalfEdge(v); + + HalfEdge *he0v = new PolyMesh::HalfEdge(v0); + HalfEdge *he1v = new PolyMesh::HalfEdge(v1); + HalfEdge *he2v = new PolyMesh::HalfEdge(v2); + + hedges.push_back(hev0); + hedges.push_back(hev1); + hedges.push_back(hev2); + hedges.push_back(he0v); + hedges.push_back(he1v); + hedges.push_back(he2v); + + hev0->opposite = he0v; + he0v->opposite = hev0; + hev1->opposite = he1v; + he1v->opposite = hev1; + hev2->opposite = he2v; + he2v->opposite = hev2; + + Face *f0 = f; + f->he = hev0; + Face *f1 = new Face(hev1); + Face *f2 = new Face(hev2); + f1->data = f2->data = f0->data; + + faces.push_back(f1); + faces.push_back(f2); + + createFace(f0, v0, v1, v, he0, he1v, hev0); + createFace(f1, v1, v2, v, he1, he2v, hev1); + createFace(f2, v2, v0, v, he2, he0v, hev2); + + if(doSwap) { + std::stack<HalfEdge *> _stack; + _stack.push(he0); + _stack.push(he1); + _stack.push(he2); + std::vector<HalfEdge *> _touched; + while(!_stack.empty()) { + HalfEdge *he = _stack.top(); + _touched.push_back(he); + _stack.pop(); + // printf("do we swap %g %g --> %g %g ?\n", + // he->v->position.x(),he->v->position.y(), + // he->next->v->position.x(),he->next->v->position.y()); + if(doSwap(he, data) == 1) { + // printf("YES\n"); + swap_edge(he); + + HalfEdge *H[2] = {he, he->opposite}; + + for(int k = 0; k < 2; k++) { + if(H[k] == NULL) continue; + HalfEdge *heb = H[k]->next; + HalfEdge *hebo = heb->opposite; + + if(std::find(_touched.begin(), _touched.end(), heb) == + _touched.end() && + std::find(_touched.begin(), _touched.end(), hebo) == + _touched.end()) { + _stack.push(heb); + } + + HalfEdge *hec = heb->next; + HalfEdge *heco = hec->opposite; + + if(std::find(_touched.begin(), _touched.end(), hec) == + _touched.end() && + std::find(_touched.begin(), _touched.end(), heco) == + _touched.end()) { + _stack.push(hec); + } + } + } + } + if(_t) *_t = _touched; + } + return 0; + } +}; + +#endif diff --git a/Mesh/meshQuadQuasiStructured.cpp b/Mesh/meshQuadQuasiStructured.cpp new file mode 100644 index 0000000000000000000000000000000000000000..761290bb8f5f1db841da968b6b5afe7290457555 --- /dev/null +++ b/Mesh/meshQuadQuasiStructured.cpp @@ -0,0 +1,2366 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "meshQuadQuasiStructured.h" + +#include <array> +#include <queue> + +#include "GmshConfig.h" +#include "GmshMessage.h" +#include "Numeric.h" +#include "Context.h" +#include "OS.h" +#include "GModel.h" +#include "meshGEdge.h" +#include "meshGFace.h" +#include "meshGRegion.h" +#include "BackgroundMesh.h" +#include "Generator.h" +#include "Field.h" +#include "MElement.h" +#include "MTriangle.h" +#include "MQuadrangle.h" +#include "MLine.h" +#include "gmsh.h" +#include "meshRefine.h" +#include "meshOctreeLibOL.h" +#include "robin_hood.h" + +#if defined(HAVE_POST) +#include "PView.h" +#include "PViewData.h" +#include "PViewDataList.h" +#include "PViewDataGModel.h" +#include "PViewOptions.h" +#endif +#if defined(HAVE_FLTK) +#include "FlGui.h" +#endif + +#if defined(HAVE_QUADMESHINGTOOLS) +/* QuadMeshingTools includes */ +#include "cppUtils.h" +#include "qmtMeshUtils.h" +#include "qmtCrossField.h" +#include "qmtSizeMap.h" +#include "qmtCurveQuantization.h" +#include "qmtDiskQuadrangulationRemeshing.h" +#include "qmtQuadCavityRemeshing.h" +#include "qmtMeshGeometryOptimization.h" +#include "arrayGeometry.h" +#include "geolog.h" + +using namespace CppUtils; +using namespace ArrayGeometry; + +template <typename Key, typename T, typename Hash = robin_hood::hash<Key>, + typename KeyEqual = std::equal_to<Key>, size_t MaxLoadFactor100 = 80> +using unordered_map = + robin_hood::detail::Table<true, MaxLoadFactor100, Key, T, Hash, KeyEqual>; + +template <typename Key, typename Hash = robin_hood::hash<Key>, + typename KeyEqual = std::equal_to<Key>, size_t MaxLoadFactor100 = 80> +using unordered_set = + robin_hood::detail::Table<true, MaxLoadFactor100, Key, void, Hash, KeyEqual>; + +const std::string BMESH_NAME = "bmesh_quadqs"; + +constexpr bool PARANO_QUALITY = false; +constexpr bool PARANO_VALIDITY = false; + + +/* scaling applied on integer values stored in view (background field), + * so the visualization is not broken by the integers */ +constexpr double VIEW_INT_SCALING = 1.e-8; + +int buildBackgroundField( + GModel *gm, const std::vector<MTriangle *> &global_triangles, + const std::vector<std::array<double, 9> > &global_triangle_directions, + const std::unordered_map<MVertex *, double> &global_size_map, + const std::vector<std::array<double, 5> >& global_singularity_list, + const std::string &viewName = "guiding_field") +{ + Msg::Debug("build background guiding field ..."); + if(global_triangles.size() != global_triangle_directions.size()) { + Msg::Error("build background field: incoherent sizes in input"); + return -1; + } + + std::vector<double> datalist; + datalist.reserve(global_triangles.size() * 18); + for(size_t i = 0; i < global_triangles.size(); ++i) { + MTriangle *t = global_triangles[i]; + /* Triangle coordinates */ + for(size_t d = 0; d < 3; ++d) { + for(size_t lv = 0; lv < 3; ++lv) { + datalist.push_back(t->getVertex(lv)->point().data()[d]); + } + } + /* Vector field */ + for(size_t lv = 0; lv < 3; ++lv) { + MVertex *v = t->getVertex(lv); + auto it = global_size_map.find(v); + if(it == global_size_map.end()) { + Msg::Error("Building background field, triangle vertex not found in " + "global size map"); + return -1; + } + double siz = it->second; + for(size_t d = 0; d < 3; ++d) { + double val = siz * global_triangle_directions[i][3 * lv + d]; + datalist.push_back(val); + } + } + } + +#if defined(HAVE_POST) + PView *view = PView::getViewByName(viewName); + if(view == NULL) { + view = new PView(); + view->getData()->setName(viewName); + } + PViewDataList *d = dynamic_cast<PViewDataList *>(view->getData()); + if(!d) { // change the view type + std::string name = view->getData()->getName(); + delete view->getData(); + d = new PViewDataList(); + d->setName(name); + d->setFileName(name + ".pos"); + view->setData(d); + } + + size_t numElements = datalist.size() / (9 + 9); + int idxtypeVT = 7; /* Post type: VT */ + d->importList(idxtypeVT, numElements, datalist, false); + +#if defined(HAVE_FLTK) + view->getOptions()->visible = 0; + if(FlGui::available()) FlGui::instance()->updateViews(true, true); +#endif + + /* singularities */ + if (global_singularity_list.size() > 0){ + int idxtypeVP = 1; /* Post type: VP */ + std::vector<double> datalistSING; + datalistSING.reserve(global_singularity_list.size()*6); + for (size_t i = 0; i < global_singularity_list.size(); ++i) { + datalistSING.push_back(global_singularity_list[i][2]); /* x */ + datalistSING.push_back(global_singularity_list[i][3]); /* y */ + datalistSING.push_back(global_singularity_list[i][4]); /* z */ + datalistSING.push_back(VIEW_INT_SCALING*double(global_singularity_list[i][0])); /* gf->tag() */ + datalistSING.push_back(VIEW_INT_SCALING*double(global_singularity_list[i][1])); /* index */ + datalistSING.push_back(0.); /* empty */ + } + d->importList(idxtypeVP, datalistSING.size()/6, datalistSING, false); + } + + + d->finalize(); + + gm->getFields()->setBackgroundMesh(view->getTag()); + + if(Msg::GetVerbosity() >= 99) { + std::string name = gm->getName() + "_bgm.pos"; + Msg::Warning("export background field to '%s' ", name.c_str()); + view->write(name, 0); + } + + return 0; +#else + Msg::Error( + "Module POST (post-processing) required to create background field view"); + return -1; +#endif +} + +void showCrossFieldInView( + const std::vector<MTriangle *> &global_triangles, + const std::vector<std::array<double, 9> > &global_triangle_directions, + const std::string &viewName = "cross_field") +{ + for(size_t i = 0; i < global_triangles.size(); ++i) { + for(size_t lv = 0; lv < 3; ++lv) { + MVertex *v = global_triangles[i]->getVertex(lv); + vec3 dir = {{global_triangle_directions[i][3 * lv + 0], + global_triangle_directions[i][3 * lv + 1], + global_triangle_directions[i][3 * lv + 2]}}; + std::array<double, 3> pt = v->point(); + GeoLog::add(pt, dir, viewName); + } + } + GeoLog::flush(); +} + +void showUVParametrization(GFace *gf, const std::vector<MElement *> &elts, + const std::string &viewName = "uv") +{ + std::vector<std::vector<double> > values_u; + std::vector<std::vector<double> > values_v; + for(MElement *t : elts) { + std::vector<SPoint2> tris_uvs = paramOnElement(gf, t); + std::vector<double> us(tris_uvs.size()); + std::vector<double> vs(tris_uvs.size()); + for(size_t k = 0; k < us.size(); ++k) { + us[k] = tris_uvs[k][0]; + vs[k] = tris_uvs[k][1]; + } + values_u.push_back(us); + values_v.push_back(vs); + } + GeoLog::add(elts, values_u, viewName + "_u"); + GeoLog::add(elts, values_v, viewName + "_v"); +} + +void showUVParametrization(GlobalBackgroundMesh &bgm, + const std::string &viewName = "uv") +{ + for(auto &kv : bgm.faceBackgroundMeshes) { + GFace *gf = kv.first; + if(!gf->haveParametrization()) continue; + std::vector<MElement *> tris; + for(MTriangle &t : kv.second.triangles) { tris.push_back(&t); } + showUVParametrization(gf, tris, viewName); + } + GeoLog::flush(); +} + +void printSizeMapStats(const std::vector<MTriangle *> &triangles, + std::unordered_map<MVertex *, double> &sizemap) +{ + double vmin = DBL_MAX; + double vmax = -DBL_MAX; + for(auto &kv : sizemap) { + vmin = std::min(vmin, kv.second); + vmax = std::max(vmax, kv.second); + } + double integral = 0.; + for(MTriangle *t : triangles) { + double values[3] = {0, 0, 0}; + for(size_t lv = 0; lv < 3; ++lv) { + MVertex *v = t->getVertex(lv); + auto it = sizemap.find(v); + values[lv] = it->second; + ; + } + double a = std::abs(t->getVolume()); + integral += + a * 1. / std::pow(1. / 3. * (values[0] + values[1] + values[2]), 2); + } + Msg::Info("Size map statistics: min=%.3f, max=%.3f, target #elements: %.3f", + vmin, vmax, integral); +} + +int fillSizemapFromTriangleSizes(const std::vector<MTriangle *> &triangles, + std::unordered_map<MVertex *, double> &sizeMap) +{ + std::unordered_map<MVertex *, std::vector<MVertex *> > v2v; + buildVertexToVertexMap(triangles, v2v); + for(auto &kv : v2v) { + MVertex *v = kv.first; + double sum = 0.; + double avg = 0.; + for(MVertex *v2 : kv.second) { + avg += v->distance(v2); + sum += 1.; + } + if(sum == 0.) continue; + sizeMap[v] = avg / sum; + } + return 0; +} + +int fillSizemapFromScalarBackgroundField( + GModel *gm, const std::vector<MTriangle *> &triangles, + std::unordered_map<MVertex *, double> &sizeMap) +{ + Field *field = nullptr; + FieldManager *fields = gm->getFields(); + if(fields->getBackgroundField() > 0) { + field = fields->get(fields->getBackgroundField()); + if(field && field->numComponents() != 1) { field = nullptr; } + } + if(field == nullptr) { + Msg::Error("Scalar background field not found"); + return -1; + } + for(MTriangle *t : triangles) + for(size_t lv = 0; lv < 3; ++lv) { + MVertex *v = t->getVertex(lv); + auto it = sizeMap.find(v); + if(it == sizeMap.end()) { + double value = (*field)(v->point().x(), v->point().y(), v->point().z()); + if(std::isnan(value) || value == -DBL_MAX || value == DBL_MAX) continue; + sizeMap[v] = value; + } + } + return 0; +} + +std::string nameOfSizeMapMethod(int method) { + if (method == 0) { + return "default (cross-field conformal scaling and CAD adaptation)"; + } else if (method == 1) { + return "cross-field conformal scaling"; + } else if (method == 2) { + return "cross-field conformal scaling and CAD adaptation"; + } else if (method == 3) { + return "background mesh sizes"; + } + return "unknown"; +} + +bool generateMeshWithSpecialParameters(GModel *gm, + double &scalingOnTriangulation) +{ + Msg::Debug("build background triangulation ..."); + + /* Unlock if called from GenerateMesh() */ + bool shouldLock = false; + if(CTX::instance()->lock) { + CTX::instance()->lock = 0; + shouldLock = true; + } + + /* Change meshing parameters to build a good triangulation + * for cross field */ + /* - the triangulation must be a bit more refined than the quad mesh */ + scalingOnTriangulation = 0.75; + int minCurveNodes = CTX::instance()->mesh.minCurveNodes; + int minCircleNodes = CTX::instance()->mesh.minCircleNodes; + double lcFactor = CTX::instance()->mesh.lcFactor; + int recombineAll = CTX::instance()->mesh.recombineAll; + int algoRecombine = CTX::instance()->mesh.algoRecombine; + int algo = CTX::instance()->mesh.algo2d; + CTX::instance()->mesh.minCurveNodes = std::min(minCurveNodes, 5); + CTX::instance()->mesh.minCircleNodes = std::min(minCircleNodes, 30); + CTX::instance()->mesh.lcFactor = lcFactor * scalingOnTriangulation; + CTX::instance()->mesh.recombineAll = 0; + CTX::instance()->mesh.algoRecombine = 0; + CTX::instance()->mesh.algo2d = + ALGO_2D_MESHADAPT; /* slow but frontal does not always work */ + + /* Generate the triangulation with standard gmsh pipeline */ + GenerateMesh(gm, 2); + + /* Restore parameters */ + CTX::instance()->mesh.minCurveNodes = minCurveNodes; + CTX::instance()->mesh.minCircleNodes = minCircleNodes; + CTX::instance()->mesh.lcFactor = lcFactor; + CTX::instance()->mesh.recombineAll = recombineAll; + CTX::instance()->mesh.algoRecombine = algoRecombine; + CTX::instance()->mesh.algo2d = algo; + + /* Lock again before going back to GenerateMesh() */ + if(shouldLock) CTX::instance()->lock = 1; + + return true; +} + +int BuildBackgroundMeshAndGuidingField(GModel *gm, bool overwriteGModelMesh, + bool deleteGModelMesh, int N) +{ + if(CTX::instance()->abortOnError && Msg::GetErrorCount()) return 0; + if(CTX::instance()->mesh.algo2d != ALGO_2D_PACK_PRLGRMS && + CTX::instance()->mesh.algo2d != ALGO_2D_QUAD_QUASI_STRUCT) + return 0; + if(N != 4 && N != 6) { + Msg::Error("guiding field: %i-symmetry field not supported", N); + return -1; + } + + const bool SHOW_INTERMEDIATE_VIEWS = (Msg::GetVerbosity() >= 99); + + Msg::Info("Build background mesh and guiding field ..."); + bool externalSizemap = false; + const int qqsSizemapMethod = CTX::instance()->mesh.quadqsSizemapMethod; + + { + FieldManager *fields = gm->getFields(); + if(fields->getBackgroundField() > 0) { + Field *field = fields->get(fields->getBackgroundField()); + if(field && field->numComponents() == 3) { + Msg::Info( + "vector background field exists, using it as a guiding field"); + return 0; + } + else if(field && field->numComponents() == 1) { + if(qqsSizemapMethod == 0) { + Msg::Info("scalar background field exists, using it as size map"); + externalSizemap = true; + } + else { + Msg::Warning("scalar background field exists, but ignored because " + "QuadqsSizemapMethod is %i", + CTX::instance()->mesh.quadqsSizemapMethod); + } + } + } + } + + if(overwriteGModelMesh) { + Msg::Debug("delete GModel mesh"); + std::for_each(gm->firstRegion(), gm->lastRegion(), deMeshGRegion()); + std::for_each(gm->firstFace(), gm->lastFace(), deMeshGFace()); + std::for_each(gm->firstRegion(), gm->lastRegion(), deMeshGRegion()); + } + + /* Check if triangulation available */ + bool surfaceMeshed = true; + { + bool onlyVisible = CTX::instance()->mesh.meshOnlyVisible; + for(GFace *gf : gm->getFaces()) + if(gf->getNumMeshElements() == 0) { + if(onlyVisible && !gf->getVisibility()) continue; + surfaceMeshed = false; + } + } + + /* Generate triangulation */ + /* - scalingOnTriangulation: updated by generateMeshWithSpecialParameters + * this factor is used to get a triangulation a bit more finer than the + * target quadrangulation, to get a more accurate cross field */ + double scalingOnTriangulation = 1; + if(!surfaceMeshed) { + generateMeshWithSpecialParameters(gm, scalingOnTriangulation); + } + + // { + // setQuadqsTransfiniteConstraints(gm, 0.34); + // gm->deleteMesh(); + // generateMeshWithSpecialParameters(gm, scalingOnTriangulation); + // gmsh::initialize(); + // gmsh::fltk::run(); + // abort(); + // } + + GlobalBackgroundMesh &bmesh = getBackgroundMesh(BMESH_NAME); + bool overwrite = true; + int status = bmesh.importGModelMeshes(gm, overwrite); + if(status != 0) { + Msg::Error("failed to import model mesh in background mesh"); + return -1; + } + + if(deleteGModelMesh) { + Msg::Debug("delete GModel mesh"); + gm->deleteMesh(); + } + + /* Build guiding field on background mesh: + * - per GFace: + * - cross field (unit vectors, one value per edge) + * - conformal scaling (scalar, one value per vertex) + * - offset conformal scaling by target number of quads + * -> one vector (scaled direction) per triangle corner + * - global: + * - compute/extract size map + * - apply size map to triangle vectors (take minimum) + * - one-way smoothing with Dijkstra + gradient max + */ + std::vector<MTriangle *> global_triangles; + std::vector<std::array<double, 9> > global_triangle_directions; + std::vector<std::pair<MVertex *, double> > global_size_map; + std::vector<std::array<double, 5> > global_singularity_list; /* format: gf->tag(), index, x, y, z */ + /* Per GFace computations, in parallel */ + { + Msg::Info("- quadqs sizemap method: %s", nameOfSizeMapMethod(CTX::instance()->mesh.quadqsSizemapMethod).c_str()); + + std::vector<GFace *> faces = model_faces(gm); + size_t ntris = 0; + for(size_t f = 0; f < faces.size(); ++f) { + GFace *gf = faces[f]; + auto it = bmesh.faceBackgroundMeshes.find(gf); + if(it != bmesh.faceBackgroundMeshes.end()) { + ntris += it->second.triangles.size(); + } + } + global_triangles.reserve(ntris); + global_size_map.reserve(3 * ntris); + +#if defined(_OPENMP) +#pragma omp parallel for schedule(dynamic) +#endif + for(size_t f = 0; f < faces.size(); ++f) { + GFace *gf = faces[f]; + + if(CTX::instance()->mesh.meshOnlyVisible && !gf->getVisibility()) + continue; + if(CTX::instance()->debugSurface > 0 && + gf->tag() != CTX::instance()->debugSurface) + continue; + + /* Compute a cross field on each face */ + std::vector<MLine *> lines; + std::vector<MTriangle *> triangles; + + /* Collect pointers to background mesh elements */ + std::vector<GEdge *> edges = face_edges(gf); + for(GEdge *ge : edges) { + auto it = bmesh.edgeBackgroundMeshes.find(ge); + if(it == bmesh.edgeBackgroundMeshes.end()) { + Msg::Warning("BuildBackgroundMeshAndGuidingField: GEdge %i not found " + "in background mesh", + ge->tag()); + continue; + } + lines.reserve(lines.size() + it->second.lines.size()); + for(size_t i = 0; i < it->second.lines.size(); ++i) { + lines.push_back(&(it->second.lines[i])); + } + } + auto it = bmesh.faceBackgroundMeshes.find(gf); + if(it == bmesh.faceBackgroundMeshes.end()) { + Msg::Warning("BuildBackgroundMeshAndGuidingField: GFace %i not found " + "in background mesh", + gf->tag()); + continue; + } + triangles.reserve(triangles.size() + it->second.triangles.size()); + for(size_t i = 0; i < it->second.triangles.size(); ++i) { + triangles.push_back(&(it->second.triangles[i])); + } + + if(triangles.size() == 0) { + Msg::Error("- Face %i: no triangles in background mesh", gf->tag()); + continue; + } + + /* Cross field */ + std::vector<std::array<double, 3> > triEdgeTheta; + int nbDiffusionLevels = 4; + double thresholdNormConvergence = 1.e-2; + int nbBoundaryExtensionLayer = 1; + int verbosity = 0; + Msg::Info("- Face %i/%li: compute cross field (%li triangles, %li B.C. " + "edges, %i diffusion levels) ...", + gf->tag(), faces.size(), triangles.size(), lines.size(), + nbDiffusionLevels); + int scf = computeCrossFieldWithHeatEquation( + N, triangles, lines, triEdgeTheta, nbDiffusionLevels, + thresholdNormConvergence, nbBoundaryExtensionLayer, verbosity); + if(scf != 0) { + Msg::Warning("- Face %i: failed to compute cross field", gf->tag()); + } + + /* Cross field singularities */ + bool addSingularitiesAtAcuteCorners = true; + double thresholdInDeg = 30.; + std::vector<std::pair<SPoint3, int> > singularities; + int scsi = detectCrossFieldSingularities(N, triangles, triEdgeTheta, + addSingularitiesAtAcuteCorners, + thresholdInDeg, singularities); + if(scsi != 0) { + Msg::Warning("- Face %i: failed to compute cross field singularities", + gf->tag()); + } + std::vector<std::array<double,5> > singularity_list(singularities.size()); + for (size_t k = 0; k < singularities.size(); ++k) { + singularity_list[k] = {double(gf->tag()), double(singularities[k].second), + singularities[k].first.x(), singularities[k].first.y(), singularities[k].first.z()}; + } + + if(SHOW_INTERMEDIATE_VIEWS) { + for(auto &kv : singularities) { + GeoLog::add(kv.first, double(kv.second), "singularities"); + } + } + + std::vector<std::array<double, 9> > triangleDirections; + int sc = convertToPerTriangleCrossFieldDirections( + N, triangles, triEdgeTheta, triangleDirections); + if(sc != 0) { + Msg::Warning( + "- Face %i: failed to resample cross field at triangle corners", + gf->tag()); + } + + /* Build the size map of the guiding field */ + std::unordered_map<MVertex *, double> localSizemap; + if(externalSizemap) { /* Size map from background field */ + int sts = + fillSizemapFromScalarBackgroundField(gm, triangles, localSizemap); + if(sts != 0) { + Msg::Warning( + "- Face %i: failed to fill size map from scalar background field", + gf->tag()); + } + } + else if(qqsSizemapMethod == + 3) { /* Size map from background triangulation */ + int sts = fillSizemapFromTriangleSizes(triangles, localSizemap); + if(sts != 0) { + Msg::Warning("- Face %i: failed to fill size map from triangle sizes", + gf->tag()); + } else if (sts == 0 && scalingOnTriangulation > 0.) { + /* re-adjust the target edge size as if the triangulation was + * not finer for more accurate cross field */ + for (auto& kv: localSizemap) { + kv.second /= scalingOnTriangulation; + } + } + } + else { + /* Conformal scaling associated to cross field */ + Msg::Info("- Face %i/%li: compute cross field conformal scaling ...", + gf->tag(), faces.size()); + int scs = computeCrossFieldConformalScaling(N, triangles, triEdgeTheta, + localSizemap); + if(scs != 0) { + Msg::Warning( + "- Face %i: failed to compute conformal scaling, use uniform size", + gf->tag()); + for(MTriangle *t : triangles) + for(size_t lv = 0; lv < 3; ++lv) { + localSizemap[t->getVertex(lv)] = 1.; + } + } + + /* Quantile filtering on the conformal scaling histogram */ + Msg::Debug("- Face %i/%li: conformal scaling quantile filtering ...", + gf->tag(), faces.size()); + double filteringRange = 0.05; + quantileFiltering(localSizemap, filteringRange); + + size_t targetNumberOfQuads = gf->triangles.size() / 2.; + if(targetNumberOfQuads == 0) { /* Check in background mesh */ + auto it = bmesh.faceBackgroundMeshes.find(gf); + if(it == bmesh.faceBackgroundMeshes.end()) { + Msg::Error("- Face %i: background mesh not found", gf->tag()); + targetNumberOfQuads = 1000; + } + else { + targetNumberOfQuads = 0.5 * it->second.triangles.size(); + targetNumberOfQuads *= std::pow(scalingOnTriangulation, 2); + } + } + + /* Midpoint subdivision => 4 times more quads */ + targetNumberOfQuads /= 4; + + if(targetNumberOfQuads == 0) targetNumberOfQuads = 1; + + int scso = computeQuadSizeMapFromCrossFieldConformalFactor( + triangles, targetNumberOfQuads, localSizemap); + if(scso != 0) { + Msg::Warning( + "- Face %i: failed to compute size map from conformal scaling", + gf->tag()); + } + } + +#if defined(_OPENMP) +#pragma omp critical +#endif + { + append(global_triangles, triangles); + append(global_triangle_directions, triangleDirections); + append(global_singularity_list, singularity_list); + for(auto &kv : localSizemap) { + global_size_map.push_back({kv.first, kv.second}); + } + } + } + } + sort_unique(global_size_map); + + /* Warning: from now on, code is not optimized in terms of data structures + * (slow unordered_map instead of contiguous vectors, etc) + * should be improved if this step is time-consuming in the + * global pipeline. */ + + if(SHOW_INTERMEDIATE_VIEWS) { + showCrossFieldInView(global_triangles, global_triangle_directions, + "cross_field"); + } + + /* Global operations */ + + /* Compute minimum / maximum of "natural" size map. + * Use this to avoid cases when minimal size on curves + * tends to 0 */ + double smMin = DBL_MAX; + for(auto &kv : global_size_map) { smMin = std::min(smMin, kv.second); } + double factor = 0.1; /* size map can be reduced up to factor */ + double minSizeClampMin = factor * smMin; + + /* Minimal size on curves */ + std::unordered_map<MVertex *, double> cadMinimalSizeOnCurves; + if((qqsSizemapMethod == 0 && !externalSizemap) || qqsSizemapMethod == 2) { + int scad = computeMinimalSizeOnCurves(bmesh, cadMinimalSizeOnCurves); + if(scad != 0) { + Msg::Warning("failed to compute minimal size on CAD curves"); + } + } + + /* Initialize global size map defined on the background mesh */ + std::unordered_map<MVertex *, double> sizeMap = cadMinimalSizeOnCurves; + for(auto &kv : global_size_map) { + MVertex *v = kv.first; + auto it = sizeMap.find(v); + if(it == sizeMap.end()) { + sizeMap[kv.first] = kv.second; /* "natural" size */ + } + else { + double sizeFromAdaptation = std::max(it->second, minSizeClampMin); + it->second = std::min(sizeFromAdaptation, kv.second); + } + } + + /* One-way propagation of values */ + const double gradientMax = + 1.2; /* this param should be a global gmsh option */ + int sop = sizeMapOneWaySmoothing(global_triangles, sizeMap, gradientMax); + if(sop != 0) { Msg::Warning("failed to compute one-way size map smoothing"); } + + if(SHOW_INTERMEDIATE_VIEWS) { + std::vector<MElement *> elements = + dynamic_cast_vector<MTriangle *, MElement *>(global_triangles); + GeoLog::add(elements, sizeMap, "size_map"); + GeoLog::flush(); + showUVParametrization(bmesh); + } + + /* Clamp with global minimum/maximum mesh size */ + // { + // // TODO: apply on sizeMap instead + // // TODO: should be multiplied by lcFactor or not ? + // for (auto& kv: global_size_map) { + // if (kv.second < CTX::instance()->mesh.lcMin) { + // kv.second = CTX::instance()->mesh.lcMin; + // } else if (kv.second > CTX::instance()->mesh.lcMax) { + // kv.second = CTX::instance()->mesh.lcMax; + // } + // } + // } + + printSizeMapStats(global_triangles, sizeMap); + + /* Build the background field */ + int sbf = buildBackgroundField( + gm, global_triangles, global_triangle_directions, sizeMap, global_singularity_list, "guiding_field"); + if(sbf != 0) { + Msg::Warning("failed to build background guiding field"); + return -1; + } + + return 0; +} + +bool backgroundMeshAndGuidingFieldExists(GModel *gm) +{ + bool bgmOk = backgroudMeshExists(BMESH_NAME); + bool bfOk = false; + FieldManager *fields = gm->getFields(); + if(fields->getBackgroundField() > 0) { + Field *guiding_field = fields->get(fields->getBackgroundField()); + if(guiding_field && guiding_field->numComponents() == 3) { bfOk = true; } + } + return bgmOk && bfOk; +} + +bool getSingularitiesFromBackgroundField(GFace* gf, + std::vector<std::pair<SPoint3, int> >& singularities) { + singularities.clear(); + + Field* field = nullptr; + FieldManager *fields = gf->model()->getFields(); + if(fields->getBackgroundField() > 0) { + Field *guiding_field = fields->get(fields->getBackgroundField()); + if(guiding_field && guiding_field->numComponents() == 3) { field = guiding_field; } + } + if (field == nullptr) { + Msg::Error("get singularities: face %i, failed to get background field", gf->tag()); + return false; + } + + int viewTag = int(field->options["IView"]->numericalValue()); + PView* view = PView::getViewByTag(viewTag); + if (view == nullptr) { + Msg::Error("failed to get view for tag = %i", viewTag); + return false; + } + PViewDataList *d = dynamic_cast<PViewDataList *>(view->getData()); + if (d == nullptr) { + Msg::Error("view type is wrong"); + return false; + } + + size_t nVP = d->VP.size()/6; + for (size_t i = 0; i < nVP; ++i) { + int gfTag = int(std::round(d->VP[6*i+3] / VIEW_INT_SCALING)); + if (gfTag != gf->tag()) continue; + int index = int(std::round(d->VP[6*i+4] / VIEW_INT_SCALING)); + double x = d->VP[6*i+0]; + double y = d->VP[6*i+1]; + double z = d->VP[6*i+2]; + singularities.push_back(std::make_pair(SPoint3(x,y,z),index)); + } + + return true; +} + +void computeBdrVertexIdealValence(const std::vector<MQuadrangle *> &quads, + unordered_map<MVertex *, double> &qValIdeal) +{ + qValIdeal.clear(); + for(MQuadrangle *f : quads) { + for(size_t lv = 0; lv < 4; ++lv) { + MVertex *v = f->getVertex(lv); + GFace *gf = dynamic_cast<GFace *>(v->onWhat()); + if(gf == nullptr) { /* On boundary */ + MVertex *vPrev = f->getVertex((4 + lv - 1) % 4); + MVertex *vNext = f->getVertex((lv + 1) % 4); + SVector3 pNext = vNext->point(); + SVector3 pPrev = vPrev->point(); + SVector3 pCurr = v->point(); + double agl = angleVectors(pNext - pCurr, pPrev - pCurr); + qValIdeal[v] += agl * 2. / M_PI; + } + } + } +} + +inline int clamp(int val, int lower, int upper) +{ + return std::min(upper, std::max(val, lower)); +} + +bool getBoundaryIdealAndAllowedValences( + int fixingDim, /* 0 when fixing corners, 1 when fixing curves, 2 when fixing + surfaces */ + GFaceMeshPatch &patch, + const unordered_map<MVertex *, std::vector<MElement *> > &adj, + const unordered_map<MVertex *, double> &qValIdeal, + std::vector<int> &bndIdealValence, + std::vector<std::pair<int, int> > &bndAllowedValenceRange) +{ + if(fixingDim < 0 || fixingDim > 2) return false; + size_t N = patch.bdrVertices.front().size(); + bndIdealValence.resize(N); + bndAllowedValenceRange.resize(N); + for(size_t i = 0; i < N; ++i) { + MVertex *bv = patch.bdrVertices.front()[i]; + GVertex *gv = dynamic_cast<GVertex *>(bv->onWhat()); + GEdge *ge = dynamic_cast<GEdge *>(bv->onWhat()); + GFace *gf = dynamic_cast<GFace *>(bv->onWhat()); + int idealTot = 4; + if(gf == nullptr) { + auto it = qValIdeal.find(bv); + if(it == qValIdeal.end()) { + Msg::Error("getBoundaryIdealAndAllowedValences: bdr vertex %i not " + "found in qValIdeal", + bv->getNum()); + return false; + } + idealTot = (int)clamp(std::round(it->second), 1., 4.); + } + auto it = adj.find(bv); + if(it == adj.end()) { + Msg::Error( + "getBoundaryIdealAndAllowedValences: bdr vertex not found in adj"); + return false; + } + std::vector<MElement *> exterior = difference(it->second, patch.elements); + int valExterior = (int)exterior.size(); + int valInterior = (int)it->second.size() - exterior.size(); + int idealIn = idealTot - valExterior; + if(idealIn <= 0) { + idealIn = 1; + // DBG(bv->getNum(), idealIn, idealTot, valExterior); + // Msg::Error("getBoundaryIdealAndAllowedValences: ideal valence inside is + // <= 0, weird"); return false; + } + bndIdealValence[i] = idealIn; + if(exterior.size() == 0) { /* boundary vertex "inside" the cavity, probably + the one to remesh */ + bndAllowedValenceRange[i] = {idealIn, idealIn}; + } + else if(gv != nullptr) { /* Current bdr vertex is corner */ + bndAllowedValenceRange[i] = {idealIn, idealIn}; + } + else if(ge != nullptr) { /* Current bdr vertex is on curve */ + if(fixingDim == 0) { /* When fixing corners, can degrade curves */ + bndAllowedValenceRange[i] = {1, 2}; + } + else { + bndAllowedValenceRange[i] = {idealIn, idealIn}; + } + } + else if(gf != nullptr) { + if(valExterior <= 0) { + Msg::Error("getBoundaryIdealAndAllowedValences: surface bdr vertex but " + "exterior valence is: %i", + valExterior); + return false; + } + if(fixingDim == 0 && idealTot >= 3 && it->second.size() == 4) { + /* When fixing concave corner, do not degrade close regular interior + * vertices */ + bndAllowedValenceRange[i] = {valInterior, valInterior}; + } + else if(fixingDim == 0 || + fixingDim == + 1) { /* When fixing corner/curve, can degrade surface */ + /* Allowed total range: [3,6], minimize if valExterior higher to this */ + int lower = 3 - valExterior; + int upper = 6 - valExterior; + lower = clamp(lower, 1, 5); + upper = clamp(upper, 1, 5); + bndAllowedValenceRange[i] = {lower, upper}; + } + else { + /* Allowed total range: [3,5], minimize if valExterior higher to this */ + int lower = 3 - valExterior; + int upper = 5 - valExterior; + lower = clamp(lower, 1, 4); + upper = clamp(upper, 1, 4); + bndAllowedValenceRange[i] = {lower, upper}; + } + } + else { + Msg::Error("getBoundaryIdealAndAllowedValences: vertex on no CAD entity, " + "should not happen"); + return false; + } + + // if (fixingDim == 2) { + // std::string name = "[" + + // std::to_string(bndAllowedValenceRange[i].first) + // + "," + std::to_string(int(bndAllowedValenceRange[i].second)) + "]"; + // GeoLog::add({bv->point()},double(bndIdealValence[i]), name); + // } + } + + return true; +} + +bool meshOrientationIsOppositeOfCadOrientation(GFace *gf) +{ + size_t nOk = 0; + size_t nInv = 0; + for(std::size_t iEl = 0; iEl < gf->getNumMeshElements(); iEl++) { + MElement *e = gf->getMeshElement(iEl); + SVector3 ne = e->getFace(0).normal(); + MVertex *v = e->getVertex(0); + SPoint2 param; + if(v->onWhat() == gf && v->getParameter(0, param[0]) && + v->getParameter(1, param[1])) { + SVector3 nf = gf->normal(param); + if(dot(nf, ne) < 0.) { nInv += 1; } + else { + nOk += 1; + } + } + } + return (nInv > nOk); +} + +void updateAdjacencies(const GFaceMeshPatch &before, + const GFaceMeshPatch &after, + unordered_map<MVertex *, std::vector<MElement *> > &adj) +{ + /* Remove old vertices from adjacency keys */ + for(MVertex *v : before.intVertices) { + auto it = adj.find(v); + if(it != adj.end()) { adj.erase(it); } + } + /* Remove old elements from adjacency values */ + for(MVertex *bv : before.bdrVertices.front()) { + auto it = adj.find(bv); + if(it != adj.end()) { + it->second = difference(it->second, before.elements); + } + } + /* Add new keys and values */ + for(MElement *e : after.elements) { + for(size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex *v = e->getVertex(lv); + adj[v].push_back(e); + } + } +} + +std::vector<MElement *> +getNeighbors(const std::vector<MElement *> &elements, + const unordered_map<MVertex *, std::vector<MElement *> > &adj) +{ + std::vector<MElement *> neighbors; + for(MElement *e : elements) { + for(size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex *v = e->getVertex(lv); + auto it = adj.find(v); + if(it != adj.end()) { + for(MElement *e : it->second) { neighbors.push_back(e); } + } + } + } + neighbors = difference(neighbors, elements); + return neighbors; +} + +bool smoothThePool( + GFace *gf, const std::vector<MVertex *> &smoothingPool, + const unordered_map<MVertex *, std::vector<MElement *> > &adj, + bool invertNormalsForQuality, SurfaceProjector *sp = nullptr) +{ + /* Get all quads used for smoothing */ + std::vector<MElement *> elements; + { + std::vector<MVertex *> unq = smoothingPool; + sort_unique(unq); + elements.reserve(unq.size()); + for(MVertex *v : unq) { + auto it = adj.find(v); + if(it != adj.end()) { append(elements, it->second); } + } + } + + /* Build the disconnected patches and smooth them independently */ + std::vector<std::vector<MElement *> > components; + bool okc = getConnectedComponents(elements, components); + if(!okc) return false; + Msg::Debug("smooth %li connected components from %li initial elements ...", + components.size(), elements.size()); + for(size_t i = 0; i < components.size(); ++i) { + GFaceMeshPatch patch; + bool okp = patchFromElements(gf, components[i], patch); + if(!okp) continue; + + PatchGeometryBackup backup(patch); + + GeomOptimStats stats; + double sicnBefore = 0.; + if(haveNiceParametrization(gf)) { + if(patch.bdrVertices.size() == 1) { /* disk topology */ + /* Global UV smoothing */ + patchOptimizeGeometryGlobal(patch, stats); + sicnBefore = stats.sicnMinBefore; + + if(stats.sicnMinAfter < 0.5) { + /* Kernel smoothing */ + GeomOptimOptions opt; + opt.invertCADNormals = invertNormalsForQuality; + patchOptimizeGeometryWithKernel(patch, opt, stats); + } + } + else { + double sicnAvg; + computeSICN(patch.elements, sicnBefore, sicnAvg); + if(sicnBefore < 0.5) { + /* Kernel smoothing */ + GeomOptimOptions opt; + opt.invertCADNormals = invertNormalsForQuality; + patchOptimizeGeometryWithKernel(patch, opt, stats); + } + } + } + else { + GeomOptimOptions opt; + opt.sp = sp; + opt.outerLoopIterMax = 20.; + opt.timeMax = 10.; + opt.withBackup = true; + opt.invertCADNormals = invertNormalsForQuality; + // opt.smartMinThreshold = 0.1; + // opt.localLocking = true; + opt.dxLocalMax = 1.e-4; + patchOptimizeGeometryWithKernel(patch, opt, stats); + } + + /* Check after smoothing */ + if(stats.sicnMinAfter < sicnBefore) { + Msg::Debug( + "quality (SICN) decreased (%.3f -> %.3f), restore previous geometry", + sicnBefore, stats.sicnMinAfter); + backup.restore(); + } + } + + return true; +} + +struct DQOptions { + bool invertNormalsForQuality = false; + SurfaceProjector *sp = nullptr; +}; + +struct DQStats { + size_t nCornerValFixed = 0; + size_t nCurveValFixed = 0; + size_t nSurfaceValFixed = 0; + size_t nCornerValRemaining = 0; + size_t nCurveValRemaining = 0; + size_t nSurfaceValRemaining = 0; +}; + +int improveCornerValences( + GFace *gf, + const unordered_map<MVertex *, double> + &qValIdeal, /* valence on bdr vertices */ + unordered_map<MVertex *, std::vector<MElement *> > &adj, DQOptions &opt, + DQStats &stats) +{ + Msg::Debug("- Face %i: improve corner valences", gf->tag()); + std::vector<MVertex *> + smoothingPool; /* for smoothing after topological changes */ + smoothingPool.reserve(gf->mesh_vertices.size()); + + /* qValIdeal is unordered_map and its ordering is random, we replace + * it with a deterministic ordering, containing only the corners */ + std::vector<std::pair<MVertex *, double> > cornerAndIdeal; + for(auto &kv : qValIdeal) { + GVertex *gv = dynamic_cast<GVertex *>(kv.first->onWhat()); + if(gv != nullptr) { cornerAndIdeal.push_back({kv.first, kv.second}); } + } + std::sort(cornerAndIdeal.begin(), cornerAndIdeal.end(), + [](const std::pair<MVertex *, double> &lhs, + const std::pair<MVertex *, double> &rhs) { + return lhs.second < rhs.second || + (lhs.second == rhs.second && + lhs.first->getNum() < rhs.first->getNum()); + }); + + int SMALL_PATCH = 0; /* just the quads adjacent to corner */ + int LARGER_PATCH = 1; /* add the neighbors */ + /* We try larger cavities first because the result is usually better + * when it works (less new defects on adjacent curves). But it does + * not work when the larger cavity is too constrained by CAD curves, + * so we try the small cavity after */ + for(int pass : {LARGER_PATCH, SMALL_PATCH}) { + for(const auto &kv : cornerAndIdeal) { + MVertex *v = kv.first; + GVertex *gv = dynamic_cast<GVertex *>(v->onWhat()); + if(gv == nullptr) continue; + + auto it = adj.find(v); + if(it == adj.end()) continue; + const std::vector<MElement *> &quads = it->second; + double ideal = kv.second; + size_t ival = (size_t)clamp(std::round(ideal), 1., 4.); + if(ival == quads.size()) continue; + size_t num = v->getNum(); + + /* From here, we try to change the local configuration */ + Msg::Debug( + "- Face %i: try to fix corner %i (vertex %li), val %li instead of %li", + gf->tag(), gv->tag(), num, it->second.size(), ival); + + /* Init patch with quads adjacent to corner */ + GFaceMeshPatch patch; + if(pass == LARGER_PATCH) { + /* and the neighbors */ + std::vector<MElement *> quadsPlus = quads; + append(quadsPlus, getNeighbors(quads, adj)); + bool okp = patchFromElements(gf, quadsPlus, patch); + if(!okp) continue; + } + else { + bool okp = patchFromElements(gf, quads, patch); + if(!okp) continue; + } + if(patch.bdrVertices.size() != 1) { + Msg::Debug("patch has %li bdr loops, weird", patch.bdrVertices.size()); + continue; + } + if (patch.embVertices.size() > 0) { + Msg::Debug("patch has %li embedded vertices loops, avoid", patch.embVertices.size()); + continue; + } + + std::vector<int> bndIdealValence; + std::vector<std::pair<int, int> > bndAllowedValenceRange; + const int dimCorner = 0; + bool okb = getBoundaryIdealAndAllowedValences(dimCorner, patch, adj, + qValIdeal, bndIdealValence, + bndAllowedValenceRange); + if(!okb) continue; + + GFaceMeshDiff diff; + std::vector<MElement *> neighborsForGeometry = + getNeighbors(patch.elements, adj); + double minSICNafer = 0.1; + int sdq = remeshLocalWithDiskQuadrangulation( + gf, patch.elements, patch.intVertices, patch.bdrVertices.front(), + bndIdealValence, bndAllowedValenceRange, neighborsForGeometry, + minSICNafer, opt.invertNormalsForQuality, opt.sp, diff); + if(sdq == 0) { + /* Copy the pointers to update the adjacencies in case success */ + GFaceMeshPatch patchBefore = diff.before; + GFaceMeshPatch patchAfter = diff.after; + + /* Execute the diff on the mesh */ + bool ok = diff.execute(true); /* warning: GFace mesh changes here */ + if(ok) { + updateAdjacencies(patchBefore, patchAfter, adj); + append(smoothingPool, patchBefore.intVertices); + append(smoothingPool, patchBefore.bdrVertices.front()); + stats.nCornerValFixed += 1; + } + else { + Msg::Error("failed to apply diff, abort"); + abort(); + } + Msg::Debug("-- corner %li fixed", num); + } + else { + Msg::Debug("-- failed to fix corner %li", num); + } + } + } + + if(smoothingPool.size() > 0) + smoothThePool(gf, smoothingPool, adj, opt.invertNormalsForQuality, opt.sp); + + /* Remaining cases, just for stats */ + for(const auto &kv : cornerAndIdeal) { + MVertex *v = kv.first; + GVertex *gv = dynamic_cast<GVertex *>(v->onWhat()); + if(gv == nullptr) continue; + auto it = adj.find(v); + if(it == adj.end()) continue; + const std::vector<MElement *> &quads = it->second; + double ideal = kv.second; + size_t ival = (size_t)clamp(std::round(ideal), 1., 4.); + if(ival == quads.size()) continue; + stats.nCornerValRemaining += 1; + } + + return 0; +} + +int improveCurveValences( + GFace *gf, + const unordered_map<MVertex *, double> + &qValIdeal, /* valence on bdr vertices */ + unordered_map<MVertex *, std::vector<MElement *> > &adj, DQOptions &opt, + DQStats &stats) +{ + Msg::Debug("- Face %i: improve curve valences", gf->tag()); + std::vector<MVertex *> + smoothingPool; /* for smoothing after topological changes */ + smoothingPool.reserve(gf->mesh_vertices.size()); + + /* qValIdeal is unordered_map and its ordering is random, we replace + * it with a deterministic ordering, containing only the corners */ + std::vector<std::pair<MVertex *, double> > curveVertexAndIdeal; + curveVertexAndIdeal.reserve(qValIdeal.size()); + for(auto &kv : qValIdeal) { + MVertex *v = kv.first; + GEdge *ge = dynamic_cast<GEdge *>(v->onWhat()); + if(ge != nullptr) { curveVertexAndIdeal.push_back({kv.first, kv.second}); } + } + std::sort(curveVertexAndIdeal.begin(), curveVertexAndIdeal.end(), + [](const std::pair<MVertex *, double> &lhs, + const std::pair<MVertex *, double> &rhs) { + return lhs.second < rhs.second || + (lhs.second == rhs.second && + lhs.first->getNum() < rhs.first->getNum()); + }); + + for(const auto &kv : curveVertexAndIdeal) { + MVertex *v = kv.first; + GEdge *ge = dynamic_cast<GEdge *>(v->onWhat()); + if(ge == nullptr) continue; + auto it = adj.find(v); + if(it == adj.end()) continue; + const std::vector<MElement *> &quads = it->second; + double ideal = kv.second; + size_t ival = (size_t)clamp(std::round(ideal), 1., 4.); + if(ival == quads.size()) continue; + size_t num = v->getNum(); + + /* From here, we try to change the local configuration */ + Msg::Debug("- Face %i: try to fix curve vertex %li, val %li instead of %li", + gf->tag(), v->getNum(), it->second.size(), ival); + + /* Init patch with quads adjacent to corner */ + GFaceMeshPatch patch; + bool okp = patchFromElements(gf, quads, patch); + if(!okp) continue; + if(patch.bdrVertices.size() != 1) { + Msg::Debug("patch has %li bdr loops, weird", patch.bdrVertices.size()); + continue; + } + if (patch.embVertices.size() > 0) { + Msg::Debug("patch has %li embedded vertices loops, avoid", patch.embVertices.size()); + continue; + } + + std::vector<int> bndIdealValence; + std::vector<std::pair<int, int> > bndAllowedValenceRange; + const int dimCurve = 1; + bool okb = getBoundaryIdealAndAllowedValences( + dimCurve, patch, adj, qValIdeal, bndIdealValence, bndAllowedValenceRange); + if(!okb) continue; + + GFaceMeshDiff diff; + std::vector<MElement *> neighborsForGeometry = + getNeighbors(patch.elements, adj); + double minSICNafer = 0.1; + int sdq = remeshLocalWithDiskQuadrangulation( + gf, patch.elements, patch.intVertices, patch.bdrVertices.front(), + bndIdealValence, bndAllowedValenceRange, neighborsForGeometry, + minSICNafer, opt.invertNormalsForQuality, opt.sp, diff); + if(sdq == 0) { + /* Copy the pointers to update the adjacencies in case success */ + GFaceMeshPatch patchBefore = diff.before; + GFaceMeshPatch patchAfter = diff.after; + + /* Execute the diff on the mesh */ + bool ok = diff.execute(true); /* warning: GFace mesh changes here */ + if(ok) { + updateAdjacencies(patchBefore, patchAfter, adj); + append(smoothingPool, patchBefore.intVertices); + append(smoothingPool, patchBefore.bdrVertices.front()); + stats.nCurveValFixed += 1; + + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after execute"); + } + } + else { + Msg::Error("failed to apply diff, abort"); + abort(); + } + Msg::Debug("-- curve vertex %li fixed", num); + } + else { + Msg::Debug("-- failed to fix curve vertex %li", num); + + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after failed to fix, baaad"); + } + } + } + + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "before pool"); + } + + if(smoothingPool.size() > 0) + smoothThePool(gf, smoothingPool, adj, opt.invertNormalsForQuality, opt.sp); + + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after pool"); + } + + /* Remaining cases, just for stats */ + for(const auto &kv : curveVertexAndIdeal) { + MVertex *v = kv.first; + GEdge *ge = dynamic_cast<GEdge *>(v->onWhat()); + if(ge == nullptr) continue; + auto it = adj.find(v); + if(it == adj.end()) continue; + const std::vector<MElement *> &quads = it->second; + double ideal = kv.second; + size_t ival = (size_t)clamp(std::round(ideal), 1., 4.); + if(ival == quads.size()) continue; + stats.nCurveValRemaining += 1; + } + + return 0; +} + +double irregularityEnergy( + const GFaceMeshPatch &patch, + const unordered_map<MVertex *, double> &qValIdeal, + const unordered_map<MVertex *, std::vector<MElement *> > &adj) +{ + double Ir = 0.; + /* Boundary vertices */ + for(MVertex *v : patch.bdrVertices.front()) { + double valIdeal = 4.; + auto it = qValIdeal.find(v); + if(it != qValIdeal.end()) { valIdeal = it->second; } + auto it2 = adj.find(v); + if(it2 == adj.end()) { continue; } + valIdeal = clamp(std::round(valIdeal), 1., 4.); + + double val = (double)it2->second.size(); + Ir += std::pow(valIdeal - val, 2); + } + /* Interior vertices */ + for(MVertex *v : patch.intVertices) { + double valIdeal = 4.; + auto it2 = adj.find(v); + if(it2 == adj.end()) { continue; } + valIdeal = clamp(std::round(valIdeal), 1., 4.); + double val = (double)it2->second.size(); + Ir += std::pow(valIdeal - val, 2); + } + return Ir; +} + +double irregularityEnergy( + GFace *gf, const std::vector<MElement *> &quads, + const unordered_map<MVertex *, double> &qValIdeal, + const unordered_map<MVertex *, std::vector<MElement *> > &adj) +{ + GFaceMeshPatch patch; + bool okp = patchFromElements(gf, quads, patch); + if(!okp) return 0.; + return irregularityEnergy(patch, qValIdeal, adj); +} + +int improveInteriorValences( + GFace *gf, + const unordered_map<MVertex *, double> + &qValIdeal, /* valence on bdr vertices */ + unordered_map<MVertex *, std::vector<MElement *> > &adj, DQOptions &opt, + DQStats &stats) +{ + Msg::Debug("- Face %i: improve interior valences", gf->tag()); + + std::vector<MVertex *> + smoothingPool; /* for smoothing after topological changes */ + smoothingPool.reserve(gf->mesh_vertices.size()); + + /* Priority queue */ + std::priority_queue<std::pair<double, MVertex *>, + std::vector<std::pair<double, MVertex *> > > + Q; + + /* Initialize with all very irregular vertices of the face */ + for(const auto &kv : adj) { + MVertex *v = kv.first; + GFace *gf = dynamic_cast<GFace *>(v->onWhat()); + if(gf == nullptr) continue; + auto it = adj.find(v); + if(it == adj.end()) continue; + const std::vector<MElement *> &quads = it->second; + const size_t val = quads.size(); + if(3 <= val && val <= 5) continue; + + /* Build patch with quads adjacent to very irregular vertex */ + GFaceMeshPatch patch; + bool okp = patchFromElements(gf, quads, patch); + if(!okp || patch.bdrVertices.size() != 1) continue; + + if (patch.embVertices.size() > 0) { + Msg::Debug("patch has %li embedded vertices loops, avoid", patch.embVertices.size()); + continue; + } + + double Ir = irregularityEnergy(gf, quads, qValIdeal, adj); + if(Ir > 0.) Q.push({Ir, v}); + } + + /* Topological replacement loop */ + while(Q.size() > 0) { + MVertex *v = Q.top().second; + Q.pop(); + + auto it = adj.find(v); + /* Check if vertex still exists, may have been removed */ + if(it == adj.end()) continue; + const std::vector<MElement *> &quads = it->second; + size_t num = v->getNum(); + + /* Build patch with quads adjacent to very irregular vertex */ + GFaceMeshPatch patch; + bool okp = patchFromElements(gf, quads, patch); + if(!okp || patch.bdrVertices.size() != 1) continue; + + /* Get ideal and allowed ranges on the patch boundary */ + std::vector<int> bndIdealValence; + std::vector<std::pair<int, int> > bndAllowedValenceRange; + const int dimCurve = 2; + bool okb = getBoundaryIdealAndAllowedValences( + dimCurve, patch, adj, qValIdeal, bndIdealValence, bndAllowedValenceRange); + if(!okb) continue; + + /* Check if there is a valid disk remeshing */ + GFaceMeshDiff diff; + std::vector<MElement *> neighborsForGeometry = + getNeighbors(patch.elements, adj); + double minSICNafer = 0.1; + int sdq = remeshLocalWithDiskQuadrangulation( + gf, patch.elements, patch.intVertices, patch.bdrVertices.front(), + bndIdealValence, bndAllowedValenceRange, neighborsForGeometry, + minSICNafer, opt.invertNormalsForQuality, opt.sp, diff); + if(sdq == 0) { + /* Copy the pointers to update the adjacencies in case success */ + GFaceMeshPatch patchBefore = diff.before; + GFaceMeshPatch patchAfter = diff.after; + + // GeoLog::add(patchBefore.elements, "-I_v"+std::to_string(v->getNum())); + // GeoLog::add(patchAfter.elements, "+I_v"+std::to_string(v->getNum())); + + /* Execute the diff on the mesh */ + bool ok = diff.execute(true); /* warning: GFace mesh changes here */ + if(ok) { + updateAdjacencies(patchBefore, patchAfter, adj); + append(smoothingPool, patchBefore.intVertices); + append(smoothingPool, patchBefore.bdrVertices.front()); + stats.nSurfaceValFixed += 1; + + /* If new very irregular vertices have been created, + * add them to the queue */ + for(MVertex *bv : patchAfter.bdrVertices.front()) { + auto it2 = adj.find(bv); + if(it2 == adj.end()) continue; + const std::vector<MElement *> &quads2 = it2->second; + if(quads2.size() > 5) { + double Ir2 = irregularityEnergy(gf, quads2, qValIdeal, adj); + if(Ir2 > 0) Q.push({Ir2, bv}); + } + } + } + else { + Msg::Error("failed to apply diff, abort"); + abort(); + } + Msg::Debug("-- interior vertex %li fixed", num); + } + else { + Msg::Debug("-- failed to fix interior vertex %li", num); + // GeoLog::add(quads, "!I_v"+std::to_string(v->getNum())); + } + } + // GeoLog::flush(); + + if(smoothingPool.size() > 0) + smoothThePool(gf, smoothingPool, adj, opt.invertNormalsForQuality, opt.sp); + + /* Remaining cases, just for stats */ + for(const auto &kv : adj) { + MVertex *v = kv.first; + GFace *gf = dynamic_cast<GFace *>(v->onWhat()); + if(gf == nullptr) continue; + auto it = adj.find(v); + if(it == adj.end()) continue; + const std::vector<MElement *> &quads = it->second; + const size_t val = quads.size(); + if(3 <= val && val <= 5) continue; + stats.nSurfaceValRemaining += 1; + } + + return 0; +} + +int RefineMeshWithBackgroundMeshProjection(GModel *gm) +{ + const bool SHOW_INTERMEDIATE_VIEWS = (Msg::GetVerbosity() >= 99); + + const bool SHOW_QUADTRI = SHOW_INTERMEDIATE_VIEWS; + if(SHOW_QUADTRI) { + std::vector<MElement *> elements; + for(GFace *gf : model_faces(gm)) { + append(elements, + dynamic_cast_vector<MTriangle *, MElement *>(gf->triangles)); + append(elements, + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles)); + // showUVParametrization(gf,dynamic_cast_vector<MTriangle*,MElement*>(gf->triangles),"quadtri_uvs"); + // showUVParametrization(gf,dynamic_cast_vector<MQuadrangle*,MElement*>(gf->quadrangles),"quadtri_uvs"); + } + GeoLog::add(elements, "qqs_quadtri"); + GeoLog::flush(); + } + + Msg::Info( + "Refine mesh (midpoint subdivision, with background projection) ..."); + + bool linear = true; + RefineMesh(gm, linear, true, false); + + if(Msg::GetVerbosity() >= 99) { + std::unordered_map<std::string, double> stats; + appendQuadMeshStatistics(gm, stats, "MPS_"); + printStatistics(stats, "Quad mesh after subdivision, before projection:"); + } + + GlobalBackgroundMesh *bmesh = nullptr; + if(backgroudMeshExists(BMESH_NAME)) { + bmesh = &(getBackgroundMesh(BMESH_NAME)); + } + else { + Msg::Warning("refine mesh with background projection: no background mesh, " + "using CAD projection (slow)"); + } + + std::vector<GEdge *> edges = model_edges(gm); + + /* Build custom edgeToFaces because ge->faces() does not work + * for embedded edges */ + std::unordered_map<GEdge*,std::unordered_set<GFace*> > edgeToFaces; + for (GFace* gf: model_faces(gm)) { + std::vector<GEdge*> fedges = face_edges(gf); + for (GEdge* ge: fedges) edgeToFaces[ge].insert(gf); + } + +#if defined(_OPENMP) +#pragma omp parallel for schedule(dynamic) +#endif + for(size_t e = 0; e < edges.size(); ++e) { + GEdge *ge = edges[e]; + if(CTX::instance()->mesh.meshOnlyVisible && !ge->getVisibility()) continue; + if(ge->lines.size() == 0 || ge->mesh_vertices.size() == 0) continue; + + Msg::Debug("- Curve %i: project midpoints on curve", ge->tag()); + unordered_map<MVertex *, MVertex *> old2new_ge; + unordered_map<MVertex *, SPoint3> backupPositionLinear; + double tPrev = 0; + for(size_t i = 0; i < ge->mesh_vertices.size(); ++i) { + MVertex *v = ge->mesh_vertices[i]; + MEdgeVertex *mev = dynamic_cast<MEdgeVertex *>(v); + if(mev == nullptr) { + double t = tPrev; + GPoint proj = ge->closestPoint(v->point(), t); + if(proj.succeeded()) { + /* Need to change the type of the MVertex */ + MVertex *v2 = + new MEdgeVertex(proj.x(), proj.y(), proj.z(), ge, proj.u()); + tPrev = proj.u(); + ge->mesh_vertices[i] = v2; + old2new_ge[v] = v2; + backupPositionLinear[v2] = v->point(); + delete v; + } + else { + Msg::Warning("- Edge %i, vertex %li: curve projection failed", + ge->tag(), v->getNum()); + MVertex *v2 = new MEdgeVertex(v->point().x(), v->point().y(), + v->point().z(), ge, tPrev); + ge->mesh_vertices[i] = v2; + old2new_ge[v] = v2; + backupPositionLinear[v2] = v->point(); + delete v; + } + tPrev = t; + } + } + + bool qualityOk = true; + + /* Update Lines */ + for(MLine *l : ge->lines) + for(size_t lv = 0; lv < 2; ++lv) { + MVertex *v = l->getVertex(lv); + auto it = old2new_ge.find(v); + if(it != old2new_ge.end()) { l->setVertex(lv, it->second); } + } + + /* Update adjacent faces */ + for(GFace *gf : edgeToFaces[ge]) { + for(size_t i = 0; i < gf->getNumMeshElements(); ++i) { + MElement *e = gf->getMeshElement(i); + for(size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex *v = e->getVertex(lv); + auto it = old2new_ge.find(v); + if(it != old2new_ge.end()) { e->setVertex(lv, it->second); } + } + } + + /* Check quality of quads */ + if(gf->quadrangles.size() > 0) { + double sicnMin, sicnAvg; + computeSICN( + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + sicnMin, sicnAvg); + if(sicnMin < 0.) { + Msg::Warning("- refine with projection: quality negative (%.3f) on " + "face %i after curve %i projection, rollback", + sicnMin, gf->tag(), ge->tag()); + qualityOk = false; + } + } + } + + if(!qualityOk) { /* restore positions on the curve */ + for(auto &kv : backupPositionLinear) { kv.first->setXYZ(kv.second); } + } + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInElements( + dynamic_cast_vector<MLine *, MElement *>(ge->lines), + "after curve proj"); + } + } + + std::vector<GFace *> faces = model_faces(gm); +#if defined(_OPENMP) +#pragma omp parallel for schedule(dynamic) +#endif + for(size_t f = 0; f < faces.size(); ++f) { + GFace *gf = faces[f]; + if(CTX::instance()->mesh.meshOnlyVisible && !gf->getVisibility()) continue; + if(CTX::instance()->debugSurface > 0 && + gf->tag() != CTX::instance()->debugSurface) + continue; + if(gf->triangles.size() == 0 && gf->quadrangles.size() == 0) continue; + + SurfaceProjector *sp = nullptr; + if(bmesh) { + auto it = bmesh->faceBackgroundMeshes.find(gf); + if(it == bmesh->faceBackgroundMeshes.end()) { + Msg::Error("background mesh not found for face %i", gf->tag()); + continue; + } + + /* Get pointers to triangles in the background mesh */ + std::vector<MTriangle *> triangles(it->second.triangles.size()); + for(size_t i = 0; i < it->second.triangles.size(); ++i) { + triangles[i] = &(it->second.triangles[i]); + } + + sp = new SurfaceProjector(); + bool oki = sp->initialize(gf, triangles); + if(!oki) { + Msg::Warning("failed to initialize surface projector"); + delete sp; + sp = nullptr; + } + } + + /* Project the vertices which have been introduced by the RefineMesh */ + Msg::Debug("- Face %i: project midpoints on surface", gf->tag()); + bool evalOnCAD = gf->haveParametrization(); + bool projOnCad = false; + if(evalOnCAD && !haveNiceParametrization(gf)) { + /* Strong disortion in parametrization, use projection */ + evalOnCAD = false; + projOnCad = true; + } + + if(Msg::GetVerbosity() >= 999) { + /* In some models (S9 from MAMBO) and with some resolution (clscale 0.1), + * there is this issue of vertex on wrong face ... + * I guess this is because the CAD is garbage (duplicated corners, + * degenerate edges) */ + Msg::Debug("- Face %i, verify vertices before ...", gf->tag()); + for(size_t i = 0; i < gf->getNumMeshElements(); ++i) { + MElement *e = gf->getMeshElement(i); + for(size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex *v = e->getVertex(lv); + if(v->onWhat()->cast2Face() && v->onWhat() != gf) { + Msg::Error( + "- Face %i: element vertex %li is associated to entity (%i,%i)", + gf->tag(), v->getNum(), v->onWhat()->dim(), v->onWhat()->tag()); + abort(); + } + } + } + } + + unordered_map<MVertex *, MVertex *> old2new_gf; + unordered_map<MVertex *, SPoint3> backupPositionLinear; + + for(size_t i = 0; i < gf->mesh_vertices.size(); ++i) { + MVertex *v = gf->mesh_vertices[i]; + if(v->onWhat() != gf) { + Msg::Error("- Face %i: vertex %li is associated to entity (%i,%i)", + gf->tag(), v->getNum(), v->onWhat()->dim(), + v->onWhat()->tag()); + abort(); + } + MFaceVertex *mfv = dynamic_cast<MFaceVertex *>(v); + if(mfv == nullptr) { + GPoint proj; + if(sp != nullptr) { + proj = sp->closestPoint(v->point().data(), evalOnCAD, projOnCad); + + if(!proj.succeeded() && gf->haveParametrization()) { + double uvg[2] = {0., 0.}; + proj = gf->closestPoint(v->point(), uvg); + } + } + else { + double uvg[2] = {0., 0.}; + proj = gf->closestPoint(v->point(), uvg); + } + if(proj.succeeded()) { + /* Need to change the type of the MVertex */ + MVertex *v2 = new MFaceVertex(proj.x(), proj.y(), proj.z(), gf, + proj.u(), proj.v()); + gf->mesh_vertices[i] = v2; + backupPositionLinear[v2] = v->point(); + old2new_gf[v] = v2; + delete v; + } + else { + MVertex *v2 = new MFaceVertex(v->point().x(), v->point().y(), + v->point().z(), gf, 0., 0.); + gf->mesh_vertices[i] = v2; + backupPositionLinear[v2] = v->point(); + old2new_gf[v] = v2; + delete v; + Msg::Warning("- Face %i, vertex %li: surface projection failed", + gf->tag(), v->getNum()); + } + } + } + + /* Update elements */ + for(size_t i = 0; i < gf->getNumMeshElements(); ++i) { + MElement *e = gf->getMeshElement(i); + for(size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex *v = e->getVertex(lv); + auto it2 = old2new_gf.find(v); + if(it2 != old2new_gf.end()) { e->setVertex(lv, it2->second); } + } + } + + if(Msg::GetVerbosity() >= 99) { + Msg::Debug("- Face %i, verify vertices ...", gf->tag()); + for(size_t i = 0; i < gf->getNumMeshElements(); ++i) { + MElement *e = gf->getMeshElement(i); + for(size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex *v = e->getVertex(lv); + if(v->onWhat()->cast2Edge()) { + MEdgeVertex *mev = dynamic_cast<MEdgeVertex *>(v); + if(mev == nullptr) { + Msg::Error("vertex attached to curve %i but not MEdgeVertex", + v->onWhat()->cast2Edge()->tag()); + abort(); + } + } + else if(v->onWhat()->cast2Face()) { + MFaceVertex *mfv = dynamic_cast<MFaceVertex *>(v); + if(mfv == nullptr) { + Msg::Error("vertex attached to face %i but not MFaceVertex", + v->onWhat()->cast2Face()->tag()); + abort(); + } + } + else if(v->onWhat()->cast2Vertex()) { + } + else { + Msg::Error("vertex not attach to a CAD entity"); + } + } + } + } + + /* Check quality of quads */ + if(gf->quadrangles.size() > 0) { + bool qualityOk = true; + double sicnMin, sicnAvg; + computeSICN( + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + sicnMin, sicnAvg); + if(sicnMin < 0.) { + Msg::Warning("- refine with projection: quality negative (%.3f) on " + "face %i after projection, rollback", + sicnMin, gf->tag()); + qualityOk = false; + } + if(!qualityOk) { + for(auto &kv : backupPositionLinear) { kv.first->setXYZ(kv.second); } + } + } + + /* Smooth geometry (quick) */ + if(sp != nullptr) { + double timeMax = 0.3; + optimizeGeometryQuadMesh(gf, sp, timeMax); + } + + if(sp != nullptr) delete sp; + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInElements( + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after surf proj"); + } + } + + const bool SHOW_QUADINIT = SHOW_INTERMEDIATE_VIEWS; + if(SHOW_QUADINIT) { + std::vector<MElement *> elements; + for(GFace *gf : model_faces(gm)) { + append(elements, + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles)); + // showUVParametrization(gf,dynamic_cast_vector<MQuadrangle*,MElement*>(gf->quadrangles),"quad_uvs"); + } + GeoLog::add(elements, "qqs_quadinit"); + GeoLog::flush(); + } + + if(true || Msg::GetVerbosity() >= 99) { + std::unordered_map<std::string, double> stats; + appendQuadMeshStatistics(gm, stats, "Mesh_"); + printStatistics( + stats, "Quad mesh after subdivision, projection and small smoothing:"); + } + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInModel(gm, "after refine + proj"); + } + + return 0; +} + +int optimizeQuadMeshWithDiskQuadrangulationRemeshing(GFace *gf) +{ + if(gf->triangles.size() > 0 || gf->quadrangles.size() == 0) return -1; + + // Disk quadrangulation remeshing use the CAD normals to compute the signed + // quality, so the orientation is important. + bool invertNormals = meshOrientationIsOppositeOfCadOrientation(gf); + + /* For each bdr vertex, compute the ideal valence (based on angle viewed from + * the face) */ + unordered_map<MVertex *, double> qValIdeal; + computeBdrVertexIdealValence(gf->quadrangles, qValIdeal); + + /* Vertex to quads */ + unordered_map<MVertex *, std::vector<MElement *> > adj; + for(MQuadrangle *f : gf->quadrangles) + for(size_t lv = 0; lv < 4; ++lv) { + MVertex *v = f->getVertex(lv); + adj[v].push_back(f); + } + + DQStats stats; + DQOptions opt; + opt.invertNormalsForQuality = invertNormals; + bool alwaysBuildSurfaceProjector = true; + if(alwaysBuildSurfaceProjector || !haveNiceParametrization(gf) || + (gf->periodic(0) || gf->periodic(1))) { + opt.sp = new SurfaceProjector(); + bool okf = fillSurfaceProjector(gf, opt.sp); + if(!okf) { + Msg::Error("- Face %i: failed to get a surface projector", gf->tag()); + return false; + } + } + + double t1 = Cpu(); + + int sc = improveCornerValences(gf, qValIdeal, adj, opt, stats); + if(sc != 0) { + Msg::Warning("optimize quad topology: failed to improve corner valences"); + } + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after corner"); + } + + int scu = improveCurveValences(gf, qValIdeal, adj, opt, stats); + if(scu != 0) { + Msg::Warning("optimize quad topology: failed to improve curve valences"); + } + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after curve"); + } + + int sci = improveInteriorValences(gf, qValIdeal, adj, opt, stats); + if(sci != 0) { + Msg::Warning("optimize quad topology: failed to improve interior valences"); + } + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after interior"); + } + + /* Smooth geometry (quick) */ + double timeMax = 0.3; + optimizeGeometryQuadMesh(gf, opt.sp, timeMax); + + if(opt.sp) { + delete opt.sp; + opt.sp = nullptr; + } + + double t2 = Cpu(); + + Msg::Info("- Face %i: disk quadrangulation remeshing, improved valence on " + "%li/%li/%li corner/curve/surface vertices (in %.3f sec), " + "remaining non-ideal: %li/%li/%li", + gf->tag(), stats.nCornerValFixed, stats.nCurveValFixed, + stats.nSurfaceValFixed, t2 - t1, stats.nCornerValRemaining, + stats.nCurveValRemaining, stats.nSurfaceValRemaining); + + if(PARANO_QUALITY) { + errorAndAbortIfNegativeElement( + gf, dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after geom optim"); + } + + return 0; +} + +int quadMeshingOfSimpleFacesWithPatterns(GModel *gm, + double minimumQualityRequired) +{ + if (CTX::instance()->mesh.quadqsTopoOptimMethods != 0 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 100 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 101 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 110 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 111 + ) { + Msg::Debug("optimize topology of simple CAD faces with patterns: avoided because quadqsTopoOptimMethods = %i", + CTX::instance()->mesh.quadqsTopoOptimMethods); + return 0; + } + + + std::vector<GFace *> faces = model_faces(gm); + Msg::Info("Pattern-based quad meshing of simple CAD faces ...", faces.size()); + + initQuadPatterns(); + +#if defined(_OPENMP) +#pragma omp parallel for schedule(dynamic) +#endif + for(size_t f = 0; f < faces.size(); ++f) { + GFace *gf = faces[f]; + if(gf->meshStatistics.status != GFace::PENDING) continue; + if(CTX::instance()->mesh.meshOnlyVisible && !gf->getVisibility()) continue; + if(CTX::instance()->debugSurface > 0 && + gf->tag() != CTX::instance()->debugSurface) + continue; + if(gf->triangles.size() > 0 || gf->quadrangles.size() == 0) continue; + if(gf->embeddedEdges().size() > 0 || gf->embeddedVertices().size() > 0) continue; + + bool invertNormals = meshOrientationIsOppositeOfCadOrientation(gf); + meshFaceWithGlobalPattern(gf, invertNormals, minimumQualityRequired); + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInElements( + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after face pattern meshing"); + } + } + + std::unordered_map<std::string, double> stats; + appendQuadMeshStatistics(gm, stats, "Mesh_"); + printStatistics(stats, + "Quad mesh after simple face pattern-based remeshing:"); + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInModel( + gm, "global check after face pattern meshing"); + } + + return 0; +} + +int optimizeTopologyWithDiskQuadrangulationRemeshing(GModel *gm) +{ + if (CTX::instance()->mesh.quadqsTopoOptimMethods != 0 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 10 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 11 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 110 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 111 + ) { + Msg::Debug("optimize topology with disk quadrangulation remeshing: avoided because quadqsTopoOptimMethods = %i", + CTX::instance()->mesh.quadqsTopoOptimMethods); + return 0; + } + + Msg::Info( + "Optimize topology of quad meshes with disk quadrangulation remeshing ..."); + + initDiskQuadrangulations(); + + std::vector<GFace *> faces = model_faces(gm); + +#if defined(_OPENMP) +#pragma omp parallel for schedule(dynamic) +#endif + for(size_t f = 0; f < faces.size(); ++f) { + GFace *gf = faces[f]; + if(gf->meshStatistics.status != GFace::PENDING) continue; + if(CTX::instance()->mesh.meshOnlyVisible && !gf->getVisibility()) continue; + if(CTX::instance()->debugSurface > 0 && + gf->tag() != CTX::instance()->debugSurface) + continue; + if(gf->triangles.size() > 0 || gf->quadrangles.size() == 0) continue; + + optimizeQuadMeshWithDiskQuadrangulationRemeshing(gf); + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInElements( + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after disk quadrangulation remeshing"); + } + } + + std::unordered_map<std::string, double> stats; + appendQuadMeshStatistics(gm, stats, "Mesh_"); + printStatistics(stats, "Quad mesh after disk quadrangulation remeshing:"); + + if(stats["Mesh_SICN_min"] < 0.) { + Msg::Warning("negative quality on some quads"); + } + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInModel( + gm, "global check after disk quadrangulation remeshing"); + } + + return 0; +} + +int optimizeTopologyWithCavityRemeshing(GModel *gm) +{ + if (CTX::instance()->mesh.quadqsTopoOptimMethods != 0 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 1 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 11 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 101 + && CTX::instance()->mesh.quadqsTopoOptimMethods != 111 + ) { + Msg::Debug("optimize topology with cavity remeshing: avoided because quadqsTopoOptimMethods = %i", + CTX::instance()->mesh.quadqsTopoOptimMethods); + return 0; + } + + std::vector<GFace *> faces = model_faces(gm); + Msg::Info( + "Optimize topology of quad meshes with cavity remeshing (%li faces) ...", + faces.size()); + + initQuadPatterns(); + + if (!backgroudMeshExists(BMESH_NAME)) { + Msg::Info("no background mesh, creating one with the current quad mesh"); + GlobalBackgroundMesh &bmesh = getBackgroundMesh(BMESH_NAME); + int status = bmesh.importGModelMeshes(gm, true); + if(status != 0) { + Msg::Error("failed to import model mesh in background mesh"); + return -1; + } + } + +#if defined(_OPENMP) +#pragma omp parallel for schedule(dynamic) +#endif + for(size_t f = 0; f < faces.size(); ++f) { + GFace *gf = faces[f]; + if(gf->meshStatistics.status != GFace::PENDING) continue; + if(CTX::instance()->mesh.meshOnlyVisible && !gf->getVisibility()) continue; + if(CTX::instance()->debugSurface > 0 && + gf->tag() != CTX::instance()->debugSurface) + continue; + if(gf->triangles.size() > 0 || gf->quadrangles.size() == 0) continue; + gf->meshStatistics.status = GFace::DONE; + + /* Get singularities from global storage */ + std::vector<std::pair<SPoint3, int> > singularities; + bool okg = getSingularitiesFromBackgroundField(gf, singularities); + if (!okg) { + Msg::Warning("- Face %i: failed to get singularities from background field", gf->tag()); + } + + bool invertNormals = meshOrientationIsOppositeOfCadOrientation(gf); + improveQuadMeshTopologyWithCavityRemeshing(gf, singularities, + invertNormals); + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInElements( + dynamic_cast_vector<MQuadrangle *, MElement *>(gf->quadrangles), + "after cavity remeshing"); + } + } + + std::unordered_map<std::string, double> stats; + appendQuadMeshStatistics(gm, stats, "Mesh_"); + printStatistics(stats, "Quad mesh after cavity remeshing:"); + + writeStatistics(stats, "quadqs_statistics.json"); + + if(PARANO_VALIDITY) { + errorAndAbortIfInvalidVertexInModel(gm, + "global check after cavity remeshing"); + } + + GeoLog::flush(); + + return 0; +} + +#else +/* else: without QUADMESHINGTOOLS module*/ + +int BuildBackgroundMeshAndGuidingField(GModel *gm, bool overwriteGModelMesh, + bool deleteGModelMeshAfter, int N) +{ + Msg::Error("Module QUADMESHINGTOOLS required for function " + "BuildBackgroundMeshAndGuidingField"); + return -10; +} +bool backgroundMeshAndGuidingFieldExists(GModel *gm) +{ + Msg::Error("Module QUADMESHINGTOOLS required for function " + "backgroundMeshAndGuidingFieldExists"); + return -10; +} +int optimizeTopologyWithDiskQuadrangulationRemeshing(GModel *gm) +{ + Msg::Error("Module QUADMESHINGTOOLS required for function " + "optimizeTopologyWithCavityRemeshing"); + return -10; +} +int optimizeTopologyWithCavityRemeshing(GModel *gm) +{ + Msg::Error("Module QUADMESHINGTOOLS required for function " + "optimizeTopologyWithCavityRemeshing"); + return -10; +} +int quadMeshingOfSimpleFacesWithPatterns(GModel *gm, + double minimumQualityRequired) +{ + Msg::Error("Module QUADMESHINGTOOLS required for function " + "quadMeshingOfSimpleFacesWithPatterns"); + return -10; +} +int RefineMeshWithBackgroundMeshProjection(GModel *gm) +{ + Msg::Error("Module QUADMESHINGTOOLS required for function " + "RefineMeshWithBackgroundMeshProjection"); + return -10; +} + +#endif +/* endif: QUADMESHINGTOOLS*/ + +int transferSeamGEdgesVerticesToGFace(GModel *gm) +{ + for(GFace *gf : gm->getFaces()) { + /* Transfer the vertices from seam GEdge to associated GFace */ + std::unordered_map<MVertex *, MVertex *> old2new; + for(GEdge *ge : gf->edges()) { + if(ge->isSeam(gf) && ge->faces().size() == 1 && ge->faces()[0] == gf) { + /* GEdge interior vertices */ + for(MVertex *ov : ge->mesh_vertices) { + auto it = old2new.find(ov); + if(it != old2new.end()) continue; /* already changed */ + SPoint3 p = ov->point(); + double t; + ov->getParameter(0, t); + SPoint2 uv = ge->reparamOnFace(gf, t, -1); + MVertex *nv = new MFaceVertex(p.x(), p.y(), p.z(), gf, uv[0], uv[1]); + nv->setParameter(0, uv[0]); + nv->setParameter(1, uv[1]); + gf->mesh_vertices.push_back(nv); + old2new[ov] = nv; + delete ov; + } + ge->mesh_vertices.clear(); + for(size_t i = 0; i < ge->lines.size(); ++i) { delete ge->lines[i]; } + ge->lines.clear(); + + /* GEdge boundary vertices */ + for(GVertex *gv : ge->vertices()) + if(gv->mesh_vertices.size() == 1) { + std::vector<GEdge *> otherCurves; + for(GEdge *ge2 : gv->edges()) + if(ge2 != ge) { + if(ge2->vertices().front() == ge2->vertices().back() && + ge2->length() < + CTX::instance()->geom.tolerance) { /* Empty curve */ + continue; + } + otherCurves.push_back(ge2); + } + std::sort(otherCurves.begin(), otherCurves.end()); + otherCurves.erase( + std::unique(otherCurves.begin(), otherCurves.end()), + otherCurves.end()); + + if(otherCurves.size() > 0) continue; + MVertex *ov = gv->mesh_vertices[0]; + auto it = old2new.find(ov); + if(it != old2new.end()) continue; /* already changed */ + Msg::Debug( + "transfer: mesh vertex at CAD corner %i moved to face %i", + gv->tag(), gf->tag()); + SPoint3 p = ov->point(); + SPoint2 uv = gv->reparamOnFace(gf, 0); + MVertex *nv = + new MFaceVertex(p.x(), p.y(), p.z(), gf, uv[0], uv[1]); + nv->setParameter(0, uv[0]); + nv->setParameter(1, uv[1]); + gf->mesh_vertices.push_back(nv); + old2new[ov] = nv; + + /* Note/warning: let the MVertex on the GVertex live. If the MVertex + * is deleted, I/O is broken. + * FIXME: support for GVertex without MVertex in mesh I/O */ + // delete ov; + // gv->mesh_vertices.clear(); + } + } + } + if(old2new.size() > 0) { + for(MElement *f : gf->triangles) + for(size_t lv = 0; lv < 3; ++lv) { + MVertex *v = f->getVertex(lv); + auto it = old2new.find(v); + if(it != old2new.end()) { f->setVertex(lv, it->second); } + } + for(MElement *f : gf->quadrangles) + for(size_t lv = 0; lv < 4; ++lv) { + MVertex *v = f->getVertex(lv); + auto it = old2new.find(v); + if(it != old2new.end()) { f->setVertex(lv, it->second); } + } + } + } + return 0; +} + +QuadqsContextUpdater::QuadqsContextUpdater() +{ + algo2d = CTX::instance()->mesh.algo2d; + recombineAll = CTX::instance()->mesh.recombineAll; + algoRecombine = CTX::instance()->mesh.algoRecombine; + recombineOptimizeTopology = CTX::instance()->mesh.recombineOptimizeTopology; + lcFactor = CTX::instance()->mesh.lcFactor; + lcMin = CTX::instance()->mesh.lcMin; + lcMax = CTX::instance()->mesh.lcMax; + lcFromPoints = CTX::instance()->mesh.lcFromPoints; + minCurveNodes = CTX::instance()->mesh.minCurveNodes; + minCircleNodes = CTX::instance()->mesh.minCircleNodes; + + setQuadqsOptions(); +} + +QuadqsContextUpdater::~QuadqsContextUpdater() { restoreInitialOption(); } + +void QuadqsContextUpdater::setQuadqsOptions() +{ + Msg::Debug("set special quadqs options in the global context"); + CTX::instance()->mesh.algo2d = ALGO_2D_QUAD_QUASI_STRUCT; + CTX::instance()->mesh.recombineAll = 1; + CTX::instance()->mesh.algoRecombine = 0; + CTX::instance()->mesh.recombineOptimizeTopology = 0; + CTX::instance()->mesh.lcFactor = 1.; + CTX::instance()->mesh.lcMin = 0.; + CTX::instance()->mesh.lcMax = 1.e22; + CTX::instance()->mesh.lcFromPoints = 0; + CTX::instance()->mesh.minCurveNodes = 0; + CTX::instance()->mesh.minCircleNodes = 0; +} + +void QuadqsContextUpdater::restoreInitialOption() +{ + Msg::Debug("restore options in the global context"); + CTX::instance()->mesh.algo2d = algo2d; + CTX::instance()->mesh.recombineAll = recombineAll; + CTX::instance()->mesh.algoRecombine = algoRecombine; + CTX::instance()->mesh.recombineOptimizeTopology = recombineOptimizeTopology; + CTX::instance()->mesh.lcFactor = lcFactor; + CTX::instance()->mesh.lcMin = lcMin; + CTX::instance()->mesh.lcMax = lcMax; + CTX::instance()->mesh.lcFromPoints = lcFromPoints; + CTX::instance()->mesh.minCurveNodes = minCurveNodes; + CTX::instance()->mesh.minCircleNodes = minCircleNodes; +} diff --git a/Mesh/meshQuadQuasiStructured.h b/Mesh/meshQuadQuasiStructured.h new file mode 100644 index 0000000000000000000000000000000000000000..dd2c38d9f2aa9af5505c1cabca9ff7eb01a8dcdd --- /dev/null +++ b/Mesh/meshQuadQuasiStructured.h @@ -0,0 +1,132 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. + +#ifndef MESH_QUAD_QUASI_STRUCTURED_H +#define MESH_QUAD_QUASI_STRUCTURED_H + +class GModel; + +/** + * @brief The QuadQuasiStructured meshing mode requires control + * over various meshing parameters which are stored in the + * global context. To deal with this without adding conditions + * everywhere in the other meshing parts, we use this updater + * which must be created at the beginning of the meshing cycle, + * and deleted at the end to restore the initial values. + */ +class QuadqsContextUpdater { +public: + QuadqsContextUpdater(); + ~QuadqsContextUpdater(); + +protected: + void setQuadqsOptions(); + void restoreInitialOption(); + +protected: + int algo2d; + int recombineAll; + int algoRecombine; + int recombineOptimizeTopology; + double lcFactor; + double lcMin; + double lcMax; + int lcFromPoints; + int minCurveNodes; + int minCircleNodes; +}; + +/** + * @brief + * + * @param[in] gm GModel containing the CAD and/or meshes + * @param[in] overwriteGModelMesh delete existing mesh, rebuild from CAD + * @param[in] deleteGModelMeshAfter after background mesh creation, delete the + * GModel mesh + * @param[in] N the N-symmetry field invariance. N=4 for cross and N=6 for + * asterisk fields + * + * @return 0 if success + */ +int BuildBackgroundMeshAndGuidingField(GModel *gm, + bool overwriteGModelMesh = false, + bool deleteGModelMeshAfter = false, + int N = 4); + +/** + * @brief To check if a compatible background mesh and + * guiding field already exists + * + * @return true if exists + */ +bool backgroundMeshAndGuidingFieldExists(GModel *gm); + +/** + * @brief Look for non-ideal vertex valences in quad mesh and find a better + * local remeshing by looking into all disk quadrangulations. + * Quad quality (SICN) is monitored and the minimum will not decrease. + * Executes over CAD faces in parallel if multiple threads available. + * Only faces whose meshing status is GFace::PENDING are processed + * + * @param gm The model containing the face quad meshes. + * + * @return 0 if success + */ +int optimizeTopologyWithDiskQuadrangulationRemeshing(GModel *gm); + +/** + * @brief Mesh vertices on seam curves (and isolated corners) are + * reparametrized on the associated GFace and transfered. + * The seam curves have empty meshes in the end. + * + * @param gm The model containing the meshes + * + * @return 0 if success + */ +int transferSeamGEdgesVerticesToGFace(GModel *gm); + +/** + * @brief Look for patches of quads with >=3 irregular vertices which + * can be remeshed with more regular quad meshes. The replacement + * meshes are subdivisions of a list of predefined patterns. + * Irregular vertices matching cross field singularities are + * preserved. + * Executes over CAD faces in parallel if multiple threads available. + * Only faces whose meshing status is GFace::PENDING are processed + * + * @param gm The model containing the face quad meshes. + * + * @return 0 if success + */ +int optimizeTopologyWithCavityRemeshing(GModel *gm); + +/** + * @brief Look for simple CAD faces (topological disk, a few corners) + * which can be remeshed with simple quad patterns. + * The patterns are the same that are used in cavity remeshing. + * Executes over CAD faces in parallel if multiple threads available. + * Only faces whose meshing status is GFace::PENDING are processed + * + * @param gm The model containing the face quad meshes. + * @param minimumQualityRequired Minimum quality (SICN) required to accept a new + * quad mesh + * + * @return 0 if success + */ +int quadMeshingOfSimpleFacesWithPatterns(GModel *gm, + double minimumQualityRequired = 0.5); + +/** + * @brief Midpoint subdivision of the surface mesh with projections + * on the CAD surfaces, using the background mesh for + * faster projections. + * + * @param gm The model containg the surface meshes + * + * @return 0 if success + */ +int RefineMeshWithBackgroundMeshProjection(GModel *gm); + +#endif diff --git a/Mesh/meshRelocateVertex.cpp b/Mesh/meshRelocateVertex.cpp index 616845d417e21100b3352864ada99c0a00ce8a71..fcde60011abda7167e0a03f92c283481a0acb1c5 100644 --- a/Mesh/meshRelocateVertex.cpp +++ b/Mesh/meshRelocateVertex.cpp @@ -410,6 +410,7 @@ void getAllBoundaryLayerVertices(GFace *gf, std::set<MVertex *> &vs); void RelocateVertices(GFace *gf, int niter, double tol) { if(!niter) return; + Msg::Debug("relocate vertices (face %i)", gf->tag()); std::set<MVertex *> vs; getAllBoundaryLayerVertices(gf, vs); diff --git a/Mesh/meshTriangulation.cpp b/Mesh/meshTriangulation.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c712e2dd469fed483f4320ea3855557d38a01321 --- /dev/null +++ b/Mesh/meshTriangulation.cpp @@ -0,0 +1,735 @@ +// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. + +#include <utility> +#include <list> +#include <map> +#include <unordered_map> +#include "gmsh.h" +#include "GModel.h" +#include "GFace.h" +#include "GEdge.h" +#include "MLine.h" +#include "MVertex.h" +#include "MTriangle.h" +#include "meshTriangulation.h" +#include "SBoundingBox3d.h" +#include "robustPredicates.h" +#include "meshGFaceDelaunayInsertion.h" +#include "qualityMeasures.h" +#include "Numeric.h" + +void swap(double &a, double &b) +{ + double temp = a; + a = b; + b = temp; +} + +size_t HilbertCoordinates(double x, double y, double x0, double y0, double xRed, + double yRed, double xBlue, double yBlue) +{ + size_t BIG = 1073741824; + size_t RESULT = 0; + for(int i = 0; i < 16; i++) { + double coordRed = (x - x0) * xRed + (y - y0) * yRed; + double coordBlue = (x - x0) * xBlue + (y - y0) * yBlue; + xRed /= 2; + yRed /= 2; + xBlue /= 2; + yBlue /= 2; + if(coordRed <= 0 && coordBlue <= 0) { // quadrant 0 + x0 -= (xBlue + xRed); + y0 -= (yBlue + yRed); + swap(xRed, xBlue); + swap(yRed, yBlue); + } + else if(coordRed <= 0 && coordBlue >= 0) { // quadrant 1 + RESULT += BIG; + x0 += (xBlue - xRed); + y0 += (yBlue - yRed); + } + else if(coordRed >= 0 && coordBlue >= 0) { // quadrant 2 + RESULT += 2 * BIG; + x0 += (xBlue + xRed); + y0 += (yBlue + yRed); + } + else if(coordRed >= 0 && coordBlue <= 0) { // quadrant 3 + x0 += (-xBlue + xRed); + y0 += (-yBlue + yRed); + swap(xRed, xBlue); + swap(yRed, yBlue); + xBlue = -xBlue; + yBlue = -yBlue; + xRed = -xRed; + yRed = -yRed; + RESULT += 3 * BIG; + } + else + Msg::Warning("Hilbert failed %d %d", coordRed, coordBlue); + BIG /= 4; + } + return RESULT; +} + +struct pair_hash { + template <class T1, class T2> + std::size_t operator()(const std::pair<T1, T2> &pair) const + { + return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second); + } +}; + +int GFace2PolyMesh(int faceTag, PolyMesh **pm) +{ + *pm = new PolyMesh; + + std::unordered_map<size_t, size_t> nodeLabels; + + { + std::vector<std::size_t> nodeTags; + std::vector<double> coord; + std::vector<double> parametricCoord; + gmsh::model::mesh::getNodes(nodeTags, coord, parametricCoord, 2, faceTag, + true, true); + + size_t j = 0; + for(size_t i = 0; i < nodeTags.size(); i++, j += 2) { + (*pm)->vertices.push_back(new PolyMesh::Vertex( + parametricCoord[j], parametricCoord[j + 1], 0.0, nodeTags[i])); + nodeLabels[nodeTags[i]] = i; + } + } + + { + std::vector<int> elementTypes = {3}; + std::vector<std::vector<std::size_t> > elementTags; + std::vector<std::vector<std::size_t> > nodeTags; + gmsh::model::mesh::getElements(elementTypes, elementTags, nodeTags, 2, + faceTag); + std::unordered_map<std::pair<size_t, size_t>, PolyMesh::HalfEdge *, + pair_hash> + opposites; + + for(size_t i = 0; i < nodeTags.size(); i += 3) { + size_t currentHE = (*pm)->hedges.size(); + size_t currentF = (*pm)->faces.size(); + for(int j = 0; j < 3; j++) + (*pm)->hedges.push_back( + new PolyMesh::HalfEdge((*pm)->vertices[nodeTags[0][i + j]])); + PolyMesh::HalfEdge *he0 = (*pm)->hedges[currentHE + 0]; + PolyMesh::HalfEdge *he1 = (*pm)->hedges[currentHE + 1]; + PolyMesh::HalfEdge *he2 = (*pm)->hedges[currentHE + 2]; + (*pm)->faces.push_back(new PolyMesh::Face(he0)); + he0->prev = he2; + he0->next = he1; + he1->prev = he0; + he1->next = he2; + he2->prev = he1; + he2->next = he0; + he0->v->he = he0; + he1->v->he = he1; + he2->v->he = he2; + he0->f = (*pm)->faces[currentF]; + he1->f = (*pm)->faces[currentF]; + he2->f = (*pm)->faces[currentF]; + std::pair<size_t, size_t> p0 = + std::make_pair(nodeTags[0][i + 1], nodeTags[0][i]); + std::pair<size_t, size_t> p1 = + std::make_pair(nodeTags[0][i + 2], nodeTags[0][i + 1]); + std::pair<size_t, size_t> p2 = + std::make_pair(nodeTags[0][i], nodeTags[0][i + 2]); + auto it0 = opposites.find(p0); + auto it1 = opposites.find(p1); + auto it2 = opposites.find(p2); + if(it0 == opposites.end()) { + p0 = std::make_pair(nodeTags[0][i + 0], nodeTags[0][i + 1]); + opposites[p0] = he0; + } + else { + he0->opposite = it0->second; + it0->second->opposite = he0; + } + + if(it1 == opposites.end()) { + p1 = std::make_pair(nodeTags[0][i + 1], nodeTags[0][i + 2]); + opposites[p1] = he1; + } + else { + he1->opposite = it1->second; + it1->second->opposite = he1; + } + + if(it2 == opposites.end()) { + p2 = std::make_pair(nodeTags[0][i + 2], nodeTags[0][i]); + opposites[p2] = he2; + } + else { + he2->opposite = it2->second; + it2->second->opposite = he2; + } + } + } + return 0; +} + +static int delaunayEdgeCriterionPlaneIsotropic(PolyMesh::HalfEdge *he, void *) +{ + if(he->opposite == NULL) return -1; + PolyMesh::Vertex *v0 = he->v; + PolyMesh::Vertex *v1 = he->next->v; + PolyMesh::Vertex *v2 = he->next->next->v; + PolyMesh::Vertex *v = he->opposite->next->next->v; + + // FIXME : should be oriented anyway ! + double result = -robustPredicates::incircle(v0->position, v1->position, + v2->position, v->position); + + return (result > 0) ? 1 : 0; +} + +static void faceCircumCenter(PolyMesh::HalfEdge *he, GFace *gf, double *res, + double *uv) +{ + PolyMesh::Vertex *v0 = he->v; + PolyMesh::Vertex *v1 = he->next->v; + PolyMesh::Vertex *v2 = he->next->next->v; + GPoint p0 = gf->point(v0->position.x(), v0->position.y()); + GPoint p1 = gf->point(v1->position.x(), v1->position.y()); + GPoint p2 = gf->point(v2->position.x(), v2->position.y()); + double q0[3] = {p0.x(), p0.y(), p0.z()}; + double q1[3] = {p1.x(), p1.y(), p1.z()}; + double q2[3] = {p2.x(), p2.y(), p2.z()}; + circumCenterXYZ(q0, q1, q2, res, uv); +} + +static double faceQuality(PolyMesh::HalfEdge *he, GFace *gf) +{ + PolyMesh::Vertex *v0 = he->v; + PolyMesh::Vertex *v1 = he->next->v; + PolyMesh::Vertex *v2 = he->next->next->v; + GPoint p0 = gf->point(v0->position.x(), v0->position.y()); + GPoint p1 = gf->point(v1->position.x(), v1->position.y()); + GPoint p2 = gf->point(v2->position.x(), v2->position.y()); + return qmTriangle::gamma(p0.x(), p0.y(), p0.z(), p1.x(), p1.y(), p1.z(), + p2.x(), p2.y(), p2.z()); +} + +/* +static int qualityCriterion3D(PolyMesh::HalfEdge *he, void *p){ + if (he->data > 0) return -1; + if (he->opposite == nullptr) return -1; + if (p == nullptr) return -1; + + GFace *gf = (GFace*)p; + + PolyMesh::Vertex *v0 = he->v; + PolyMesh::Vertex *v1 = he->next->v; + PolyMesh::Vertex *v2 = he->next->next->v; + PolyMesh::Vertex *v3 = he->opposite->next->next->v; + + GPoint p0 = gf->point (v0->position.x(),v0->position.y()); + GPoint p1 = gf->point (v1->position.x(),v1->position.y()); + GPoint p2 = gf->point (v2->position.x(),v2->position.y()); + GPoint p3 = gf->point (v3->position.x(),v3->position.y()); + + double q1 = qmTriangle::gamma +(p0.x(),p0.y(),p0.z(),p1.x(),p1.y(),p1.z(),p2.x(),p2.y(),p2.z()); double q2 = +qmTriangle::gamma +(p2.x(),p2.y(),p2.z(),p3.x(),p3.y(),p3.z(),p0.x(),p0.y(),p0.z()); + + double o1 = qmTriangle::gamma +(p1.x(),p1.y(),p1.z(),p2.x(),p2.y(),p2.z(),p3.x(),p3.y(),p3.z()); double o2 = +qmTriangle::gamma +(p3.x(),p3.y(),p3.z(),p0.x(),p0.y(),p0.z(),p1.x(),p1.y(),p1.z()); + + return std::max(fabs(q1),fabs(q2)) > std::max(fabs(o1),fabs(o2)) ? 0 : 1; +} +*/ + +static PolyMesh::Face *Walk(PolyMesh::Face *f, double x, double y) +{ + double POS[2] = {x, y}; + PolyMesh::HalfEdge *he = f->he; + + while(1) { + PolyMesh::Vertex *v0 = he->v; + PolyMesh::Vertex *v1 = he->next->v; + PolyMesh::Vertex *v2 = he->next->next->v; + + double s0 = -robustPredicates::orient2d(v0->position, v1->position, POS); + double s1 = -robustPredicates::orient2d(v1->position, v2->position, POS); + double s2 = -robustPredicates::orient2d(v2->position, v0->position, POS); + + if(s0 >= 0 && s1 >= 0 && s2 >= 0) { + /* printf("Face %g %g %g / %g %g %g / %g %g %g \n", + v0->position.x(), v0->position.y(), v0->position.z(), + v1->position.x(), v1->position.y(), v1->position.z(), + v2->position.x(), v2->position.y(), v2->position.z()); + printf("point %g %g CURRENT FACE %p %g %g %g\n", x,y,he->f, + s0,s1,s2);*/ + // getchar(); + return he->f; + } + else if(s0 <= 0 && s1 >= 0 && s2 >= 0) + he = he->opposite; + else if(s1 <= 0 && s0 >= 0 && s2 >= 0) + he = he->next->opposite; + else if(s2 <= 0 && s0 >= 0 && s1 >= 0) + he = he->next->next->opposite; + else if(s0 <= 0 && s1 <= 0) + he = s0 > s1 ? he->opposite : he->next->opposite; + else if(s0 <= 0 && s2 <= 0) + he = s0 > s2 ? he->opposite : he->next->next->opposite; + else if(s1 <= 0 && s2 <= 0) + he = s1 > s2 ? he->next->opposite : he->next->next->opposite; + else { + printf("Face %g %g %g / %g %g %g / %g %g %g \n", v0->position.x(), + v0->position.y(), v0->position.z(), v1->position.x(), + v1->position.y(), v1->position.z(), v2->position.x(), + v2->position.y(), v2->position.z()); + printf("ERROR point %g %g CURRENT FACE %p %g %g %g\n", x, y, he->f, s0, + s1, s2); + } + if(he == NULL) break; + } + // should only come here wether the triangulated domain is not convex + // printf("NO FACE FOUND\n"); + return NULL; +} + +// recover an edge that goes from v_start --> v_end +// ----------------------------------- assume it's internal !!! + +static int intersect(PolyMesh::Vertex *v0, PolyMesh::Vertex *v1, + PolyMesh::Vertex *b0, PolyMesh::Vertex *b1) +{ + double s0 = + robustPredicates::orient2d(v0->position, v1->position, b0->position); + double s1 = + robustPredicates::orient2d(v0->position, v1->position, b1->position); + if(s0 * s1 >= 0) return 0; + double t0 = + robustPredicates::orient2d(b0->position, b1->position, v0->position); + double t1 = + robustPredicates::orient2d(b0->position, b1->position, v1->position); + if(t0 * t1 >= 0) return 0; + return 1; +} + +int recover_edge(PolyMesh *pm, PolyMesh::Vertex *v_start, + PolyMesh::Vertex *v_end) +{ + PolyMesh::HalfEdge *he = v_start->he; + std::list<PolyMesh::HalfEdge *> _list; + + // printf("recovering edge %d %d\n",v_start->data,v_end->data); + + do { + PolyMesh::Vertex *v1 = he->next->v; + if(v1 == v_end) { + return 0; // edge exists + } + PolyMesh::Vertex *v2 = he->next->next->v; + if(v2 == v_end) { + return 0; // edge exists + } + + if(intersect(v_start, v_end, v1, v2)) { + // printf("INTERSECTION WITH %d %d\n",v1->data,v2->data); + _list.push_back(he->next); + break; + } + he = he->next->next->opposite; + } while(he != v_start->he); + + if(_list.empty()) { return -1; } + + // -)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-) + // find all intersections + while(1) { + he = _list.back(); + he = he->opposite; + if(!he) return -2; + he = he->next; + PolyMesh::Vertex *v1 = he->v; + PolyMesh::Vertex *v2 = he->next->v; + if(v2 == v_end) { + // printf("END FOUND %d\n",v2->data); + break; + } + if(intersect(v_start, v_end, v1, v2)) { + // printf("INTESECTION %d %d\n",v1->data,v2->data); + _list.push_back(he); + } + else { + he = he->next; + v1 = he->v; + v2 = he->next->v; + if(v2 == v_end) { + // printf("END FOUND %d\n",v2->data); + break; + } + if(intersect(v_start, v_end, v1, v2)) { + // printf("INTESECTION %d %d\n",v1->data,v2->data); + _list.push_back(he); + } + else { + return -3; + } + } + } + + int nbIntersection = _list.size(); + // printf("%d intersections\n",nbIntersection); + // int K = 100; + while(!_list.empty()) { + he = *_list.begin(); + _list.erase(_list.begin()); + // ensure that swap is allowed (convex quad) + if(intersect(he->v, he->next->v, he->next->next->v, + he->opposite->next->next->v)) { + // ensure that swap removes one intersection + int still_intersect = intersect(v_start, v_end, he->next->next->v, + he->opposite->next->next->v); + // printf("swapping %d %d\n",he->v->data,he->next->v->data); + pm->swap_edge(he); + // pm->print4debug(K++); + if(still_intersect) _list.push_back(he); + } + else + _list.push_back(he); + } + return nbIntersection; +} +//------------------------------------------------------------------------------------- + +static PolyMesh::HalfEdge *Color(PolyMesh::HalfEdge *he, int color) +{ + std::stack<PolyMesh::Face *> _stack; + _stack.push(he->f); + + PolyMesh::HalfEdge *other_side = nullptr; + + while(!_stack.empty()) { + PolyMesh::Face *f = _stack.top(); + _stack.pop(); + f->data = color; + he = f->he; + for(int i = 0; i < 3; i++) { + if(he->data == -1 && he->opposite != NULL && + he->opposite->f->data == -1) { + _stack.push(he->opposite->f); + } + else if(he->data != -1 && he->opposite != NULL) { + other_side = he->opposite; + } + he = he->next; + } + } + return other_side; +} + +void GFaceDelaunayRefinement(size_t faceTag) +{ + GFace *gf = GModel::current()->getFaceByTag(faceTag); + + PolyMesh *pm = GFaceInitialMesh(faceTag, 1); + + std::list<PolyMesh::HalfEdge *> _list; + double _limit = 0.7; + for(auto f : pm->faces) { + double q = faceQuality(f->he, gf); + if(q < _limit && f->data == gf->tag()) _list.push_back(f->he); + } + // int I = 1; + while(!_list.empty()) { + PolyMesh::HalfEdge *he = *_list.begin(); + _list.erase(_list.begin()); + double q = faceQuality(he, gf); + if(q < _limit) { + double uv[2]; + SPoint3 cc; + faceCircumCenter(he, gf, cc, uv); + GPoint gp = gf->closestPoint(cc, uv); + if(gp.succeeded()) { + PolyMesh::Face *f = he->f; + f = Walk(f, gp.u(), gp.v()); + if(f && f->data == (int)faceTag) { + std::vector<PolyMesh::HalfEdge *> _touched; + pm->split_triangle(gp.u(), gp.v(), 0, f, + delaunayEdgeCriterionPlaneIsotropic, gf, + &_touched); + if(_touched.size() == 3) { + // we should unsplit ... + // pm->undo_split(_touched); + } + else { + std::vector<PolyMesh::Face *> _f; + for(auto h : _touched) + if(std::find(_f.begin(), _f.end(), h->f) == _f.end()) + _f.push_back(h->f); + + // printf("step %d %lu touched : ",I,_f.size()); + for(auto pf : _f) { + q = faceQuality(pf->he, gf); + // printf("%12.5E ",q); + if(q < _limit && pf->data == gf->tag()) _list.push_back(pf->he); + } + // printf("\n"); + } + // pm->print4debug(100000+I++); + } + } + } + } +} + +void GFaceDelaunayRefinementOldMesher(int faceTag) +{ + PolyMesh *pm = GFaceInitialMesh(faceTag); + + GFace *gf = GModel::current()->getFaceByTag(faceTag); + + // use old code --- + + for(auto f : pm->faces) { + if(f->data == faceTag) { + size_t n0 = f->he->v->data; + size_t n1 = f->he->next->v->data; + size_t n2 = f->he->next->next->v->data; + MVertex *v0 = GModel::current()->getMeshVertexByTag(n0); + MVertex *v1 = GModel::current()->getMeshVertexByTag(n1); + MVertex *v2 = GModel::current()->getMeshVertexByTag(n2); + gf->triangles.push_back(new MTriangle(v0, v1, v2)); + } + } + delete pm; + // bowyerWatsonFrontal(gf); +} + +struct nodeCopies { + MVertex *mv; + size_t nbCopies; + double u[8], v[8]; // max 8 copies -- reduced to 4 + size_t id[8]; + nodeCopies(MVertex *_mv, double _u, double _v) : mv(_mv), nbCopies(1) + { + u[0] = _u; + v[0] = _v; + } + void addCopy(double _u, double _v) + { + for(size_t i = 0; i < nbCopies; i++) { + if(fabs(u[i] - _u) < 1.e-9 && fabs(v[i] - _v) < 1.e-9) return; + } + u[nbCopies] = _u; + v[nbCopies] = _v; + nbCopies++; + } + size_t closest(double _u, double _v) + { + double minD = 1.e22; + size_t I = 0; + for(size_t i = 0; i < nbCopies; i++) { + double dist = sqrt((_u - u[i]) * (_u - u[i]) + (_v - v[i]) * (_v - v[i])); + if(dist < minD) { + minD = dist; + I = i; + } + } + return id[I]; + } +}; + +//// INITIAL MESH --------- colored + +static void getNodeCopies(GFace *gf, std::map<size_t, nodeCopies> &copies) +{ + std::vector<GEdge *> edges = gf->edges(); + std::vector<GEdge *> emb_edges = gf->getEmbeddedEdges(); + edges.insert(edges.end(), emb_edges.begin(), emb_edges.end()); + std::set<GEdge *> touched; + + for(auto e : edges) { + if(!e->isMeshDegenerated()) { + std::set<MVertex *, MVertexPtrLessThan> e_vertices; + for(std::size_t i = 0; i < e->lines.size(); i++) { + MVertex *v1 = e->lines[i]->getVertex(0); + MVertex *v2 = e->lines[i]->getVertex(1); + e_vertices.insert(v1); + e_vertices.insert(v2); + } + int direction = -1; + if(e->isSeam(gf)) { + direction = 0; + if(touched.find(e) == touched.end()) + touched.insert(e); + else + direction = 1; + } + // printf("model edge %lu %lu + // vertices\n",e->tag(),e_vertices.size()); + for(auto v : e_vertices) { + SPoint2 param; + if(direction != -1) { + double t = 0; + if(v->onWhat()->dim() == 0) + reparamMeshVertexOnEdge(v, e, t); + else if(v->onWhat()->dim() == 1) + v->getParameter(0, t); + else + Msg::Error("a seam edge without CAD ?"); + param = e->reparamOnFace(gf, t, direction); + } + else { + reparamMeshVertexOnFace(v, gf, param); + } + std::map<size_t, nodeCopies>::iterator it = copies.find(v->getNum()); + if(it == copies.end()) { + nodeCopies c(v, param.x(), param.y()); + copies.insert(std::make_pair(v->getNum(), c)); + } + else { + it->second.addCopy(param.x(), param.y()); + } + } + } + } + + std::vector<GVertex *> emb_vertx = gf->getEmbeddedVertices(); + for(auto v : emb_vertx) { + SPoint2 param; + reparamMeshVertexOnFace(v->mesh_vertices[0], gf, param); + nodeCopies c(v->mesh_vertices[0], param.x(), param.y()); + copies.insert(std::make_pair(v->mesh_vertices[0]->getNum(), c)); + } +} + +PolyMesh *GFaceInitialMesh(int faceTag, int recover) +{ + GFace *gf = GModel::current()->getFaceByTag(faceTag); + + PolyMesh *pm = new PolyMesh; + + std::map<size_t, nodeCopies> copies; + getNodeCopies(gf, copies); + + SBoundingBox3d bb; + for(auto c : copies) { + for(size_t i = 0; i < c.second.nbCopies; i++) + bb += SPoint3(c.second.u[i], c.second.v[i], 0); + } + bb *= 1.1; + pm->initialize_rectangle(bb.min().x(), bb.max().x(), bb.min().y(), + bb.max().y()); + PolyMesh::Face *f = pm->faces[0]; + for(std::map<size_t, nodeCopies>::iterator it = copies.begin(); + it != copies.end(); ++it) { + for(size_t i = 0; i < it->second.nbCopies; i++) { + double x = it->second.u[i]; + double y = it->second.v[i]; + // find face in which lies x,y + f = Walk(f, x, y); + // split f and then swap edges to recover delaunayness + pm->split_triangle(x, y, 0, f, delaunayEdgeCriterionPlaneIsotropic, NULL); + // remember node tags + it->second.id[i] = pm->vertices.size() - 1; + pm->vertices[pm->vertices.size() - 1]->data = it->first; + } + } + + if(!recover) return pm; + + // recover edges ... + + // pm->print4debug(100000); + + std::vector<GEdge *> edges = gf->edges(); + std::vector<GEdge *> emb_edges = gf->getEmbeddedEdges(); + edges.insert(edges.end(), emb_edges.begin(), emb_edges.end()); + + for(auto e : edges) { + if(!e->isMeshDegenerated()) { + for(auto l : e->lines) { + auto c0 = copies.find(l->getVertex(0)->getNum()); + auto c1 = copies.find(l->getVertex(1)->getNum()); + if(c0 == copies.end() || c1 == copies.end()) + Msg::Error("unable to find %lu %lu %d %d", l->getVertex(0)->getNum(), + l->getVertex(1)->getNum(), c0 == copies.end(), + c1 == copies.end()); + if(c0->second.nbCopies > c1->second.nbCopies) { + auto cc = c0; + c0 = c1; + c1 = cc; + } + for(size_t j = 0; j < c0->second.nbCopies; j++) { + PolyMesh::Vertex *v0 = pm->vertices[c0->second.id[j]]; + PolyMesh::Vertex *v1 = + pm->vertices[c1->second.closest(c0->second.u[j], c0->second.v[j])]; + int result = recover_edge(pm, v0, v1); + if(result < 0) { + Msg::Warning("Impossible to recover edge %lu %lu (error tag %d)", + l->getVertex(0)->getNum(), l->getVertex(0)->getNum(), + result); + } + else { + PolyMesh::HalfEdge *he = pm->getEdge(v0, v1); + if(he) { + if(he->opposite) he->opposite->data = e->tag(); + he->data = e->tag(); + } + } + } + } + } + } + + // color all PolyMesh::Faces + // the first 4 vertices are "infinite vertices" --> color them with tag -2 + // meaning exterior + PolyMesh::HalfEdge *other_side = Color(pm->vertices[0]->he, -2); + // other_side is inthernal to the face --> color them with tag faceTag + other_side = Color(other_side, faceTag); + // holes will be tagged -1 + + // pm->print4debug(200000); + + return pm; +} +//------------------------------------------------ + +#if 0 + bb *= 1./1.1; + const size_t N = 100000; + std::vector<double> X(N),Y(N); + std::vector<size_t> HC(N), IND(N); + for (size_t i = 0; i< N ; i++){ + double R = drand48(); + X[i] = bb.min().x() + R * (bb.max().x()-bb.min().x()); + R = drand48(); + Y[i] = bb.min().y() + R * (bb.max().y()-bb.min().y()); + HC[i] = HilbertCoordinates(X[i], Y[i], bb.center().x(), bb.center().y(), + bb.max().x() - bb.center().x(),0, + 0, bb.max().y() - bb.center().y()); + IND[i] = i; + } + std::sort( IND.begin(),IND.end(), [&](size_t i,size_t j){return HC[i]<HC[j];} ); + double t1 = gmsh::logger::getCpuTime(); + for (size_t i = 0; i< N ; i++){ + size_t I = IND[i]; + f = Walk (f,X[I],Y[I]); + pm->split_triangle(X[I],Y[I],0,f,delaunayEdgeCriterionPlaneIsotropic,NULL); + } + double t2 = gmsh::logger::getCpuTime(); + // printf("%12.5E Seconds\n",t2-t1); + pm->print4debug( nodeTags.size() ); +} +#endif +#if 0 + PolyMesh::Vertex *v0 = pm->vertices[nodeLabels[1]]; + PolyMesh::Vertex *v1 = pm->vertices[nodeLabels[3]]; + int result = recover_edge (pm, v0, v1); +#endif diff --git a/Mesh/meshTriangulation.h b/Mesh/meshTriangulation.h new file mode 100644 index 0000000000000000000000000000000000000000..0f3116d6682e6120b002bc4d7c9e9ce271f02db4 --- /dev/null +++ b/Mesh/meshTriangulation.h @@ -0,0 +1,24 @@ +// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. + +#ifndef MESH_TRIANGULATION_H +#define MESH_TRIANGULATION_H + +#include "meshPolyMesh.h" + +// returns a PolyMesh i.e. a half edge data structure that +// is actually the triangulation face boundary +// if recover = 1 --> edges are recovered and +// the triangulation is colored : triangles belonging +// to the model face are colored faceTag, other have negative colors. +PolyMesh *GFaceInitialMesh(int faceTag, int recover = 0); +// apply Delaunay refinement using old algorithms +// FIXME -- not working yet +void GFaceDelaunayRefinementOldMesher(int faceTag); +void GFaceDelaunayRefinement(int faceTag); +int GFace2PolyMesh(int faceTag, PolyMesh **pm); +// int PolyMesh2GFace (const PolyMesh *pm, size_t faceTag); + +#endif diff --git a/Numeric/HierarchicalBasisH1Brick.cpp b/Numeric/HierarchicalBasisH1Brick.cpp index 7a9696ce0dd2b53fe34b1558505dd5b3418c4efe..8cb83177a39a8f99e0082cc59361b1d63556ef94 100644 --- a/Numeric/HierarchicalBasisH1Brick.cpp +++ b/Numeric/HierarchicalBasisH1Brick.cpp @@ -349,7 +349,7 @@ void HierarchicalBasisH1Brick::generateGradientBasis( std::vector<double> *vectorTarget2(nullptr); std::vector<std::vector<double> > *dvectorTarget2(nullptr); for(int iFace = 0; iFace < _nfaceQuad; iFace++) { - int indexLambda; + int indexLambda = 0; switch(iFace) { case(0): indexLambda = 5; diff --git a/Numeric/HilbertCurve.cpp b/Numeric/HilbertCurve.cpp index c6d80cc4555f66595ae339c87980dbd8e925091c..1503a1376aaa86fd394f9028f9c718cdc3b75c68 100644 --- a/Numeric/HilbertCurve.cpp +++ b/Numeric/HilbertCurve.cpp @@ -50,7 +50,7 @@ struct HilbertSort { } bbox *= 1.01; MVertex **pv = &v[0]; - int depth; + int depth = 0; MultiscaleSortHilbert(pv, (int)v.size(), 10, 0.125, &depth); } }; diff --git a/Numeric/fullMatrix.h b/Numeric/fullMatrix.h index 2024956c4a163eac7d977fd76372caa64ab0342f..c58ff21d779b7aa20f5afe7a7ef7d46ae654362f 100644 --- a/Numeric/fullMatrix.h +++ b/Numeric/fullMatrix.h @@ -17,6 +17,7 @@ #ifdef Success // in X11 header X.h #undef Success #endif +#include <sstream> #include <Eigen/Dense> #endif diff --git a/Post/OctreePost.cpp b/Post/OctreePost.cpp index 9d9f9a16cd657c08d2afbac63df4a0dcdf516397..783fb2a9b7ab80c4b1b6761399a771862411f216 100644 --- a/Post/OctreePost.cpp +++ b/Post/OctreePost.cpp @@ -38,7 +38,18 @@ static void minmax(int n, double *X, double *Y, double *Z, double *min, } SBoundingBox3d bb(min[0], min[1], min[2], max[0], max[1], max[2]); - bb.thicken(0.01); // make 1% thicker + + if(CTX::instance()->mesh.algo2d == ALGO_2D_PACK_PRLGRMS || + CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + /* TODO FIXME: ugly temporary fix, but we need larger bbox for the + * guiding field sampling on curved surfaces, thicken is not sufficient */ + bb *= 1.1; + bb.makeCube(); + } + else { + bb.thicken(0.01); // make 1% thicker + } + max[0] = bb.max().x(); max[1] = bb.max().y(); max[2] = bb.max().z(); @@ -284,7 +295,17 @@ void OctreePost::_create(PViewData *data) } SBoundingBox3d bb = l->getBoundingBox(); - bb.thicken(0.01); // make 1% thicker + + if(CTX::instance()->mesh.algo2d == ALGO_2D_PACK_PRLGRMS || + CTX::instance()->mesh.algo2d == ALGO_2D_QUAD_QUASI_STRUCT) { + /* TODO FIXME: ugly temporary fix, but we need larger bbox for the + * guiding field sampling on curved surfaces, thicken is not sufficient */ + bb *= 1.1; + } + else { + bb.thicken(0.01); // make 1% thicker + } + SPoint3 bbmin = bb.min(), bbmax = bb.max(); double min[3] = {bbmin.x(), bbmin.y(), bbmin.z()}; double size[3] = {bbmax.x() - bbmin.x(), bbmax.y() - bbmin.y(), diff --git a/Solver/CMakeLists.txt b/Solver/CMakeLists.txt index d8962a92403d25e8d77fe9f159892e35bde47066..6e465d5b10492a5dae8dcfd55bf72684d8a4d405 100644 --- a/Solver/CMakeLists.txt +++ b/Solver/CMakeLists.txt @@ -8,6 +8,7 @@ set(SRC linearSystemCSR.cpp linearSystemPETSc.cpp linearSystemMUMPS.cpp + linearSystemEigen.cpp dofManager.cpp groupOfElements.cpp elasticityTerm.cpp diff --git a/Solver/linearSystemEigen.cpp b/Solver/linearSystemEigen.cpp new file mode 100644 index 0000000000000000000000000000000000000000..42a8877b87672e9ec298bafc54366614664ca975 --- /dev/null +++ b/Solver/linearSystemEigen.cpp @@ -0,0 +1,217 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. + +#include <stdio.h> +#include <math.h> +#include "linearSystemEigen.h" + +#if defined(HAVE_EIGEN) + +linearSystemEigen<double>::linearSystemEigen() { solverType = EigenSparseLU; } + +bool linearSystemEigen<double>::isAllocated() const +{ + if(A.rows() > 0) + return true; + else + return false; +} + +void linearSystemEigen<double>::allocate(int nbRows) +{ + A.resize(nbRows, nbRows); + B.resize(nbRows); + X.resize(nbRows); + B.fill(0.); + X.fill(0.); +} + +void linearSystemEigen<double>::clear() +{ + A.setZero(); + B.setZero(); + X.setZero(); +} + +void linearSystemEigen<double>::zeroMatrix() +{ + A.setZero(); + B.setZero(); + X.setZero(); +} + +void linearSystemEigen<double>::zeroRightHandSide() { B.fill(0.); } + +void linearSystemEigen<double>::zeroSolution() { X.fill(0.); } + +void linearSystemEigen<double>::setSolverType( + linearSystemEigenSolver solverName) +{ + solverType = solverName; +} + +int linearSystemEigen<double>::systemSolve() +{ + if(solverType == EigenCholeskyLLT) { + Eigen::SimplicialLLT<Eigen::SparseMatrix<double> > solver; + solver.compute(A); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with CholeskyLLT"); + return -1; + } + X = solver.solve(B); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with CholeskyLLT"); + return -1; + } + } + else if(solverType == EigenCholeskyLDLT) { + Eigen::SimplicialLDLT<Eigen::SparseMatrix<double> > solver; + solver.compute(A); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with CholeskyLDLT"); + return -1; + } + X = solver.solve(B); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with CholeskyLDLT"); + return -1; + } + } + else if(solverType == EigenSparseLU) { + Eigen::SparseLU<Eigen::SparseMatrix<double> > solver; + solver.compute(A); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with SparseLU"); + return -1; + } + X = solver.solve(B); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with SparseLU"); + return -1; + } + } + else if(solverType == EigenSparseQR) { + /* Note: maybe another ordering method is better, see Eigen documentation */ + Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::NaturalOrdering<int> > + solver; + solver.compute(A); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with SparseQR"); + return -1; + } + X = solver.solve(B); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with SparseQR"); + return -1; + } + } + else if(solverType == EigenCG) { + Eigen::ConjugateGradient<Eigen::SparseMatrix<double> > solver; + solver.compute(A); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning( + "Eigen: failed to solve linear system with Conjugate Gradient"); + return -1; + } + X = solver.solve(B); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning( + "Eigen: failed to solve linear system with Conjugate Gradient"); + return -1; + } + } + else if(solverType == EigenCGLeastSquare) { + Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<double> > solver; + solver.compute(A); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with Least Square " + "Conjugate Gradient"); + return -1; + } + X = solver.solve(B); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with Least Square " + "Conjugate Gradient"); + return -1; + } + } + else if(solverType == EigenBiCGSTAB) { + Eigen::BiCGSTAB<Eigen::SparseMatrix<double> > solver; + solver.compute(A); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with BiCGSTAB"); + return -1; + } + X = solver.solve(B); + if(solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with BiCGSTAB"); + return -1; + } + } + return 1; +} + +void linearSystemEigen<double>::insertInSparsityPattern(int row, int col) {} + +double linearSystemEigen<double>::normInfRightHandSide() const +{ + return B.maxCoeff(); +} + +double linearSystemEigen<double>::normInfSolution() const +{ + return X.maxCoeff(); +} + +void linearSystemEigen<double>::addToMatrix(int row, int col, const double &val) +{ + A.coeffRef(row, col) += val; /* slow ! */ +} + +void linearSystemEigen<double>::getFromMatrix(int row, int col, + double &val) const +{ + val = A.coeff(row, col); +} + +void linearSystemEigen<double>::addToRightHandSide(int row, const double &val, + int ith) +{ + if((int)B.size() <= row) { + B.resize(row + 1); + B[row] = val; + } + else { + B[row] += val; + } +} + +void linearSystemEigen<double>::getFromRightHandSide(int row, double &val) const +{ + if((int)B.size() <= row) val = 0.; + val = B[row]; +} + +void linearSystemEigen<double>::getFromSolution(int row, double &val) const +{ + if((int)X.size() <= row) + val = 0.; + else + val = X[row]; +} + +void linearSystemEigen<double>::addToSolution(int row, const double &val) +{ + if((int)X.size() <= row) { + X.resize(row + 1); + X[row] = val; + } + else { + X[row] += val; + } +} + +#endif diff --git a/Solver/linearSystemEigen.h b/Solver/linearSystemEigen.h new file mode 100644 index 0000000000000000000000000000000000000000..8bd55e0ca0fd872601db819a7df3f80ef16b1b14 --- /dev/null +++ b/Solver/linearSystemEigen.h @@ -0,0 +1,91 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. + +#ifndef LINEAR_SYSTEM_EIGEN_H +#define LINEAR_SYSTEM_EIGEN_H + +// Interface to solve a linear system with Eigen + +#include "GmshConfig.h" +#include "GmshMessage.h" +#include "linearSystem.h" + +#if defined(HAVE_EIGEN) + +#include <Eigen/Sparse> + +template <class scalar> class linearSystemEigen : public linearSystem<scalar> { +public: + linearSystemEigen() + { + Msg::Info("linearSystemEigen not implemented for this element type"); + } + + virtual bool isAllocated() const { return false; } + virtual void allocate(int nbRows) {} + virtual void clear() {} + virtual void zeroMatrix() {} + virtual void zeroRightHandSide() {} + virtual void zeroSolution() {} + virtual int systemSolve() { return 1; } + virtual void insertInSparsityPattern(int row, int col) {} + virtual double normInfRightHandSide() const { return 0.; } + virtual double normInfSolution() const { return 0.; } + + virtual void addToMatrix(int row, int col, const double &val) {} + virtual void getFromMatrix(int row, int col, double &val) const {} + virtual void addToRightHandSide(int row, const scalar &val, int ith = 0) {} + virtual void getFromRightHandSide(int row, scalar &val) const {} + virtual void getFromSolution(int row, scalar &val) const {} + virtual void addToSolution(int row, const scalar &val) {} +}; + +enum linearSystemEigenSolver { + EigenCholeskyLLT, + EigenCholeskyLDLT, + EigenSparseLU, + EigenSparseQR, + /* warning: no preconditionner for iterative solver by default, should be + changed */ + EigenCG, + EigenCGLeastSquare, + EigenBiCGSTAB +}; + +template <> class linearSystemEigen<double> : public linearSystem<double> { +private: + Eigen::VectorXd X; + Eigen::VectorXd B; + Eigen::SparseMatrix<double> A; + linearSystemEigenSolver solverType; + +public: + linearSystemEigen(); + + void setSolverType(linearSystemEigenSolver solverName); + + virtual bool isAllocated() const; + virtual void allocate(int nbRows); + virtual void clear(); + virtual void zeroMatrix(); + + virtual void zeroRightHandSide(); + virtual void zeroSolution(); + virtual int systemSolve(); + virtual void insertInSparsityPattern(int row, int col); + virtual double normInfRightHandSide() const; + virtual double normInfSolution() const; + + virtual void addToMatrix(int row, int col, const double &val); + virtual void getFromMatrix(int row, int col, double &val) const; + virtual void addToRightHandSide(int row, const double &val, int ith = 0); + virtual void getFromRightHandSide(int row, double &val) const; + virtual void getFromSolution(int row, double &val) const; + virtual void addToSolution(int row, const double &val); +}; + +#endif + +#endif diff --git a/benchmarks/2d/BL0.geo b/benchmarks/2d/BL0.geo index eaef96bb6b4929dde0cad577b15df736d672c407..cb561b88ff1993d9e3434f82271df80798fe4d56 100755 --- a/benchmarks/2d/BL0.geo +++ b/benchmarks/2d/BL0.geo @@ -1,37 +1,20 @@ l = .2; Point(7) = {-1.4, 0.5, 0, l}; -//+ Point(8) = {-1.4, -1.1, 0, l}; -//+ Point(9) = {1.4, -1.1, 0, l}; -//+ Point(10) = {1.4, 0.5, 0, l}; -//+ Line(2) = {7, 10}; -//+ Line(3) = {9, 10}; -//+ Line(4) = {9, 8}; -//+ Line(5) = {8, 7}; -//+ Line Loop(7) = {2,-3,4,5}; -//+ Plane Surface(8) = {7}; -//+ Field[1] = BoundaryLayer; -//+ -Field[1].EdgesList = {4}; -//+ -Field[1].hfar = 0.1; -//+ -Field[1].hwall_n = 0.005; -//+ -Field[1].thickness = 0.1; -//+ -BoundaryLayer Field = 1; - -//+ -Field[1].ratio = 1.4; -//+ +Field[1].CurvesList = {4}; +Field[1].SizeFar = 0.1; +Field[1].Size = 0.005; +Field[1].Thickness = 0.1; +Field[1].Ratio = 1.4; Field[1].NodesList = {8, 9}; + +BoundaryLayer Field = 1; diff --git a/benchmarks/2d/BL1.geo b/benchmarks/2d/BL1.geo index 7bbb4e0b7ac5035ae40371c84d6297e0aa983434..36a93886904141897b0c399d3f49defd391310e9 100755 --- a/benchmarks/2d/BL1.geo +++ b/benchmarks/2d/BL1.geo @@ -1,52 +1,26 @@ l = .2; -//+ Point(1) = {-1.1, -0.3, 0, l}; -//+ Point(2) = {-0.3, -0, 0, l}; -//+ Point(3) = {1, -0.3, 0, l}; -//+ Point(4) = {-0.3, -0.6, 0, l}; -//+ Point(5) = {0.7, -0.2, 0, l}; -//+ Point(6) = {0.7, -0.4, 0, l}; -//+ Spline(1) = {3, 5, 2, 1, 4, 6, 3}; -//+ Point(7) = {-1.4, 0.5, 0, l}; -//+ Point(8) = {-1.4, -1.1, 0, l}; -//+ Point(9) = {1.4, -1.1, 0, l}; -//+ Point(10) = {1.4, 0.5, 0, l}; -//+ Line(2) = {7, 10}; -//+ Line(3) = {9, 10}; -//+ Line(4) = {9, 8}; -//+ Line(5) = {8, 7}; -//+ Line Loop(6) = {2, -3, 4, 5}; -//+ Line Loop(7) = {1}; -//+ Plane Surface(8) = {6, 7}; -//+ Field[1] = BoundaryLayer; -//+ -Field[1].EdgesList = {1}; -//+ -Field[1].hfar = 0.1; -//+ -Field[1].hwall_n = 0.01; -//+ -Field[1].thickness = 0.1; -//+ +Field[1].CurvesList = {1}; +Field[1].SizeFar = 0.1; +Field[1].Size = 0.01; +Field[1].Thickness = 0.1; +Field[1].Ratio = 1.4; BoundaryLayer Field = 1; - -//+ -Field[1].ratio = 1.4; diff --git a/benchmarks/2d/BL2.geo b/benchmarks/2d/BL2.geo index a0dc3051db69bdf8d84c27ba52a1b807689105fd..d8c1475207028dcafc81b293530e9025340a48d5 100644 --- a/benchmarks/2d/BL2.geo +++ b/benchmarks/2d/BL2.geo @@ -24,12 +24,12 @@ Line(9) = {3, 11}; Line {9} In Surface {8}; Field[1] = BoundaryLayer; -Field[1].EdgesList = {1, 11, 9}; -Field[1].hfar = 0.1; -Field[1].hwall_n = 0.01; -Field[1].thickness = 0.1; -Field[1].ratio = 1.4; -Field[1].FanNodesList = {1, 11}; // try e.g. removing 11 +Field[1].CurvesList = {1, 11, 9}; +Field[1].SizeFar = 0.1; +Field[1].Size = 0.01; +Field[1].Thickness = 0.1; +Field[1].Ratio = 1.4; +Field[1].FanPointsList = {1, 11}; // try e.g. removing 11 Field[1].FanPointsSizesList = {5, 4}; // 5 elements for node 1 and 4 for node 11 Field[1].Quads = 1; BoundaryLayer Field = 1; diff --git a/benchmarks/2d/BL3.geo b/benchmarks/2d/BL3.geo index 55ef6c323a83b125f3cc49426a3b6948504fe9d3..8b6e86195a472a03e853cf51fe23d068a1272263 100644 --- a/benchmarks/2d/BL3.geo +++ b/benchmarks/2d/BL3.geo @@ -1,84 +1,40 @@ -//Mesh.CharacteristicLengthExtendFromBoundary = 0; -//Mesh.CharacteristicLengthMin = 0.1; -//Mesh.CharacteristicLengthMax = 0.1; -//+ Point(1) = {-1.7, -0.3, 0, .1}; -//+ Point(2) = {-1.2, -0, 0, .1}; -//+ Point(3) = {-0.5, -0.3, 0, .1}; -//+ Point(4) = {-0.4, -0.7, 0, .1}; -//+ Point(5) = {-0.8, -0.8, 0, .1}; -//+ Point(6) = {-1.2, -0.5, 0, .1}; -//+ Point(7) = {-1.8, -0.5, 0, .1}; -//+ Point(8) = {-1.1, 0.6, 0, .1}; -//+ Point(9) = {-0.5, 0.7, 0, .1}; -//+ Point(10) = {-0.1, 0.2, 0, .1}; -//+ Point(11) = {-0.3, -0.1, 0, .1}; -//+ Point(12) = {-0.7, 0.2, 0, .1}; -//+ Point(13) = {-1.1, 0.4, 0, 1.0}; -//+ Point(14) = {-1.5, 0.5, 0, .1}; -//+ Point(15) = {-2.3, 1.1, 0, .1}; -//+ Point(16) = {-2.3, -1, 0, .1}; -//+ Point(17) = {0.7, -1, 0, .1}; -//+ Point(18) = {0.5, 1.1, 0, .1}; -//+ Line(1) = {15, 16}; -//+ Line(2) = {16, 17}; -//+ Line(3) = {17, 18}; -//+ Line(4) = {18, 15}; -//+ Spline(5) = {14, 8, 9, 10, 11, 12, 13, 14}; -//+ Spline(6) = {2, 3, 4, 5, 6, 7, 1, 2}; -//+ -Field[1] = BoundaryLayer; -//+ -Field[1].EdgesList = {5, 6, 1}; -//+ -Field[1].hfar = 0.1; -//+ -Field[1].hwall_n = 0.001; -//+ -Field[1].ratio = 1.4; -//+ -Field[1].thickness = .35; -BoundaryLayer Field = 1; -//+ Line Loop(7) = {1, 2, 3, 4}; -//+ Line Loop(8) = {5}; -//+ Line Loop(9) = {6}; -//+ Plane Surface(10) = {7, 8, 9}; -//+ -Characteristic Length {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} = 0.1; -//+ -Field[1].FanNodesList = {14}; -//+ -Characteristic Length {17, 16, 5, 4, 6, 7, 3, 1, 11, 2, 10, 12, 13, 14, 8, 9, 15, 18} = 0.1; -//+ -//Field[1].Quads = 1; -//+ -//Field[1].thickness = 1; -//+ -Field[1].NodesList = {15, 16}; + +Field[1] = BoundaryLayer; +Field[1].CurvesList = {5, 6, 1}; +Field[1].SizeFar = 0.1; +Field[1].Size = 0.001; +Field[1].Ratio = 1.4; +Field[1].Thickness = .35; +Field[1].FanPointsList = {14}; +Field[1].PointsList = {15, 16}; +BoundaryLayer Field = 1; + +MeshSize{:} = 0.1; diff --git a/benchmarks/2d/BL4.geo b/benchmarks/2d/BL4.geo index 0129e368b3b454ef19cd07a15f8d72efa6ab9b92..c2cc47cd9b66b78982992b5ab31b10ddf0a1bdb3 100755 --- a/benchmarks/2d/BL4.geo +++ b/benchmarks/2d/BL4.geo @@ -1,39 +1,21 @@ l = .2; Point(7) = {-1.4, 0.5, 0, l}; -//+ Point(8) = {-1.4, -1.1, 0, l}; -//+ Point(9) = {1.4, -1.1, 0, l}; -//+ Point(10) = {1.4, 0.5, 0, l}; -//+ Line(2) = {7, 10}; -//+ Line(3) = {9, 10}; -//+ Line(4) = {9, 8}; -//+ Line(5) = {8, 7}; -//+ Line Loop(7) = {2,-3,4,5}; -//+ Plane Surface(8) = {7}; -//+ -Field[1] = BoundaryLayer; -//+ -Field[1].EdgesList = {4}; -//+ -Field[1].hfar = 0.1; -//+ -Field[1].hwall_n = 0.005; -//+ -Field[1].thickness = 0.1; -//+ -BoundaryLayer Field = 1; -//+ -Field[1].ratio = 1.4; -//+ -Field[1].NodesList = {8, 9}; -//+ +Field[1] = BoundaryLayer; +Field[1].CurvesList = {4}; +Field[1].SizeFar = 0.1; +Field[1].Size = 0.005; +Field[1].Thickness = 0.1; +Field[1].Ratio = 1.4; +Field[1].PointsList = {8, 9}; Field[1].BetaLaw = 1; +BoundaryLayer Field = 1; diff --git a/benchmarks/2d/naca12BL.geo b/benchmarks/2d/naca12BL.geo index 0a83772a45eae24c81358d05abf3bd41e7704897..de8609dbbe4bfc753257c05c6faa381f591cc5a6 100644 --- a/benchmarks/2d/naca12BL.geo +++ b/benchmarks/2d/naca12BL.geo @@ -225,17 +225,14 @@ Line(8) = {1003,1000}; Line Loop(9) = {6,7,8,5}; Line Loop(10) = {2,1}; Plane Surface(11) = {9,10}; -//Plane Surface(12) = {10}; -//Plane Surface(11) = {9}; Field[1] = BoundaryLayer; -Field[1].EdgesList = {1, 2}; -Field[1].hwall_n = 0.0001*SC; -Field[1].ratio = 2.4; -Field[1].thickness = 0.02*SC; -//Field[1].fan_angle = 80; -//Background Field = 1; -//Field[1].NodesList = {1}; -Field[1].FanNodesList = {1}; +Field[1].CurvesList = {1, 2}; +Field[1].Size = 0.0001*SC; +Field[1].Ratio = 2.4; +Field[1].Thickness = 0.02*SC; +Field[1].PointsList = {1}; Field[1].Quads = 1; +Field[1].FanPointsList = {1}; + BoundaryLayer Field = 1; diff --git a/benchmarks/2d/naca12_2d.geo b/benchmarks/2d/naca12_2d.geo index ef06796cbf1f4e06848d378271fc0a8ac2925959..f348e0e2ca4f7dd4f4ce677b5c39c1688b756174 100644 --- a/benchmarks/2d/naca12_2d.geo +++ b/benchmarks/2d/naca12_2d.geo @@ -224,30 +224,29 @@ Line(8) = {1003,1000}; Line Loop(9) = {6,7,8,5}; Line Loop(10) = {2,3,4,1}; Plane Surface(11) = {9,10}; -//Recombine Surface {11}; Field[2] = BoundaryLayer; -//Field[2].NodesList = {1}; -//Field[2].EdgesList = {1,2,3,4}; -Field[2].EdgesList = {1,2,3,4}; -Field[2].hfar = 1.5; -Field[2].hwall_n = 0.0008; -Field[2].ratio = 1.2; -Field[2].thickness = .03; +Field[2].FanPointsList = {1}; +Field[2].CurvesList = {1,2,3,4}; +Field[2].SizeFar = 1.5; +Field[2].Size = 0.0008; +Field[2].Ratio = 1.2; +Field[2].Thickness = .03; Field[2].IntersectMetrics = 1; -Background Field = 2; +Field[2].Quads = 1; Field[1] = Box; -Field[1].VIn = 0.01; +Field[1].VIn = 0.0025; Field[1].VOut = 1; -Field[1].XMax = 0.6; Field[1].XMin = 0.4; +Field[1].XMax = 0.8; Field[1].YMax = 0.1; Field[1].YMin = -0.1; -Field[1].ZMax = 1; -Field[1].ZMin = -1; +Field[1].Thickness = 2; Field[3] = MinAniso; Field[3].FieldsList = {1, 2}; -//Background Field = 2; +Background Field = 3; BoundaryLayer Field = 2; + +Mesh.BoundaryLayerFanElements = 30; diff --git a/benchmarks/2d/naca12_2d_trailing.geo b/benchmarks/2d/naca12_2d_trailing.geo index 4c26cb06b1537e6d6fce650d9707002f64b8ea94..3b8a1ca084e310305fdbd9b36665dba379eb5530 100755 --- a/benchmarks/2d/naca12_2d_trailing.geo +++ b/benchmarks/2d/naca12_2d_trailing.geo @@ -224,17 +224,17 @@ Line Loop(9) = {6,7,8,5}; Line Loop(10) = {2,3,4,1}; Plane Surface(11) = {9,10}; -//Physical Surface(11)={11}; -//Point(9999) = {0.6,0,0,1}; - Point(1004) = {1.5, 0, 0, lc}; Line(12) = {1, 1004}; Line {12} In Surface {11}; Field[2] = BoundaryLayer; -Field[2].EdgesList = {12, 1,2,3,4,12}; -Field[2].hfar = 1.5; -Field[2].hwall_n = 0.0001; -Field[2].ratio = 1.3; -Field[2].thickness = .05; +Field[2].CurvesList = {12, 1,2,3,4,12}; +Field[2].SizeFar = 1.5; +Field[2].Size = 0.0001; +Field[2].Ratio = 1.3; +Field[2].Thickness = .05; +Field[2].FanPointsList = {1004}; +Field[2].Quads = 1; + BoundaryLayer Field = 2; diff --git a/benchmarks/2d/transf_complex.geo b/benchmarks/2d/transf_complex.geo index d47fef2930525db0b4e800c0098f2138a5b9a2bc..78fdc618d14761a059d82d9bdf8a362a71f9bce9 100644 --- a/benchmarks/2d/transf_complex.geo +++ b/benchmarks/2d/transf_complex.geo @@ -44,3 +44,7 @@ Transfinite Line {14,10} = 50 Using Bump 0.3; Transfinite Line {11,8,7,12,6,5,13,15,3,4,16,1,2,9} = 30 Using Progression 1; Transfinite Surface {18} = {9,13,11,10}; Recombine Surface {18}; + +// use this to get a smoother mesh: + +//Mesh.Smoothing = 100; diff --git a/benchmarks/3d/percolation.geo b/benchmarks/3d/percolation.geo index 98373058f96c674a391e4ceda50d72c4398000b4..351d5d2c4f74c4e46f3bb5493b191b9f2ee217c0 100644 --- a/benchmarks/3d/percolation.geo +++ b/benchmarks/3d/percolation.geo @@ -27,12 +27,12 @@ Delete{ Volume{aa[1]}; } // this volume is wrong: we will be carving holes in it Function newsphere rr = 0.5-sphere_dist; - a = newp; + a = newp; b = newl; - c = newll; - d = news; - e = newsl; - f = newv; + c = newll; + d = news; + e = newsl; + f = newv; Point(a) = {i,j,k,lc}; Point(a+1) = {i,j+rr,k,lc}; Point(a+2) = {i,j-rr,k,lc}; @@ -60,9 +60,9 @@ Function newsphere Line Loop(c+5) = {b+4,-(b+1),-(b+8)}; Surface(d+5) = {c+5}; Line Loop(c+6) = {b+8,-b,b+7}; Surface(d+6) = {c+6}; Line Loop(c+7) = {b+7,-(b+11),b+3}; Surface(d+7) = {c+7}; - Surface Loop(e) = {d+1,-(d+4),-(d+3),d+2,d,(d+6),-(d+5),-(d+7)}; + Surface Loop(e) = {d+1,-(d+4),-(d+3),d+2,d,(d+6),-(d+5),-(d+7)}; Volume(f) = e; - holes[] += e; + holes[] += e; Return //random distribution @@ -90,7 +90,7 @@ For i In {1:xdim-2:1} array[(i-1)*ydim*zdim + (j-1)*zdim + k] == 0 && array[(i)*ydim*zdim + (j+1)*zdim + k] == 0 && array[(i)*ydim*zdim + (j-1)*zdim + k] == 0 && - + array[(i+1)*ydim*zdim + j*zdim + (k-1)] == 0 && array[(i+1)*ydim*zdim + (j+1)*zdim + (k-1)] == 0 && array[(i+1)*ydim*zdim + (j-1)*zdim + (k-1)] == 0 && @@ -100,7 +100,7 @@ For i In {1:xdim-2:1} array[(i)*ydim*zdim + (j+1)*zdim + (k-1)] == 0 && array[(i)*ydim*zdim + (j-1)*zdim + (k-1)] == 0 && array[i*ydim*zdim + j*zdim + (k-1)] == 0 && - + array[(i+1)*ydim*zdim + j*zdim + (k+1)] == 0 && array[(i+1)*ydim*zdim + (j+1)*zdim + (k+1)] == 0 && array[(i+1)*ydim*zdim + (j-1)*zdim + (k+1)] == 0 && @@ -121,7 +121,7 @@ For i In {0:xdim-1:1} For j In {0:ydim-1:1} For k In {0:zdim-1:1} //Printf("array[%g][%g][%g] = %g", i, j, k,array[i*ydim*zdim + j*zdim + k]); - If (array[i*ydim*zdim + j*zdim + k] == 1) + If (array[i*ydim*zdim + j*zdim + k] == 1) Call newsphere; EndIf EndFor @@ -132,5 +132,4 @@ EndFor c = newsl; Surface Loop(c) = {43,-1,35,39,48,47}; v = newv; Volume(v) = {c, holes[]}; -Coherence; // make sure duplicate nodes are removed when sphere_dist=0 -Field[1] = BoundaryLayer; +Coherence; // make sure duplicate points are removed when sphere_dist=0 diff --git a/contrib/QuadMeshingTools/CMakeLists.txt b/contrib/QuadMeshingTools/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c03c8d04d88ab2cb5e87aa300026a006b86e4472 --- /dev/null +++ b/contrib/QuadMeshingTools/CMakeLists.txt @@ -0,0 +1,16 @@ +set(QMT_SRC + qmtMeshGeometryOptimization.cpp + qmtDiskQuadrangulationRemeshing.cpp + qmtQuadCavityRemeshing.cpp + qmtCrossField.cpp + qmtCurveQuantization.cpp + qmtSizeMap.cpp + qmtMeshUtils.cpp + arrayGeometry.cpp + cppUtils.cpp + geolog.cpp + row_echelon_integer.cpp + ) + +file(GLOB_RECURSE HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h) +append_gmsh_src(contrib/QuadMeshingTools "${QMT_SRC};${HDR}") diff --git a/contrib/QuadMeshingTools/README.md b/contrib/QuadMeshingTools/README.md new file mode 100644 index 0000000000000000000000000000000000000000..212de7fa1a09ce5ff569411aa58fe574b6facba2 --- /dev/null +++ b/contrib/QuadMeshingTools/README.md @@ -0,0 +1,75 @@ +# Quadqs behavior + +### Usage: + +- in GUI: + +select "Quasi-structured quad (experimental)" in Mesh > 2D algorithm + +- in command line: + +gmsh -algo quadqs -2 <other options> + +The mesh size is mainly controlled by the -clscale option. + +### General pipeline: + +1. generate initial triangulation +2. compute cross field +3. compute size map +4. save as background mesh, background field, delete mesh +5. apply curve quantization constraints (using automatic transfinite for the moment) +6. generate curve meshes +7. generate transfinite quad meshes +8. generate unstructured quad-dominant meshes with algo pack +9. midpoint subdivision +10. mesh simple CAD faces with patterns +11. improve quad mesh topology with disk quadrangulation remeshing +12. improve quad mesh topology with cavity remeshing +13. geometry smoothing (also applied during the previous steps) + +### Shortcuts: + +- If triangulation available: start at step 2 +- If scaled cross field available: start at step 5 +- If scalar size map available: import it in step 3 +- If quad mesh available: start at step 10 + +# Content of contrib/QuadMeshingTools + +- Heat-based cross/asterisk field solver in qmtCrossField.h/cpp +- Conformal scaling solver (least-square, based on angle gradients) in qmtCrossField.h/cpp +- Size map tools (dist to curves, one-way smoothing) in qmtSizeMap.h/cpp +- Disk quadrangulation remeshing, qmtDiskQuadrangulationRemeshing.h/cpp +- Pattern-based cavity remeshing, qmtQuadCavityRemeshing.h/cpp +- Various geometry smoothers (global UV Laplacian, Winslow/Angled-based local kernel, DMO UV kernel), in qmtMeshGeometryOptimization.h/cpp +- Curve quantization simple CAD faces to get regular meshes, in progress, not usable yet, in qmtCurveQuantization.h/cpp +- GeoLog: convenient wrapper around gmsh views for debugging, geolog.h/cpp + + +# Changes to gmsh + +- Main files at Mesh/meshQuadQuasiStructured.h/cpp, to call the QuadMeshingTools functions +- Add Eigen-based sparse solver in Solver/linearSystemEigen.h/cpp +- Add robin_hood fast unordered_set/map hash maps, at Common/robin_hood.h, MIT license +- Add libOL octree for meshing library at Common/libol1.h/c, MIT license +- Add SurfaceProjector based on libOL octree, in Mesh/meshOctreeLibOL.h/cpp +- Add background mesh datastructures, in Mesh/BackgroundMesh.h/cpp +- contrib/domhex replaced by the version from quadMeshingTools branch (contains JF changes to algo pack) +- Post/OctreePost.cpp: use larger bounding boxes. Required for the background field sampling +- ALGO_2D_PACK_PRLGRMS_CSTR deprecated +- Add implicit conversion from SPoint3/SVector3 to std::array<double,3> +- Many Msg::Warning switch to Msg::Debug in CAD/Post projections +- Special case for quadqs in bbox sizing in Post/OctreePost.cpp, should find something better +- Add an option quadqsSizemapMethod in global context CTX::instance()->mesh +- Add a curve transfinite method (ge->meshAttributes.typeTransfinite = 4) to get vertex positioning via size map + +# Todo + +- Support for user-prescribed size map (requires quality metric taking size map into account) +- Add options in global context for better control +- Add MUMPS solver (with analysis / factorize) +- Better cavity initialization strategies (e.g. pathes between irregular vertices) +- Better CAD quantization (support for T-junctions, rings, etc) +- Filter anisotropy after cavity remeshing to avoid some distorted patches + diff --git a/contrib/QuadMeshingTools/arrayGeometry.cpp b/contrib/QuadMeshingTools/arrayGeometry.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a2c7c6c082e63b4864561dd44e18c3c028b809ea --- /dev/null +++ b/contrib/QuadMeshingTools/arrayGeometry.cpp @@ -0,0 +1,30 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "arrayGeometry.h" + +/* System includes */ +#include <vector> +#include <array> +#include <unordered_map> +#include <cstdint> +#include <cmath> +#include <algorithm> + +namespace ArrayGeometry { + + double bboxDiag(const std::vector<vec3>& points) { + vec3 mi = {DBL_MAX,DBL_MAX,DBL_MAX}; + vec3 ma = {-DBL_MAX,-DBL_MAX,-DBL_MAX}; + for (size_t i = 0; i < points.size(); ++i) for (size_t d = 0; d < 3; ++d) { + mi[d] = std::min(points[i][d],mi[d]); + ma[d] = std::max(points[i][d],ma[d]); + } + return length(ma-mi); + } + +} diff --git a/contrib/QuadMeshingTools/arrayGeometry.h b/contrib/QuadMeshingTools/arrayGeometry.h new file mode 100644 index 0000000000000000000000000000000000000000..92eaae266469f1a5a0463cacfc3e36753607f31e --- /dev/null +++ b/contrib/QuadMeshingTools/arrayGeometry.h @@ -0,0 +1,84 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include <array> +#include <vector> +#include <cstdint> +#include <cfloat> +#include <cmath> + +namespace ArrayGeometry { + using vec2 = std::array<double,2>; + using vec3 = std::array<double,3>; + + /* scalar utils */ + inline double clamp(double x, double lower, double upper) { return std::min(upper, std::max(x, lower)); } + inline double maxAbs(double x, double y, double z) { return std::max(std::abs(x),std::max(std::abs(y),std::abs(z))); } + + /* vec3 math */ + inline vec3 operator-(const vec3& a, const vec3& b) { return {{a[0]-b[0], a[1]-b[1], a[2]-b[2]}}; } + inline vec3 operator+(const vec3& a, const vec3& b) { return {{a[0]+b[0], a[1]+b[1], a[2]+b[2]}}; } + inline vec3 operator*(const double& a, const vec3& b) { return {{a*b[0], a*b[1], a*b[2]}}; } + inline vec3 operator*(const vec3& a, const double& b) { return {{a[0]*b, a[1]*b, a[2]*b}}; } + inline double dot (const vec3& a, const vec3& b) { return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]; } + inline double length2 (const vec3& a) { return dot(a,a); } + inline double length (const vec3& a) { return sqrt(length2(a)); } + inline double maxAbs (const vec3& a) { return maxAbs(a[0],a[1],a[2]); } + inline vec3 cross(const vec3& a, const vec3& b) { return {{a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]}};} + inline void normalizeFast(vec3& a) { a = 1./sqrt(length2(a)) * a; } /* no check, not safe, not accurate */ + inline void normalize(vec3& a) { double amp = maxAbs(a); if (amp == 0.) { return; } a = amp * a; normalizeFast(a); } + inline double angleVectorsAlreadyNormalized(const vec3& a, const vec3& b) { return acos(clamp(dot(a,b),-1.,1.)); } + inline double angleVectors(vec3 a, vec3 b); + + /* vec2 math */ + inline vec2 operator-(const vec2& a, const vec2& b) { return {{a[0]-b[0], a[1]-b[1]}}; } + inline vec2 operator+(const vec2& a, const vec2& b) { return {{a[0]+b[0], a[1]+b[1]}}; } + inline vec2 operator*(const double& a, const vec2& b) { return {{a*b[0], a*b[1]}}; } + inline vec2 operator*(const vec2& a, const double& b) { return {{a[0]*b, a[1]*b}}; } + inline double dot (const vec2& a, const vec2& b) { return a[0]*b[0]+a[1]*b[1]; } + inline double length2 (const vec2& a) { return dot(a,a); } + inline double length (const vec2& a) { return sqrt(length2(a)); } + + + /* functions */ + + double bboxDiag(const std::vector<vec3>& points); + inline vec3 triangleNormal(const vec3& p0, const vec3& p1, const vec3& p2); /* normalized */ + inline double triangleArea(const vec3& p0, const vec3& p1, const vec3& p2); + + + + /**********************/ + /* inline definitions */ + /**********************/ + + double angleVectors(vec3 a, vec3 b) { + double ma = maxAbs(a); + double mb = maxAbs(b); + if (ma == 0. || mb == 0.) return DBL_MAX; + a = ma*a; + b = mb*b; + normalizeFast(a); + normalizeFast(b); + return angleVectorsAlreadyNormalized(a,b); + } + + vec3 triangleNormal(const vec3& p0, const vec3& p1, const vec3& p2) { + vec3 N = cross(p2-p0,p1-p0); + if (maxAbs(N) == 0.) return {{0.,0.,0.}}; + normalize(N); + return N; + } + + double triangleArea(const vec3& p0, const vec3& p1, const vec3& p2) { + vec3 N = cross(p2-p0,p1-p0); + return length(N)/2.; + } + +} diff --git a/contrib/QuadMeshingTools/cppUtils.cpp b/contrib/QuadMeshingTools/cppUtils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b4dab4c8dcc0998abc5ad0d23f61bad169414df5 --- /dev/null +++ b/contrib/QuadMeshingTools/cppUtils.cpp @@ -0,0 +1,16 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "cppUtils.h" + + +namespace CppUtils { + /* Useless function, necessary for legacy compilers ? */ + void dummy() { + return; + } +} diff --git a/contrib/QuadMeshingTools/cppUtils.h b/contrib/QuadMeshingTools/cppUtils.h new file mode 100644 index 0000000000000000000000000000000000000000..a12399fa282243d3252de12de54a08bfea04f018 --- /dev/null +++ b/contrib/QuadMeshingTools/cppUtils.h @@ -0,0 +1,231 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include <array> +#include <vector> +#include <algorithm> +#include <unordered_map> +#include <unordered_set> + +#include <ostream> +#include <stdio.h> +#include <string.h> + +/* Debugging macro to print variable name and value in the terminal, usage: DBG(x); DBG(x,..,z); */ +#define DBG(...) fprintf(stdout, "(DBG) %s:%i: ", __FILE__,__LINE__); CppUtils::show(std::cout, #__VA_ARGS__, __VA_ARGS__); fflush(stdout) + +namespace CppUtils { + using std::size_t; + + template<class T> + inline std::array<T,2> sorted(T v1, T v2) { + if (v1 < v2) { return {v1,v2}; } else { return {v2,v1}; } + } + + template<class T> + inline std::array<T,3> sorted(T v1, T v2, T v3) { + if (v1 > v3) std::swap(v1,v3); + if (v1 > v2) std::swap(v1,v2); + if (v2 > v3) std::swap(v2,v3); + return std::array<T,3>{v1,v2,v3}; + } + + template<class T> + void sort_unique(std::vector<T>& vec) { + std::sort( vec.begin(), vec.end() ); + vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() ); + } + + template<class T1, class T2> + T2 sort_unique_with_perm( + const std::vector<T1>& in, + std::vector<T1>& uniques, + std::vector<T2>& old2new) { + + std::vector<T2> ids(in.size()); + for(T2 k = 0; k != in.size(); ++k) ids[k]=k; + + std::sort(ids.begin(), ids.end(), + [&in](const T2& a, const T2&b){ return (in[a] < in[b]); } + ); + + uniques.resize(in.size()); + old2new.resize(in.size()); + for(T2 k = 0; k != in.size(); ++k) uniques[k]=in[k]; + + std::sort(uniques.begin(), uniques.end()); + uniques.erase( std::unique(uniques.begin(), uniques.end()), + uniques.end()); + T2 ic = 0; // indice current + T2 ir = 0; // indice representant + T2 cur_rep = 0; // indice of current representant + while(ic < in.size()){ + ic = ir; + while(ic < in.size() && in[ids[ic]]==in[ids[ir]]){ + old2new[ids[ic]] = cur_rep; + ++ic; + } + ir = ic; + ++cur_rep; + } + return (T2) uniques.size(); + } + + template<class T> + void compress(const std::vector<std::vector<T> >& vov, + std::vector<size_t>& first, std::vector<T>& values) { + first.resize(vov.size()+1); + size_t count = 0; + for (size_t i = 0; i < vov.size(); ++i) { + first[i] = count; + count += vov[i].size(); + } + first[vov.size()] = count; + values.resize(count); + for (size_t i = 0; i < vov.size(); ++i) { + for (size_t j = 0; j < vov[i].size(); ++j) { + values[first[i]+j] = vov[i][j]; + } + } + first.shrink_to_fit(); + values.shrink_to_fit(); + } + + template<class T> + std::vector<T> intersection(const std::vector<T>& v1, const std::vector<T>& v2) { + std::vector<T> s1 = v1; + std::vector<T> s2 = v2; + sort_unique(s1); + sort_unique(s2); + std::vector<T> s3; + set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(), std::back_inserter(s3)); + return s3; + } + + template<class T> + std::vector<T> merge(const std::vector<T>& v1, const std::vector<T>& v2) { + std::vector<T> s1 = v1; + std::vector<T> s2 = v2; + sort_unique(s1); + sort_unique(s2); + std::vector<T> s3; + set_union(s1.begin(),s1.end(),s2.begin(),s2.end(), std::back_inserter(s3)); + sort_unique(s3); + return s3; + } + + template<class T> + std::vector<T> difference(const std::vector<T>& v1, const std::vector<T>& v2) { + std::vector<T> s1 = v1; + std::vector<T> s2 = v2; + sort_unique(s1); + sort_unique(s2); + std::vector<T> s3; + set_difference(s1.begin(),s1.end(),s2.begin(),s2.end(), std::inserter(s3,s3.begin())); + return s3; + } + + template<class T1, class T2> + inline std::vector<T2> dynamic_cast_vector(const std::vector<T1>& pointers) { + std::vector<T2> output(pointers.size(),NULL); + for (size_t i = 0; i < pointers.size(); ++i) { + output[i] = dynamic_cast<T2>(pointers[i]); + } + return output; + } + + template<class T> + void append(std::vector<T>& v1, const std::vector<T>& v2) { + v1.insert(v1.end(),v2.begin(),v2.end()); + } + + template <typename T> + bool inVector(const T& value, const std::vector<T> &vec) { + if (vec.size() == 0) return false; + auto it = std::find(vec.begin(), vec.end(), value); + return (it != vec.end()) ? true : false; + } + + template <typename T, size_t N> + bool inArray(const T& value, const std::array<T,N> &vec) { + if (vec.size() == 0) return false; + auto it = std::find(vec.begin(), vec.end(), value); + return (it != vec.end()) ? true : false; + } + + template<class T1,class T2> + std::ostream& operator<<(std::ostream& os, const std::pair<T1,T2>& val) { + return os << "(" << val.first << "," << val.second << ")"; + } + + template<class T,size_t N> + std::ostream& operator<<(std::ostream& os, const std::array<T,N>& values) { + os << "("; + for (size_t i = 0; i < values.size(); ++i) { + os << values[i]; + if (i != values.size() - 1) { + os << ", "; + } + } + os << ")"; + return os; + } + + template<class T> + std::ostream& operator<<(std::ostream& os, const std::vector<T>& values) { + os << "["; + for (size_t i = 0; i < values.size(); ++i) { + const T & x = values[i]; + os << x; + if (i != values.size() - 1) { + os << ", "; + } + } + os << "]"; + return os; + } + + template<class T> + std::ostream& operator<<(std::ostream& os, const std::unordered_set<T>& values) { + os << "{"; + for (const T& v: values) { + os << v << ", "; + } + os << "}"; + return os; + } + + template<class T1,class T2> + std::ostream& operator<<(std::ostream& os, const std::unordered_map<T1,T2>& values) { + os << "{"; + for (const auto& kv: values) { + os << kv.first << ": " << kv.second << ", "; + } + os << "}"; + return os; + } + + /* For debug prints, see the DBG() macro */ + template<typename H1> + std::ostream& show(std::ostream& out, const char* label, H1&& value) { + return out << label << "=" << std::forward<H1>(value) << '\n'; + } + + template<typename H1, typename ...T> + std::ostream& show(std::ostream& out, const char* label, H1&& value, T&&... rest) { + const char* pcomma = strchr(label, ','); + return show(out.write(label, pcomma - label) << "=" + << std::forward<H1>(value) + << ',', + pcomma + 1, + std::forward<T>(rest)...); + } + + void dummy(); +} diff --git a/contrib/QuadMeshingTools/dataDiskQuadrangulationsSplit.hpp b/contrib/QuadMeshingTools/dataDiskQuadrangulationsSplit.hpp new file mode 100644 index 0000000000000000000000000000000000000000..faf864ec76b5c5db6d2fc4dca3a6e8e8f65177d3 --- /dev/null +++ b/contrib/QuadMeshingTools/dataDiskQuadrangulationsSplit.hpp @@ -0,0 +1,16017 @@ +#pragma once +#include <string> + +// #v_boundary #v_interior #quads q1v1 q1v2 q1v3 q1v4 q2v1 q2v2 q2v3 q2v4 ... qNv1 qNv2 qNv3 qNv4 +const char* data_dqrgl_block0 = + "4 0 1 0 1 2 3\n" + "4 4 5 4 5 2 3 4 7 6 5 4 3 0 7 6 7 0 1 5 6 1 2\n" + "6 0 2 0 3 4 5 0 1 2 3\n" + "6 1 3 6 3 4 5 6 1 2 3 6 5 0 1\n" + "6 2 4 6 3 4 5 6 7 2 3 6 5 0 7 2 7 0 1\n" + "6 3 5 0 6 4 5 0 8 7 6 0 1 2 8 7 8 2 3 6 7 3 4\n" + "6 4 6 6 3 4 5 6 7 2 3 6 9 8 7 6 5 0 9 8 9 0 1 2 7 8 1\n" + "6 4 6 0 3 4 5 0 7 6 3 0 1 8 7 8 1 2 9 6 7 8 9 3 6 9 2\n" + "6 4 6 0 6 4 5 0 8 7 6 0 1 9 8 9 1 2 3 7 8 9 3 6 7 3 4\n" + "6 4 6 0 6 4 5 0 8 7 6 0 1 2 8 7 8 2 9 6 7 9 4 4 9 2 3\n" + "8 0 3 0 5 6 7 0 3 4 5 0 1 2 3\n" + "8 0 3 0 5 6 7 0 1 4 5 4 1 2 3\n" + "8 1 4 8 5 6 7 8 3 4 5 8 1 2 3 8 7 0 1\n" + "8 1 4 0 5 6 7 0 8 4 5 0 1 2 8 4 8 2 3\n" + "8 2 5 8 5 6 7 8 3 4 5 8 9 2 3 8 7 0 9 2 9 0 1\n" + "8 2 5 0 5 6 7 0 8 4 5 0 1 9 8 9 1 2 3 4 8 9 3\n" + "8 2 5 0 8 6 7 0 3 9 8 0 1 2 3 9 3 4 5 8 9 5 6\n" + "8 2 5 0 8 6 7 0 9 4 8 0 1 2 9 4 9 2 3 8 4 5 6\n" + "8 3 6 8 6 7 9 8 4 5 6 8 2 3 4 8 9 10 2 2 10 0 1 7 0 10 9\n" + "8 3 6 8 5 6 7 8 9 4 5 8 10 2 9 8 7 0 10 2 10 0 1 4 9 2 3\n" + "8 3 6 8 9 6 7 8 3 4 9 8 10 2 3 8 7 0 10 2 10 0 1 9 4 5 6\n" + "8 3 6 0 5 6 7 0 8 4 5 0 1 9 8 9 1 2 10 4 8 9 10 4 10 2 3\n" + "8 3 6 0 5 6 7 0 9 8 5 0 1 10 9 10 1 2 3 8 9 10 3 5 8 3 4\n" + "8 3 6 0 8 6 7 0 9 4 8 0 1 10 9 10 1 2 3 4 9 10 3 8 4 5 6\n" + "8 4 7 8 5 6 7 8 3 4 5 8 9 2 3 8 11 10 9 8 7 0 11 10 11 0 1 2 9 10 1\n" + "8 4 7 8 5 6 7 8 9 4 5 8 11 10 9 8 7 0 11 11 0 1 2 10 11 2 3 4 9 10 3\n" + "8 4 7 8 9 6 7 8 11 10 9 8 3 4 11 8 7 0 3 3 0 1 2 10 11 4 5 9 10 5 6\n" + "8 4 7 8 6 7 9 8 10 5 6 8 2 3 10 8 9 11 2 2 11 0 1 5 10 3 4 7 0 11 9\n" + "8 4 7 8 9 10 11 8 5 6 9 8 3 4 5 8 11 0 3 3 0 1 2 9 6 7 10 10 7 0 11\n" + "8 4 7 8 9 7 10 8 4 5 9 8 2 3 4 8 10 11 2 2 11 0 1 9 5 6 7 7 0 11 10\n" + "8 4 7 8 6 7 9 8 4 5 6 8 2 3 4 8 9 10 2 2 10 11 1 7 11 10 9 7 0 1 11\n" + "8 4 7 8 6 9 10 8 4 5 6 8 2 3 4 8 10 11 2 2 11 0 1 9 0 11 10 6 7 0 9\n" + "8 4 7 8 5 6 7 8 9 4 5 8 11 10 9 8 7 0 11 10 11 0 3 0 1 2 3 4 9 10 3\n" + "8 4 7 8 6 7 9 8 4 5 6 8 10 3 4 8 9 11 10 3 10 11 2 11 0 1 2 7 0 11 9\n" + "8 4 7 8 9 6 7 8 10 4 9 8 11 2 10 8 7 0 11 2 11 0 1 4 10 2 3 9 4 5 6\n" + "8 4 7 0 5 6 7 0 8 4 5 0 1 9 8 9 1 11 10 1 2 3 11 4 8 9 10 4 10 11 3\n" + "8 4 7 0 5 6 7 0 9 8 5 0 1 10 9 10 1 4 11 1 2 3 4 8 9 10 11 5 8 11 4\n" + "8 4 7 0 3 4 7 0 9 8 3 0 1 10 9 10 1 2 11 8 9 10 11 3 8 11 2 4 5 6 7\n" + "8 4 7 0 8 9 7 0 10 4 8 0 1 11 10 11 1 2 3 4 10 11 3 8 4 5 9 9 5 6 7\n" + "10 0 4 0 7 8 9 0 5 6 7 0 1 4 5 4 1 2 3\n" + "10 0 4 0 7 8 9 0 5 6 7 0 1 2 5 5 2 3 4\n" + "10 0 4 0 7 8 9 0 3 6 7 0 1 2 3 6 3 4 5\n" + "10 0 4 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4\n" + "10 1 5 10 7 8 9 10 5 6 7 10 3 4 5 10 1 2 3 10 9 0 1\n" + "10 1 5 10 7 8 9 10 5 6 7 10 3 4 5 10 9 0 3 3 0 1 2\n" + "10 1 5 0 7 8 9 0 5 6 7 0 1 10 5 10 1 2 3 5 10 3 4\n" + "10 1 5 0 7 8 9 0 10 6 7 0 1 4 10 4 1 2 3 6 10 4 5\n" + "10 1 5 0 10 8 9 0 5 6 10 0 1 4 5 4 1 2 3 10 6 7 8\n" + "10 1 5 0 7 8 9 0 3 10 7 0 1 2 3 10 3 4 5 7 10 5 6\n" + "10 1 5 0 7 8 9 0 10 6 7 0 1 2 10 6 10 2 5 2 3 4 5\n" + "10 2 6 10 7 8 9 10 5 6 7 10 3 4 5 10 11 2 3 10 9 0 11 2 11 0 1\n" + "10 2 6 10 7 8 9 10 5 6 7 10 3 4 5 10 9 11 3 3 11 1 2 9 0 1 11\n" + "10 2 6 10 7 8 9 10 5 6 7 10 11 4 5 10 9 0 11 11 0 1 2 4 11 2 3\n" + "10 2 6 10 7 8 9 10 11 6 7 10 3 4 11 10 9 0 3 3 0 1 2 6 11 4 5\n" + "10 2 6 10 11 8 9 10 5 6 11 10 3 4 5 10 9 0 3 3 0 1 2 11 6 7 8\n" + "10 2 6 10 7 8 11 10 5 6 7 10 3 4 5 10 11 0 3 3 0 1 2 8 9 0 11\n" + "10 2 6 10 7 8 9 10 5 6 7 10 11 4 5 10 9 0 11 4 11 0 3 0 1 2 3\n" + "10 2 6 0 7 8 9 0 10 6 7 0 1 11 10 11 1 4 5 1 2 3 4 6 10 11 5\n" + "10 2 6 0 7 8 9 0 5 6 7 0 1 10 5 10 1 2 11 11 2 3 4 5 10 11 4\n" + "10 2 6 0 7 8 9 0 10 6 7 0 1 11 10 11 1 2 5 5 2 3 4 6 10 11 5\n" + "10 2 6 0 10 8 9 0 5 6 10 0 1 11 5 11 1 2 3 5 11 3 4 10 6 7 8\n" + "10 2 6 0 7 8 9 0 10 6 7 0 1 11 10 11 1 2 3 6 10 11 3 6 3 4 5\n" + "10 2 6 0 7 8 9 0 10 4 7 0 1 11 10 11 1 2 3 4 10 11 3 7 4 5 6\n" + "10 2 6 0 5 6 9 0 10 4 5 0 1 11 10 11 1 2 3 4 10 11 3 6 7 8 9\n" + "10 2 6 0 10 8 9 0 5 11 10 0 1 4 5 4 1 2 3 11 5 6 7 10 11 7 8\n" + "10 2 6 0 10 8 9 0 11 6 10 0 1 4 11 4 1 2 3 6 11 4 5 10 6 7 8\n" + "10 2 6 0 10 8 9 0 3 11 10 0 1 2 3 11 3 4 5 10 11 5 8 8 5 6 7\n" + "10 3 7 10 8 9 11 10 6 7 8 10 4 5 6 10 11 12 4 4 12 2 3 12 0 1 2 9 0 12 11\n" + "10 3 7 10 7 8 9 10 5 6 7 10 3 4 5 10 9 11 3 3 11 12 2 9 0 12 11 2 12 0 1\n" + "10 3 7 10 7 8 9 10 5 6 7 10 11 4 5 10 9 12 11 11 12 1 2 9 0 1 12 4 11 2 3\n" + "10 3 7 10 7 8 9 10 11 6 7 10 3 4 11 10 9 12 3 3 12 1 2 9 0 1 12 6 11 4 5\n" + "10 3 7 10 7 8 9 10 5 6 7 10 11 4 5 10 9 0 11 11 0 1 12 12 1 2 3 4 11 12 3\n" + "10 3 7 10 8 9 11 10 6 7 8 10 4 5 6 10 11 12 4 4 12 0 3 3 0 1 2 9 0 12 11\n" + "10 3 7 10 8 9 11 10 6 7 8 10 2 3 6 10 11 12 2 2 12 0 1 6 3 4 5 9 0 12 11\n" + "10 3 7 10 11 8 9 10 5 12 11 10 3 4 5 10 9 0 3 3 0 1 2 12 5 6 7 11 12 7 8\n" + "10 3 7 10 7 8 9 10 12 11 7 10 3 4 12 10 9 0 3 3 0 1 2 11 12 4 5 7 11 5 6\n" + "10 3 7 10 11 8 9 10 12 6 11 10 3 4 12 10 9 0 3 3 0 1 2 6 12 4 5 11 6 7 8\n" + "10 3 7 10 7 8 11 10 12 6 7 10 3 4 12 10 11 0 3 3 0 1 2 6 12 4 5 8 9 0 11\n" + "10 3 7 10 7 11 12 10 5 6 7 10 3 4 5 10 12 0 3 3 0 1 2 7 8 9 11 11 9 0 12\n" + "10 3 7 10 11 8 12 10 5 6 11 10 3 4 5 10 12 0 3 3 0 1 2 11 6 7 8 8 9 0 12\n" + "10 3 7 10 6 7 11 10 4 5 6 10 2 3 4 10 11 12 2 2 12 0 1 7 0 12 11 7 8 9 0\n" + "10 3 7 10 7 8 9 10 5 6 7 10 11 4 5 10 9 0 11 4 11 0 12 0 1 2 12 4 12 2 3\n" + "10 3 7 10 7 8 9 10 11 6 7 10 12 4 11 10 9 0 12 4 12 0 3 0 1 2 3 6 11 4 5\n" + "10 3 7 10 11 8 9 10 5 6 11 10 12 4 5 10 9 0 12 4 12 0 3 0 1 2 3 11 6 7 8\n" + "10 4 8 10 7 8 9 10 5 6 7 10 11 4 5 10 13 12 11 10 9 0 13 13 0 1 2 12 13 2 3 4 11 12 3\n" + "10 4 8 10 8 9 11 10 6 7 8 10 4 5 6 10 12 3 4 10 11 13 12 3 12 13 2 13 0 1 2 9 0 13 11\n" + "10 4 8 10 7 8 9 10 5 6 7 10 11 4 5 10 9 0 11 11 0 13 12 0 1 2 13 12 13 2 3 4 11 12 3\n" + "10 4 8 10 8 9 11 10 6 7 8 10 4 5 6 10 11 12 4 4 12 13 3 12 0 1 13 3 13 1 2 9 0 12 11\n" + "10 4 8 10 7 8 9 10 11 6 7 10 13 12 11 10 9 0 13 13 0 3 4 0 1 2 3 12 13 4 5 6 11 12 5\n" + "10 4 8 10 8 9 11 10 6 7 8 10 12 5 6 10 11 13 12 12 13 2 3 13 0 1 2 5 12 3 4 9 0 13 11\n" + "10 4 8 10 11 8 9 10 13 12 11 10 5 6 13 10 9 0 5 5 0 3 4 0 1 2 3 12 13 6 7 11 12 7 8\n" + "10 4 8 10 11 9 12 10 6 7 11 10 4 5 6 10 12 13 4 4 13 2 3 13 0 1 2 11 7 8 9 9 0 13 12\n" + "10 4 8 10 8 11 12 10 6 7 8 10 4 5 6 10 12 13 4 4 13 2 3 13 0 1 2 11 0 13 12 8 9 0 11\n" + "10 4 8 10 8 9 11 10 6 7 8 10 4 5 6 10 11 12 4 4 12 2 3 11 13 2 12 2 13 0 1 9 0 13 11\n" + "10 4 8 10 7 8 9 10 5 6 7 10 11 4 5 10 9 12 11 11 12 13 2 9 0 13 12 2 13 0 1 4 11 2 3\n" + "10 4 8 10 7 8 9 10 11 6 7 10 3 4 11 10 9 12 3 3 12 13 2 9 0 13 12 2 13 0 1 6 11 4 5\n" + "10 4 8 10 7 8 9 10 5 6 7 10 12 11 5 10 9 13 12 12 13 1 2 9 0 1 13 11 12 2 3 5 11 3 4\n" + "10 4 8 10 7 8 9 10 11 6 7 10 12 4 11 10 9 13 12 12 13 1 2 9 0 1 13 4 12 2 3 6 11 4 5\n" + "10 4 8 10 11 8 9 10 5 6 11 10 12 4 5 10 9 13 12 12 13 1 2 9 0 1 13 4 12 2 3 11 6 7 8\n" + "10 4 8 10 11 8 9 10 5 12 11 10 3 4 5 10 9 13 3 3 13 1 2 9 0 1 13 12 5 6 7 11 12 7 8\n" + "10 4 8 10 11 8 9 10 12 6 11 10 3 4 12 10 9 13 3 3 13 1 2 9 0 1 13 6 12 4 5 11 6 7 8\n" + "10 4 8 10 11 8 9 10 5 6 11 10 12 4 5 10 9 0 12 12 0 1 13 13 1 2 3 4 12 13 3 11 6 7 8\n" + "10 4 8 10 7 8 9 10 11 6 7 10 13 12 11 10 9 0 13 13 0 1 4 4 1 2 3 12 13 4 5 6 11 12 5\n" + "10 4 8 10 8 9 11 10 6 7 8 10 12 5 6 10 11 13 12 12 13 0 3 3 0 1 2 5 12 3 4 9 0 13 11\n" + "10 4 8 10 11 8 9 10 13 12 11 10 5 6 13 10 9 0 5 5 0 1 4 4 1 2 3 12 13 6 7 11 12 7 8\n" + "10 4 8 10 8 9 11 10 12 7 8 10 4 5 12 10 11 13 4 4 13 0 3 3 0 1 2 7 12 5 6 9 0 13 11\n" + "10 4 8 10 11 12 13 10 7 8 11 10 5 6 7 10 13 0 5 5 0 1 4 4 1 2 3 11 8 9 12 12 9 0 13\n" + "10 4 8 10 11 9 12 10 6 7 11 10 4 5 6 10 12 13 4 4 13 0 3 3 0 1 2 11 7 8 9 9 0 13 12\n" + "10 4 8 10 8 9 11 10 6 7 8 10 4 5 6 10 11 12 4 4 12 13 3 3 13 1 2 9 13 12 11 9 0 1 13\n" + "10 4 8 10 8 9 11 10 6 7 8 10 12 3 6 10 11 13 12 12 13 0 1 3 12 1 2 6 3 4 5 9 0 13 11\n" + "10 4 8 10 7 8 9 10 11 6 7 10 13 12 11 10 9 0 13 13 0 1 2 12 13 2 3 6 11 12 3 6 3 4 5\n" + "10 4 8 10 11 12 13 10 7 8 11 10 3 4 7 10 13 0 3 3 0 1 2 7 4 5 6 11 8 9 12 12 9 0 13\n" + "10 4 8 10 11 9 12 10 6 7 11 10 2 3 6 10 12 13 2 2 13 0 1 6 3 4 5 11 7 8 9 9 0 13 12\n" + "10 4 8 10 8 9 11 10 6 7 8 10 2 3 6 10 11 12 2 2 12 13 1 6 3 4 5 9 13 12 11 9 0 1 13\n" + "10 4 8 10 8 11 12 10 6 7 8 10 2 3 6 10 12 13 2 2 13 0 1 6 3 4 5 11 0 13 12 8 9 0 11\n" + "10 4 8 10 11 8 9 10 5 12 11 10 3 4 5 10 9 0 3 3 0 1 2 12 5 6 13 11 12 13 8 8 13 6 7\n" + "10 4 8 10 11 8 12 10 5 13 11 10 3 4 5 10 12 0 3 3 0 1 2 13 5 6 7 11 13 7 8 8 9 0 12\n" + "10 4 8 10 11 12 13 10 5 8 11 10 3 4 5 10 13 0 3 3 0 1 2 8 5 6 7 11 8 9 12 12 9 0 13\n" + "10 4 8 10 7 8 9 10 12 11 7 10 3 4 12 10 9 0 3 3 0 1 2 11 12 4 13 4 5 6 13 7 11 13 6\n" + "10 4 8 10 11 8 9 10 13 12 11 10 3 4 13 10 9 0 3 3 0 1 2 12 13 4 7 4 5 6 7 11 12 7 8\n" + "10 4 8 10 8 9 11 10 12 7 8 10 2 3 12 10 11 13 2 2 13 0 1 7 12 3 6 3 4 5 6 9 0 13 11\n" + "10 4 8 10 11 8 9 10 13 12 11 10 3 4 13 10 9 0 3 3 0 1 2 12 13 4 5 12 5 6 7 11 12 7 8\n" + "10 4 8 10 8 9 11 10 12 7 8 10 2 3 12 10 11 13 2 2 13 0 1 7 12 3 4 7 4 5 6 9 0 13 11\n" + "10 4 8 10 8 9 11 10 12 5 8 10 2 3 12 10 11 13 2 2 13 0 1 5 12 3 4 8 5 6 7 9 0 13 11\n" + "10 4 8 10 11 8 9 10 13 12 11 10 3 4 13 10 9 0 3 3 0 1 2 12 13 4 5 11 12 5 8 8 5 6 7\n" + "10 4 8 10 11 6 7 10 13 12 11 10 3 4 13 10 7 0 3 3 0 1 2 12 13 4 5 11 12 5 6 7 8 9 0\n" + "10 4 8 10 7 11 12 10 13 6 7 10 3 4 13 10 12 0 3 3 0 1 2 6 13 4 5 7 8 9 11 11 9 0 12\n" + "10 4 8 10 11 8 12 10 13 6 11 10 3 4 13 10 12 0 3 3 0 1 2 6 13 4 5 11 6 7 8 8 9 0 12\n" + "10 4 8 10 6 7 11 10 12 5 6 10 2 3 12 10 11 13 2 2 13 0 1 5 12 3 4 7 0 13 11 7 8 9 0\n" + "10 4 8 10 11 12 13 10 5 6 11 10 3 4 5 10 13 0 3 3 0 1 2 11 6 9 12 6 7 8 9 12 9 0 13\n" + "10 4 8 10 11 9 12 10 4 5 11 10 2 3 4 10 12 13 2 2 13 0 1 11 5 8 9 5 6 7 8 9 0 13 12\n" + "10 4 8 10 11 12 13 10 5 6 11 10 3 4 5 10 13 0 3 3 0 1 2 11 6 7 12 12 7 8 9 12 9 0 13\n" + "10 4 8 10 8 9 11 10 6 7 8 10 4 5 6 10 11 12 4 4 12 13 3 9 13 12 11 9 0 3 13 3 0 1 2\n" + "10 4 8 10 7 8 9 10 5 6 7 10 11 4 5 10 9 0 11 4 11 0 12 0 1 13 12 13 1 2 3 4 12 13 3\n" + "10 4 8 10 7 8 9 10 11 6 7 10 13 12 11 10 9 0 13 12 13 0 5 0 1 4 5 4 1 2 3 6 11 12 5\n" + "10 4 8 10 11 8 9 10 5 6 11 10 12 4 5 10 9 0 12 4 12 0 13 0 1 2 13 4 13 2 3 11 6 7 8\n" + "10 4 8 10 11 8 9 10 12 6 11 10 13 4 12 10 9 0 13 4 13 0 3 0 1 2 3 6 12 4 5 11 6 7 8\n" + "12 0 5 0 9 10 11 0 7 8 9 0 1 6 7 6 1 4 5 1 2 3 4\n" + "12 0 5 0 9 10 11 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4\n" + "12 0 5 0 9 10 11 0 7 8 9 0 1 6 7 6 1 2 3 6 3 4 5\n" + "12 0 5 0 9 10 11 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6\n" + "12 0 5 0 9 10 11 0 5 8 9 0 1 4 5 4 1 2 3 8 5 6 7\n" + "12 0 5 0 9 10 11 0 5 6 9 0 1 4 5 4 1 2 3 9 6 7 8\n" + "12 0 5 0 7 10 11 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 10\n" + "12 0 5 0 7 8 11 0 5 6 7 0 1 4 5 4 1 2 3 8 9 10 11\n" + "12 0 5 0 9 10 11 0 7 8 9 0 1 2 7 7 2 5 6 2 3 4 5\n" + "12 0 5 0 9 10 11 0 3 6 9 0 1 2 3 6 3 4 5 9 6 7 8\n" + "12 0 5 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5\n" + "12 1 6 12 9 10 11 12 7 8 9 12 5 6 7 12 3 4 5 12 11 0 3 3 0 1 2\n" + "12 1 6 12 9 10 11 12 7 8 9 12 5 6 7 12 11 0 5 5 0 3 4 0 1 2 3\n" + "12 1 6 12 9 10 11 12 7 8 9 12 5 6 7 12 11 0 5 5 0 1 4 4 1 2 3\n" + "12 1 6 12 9 10 11 12 7 8 9 12 3 4 7 12 11 0 3 3 0 1 2 7 4 5 6\n" + "12 1 6 12 9 10 11 12 5 8 9 12 3 4 5 12 11 0 3 3 0 1 2 8 5 6 7\n" + "12 1 6 12 9 10 11 12 5 6 9 12 3 4 5 12 11 0 3 3 0 1 2 9 6 7 8\n" + "12 1 6 12 7 10 11 12 5 6 7 12 3 4 5 12 11 0 3 3 0 1 2 7 8 9 10\n" + "12 1 6 12 7 8 9 12 5 6 7 12 3 4 5 12 9 0 3 3 0 1 2 9 10 11 0\n" + "12 1 6 0 9 10 11 0 7 8 9 0 1 6 7 6 1 12 5 1 2 3 12 5 12 3 4\n" + "12 1 6 0 9 10 11 0 7 8 9 0 1 12 7 12 1 4 5 1 2 3 4 7 12 5 6\n" + "12 1 6 0 9 10 11 0 7 8 9 0 1 6 7 6 1 2 12 12 2 3 4 6 12 4 5\n" + "12 1 6 0 9 10 11 0 7 8 9 0 1 12 7 12 1 2 5 5 2 3 4 7 12 5 6\n" + "12 1 6 0 9 10 11 0 12 8 9 0 1 6 12 6 1 2 5 5 2 3 4 8 12 6 7\n" + "12 1 6 0 12 10 11 0 7 8 12 0 1 6 7 6 1 2 5 5 2 3 4 12 8 9 10\n" + "12 1 6 0 12 10 11 0 7 8 12 0 1 4 7 4 1 2 3 7 4 5 6 12 8 9 10\n" + "12 1 6 0 9 10 11 0 7 8 9 0 1 12 7 12 1 2 3 7 12 3 6 3 4 5 6\n" + "12 1 6 0 7 10 11 0 5 6 7 0 1 12 5 12 1 2 3 5 12 3 4 7 8 9 10\n" + "12 1 6 0 7 8 11 0 5 6 7 0 1 12 5 12 1 2 3 5 12 3 4 8 9 10 11\n" + "12 1 6 0 9 10 11 0 5 12 9 0 1 4 5 4 1 2 3 12 5 6 7 9 12 7 8\n" + "12 1 6 0 9 10 11 0 12 8 9 0 1 4 12 4 1 2 3 8 12 4 5 8 5 6 7\n" + "12 1 6 0 9 10 11 0 12 6 9 0 1 4 12 4 1 2 3 6 12 4 5 9 6 7 8\n" + "12 1 6 0 7 8 11 0 12 6 7 0 1 4 12 4 1 2 3 6 12 4 5 8 9 10 11\n" + "12 1 6 0 12 10 11 0 5 6 12 0 1 4 5 4 1 2 3 12 6 7 10 10 7 8 9\n" + "12 2 7 12 9 10 11 12 7 8 9 12 5 6 7 12 3 4 5 12 11 13 3 3 13 1 2 11 0 1 13\n" + "12 2 7 12 9 10 11 12 7 8 9 12 5 6 7 12 13 4 5 12 11 0 13 13 0 1 2 4 13 2 3\n" + "12 2 7 12 9 10 11 12 7 8 9 12 13 6 7 12 3 4 13 12 11 0 3 3 0 1 2 6 13 4 5\n" + "12 2 7 12 9 10 11 12 13 8 9 12 5 6 13 12 3 4 5 12 11 0 3 3 0 1 2 8 13 6 7\n" + "12 2 7 12 13 10 11 12 7 8 13 12 5 6 7 12 3 4 5 12 11 0 3 3 0 1 2 13 8 9 10\n" + "12 2 7 12 9 10 13 12 7 8 9 12 5 6 7 12 3 4 5 12 13 0 3 3 0 1 2 10 11 0 13\n" + "12 2 7 12 9 10 11 12 7 8 9 12 5 6 7 12 13 4 5 12 11 0 13 4 13 0 3 0 1 2 3\n" + "12 2 7 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 3 4 13 1 2 3 11 0 1 13\n" + "12 2 7 12 9 10 11 12 7 8 9 12 5 6 7 12 11 0 5 5 0 13 4 0 1 2 13 4 13 2 3\n" + "12 2 7 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 3 4 0 1 2 3 6 13 4 5\n" + "12 2 7 12 9 10 11 12 13 8 9 12 5 6 13 12 11 0 5 5 0 3 4 0 1 2 3 8 13 6 7\n" + "12 2 7 12 13 10 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 3 4 0 1 2 3 13 8 9 10\n" + "12 2 7 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 3 4 11 0 3 13 3 0 1 2\n" + "12 2 7 12 9 10 11 12 7 8 9 12 3 4 7 12 11 13 3 3 13 1 2 11 0 1 13 7 4 5 6\n" + "12 2 7 12 9 10 11 12 5 8 9 12 3 4 5 12 11 13 3 3 13 1 2 11 0 1 13 8 5 6 7\n" + "12 2 7 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 1 4 4 1 2 3 6 13 4 5\n" + "12 2 7 12 9 10 11 12 13 8 9 12 5 6 13 12 11 0 5 5 0 1 4 4 1 2 3 8 13 6 7\n" + "12 2 7 12 13 10 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 1 4 4 1 2 3 13 8 9 10\n" + "12 2 7 12 9 10 13 12 7 8 9 12 5 6 7 12 13 0 5 5 0 1 4 4 1 2 3 10 11 0 13\n" + "12 2 7 12 9 10 11 12 7 8 9 12 13 4 7 12 11 0 13 13 0 1 2 4 13 2 3 7 4 5 6\n" + "12 2 7 12 13 10 11 12 7 8 13 12 3 4 7 12 11 0 3 3 0 1 2 7 4 5 6 13 8 9 10\n" + "12 2 7 12 9 10 13 12 7 8 9 12 3 4 7 12 13 0 3 3 0 1 2 7 4 5 6 10 11 0 13\n" + "12 2 7 12 13 10 11 12 5 8 13 12 3 4 5 12 11 0 3 3 0 1 2 8 5 6 7 13 8 9 10\n" + "12 2 7 12 9 10 11 12 13 8 9 12 3 4 13 12 11 0 3 3 0 1 2 8 13 4 7 4 5 6 7\n" + "12 2 7 12 9 10 11 12 13 8 9 12 3 4 13 12 11 0 3 3 0 1 2 8 13 4 5 8 5 6 7\n" + "12 2 7 12 9 10 11 12 13 6 9 12 3 4 13 12 11 0 3 3 0 1 2 6 13 4 5 9 6 7 8\n" + "12 2 7 12 7 10 11 12 13 6 7 12 3 4 13 12 11 0 3 3 0 1 2 6 13 4 5 7 8 9 10\n" + "12 2 7 12 7 8 9 12 13 6 7 12 3 4 13 12 9 0 3 3 0 1 2 6 13 4 5 9 10 11 0\n" + "12 2 7 12 7 10 13 12 5 6 7 12 3 4 5 12 13 0 3 3 0 1 2 7 8 9 10 10 11 0 13\n" + "12 2 7 12 13 10 11 12 5 6 13 12 3 4 5 12 11 0 3 3 0 1 2 13 6 9 10 6 7 8 9\n" + "12 2 7 12 13 10 11 12 5 6 13 12 3 4 5 12 11 0 3 3 0 1 2 13 6 7 10 10 7 8 9\n" + "12 2 7 12 7 8 13 12 5 6 7 12 3 4 5 12 13 0 3 3 0 1 2 8 11 0 13 8 9 10 11\n" + "12 2 7 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 5 0 1 4 5 4 1 2 3\n" + "12 2 7 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 5 0 1 2 5 5 2 3 4\n" + "12 2 7 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 3 0 1 2 3 6 3 4 5\n" + "12 2 7 0 9 10 11 0 7 8 9 0 1 6 7 6 1 12 5 1 2 13 12 13 2 3 4 5 12 13 4\n" + "12 2 7 0 9 10 11 0 12 8 9 0 1 13 12 13 1 6 7 1 2 5 6 5 2 3 4 8 12 13 7\n" + "12 2 7 0 9 10 11 0 12 8 9 0 1 13 12 13 1 6 7 1 2 3 6 6 3 4 5 8 12 13 7\n" + "12 2 7 0 9 10 11 0 7 8 9 0 1 12 7 12 1 4 13 1 2 3 4 13 4 5 6 7 12 13 6\n" + "12 2 7 0 9 10 11 0 12 8 9 0 1 13 12 13 1 4 7 1 2 3 4 7 4 5 6 8 12 13 7\n" + "12 2 7 0 9 10 11 0 7 8 9 0 1 6 7 6 1 13 12 1 2 3 13 12 13 3 4 6 12 4 5\n" + "12 2 7 0 9 10 11 0 7 8 9 0 1 12 7 12 1 13 5 1 2 3 13 5 13 3 4 7 12 5 6\n" + "12 2 7 0 9 10 11 0 12 8 9 0 1 6 12 6 1 13 5 1 2 3 13 5 13 3 4 8 12 6 7\n" + "12 2 7 0 12 10 11 0 7 8 12 0 1 6 7 6 1 13 5 1 2 3 13 5 13 3 4 12 8 9 10\n" + "12 2 7 0 9 10 11 0 12 8 9 0 1 13 12 13 1 4 5 1 2 3 4 8 12 13 5 8 5 6 7\n" + "12 2 7 0 9 10 11 0 7 8 9 0 1 12 7 12 1 2 13 13 2 5 6 2 3 4 5 7 12 13 6\n" + "12 2 7 0 9 10 11 0 7 8 9 0 1 6 7 6 1 2 12 12 2 3 13 13 3 4 5 6 12 13 5\n" + "12 2 7 0 9 10 11 0 12 8 9 0 1 13 12 13 1 2 7 7 2 3 6 6 3 4 5 8 12 13 7\n" + "12 2 7 0 12 10 11 0 7 8 12 0 1 6 7 6 1 2 13 13 2 3 4 6 13 4 5 12 8 9 10\n" + "12 2 7 0 9 10 11 0 5 6 9 0 1 12 5 12 1 2 13 13 2 3 4 5 12 13 4 9 6 7 8\n" + "12 2 7 0 7 10 11 0 5 6 7 0 1 12 5 12 1 2 13 13 2 3 4 5 12 13 4 7 8 9 10\n" + "12 2 7 0 7 8 11 0 5 6 7 0 1 12 5 12 1 2 13 13 2 3 4 5 12 13 4 8 9 10 11\n" + "12 2 7 0 12 10 11 0 7 8 12 0 1 13 7 13 1 2 5 5 2 3 4 7 13 5 6 12 8 9 10\n" + "12 2 7 0 12 10 11 0 7 13 12 0 1 6 7 6 1 2 5 5 2 3 4 13 7 8 9 12 13 9 10\n" + "12 2 7 0 9 10 11 0 13 12 9 0 1 6 13 6 1 2 5 5 2 3 4 12 13 6 7 9 12 7 8\n" + "12 2 7 0 12 10 11 0 13 8 12 0 1 6 13 6 1 2 5 5 2 3 4 8 13 6 7 12 8 9 10\n" + "12 2 7 0 12 13 11 0 7 8 12 0 1 6 7 6 1 2 5 5 2 3 4 12 8 9 13 13 9 10 11\n" + "12 2 7 0 12 10 11 0 7 8 12 0 1 13 7 13 1 2 3 7 13 3 6 3 4 5 6 12 8 9 10\n" + "12 2 7 0 7 12 11 0 5 6 7 0 1 13 5 13 1 2 3 5 13 3 4 7 8 9 12 12 9 10 11\n" + "12 2 7 0 9 10 11 0 12 8 9 0 1 13 12 13 1 2 3 8 12 13 3 8 3 4 7 7 4 5 6\n" + "12 2 7 0 9 10 11 0 12 4 9 0 1 13 12 13 1 2 3 4 12 13 3 9 4 5 8 8 5 6 7\n" + "12 2 7 0 12 10 11 0 5 13 12 0 1 4 5 4 1 2 3 13 5 6 7 12 13 7 10 10 7 8 9\n" + "12 2 7 0 12 10 11 0 13 6 12 0 1 4 13 4 1 2 3 6 13 4 5 12 6 7 10 10 7 8 9\n" + "12 2 7 0 12 8 11 0 13 6 12 0 1 4 13 4 1 2 3 6 13 4 5 12 6 7 8 8 9 10 11\n" + "12 3 8 12 10 11 13 12 8 9 10 12 6 7 8 12 4 5 6 12 13 14 4 4 14 2 3 14 0 1 2 11 0 14 13\n" + "12 3 8 12 9 10 11 12 7 8 9 12 5 6 7 12 13 4 5 12 11 14 13 13 14 1 2 11 0 1 14 4 13 2 3\n" + "12 3 8 12 9 10 11 12 7 8 9 12 5 6 7 12 13 4 5 12 11 0 13 13 0 1 14 14 1 2 3 4 13 14 3\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 14 4 13 12 11 0 14 14 0 1 2 4 14 2 3 6 13 4 5\n" + "12 3 8 12 9 10 11 12 13 8 9 12 5 6 13 12 14 4 5 12 11 0 14 14 0 1 2 4 14 2 3 8 13 6 7\n" + "12 3 8 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 3 4 13 14 2 3 11 0 14 13 2 14 0 1\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 14 13 13 14 3 4 14 1 2 3 11 0 1 14 6 13 4 5\n" + "12 3 8 12 9 10 11 12 7 8 9 12 5 6 7 12 11 0 5 5 0 13 4 0 1 14 13 14 1 2 3 4 13 14 3\n" + "12 3 8 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 14 0 3 4 3 0 1 2 11 0 14 13\n" + "12 3 8 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 14 0 1 4 4 1 2 3 11 0 14 13\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 3 14 0 1 2 3 14 3 4 5 6 13 14 5\n" + "12 3 8 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 2 5 14 0 1 2 5 2 3 4 11 0 14 13\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 14 4 0 1 2 14 4 14 2 3 6 13 4 5\n" + "12 3 8 12 9 10 11 12 13 8 9 12 5 6 13 12 11 0 5 5 0 14 4 0 1 2 14 4 14 2 3 8 13 6 7\n" + "12 3 8 12 13 10 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 14 4 0 1 2 14 4 14 2 3 13 8 9 10\n" + "12 3 8 12 9 10 11 12 7 8 9 12 14 13 7 12 11 0 14 14 0 3 4 0 1 2 3 13 14 4 5 7 13 5 6\n" + "12 3 8 12 9 10 11 12 13 8 9 12 14 6 13 12 11 0 14 14 0 3 4 0 1 2 3 6 14 4 5 8 13 6 7\n" + "12 3 8 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 14 0 3 4 0 1 2 3 6 14 4 5 13 8 9 10\n" + "12 3 8 12 13 10 11 12 7 14 13 12 5 6 7 12 11 0 5 5 0 3 4 0 1 2 3 14 7 8 9 13 14 9 10\n" + "12 3 8 12 9 10 11 12 14 13 9 12 5 6 14 12 11 0 5 5 0 3 4 0 1 2 3 13 14 6 7 9 13 7 8\n" + "12 3 8 12 13 10 11 12 14 8 13 12 5 6 14 12 11 0 5 5 0 3 4 0 1 2 3 8 14 6 7 13 8 9 10\n" + "12 3 8 12 8 11 13 12 6 7 8 12 4 5 6 12 13 14 4 4 14 2 3 14 0 1 2 8 9 10 11 11 0 14 13\n" + "12 3 8 12 13 14 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 3 4 0 1 2 3 13 8 9 14 14 9 10 11\n" + "12 3 8 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 14 4 11 0 14 13 14 0 1 2 4 14 2 3\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 14 13 13 14 3 4 11 0 3 14 3 0 1 2 6 13 4 5\n" + "12 3 8 12 9 10 11 12 13 8 9 12 5 6 13 12 11 14 5 5 14 3 4 11 0 3 14 3 0 1 2 8 13 6 7\n" + "12 3 8 12 13 10 11 12 7 8 13 12 5 6 7 12 11 14 5 5 14 3 4 11 0 3 14 3 0 1 2 13 8 9 10\n" + "12 3 8 12 9 10 13 12 7 8 9 12 5 6 7 12 13 14 5 5 14 3 4 13 0 3 14 3 0 1 2 10 11 0 13\n" + "12 3 8 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 14 4 11 0 14 13 4 14 0 3 0 1 2 3\n" + "12 3 8 12 9 10 11 12 7 8 9 12 3 4 7 12 11 13 3 3 13 14 2 11 0 14 13 2 14 0 1 7 4 5 6\n" + "12 3 8 12 9 10 11 12 5 8 9 12 3 4 5 12 11 13 3 3 13 14 2 11 0 14 13 2 14 0 1 8 5 6 7\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 14 13 13 14 1 2 11 0 1 14 6 13 2 5 2 3 4 5\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 4 7 12 11 14 13 13 14 1 2 11 0 1 14 4 13 2 3 7 4 5 6\n" + "12 3 8 12 9 10 11 12 5 6 9 12 13 4 5 12 11 14 13 13 14 1 2 11 0 1 14 4 13 2 3 9 6 7 8\n" + "12 3 8 12 7 10 11 12 5 6 7 12 13 4 5 12 11 14 13 13 14 1 2 11 0 1 14 4 13 2 3 7 8 9 10\n" + "12 3 8 12 13 10 11 12 7 8 13 12 3 4 7 12 11 14 3 3 14 1 2 11 0 1 14 7 4 5 6 13 8 9 10\n" + "12 3 8 12 9 10 11 12 5 13 9 12 3 4 5 12 11 14 3 3 14 1 2 11 0 1 14 13 5 6 7 9 13 7 8\n" + "12 3 8 12 13 10 11 12 5 8 13 12 3 4 5 12 11 14 3 3 14 1 2 11 0 1 14 8 5 6 7 13 8 9 10\n" + "12 3 8 12 9 10 11 12 13 8 9 12 3 4 13 12 11 14 3 3 14 1 2 11 0 1 14 8 13 4 7 4 5 6 7\n" + "12 3 8 12 9 10 11 12 13 8 9 12 3 4 13 12 11 14 3 3 14 1 2 11 0 1 14 8 13 4 5 8 5 6 7\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 1 14 14 1 4 5 1 2 3 4 6 13 14 5\n" + "12 3 8 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 0 5 5 0 1 4 4 1 2 3 11 0 14 13\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 1 14 14 1 2 3 14 3 4 5 6 13 14 5\n" + "12 3 8 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 0 5 5 0 1 2 5 2 3 4 11 0 14 13\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 4 7 12 11 0 13 13 0 1 14 14 1 2 3 4 13 14 3 7 4 5 6\n" + "12 3 8 12 9 10 11 12 5 6 9 12 13 4 5 12 11 0 13 13 0 1 14 14 1 2 3 4 13 14 3 9 6 7 8\n" + "12 3 8 12 10 11 13 12 8 9 10 12 4 5 8 12 13 14 4 4 14 0 3 3 0 1 2 8 5 6 7 11 0 14 13\n" + "12 3 8 12 13 10 11 12 7 14 13 12 5 6 7 12 11 0 5 5 0 1 4 4 1 2 3 14 7 8 9 13 14 9 10\n" + "12 3 8 12 10 11 13 12 6 9 10 12 4 5 6 12 13 14 4 4 14 0 3 3 0 1 2 9 6 7 8 11 0 14 13\n" + "12 3 8 12 9 10 11 12 14 13 9 12 5 6 14 12 11 0 5 5 0 1 4 4 1 2 3 13 14 6 7 9 13 7 8\n" + "12 3 8 12 13 10 11 12 14 8 13 12 5 6 14 12 11 0 5 5 0 1 4 4 1 2 3 8 14 6 7 13 8 9 10\n" + "12 3 8 12 9 10 13 12 14 8 9 12 5 6 14 12 13 0 5 5 0 1 4 4 1 2 3 8 14 6 7 10 11 0 13\n" + "12 3 8 12 10 11 13 12 6 7 10 12 4 5 6 12 13 14 4 4 14 0 3 3 0 1 2 10 7 8 9 11 0 14 13\n" + "12 3 8 12 9 13 14 12 7 8 9 12 5 6 7 12 14 0 5 5 0 1 4 4 1 2 3 9 10 11 13 13 11 0 14\n" + "12 3 8 12 8 11 13 12 6 7 8 12 4 5 6 12 13 14 4 4 14 0 3 3 0 1 2 8 9 10 11 11 0 14 13\n" + "12 3 8 12 13 14 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 1 4 4 1 2 3 13 8 9 14 14 9 10 11\n" + "12 3 8 12 13 10 14 12 7 8 13 12 5 6 7 12 14 0 5 5 0 1 4 4 1 2 3 13 8 9 10 10 11 0 14\n" + "12 3 8 12 10 11 13 12 6 7 10 12 2 3 6 12 13 14 2 2 14 0 1 6 3 4 5 10 7 8 9 11 0 14 13\n" + "12 3 8 12 9 13 14 12 7 8 9 12 3 4 7 12 14 0 3 3 0 1 2 7 4 5 6 9 10 11 13 13 11 0 14\n" + "12 3 8 12 8 11 13 12 6 7 8 12 2 3 6 12 13 14 2 2 14 0 1 6 3 4 5 8 9 10 11 11 0 14 13\n" + "12 3 8 12 13 10 14 12 7 8 13 12 3 4 7 12 14 0 3 3 0 1 2 7 4 5 6 13 8 9 10 10 11 0 14\n" + "12 3 8 12 8 9 13 12 6 7 8 12 2 3 6 12 13 14 2 2 14 0 1 6 3 4 5 9 0 14 13 9 10 11 0\n" + "12 3 8 12 10 11 13 12 4 7 10 12 2 3 4 12 13 14 2 2 14 0 1 7 4 5 6 10 7 8 9 11 0 14 13\n" + "12 3 8 12 13 10 11 12 5 14 13 12 3 4 5 12 11 0 3 3 0 1 2 14 5 6 7 13 14 7 10 10 7 8 9\n" + "12 3 8 12 13 10 14 12 5 8 13 12 3 4 5 12 14 0 3 3 0 1 2 8 5 6 7 13 8 9 10 10 11 0 14\n" + "12 3 8 12 9 10 11 12 13 8 9 12 3 4 13 12 11 0 3 3 0 1 2 8 13 4 14 4 5 6 14 8 14 6 7\n" + "12 3 8 12 9 10 11 12 14 13 9 12 3 4 14 12 11 0 3 3 0 1 2 13 14 4 7 4 5 6 7 9 13 7 8\n" + "12 3 8 12 13 10 11 12 14 8 13 12 3 4 14 12 11 0 3 3 0 1 2 8 14 4 7 4 5 6 7 13 8 9 10\n" + "12 3 8 12 9 10 13 12 14 8 9 12 3 4 14 12 13 0 3 3 0 1 2 8 14 4 7 4 5 6 7 10 11 0 13\n" + "12 3 8 12 9 10 13 12 14 8 9 12 3 4 14 12 13 0 3 3 0 1 2 8 14 4 5 8 5 6 7 10 11 0 13\n" + "12 3 8 12 9 10 13 12 14 6 9 12 3 4 14 12 13 0 3 3 0 1 2 6 14 4 5 9 6 7 8 10 11 0 13\n" + "12 3 8 12 7 10 13 12 14 6 7 12 3 4 14 12 13 0 3 3 0 1 2 6 14 4 5 7 8 9 10 10 11 0 13\n" + "12 3 8 12 13 10 11 12 14 6 13 12 3 4 14 12 11 0 3 3 0 1 2 6 14 4 5 13 6 7 10 10 7 8 9\n" + "12 3 8 12 13 8 9 12 14 6 13 12 3 4 14 12 9 0 3 3 0 1 2 6 14 4 5 13 6 7 8 9 10 11 0\n" + "12 3 8 12 7 8 13 12 14 6 7 12 3 4 14 12 13 0 3 3 0 1 2 6 14 4 5 8 11 0 13 8 9 10 11\n" + "12 3 8 12 13 10 11 12 5 6 13 12 3 4 5 12 11 0 3 3 0 1 2 13 6 14 10 6 7 8 14 10 14 8 9\n" + "12 3 8 12 13 10 14 12 5 6 13 12 3 4 5 12 14 0 3 3 0 1 2 13 6 9 10 6 7 8 9 10 11 0 14\n" + "12 3 8 12 6 7 13 12 4 5 6 12 2 3 4 12 13 14 2 2 14 0 1 7 0 14 13 7 8 11 0 11 8 9 10\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 5 0 1 14 5 14 1 2 3 5 14 3 4\n" + "12 3 8 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 14 0 1 4 14 4 1 2 3 6 14 4 5\n" + "12 3 8 12 9 10 11 12 13 8 9 12 14 6 13 12 11 0 14 6 14 0 5 0 1 4 5 4 1 2 3 8 13 6 7\n" + "12 3 8 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 6 14 0 5 0 1 4 5 4 1 2 3 13 8 9 10\n" + "12 3 8 12 9 10 11 12 13 8 9 12 14 6 13 12 11 0 14 6 14 0 5 0 1 2 5 5 2 3 4 8 13 6 7\n" + "12 3 8 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 6 14 0 5 0 1 2 5 5 2 3 4 13 8 9 10\n" + "12 3 8 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 6 14 0 3 0 1 2 3 6 3 4 5 13 8 9 10\n" + "12 3 8 12 9 10 11 12 13 8 9 12 14 4 13 12 11 0 14 4 14 0 3 0 1 2 3 8 13 4 5 8 5 6 7\n" + "12 3 8 12 13 10 11 12 5 6 13 12 14 4 5 12 11 0 14 4 14 0 3 0 1 2 3 13 6 9 10 6 7 8 9\n" + "12 3 8 12 13 10 11 12 5 6 13 12 14 4 5 12 11 0 14 4 14 0 3 0 1 2 3 13 6 7 10 10 7 8 9\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 13 4 5 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 3 4 13 14 3\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 4 5 6 12 13 14 4 4 14 15 3 14 0 1 15 3 15 1 2 11 0 14 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 15 14 13 12 11 0 15 15 0 3 4 0 1 2 3 14 15 4 5 6 13 14 5\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 14 5 6 12 13 15 14 14 15 2 3 15 0 1 2 5 14 3 4 11 0 15 13\n" + "12 4 9 12 10 11 13 12 8 9 10 12 14 7 8 12 4 5 14 12 13 15 4 4 15 2 3 15 0 1 2 7 14 5 6 11 0 15 13\n" + "12 4 9 12 10 11 13 12 14 9 10 12 6 7 14 12 4 5 6 12 13 15 4 4 15 2 3 15 0 1 2 9 14 7 8 11 0 15 13\n" + "12 4 9 12 13 11 14 12 8 9 13 12 6 7 8 12 4 5 6 12 14 15 4 4 15 2 3 15 0 1 2 13 9 10 11 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 4 5 6 12 13 14 4 4 14 2 3 14 15 1 2 11 15 14 13 11 0 1 15\n" + "12 4 9 12 10 13 14 12 8 9 10 12 6 7 8 12 4 5 6 12 14 15 4 4 15 2 3 15 0 1 2 13 0 15 14 10 11 0 13\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 4 5 6 12 13 14 4 4 14 2 3 13 15 2 14 2 15 0 1 11 0 15 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 13 4 5 12 11 14 13 13 14 15 2 11 0 15 14 2 15 0 1 4 13 2 3\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 14 13 5 12 11 15 14 14 15 1 2 11 0 1 15 13 14 2 3 5 13 3 4\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 14 4 13 12 11 15 14 14 15 1 2 11 0 1 15 4 14 2 3 6 13 4 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 5 6 13 12 14 4 5 12 11 15 14 14 15 1 2 11 0 1 15 4 14 2 3 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 5 6 7 12 14 4 5 12 11 15 14 14 15 1 2 11 0 1 15 4 14 2 3 13 8 9 10\n" + "12 4 9 12 9 10 13 12 7 8 9 12 5 6 7 12 14 4 5 12 13 15 14 14 15 1 2 13 0 1 15 4 14 2 3 10 11 0 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 14 4 13 12 11 0 14 14 0 1 15 15 1 2 3 4 14 15 3 6 13 4 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 5 6 13 12 14 4 5 12 11 0 14 14 0 1 15 15 1 2 3 4 14 15 3 8 13 6 7\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 15 14 13 12 11 0 15 15 0 1 4 4 1 2 3 14 15 4 5 6 13 14 5\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 14 5 6 12 13 15 14 14 15 0 3 3 0 1 2 5 14 3 4 11 0 15 13\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 4 5 6 12 13 14 4 4 14 15 3 3 15 1 2 11 15 14 13 11 0 1 15\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 14 3 6 12 13 15 14 14 15 0 1 3 14 1 2 6 3 4 5 11 0 15 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 15 14 13 12 11 0 15 15 0 1 2 14 15 2 3 6 13 14 3 6 3 4 5\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 4 7 12 15 14 13 12 11 0 15 15 0 1 2 14 15 2 3 4 13 14 3 7 4 5 6\n" + "12 4 9 12 9 10 11 12 5 8 9 12 13 4 5 12 15 14 13 12 11 0 15 15 0 1 2 14 15 2 3 4 13 14 3 8 5 6 7\n" + "12 4 9 12 9 10 11 12 5 6 9 12 13 4 5 12 15 14 13 12 11 0 15 15 0 1 2 14 15 2 3 4 13 14 3 9 6 7 8\n" + "12 4 9 12 7 10 11 12 5 6 7 12 13 4 5 12 15 14 13 12 11 0 15 15 0 1 2 14 15 2 3 4 13 14 3 7 8 9 10\n" + "12 4 9 12 7 8 11 12 5 6 7 12 13 4 5 12 15 14 13 12 11 0 15 15 0 1 2 14 15 2 3 4 13 14 3 8 9 10 11\n" + "12 4 9 12 9 10 11 12 13 8 9 12 5 14 13 12 15 4 5 12 11 0 15 15 0 1 2 4 15 2 3 14 5 6 7 8 13 14 7\n" + "12 4 9 12 9 10 11 12 7 8 9 12 14 13 7 12 15 4 14 12 11 0 15 15 0 1 2 4 15 2 3 13 14 4 5 7 13 5 6\n" + "12 4 9 12 9 10 11 12 13 8 9 12 14 6 13 12 15 4 14 12 11 0 15 15 0 1 2 4 15 2 3 6 14 4 5 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 15 4 14 12 11 0 15 15 0 1 2 4 15 2 3 6 14 4 5 13 8 9 10\n" + "12 4 9 12 9 10 13 12 7 8 9 12 14 6 7 12 15 4 14 12 13 0 15 15 0 1 2 4 15 2 3 6 14 4 5 10 11 0 13\n" + "12 4 9 12 13 10 11 12 7 14 13 12 5 6 7 12 15 4 5 12 11 0 15 15 0 1 2 4 15 2 3 14 7 8 9 13 14 9 10\n" + "12 4 9 12 13 10 11 12 14 8 13 12 5 6 14 12 15 4 5 12 11 0 15 15 0 1 2 4 15 2 3 8 14 6 7 13 8 9 10\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 3 4 15 12 11 0 3 3 0 1 2 14 15 4 5 14 5 6 7 8 13 14 7\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 3 4 5 12 11 0 3 3 0 1 2 14 15 6 7 14 7 8 9 13 14 9 10\n" + "12 4 9 12 13 14 15 12 7 8 13 12 5 6 7 12 3 4 5 12 15 0 3 3 0 1 2 13 8 9 14 14 9 10 11 14 11 0 15\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 14 5 6 12 13 15 14 5 14 15 4 15 0 3 4 3 0 1 2 11 0 15 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 15 14 13 12 11 0 15 14 15 0 3 0 1 2 3 14 3 4 5 6 13 14 5\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 14 2 3 4 13 15 2 14 2 15 0 1 11 0 15 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 14 4 13 1 15 14 11 0 1 13 15 1 2 3 4 14 15 3\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 14 4 13 15 2 14 11 0 15 13 2 15 0 1 4 14 2 3\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 14 13 13 14 3 4 14 15 2 3 11 0 15 14 2 15 0 1 6 13 4 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 5 6 13 12 11 14 5 5 14 3 4 14 15 2 3 11 0 15 14 2 15 0 1 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 5 6 7 12 11 14 5 5 14 3 4 14 15 2 3 11 0 15 14 2 15 0 1 13 8 9 10\n" + "12 4 9 12 9 10 13 12 7 8 9 12 5 6 7 12 13 14 5 5 14 3 4 14 15 2 3 13 0 15 14 2 15 0 1 10 11 0 13\n" + "12 4 9 12 9 10 13 12 7 8 9 12 14 6 7 12 13 15 14 14 15 3 4 15 1 2 3 13 0 1 15 6 14 4 5 10 11 0 13\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 14 0 15 4 15 0 1 2 4 15 2 3 11 0 14 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 11 0 5 5 0 13 4 0 1 14 13 14 1 2 15 4 13 14 15 4 15 2 3\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 14 4 0 1 15 14 15 1 2 3 4 14 15 3 6 13 4 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 5 6 13 12 11 0 5 5 0 14 4 0 1 15 14 15 1 2 3 4 14 15 3 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 14 4 0 1 15 14 15 1 2 3 4 14 15 3 13 8 9 10\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 15 14 0 1 4 15 4 1 2 3 14 15 4 5 6 13 14 5\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 15 5 14 0 3 15 3 0 1 2 5 15 3 4 11 0 14 13\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 5 6 0 1 4 5 4 1 2 3 14 15 6 7 8 13 14 7\n" + "12 4 9 12 10 11 13 12 8 9 10 12 14 7 8 12 13 15 14 14 15 4 5 15 0 3 4 3 0 1 2 7 14 5 6 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 7 8 15 12 11 0 7 7 0 5 6 0 1 4 5 4 1 2 3 14 15 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 6 7 14 12 13 15 6 6 15 4 5 15 0 3 4 3 0 1 2 9 14 7 8 11 0 15 13\n" + "12 4 9 12 13 11 14 12 8 9 13 12 6 7 8 12 14 15 6 6 15 4 5 15 0 3 4 3 0 1 2 13 9 10 11 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 14 15 3 4 3 15 1 2 11 15 14 13 11 0 1 15\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 15 14 0 1 2 15 15 2 3 4 14 15 4 5 6 13 14 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 5 6 0 1 2 5 5 2 3 4 14 15 6 7 8 13 14 7\n" + "12 4 9 12 10 11 13 12 8 9 10 12 14 7 8 12 13 15 14 14 15 4 5 15 0 1 4 4 1 2 3 7 14 5 6 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 7 8 15 12 11 0 7 7 0 5 6 0 1 2 5 5 2 3 4 14 15 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 6 7 14 12 13 15 6 6 15 4 5 15 0 1 4 4 1 2 3 9 14 7 8 11 0 15 13\n" + "12 4 9 12 13 11 14 12 8 9 13 12 6 7 8 12 14 15 6 6 15 4 5 15 0 1 4 4 1 2 3 13 9 10 11 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 14 15 1 4 4 1 2 3 11 15 14 13 11 0 1 15\n" + "12 4 9 12 10 13 14 12 8 9 10 12 6 7 8 12 14 15 6 6 15 4 5 15 0 1 4 4 1 2 3 13 0 15 14 10 11 0 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 3 14 0 1 2 3 14 3 4 15 6 13 14 15 6 15 4 5\n" + "12 4 9 12 9 10 11 12 7 8 9 12 14 13 7 12 11 0 14 14 0 3 15 0 1 2 3 15 3 4 5 13 14 15 5 7 13 5 6\n" + "12 4 9 12 9 10 11 12 13 8 9 12 14 6 13 12 11 0 14 14 0 3 15 0 1 2 3 15 3 4 5 6 14 15 5 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 14 0 3 15 0 1 2 3 15 3 4 5 6 14 15 5 13 8 9 10\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 3 6 0 1 2 3 6 3 4 5 14 15 6 7 8 13 14 7\n" + "12 4 9 12 10 11 13 12 8 9 10 12 14 7 8 12 13 15 14 14 15 2 5 15 0 1 2 5 2 3 4 7 14 5 6 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 7 8 15 12 11 0 7 7 0 3 6 0 1 2 3 6 3 4 5 14 15 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 6 7 14 12 13 15 6 6 15 2 5 15 0 1 2 5 2 3 4 9 14 7 8 11 0 15 13\n" + "12 4 9 12 13 11 14 12 8 9 13 12 6 7 8 12 14 15 6 6 15 2 5 15 0 1 2 5 2 3 4 13 9 10 11 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 2 5 14 15 1 2 5 2 3 4 11 15 14 13 11 0 1 15\n" + "12 4 9 12 10 13 14 12 8 9 10 12 6 7 8 12 14 15 6 6 15 2 5 15 0 1 2 5 2 3 4 13 0 15 14 10 11 0 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 5 2 3 4 5 6 13 14 5\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 15 5 14 0 1 15 5 15 1 4 1 2 3 4 11 0 14 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 3 14 3 4 5 6 13 14 5\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 15 5 14 0 1 15 5 15 1 2 5 2 3 4 11 0 14 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 4 7 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 3 4 13 14 3 7 4 5 6\n" + "12 4 9 12 9 10 11 12 5 8 9 12 13 4 5 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 3 4 13 14 3 8 5 6 7\n" + "12 4 9 12 9 10 11 12 5 6 9 12 13 4 5 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 3 4 13 14 3 9 6 7 8\n" + "12 4 9 12 7 10 11 12 5 6 7 12 13 4 5 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 3 4 13 14 3 7 8 9 10\n" + "12 4 9 12 7 8 11 12 5 6 7 12 13 4 5 12 11 0 13 13 0 15 14 0 1 2 15 14 15 2 3 4 13 14 3 8 9 10 11\n" + "12 4 9 12 9 10 11 12 7 8 9 12 14 13 7 12 11 0 14 14 0 15 4 0 1 2 15 4 15 2 3 13 14 4 5 7 13 5 6\n" + "12 4 9 12 9 10 11 12 13 8 9 12 14 6 13 12 11 0 14 14 0 15 4 0 1 2 15 4 15 2 3 6 14 4 5 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 14 0 15 4 0 1 2 15 4 15 2 3 6 14 4 5 13 8 9 10\n" + "12 4 9 12 13 10 11 12 7 14 13 12 5 6 7 12 11 0 5 5 0 15 4 0 1 2 15 4 15 2 3 14 7 8 9 13 14 9 10\n" + "12 4 9 12 9 10 11 12 14 13 9 12 5 6 14 12 11 0 5 5 0 15 4 0 1 2 15 4 15 2 3 13 14 6 7 9 13 7 8\n" + "12 4 9 12 13 10 11 12 14 8 13 12 5 6 14 12 11 0 5 5 0 15 4 0 1 2 15 4 15 2 3 8 14 6 7 13 8 9 10\n" + "12 4 9 12 8 11 13 12 6 7 8 12 4 5 6 12 13 14 4 4 14 15 3 14 0 1 15 3 15 1 2 8 9 10 11 11 0 14 13\n" + "12 4 9 12 13 14 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 15 4 0 1 2 15 4 15 2 3 13 8 9 14 14 9 10 11\n" + "12 4 9 12 8 9 13 12 6 7 8 12 4 5 6 12 13 14 4 4 14 15 3 14 0 1 15 3 15 1 2 9 0 14 13 9 10 11 0\n" + "12 4 9 12 9 10 11 12 7 8 9 12 14 13 7 12 11 0 14 14 0 3 4 0 1 2 3 13 14 4 15 4 5 6 15 7 13 15 6\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 3 4 0 1 2 3 14 15 4 7 4 5 6 7 8 13 14 7\n" + "12 4 9 12 10 11 13 12 8 9 10 12 14 7 8 12 13 15 14 14 15 2 3 15 0 1 2 7 14 3 6 3 4 5 6 11 0 15 13\n" + "12 4 9 12 13 10 11 12 7 8 13 12 15 14 7 12 11 0 15 15 0 3 4 0 1 2 3 14 15 4 5 7 14 5 6 13 8 9 10\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 3 4 0 1 2 3 14 15 4 5 8 13 14 5 8 5 6 7\n" + "12 4 9 12 9 10 11 12 13 6 9 12 15 14 13 12 11 0 15 15 0 3 4 0 1 2 3 14 15 4 5 6 13 14 5 9 6 7 8\n" + "12 4 9 12 7 10 11 12 13 6 7 12 15 14 13 12 11 0 15 15 0 3 4 0 1 2 3 14 15 4 5 6 13 14 5 7 8 9 10\n" + "12 4 9 12 7 8 11 12 13 6 7 12 15 14 13 12 11 0 15 15 0 3 4 0 1 2 3 14 15 4 5 6 13 14 5 8 9 10 11\n" + "12 4 9 12 9 10 11 12 14 13 9 12 15 6 14 12 11 0 15 15 0 3 4 0 1 2 3 6 15 4 5 13 14 6 7 9 13 7 8\n" + "12 4 9 12 13 10 11 12 14 8 13 12 15 6 14 12 11 0 15 15 0 3 4 0 1 2 3 6 15 4 5 8 14 6 7 13 8 9 10\n" + "12 4 9 12 8 11 13 12 6 7 8 12 14 5 6 12 13 15 14 14 15 2 3 15 0 1 2 5 14 3 4 8 9 10 11 11 0 15 13\n" + "12 4 9 12 13 10 11 12 7 14 13 12 5 6 7 12 11 0 5 5 0 3 4 0 1 2 3 14 7 8 15 13 14 15 10 10 15 8 9\n" + "12 4 9 12 13 14 11 12 7 15 13 12 5 6 7 12 11 0 5 5 0 3 4 0 1 2 3 15 7 8 9 13 15 9 14 14 9 10 11\n" + "12 4 9 12 9 10 11 12 14 13 9 12 5 6 14 12 11 0 5 5 0 3 4 0 1 2 3 13 14 6 15 6 7 8 15 9 13 15 8\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 3 4 0 1 2 3 14 15 6 9 6 7 8 9 13 14 9 10\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 3 4 0 1 2 3 14 15 6 7 14 7 8 9 13 14 9 10\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 3 4 0 1 2 3 14 15 6 7 13 14 7 8 13 8 9 10\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 3 4 0 1 2 3 14 15 6 7 13 14 7 10 10 7 8 9\n" + "12 4 9 12 13 8 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 3 4 0 1 2 3 14 15 6 7 13 14 7 8 8 9 10 11\n" + "12 4 9 12 13 14 11 12 15 8 13 12 5 6 15 12 11 0 5 5 0 3 4 0 1 2 3 8 15 6 7 13 8 9 14 14 9 10 11\n" + "12 4 9 12 8 13 14 12 6 7 8 12 4 5 6 12 14 15 4 4 15 2 3 15 0 1 2 8 9 10 13 13 0 15 14 13 10 11 0\n" + "12 4 9 12 13 14 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 3 4 0 1 2 3 13 8 15 14 8 9 10 15 14 15 10 11\n" + "12 4 9 12 13 11 14 12 6 7 13 12 4 5 6 12 14 15 4 4 15 2 3 15 0 1 2 13 7 10 11 7 8 9 10 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 13 15 4 14 4 15 2 3 15 0 1 2 11 0 15 13\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 14 4 11 0 14 13 14 0 1 15 15 1 2 3 4 14 15 3\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 4 5 13 15 4 14 4 15 0 3 3 0 1 2 11 0 15 13\n" + "12 4 9 12 9 10 11 12 13 8 9 12 5 6 13 12 11 14 5 5 14 15 4 11 0 15 14 15 0 1 2 4 15 2 3 8 13 6 7\n" + "12 4 9 12 9 10 11 12 7 8 9 12 14 13 7 12 11 15 14 14 15 3 4 11 0 3 15 3 0 1 2 13 14 4 5 7 13 5 6\n" + "12 4 9 12 9 10 11 12 13 8 9 12 14 6 13 12 11 15 14 14 15 3 4 11 0 3 15 3 0 1 2 6 14 4 5 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 11 15 14 14 15 3 4 11 0 3 15 3 0 1 2 6 14 4 5 13 8 9 10\n" + "12 4 9 12 10 11 13 12 8 9 10 12 4 5 8 12 13 14 4 4 14 2 3 13 15 2 14 2 15 0 1 8 5 6 7 11 0 15 13\n" + "12 4 9 12 13 10 11 12 7 14 13 12 5 6 7 12 11 15 5 5 15 3 4 11 0 3 15 3 0 1 2 14 7 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 6 9 10 12 4 5 6 12 13 14 4 4 14 2 3 13 15 2 14 2 15 0 1 9 6 7 8 11 0 15 13\n" + "12 4 9 12 9 10 11 12 14 13 9 12 5 6 14 12 11 15 5 5 15 3 4 11 0 3 15 3 0 1 2 13 14 6 7 9 13 7 8\n" + "12 4 9 12 13 10 11 12 14 8 13 12 5 6 14 12 11 15 5 5 15 3 4 11 0 3 15 3 0 1 2 8 14 6 7 13 8 9 10\n" + "12 4 9 12 9 10 13 12 14 8 9 12 5 6 14 12 13 15 5 5 15 3 4 13 0 3 15 3 0 1 2 8 14 6 7 10 11 0 13\n" + "12 4 9 12 9 13 14 12 7 8 9 12 5 6 7 12 14 15 5 5 15 3 4 14 0 3 15 3 0 1 2 9 10 11 13 13 11 0 14\n" + "12 4 9 12 8 11 13 12 6 7 8 12 4 5 6 12 13 14 4 4 14 2 3 13 15 2 14 2 15 0 1 8 9 10 11 11 0 15 13\n" + "12 4 9 12 13 10 14 12 7 8 13 12 5 6 7 12 14 15 5 5 15 3 4 14 0 3 15 3 0 1 2 13 8 9 10 10 11 0 14\n" + "12 4 9 12 9 10 11 12 7 8 9 12 5 6 7 12 11 13 5 5 13 14 4 11 0 14 13 4 14 0 15 0 1 2 15 4 15 2 3\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 14 13 13 14 15 4 11 0 15 14 4 15 0 3 0 1 2 3 6 13 4 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 5 6 13 12 11 14 5 5 14 15 4 11 0 15 14 4 15 0 3 0 1 2 3 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 5 6 7 12 11 14 5 5 14 15 4 11 0 15 14 4 15 0 3 0 1 2 3 13 8 9 10\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 4 7 12 11 14 13 13 14 15 2 11 0 15 14 2 15 0 1 4 13 2 3 7 4 5 6\n" + "12 4 9 12 9 10 11 12 5 6 9 12 13 4 5 12 11 14 13 13 14 15 2 11 0 15 14 2 15 0 1 4 13 2 3 9 6 7 8\n" + "12 4 9 12 7 10 11 12 5 6 7 12 13 4 5 12 11 14 13 13 14 15 2 11 0 15 14 2 15 0 1 4 13 2 3 7 8 9 10\n" + "12 4 9 12 13 10 11 12 7 8 13 12 3 4 7 12 11 14 3 3 14 15 2 11 0 15 14 2 15 0 1 7 4 5 6 13 8 9 10\n" + "12 4 9 12 9 10 11 12 5 13 9 12 3 4 5 12 11 14 3 3 14 15 2 11 0 15 14 2 15 0 1 13 5 6 7 9 13 7 8\n" + "12 4 9 12 13 10 11 12 5 8 13 12 3 4 5 12 11 14 3 3 14 15 2 11 0 15 14 2 15 0 1 8 5 6 7 13 8 9 10\n" + "12 4 9 12 9 10 11 12 13 8 9 12 3 4 13 12 11 14 3 3 14 15 2 11 0 15 14 2 15 0 1 8 13 4 7 4 5 6 7\n" + "12 4 9 12 9 10 11 12 13 8 9 12 3 4 13 12 11 14 3 3 14 15 2 11 0 15 14 2 15 0 1 8 13 4 5 8 5 6 7\n" + "12 4 9 12 9 10 11 12 13 8 9 12 14 6 13 12 11 15 14 14 15 1 2 11 0 1 15 6 14 2 5 2 3 4 5 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 11 15 14 14 15 1 2 11 0 1 15 6 14 2 5 2 3 4 5 13 8 9 10\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 4 7 12 11 15 14 14 15 1 2 11 0 1 15 4 14 2 3 7 4 5 6 13 8 9 10\n" + "12 4 9 12 9 10 11 12 5 6 9 12 14 13 5 12 11 15 14 14 15 1 2 11 0 1 15 13 14 2 3 5 13 3 4 9 6 7 8\n" + "12 4 9 12 13 10 11 12 5 6 13 12 14 4 5 12 11 15 14 14 15 1 2 11 0 1 15 4 14 2 3 13 6 9 10 6 7 8 9\n" + "12 4 9 12 13 10 11 12 5 6 13 12 14 4 5 12 11 15 14 14 15 1 2 11 0 1 15 4 14 2 3 13 6 7 10 10 7 8 9\n" + "12 4 9 12 13 10 11 12 5 14 13 12 3 4 5 12 11 15 3 3 15 1 2 11 0 1 15 14 5 6 9 9 6 7 8 13 14 9 10\n" + "12 4 9 12 13 10 11 12 5 14 13 12 3 4 5 12 11 15 3 3 15 1 2 11 0 1 15 14 5 6 7 13 14 7 10 10 7 8 9\n" + "12 4 9 12 9 10 11 12 13 8 9 12 3 4 13 12 11 14 3 3 14 1 2 11 0 1 14 8 13 4 15 4 5 6 15 8 15 6 7\n" + "12 4 9 12 13 10 11 12 14 8 13 12 3 4 14 12 11 15 3 3 15 1 2 11 0 1 15 8 14 4 7 4 5 6 7 13 8 9 10\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 1 14 14 1 15 5 1 2 3 15 5 15 3 4 6 13 14 5\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 14 0 1 15 15 1 4 5 1 2 3 4 6 14 15 5 13 8 9 10\n" + "12 4 9 12 13 10 11 12 15 14 13 12 7 8 15 12 11 0 7 7 0 1 6 6 1 4 5 1 2 3 4 14 15 8 9 13 14 9 10\n" + "12 4 9 12 13 14 15 12 9 10 13 12 7 8 9 12 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 14 14 11 0 15\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 13 0 1 14 14 1 2 15 15 2 3 4 14 15 4 5 6 13 14 5\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 0 5 5 0 1 15 15 1 2 3 5 15 3 4 11 0 14 13\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 1 6 6 1 2 5 5 2 3 4 14 15 6 7 8 13 14 7\n" + "12 4 9 12 10 11 13 12 8 9 10 12 14 7 8 12 13 15 14 14 15 0 5 5 0 1 4 4 1 2 3 7 14 5 6 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 7 8 15 12 11 0 7 7 0 1 6 6 1 2 5 5 2 3 4 14 15 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 6 7 14 12 13 15 6 6 15 0 5 5 0 1 4 4 1 2 3 9 14 7 8 11 0 15 13\n" + "12 4 9 12 13 14 15 12 9 10 13 12 7 8 9 12 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 14 14 11 0 15\n" + "12 4 9 12 13 11 14 12 8 9 13 12 6 7 8 12 14 15 6 6 15 0 5 5 0 1 4 4 1 2 3 13 9 10 11 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 15 5 5 15 1 4 4 1 2 3 11 15 14 13 11 0 1 15\n" + "12 4 9 12 13 10 11 12 15 14 13 12 7 8 15 12 11 0 7 7 0 1 6 6 1 2 3 6 3 4 5 14 15 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 6 7 14 12 13 15 6 6 15 0 5 5 0 1 2 5 2 3 4 9 14 7 8 11 0 15 13\n" + "12 4 9 12 13 14 15 12 9 10 13 12 7 8 9 12 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 14 14 11 0 15\n" + "12 4 9 12 13 11 14 12 8 9 13 12 6 7 8 12 14 15 6 6 15 0 5 5 0 1 2 5 2 3 4 13 9 10 11 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 15 5 5 15 1 2 5 2 3 4 11 15 14 13 11 0 1 15\n" +; + +const char* data_dqrgl_block1 = + "12 4 9 12 13 10 11 12 7 8 13 12 14 4 7 12 11 0 14 14 0 1 15 15 1 2 3 4 14 15 3 7 4 5 6 13 8 9 10\n" + "12 4 9 12 10 11 13 12 8 9 10 12 14 5 8 12 13 15 14 14 15 0 3 3 0 1 2 5 14 3 4 8 5 6 7 11 0 15 13\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 1 4 4 1 2 3 14 15 4 5 8 13 14 5 8 5 6 7\n" + "12 4 9 12 9 10 11 12 13 6 9 12 15 14 13 12 11 0 15 15 0 1 4 4 1 2 3 14 15 4 5 6 13 14 5 9 6 7 8\n" + "12 4 9 12 7 10 11 12 13 6 7 12 15 14 13 12 11 0 15 15 0 1 4 4 1 2 3 14 15 4 5 6 13 14 5 7 8 9 10\n" + "12 4 9 12 7 8 9 12 13 6 7 12 15 14 13 12 9 0 15 15 0 1 4 4 1 2 3 14 15 4 5 6 13 14 5 9 10 11 0\n" + "12 4 9 12 8 11 13 12 6 7 8 12 14 5 6 12 13 15 14 14 15 0 3 3 0 1 2 5 14 3 4 8 9 10 11 11 0 15 13\n" + "12 4 9 12 13 14 15 12 9 10 13 12 5 6 9 12 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 10 11 14 14 11 0 15\n" + "12 4 9 12 13 11 14 12 8 9 13 12 4 5 8 12 14 15 4 4 15 0 3 3 0 1 2 8 5 6 7 13 9 10 11 11 0 15 14\n" + "12 4 9 12 10 11 13 12 8 9 10 12 4 5 8 12 13 14 4 4 14 15 3 3 15 1 2 8 5 6 7 11 15 14 13 11 0 1 15\n" + "12 4 9 12 13 10 11 12 7 14 13 12 5 6 7 12 11 0 5 5 0 1 4 4 1 2 3 14 7 8 15 13 14 15 10 10 15 8 9\n" + "12 4 9 12 13 14 11 12 7 15 13 12 5 6 7 12 11 0 5 5 0 1 4 4 1 2 3 15 7 8 9 13 15 9 14 14 9 10 11\n" + "12 4 9 12 13 10 14 12 7 15 13 12 5 6 7 12 14 0 5 5 0 1 4 4 1 2 3 15 7 8 9 13 15 9 10 10 11 0 14\n" + "12 4 9 12 13 14 15 12 7 10 13 12 5 6 7 12 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 10 11 14 14 11 0 15\n" + "12 4 9 12 13 11 14 12 6 9 13 12 4 5 6 12 14 15 4 4 15 0 3 3 0 1 2 9 6 7 8 13 9 10 11 11 0 15 14\n" + "12 4 9 12 9 10 11 12 14 13 9 12 5 6 14 12 11 0 5 5 0 1 4 4 1 2 3 13 14 6 15 6 7 8 15 9 13 15 8\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 1 4 4 1 2 3 14 15 6 9 6 7 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 4 5 14 12 13 15 4 4 15 0 3 3 0 1 2 9 14 5 8 5 6 7 8 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 1 4 4 1 2 3 14 15 6 7 14 7 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 4 5 14 12 13 15 4 4 15 0 3 3 0 1 2 9 14 5 6 9 6 7 8 11 0 15 13\n" + "12 4 9 12 10 11 13 12 14 7 10 12 4 5 14 12 13 15 4 4 15 0 3 3 0 1 2 7 14 5 6 10 7 8 9 11 0 15 13\n" + "12 4 9 12 9 10 13 12 15 14 9 12 5 6 15 12 13 0 5 5 0 1 4 4 1 2 3 14 15 6 7 9 14 7 8 10 11 0 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 1 4 4 1 2 3 14 15 6 7 13 14 7 10 10 7 8 9\n" + "12 4 9 12 13 8 11 12 15 14 13 12 5 6 15 12 11 0 5 5 0 1 4 4 1 2 3 14 15 6 7 13 14 7 8 8 9 10 11\n" + "12 4 9 12 13 8 9 12 15 14 13 12 5 6 15 12 9 0 5 5 0 1 4 4 1 2 3 14 15 6 7 13 14 7 8 9 10 11 0\n" + "12 4 9 12 9 13 14 12 15 8 9 12 5 6 15 12 14 0 5 5 0 1 4 4 1 2 3 8 15 6 7 9 10 11 13 13 11 0 14\n" + "12 4 9 12 8 11 13 12 14 7 8 12 4 5 14 12 13 15 4 4 15 0 3 3 0 1 2 7 14 5 6 8 9 10 11 11 0 15 13\n" + "12 4 9 12 13 14 11 12 15 8 13 12 5 6 15 12 11 0 5 5 0 1 4 4 1 2 3 8 15 6 7 13 8 9 14 14 9 10 11\n" + "12 4 9 12 13 10 14 12 15 8 13 12 5 6 15 12 14 0 5 5 0 1 4 4 1 2 3 8 15 6 7 13 8 9 10 10 11 0 14\n" + "12 4 9 12 13 14 11 12 7 8 13 12 5 6 7 12 11 0 5 5 0 1 4 4 1 2 3 13 8 15 14 8 9 10 15 14 15 10 11\n" + "12 4 9 12 13 14 15 12 7 8 13 12 5 6 7 12 15 0 5 5 0 1 4 4 1 2 3 13 8 11 14 8 9 10 11 14 11 0 15\n" + "12 4 9 12 13 11 14 12 6 7 13 12 4 5 6 12 14 15 4 4 15 0 3 3 0 1 2 13 7 10 11 7 8 9 10 11 0 15 14\n" + "12 4 9 12 13 14 15 12 7 8 13 12 5 6 7 12 15 0 5 5 0 1 4 4 1 2 3 13 8 9 14 14 9 10 11 14 11 0 15\n" + "12 4 9 12 13 14 15 12 7 8 13 12 5 6 7 12 15 0 5 5 0 1 4 4 1 2 3 13 8 9 14 14 9 10 15 15 10 11 0\n" + "12 4 9 12 8 9 13 12 6 7 8 12 14 3 6 12 13 15 14 14 15 0 1 3 14 1 2 6 3 4 5 9 0 15 13 9 10 11 0\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 15 0 1 2 14 15 2 3 8 13 14 3 8 3 4 7 7 4 5 6\n" + "12 4 9 12 10 11 13 12 6 7 10 12 2 3 6 12 13 14 2 2 14 15 1 6 3 4 5 10 7 8 9 11 15 14 13 11 0 1 15\n" + "12 4 9 12 13 14 15 12 7 8 13 12 3 4 7 12 15 0 3 3 0 1 2 7 4 5 6 13 8 11 14 8 9 10 11 14 11 0 15\n" + "12 4 9 12 13 11 14 12 6 7 13 12 2 3 6 12 14 15 2 2 15 0 1 6 3 4 5 13 7 10 11 7 8 9 10 11 0 15 14\n" + "12 4 9 12 13 14 15 12 7 8 13 12 3 4 7 12 15 0 3 3 0 1 2 7 4 5 6 13 8 9 14 14 9 10 11 14 11 0 15\n" + "12 4 9 12 10 11 13 12 8 9 10 12 4 5 8 12 13 14 4 4 14 15 3 8 5 6 7 11 15 14 13 11 0 3 15 3 0 1 2\n" + "12 4 9 12 10 11 13 12 4 7 10 12 2 3 4 12 13 14 2 2 14 15 1 7 4 5 6 10 7 8 9 11 15 14 13 11 0 1 15\n" + "12 4 9 12 13 10 11 12 5 14 13 12 3 4 5 12 11 0 3 3 0 1 2 14 5 6 15 13 14 15 10 10 15 6 9 6 7 8 9\n" + "12 4 9 12 13 14 15 12 5 8 13 12 3 4 5 12 15 0 3 3 0 1 2 8 5 6 7 13 8 9 14 14 9 10 11 14 11 0 15\n" + "12 4 9 12 9 10 11 12 13 8 9 12 3 4 13 12 11 0 3 3 0 1 2 8 13 4 14 4 5 15 14 15 5 6 7 8 14 15 7\n" + "12 4 9 12 9 10 11 12 14 13 9 12 3 4 14 12 11 0 3 3 0 1 2 13 14 4 15 4 5 8 15 8 5 6 7 9 13 15 8\n" + "12 4 9 12 13 10 11 12 15 14 13 12 3 4 15 12 11 0 3 3 0 1 2 14 15 4 9 4 5 8 9 8 5 6 7 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 2 3 14 12 13 15 2 2 15 0 1 9 14 3 8 3 4 7 8 7 4 5 6 11 0 15 13\n" + "12 4 9 12 10 11 13 12 14 9 10 12 2 3 14 12 13 15 2 2 15 0 1 9 14 3 8 3 4 5 8 8 5 6 7 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 3 4 15 12 11 0 3 3 0 1 2 14 15 4 7 4 5 6 7 14 7 8 9 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 2 3 14 12 13 15 2 2 15 0 1 9 14 3 6 3 4 5 6 9 6 7 8 11 0 15 13\n" + "12 4 9 12 9 10 13 12 14 8 9 12 3 4 14 12 13 0 3 3 0 1 2 8 14 4 15 4 5 6 15 8 15 6 7 10 11 0 13\n" + "12 4 9 12 10 11 13 12 14 7 10 12 2 3 14 12 13 15 2 2 15 0 1 7 14 3 6 3 4 5 6 10 7 8 9 11 0 15 13\n" + "12 4 9 12 9 10 13 12 15 14 9 12 3 4 15 12 13 0 3 3 0 1 2 14 15 4 7 4 5 6 7 9 14 7 8 10 11 0 13\n" + "12 4 9 12 13 8 9 12 15 14 13 12 3 4 15 12 9 0 3 3 0 1 2 14 15 4 7 4 5 6 7 13 14 7 8 9 10 11 0\n" + "12 4 9 12 9 13 14 12 15 8 9 12 3 4 15 12 14 0 3 3 0 1 2 8 15 4 7 4 5 6 7 9 10 11 13 13 11 0 14\n" + "12 4 9 12 8 11 13 12 14 7 8 12 2 3 14 12 13 15 2 2 15 0 1 7 14 3 6 3 4 5 6 8 9 10 11 11 0 15 13\n" + "12 4 9 12 13 10 14 12 15 8 13 12 3 4 15 12 14 0 3 3 0 1 2 8 15 4 7 4 5 6 7 13 8 9 10 10 11 0 14\n" + "12 4 9 12 8 9 13 12 14 7 8 12 2 3 14 12 13 15 2 2 15 0 1 7 14 3 6 3 4 5 6 9 0 15 13 9 10 11 0\n" + "12 4 9 12 13 10 11 12 15 14 13 12 3 4 15 12 11 0 3 3 0 1 2 14 15 4 5 14 5 8 9 5 6 7 8 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 2 3 14 12 13 15 2 2 15 0 1 9 14 3 4 9 4 7 8 4 5 6 7 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 3 4 15 12 11 0 3 3 0 1 2 14 15 4 5 14 5 6 9 9 6 7 8 13 14 9 10\n" + "12 4 9 12 10 11 13 12 14 9 10 12 2 3 14 12 13 15 2 2 15 0 1 9 14 3 4 9 4 5 8 8 5 6 7 11 0 15 13\n" + "12 4 9 12 13 10 11 12 15 14 13 12 3 4 15 12 11 0 3 3 0 1 2 14 15 4 5 14 5 6 7 13 14 7 10 10 7 8 9\n" + "12 4 9 12 13 8 9 12 15 14 13 12 3 4 15 12 9 0 3 3 0 1 2 14 15 4 5 14 5 6 7 13 14 7 8 9 10 11 0\n" + "12 4 9 12 8 9 13 12 14 7 8 12 2 3 14 12 13 15 2 2 15 0 1 7 14 3 4 7 4 5 6 9 0 15 13 9 10 11 0\n" + "12 4 9 12 13 10 11 12 15 14 13 12 3 4 15 12 11 0 3 3 0 1 2 14 15 4 5 13 14 5 10 10 5 6 9 9 6 7 8\n" + "12 4 9 12 6 7 13 12 14 5 6 12 2 3 14 12 13 15 2 2 15 0 1 5 14 3 4 7 0 15 13 7 8 11 0 11 8 9 10\n" + "12 4 9 12 13 10 11 12 5 6 13 12 3 4 5 12 11 0 3 3 0 1 2 13 6 14 10 6 7 15 14 15 7 8 9 10 14 15 9\n" + "12 4 9 12 13 14 15 12 5 6 13 12 3 4 5 12 15 0 3 3 0 1 2 13 6 11 14 6 7 10 11 10 7 8 9 14 11 0 15\n" + "12 4 9 12 13 11 14 12 4 5 13 12 2 3 4 12 14 15 2 2 15 0 1 13 5 10 11 5 6 9 10 9 6 7 8 11 0 15 14\n" + "12 4 9 12 13 11 14 12 4 5 13 12 2 3 4 12 14 15 2 2 15 0 1 13 5 10 11 5 6 7 10 10 7 8 9 11 0 15 14\n" + "12 4 9 12 13 14 15 12 5 6 13 12 3 4 5 12 15 0 3 3 0 1 2 13 6 9 14 6 7 8 9 14 9 10 11 14 11 0 15\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 15 5 11 15 14 13 11 0 5 15 5 0 3 4 0 1 2 3\n" + "12 4 9 12 10 11 13 12 8 9 10 12 6 7 8 12 13 14 6 6 14 15 5 11 15 14 13 11 0 5 15 5 0 1 4 4 1 2 3\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 14 0 1 15 14 15 1 4 5 1 2 3 4 6 14 15 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 14 15 0 7 0 1 6 7 6 1 4 5 1 2 3 4 8 13 14 7\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 5 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 14 15 0 7 0 1 6 7 6 1 2 5 5 2 3 4 8 13 14 7\n" + "12 4 9 12 9 10 11 12 7 8 9 12 13 6 7 12 11 0 13 6 13 0 14 0 1 15 14 15 1 2 3 15 3 4 5 6 14 15 5\n" + "12 4 9 12 9 10 11 12 13 8 9 12 15 14 13 12 11 0 15 14 15 0 7 0 1 6 7 6 1 2 3 6 3 4 5 8 13 14 7\n" + "12 4 9 12 9 10 11 12 13 8 9 12 14 6 13 12 11 0 14 6 14 0 5 0 1 15 5 15 1 2 3 5 15 3 4 8 13 6 7\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 6 14 0 5 0 1 15 5 15 1 2 3 5 15 3 4 13 8 9 10\n" + "12 4 9 12 13 10 11 12 7 8 13 12 14 6 7 12 11 0 14 6 14 0 15 0 1 4 15 4 1 2 3 6 15 4 5 13 8 9 10\n" + "12 4 9 12 13 10 11 12 14 8 13 12 15 6 14 12 11 0 15 6 15 0 5 0 1 4 5 4 1 2 3 8 14 6 7 13 8 9 10\n" + "12 4 9 12 13 10 11 12 14 8 13 12 15 6 14 12 11 0 15 6 15 0 5 0 1 2 5 5 2 3 4 8 14 6 7 13 8 9 10\n" + "12 4 9 12 13 10 11 12 5 6 13 12 14 4 5 12 11 0 14 4 14 0 15 0 1 2 15 4 15 2 3 13 6 9 10 6 7 8 9\n" + "12 4 9 12 13 10 11 12 14 6 13 12 15 4 14 12 11 0 15 4 15 0 3 0 1 2 3 6 14 4 5 13 6 7 10 10 7 8 9\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8\n" + "14 0 6 0 11 12 13 0 7 10 11 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9\n" + "14 0 6 0 11 12 13 0 7 8 11 0 1 6 7 6 1 2 5 5 2 3 4 11 8 9 10\n" + "14 0 6 0 9 12 13 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 12\n" + "14 0 6 0 9 10 13 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 11 12 13\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7\n" + "14 0 6 0 11 12 13 0 7 8 11 0 1 4 7 4 1 2 3 7 4 5 6 11 8 9 10\n" + "14 0 6 0 9 12 13 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 12\n" + "14 0 6 0 9 10 13 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 10 11 12 13\n" + "14 0 6 0 11 12 13 0 5 10 11 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8\n" + "14 0 6 0 11 12 13 0 5 8 11 0 1 4 5 4 1 2 3 8 5 6 7 11 8 9 10\n" + "14 0 6 0 11 12 13 0 5 6 11 0 1 4 5 4 1 2 3 11 6 7 10 10 7 8 9\n" + "14 0 6 0 7 12 13 0 5 6 7 0 1 4 5 4 1 2 3 7 8 11 12 11 8 9 10\n" + "14 0 6 0 7 12 13 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 12 12 9 10 11\n" + "14 0 6 0 11 12 13 0 9 10 11 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6\n" + "14 0 6 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6\n" + "14 1 7 14 11 12 13 14 9 10 11 14 5 8 9 14 3 4 5 14 13 0 3 3 0 1 2 8 5 6 7\n" + "14 1 7 14 11 12 13 14 9 10 11 14 5 6 9 14 3 4 5 14 13 0 3 3 0 1 2 9 6 7 8\n" + "14 1 7 14 11 12 13 14 7 10 11 14 5 6 7 14 3 4 5 14 13 0 3 3 0 1 2 10 7 8 9\n" + "14 1 7 14 9 12 13 14 7 8 9 14 5 6 7 14 3 4 5 14 13 0 3 3 0 1 2 9 10 11 12\n" + "14 1 7 14 9 10 11 14 7 8 9 14 5 6 7 14 3 4 5 14 11 0 3 3 0 1 2 11 12 13 0\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5\n" + "14 1 7 14 11 12 13 14 9 10 11 14 5 6 9 14 13 0 5 5 0 3 4 0 1 2 3 9 6 7 8\n" + "14 1 7 14 11 12 13 14 7 10 11 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 10 7 8 9\n" + "14 1 7 14 11 12 13 14 7 8 11 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 11 8 9 10\n" + "14 1 7 14 9 12 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 9 10 11 12\n" + "14 1 7 14 9 10 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 10 11 12 13\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4\n" + "14 1 7 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5\n" + "14 1 7 14 11 12 13 14 9 10 11 14 5 6 9 14 13 0 5 5 0 1 4 4 1 2 3 9 6 7 8\n" + "14 1 7 14 11 12 13 14 7 10 11 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 10 7 8 9\n" + "14 1 7 14 11 12 13 14 7 8 11 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 11 8 9 10\n" + "14 1 7 14 9 12 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 9 10 11 12\n" + "14 1 7 14 9 10 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 10 11 12 13\n" + "14 1 7 14 9 10 11 14 7 8 9 14 5 6 7 14 11 0 5 5 0 1 4 4 1 2 3 11 12 13 0\n" + "14 1 7 14 11 12 13 14 7 8 11 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 11 8 9 10\n" + "14 1 7 14 9 12 13 14 7 8 9 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 9 10 11 12\n" + "14 1 7 14 9 10 11 14 7 8 9 14 3 4 7 14 11 0 3 3 0 1 2 7 4 5 6 11 12 13 0\n" + "14 1 7 14 11 12 13 14 5 8 11 14 3 4 5 14 13 0 3 3 0 1 2 8 5 6 7 11 8 9 10\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 6 7 1 2 14 6 14 2 3 4 6 14 4 5\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 7 1 2 5 14 5 2 3 4 7 14 5 6\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 14 9 14 1 6 7 1 2 5 6 5 2 3 4 9 14 7 8\n" + "14 1 7 0 11 12 13 0 14 10 11 0 1 8 14 8 1 6 7 1 2 5 6 5 2 3 4 10 14 8 9\n" + "14 1 7 0 14 12 13 0 9 10 14 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 10 11 12\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 14 9 14 1 6 7 1 2 3 6 6 3 4 5 9 14 7 8\n" + "14 1 7 0 11 12 13 0 14 10 11 0 1 8 14 8 1 6 7 1 2 3 6 6 3 4 5 10 14 8 9\n" + "14 1 7 0 14 12 13 0 9 10 14 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 14 10 11 12\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 4 14 1 2 3 4 14 4 5 6 8 14 6 7\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 14 9 14 1 4 7 1 2 3 4 7 4 5 6 9 14 7 8\n" + "14 1 7 0 11 12 13 0 14 10 11 0 1 8 14 8 1 4 7 1 2 3 4 7 4 5 6 10 14 8 9\n" + "14 1 7 0 14 12 13 0 9 10 14 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 14 10 11 12\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 7 1 2 3 14 7 14 3 6 3 4 5 6\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 7 1 2 3 14 7 14 3 4 7 4 5 6\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 5 1 2 3 14 5 14 3 4 8 5 6 7\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 6 9 6 1 14 5 1 2 3 14 5 14 3 4 9 6 7 8\n" + "14 1 7 0 11 12 13 0 7 10 11 0 1 6 7 6 1 14 5 1 2 3 14 5 14 3 4 10 7 8 9\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 14 9 14 1 4 5 1 2 3 4 9 14 5 8 5 6 7 8\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 14 6 2 3 4 14 6 14 4 5\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 14 14 2 5 6 2 3 4 5 8 14 6 7\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 14 9 14 1 2 7 7 2 5 6 2 3 4 5 9 14 7 8\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 14 14 3 4 5 7 14 5 6\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 14 14 2 3 6 6 3 4 5 8 14 6 7\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 14 9 14 1 2 7 7 2 3 6 6 3 4 5 9 14 7 8\n" + "14 1 7 0 11 12 13 0 14 10 11 0 1 8 14 8 1 2 7 7 2 3 6 6 3 4 5 10 14 8 9\n" + "14 1 7 0 14 12 13 0 9 10 14 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 10 11 12\n" + "14 1 7 0 14 12 13 0 9 10 14 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 14 10 11 12\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 14 14 2 3 4 8 14 4 7 4 5 6 7\n" + "14 1 7 0 9 12 13 0 7 8 9 0 1 6 7 6 1 2 14 14 2 3 4 6 14 4 5 9 10 11 12\n" + "14 1 7 0 9 10 13 0 7 8 9 0 1 6 7 6 1 2 14 14 2 3 4 6 14 4 5 10 11 12 13\n" + "14 1 7 0 14 12 13 0 9 10 14 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 14 10 11 12\n" + "14 1 7 0 11 12 13 0 7 8 11 0 1 14 7 14 1 2 5 5 2 3 4 7 14 5 6 11 8 9 10\n" + "14 1 7 0 9 12 13 0 7 8 9 0 1 14 7 14 1 2 5 5 2 3 4 7 14 5 6 9 10 11 12\n" + "14 1 7 0 9 10 13 0 7 8 9 0 1 14 7 14 1 2 5 5 2 3 4 7 14 5 6 10 11 12 13\n" + "14 1 7 0 11 12 13 0 7 14 11 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 9 11 14 9 10\n" + "14 1 7 0 11 12 13 0 14 10 11 0 1 6 14 6 1 2 5 5 2 3 4 10 14 6 7 10 7 8 9\n" + "14 1 7 0 11 12 13 0 14 8 11 0 1 6 14 6 1 2 5 5 2 3 4 8 14 6 7 11 8 9 10\n" + "14 1 7 0 9 12 13 0 14 8 9 0 1 6 14 6 1 2 5 5 2 3 4 8 14 6 7 9 10 11 12\n" + "14 1 7 0 9 10 13 0 14 8 9 0 1 6 14 6 1 2 5 5 2 3 4 8 14 6 7 10 11 12 13\n" + "14 1 7 0 9 14 13 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 14 14 11 12 13\n" + "14 1 7 0 14 12 13 0 7 8 14 0 1 6 7 6 1 2 5 5 2 3 4 14 8 9 12 12 9 10 11\n" + "14 1 7 0 14 10 13 0 7 8 14 0 1 6 7 6 1 2 5 5 2 3 4 14 8 9 10 10 11 12 13\n" + "14 1 7 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 3 8 3 14 7 3 4 5 14 7 14 5 6\n" + "14 1 7 0 14 12 13 0 9 10 14 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 14 10 11 12\n" + "14 1 7 0 9 14 13 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 14 14 11 12 13\n" + "14 1 7 0 14 10 13 0 7 8 14 0 1 4 7 4 1 2 3 7 4 5 6 14 8 9 10 10 11 12 13\n" + "14 1 7 0 9 12 13 0 7 8 9 0 1 14 7 14 1 2 3 7 14 3 6 3 4 5 6 9 10 11 12\n" + "14 1 7 0 9 10 13 0 7 8 9 0 1 14 7 14 1 2 3 7 14 3 6 3 4 5 6 10 11 12 13\n" + "14 1 7 0 7 12 13 0 5 6 7 0 1 14 5 14 1 2 3 5 14 3 4 7 8 11 12 11 8 9 10\n" + "14 1 7 0 7 12 13 0 5 6 7 0 1 14 5 14 1 2 3 5 14 3 4 7 8 9 12 12 9 10 11\n" + "14 1 7 0 11 12 13 0 5 14 11 0 1 4 5 4 1 2 3 14 5 6 9 9 6 7 8 11 14 9 10\n" + "14 1 7 0 14 12 13 0 5 10 14 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 14 10 11 12\n" + "14 1 7 0 11 12 13 0 5 14 11 0 1 4 5 4 1 2 3 14 5 6 7 11 14 7 10 7 8 9 10\n" + "14 1 7 0 14 12 13 0 5 6 14 0 1 4 5 4 1 2 3 14 6 7 12 12 7 8 11 11 8 9 10\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 15 5 5 15 3 4 15 1 2 3 13 0 1 15\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 0 5 5 0 15 4 0 1 2 15 4 15 2 3\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 4 0 1 2 3 6 15 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 8 15 6 7\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 10 11 12\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 15 5 5 15 3 4 13 0 3 15 3 0 1 2\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 3 4 7 14 13 15 3 3 15 1 2 13 0 1 15 7 4 5 6\n" + "14 2 8 14 11 12 13 14 9 10 11 14 5 8 9 14 3 4 5 14 13 15 3 3 15 1 2 13 0 1 15 8 5 6 7\n" + "14 2 8 14 11 12 13 14 9 10 11 14 5 6 9 14 3 4 5 14 13 15 3 3 15 1 2 13 0 1 15 9 6 7 8\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 4 4 1 2 3 6 15 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 8 15 6 7\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 10 11 12\n" + "14 2 8 14 11 12 15 14 9 10 11 14 7 8 9 14 5 6 7 14 15 0 5 5 0 1 4 4 1 2 3 12 13 0 15\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 2 15 2 3 4 6 15 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 15 4 7 14 13 0 15 15 0 1 2 4 15 2 3 7 4 5 6\n" + "14 2 8 14 11 12 13 14 9 10 11 14 5 8 9 14 15 4 5 14 13 0 15 15 0 1 2 4 15 2 3 8 5 6 7\n" + "14 2 8 14 11 12 13 14 9 10 11 14 5 6 9 14 15 4 5 14 13 0 15 15 0 1 2 4 15 2 3 9 6 7 8\n" + "14 2 8 14 11 12 13 14 7 10 11 14 5 6 7 14 15 4 5 14 13 0 15 15 0 1 2 4 15 2 3 10 7 8 9\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 15 10 11 12\n" + "14 2 8 14 11 12 15 14 9 10 11 14 7 8 9 14 3 4 7 14 15 0 3 3 0 1 2 7 4 5 6 12 13 0 15\n" + "14 2 8 14 11 12 13 14 15 10 11 14 5 8 15 14 3 4 5 14 13 0 3 3 0 1 2 8 5 6 7 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 5 8 9 14 3 4 5 14 13 0 3 3 0 1 2 8 5 6 7 15 10 11 12\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 3 4 15 14 13 0 3 3 0 1 2 8 15 4 7 4 5 6 7\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 3 4 15 14 13 0 3 3 0 1 2 8 15 4 5 8 5 6 7\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 6 9 14 3 4 15 14 13 0 3 3 0 1 2 6 15 4 5 9 6 7 8\n" + "14 2 8 14 11 12 13 14 7 10 11 14 15 6 7 14 3 4 15 14 13 0 3 3 0 1 2 6 15 4 5 10 7 8 9\n" + "14 2 8 14 11 12 13 14 7 8 11 14 15 6 7 14 3 4 15 14 13 0 3 3 0 1 2 6 15 4 5 11 8 9 10\n" + "14 2 8 14 9 12 13 14 7 8 9 14 15 6 7 14 3 4 15 14 13 0 3 3 0 1 2 6 15 4 5 9 10 11 12\n" + "14 2 8 14 9 10 11 14 7 8 9 14 15 6 7 14 3 4 15 14 11 0 3 3 0 1 2 6 15 4 5 11 12 13 0\n" + "14 2 8 14 11 12 15 14 9 10 11 14 5 6 9 14 3 4 5 14 15 0 3 3 0 1 2 9 6 7 8 12 13 0 15\n" + "14 2 8 14 15 12 13 14 7 10 15 14 5 6 7 14 3 4 5 14 13 0 3 3 0 1 2 10 7 8 9 15 10 11 12\n" + "14 2 8 14 11 12 13 14 15 10 11 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 10 15 6 9 6 7 8 9\n" + "14 2 8 14 11 12 13 14 15 10 11 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 10 15 6 7 10 7 8 9\n" + "14 2 8 14 9 10 11 14 15 8 9 14 5 6 15 14 3 4 5 14 11 0 3 3 0 1 2 8 15 6 7 11 12 13 0\n" + "14 2 8 14 9 12 15 14 7 8 9 14 5 6 7 14 3 4 5 14 15 0 3 3 0 1 2 9 10 11 12 12 13 0 15\n" + "14 2 8 14 15 12 13 14 7 8 15 14 5 6 7 14 3 4 5 14 13 0 3 3 0 1 2 15 8 11 12 8 9 10 11\n" + "14 2 8 14 15 12 13 14 7 8 15 14 5 6 7 14 3 4 5 14 13 0 3 3 0 1 2 15 8 9 12 12 9 10 11\n" + "14 2 8 14 9 10 15 14 7 8 9 14 5 6 7 14 3 4 5 14 15 0 3 3 0 1 2 10 13 0 15 10 11 12 13\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 6 15 0 5 0 1 4 5 4 1 2 3\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 6 15 0 5 0 1 2 5 5 2 3 4\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 6 15 0 3 0 1 2 3 6 3 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 3 4 5 13 0 3 15 3 0 1 2\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 1 4 5 13 0 1 15 4 1 2 3\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 5 6 0 1 15 5 15 1 2 3 5 15 3 4\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 4 15 4 1 2 3 6 15 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 5 6 0 1 4 5 4 1 2 3 8 15 6 7\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 10 11 12\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 15 2 3 4 6 15 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 5 6 0 1 2 5 5 2 3 4 8 15 6 7\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 10 11 12\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 6 0 1 2 3 6 3 4 5 8 15 6 7\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 10 11 12\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 6 15 2 5 2 3 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 6 15 2 3 6 3 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 5 6 9 14 13 0 5 5 0 15 4 0 1 2 15 4 15 2 3 9 6 7 8\n" + "14 2 8 14 11 12 13 14 7 10 11 14 5 6 7 14 13 0 5 5 0 15 4 0 1 2 15 4 15 2 3 10 7 8 9\n" + "14 2 8 14 11 12 13 14 7 8 11 14 5 6 7 14 13 0 5 5 0 15 4 0 1 2 15 4 15 2 3 11 8 9 10\n" + "14 2 8 14 9 12 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 15 4 0 1 2 15 4 15 2 3 9 10 11 12\n" + "14 2 8 14 9 10 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 15 4 0 1 2 15 4 15 2 3 10 11 12 13\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 4 0 1 2 3 8 15 4 7 4 5 6 7\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 4 0 1 2 3 8 15 4 5 8 5 6 7\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 3 4 0 1 2 3 6 15 4 5 9 6 7 8\n" + "14 2 8 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 3 4 0 1 2 3 6 15 4 5 10 7 8 9\n" + "14 2 8 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 3 4 0 1 2 3 6 15 4 5 11 8 9 10\n" + "14 2 8 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 4 0 1 2 3 6 15 4 5 9 10 11 12\n" + "14 2 8 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 4 0 1 2 3 6 15 4 5 10 11 12 13\n" + "14 2 8 14 15 12 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 3 4 0 1 2 3 9 6 7 8 15 10 11 12\n" + "14 2 8 14 11 12 13 14 7 15 11 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 7 8 9 11 15 9 10\n" + "14 2 8 14 15 12 13 14 7 10 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 10 7 8 9 15 10 11 12\n" + "14 2 8 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 10 15 6 9 6 7 8 9\n" + "14 2 8 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 10 15 6 7 10 7 8 9\n" + "14 2 8 14 11 12 13 14 15 8 11 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 8 15 6 7 11 8 9 10\n" + "14 2 8 14 9 12 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 8 15 6 7 9 10 11 12\n" + "14 2 8 14 9 10 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 8 15 6 7 10 11 12 13\n" + "14 2 8 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 10 15 10 11 12\n" + "14 2 8 14 9 15 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 9 10 11 15 15 11 12 13\n" + "14 2 8 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 11 12 8 9 10 11\n" + "14 2 8 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 12 12 9 10 11\n" + "14 2 8 14 15 10 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 10 10 11 12 13\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 13 0 5 15 5 0 3 4 0 1 2 3\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 13 0 5 15 5 0 1 4 4 1 2 3\n" + "14 2 8 14 11 12 13 14 9 10 11 14 5 6 9 14 13 15 5 5 15 3 4 13 0 3 15 3 0 1 2 9 6 7 8\n" + "14 2 8 14 11 12 13 14 7 10 11 14 5 6 7 14 13 15 5 5 15 3 4 13 0 3 15 3 0 1 2 10 7 8 9\n" + "14 2 8 14 11 12 13 14 7 8 11 14 5 6 7 14 13 15 5 5 15 3 4 13 0 3 15 3 0 1 2 11 8 9 10\n" + "14 2 8 14 9 12 13 14 7 8 9 14 5 6 7 14 13 15 5 5 15 3 4 13 0 3 15 3 0 1 2 9 10 11 12\n" + "14 2 8 14 11 12 13 14 9 10 11 14 3 4 9 14 13 15 3 3 15 1 2 13 0 1 15 9 4 5 8 8 5 6 7\n" + "14 2 8 14 11 12 13 14 7 8 11 14 3 4 7 14 13 15 3 3 15 1 2 13 0 1 15 7 4 5 6 11 8 9 10\n" + "14 2 8 14 9 12 13 14 7 8 9 14 3 4 7 14 13 15 3 3 15 1 2 13 0 1 15 7 4 5 6 9 10 11 12\n" + "14 2 8 14 11 12 13 14 5 10 11 14 3 4 5 14 13 15 3 3 15 1 2 13 0 1 15 10 5 6 9 9 6 7 8\n" + "14 2 8 14 11 12 13 14 5 8 11 14 3 4 5 14 13 15 3 3 15 1 2 13 0 1 15 8 5 6 7 11 8 9 10\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 15 5 1 2 3 15 5 15 3 4\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 11 12\n" + "14 2 8 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 13 0 15\n" + "14 2 8 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 15 15 2 3 4 6 15 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 6 6 1 2 5 5 2 3 4 8 15 6 7\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 11 12\n" + "14 2 8 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 13 0 15\n" + "14 2 8 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 15 8 9\n" + "14 2 8 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 10 11 12\n" + "14 2 8 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 13 0 15\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 1 4 4 1 2 3 6 15 4 5 9 6 7 8\n" + "14 2 8 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 1 4 4 1 2 3 6 15 4 5 11 8 9 10\n" + "14 2 8 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 4 4 1 2 3 6 15 4 5 9 10 11 12\n" + "14 2 8 14 9 10 11 14 7 8 9 14 15 6 7 14 11 0 15 15 0 1 4 4 1 2 3 6 15 4 5 11 12 13 0\n" + "14 2 8 14 15 12 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 10 11 12\n" + "14 2 8 14 11 12 15 14 9 10 11 14 5 6 9 14 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 12 13 0 15\n" + "14 2 8 14 15 12 13 14 7 10 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 10 11 12\n" + "14 2 8 14 11 12 15 14 7 10 11 14 5 6 7 14 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 12 13 0 15\n" + "14 2 8 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 10 15 6 9 6 7 8 9\n" + "14 2 8 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 10 15 6 7 10 7 8 9\n" + "14 2 8 14 11 12 13 14 15 8 11 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 8 15 6 7 11 8 9 10\n" + "14 2 8 14 9 12 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 8 15 6 7 9 10 11 12\n" + "14 2 8 14 9 10 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 8 15 6 7 10 11 12 13\n" + "14 2 8 14 9 10 11 14 15 8 9 14 5 6 15 14 11 0 5 5 0 1 4 4 1 2 3 8 15 6 7 11 12 13 0\n" + "14 2 8 14 11 12 15 14 7 8 11 14 5 6 7 14 15 0 5 5 0 1 4 4 1 2 3 11 8 9 10 12 13 0 15\n" + "14 2 8 14 9 12 15 14 7 8 9 14 5 6 7 14 15 0 5 5 0 1 4 4 1 2 3 9 10 11 12 12 13 0 15\n" + "14 2 8 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 8 11 12 8 9 10 11\n" + "14 2 8 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 8 9 12 12 9 10 11\n" + "14 2 8 14 15 10 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 8 9 10 10 11 12 13\n" + "14 2 8 14 15 10 11 14 7 8 15 14 5 6 7 14 11 0 5 5 0 1 4 4 1 2 3 15 8 9 10 11 12 13 0\n" + "14 2 8 14 9 10 15 14 7 8 9 14 5 6 7 14 15 0 5 5 0 1 4 4 1 2 3 10 11 12 15 15 12 13 0\n" + "14 2 8 14 9 10 15 14 7 8 9 14 5 6 7 14 15 0 5 5 0 1 4 4 1 2 3 10 13 0 15 10 11 12 13\n" + "14 2 8 14 9 10 11 14 7 8 9 14 15 4 7 14 11 0 15 15 0 1 2 4 15 2 3 7 4 5 6 11 12 13 0\n" + "14 2 8 14 11 12 15 14 7 8 11 14 3 4 7 14 15 0 3 3 0 1 2 7 4 5 6 11 8 9 10 12 13 0 15\n" + "14 2 8 14 9 12 15 14 7 8 9 14 3 4 7 14 15 0 3 3 0 1 2 7 4 5 6 9 10 11 12 12 13 0 15\n" + "14 2 8 14 15 12 13 14 7 8 15 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 15 8 11 12 8 9 10 11\n" + "14 2 8 14 15 12 13 14 7 8 15 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 15 8 9 12 12 9 10 11\n" + "14 2 8 14 15 10 11 14 7 8 15 14 3 4 7 14 11 0 3 3 0 1 2 7 4 5 6 15 8 9 10 11 12 13 0\n" + "14 2 8 14 9 10 15 14 7 8 9 14 3 4 7 14 15 0 3 3 0 1 2 7 4 5 6 10 13 0 15 10 11 12 13\n" + "14 2 8 14 11 12 15 14 5 8 11 14 3 4 5 14 15 0 3 3 0 1 2 8 5 6 7 11 8 9 10 12 13 0 15\n" + "14 2 8 14 15 12 13 14 5 8 15 14 3 4 5 14 13 0 3 3 0 1 2 8 5 6 7 15 8 9 12 12 9 10 11\n" + "14 2 8 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 9 4 5 8 9 8 5 6 7\n" + "14 2 8 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 9 4 5 6 9 9 6 7 8\n" + "14 2 8 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 7 4 5 6 7 10 7 8 9\n" + "14 2 8 14 11 12 13 14 15 8 11 14 3 4 15 14 13 0 3 3 0 1 2 8 15 4 7 4 5 6 7 11 8 9 10\n" + "14 2 8 14 9 12 13 14 15 8 9 14 3 4 15 14 13 0 3 3 0 1 2 8 15 4 7 4 5 6 7 9 10 11 12\n" + "14 2 8 14 9 10 11 14 15 8 9 14 3 4 15 14 11 0 3 3 0 1 2 8 15 4 7 4 5 6 7 11 12 13 0\n" + "14 2 8 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 5 10 5 8 9 5 6 7 8\n" + "14 2 8 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 5 10 5 6 9 9 6 7 8\n" + "14 2 8 14 9 10 11 14 15 8 9 14 3 4 15 14 11 0 3 3 0 1 2 8 15 4 5 8 5 6 7 11 12 13 0\n" + "14 2 8 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 11 12 6 7 10 11 10 7 8 9\n" + "14 2 8 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 11 12 6 7 8 11 11 8 9 10\n" + "14 2 8 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 9 12 6 7 8 9 12 9 10 11\n" + "14 2 8 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 7 12 12 7 10 11 7 8 9 10\n" + "14 2 8 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 7 12 12 7 8 11 11 8 9 10\n" + "14 2 8 14 7 8 15 14 5 6 7 14 3 4 5 14 15 0 3 3 0 1 2 8 13 0 15 8 9 12 13 12 9 10 11\n" + "14 2 8 14 7 8 15 14 5 6 7 14 3 4 5 14 15 0 3 3 0 1 2 8 13 0 15 8 9 10 13 13 10 11 12\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 4 5 1 2 3 4\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 2 5 5 2 3 4\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 2 3 6 3 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 4 7 4 1 2 3 7 4 5 6\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 5 0 1 4 5 4 1 2 3 8 5 6 7\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 2 7 7 2 5 6 2 3 4 5\n" + "14 2 8 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 2 7 7 2 3 6 6 3 4 5\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 7 1 2 15 14 15 2 5 6 2 3 4 5 7 14 15 6\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 6 7 1 2 14 6 14 2 3 15 15 3 4 5 6 14 15 5\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 7 1 2 15 14 15 2 3 6 6 3 4 5 7 14 15 6\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 10 14 15 9\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 10 14 15 9\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 10 14 15 9\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 14 9 14 1 6 7 1 2 15 6 15 2 3 4 6 15 4 5 9 14 7 8\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 8 14 8 1 6 7 1 2 15 6 15 2 3 4 6 15 4 5 10 14 8 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 6 7 1 2 15 6 15 2 3 4 6 15 4 5 14 10 11 12\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 7 1 2 15 14 15 2 3 4 7 14 15 4 7 4 5 6\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 5 1 2 15 14 15 2 3 4 5 14 15 4 8 5 6 7\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 6 9 6 1 14 5 1 2 15 14 15 2 3 4 5 14 15 4 9 6 7 8\n" + "14 2 8 0 11 12 13 0 7 10 11 0 1 6 7 6 1 14 5 1 2 15 14 15 2 3 4 5 14 15 4 10 7 8 9\n" + "14 2 8 0 11 12 13 0 7 8 11 0 1 6 7 6 1 14 5 1 2 15 14 15 2 3 4 5 14 15 4 11 8 9 10\n" + "14 2 8 0 9 12 13 0 7 8 9 0 1 6 7 6 1 14 5 1 2 15 14 15 2 3 4 5 14 15 4 9 10 11 12\n" + "14 2 8 0 9 10 13 0 7 8 9 0 1 6 7 6 1 14 5 1 2 15 14 15 2 3 4 5 14 15 4 10 11 12 13\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 14 9 14 1 6 15 1 2 5 6 5 2 3 4 15 6 7 8 9 14 15 8\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 10 14 15 9\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 15 14 1 2 5 15 5 2 3 4 14 15 5 6 8 14 6 7\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 14 9 14 1 15 7 1 2 5 15 5 2 3 4 7 15 5 6 9 14 7 8\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 8 14 8 1 15 7 1 2 5 15 5 2 3 4 7 15 5 6 10 14 8 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 15 7 1 2 5 15 5 2 3 4 7 15 5 6 14 10 11 12\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 15 9 15 1 6 7 1 2 5 6 5 2 3 4 9 15 7 8 14 10 11 12\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 6 7 1 2 5 6 5 2 3 4 10 14 15 7 10 7 8 9\n" + "14 2 8 0 11 12 13 0 14 8 11 0 1 15 14 15 1 6 7 1 2 5 6 5 2 3 4 8 14 15 7 11 8 9 10\n" + "14 2 8 0 9 12 13 0 14 8 9 0 1 15 14 15 1 6 7 1 2 5 6 5 2 3 4 8 14 15 7 9 10 11 12\n" + "14 2 8 0 9 10 13 0 14 8 9 0 1 15 14 15 1 6 7 1 2 5 6 5 2 3 4 8 14 15 7 10 11 12 13\n" + "14 2 8 0 14 12 13 0 9 15 14 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 15 9 10 11 14 15 11 12\n" + "14 2 8 0 11 12 13 0 15 14 11 0 1 8 15 8 1 6 7 1 2 5 6 5 2 3 4 14 15 8 9 11 14 9 10\n" + "14 2 8 0 14 12 13 0 15 10 14 0 1 8 15 8 1 6 7 1 2 5 6 5 2 3 4 10 15 8 9 14 10 11 12\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 10 14 15 9\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 10 14 15 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 15 9 15 1 6 7 1 2 3 6 6 3 4 5 9 15 7 8 14 10 11 12\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 6 7 1 2 3 6 6 3 4 5 10 14 15 7 10 7 8 9\n" + "14 2 8 0 11 12 13 0 14 8 11 0 1 15 14 15 1 6 7 1 2 3 6 6 3 4 5 8 14 15 7 11 8 9 10\n" + "14 2 8 0 9 12 13 0 14 8 9 0 1 15 14 15 1 6 7 1 2 3 6 6 3 4 5 8 14 15 7 9 10 11 12\n" + "14 2 8 0 14 12 13 0 9 15 14 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 15 9 10 11 14 15 11 12\n" + "14 2 8 0 11 12 13 0 15 14 11 0 1 8 15 8 1 6 7 1 2 3 6 6 3 4 5 14 15 8 9 11 14 9 10\n" + "14 2 8 0 14 12 13 0 15 10 14 0 1 8 15 8 1 6 7 1 2 3 6 6 3 4 5 10 15 8 9 14 10 11 12\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 4 14 1 2 3 4 14 4 5 15 15 5 6 7 8 14 15 7\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 10 14 15 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 4 15 1 2 3 4 15 4 5 6 8 15 6 7 14 10 11 12\n" + "14 2 8 0 11 12 13 0 7 8 11 0 1 14 7 14 1 4 15 1 2 3 4 15 4 5 6 7 14 15 6 11 8 9 10\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 15 9 15 1 4 7 1 2 3 4 7 4 5 6 9 15 7 8 14 10 11 12\n" + "14 2 8 0 11 12 13 0 14 8 11 0 1 15 14 15 1 4 7 1 2 3 4 7 4 5 6 8 14 15 7 11 8 9 10\n" + "14 2 8 0 14 12 13 0 9 15 14 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 15 9 10 11 14 15 11 12\n" + "14 2 8 0 14 12 13 0 15 10 14 0 1 8 15 8 1 4 7 1 2 3 4 7 4 5 6 10 15 8 9 14 10 11 12\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 14 7 1 2 3 14 7 14 3 15 3 4 5 15 7 15 5 6\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 15 14 1 2 3 15 14 15 3 6 3 4 5 6 8 14 6 7\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 14 9 14 1 15 7 1 2 3 15 7 15 3 6 3 4 5 6 9 14 7 8\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 8 14 8 1 15 7 1 2 3 15 7 15 3 6 3 4 5 6 10 14 8 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 15 7 1 2 3 15 7 15 3 6 3 4 5 6 14 10 11 12\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 8 14 8 1 15 7 1 2 3 15 7 15 3 4 7 4 5 6 10 14 8 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 15 7 1 2 3 15 7 15 3 4 7 4 5 6 14 10 11 12\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 15 5 1 2 3 15 5 15 3 4 8 5 6 7 14 10 11 12\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 15 14 1 2 3 15 14 15 3 4 8 14 4 7 4 5 6 7\n" + "14 2 8 0 11 12 13 0 7 10 11 0 1 6 7 6 1 15 14 1 2 3 15 14 15 3 4 6 14 4 5 10 7 8 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 6 9 6 1 15 5 1 2 3 15 5 15 3 4 9 6 7 8 14 10 11 12\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 6 14 6 1 15 5 1 2 3 15 5 15 3 4 10 14 6 7 10 7 8 9\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 4 5 1 2 3 4 10 14 15 5 10 5 6 9 9 6 7 8\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 14 6 2 3 15 14 15 3 4 5 6 14 15 5\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 14 9 14 1 2 15 15 2 7 8 2 3 6 7 6 3 4 5 9 14 15 8\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 10 14 15 9\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 14 9 14 1 2 15 15 2 7 8 2 3 4 7 7 4 5 6 9 14 15 8\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 10 14 15 9\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 14 14 2 5 15 2 3 4 5 15 5 6 7 8 14 15 7\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 10 14 15 9\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 15 14 2 3 4 15 14 15 4 5 7 14 5 6\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 14 14 2 15 6 2 3 4 15 6 15 4 5 8 14 6 7\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 14 9 14 1 2 7 7 2 15 6 2 3 4 15 6 15 4 5 9 14 7 8\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 8 14 8 1 2 7 7 2 15 6 2 3 4 15 6 15 4 5 10 14 8 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 2 7 7 2 15 6 2 3 4 15 6 15 4 5 14 10 11 12\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 14 14 2 3 15 15 3 6 7 3 4 5 6 8 14 15 7\n" + "14 2 8 0 11 12 13 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 14 14 3 4 15 15 4 5 6 7 14 15 6\n" + "14 2 8 0 11 12 13 0 14 10 11 0 1 15 14 15 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 10 14 15 9\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 2 7 7 2 3 15 15 3 4 5 7 15 5 6 14 10 11 12\n" + "14 2 8 0 11 12 13 0 7 8 11 0 1 6 7 6 1 2 14 14 2 3 15 15 3 4 5 6 14 15 5 11 8 9 10\n" + "14 2 8 0 9 12 13 0 7 8 9 0 1 6 7 6 1 2 14 14 2 3 15 15 3 4 5 6 14 15 5 9 10 11 12\n" + "14 2 8 0 9 10 13 0 7 8 9 0 1 6 7 6 1 2 14 14 2 3 15 15 3 4 5 6 14 15 5 10 11 12 13\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 2 15 15 2 3 6 6 3 4 5 8 15 6 7 14 10 11 12\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 15 9 15 1 2 7 7 2 3 6 6 3 4 5 9 15 7 8 14 10 11 12\n" + "14 2 8 0 9 10 13 0 14 8 9 0 1 15 14 15 1 2 7 7 2 3 6 6 3 4 5 8 14 15 7 10 11 12 13\n" + "14 2 8 0 14 12 13 0 9 15 14 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 15 9 10 11 14 15 11 12\n" + "14 2 8 0 11 12 13 0 15 14 11 0 1 8 15 8 1 2 7 7 2 3 6 6 3 4 5 14 15 8 9 11 14 9 10\n" + "14 2 8 0 14 12 13 0 15 10 14 0 1 8 15 8 1 2 7 7 2 3 6 6 3 4 5 10 15 8 9 14 10 11 12\n" + "14 2 8 0 14 15 13 0 9 10 14 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 10 11 15 15 11 12 13\n" + "14 2 8 0 14 12 13 0 9 10 14 0 1 8 9 8 1 2 15 15 2 3 4 8 15 4 7 4 5 6 7 14 10 11 12\n" + "14 2 8 0 9 14 13 0 7 8 9 0 1 6 7 6 1 2 15 15 2 3 4 6 15 4 5 9 10 11 14 14 11 12 13\n" + "14 2 8 0 11 12 13 0 5 6 11 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4 11 6 7 10 10 7 8 9\n" + "14 2 8 0 9 10 13 0 5 6 9 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4 9 6 7 8 10 11 12 13\n" + "14 2 8 0 7 12 13 0 5 6 7 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4 7 8 11 12 11 8 9 10\n" + "14 2 8 0 7 12 13 0 5 6 7 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4 7 8 9 12 12 9 10 11\n" + "14 2 8 0 7 10 13 0 5 6 7 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4 7 8 9 10 10 11 12 13\n" + "14 2 8 0 7 8 13 0 5 6 7 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4 8 11 12 13 8 9 10 11\n" + "14 2 8 0 7 8 13 0 5 6 7 0 1 14 5 14 1 2 15 15 2 3 4 5 14 15 4 8 9 12 13 12 9 10 11\n" + "14 2 8 0 9 14 13 0 7 8 9 0 1 15 7 15 1 2 5 5 2 3 4 7 15 5 6 9 10 11 14 14 11 12 13\n" + "14 2 8 0 14 12 13 0 7 8 14 0 1 15 7 15 1 2 5 5 2 3 4 7 15 5 6 14 8 9 12 12 9 10 11\n" + "14 2 8 0 14 10 13 0 7 8 14 0 1 15 7 15 1 2 5 5 2 3 4 7 15 5 6 14 8 9 10 10 11 12 13\n" + "14 2 8 0 11 12 13 0 7 14 11 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 15 15 8 9 10 11 14 15 10\n" + "14 2 8 0 14 12 13 0 7 15 14 0 1 6 7 6 1 2 5 5 2 3 4 15 7 8 11 11 8 9 10 14 15 11 12\n" + "14 2 8 0 14 12 13 0 7 15 14 0 1 6 7 6 1 2 5 5 2 3 4 15 7 8 9 14 15 9 12 12 9 10 11\n" + "14 2 8 0 9 10 13 0 15 14 9 0 1 6 15 6 1 2 5 5 2 3 4 14 15 6 7 9 14 7 8 10 11 12 13\n" + "14 2 8 0 9 14 13 0 15 8 9 0 1 6 15 6 1 2 5 5 2 3 4 8 15 6 7 9 10 11 14 14 11 12 13\n" + "14 2 8 0 14 12 13 0 15 8 14 0 1 6 15 6 1 2 5 5 2 3 4 8 15 6 7 14 8 9 12 12 9 10 11\n" + "14 2 8 0 14 10 13 0 15 8 14 0 1 6 15 6 1 2 5 5 2 3 4 8 15 6 7 14 8 9 10 10 11 12 13\n" + "14 2 8 0 9 14 13 0 7 8 9 0 1 15 7 15 1 2 3 7 15 3 6 3 4 5 6 9 10 11 14 14 11 12 13\n" + "14 2 8 0 14 10 13 0 7 8 14 0 1 15 7 15 1 2 3 7 15 3 6 3 4 5 6 14 8 9 10 10 11 12 13\n" + "14 2 8 0 7 12 13 0 5 6 7 0 1 14 5 14 1 2 3 5 14 3 4 7 8 15 12 15 8 9 10 12 15 10 11\n" + "14 2 8 0 9 10 13 0 14 4 9 0 1 15 14 15 1 2 3 4 14 15 3 9 4 5 8 8 5 6 7 10 11 12 13\n" + "14 2 8 0 14 12 13 0 5 15 14 0 1 4 5 4 1 2 3 15 5 6 7 14 15 7 12 12 7 8 11 11 8 9 10\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 15 5 5 15 3 4 15 16 2 3 13 0 16 15 2 16 0 1\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 16 15 15 16 3 4 16 1 2 3 13 0 1 16 6 15 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 5 6 15 14 13 16 5 5 16 3 4 16 1 2 3 13 0 1 16 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 5 6 7 14 13 16 5 5 16 3 4 16 1 2 3 13 0 1 16 10 15 8 9\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 0 3 4 3 0 1 2 13 0 16 15\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 0 1 4 4 1 2 3 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 6 15 16 5\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 2 5 16 0 1 2 5 2 3 4 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 16 4 0 1 2 16 4 16 2 3 6 15 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 5 7 15 5 6\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 15 10 11 12\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 4 5 8 14 15 16 4 4 16 2 3 16 0 1 2 8 5 6 7 13 0 16 15\n" + "14 3 9 14 12 13 15 14 10 11 12 14 6 9 10 14 4 5 6 14 15 16 4 4 16 2 3 16 0 1 2 9 6 7 8 13 0 16 15\n" + "14 3 9 14 12 13 15 14 10 11 12 14 6 7 10 14 4 5 6 14 15 16 4 4 16 2 3 16 0 1 2 10 7 8 9 13 0 16 15\n" + "14 3 9 14 12 13 15 14 8 11 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 16 0 1 2 11 8 9 10 13 0 16 15\n" + "14 3 9 14 12 13 15 14 8 9 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 16 0 1 2 12 9 10 11 13 0 16 15\n" + "14 3 9 14 10 13 15 14 8 9 10 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 16 0 1 2 10 11 12 13 13 0 16 15\n" + "14 3 9 14 10 11 15 14 8 9 10 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 16 0 1 2 11 0 16 15 11 12 13 0\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 16 0 1 2 4 16 2 3\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 16 15 15 16 3 4 13 0 3 16 3 0 1 2 6 15 4 5\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 5 6 7 14 15 16 5 5 16 3 4 15 0 3 16 3 0 1 2 12 13 0 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 16 15 15 16 1 2 13 0 1 16 6 15 2 5 2 3 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 4 7 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 7 4 5 6\n" + "14 3 9 14 11 12 13 14 9 10 11 14 5 8 9 14 15 4 5 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 8 5 6 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 5 6 9 14 15 4 5 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 5 6 7 14 15 4 5 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 10 7 8 9\n" + "14 3 9 14 11 12 13 14 7 8 11 14 5 6 7 14 15 4 5 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 5 6 7 14 15 4 5 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 9 10 11 12\n" +; + +const char* data_dqrgl_block2 = + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 15 4 5 6 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 3 4 5 14 13 16 3 3 16 1 2 13 0 1 16 15 6 7 8 10 15 8 9\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 16 16 1 4 5 1 2 3 4 6 15 16 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 16 16 1 2 3 16 3 4 5 6 15 16 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 4 7 14 13 0 15 15 0 1 16 16 1 2 3 4 15 16 3 7 4 5 6\n" + "14 3 9 14 11 12 13 14 9 10 11 14 5 8 9 14 15 4 5 14 13 0 15 15 0 1 16 16 1 2 3 4 15 16 3 8 5 6 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 5 6 9 14 15 4 5 14 13 0 15 15 0 1 16 16 1 2 3 4 15 16 3 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 5 6 7 14 15 4 5 14 13 0 15 15 0 1 16 16 1 2 3 4 15 16 3 10 7 8 9\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 0 16 16 0 1 4 4 1 2 3 6 16 4 5 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 0 16 16 0 1 4 4 1 2 3 6 16 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 0 16 16 0 1 4 4 1 2 3 6 16 4 5 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 16 6 7 14 15 0 16 16 0 1 4 4 1 2 3 6 16 4 5 12 13 0 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 16 4 15 14 13 0 16 16 0 1 2 4 16 2 3 15 4 5 6 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 16 4 7 14 13 0 16 16 0 1 2 4 16 2 3 7 4 5 6 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 16 4 7 14 13 0 16 16 0 1 2 4 16 2 3 7 4 5 6 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 16 4 7 14 15 0 16 16 0 1 2 4 16 2 3 7 4 5 6 12 13 0 15\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 8 15 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 8 5 6 7 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 5 8 9 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 8 5 6 7 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 5 8 9 14 16 4 5 14 15 0 16 16 0 1 2 4 16 2 3 8 5 6 7 12 13 0 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 16 4 15 14 13 0 16 16 0 1 2 4 16 2 3 8 15 4 5 8 5 6 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 6 9 14 16 4 15 14 13 0 16 16 0 1 2 4 16 2 3 6 15 4 5 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 15 6 7 14 16 4 15 14 13 0 16 16 0 1 2 4 16 2 3 6 15 4 5 10 7 8 9\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 6 7 14 16 4 15 14 13 0 16 16 0 1 2 4 16 2 3 6 15 4 5 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 6 7 14 16 4 15 14 13 0 16 16 0 1 2 4 16 2 3 6 15 4 5 9 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 15 6 7 8 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 5 6 9 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 9 6 7 8 15 10 11 12\n" + "14 3 9 14 15 12 13 14 7 10 15 14 5 6 7 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 10 7 8 9 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 10 15 6 9 6 7 8 9\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 10 15 6 7 10 7 8 9\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 6 15 0 16 0 1 2 16 16 2 3 4 6 16 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 16 4 5 13 0 16 15 16 0 1 2 4 16 2 3\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 15 3 4 16 13 0 3 15 3 0 1 2 6 16 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 16 3 4 5 13 0 3 16 3 0 1 2 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 16 3 4 5 13 0 3 16 3 0 1 2 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 16 3 4 5 13 0 3 16 3 0 1 2 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 15 16 7 7 16 5 6 16 3 4 5 15 0 3 16 3 0 1 2 12 13 0 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 1 16 5 13 0 1 15 16 1 2 3 5 16 3 4\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 15 1 4 16 13 0 1 15 4 1 2 3 6 16 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 16 1 4 5 13 0 1 16 4 1 2 3 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 16 1 4 5 13 0 1 16 4 1 2 3 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 16 1 4 5 13 0 1 16 4 1 2 3 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 15 16 7 7 16 5 6 16 1 4 5 15 0 1 16 4 1 2 3 12 13 0 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 16 4 5 13 0 16 15 4 16 0 3 0 1 2 3\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 16 4 5 13 0 16 15 4 16 0 1 4 1 2 3\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 3 4 16 1 2 3 13 0 1 16 8 15 4 7 4 5 6 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 4 5 1 2 3 4 6 15 16 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 5 6 0 1 15 5 15 1 2 16 16 2 3 4 5 15 16 4\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 5 5 2 3 4 6 15 16 5\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 5 6 5 0 1 4 4 1 2 3 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 3 16 3 4 5 6 15 16 5\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 5 6 5 0 1 2 5 2 3 4 13 0 16 15\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 3 6 3 0 1 2 6 3 4 5 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 3 15 16 3 4 6 15 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 5 6 0 1 16 5 16 1 2 3 5 16 3 4 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 5 6 0 1 16 5 16 1 2 3 5 16 3 4 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 16 5 16 1 2 3 5 16 3 4 15 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 3 6 15 16 3 6 3 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 5 6 9 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 3 4 15 16 3 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 3 4 15 16 3 10 7 8 9\n" + "14 3 9 14 11 12 13 14 7 8 11 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 3 4 15 16 3 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 3 4 15 16 3 9 10 11 12\n" + "14 3 9 14 9 10 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 3 4 15 16 3 10 11 12 13\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 5 16 0 1 4 5 4 1 2 3 16 5 6 7 8 15 16 7\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 4 7 16 0 3 4 3 0 1 2 7 4 5 6 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 16 6 0 1 4 16 4 1 2 3 6 16 4 5 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 4 16 4 1 2 3 6 16 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 4 16 4 1 2 3 6 16 4 5 15 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 5 6 0 1 4 5 4 1 2 3 15 16 6 7 9 15 7 8\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 5 6 0 1 4 5 4 1 2 3 8 16 6 7 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 5 6 0 1 4 5 4 1 2 3 8 16 6 7 15 10 11 12\n" + "14 3 9 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 4 5 16 0 3 4 3 0 1 2 10 7 8 9 13 0 16 15\n" + "14 3 9 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 16 9 10 11 15 16 11 12\n" + "14 3 9 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 4 5 16 0 3 4 3 0 1 2 11 8 9 10 13 0 16 15\n" + "14 3 9 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 16 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 16 8 9 15 10 11 12\n" + "14 3 9 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 4 5 16 0 3 4 3 0 1 2 12 9 10 11 13 0 16 15\n" + "14 3 9 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 0 3 4 3 0 1 2 10 11 12 13 13 0 16 15\n" + "14 3 9 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 10 11 16 16 11 12 13\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 1 6 6 1 4 5 1 2 3 4 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 15 2 3 16 16 3 4 5 6 15 16 5\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 1 6 6 1 2 5 5 2 3 4 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 5 6 0 1 2 5 5 2 3 4 15 16 6 7 9 15 7 8\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 5 6 0 1 2 5 5 2 3 4 8 16 6 7 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 5 6 0 1 2 5 5 2 3 4 8 16 6 7 15 10 11 12\n" + "14 3 9 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 4 5 16 0 1 4 4 1 2 3 10 7 8 9 13 0 16 15\n" + "14 3 9 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 16 9 10 11 15 16 11 12\n" + "14 3 9 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 4 5 16 0 1 4 4 1 2 3 11 8 9 10 13 0 16 15\n" + "14 3 9 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 16 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 16 8 9 15 10 11 12\n" + "14 3 9 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 0 1 4 4 1 2 3 10 11 12 13 13 0 16 15\n" + "14 3 9 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 10 11 16 16 11 12 13\n" + "14 3 9 14 10 11 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 0 1 4 4 1 2 3 11 0 16 15 11 12 13 0\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 7 7 4 5 6 8 15 16 7\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 2 7 16 0 1 2 7 2 3 6 6 3 4 5 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 16 5 6 7 8 15 16 7\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 2 7 16 0 1 2 7 2 3 4 7 4 5 6 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 8 15 16 5 8 5 6 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 6 15 16 5 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 6 15 16 5 10 7 8 9\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 6 15 16 5 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 6 15 16 5 9 10 11 12\n" + "14 3 9 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 6 15 16 5 10 11 12 13\n" + "14 3 9 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 3 6 0 1 2 3 6 3 4 5 15 16 6 7 9 15 7 8\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 3 6 0 1 2 3 6 3 4 5 8 16 6 7 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 3 6 0 1 2 3 6 3 4 5 8 16 6 7 15 10 11 12\n" + "14 3 9 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 2 5 16 0 1 2 5 2 3 4 10 7 8 9 13 0 16 15\n" + "14 3 9 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 16 9 10 11 15 16 11 12\n" + "14 3 9 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 16 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 16 8 9 15 10 11 12\n" + "14 3 9 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 2 5 16 0 1 2 5 2 3 4 10 11 12 13 13 0 16 15\n" + "14 3 9 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 10 11 16 16 11 12 13\n" + "14 3 9 14 10 11 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 2 5 16 0 1 2 5 2 3 4 11 0 16 15 11 12 13 0\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 6 15 2 16 2 3 4 16 6 16 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 16 6 0 1 2 16 6 16 2 5 2 3 4 5 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 2 16 6 16 2 5 2 3 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 2 16 6 16 2 5 2 3 4 5 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 2 16 6 16 2 3 6 3 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 2 16 6 16 2 3 6 3 4 5 15 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 16 4 0 1 2 16 4 16 2 3 8 15 4 5 8 5 6 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 16 4 0 1 2 16 4 16 2 3 6 15 4 5 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 16 4 0 1 2 16 4 16 2 3 6 15 4 5 10 7 8 9\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 16 4 0 1 2 16 4 16 2 3 6 15 4 5 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 16 4 0 1 2 16 4 16 2 3 6 15 4 5 9 10 11 12\n" + "14 3 9 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 16 4 0 1 2 16 4 16 2 3 6 15 4 5 10 11 12 13\n" + "14 3 9 14 15 12 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 9 6 7 8 15 10 11 12\n" + "14 3 9 14 11 12 13 14 7 15 11 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 7 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 7 10 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 10 7 8 9 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 10 15 6 9 6 7 8 9\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 10 15 6 7 10 7 8 9\n" + "14 3 9 14 11 12 13 14 15 8 11 14 5 6 15 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 8 15 6 7 11 8 9 10\n" + "14 3 9 14 9 12 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 8 15 6 7 9 10 11 12\n" + "14 3 9 14 9 10 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 8 15 6 7 10 11 12 13\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 8 9 10 15 10 11 12\n" + "14 3 9 14 9 15 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 9 10 11 15 15 11 12 13\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 8 11 12 8 9 10 11\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 8 9 12 12 9 10 11\n" + "14 3 9 14 15 10 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 8 9 10 10 11 12 13\n" + "14 3 9 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 7 4 5 6 7 9 15 7 8\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 3 4 0 1 2 3 8 16 4 7 4 5 6 7 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 3 4 0 1 2 3 8 16 4 7 4 5 6 7 15 10 11 12\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 3 4 0 1 2 3 8 16 4 5 8 5 6 7 15 10 11 12\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 6 9 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 9 6 7 8 15 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 5 9 15 5 8 5 6 7 8\n" + "14 3 9 14 11 12 13 14 7 8 11 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 5 7 15 5 6 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 5 7 15 5 6 9 10 11 12\n" + "14 3 9 14 9 10 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 5 7 15 5 6 10 11 12 13\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 6 15 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 10 15 6 7 10 7 8 9\n" + "14 3 9 14 11 12 13 14 15 8 11 14 16 6 15 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 8 15 6 7 11 8 9 10\n" + "14 3 9 14 9 12 13 14 15 8 9 14 16 6 15 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 8 15 6 7 9 10 11 12\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 15 8 9 10 15 10 11 12\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 15 8 11 12 8 9 10 11\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 15 8 9 12 12 9 10 11\n" + "14 3 9 14 15 16 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 3 4 0 1 2 3 9 6 7 8 15 10 11 16 16 11 12 13\n" + "14 3 9 14 11 12 13 14 7 15 11 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 7 8 16 16 8 9 10 11 15 16 10\n" + "14 3 9 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 11 11 8 9 10 15 16 11 12\n" + "14 3 9 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 9 15 16 9 10 15 10 11 12\n" + "14 3 9 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 3 9 14 15 10 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 9 15 16 9 10 10 11 12 13\n" + "14 3 9 14 15 16 13 14 7 10 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 10 7 8 9 15 10 11 16 16 11 12 13\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 10 15 6 16 6 7 8 16 10 16 8 9\n" + "14 3 9 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 15 16 6 9 6 7 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 10 16 6 9 6 7 8 9 15 10 11 12\n" + "14 3 9 14 15 12 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 8 16 6 7 15 8 9 10 15 10 11 12\n" + "14 3 9 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 15 16 6 7 11 15 7 10 7 8 9 10\n" + "14 3 9 14 9 10 13 14 16 15 9 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 15 16 6 7 9 15 7 8 10 11 12 13\n" + "14 3 9 14 9 15 13 14 16 8 9 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 8 16 6 7 9 10 11 15 15 11 12 13\n" + "14 3 9 14 15 12 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 8 16 6 7 15 8 9 12 12 9 10 11\n" + "14 3 9 14 15 10 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 8 16 6 7 15 8 9 10 10 11 12 13\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 16 16 9 10 11 15 16 11 12\n" + "14 3 9 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 10 15 10 11 16 16 11 12 13\n" + "14 3 9 14 9 15 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 9 10 16 15 16 10 11 12 15 16 12 13\n" + "14 3 9 14 8 13 15 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 16 0 1 2 8 9 12 13 12 9 10 11 13 0 16 15\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 16 12 8 9 10 16 12 16 10 11\n" + "14 3 9 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 11 16 8 9 10 11 16 11 12 13\n" + "14 3 9 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 16 16 9 12 13 9 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 13 0 5 15 5 0 16 4 0 1 2 16 4 16 2 3\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 16 0 3 4 0 1 2 3 6 16 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 13 0 5 16 5 0 3 4 0 1 2 3 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 13 0 5 16 5 0 3 4 0 1 2 3 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 13 0 5 16 5 0 3 4 0 1 2 3 15 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 16 0 1 4 4 1 2 3 6 16 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 13 0 5 16 5 0 1 4 4 1 2 3 8 15 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 13 0 5 16 5 0 1 4 4 1 2 3 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 13 0 5 16 5 0 1 4 4 1 2 3 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 15 16 7 7 16 5 6 15 0 5 16 5 0 1 4 4 1 2 3 12 13 0 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 5 6 9 14 13 15 5 5 15 16 4 13 0 16 15 16 0 1 2 4 16 2 3 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 16 0 1 2 4 16 2 3 10 7 8 9\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 3 4 13 0 3 16 3 0 1 2 8 15 4 7 4 5 6 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 6 9 14 13 16 15 15 16 3 4 13 0 3 16 3 0 1 2 6 15 4 5 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 6 7 14 13 16 15 15 16 3 4 13 0 3 16 3 0 1 2 6 15 4 5 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 6 7 14 13 16 15 15 16 3 4 13 0 3 16 3 0 1 2 6 15 4 5 9 10 11 12\n" + "14 3 9 14 15 12 13 14 9 10 15 14 5 6 9 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 9 6 7 8 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 5 6 9 14 15 16 5 5 16 3 4 15 0 3 16 3 0 1 2 9 6 7 8 12 13 0 15\n" + "14 3 9 14 11 12 13 14 7 15 11 14 5 6 7 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 15 7 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 7 10 15 14 5 6 7 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 10 7 8 9 15 10 11 12\n" + "14 3 9 14 11 12 15 14 7 10 11 14 5 6 7 14 15 16 5 5 16 3 4 15 0 3 16 3 0 1 2 10 7 8 9 12 13 0 15\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 10 15 6 9 6 7 8 9\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 10 15 6 7 10 7 8 9\n" + "14 3 9 14 11 12 13 14 15 8 11 14 5 6 15 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 8 15 6 7 11 8 9 10\n" + "14 3 9 14 9 12 13 14 15 8 9 14 5 6 15 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 8 15 6 7 9 10 11 12\n" + "14 3 9 14 9 12 15 14 7 8 9 14 5 6 7 14 15 16 5 5 16 3 4 15 0 3 16 3 0 1 2 9 10 11 12 12 13 0 15\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 15 8 11 12 8 9 10 11\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 15 8 9 12 12 9 10 11\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 6 16 0 5 0 1 4 5 4 1 2 3\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 6 16 0 5 0 1 2 5 5 2 3 4\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 6 16 0 3 0 1 2 3 6 3 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 5 6 9 14 13 15 5 5 15 16 4 13 0 16 15 4 16 0 3 0 1 2 3 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 10 11 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 4 16 0 3 0 1 2 3 10 7 8 9\n" + "14 3 9 14 11 12 13 14 7 8 11 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 4 16 0 3 0 1 2 3 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 4 16 0 3 0 1 2 3 9 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 3 4 9 14 13 15 3 3 15 16 2 13 0 16 15 2 16 0 1 9 4 5 8 8 5 6 7\n" + "14 3 9 14 11 12 13 14 7 8 11 14 3 4 7 14 13 15 3 3 15 16 2 13 0 16 15 2 16 0 1 7 4 5 6 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 3 4 7 14 13 15 3 3 15 16 2 13 0 16 15 2 16 0 1 7 4 5 6 9 10 11 12\n" + "14 3 9 14 11 12 13 14 5 10 11 14 3 4 5 14 13 15 3 3 15 16 2 13 0 16 15 2 16 0 1 10 5 6 9 9 6 7 8\n" + "14 3 9 14 11 12 13 14 5 8 11 14 3 4 5 14 13 15 3 3 15 16 2 13 0 16 15 2 16 0 1 8 5 6 7 11 8 9 10\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 1 2 13 0 1 16 8 15 2 7 2 3 6 7 6 3 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 6 9 14 13 16 15 15 16 1 2 13 0 1 16 6 15 2 5 2 3 4 5 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 6 7 14 13 16 15 15 16 1 2 13 0 1 16 6 15 2 5 2 3 4 5 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 6 7 14 13 16 15 15 16 1 2 13 0 1 16 6 15 2 5 2 3 4 5 9 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 4 9 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 9 4 5 8 8 5 6 7\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 4 7 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 7 4 5 6 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 4 7 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 7 4 5 6 9 10 11 12\n" + "14 3 9 14 11 12 13 14 5 6 11 14 15 4 5 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 11 6 7 10 10 7 8 9\n" + "14 3 9 14 7 12 13 14 5 6 7 14 15 4 5 14 13 16 15 15 16 1 2 13 0 1 16 4 15 2 3 7 8 11 12 11 8 9 10\n" + "14 3 9 14 15 12 13 14 9 10 15 14 3 4 9 14 13 16 3 3 16 1 2 13 0 1 16 9 4 5 8 8 5 6 7 15 10 11 12\n" + "14 3 9 14 15 12 13 14 7 8 15 14 3 4 7 14 13 16 3 3 16 1 2 13 0 1 16 7 4 5 6 15 8 11 12 8 9 10 11\n" + "14 3 9 14 15 12 13 14 7 8 15 14 3 4 7 14 13 16 3 3 16 1 2 13 0 1 16 7 4 5 6 15 8 9 12 12 9 10 11\n" + "14 3 9 14 15 12 13 14 5 10 15 14 3 4 5 14 13 16 3 3 16 1 2 13 0 1 16 10 5 6 9 9 6 7 8 15 10 11 12\n" + "14 3 9 14 15 12 13 14 5 8 15 14 3 4 5 14 13 16 3 3 16 1 2 13 0 1 16 8 5 6 7 15 8 9 12 12 9 10 11\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 9 4 5 8 9 8 5 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 9 4 5 6 9 9 6 7 8\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 7 4 5 6 7 10 7 8 9\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 5 10 5 8 9 5 6 7 8\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 5 10 5 6 9 9 6 7 8\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 15 5 1 2 16 15 16 2 3 4 5 15 16 4\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 16 16 1 6 7 1 2 5 6 5 2 3 4 8 15 16 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 16 16 1 6 7 1 2 3 6 6 3 4 5 8 15 16 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 16 16 1 4 7 1 2 3 4 7 4 5 6 8 15 16 7\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 16 15 1 2 3 16 15 16 3 4 6 15 4 5\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 16 5 1 2 3 16 5 16 3 4 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 16 5 1 2 3 16 5 16 3 4 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 16 5 1 2 3 16 5 16 3 4 12 13 0 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 1 16 16 1 4 5 1 2 3 4 6 15 16 5 9 6 7 8\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 1 16 16 1 4 5 1 2 3 4 6 15 16 5 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 16 16 1 4 5 1 2 3 4 6 15 16 5 9 10 11 12\n" + "14 3 9 14 9 10 11 14 7 8 9 14 15 6 7 14 11 0 15 15 0 1 16 16 1 4 5 1 2 3 4 6 15 16 5 11 12 13 0\n" + "14 3 9 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 9 10 11 15 16 11 12\n" + "14 3 9 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 16 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 16 8 9 15 10 11 12\n" + "14 3 9 14 11 12 15 14 16 10 11 14 7 8 16 14 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 16 8 9 12 13 0 15\n" + "14 3 9 14 11 15 16 14 9 10 11 14 7 8 9 14 16 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 12 13 15 15 13 0 16\n" + "14 3 9 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 11 16 16 11 12 13\n" + "14 3 9 14 15 12 16 14 9 10 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 11 12 12 13 0 16\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 15 15 2 3 16 16 3 4 5 6 15 16 5\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 0 16 15\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 0 16 15\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 16 16 1 2 5 5 2 3 4 16 5 6 7 8 15 16 7\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 4 4 1 2 3 7 4 5 6 13 0 16 15\n" + "14 3 9 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 2 16 16 2 3 4 6 16 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 16 16 2 3 4 6 16 4 5 15 10 11 12\n" + "14 3 9 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 2 16 16 2 3 4 6 16 4 5 12 13 0 15\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 1 6 6 1 2 5 5 2 3 4 8 16 6 7 15 10 11 12\n" + "14 3 9 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 0 16 15\n" + "14 3 9 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 9 10 11 15 16 11 12\n" + "14 3 9 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 4 4 1 2 3 11 8 9 10 13 0 16 15\n" + "14 3 9 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 16 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 16 8 9 15 10 11 12\n" + "14 3 9 14 11 12 15 14 16 10 11 14 7 8 16 14 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 16 8 9 12 13 0 15\n" + "14 3 9 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 4 4 1 2 3 12 9 10 11 13 0 16 15\n" + "14 3 9 14 11 15 16 14 9 10 11 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 12 13 15 15 13 0 16\n" + "14 3 9 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 4 4 1 2 3 10 11 12 13 13 0 16 15\n" + "14 3 9 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 11 16 16 11 12 13\n" + "14 3 9 14 15 12 16 14 9 10 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 11 12 12 13 0 16\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 2 7 2 5 6 2 3 4 5 13 0 16 15\n" + "14 3 9 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 2 7 2 3 6 6 3 4 5 13 0 16 15\n" + "14 3 9 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 0 5 5 0 1 2 5 2 3 4 10 7 8 9 13 0 16 15\n" + "14 3 9 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 9 10 11 15 16 11 12\n" + "14 3 9 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 2 5 2 3 4 11 8 9 10 13 0 16 15\n" + "14 3 9 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 16 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 16 8 9 15 10 11 12\n" + "14 3 9 14 11 12 15 14 16 10 11 14 7 8 16 14 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 16 8 9 12 13 0 15\n" + "14 3 9 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 2 5 2 3 4 12 9 10 11 13 0 16 15\n" + "14 3 9 14 11 15 16 14 9 10 11 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 12 13 15 15 13 0 16\n" + "14 3 9 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 2 5 2 3 4 10 11 12 13 13 0 16 15\n" + "14 3 9 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 10 11 16 16 11 12 13\n" + "14 3 9 14 15 12 16 14 9 10 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 10 11 12 12 13 0 16\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 4 9 14 13 0 15 15 0 1 16 16 1 2 3 4 15 16 3 9 4 5 8 8 5 6 7\n" + "14 3 9 14 11 12 13 14 7 8 11 14 15 4 7 14 13 0 15 15 0 1 16 16 1 2 3 4 15 16 3 7 4 5 6 11 8 9 10\n" + "14 3 9 14 9 12 13 14 7 8 9 14 15 4 7 14 13 0 15 15 0 1 16 16 1 2 3 4 15 16 3 7 4 5 6 9 10 11 12\n" + "14 3 9 14 9 10 11 14 7 8 9 14 15 4 7 14 11 0 15 15 0 1 16 16 1 2 3 4 15 16 3 7 4 5 6 11 12 13 0\n" + "14 3 9 14 12 13 15 14 10 11 12 14 4 5 10 14 15 16 4 4 16 0 3 3 0 1 2 10 5 6 9 9 6 7 8 13 0 16 15\n" + "14 3 9 14 12 13 15 14 8 9 12 14 4 5 8 14 15 16 4 4 16 0 3 3 0 1 2 8 5 6 7 12 9 10 11 13 0 16 15\n" + "14 3 9 14 11 15 16 14 9 10 11 14 5 6 9 14 16 0 5 5 0 1 4 4 1 2 3 9 6 7 8 11 12 13 15 15 13 0 16\n" + "14 3 9 14 10 13 15 14 8 9 10 14 4 5 8 14 15 16 4 4 16 0 3 3 0 1 2 8 5 6 7 10 11 12 13 13 0 16 15\n" + "14 3 9 14 15 16 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 10 11 16 16 11 12 13\n" + "14 3 9 14 15 12 16 14 9 10 15 14 5 6 9 14 16 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 10 11 12 12 13 0 16\n" + "14 3 9 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 16 7 8 11 11 8 9 10 15 16 11 12\n" + "14 3 9 14 12 13 15 14 6 9 12 14 4 5 6 14 15 16 4 4 16 0 3 3 0 1 2 9 6 7 8 12 9 10 11 13 0 16 15\n" + "14 3 9 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 3 9 14 15 10 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 16 7 8 9 15 16 9 10 10 11 12 13\n" + "14 3 9 14 15 10 11 14 7 16 15 14 5 6 7 14 11 0 5 5 0 1 4 4 1 2 3 16 7 8 9 15 16 9 10 11 12 13 0\n" + "14 3 9 14 11 15 16 14 7 10 11 14 5 6 7 14 16 0 5 5 0 1 4 4 1 2 3 10 7 8 9 11 12 13 15 15 13 0 16\n" + "14 3 9 14 10 13 15 14 6 9 10 14 4 5 6 14 15 16 4 4 16 0 3 3 0 1 2 9 6 7 8 10 11 12 13 13 0 16 15\n" + "14 3 9 14 15 16 13 14 7 10 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 10 11 16 16 11 12 13\n" + "14 3 9 14 15 12 16 14 7 10 15 14 5 6 7 14 16 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 10 11 12 12 13 0 16\n" + "14 3 9 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 10 15 6 16 6 7 8 16 10 16 8 9\n" + "14 3 9 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 15 16 6 9 6 7 8 9 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 10 16 6 9 6 7 8 9 15 10 11 12\n" + "14 3 9 14 11 12 15 14 16 10 11 14 5 6 16 14 15 0 5 5 0 1 4 4 1 2 3 10 16 6 9 6 7 8 9 12 13 0 15\n" + "14 3 9 14 11 12 15 14 16 10 11 14 5 6 16 14 15 0 5 5 0 1 4 4 1 2 3 10 16 6 7 10 7 8 9 12 13 0 15\n" + "14 3 9 14 11 12 15 14 16 8 11 14 5 6 16 14 15 0 5 5 0 1 4 4 1 2 3 8 16 6 7 11 8 9 10 12 13 0 15\n" + "14 3 9 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 15 16 6 7 11 15 7 10 7 8 9 10\n" + "14 3 9 14 9 10 13 14 16 15 9 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 15 16 6 7 9 15 7 8 10 11 12 13\n" + "14 3 9 14 9 10 11 14 16 15 9 14 5 6 16 14 11 0 5 5 0 1 4 4 1 2 3 15 16 6 7 9 15 7 8 11 12 13 0\n" + "14 3 9 14 9 12 15 14 16 8 9 14 5 6 16 14 15 0 5 5 0 1 4 4 1 2 3 8 16 6 7 9 10 11 12 12 13 0 15\n" + "14 3 9 14 15 12 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 8 16 6 7 15 8 9 12 12 9 10 11\n" + "14 3 9 14 15 10 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 8 16 6 7 15 8 9 10 10 11 12 13\n" + "14 3 9 14 15 10 11 14 16 8 15 14 5 6 16 14 11 0 5 5 0 1 4 4 1 2 3 8 16 6 7 15 8 9 10 11 12 13 0\n" + "14 3 9 14 9 10 15 14 16 8 9 14 5 6 16 14 15 0 5 5 0 1 4 4 1 2 3 8 16 6 7 10 13 0 15 10 11 12 13\n" + "14 3 9 14 9 15 16 14 7 8 9 14 5 6 7 14 16 0 5 5 0 1 4 4 1 2 3 9 10 13 15 13 10 11 12 15 13 0 16\n" + "14 3 9 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 8 16 12 8 9 10 16 12 16 10 11\n" + "14 3 9 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 8 11 16 8 9 10 11 16 11 12 13\n" + "14 3 9 14 15 12 16 14 7 8 15 14 5 6 7 14 16 0 5 5 0 1 4 4 1 2 3 15 8 11 12 8 9 10 11 12 13 0 16\n" + "14 3 9 14 10 11 15 14 6 7 10 14 2 3 6 14 15 16 2 2 16 0 1 6 3 4 5 10 7 8 9 11 0 16 15 11 12 13 0\n" + "14 3 9 14 15 12 13 14 7 8 15 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 15 8 16 12 8 9 10 16 12 16 10 11\n" + "14 3 9 14 15 12 16 14 7 8 15 14 3 4 7 14 16 0 3 3 0 1 2 7 4 5 6 15 8 11 12 8 9 10 11 12 13 0 16\n" + "14 3 9 14 8 9 15 14 6 7 8 14 2 3 6 14 15 16 2 2 16 0 1 6 3 4 5 9 0 16 15 9 10 13 0 13 10 11 12\n" + "14 3 9 14 10 11 15 14 4 7 10 14 2 3 4 14 15 16 2 2 16 0 1 7 4 5 6 10 7 8 9 11 0 16 15 11 12 13 0\n" + "14 3 9 14 15 12 13 14 5 16 15 14 3 4 5 14 13 0 3 3 0 1 2 16 5 6 7 15 16 7 12 12 7 8 11 11 8 9 10\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 9 4 5 16 9 16 5 6 7 9 16 7 8\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 16 4 5 8 16 8 5 6 7 10 16 8 9\n" + "14 3 9 14 11 12 13 14 16 15 11 14 3 4 16 14 13 0 3 3 0 1 2 15 16 4 9 4 5 8 9 8 5 6 7 11 15 9 10\n" + "14 3 9 14 15 12 13 14 16 10 15 14 3 4 16 14 13 0 3 3 0 1 2 10 16 4 9 4 5 8 9 8 5 6 7 15 10 11 12\n" + "14 3 9 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 9 4 5 8 9 8 5 6 7 12 13 0 15\n" + "14 3 9 14 15 12 13 14 16 10 15 14 3 4 16 14 13 0 3 3 0 1 2 10 16 4 9 4 5 6 9 9 6 7 8 15 10 11 12\n" + "14 3 9 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 9 4 5 6 9 9 6 7 8 12 13 0 15\n" + "14 3 9 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 7 4 5 6 7 10 7 8 9 12 13 0 15\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 16 4 5 6 16 10 16 6 9 6 7 8 9\n" + "14 3 9 14 9 12 13 14 15 8 9 14 3 4 15 14 13 0 3 3 0 1 2 8 15 4 16 4 5 6 16 8 16 6 7 9 10 11 12\n" + "14 3 9 14 9 10 11 14 15 8 9 14 3 4 15 14 11 0 3 3 0 1 2 8 15 4 16 4 5 6 16 8 16 6 7 11 12 13 0\n" + "14 3 9 14 11 12 15 14 16 8 11 14 3 4 16 14 15 0 3 3 0 1 2 8 16 4 7 4 5 6 7 11 8 9 10 12 13 0 15\n" + "14 3 9 14 9 12 15 14 16 8 9 14 3 4 16 14 15 0 3 3 0 1 2 8 16 4 7 4 5 6 7 9 10 11 12 12 13 0 15\n" + "14 3 9 14 15 12 13 14 16 8 15 14 3 4 16 14 13 0 3 3 0 1 2 8 16 4 7 4 5 6 7 15 8 9 12 12 9 10 11\n" + "14 3 9 14 15 10 11 14 16 8 15 14 3 4 16 14 11 0 3 3 0 1 2 8 16 4 7 4 5 6 7 15 8 9 10 11 12 13 0\n" + "14 3 9 14 9 10 15 14 16 8 9 14 3 4 16 14 15 0 3 3 0 1 2 8 16 4 7 4 5 6 7 10 13 0 15 10 11 12 13\n" + "14 3 9 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 5 10 5 16 9 5 6 7 16 9 16 7 8\n" + "14 3 9 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 5 10 5 8 9 5 6 7 8 12 13 0 15\n" + "14 3 9 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 5 10 5 6 9 9 6 7 8 12 13 0 15\n" + "14 3 9 14 9 10 15 14 16 8 9 14 3 4 16 14 15 0 3 3 0 1 2 8 16 4 5 8 5 6 7 10 13 0 15 10 11 12 13\n" + "14 3 9 14 15 12 13 14 16 6 15 14 3 4 16 14 13 0 3 3 0 1 2 6 16 4 5 15 6 7 12 12 7 10 11 7 8 9 10\n" + "14 3 9 14 15 12 13 14 16 6 15 14 3 4 16 14 13 0 3 3 0 1 2 6 16 4 5 15 6 7 12 12 7 8 11 11 8 9 10\n" + "14 3 9 14 7 8 15 14 16 6 7 14 3 4 16 14 15 0 3 3 0 1 2 6 16 4 5 8 13 0 15 8 9 12 13 12 9 10 11\n" + "14 3 9 14 7 8 15 14 16 6 7 14 3 4 16 14 15 0 3 3 0 1 2 6 16 4 5 8 13 0 15 8 9 10 13 13 10 11 12\n" + "14 3 9 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 11 12 6 7 16 11 16 7 8 9 11 16 9 10\n" + "14 3 9 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 16 12 6 7 10 16 10 7 8 9 12 16 10 11\n" + "14 3 9 14 15 12 16 14 5 6 15 14 3 4 5 14 16 0 3 3 0 1 2 15 6 11 12 6 7 10 11 10 7 8 9 12 13 0 16\n" + "14 3 9 14 15 12 16 14 5 6 15 14 3 4 5 14 16 0 3 3 0 1 2 15 6 11 12 6 7 8 11 11 8 9 10 12 13 0 16\n" + "14 3 9 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 16 12 6 7 8 16 12 16 8 11 8 9 10 11\n" + "14 3 9 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 7 12 12 7 16 11 7 8 9 16 11 16 9 10\n" + "14 3 9 14 7 8 15 14 5 6 7 14 3 4 5 14 15 0 3 3 0 1 2 8 13 0 15 8 9 16 13 16 9 10 11 13 16 11 12\n" + "14 3 9 14 6 7 15 14 4 5 6 14 2 3 4 14 15 16 2 2 16 0 1 7 0 16 15 7 8 13 0 13 8 11 12 8 9 10 11\n" + "14 3 9 14 6 7 15 14 4 5 6 14 2 3 4 14 15 16 2 2 16 0 1 7 0 16 15 7 8 13 0 13 8 9 12 12 9 10 11\n" + "14 3 9 14 6 7 15 14 4 5 6 14 2 3 4 14 15 16 2 2 16 0 1 7 0 16 15 7 8 13 0 13 8 9 10 13 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 16 5 1 2 3 16 5 16 3 4\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 4 5 1 2 3 4 7 16 5 6\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 16 0 1 6 16 6 1 4 5 1 2 3 4 8 16 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 6 7 6 1 4 5 1 2 3 4 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 6 7 6 1 4 5 1 2 3 4 15 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 16 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 6 7 6 1 2 5 5 2 3 4 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 6 7 6 1 2 5 5 2 3 4 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 6 7 6 1 2 3 6 3 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 6 7 6 1 2 3 6 3 4 5 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 4 7 4 1 2 3 7 4 5 6 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 4 7 4 1 2 3 7 4 5 6 15 10 11 12\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 2 3 7 16 3 6 3 4 5 6\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 5 0 1 4 5 4 1 2 3 8 5 6 7 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 6 15 14 13 0 16 6 16 0 5 0 1 4 5 4 1 2 3 10 15 6 7 10 7 8 9\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 4 5 4 1 2 3 15 8 11 12 8 9 10 11\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 4 5 4 1 2 3 15 8 9 12 12 9 10 11\n" + "14 3 9 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 2 7 7 2 16 6 2 3 4 16 6 16 4 5\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 2 7 7 2 5 6 2 3 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 2 7 7 2 5 6 2 3 4 5 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 2 7 7 2 3 6 6 3 4 5 10 15 8 9\n" + "14 3 9 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 2 7 7 2 3 6 6 3 4 5 15 10 11 12\n" + "14 3 9 14 11 12 13 14 15 10 11 14 16 6 15 14 13 0 16 6 16 0 5 0 1 2 5 5 2 3 4 10 15 6 7 10 7 8 9\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 2 5 5 2 3 4 15 8 11 12 8 9 10 11\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 2 5 5 2 3 4 15 8 9 12 12 9 10 11\n" + "14 3 9 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 3 0 1 2 3 6 3 4 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 16 17 4 5 17 2 3 4 17 0 1 2 7 16 5 6 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 2 3 4 15 17 2 16 2 17 0 1 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 15 5 5 15 16 4 15 1 17 16 13 0 1 15 17 1 2 3 4 16 17 3\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 15 5 5 15 16 4 15 17 2 16 13 0 17 15 2 17 0 1 4 16 2 3\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 16 15 15 16 3 4 16 17 2 3 13 0 17 16 2 17 0 1 6 15 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 5 6 15 14 13 16 5 5 16 3 4 16 17 2 3 13 0 17 16 2 17 0 1 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 5 6 7 14 13 16 5 5 16 3 4 16 17 2 3 13 0 17 16 2 17 0 1 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 5 6 7 14 13 16 5 5 16 3 4 16 17 2 3 13 0 17 16 2 17 0 1 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 5 6 7 14 15 16 5 5 16 3 4 16 17 2 3 15 0 17 16 2 17 0 1 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 16 15 7 14 13 17 16 16 17 3 4 17 1 2 3 13 0 1 17 15 16 4 5 7 15 5 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 17 16 16 17 3 4 17 1 2 3 13 0 1 17 6 16 4 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 17 16 16 17 3 4 17 1 2 3 13 0 1 17 6 16 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 17 16 16 17 3 4 17 1 2 3 13 0 1 17 6 16 4 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 16 6 7 14 15 17 16 16 17 3 4 17 1 2 3 15 0 1 17 6 16 4 5 12 13 0 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 16 15 14 5 6 7 14 13 17 5 5 17 3 4 17 1 2 3 13 0 1 17 16 7 8 9 10 15 16 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 5 6 16 14 13 17 5 5 17 3 4 17 1 2 3 13 0 1 17 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 5 6 16 14 13 17 5 5 17 3 4 17 1 2 3 13 0 1 17 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 5 6 16 14 13 17 5 5 17 3 4 17 1 2 3 13 0 1 17 8 16 6 7 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 0 17 4 17 0 1 2 4 17 2 3 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 6 15 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 6 15 16 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 3 17 3 0 1 2 5 17 3 4 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 16 17 4 5 17 0 3 4 3 0 1 2 7 16 5 6 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 6 7 16 14 15 17 6 6 17 4 5 17 0 3 4 3 0 1 2 9 16 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 6 7 8 14 15 17 6 6 17 4 5 17 0 3 4 3 0 1 2 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 6 7 8 14 16 17 6 6 17 4 5 17 0 3 4 3 0 1 2 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 17 3 4 3 17 1 2 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 17 2 3 4 16 17 4 5 6 15 16 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 1 17 17 1 2 3 5 17 3 4 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 16 17 4 5 17 0 1 4 4 1 2 3 7 16 5 6 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 6 7 16 14 15 17 6 6 17 4 5 17 0 1 4 4 1 2 3 9 16 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 6 7 8 14 15 17 6 6 17 4 5 17 0 1 4 4 1 2 3 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 6 7 8 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 17 1 4 4 1 2 3 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 8 9 10 14 6 7 8 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 15 0 17 16 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 17 6 15 16 17 6 17 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 15 16 17 5 7 15 5 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 16 17 2 5 17 0 1 2 5 2 3 4 7 16 5 6 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 6 7 16 14 15 17 6 6 17 2 5 17 0 1 2 5 2 3 4 9 16 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 6 7 8 14 15 17 6 6 17 2 5 17 0 1 2 5 2 3 4 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 6 7 8 14 16 17 6 6 17 2 5 17 0 1 2 5 2 3 4 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 2 5 16 17 1 2 5 2 3 4 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 8 9 10 14 6 7 8 14 16 17 6 6 17 2 5 17 0 1 2 5 2 3 4 15 0 17 16 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 5 2 3 4 5 6 15 16 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 1 17 5 17 1 4 1 2 3 4 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 16 3 4 5 6 15 16 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 1 17 5 17 1 2 5 2 3 4 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 4 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 7 4 5 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 8 9 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 6 9 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 5 6 7 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 5 6 7 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 5 6 7 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 5 6 7 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 10 11 12 13\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 16 15 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 15 16 4 5 7 15 5 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 4 5 8 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 8 5 6 7 13 0 16 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 9 10 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 9 6 7 8 13 0 16 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 10 7 8 9 13 0 16 15\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 11 8 9 10 13 0 16 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 12 9 10 11 13 0 16 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 10 11 12 13 13 0 16 15\n" + "14 4 10 14 10 11 15 14 8 9 10 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 11 0 16 15 11 12 13 0\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 16 17 2 3 17 0 1 2 16 3 4 5 7 16 5 6 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 17 4 5 6 17 7 15 17 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 7 4 5 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 16 17 2 3 17 0 1 2 7 16 3 6 3 4 5 6 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 16 5 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 5 8 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 8 5 6 7 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 15 16 5 6 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 17 16 7 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 7 16 5 6 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 17 16 7 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 7 16 5 6 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 8 15 16 5 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 10 11 12 13\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 16 15 14 17 6 7 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 16 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 9 10 14 16 5 6 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 9 6 7 8 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 17 6 16 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 17 6 16 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 17 6 16 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 8 16 6 7 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 16 5 6 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 17 6 7 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 16 5 6 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 17 6 7 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 17 6 7 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 16 5 6 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 12 9 10 11 13 0 17 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 16 5 6 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 17 6 7 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 15 10 11 16 16 11 12 13\n" + "14 4 10 14 10 11 15 14 8 9 10 14 6 7 8 14 16 5 6 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 11 0 17 15 11 12 13 0\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 17 6 7 8 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 16 5 6 7 9 16 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 4 5 8 14 15 17 4 4 17 2 3 17 0 1 2 8 5 6 7 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 4 5 8 14 16 17 4 4 17 2 3 17 0 1 2 8 5 6 7 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 4 5 8 14 15 16 4 4 16 2 3 16 17 1 2 8 5 6 7 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 8 9 10 14 4 5 8 14 16 17 4 4 17 2 3 17 0 1 2 8 5 6 7 15 0 17 16 12 13 0 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 16 10 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 16 6 7 8 10 16 8 9 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 9 16 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 9 6 7 8 11 16 9 10 13 0 17 15\n" +; + +const char* data_dqrgl_block3 = + "14 4 10 14 15 13 16 14 10 11 15 14 6 9 10 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 9 6 7 8 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 9 10 14 4 5 6 14 15 16 4 4 16 2 3 16 17 1 2 9 6 7 8 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 6 9 10 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 9 6 7 8 15 0 17 16 12 13 0 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 9 16 5 8 5 6 7 8 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 16 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 9 16 5 6 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 7 10 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 7 16 5 6 10 7 8 9 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 15 16 7 8 10 15 8 9\n" + "14 4 10 14 12 13 15 14 8 11 12 14 16 7 8 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 7 16 5 6 11 8 9 10 13 0 17 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 16 7 8 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 7 16 5 6 12 9 10 11 13 0 17 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 16 7 8 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 7 16 5 6 10 11 12 13 13 0 17 15\n" + "14 4 10 14 10 11 15 14 8 9 10 14 16 7 8 14 4 5 16 14 15 17 4 4 17 2 3 17 0 1 2 7 16 5 6 11 0 17 15 11 12 13 0\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 17 8 9 10 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 16 7 8 9 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 6 7 10 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 10 7 8 9 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 4 5 6 14 15 16 4 4 16 2 3 16 17 1 2 10 7 8 9 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 6 7 10 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 10 7 8 9 15 0 17 16 12 13 0 15\n" + "14 4 10 14 12 13 15 14 8 16 12 14 6 7 8 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 16 8 9 10 12 16 10 11 13 0 17 15\n" + "14 4 10 14 15 13 16 14 8 11 15 14 6 7 8 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 11 8 9 10 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 16 17 1 2 11 8 9 10 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 8 11 12 14 6 7 8 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 11 8 9 10 15 0 17 16 12 13 0 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 11 16 7 10 7 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 11 16 7 8 11 8 9 10 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 9 12 14 6 7 16 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 9 16 7 8 12 9 10 11 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 17 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 10 13 15 14 16 9 10 14 6 7 16 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 9 16 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 10 11 15 14 16 9 10 14 6 7 16 14 4 5 6 14 15 17 4 4 17 2 3 17 0 1 2 9 16 7 8 11 0 17 15 11 12 13 0\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 15 9 10 11 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 16 17 1 2 12 9 10 11 13 17 16 15 13 0 1 17\n" + "14 4 10 14 10 15 16 14 8 9 10 14 6 7 8 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 10 11 12 15 15 0 17 16 15 12 13 0\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 15 9 12 13 9 10 11 12 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 17 3 4 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 15 17 4 16 4 17 2 3 17 0 1 2 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 16 0 1 17 17 1 2 3 4 16 17 3\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 15 17 4 16 4 17 0 3 3 0 1 2 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 16 15 15 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 6 15 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 5 6 15 14 13 16 5 5 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 5 6 7 14 13 16 5 5 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 10 15 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 16 15 7 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 15 16 4 5 7 15 5 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 16 6 7 14 15 17 16 16 17 3 4 15 0 3 17 3 0 1 2 6 16 4 5 12 13 0 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 4 5 8 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 8 5 6 7 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 9 10 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 9 6 7 8 13 0 17 15\n" + "14 4 10 14 11 12 15 14 9 10 11 14 16 8 9 14 5 6 16 14 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 8 16 6 7 12 13 0 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 10 7 8 9 13 0 17 15\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 5 6 7 14 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 10 16 8 9 12 13 0 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 7 8 9 14 5 6 7 14 16 17 5 5 17 3 4 16 0 3 17 3 0 1 2 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 5 6 7 14 16 17 5 5 17 3 4 16 0 3 17 3 0 1 2 15 10 11 12 12 13 0 16\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 16 15 15 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 6 15 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 4 7 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 7 4 5 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 8 9 14 15 4 5 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 6 9 14 15 4 5 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 5 6 7 14 15 4 5 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 5 6 7 14 15 4 5 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 5 6 7 14 15 4 5 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 9 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 3 4 15 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 15 4 5 6 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 3 4 5 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 15 6 7 8 10 15 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 17 16 16 17 1 2 13 0 1 17 6 16 2 5 2 3 4 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 17 16 16 17 1 2 13 0 1 17 6 16 2 5 2 3 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 17 16 16 17 1 2 13 0 1 17 6 16 2 5 2 3 4 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 16 6 7 14 15 17 16 16 17 1 2 15 0 1 17 6 16 2 5 2 3 4 5 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 4 15 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 4 5 6 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 4 7 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 7 4 5 6 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 4 7 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 7 4 5 6 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 16 4 7 14 15 17 16 16 17 1 2 15 0 1 17 4 16 2 3 7 4 5 6 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 6 9 14 16 15 5 14 13 17 16 16 17 1 2 13 0 1 17 15 16 2 3 5 15 3 4 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 5 6 7 14 16 15 5 14 13 17 16 16 17 1 2 13 0 1 17 15 16 2 3 5 15 3 4 10 7 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 15 9 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 5 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 8 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 8 5 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 5 8 9 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 8 5 6 7 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 5 8 9 14 16 4 5 14 15 17 16 16 17 1 2 15 0 1 17 4 16 2 3 8 5 6 7 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 4 15 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 8 15 4 5 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 16 4 15 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 6 15 4 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 16 4 15 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 6 15 4 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 16 4 15 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 6 15 4 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 16 4 15 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 6 15 4 5 9 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 6 7 8 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 5 6 9 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 5 6 9 14 16 4 5 14 15 17 16 16 17 1 2 15 0 1 17 4 16 2 3 9 6 7 8 12 13 0 15\n" + "14 4 10 14 11 12 13 14 7 15 11 14 5 6 7 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 7 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 7 10 15 14 5 6 7 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 10 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 10 15 6 9 6 7 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 8 15 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 8 15 6 7 9 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 8 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 8 9 12 12 9 10 11\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 15 4 5 17 17 5 6 7 8 15 17 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 3 4 16 14 13 17 3 3 17 1 2 13 0 1 17 16 4 5 6 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 3 4 16 14 13 17 3 3 17 1 2 13 0 1 17 16 4 5 6 8 16 6 7 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 6 15 14 3 4 16 14 13 17 3 3 17 1 2 13 0 1 17 6 16 4 5 15 6 7 8 10 15 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 3 4 5 14 13 16 3 3 16 1 2 13 0 1 16 15 6 7 17 17 7 8 9 10 15 17 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 16 16 1 17 5 1 2 3 17 5 17 3 4 6 15 16 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 6 7 14 13 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 16 6 7 14 15 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 1 6 6 1 4 5 1 2 3 4 16 17 6 7 8 15 16 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 15 0 1 16 16 1 2 17 17 2 3 4 16 17 4 5 6 15 16 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 1 6 6 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 16 17 0 5 5 0 1 4 4 1 2 3 7 16 5 6 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 5 17 1 4 4 1 2 3 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 6 15 14 13 0 16 16 0 1 17 17 1 2 3 17 3 4 5 6 16 17 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 0 16 16 0 1 17 17 1 2 3 17 3 4 5 6 16 17 5 10 15 8 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 5 17 1 2 5 2 3 4 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 4 15 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 15 4 5 6 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 4 7 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 7 4 5 6 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 16 4 7 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 7 4 5 6 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 16 4 7 14 15 0 16 16 0 1 17 17 1 2 3 4 16 17 3 7 4 5 6 12 13 0 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 8 15 14 16 4 5 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 8 5 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 5 8 9 14 16 4 5 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 8 5 6 7 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 5 8 9 14 16 4 5 14 15 0 16 16 0 1 17 17 1 2 3 4 16 17 3 8 5 6 7 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 16 4 15 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 8 15 4 5 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 16 4 15 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 6 15 4 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 16 4 15 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 6 15 4 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 16 4 15 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 6 15 4 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 16 4 15 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 6 15 4 5 9 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 15 6 7 8 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 5 6 9 14 16 4 5 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 9 6 7 8 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 10 15 14 5 6 7 14 16 4 5 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 10 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 10 15 6 9 6 7 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 10 15 6 7 10 7 8 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 5 8 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 8 5 6 7 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 8 15 16 5 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 10 11 12 13\n" + "14 4 10 14 9 10 11 14 7 8 9 14 15 6 7 14 17 16 15 14 11 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 11 12 13 0\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 16 15 14 17 6 7 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 16 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 9 10 14 16 5 6 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 9 6 7 8 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 17 6 16 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 17 6 16 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 17 6 16 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 8 16 6 7 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 16 8 9 14 17 6 16 14 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 8 16 6 7 12 13 0 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 16 5 6 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 17 6 7 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 16 5 6 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 17 6 7 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 17 6 7 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 17 6 7 14 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 10 16 8 9 12 13 0 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 16 5 6 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 7 8 9 14 17 6 7 14 16 0 17 17 0 1 4 4 1 2 3 6 17 4 5 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 16 5 6 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 17 6 7 14 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 17 6 7 14 16 0 17 17 0 1 4 4 1 2 3 6 17 4 5 15 10 11 12 12 13 0 16\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 17 6 7 8 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 16 5 6 7 9 16 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 4 5 8 14 15 16 4 4 16 17 3 3 17 1 2 8 5 6 7 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 9 10 14 4 5 6 14 15 16 4 4 16 17 3 3 17 1 2 9 6 7 8 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 7 16 7 8 9 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 7 15 16 7 8 10 15 8 9\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 17 8 9 10 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 4 5 6 14 15 17 4 4 17 0 3 3 0 1 2 16 7 8 9 11 16 9 10 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 4 5 6 14 15 16 4 4 16 17 3 3 17 1 2 10 7 8 9 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 3 17 1 2 11 8 9 10 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 16 17 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 10 11 12 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 4 5 6 14 16 17 4 4 17 0 3 3 0 1 2 15 9 10 11 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 3 17 1 2 12 9 10 11 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 10 11 16 16 11 12 17 17 12 13 0\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 5 17 3 4 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 16 4 5 6 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 16 4 5 6 8 16 6 7 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 16 3 6 14 15 17 16 16 17 0 1 3 16 1 2 6 3 4 5 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 17 4 7 14 13 0 17 17 0 1 2 4 17 2 3 7 4 5 6 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 16 3 6 14 15 17 16 16 17 0 1 3 16 1 2 6 3 4 5 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 17 4 7 14 13 0 17 17 0 1 2 4 17 2 3 7 4 5 6 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 17 4 7 14 13 0 17 17 0 1 2 4 17 2 3 7 4 5 6 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 17 4 7 14 15 0 17 17 0 1 2 4 17 2 3 7 4 5 6 10 16 8 9 12 13 0 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 16 3 6 14 15 17 16 16 17 0 1 3 16 1 2 6 3 4 5 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 7 8 9 14 17 4 7 14 16 0 17 17 0 1 2 4 17 2 3 7 4 5 6 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 16 3 6 14 15 17 16 16 17 0 1 3 16 1 2 6 3 4 5 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 17 4 7 14 13 0 17 17 0 1 2 4 17 2 3 7 4 5 6 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 17 4 7 14 16 0 17 17 0 1 2 4 17 2 3 7 4 5 6 15 10 11 12 12 13 0 16\n" + "14 4 10 14 10 11 15 14 8 9 10 14 6 7 8 14 16 3 6 14 15 17 16 16 17 0 1 3 16 1 2 6 3 4 5 11 0 17 15 11 12 13 0\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 8 15 16 3 8 3 4 7 7 4 5 6\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 6 15 16 3 6 3 4 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 6 15 16 3 6 3 4 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 6 15 16 3 6 3 4 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 6 15 16 3 6 3 4 5 10 11 12 13\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 4 7 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 7 4 5 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 4 7 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 7 4 5 6 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 4 7 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 7 4 5 6 10 11 12 13\n" + "14 4 10 14 11 12 13 14 5 8 11 14 15 4 5 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 8 5 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 5 8 9 14 15 4 5 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 8 5 6 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 5 8 9 14 15 4 5 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 8 5 6 7 10 11 12 13\n" + "14 4 10 14 9 10 13 14 5 6 9 14 15 4 5 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 9 6 7 8 10 11 12 13\n" + "14 4 10 14 7 10 13 14 5 6 7 14 15 4 5 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 4 15 16 3 7 8 9 10 10 11 12 13\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 16 15 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 16 5 6 7 10 15 16 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 5 16 15 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 16 5 6 7 8 15 16 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 5 16 15 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 16 5 6 7 8 15 16 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 5 16 15 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 16 5 6 7 8 15 16 7 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 16 15 14 5 8 9 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 8 5 6 7 16 9 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 8 16 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 8 5 6 7 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 5 8 16 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 8 5 6 7 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 5 8 16 14 17 4 5 14 15 0 17 17 0 1 2 4 17 2 3 8 5 6 7 10 16 8 9 12 13 0 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 5 8 9 14 17 4 5 14 16 0 17 17 0 1 2 4 17 2 3 8 5 6 7 11 12 13 15 15 13 0 16\n" + "14 4 10 14 15 12 16 14 9 10 15 14 5 8 9 14 17 4 5 14 16 0 17 17 0 1 2 4 17 2 3 8 5 6 7 15 10 11 12 12 13 0 16\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 8 16 4 5 8 5 6 7 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 16 8 9 14 17 4 16 14 15 0 17 17 0 1 2 4 17 2 3 8 16 4 5 8 5 6 7 12 13 0 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 6 15 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 15 6 7 8 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 6 9 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 16 6 9 14 17 4 16 14 15 0 17 17 0 1 2 4 17 2 3 6 16 4 5 9 6 7 8 12 13 0 15\n" + "14 4 10 14 11 12 13 14 7 8 11 14 16 15 7 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 15 16 4 5 7 15 5 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 16 15 7 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 15 16 4 5 7 15 5 6 9 10 11 12\n" + "14 4 10 14 15 12 13 14 7 10 15 14 16 6 7 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 10 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 7 10 11 14 16 6 7 14 17 4 16 14 15 0 17 17 0 1 2 4 17 2 3 6 16 4 5 10 7 8 9 12 13 0 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 6 15 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 16 6 15 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 8 15 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 16 6 15 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 8 15 6 7 9 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 15 8 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 17 4 16 14 13 0 17 17 0 1 2 4 17 2 3 6 16 4 5 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 16 4 5 14 13 0 16 16 0 1 2 4 16 2 3 10 15 6 17 6 7 8 17 10 17 8 9\n" + "14 4 10 14 15 12 13 14 16 10 15 14 5 6 16 14 17 4 5 14 13 0 17 17 0 1 2 4 17 2 3 10 16 6 9 6 7 8 9 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 3 4 7 14 17 0 3 3 0 1 2 7 4 5 6 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 8 17 14 3 4 5 14 13 0 3 3 0 1 2 8 5 6 7 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 7 4 5 6 7 16 7 8 9 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 16 5 8 9 5 6 7 8 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 16 5 6 9 9 6 7 8 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 16 5 6 7 10 15 16 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 16 5 6 7 8 15 16 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 16 5 6 7 8 15 16 7 9 10 11 12\n" + "14 4 10 14 9 10 11 14 15 8 9 14 17 16 15 14 3 4 17 14 11 0 3 3 0 1 2 16 17 4 5 16 5 6 7 8 15 16 7 11 12 13 0\n" + "14 4 10 14 15 16 17 14 7 10 15 14 5 6 7 14 3 4 5 14 17 0 3 3 0 1 2 10 7 8 9 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 3 4 5 14 13 0 3 3 0 1 2 16 17 6 9 6 7 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 3 4 5 14 13 0 3 3 0 1 2 16 17 6 7 16 7 10 11 7 8 9 10 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 3 4 5 14 13 0 3 3 0 1 2 16 17 6 7 16 7 8 11 11 8 9 10 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 3 4 5 14 13 0 3 3 0 1 2 16 17 6 7 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 3 4 5 14 17 0 3 3 0 1 2 15 8 11 16 8 9 10 11 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 3 4 5 14 17 0 3 3 0 1 2 15 8 9 16 16 9 12 13 9 10 11 12 16 13 0 17\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 3 4 5 14 17 0 3 3 0 1 2 15 8 9 16 16 9 10 13 13 10 11 12 16 13 0 17\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 7 16 17 6 17 0 5 6 5 0 1 4 4 1 2 3 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 6 15 0 16 0 1 17 16 17 1 2 3 17 3 4 5 6 16 17 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 7 16 17 6 17 0 5 6 5 0 1 2 5 2 3 4 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 7 16 17 6 17 0 3 6 3 0 1 2 6 3 4 5 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 15 6 7 14 13 0 15 6 15 0 16 0 1 17 16 17 1 2 3 16 17 3 4 6 16 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 16 17 0 5 0 1 4 5 4 1 2 3 16 5 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 16 7 8 14 15 17 16 7 16 17 4 17 0 3 4 3 0 1 2 7 4 5 6 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 17 0 1 2 17 17 2 3 4 6 17 4 5 10 15 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 17 16 15 14 13 0 17 16 17 0 3 0 1 2 3 16 3 4 5 8 15 16 5 8 5 6 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 4 5 6 15 17 4 16 4 17 2 3 17 0 1 2 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 16 4 5 13 0 16 15 16 0 1 17 17 1 2 3 4 16 17 3\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 4 5 6 15 17 4 16 4 17 0 3 3 0 1 2 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 17 16 5 13 0 17 15 17 0 1 2 16 17 2 3 5 16 3 4\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 15 17 4 16 13 0 17 15 17 0 1 2 4 17 2 3 6 16 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 16 17 4 5 13 0 17 16 17 0 1 2 4 17 2 3 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 16 17 4 5 13 0 17 16 17 0 1 2 4 17 2 3 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 16 17 4 5 13 0 17 16 17 0 1 2 4 17 2 3 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 15 16 7 7 16 5 6 16 17 4 5 15 0 17 16 17 0 1 2 4 17 2 3 12 13 0 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 2 3 6 15 17 2 16 2 17 0 1 6 3 4 5 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 17 16 3 4 5 13 0 3 16 3 0 1 2 17 5 6 7 8 15 17 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 17 6 16 3 4 17 13 0 3 16 3 0 1 2 6 17 4 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 17 6 16 3 4 17 13 0 3 16 3 0 1 2 6 17 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 17 6 16 3 4 17 13 0 3 16 3 0 1 2 6 17 4 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 15 16 7 7 16 17 6 16 3 4 17 15 0 3 16 3 0 1 2 6 17 4 5 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 17 16 16 17 5 6 17 3 4 5 13 0 3 17 3 0 1 2 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 17 16 16 17 5 6 17 3 4 5 13 0 3 17 3 0 1 2 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 17 16 16 17 5 6 17 3 4 5 13 0 3 17 3 0 1 2 8 16 6 7 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 16 8 9 14 15 17 16 16 17 5 6 17 3 4 5 15 0 3 17 3 0 1 2 8 16 6 7 12 13 0 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 17 7 7 17 5 6 17 3 4 5 13 0 3 17 3 0 1 2 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 4 5 16 2 3 4 15 17 2 16 2 17 0 1 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 17 7 7 17 5 6 17 3 4 5 13 0 3 17 3 0 1 2 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 17 7 7 17 5 6 17 3 4 5 13 0 3 17 3 0 1 2 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 15 17 7 7 17 5 6 17 3 4 5 15 0 3 17 3 0 1 2 10 16 8 9 12 13 0 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 4 5 16 2 3 4 15 17 2 16 2 17 0 1 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 7 8 9 14 16 17 7 7 17 5 6 17 3 4 5 16 0 3 17 3 0 1 2 11 12 13 15 15 13 0 16\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 16 17 7 7 17 5 6 17 3 4 5 16 0 3 17 3 0 1 2 15 10 11 12 12 13 0 16\n" + "14 4 10 14 10 11 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 2 3 4 15 17 2 16 2 17 0 1 11 0 17 15 11 12 13 0\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 1 16 5 13 0 1 15 16 1 2 17 17 2 3 4 5 16 17 4\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 15 1 17 16 13 0 1 15 17 1 2 5 5 2 3 4 6 16 17 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 15 1 17 16 13 0 1 15 17 1 2 3 17 3 4 5 6 16 17 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 16 1 17 5 13 0 1 16 17 1 2 3 5 17 3 4 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 16 1 17 5 13 0 1 16 17 1 2 3 5 17 3 4 10 15 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 15 1 17 16 13 0 1 15 17 1 2 3 6 16 17 3 6 3 4 5\n" + "14 4 10 14 11 12 13 14 7 10 11 14 5 6 7 14 13 15 5 5 15 16 4 15 1 17 16 13 0 1 15 17 1 2 3 4 16 17 3 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 5 6 7 14 13 15 5 5 15 16 4 15 1 17 16 13 0 1 15 17 1 2 3 4 16 17 3 11 8 9 10\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 17 6 16 1 4 17 13 0 1 16 4 1 2 3 6 17 4 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 17 6 16 1 4 17 13 0 1 16 4 1 2 3 6 17 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 17 6 16 1 4 17 13 0 1 16 4 1 2 3 6 17 4 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 15 16 7 7 16 17 6 16 1 4 17 15 0 1 16 4 1 2 3 6 17 4 5 12 13 0 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 17 16 16 17 5 6 17 1 4 5 13 0 1 17 4 1 2 3 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 17 16 16 17 5 6 17 1 4 5 13 0 1 17 4 1 2 3 8 16 6 7 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 16 8 9 14 15 17 16 16 17 5 6 17 1 4 5 15 0 1 17 4 1 2 3 8 16 6 7 12 13 0 15\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 17 7 7 17 5 6 17 1 4 5 13 0 1 17 4 1 2 3 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 15 17 7 7 17 5 6 17 1 4 5 15 0 1 17 4 1 2 3 10 16 8 9 12 13 0 15\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 16 17 7 7 17 5 6 17 1 4 5 16 0 1 17 4 1 2 3 15 10 11 12 12 13 0 16\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 15 16 4 5 13 0 16 15 4 16 0 17 0 1 2 17 4 17 2 3\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 15 17 4 16 13 0 17 15 4 17 0 3 0 1 2 3 6 16 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 16 17 4 5 13 0 17 16 4 17 0 3 0 1 2 3 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 16 17 4 5 13 0 17 16 4 17 0 3 0 1 2 3 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 16 17 4 5 13 0 17 16 4 17 0 3 0 1 2 3 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 16 17 4 5 13 0 17 16 4 17 0 1 4 1 2 3 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 16 17 4 5 13 0 17 16 4 17 0 1 4 1 2 3 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 16 17 4 5 13 0 17 16 4 17 0 1 4 1 2 3 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 15 16 7 7 16 5 6 16 17 4 5 15 0 17 16 4 17 0 1 4 1 2 3 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 3 4 16 17 2 3 13 0 17 16 2 17 0 1 8 15 4 7 4 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 3 4 16 17 2 3 13 0 17 16 2 17 0 1 8 15 4 5 8 5 6 7\n" + "14 4 10 14 9 10 15 14 7 8 9 14 5 6 7 14 15 16 5 5 16 3 4 16 17 2 3 15 0 17 16 2 17 0 1 10 13 0 15 10 11 12 13\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 3 4 16 1 2 3 13 0 1 16 8 15 4 17 4 5 6 17 8 17 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 5 6 0 1 15 5 15 1 17 16 1 2 3 17 16 17 3 4 5 15 16 4\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 17 5 1 2 3 17 5 17 3 4 6 15 16 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 4 17 1 2 3 4 6 15 16 17 6 17 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 16 6 0 1 17 16 17 1 4 5 1 2 3 4 6 16 17 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 17 16 17 1 4 5 1 2 3 4 6 16 17 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 17 16 17 1 4 5 1 2 3 4 6 16 17 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 6 17 6 1 4 5 1 2 3 4 16 17 6 7 8 15 16 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 16 17 8 9 10 15 16 9\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 16 17 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 17 17 2 3 4 16 17 4 5 6 15 16 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 5 6 5 0 1 17 17 1 2 3 5 17 3 4 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 17 17 2 3 4 15 16 17 4 6 15 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 5 6 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 5 6 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 17 6 17 0 1 4 4 1 2 3 6 17 4 5 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 17 17 2 3 4 6 15 16 17 6 17 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 16 6 0 1 17 16 17 1 2 5 5 2 3 4 6 16 17 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 5 5 2 3 4 6 16 17 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 5 5 2 3 4 6 16 17 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 6 17 6 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 5 17 5 0 1 4 4 1 2 3 7 17 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 6 7 17 0 5 6 5 0 1 4 4 1 2 3 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 6 7 17 0 5 6 5 0 1 4 4 1 2 3 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 6 7 17 0 5 6 5 0 1 4 4 1 2 3 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 17 5 6 5 17 1 4 4 1 2 3 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 3 16 3 4 17 6 15 16 17 6 17 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 16 6 0 1 17 16 17 1 2 3 17 3 4 5 6 16 17 5 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 3 17 3 4 5 6 16 17 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 3 17 3 4 5 6 16 17 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 6 7 17 0 5 6 5 0 1 2 5 2 3 4 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 6 7 17 0 5 6 5 0 1 2 5 2 3 4 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 6 7 17 0 5 6 5 0 1 2 5 2 3 4 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 17 5 6 5 17 1 2 5 2 3 4 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 17 4 5 6 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 3 17 3 0 1 2 17 3 4 5 7 17 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 6 7 17 0 3 6 3 0 1 2 6 3 4 5 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 6 7 17 0 3 6 3 0 1 2 6 3 4 5 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 6 7 17 0 3 6 3 0 1 2 6 3 4 5 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 17 3 6 3 17 1 2 6 3 4 5 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 3 15 16 3 17 3 4 5 17 6 15 17 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 17 6 17 0 1 2 6 17 2 5 2 3 4 5 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 3 16 17 3 4 6 16 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 3 16 17 3 4 6 16 4 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 8 16 6 7 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 4 5 16 0 17 4 17 0 1 2 4 17 2 3 10 7 8 9 13 0 16 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 4 5 16 0 17 4 17 0 1 2 4 17 2 3 11 8 9 10 13 0 16 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 10 16 8 9 15 10 11 12\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 4 5 16 0 17 4 17 0 1 2 4 17 2 3 12 9 10 11 13 0 16 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 16 0 17 4 17 0 1 2 4 17 2 3 10 11 12 13 13 0 16 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 15 10 11 16 16 11 12 13\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 3 6 16 17 3 6 3 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 17 16 17 1 2 3 6 16 17 3 6 3 4 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 16 15 16 1 2 17 6 15 16 17 6 17 2 5 2 3 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 6 9 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 17 4 15 16 17 4 17 2 3 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 17 4 15 16 17 4 17 2 3 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 17 4 15 16 17 4 17 2 3 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 17 4 15 16 17 4 17 2 3 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 15 4 0 1 16 15 16 1 2 17 4 15 16 17 4 17 2 3 10 11 12 13\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 8 15 4 5 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 6 15 4 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 6 15 4 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 6 15 4 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 6 15 4 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 6 15 4 5 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 7 15 11 14 5 6 7 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 15 7 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 7 10 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 10 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 10 15 6 9 6 7 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 5 6 15 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 8 15 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 8 15 6 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 5 6 15 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 8 15 6 7 10 11 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 15 8 9 10 15 10 11 12\n" + "14 4 10 14 9 15 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 9 10 11 15 15 11 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3 15 8 9 10 10 11 12 13\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 5 16 0 1 4 5 4 1 2 3 16 5 6 17 8 15 16 17 8 17 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 5 17 0 1 4 5 4 1 2 3 17 5 6 7 15 16 17 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 5 17 0 1 4 5 4 1 2 3 17 5 6 7 8 16 17 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 5 17 0 1 4 5 4 1 2 3 17 5 6 7 8 16 17 7 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 4 7 17 0 3 4 3 0 1 2 7 4 5 6 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 4 7 17 0 3 4 3 0 1 2 7 4 5 6 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 4 7 17 0 3 4 3 0 1 2 7 4 5 6 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 4 7 16 17 3 4 3 17 1 2 7 4 5 6 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 16 5 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 3 17 3 0 1 2 7 17 3 4 7 4 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 8 15 16 5 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 6 15 16 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 6 15 16 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 6 15 16 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 6 15 16 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 4 17 4 1 2 3 16 17 4 5 6 15 16 5 10 11 12 13\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 8 16 6 7 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 17 5 16 0 3 17 3 0 1 2 5 17 3 4 10 7 8 9 13 0 16 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 17 5 16 0 3 17 3 0 1 2 5 17 3 4 11 8 9 10 13 0 16 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 17 5 16 0 3 17 3 0 1 2 5 17 3 4 12 9 10 11 13 0 16 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 3 17 3 0 1 2 5 17 3 4 10 11 12 13 13 0 16 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 15 10 11 16 16 11 12 13\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 5 6 0 1 4 5 4 1 2 3 15 16 6 17 6 7 8 17 9 15 17 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 9 6 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 4 5 17 0 3 4 3 0 1 2 9 16 5 8 5 6 7 8 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 16 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 4 5 17 0 3 4 3 0 1 2 9 16 5 6 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 7 10 14 15 17 16 16 17 4 5 17 0 3 4 3 0 1 2 7 16 5 6 10 7 8 9 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 15 16 7 8 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 17 16 9 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 9 16 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 10 15 16 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 8 15 16 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 8 15 16 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 16 17 6 7 8 15 16 7 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 16 15 14 17 8 9 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 16 7 8 14 15 17 16 16 17 4 5 17 0 3 4 3 0 1 2 7 16 5 6 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 17 8 16 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 10 16 8 9 15 10 11 12\n" + "14 4 10 14 12 13 15 14 8 9 12 14 16 7 8 14 15 17 16 16 17 4 5 17 0 3 4 3 0 1 2 7 16 5 6 12 9 10 11 13 0 17 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 4 5 17 0 3 4 3 0 1 2 7 16 5 6 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 17 8 9 14 13 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 8 9 10 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 4 5 17 0 3 4 3 0 1 2 16 7 8 9 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 6 7 10 14 16 17 6 6 17 4 5 17 0 3 4 3 0 1 2 10 7 8 9 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 4 5 16 17 3 4 3 17 1 2 10 7 8 9 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 16 9 10 17 15 16 17 12 12 17 10 11\n" + "14 4 10 14 15 16 13 14 9 17 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 9 10 11 15 17 11 16 16 11 12 13\n" + "14 4 10 14 15 13 16 14 8 11 15 14 6 7 8 14 16 17 6 6 17 4 5 17 0 3 4 3 0 1 2 11 8 9 10 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 4 5 16 17 3 4 3 17 1 2 11 8 9 10 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 16 8 17 8 9 10 17 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 16 17 8 11 8 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 4 5 17 0 3 4 3 0 1 2 11 16 7 10 7 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 4 5 17 0 3 4 3 0 1 2 11 16 7 8 11 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 16 17 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 16 17 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 16 17 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 10 13 15 14 16 9 10 14 6 7 16 14 15 17 6 6 17 4 5 17 0 3 4 3 0 1 2 9 16 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 17 10 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 17 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 16 17 6 6 17 4 5 17 0 3 4 3 0 1 2 15 9 10 11 15 11 12 13 13 0 17 16\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 16 17 6 6 17 4 5 17 0 3 4 3 0 1 2 15 9 12 13 9 10 11 12 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 17 5 6 5 17 3 4 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 15 2 17 16 2 3 4 17 16 17 4 5 6 15 16 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 2 17 17 2 5 6 2 3 4 5 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 17 1 4 5 1 2 3 4 7 17 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 6 7 17 0 1 6 6 1 4 5 1 2 3 4 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 6 7 17 0 1 6 6 1 4 5 1 2 3 4 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 6 7 17 0 1 6 6 1 4 5 1 2 3 4 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 15 16 14 10 11 12 14 8 9 10 14 16 17 8 8 17 6 7 17 0 1 6 6 1 4 5 1 2 3 4 15 0 17 16 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 15 2 3 16 16 3 4 17 6 15 16 17 6 17 4 5\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 17 1 2 5 5 2 3 4 7 17 5 6 13 0 16 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 6 7 17 0 1 6 6 1 2 5 5 2 3 4 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 6 7 17 0 1 6 6 1 2 5 5 2 3 4 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 16 17 1 6 6 1 2 5 5 2 3 4 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 8 9 10 14 16 17 8 8 17 6 7 17 0 1 6 6 1 2 5 5 2 3 4 15 0 17 16 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 2 17 17 2 3 4 16 17 4 7 4 5 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 17 1 2 3 7 17 3 6 3 4 5 6 13 0 16 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 17 1 2 3 7 17 3 4 7 4 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 2 17 17 2 3 4 16 17 4 5 8 15 16 5 8 5 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 5 6 0 1 2 5 5 2 3 4 15 16 6 17 6 7 8 17 9 15 17 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 9 6 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 4 5 17 0 1 4 4 1 2 3 9 16 5 8 5 6 7 8 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 7 16 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 4 5 17 0 1 4 4 1 2 3 9 16 5 6 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 7 10 14 15 17 16 16 17 4 5 17 0 1 4 4 1 2 3 7 16 5 6 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 9 10 15 14 17 16 9 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 7 9 16 7 8 15 10 11 12\n" +; + +const char* data_dqrgl_block4 = + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 7 10 15 16 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 17 16 15 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 16 15 14 17 8 9 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 16 7 8 14 15 17 16 16 17 4 5 17 0 1 4 4 1 2 3 7 16 5 6 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 17 8 16 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 10 16 8 9 15 10 11 12\n" + "14 4 10 14 10 13 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 4 5 17 0 1 4 4 1 2 3 7 16 5 6 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 17 8 9 14 13 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 15 10 11 16 16 11 12 13\n" + "14 4 10 14 10 11 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 4 5 17 0 1 4 4 1 2 3 7 16 5 6 11 0 17 15 11 12 13 0\n" + "14 4 10 14 15 13 16 14 10 11 15 14 6 7 10 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 10 7 8 9 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 4 5 16 17 1 4 4 1 2 3 10 7 8 9 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 6 7 10 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 10 7 8 9 15 0 17 16 12 13 0 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 16 9 10 17 15 16 17 12 12 17 10 11\n" + "14 4 10 14 15 16 13 14 9 17 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 9 10 11 15 17 11 16 16 11 12 13\n" + "14 4 10 14 15 13 16 14 8 11 15 14 6 7 8 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 11 8 9 10 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 15 16 14 8 11 12 14 6 7 8 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 11 8 9 10 15 0 17 16 12 13 0 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 16 8 17 8 9 10 17 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 16 17 8 11 8 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 4 5 17 0 1 4 4 1 2 3 11 16 7 10 7 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 4 5 17 0 1 4 4 1 2 3 11 16 7 8 11 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 16 17 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 16 17 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 16 17 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 10 13 15 14 16 9 10 14 6 7 16 14 15 17 6 6 17 4 5 17 0 1 4 4 1 2 3 9 16 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 17 10 15 14 7 8 17 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 17 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 10 11 15 14 16 9 10 14 6 7 16 14 15 17 6 6 17 4 5 17 0 1 4 4 1 2 3 9 16 7 8 11 0 17 15 11 12 13 0\n" + "14 4 10 14 10 15 16 14 8 9 10 14 6 7 8 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 10 11 12 15 15 0 17 16 15 12 13 0\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 16 17 6 6 17 4 5 17 0 1 4 4 1 2 3 15 9 12 13 9 10 11 12 13 0 17 16\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 17 17 4 5 6 16 17 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 2 7 16 0 1 2 7 2 3 17 17 3 4 5 7 17 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 7 7 4 5 6 8 16 17 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 7 7 4 5 6 8 16 17 7 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 2 7 17 0 1 2 7 2 3 6 6 3 4 5 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 2 7 17 0 1 2 7 2 3 6 6 3 4 5 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 2 7 17 0 1 2 7 2 3 6 6 3 4 5 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 2 7 16 17 1 2 7 2 3 6 6 3 4 5 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 8 9 10 14 16 17 8 8 17 2 7 17 0 1 2 7 2 3 6 6 3 4 5 15 0 17 16 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 5 16 5 6 17 8 15 16 17 8 17 6 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 17 5 6 7 15 16 17 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 17 5 6 7 8 16 17 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 17 5 6 7 8 16 17 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 2 7 17 0 1 2 7 2 3 4 7 4 5 6 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 2 7 17 0 1 2 7 2 3 4 7 4 5 6 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 2 7 16 17 1 2 7 2 3 4 7 4 5 6 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 15 16 14 10 11 12 14 8 9 10 14 16 17 8 8 17 2 7 17 0 1 2 7 2 3 4 7 4 5 6 15 0 17 16 12 13 0 15\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 8 16 17 5 8 5 6 7 15 10 11 12\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 17 6 15 16 17 6 17 4 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 17 6 15 16 17 6 17 4 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 17 6 15 16 17 6 17 4 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 3 16 0 1 2 3 16 3 4 17 6 15 16 17 6 17 4 5 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 6 9 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 7 8 11 14 16 15 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 15 16 17 5 7 15 5 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 15 16 17 5 7 15 5 6 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 15 16 17 5 7 15 5 6 10 11 12 13\n" + "14 4 10 14 11 12 13 14 7 15 11 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 15 7 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 7 10 15 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 10 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 6 15 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 16 6 15 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 8 15 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 16 6 15 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 8 15 6 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 16 6 15 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 8 15 6 7 10 11 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 15 8 9 10 15 10 11 12\n" + "14 4 10 14 9 15 13 14 7 8 9 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 9 10 11 15 15 11 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5 15 8 9 10 10 11 12 13\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 16 17 6 7 16 7 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 2 5 17 0 1 2 5 2 3 4 9 16 5 6 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 7 10 14 15 17 16 16 17 2 5 17 0 1 2 5 2 3 4 7 16 5 6 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 9 10 15 14 17 16 9 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 16 17 6 7 9 16 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 16 17 6 7 10 15 16 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 17 16 15 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 16 17 6 7 8 15 16 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 16 17 6 7 8 15 16 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 16 17 6 7 8 15 16 7 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 16 15 14 17 8 9 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 16 9 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 17 8 16 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 10 16 8 9 15 10 11 12\n" + "14 4 10 14 10 13 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 2 5 17 0 1 2 5 2 3 4 7 16 5 6 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 17 8 9 14 13 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 15 10 11 16 16 11 12 13\n" + "14 4 10 14 10 11 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 2 5 17 0 1 2 5 2 3 4 7 16 5 6 11 0 17 15 11 12 13 0\n" + "14 4 10 14 15 13 16 14 10 11 15 14 6 7 10 14 16 17 6 6 17 2 5 17 0 1 2 5 2 3 4 10 7 8 9 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 15 16 14 10 11 12 14 6 7 10 14 16 17 6 6 17 2 5 17 0 1 2 5 2 3 4 10 7 8 9 15 0 17 16 12 13 0 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 16 9 10 17 15 16 17 12 12 17 10 11\n" + "14 4 10 14 15 16 13 14 9 17 15 14 7 8 9 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 9 10 11 15 17 11 16 16 11 12 13\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 16 8 17 8 9 10 17 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 16 17 8 11 8 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 2 5 17 0 1 2 5 2 3 4 11 16 7 10 7 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 2 5 17 0 1 2 5 2 3 4 11 16 7 8 11 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 16 17 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 16 17 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 16 17 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 10 13 15 14 16 9 10 14 6 7 16 14 15 17 6 6 17 2 5 17 0 1 2 5 2 3 4 9 16 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 17 10 15 14 7 8 17 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 17 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 10 11 15 14 16 9 10 14 6 7 16 14 15 17 6 6 17 2 5 17 0 1 2 5 2 3 4 9 16 7 8 11 0 17 15 11 12 13 0\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 16 17 6 6 17 2 5 17 0 1 2 5 2 3 4 15 9 12 13 9 10 11 12 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 4 7 16 17 3 4 7 4 5 6 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 15 6 0 1 2 15 6 15 2 16 2 3 17 16 17 3 4 5 6 16 17 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 7 2 3 6 7 6 3 4 5 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 7 17 1 6 1 2 5 6 5 2 3 4 13 0 16 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 7 17 1 6 1 2 3 6 6 3 4 5 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 5 2 3 4 5 16 5 6 7 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 7 17 1 4 1 2 3 4 7 4 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 16 6 0 1 2 16 6 16 2 17 2 3 4 17 6 17 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 16 6 0 1 2 16 6 16 2 17 2 3 4 17 6 17 4 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 5 2 3 4 5 6 15 16 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 5 2 3 4 5 6 15 16 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 5 2 3 4 5 6 15 16 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 5 2 3 4 5 6 15 16 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 5 2 3 4 5 6 15 16 5 10 11 12 13\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 16 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 8 16 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 16 9 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 1 17 5 17 1 4 1 2 3 4 10 11 12 13 13 0 16 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 15 10 11 16 16 11 12 13\n" + "14 4 10 14 10 11 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 1 17 5 17 1 4 1 2 3 4 11 0 16 15 11 12 13 0\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 16 3 6 7 3 4 5 6 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 7 17 1 2 7 2 5 6 2 3 4 5 13 0 16 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 16 3 4 7 7 4 5 6 8 15 16 7\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 16 0 1 17 7 17 1 2 7 2 3 6 6 3 4 5 13 0 16 15\n" + "14 4 10 14 11 12 13 14 7 10 11 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 16 3 4 5 6 15 16 5 10 7 8 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 16 3 4 5 6 15 16 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 16 3 4 5 6 15 16 5 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 6 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 16 3 4 5 6 15 16 5 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 16 9 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 1 17 5 17 1 2 5 2 3 4 10 11 12 13 13 0 16 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 15 10 11 16 16 11 12 13\n" + "14 4 10 14 10 11 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 17 5 16 0 1 17 5 17 1 2 5 2 3 4 11 0 16 15 11 12 13 0\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 4 9 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 9 4 5 8 8 5 6 7\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 4 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 7 4 5 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 4 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 7 4 5 6 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 15 4 7 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 7 4 5 6 10 11 12 13\n" + "14 4 10 14 9 12 13 14 5 8 9 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 8 5 6 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 5 8 9 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 8 5 6 7 10 11 12 13\n" + "14 4 10 14 11 12 13 14 5 6 11 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 11 6 9 10 6 7 8 9\n" + "14 4 10 14 11 12 13 14 5 6 11 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 11 6 7 10 10 7 8 9\n" + "14 4 10 14 9 10 13 14 5 6 9 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 9 6 7 8 10 11 12 13\n" + "14 4 10 14 7 12 13 14 5 6 7 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 7 8 11 12 11 8 9 10\n" + "14 4 10 14 7 12 13 14 5 6 7 14 15 4 5 14 13 0 15 15 0 17 16 0 1 2 17 16 17 2 3 4 15 16 3 7 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 8 16 4 5 8 5 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 6 9 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 15 16 4 5 9 15 5 8 5 6 7 8\n" + "14 4 10 14 11 12 13 14 7 8 11 14 16 15 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 15 16 4 5 7 15 5 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 15 16 4 5 7 15 5 6 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 15 16 4 5 7 15 5 6 10 11 12 13\n" + "14 4 10 14 11 12 13 14 7 15 11 14 16 6 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 15 7 8 9 11 15 9 10\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 6 15 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 16 6 15 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 8 15 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 16 6 15 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 8 15 6 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 16 6 15 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 8 15 6 7 10 11 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 15 8 9 10 15 10 11 12\n" + "14 4 10 14 9 15 13 14 7 8 9 14 16 6 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 9 10 11 15 15 11 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 16 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 6 7 8 15 10 11 16 16 11 12 13\n" + "14 4 10 14 11 12 13 14 7 15 11 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 7 8 17 17 8 9 10 11 15 17 10\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 16 7 8 11 11 8 9 10 15 16 11 12\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 16 7 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 16 7 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 16 13 14 7 10 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 7 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 10 15 6 17 6 7 8 17 10 17 8 9\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 15 16 6 9 6 7 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 16 6 9 6 7 8 9 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 8 16 6 7 15 8 9 10 15 10 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 15 16 6 7 11 15 7 10 7 8 9 10\n" + "14 4 10 14 9 10 13 14 16 15 9 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 15 16 6 7 9 15 7 8 10 11 12 13\n" + "14 4 10 14 9 15 13 14 16 8 9 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 8 16 6 7 9 10 11 15 15 11 12 13\n" + "14 4 10 14 15 12 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 8 16 6 7 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 8 16 6 7 15 8 9 10 10 11 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 8 9 17 17 9 10 11 15 17 11 12\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 15 8 9 10 15 10 11 16 16 11 12 13\n" + "14 4 10 14 9 15 13 14 7 8 9 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 9 10 17 15 17 10 11 12 15 17 12 13\n" + "14 4 10 14 8 13 15 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 8 9 12 13 12 9 10 11 13 0 16 15\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 16 4 0 1 2 16 4 16 2 3 15 8 17 12 8 9 10 17 12 17 10 11\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 15 8 11 16 8 9 10 11 16 11 12 13\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 17 4 0 1 2 17 4 17 2 3 15 8 9 16 16 9 12 13 9 10 11 12\n" + "14 4 10 14 8 9 15 14 6 7 8 14 4 5 6 14 15 16 4 4 16 17 3 16 0 1 17 3 17 1 2 9 0 16 15 9 10 13 0 13 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 17 4 5 8 17 8 5 6 7 9 15 17 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 9 4 5 8 9 8 5 6 7 10 15 16 9\n" + "14 4 10 14 11 12 13 14 7 8 11 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 17 4 5 6 17 7 15 17 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 17 4 5 6 17 7 15 17 6 9 10 11 12\n" + "14 4 10 14 9 10 13 14 7 8 9 14 16 15 7 14 13 0 16 16 0 3 4 0 1 2 3 15 16 4 17 4 5 6 17 7 15 17 6 10 11 12 13\n" + "14 4 10 14 15 12 13 14 9 10 15 14 17 16 9 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 7 4 5 6 7 9 16 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 8 11 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 7 4 5 6 7 8 15 16 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 7 4 5 6 7 8 15 16 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 7 4 5 6 7 8 15 16 7 10 11 12 13\n" + "14 4 10 14 11 12 13 14 16 15 11 14 17 8 16 14 13 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7 10 16 8 9 15 10 11 12\n" + "14 4 10 14 10 13 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 2 3 17 0 1 2 7 16 3 6 3 4 5 6 10 11 12 13 13 0 17 15\n" + "14 4 10 14 10 11 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 2 3 17 0 1 2 7 16 3 6 3 4 5 6 11 0 17 15 11 12 13 0\n" + "14 4 10 14 15 12 13 14 9 10 15 14 17 16 9 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 9 16 5 8 5 6 7 8 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 17 16 7 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 7 16 5 6 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 17 16 7 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 7 16 5 6 15 8 9 12 12 9 10 11\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 10 15 16 5 10 5 6 9 9 6 7 8\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 8 15 16 5 8 5 6 7 9 10 11 12\n" + "14 4 10 14 9 10 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 8 15 16 5 8 5 6 7 10 11 12 13\n" + "14 4 10 14 11 12 13 14 15 6 11 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 11 6 7 10 10 7 8 9\n" + "14 4 10 14 7 12 13 14 15 6 7 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 7 8 11 12 11 8 9 10\n" + "14 4 10 14 7 12 13 14 15 6 7 14 17 16 15 14 13 0 17 17 0 3 4 0 1 2 3 16 17 4 5 6 15 16 5 7 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 16 8 15 14 17 6 16 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 8 16 6 7 15 8 9 10 15 10 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 17 6 16 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 15 16 6 7 11 15 7 10 7 8 9 10\n" + "14 4 10 14 15 12 13 14 16 8 15 14 17 6 16 14 13 0 17 17 0 3 4 0 1 2 3 6 17 4 5 8 16 6 7 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 15 8 9 17 17 9 10 11 15 17 11 12\n" + "14 4 10 14 8 13 15 14 6 7 8 14 16 5 6 14 15 17 16 16 17 2 3 17 0 1 2 5 16 3 4 8 9 12 13 12 9 10 11 13 0 17 15\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 3 4 0 1 2 3 6 16 4 5 15 8 17 12 8 9 10 17 12 17 10 11\n" + "14 4 10 14 15 16 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 3 4 0 1 2 3 9 6 7 8 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 17 17 8 9 10 15 16 17 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 17 17 8 9 10 15 16 17 12 12 17 10 11\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 9 15 16 9 17 9 10 11 17 15 17 11 12\n" + "14 4 10 14 15 16 13 14 7 17 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 17 7 8 9 15 17 9 10 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 16 7 8 17 15 16 17 12 12 17 8 11 8 9 10 11\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 3 4 0 1 2 3 10 15 6 16 6 7 17 16 17 7 8 9 10 16 17 9\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 15 16 6 17 6 7 10 17 10 7 8 9 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 11 6 7 10 11 10 7 8 9 15 16 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 15 16 6 17 6 7 8 17 17 8 9 10 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 9 6 7 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 9 10 13 14 16 15 9 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 15 16 6 17 6 7 8 17 9 15 17 8 10 11 12 13\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 9 6 7 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 15 10 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 9 6 7 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 16 13 14 17 10 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 10 17 6 9 6 7 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 16 7 10 11 7 8 9 10 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 16 7 8 11 11 8 9 10 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 16 7 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 12 13 14 16 8 15 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 8 16 6 7 15 8 9 17 17 9 10 11 15 17 11 12\n" + "14 4 10 14 15 16 13 14 17 8 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 8 17 6 7 15 8 9 10 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 15 16 7 10 7 8 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 15 16 7 8 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 15 16 7 8 15 8 9 10 10 11 12 13\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 15 16 7 12 12 7 8 11 11 8 9 10\n" + "14 4 10 14 15 8 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 16 17 6 7 15 16 7 8 8 9 12 13 12 9 10 11\n" + "14 4 10 14 9 15 13 14 16 8 9 14 5 6 16 14 13 0 5 5 0 3 4 0 1 2 3 8 16 6 7 9 10 17 15 17 10 11 12 15 17 12 13\n" + "14 4 10 14 15 16 13 14 17 8 15 14 5 6 17 14 13 0 5 5 0 3 4 0 1 2 3 8 17 6 7 15 8 9 16 16 9 12 13 9 10 11 12\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 17 17 9 10 11 15 17 11 16 16 11 12 13\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 9 10 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 16 12 8 9 17 16 17 9 10 11 12 16 17 11\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 17 16 8 9 12 17 12 9 10 11 16 17 12 13\n" + "14 4 10 14 15 13 16 14 6 7 15 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 15 7 12 13 7 8 11 12 11 8 9 10 13 0 17 16\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 3 4 0 1 2 3 15 8 17 16 8 9 10 17 17 10 11 12 16 17 12 13\n" + "14 4 10 14 15 13 16 14 6 7 15 14 4 5 6 14 16 17 4 4 17 2 3 17 0 1 2 15 7 12 13 7 8 9 12 12 9 10 11 13 0 17 16\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 5 6 13 0 5 15 5 0 16 4 0 1 17 16 17 1 2 3 4 16 17 3\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 15 17 6 16 6 17 4 5 17 0 1 4 4 1 2 3 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 16 0 3 17 0 1 2 3 17 3 4 5 6 16 17 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 15 17 6 16 6 17 2 5 17 0 1 2 5 2 3 4 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 16 0 17 4 0 1 2 17 4 17 2 3 6 16 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 5 6 13 0 5 16 5 0 17 4 0 1 2 17 4 17 2 3 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 5 6 13 0 5 16 5 0 17 4 0 1 2 17 4 17 2 3 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 5 6 13 0 5 16 5 0 17 4 0 1 2 17 4 17 2 3 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 17 6 13 0 17 16 17 0 3 4 0 1 2 3 6 17 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 17 6 13 0 17 16 17 0 3 4 0 1 2 3 6 17 4 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 17 16 16 17 5 6 13 0 5 17 5 0 3 4 0 1 2 3 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 17 16 16 17 5 6 13 0 5 17 5 0 3 4 0 1 2 3 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 17 16 16 17 5 6 13 0 5 17 5 0 3 4 0 1 2 3 8 16 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 17 7 7 17 5 6 13 0 5 17 5 0 3 4 0 1 2 3 16 9 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 17 7 7 17 5 6 13 0 5 17 5 0 3 4 0 1 2 3 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 17 7 7 17 5 6 13 0 5 17 5 0 3 4 0 1 2 3 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 15 17 6 16 6 17 0 5 5 0 1 4 4 1 2 3 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 16 0 1 17 17 1 2 3 17 3 4 5 6 16 17 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 6 7 15 17 6 16 6 17 0 5 5 0 1 2 5 2 3 4 13 0 17 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 6 9 14 13 15 5 5 15 16 4 13 0 16 15 16 0 1 17 17 1 2 3 4 16 17 3 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 16 0 1 17 17 1 2 3 4 16 17 3 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 17 6 13 0 17 16 17 0 1 4 4 1 2 3 6 17 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 17 6 13 0 17 16 17 0 1 4 4 1 2 3 6 17 4 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 17 16 16 17 5 6 13 0 5 17 5 0 1 4 4 1 2 3 15 16 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 17 16 16 17 5 6 13 0 5 17 5 0 1 4 4 1 2 3 8 16 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 17 16 16 17 5 6 13 0 5 17 5 0 1 4 4 1 2 3 8 16 6 7 15 10 11 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 4 5 15 17 4 16 4 17 0 3 3 0 1 2 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 17 7 7 17 5 6 13 0 5 17 5 0 1 4 4 1 2 3 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 4 5 15 17 4 16 4 17 0 3 3 0 1 2 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 17 7 7 17 5 6 13 0 5 17 5 0 1 4 4 1 2 3 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 17 7 7 17 5 6 13 0 5 17 5 0 1 4 4 1 2 3 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 15 17 7 7 17 5 6 15 0 5 17 5 0 1 4 4 1 2 3 10 16 8 9 12 13 0 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 7 8 9 14 16 17 7 7 17 5 6 16 0 5 17 5 0 1 4 4 1 2 3 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 4 5 15 17 4 16 4 17 0 3 3 0 1 2 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 16 17 7 7 17 5 6 16 0 5 17 5 0 1 4 4 1 2 3 15 10 11 12 12 13 0 16\n" + "14 4 10 14 15 12 13 14 9 10 15 14 5 6 9 14 13 16 5 5 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 7 15 11 14 5 6 7 14 13 16 5 5 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 15 7 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 7 10 15 14 5 6 7 14 13 16 5 5 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 10 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 16 5 5 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 10 15 6 9 6 7 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 16 5 5 16 17 4 13 0 17 16 17 0 1 2 4 17 2 3 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 15 16 4 7 4 5 6 7 9 15 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 8 16 4 7 4 5 6 7 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 8 16 4 7 4 5 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 6 9 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 16 15 9 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 15 16 4 5 9 15 5 8 5 6 7 8\n" + "14 4 10 14 11 12 13 14 7 8 11 14 16 15 7 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 15 16 4 5 7 15 5 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 16 15 7 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 15 16 4 5 7 15 5 6 9 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 6 15 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 16 6 15 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 8 15 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 16 6 15 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 8 15 6 7 9 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 17 16 16 17 3 4 13 0 3 17 3 0 1 2 6 16 4 5 15 8 9 12 12 9 10 11\n" + "14 4 10 14 12 13 15 14 10 11 12 14 4 5 10 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 10 5 6 9 9 6 7 8 13 0 17 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 5 6 9 14 16 17 5 5 17 3 4 16 0 3 17 3 0 1 2 9 6 7 8 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 8 9 10 14 4 5 8 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 8 5 6 7 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 12 16 14 9 10 15 14 5 6 9 14 16 17 5 5 17 3 4 16 0 3 17 3 0 1 2 9 6 7 8 15 10 11 12 12 13 0 16\n" + "14 4 10 14 11 12 13 14 7 15 11 14 5 6 7 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 15 7 8 17 17 8 9 10 11 15 17 10\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 17 5 5 17 3 4 13 0 3 17 3 0 1 2 16 7 8 11 11 8 9 10 15 16 11 12\n" + "14 4 10 14 12 13 15 14 6 11 12 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 11 6 7 10 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 17 5 5 17 3 4 13 0 3 17 3 0 1 2 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 11 15 16 14 7 10 11 14 5 6 7 14 16 17 5 5 17 3 4 16 0 3 17 3 0 1 2 10 7 8 9 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 6 9 10 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 9 6 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 12 16 14 7 10 15 14 5 6 7 14 16 17 5 5 17 3 4 16 0 3 17 3 0 1 2 10 7 8 9 15 10 11 12 12 13 0 16\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 10 15 6 17 6 7 8 17 10 17 8 9\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 6 16 14 13 17 5 5 17 3 4 13 0 3 17 3 0 1 2 15 16 6 9 6 7 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 5 6 16 14 13 17 5 5 17 3 4 13 0 3 17 3 0 1 2 10 16 6 9 6 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 5 6 16 14 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 10 16 6 9 6 7 8 9 12 13 0 15\n" + "14 4 10 14 11 12 15 14 16 10 11 14 5 6 16 14 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 10 16 6 7 10 7 8 9 12 13 0 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 6 16 14 13 17 5 5 17 3 4 13 0 3 17 3 0 1 2 15 16 6 7 11 15 7 10 7 8 9 10\n" + "14 4 10 14 9 12 15 14 16 8 9 14 5 6 16 14 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 8 16 6 7 9 10 11 12 12 13 0 15\n" + "14 4 10 14 15 12 13 14 16 8 15 14 5 6 16 14 13 17 5 5 17 3 4 13 0 3 17 3 0 1 2 8 16 6 7 15 8 9 12 12 9 10 11\n" + "14 4 10 14 8 13 15 14 6 7 8 14 4 5 6 14 15 16 4 4 16 2 3 15 17 2 16 2 17 0 1 8 9 12 13 12 9 10 11 13 0 17 15\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 16 5 5 16 3 4 13 0 3 16 3 0 1 2 15 8 17 12 8 9 10 17 12 17 10 11\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 6 16 0 5 0 1 17 5 17 1 2 3 5 17 3 4\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 6 16 0 17 0 1 4 17 4 1 2 3 6 17 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 17 6 13 0 17 16 6 17 0 5 0 1 4 5 4 1 2 3 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 17 6 13 0 17 16 6 17 0 5 0 1 4 5 4 1 2 3 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 17 6 13 0 17 16 6 17 0 5 0 1 4 5 4 1 2 3 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 15 7 7 15 16 6 13 0 16 15 6 16 0 17 0 1 2 17 17 2 3 4 6 17 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 16 15 15 16 17 6 13 0 17 16 6 17 0 5 0 1 2 5 5 2 3 4 8 15 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 17 6 13 0 17 16 6 17 0 5 0 1 2 5 5 2 3 4 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 16 7 7 16 17 6 13 0 17 16 6 17 0 5 0 1 2 5 5 2 3 4 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 16 7 7 16 17 6 13 0 17 16 6 17 0 3 0 1 2 3 6 3 4 5 10 15 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 5 6 9 14 13 15 5 5 15 16 4 13 0 16 15 4 16 0 17 0 1 2 17 4 17 2 3 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 10 11 14 5 6 7 14 13 15 5 5 15 16 4 13 0 16 15 4 16 0 17 0 1 2 17 4 17 2 3 10 7 8 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 13 16 15 15 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 6 15 4 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 13 16 15 15 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 6 15 4 5 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 6 7 14 13 16 15 15 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 6 15 4 5 9 10 11 12\n" + "14 4 10 14 15 12 13 14 9 10 15 14 5 6 9 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 7 15 11 14 5 6 7 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 15 7 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 7 10 15 14 5 6 7 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 10 7 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 10 15 6 9 6 7 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 10 15 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 5 6 15 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 8 15 6 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 5 6 15 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 8 15 6 7 9 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 16 5 5 16 17 4 13 0 17 16 4 17 0 3 0 1 2 3 15 8 9 12 12 9 10 11\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 4 9 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 9 4 5 8 8 5 6 7\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 4 7 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 7 4 5 6 11 8 9 10\n" + "14 4 10 14 9 12 13 14 7 8 9 14 15 4 7 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 7 4 5 6 9 10 11 12\n" + "14 4 10 14 11 12 13 14 5 6 11 14 15 4 5 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 11 6 7 10 10 7 8 9\n" + "14 4 10 14 7 12 13 14 5 6 7 14 15 4 5 14 13 16 15 15 16 17 2 13 0 17 16 2 17 0 1 4 15 2 3 7 8 11 12 11 8 9 10\n" + "14 4 10 14 15 12 13 14 9 10 15 14 3 4 9 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 9 4 5 8 8 5 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 3 4 7 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 7 4 5 6 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 3 4 7 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 7 4 5 6 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 5 10 15 14 3 4 5 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 10 5 6 9 9 6 7 8 15 10 11 12\n" + "14 4 10 14 15 12 13 14 5 8 15 14 3 4 5 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 8 5 6 7 15 8 9 12 12 9 10 11\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 10 15 4 9 4 5 8 9 8 5 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 10 15 4 9 4 5 6 9 9 6 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 10 15 4 7 4 5 6 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 10 15 4 5 10 5 8 9 5 6 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 17 2 13 0 17 16 2 17 0 1 10 15 4 5 10 5 6 9 9 6 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 17 16 16 17 1 2 13 0 1 17 8 16 2 7 2 3 6 7 6 3 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 17 16 16 17 1 2 13 0 1 17 8 16 2 7 2 3 6 7 6 3 4 5 15 10 11 12\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 6 9 14 13 17 16 16 17 1 2 13 0 1 17 6 16 2 5 2 3 4 5 9 6 7 8 15 10 11 12\n" + "14 4 10 14 9 12 13 14 15 8 9 14 16 6 15 14 13 17 16 16 17 1 2 13 0 1 17 6 16 2 5 2 3 4 5 8 15 6 7 9 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 17 16 16 17 1 2 13 0 1 17 6 16 2 5 2 3 4 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 17 16 16 17 1 2 13 0 1 17 6 16 2 5 2 3 4 5 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 4 9 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 9 4 5 8 8 5 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 4 7 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 7 4 5 6 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 4 7 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 7 4 5 6 15 8 9 12 12 9 10 11\n" + "14 4 10 14 11 12 13 14 5 6 11 14 16 15 5 14 13 17 16 16 17 1 2 13 0 1 17 15 16 2 3 5 15 3 4 11 6 7 10 10 7 8 9\n" + "14 4 10 14 15 12 13 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 6 11 12 6 7 10 11 10 7 8 9\n" + "14 4 10 14 15 12 13 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 6 11 12 6 7 8 11 11 8 9 10\n" + "14 4 10 14 15 12 13 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 6 9 12 6 7 8 9 12 9 10 11\n" + "14 4 10 14 15 12 13 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 6 7 12 12 7 10 11 7 8 9 10\n" + "14 4 10 14 15 12 13 14 5 6 15 14 16 4 5 14 13 17 16 16 17 1 2 13 0 1 17 4 16 2 3 15 6 7 12 12 7 8 11 11 8 9 10\n" + "14 4 10 14 15 12 13 14 7 8 15 14 3 4 7 14 13 16 3 3 16 1 2 13 0 1 16 7 4 5 6 15 8 17 12 8 9 10 17 12 17 10 11\n" + "14 4 10 14 15 12 13 14 5 16 15 14 3 4 5 14 13 17 3 3 17 1 2 13 0 1 17 16 5 6 11 11 6 9 10 6 7 8 9 15 16 11 12\n" + "14 4 10 14 15 12 13 14 5 16 15 14 3 4 5 14 13 17 3 3 17 1 2 13 0 1 17 16 5 6 11 11 6 7 10 10 7 8 9 15 16 11 12\n" + "14 4 10 14 15 12 13 14 5 16 15 14 3 4 5 14 13 17 3 3 17 1 2 13 0 1 17 16 5 6 7 15 16 7 12 12 7 8 11 11 8 9 10\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 9 4 5 17 9 17 5 6 7 9 17 7 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 17 4 5 8 17 8 5 6 7 10 17 8 9\n" + "14 4 10 14 15 12 13 14 16 10 15 14 3 4 16 14 13 17 3 3 17 1 2 13 0 1 17 10 16 4 9 4 5 8 9 8 5 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 10 15 14 3 4 16 14 13 17 3 3 17 1 2 13 0 1 17 10 16 4 9 4 5 6 9 9 6 7 8 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 17 4 5 6 17 10 17 6 9 6 7 8 9\n" + "14 4 10 14 15 12 13 14 16 8 15 14 3 4 16 14 13 17 3 3 17 1 2 13 0 1 17 8 16 4 7 4 5 6 7 15 8 9 12 12 9 10 11\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 16 3 3 16 1 2 13 0 1 16 10 15 4 5 10 5 17 9 5 6 7 17 9 17 7 8\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 16 16 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 8 15 16 7\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 15 5 1 2 16 15 16 2 3 17 5 15 16 17 5 17 3 4\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 16 15 1 2 17 16 17 2 3 4 15 16 17 4 6 15 4 5\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 16 16 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 8 15 16 7\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 1 17 17 1 6 7 1 2 5 6 5 2 3 4 8 16 17 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 16 17 10 11 15 16 11 12\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 1 17 17 1 6 7 1 2 3 6 6 3 4 5 8 16 17 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 16 17 10 11 15 16 11 12\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 1 17 17 1 4 7 1 2 3 4 7 4 5 6 8 16 17 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 16 17 10 11 15 16 11 12\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 15 12 13 16 16 13 0 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 16 15 1 2 3 16 15 16 3 17 3 4 5 17 6 15 17 5\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 17 16 1 2 3 17 16 17 3 4 6 16 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 17 16 1 2 3 17 16 17 3 4 6 16 4 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 17 16 1 2 3 17 16 17 3 4 6 16 4 5 12 13 0 15\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 6 9 14 13 0 15 15 0 1 16 16 1 17 5 1 2 3 17 5 17 3 4 6 15 16 5 9 6 7 8\n" + "14 4 10 14 11 12 13 14 7 8 11 14 15 6 7 14 13 0 15 15 0 1 16 16 1 17 5 1 2 3 17 5 17 3 4 6 15 16 5 11 8 9 10\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 16 9 10 11 15 16 11 12\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 15 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 10 16 8 9 12 13 0 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 7 8 9 14 16 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 11 12 13 15 15 13 0 16\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 15 10 11 12 12 13 0 16\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 16 17 10 11 15 16 11 12\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 6 9 14 13 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 9 6 7 8 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 15 8 9 10 15 10 11 12\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 10 11 14 7 8 15 14 16 6 7 14 11 0 16 16 0 1 17 17 1 4 5 1 2 3 4 6 16 17 5 15 8 9 10 11 12 13 0\n" + "14 4 10 14 15 16 17 14 11 12 15 14 7 8 11 14 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 9 10 17 15 16 17 12 12 17 10 11\n" + "14 4 10 14 15 16 13 14 9 17 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 9 10 11 15 17 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 9 17 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 9 10 11 15 17 11 12 12 13 0 16\n" + "14 4 10 14 15 16 17 14 9 12 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 15 12 13 16 16 13 0 17\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 16 8 17 8 9 10 17 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 17 8 11 8 9 10 11 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 17 8 9 15 16 9 10 15 10 11 12\n" + "14 4 10 14 11 12 15 14 17 16 11 14 7 8 17 14 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 17 8 9 11 16 9 10 12 13 0 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 17 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 17 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 10 11 14 17 16 15 14 7 8 17 14 11 0 7 7 0 1 6 6 1 4 5 1 2 3 4 16 17 8 9 15 16 9 10 11 12 13 0\n" + "14 4 10 14 11 15 16 14 17 10 11 14 7 8 17 14 16 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9 11 12 13 15 15 13 0 16\n" + "14 4 10 14 15 16 13 14 17 10 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 17 10 15 14 7 8 17 14 16 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9 15 10 11 12 12 13 0 16\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 11 12 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 13 16 10 11 12 13 16 13 0 17\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 11 16 16 11 12 17 17 12 13 0\n" + "14 4 10 14 11 12 13 14 9 10 11 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 15 15 2 17 16 2 3 4 17 16 17 4 5 6 15 16 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 13 0 16 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 17 17 1 4 5 1 2 3 4 7 17 5 6 13 0 16 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 7 8 15 14 13 0 7 7 0 1 6 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 15 10 11 12\n" + "14 4 10 14 11 12 15 14 9 10 11 14 7 8 9 14 15 0 7 7 0 1 6 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 12 13 0 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 17 17 1 2 5 5 2 3 4 7 17 5 6 13 0 16 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 7 17 1 6 6 1 2 5 5 2 3 4 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 15 0 1 16 16 1 2 17 17 2 3 4 17 4 5 6 16 17 6 7 8 15 16 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 16 17 8 9 10 15 16 9\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 9 10 14 15 17 16 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 9 16 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 11 12 13 13 0 17 16\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 16 0 1 17 17 1 2 5 5 2 3 4 17 5 6 7 8 16 17 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 0 7 7 0 1 4 4 1 2 3 7 4 5 6 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 0 7 7 0 1 4 4 1 2 3 7 4 5 6 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 7 17 1 4 4 1 2 3 7 4 5 6 13 17 16 15 13 0 1 17\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 17 17 1 2 3 7 17 3 6 3 4 5 6 13 0 16 15\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 0 5 5 0 1 17 17 1 2 3 5 17 3 4 10 7 8 9 13 0 16 15\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 17 17 1 2 3 5 17 3 4 11 8 9 10 13 0 16 15\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 15 16 8 9 11 15 9 10\n" + "14 4 10 14 15 12 13 14 16 10 15 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 7 8 16 14 15 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 10 16 8 9 12 13 0 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 17 17 1 2 3 5 17 3 4 12 9 10 11 13 0 16 15\n" + "14 4 10 14 11 15 16 14 9 10 11 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 8 9 10 14 6 7 8 14 15 16 6 6 16 0 5 5 0 1 17 17 1 2 3 5 17 3 4 10 11 12 13 13 0 16 15\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 9 10 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 15 10 11 12 12 13 0 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 7 10 14 15 17 16 16 17 0 5 5 0 1 4 4 1 2 3 7 16 5 6 10 7 8 9 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 1 6 6 1 2 5 5 2 3 4 16 17 6 7 10 15 16 7 10 7 8 9\n" + "14 4 10 14 11 12 13 14 15 8 11 14 17 16 15 14 13 0 17 17 0 1 6 6 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7 11 8 9 10\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 1 6 6 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7 9 10 11 12\n" + "14 4 10 14 9 10 11 14 15 8 9 14 17 16 15 14 11 0 17 17 0 1 6 6 1 2 5 5 2 3 4 16 17 6 7 8 15 16 7 11 12 13 0\n" + "14 4 10 14 12 13 15 14 8 9 12 14 16 7 8 14 15 17 16 16 17 0 5 5 0 1 4 4 1 2 3 7 16 5 6 12 9 10 11 13 0 17 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 16 7 8 14 15 17 16 16 17 0 5 5 0 1 4 4 1 2 3 7 16 5 6 10 11 12 13 13 0 17 15\n" +; + +const char* data_dqrgl_block5 = + "14 4 10 14 15 16 17 14 11 12 15 14 7 8 11 14 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 6 7 10 14 16 17 6 6 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 17 5 5 17 1 4 4 1 2 3 10 7 8 9 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 9 10 17 15 16 17 12 12 17 10 11\n" + "14 4 10 14 15 16 13 14 9 17 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 9 10 11 15 17 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 9 17 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 9 10 11 15 17 11 12 12 13 0 16\n" + "14 4 10 14 15 16 17 14 9 12 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 8 11 15 14 6 7 8 14 16 17 6 6 17 0 5 5 0 1 4 4 1 2 3 11 8 9 10 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 8 11 12 14 6 7 8 14 15 16 6 6 16 17 5 5 17 1 4 4 1 2 3 11 8 9 10 13 17 16 15 13 0 1 17\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 16 8 17 8 9 10 17 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 17 8 11 8 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 4 4 1 2 3 11 16 7 10 7 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 4 4 1 2 3 11 16 7 8 11 8 9 10 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 9 12 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 4 4 1 2 3 9 16 7 8 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 12 15 14 17 16 11 14 7 8 17 14 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 17 8 9 11 16 9 10 12 13 0 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 17 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 17 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 10 11 14 17 16 15 14 7 8 17 14 11 0 7 7 0 1 6 6 1 2 5 5 2 3 4 16 17 8 9 15 16 9 10 11 12 13 0\n" + "14 4 10 14 11 15 16 14 17 10 11 14 7 8 17 14 16 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 16 9 10 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 4 4 1 2 3 9 16 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 17 10 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 17 10 15 14 7 8 17 14 16 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9 15 10 11 12 12 13 0 16\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 17 5 5 17 1 4 4 1 2 3 12 9 10 11 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 13 16 10 11 12 13 16 13 0 17\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 16 17 6 6 17 0 5 5 0 1 4 4 1 2 3 15 9 12 13 9 10 11 12 13 0 17 16\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 11 16 16 11 12 17 17 12 13 0\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 0 7 7 0 1 2 7 2 17 6 2 3 4 17 6 17 4 5 13 0 16 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 0 7 7 0 1 2 7 2 5 6 2 3 4 5 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 0 7 7 0 1 2 7 2 5 6 2 3 4 5 15 11 12 13 13 0 17 16\n" + "14 4 10 14 15 12 13 14 17 16 15 14 9 10 17 14 13 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 16 17 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 8 9 16 14 15 17 8 8 17 0 7 7 0 1 2 7 2 3 6 6 3 4 5 11 16 9 10 13 0 17 15\n" + "14 4 10 14 15 16 17 14 11 12 15 14 9 10 11 14 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 8 9 10 14 16 17 8 8 17 0 7 7 0 1 2 7 2 3 6 6 3 4 5 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 7 17 1 2 7 2 3 6 6 3 4 5 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 16 17 14 11 12 15 14 7 8 11 14 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 6 7 10 14 16 17 6 6 17 0 5 5 0 1 2 5 2 3 4 10 7 8 9 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 17 5 5 17 1 2 5 2 3 4 10 7 8 9 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 12 13 14 9 16 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 9 10 17 15 16 17 12 12 17 10 11\n" + "14 4 10 14 15 16 13 14 9 17 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 9 10 11 15 17 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 9 17 15 14 7 8 9 14 16 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 9 10 11 15 17 11 12 12 13 0 16\n" + "14 4 10 14 15 16 17 14 9 12 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 8 11 15 14 6 7 8 14 16 17 6 6 17 0 5 5 0 1 2 5 2 3 4 11 8 9 10 15 11 12 13 13 0 17 16\n" + "14 4 10 14 11 12 13 14 16 15 11 14 7 8 16 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 16 8 17 8 9 10 17 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 17 8 11 8 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 2 5 2 3 4 11 16 7 10 7 8 9 10 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 17 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 2 5 2 3 4 11 16 7 8 11 8 9 10 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 9 12 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 2 5 2 3 4 9 16 7 8 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 12 15 14 17 16 11 14 7 8 17 14 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 17 8 9 11 16 9 10 12 13 0 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 17 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 17 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 10 11 14 17 16 15 14 7 8 17 14 11 0 7 7 0 1 6 6 1 2 3 6 3 4 5 16 17 8 9 15 16 9 10 11 12 13 0\n" + "14 4 10 14 11 15 16 14 17 10 11 14 7 8 17 14 16 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 16 9 10 14 6 7 16 14 15 17 6 6 17 0 5 5 0 1 2 5 2 3 4 9 16 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 17 10 15 14 7 8 17 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 17 10 15 14 7 8 17 14 16 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9 15 10 11 12 12 13 0 16\n" + "14 4 10 14 12 13 15 14 8 9 12 14 6 7 8 14 15 16 6 6 16 17 5 5 17 1 2 5 2 3 4 12 9 10 11 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 16 13 14 9 10 15 14 7 8 9 14 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 10 13 16 10 11 12 13 16 13 0 17\n" + "14 4 10 14 15 13 16 14 8 9 15 14 6 7 8 14 16 17 6 6 17 0 5 5 0 1 2 5 2 3 4 15 9 12 13 9 10 11 12 13 0 17 16\n" + "14 4 10 14 15 16 17 14 9 10 15 14 7 8 9 14 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 7 17 3 4 7 4 5 6 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 4 9 14 13 0 16 16 0 1 17 17 1 2 3 4 16 17 3 9 4 5 8 8 5 6 7 15 10 11 12\n" + "14 4 10 14 15 10 11 14 7 8 15 14 16 4 7 14 11 0 16 16 0 1 17 17 1 2 3 4 16 17 3 7 4 5 6 15 8 9 10 11 12 13 0\n" + "14 4 10 14 12 13 15 14 10 11 12 14 16 5 10 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 10 5 6 9 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 8 9 12 14 16 5 8 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 8 5 6 7 12 9 10 11 13 0 17 15\n" + "14 4 10 14 10 13 15 14 8 9 10 14 16 5 8 14 15 17 16 16 17 0 3 3 0 1 2 5 16 3 4 8 5 6 7 10 11 12 13 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 10 15 16 5 10 5 6 9 9 6 7 8\n" + "14 4 10 14 9 12 13 14 15 8 9 14 17 16 15 14 13 0 17 17 0 1 4 4 1 2 3 16 17 4 5 8 15 16 5 8 5 6 7 9 10 11 12\n" + "14 4 10 14 9 10 11 14 15 8 9 14 17 16 15 14 11 0 17 17 0 1 4 4 1 2 3 16 17 4 5 8 15 16 5 8 5 6 7 11 12 13 0\n" + "14 4 10 14 7 10 11 14 15 6 7 14 17 16 15 14 11 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 7 8 9 10 11 12 13 0\n" + "14 4 10 14 7 8 9 14 15 6 7 14 17 16 15 14 9 0 17 17 0 1 4 4 1 2 3 16 17 4 5 6 15 16 5 9 10 13 0 13 10 11 12\n" + "14 4 10 14 15 16 17 14 11 12 15 14 5 6 11 14 17 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 13 16 14 10 11 15 14 4 5 10 14 16 17 4 4 17 0 3 3 0 1 2 10 5 6 9 9 6 7 8 15 11 12 13 13 0 17 16\n" + "14 4 10 14 12 13 15 14 10 11 12 14 4 5 10 14 15 16 4 4 16 17 3 3 17 1 2 10 5 6 9 9 6 7 8 13 17 16 15 13 0 1 17\n" + "14 4 10 14 15 16 13 14 9 10 15 14 5 6 9 14 13 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 10 17 16 10 11 12 17 16 17 12 13\n" + "14 4 10 14 15 16 17 14 9 10 15 14 5 6 9 14 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 10 13 16 10 11 12 13 16 13 0 17\n" + "14 4 10 14 15 13 16 14 8 9 15 14 4 5 8 14 16 17 4 4 17 0 3 3 0 1 2 8 5 6 7 15 9 12 13 9 10 11 12 13 0 17 16\n" + "14 4 10 14 15 16 17 14 9 10 15 14 5 6 9 14 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 17 5 5 17 3 4 10 7 8 9 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 15 12 16 14 7 17 15 14 5 6 7 14 16 0 5 5 0 1 4 4 1 2 3 17 7 8 11 11 8 9 10 15 17 11 12 12 13 0 16\n" + "14 4 10 14 15 16 17 14 7 12 15 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 15 12 13 16 16 13 0 17\n" + "14 4 10 14 15 12 13 14 7 16 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 16 7 8 17 15 16 17 12 12 17 8 11 8 9 10 11\n" + "14 4 10 14 15 10 11 14 7 16 15 14 5 6 7 14 11 0 5 5 0 1 4 4 1 2 3 16 7 8 17 15 16 17 10 10 17 8 9 11 12 13 0\n" + "14 4 10 14 15 16 17 14 7 10 15 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 10 11 16 16 11 12 13 16 13 0 17\n" + "14 4 10 14 11 12 13 14 15 10 11 14 5 6 15 14 13 0 5 5 0 1 4 4 1 2 3 10 15 6 16 6 7 17 16 17 7 8 9 10 16 17 9\n" + "14 4 10 14 11 12 13 14 16 15 11 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 15 16 6 17 6 7 10 17 10 7 8 9 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 11 6 7 10 11 10 7 8 9 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 11 16 5 10 5 6 9 10 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 11 16 5 10 5 6 7 10 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 9 6 7 8 9 16 9 10 11 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 11 16 5 8 5 6 7 8 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 15 14 16 10 11 14 5 6 16 14 15 0 5 5 0 1 4 4 1 2 3 10 16 6 17 6 7 8 17 10 17 8 9 12 13 0 15\n" + "14 4 10 14 9 10 13 14 16 15 9 14 5 6 16 14 13 0 5 5 0 1 4 4 1 2 3 15 16 6 17 6 7 8 17 9 15 17 8 10 11 12 13\n" + "14 4 10 14 9 10 11 14 16 15 9 14 5 6 16 14 11 0 5 5 0 1 4 4 1 2 3 15 16 6 17 6 7 8 17 9 15 17 8 11 12 13 0\n" + "14 4 10 14 12 13 15 14 16 9 12 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 9 16 5 8 5 6 7 8 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 12 15 14 17 16 11 14 5 6 17 14 15 0 5 5 0 1 4 4 1 2 3 16 17 6 9 6 7 8 9 11 16 9 10 12 13 0 15\n" + "14 4 10 14 15 10 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 9 6 7 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 10 11 14 17 16 15 14 5 6 17 14 11 0 5 5 0 1 4 4 1 2 3 16 17 6 9 6 7 8 9 15 16 9 10 11 12 13 0\n" + "14 4 10 14 11 15 16 14 17 10 11 14 5 6 17 14 16 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 16 9 10 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 9 16 5 8 5 6 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 16 13 14 17 10 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9 15 10 11 16 16 11 12 13\n" + "14 4 10 14 15 12 16 14 17 10 15 14 5 6 17 14 16 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9 15 10 11 12 12 13 0 16\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 7 16 7 10 11 7 8 9 10 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 11 16 5 6 11 6 9 10 6 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 7 16 7 8 11 11 8 9 10 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 11 16 5 6 11 6 7 10 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 7 16 7 8 9 15 16 9 12 12 9 10 11\n" + "14 4 10 14 15 10 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 7 16 7 8 9 15 16 9 10 10 11 12 13\n" + "14 4 10 14 15 10 11 14 17 16 15 14 5 6 17 14 11 0 5 5 0 1 4 4 1 2 3 16 17 6 7 16 7 8 9 15 16 9 10 11 12 13 0\n" + "14 4 10 14 11 15 16 14 17 10 11 14 5 6 17 14 16 0 5 5 0 1 4 4 1 2 3 10 17 6 7 10 7 8 9 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 16 9 10 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 9 16 5 6 9 6 7 8 10 11 12 13 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 7 12 14 4 5 16 14 15 17 4 4 17 0 3 3 0 1 2 7 16 5 6 12 7 8 11 11 8 9 10 13 0 17 15\n" + "14 4 10 14 9 10 15 14 17 16 9 14 5 6 17 14 15 0 5 5 0 1 4 4 1 2 3 16 17 6 7 9 16 7 8 10 13 0 15 10 11 12 13\n" + "14 4 10 14 15 12 13 14 17 16 15 14 5 6 17 14 13 0 5 5 0 1 4 4 1 2 3 16 17 6 7 15 16 7 12 12 7 8 11 11 8 9 10\n" + "14 4 10 14 15 10 11 14 17 16 15 14 5 6 17 14 11 0 5 5 0 1 4 4 1 2 3 16 17 6 7 15 16 7 10 10 7 8 9 11 12 13 0\n" + "14 4 10 14 15 8 9 14 17 16 15 14 5 6 17 14 9 0 5 5 0 1 4 4 1 2 3 16 17 6 7 15 16 7 8 9 10 13 0 13 10 11 12\n" + "14 4 10 14 9 15 16 14 17 8 9 14 5 6 17 14 16 0 5 5 0 1 4 4 1 2 3 8 17 6 7 9 10 13 15 13 10 11 12 15 13 0 16\n" + "14 4 10 14 15 12 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 8 16 12 8 9 17 16 17 9 10 11 12 16 17 11\n" + "14 4 10 14 15 16 13 14 7 8 15 14 5 6 7 14 13 0 5 5 0 1 4 4 1 2 3 15 8 17 16 8 9 12 17 12 9 10 11 16 17 12 13\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 8 13 16 8 9 12 13 12 9 10 11 16 13 0 17\n" + "14 4 10 14 15 13 16 14 6 7 15 14 4 5 6 14 16 17 4 4 17 0 3 3 0 1 2 15 7 12 13 7 8 11 12 11 8 9 10 13 0 17 16\n" + "14 4 10 14 15 13 16 14 6 7 15 14 4 5 6 14 16 17 4 4 17 0 3 3 0 1 2 15 7 12 13 7 8 9 12 12 9 10 11 13 0 17 16\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 8 11 16 8 9 10 11 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 8 11 16 8 9 10 11 16 11 12 17 17 12 13 0\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 8 9 16 16 9 12 13 9 10 11 12 16 13 0 17\n" + "14 4 10 14 15 16 17 14 7 8 15 14 5 6 7 14 17 0 5 5 0 1 4 4 1 2 3 15 8 9 16 16 9 10 13 13 10 11 12 16 13 0 17\n" + "14 4 10 14 8 9 15 14 6 7 8 14 16 3 6 14 15 17 16 16 17 0 1 3 16 1 2 6 3 4 5 9 0 17 15 9 10 13 0 13 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 10 15 16 3 10 3 4 9 9 4 7 8 4 5 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 17 0 1 2 16 17 2 3 10 15 16 3 10 3 4 9 9 4 5 8 8 5 6 7\n" + "14 4 10 14 12 13 15 14 8 9 12 14 4 5 8 14 15 16 4 4 16 17 3 8 5 6 7 12 9 10 11 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 15 12 13 14 7 8 15 14 3 4 7 14 13 0 3 3 0 1 2 7 4 5 6 15 8 16 12 8 9 17 16 17 9 10 11 12 16 17 11\n" + "14 4 10 14 15 16 17 14 7 8 15 14 3 4 7 14 17 0 3 3 0 1 2 7 4 5 6 15 8 13 16 8 9 12 13 12 9 10 11 16 13 0 17\n" + "14 4 10 14 15 13 16 14 6 7 15 14 2 3 6 14 16 17 2 2 17 0 1 6 3 4 5 15 7 12 13 7 8 11 12 11 8 9 10 13 0 17 16\n" + "14 4 10 14 15 13 16 14 6 7 15 14 2 3 6 14 16 17 2 2 17 0 1 6 3 4 5 15 7 12 13 7 8 9 12 12 9 10 11 13 0 17 16\n" + "14 4 10 14 15 16 17 14 7 8 15 14 3 4 7 14 17 0 3 3 0 1 2 7 4 5 6 15 8 11 16 8 9 10 11 16 11 12 13 16 13 0 17\n" + "14 4 10 14 15 16 17 14 7 8 15 14 3 4 7 14 17 0 3 3 0 1 2 7 4 5 6 15 8 9 16 16 9 12 13 9 10 11 12 16 13 0 17\n" + "14 4 10 14 15 16 17 14 7 8 15 14 3 4 7 14 17 0 3 3 0 1 2 7 4 5 6 15 8 9 16 16 9 10 13 13 10 11 12 16 13 0 17\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 17 5 10 7 8 9 13 17 16 15 13 0 5 17 5 0 3 4 0 1 2 3\n" + "14 4 10 14 12 13 15 14 10 11 12 14 6 7 10 14 15 16 6 6 16 17 5 10 7 8 9 13 17 16 15 13 0 5 17 5 0 1 4 4 1 2 3\n" + "14 4 10 14 12 13 15 14 6 9 12 14 4 5 6 14 15 16 4 4 16 17 3 9 6 7 8 12 9 10 11 13 17 16 15 13 0 3 17 3 0 1 2\n" + "14 4 10 14 15 12 13 14 5 16 15 14 3 4 5 14 13 0 3 3 0 1 2 16 5 6 17 15 16 17 12 12 17 6 11 6 7 10 11 10 7 8 9\n" + "14 4 10 14 15 12 13 14 5 16 15 14 3 4 5 14 13 0 3 3 0 1 2 16 5 6 17 15 16 17 12 12 17 6 11 6 7 8 11 11 8 9 10\n" + "14 4 10 14 15 16 17 14 5 8 15 14 3 4 5 14 17 0 3 3 0 1 2 8 5 6 7 15 8 9 16 16 9 12 13 9 10 11 12 16 13 0 17\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 16 4 5 17 16 17 5 8 9 5 6 7 8 10 16 17 9\n" + "14 4 10 14 11 12 13 14 16 15 11 14 3 4 16 14 13 0 3 3 0 1 2 15 16 4 17 4 5 10 17 10 5 8 9 5 6 7 8 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 11 4 5 10 11 10 5 8 9 5 6 7 8 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 10 3 4 9 10 9 4 7 8 4 5 6 7 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 9 4 5 16 9 16 5 6 17 17 6 7 8 9 16 17 8\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 16 4 5 17 16 17 5 6 9 9 6 7 8 10 16 17 9\n" + "14 4 10 14 11 12 13 14 16 15 11 14 3 4 16 14 13 0 3 3 0 1 2 15 16 4 17 4 5 10 17 10 5 6 9 9 6 7 8 11 15 17 10\n" + "14 4 10 14 15 12 13 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 11 4 5 10 11 10 5 6 9 9 6 7 8 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 10 3 4 9 10 9 4 5 8 8 5 6 7 13 0 17 15\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 16 4 5 17 16 17 5 6 7 17 7 8 9 10 16 17 9\n" + "14 4 10 14 15 12 13 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 11 4 5 10 11 10 5 6 7 10 7 8 9 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 10 3 4 9 10 9 4 5 6 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 10 3 4 7 10 7 4 5 6 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 12 13 14 16 10 15 14 3 4 16 14 13 0 3 3 0 1 2 10 16 4 9 4 5 17 9 17 5 6 7 9 17 7 8 15 10 11 12\n" + "14 4 10 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 9 4 5 17 9 17 5 6 7 9 17 7 8 12 13 0 15\n" + "14 4 10 14 9 12 13 14 15 8 9 14 3 4 15 14 13 0 3 3 0 1 2 8 15 4 16 4 5 17 16 17 5 6 7 8 16 17 7 9 10 11 12\n" + "14 4 10 14 9 10 11 14 15 8 9 14 3 4 15 14 11 0 3 3 0 1 2 8 15 4 16 4 5 17 16 17 5 6 7 8 16 17 7 11 12 13 0\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 8 3 4 7 8 7 4 5 6 11 8 9 10 13 0 17 15\n" + "14 4 10 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 17 4 5 8 17 8 5 6 7 10 17 8 9 12 13 0 15\n" + "14 4 10 14 12 13 15 14 16 9 12 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 8 3 4 7 8 7 4 5 6 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 12 15 14 17 16 11 14 3 4 17 14 15 0 3 3 0 1 2 16 17 4 9 4 5 8 9 8 5 6 7 11 16 9 10 12 13 0 15\n" + "14 4 10 14 15 10 11 14 17 16 15 14 3 4 17 14 11 0 3 3 0 1 2 16 17 4 9 4 5 8 9 8 5 6 7 15 16 9 10 11 12 13 0\n" + "14 4 10 14 11 15 16 14 17 10 11 14 3 4 17 14 16 0 3 3 0 1 2 10 17 4 9 4 5 8 9 8 5 6 7 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 16 9 10 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 8 3 4 7 8 7 4 5 6 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 12 16 14 17 10 15 14 3 4 17 14 16 0 3 3 0 1 2 10 17 4 9 4 5 8 9 8 5 6 7 15 10 11 12 12 13 0 16\n" + "14 4 10 14 10 11 15 14 16 9 10 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 8 3 4 7 8 7 4 5 6 11 0 17 15 11 12 13 0\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 10 3 4 5 10 10 5 8 9 5 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 10 3 4 5 10 10 5 6 9 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 9 12 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 8 3 4 5 8 8 5 6 7 12 9 10 11 13 0 17 15\n" + "14 4 10 14 11 15 16 14 17 10 11 14 3 4 17 14 16 0 3 3 0 1 2 10 17 4 9 4 5 6 9 9 6 7 8 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 13 15 14 16 9 10 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 8 3 4 5 8 8 5 6 7 10 11 12 13 13 0 17 15\n" + "14 4 10 14 15 12 16 14 17 10 15 14 3 4 17 14 16 0 3 3 0 1 2 10 17 4 9 4 5 6 9 9 6 7 8 15 10 11 12 12 13 0 16\n" + "14 4 10 14 10 11 15 14 16 9 10 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 8 3 4 5 8 8 5 6 7 11 0 17 15 11 12 13 0\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 6 3 4 5 6 11 6 7 10 10 7 8 9 13 0 17 15\n" + "14 4 10 14 15 10 11 14 17 16 15 14 3 4 17 14 11 0 3 3 0 1 2 16 17 4 7 4 5 6 7 16 7 8 9 15 16 9 10 11 12 13 0\n" + "14 4 10 14 11 15 16 14 17 10 11 14 3 4 17 14 16 0 3 3 0 1 2 10 17 4 7 4 5 6 7 10 7 8 9 11 12 13 15 15 13 0 16\n" + "14 4 10 14 10 11 15 14 16 9 10 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 6 3 4 5 6 9 6 7 8 11 0 17 15 11 12 13 0\n" + "14 4 10 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 17 4 5 6 17 10 17 6 9 6 7 8 9 12 13 0 15\n" + "14 4 10 14 9 12 15 14 16 8 9 14 3 4 16 14 15 0 3 3 0 1 2 8 16 4 17 4 5 6 17 8 17 6 7 9 10 11 12 12 13 0 15\n" + "14 4 10 14 9 10 15 14 16 8 9 14 3 4 16 14 15 0 3 3 0 1 2 8 16 4 17 4 5 6 17 8 17 6 7 10 13 0 15 10 11 12 13\n" + "14 4 10 14 10 11 15 14 16 7 10 14 2 3 16 14 15 17 2 2 17 0 1 7 16 3 6 3 4 5 6 10 7 8 9 11 0 17 15 11 12 13 0\n" + "14 4 10 14 8 9 15 14 16 7 8 14 2 3 16 14 15 17 2 2 17 0 1 7 16 3 6 3 4 5 6 9 0 17 15 9 10 13 0 13 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 3 4 15 14 13 0 3 3 0 1 2 10 15 4 5 10 5 16 9 5 6 17 16 17 6 7 8 9 16 17 8\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 4 11 4 9 10 4 5 8 9 8 5 6 7 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 4 11 4 9 10 4 5 6 9 9 6 7 8 13 0 17 15\n" + "14 4 10 14 15 12 13 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 16 5 8 11 5 6 7 8 11 8 9 10 15 16 11 12\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 4 11 4 7 10 4 5 6 7 10 7 8 9 13 0 17 15\n" + "14 4 10 14 11 12 15 14 16 10 11 14 3 4 16 14 15 0 3 3 0 1 2 10 16 4 5 10 5 17 9 5 6 7 17 9 17 7 8 12 13 0 15\n" + "14 4 10 14 10 11 15 14 16 9 10 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 4 9 4 7 8 4 5 6 7 11 0 17 15 11 12 13 0\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 4 11 4 5 10 10 5 8 9 5 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 4 11 4 5 10 10 5 6 9 9 6 7 8 13 0 17 15\n" + "14 4 10 14 12 13 15 14 16 11 12 14 2 3 16 14 15 17 2 2 17 0 1 11 16 3 4 11 4 5 10 10 5 6 7 10 7 8 9 13 0 17 15\n" + "14 4 10 14 10 11 15 14 16 9 10 14 2 3 16 14 15 17 2 2 17 0 1 9 16 3 4 9 4 5 8 8 5 6 7 11 0 17 15 11 12 13 0\n" + "14 4 10 14 8 9 15 14 16 7 8 14 2 3 16 14 15 17 2 2 17 0 1 7 16 3 4 7 4 5 6 9 0 17 15 9 10 13 0 13 10 11 12\n" + "14 4 10 14 15 12 13 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 15 16 5 12 12 5 6 11 11 6 9 10 6 7 8 9\n" + "14 4 10 14 15 12 13 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 15 16 5 12 12 5 6 11 11 6 7 10 10 7 8 9\n" + "14 4 10 14 15 12 13 14 17 16 15 14 3 4 17 14 13 0 3 3 0 1 2 16 17 4 5 15 16 5 12 12 5 6 11 11 6 7 8 11 8 9 10\n" + "14 4 10 14 15 12 13 14 16 6 15 14 3 4 16 14 13 0 3 3 0 1 2 6 16 4 5 15 6 7 12 12 7 17 11 7 8 9 17 11 17 9 10\n" + "14 4 10 14 7 8 15 14 16 6 7 14 3 4 16 14 15 0 3 3 0 1 2 6 16 4 5 8 13 0 15 8 9 17 13 17 9 10 11 13 17 11 12\n" + "14 4 10 14 6 7 15 14 16 5 6 14 2 3 16 14 15 17 2 2 17 0 1 5 16 3 4 7 0 17 15 7 8 13 0 13 8 11 12 8 9 10 11\n" + "14 4 10 14 6 7 15 14 16 5 6 14 2 3 16 14 15 17 2 2 17 0 1 5 16 3 4 7 0 17 15 7 8 13 0 13 8 9 12 12 9 10 11\n" + "14 4 10 14 6 7 15 14 16 5 6 14 2 3 16 14 15 17 2 2 17 0 1 5 16 3 4 7 0 17 15 7 8 13 0 13 8 9 10 13 10 11 12\n" + "14 4 10 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 16 12 6 7 17 16 17 7 10 11 7 8 9 10 12 16 17 11\n" + "14 4 10 14 15 16 17 14 5 6 15 14 3 4 5 14 17 0 3 3 0 1 2 15 6 13 16 6 7 12 13 12 7 10 11 7 8 9 10 16 13 0 17\n" + "14 4 10 14 15 13 16 14 4 5 15 14 2 3 4 14 16 17 2 2 17 0 1 15 5 12 13 5 6 11 12 11 6 9 10 6 7 8 9 13 0 17 16\n" + "14 4 10 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 11 12 6 7 16 11 16 7 8 17 17 8 9 10 11 16 17 10\n" + "14 4 10 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 16 12 6 7 17 16 17 7 8 11 11 8 9 10 12 16 17 11\n" + "14 4 10 14 15 16 17 14 5 6 15 14 3 4 5 14 17 0 3 3 0 1 2 15 6 13 16 6 7 12 13 12 7 8 11 11 8 9 10 16 13 0 17\n" + "14 4 10 14 15 13 16 14 4 5 15 14 2 3 4 14 16 17 2 2 17 0 1 15 5 12 13 5 6 11 12 11 6 7 10 10 7 8 9 13 0 17 16\n" + "14 4 10 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 16 12 6 7 17 16 17 7 8 9 17 9 10 11 12 16 17 11\n" + "14 4 10 14 15 16 17 14 5 6 15 14 3 4 5 14 17 0 3 3 0 1 2 15 6 13 16 6 7 12 13 12 7 8 9 12 9 10 11 16 13 0 17\n" + "14 4 10 14 15 13 16 14 4 5 15 14 2 3 4 14 16 17 2 2 17 0 1 15 5 12 13 5 6 11 12 11 6 7 8 11 8 9 10 13 0 17 16\n" + "14 4 10 14 15 13 16 14 4 5 15 14 2 3 4 14 16 17 2 2 17 0 1 15 5 12 13 5 6 9 12 9 6 7 8 12 9 10 11 13 0 17 16\n" + "14 4 10 14 15 12 16 14 5 6 15 14 3 4 5 14 16 0 3 3 0 1 2 15 6 11 12 6 7 17 11 17 7 8 9 11 17 9 10 12 13 0 16\n" + "14 4 10 14 15 13 16 14 4 5 15 14 2 3 4 14 16 17 2 2 17 0 1 15 5 12 13 5 6 7 12 12 7 10 11 7 8 9 10 13 0 17 16\n" + "14 4 10 14 15 13 16 14 4 5 15 14 2 3 4 14 16 17 2 2 17 0 1 15 5 12 13 5 6 7 12 12 7 8 11 11 8 9 10 13 0 17 16\n" + "14 4 10 14 15 12 13 14 5 6 15 14 3 4 5 14 13 0 3 3 0 1 2 15 6 7 12 12 7 16 11 7 8 17 16 17 8 9 10 11 16 17 10\n" + "14 4 10 14 7 8 15 14 5 6 7 14 3 4 5 14 15 0 3 3 0 1 2 8 13 0 15 8 9 16 13 16 9 10 17 17 10 11 12 13 16 17 12\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 13 17 16 15 13 0 7 17 7 0 5 6 0 1 4 5 4 1 2 3\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 13 17 16 15 13 0 7 17 7 0 5 6 0 1 2 5 5 2 3 4\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 13 17 16 15 13 0 7 17 7 0 3 6 0 1 2 3 6 3 4 5\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 13 17 16 15 13 0 7 17 7 0 1 6 6 1 4 5 1 2 3 4\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 13 17 16 15 13 0 7 17 7 0 1 6 6 1 2 5 5 2 3 4\n" + "14 4 10 14 12 13 15 14 10 11 12 14 8 9 10 14 15 16 8 8 16 17 7 13 17 16 15 13 0 7 17 7 0 1 6 6 1 2 3 6 3 4 5\n" + "14 4 10 14 6 7 15 14 4 5 6 14 2 3 4 14 15 16 2 2 16 0 1 7 0 16 15 7 8 13 0 13 8 17 12 8 9 10 17 12 17 10 11\n" + "14 4 10 14 6 7 15 14 4 5 6 14 2 3 4 14 15 16 2 2 16 0 1 7 0 16 15 7 8 13 0 13 8 9 17 17 9 10 11 13 17 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 16 0 1 17 16 17 1 6 7 1 2 5 6 5 2 3 4 8 16 17 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 10 15 16 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 16 0 1 17 16 17 1 6 7 1 2 3 6 6 3 4 5 8 16 17 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 10 15 16 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 4 17 1 2 3 4 17 4 5 6 7 16 17 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 16 0 1 17 16 17 1 4 7 1 2 3 4 7 4 5 6 8 16 17 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 10 15 16 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 17 16 1 2 3 17 16 17 3 4 6 16 4 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 17 5 1 2 3 17 5 17 3 4 7 16 5 6\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 16 0 1 6 16 6 1 17 5 1 2 3 17 5 17 3 4 8 16 6 7\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 6 7 6 1 17 5 1 2 3 17 5 17 3 4 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 6 7 6 1 17 5 1 2 3 17 5 17 3 4 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 17 7 17 1 4 5 1 2 3 4 7 17 5 6 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 17 7 17 1 4 5 1 2 3 4 7 17 5 6 15 10 11 12\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 17 0 1 6 17 6 1 4 5 1 2 3 4 8 17 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 8 17 0 7 0 1 6 7 6 1 4 5 1 2 3 4 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 2 17 17 2 5 6 2 3 4 5 7 16 17 6\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5 10 15 16 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 2 17 17 2 3 6 6 3 4 5 7 16 17 6\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 10 15 16 9\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 16 7 16 1 2 17 17 2 3 4 17 4 5 6 7 16 17 6\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 6 7 6 1 2 17 17 2 3 4 6 17 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 6 7 6 1 2 17 17 2 3 4 6 17 4 5 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 17 7 17 1 2 5 5 2 3 4 7 17 5 6 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 17 7 17 1 2 5 5 2 3 4 7 17 5 6 15 10 11 12\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 17 0 1 6 17 6 1 2 5 5 2 3 4 8 17 6 7 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 8 17 0 7 0 1 6 7 6 1 2 5 5 2 3 4 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 10 15 16 9\n" + "14 4 10 14 11 12 13 14 15 10 11 14 17 16 15 14 13 0 17 16 17 0 9 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6 10 15 16 9\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 8 17 0 7 0 1 6 7 6 1 2 3 6 3 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 8 17 0 7 0 1 4 7 4 1 2 3 7 4 5 6 10 16 8 9 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 17 7 17 1 2 3 7 17 3 6 3 4 5 6 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 17 7 17 1 2 3 7 17 3 6 3 4 5 6 15 10 11 12\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 6 15 14 13 0 16 6 16 0 5 0 1 17 5 17 1 2 3 5 17 3 4 10 15 6 7 10 7 8 9\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 17 5 17 1 2 3 5 17 3 4 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 17 5 17 1 2 3 5 17 3 4 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 17 0 1 4 17 4 1 2 3 6 17 4 5 15 8 11 12 8 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 17 0 1 4 17 4 1 2 3 6 17 4 5 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 16 8 15 14 17 6 16 14 13 0 17 6 17 0 5 0 1 4 5 4 1 2 3 8 16 6 7 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 4 5 4 1 2 3 15 8 17 12 8 9 10 17 12 17 10 11\n" + "14 4 10 14 11 12 13 14 9 10 11 14 15 8 9 14 13 0 15 8 15 0 7 0 1 2 7 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5\n" + "14 4 10 14 11 12 13 14 15 10 11 14 16 8 15 14 13 0 16 8 16 0 7 0 1 2 7 7 2 17 6 2 3 4 17 6 17 4 5 10 15 8 9\n" + "14 4 10 14 15 12 13 14 9 10 15 14 16 8 9 14 13 0 16 8 16 0 7 0 1 2 7 7 2 17 6 2 3 4 17 6 17 4 5 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 8 17 0 7 0 1 2 7 7 2 5 6 2 3 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 10 15 14 17 8 16 14 13 0 17 8 17 0 7 0 1 2 7 7 2 3 6 6 3 4 5 10 16 8 9 15 10 11 12\n" + "14 4 10 14 15 12 13 14 16 8 15 14 17 6 16 14 13 0 17 6 17 0 5 0 1 2 5 5 2 3 4 8 16 6 7 15 8 9 12 12 9 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 5 0 1 2 5 5 2 3 4 15 8 17 12 8 9 10 17 12 17 10 11\n" + "14 4 10 14 15 12 13 14 7 8 15 14 16 6 7 14 13 0 16 6 16 0 3 0 1 2 3 6 3 4 5 15 8 17 12 8 9 10 17 12 17 10 11\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10\n" + "16 0 7 0 13 14 15 0 9 12 13 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11\n" + "16 0 7 0 13 14 15 0 9 10 13 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 13 10 11 12\n" + "16 0 7 0 11 14 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 13 14\n" + "16 0 7 0 11 12 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 13 14 15\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10\n" + "16 0 7 0 13 14 15 0 9 12 13 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 12 9 10 11\n" + "16 0 7 0 13 14 15 0 9 10 13 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 13 10 11 12\n" + "16 0 7 0 11 14 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 11 12 13 14\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 8 11 8 1 4 7 1 2 3 4 7 4 5 6 11 8 9 10\n" + "16 0 7 0 13 14 15 0 9 12 13 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 12 9 10 11\n" + "16 0 7 0 13 14 15 0 9 10 13 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 13 10 11 12\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 5 1 2 3 4 10 5 8 9 5 6 7 8\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 5 1 2 3 4 10 5 6 9 9 6 7 8\n" + "16 0 7 0 13 14 15 0 9 12 13 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7 12 9 10 11\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 6 11 6 1 4 5 1 2 3 4 11 6 7 10 10 7 8 9\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 5 6 2 3 4 5 9 6 7 8\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 7 7 2 5 6 2 3 4 5 10 7 8 9\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10\n" + "16 0 7 0 13 14 15 0 9 12 13 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 9 10 11\n" + "16 0 7 0 13 14 15 0 9 10 13 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 13 10 11 12\n" + "16 0 7 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 14\n" + "16 0 7 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 13 14 15\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 5 8 8 5 6 7\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8\n" + "16 0 7 0 13 14 15 0 9 10 13 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 13 10 11 12\n" + "16 0 7 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 14\n" + "16 0 7 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 13 14 15\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9\n" + "16 0 7 0 13 14 15 0 9 10 13 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 13 10 11 12\n" + "16 0 7 0 11 14 15 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 14\n" + "16 0 7 0 11 12 15 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 12 13 14 15\n" + "16 0 7 0 13 14 15 0 7 12 13 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 11 11 8 9 10\n" + "16 0 7 0 13 14 15 0 7 12 13 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 9 12 9 10 11\n" + "16 0 7 0 13 14 15 0 7 10 13 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9 13 10 11 12\n" + "16 0 7 0 13 14 15 0 7 8 13 0 1 6 7 6 1 2 5 5 2 3 4 13 8 9 12 12 9 10 11\n" + "16 0 7 0 11 12 15 0 7 8 11 0 1 6 7 6 1 2 5 5 2 3 4 11 8 9 10 12 13 14 15\n" + "16 0 7 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 13 14 13 10 11 12\n" + "16 0 7 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 14 14 11 12 13\n" + "16 0 7 0 9 12 15 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 12 12 13 14 15\n" + "16 0 7 0 9 10 15 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 13 14 15 10 11 12 13\n" + "16 0 7 0 9 10 15 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 11 14 15 14 11 12 13\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8\n" + "16 0 7 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 11 12 13 14\n" + "16 0 7 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 12 13 14 15\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7\n" + "16 0 7 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6 12 13 14 15\n" + "16 0 7 0 13 14 15 0 9 10 13 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 13 10 11 12\n" + "16 0 7 0 11 14 15 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 13 14\n" + "16 0 7 0 11 12 15 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 12 13 14 15\n" + "16 0 7 0 9 14 15 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 13 14 13 10 11 12\n" + "16 0 7 0 9 14 15 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 14 14 11 12 13\n" + "16 0 7 0 9 12 15 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 12 12 13 14 15\n" + "16 0 7 0 13 14 15 0 5 10 13 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 13 10 11 12\n" + "16 0 7 0 11 12 15 0 5 10 11 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 12 13 14 15\n" + "16 0 7 0 13 14 15 0 5 8 13 0 1 4 5 4 1 2 3 8 5 6 7 13 8 9 12 12 9 10 11\n" + "16 0 7 0 7 14 15 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 14 14 9 12 13 9 10 11 12\n" + "16 0 7 0 7 14 15 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 14 14 9 10 13 13 10 11 12\n" + "16 0 7 0 13 14 15 0 11 12 13 0 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7\n" + "16 0 7 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 13 14 15\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 12 13 14 15\n" + "16 1 8 16 11 12 13 16 9 10 11 16 7 8 9 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 13 14 15 0\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 11 12 13 14\n" + "16 1 8 16 11 12 13 16 9 10 11 16 7 8 9 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 13 14 15 0\n" + "16 1 8 16 13 14 15 16 11 12 13 16 5 8 11 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 10 13 16 5 8 9 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 13 10 11 12\n" + "16 1 8 16 11 12 13 16 9 10 11 16 5 6 9 16 3 4 5 16 13 0 3 3 0 1 2 9 6 7 8 13 14 15 0\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 13 14 15\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 13 14 15\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 13 14 15\n" + "16 1 8 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9\n" + "16 1 8 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9\n" + "16 1 8 16 13 14 15 16 9 10 13 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 12 13 14 15\n" + "16 1 8 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 7 8 11 11 8 9 10\n" + "16 1 8 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 7 8 9 12 9 10 11\n" + "16 1 8 16 13 14 15 16 7 10 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 13 10 11 12\n" + "16 1 8 16 11 14 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 11 12 13 14\n" + "16 1 8 16 11 12 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 12 13 14 15\n" + "16 1 8 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 13 8 11 12 8 9 10 11\n" + "16 1 8 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 13 8 9 12 12 9 10 11\n" + "16 1 8 16 11 12 15 16 7 8 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 11 8 9 10 12 13 14 15\n" + "16 1 8 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 13 14 13 10 11 12\n" + "16 1 8 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 11 14 14 11 12 13\n" + "16 1 8 16 9 12 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 11 12 12 13 14 15\n" + "16 1 8 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 11 14 15 14 11 12 13\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 13 14 15\n" + "16 1 8 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 14 15 0\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 13 14 15\n" + "16 1 8 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 14 15 0\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6\n" + "16 1 8 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6\n" + "16 1 8 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10\n" + "16 1 8 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11\n" + "16 1 8 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 13 14 15\n" + "16 1 8 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 14 15 0\n" + "16 1 8 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9\n" + "16 1 8 16 13 14 15 16 9 10 13 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 10 11 12\n" + "16 1 8 16 11 14 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 11 12 13 14\n" + "16 1 8 16 11 12 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 12 13 14 15\n" + "16 1 8 16 11 12 13 16 9 10 11 16 5 6 9 16 13 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 14 15 0\n" + "16 1 8 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10\n" + "16 1 8 16 13 14 15 16 7 10 13 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 10 11 12\n" + "16 1 8 16 11 14 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 11 12 13 14\n" + "16 1 8 16 11 12 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 12 13 14 15\n" + "16 1 8 16 11 12 13 16 7 10 11 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 14 15 0\n" + "16 1 8 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 13 8 9 12 12 9 10 11\n" + "16 1 8 16 11 12 15 16 7 8 11 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 11 8 9 10 12 13 14 15\n" + "16 1 8 16 11 12 13 16 7 8 11 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 11 8 9 10 13 14 15 0\n" + "16 1 8 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 9 10 13 14 13 10 11 12\n" + "16 1 8 16 9 12 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 9 10 11 12 12 13 14 15\n" + "16 1 8 16 9 12 13 16 7 8 9 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 9 10 11 12 13 14 15 0\n" + "16 1 8 16 9 10 11 16 7 8 9 16 5 6 7 16 11 0 5 5 0 1 4 4 1 2 3 11 12 15 0 15 12 13 14\n" + "16 1 8 16 11 12 15 16 7 8 11 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 11 8 9 10 12 13 14 15\n" + "16 1 8 16 11 12 13 16 7 8 11 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 11 8 9 10 13 14 15 0\n" + "16 1 8 16 9 12 13 16 7 8 9 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 9 10 11 12 13 14 15 0\n" + "16 1 8 16 11 12 13 16 5 8 11 16 3 4 5 16 13 0 3 3 0 1 2 8 5 6 7 11 8 9 10 13 14 15 0\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 16 6 2 3 4 16 6 16 4 5\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 16 8 16 2 5 6 2 3 4 5 8 16 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 7 16 7 2 5 6 2 3 4 5 9 16 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 16 16 3 4 5 7 16 5 6\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 16 8 16 2 3 6 6 3 4 5 8 16 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 7 16 7 2 3 6 6 3 4 5 9 16 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 11 16 9 10\n" +; + +const char* data_dqrgl_block6 = + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 16 8 16 2 3 4 8 16 4 7 4 5 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 6 7 1 2 16 6 16 2 3 4 6 16 4 5 10 7 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 8 11 8 1 6 7 1 2 16 6 16 2 3 4 6 16 4 5 11 8 9 10\n" + "16 1 8 0 13 14 15 0 9 12 13 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 4 6 16 4 5 12 9 10 11\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 4 6 16 4 5 13 10 11 12\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 4 6 16 4 5 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 4 6 16 4 5 12 13 14 15\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 6 16 1 2 5 6 5 2 3 4 16 6 7 8 10 16 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 5 16 5 2 3 4 9 16 5 6 9 6 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 7 1 2 5 16 5 2 3 4 7 16 5 6 10 7 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 8 11 8 1 16 7 1 2 5 16 5 2 3 4 7 16 5 6 11 8 9 10\n" + "16 1 8 0 13 14 15 0 9 12 13 0 1 8 9 8 1 16 7 1 2 5 16 5 2 3 4 7 16 5 6 12 9 10 11\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 8 9 8 1 16 7 1 2 5 16 5 2 3 4 7 16 5 6 13 10 11 12\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 8 9 8 1 16 7 1 2 5 16 5 2 3 4 7 16 5 6 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 8 9 8 1 16 7 1 2 5 16 5 2 3 4 7 16 5 6 12 13 14 15\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 16 12 13 14\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 6 7 1 2 5 6 5 2 3 4 11 16 7 10 7 8 9 10\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 16 9 16 1 6 7 1 2 5 6 5 2 3 4 9 16 7 8 13 10 11 12\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 16 9 16 1 6 7 1 2 5 6 5 2 3 4 9 16 7 8 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 16 9 16 1 6 7 1 2 5 6 5 2 3 4 9 16 7 8 12 13 14 15\n" + "16 1 8 0 13 14 15 0 9 16 13 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 9 10 11 13 16 11 12\n" + "16 1 8 0 16 14 15 0 9 12 16 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11 16 12 13 14\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 8 16 8 1 6 7 1 2 5 6 5 2 3 4 12 16 8 9 12 9 10 11\n" + "16 1 8 0 13 14 15 0 16 10 13 0 1 8 16 8 1 6 7 1 2 5 6 5 2 3 4 10 16 8 9 13 10 11 12\n" + "16 1 8 0 11 14 15 0 16 10 11 0 1 8 16 8 1 6 7 1 2 5 6 5 2 3 4 10 16 8 9 11 12 13 14\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 10 13 14 10 11 12 13\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 10 11 14 14 11 12 13\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 16 7 3 4 5 16 7 16 5 6\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 16 12 13 14\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 16 12 13 14\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 6 7 1 2 3 6 6 3 4 5 11 16 7 10 7 8 9 10\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 16 9 16 1 6 7 1 2 3 6 6 3 4 5 9 16 7 8 13 10 11 12\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 16 9 16 1 6 7 1 2 3 6 6 3 4 5 9 16 7 8 11 12 13 14\n" + "16 1 8 0 13 14 15 0 9 16 13 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 9 10 11 13 16 11 12\n" + "16 1 8 0 16 14 15 0 9 12 16 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 12 9 10 11 16 12 13 14\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 8 16 8 1 6 7 1 2 3 6 6 3 4 5 12 16 8 9 12 9 10 11\n" + "16 1 8 0 13 14 15 0 16 10 13 0 1 8 16 8 1 6 7 1 2 3 6 6 3 4 5 10 16 8 9 13 10 11 12\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 10 13 14 10 11 12 13\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 10 11 14 14 11 12 13\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 16 16 5 6 7 9 16 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 16 1 2 3 4 16 4 5 8 8 5 6 7 10 16 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 16 12 13 14\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 16 12 13 14\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 16 1 2 3 4 16 4 5 6 10 16 6 9 6 7 8 9\n" + "16 1 8 0 13 14 15 0 9 12 13 0 1 8 9 8 1 4 16 1 2 3 4 16 4 5 6 8 16 6 7 12 9 10 11\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 8 9 8 1 4 16 1 2 3 4 16 4 5 6 8 16 6 7 13 10 11 12\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 8 11 8 1 4 7 1 2 3 4 7 4 5 6 11 8 9 10 16 12 13 14\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 16 9 16 1 4 7 1 2 3 4 7 4 5 6 9 16 7 8 13 10 11 12\n" + "16 1 8 0 16 14 15 0 9 12 16 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 12 9 10 11 16 12 13 14\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 8 16 8 1 4 7 1 2 3 4 7 4 5 6 12 16 8 9 12 9 10 11\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 10 13 14 10 11 12 13\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 10 11 14 14 11 12 13\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 8 3 4 7 8 7 4 5 6\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 8 3 4 5 8 8 5 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 6 3 4 5 6 9 6 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 7 1 2 3 16 7 16 3 6 3 4 5 6 10 7 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 8 11 8 1 16 7 1 2 3 16 7 16 3 6 3 4 5 6 11 8 9 10\n" + "16 1 8 0 13 14 15 0 9 12 13 0 1 8 9 8 1 16 7 1 2 3 16 7 16 3 6 3 4 5 6 12 9 10 11\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 4 9 4 7 8 4 5 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 4 9 4 5 8 8 5 6 7\n" + "16 1 8 0 13 14 15 0 9 12 13 0 1 8 9 8 1 16 7 1 2 3 16 7 16 3 4 7 4 5 6 12 9 10 11\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 5 1 2 3 16 5 16 3 4 10 5 6 9 9 6 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 6 11 6 1 16 5 1 2 3 16 5 16 3 4 11 6 7 10 10 7 8 9\n" + "16 1 8 0 13 14 15 0 7 12 13 0 1 6 7 6 1 16 5 1 2 3 16 5 16 3 4 12 7 8 11 11 8 9 10\n" + "16 1 8 0 13 14 15 0 7 12 13 0 1 6 7 6 1 16 5 1 2 3 16 5 16 3 4 12 7 8 9 12 9 10 11\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 5 1 2 3 4 10 5 16 9 5 6 7 16 9 16 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 4 5 1 2 3 4 11 16 5 10 5 6 9 10 9 6 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 16 7 16 3 4 5 7 16 5 6\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 8 2 3 6 16 6 3 4 5 8 16 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 7 8 2 3 6 7 6 3 4 5 10 16 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 7 8 2 3 4 7 7 4 5 6 10 16 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 5 16 2 3 4 5 16 5 6 7 9 16 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 5 8 2 3 4 5 8 5 6 7 10 16 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 8 2 3 4 16 8 16 4 7 4 5 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 8 2 3 4 16 8 16 4 5 8 5 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 6 2 3 4 16 6 16 4 5 9 6 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 7 7 2 16 6 2 3 4 16 6 16 4 5 10 7 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 8 11 8 1 2 7 7 2 16 6 2 3 4 16 6 16 4 5 11 8 9 10\n" + "16 1 8 0 13 14 15 0 9 12 13 0 1 8 9 8 1 2 7 7 2 16 6 2 3 4 16 6 16 4 5 12 9 10 11\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 5 6 2 3 4 5 10 16 6 9 6 7 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 16 7 3 4 5 16 7 16 5 6\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 16 16 3 6 7 3 4 5 6 9 16 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 3 8 8 3 6 7 3 4 5 6 10 16 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 16 16 4 5 6 8 16 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 16 16 3 4 7 7 4 5 6 9 16 7 8\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 3 8 8 3 4 7 7 4 5 6 10 16 8 9\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 11 16 9 10\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 16 10 11\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 16 12 13 14\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 16 12 13 14\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 16 16 3 4 5 9 16 5 8 5 6 7 8\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 16 16 3 4 5 7 16 5 6 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 16 16 3 4 5 7 16 5 6 12 13 14 15\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 16 12 13 14\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 8 9 8 1 2 16 16 2 3 6 6 3 4 5 8 16 6 7 13 10 11 12\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 16 16 2 3 6 6 3 4 5 8 16 6 7 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 16 16 2 3 6 6 3 4 5 8 16 6 7 12 13 14 15\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 16 12 13 14\n" + "16 1 8 0 13 14 15 0 9 10 13 0 1 16 9 16 1 2 7 7 2 3 6 6 3 4 5 9 16 7 8 13 10 11 12\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 16 9 16 1 2 7 7 2 3 6 6 3 4 5 9 16 7 8 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 16 9 16 1 2 7 7 2 3 6 6 3 4 5 9 16 7 8 12 13 14 15\n" + "16 1 8 0 13 14 15 0 9 16 13 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 9 10 11 13 16 11 12\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 8 16 8 1 2 7 7 2 3 6 6 3 4 5 12 16 8 9 12 9 10 11\n" + "16 1 8 0 13 14 15 0 16 10 13 0 1 8 16 8 1 2 7 7 2 3 6 6 3 4 5 10 16 8 9 13 10 11 12\n" + "16 1 8 0 11 14 15 0 16 10 11 0 1 8 16 8 1 2 7 7 2 3 6 6 3 4 5 10 16 8 9 11 12 13 14\n" + "16 1 8 0 11 12 15 0 16 10 11 0 1 8 16 8 1 2 7 7 2 3 6 6 3 4 5 10 16 8 9 12 13 14 15\n" + "16 1 8 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 16 16 13 14 15\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 10 11 14 14 11 12 13\n" + "16 1 8 0 16 12 15 0 9 10 16 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 10 11 12 12 13 14 15\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 16 8 4 5 6 16 8 16 6 7\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 16 12 13 14\n" + "16 1 8 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 16 16 13 14 15\n" + "16 1 8 0 16 12 15 0 9 10 16 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 16 10 11 12 12 13 14 15\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 3 4 10 16 4 9 4 5 8 9 8 5 6 7\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 16 16 2 3 4 8 16 4 7 4 5 6 7 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 16 16 2 3 4 8 16 4 7 4 5 6 7 12 13 14 15\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5 9 10 13 14 13 10 11 12\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5 9 10 11 14 14 11 12 13\n" + "16 1 8 0 9 12 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5 9 10 11 12 12 13 14 15\n" + "16 1 8 0 9 10 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5 10 13 14 15 10 11 12 13\n" + "16 1 8 0 9 10 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5 10 11 14 15 14 11 12 13\n" + "16 1 8 0 16 14 15 0 11 12 16 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 16 12 13 14\n" + "16 1 8 0 11 16 15 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 16 16 13 14 15\n" + "16 1 8 0 16 14 15 0 9 10 16 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 16 10 11 14 14 11 12 13\n" + "16 1 8 0 16 12 15 0 9 10 16 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 16 10 11 12 12 13 14 15\n" + "16 1 8 0 11 12 15 0 7 8 11 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6 11 8 9 10 12 13 14 15\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6 9 10 13 14 13 10 11 12\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6 9 10 11 14 14 11 12 13\n" + "16 1 8 0 9 12 15 0 7 8 9 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6 9 10 11 12 12 13 14 15\n" + "16 1 8 0 9 10 15 0 7 8 9 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6 10 13 14 15 10 11 12 13\n" + "16 1 8 0 9 10 15 0 7 8 9 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6 10 11 14 15 14 11 12 13\n" + "16 1 8 0 13 14 15 0 7 12 13 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 16 16 8 9 10 12 16 10 11\n" + "16 1 8 0 13 14 15 0 7 16 13 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 11 11 8 9 10 13 16 11 12\n" + "16 1 8 0 16 14 15 0 7 12 16 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 11 11 8 9 10 16 12 13 14\n" + "16 1 8 0 13 14 15 0 7 16 13 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 9 13 16 9 12 9 10 11 12\n" + "16 1 8 0 13 14 15 0 16 12 13 0 1 6 16 6 1 2 5 5 2 3 4 12 16 6 7 12 7 8 11 11 8 9 10\n" + "16 1 8 0 13 14 15 0 16 8 13 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7 13 8 9 12 12 9 10 11\n" + "16 1 8 0 11 12 15 0 16 8 11 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7 11 8 9 10 12 13 14 15\n" + "16 1 8 0 9 14 15 0 16 8 9 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7 9 10 13 14 13 10 11 12\n" + "16 1 8 0 9 14 15 0 16 8 9 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7 9 10 11 14 14 11 12 13\n" + "16 1 8 0 9 12 15 0 16 8 9 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7 9 10 11 12 12 13 14 15\n" + "16 1 8 0 9 10 15 0 16 8 9 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7 10 11 14 15 14 11 12 13\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 16 14 16 10 11 12 14 16 12 13\n" + "16 1 8 0 9 16 15 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 13 16 13 10 11 12 16 13 14 15\n" + "16 1 8 0 16 14 15 0 7 8 16 0 1 6 7 6 1 2 5 5 2 3 4 16 8 9 14 14 9 10 13 13 10 11 12\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 16 8 16 4 5 6 8 16 6 7\n" + "16 1 8 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 3 10 3 16 9 3 4 7 16 7 4 5 6 9 16 7 8\n" + "16 1 8 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 3 8 3 16 7 3 4 5 16 7 16 5 6 11 12 13 14\n" + "16 1 8 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 3 8 3 16 7 3 4 5 16 7 16 5 6 12 13 14 15\n" + "16 1 8 0 11 16 15 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 13 16 16 13 14 15\n" + "16 1 8 0 16 12 15 0 9 10 16 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 16 10 11 12 12 13 14 15\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 16 14 16 10 11 12 14 16 12 13\n" + "16 1 8 0 9 16 15 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 13 16 13 10 11 12 16 13 14 15\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 16 7 16 1 2 3 7 16 3 6 3 4 5 6 9 10 13 14 13 10 11 12\n" + "16 1 8 0 9 14 15 0 7 8 9 0 1 16 7 16 1 2 3 7 16 3 6 3 4 5 6 9 10 11 14 14 11 12 13\n" + "16 1 8 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 3 5 16 3 4 7 8 9 14 14 9 12 13 9 10 11 12\n" + "16 1 8 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 3 5 16 3 4 7 8 9 14 14 9 10 13 13 10 11 12\n" + "16 1 8 0 11 12 15 0 5 16 11 0 1 4 5 4 1 2 3 16 5 6 9 9 6 7 8 11 16 9 10 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 3 4 5 17 1 2 3 15 0 1 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 3 4 5 15 0 3 17 3 0 1 2\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 1 4 5 15 0 1 17 4 1 2 3\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 17 5 5 17 3 4 17 1 2 3 15 0 1 17 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 17 5 5 17 3 4 17 1 2 3 15 0 1 17 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 17 5 5 17 3 4 17 1 2 3 15 0 1 17 11 8 9 10\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 4 6 17 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 17 4 5 6 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 5 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 17 6 7 8 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 17 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 9 11 17 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 10 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 9 6 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 12 13 14 15\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 10 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 15 16 9 17 13 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 9 10 11 13 17 11 12\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 17 8 9 12 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 11 12 17 12 13 14\n" + "16 2 9 16 11 17 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 11 12 13 17 17 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 11 12 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 3 4 0 1 2 3\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 1 4 4 1 2 3\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 11 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 3 4 9 16 15 17 3 3 17 1 2 15 0 1 17 9 4 5 8 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 3 4 7 16 15 17 3 3 17 1 2 15 0 1 17 7 4 5 6 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 3 4 7 16 15 17 3 3 17 1 2 15 0 1 17 7 4 5 6 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 3 4 7 16 15 17 3 3 17 1 2 15 0 1 17 7 4 5 6 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 3 4 7 16 15 17 3 3 17 1 2 15 0 1 17 7 4 5 6 11 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 5 10 11 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 10 5 6 9 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 5 8 11 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 8 5 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 5 8 9 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 8 5 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 5 8 9 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 8 5 6 7 13 10 11 12\n" + "16 2 9 16 13 14 15 16 11 12 13 16 5 6 11 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 6 6 1 4 5 1 2 3 4 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 6 6 1 2 5 5 2 3 4 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 4 4 1 2 3 17 4 5 6 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 12 13 14 15\n" + "16 2 9 16 11 12 13 16 9 10 11 16 7 8 9 16 17 6 7 16 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 13 14 15 0\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 17 6 7 8 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 5 6 9 16 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 10 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 10 11 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 7 10 11 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 17 8 9 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 12 13 14 15\n" + "16 2 9 16 11 12 13 16 9 10 11 16 17 8 9 16 5 6 17 16 13 0 5 5 0 1 4 4 1 2 3 8 17 6 7 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 9 10 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 7 8 11 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 11 8 9 10 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 17 16 9 12 13 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 12 9 10 11 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 17 8 9 12 13 14 15\n" + "16 2 9 16 11 12 13 16 17 10 11 16 7 8 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 10 17 8 9 13 14 15 0\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 10 11 12 17 12 13 14\n" + "16 2 9 16 13 14 17 16 9 10 13 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 13 10 11 12 14 15 0 17\n" + "16 2 9 16 11 14 17 16 9 10 11 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 11 12 13 14 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 10 11 12 12 13 14 15\n" + "16 2 9 16 17 12 13 16 9 10 17 16 7 8 9 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 17 10 11 12 13 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 12 13 14 17 17 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 12 15 0 17 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 2 17 2 5 6 2 3 4 5 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 2 17 2 3 4 6 17 4 5 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 17 4 7 16 15 0 17 17 0 1 2 4 17 2 3 7 4 5 6 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 2 4 17 2 3 7 4 5 6 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 2 4 17 2 3 7 4 5 6 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 2 4 17 2 3 7 4 5 6 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 2 4 17 2 3 7 4 5 6 12 13 14 15\n" + "16 2 9 16 11 12 13 16 9 10 11 16 7 8 9 16 17 4 7 16 13 0 17 17 0 1 2 4 17 2 3 7 4 5 6 13 14 15 0\n" + "16 2 9 16 13 14 15 16 11 12 13 16 5 8 11 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 8 5 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 8 5 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 8 5 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 8 5 6 7 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 8 5 6 7 12 13 14 15\n" + "16 2 9 16 13 14 15 16 9 10 13 16 5 6 9 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 9 6 7 8 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 5 6 9 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 9 6 7 8 11 12 13 14\n" + "16 2 9 16 13 14 15 16 7 10 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 1 2 4 17 2 3 10 7 8 9 13 10 11 12\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 7 8 11 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 11 8 9 10 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 17 16 9 12 13 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 12 9 10 11 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 13 16 17 10 11 16 7 8 17 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 10 17 8 9 13 14 15 0\n" + "16 2 9 16 13 14 17 16 9 10 13 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 13 10 11 12 14 15 0 17\n" + "16 2 9 16 11 14 17 16 9 10 11 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 11 12 13 14 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 13 16 9 10 17 16 7 8 9 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 17 10 11 12 13 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 12 15 0 17 12 13 14 15\n" + "16 2 9 16 17 14 15 16 11 12 17 16 5 8 11 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 5 8 11 16 3 4 5 16 17 0 3 3 0 1 2 8 5 6 7 11 8 9 10 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 8 17 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 5 8 17 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 5 8 17 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 10 17 8 9 11 12 13 14\n" + "16 2 9 16 17 14 15 16 9 10 17 16 5 8 9 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 8 9 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 6 9 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 7 4 5 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 3 4 17 16 15 0 3 3 0 1 2 8 17 4 7 4 5 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 3 4 17 16 15 0 3 3 0 1 2 8 17 4 7 4 5 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 3 4 17 16 15 0 3 3 0 1 2 8 17 4 7 4 5 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 3 4 17 16 15 0 3 3 0 1 2 8 17 4 7 4 5 6 7 11 12 13 14\n" + "16 2 9 16 11 12 13 16 9 10 11 16 17 8 9 16 3 4 17 16 13 0 3 3 0 1 2 8 17 4 7 4 5 6 7 13 14 15 0\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 5 10 5 8 9 5 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 5 10 5 6 9 9 6 7 8\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 3 4 17 16 15 0 3 3 0 1 2 8 17 4 5 8 5 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 3 4 17 16 15 0 3 3 0 1 2 8 17 4 5 8 5 6 7 11 12 13 14\n" + "16 2 9 16 11 12 13 16 9 10 11 16 17 8 9 16 3 4 17 16 13 0 3 3 0 1 2 8 17 4 5 8 5 6 7 13 14 15 0\n" + "16 2 9 16 11 12 13 16 9 10 11 16 17 6 9 16 3 4 17 16 13 0 3 3 0 1 2 6 17 4 5 9 6 7 8 13 14 15 0\n" + "16 2 9 16 13 14 15 16 7 10 13 16 17 6 7 16 3 4 17 16 15 0 3 3 0 1 2 6 17 4 5 10 7 8 9 13 10 11 12\n" + "16 2 9 16 11 12 17 16 9 10 11 16 5 6 9 16 3 4 5 16 17 0 3 3 0 1 2 9 6 7 8 12 15 0 17 12 13 14 15\n" + "16 2 9 16 17 14 15 16 7 10 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 2 9 16 11 12 13 16 17 10 11 16 5 6 17 16 3 4 5 16 13 0 3 3 0 1 2 10 17 6 9 6 7 8 9 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 16 9 10 17 16 7 8 9 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 2 9 16 9 10 17 16 7 8 9 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 6 7 6 1 4 5 1 2 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 6 7 6 1 2 5 5 2 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 6 7 6 1 2 3 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 4 7 4 1 2 3 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 5 0 1 4 5 4 1 2 3 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 2 7 7 2 5 6 2 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 2 7 7 2 3 6 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 5 6 7 15 0 5 17 5 0 3 4 0 1 2 3\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 5 6 7 15 0 5 17 5 0 1 4 4 1 2 3\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 3 4 7 15 0 3 17 3 0 1 2 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 5 8 17 3 4 5 15 0 3 17 3 0 1 2 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 17 3 4 5 15 0 3 17 3 0 1 2 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 17 3 4 5 15 0 3 17 3 0 1 2 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 17 3 4 5 15 0 3 17 3 0 1 2 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 3 4 5 15 0 3 17 3 0 1 2 11 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 6 7 15 0 1 17 6 1 2 5 5 2 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 6 7 15 0 1 17 6 1 2 3 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 4 7 15 0 1 17 4 1 2 3 7 4 5 6\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 17 1 4 5 15 0 1 17 4 1 2 3 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 17 1 4 5 15 0 1 17 4 1 2 3 13 10 11 12\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 17 5 1 2 3 17 5 17 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 4 5 1 2 3 4 7 17 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 6 17 6 1 4 5 1 2 3 4 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 17 17 2 3 4 6 17 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 5 5 2 3 4 7 17 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 6 17 6 1 2 5 5 2 3 4 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 3 17 3 4 5 7 17 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 4 17 4 1 2 3 17 4 5 6 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 3 7 17 3 6 3 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 3 5 17 3 4 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 4 17 4 1 2 3 8 17 4 5 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 4 17 4 1 2 3 6 17 4 5 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 10 17 6 9 6 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 10 17 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 8 17 6 7 12 13 14 15\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 8 9 10 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 9 10 11 13 17 11 12\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 17 8 9 12 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 12 17 12 13 14\n" + "16 2 9 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 12 13 17 17 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 12 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 17 6 2 3 4 17 6 17 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 5 6 2 3 4 5 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 6 6 3 4 5 8 17 6 7\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 4 8 17 4 7 4 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 4 8 17 4 5 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 10 17 6 9 6 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 10 17 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 8 17 6 7 12 13 14 15\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 9 10 11 13 17 11 12\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 17 8 9 12 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 12 17 12 13 14\n" +; + +const char* data_dqrgl_block7 = + "16 2 9 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 12 13 17 17 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 12 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 17 17 4 5 6 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 17 12 13 14\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 17 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 6 0 1 2 3 6 3 4 5 10 17 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 6 0 1 2 3 6 3 4 5 8 17 6 7 12 13 14 15\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 9 10 11 13 17 11 12\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 17 8 9 12 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 12 17 12 13 14\n" + "16 2 9 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 12 13 17 17 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 12 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 7 2 3 6 7 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 7 2 3 4 7 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 5 2 3 4 5 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 5 2 3 4 5 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 3 8 3 6 7 3 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 3 8 3 4 7 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 3 6 3 4 5 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 11 6 9 10 6 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 9 10 13 16 5 6 9 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 6 7 8 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 6 7 8 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 6 7 8 12 13 14 15\n" + "16 2 9 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 12 7 8 11 11 8 9 10\n" + "16 2 9 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 12 7 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 7 10 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 7 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 7 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 7 8 9 12 13 14 15\n" + "16 2 9 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 13 8 11 12 8 9 10 11\n" + "16 2 9 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 13 8 9 12 12 9 10 11\n" + "16 2 9 16 11 12 15 16 7 8 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 11 8 9 10 12 13 14 15\n" + "16 2 9 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 10 13 14 13 10 11 12\n" + "16 2 9 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 10 11 14 14 11 12 13\n" + "16 2 9 16 9 12 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 10 11 12 12 13 14 15\n" + "16 2 9 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 13 14 15 10 11 12 13\n" + "16 2 9 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 10 11 14 15 14 11 12 13\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 4 0 1 2 3 10 17 4 9 4 5 8 9 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 4 0 1 2 3 10 17 4 9 4 5 6 9 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 7 4 5 6 7 12 13 14 15\n" + "16 2 9 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 5 8 5 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 4 0 1 2 3 8 17 4 5 8 5 6 7 13 10 11 12\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 9 6 7 8 12 13 14 15\n" + "16 2 9 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 13 8 11 12 8 9 10 11\n" + "16 2 9 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 13 8 9 12 12 9 10 11\n" + "16 2 9 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 9 10 13 14 13 10 11 12\n" + "16 2 9 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 4 0 1 2 3 6 17 4 5 9 10 11 14 14 11 12 13\n" + "16 2 9 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9 17 12 13 14\n" + "16 2 9 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 2 9 16 11 17 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 11 12 13 17 17 13 14 15\n" + "16 2 9 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 11 12 12 13 14 15\n" + "16 2 9 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 11 11 8 9 10 13 17 11 12\n" + "16 2 9 16 17 14 15 16 7 12 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 2 9 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 12 17 12 13 14\n" + "16 2 9 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 9 13 17 9 12 9 10 11 12\n" + "16 2 9 16 11 12 15 16 7 17 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 9 11 17 9 10 12 13 14 15\n" + "16 2 9 16 11 17 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 11 12 13 17 17 13 14 15\n" + "16 2 9 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 12 12 13 14 15\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 9 6 7 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 9 6 7 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 9 6 7 8 9 12 13 14 15\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 2 9 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 7 10 7 8 9 12 13 14 15\n" + "16 2 9 16 13 14 15 16 17 8 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 2 9 16 11 12 15 16 17 8 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 11 8 9 10 12 13 14 15\n" + "16 2 9 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 2 9 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 9 10 11 14 14 11 12 13\n" + "16 2 9 16 9 12 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 9 10 11 12 12 13 14 15\n" + "16 2 9 16 9 10 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 8 17 6 7 10 11 14 15 14 11 12 13\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 10 17 10 11 12 12 13 14 15\n" + "16 2 9 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 13 17 13 10 11 12 17 13 14 15\n" + "16 2 9 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 11 17 17 11 14 15 11 12 13 14\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 2 9 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 11 12 8 9 10 11 12 13 14 15\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 16 17 10 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 10 10 11 14 15 14 11 12 13\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 5 6 0 1 4 5 4 1 2 3\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 5 6 0 1 2 5 5 2 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 3 6 0 1 2 3 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 15 0 5 17 5 0 3 4 0 1 2 3 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 3 4 0 1 2 3 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 3 4 0 1 2 3 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 3 4 0 1 2 3 11 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 4 5 1 2 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 2 5 5 2 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 2 3 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 15 0 5 17 5 0 1 4 4 1 2 3 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 1 4 4 1 2 3 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 1 4 4 1 2 3 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 1 4 4 1 2 3 11 12 13 14\n" + "16 2 9 16 13 14 15 16 11 12 13 16 5 6 11 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 9 10 13 16 5 6 9 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 9 6 7 8 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 5 6 9 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 9 6 7 8 11 12 13 14\n" + "16 2 9 16 13 14 15 16 7 12 13 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 12 7 8 11 11 8 9 10\n" + "16 2 9 16 13 14 15 16 7 10 13 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 10 7 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 7 10 11 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 10 7 8 9 11 12 13 14\n" + "16 2 9 16 13 14 15 16 7 8 13 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 13 8 9 12 12 9 10 11\n" + "16 2 9 16 9 14 15 16 7 8 9 16 5 6 7 16 15 17 5 5 17 3 4 15 0 3 17 3 0 1 2 9 10 13 14 13 10 11 12\n" + "16 2 9 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 8 9 5 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 6 9 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 9 10 13 16 3 4 9 16 15 17 3 3 17 1 2 15 0 1 17 9 4 5 8 8 5 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 3 4 9 16 15 17 3 3 17 1 2 15 0 1 17 9 4 5 8 8 5 6 7 11 12 13 14\n" + "16 2 9 16 13 14 15 16 7 8 13 16 3 4 7 16 15 17 3 3 17 1 2 15 0 1 17 7 4 5 6 13 8 9 12 12 9 10 11\n" + "16 2 9 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 9 10 6 7 8 9\n" + "16 2 9 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 7 8 11 8 9 10\n" + "16 2 9 16 13 14 15 16 5 10 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 10 5 6 9 9 6 7 8 13 10 11 12\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 17 3 4 5 7 17 5 6\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 17 1 2 3 4 17 4 5 6 8 17 6 7\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 7 17 3 6 3 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 7 17 3 4 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 5 1 2 3 17 5 17 3 4 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 12 13 14 15\n" + "16 2 9 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 17 5 1 2 3 17 5 17 3 4 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 14 15 0 17\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9 12 13 14 15\n" + "16 2 9 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9 13 14 15 0\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 12 17 12 13 14\n" + "16 2 9 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 14 15 0 17\n" + "16 2 9 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 12 13 14 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 12 12 13 14 15\n" + "16 2 9 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 12 13 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 13 14 17 17 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 15 0 17 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 17 6 2 3 4 17 6 17 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 5 6 2 3 4 5 8 17 6 7\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 17 17 3 4 5 7 17 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 6 6 3 4 5 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 4 17 4 5 6 8 17 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 10 17 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 14 15 0 17\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 4 8 17 4 7 4 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 12 9 10 11\n" + "16 2 9 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 11 12 13 14\n" + "16 2 9 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 12 13 14 15\n" + "16 2 9 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 17 17 2 3 4 6 17 4 5 13 14 15 0\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 1 6 6 1 2 5 5 2 3 4 8 17 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 1 6 6 1 2 5 5 2 3 4 8 17 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 6 6 1 2 5 5 2 3 4 8 17 6 7 11 12 13 14\n" + "16 2 9 16 11 12 13 16 9 10 11 16 17 8 9 16 13 0 17 17 0 1 6 6 1 2 5 5 2 3 4 8 17 6 7 13 14 15 0\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9 12 13 14 15\n" + "16 2 9 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9 13 14 15 0\n" + "16 2 9 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 14 15 0 17\n" + "16 2 9 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 12 13 14 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 11 12 12 13 14 15\n" + "16 2 9 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 11 12 13 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 13 14 17 17 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 15 0 17 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 17 7 3 4 5 17 7 17 5 6\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 12 17 10 11\n" + "16 2 9 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 14 15 0 17\n" + "16 2 9 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 17 12 13 14\n" + "16 2 9 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 14 15 0 17\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 17 8 11 8 9 10 11\n" + "16 2 9 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 17 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9 12 13 14 15\n" + "16 2 9 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9 13 14 15 0\n" + "16 2 9 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 12 14 15 0 17\n" + "16 2 9 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 12 13 14 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 11 12 12 13 14 15\n" + "16 2 9 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 11 12 13 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 15 0 17 12 13 14 15\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 2 9 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 4 4 1 2 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 2 9 16 11 12 13 16 9 10 11 16 17 6 9 16 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 9 6 7 8 13 14 15 0\n" + "16 2 9 16 9 12 13 16 7 8 9 16 17 6 7 16 13 0 17 17 0 1 4 4 1 2 3 6 17 4 5 9 10 11 12 13 14 15 0\n" + "16 2 9 16 9 10 11 16 7 8 9 16 17 6 7 16 11 0 17 17 0 1 4 4 1 2 3 6 17 4 5 11 12 15 0 15 12 13 14\n" + "16 2 9 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 2 9 16 13 14 17 16 11 12 13 16 5 6 11 16 17 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 14 15 0 17\n" + "16 2 9 16 13 14 17 16 9 10 13 16 5 6 9 16 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 10 11 12 14 15 0 17\n" + "16 2 9 16 11 14 17 16 9 10 11 16 5 6 9 16 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 11 12 13 14 14 15 0 17\n" + "16 2 9 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 2 9 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 11 12 12 13 14 15\n" + "16 2 9 16 17 12 13 16 9 10 17 16 5 6 9 16 13 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 11 12 13 14 15 0\n" + "16 2 9 16 11 12 17 16 9 10 11 16 5 6 9 16 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 12 15 0 17 12 13 14 15\n" + "16 2 9 16 17 14 15 16 7 12 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 2 9 16 13 14 17 16 7 10 13 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 10 11 12 14 15 0 17\n" + "16 2 9 16 11 14 17 16 7 10 11 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 11 12 13 14 14 15 0 17\n" + "16 2 9 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 2 9 16 17 12 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 10 11 12 12 13 14 15\n" + "16 2 9 16 17 12 13 16 7 10 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 10 11 12 13 14 15 0\n" + "16 2 9 16 11 12 17 16 7 10 11 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 12 15 0 17 12 13 14 15\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9 12 13 14 15\n" + "16 2 9 16 11 12 13 16 17 10 11 16 5 6 17 16 13 0 5 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 2 9 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 2 9 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 7 10 7 8 9 12 13 14 15\n" + "16 2 9 16 11 12 13 16 17 10 11 16 5 6 17 16 13 0 5 5 0 1 4 4 1 2 3 10 17 6 7 10 7 8 9 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 8 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 2 9 16 11 12 15 16 17 8 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 11 8 9 10 12 13 14 15\n" + "16 2 9 16 11 12 13 16 17 8 11 16 5 6 17 16 13 0 5 5 0 1 4 4 1 2 3 8 17 6 7 11 8 9 10 13 14 15 0\n" + "16 2 9 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 2 9 16 9 12 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 8 17 6 7 9 10 11 12 12 13 14 15\n" + "16 2 9 16 9 12 13 16 17 8 9 16 5 6 17 16 13 0 5 5 0 1 4 4 1 2 3 8 17 6 7 9 10 11 12 13 14 15 0\n" + "16 2 9 16 9 10 11 16 17 8 9 16 5 6 17 16 11 0 5 5 0 1 4 4 1 2 3 8 17 6 7 11 12 15 0 15 12 13 14\n" + "16 2 9 16 11 12 17 16 7 8 11 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 11 8 9 10 12 15 0 17 12 13 14 15\n" + "16 2 9 16 9 14 17 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 9 10 13 14 13 10 11 12 14 15 0 17\n" + "16 2 9 16 9 12 17 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 9 10 11 12 12 13 14 17 17 14 15 0\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 2 9 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 11 12 8 9 10 11 12 13 14 15\n" + "16 2 9 16 17 12 13 16 7 8 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 17 8 11 12 8 9 10 11 13 14 15 0\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 16 17 12 13 16 7 8 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 17 8 9 12 12 9 10 11 13 14 15 0\n" + "16 2 9 16 9 10 17 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 2 9 16 9 10 17 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 2 9 16 11 12 17 16 7 8 11 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 11 8 9 10 12 15 0 17 12 13 14 15\n" + "16 2 9 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 2 9 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 2 9 16 17 12 13 16 7 8 17 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 17 8 11 12 8 9 10 11 13 14 15 0\n" + "16 2 9 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 2 9 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 16 17 12 13 16 7 8 17 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 17 8 9 12 12 9 10 11 13 14 15 0\n" + "16 2 9 16 9 10 17 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 2 9 16 9 10 17 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 2 9 16 11 12 17 16 5 8 11 16 3 4 5 16 17 0 3 3 0 1 2 8 5 6 7 11 8 9 10 12 15 0 17 12 13 14 15\n" + "16 2 9 16 17 14 15 16 5 8 17 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 2 9 16 17 14 15 16 5 8 17 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 8 9 5 6 7 8\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 6 9 9 6 7 8\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 6 7 10 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 8 11 8 5 6 7 11 8 9 10\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 9 4 5 8 9 8 5 6 7 12 9 10 11\n" + "16 2 9 16 13 14 15 16 17 10 13 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 8 9 8 5 6 7 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 8 9 8 5 6 7 11 12 13 14\n" + "16 2 9 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 9 4 5 8 9 8 5 6 7 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 6 11 11 6 9 10 6 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 6 11 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 17 10 13 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 6 9 9 6 7 8 13 10 11 12\n" + "16 2 9 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 6 9 9 6 7 8 11 12 13 14\n" + "16 2 9 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 9 4 5 6 9 9 6 7 8 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 7 4 5 6 7 12 7 8 11 11 8 9 10\n" + "16 2 9 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 7 4 5 6 7 10 7 8 9 11 12 13 14\n" + "16 2 9 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 7 4 5 6 7 10 7 8 9 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 10 11 5 6 9 10 9 6 7 8\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 10 11 5 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 8 11 5 6 7 8 11 8 9 10\n" + "16 2 9 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 5 10 5 8 9 5 6 7 8 13 14 15 0\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 9 10 6 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 2 9 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 7 8 11 8 9 10\n" + "16 2 9 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 5 10 5 6 9 9 6 7 8 13 14 15 0\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 10 11 7 8 9 10\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 8 11 11 8 9 10\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 8 9 12 9 10 11\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 10 13 10 7 8 9 13 10 11 12\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 11 14 6 7 10 11 10 7 8 9 14 11 12 13\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 8 13 13 8 11 12 8 9 10 11\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 8 13 13 8 9 12 12 9 10 11\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 9 14 6 7 8 9 14 9 10 13 13 10 11 12\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 12 13 7 8 11 12 11 8 9 10\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 12 13 7 8 9 12 12 9 10 11\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 10 13 7 8 9 10 13 10 11 12\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "16 2 9 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 9 10 13 10 11 12\n" + "16 2 9 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 12 13 9 10 11 12\n" + "16 2 9 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 10 13 13 10 11 12\n" + "16 2 9 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 10 11 14 11 12 13\n" + "16 2 9 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 12 15 12 9 10 11 15 12 13 14\n" + "16 2 9 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 10 15 15 10 13 14 10 11 12 13\n" + "16 2 9 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 10 15 15 10 11 14 14 11 12 13\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 4 5 1 2 3 4 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 2 3 6 3 4 5 10 7 8 9\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 5 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6\n" + "16 2 9 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 17 16 17 2 7 8 2 3 6 7 6 3 4 5 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 17 16 17 2 7 8 2 3 4 7 7 4 5 6 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 16 8 16 2 5 17 2 3 4 5 17 5 6 7 8 16 17 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 17 16 17 2 5 8 2 3 4 5 8 5 6 7 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 17 16 2 3 4 17 16 17 4 5 7 16 5 6\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 16 8 16 2 17 6 2 3 4 17 6 17 4 5 8 16 6 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 7 16 7 2 17 6 2 3 4 17 6 17 4 5 9 16 7 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 7 8 7 2 17 6 2 3 4 17 6 17 4 5 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 7 8 7 2 17 6 2 3 4 17 6 17 4 5 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 17 6 2 3 4 17 6 17 4 5 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 7 10 7 2 5 6 2 3 4 5 10 7 8 9 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 17 8 17 2 5 6 2 3 4 5 8 17 6 7 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 17 8 17 2 5 6 2 3 4 5 8 17 6 7 12 16 10 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 17 16 17 2 5 6 2 3 4 5 9 16 17 6 9 6 7 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 7 1 2 17 16 17 2 5 6 2 3 4 5 7 16 17 6 10 7 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 17 1 2 7 8 7 2 5 6 2 3 4 5 17 8 9 10 11 16 17 10\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 17 9 1 2 7 17 7 2 5 6 2 3 4 5 9 17 7 8 11 16 9 10\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 16 8 16 2 3 17 17 3 6 7 3 4 5 6 8 16 17 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 17 16 17 2 3 8 8 3 6 7 3 4 5 6 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 16 16 3 4 17 17 4 5 6 7 16 17 6\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 16 8 16 2 3 17 17 3 4 7 7 4 5 6 8 16 17 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 17 16 17 2 3 8 8 3 4 7 7 4 5 6 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 7 8 7 2 3 17 17 3 4 5 7 17 5 6 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 7 8 7 2 3 17 17 3 4 5 7 17 5 6 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 17 17 3 4 5 7 17 5 6 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 6 7 1 2 16 6 16 2 3 17 17 3 4 5 6 16 17 5 10 7 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 8 11 8 1 6 7 1 2 16 6 16 2 3 17 17 3 4 5 6 16 17 5 11 8 9 10\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 17 17 3 4 5 6 16 17 5 12 9 10 11\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 17 17 3 4 5 6 16 17 5 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 17 17 3 4 5 6 16 17 5 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 16 6 16 2 3 17 17 3 4 5 6 16 17 5 12 13 14 15\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 17 8 17 2 3 6 6 3 4 5 8 17 6 7 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 17 8 17 2 3 6 6 3 4 5 8 17 6 7 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 17 8 17 2 3 6 6 3 4 5 8 17 6 7 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 7 1 2 17 16 17 2 3 6 6 3 4 5 7 16 17 6 10 7 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 8 11 8 1 16 7 1 2 17 16 17 2 3 6 6 3 4 5 7 16 17 6 11 8 9 10\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 6 6 3 4 5 7 16 17 6 12 9 10 11\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 6 6 3 4 5 7 16 17 6 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 6 6 3 4 5 7 16 17 6 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 6 6 3 4 5 7 16 17 6 12 13 14 15\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 17 1 2 7 8 7 2 3 6 6 3 4 5 17 8 9 10 11 16 17 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 17 16 1 2 7 17 7 2 3 6 6 3 4 5 16 17 7 8 10 16 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 17 9 1 2 7 17 7 2 3 6 6 3 4 5 9 17 7 8 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 17 9 1 2 7 17 7 2 3 6 6 3 4 5 9 17 7 8 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 9 1 2 7 17 7 2 3 6 6 3 4 5 9 17 7 8 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 11 17 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 16 17 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 10 16 17 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 10 16 17 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 10 16 17 9 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 17 10 11 16 12 13 14\n" + "16 2 9 0 16 17 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 16 12 13 17 17 13 14 15\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 17 1 2 7 8 7 2 3 4 7 4 5 6 17 8 9 10 11 16 17 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 12 16 17 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 11 17 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 16 17 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 10 16 17 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 10 16 17 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 10 16 17 9 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 17 10 11 16 12 13 14\n" + "16 2 9 0 16 17 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 16 12 13 17 17 13 14 15\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 12 16 17 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 11 17 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 16 17 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 17 16 17 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 10 16 17 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 10 16 17 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 10 16 17 9 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 17 10 11 16 12 13 14\n" + "16 2 9 0 16 17 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 16 12 13 17 17 13 14 15\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 17 8 17 2 3 4 8 17 4 7 4 5 6 7 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 17 8 17 2 3 4 8 17 4 7 4 5 6 7 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 17 8 17 2 3 4 8 17 4 7 4 5 6 7 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 10 7 8 9 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 8 11 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 11 8 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 11 16 7 10 7 8 9 10\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 16 9 16 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 9 16 7 8 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 16 9 16 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 9 16 7 8 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 16 9 16 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 9 16 7 8 12 13 14 15\n" +; + +const char* data_dqrgl_block8 = + "16 2 9 0 13 14 15 0 9 16 13 0 1 8 9 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 16 9 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 9 12 16 0 1 8 9 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 12 9 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 8 16 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 12 16 8 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 8 16 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 10 16 8 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 8 16 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 10 16 8 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 8 16 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 10 16 8 9 12 13 14 15\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 8 9 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 11 12 13 16 16 13 14 15\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 12 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 17 6 17 2 3 4 6 17 4 5 16 10 11 12 12 13 14 15\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 17 16 17 2 3 4 9 16 17 4 9 4 5 8 8 5 6 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 8 11 8 1 16 7 1 2 17 16 17 2 3 4 7 16 17 4 7 4 5 6 11 8 9 10\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 4 7 16 17 4 7 4 5 6 12 9 10 11\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 4 7 16 17 4 7 4 5 6 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 4 7 16 17 4 7 4 5 6 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 8 9 8 1 16 7 1 2 17 16 17 2 3 4 7 16 17 4 7 4 5 6 12 13 14 15\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 10 5 6 9 9 6 7 8\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 8 5 6 7 12 9 10 11\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 8 5 6 7 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 8 9 8 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 8 5 6 7 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 8 9 8 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 8 5 6 7 12 13 14 15\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 6 11 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 11 6 7 10 10 7 8 9\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 6 9 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 9 6 7 8 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 6 9 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 9 6 7 8 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 6 9 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 9 6 7 8 12 13 14 15\n" + "16 2 9 0 13 14 15 0 7 12 13 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 12 7 8 11 11 8 9 10\n" + "16 2 9 0 13 14 15 0 7 12 13 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 12 7 8 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 7 10 13 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 10 7 8 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 7 10 11 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 10 7 8 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 7 10 11 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 10 7 8 9 12 13 14 15\n" + "16 2 9 0 13 14 15 0 7 8 13 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 13 8 11 12 8 9 10 11\n" + "16 2 9 0 13 14 15 0 7 8 13 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 13 8 9 12 12 9 10 11\n" + "16 2 9 0 11 12 15 0 7 8 11 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 11 8 9 10 12 13 14 15\n" + "16 2 9 0 9 14 15 0 7 8 9 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 9 10 13 14 13 10 11 12\n" + "16 2 9 0 9 14 15 0 7 8 9 0 1 6 7 6 1 16 5 1 2 17 16 17 2 3 4 5 16 17 4 9 10 11 14 14 11 12 13\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 6 16 1 2 5 6 5 2 3 4 16 6 7 17 17 7 8 9 10 16 17 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 6 17 1 2 5 6 5 2 3 4 17 6 7 10 10 7 8 9 11 16 17 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 12 16 17 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 6 17 1 2 5 6 5 2 3 4 17 6 7 8 10 17 8 9 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 16 9 16 1 6 17 1 2 5 6 5 2 3 4 17 6 7 8 9 16 17 8 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 16 9 16 1 6 17 1 2 5 6 5 2 3 4 17 6 7 8 9 16 17 8 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 16 9 16 1 6 17 1 2 5 6 5 2 3 4 17 6 7 8 9 16 17 8 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 11 17 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 17 16 17 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 10 16 17 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 10 16 17 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 17 16 17 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 10 16 17 9 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 17 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 17 9 1 2 5 17 5 2 3 4 9 17 5 6 9 6 7 8 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 9 1 2 5 17 5 2 3 4 9 17 5 6 9 6 7 8 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 10 7 8 9 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 17 16 1 2 5 17 5 2 3 4 16 17 5 6 10 16 6 9 6 7 8 9\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 17 16 1 2 5 17 5 2 3 4 16 17 5 6 8 16 6 7 12 9 10 11\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 17 16 1 2 5 17 5 2 3 4 16 17 5 6 8 16 6 7 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 8 9 8 1 17 16 1 2 5 17 5 2 3 4 16 17 5 6 8 16 6 7 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 8 9 8 1 17 16 1 2 5 17 5 2 3 4 16 17 5 6 8 16 6 7 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 8 11 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 11 8 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 16 9 16 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 9 16 7 8 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 16 9 16 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 9 16 7 8 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 16 9 16 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 9 16 7 8 12 13 14 15\n" + "16 2 9 0 13 14 15 0 9 16 13 0 1 8 9 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 16 9 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 9 12 16 0 1 8 9 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 12 9 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 8 16 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 12 16 8 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 8 16 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 10 16 8 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 8 16 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 10 16 8 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 8 16 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 10 16 8 9 12 13 14 15\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 12 15 0 9 10 16 0 1 8 9 8 1 17 7 1 2 5 17 5 2 3 4 7 17 5 6 16 10 11 12 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 17 11 12 13 16 17 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 6 7 1 2 5 6 5 2 3 4 11 17 7 10 7 8 9 10 16 12 13 14\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 17 9 17 1 6 7 1 2 5 6 5 2 3 4 9 17 7 8 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 17 9 17 1 6 7 1 2 5 6 5 2 3 4 9 17 7 8 16 10 11 14 14 11 12 13\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 6 7 1 2 5 6 5 2 3 4 12 16 17 7 12 7 8 11 11 8 9 10\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 6 7 1 2 5 6 5 2 3 4 10 16 17 7 10 7 8 9 11 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 17 16 17 1 6 7 1 2 5 6 5 2 3 4 10 16 17 7 10 7 8 9 12 13 14 15\n" + "16 2 9 0 13 14 15 0 16 8 13 0 1 17 16 17 1 6 7 1 2 5 6 5 2 3 4 8 16 17 7 13 8 9 12 12 9 10 11\n" + "16 2 9 0 9 14 15 0 16 8 9 0 1 17 16 17 1 6 7 1 2 5 6 5 2 3 4 8 16 17 7 9 10 13 14 13 10 11 12\n" + "16 2 9 0 9 14 15 0 16 8 9 0 1 17 16 17 1 6 7 1 2 5 6 5 2 3 4 8 16 17 7 9 10 11 14 14 11 12 13\n" + "16 2 9 0 13 14 15 0 9 16 13 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 9 10 17 17 10 11 12 13 16 17 12\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 9 10 13 13 10 11 12 16 17 13 14\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 9 10 11 16 17 11 14 14 11 12 13\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 8 17 8 1 6 7 1 2 5 6 5 2 3 4 16 17 8 9 13 16 9 12 9 10 11 12\n" + "16 2 9 0 16 14 15 0 17 10 16 0 1 8 17 8 1 6 7 1 2 5 6 5 2 3 4 10 17 8 9 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 10 17 14 10 11 12 17 14 17 12 13\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 16 7 3 4 17 16 17 4 5 6 7 16 17 6\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 8 9 1 2 3 8 8 3 17 7 3 4 5 17 7 17 5 6 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 8 9 1 2 3 8 8 3 17 7 3 4 5 17 7 17 5 6 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 8 9 1 2 3 8 8 3 17 7 3 4 5 17 7 17 5 6 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 11 17 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 16 17 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 17 16 17 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 10 16 17 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 10 16 17 9 11 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 17 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 12 16 17 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 11 17 9 10 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 10 13 0 1 17 16 17 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 10 16 17 9 13 10 11 12\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 10 16 17 9 11 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 17 10 11 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 17 11 12 13 16 17 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 6 7 1 2 3 6 6 3 4 5 11 17 7 10 7 8 9 10 16 12 13 14\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 17 9 17 1 6 7 1 2 3 6 6 3 4 5 9 17 7 8 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 17 9 17 1 6 7 1 2 3 6 6 3 4 5 9 17 7 8 16 10 11 14 14 11 12 13\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 6 7 1 2 3 6 6 3 4 5 10 16 17 7 10 7 8 9 11 12 13 14\n" + "16 2 9 0 13 14 15 0 16 8 13 0 1 17 16 17 1 6 7 1 2 3 6 6 3 4 5 8 16 17 7 13 8 9 12 12 9 10 11\n" + "16 2 9 0 13 14 15 0 9 16 13 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 9 10 17 17 10 11 12 13 16 17 12\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 9 10 13 13 10 11 12 16 17 13 14\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 9 10 11 16 17 11 14 14 11 12 13\n" + "16 2 9 0 16 14 15 0 17 10 16 0 1 8 17 8 1 6 7 1 2 3 6 6 3 4 5 10 17 8 9 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 10 17 14 10 11 12 17 14 17 12 13\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 16 1 2 3 4 16 4 5 17 17 5 8 9 5 6 7 8 10 16 17 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 16 16 5 6 17 17 6 7 8 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 4 9 1 2 3 4 9 4 5 17 17 5 6 7 9 17 7 8 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 17 17 5 6 7 9 17 7 8 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 4 16 1 2 3 4 16 4 5 17 17 5 6 7 8 16 17 7 13 10 11 12\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 4 17 1 2 3 4 17 4 5 8 8 5 6 7 10 17 8 9 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 11 17 9 10 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 17 10 11 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 17 11 12 13 16 17 13 14\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 12 17 10 11 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 17 11 12 13 16 17 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 4 17 1 2 3 4 17 4 5 6 10 17 6 9 6 7 8 9 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 16 13 0 1 8 9 8 1 4 17 1 2 3 4 17 4 5 6 8 17 6 7 16 9 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 9 12 16 0 1 8 9 8 1 4 17 1 2 3 4 17 4 5 6 8 17 6 7 12 9 10 11 16 12 13 14\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 4 17 1 2 3 4 17 4 5 6 8 17 6 7 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 4 17 1 2 3 4 17 4 5 6 8 17 6 7 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 17 9 17 1 4 7 1 2 3 4 7 4 5 6 9 17 7 8 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 17 9 17 1 4 7 1 2 3 4 7 4 5 6 9 17 7 8 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 17 9 10 13 13 10 11 12 16 17 13 14\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 17 9 10 11 16 17 11 14 14 11 12 13\n" + "16 2 9 0 16 14 15 0 17 10 16 0 1 8 17 8 1 4 7 1 2 3 4 7 4 5 6 10 17 8 9 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 10 17 14 10 11 12 17 14 17 12 13\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 8 3 4 17 8 17 4 5 6 8 17 6 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 17 3 4 7 17 7 4 5 6 9 17 7 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 17 16 1 2 3 17 16 17 3 8 3 4 7 8 7 4 5 6 10 16 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 17 9 1 2 3 17 9 17 3 8 3 4 7 8 7 4 5 6 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 17 9 1 2 3 17 9 17 3 8 3 4 7 8 7 4 5 6 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 9 1 2 3 17 9 17 3 8 3 4 7 8 7 4 5 6 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 17 9 1 2 3 17 9 17 3 8 3 4 5 8 8 5 6 7 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 17 9 1 2 3 17 9 17 3 8 3 4 5 8 8 5 6 7 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 9 1 2 3 17 9 17 3 8 3 4 5 8 8 5 6 7 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 9 1 2 3 17 9 17 3 6 3 4 5 6 9 6 7 8 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 17 3 4 5 17 9 17 5 8 5 6 7 8\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 16 7 1 2 3 16 7 16 3 17 3 4 5 17 7 17 5 6 12 9 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 7 1 2 3 17 7 17 3 6 3 4 5 6 10 7 8 9 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 17 16 1 2 3 17 16 17 3 6 3 4 5 6 8 16 6 7 12 9 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 8 11 8 1 17 7 1 2 3 17 7 17 3 6 3 4 5 6 11 8 9 10 16 12 13 14\n" + "16 2 9 0 16 14 15 0 9 12 16 0 1 8 9 8 1 17 7 1 2 3 17 7 17 3 6 3 4 5 6 12 9 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 8 16 8 1 17 7 1 2 3 17 7 17 3 6 3 4 5 6 12 16 8 9 12 9 10 11\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 17 7 1 2 3 17 7 17 3 6 3 4 5 6 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 17 7 1 2 3 17 7 17 3 6 3 4 5 6 16 10 11 14 14 11 12 13\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 16 9 1 2 3 16 9 16 3 4 9 4 17 8 4 5 6 17 8 17 6 7\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 9 1 2 3 17 9 17 3 4 9 4 7 8 4 5 6 7 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 9 1 2 3 17 9 17 3 4 9 4 5 8 8 5 6 7 16 12 13 14\n" + "16 2 9 0 16 14 15 0 9 12 16 0 1 8 9 8 1 17 7 1 2 3 17 7 17 3 4 7 4 5 6 12 9 10 11 16 12 13 14\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 17 7 1 2 3 17 7 17 3 4 7 4 5 6 16 10 13 14 10 11 12 13\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 17 5 1 2 3 17 5 17 3 4 10 5 6 9 9 6 7 8 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 17 16 1 2 3 17 16 17 3 4 10 16 4 9 4 5 8 9 8 5 6 7\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 6 11 6 1 17 5 1 2 3 17 5 17 3 4 11 6 7 10 10 7 8 9 16 12 13 14\n" + "16 2 9 0 13 14 15 0 7 12 13 0 1 6 7 6 1 16 5 1 2 3 16 5 16 3 4 12 7 8 17 17 8 9 10 12 17 10 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 6 16 6 1 17 5 1 2 3 17 5 17 3 4 12 16 6 7 12 7 8 11 11 8 9 10\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 4 5 1 2 3 4 10 5 16 9 5 6 17 16 17 6 7 8 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 4 5 1 2 3 4 12 16 17 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 16 7 16 3 4 17 17 4 5 6 7 16 17 6\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 8 2 3 17 16 17 3 4 7 7 4 5 6 8 16 17 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 17 17 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 11 16 17 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 17 17 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 11 16 17 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 17 17 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 11 16 17 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 7 8 2 3 17 7 17 3 4 5 7 17 5 6 10 16 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 7 8 2 3 17 7 17 3 4 5 7 17 5 6 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 7 8 2 3 17 7 17 3 4 5 7 17 5 6 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 7 8 2 3 17 7 17 3 4 5 7 17 5 6 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 8 2 3 17 16 17 3 4 5 8 16 17 5 8 5 6 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5 9 6 7 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 7 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5 10 7 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 8 11 8 1 2 7 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5 11 8 9 10\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 2 7 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5 12 9 10 11\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 2 7 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 16 6 2 3 17 16 17 3 4 5 6 16 17 5 12 13 14 15\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 7 17 2 3 6 7 6 3 4 5 17 7 8 9 10 16 17 9\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 17 16 2 3 6 17 6 3 4 5 16 17 6 7 9 16 7 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 17 8 2 3 6 17 6 3 4 5 8 17 6 7 10 16 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 17 8 2 3 6 17 6 3 4 5 8 17 6 7 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 17 8 2 3 6 17 6 3 4 5 8 17 6 7 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 17 8 2 3 6 17 6 3 4 5 8 17 6 7 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 17 17 2 7 8 2 3 6 7 6 3 4 5 10 17 8 9 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 16 9 16 1 2 17 17 2 7 8 2 3 6 7 6 3 4 5 9 16 17 8 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 16 9 16 1 2 17 17 2 7 8 2 3 6 7 6 3 4 5 9 16 17 8 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 16 9 16 1 2 17 17 2 7 8 2 3 6 7 6 3 4 5 9 16 17 8 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 11 17 9 10 16 12 13 14\n" + "16 2 9 0 11 14 15 0 16 10 11 0 1 17 16 17 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 10 16 17 9 11 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 17 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 17 17 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 11 16 17 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 12 16 17 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 17 17 2 7 8 2 3 4 7 7 4 5 6 10 17 8 9 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 11 17 9 10 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 17 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 5 16 2 3 4 5 16 5 6 17 17 6 7 8 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 12 16 17 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 5 17 2 3 4 5 17 5 6 7 9 17 7 8 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 2 16 16 2 5 17 2 3 4 5 17 5 6 7 8 16 17 7 13 10 11 12\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 17 17 2 5 8 2 3 4 5 8 5 6 7 10 17 8 9 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 11 17 9 10 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 17 11 12 13 16 17 13 14\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 17 10 11 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 16 8 2 3 4 16 8 16 4 17 4 5 6 17 8 17 6 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 17 16 2 3 4 17 16 17 4 7 4 5 6 7 9 16 7 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 17 8 2 3 4 17 8 17 4 7 4 5 6 7 10 16 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 17 8 2 3 4 17 8 17 4 7 4 5 6 7 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 17 8 2 3 4 17 8 17 4 7 4 5 6 7 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 17 8 2 3 4 17 8 17 4 7 4 5 6 7 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 17 8 2 3 4 17 8 17 4 5 8 5 6 7 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 17 8 2 3 4 17 8 17 4 5 8 5 6 7 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 17 6 2 3 4 17 6 17 4 5 9 6 7 8 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 17 16 2 3 4 17 16 17 4 5 9 16 5 8 5 6 7 8\n" + "16 2 9 0 13 14 15 0 9 12 13 0 1 8 9 8 1 2 7 7 2 17 16 2 3 4 17 16 17 4 5 7 16 5 6 12 9 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 7 7 2 17 6 2 3 4 17 6 17 4 5 10 7 8 9 16 12 13 14\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 8 16 8 1 2 7 7 2 17 6 2 3 4 17 6 17 4 5 12 16 8 9 12 9 10 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 16 7 3 4 17 16 17 4 5 6 7 16 17 6\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 3 17 17 3 8 9 3 4 7 8 7 4 5 6 10 16 17 9\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 12 16 17 11\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 16 16 3 6 17 3 4 5 6 17 6 7 8 9 16 17 8\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 12 16 17 11\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 17 16 3 4 5 17 16 17 5 6 8 16 6 7\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 16 16 3 17 7 3 4 5 17 7 17 5 6 9 16 7 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 16 16 2 3 8 8 3 17 7 3 4 5 17 7 17 5 6 10 16 8 9\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 16 11 16 1 2 9 9 2 3 8 8 3 17 7 3 4 5 17 7 17 5 6 11 16 9 10\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 10 16 10 1 2 9 9 2 3 8 8 3 17 7 3 4 5 17 7 17 5 6 12 16 10 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 3 8 8 3 17 7 3 4 5 17 7 17 5 6 16 12 13 14\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 16 16 3 4 17 17 4 7 8 4 5 6 7 9 16 17 8\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 16 16 4 5 17 17 5 6 7 8 16 17 7\n" + "16 2 9 0 13 14 15 0 16 12 13 0 1 17 16 17 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 12 16 17 11\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 17 17 4 5 6 8 17 6 7 16 12 13 14\n" + "16 2 9 0 13 14 15 0 9 10 13 0 1 8 9 8 1 2 7 7 2 3 16 16 3 4 17 17 4 5 6 7 16 17 6 13 10 11 12\n" + "16 2 9 0 11 14 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 16 16 3 4 17 17 4 5 6 7 16 17 6 11 12 13 14\n" + "16 2 9 0 11 12 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 16 16 3 4 17 17 4 5 6 7 16 17 6 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 3 17 17 3 4 7 7 4 5 6 9 17 7 8 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 17 17 2 3 8 8 3 4 7 7 4 5 6 10 17 8 9 16 12 13 14\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 17 11 17 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 11 17 9 10 16 12 13 14\n" + "16 2 9 0 11 12 15 0 16 10 11 0 1 17 16 17 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 10 16 17 9 12 13 14 15\n" + "16 2 9 0 16 14 15 0 11 17 16 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 17 11 12 13 16 17 13 14\n" + "16 2 9 0 13 14 15 0 17 16 13 0 1 10 17 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 16 17 10 11 13 16 11 12\n" + "16 2 9 0 16 14 15 0 17 12 16 0 1 10 17 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 17 10 11 16 12 13 14\n" + "16 2 9 0 16 17 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 16 12 13 17 17 13 14 15\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 9 9 2 3 17 17 3 4 5 9 17 5 8 5 6 7 8 16 12 13 14\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 17 17 3 4 5 7 17 5 6 11 12 13 16 16 13 14 15\n" + "16 2 9 0 13 14 15 0 7 8 13 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 13 8 9 12 12 9 10 11\n" + "16 2 9 0 11 12 15 0 7 8 11 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 11 8 9 10 12 13 14 15\n" + "16 2 9 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 9 10 13 14 13 10 11 12\n" + "16 2 9 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 9 10 11 14 14 11 12 13\n" + "16 2 9 0 9 12 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 9 10 11 12 12 13 14 15\n" + "16 2 9 0 9 10 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 10 13 14 15 10 11 12 13\n" + "16 2 9 0 9 10 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 17 17 3 4 5 6 16 17 5 10 11 14 15 14 11 12 13\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 17 17 2 3 6 6 3 4 5 8 17 6 7 11 12 13 16 16 13 14 15\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 8 9 8 1 2 17 17 2 3 6 6 3 4 5 8 17 6 7 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 12 15 0 9 10 16 0 1 8 9 8 1 2 17 17 2 3 6 6 3 4 5 8 17 6 7 16 10 11 12 12 13 14 15\n" + "16 2 9 0 16 17 15 0 11 12 16 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 16 12 13 17 17 13 14 15\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 17 9 17 1 2 7 7 2 3 6 6 3 4 5 9 17 7 8 11 12 13 16 16 13 14 15\n" + "16 2 9 0 16 14 15 0 9 10 16 0 1 17 9 17 1 2 7 7 2 3 6 6 3 4 5 9 17 7 8 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 12 15 0 9 10 16 0 1 17 9 17 1 2 7 7 2 3 6 6 3 4 5 9 17 7 8 16 10 11 12 12 13 14 15\n" + "16 2 9 0 13 14 15 0 9 16 13 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 9 10 17 17 10 11 12 13 16 17 12\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 17 9 10 13 13 10 11 12 16 17 13 14\n" + "16 2 9 0 16 14 15 0 9 17 16 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 17 9 10 11 16 17 11 14 14 11 12 13\n" + "16 2 9 0 11 12 15 0 17 16 11 0 1 8 17 8 1 2 7 7 2 3 6 6 3 4 5 16 17 8 9 11 16 9 10 12 13 14 15\n" + "16 2 9 0 11 16 15 0 17 10 11 0 1 8 17 8 1 2 7 7 2 3 6 6 3 4 5 10 17 8 9 11 12 13 16 16 13 14 15\n" + "16 2 9 0 16 14 15 0 17 10 16 0 1 8 17 8 1 2 7 7 2 3 6 6 3 4 5 10 17 8 9 16 10 11 14 14 11 12 13\n" + "16 2 9 0 16 12 15 0 17 10 16 0 1 8 17 8 1 2 7 7 2 3 6 6 3 4 5 10 17 8 9 16 10 11 12 12 13 14 15\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 17 16 17 12 13 14 16 17 14 15\n" + "16 2 9 0 13 14 15 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 16 8 4 5 17 16 17 5 6 7 8 16 17 7\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 17 16 17 12 13 14 16 17 14 15\n" + "16 2 9 0 16 14 15 0 11 12 16 0 1 10 11 10 1 2 17 17 2 3 4 10 17 4 9 4 5 8 9 8 5 6 7 16 12 13 14\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 17 17 2 3 4 8 17 4 7 4 5 6 7 11 12 13 16 16 13 14 15\n" + "16 2 9 0 16 12 15 0 9 10 16 0 1 8 9 8 1 2 17 17 2 3 4 8 17 4 7 4 5 6 7 16 10 11 12 12 13 14 15\n" + "16 2 9 0 9 14 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5 9 10 17 14 17 10 11 12 14 17 12 13\n" + "16 2 9 0 9 16 15 0 7 8 9 0 1 6 7 6 1 2 17 17 2 3 4 6 17 4 5 9 10 13 16 13 10 11 12 16 13 14 15\n" + "16 2 9 0 9 16 15 0 7 8 9 0 1 6 7 6 1 2 17 17 2 3 4 6 17 4 5 9 10 11 16 16 11 14 15 11 12 13 14\n" + "16 2 9 0 9 10 15 0 7 8 9 0 1 6 7 6 1 2 16 16 2 3 4 6 16 4 5 10 17 14 15 10 11 12 17 14 17 12 13\n" + "16 2 9 0 11 12 15 0 5 6 11 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 11 6 7 10 10 7 8 9 12 13 14 15\n" + "16 2 9 0 9 10 15 0 5 6 9 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 9 6 7 8 10 11 14 15 14 11 12 13\n" + "16 2 9 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 7 8 13 14 13 8 9 12 12 9 10 11\n" + "16 2 9 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 7 8 13 14 13 8 9 10 13 10 11 12\n" + "16 2 9 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 7 8 11 14 11 8 9 10 14 11 12 13\n" + "16 2 9 0 7 12 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 7 8 11 12 11 8 9 10 12 13 14 15\n" + "16 2 9 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 7 8 9 14 14 9 12 13 9 10 11 12\n" + "16 2 9 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 7 8 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 0 7 10 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 7 8 9 10 10 11 14 15 14 11 12 13\n" + "16 2 9 0 7 8 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 8 13 14 15 8 9 12 13 12 9 10 11\n" + "16 2 9 0 7 8 15 0 5 6 7 0 1 16 5 16 1 2 17 17 2 3 4 5 16 17 4 8 13 14 15 8 9 10 13 13 10 11 12\n" + "16 2 9 0 9 14 15 0 7 8 9 0 1 16 7 16 1 2 5 5 2 3 4 7 16 5 6 9 10 17 14 17 10 11 12 14 17 12 13\n" + "16 2 9 0 9 16 15 0 7 8 9 0 1 17 7 17 1 2 5 5 2 3 4 7 17 5 6 9 10 13 16 13 10 11 12 16 13 14 15\n" + "16 2 9 0 9 16 15 0 7 8 9 0 1 17 7 17 1 2 5 5 2 3 4 7 17 5 6 9 10 11 16 16 11 14 15 11 12 13 14\n" + "16 2 9 0 16 10 15 0 7 8 16 0 1 17 7 17 1 2 5 5 2 3 4 7 17 5 6 16 8 9 10 10 11 14 15 14 11 12 13\n" + "16 2 9 0 16 14 15 0 7 17 16 0 1 6 7 6 1 2 5 5 2 3 4 17 7 8 13 13 8 9 12 12 9 10 11 16 17 13 14\n" + "16 2 9 0 11 12 15 0 7 16 11 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 17 17 8 9 10 11 16 17 10 12 13 14 15\n" + "16 2 9 0 16 14 15 0 7 17 16 0 1 6 7 6 1 2 5 5 2 3 4 17 7 8 9 16 17 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 0 9 14 15 0 16 8 9 0 1 6 16 6 1 2 5 5 2 3 4 8 16 6 7 9 10 17 14 17 10 11 12 14 17 12 13\n" + "16 2 9 0 9 16 15 0 17 8 9 0 1 6 17 6 1 2 5 5 2 3 4 8 17 6 7 9 10 13 16 13 10 11 12 16 13 14 15\n" + "16 2 9 0 16 14 15 0 17 8 16 0 1 6 17 6 1 2 5 5 2 3 4 8 17 6 7 16 8 9 14 14 9 10 13 13 10 11 12\n" + "16 2 9 0 16 10 15 0 17 8 16 0 1 6 17 6 1 2 5 5 2 3 4 8 17 6 7 16 8 9 10 10 11 14 15 14 11 12 13\n" + "16 2 9 0 11 16 15 0 9 10 11 0 1 8 9 8 1 2 3 8 3 17 7 3 4 5 17 7 17 5 6 11 12 13 16 16 13 14 15\n" + "16 2 9 0 9 14 15 0 7 8 9 0 1 16 7 16 1 2 3 7 16 3 6 3 4 5 6 9 10 17 14 17 10 11 12 14 17 12 13\n" + "16 2 9 0 9 16 15 0 7 8 9 0 1 17 7 17 1 2 3 7 17 3 6 3 4 5 6 9 10 13 16 13 10 11 12 16 13 14 15\n" + "16 2 9 0 7 14 15 0 5 6 7 0 1 16 5 16 1 2 3 5 16 3 4 7 8 9 14 14 9 17 13 9 10 11 17 13 17 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 3 4 5 18 1 2 3 15 0 1 18 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 2 4 18 2 3\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 3 4 18 15 0 3 17 3 0 1 2 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 3 4 5 17 0 3 18 3 0 1 2 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 1 18 5 15 0 1 17 18 1 2 3 5 18 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 1 4 18 15 0 1 17 4 1 2 3 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 1 4 5 17 0 1 18 4 1 2 3 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 4 18 0 3 0 1 2 3\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 4 18 0 1 4 1 2 3\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 17 5 5 17 3 4 17 18 2 3 15 0 18 17 2 18 0 1 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 17 5 5 17 3 4 17 18 2 3 15 0 18 17 2 18 0 1 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 17 5 5 17 3 4 17 18 2 3 15 0 18 17 2 18 0 1 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 5 6 7 16 15 17 5 5 17 3 4 17 18 2 3 15 0 18 17 2 18 0 1 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 5 6 7 16 15 17 5 5 17 3 4 17 18 2 3 15 0 18 17 2 18 0 1 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 17 5 5 17 3 4 17 18 2 3 15 0 18 17 2 18 0 1 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 17 4 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 8 17 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 8 17 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 6 17 4 5 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 6 17 4 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 6 17 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 6 17 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 6 17 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 6 17 4 5 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 17 6 7 8 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 5 6 9 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 9 6 7 8 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 5 6 9 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 9 6 7 8 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 17 11 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 17 7 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 10 17 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 10 7 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 10 11 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 10 17 6 9 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 5 6 17 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 5 6 17 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 17 8 9 10 12 17 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 12 17 8 11 8 9 10 11\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 4 4 1 2 3 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 5 6 17 18 5\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 2 5 2 3 4 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 3 6 3 0 1 2 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 4 6 17 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 4 7 18 0 3 4 3 0 1 2 7 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 7 9 17 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 10 7 8 9 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 11 8 9 10 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 12 9 10 11 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 13 10 11 12 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 12 13 14 15 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 4 5 1 2 3 4 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 2 5 5 2 3 4 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 2 18 18 2 3 4 6 18 4 5 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 18 2 3 4 6 18 4 5 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 18 2 3 4 6 18 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 18 2 3 4 6 18 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 7 9 17 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 10 7 8 9 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 11 8 9 10 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 12 9 10 11 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 13 10 11 12 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 12 13 14 15 15 0 18 17\n" + "16 3 10 16 12 13 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 6 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 4 7 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 8 17 18 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 17 18 6 7 9 17 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 10 7 8 9 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 11 8 9 10 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 12 9 10 11 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 13 10 11 12 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 12 13 14 15 15 0 18 17\n" + "16 3 10 16 12 13 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 8 17 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 6 7 8 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 10 12 17 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 7 4 5 6 7 9 17 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 5 8 5 6 7 12 17 10 11\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 6 7 8 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 9 6 7 8 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 9 6 7 8 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 9 17 5 8 5 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 17 11 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 7 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 10 7 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 10 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 10 11 12 12 13 14 15\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 2 3 18 0 1 2 10 5 8 9 5 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 17 6 7 18 18 7 8 9 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 2 3 18 0 1 2 10 5 6 9 9 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 18 6 7 8 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 18 6 7 8 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 18 6 7 8 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 4 5 8 16 17 18 4 4 18 2 3 18 0 1 2 8 5 6 7 12 9 10 11 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 18 0 1 2 8 5 6 7 13 10 11 12 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 18 0 1 2 8 5 6 7 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 18 0 1 2 8 5 6 7 12 13 14 15 15 0 18 17\n" + "16 3 10 16 12 13 17 16 10 11 12 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 18 0 1 2 8 5 6 7 13 0 18 17 13 14 15 0\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 11 12 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 11 6 7 10 10 7 8 9 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 18 9 10 11 12 17 18 11\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 9 12 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 9 6 7 8 12 9 10 11 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 10 12 17 10 11\n" + "16 3 10 16 14 15 17 16 10 13 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 9 6 7 8 13 10 11 12 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 9 6 7 8 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 9 6 7 8 12 13 14 15 15 0 18 17\n" + "16 3 10 16 12 13 17 16 10 11 12 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 9 6 7 8 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 7 17 7 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 10 12 17 10 11\n" +; + +const char* data_dqrgl_block9 = + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 12 7 10 11 7 8 9 10 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 10 11 12 17 18 11\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 8 9 10 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 3 10 16 14 15 17 16 10 11 14 16 6 7 10 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 10 7 8 9 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 6 7 10 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 3 10 16 12 13 17 16 10 11 12 16 6 7 10 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 10 7 8 9 13 0 18 17 13 14 15 0\n" + "16 3 10 16 14 15 17 16 8 13 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 8 11 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 11 8 9 10 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 3 10 16 12 15 17 16 8 11 12 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 3 10 16 12 13 17 16 8 11 12 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 11 8 9 10 13 0 18 17 13 14 15 0\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 11 18 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 8 9 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 3 10 16 12 13 17 16 8 9 12 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 12 9 10 11 13 0 18 17 13 14 15 0\n" + "16 3 10 16 10 15 17 16 8 9 10 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 3 10 16 10 11 17 16 8 9 10 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 4 0 1 2 3 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 4 4 1 2 3 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 8 17 6 7\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 17 0 5 18 5 0 1 4 4 1 2 3 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 11 8 9 10\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 8 17 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 6 7 8 10 17 8 9\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 5 6 9 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 9 6 7 8 14 15 0 17\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 10 11 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 10 7 8 9 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 9 10 12 17 10 11\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 8 11 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 11 8 9 10 14 15 0 17\n" + "16 3 10 16 13 14 17 16 9 12 13 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 12 9 10 11 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 10 13 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 11 12 13 14 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 1 2 15 0 1 18 8 17 2 7 2 3 6 7 6 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 1 2 15 0 1 18 8 17 2 7 2 3 4 7 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 4 9 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 9 4 5 8 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 4 7 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 4 5 6 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 4 7 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 4 5 6 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 4 7 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 4 5 6 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 4 5 6 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 10 11 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 10 5 6 9 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 8 11 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 8 5 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 5 8 9 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 8 5 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 5 8 9 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 8 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 8 5 6 7 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 6 11 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 5 6 9 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 5 6 9 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 9 6 7 8 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 12 13 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 7 10 13 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 10 7 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 7 10 11 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 10 7 8 9 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 8 13 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 7 8 9 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 9 10 13 14 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 8 8 5 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 6 10 17 6 9 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 6 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 6 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 6 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 6 8 17 6 7 11 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 9 10 12 17 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 8 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 8 5 6 7 17 8 9 10 12 17 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 17 6 7 10 10 7 8 9 12 17 10 11\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 5 6 5 2 3 4 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 3 6 6 3 4 5 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 4 7 1 2 3 4 7 4 5 6 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 18 5 6 7 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 12 13 14 15\n" + "16 3 10 16 11 12 13 16 9 10 11 16 7 8 9 16 17 6 7 16 13 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 6 6 1 4 5 1 2 3 4 8 18 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 6 6 1 4 5 1 2 3 4 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 6 6 1 4 5 1 2 3 4 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 0 18 18 0 1 6 6 1 4 5 1 2 3 4 8 18 6 7 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 5 5 2 3 4 18 5 6 7 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 6 6 1 2 5 5 2 3 4 8 18 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 6 6 1 2 5 5 2 3 4 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 6 6 1 2 5 5 2 3 4 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 0 18 18 0 1 6 6 1 2 5 5 2 3 4 8 18 6 7 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 3 18 3 4 5 18 5 6 7 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 3 18 3 4 5 17 18 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 18 18 1 2 3 18 3 4 5 6 17 18 5 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 2 3 18 3 4 5 6 17 18 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 2 3 18 3 4 5 6 17 18 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 2 3 18 3 4 5 6 17 18 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 4 9 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 9 4 5 8 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 17 4 7 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 7 4 5 6 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 7 4 5 6 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 7 4 5 6 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 7 4 5 6 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 7 4 5 6 12 13 14 15\n" + "16 3 10 16 11 12 13 16 9 10 11 16 7 8 9 16 17 4 7 16 13 0 17 17 0 1 18 18 1 2 3 4 17 18 3 7 4 5 6 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 10 11 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 10 5 6 9 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 8 11 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 8 5 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 8 5 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 8 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 8 5 6 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 8 5 6 7 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 6 11 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 5 6 9 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 5 6 9 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 9 6 7 8 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 12 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 7 10 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 10 7 8 9 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 6 7 8 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 9 6 7 8 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 9 6 7 8 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 18 6 9 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 9 6 7 8 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 7 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 10 11 16 18 6 7 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 7 8 9 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 8 17 6 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 8 17 6 7 12 13 14 15\n" + "16 3 10 16 11 12 13 16 9 10 11 16 17 8 9 16 18 6 17 16 13 0 18 18 0 1 4 4 1 2 3 6 18 4 5 8 17 6 7 13 14 15 0\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 8 9 10 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 8 11 16 18 6 7 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 11 8 9 10 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 12 13 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 17 8 9 12 13 14 15\n" + "16 3 10 16 11 12 13 16 17 10 11 16 7 8 17 16 18 6 7 16 13 0 18 18 0 1 4 4 1 2 3 6 18 4 5 10 17 8 9 13 14 15 0\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 10 13 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 9 10 17 16 7 8 9 16 18 6 7 16 13 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 12 13 14 17 17 14 15 0\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 4 4 1 2 3 6 18 4 5 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 18 6 7 8 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 18 6 7 8 10 18 8 9 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 18 10 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 18 6 7 8 10 18 8 9 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 12 17 16 9 10 11 16 18 8 9 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 8 18 6 7 12 13 14 17 17 14 15 0\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 7 8 18 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 18 8 9 10 12 18 10 11 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 12 17 16 18 10 11 16 7 8 18 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 18 8 9 12 13 14 17 17 14 15 0\n" + "16 3 10 16 17 14 18 16 9 10 17 16 7 8 9 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 17 10 11 12 17 12 13 14 14 15 0 18\n" + "16 3 10 16 17 12 18 16 9 10 17 16 7 8 9 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 17 10 11 12 12 13 14 18 18 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 17 4 5 6 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 17 4 5 6 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 17 4 5 6 8 17 6 7 13 10 11 12\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 17 8 9 10 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 8 11 16 18 4 7 16 17 0 18 18 0 1 2 4 18 2 3 7 4 5 6 11 8 9 10 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 12 13 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 2 4 18 2 3 7 4 5 6 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 10 17 8 9 12 13 14 15\n" + "16 3 10 16 11 12 13 16 17 10 11 16 7 8 17 16 18 4 7 16 13 0 18 18 0 1 2 4 18 2 3 7 4 5 6 10 17 8 9 13 14 15 0\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 10 13 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 2 4 18 2 3 7 4 5 6 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 2 4 18 2 3 7 4 5 6 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 17 10 11 12 12 13 14 15\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 2 4 18 2 3 7 4 5 6 12 15 0 17 12 13 14 15\n" + "16 3 10 16 17 14 15 16 11 12 17 16 5 8 11 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 5 8 11 16 18 4 5 16 17 0 18 18 0 1 2 4 18 2 3 8 5 6 7 11 8 9 10 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 12 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 12 13 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 2 4 18 2 3 8 5 6 7 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 10 13 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 2 4 18 2 3 8 5 6 7 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 2 4 18 2 3 8 5 6 7 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 11 12 17 16 9 10 11 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 2 4 18 2 3 8 5 6 7 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 10 17 4 5 10 5 8 9 5 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 10 17 4 5 10 5 6 9 9 6 7 8\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 8 17 4 5 8 5 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 8 17 4 5 8 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 8 17 4 5 8 5 6 7 11 12 13 14\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 6 9 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 6 9 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 10 13 16 17 6 7 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 6 17 4 5 10 7 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 7 10 11 16 17 6 7 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 6 17 4 5 10 7 8 9 11 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 10 17 16 5 6 7 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 18 4 5 6 18 18 6 7 8 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 18 6 7 8 18 18 8 9 10 12 18 10 11\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 18 14 8 9 10 18 18 10 11 12 14 18 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 18 7 18 1 2 3 18 3 4 5 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 4 18 4 1 2 3 18 4 5 6 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 2 18 18 2 5 6 2 3 4 5 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 5 6 7 15 0 5 17 5 0 18 4 0 1 2 18 4 18 2 3\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 3 4 0 1 2 3 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 5 6 18 15 0 5 17 5 0 3 4 0 1 2 3 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 5 6 7 15 0 5 18 5 0 3 4 0 1 2 3 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 5 6 7 15 0 5 18 5 0 3 4 0 1 2 3 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 5 6 7 15 0 5 18 5 0 3 4 0 1 2 3 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 4 4 1 2 3 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 5 6 18 15 0 5 17 5 0 1 4 4 1 2 3 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 5 6 7 15 0 5 18 5 0 1 4 4 1 2 3 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 5 6 7 15 0 5 18 5 0 1 4 4 1 2 3 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 5 6 7 15 0 5 18 5 0 1 4 4 1 2 3 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 5 6 7 17 0 5 18 5 0 1 4 4 1 2 3 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 2 6 18 2 5 2 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 2 6 18 2 3 6 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 4 7 15 0 18 17 18 0 1 2 4 18 2 3 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 5 8 17 18 4 5 15 0 18 17 18 0 1 2 4 18 2 3 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 2 4 18 2 3 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 2 4 18 2 3 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 2 4 18 2 3 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 2 4 18 2 3 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 3 4 7 15 0 3 18 3 0 1 2 7 4 5 6 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 3 4 7 15 0 3 18 3 0 1 2 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 3 4 7 15 0 3 18 3 0 1 2 7 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 3 4 7 17 0 3 18 3 0 1 2 7 4 5 6 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 8 18 3 4 5 15 0 3 18 3 0 1 2 8 5 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 5 8 18 3 4 5 15 0 3 18 3 0 1 2 8 5 6 7 12 17 10 11\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 3 4 18 15 0 3 17 3 0 1 2 8 18 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 3 4 18 15 0 3 17 3 0 1 2 8 18 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 17 3 4 18 15 0 3 17 3 0 1 2 6 18 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 17 3 4 18 15 0 3 17 3 0 1 2 6 18 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 17 3 4 18 15 0 3 17 3 0 1 2 6 18 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 3 4 18 15 0 3 17 3 0 1 2 6 18 4 5 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 10 17 6 9 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 8 17 6 7 11 12 13 14\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 12 13 16 7 8 9 16 17 18 7 7 18 5 6 18 3 4 5 17 0 3 18 3 0 1 2 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 10 17 8 9 13 10 11 12\n" + "16 3 10 16 13 14 17 16 9 10 13 16 7 8 9 16 17 18 7 7 18 5 6 18 3 4 5 17 0 3 18 3 0 1 2 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 3 4 5 17 0 3 18 3 0 1 2 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 17 10 11 14 14 11 12 13\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 3 4 5 17 0 3 18 3 0 1 2 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 6 7 15 0 1 17 6 1 2 18 18 2 3 4 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 18 7 15 0 1 17 18 1 2 5 5 2 3 4 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 6 18 15 0 1 17 6 1 2 5 5 2 3 4 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 1 6 7 15 0 1 18 6 1 2 5 5 2 3 4 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 1 6 7 15 0 1 18 6 1 2 5 5 2 3 4 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 1 6 7 15 0 1 18 6 1 2 5 5 2 3 4 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 1 6 7 17 0 1 18 6 1 2 5 5 2 3 4 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 18 7 15 0 1 17 18 1 2 3 18 3 4 5 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 1 6 7 15 0 1 18 6 1 2 3 6 3 4 5 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 1 6 7 15 0 1 18 6 1 2 3 6 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 1 6 7 15 0 1 18 6 1 2 3 6 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 1 6 7 17 0 1 18 6 1 2 3 6 3 4 5 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 1 4 7 15 0 1 18 4 1 2 3 7 4 5 6 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 1 4 7 15 0 1 18 4 1 2 3 7 4 5 6 12 17 10 11\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 17 1 18 5 15 0 1 17 18 1 2 3 5 18 3 4 12 9 10 11\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 4 18 15 0 1 17 4 1 2 3 8 18 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 4 18 15 0 1 17 4 1 2 3 6 18 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 4 18 15 0 1 17 4 1 2 3 6 18 4 5 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 10 17 6 9 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 18 17 17 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 8 17 6 7 13 10 11 12\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 17 16 9 10 13 16 7 8 9 16 17 18 7 7 18 5 6 18 1 4 5 17 0 1 18 4 1 2 3 13 10 11 12 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 17 10 11 14 14 11 12 13\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 1 4 5 17 0 1 18 4 1 2 3 12 15 0 17 12 13 14 15\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 1 4 5 17 0 1 18 4 1 2 3 12 13 0 17 0 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 5 0 1 4 5 4 1 2 3\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 5 0 1 2 5 5 2 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 3 0 1 2 3 6 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 1 6 1 4 5 1 2 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 1 6 1 2 5 5 2 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 10 17 4 9 4 5 8 9 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 10 17 4 9 4 5 6 9 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 10 17 4 7 4 5 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 6 7 1 2 5 6 5 2 3 4 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 6 7 1 2 3 6 6 3 4 5 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 4 18 1 2 3 4 18 4 5 6 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 7 1 2 3 4 7 4 5 6 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 18 17 1 2 3 18 17 18 3 4 6 17 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 18 5 1 2 3 18 5 18 3 4 7 17 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 6 17 6 1 18 5 1 2 3 18 5 18 3 4 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 5 1 2 3 4 18 5 6 7 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 5 1 2 3 4 17 18 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 4 5 1 2 3 4 7 18 5 6 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 4 5 1 2 3 4 7 18 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 4 5 1 2 3 4 7 18 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 5 1 2 3 4 8 17 18 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 5 1 2 3 4 6 17 18 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 5 1 2 3 4 6 17 18 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 5 1 2 3 4 6 17 18 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 5 1 2 3 4 6 17 18 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 5 1 2 3 4 6 17 18 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 4 5 1 2 3 4 18 7 8 9 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 6 18 6 1 4 5 1 2 3 4 8 18 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 6 18 6 1 4 5 1 2 3 4 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 6 18 6 1 4 5 1 2 3 4 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 10 18 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 11 12 13 17 18 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 12 18 10 11 17 12 13 14\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 5 6 2 3 4 5 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 7 7 2 5 6 2 3 4 5 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 6 6 1 4 5 1 2 3 4 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 3 6 6 3 4 5 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 7 7 2 3 6 6 3 4 5 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 6 6 1 2 5 5 2 3 4 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 3 4 18 4 5 6 7 17 18 6\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 6 6 1 2 3 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 5 5 2 3 4 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 4 4 1 2 3 7 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 3 4 17 18 4 5 7 17 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 18 18 2 3 4 5 17 18 4 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 18 18 2 3 4 5 17 18 4 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 18 18 2 3 4 5 17 18 4 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 18 18 2 3 4 5 17 18 4 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 2 18 18 2 3 4 5 17 18 4 12 13 14 15\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 5 8 5 0 1 4 4 1 2 3 8 5 6 7 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 5 5 2 3 4 17 18 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 5 5 2 3 4 6 17 18 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 5 5 2 3 4 6 17 18 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 5 5 2 3 4 6 17 18 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 5 5 2 3 4 6 17 18 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 5 5 2 3 4 6 17 18 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 2 5 5 2 3 4 18 7 8 9 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 0 5 6 5 0 1 4 4 1 2 3 9 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 4 4 1 2 3 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 4 4 1 2 3 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 12 18 10 11 17 12 13 14\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 4 4 1 2 3 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 4 4 1 2 3 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 6 7 3 4 5 6 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 2 7 2 5 6 2 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 3 17 3 4 18 18 4 5 6 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 4 7 7 4 5 6 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 2 7 2 3 6 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 4 5 17 18 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 4 5 8 17 18 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 5 6 17 18 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 5 6 17 18 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 5 6 17 18 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 5 6 17 18 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 5 6 17 18 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 2 3 6 3 4 5 18 7 8 9 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 0 5 6 5 0 1 2 5 2 3 4 9 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 2 5 2 3 4 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 2 5 2 3 4 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 2 5 2 3 4 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 2 5 2 3 4 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 4 17 4 1 2 3 17 4 5 18 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 3 8 3 0 1 2 8 3 4 7 7 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 4 18 4 1 2 3 18 4 5 6 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 4 18 4 1 2 3 18 4 5 6 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 3 6 3 0 1 2 6 3 4 5 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 3 6 3 0 1 2 6 3 4 5 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 3 6 3 0 1 2 6 3 4 5 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 3 6 3 0 1 2 6 3 4 5 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 17 18 3 6 3 4 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 2 3 7 18 3 6 3 4 5 6 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 3 7 18 3 6 3 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 3 7 18 3 6 3 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 17 18 3 4 8 17 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 17 18 3 4 8 17 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 4 6 17 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 4 6 17 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 4 6 17 4 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 4 6 17 4 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 10 17 6 9 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 8 17 6 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 8 17 6 7 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 8 9 10 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 8 17 18 3 8 3 4 7 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 6 17 18 3 6 3 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 6 17 18 3 6 3 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 6 17 18 3 6 3 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 6 17 18 3 6 3 4 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 6 17 18 3 6 3 4 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 11 6 9 10 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 5 6 9 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 9 6 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 9 6 7 8 12 13 14 15\n" + "16 3 10 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 12 7 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 7 10 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 10 7 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 10 7 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 10 7 8 9 12 13 14 15\n" + "16 3 10 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 13 8 11 12 8 9 10 11\n" + "16 3 10 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 13 8 9 12 12 9 10 11\n" + "16 3 10 16 11 12 15 16 7 8 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 11 8 9 10 12 13 14 15\n" + "16 3 10 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 9 10 11 14 14 11 12 13\n" + "16 3 10 16 9 12 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 9 10 11 12 12 13 14 15\n" + "16 3 10 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 10 13 14 15 10 11 12 13\n" + "16 3 10 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 10 11 14 15 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 9 9 6 7 8 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 4 9 18 0 3 4 3 0 1 2 9 4 5 8 8 5 6 7 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 18 7 8 9 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 4 9 18 0 3 4 3 0 1 2 9 4 5 6 9 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 10 17 18 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 8 17 18 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 8 17 18 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 8 17 18 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 8 17 18 7 11 12 13 14\n" +; + +const char* data_dqrgl_block10 = + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 8 17 18 7 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 4 7 18 0 3 4 3 0 1 2 7 4 5 6 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 4 7 18 0 3 4 3 0 1 2 7 4 5 6 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 4 7 18 0 3 4 3 0 1 2 7 4 5 6 14 11 12 13 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 4 7 18 0 3 4 3 0 1 2 7 4 5 6 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 4 18 4 1 2 3 8 18 4 5 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 4 18 4 1 2 3 8 18 4 5 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 8 17 6 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 8 17 6 7 12 13 14 15\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 4 5 4 1 2 3 10 17 6 18 6 7 8 18 10 18 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 9 6 7 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 3 10 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 10 11 12 12 13 14 15\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 12 7 10 11 7 8 9 10 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 8 9 18 18 9 10 11 12 17 18 11\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 8 9 10 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 3 10 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 9 10 18 18 10 11 12 13 17 18 12\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 3 10 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 13 8 9 10 13 10 11 12 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 3 10 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 17 8 18 8 9 10 18 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 18 18 11 12 13 17 18 13 14\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 12 18 17 18 12 13 14 17 18 14 15\n" + "16 3 10 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 17 6 2 3 18 17 18 3 4 5 6 17 18 5\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 5 18 2 3 4 5 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 18 6 2 3 4 18 6 18 4 5 8 17 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 18 2 5 6 2 3 4 5 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 12 18 10 11 17 12 13 14\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 4 5 1 2 3 4 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 17 12 13 18 18 13 14 15\n" + "16 3 10 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 4 5 1 2 3 4 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 6 7 3 4 5 6 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 4 7 7 4 5 6 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 4 5 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 4 5 8 17 18 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 12 13 14 15\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 2 5 5 2 3 4 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 17 12 13 18 18 13 14 15\n" + "16 3 10 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 2 5 5 2 3 4 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 4 8 17 4 18 4 5 6 18 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 2 5 5 2 3 4 10 17 6 18 6 7 8 18 10 18 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 9 6 7 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 3 10 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 10 11 12 12 13 14 15\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 12 7 10 11 7 8 9 10 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 3 10 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 3 10 16 12 13 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 10 7 8 9 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 9 10 18 18 10 11 12 13 17 18 12\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 3 10 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 17 8 18 8 9 10 18 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 18 18 11 12 13 17 18 13 14\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 12 18 17 18 12 13 14 17 18 14 15\n" + "16 3 10 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 10 11 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 9 9 4 7 8 4 5 6 7 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 17 17 4 5 18 18 5 6 7 8 17 18 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 9 9 4 5 8 8 5 6 7 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 18 7 8 9 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 6 6 3 4 5 9 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 18 18 4 5 6 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 18 18 4 5 6 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 8 17 18 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 8 17 18 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 8 17 18 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 8 17 18 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 8 17 18 7 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 17 18 8 9 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 10 18 8 9 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 6 6 3 4 5 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 6 6 3 4 5 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 3 10 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 6 6 3 4 5 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 8 9 5 6 7 8 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 9 9 6 7 8 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 7 10 17 18 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 7 8 17 18 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 7 8 17 18 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 7 8 17 18 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 7 8 17 18 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 7 8 17 18 7 12 13 14 15\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 4 7 4 5 6 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 4 7 4 5 6 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 17 12 13 18 18 13 14 15\n" + "16 3 10 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 4 7 4 5 6 13 0 18 17 13 14 15 0\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 8 17 18 5 8 5 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 8 17 18 5 8 5 6 7 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 6 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 6 7 8 12 13 14 15\n" + "16 3 10 16 13 14 15 16 7 10 13 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 10 7 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 10 7 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 10 7 8 9 12 13 14 15\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 13 8 11 12 8 9 10 11\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 3 10 16 11 12 15 16 7 8 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 11 8 9 10 12 13 14 15\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 10 11 14 14 11 12 13\n" + "16 3 10 16 9 12 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 10 11 12 12 13 14 15\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 3 10 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 9 10 18 18 10 11 12 13 17 18 12\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 3 10 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 17 8 18 8 9 10 18 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 18 18 11 12 13 17 18 13 14\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 12 18 17 18 12 13 14 17 18 14 15\n" + "16 3 10 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 10 11 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 0 1 2 5 2 3 4 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 7 2 3 18 7 18 3 4 5 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 6 18 6 3 4 5 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 2 18 8 18 2 7 2 3 6 7 6 3 4 5 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 7 2 3 6 7 6 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 7 2 3 6 7 6 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 4 18 18 4 5 6 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 2 18 8 18 2 7 2 3 4 7 7 4 5 6 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 7 2 3 4 7 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 7 2 3 4 7 7 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 5 2 3 4 5 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 5 2 3 4 5 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 4 18 8 18 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 4 18 6 18 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 4 18 6 18 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 4 18 6 18 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 4 18 6 18 4 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 4 18 6 18 4 5 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 10 17 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 8 17 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 8 17 6 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 8 17 6 7 12 13 14 15\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 3 8 3 18 7 3 4 5 18 7 18 5 6\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 3 8 3 6 7 3 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 3 8 3 6 7 3 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 3 8 3 4 7 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 3 8 3 4 7 7 4 5 6 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 8 17 4 5 8 5 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 8 17 4 5 8 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 8 17 4 5 8 5 6 7 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 8 17 4 5 8 5 6 7 12 13 14 15\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 9 6 7 8 12 13 14 15\n" + "16 3 10 16 11 14 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 10 7 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 10 7 8 9 12 13 14 15\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 13 8 11 12 8 9 10 11\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 13 8 9 12 12 9 10 11\n" + "16 3 10 16 11 12 15 16 7 8 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 11 8 9 10 12 13 14 15\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 9 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 11 6 18 10 6 7 8 18 10 18 8 9\n" + "16 3 10 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 11 6 9 10 6 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 17 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 12 7 8 18 18 8 9 10 12 18 10 11\n" + "16 3 10 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 7 8 11 11 8 9 10 13 17 11 12\n" + "16 3 10 16 17 14 15 16 7 12 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 3 10 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 7 8 9 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 7 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 12 15 16 7 17 11 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 7 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 17 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 7 8 9 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 7 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 17 6 9 6 7 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 17 6 9 6 7 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 17 6 9 6 7 8 9 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 3 10 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 17 6 7 10 7 8 9 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 8 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 3 10 16 11 12 15 16 17 8 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 11 8 9 10 12 13 14 15\n" + "16 3 10 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 9 10 11 14 14 11 12 13\n" + "16 3 10 16 9 12 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 9 10 11 12 12 13 14 15\n" + "16 3 10 16 9 10 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 10 13 14 15 10 11 12 13\n" + "16 3 10 16 9 10 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 10 11 14 15 14 11 12 13\n" + "16 3 10 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 13 8 18 12 8 9 10 18 12 18 10 11\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 11 12 8 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 10 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 10 17 10 11 12 12 13 14 15\n" + "16 3 10 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 2 17 4 17 2 3 9 10 18 14 18 10 11 12 14 18 12 13\n" + "16 3 10 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 10 13 17 13 10 11 12 17 13 14 15\n" + "16 3 10 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 10 11 17 17 11 14 15 11 12 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 3 10 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 11 12 8 9 10 11 12 13 14 15\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 17 10 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 10 10 11 14 15 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 9 4 5 8 9 8 5 6 7 11 17 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 4 0 1 2 3 10 18 4 9 4 5 8 9 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 4 0 1 2 3 10 18 4 9 4 5 8 9 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 4 0 1 2 3 10 18 4 9 4 5 6 9 9 6 7 8 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 4 0 1 2 3 10 18 4 9 4 5 6 9 9 6 7 8 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 7 4 5 6 7 9 17 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 7 4 5 6 7 9 17 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 7 4 5 6 7 9 17 7 8 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 10 17 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 5 8 5 6 7 17 10 11 12 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 5 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 6 11 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 11 17 5 10 5 6 9 10 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 11 17 5 10 5 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 9 17 5 8 5 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 9 17 5 8 5 6 7 8 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 9 17 5 8 5 6 7 8 12 13 14 15\n" + "16 3 10 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 13 8 11 12 8 9 10 11\n" + "16 3 10 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 7 17 5 6 9 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 3 10 16 11 14 15 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 3 10 16 13 14 15 16 17 8 13 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 14 15 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 8 17 6 7 9 10 11 14 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 11 12 8 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 10 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 3 10 16 11 17 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 11 12 18 17 18 12 13 14 17 18 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 18 18 8 11 12 8 9 10 11 13 17 18 12\n" + "16 3 10 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 13 13 8 11 12 8 9 10 11 17 18 13 14\n" + "16 3 10 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 18 18 8 9 12 12 9 10 11 13 17 18 12\n" + "16 3 10 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 13 13 8 9 12 12 9 10 11 17 18 13 14\n" + "16 3 10 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 18 18 8 9 10 18 10 11 12 13 17 18 12\n" + "16 3 10 16 11 12 15 16 7 17 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 18 18 8 9 10 11 17 18 10 12 13 14 15\n" + "16 3 10 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 11 11 8 9 10 17 18 11 12 17 12 13 14\n" + "16 3 10 16 17 12 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 11 11 8 9 10 17 18 11 12 12 13 14 15\n" + "16 3 10 16 17 18 15 16 7 12 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 12 7 8 11 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 18 18 11 12 13 17 18 13 14\n" + "16 3 10 16 17 18 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 12 9 10 11 12 17 12 13 14\n" + "16 3 10 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 12 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 17 10 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 3 10 16 11 17 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 11 12 18 17 18 12 13 14 17 18 14 15\n" + "16 3 10 16 17 18 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 11 6 7 18 11 18 7 8 9 11 18 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 10 18 10 7 8 9 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 11 6 7 10 11 10 7 8 9 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 12 18 6 11 6 7 10 11 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 8 18 18 8 9 10 12 18 10 11\n" + "16 3 10 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 12 18 6 11 6 7 8 11 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 8 18 12 18 8 11 8 9 10 11\n" + "16 3 10 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 18 6 7 8 18 10 18 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 18 6 7 8 18 10 18 8 9 12 13 14 15\n" + "16 3 10 16 17 14 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 17 10 11 12 17 12 13 14\n" + "16 3 10 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 9 6 7 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 17 15 16 18 10 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 7 12 7 18 11 7 8 9 18 11 18 9 10\n" + "16 3 10 16 11 17 15 16 18 10 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 7 10 7 8 9 11 12 13 17 17 13 14 15\n" + "16 3 10 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 3 10 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 12 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 10 17 10 11 12 12 13 14 15\n" + "16 3 10 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 7 13 17 7 12 7 8 11 12 11 8 9 10\n" + "16 3 10 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 7 13 17 7 12 7 8 9 12 12 9 10 11\n" + "16 3 10 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 7 11 17 7 10 7 8 9 10 12 13 14 15\n" + "16 3 10 16 9 10 15 16 18 17 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 7 9 17 7 8 10 11 14 15 14 11 12 13\n" + "16 3 10 16 9 17 15 16 18 8 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 9 10 13 17 13 10 11 12 17 13 14 15\n" + "16 3 10 16 9 17 15 16 18 8 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 9 10 11 17 17 11 14 15 11 12 13 14\n" + "16 3 10 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 17 10 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 10 10 11 14 15 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 3 10 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 3 10 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 12 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 10 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 10 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 18 17 18 10 13 14 10 11 12 13 17 18 14 15\n" + "16 3 10 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 8 9 14 15 14 9 12 13 9 10 11 12 15 0 18 17\n" + "16 3 10 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 18 17 18 10 11 14 14 11 12 13 17 18 14 15\n" + "16 3 10 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 8 9 14 15 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 3 10 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 18 17 18 10 11 12 18 12 13 14 17 18 14 15\n" +; + +const char* data_dqrgl_block11 = + "16 3 10 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 8 9 14 15 14 9 10 11 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 13 14 8 9 18 13 18 9 10 11 13 18 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 12 18 12 9 10 11 14 18 12 13\n" + "16 3 10 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 13 18 8 9 12 13 12 9 10 11 18 13 14 15\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 10 18 18 10 11 12 14 18 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 10 18 14 18 10 13 10 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 14 14 9 18 13 9 10 11 18 13 18 11 12\n" + "16 3 10 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 14 15 9 10 13 14 13 10 11 12\n" + "16 3 10 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 14 15 9 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 5 6 0 1 4 5 4 1 2 3 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 5 6 0 1 4 5 4 1 2 3 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 5 6 0 1 4 5 4 1 2 3 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 5 6 0 1 2 5 5 2 3 4 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 5 6 0 1 2 5 5 2 3 4 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 5 6 0 1 2 5 5 2 3 4 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 3 6 0 1 2 3 6 3 4 5 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 3 6 0 1 2 3 6 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 3 6 0 1 2 3 6 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 2 18 4 18 2 3 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 2 18 4 18 2 3 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 2 18 4 18 2 3 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 2 18 4 18 2 3 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 3 4 0 1 2 3 8 18 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 4 0 1 2 3 6 18 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 4 0 1 2 3 6 18 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 4 0 1 2 3 6 18 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 4 0 1 2 3 6 18 4 5 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 10 17 6 9 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 8 17 6 7 11 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 10 17 8 9 11 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 1 6 6 1 4 5 1 2 3 4 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 4 5 1 2 3 4 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 4 5 1 2 3 4 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 17 0 7 18 7 0 1 6 6 1 4 5 1 2 3 4 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 1 6 6 1 2 5 5 2 3 4 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 1 6 6 1 2 5 5 2 3 4 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 2 5 5 2 3 4 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 2 5 5 2 3 4 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 17 0 7 18 7 0 1 6 6 1 2 5 5 2 3 4 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 1 6 6 1 2 3 6 3 4 5 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 2 3 6 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 2 3 6 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 17 0 7 18 7 0 1 6 6 1 2 3 6 3 4 5 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 4 4 1 2 3 6 18 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 4 4 1 2 3 6 18 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 4 4 1 2 3 6 18 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 4 4 1 2 3 6 18 4 5 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 10 17 6 9 6 7 8 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 8 17 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 8 17 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 8 17 6 7 11 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 8 11 16 17 18 7 7 18 5 6 17 0 5 18 5 0 1 4 4 1 2 3 11 8 9 10 14 15 0 17\n" + "16 3 10 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 17 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 12 13 16 7 8 9 16 17 18 7 7 18 5 6 17 0 5 18 5 0 1 4 4 1 2 3 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 14 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 17 0 5 18 5 0 1 4 4 1 2 3 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 6 11 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 9 6 7 8 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 12 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 7 10 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 2 4 18 2 3 10 7 8 9 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 10 17 4 9 4 5 8 9 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 8 17 4 7 4 5 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 8 17 4 7 4 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 8 17 4 7 4 5 6 7 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 6 11 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 6 9 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 6 9 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 6 7 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 15 0 3 18 3 0 1 2 6 17 4 5 9 10 13 14 13 10 11 12\n" + "16 3 10 16 17 14 15 16 11 12 17 16 5 6 11 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 5 6 11 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 11 6 7 10 10 7 8 9 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 5 6 9 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 9 6 7 8 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 7 17 13 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 7 8 11 11 8 9 10 13 17 11 12\n" + "16 3 10 16 17 14 15 16 7 12 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 7 12 13 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 12 7 8 11 11 8 9 10 14 15 0 17\n" + "16 3 10 16 13 14 15 16 7 17 13 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 7 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 14 17 16 7 10 11 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 10 7 8 9 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 7 10 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 10 17 6 9 6 7 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 10 17 6 9 6 7 8 9 11 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 3 10 16 11 14 15 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 3 10 16 13 14 15 16 17 8 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 17 8 9 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 14 17 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 17 0 3 18 3 0 1 2 9 10 13 14 13 10 11 12 14 15 0 17\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 6 7 6 1 4 5 1 2 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 6 7 6 1 2 5 5 2 3 4\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 6 7 6 1 2 3 6 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 4 7 4 1 2 3 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 5 0 1 4 5 4 1 2 3 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 4 5 4 1 2 3 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 4 5 4 1 2 3 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 4 5 4 1 2 3 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 4 5 4 1 2 3 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 2 7 7 2 5 6 2 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 2 7 7 2 3 6 6 3 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 2 5 5 2 3 4 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 2 5 5 2 3 4 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 2 5 5 2 3 4 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 2 5 5 2 3 4 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 3 0 1 2 3 6 3 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 3 0 1 2 3 6 3 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 11 12 13 16 5 6 11 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 9 6 7 8 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 12 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 7 10 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 10 7 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 7 10 11 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 10 7 8 9 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 8 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 7 8 9 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 3 0 1 2 3 9 10 13 14 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 11 4 5 10 10 5 8 9 5 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 11 4 5 10 10 5 6 9 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 11 4 5 10 10 5 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 3 4 9 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 9 4 5 8 8 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 3 4 9 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 9 4 5 8 8 5 6 7 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 8 13 16 3 4 7 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 7 4 5 6 13 8 9 12 12 9 10 11\n" + "16 3 10 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 12 5 6 11 11 6 9 10 6 7 8 9\n" + "16 3 10 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 12 5 6 11 11 6 7 8 11 8 9 10\n" + "16 3 10 16 13 14 15 16 5 10 13 16 3 4 5 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 10 5 6 9 9 6 7 8 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 1 2 15 0 1 18 10 17 2 9 2 3 8 9 8 3 6 7 3 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 1 2 15 0 1 18 10 17 2 9 2 3 8 9 8 3 4 7 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 1 2 15 0 1 18 10 17 2 9 2 3 8 9 8 3 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 1 2 15 0 1 18 8 17 2 7 2 3 6 7 6 3 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 1 2 15 0 1 18 8 17 2 7 2 3 6 7 6 3 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 1 2 15 0 1 18 8 17 2 7 2 3 6 7 6 3 4 5 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 6 11 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 6 9 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 6 9 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 9 6 7 8 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 6 7 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 6 7 16 15 18 17 17 18 1 2 15 0 1 18 6 17 2 5 2 3 4 5 9 10 13 14 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 11 4 5 10 10 5 8 9 5 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 11 4 5 10 10 5 6 9 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 11 4 5 10 10 5 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 4 9 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 9 4 5 8 8 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 4 9 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 9 4 5 8 8 5 6 7 11 12 13 14\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 4 7 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 4 5 6 13 8 9 12 12 9 10 11\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 4 7 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 4 5 6 9 10 13 14 13 10 11 12\n" + "16 3 10 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 13 6 7 12 12 7 10 11 7 8 9 10\n" + "16 3 10 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 13 6 7 12 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 13 6 7 12 12 7 8 9 12 9 10 11\n" + "16 3 10 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 8 13 14 13 8 11 12 8 9 10 11\n" + "16 3 10 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 8 13 14 13 8 9 12 12 9 10 11\n" + "16 3 10 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 8 13 14 13 8 9 10 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 18 9 5 6 7 18 9 18 7 8\n" + "16 3 10 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 1 2 15 0 1 18 11 4 5 10 10 5 8 9 5 6 7 8 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 6 18 18 6 7 8 10 18 8 9\n" + "16 3 10 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 1 2 15 0 1 18 11 4 5 10 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 1 2 15 0 1 18 11 4 5 10 10 5 6 7 10 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 3 4 9 16 15 18 3 3 18 1 2 15 0 1 18 9 4 5 8 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 3 4 9 16 15 18 3 3 18 1 2 15 0 1 18 9 4 5 8 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 18 10 6 7 8 18 10 18 8 9\n" + "16 3 10 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 12 5 6 11 11 6 9 10 6 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 7 18 18 7 8 9 11 18 9 10\n" + "16 3 10 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 12 5 6 11 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 3 10 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 12 5 6 11 11 6 7 8 11 8 9 10 17 12 13 14\n" + "16 3 10 16 17 14 15 16 5 10 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 10 5 6 9 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 14 15 16 5 8 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 8 5 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 5 8 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 8 5 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 10 11 10 5 8 9 5 6 7 8\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 10 11 10 5 6 9 9 6 7 8\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 10 11 10 5 6 7 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 8 11 8 5 6 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 9 4 5 8 9 8 5 6 7 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 6 11 11 6 9 10 6 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 6 11 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 7 4 5 6 7 12 7 8 11 11 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 10 11 5 6 9 10 9 6 7 8\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 10 11 5 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 8 11 5 6 7 8 11 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 6 11 11 6 9 10 6 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 6 11 11 6 7 8 11 8 9 10\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 5 6 2 3 4 5 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 17 6 17 2 3 18 18 3 4 5 6 17 18 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 6 6 3 4 5 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 4 18 4 5 6 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 4 17 18 4 5 7 17 5 6\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 4 7 17 18 4 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4 12 13 14 15\n" + "16 3 10 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 4 5 17 18 4 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 5 18 5 2 3 4 17 18 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 1 18 18 1 6 7 1 2 5 6 5 2 3 4 8 17 18 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 5 6 5 2 3 4 8 17 18 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 5 6 5 2 3 4 8 17 18 7 11 12 13 14\n" + "16 3 10 16 11 12 13 16 9 10 11 16 17 8 9 16 13 0 17 17 0 1 18 18 1 6 7 1 2 5 6 5 2 3 4 8 17 18 7 13 14 15 0\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 11 12 13 17 18 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 12 18 10 11 14 15 0 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 13 14 15 17 17 15 0 18\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 17 3 4 18 18 4 5 6 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 10 17 18 9\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 18 3 4 5 17 18 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 1 18 18 1 6 7 1 2 3 6 6 3 4 5 8 17 18 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 3 6 6 3 4 5 8 17 18 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 3 6 6 3 4 5 8 17 18 7 11 12 13 14\n" + "16 3 10 16 11 12 13 16 9 10 11 16 17 8 9 16 13 0 17 17 0 1 18 18 1 6 7 1 2 3 6 6 3 4 5 8 17 18 7 13 14 15 0\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 12 18 10 11 14 15 0 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 13 14 15 17 17 15 0 18\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 17 1 2 3 4 17 4 5 18 18 5 6 7 8 17 18 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 4 18 1 2 3 4 18 4 5 6 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 18 1 2 3 4 18 4 5 6 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 4 18 1 2 3 4 18 4 5 6 8 18 6 7 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 1 18 18 1 4 7 1 2 3 4 7 4 5 6 8 17 18 7 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 1 18 18 1 4 7 1 2 3 4 7 4 5 6 8 17 18 7 13 10 11 12\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 12 18 10 11 14 15 0 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 13 14 15 17 17 15 0 18\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 7 17 3 18 3 4 5 18 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 17 18 3 6 3 4 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 17 18 3 4 17 4 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 4 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 4 7 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 4 7 4 5 6 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 5 1 2 3 18 5 18 3 4 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 5 1 2 3 18 5 18 3 4 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 5 1 2 3 18 5 18 3 4 8 5 6 7 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 17 18 3 4 8 17 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 4 6 17 4 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 4 6 17 4 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 4 6 17 4 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 4 6 17 4 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 4 6 17 4 5 12 13 14 15\n" + "16 3 10 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 4 6 17 4 5 13 14 15 0\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 11 8 9 10 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 10 17 8 9 12 13 14 15\n" + "16 3 10 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 10 17 8 9 13 14 15 0\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 17 10 11 12 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 13 14 17 17 14 15 0\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 15 0 17 12 13 14 15\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 12 18 10 11 14 15 0 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 13 14 15 17 17 15 0 18\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 11 6 7 10 10 7 8 9\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 9 6 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 9 6 7 8 11 12 13 14\n" + "16 3 10 16 11 12 13 16 9 10 11 16 17 6 9 16 13 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 9 6 7 8 13 14 15 0\n" + "16 3 10 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 3 10 16 11 12 13 16 7 8 11 16 17 6 7 16 13 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 11 8 9 10 13 14 15 0\n" + "16 3 10 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 9 10 13 14 13 10 11 12\n" + "16 3 10 16 9 12 13 16 7 8 9 16 17 6 7 16 13 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 9 10 11 12 13 14 15 0\n" + "16 3 10 16 9 10 11 16 7 8 9 16 17 6 7 16 11 0 17 17 0 1 18 18 1 4 5 1 2 3 4 6 17 18 5 11 12 15 0 15 12 13 14\n" + "16 3 10 16 13 17 18 16 11 12 13 16 7 8 11 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 3 10 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 7 8 11 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 3 10 16 13 17 18 16 9 12 13 16 7 8 9 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 3 10 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 9 12 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 17 8 18 8 9 10 18 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 10 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 9 11 17 9 10 13 14 15 0\n" + "16 3 10 16 11 14 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 18 10 17 16 7 8 18 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 12 13 14 17 17 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 18 18 11 12 13 17 18 13 14\n" + "16 3 10 16 11 17 18 16 9 10 11 16 7 8 9 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 14 18 16 9 10 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 13 18 17 18 13 14 15 17 18 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 17 6 2 3 18 17 18 3 4 5 6 17 18 5\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 5 18 2 3 4 5 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 18 17 2 3 4 18 17 18 4 5 7 17 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 18 6 2 3 4 18 6 18 4 5 8 17 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 14 15 0 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 6 6 1 4 5 1 2 3 4 9 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 5 6 2 3 4 5 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 5 6 2 3 4 5 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 5 6 2 3 4 5 8 18 6 7 14 15 0 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 12 18 10 11 14 15 0 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 6 7 3 4 5 6 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 17 17 3 4 18 18 4 5 6 7 17 18 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 4 7 7 4 5 6 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 4 5 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 4 5 17 18 5 6 8 17 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 8 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 10 17 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 14 15 0 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 11 8 9 10\n" + "16 3 10 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 12 9 10 11\n" + "16 3 10 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 11 12 13 14\n" + "16 3 10 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 12 13 14 15\n" + "16 3 10 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 17 17 2 3 18 18 3 4 5 6 17 18 5 13 14 15 0\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 2 7 7 2 3 6 6 3 4 5 18 7 8 9 10 17 18 9\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 6 6 1 2 5 5 2 3 4 9 6 7 8 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 14 15 0 17\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 12 18 10 11 14 15 0 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 12 13 14 14 15 0 18\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 15 0 18 17\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 4 17 4 5 18 18 5 6 7 8 17 18 7\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 10 18 8 9 17 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 12 18 10 11 14 15 0 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 12 13 14 14 15 0 18\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 4 4 1 2 3 9 4 5 8 8 5 6 7 15 0 18 17\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 5 5 2 3 4 18 5 6 7 8 17 18 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 5 5 2 3 4 18 5 6 7 8 17 18 7 11 12 13 14\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 4 4 1 2 3 7 4 5 6 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 4 4 1 2 3 7 4 5 6 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 12 18 10 11 14 15 0 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 4 4 1 2 3 7 4 5 6 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 4 4 1 2 3 7 4 5 6 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 14 15 0 17\n" + "16 3 10 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 11 8 9 10 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 10 17 8 9 12 13 14 15\n" + "16 3 10 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 10 17 8 9 13 14 15 0\n" + "16 3 10 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 12 15 0 17 12 13 14 15\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 1 6 6 1 2 5 5 2 3 4 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 3 10 16 17 12 13 16 9 10 17 16 18 8 9 16 13 0 18 18 0 1 6 6 1 2 5 5 2 3 4 8 18 6 7 17 10 11 12 13 14 15 0\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 10 7 8 9 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 7 8 11 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 7 8 11 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 3 10 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 3 10 16 14 15 17 16 8 11 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 11 8 9 10 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 3 10 16 13 17 18 16 9 12 13 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 9 12 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 17 8 18 8 9 10 18 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 18 8 9 12 9 10 11 14 15 0 17\n" +; + +const char* data_dqrgl_block12 = + "16 3 10 16 13 14 17 16 18 10 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 9 11 17 9 10 13 14 15 0\n" + "16 3 10 16 11 14 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 18 10 17 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 12 13 14 17 17 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 3 10 16 14 15 17 16 8 9 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 3 10 16 11 17 18 16 9 10 11 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 3 10 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 4 4 1 2 3 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 14 18 16 9 10 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 17 7 3 4 18 17 18 4 5 6 7 17 18 6\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 7 8 2 3 6 7 6 3 4 5 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 7 8 2 3 4 7 7 4 5 6 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 5 8 2 3 4 5 8 5 6 7 15 0 18 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 3 8 3 18 7 3 4 5 18 7 18 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 18 7 3 4 5 18 7 18 5 6 17 12 13 14\n" + "16 3 10 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 3 8 3 18 7 3 4 5 18 7 18 5 6 14 15 0 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 2 7 2 5 6 2 3 4 5 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 5 6 2 3 4 5 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 12 18 10 11 14 15 0 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 5 6 2 3 4 5 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 5 6 2 3 4 5 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 12 13 14 14 15 0 18\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 15 0 18 17\n" + "16 3 10 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 2 7 2 3 6 6 3 4 5 12 9 10 11 15 0 18 17\n" + "16 3 10 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 3 10 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 3 6 6 3 4 5 13 10 11 12 15 0 18 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 12 18 10 11 14 15 0 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 3 6 6 3 4 5 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 3 6 6 3 4 5 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 12 13 14 14 15 0 18\n" + "16 3 10 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 3 10 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 10 7 8 9 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 7 8 11 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 7 8 11 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 3 10 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 3 10 16 14 15 17 16 8 11 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 11 8 9 10 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 3 10 16 13 17 18 16 9 12 13 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 9 12 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 3 10 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 17 8 18 8 9 10 18 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 10 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 3 10 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 9 11 17 9 10 13 14 15 0\n" + "16 3 10 16 11 14 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 18 10 17 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 3 10 16 14 15 17 16 8 9 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 3 10 16 11 17 18 16 9 10 11 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 3 10 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 2 5 2 3 4 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 14 18 16 9 10 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 3 10 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 3 10 16 13 14 15 16 9 10 13 16 17 4 9 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 9 4 5 8 8 5 6 7 13 10 11 12\n" + "16 3 10 16 11 14 15 16 9 10 11 16 17 4 9 16 15 0 17 17 0 1 18 18 1 2 3 4 17 18 3 9 4 5 8 8 5 6 7 11 12 13 14\n" + "16 3 10 16 11 12 13 16 9 10 11 16 17 4 9 16 13 0 17 17 0 1 18 18 1 2 3 4 17 18 3 9 4 5 8 8 5 6 7 13 14 15 0\n" + "16 3 10 16 11 12 13 16 7 8 11 16 17 4 7 16 13 0 17 17 0 1 18 18 1 2 3 4 17 18 3 7 4 5 6 11 8 9 10 13 14 15 0\n" + "16 3 10 16 14 15 17 16 10 11 14 16 4 5 10 16 17 18 4 4 18 0 3 3 0 1 2 10 5 6 9 9 6 7 8 14 11 12 13 15 0 18 17\n" + "16 3 10 16 13 17 18 16 11 12 13 16 5 6 11 16 18 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 13 14 15 17 17 15 0 18\n" + "16 3 10 16 12 15 17 16 10 11 12 16 4 5 10 16 17 18 4 4 18 0 3 3 0 1 2 10 5 6 9 9 6 7 8 12 13 14 15 15 0 18 17\n" + "16 3 10 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 3 10 16 17 14 18 16 11 12 17 16 5 6 11 16 18 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 17 12 13 14 14 15 0 18\n" + "16 3 10 16 14 15 17 16 8 9 14 16 4 5 8 16 17 18 4 4 18 0 3 3 0 1 2 8 5 6 7 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 3 10 16 11 17 18 16 9 10 11 16 5 6 9 16 18 0 5 5 0 1 4 4 1 2 3 9 6 7 8 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 3 10 16 10 15 17 16 8 9 10 16 4 5 8 16 17 18 4 4 18 0 3 3 0 1 2 8 5 6 7 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 3 10 16 17 14 18 16 9 10 17 16 5 6 9 16 18 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 3 10 16 14 15 17 16 6 11 14 16 4 5 6 16 17 18 4 4 18 0 3 3 0 1 2 11 6 7 10 10 7 8 9 14 11 12 13 15 0 18 17\n" + "16 3 10 16 17 12 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 7 8 11 11 8 9 10 17 18 11 12 12 13 14 15\n" + "16 3 10 16 13 17 18 16 7 12 13 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 3 10 16 17 14 18 16 7 12 17 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 3 10 16 14 15 17 16 6 9 14 16 4 5 6 16 17 18 4 4 18 0 3 3 0 1 2 9 6 7 8 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 3 10 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 17 12 13 16 7 18 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 18 7 8 9 17 18 9 12 12 9 10 11 13 14 15 0\n" + "16 3 10 16 17 10 11 16 7 18 17 16 5 6 7 16 11 0 5 5 0 1 4 4 1 2 3 18 7 8 9 17 18 9 10 11 12 15 0 15 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 11 6 7 18 11 18 7 8 9 11 18 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 18 6 7 10 18 10 7 8 9 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 17 18 6 11 6 7 10 11 10 7 8 9 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 12 18 6 11 6 7 10 11 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 11 6 7 10 11 10 7 8 9 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 12 18 6 11 6 7 8 11 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 11 6 7 8 11 11 8 9 10 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 9 6 7 8 9 12 9 10 11 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 18 6 7 8 18 12 18 8 11 8 9 10 11\n" + "16 3 10 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 18 6 7 8 18 10 18 8 9 11 12 13 14\n" + "16 3 10 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 18 6 7 8 18 10 18 8 9 12 13 14 15\n" + "16 3 10 16 11 12 13 16 17 10 11 16 5 6 17 16 13 0 5 5 0 1 4 4 1 2 3 10 17 6 18 6 7 8 18 10 18 8 9 13 14 15 0\n" + "16 3 10 16 13 14 17 16 18 10 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 17 18 6 9 6 7 8 9 11 17 9 10 12 13 14 15\n" + "16 3 10 16 11 12 13 16 18 17 11 16 5 6 18 16 13 0 5 5 0 1 4 4 1 2 3 17 18 6 9 6 7 8 9 11 17 9 10 13 14 15 0\n" + "16 3 10 16 11 14 17 16 18 10 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 17 10 11 12 12 13 14 15\n" + "16 3 10 16 17 12 13 16 18 10 17 16 5 6 18 16 13 0 5 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 7 12 7 18 11 7 8 9 18 11 18 9 10\n" + "16 3 10 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 7 12 7 10 11 7 8 9 10 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 7 12 7 8 11 11 8 9 10 14 15 0 17\n" + "16 3 10 16 11 14 17 16 18 10 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 10 18 6 7 10 7 8 9 11 12 13 14 14 15 0 17\n" + "16 3 10 16 11 12 17 16 18 10 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 10 18 6 7 10 7 8 9 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 17 16 18 8 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 8 18 6 7 13 8 9 12 12 9 10 11 14 15 0 17\n" + "16 3 10 16 11 12 17 16 18 8 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 8 18 6 7 11 8 9 10 12 15 0 17 12 13 14 15\n" + "16 3 10 16 9 14 17 16 18 8 9 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 8 18 6 7 9 10 13 14 13 10 11 12 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 8 18 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 8 18 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 17 12 13 16 18 8 17 16 5 6 18 16 13 0 5 5 0 1 4 4 1 2 3 8 18 6 7 17 8 9 12 12 9 10 11 13 14 15 0\n" + "16 3 10 16 17 10 11 16 18 8 17 16 5 6 18 16 11 0 5 5 0 1 4 4 1 2 3 8 18 6 7 17 8 9 10 11 12 15 0 15 12 13 14\n" + "16 3 10 16 9 10 17 16 18 8 9 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 8 18 6 7 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 3 10 16 9 10 17 16 18 8 9 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 8 18 6 7 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 13 14 8 9 18 13 18 9 10 11 13 18 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 18 14 8 9 12 18 12 9 10 11 14 18 12 13\n" + "16 3 10 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 13 18 8 9 12 13 12 9 10 11 18 13 14 15\n" + "16 3 10 16 17 14 18 16 7 8 17 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 17 8 13 14 8 9 12 13 12 9 10 11 14 15 0 18\n" + "16 3 10 16 17 14 18 16 7 8 17 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 17 8 13 14 8 9 10 13 13 10 11 12 14 15 0 18\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 18 14 8 9 10 18 14 18 10 13 10 11 12 13\n" + "16 3 10 16 17 12 13 16 7 8 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 17 8 18 12 8 9 10 18 12 18 10 11 13 14 15 0\n" + "16 3 10 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 9 14 14 9 18 13 9 10 11 18 13 18 11 12\n" + "16 3 10 16 9 10 17 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 15 0 17 10 11 18 15 18 11 12 13 15 18 13 14\n" + "16 3 10 16 10 11 17 16 6 7 10 16 2 3 6 16 17 18 2 2 18 0 1 6 3 4 5 10 7 8 9 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 13 14 8 9 18 13 18 9 10 11 13 18 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 18 14 8 9 12 18 12 9 10 11 14 18 12 13\n" + "16 3 10 16 17 14 18 16 7 8 17 16 3 4 7 16 18 0 3 3 0 1 2 7 4 5 6 17 8 13 14 8 9 12 13 12 9 10 11 14 15 0 18\n" + "16 3 10 16 17 14 18 16 7 8 17 16 3 4 7 16 18 0 3 3 0 1 2 7 4 5 6 17 8 13 14 8 9 10 13 13 10 11 12 14 15 0 18\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 18 14 8 9 10 18 14 18 10 13 10 11 12 13\n" + "16 3 10 16 17 12 13 16 7 8 17 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 17 8 18 12 8 9 10 18 12 18 10 11 13 14 15 0\n" + "16 3 10 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 9 14 14 9 18 13 9 10 11 18 13 18 11 12\n" + "16 3 10 16 9 10 17 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 10 15 0 17 10 11 18 15 18 11 12 13 15 18 13 14\n" + "16 3 10 16 8 9 17 16 6 7 8 16 2 3 6 16 17 18 2 2 18 0 1 6 3 4 5 9 0 18 17 9 10 15 0 15 10 13 14 10 11 12 13\n" + "16 3 10 16 8 9 17 16 6 7 8 16 2 3 6 16 17 18 2 2 18 0 1 6 3 4 5 9 0 18 17 9 10 15 0 15 10 11 14 14 11 12 13\n" + "16 3 10 16 8 9 17 16 6 7 8 16 2 3 6 16 17 18 2 2 18 0 1 6 3 4 5 9 0 18 17 9 10 15 0 15 10 11 12 15 12 13 14\n" + "16 3 10 16 10 11 17 16 4 7 10 16 2 3 4 16 17 18 2 2 18 0 1 7 4 5 6 10 7 8 9 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 3 10 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 7 17 18 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "16 3 10 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 7 17 18 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "16 3 10 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 7 17 18 7 14 14 7 8 13 13 8 9 10 13 10 11 12\n" + "16 3 10 16 17 14 15 16 5 8 17 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 17 8 9 14 14 9 18 13 9 10 11 18 13 18 11 12\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 18 9 5 6 7 18 9 18 7 8\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 8 9 5 6 7 8 11 18 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 10 18 10 5 8 9 5 6 7 8 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 11 4 5 10 11 10 5 8 9 5 6 7 8 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 8 9 5 6 7 8 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 8 9 5 6 7 8 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 6 18 18 6 7 8 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 6 9 9 6 7 8 11 18 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 10 18 10 5 6 9 9 6 7 8 12 18 10 11\n" + "16 3 10 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 11 4 5 10 11 10 5 6 9 9 6 7 8 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 6 9 9 6 7 8 14 15 0 17\n" + "16 3 10 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 11 4 5 10 11 10 5 6 7 10 7 8 9 13 17 11 12\n" + "16 3 10 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 6 7 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 6 7 10 7 8 9 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 8 11 8 5 6 7 11 8 9 10 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 8 11 8 5 6 7 11 8 9 10 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 6 7 11 18 7 10 7 8 9 10\n" + "16 3 10 16 13 14 15 16 17 10 13 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 18 9 18 5 6 7 9 18 7 8 13 10 11 12\n" + "16 3 10 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 18 9 18 5 6 7 9 18 7 8 11 12 13 14\n" + "16 3 10 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 9 4 5 18 9 18 5 6 7 9 18 7 8 13 14 15 0\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 9 4 5 8 9 8 5 6 7 12 9 10 11 14 15 0 17\n" + "16 3 10 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 18 4 5 8 18 8 5 6 7 10 18 8 9 11 12 13 14\n" + "16 3 10 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 18 4 5 8 18 8 5 6 7 10 18 8 9 13 14 15 0\n" + "16 3 10 16 13 14 17 16 18 10 13 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 8 9 8 5 6 7 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 8 9 8 5 6 7 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 10 17 16 3 4 18 16 15 0 3 3 0 1 2 10 18 4 9 4 5 8 9 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 13 16 18 10 17 16 3 4 18 16 13 0 3 3 0 1 2 10 18 4 9 4 5 8 9 8 5 6 7 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 8 9 8 5 6 7 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 6 11 11 6 18 10 6 7 8 18 10 18 8 9\n" + "16 3 10 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 6 11 11 6 9 10 6 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 6 11 11 6 9 10 6 7 8 9 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 6 11 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 6 11 11 6 7 10 10 7 8 9 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 10 13 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 6 9 9 6 7 8 13 10 11 12 14 15 0 17\n" + "16 3 10 16 11 14 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 6 9 9 6 7 8 11 12 13 14 14 15 0 17\n" + "16 3 10 16 17 14 15 16 18 10 17 16 3 4 18 16 15 0 3 3 0 1 2 10 18 4 9 4 5 6 9 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 3 10 16 17 12 13 16 18 10 17 16 3 4 18 16 13 0 3 3 0 1 2 10 18 4 9 4 5 6 9 9 6 7 8 17 10 11 12 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 6 9 9 6 7 8 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 7 4 5 6 7 12 7 8 11 11 8 9 10 14 15 0 17\n" + "16 3 10 16 11 14 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 7 4 5 6 7 10 7 8 9 11 12 13 14 14 15 0 17\n" + "16 3 10 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 7 4 5 6 7 10 7 8 9 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 6 18 12 18 6 11 6 7 10 11 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 6 18 12 18 6 11 6 7 8 11 11 8 9 10\n" + "16 3 10 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 18 4 5 6 18 10 18 6 9 6 7 8 9 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 8 11 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 7 4 5 6 7 11 8 9 10 12 15 0 17 12 13 14 15\n" + "16 3 10 16 17 14 15 16 18 8 17 16 3 4 18 16 15 0 3 3 0 1 2 8 18 4 7 4 5 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 18 8 17 16 3 4 18 16 15 0 3 3 0 1 2 8 18 4 7 4 5 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 17 12 13 16 18 8 17 16 3 4 18 16 13 0 3 3 0 1 2 8 18 4 7 4 5 6 7 17 8 9 12 12 9 10 11 13 14 15 0\n" + "16 3 10 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 7 4 5 6 7 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 3 10 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 7 4 5 6 7 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 10 11 5 6 18 10 18 6 7 8 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 9 18 9 6 7 8 11 18 9 10\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 10 11 5 6 9 10 9 6 7 8 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 10 11 5 6 7 10 10 7 8 9 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 8 11 5 6 7 8 11 8 9 10 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 7 18 11 18 7 10 7 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 7 18 11 18 7 8 11 8 9 10\n" + "16 3 10 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 5 10 5 18 9 5 6 7 18 9 18 7 8 13 14 15 0\n" + "16 3 10 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 5 10 5 8 9 5 6 7 8 12 15 0 17 12 13 14 15\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 18 10 6 7 8 18 10 18 8 9\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 6 11 11 6 9 10 6 7 8 9 14 15 0 17\n" + "16 3 10 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 7 18 18 7 8 9 11 18 9 10\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 6 11 11 6 7 10 10 7 8 9 14 15 0 17\n" + "16 3 10 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 6 11 11 6 7 8 11 8 9 10 14 15 0 17\n" + "16 3 10 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 5 10 5 6 9 9 6 7 8 12 15 0 17 12 13 14 15\n" + "16 3 10 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 5 8 5 6 7 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 3 10 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 5 8 5 6 7 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 3 10 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 12 13 7 8 11 12 11 8 9 10\n" + "16 3 10 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 12 13 7 8 9 12 12 9 10 11\n" + "16 3 10 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 10 13 7 8 9 10 13 10 11 12\n" + "16 3 10 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "16 3 10 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "16 3 10 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 8 13 13 8 9 10 13 10 11 12\n" + "16 3 10 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 14 15 14 9 12 13 9 10 11 12\n" + "16 3 10 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 14 15 14 9 10 13 13 10 11 12\n" + "16 3 10 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 14 15 14 9 10 11 14 11 12 13\n" + "16 3 10 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 12 15 12 9 10 11 15 12 13 14\n" + "16 3 10 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 10 15 15 10 13 14 10 11 12 13\n" + "16 3 10 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 10 15 15 10 11 14 14 11 12 13\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 18 11 7 8 9 18 11 18 9 10\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 10 11 7 8 9 10 13 18 11 12\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 12 18 12 7 10 11 7 8 9 10 14 18 12 13\n" + "16 3 10 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 10 11 7 8 9 10 14 15 0 18\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 8 18 18 8 9 10 12 18 10 11\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 8 11 11 8 9 10 13 18 11 12\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 12 18 12 7 8 11 11 8 9 10 14 18 12 13\n" + "16 3 10 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 8 11 11 8 9 10 14 15 0 18\n" + "16 3 10 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 8 9 12 9 10 11 14 15 0 18\n" + "16 3 10 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 10 13 10 7 8 9 13 10 11 12 14 15 0 18\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 8 9 13 18 9 12 9 10 11 12\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 8 13 13 8 18 12 8 9 10 18 12 18 10 11\n" + "16 3 10 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 8 13 13 8 11 12 8 9 10 11 14 15 0 18\n" + "16 3 10 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 8 13 13 8 9 12 12 9 10 11 14 15 0 18\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 8 18 14 18 8 13 8 9 12 13 12 9 10 11\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 8 18 14 18 8 13 8 9 10 13 13 10 11 12\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 12 13 7 8 18 12 18 8 9 10 12 18 10 11\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 11 18 11 8 9 10 13 18 11 12\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 9 18 13 18 9 12 9 10 11 12\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 9 18 13 18 9 10 13 10 11 12\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 18 12 8 9 10 18 12 18 10 11\n" + "16 3 10 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 9 18 18 9 10 11 13 18 11 12\n" + "16 3 10 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 18 13 9 10 11 18 13 18 11 12\n" + "16 3 10 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 12 13 9 10 11 12 15 18 13 14\n" + "16 3 10 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 10 18 18 10 11 12 14 18 12 13\n" + "16 3 10 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 10 13 13 10 11 12 15 18 13 14\n" + "16 3 10 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 10 11 15 18 11 14 11 12 13 14\n" + "16 3 10 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 10 15 15 10 18 14 10 11 12 18 14 18 12 13\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 13 14 8 9 12 13 12 9 10 11\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 13 14 8 9 10 13 13 10 11 12\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 11 14 8 9 10 11 14 11 12 13\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 11 12 8 9 10 11 15 12 13 14\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 14 14 9 10 11 14 11 12 13\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 12 12 9 10 11 15 12 13 14\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 10 15 10 13 14 10 11 12 13\n" + "16 3 10 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 10 15 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 6 7 1 2 5 6 5 2 3 4 9 18 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 6 7 1 2 5 6 5 2 3 4 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 6 7 1 2 3 6 6 3 4 5 9 18 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 6 7 1 2 3 6 6 3 4 5 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 4 18 1 2 3 4 18 4 5 6 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 4 7 1 2 3 4 7 4 5 6 9 18 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 4 7 1 2 3 4 7 4 5 6 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 3 18 7 18 3 4 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 5 1 2 3 18 5 18 3 4 8 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 6 9 6 1 18 5 1 2 3 18 5 18 3 4 9 6 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 4 5 1 2 3 4 9 18 5 8 5 6 7 8\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 7 0 1 6 7 6 1 4 5 1 2 3 4 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 6 7 6 1 4 5 1 2 3 4 12 17 8 9 12 9 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 4 5 1 2 3 4 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 4 5 1 2 3 4 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 5 6 2 3 4 5 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 7 7 2 5 6 2 3 4 5 9 18 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 2 7 7 2 5 6 2 3 4 5 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 2 7 7 2 3 4 7 4 5 6 10 18 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 10 7 8 9\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 7 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 5 5 2 3 4 12 17 8 9 12 9 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 5 5 2 3 4 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 5 5 2 3 4 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 3 8 3 18 7 3 4 5 18 7 18 5 6\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6 17 12 13 14\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 7 0 1 6 7 6 1 2 3 6 3 4 5 10 7 8 9 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 3 6 3 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 3 6 3 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 3 6 3 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 4 7 4 1 2 3 7 4 5 6 12 17 8 9 12 9 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 4 7 4 1 2 3 7 4 5 6 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 4 7 4 1 2 3 7 4 5 6 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 3 9 18 3 8 3 4 7 8 7 4 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 3 9 18 3 8 3 4 5 8 8 5 6 7\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 5 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 5 0 1 4 5 4 1 2 3 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 5 0 1 4 5 4 1 2 3 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 6 18 0 5 0 1 4 5 4 1 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 6 18 0 5 0 1 4 5 4 1 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 4 5 4 1 2 3 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 4 5 4 1 2 3 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 4 5 4 1 2 3 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 4 5 4 1 2 3 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 4 5 4 1 2 3 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 4 18 8 18 4 7 4 5 6 7\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 4 18 8 18 4 5 8 5 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 2 7 7 2 5 6 2 3 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 5 6 2 3 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 5 6 2 3 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 4 18 18 4 5 6 8 18 6 7\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 12 17 10 11\n" + "16 3 10 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 17 12 13 14\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 2 7 7 2 3 6 6 3 4 5 12 17 8 9 12 9 10 11\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 3 6 6 3 4 5 17 10 13 14 10 11 12 13\n" + "16 3 10 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 3 6 6 3 4 5 17 10 11 14 14 11 12 13\n" + "16 3 10 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 6 18 0 5 0 1 2 5 5 2 3 4 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 2 5 5 2 3 4 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 2 5 5 2 3 4 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 2 5 5 2 3 4 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 3 10 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 3 0 1 2 3 6 3 4 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 18 2 3 4 17 19 2 18 2 19 0 1 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 3 4 5 18 19 2 3 15 0 19 18 2 19 0 1 8 17 6 7\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 3 4 5 18 19 2 3 17 0 19 18 2 19 0 1 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 19 4 5 18 1 2 19 15 0 1 18 4 19 2 3 8 17 6 7\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 5 6 19 3 4 5 19 1 2 3 17 0 1 19 8 18 6 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 4 5 6 19 0 3 4 3 0 1 2 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 18 19 3 4 3 19 1 2 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 18 0 1 19 19 1 2 3 5 19 3 4 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 4 5 6 19 0 1 4 4 1 2 3 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 2 5 6 19 0 1 2 5 2 3 4 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 2 3 19 18 0 1 2 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 2 3 6 19 0 1 2 6 3 4 5 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 7 19 2 3 4 19 0 1 2 7 4 5 6 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 2 3 4 19 0 1 2 9 18 5 8 5 6 7 8 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 2 3 4 19 0 1 2 7 18 5 6 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 17 18 16 10 11 12 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 2 3 4 19 0 1 2 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 17 19 4 18 4 19 2 3 19 0 1 2 15 0 19 17\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 3 4 5 17 19 3 18 3 19 1 2 17 0 1 19 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 17 19 4 18 4 19 0 3 3 0 1 2 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 19 18 5 15 0 19 17 19 0 1 2 18 19 2 3 5 18 3 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 19 4 18 15 0 19 17 19 0 1 2 4 19 2 3 6 18 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 19 4 5 17 0 19 18 19 0 1 2 4 19 2 3 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 2 3 6 17 19 2 18 2 19 0 1 6 3 4 5 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 19 18 3 4 5 15 0 3 18 3 0 1 2 19 5 6 7 8 17 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 19 6 18 3 4 19 17 0 3 18 3 0 1 2 6 19 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 8 18 6 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 7 8 18 16 17 19 7 7 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 10 18 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 7 8 9 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 7 8 9 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 7 8 9 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 7 8 9 16 17 19 7 7 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 7 8 9 16 18 19 7 7 19 5 6 19 3 4 5 18 0 3 19 3 0 1 2 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 7 8 9 16 18 19 7 7 19 5 6 19 3 4 5 18 0 3 19 3 0 1 2 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 1 18 5 15 0 1 17 18 1 2 19 19 2 3 4 5 18 19 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 5 5 2 3 4 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 3 19 3 4 5 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 12 17 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 3 6 18 19 3 6 3 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 17 1 19 18 15 0 1 17 19 1 2 3 4 18 19 3 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 17 5 5 17 18 4 17 1 19 18 15 0 1 17 19 1 2 3 4 18 19 3 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 17 5 5 17 18 4 17 1 19 18 15 0 1 17 19 1 2 3 4 18 19 3 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 5 6 7 16 15 17 5 5 17 18 4 17 1 19 18 15 0 1 17 19 1 2 3 4 18 19 3 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 5 6 7 16 15 17 5 5 17 18 4 17 1 19 18 15 0 1 17 19 1 2 3 4 18 19 3 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 5 6 7 16 15 17 5 5 17 18 4 17 1 19 18 15 0 1 17 19 1 2 3 4 18 19 3 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 19 6 18 1 4 19 17 0 1 18 4 1 2 3 6 19 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 8 18 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 7 8 18 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 7 8 18 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 7 8 18 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 7 8 18 16 17 19 7 7 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 10 18 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 7 8 9 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 7 8 9 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 7 8 9 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 7 8 9 16 17 19 7 7 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 7 8 9 16 18 19 7 7 19 5 6 19 1 4 5 18 0 1 19 4 1 2 3 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 7 8 9 16 18 19 7 7 19 5 6 19 1 4 5 18 0 1 19 4 1 2 3 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 4 18 0 19 0 1 2 19 4 19 2 3\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 19 4 18 15 0 19 17 4 19 0 3 0 1 2 3 6 18 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 19 4 5 17 0 19 18 4 19 0 1 4 1 2 3 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 17 19 2 18 15 0 19 17 2 19 0 1 4 18 2 3 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 17 5 5 17 18 4 17 19 2 18 15 0 19 17 2 19 0 1 4 18 2 3 10 7 8 9\n" +; + +const char* data_dqrgl_block13 = + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 17 5 5 17 18 4 17 19 2 18 15 0 19 17 2 19 0 1 4 18 2 3 11 8 9 10\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 4 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 8 17 4 7 4 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 8 17 4 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 6 17 4 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 6 17 4 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 6 17 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 6 17 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 6 17 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 6 17 4 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 5 6 9 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 5 6 9 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 5 6 9 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 10 11 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 5 6 17 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 5 6 17 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 5 6 17 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 5 6 17 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 18 5 5 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 12 13 14 17 17 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 17 4 5 19 19 5 6 7 8 17 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 18 4 5 6 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 18 4 5 6 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 18 4 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 18 4 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 3 4 19 1 2 3 17 0 1 19 18 4 5 6 8 18 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 8 17 4 19 4 5 6 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 17 18 4 7 4 5 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 8 18 4 7 4 5 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 8 18 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 8 18 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 3 4 19 1 2 3 17 0 1 19 8 18 4 7 4 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 17 18 4 5 17 5 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 8 18 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 8 18 4 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 3 4 19 1 2 3 17 0 1 19 8 18 4 5 8 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 6 9 16 17 19 18 18 19 3 4 19 1 2 3 17 0 1 19 6 18 4 5 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 17 18 4 5 9 17 5 8 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 18 17 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 17 18 4 5 7 17 5 6 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 18 17 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 17 18 4 5 7 17 5 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 18 17 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 17 18 4 5 7 17 5 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 17 18 4 5 7 17 5 6 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 10 11 16 18 6 7 16 17 19 18 18 19 3 4 19 1 2 3 17 0 1 19 6 18 4 5 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 18 6 7 16 17 19 18 18 19 3 4 19 1 2 3 17 0 1 19 6 18 4 5 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 19 1 2 3 15 0 1 19 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 17 6 7 19 19 7 8 9 10 17 19 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 6 7 8 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 6 7 8 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 6 7 8 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 5 6 9 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 9 6 7 8 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 5 6 9 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 9 6 7 8 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 5 6 9 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 9 6 7 8 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 17 7 8 19 19 8 9 10 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 7 8 11 11 8 9 10 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 7 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 7 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 18 11 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 7 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 11 18 17 16 7 10 11 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 10 18 16 5 6 7 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 10 7 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 10 17 6 19 6 7 8 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 17 18 6 9 6 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 17 18 6 7 17 7 8 9 11 17 9 10\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 5 6 18 16 15 19 5 5 19 3 4 19 1 2 3 15 0 1 19 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 18 1 2 3 15 0 1 18 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 3 4 19 1 2 3 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 19 19 1 2 3 5 19 3 4 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 17 18 19 4 6 17 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 8 17 6 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 4 4 1 2 3 6 19 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 6 17 18 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 5 19 5 0 1 4 4 1 2 3 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 4 4 1 2 3 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 2 19 2 3 4 6 19 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 2 5 2 3 4 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 3 6 3 19 1 2 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 19 3 4 5 19 6 17 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 2 6 19 2 5 2 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 10 7 8 9 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 11 8 9 10 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 12 9 10 11 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 13 10 11 12 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 12 13 14 15 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 17 18 19 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 4 7 18 19 3 4 3 19 1 2 7 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 7 19 3 4 7 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 10 7 8 9 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 11 8 9 10 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 12 9 10 11 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 13 10 11 12 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 18 5 6 7 9 18 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 19 6 7 8 19 9 17 19 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 9 6 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 8 5 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 6 9 6 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 7 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 9 18 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 19 18 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 9 18 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 10 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 7 8 9 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 6 7 10 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 10 7 8 9 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 6 7 10 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 10 7 8 9 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 10 7 8 9 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 18 12 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 8 9 10 12 18 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 11 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 8 9 10 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 11 12 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 18 14 16 8 9 10 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 3 4 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 19 6 17 18 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 6 6 3 4 5 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 1 6 6 1 2 5 5 2 3 4 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 7 4 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 2 3 7 19 3 6 3 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 18 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 2 3 7 19 3 4 7 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 17 18 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 8 17 18 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 8 18 6 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 18 0 1 19 19 1 2 3 5 19 3 4 10 7 8 9 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 19 1 2 3 5 19 3 4 11 8 9 10 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 19 1 2 3 5 19 3 4 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 19 1 2 3 5 19 3 4 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 19 1 2 3 5 19 3 4 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 19 1 2 3 5 19 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 19 2 3 4 6 19 4 5 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 19 1 2 3 5 19 3 4 13 0 18 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 18 5 6 7 9 18 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 19 6 7 8 19 9 17 19 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 9 6 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 8 5 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 6 9 6 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 7 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 17 18 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 9 18 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 19 18 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 9 18 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 19 8 9 10 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 18 7 8 9 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 6 7 10 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 10 7 8 9 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 6 7 10 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 10 7 8 9 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 19 1 4 4 1 2 3 10 7 8 9 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 6 7 10 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 10 7 8 9 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 18 12 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 18 8 9 10 12 18 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 11 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 8 9 10 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 11 12 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 19 1 4 4 1 2 3 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 11 12 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 8 9 10 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 9 18 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 19 1 4 4 1 2 3 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 9 12 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 18 14 16 8 9 10 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 19 1 4 4 1 2 3 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 10 13 14 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 10 11 12 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 8 9 18 16 6 7 8 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 19 1 4 4 1 2 3 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 12 17 18 16 10 11 12 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 19 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 19 1 2 7 2 3 6 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 8 9 10 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 19 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 17 18 19 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 8 9 10 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 8 9 10 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 19 1 2 7 2 3 4 7 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 8 9 10 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 18 5 6 7 9 18 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 9 18 5 6 9 6 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 7 10 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 17 18 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 9 18 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 19 18 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 9 18 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 19 8 9 10 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 18 7 8 9 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 6 7 10 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 10 7 8 9 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 6 7 10 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 10 7 8 9 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 2 5 18 19 1 2 5 2 3 4 10 7 8 9 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 6 7 10 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 10 7 8 9 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 18 12 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 18 8 9 10 12 18 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 11 18 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 8 9 10 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 11 12 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 2 5 18 19 1 2 5 2 3 4 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 11 12 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 8 9 10 17 0 19 18 14 15 0 17\n" +; + +const char* data_dqrgl_block14 = + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 9 18 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 2 5 18 19 1 2 5 2 3 4 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 9 12 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 18 14 16 8 9 10 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 19 1 2 5 2 3 4 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 10 13 14 16 8 9 10 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 10 11 12 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 8 9 18 16 6 7 8 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 2 5 18 19 1 2 5 2 3 4 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 12 17 18 16 10 11 12 16 8 9 10 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 4 7 18 19 3 4 7 4 5 6 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 7 2 3 6 7 6 3 4 5 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 6 1 2 5 6 5 2 3 4 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 6 1 2 3 6 6 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 18 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 4 1 2 3 4 7 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 10 7 8 9 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 11 8 9 10 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 12 9 10 11 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 13 10 11 12 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 6 7 3 4 5 6 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 2 7 2 5 6 2 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 7 7 4 5 6 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 2 7 2 3 6 6 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 18 5 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 17 18 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 10 7 8 9 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 11 8 9 10 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 12 9 10 11 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 13 10 11 12 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 4 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 4 5 8 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 10 11 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 10 11 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 10 5 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 8 11 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 8 5 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 5 8 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 8 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 8 5 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 8 5 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 6 9 10 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 6 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 6 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 5 6 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 6 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 12 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 7 10 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 7 8 9 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 7 8 9 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 7 8 9 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 10 11 14 15 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 9 17 5 8 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 10 5 8 9 5 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 6 7 19 19 7 8 9 10 17 19 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 10 5 6 9 9 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 6 7 8 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 6 7 8 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 6 7 8 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 4 5 8 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 5 6 7 12 9 10 11 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 5 6 7 13 10 11 12 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 5 6 7 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 4 5 8 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 5 6 7 12 13 14 15 15 0 18 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 4 5 8 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 5 6 7 13 0 18 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 11 12 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 11 6 7 10 10 7 8 9 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 11 12 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 11 6 7 8 11 8 9 10 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 9 12 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 6 7 8 12 9 10 11 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 14 15 17 16 10 13 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 6 7 8 13 10 11 12 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 6 7 8 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 9 10 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 6 7 8 12 13 14 15 15 0 18 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 6 9 10 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 6 7 8 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 7 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 12 7 10 11 7 8 9 10 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 8 9 10 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 10 7 8 9 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 6 7 10 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 10 7 8 9 13 0 18 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 13 8 9 10 13 10 11 12 15 0 18 17\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 11 8 9 10 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 4 11 16 12 13 17 16 8 11 12 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 11 8 9 10 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 8 9 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 14 9 12 13 9 10 11 12 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 8 9 12 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 12 9 10 11 13 0 18 17 13 14 15 0\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 10 11 17 16 8 9 10 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 3 19 0 1 2 18 3 6 7 3 4 5 6 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 7 7 4 5 6 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 5 9 18 5 8 5 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 19 4 5 6 18 19 6 7 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 7 10 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 5 7 18 5 6 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 19 4 5 6 18 19 6 7 17 18 7 8 10 17 8 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 5 7 18 5 6 12 9 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 5 7 18 5 6 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 5 7 18 5 6 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 5 7 18 5 6 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 18 3 4 5 7 18 5 6 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 8 19 8 5 6 7 9 17 19 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 9 4 5 8 9 8 5 6 7 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 3 19 0 1 2 9 18 3 8 3 4 7 8 7 4 5 6 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 19 6 7 8 9 17 19 8\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 3 19 0 1 2 9 18 3 8 3 4 5 8 8 5 6 7 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 7 10 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 17 18 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 9 18 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 9 18 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 8 18 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 8 18 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 8 18 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 18 5 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 5 8 5 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 5 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 8 9 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 5 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 6 7 19 19 7 8 9 10 17 19 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 5 10 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 10 5 6 9 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 6 7 8 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 6 7 8 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 6 7 8 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 5 8 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 5 6 7 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 6 9 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 9 6 7 8 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 5 8 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 5 6 7 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 6 9 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 9 6 7 8 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 6 9 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 9 6 7 8 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 5 8 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 5 6 7 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 5 8 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 5 6 7 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 6 9 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 9 6 7 8 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 18 5 8 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 5 6 7 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 8 5 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 9 18 5 8 5 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 9 18 5 8 5 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 6 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 6 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 6 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 6 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 6 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 6 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 17 18 5 6 8 17 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 10 17 18 5 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 6 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 12 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 10 11 14 15 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 7 8 19 19 8 9 10 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 11 11 8 9 10 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 11 12 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 11 12 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 11 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 9 12 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 9 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 18 11 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 18 17 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 18 17 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 7 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 7 10 11 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 6 9 10 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 9 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 10 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 7 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 10 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 7 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 9 10 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 9 10 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 10 11 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 6 9 10 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 6 7 17 7 8 9 11 17 9 10\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 10 11 12 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 12 7 10 11 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 8 9 10 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 6 7 10 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 13 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 11 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 8 11 12 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 8 9 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 14 9 12 13 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 8 9 12 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 12 9 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 10 11 17 16 8 9 10 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 4 5 10 16 17 19 4 4 19 2 3 19 0 1 2 10 5 8 9 5 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 4 5 10 16 18 19 4 4 19 2 3 19 0 1 2 10 5 8 9 5 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 2 3 18 19 1 2 10 5 8 9 5 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 4 5 10 16 18 19 4 4 19 2 3 19 0 1 2 10 5 8 9 5 6 7 8 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 18 6 7 19 19 7 8 9 17 18 19 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 18 6 7 19 19 7 8 9 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 18 6 7 19 19 7 8 9 10 18 19 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 10 10 7 8 9 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 18 5 6 9 9 6 7 8 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 4 5 10 16 17 19 4 4 19 2 3 19 0 1 2 10 5 6 9 9 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 4 5 10 16 18 19 4 4 19 2 3 19 0 1 2 10 5 6 9 9 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 2 3 18 19 1 2 10 5 6 9 9 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 4 5 10 16 18 19 4 4 19 2 3 19 0 1 2 10 5 6 9 9 6 7 8 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 18 6 7 8 17 18 8 19 8 9 10 19 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 18 19 8 11 8 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 18 5 6 7 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 18 5 6 7 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 18 5 6 7 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 18 5 6 7 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 18 5 6 7 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 19 6 7 8 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 18 5 6 7 9 18 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 4 5 8 16 17 19 4 4 19 2 3 19 0 1 2 8 5 6 7 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 4 5 8 16 18 19 4 4 19 2 3 19 0 1 2 8 5 6 7 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 4 5 8 16 17 18 4 4 18 2 3 18 19 1 2 8 5 6 7 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 9 12 16 4 5 8 16 18 19 4 4 19 2 3 19 0 1 2 8 5 6 7 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 18 14 16 8 9 10 16 4 5 8 16 17 19 4 4 19 2 3 19 0 1 2 8 5 6 7 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 4 5 8 16 18 19 4 4 19 2 3 19 0 1 2 8 5 6 7 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 18 19 1 2 8 5 6 7 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 10 13 14 16 8 9 10 16 4 5 8 16 18 19 4 4 19 2 3 19 0 1 2 8 5 6 7 13 10 11 12 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 4 5 8 16 17 19 4 4 19 2 3 19 0 1 2 8 5 6 7 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 4 5 8 16 17 19 4 4 19 2 3 19 0 1 2 8 5 6 7 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 4 5 8 16 17 19 4 4 19 2 3 19 0 1 2 8 5 6 7 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 4 5 8 16 17 19 4 4 19 2 3 19 0 1 2 8 5 6 7 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 8 9 18 16 4 5 8 16 17 19 4 4 19 2 3 19 0 1 2 8 5 6 7 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 4 5 8 16 18 19 4 4 19 2 3 19 0 1 2 8 5 6 7 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 18 19 1 2 8 5 6 7 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 12 17 18 16 10 11 12 16 8 9 10 16 4 5 8 16 18 19 4 4 19 2 3 19 0 1 2 8 5 6 7 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 4 5 8 16 18 19 4 4 19 2 3 19 0 1 2 8 5 6 7 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 19 3 4 10 7 8 9 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 19 8 9 10 17 18 19 10 12 17 10 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 18 12 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 6 7 10 10 7 8 9 12 18 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 19 8 9 10 12 17 18 19 12 19 10 11\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 11 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 11 6 7 10 10 7 8 9 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 11 12 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 11 6 7 10 10 7 8 9 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 11 12 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 11 6 7 10 10 7 8 9 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 6 11 12 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 11 6 7 10 10 7 8 9 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 18 9 10 19 12 17 18 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 19 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 19 9 10 11 17 18 19 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 19 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 19 9 10 11 12 18 19 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 10 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 9 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 6 7 8 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 9 12 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 9 6 7 8 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 9 12 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 9 6 7 8 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 6 9 12 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 9 6 7 8 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 19 9 10 11 19 12 17 19 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 18 12 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 6 7 8 12 18 8 11 8 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 19 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 18 19 9 10 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 19 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 18 19 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 18 10 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 6 7 8 10 18 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 18 10 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 6 7 8 10 18 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 6 18 10 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 6 7 8 10 18 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 19 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 17 18 19 9 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 19 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 10 18 19 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 18 14 16 6 9 10 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 6 7 8 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 15 18 16 10 13 17 16 6 9 10 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 9 6 7 8 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 9 6 7 8 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 10 13 14 16 6 9 10 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 9 6 7 8 13 10 11 12 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 10 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 9 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 6 7 8 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 6 9 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 6 7 8 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 10 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 9 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 6 7 8 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 9 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 6 7 8 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 9 10 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 9 6 7 8 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 9 6 7 8 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 12 17 18 16 10 11 12 16 6 9 10 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 9 6 7 8 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 9 10 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 9 6 7 8 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 11 8 9 10 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 11 18 5 10 5 6 9 10 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 8 19 19 8 9 10 11 17 19 10\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 11 18 5 10 5 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 11 18 5 8 5 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 8 19 17 19 8 9 11 17 9 10\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 8 5 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 8 5 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 8 5 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 8 5 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 8 5 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 11 18 5 6 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 11 11 8 9 10 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 11 18 5 6 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 6 9 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 6 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 6 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 9 18 5 6 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 7 12 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 8 18 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 18 8 9 10 17 18 10 11 13 17 11 12\n" +; + +const char* data_dqrgl_block15 = + "16 4 11 16 17 14 15 16 18 12 17 16 19 8 18 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 7 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 7 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 7 10 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 10 7 8 9 10 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 9 18 7 8 17 10 11 12 17 12 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 11 14 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 11 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 8 11 12 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 8 11 12 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 8 18 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 17 18 8 9 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 14 15 17 16 8 9 14 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 8 9 12 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 12 9 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 10 15 17 16 8 9 10 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 10 11 17 16 8 9 10 16 18 7 8 16 4 5 18 16 17 19 4 4 19 2 3 19 0 1 2 7 18 5 6 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 12 7 10 11 7 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 8 9 19 19 9 10 11 17 18 19 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 8 9 19 19 9 10 11 12 18 19 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 8 9 12 12 9 10 11 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 7 8 11 11 8 9 10 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 7 12 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 12 7 8 11 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 12 7 8 11 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 6 7 12 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 12 7 8 11 11 8 9 10 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 7 8 9 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 8 9 10 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 8 9 10 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 7 8 9 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 7 8 9 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 8 9 10 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 8 9 10 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 8 9 10 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 7 8 9 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 8 9 10 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 7 8 9 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 10 7 8 9 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 10 7 8 9 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 10 7 8 9 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 12 9 10 11 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 9 10 19 19 10 11 12 17 18 19 12 17 12 13 14\n" + "16 4 11 16 14 15 17 16 8 18 14 16 6 7 8 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 8 9 12 12 9 10 11 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 9 10 19 19 10 11 12 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 15 18 16 8 13 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 13 8 9 12 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 13 8 9 12 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 8 13 14 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 13 8 9 12 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 9 10 11 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 9 10 11 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 8 11 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 11 8 9 10 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 11 8 9 10 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 9 10 11 17 18 11 19 11 12 13 19 17 19 13 14\n" + "16 4 11 16 14 15 17 16 8 18 14 16 6 7 8 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 8 9 10 14 18 10 13 10 11 12 13 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 9 10 11 17 19 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 8 18 12 16 6 7 8 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 18 8 9 10 12 18 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 13 10 11 12 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 13 18 7 12 7 8 11 12 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 18 8 19 8 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 13 18 7 12 7 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 13 18 7 10 7 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 11 18 7 10 7 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 11 8 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 11 18 7 10 7 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 11 18 7 10 7 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 13 18 7 8 13 8 11 12 8 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 13 18 7 8 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 11 18 7 8 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 11 18 7 8 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 18 8 9 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 14 15 17 16 18 9 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 18 7 8 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 19 8 9 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 9 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 18 7 8 12 9 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 9 17 18 9 12 9 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 19 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 10 15 17 16 18 9 10 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 18 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 10 11 17 16 18 9 10 16 6 7 18 16 4 5 6 16 17 19 4 4 19 2 3 19 0 1 2 9 18 7 8 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 11 19 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 9 10 13 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 19 1 2 14 9 10 13 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 9 10 11 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 11 12 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 9 10 11 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 14 11 12 13 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 9 14 15 9 10 13 14 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 9 14 15 9 10 11 14 14 11 12 13 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 15 19 18 17 15 0 5 19 5 0 3 4 0 1 2 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 15 19 18 17 15 0 5 19 5 0 1 4 4 1 2 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 4 5 19 2 3 4 19 0 1 2 15 0 19 17\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 17 19 5 18 5 19 3 4 19 1 2 3 17 0 1 19 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 4 5 19 0 3 4 3 0 1 2 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 4 5 19 0 1 4 4 1 2 3 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 2 5 19 0 1 2 5 2 3 4 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 17 19 4 18 4 19 2 3 19 0 1 2 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 2 3 19 0 1 2 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 2 3 19 0 1 2 12 9 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 2 3 19 0 1 2 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 2 3 19 0 1 2 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 2 3 19 0 1 2 12 13 14 15 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 4 4 1 2 3 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 2 5 2 3 4 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 11 8 9 10\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 7 8 9 16 17 18 7 7 18 19 6 17 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 17 18 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 5 6 17 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 7 8 18 16 17 19 7 7 19 5 6 17 0 5 19 5 0 1 4 4 1 2 3 10 18 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 12 9 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 7 8 9 16 17 19 7 7 19 5 6 17 0 5 19 5 0 1 4 4 1 2 3 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 7 8 9 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 7 8 9 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 18 17 17 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 6 17 4 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 6 17 4 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 6 17 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 6 17 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 6 17 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 6 17 4 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 5 6 9 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 5 6 9 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 17 8 9 10 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 7 4 5 6 7 9 17 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 3 4 17 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 6 9 16 17 19 18 18 19 3 4 17 0 3 19 3 0 1 2 6 18 4 5 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 18 17 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 9 17 5 8 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 18 17 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 7 17 5 6 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 18 17 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 7 17 5 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 18 17 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 7 17 5 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 18 17 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 7 17 5 6 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 10 11 16 18 6 7 16 17 19 18 18 19 3 4 17 0 3 19 3 0 1 2 6 18 4 5 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 18 6 7 16 17 19 18 18 19 3 4 17 0 3 19 3 0 1 2 6 18 4 5 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 18 6 7 16 17 19 18 18 19 3 4 17 0 3 19 3 0 1 2 6 18 4 5 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 18 6 7 16 17 19 18 18 19 3 4 17 0 3 19 3 0 1 2 6 18 4 5 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 19 18 18 19 3 4 17 0 3 19 3 0 1 2 6 18 4 5 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 6 7 19 19 7 8 9 10 17 19 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 10 5 6 9 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 6 7 8 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 6 7 8 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 6 7 8 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 18 6 7 8 10 18 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 4 5 8 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 5 6 7 12 9 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 5 6 7 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 5 6 9 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 9 6 7 8 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 5 6 7 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 5 6 9 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 9 6 7 8 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 5 6 7 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 5 6 9 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 9 6 7 8 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 11 12 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 9 12 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 9 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 7 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 18 11 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 18 7 8 9 11 18 9 10 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 13 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 9 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 10 18 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 10 7 8 9 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 10 11 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 10 7 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 10 11 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 10 7 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 10 18 6 9 6 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 10 18 6 7 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 8 11 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 8 18 6 7 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 17 16 9 12 13 16 18 8 9 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 8 18 6 7 12 9 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 18 8 9 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 8 18 6 7 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 18 8 9 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 8 18 6 7 11 12 13 14 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 8 9 10 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 18 8 9 10 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 8 11 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 8 11 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 11 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 18 13 16 7 8 9 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 18 9 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 13 17 18 16 9 12 13 16 7 8 9 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 9 12 17 16 7 8 9 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 10 13 16 7 8 18 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 18 10 11 16 7 8 18 16 5 6 7 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 17 10 11 12 17 12 13 14 14 15 0 18\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 19 0 1 2 19 19 2 3 4 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 4 9 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 9 4 5 8 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 4 7 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 4 5 6 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 4 7 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 4 5 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 17 4 7 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 4 5 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 17 4 7 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 4 5 6 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 10 11 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 8 11 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 8 5 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 5 8 9 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 8 9 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 8 9 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 8 5 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 6 9 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 6 9 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 9 6 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 10 13 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 10 7 8 9 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 8 13 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 7 8 9 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 9 10 13 14 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 17 4 5 8 8 5 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 17 4 5 6 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 17 4 5 6 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 17 4 5 6 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 17 4 5 6 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 17 4 5 6 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 3 4 7 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 7 4 5 6 17 8 9 10 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 8 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 8 5 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 17 6 7 10 10 7 8 9 12 17 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 1 2 15 0 1 18 17 2 3 19 19 3 4 5 19 5 6 7 8 17 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 18 2 3 4 6 18 4 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 18 2 3 4 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 18 17 17 18 1 2 15 0 1 18 8 17 2 7 2 3 19 7 19 3 4 5 7 19 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 1 2 17 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 4 7 7 4 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 4 7 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 4 7 7 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 19 18 18 19 1 2 17 0 1 19 8 18 2 7 2 3 4 7 7 4 5 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 6 9 16 17 19 18 18 19 1 2 17 0 1 19 6 18 2 5 2 3 4 5 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 17 11 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 10 11 16 18 6 7 16 17 19 18 18 19 1 2 17 0 1 19 6 18 2 5 2 3 4 5 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 18 6 7 16 17 19 18 18 19 1 2 17 0 1 19 6 18 2 5 2 3 4 5 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 18 6 7 16 17 19 18 18 19 1 2 17 0 1 19 6 18 2 5 2 3 4 5 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 18 6 7 16 17 19 18 18 19 1 2 17 0 1 19 6 18 2 5 2 3 4 5 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 19 18 18 19 1 2 17 0 1 19 6 18 2 5 2 3 4 5 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 19 18 18 19 1 2 17 0 1 19 6 18 2 5 2 3 4 5 12 13 0 17 0 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 4 5 8 8 5 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 4 9 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 9 4 5 8 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 4 9 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 9 4 5 8 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 4 9 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 9 4 5 8 8 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 4 5 6 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 4 5 6 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 4 5 6 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 4 5 6 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 4 5 6 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 18 4 7 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 7 4 5 6 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 18 4 7 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 7 4 5 6 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 18 4 7 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 7 4 5 6 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 18 4 7 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 7 4 5 6 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 6 9 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 6 9 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 9 6 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 10 13 16 5 6 7 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 10 7 8 9 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 10 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 5 6 9 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 10 11 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 5 10 11 16 18 4 5 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 10 5 6 9 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 8 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 8 11 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 5 8 11 16 18 4 5 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 8 5 6 7 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 17 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 5 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 17 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 5 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 5 8 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 5 8 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 5 8 9 16 18 4 5 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 8 5 6 7 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 8 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 5 8 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 8 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 5 8 9 16 18 4 5 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 8 5 6 7 13 10 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 17 4 5 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 17 4 5 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 17 4 5 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 17 4 5 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 17 4 5 8 5 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 18 4 17 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 6 17 4 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 10 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 6 11 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 5 6 11 16 18 4 5 16 17 19 18 18 19 1 2 17 0 1 19 4 18 2 3 11 6 7 10 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 8 17 8 9 10 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 8 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 8 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 8 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 9 6 7 8 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 12 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 7 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 17 6 9 6 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 17 6 9 6 7 8 9 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 8 13 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 17 8 9 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 19 19 5 8 9 5 6 7 8 10 17 19 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 19 19 5 6 9 9 6 7 8 10 17 19 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 19 19 5 6 7 19 7 8 9 10 17 19 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 19 19 5 6 7 8 17 19 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 19 19 5 6 7 8 17 19 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 19 19 5 6 7 8 17 19 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 17 4 5 19 19 5 6 7 8 17 19 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 8 8 5 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 8 8 5 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 18 4 5 6 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 3 4 7 16 15 19 3 3 19 1 2 15 0 1 19 7 4 5 6 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 8 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 8 5 6 7 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 8 18 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 8 5 6 7 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 10 17 4 19 4 5 6 19 19 6 7 8 10 19 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 8 18 4 7 4 5 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 6 18 4 5 17 6 7 10 10 7 8 9 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 6 18 4 5 17 6 7 8 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 17 6 7 19 19 7 10 11 7 8 9 10 12 17 19 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 17 6 7 19 19 7 8 9 19 9 10 11 12 17 19 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 12 17 6 19 6 7 8 19 19 8 9 10 12 19 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 19 7 1 2 3 19 19 3 4 5 7 19 5 6 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 4 19 1 2 3 4 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 12 17 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 18 5 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 0 18 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 8 18 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 6 9 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 7 8 9 12 17 10 11\n" +; + +const char* data_dqrgl_block16 = + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 10 11 16 18 6 7 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 8 9 16 18 6 17 16 13 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 18 6 7 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 11 8 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 7 8 17 16 18 6 7 16 13 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 10 17 8 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 10 17 16 7 8 9 16 18 6 7 16 13 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 12 13 14 17 17 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 18 6 7 16 17 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 8 9 16 19 18 17 16 13 0 19 19 0 1 6 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 19 8 9 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 8 18 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 8 18 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 8 18 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 19 8 18 16 17 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 10 18 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 8 9 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 8 9 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 19 8 9 16 17 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 19 8 9 16 18 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 19 8 9 16 18 0 19 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 19 8 9 10 18 19 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 9 18 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 6 6 1 2 5 5 2 3 4 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 4 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 3 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 9 18 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 6 6 1 2 3 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 18 0 1 19 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 19 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 8 9 16 17 0 18 18 0 1 19 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 4 4 1 2 3 7 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 4 18 19 4 5 18 5 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 4 18 19 4 5 17 18 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 10 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 17 6 7 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 17 6 7 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 7 10 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 8 9 16 19 18 17 16 13 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 18 17 16 19 8 9 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 18 7 8 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 8 18 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 8 18 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 8 18 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 19 8 18 16 17 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 7 8 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 8 9 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 8 9 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 19 8 9 16 17 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 7 8 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 19 8 9 16 18 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 7 8 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 8 9 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 19 8 9 16 18 0 19 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 19 8 9 10 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 18 7 8 9 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 10 7 8 9 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 4 4 1 2 3 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 2 7 2 5 6 2 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 2 7 2 3 6 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 2 3 18 3 4 5 17 18 5 19 5 6 7 19 8 17 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 18 19 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 18 19 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 17 6 7 8 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 6 9 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 6 9 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 6 9 16 17 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 10 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 10 11 16 18 6 7 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 10 11 16 18 6 7 16 17 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 6 17 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 6 17 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 6 17 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 6 7 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 19 8 9 10 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 18 7 8 9 11 18 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 5 19 1 2 5 2 3 4 10 7 8 9 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 2 5 2 3 4 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 6 7 8 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 2 5 2 3 4 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 2 5 2 3 4 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 2 5 2 3 4 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 2 5 2 3 4 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 3 4 7 4 5 6 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 8 8 5 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 4 9 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 9 4 5 8 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 4 9 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 9 4 5 8 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 18 4 9 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 9 4 5 8 8 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 6 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 6 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 6 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 6 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 6 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 6 8 17 6 7 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 8 9 16 18 4 17 16 13 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 4 5 6 8 17 6 7 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 18 4 7 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 11 8 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 10 17 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 7 8 17 16 18 4 7 16 13 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 10 17 8 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 17 10 11 12 12 13 14 15\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 18 4 7 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 10 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 10 5 6 9 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 10 11 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 5 10 11 16 18 4 5 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 10 5 6 9 9 6 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 8 11 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 5 8 11 16 18 4 5 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 11 8 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 5 8 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 5 8 9 16 18 4 5 16 17 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 10 17 4 5 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 10 17 4 5 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 18 4 17 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 6 17 4 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 6 7 10 10 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 6 11 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 6 7 8 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 6 7 8 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 17 6 7 8 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 12 17 16 5 6 7 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 19 19 1 2 3 4 18 19 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 5 10 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 10 5 6 9 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 6 7 8 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 6 7 8 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 6 7 8 10 18 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 18 5 8 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 8 5 6 7 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 19 6 9 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 9 6 7 8 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 18 5 8 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 8 5 6 7 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 19 6 9 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 9 6 7 8 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 19 6 9 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 9 6 7 8 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 19 6 9 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 9 6 7 8 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 18 5 8 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 8 5 6 7 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 19 6 9 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 9 6 7 8 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 18 5 8 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 8 5 6 7 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 19 6 9 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 9 6 7 8 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 19 6 9 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 9 6 7 8 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 10 17 18 5 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 8 9 16 19 18 17 16 13 0 19 19 0 1 4 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 6 9 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 6 9 16 19 18 17 16 13 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 13 14 15 0\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 7 10 11 16 17 6 7 16 19 18 17 16 13 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 13 14 15 0\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 7 8 11 16 17 6 7 16 19 18 17 16 13 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 11 8 9 10 13 14 15 0\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 12 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 12 13 16 7 8 9 16 17 6 7 16 19 18 17 16 13 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 9 10 11 12 13 14 15 0\n" + "16 4 11 16 9 10 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 10 11 14 15 14 11 12 13\n" + "16 4 11 16 9 10 11 16 7 8 9 16 17 6 7 16 19 18 17 16 11 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 7 8 11 11 8 9 10 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 11 12 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 9 12 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 9 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 18 17 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 18 17 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 7 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 18 17 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 7 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 7 18 17 16 19 6 7 16 13 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 7 8 9 10 17 18 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 11 18 17 16 7 10 11 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 6 9 10 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 9 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 10 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 7 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 10 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 7 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 10 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 7 8 9 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 9 10 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 10 11 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 7 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 9 10 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 10 11 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 10 11 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 7 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 6 7 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 8 11 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 18 17 9 16 19 6 18 16 13 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 18 8 9 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 18 8 17 16 19 6 18 16 13 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 18 8 9 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 18 8 9 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 8 9 16 19 6 18 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 10 17 16 18 8 9 16 19 6 18 16 13 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 18 8 9 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 12 13 14 17 17 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 18 8 9 16 19 6 18 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7 12 15 0 17 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 8 9 10 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 8 11 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 8 11 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 11 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 18 17 16 7 8 9 16 19 6 7 16 13 0 19 19 0 1 4 4 1 2 3 6 19 4 5 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 9 12 13 16 7 8 9 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 12 17 16 7 8 9 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 10 13 16 7 8 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 18 17 11 16 7 8 18 16 19 6 7 16 13 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 18 8 9 11 17 9 10 13 14 15 0\n" + "16 4 11 16 11 14 17 16 18 10 11 16 7 8 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 18 10 17 16 7 8 18 16 19 6 7 16 13 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 12 13 14 17 17 14 15 0\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 19 6 7 16 17 0 19 19 0 1 4 4 1 2 3 6 19 4 5 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 10 11 12 17 12 13 14 14 15 0 18\n" + "16 4 11 16 11 17 18 16 9 10 11 16 7 8 9 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 18 5 6 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 6 7 16 15 0 18 18 0 1 4 4 1 2 3 6 18 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 17 12 18 16 9 10 17 16 7 8 9 16 19 6 7 16 18 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 10 11 12 12 13 14 18 18 14 15 0\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 19 6 7 16 15 0 19 19 0 1 4 4 1 2 3 6 19 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 4 5 10 16 17 18 4 4 18 19 3 3 19 1 2 10 5 6 9 9 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 18 5 6 7 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 19 6 7 8 18 19 8 9 10 17 18 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 18 5 6 7 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 19 10 18 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 19 6 7 8 10 19 8 9 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 18 5 6 7 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 19 10 11 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 19 6 7 8 10 19 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 18 5 6 7 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 19 6 7 8 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 19 10 11 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 19 6 7 8 10 19 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 4 5 8 16 17 19 4 4 19 0 3 3 0 1 2 8 5 6 7 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 4 5 8 16 17 18 4 4 18 19 3 3 19 1 2 8 5 6 7 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 19 3 3 19 1 2 8 5 6 7 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 5 6 9 16 19 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 4 5 8 16 18 19 4 4 19 0 3 3 0 1 2 8 5 6 7 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 4 5 8 16 17 18 4 4 18 19 3 3 19 1 2 8 5 6 7 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 5 6 9 16 19 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 5 6 9 16 19 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 5 19 3 4 10 7 8 9 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 18 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 7 8 19 19 8 9 10 12 17 18 19 12 19 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 10 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 9 18 16 4 5 6 16 17 19 4 4 19 0 3 3 0 1 2 9 6 7 8 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 9 12 16 4 5 6 16 17 18 4 4 18 19 3 3 19 1 2 9 6 7 8 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 19 18 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 19 7 8 9 10 18 19 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 19 18 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 19 7 8 9 10 18 19 9 12 13 14 17 17 14 15 0\n" + "16 4 11 16 14 15 17 16 10 13 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 19 3 3 19 1 2 9 6 7 8 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 10 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 10 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 10 11 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 9 10 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 9 6 7 8 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 9 10 16 4 5 6 16 17 18 4 4 18 19 3 3 19 1 2 9 6 7 8 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 10 11 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 10 11 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 5 19 3 4 11 8 9 10 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 17 18 6 19 6 7 8 19 19 8 9 10 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 11 11 8 9 10 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 8 18 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 8 19 6 7 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 19 8 18 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 8 19 6 7 18 8 9 10 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 9 18 7 8 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 12 17 16 9 10 11 16 19 18 9 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 18 19 6 7 9 18 7 8 12 13 14 17 17 14 15 0\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 8 19 6 7 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 12 17 16 18 10 11 16 19 8 18 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 8 19 6 7 10 18 8 9 12 13 14 17 17 14 15 0\n" + "16 4 11 16 17 14 18 16 9 10 17 16 19 8 9 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 8 19 6 7 17 10 11 12 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 12 18 16 9 10 17 16 19 8 9 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 8 19 6 7 17 10 11 12 12 13 14 18 18 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 4 5 6 16 17 18 4 4 18 19 3 3 19 1 2 12 7 8 11 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 18 11 14 16 6 7 18 16 4 5 6 16 17 19 4 4 19 0 3 3 0 1 2 18 7 8 9 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 19 8 9 10 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 19 8 9 10 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 19 8 9 10 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 7 8 19 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 19 8 9 10 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 4 5 6 16 17 19 4 4 19 0 3 3 0 1 2 18 7 8 9 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 19 8 9 10 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 7 8 19 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 19 8 9 10 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 11 8 9 10 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 10 7 8 9 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 4 5 6 16 17 18 4 4 18 19 3 3 19 1 2 10 7 8 9 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 11 8 9 10 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 11 8 9 10 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 6 7 8 16 17 18 6 6 18 19 5 5 19 3 4 12 9 10 11 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 9 10 19 19 10 11 12 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 12 9 10 11 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 8 11 17 16 6 7 8 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 11 8 9 10 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 3 19 1 2 11 8 9 10 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 12 18 16 9 19 17 16 7 8 9 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 19 9 10 11 17 19 11 12 12 13 14 18 18 14 15 0\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 12 9 10 11 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 12 9 10 11 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 5 19 3 4 13 10 11 12 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 19 8 11 8 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 18 19 8 9 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 17 14 18 16 19 10 17 16 7 8 19 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 10 19 8 9 17 10 11 12 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 19 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 18 19 8 9 17 18 9 10 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 19 18 11 16 7 8 19 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 18 19 8 9 11 18 9 10 12 13 14 17 17 14 15 0\n" + "16 4 11 16 17 12 18 16 19 10 17 16 7 8 19 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 10 19 8 9 17 10 11 12 12 13 14 18 18 14 15 0\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 5 19 3 4 14 11 12 13 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 10 13 18 10 11 12 13 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 10 13 18 10 11 12 13 18 13 14 19 19 14 15 0\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 10 11 18 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 5 6 15 19 18 17 15 0 5 19 5 0 3 4 0 1 2 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 7 19 5 6 15 19 18 17 15 0 5 19 5 0 1 4 4 1 2 3\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 8 11 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 11 8 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 18 8 9 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 19 4 7 16 17 0 19 19 0 1 2 4 19 2 3 7 4 5 6 18 8 9 10 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 8 11 16 19 4 7 16 18 0 19 19 0 1 2 4 19 2 3 7 4 5 6 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 8 11 16 19 4 7 16 18 0 19 19 0 1 2 4 19 2 3 7 4 5 6 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 10 11 12 16 6 7 10 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 11 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 18 17 16 7 8 9 16 19 4 7 16 13 0 19 19 0 1 2 4 19 2 3 7 4 5 6 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 9 12 13 16 7 8 9 16 19 4 7 16 18 0 19 19 0 1 2 4 19 2 3 7 4 5 6 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 12 17 16 7 8 9 16 19 4 7 16 18 0 19 19 0 1 2 4 19 2 3 7 4 5 6 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 8 11 12 16 6 7 8 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 19 4 7 16 17 0 19 19 0 1 2 4 19 2 3 7 4 5 6 12 18 8 11 8 9 10 11 14 15 0 17\n" +; + +const char* data_dqrgl_block17 = + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 19 4 7 16 17 0 19 19 0 1 2 4 19 2 3 7 4 5 6 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 10 13 16 7 8 18 16 19 4 7 16 17 0 19 19 0 1 2 4 19 2 3 7 4 5 6 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 14 17 16 18 10 11 16 7 8 18 16 19 4 7 16 17 0 19 19 0 1 2 4 19 2 3 7 4 5 6 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 18 10 17 16 7 8 18 16 19 4 7 16 13 0 19 19 0 1 2 4 19 2 3 7 4 5 6 10 18 8 9 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 19 4 7 16 17 0 19 19 0 1 2 4 19 2 3 7 4 5 6 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 19 4 7 16 18 0 19 19 0 1 2 4 19 2 3 7 4 5 6 17 10 11 12 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 8 9 12 16 6 7 8 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 12 9 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 18 4 7 16 15 0 18 18 0 1 2 4 18 2 3 7 4 5 6 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 19 4 7 16 15 0 19 19 0 1 2 4 19 2 3 7 4 5 6 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 19 4 7 16 18 0 19 19 0 1 2 4 19 2 3 7 4 5 6 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 10 11 17 16 8 9 10 16 6 7 8 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 10 17 18 3 10 3 4 9 9 4 7 8 4 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 10 17 18 3 10 3 4 9 9 4 5 8 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 10 17 18 3 10 3 4 9 9 4 5 6 9 6 7 8\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 8 17 18 3 8 3 4 7 7 4 5 6 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 8 17 18 3 8 3 4 7 7 4 5 6 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 8 17 18 3 8 3 4 7 7 4 5 6 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 8 17 18 3 8 3 4 7 7 4 5 6 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 6 17 18 3 6 3 4 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 6 17 18 3 6 3 4 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 6 17 18 3 6 3 4 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 6 17 18 3 6 3 4 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 12 15 16 7 8 9 16 17 6 7 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 6 17 18 3 6 3 4 5 9 10 11 12 12 13 14 15\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 4 7 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 4 17 18 3 7 4 5 6 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 12 15 16 7 8 9 16 17 4 7 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 4 17 18 3 7 4 5 6 9 10 11 12 12 13 14 15\n" + "16 4 11 16 11 12 15 16 5 8 11 16 17 4 5 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 4 17 18 3 8 5 6 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 12 15 16 5 8 9 16 17 4 5 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 4 17 18 3 8 5 6 7 9 10 11 12 12 13 14 15\n" + "16 4 11 16 13 17 18 16 11 12 13 16 5 8 11 16 19 4 5 16 18 0 19 19 0 1 2 4 19 2 3 8 5 6 7 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 5 8 11 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 8 5 6 7 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 5 8 11 16 19 4 5 16 18 0 19 19 0 1 2 4 19 2 3 8 5 6 7 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 18 17 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 18 5 6 7 12 17 18 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 18 17 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 18 5 6 7 10 17 18 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 5 18 17 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 18 5 6 7 10 17 18 7 10 7 8 9 12 13 14 15\n" + "16 4 11 16 11 12 15 16 17 8 11 16 5 18 17 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 18 5 6 7 8 17 18 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 18 17 16 5 8 9 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 8 5 6 7 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 5 8 9 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 8 5 6 7 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 13 17 18 16 9 12 13 16 5 8 9 16 19 4 5 16 18 0 19 19 0 1 2 4 19 2 3 8 5 6 7 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 14 18 16 9 12 17 16 5 8 9 16 19 4 5 16 18 0 19 19 0 1 2 4 19 2 3 8 5 6 7 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 8 18 16 19 4 5 16 17 0 19 19 0 1 2 4 19 2 3 8 5 6 7 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 5 8 18 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 8 5 6 7 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 10 13 16 5 8 18 16 19 4 5 16 17 0 19 19 0 1 2 4 19 2 3 8 5 6 7 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 18 10 11 16 5 8 18 16 19 4 5 16 17 0 19 19 0 1 2 4 19 2 3 8 5 6 7 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 5 8 18 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 8 5 6 7 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 5 8 18 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 8 5 6 7 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 11 12 17 16 18 10 11 16 5 8 18 16 19 4 5 16 17 0 19 19 0 1 2 4 19 2 3 8 5 6 7 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 18 16 9 10 17 16 5 8 9 16 19 4 5 16 18 0 19 19 0 1 2 4 19 2 3 8 5 6 7 17 10 11 12 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 8 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 8 5 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 18 16 9 10 17 16 5 8 9 16 19 4 5 16 18 0 19 19 0 1 2 4 19 2 3 8 5 6 7 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 4 17 16 15 0 18 18 0 1 2 4 18 2 3 10 17 4 5 10 5 19 9 5 6 7 19 9 19 7 8\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 10 18 4 5 10 5 8 9 5 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 10 18 4 5 10 5 8 9 5 6 7 8 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 10 18 4 5 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 10 18 4 5 10 5 6 9 9 6 7 8 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 18 8 9 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 12 9 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 18 8 9 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 18 8 9 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 18 8 9 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 17 16 9 10 13 16 18 6 9 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 6 18 4 5 9 6 7 8 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 18 6 9 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 6 18 4 5 9 6 7 8 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 17 16 7 10 13 16 18 6 7 16 19 4 18 16 17 0 19 19 0 1 2 4 19 2 3 6 18 4 5 10 7 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 7 10 17 16 18 6 7 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 6 17 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 19 4 18 16 15 0 19 19 0 1 2 4 19 2 3 6 18 4 5 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 9 6 7 8 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 11 6 7 19 11 19 7 8 9 11 19 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 19 6 7 10 19 10 7 8 9 12 19 10 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 12 18 6 11 6 7 10 11 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 19 6 7 8 19 19 8 9 10 12 19 10 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 12 18 6 11 6 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 19 6 7 8 19 12 19 8 11 8 9 10 11\n" + "16 4 11 16 17 14 15 16 18 10 17 16 5 6 18 16 19 4 5 16 15 0 19 19 0 1 2 4 19 2 3 10 18 6 9 6 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 18 4 5 16 15 0 18 18 0 1 2 4 18 2 3 12 17 6 7 12 7 19 11 7 8 9 19 11 19 9 10\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 11 8 9 10 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 12 9 10 11 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 18 19 8 9 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 10 13 18 10 11 12 13 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 10 11 18 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 5 8 11 16 3 4 5 16 19 0 3 3 0 1 2 8 5 6 7 11 8 9 10 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 8 19 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 8 19 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 8 19 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 18 4 5 19 18 19 5 6 7 19 7 8 9 10 18 19 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 18 4 5 19 18 19 5 6 7 18 19 7 8 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 9 4 5 8 9 8 5 6 7 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 18 4 5 6 18 18 6 7 19 19 7 8 9 10 18 19 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 3 4 18 16 15 0 3 3 0 1 2 10 18 4 19 4 5 6 19 19 6 7 8 10 19 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 19 4 5 6 19 19 6 7 8 10 19 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 7 4 5 6 7 18 7 8 11 11 8 9 10 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 7 4 5 6 7 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 7 4 5 6 7 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 7 4 5 6 7 18 7 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 7 4 5 6 7 18 7 8 9 10 17 18 9 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 10 11 5 6 9 10 9 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 10 11 5 6 7 10 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 8 11 5 6 7 8 11 8 9 10 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 8 9 5 6 7 8 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 8 9 5 6 7 8 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 8 9 5 6 7 8 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 5 18 5 8 9 5 6 7 8 10 17 18 9 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 6 11 11 6 9 10 6 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 6 11 11 6 7 10 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 6 9 9 6 7 8 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 5 18 5 6 9 9 6 7 8 10 17 18 9 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 18 5 6 7 12 17 18 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 5 18 5 6 7 10 17 18 7 10 7 8 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 8 19 14 8 9 10 19 19 10 11 12 14 19 12 13\n" + "16 4 11 16 17 18 19 16 7 10 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 10 7 8 9 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 18 6 7 19 18 19 7 8 9 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 18 6 7 19 18 19 7 8 9 18 19 9 10 12 18 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 11 6 7 10 11 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 12 17 6 18 6 7 8 18 18 8 9 19 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 3 4 5 16 17 0 3 3 0 1 2 12 18 6 19 6 7 8 19 19 8 9 10 12 19 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 9 6 7 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 9 6 7 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 7 18 7 12 13 7 8 11 12 11 8 9 10 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 7 18 7 12 13 7 8 9 12 12 9 10 11 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 7 18 7 10 13 7 8 9 10 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 7 18 7 10 11 7 8 9 10 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 7 18 7 8 13 13 8 11 12 8 9 10 11 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 7 18 7 8 13 13 8 9 12 12 9 10 11 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 3 4 5 16 15 0 3 3 0 1 2 18 19 6 7 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 18 14 8 9 19 18 19 9 10 11 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 18 14 8 9 19 18 19 9 10 11 18 19 11 12 14 18 12 13\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 17 8 13 18 8 9 12 13 12 9 10 11 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 3 4 5 16 15 0 3 3 0 1 2 17 8 18 14 8 9 10 18 18 10 11 19 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 17 8 11 18 8 9 10 11 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 17 8 9 18 18 9 14 15 9 10 13 14 13 10 11 12 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 17 8 9 18 18 9 14 15 9 10 11 14 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 17 8 9 18 18 9 12 15 9 10 11 12 15 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 17 8 9 18 18 9 10 15 15 10 13 14 10 11 12 13 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 3 4 5 16 19 0 3 3 0 1 2 17 8 9 18 18 9 10 15 15 10 11 14 14 11 12 13 18 15 0 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 19 18 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 19 18 19 1 4 5 1 2 3 4 18 19 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 18 19 0 7 0 1 6 7 6 1 4 5 1 2 3 4 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 8 19 0 7 8 7 0 1 6 6 1 4 5 1 2 3 4 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 8 19 0 7 8 7 0 1 6 6 1 2 5 5 2 3 4 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 18 7 18 1 2 19 19 2 3 4 19 4 5 6 7 18 19 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 8 19 0 7 8 7 0 1 6 6 1 2 3 6 3 4 5 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 19 18 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 8 19 0 7 8 7 0 1 4 4 1 2 3 7 4 5 6 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 18 7 18 1 2 19 19 2 3 4 18 19 4 5 7 18 5 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 8 19 0 5 8 5 0 1 4 4 1 2 3 8 5 6 7 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 19 18 19 1 2 5 5 2 3 4 18 19 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 18 19 0 7 0 1 6 7 6 1 2 5 5 2 3 4 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 6 19 0 5 6 5 0 1 4 4 1 2 3 9 6 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 8 19 0 7 8 7 0 1 2 7 2 5 6 2 3 4 5 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 7 0 1 18 7 18 1 2 3 18 3 4 19 19 4 5 6 7 18 19 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 8 19 0 7 8 7 0 1 2 7 2 3 6 6 3 4 5 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 19 18 19 1 2 3 19 3 4 5 18 19 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 18 8 17 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 3 19 3 4 5 7 19 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 3 19 3 4 5 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 3 19 3 4 5 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 18 19 0 7 0 1 6 7 6 1 2 3 6 3 4 5 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 18 9 10 16 17 19 18 9 18 19 6 19 0 5 6 5 0 1 2 5 2 3 4 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 4 18 4 1 2 3 18 4 5 19 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 19 0 1 4 19 4 1 2 3 19 4 5 6 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 8 18 0 19 0 1 4 19 4 1 2 3 19 4 5 6 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 19 18 19 1 2 3 18 19 3 6 3 4 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 18 19 0 5 0 1 4 5 4 1 2 3 18 5 6 9 9 6 7 8 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 19 18 17 16 15 0 19 18 19 0 5 0 1 4 5 4 1 2 3 18 5 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 17 8 9 16 15 0 17 8 17 0 18 0 1 2 18 18 2 19 6 2 3 4 19 6 19 4 5 8 18 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 19 0 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 18 8 9 16 15 0 18 8 18 0 19 0 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 19 0 1 2 19 19 2 3 4 6 19 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 19 0 1 2 19 19 2 3 4 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 5 6 7 15 0 5 17 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 6 7 8 17 19 6 18 6 19 4 5 19 0 3 4 3 0 1 2 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 6 7 8 17 19 6 18 6 19 4 5 19 0 1 4 4 1 2 3 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 6 7 8 17 19 6 18 6 19 2 5 19 0 1 2 5 2 3 4 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 5 6 18 15 0 5 17 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 5 6 7 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 5 6 7 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 5 6 7 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 19 18 7 15 0 19 17 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 6 18 15 0 19 17 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 4 5 8 17 19 4 18 4 19 2 3 19 0 1 2 8 5 6 7 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 19 18 5 6 7 15 0 5 18 5 0 3 4 0 1 2 3 19 7 8 9 10 17 19 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 18 5 6 19 15 0 5 18 5 0 3 4 0 1 2 3 8 19 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 18 5 6 19 15 0 5 18 5 0 3 4 0 1 2 3 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 18 5 6 19 15 0 5 18 5 0 3 4 0 1 2 3 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 19 5 6 7 15 0 5 19 5 0 3 4 0 1 2 3 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 19 5 6 7 15 0 5 19 5 0 3 4 0 1 2 3 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 19 5 6 7 15 0 5 19 5 0 3 4 0 1 2 3 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 19 5 6 7 15 0 5 19 5 0 3 4 0 1 2 3 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 19 5 6 7 15 0 5 19 5 0 3 4 0 1 2 3 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 19 5 6 7 15 0 5 19 5 0 3 4 0 1 2 3 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 17 19 4 18 4 19 2 3 19 0 1 2 12 13 14 15 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 19 19 1 2 5 5 2 3 4 6 18 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 6 7 8 17 19 6 18 6 19 0 5 5 0 1 4 4 1 2 3 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 6 7 8 17 19 6 18 6 19 0 5 5 0 1 2 5 2 3 4 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 19 19 1 2 3 6 18 19 3 6 3 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 4 7 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 7 4 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 5 8 17 18 4 5 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 18 4 5 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 19 18 7 15 0 19 17 19 0 1 4 4 1 2 3 18 19 4 5 7 18 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 6 18 15 0 19 17 19 0 1 4 4 1 2 3 6 19 4 5 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 19 6 7 17 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 4 5 8 17 19 4 18 4 19 0 3 3 0 1 2 8 5 6 7 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 19 18 5 6 7 15 0 5 18 5 0 1 4 4 1 2 3 19 7 8 9 10 17 19 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 4 5 6 17 19 4 18 4 19 0 3 3 0 1 2 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 18 5 6 19 15 0 5 18 5 0 1 4 4 1 2 3 8 19 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 18 5 6 19 15 0 5 18 5 0 1 4 4 1 2 3 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 18 5 6 19 15 0 5 18 5 0 1 4 4 1 2 3 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 19 8 18 5 6 19 17 0 5 18 5 0 1 4 4 1 2 3 8 19 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 19 5 6 7 15 0 5 19 5 0 1 4 4 1 2 3 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 19 5 6 7 15 0 5 19 5 0 1 4 4 1 2 3 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 19 5 6 7 15 0 5 19 5 0 1 4 4 1 2 3 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 7 8 19 5 6 7 17 0 5 19 5 0 1 4 4 1 2 3 10 18 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 4 5 6 17 19 4 18 4 19 0 3 3 0 1 2 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 19 5 6 7 15 0 5 19 5 0 1 4 4 1 2 3 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 17 19 4 18 4 19 0 3 3 0 1 2 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 19 5 6 7 15 0 5 19 5 0 1 4 4 1 2 3 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 19 5 6 7 15 0 5 19 5 0 1 4 4 1 2 3 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 19 9 9 19 7 8 19 5 6 7 17 0 5 19 5 0 1 4 4 1 2 3 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 17 19 4 18 4 19 0 3 3 0 1 2 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 19 9 9 19 7 8 19 5 6 7 18 0 5 19 5 0 1 4 4 1 2 3 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 4 5 6 17 19 4 18 4 19 0 3 3 0 1 2 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 19 9 9 19 7 8 19 5 6 7 18 0 5 19 5 0 1 4 4 1 2 3 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 18 0 1 2 6 18 2 19 2 3 4 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 19 18 7 15 0 19 17 19 0 1 2 18 19 2 5 2 3 4 5 7 18 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 6 18 15 0 19 17 19 0 1 2 6 19 2 5 2 3 4 5 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 19 0 1 2 6 19 2 5 2 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 1 2 6 19 2 5 2 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 1 2 6 19 2 5 2 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 19 6 7 17 0 19 18 19 0 1 2 6 19 2 5 2 3 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 19 18 7 15 0 19 17 19 0 1 2 18 19 2 3 18 3 4 5 7 18 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 19 0 1 2 6 19 2 3 6 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 1 2 6 19 2 3 6 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 19 0 1 2 6 19 2 3 6 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 19 6 7 17 0 19 18 19 0 1 2 6 19 2 3 6 3 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 4 18 15 0 19 17 19 0 1 2 4 19 2 3 18 4 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 4 7 15 0 19 18 19 0 1 2 4 19 2 3 7 4 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 4 7 15 0 19 18 19 0 1 2 4 19 2 3 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 4 7 15 0 19 18 19 0 1 2 4 19 2 3 7 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 19 4 7 17 0 19 18 19 0 1 2 4 19 2 3 7 4 5 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 19 18 7 15 0 19 17 19 0 1 2 18 19 2 3 7 18 3 6 3 4 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 17 19 18 5 15 0 19 17 19 0 1 2 18 19 2 3 5 18 3 4 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 17 19 18 5 15 0 19 17 19 0 1 2 18 19 2 3 5 18 3 4 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 17 19 18 5 15 0 19 17 19 0 1 2 18 19 2 3 5 18 3 4 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 17 19 18 5 15 0 19 17 19 0 1 2 18 19 2 3 5 18 3 4 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 8 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 5 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 5 8 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 5 8 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 5 8 18 19 4 5 17 0 19 18 19 0 1 2 4 19 2 3 8 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 4 18 15 0 19 17 19 0 1 2 4 19 2 3 8 18 4 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 17 19 4 18 15 0 19 17 19 0 1 2 4 19 2 3 6 18 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 17 19 4 18 15 0 19 17 19 0 1 2 4 19 2 3 6 18 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 17 19 4 18 15 0 19 17 19 0 1 2 4 19 2 3 6 18 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 17 19 4 18 15 0 19 17 19 0 1 2 4 19 2 3 6 18 4 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 8 17 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 19 0 1 2 4 19 2 3 17 10 11 14 14 11 12 13\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 2 3 8 17 19 2 18 2 19 0 1 8 3 6 7 3 4 5 6 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 2 3 8 17 19 2 18 2 19 0 1 8 3 4 7 7 4 5 6 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 19 3 4 7 15 0 3 19 3 0 1 2 7 4 5 6 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 19 3 4 7 15 0 3 19 3 0 1 2 7 4 5 6 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 19 3 4 7 15 0 3 19 3 0 1 2 7 4 5 6 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 7 8 19 3 4 7 17 0 3 19 3 0 1 2 7 4 5 6 10 18 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 2 3 6 17 19 2 18 2 19 0 1 6 3 4 5 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 19 3 4 7 15 0 3 19 3 0 1 2 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 2 3 6 17 19 2 18 2 19 0 1 6 3 4 5 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 19 3 4 7 15 0 3 19 3 0 1 2 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 19 3 4 7 15 0 3 19 3 0 1 2 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 19 9 9 19 7 8 19 3 4 7 17 0 3 19 3 0 1 2 7 4 5 6 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 2 3 6 17 19 2 18 2 19 0 1 6 3 4 5 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 19 9 9 19 7 8 19 3 4 7 18 0 3 19 3 0 1 2 7 4 5 6 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 2 3 6 17 19 2 18 2 19 0 1 6 3 4 5 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 19 9 9 19 7 8 19 3 4 7 18 0 3 19 3 0 1 2 7 4 5 6 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 2 3 6 17 19 2 18 2 19 0 1 6 3 4 5 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 19 18 3 4 5 15 0 3 18 3 0 1 2 19 5 6 7 10 17 19 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 5 19 18 3 4 5 15 0 3 18 3 0 1 2 19 5 6 7 8 17 19 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 18 17 17 18 5 19 18 3 4 5 15 0 3 18 3 0 1 2 19 5 6 7 8 17 19 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 19 18 3 4 5 15 0 3 18 3 0 1 2 19 5 6 7 8 17 19 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 19 18 3 4 5 15 0 3 18 3 0 1 2 19 5 6 7 8 17 19 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 5 8 19 3 4 5 15 0 3 19 3 0 1 2 8 5 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 5 8 19 3 4 5 15 0 3 19 3 0 1 2 8 5 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 5 8 19 3 4 5 15 0 3 19 3 0 1 2 8 5 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 5 8 19 3 4 5 17 0 3 19 3 0 1 2 8 5 6 7 10 18 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 5 8 19 3 4 5 15 0 3 19 3 0 1 2 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 5 8 19 3 4 5 15 0 3 19 3 0 1 2 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 3 4 18 15 0 3 17 3 0 1 2 8 18 4 19 4 5 6 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 18 3 4 19 15 0 3 18 3 0 1 2 8 19 4 7 4 5 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 18 3 4 19 15 0 3 18 3 0 1 2 8 19 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 18 3 4 19 15 0 3 18 3 0 1 2 8 19 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 19 8 18 3 4 19 17 0 3 18 3 0 1 2 8 19 4 7 4 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 18 3 4 19 15 0 3 18 3 0 1 2 8 19 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 18 3 4 19 15 0 3 18 3 0 1 2 8 19 4 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 19 8 18 3 4 19 17 0 3 18 3 0 1 2 8 19 4 5 8 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 18 17 17 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 17 18 7 7 18 19 6 18 3 4 19 17 0 3 18 3 0 1 2 6 19 4 5 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 17 18 7 7 18 19 6 18 3 4 19 17 0 3 18 3 0 1 2 6 19 4 5 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 17 18 7 7 18 19 6 18 3 4 19 17 0 3 18 3 0 1 2 6 19 4 5 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 19 6 18 3 4 19 17 0 3 18 3 0 1 2 6 19 4 5 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 18 3 4 19 15 0 3 18 3 0 1 2 6 19 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 19 6 18 3 4 19 17 0 3 18 3 0 1 2 6 19 4 5 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 10 17 6 19 6 7 8 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 17 18 6 9 6 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 10 18 6 9 6 7 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 10 18 6 7 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 8 11 16 17 19 18 18 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 8 18 6 7 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 13 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 11 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 9 18 13 16 7 8 9 16 17 19 7 7 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 18 9 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 14 18 16 9 12 17 16 7 8 9 16 18 19 7 7 19 5 6 19 3 4 5 18 0 3 19 3 0 1 2 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 19 7 7 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 17 18 8 9 17 9 10 11 13 17 11 12\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 19 7 7 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 10 13 16 7 8 18 16 17 19 7 7 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 19 7 7 19 5 6 19 3 4 5 15 0 3 19 3 0 1 2 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 19 7 7 19 5 6 19 3 4 5 17 0 3 19 3 0 1 2 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 14 9 12 13 9 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 12 13 17 16 8 9 12 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 12 9 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 3 4 5 15 0 3 18 3 0 1 2 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 18 19 7 7 19 5 6 19 3 4 5 18 0 3 19 3 0 1 2 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 10 11 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 2 3 4 17 19 2 18 2 19 0 1 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 18 7 15 0 1 17 18 1 2 19 19 2 5 6 2 3 4 5 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 19 18 15 0 1 17 19 1 2 7 7 2 5 6 2 3 4 5 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 6 7 15 0 1 17 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 19 18 15 0 1 17 19 1 2 7 7 2 3 6 6 3 4 5 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 18 7 15 0 1 17 18 1 2 19 19 2 3 4 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 19 18 15 0 1 17 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 1 18 7 15 0 1 17 18 1 2 19 19 2 3 4 18 19 4 5 7 18 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 1 6 7 15 0 1 18 6 1 2 19 19 2 3 4 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 1 6 7 15 0 1 18 6 1 2 19 19 2 3 4 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 1 6 7 15 0 1 18 6 1 2 19 19 2 3 4 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 1 6 7 17 0 1 18 6 1 2 19 19 2 3 4 6 19 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 17 1 18 5 15 0 1 17 18 1 2 19 19 2 3 4 5 18 19 4 12 9 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 1 19 7 15 0 1 18 19 1 2 5 5 2 3 4 7 19 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 1 19 7 15 0 1 18 19 1 2 5 5 2 3 4 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 1 19 7 15 0 1 18 19 1 2 5 5 2 3 4 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 1 19 7 17 0 1 18 19 1 2 5 5 2 3 4 7 19 5 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 5 5 2 3 4 6 18 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 5 5 2 3 4 6 18 19 5 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 18 1 6 19 15 0 1 18 6 1 2 5 5 2 3 4 8 19 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 18 1 6 19 15 0 1 18 6 1 2 5 5 2 3 4 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 18 1 6 19 15 0 1 18 6 1 2 5 5 2 3 4 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 19 8 18 1 6 19 17 0 1 18 6 1 2 5 5 2 3 4 8 19 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 19 1 6 7 15 0 1 19 6 1 2 5 5 2 3 4 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 19 1 6 7 15 0 1 19 6 1 2 5 5 2 3 4 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 7 8 19 1 6 7 17 0 1 19 6 1 2 5 5 2 3 4 10 18 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 19 1 6 7 15 0 1 19 6 1 2 5 5 2 3 4 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 19 1 6 7 15 0 1 19 6 1 2 5 5 2 3 4 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 19 1 6 7 15 0 1 19 6 1 2 5 5 2 3 4 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 19 9 9 19 7 8 19 1 6 7 17 0 1 19 6 1 2 5 5 2 3 4 12 18 10 11 14 15 0 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 19 9 9 19 7 8 19 1 6 7 18 0 1 19 6 1 2 5 5 2 3 4 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 19 18 15 0 1 17 19 1 2 3 19 3 6 7 3 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 19 18 15 0 1 17 19 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 19 18 15 0 1 17 19 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 3 19 3 4 5 6 18 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 3 19 3 4 5 6 18 19 5 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 19 1 6 7 15 0 1 19 6 1 2 3 6 3 4 5 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 19 1 6 7 15 0 1 19 6 1 2 3 6 3 4 5 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 7 8 19 1 6 7 17 0 1 19 6 1 2 3 6 3 4 5 10 18 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 19 1 6 7 15 0 1 19 6 1 2 3 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 19 1 6 7 15 0 1 19 6 1 2 3 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 19 1 6 7 15 0 1 19 6 1 2 3 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 19 9 9 19 7 8 19 1 6 7 17 0 1 19 6 1 2 3 6 3 4 5 12 18 10 11 14 15 0 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 19 9 9 19 7 8 19 1 6 7 18 0 1 19 6 1 2 3 6 3 4 5 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 19 1 4 7 15 0 1 19 4 1 2 3 7 4 5 6 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 19 1 4 7 15 0 1 19 4 1 2 3 7 4 5 6 10 18 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 7 8 19 1 4 7 17 0 1 19 4 1 2 3 7 4 5 6 10 18 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 19 1 4 7 15 0 1 19 4 1 2 3 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 19 1 4 7 15 0 1 19 4 1 2 3 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 18 17 17 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 8 17 6 7 13 10 11 12\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 1 19 5 15 0 1 18 19 1 2 3 5 19 3 4 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 1 19 18 15 0 1 17 19 1 2 3 8 18 19 3 8 3 4 7 7 4 5 6\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 3 6 18 19 3 6 3 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 17 1 19 18 15 0 1 17 19 1 2 3 6 18 19 3 6 3 4 5 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 18 1 4 19 15 0 1 18 4 1 2 3 8 19 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 18 1 4 19 15 0 1 18 4 1 2 3 8 19 4 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 19 8 18 1 4 19 17 0 1 18 4 1 2 3 8 19 4 5 8 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 18 17 17 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 17 18 7 7 18 19 6 18 1 4 19 17 0 1 18 4 1 2 3 6 19 4 5 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 17 18 7 7 18 19 6 18 1 4 19 17 0 1 18 4 1 2 3 6 19 4 5 13 10 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 18 1 4 19 15 0 1 18 4 1 2 3 6 19 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 19 6 18 1 4 19 17 0 1 18 4 1 2 3 6 19 4 5 12 15 0 17 12 13 14 15\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 19 6 18 1 4 19 17 0 1 18 4 1 2 3 6 19 4 5 12 13 0 17 0 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 10 17 6 19 6 7 8 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 10 18 6 9 6 7 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 18 10 11 16 17 19 18 18 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 10 18 6 7 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 17 16 9 12 13 16 18 8 9 16 17 19 18 18 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 8 18 6 7 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 17 16 9 10 13 16 18 8 9 16 17 19 18 18 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 8 18 6 7 13 10 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 18 8 9 16 17 19 18 18 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 8 18 6 7 12 13 0 17 0 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 19 7 7 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 19 7 7 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 19 7 7 19 5 6 19 1 4 5 15 0 1 19 4 1 2 3 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 19 7 7 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 19 7 7 19 5 6 19 1 4 5 17 0 1 19 4 1 2 3 10 18 8 9 12 13 0 17 0 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 1 4 5 15 0 1 18 4 1 2 3 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 18 19 7 7 19 5 6 19 1 4 5 18 0 1 19 4 1 2 3 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 17 12 18 16 9 10 17 16 7 8 9 16 18 19 7 7 19 5 6 19 1 4 5 18 0 1 19 4 1 2 3 17 10 11 12 12 13 0 18 0 13 14 15\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 1 4 5 17 0 1 18 4 1 2 3 12 19 0 17 12 13 14 19 0 19 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 6 18 15 0 19 17 6 19 0 5 0 1 4 5 4 1 2 3 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 17 12 13 14\n" +; + +const char* data_dqrgl_block18 = + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 19 0 1 2 19 19 2 3 4 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 6 18 15 0 19 17 6 19 0 5 0 1 2 5 5 2 3 4 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 19 0 1 2 19 6 19 2 5 2 3 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 17 19 4 18 15 0 19 17 4 19 0 3 0 1 2 3 8 18 4 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 3 0 1 2 3 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 17 18 6 7 15 0 18 17 6 18 0 1 6 1 19 5 1 2 3 19 5 19 3 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 6 19 0 1 6 1 4 5 1 2 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 1 6 1 4 5 1 2 3 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 1 6 1 4 5 1 2 3 4 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 19 6 7 17 0 19 18 6 19 0 1 6 1 4 5 1 2 3 4 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 18 19 6 7 15 0 19 18 6 19 0 1 6 1 2 5 5 2 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 1 6 1 2 5 5 2 3 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 18 19 6 7 15 0 19 18 6 19 0 1 6 1 2 5 5 2 3 4 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 18 19 6 7 17 0 19 18 6 19 0 1 6 1 2 5 5 2 3 4 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 18 19 4 5 15 0 19 18 4 19 0 1 4 1 2 3 17 10 13 14 10 11 12 13\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 18 7 7 18 5 6 18 19 4 5 17 0 19 18 4 19 0 1 4 1 2 3 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 4 9 4 5 8 9 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 4 9 4 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 4 7 4 5 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 4 5 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 19 2 3 15 0 19 18 2 19 0 1 10 17 4 5 10 5 6 9 9 6 7 8\n" + "16 4 11 16 9 10 17 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 4 11 16 9 10 17 16 7 8 9 16 5 6 7 16 17 18 5 5 18 3 4 18 19 2 3 17 0 19 18 2 19 0 1 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 10 17 4 9 4 5 19 9 19 5 6 7 9 19 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 3 4 18 1 2 3 15 0 1 18 10 17 4 19 4 5 8 19 8 5 6 7 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 17 5 1 2 18 17 18 2 3 19 5 17 18 19 5 19 3 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 6 17 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 7 17 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 6 17 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 19 18 1 2 5 19 5 2 3 4 18 19 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 6 19 1 2 5 6 5 2 3 4 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 8 19 8 1 6 7 1 2 5 6 5 2 3 4 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 19 18 1 2 3 19 19 3 4 5 18 19 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 19 7 1 2 3 19 19 3 4 5 7 19 5 6 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 8 19 8 1 6 7 1 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 19 1 2 3 4 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 19 1 2 3 4 19 4 5 6 17 18 19 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 4 19 1 2 3 4 19 4 5 6 7 18 19 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 4 19 1 2 3 4 19 4 5 6 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 4 19 1 2 3 4 19 4 5 6 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 19 1 2 3 4 19 4 5 6 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 8 19 8 1 4 7 1 2 3 4 7 4 5 6 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 6 17 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 19 18 1 2 3 19 18 19 3 6 3 4 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 19 18 1 2 3 19 18 19 3 4 18 4 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 19 5 1 2 3 19 5 19 3 4 18 5 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 19 18 1 2 3 19 18 19 3 4 17 18 4 5 7 17 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 5 6 0 1 17 5 17 1 19 18 1 2 3 19 18 19 3 4 5 17 18 4 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 19 18 1 2 3 19 18 19 3 4 5 17 18 4 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 19 18 1 2 3 19 18 19 3 4 5 17 18 4 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 19 18 1 2 3 19 18 19 3 4 5 17 18 4 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 17 5 17 1 19 18 1 2 3 19 18 19 3 4 5 17 18 4 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 19 5 1 2 3 19 5 19 3 4 17 18 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 19 5 1 2 3 19 5 19 3 4 7 18 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 19 5 1 2 3 19 5 19 3 4 7 18 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 19 5 1 2 3 19 5 19 3 4 7 18 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 18 7 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 6 18 6 1 19 5 1 2 3 19 5 19 3 4 8 18 6 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 6 18 6 1 19 5 1 2 3 19 5 19 3 4 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 6 18 6 1 19 5 1 2 3 19 5 19 3 4 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 5 1 2 3 4 18 5 6 19 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 5 1 2 3 4 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 19 6 7 8 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8 18 19 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 4 5 1 2 3 4 17 18 5 19 5 6 7 19 8 17 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 5 1 2 3 4 18 19 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 5 1 2 3 4 18 19 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 5 1 2 3 4 8 18 19 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 4 5 1 2 3 4 8 18 19 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 19 1 2 3 4 6 17 18 19 6 19 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 19 1 2 3 4 6 17 18 19 6 19 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 19 1 2 3 4 6 17 18 19 6 19 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 19 1 2 3 4 6 17 18 19 6 19 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 4 19 1 2 3 4 6 17 18 19 6 19 4 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 8 17 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 4 5 1 2 3 4 18 7 8 19 10 17 18 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 19 0 1 6 7 6 1 4 5 1 2 3 4 19 7 8 9 17 18 19 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 19 0 1 6 7 6 1 4 5 1 2 3 4 19 7 8 9 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 19 0 1 6 7 6 1 4 5 1 2 3 4 19 7 8 9 10 18 19 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 10 0 1 6 7 6 1 4 5 1 2 3 4 10 7 8 9 18 19 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 7 10 0 1 6 7 6 1 4 5 1 2 3 4 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 18 7 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 4 5 1 2 3 4 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 8 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 19 8 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 19 8 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 17 18 8 19 8 9 10 19 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 11 8 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 19 6 2 3 4 19 6 19 4 5 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 5 6 2 3 4 5 17 18 19 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 2 19 19 2 5 6 2 3 4 5 7 18 19 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 5 6 2 3 4 5 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 5 6 2 3 4 5 7 18 19 6 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 19 8 19 0 1 6 6 1 4 5 1 2 3 4 8 19 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 5 6 2 3 4 5 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 2 7 7 2 5 6 2 3 4 5 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 7 7 2 5 6 2 3 4 5 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 7 7 2 5 6 2 3 4 5 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 8 19 8 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 7 8 7 0 1 6 6 1 4 5 1 2 3 4 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 7 8 7 0 1 6 6 1 4 5 1 2 3 4 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 7 8 7 0 1 6 6 1 4 5 1 2 3 4 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 3 19 19 3 4 5 18 19 5 6 7 17 18 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 3 19 19 3 4 5 17 18 19 5 7 17 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 6 7 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 6 6 3 4 5 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 3 6 6 3 4 5 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 3 6 6 3 4 5 7 18 19 6 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 19 8 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 6 6 3 4 5 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 2 7 7 2 3 6 6 3 4 5 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 7 7 2 3 6 6 3 4 5 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 7 7 2 3 6 6 3 4 5 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 8 19 8 1 2 7 7 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 7 8 7 0 1 6 6 1 2 5 5 2 3 4 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 7 8 7 0 1 6 6 1 2 5 5 2 3 4 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 7 8 7 0 1 6 6 1 2 5 5 2 3 4 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 1 6 6 1 2 5 5 2 3 4 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 4 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 19 19 1 2 3 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 2 19 19 2 3 4 19 4 5 6 7 18 19 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 3 4 19 4 5 6 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 3 4 19 4 5 6 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 8 19 8 1 2 7 7 2 3 4 7 4 5 6 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 7 8 7 0 1 6 6 1 2 3 6 3 4 5 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 7 8 7 0 1 6 6 1 2 3 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 7 8 7 0 1 6 6 1 2 3 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 1 6 6 1 2 3 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 5 5 2 3 4 18 5 6 19 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 7 8 7 0 1 4 4 1 2 3 7 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 7 8 7 0 1 4 4 1 2 3 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 7 8 7 0 1 4 4 1 2 3 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 1 4 4 1 2 3 7 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 18 18 2 3 4 17 18 4 19 4 5 6 19 7 17 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 7 4 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 19 19 1 2 3 7 19 3 6 3 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 17 18 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 2 19 19 2 3 4 18 19 4 5 7 18 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 3 4 18 19 4 5 7 18 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 19 19 2 3 4 18 19 4 5 7 18 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 8 17 18 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 18 19 4 5 6 17 18 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 0 5 6 5 0 1 19 19 1 2 3 5 19 3 4 9 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 19 19 1 2 3 5 19 3 4 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 19 19 1 2 3 5 19 3 4 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 19 19 1 2 3 5 19 3 4 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 5 6 5 0 1 19 19 1 2 3 5 19 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 4 17 18 19 4 8 17 4 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 17 18 19 4 6 17 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 17 18 19 4 6 17 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 17 18 19 4 6 17 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 17 18 19 4 6 17 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 17 18 19 4 6 17 4 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 8 17 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 17 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 19 6 7 8 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 5 19 5 0 1 4 4 1 2 3 19 5 6 7 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 5 8 5 0 1 4 4 1 2 3 8 5 6 7 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 5 8 5 0 1 4 4 1 2 3 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 5 8 5 0 1 4 4 1 2 3 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 5 8 5 19 1 4 4 1 2 3 8 5 6 7 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 5 5 2 3 4 18 19 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 5 5 2 3 4 18 19 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 4 4 1 2 3 6 19 4 5 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 4 4 1 2 3 6 19 4 5 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 4 4 1 2 3 6 19 4 5 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 4 4 1 2 3 6 19 4 5 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 19 2 3 4 8 17 18 19 8 19 4 7 4 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 6 17 18 19 6 19 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 6 17 18 19 6 19 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 6 17 18 19 6 19 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 6 17 18 19 6 19 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 19 2 3 4 6 17 18 19 6 19 4 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 8 17 6 7 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 2 5 5 2 3 4 18 7 8 19 10 17 18 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 19 0 1 6 7 6 1 2 5 5 2 3 4 19 7 8 9 17 18 19 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 19 0 1 6 7 6 1 2 5 5 2 3 4 19 7 8 9 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 19 0 1 6 7 6 1 2 5 5 2 3 4 19 7 8 9 10 18 19 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 10 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 9 19 0 5 6 5 0 1 4 4 1 2 3 9 6 7 8 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 7 10 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 6 9 19 0 5 6 5 0 1 4 4 1 2 3 9 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 6 9 19 0 5 6 5 0 1 4 4 1 2 3 9 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 19 5 6 5 19 1 4 4 1 2 3 9 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 5 19 5 0 1 4 4 1 2 3 9 19 5 6 9 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 6 19 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 8 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 19 8 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 19 8 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 18 0 5 19 5 0 1 4 4 1 2 3 7 19 5 6 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 19 7 18 0 5 19 5 0 1 4 4 1 2 3 7 19 5 6 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 19 7 18 0 5 19 5 0 1 4 4 1 2 3 7 19 5 6 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 5 19 5 0 1 4 4 1 2 3 7 19 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 17 18 8 19 8 9 10 19 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 4 4 1 2 3 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 18 14 16 8 9 10 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 4 4 1 2 3 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 4 4 1 2 3 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 4 4 1 2 3 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 17 7 17 1 2 3 17 3 19 18 3 4 5 19 18 19 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 19 7 3 4 5 19 7 19 5 6 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 7 8 7 0 1 2 7 2 19 6 2 3 4 19 6 19 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 6 19 3 4 5 6 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 2 3 19 3 6 7 3 4 5 6 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 19 3 6 7 3 4 5 6 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 19 3 6 7 3 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 7 8 7 0 1 2 7 2 5 6 2 3 4 5 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 7 8 7 0 1 2 7 2 5 6 2 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 7 8 7 0 1 2 7 2 5 6 2 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 1 2 7 2 5 6 2 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 4 19 19 4 5 6 17 18 19 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 8 0 1 18 7 18 1 2 3 18 3 4 19 19 4 5 6 7 18 19 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 18 7 18 1 2 3 18 3 4 19 19 4 5 6 7 18 19 6 12 17 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 4 19 19 4 5 6 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 19 18 19 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 7 8 7 0 1 2 7 2 3 6 6 3 4 5 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 7 8 7 0 1 2 7 2 3 6 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 7 8 7 0 1 2 7 2 3 6 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 1 2 7 2 3 6 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 4 5 17 18 5 19 5 6 7 19 8 17 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 18 3 4 19 8 17 18 19 8 19 4 7 4 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 10 17 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 7 18 0 1 6 7 6 1 2 3 6 3 4 5 18 7 8 19 10 17 18 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 19 0 1 6 7 6 1 2 3 6 3 4 5 19 7 8 9 17 18 19 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 19 0 1 6 7 6 1 2 3 6 3 4 5 19 7 8 9 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 19 0 1 6 7 6 1 2 3 6 3 4 5 19 7 8 9 10 18 19 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 10 0 1 6 7 6 1 2 3 6 3 4 5 10 7 8 9 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 9 19 0 5 6 5 0 1 2 5 2 3 4 9 6 7 8 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 7 10 0 1 6 7 6 1 2 3 6 3 4 5 10 7 8 9 18 19 12 13 17 18 13 14\n" +; + +const char* data_dqrgl_block19 = + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 6 9 19 0 5 6 5 0 1 2 5 2 3 4 9 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 6 9 19 0 5 6 5 0 1 2 5 2 3 4 9 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 19 5 6 5 19 1 2 5 2 3 4 9 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 17 18 8 19 8 9 10 19 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 2 5 2 3 4 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 18 14 16 8 9 10 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 2 5 2 3 4 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 1 2 5 2 3 4 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 5 6 5 0 1 2 5 2 3 4 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 3 4 7 4 5 6 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 4 17 4 1 2 3 17 4 5 18 18 5 6 19 8 17 18 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 4 18 4 1 2 3 18 4 5 19 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 4 18 4 1 2 3 18 4 5 19 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 8 8 5 6 7 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 3 19 3 0 1 2 19 3 4 7 7 4 5 6 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 3 8 3 0 1 2 8 3 4 7 7 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 3 8 3 0 1 2 8 3 4 7 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 3 8 3 0 1 2 8 3 4 7 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 3 8 3 19 1 2 8 3 4 7 7 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 9 6 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 3 19 3 0 1 2 19 3 4 5 9 19 5 8 5 6 7 8 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 3 19 3 0 1 2 19 3 4 5 9 19 5 6 9 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 19 4 5 6 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 4 19 4 1 2 3 19 4 5 6 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 19 3 4 5 7 19 5 6 13 10 11 12 15 0 18 17\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 4 19 4 1 2 3 19 4 5 6 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 19 3 4 5 7 19 5 6 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 19 3 4 5 7 19 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 4 19 4 1 2 3 19 4 5 6 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 17 18 8 19 8 9 10 19 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 11 8 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 17 19 18 18 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 18 9 10 11 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 19 3 6 3 19 1 2 6 3 4 5 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 18 14 16 8 9 10 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 18 10 11 12 14 18 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 3 6 3 19 1 2 6 3 4 5 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 3 6 3 19 1 2 6 3 4 5 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 3 6 3 0 1 2 6 3 4 5 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 5 8 5 19 3 4 8 5 6 7 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 17 18 3 19 3 4 7 19 7 4 5 6 8 17 19 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 19 8 19 0 1 2 8 19 2 7 2 3 6 7 6 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 17 18 3 19 3 4 5 19 19 5 6 7 8 17 19 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 19 8 19 0 1 2 8 19 2 7 2 3 4 7 7 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 17 18 3 19 3 4 5 19 8 17 19 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 19 3 4 5 19 6 17 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 19 3 4 5 19 6 17 19 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 19 3 4 5 19 6 17 19 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 3 17 18 3 19 3 4 5 19 6 17 19 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 18 19 3 6 3 4 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 18 19 3 6 3 4 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 7 8 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 7 8 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 2 6 19 2 5 2 3 4 5 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 2 6 19 2 5 2 3 4 5 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 2 6 19 2 5 2 3 4 5 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 19 6 19 0 1 2 6 19 2 5 2 3 4 5 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 3 17 18 3 4 8 17 4 19 4 5 6 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 18 19 3 4 8 18 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 18 19 3 4 8 18 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 18 19 3 4 8 18 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 18 19 3 4 8 18 4 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 18 19 3 4 6 18 4 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 10 17 6 19 6 7 8 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 6 9 6 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 8 18 6 7 17 10 11 12 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 12 7 10 11 7 8 9 10 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 8 9 19 19 9 10 11 12 17 19 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 18 8 9 10 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 18 8 9 10 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 10 7 8 9 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 13 8 9 10 13 10 11 12 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 18 0 19 4 19 0 1 2 4 19 2 3 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 18 5 18 1 2 3 5 18 3 4 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 8 18 19 3 8 3 4 7 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 19 18 19 1 2 3 8 18 19 3 8 3 4 7 7 4 5 6 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 8 17 18 19 8 19 2 7 2 3 6 7 6 3 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 18 17 18 1 2 19 8 17 18 19 8 19 2 7 2 3 4 7 7 4 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 6 17 18 19 6 19 2 5 2 3 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 6 17 18 19 6 19 2 5 2 3 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 6 17 18 19 6 19 2 5 2 3 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 6 17 18 19 6 19 2 5 2 3 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 18 17 18 1 2 19 6 17 18 19 6 19 2 5 2 3 4 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 11 6 9 10 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 6 9 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 9 6 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 12 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 7 10 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 19 4 17 18 19 4 19 2 3 10 11 14 15 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 17 4 5 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 17 4 5 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 4 5 8 5 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 9 6 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 12 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 6 17 4 5 10 11 14 15 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 11 6 19 10 6 7 8 19 10 19 8 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 11 6 9 10 6 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 9 6 7 8 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 9 6 7 8 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 9 6 7 8 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 12 7 8 19 19 8 9 10 12 19 10 11\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 7 8 11 11 8 9 10 13 17 11 12\n" + "16 4 11 16 17 14 15 16 7 12 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 7 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 7 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 7 17 11 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 7 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 7 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 7 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 17 6 9 6 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 17 6 9 6 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 17 6 9 6 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 10 17 6 7 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 8 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 17 8 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 6 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 6 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 6 7 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 6 7 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 8 17 6 7 10 11 14 15 14 11 12 13\n" + "16 4 11 16 13 14 15 16 7 8 13 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 13 8 19 12 8 9 10 19 12 19 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 11 12 8 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 9 10 19 14 19 10 11 12 14 19 12 13\n" + "16 4 11 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 9 10 13 17 13 10 11 12 17 13 14 15\n" + "16 4 11 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 9 10 11 17 17 11 14 15 11 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 11 12 8 9 10 11 12 13 14 15\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 10 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 17 8 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 9 10 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 17 4 0 1 18 17 18 1 2 3 4 17 18 3 10 19 14 15 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 19 6 7 8 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 4 9 18 0 3 4 3 0 1 2 9 4 5 19 19 5 6 7 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 19 6 7 8 10 17 18 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 9 9 6 7 8 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 9 9 6 7 8 10 18 19 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 10 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 9 19 0 3 4 3 0 1 2 9 4 5 8 8 5 6 7 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 5 10 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 4 9 19 0 3 4 3 0 1 2 9 4 5 8 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 4 9 19 0 3 4 3 0 1 2 9 4 5 8 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 4 9 18 19 3 4 3 19 1 2 9 4 5 8 8 5 6 7 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 7 18 7 8 19 10 17 18 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 19 7 8 9 17 18 19 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 19 7 8 9 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 19 7 8 9 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 5 10 0 1 4 5 4 1 2 3 10 5 6 7 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 4 9 19 0 3 4 3 0 1 2 9 4 5 6 9 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 4 9 19 0 3 4 3 0 1 2 9 4 5 6 9 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 4 9 18 19 3 4 3 19 1 2 9 4 5 6 9 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 10 18 19 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 10 17 18 19 10 19 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 8 17 18 19 8 19 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 8 17 18 19 8 19 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 8 17 18 19 8 19 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 5 18 0 1 4 5 4 1 2 3 18 5 6 19 8 17 18 19 8 19 6 7 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 17 18 19 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 17 18 19 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 17 18 19 7 9 17 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 17 19 18 18 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 4 7 18 19 3 4 3 19 1 2 7 4 5 6 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 4 7 18 19 3 4 3 19 1 2 7 4 5 6 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 17 11 12 13 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 4 7 18 19 3 4 3 19 1 2 7 4 5 6 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 4 7 19 0 3 4 3 0 1 2 7 4 5 6 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 19 5 6 5 19 3 4 9 6 7 8 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 8 9 5 6 7 8 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 3 19 3 0 1 2 9 19 3 4 9 4 7 8 4 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 9 9 6 7 8 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 3 19 3 0 1 2 9 19 3 4 9 4 5 8 8 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 18 5 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 7 19 3 4 7 4 5 6 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 4 19 4 1 2 3 8 19 4 5 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 7 19 3 4 7 4 5 6 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 4 19 4 1 2 3 8 19 4 5 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 4 19 4 1 2 3 8 19 4 5 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 7 19 3 4 7 4 5 6 14 11 12 13 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 3 19 3 0 1 2 7 19 3 4 7 4 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 4 19 4 1 2 3 8 19 4 5 8 5 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 9 6 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 12 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 12 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 4 19 4 1 2 3 18 19 4 5 6 17 18 5 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7 17 10 11 12 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 12 7 10 11 7 8 9 10 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 13 8 9 10 13 10 11 12 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 3 19 3 0 1 2 5 19 3 4 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 4 18 4 1 2 3 6 18 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 19 6 7 10 19 10 7 8 9 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 11 18 5 10 5 6 9 10 9 6 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 11 18 5 10 5 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 11 18 5 8 5 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 10 18 6 19 6 7 8 19 10 19 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 19 6 7 8 19 9 17 19 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 19 6 7 8 19 9 17 19 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 17 18 6 19 6 7 8 19 9 17 19 8 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 8 5 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 9 6 7 8 9 17 18 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 9 6 7 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 9 6 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 9 6 7 8 9 10 17 18 9 11 12 13 14\n" +; + +const char* data_dqrgl_block20 = + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 9 6 7 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 10 19 6 9 6 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 8 5 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 10 19 6 9 6 7 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 10 19 6 9 6 7 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 8 5 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 8 5 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 10 19 6 9 6 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 11 18 5 6 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 18 7 8 11 11 8 9 10 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 18 7 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 10 19 6 7 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 6 9 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 9 18 5 6 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 10 19 6 7 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 7 12 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 7 10 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 8 11 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 17 18 7 10 7 8 9 10 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 11 18 7 10 7 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 17 18 7 8 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 17 18 7 8 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 17 18 7 8 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 9 18 7 8 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 19 18 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 9 18 7 8 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 9 18 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 9 18 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 9 18 7 8 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 12 17 18 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 10 17 18 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 10 17 18 7 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 8 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 17 8 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 18 19 6 7 8 17 18 7 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 18 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 13 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 8 11 12 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 3 4 3 0 1 2 7 18 5 6 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 4 5 4 1 2 3 8 18 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 8 19 18 8 9 10 19 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 12 7 19 11 7 8 9 19 11 19 9 10 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 11 12 8 9 10 11 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 7 10 11 7 8 9 10 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 7 12 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 12 7 10 11 7 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 12 7 10 11 7 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 8 9 18 18 9 10 19 12 17 18 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 8 9 19 19 9 10 11 17 18 19 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 8 9 19 19 9 10 11 12 18 19 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 12 12 9 10 11 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 7 8 11 11 8 9 10 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 7 12 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 12 7 8 11 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 12 7 8 11 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 8 9 10 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 10 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 7 8 9 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 10 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 7 8 9 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 10 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 10 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 10 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 18 7 8 9 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 8 9 10 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 10 7 8 9 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 19 5 6 5 19 3 4 12 9 10 11 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 19 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 0 3 4 3 0 1 2 13 8 9 19 19 9 10 11 13 19 11 12 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 19 19 10 11 12 17 18 19 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 19 19 10 11 12 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 15 18 16 8 13 17 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 8 9 12 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 13 8 9 12 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 11 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 9 10 11 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 18 19 3 4 3 19 1 2 13 8 9 10 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 11 17 18 11 19 11 12 13 19 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 9 10 11 17 19 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 19 9 10 11 17 19 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 9 10 19 17 18 19 14 14 19 10 13 10 11 12 13\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 5 6 5 19 3 4 13 10 11 12 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 17 8 18 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 18 8 19 8 9 12 19 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 13 8 9 12 13 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 18 7 12 7 8 11 12 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 18 8 19 8 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 18 7 12 7 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 18 7 10 7 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 18 8 19 8 9 10 19 11 17 19 10 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 11 8 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 11 8 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 18 7 10 7 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 19 8 11 8 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 18 7 8 13 8 11 12 8 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 13 18 7 8 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 11 18 7 8 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 19 8 9 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 17 18 9 12 9 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 17 18 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 10 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 18 19 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 3 4 3 0 1 2 9 18 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 19 8 9 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 10 19 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 19 18 10 11 12 19 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 18 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 19 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 12 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 17 9 10 11 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 17 9 14 15 9 10 13 14 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 4 5 19 0 3 4 3 0 1 2 17 9 14 15 9 10 11 14 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 19 18 10 11 12 19 18 19 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 4 5 4 1 2 3 17 10 11 18 18 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 5 6 15 19 18 17 15 0 5 19 5 0 3 4 0 1 2 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 7 8 7 19 5 6 15 19 18 17 15 0 5 19 5 0 1 4 4 1 2 3\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 17 6 2 3 18 17 18 3 4 19 6 17 18 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 7 8 0 1 2 7 7 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 19 18 2 3 6 19 6 3 4 5 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 19 2 7 8 2 3 6 7 6 3 4 5 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 18 19 10 11 12 17 18 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 19 18 2 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 19 2 7 8 2 3 4 7 7 4 5 6 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 9 10 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 8 9 19 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 5 18 2 3 4 5 18 5 6 19 8 17 18 19 8 19 6 7\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 18 2 5 19 2 3 4 5 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 9 19 7 8 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 7 4 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 18 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 8 17 18 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 18 2 19 6 2 3 4 19 6 19 4 5 8 18 6 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 18 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 19 2 5 6 2 3 4 5 18 19 6 9 6 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 4 5 1 2 3 4 9 19 5 8 5 6 7 8 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 4 5 1 2 3 4 9 19 5 6 9 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 5 6 2 3 4 5 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 17 18 8 19 8 9 10 19 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 11 8 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 11 18 7 10 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 9 18 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 9 18 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 9 12 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 17 18 16 10 13 14 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 12 17 18 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 4 5 1 2 3 4 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 19 7 3 4 5 19 7 19 5 6 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 6 19 3 4 5 6 8 17 18 19 8 19 6 7\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 18 2 3 19 19 3 6 7 3 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 2 7 7 2 5 6 2 3 4 5 9 19 7 8 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 1 8 8 1 2 7 7 2 5 6 2 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 4 19 19 4 5 6 8 17 18 19 8 19 6 7\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 18 2 3 19 19 3 4 7 7 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 2 7 7 2 3 6 6 3 4 5 9 19 7 8 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 1 8 8 1 2 7 7 2 3 6 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 4 5 18 5 6 19 8 17 18 19 8 19 6 7\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 18 2 3 19 19 3 4 5 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 9 10 0 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 18 19 1 8 8 1 2 7 7 2 3 4 7 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 8 9 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 18 2 3 19 19 3 4 5 8 18 19 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 18 18 3 4 19 8 17 18 19 8 19 4 7 4 5 6 7\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 19 6 17 18 19 6 19 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 19 6 17 18 19 6 19 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 17 2 3 18 18 3 4 19 6 17 18 19 6 19 4 5 12 13 14 15\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 2 5 5 2 3 4 9 19 5 6 9 6 7 8 15 0 18 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 13 0 18 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 18 19 1 6 6 1 2 5 5 2 3 4 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 9 12 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 18 19 1 6 6 1 2 5 5 2 3 4 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 10 13 14 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 12 17 18 16 10 11 12 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 17 2 3 4 8 17 4 18 4 5 19 18 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 9 4 5 8 9 8 5 6 7 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 2 3 9 19 3 8 3 4 7 8 7 4 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 2 3 9 19 3 8 3 4 5 8 8 5 6 7 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 2 3 9 19 3 6 3 4 5 6 9 6 7 8 15 0 18 17\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 7 4 5 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 19 2 3 4 18 19 4 7 4 5 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 2 3 7 19 3 6 3 4 5 6 13 0 18 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 19 1 2 3 9 19 3 4 9 4 7 8 4 5 6 7 15 0 18 17\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 19 1 2 3 7 19 3 4 7 4 5 6 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 19 6 7 10 19 10 7 8 9 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 11 6 7 10 11 10 7 8 9 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 11 18 5 10 5 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 9 6 7 8 9 18 9 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 11 18 5 8 5 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 10 18 6 19 6 7 8 19 10 19 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 19 6 7 8 19 9 17 19 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 19 6 7 8 19 9 17 19 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 17 18 6 19 6 7 8 19 9 17 19 8 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 8 5 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 9 6 7 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 9 6 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 9 6 7 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 9 6 7 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 10 19 6 9 6 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 8 5 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 10 19 6 9 6 7 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 10 19 6 9 6 7 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 8 5 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 10 19 6 9 6 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 8 5 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 18 7 10 11 7 8 9 10 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 18 7 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 10 19 6 7 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 6 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 10 19 6 7 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 9 18 5 6 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 7 12 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 7 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 8 11 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 7 10 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 11 18 7 10 7 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 9 18 7 8 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 19 18 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 9 18 7 8 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 9 18 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 9 18 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 9 18 7 8 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 12 17 18 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 8 13 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 17 8 11 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 9 10 11 12 12 13 14 15\n" + "16 4 11 16 9 10 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 10 13 14 15 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 8 11 12 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 5 6 0 1 2 5 5 2 3 4 8 18 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 15 0 19 19 0 5 6 0 1 2 5 5 2 3 4 8 19 6 7 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 10 11 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 4 5 19 0 1 4 4 1 2 3 7 18 5 6 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 0 1 4 4 1 2 3 12 7 19 11 7 8 9 19 11 19 9 10 15 0 18 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 7 12 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 12 7 10 11 7 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 19 1 4 4 1 2 3 12 7 10 11 7 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 6 7 12 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 12 7 10 11 7 8 9 10 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 7 12 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 18 19 1 4 4 1 2 3 12 7 8 11 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 6 7 12 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 17 0 19 18 14 15 0 17\n" + "16 4 11 16 12 17 18 16 10 11 12 16 6 7 10 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 10 7 8 9 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 10 7 8 9 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 19 19 10 11 12 17 18 19 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 19 19 10 11 12 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 11 17 18 11 19 11 12 13 19 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 19 9 10 11 17 19 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 19 9 10 11 17 19 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 9 10 19 17 18 19 14 14 19 10 13 10 11 12 13\n" + "16 4 11 16 12 17 18 16 8 11 12 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 8 9 10 12 13 14 17 17 0 19 18 17 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 17 8 18 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 18 8 19 8 9 12 19 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 13 8 9 12 13 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 18 7 12 7 8 11 12 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 18 8 19 8 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 18 7 12 7 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 18 7 10 7 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 18 8 19 8 9 10 19 11 17 19 10 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 7 10 7 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 19 8 11 8 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 7 10 7 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 18 7 8 13 8 11 12 8 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 13 18 7 8 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 7 8 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 11 18 7 8 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 19 8 9 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 17 18 9 12 9 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 10 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 9 18 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 19 8 9 17 10 11 18 18 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 10 19 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 10 11 17 16 18 9 10 16 6 7 18 16 17 19 6 6 19 4 5 19 0 1 4 4 1 2 3 9 18 7 8 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 19 18 10 11 12 19 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 18 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 19 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 12 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 10 17 18 16 8 9 10 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 10 11 12 17 17 0 19 18 17 12 15 0 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 17 9 14 15 9 10 13 14 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 4 5 19 0 1 4 4 1 2 3 17 9 14 15 9 10 11 14 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 19 18 10 11 12 19 18 19 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 5 6 0 1 2 5 5 2 3 4 17 10 11 18 18 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 17 17 4 19 18 4 5 6 19 18 19 6 7 8 17 18 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 9 9 4 19 8 4 5 6 19 8 19 6 7 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 8 8 3 19 7 3 4 5 19 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 7 8 4 5 6 7 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 19 19 3 6 7 3 4 5 6 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 9 9 4 7 8 4 5 6 7 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 9 9 4 7 8 4 5 6 7 10 18 19 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 10 0 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 2 9 19 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 3 10 0 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 19 1 2 9 2 3 8 8 3 6 7 3 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 17 0 19 18 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 8 8 3 4 19 19 4 5 6 8 19 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 18 18 4 5 19 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 18 18 4 5 19 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 8 8 5 6 7 18 19 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 0 1 2 9 2 3 19 19 3 4 7 7 4 5 6 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 9 9 4 5 8 8 5 6 7 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 9 9 4 5 8 8 5 6 7 10 18 19 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 10 0 1 2 3 10 3 4 9 9 4 5 8 8 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 2 9 19 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 3 10 0 1 2 3 10 3 4 9 9 4 5 8 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 19 1 2 9 2 3 8 8 3 4 7 7 4 5 6 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 19 6 7 8 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 10 0 1 2 3 10 3 4 9 9 4 5 6 9 6 7 8 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 2 9 19 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 3 10 0 1 2 3 10 3 4 9 9 4 5 6 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 19 1 2 9 2 3 8 8 3 4 5 8 5 6 7 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 7 7 4 5 6 18 7 8 19 10 17 18 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 19 7 8 9 17 18 19 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 19 7 8 9 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 19 7 8 9 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 3 10 0 1 2 3 10 3 4 7 7 4 5 6 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 2 9 19 0 1 2 9 2 3 6 6 3 4 5 9 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 6 6 3 4 5 9 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 2 9 18 19 1 2 9 2 3 6 6 3 4 5 9 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 10 11 12 16 18 19 10 10 19 2 9 19 0 1 2 9 2 3 6 6 3 4 5 9 6 7 8 17 0 19 18 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 9 6 7 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 7 10 17 18 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 19 19 3 4 5 7 19 5 6 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 19 19 4 5 6 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 19 19 4 5 6 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 19 19 4 5 6 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 19 19 3 4 5 7 19 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 19 19 4 5 6 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 2 7 18 0 1 2 7 2 3 19 19 3 4 5 7 19 5 6 13 0 18 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 10 17 8 9 11 12 13 14\n" +; + +const char* data_dqrgl_block21 = + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7 17 10 11 12 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 11 18 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 8 9 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 8 9 10 17 18 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 10 19 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 10 19 8 9 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 10 19 8 9 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 10 19 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 9 18 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 2 7 18 19 1 2 7 2 3 6 6 3 4 5 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 9 12 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 4 9 18 19 3 4 9 4 5 8 8 5 6 7 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 19 9 5 6 7 19 9 19 7 8 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 8 19 5 6 7 8 10 17 18 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 8 9 5 6 7 8 17 18 19 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 8 9 5 6 7 8 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 8 9 5 6 7 8 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 3 10 0 1 2 3 10 3 4 5 10 5 8 9 5 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 9 9 6 7 8 10 18 19 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 9 9 6 7 8 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 3 10 0 1 2 3 10 3 4 5 10 5 6 9 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 10 18 19 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 19 8 17 18 19 8 19 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 19 8 17 18 19 8 19 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 19 8 17 18 19 8 19 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 18 5 6 19 8 17 18 19 8 19 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 17 18 19 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 17 18 19 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 17 18 19 7 9 17 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 2 7 18 19 1 2 7 2 3 4 7 4 5 6 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 17 18 16 12 13 14 16 8 9 12 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 12 9 10 11 17 0 19 18 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 11 18 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 2 7 19 0 1 2 7 2 3 4 7 4 5 6 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 4 9 18 19 3 4 9 4 5 6 9 6 7 8 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 13 14 15 16 7 10 13 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 10 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 19 6 17 18 19 6 19 4 5 9 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 6 11 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 6 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 9 6 7 8 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 17 18 19 5 7 17 5 6 9 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 17 13 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 7 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 7 17 11 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 7 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 7 10 11 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 7 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 10 17 6 7 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 8 13 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 17 8 11 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 17 8 9 16 18 6 17 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 8 17 6 7 9 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 13 8 19 12 8 9 10 19 12 19 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 11 12 8 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 3 18 0 1 2 3 18 3 4 5 6 17 18 5 9 10 19 14 19 10 11 12 14 19 12 13\n" + "16 4 11 16 9 17 15 16 7 8 9 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 9 10 13 17 13 10 11 12 17 13 14 15\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 18 7 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 11 18 17 16 19 10 11 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 10 19 6 7 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 9 18 5 6 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 10 11 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 10 19 6 7 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 9 18 5 6 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 7 10 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 19 8 11 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 11 18 7 10 7 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 9 18 7 8 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 19 18 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 9 18 7 8 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 9 18 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 9 18 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 12 17 18 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 10 17 18 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 10 17 18 7 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 8 13 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 17 8 11 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 12 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 18 19 6 7 8 17 18 7 9 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 6 0 1 2 3 6 3 4 5 8 18 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 19 8 9 16 15 0 19 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 10 11 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 5 19 0 1 2 5 2 3 4 7 18 5 6 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 10 7 8 9 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 19 19 10 11 12 17 18 19 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 19 19 10 11 12 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 11 17 18 11 19 11 12 13 19 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 19 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 19 9 10 11 17 19 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 9 10 19 17 18 19 14 14 19 10 13 10 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 17 8 18 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 18 8 19 8 9 12 19 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 13 8 9 12 13 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 18 7 12 7 8 11 12 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 18 8 19 8 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 18 7 12 7 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 18 7 10 7 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 18 8 19 8 9 10 19 11 17 19 10 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 7 10 7 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 19 8 11 8 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 7 10 7 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 18 7 8 13 8 11 12 8 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 13 18 7 8 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 7 8 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 11 18 7 8 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 19 8 9 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 17 18 9 12 9 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 10 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 18 9 10 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 9 18 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 10 19 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 10 11 17 16 18 9 10 16 6 7 18 16 17 19 6 6 19 2 5 19 0 1 2 5 2 3 4 9 18 7 8 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 19 18 10 11 12 19 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 18 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 19 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 11 12 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 17 9 14 15 9 10 13 14 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 3 6 0 1 2 3 6 3 4 5 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 2 5 19 0 1 2 5 2 3 4 17 9 14 15 9 10 11 14 14 11 12 13 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 19 5 6 9 6 7 8 15 19 18 17 15 0 5 19 5 0 3 4 0 1 2 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 6 9 18 19 5 6 9 6 7 8 15 19 18 17 15 0 5 19 5 0 1 4 4 1 2 3\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 19 18 19 3 6 7 3 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 9 2 3 8 9 8 3 6 7 3 4 5 6 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 8 1 2 7 8 7 2 5 6 2 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 7 2 3 18 7 18 3 4 19 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 19 18 19 3 4 7 7 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 9 2 3 8 9 8 3 4 7 7 4 5 6 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 8 1 2 7 8 7 2 3 6 6 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 19 18 19 3 4 5 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 9 2 3 8 9 8 3 4 5 8 5 6 7 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 8 1 2 7 8 7 2 3 4 7 4 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 8 1 2 5 8 5 2 3 4 8 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 19 18 19 3 4 5 18 19 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 18 8 0 1 2 18 8 18 2 7 2 3 19 7 19 3 4 5 7 19 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 7 2 3 19 7 19 3 4 5 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 7 2 3 19 7 19 3 4 5 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 19 18 19 3 4 5 6 18 19 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 19 18 19 3 4 5 6 18 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 19 18 19 3 4 5 6 18 19 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 19 18 19 3 4 5 6 18 19 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 17 6 0 1 2 17 6 17 2 18 2 3 19 18 19 3 4 5 6 18 19 5 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 7 2 3 6 7 6 3 4 5 18 7 8 9 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 6 1 2 5 6 5 2 3 4 9 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 19 2 3 6 19 6 3 4 5 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 19 2 3 6 19 6 3 4 5 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 7 2 3 6 7 6 3 4 5 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 7 2 3 6 7 6 3 4 5 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 7 2 3 6 7 6 3 4 5 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 7 2 3 6 7 6 3 4 5 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 7 2 3 6 7 6 3 4 5 8 17 18 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 8 0 1 2 19 8 19 2 7 2 3 6 7 6 3 4 5 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 19 8 0 1 2 19 8 19 2 7 2 3 6 7 6 3 4 5 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 19 8 0 1 2 19 8 19 2 7 2 3 6 7 6 3 4 5 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 6 7 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 6 7 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 6 7 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 6 1 2 5 6 5 2 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 6 7 6 3 4 5 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 6 1 2 5 6 5 2 3 4 13 0 18 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 8 1 2 3 8 8 3 6 7 3 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 18 2 3 4 18 18 4 5 19 19 5 6 7 8 18 19 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 8 1 2 3 8 8 3 4 7 7 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 19 2 3 4 19 19 4 5 6 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 19 2 3 4 19 19 4 5 6 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 8 0 1 2 19 8 19 2 7 2 3 4 7 7 4 5 6 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 18 0 19 8 0 1 2 19 8 19 2 7 2 3 4 7 7 4 5 6 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 19 8 0 1 2 19 8 19 2 7 2 3 4 7 7 4 5 6 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 4 7 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 4 7 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 4 7 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 6 1 2 3 6 6 3 4 5 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 7 2 3 4 7 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 6 1 2 3 6 6 3 4 5 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 18 5 6 9 9 6 7 8 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 4 1 2 3 4 9 4 5 8 8 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 18 5 6 7 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 18 5 6 7 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 18 5 6 7 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 18 5 6 7 8 17 18 7 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 5 2 3 4 5 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 5 2 3 4 5 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 5 2 3 4 5 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 4 1 2 3 4 7 4 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 5 2 3 4 5 8 5 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 4 1 2 3 4 7 4 5 6 13 0 18 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 19 2 3 4 19 8 19 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 19 2 3 4 19 8 19 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 9 6 7 8 12 13 14 15\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 5 2 3 4 5 6 17 18 5 9 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 10 18 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 6 7 9 17 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 8 17 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 10 17 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 5 2 3 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 10 11 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 4 1 2 3 4 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 17 8 0 1 2 17 8 17 2 3 8 3 18 7 3 4 19 18 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 8 9 3 4 7 8 7 4 5 6 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 2 9 2 7 8 2 3 6 7 6 3 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 8 9 3 4 5 8 8 5 6 7 10 17 18 9\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 2 9 2 7 8 2 3 4 7 7 4 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 2 9 2 5 8 2 3 4 5 8 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 3 8 3 19 7 3 4 5 19 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 18 8 0 1 2 18 8 18 2 3 8 3 19 7 3 4 5 19 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 6 7 3 4 5 6 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 6 7 3 4 5 6 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 6 7 3 4 5 6 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 6 7 3 4 5 6 8 17 18 7 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 6 7 3 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 6 7 3 4 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 6 7 3 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 2 7 2 5 6 2 3 4 5 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 6 7 3 4 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 2 7 2 5 6 2 3 4 5 13 0 18 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 2 9 2 3 8 8 3 6 7 3 4 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 2 9 2 3 8 8 3 4 7 7 4 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 18 0 1 19 9 19 1 2 9 2 3 8 8 3 4 5 8 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 9 12 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 7 7 4 5 6 8 17 18 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 7 7 4 5 6 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 7 7 4 5 6 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 7 7 4 5 6 8 17 18 7 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 4 7 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 4 7 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 4 7 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 2 7 2 3 6 6 3 4 5 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 19 8 0 1 2 19 8 19 2 3 8 3 4 7 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 12 13 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 19 7 18 0 1 19 7 19 1 2 7 2 3 6 6 3 4 5 13 0 18 17 13 14 15 0\n" + "16 4 11 16 11 14 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 7 10 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 18 3 4 5 6 17 18 5 9 10 11 14 14 11 12 13\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 18 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 10 18 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 11 17 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 18 6 0 1 2 18 6 18 2 3 6 3 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 10 11 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 19 5 18 0 1 19 5 19 1 2 5 2 3 4 11 0 18 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 4 5 10 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 4 5 10 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 4 5 10 10 5 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 4 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 4 5 8 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 4 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 4 5 8 8 5 6 7 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 17 4 9 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 9 4 5 8 8 5 6 7 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 4 7 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 4 5 6 9 10 11 14 14 11 12 13\n" + "16 4 11 16 9 14 15 16 5 8 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 8 5 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 5 8 9 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 8 5 6 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 11 12 15 16 5 6 11 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 6 9 10 6 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 13 6 7 12 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 13 6 7 12 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 13 6 7 12 12 7 8 9 12 9 10 11\n" + "16 4 11 16 11 12 15 16 5 6 11 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 11 6 7 10 10 7 8 9 12 13 14 15\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 8 13 14 13 8 11 12 8 9 10 11\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 8 13 14 13 8 9 12 12 9 10 11\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 0 17 17 0 19 18 0 1 2 19 18 19 2 3 4 17 18 3 7 8 13 14 13 8 9 10 13 10 11 12\n" + "16 4 11 16 13 14 15 16 9 17 13 16 18 8 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 8 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 6 11 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 11 17 15 16 9 10 11 16 18 6 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 9 6 7 8 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 11 17 5 10 5 6 9 10 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 11 17 5 10 5 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 9 17 5 8 5 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 9 17 5 8 5 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 9 17 5 8 5 6 7 8 12 13 14 15\n" + "16 4 11 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 17 18 4 5 7 17 5 6 9 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 10 17 6 7 10 7 8 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 8 13 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 17 8 11 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 18 6 17 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 8 17 6 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 13 8 19 12 8 9 10 19 12 19 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 11 12 8 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 0 17 17 0 18 4 0 1 2 18 4 18 2 3 6 17 4 5 9 10 19 14 19 10 11 12 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 11 6 19 10 6 7 8 19 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 11 6 9 10 6 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 11 6 7 10 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 9 6 7 8 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 11 17 15 16 9 10 11 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 6 7 8 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 9 6 7 8 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 9 6 7 8 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 7 8 19 19 8 11 12 8 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 13 13 8 11 12 8 9 10 11 17 18 13 14\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 7 8 19 19 8 9 12 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 13 13 8 9 12 12 9 10 11 17 18 13 14\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 7 8 19 19 8 9 10 19 10 11 12 13 17 19 12\n" + "16 4 11 16 11 12 15 16 7 17 11 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 7 8 19 19 8 9 10 11 17 19 10 12 13 14 15\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 11 11 8 9 10 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 12 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 11 11 8 9 10 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 7 12 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 12 7 8 11 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 7 8 9 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 7 8 9 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 17 18 9 12 9 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 17 18 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 10 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 18 7 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 11 17 15 16 7 10 11 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 7 8 9 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 17 18 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 7 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 11 6 7 19 11 19 7 8 9 11 19 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 19 6 7 10 19 10 7 8 9 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 11 6 7 10 11 10 7 8 9 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 12 18 6 11 6 7 10 11 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 19 6 7 8 19 19 8 9 10 12 19 10 11\n" +; + +const char* data_dqrgl_block22 = + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 12 18 6 11 6 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 19 6 7 8 19 12 19 8 11 8 9 10 11\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 17 6 19 6 7 8 19 10 19 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 10 17 6 19 6 7 8 19 10 19 8 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 18 6 9 6 7 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 9 6 7 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 18 6 9 6 7 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 18 6 9 6 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 18 6 9 6 7 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 12 17 6 7 12 7 19 11 7 8 9 19 11 19 9 10\n" + "16 4 11 16 11 17 15 16 18 10 11 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 10 18 6 7 10 7 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 7 13 17 7 12 7 8 11 12 11 8 9 10\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 7 13 17 7 12 7 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 7 11 17 7 10 7 8 9 10 12 13 14 15\n" + "16 4 11 16 9 10 15 16 18 17 9 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 7 9 17 7 8 10 13 14 15 10 11 12 13\n" + "16 4 11 16 9 10 15 16 18 17 9 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 18 6 7 9 17 7 8 10 11 14 15 14 11 12 13\n" + "16 4 11 16 9 14 15 16 17 8 9 16 5 6 17 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 8 17 6 7 9 10 19 14 19 10 11 12 14 19 12 13\n" + "16 4 11 16 9 17 15 16 18 8 9 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 9 10 13 17 13 10 11 12 17 13 14 15\n" + "16 4 11 16 9 17 15 16 18 8 9 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 9 10 11 17 17 11 14 15 11 12 13 14\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 10 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 8 18 6 7 17 8 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 8 11 12 8 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 19 19 9 12 13 9 10 11 12 17 19 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 19 19 9 10 13 13 10 11 12 17 19 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 19 19 9 10 11 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 12 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 19 19 9 10 11 17 19 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 8 9 12 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 8 9 10 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 8 9 10 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 10 19 17 19 10 13 14 10 11 12 13 17 19 14 15\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 9 14 15 14 9 12 13 9 10 11 12 15 0 18 17\n" + "16 4 11 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 10 19 17 19 10 11 14 14 11 12 13 17 19 14 15\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 9 14 15 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 4 11 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 9 10 19 17 19 10 11 12 19 12 13 14 17 19 14 15\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 8 9 14 15 14 9 10 11 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 13 14 8 9 19 13 19 9 10 11 13 19 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 19 14 8 9 12 19 12 9 10 11 14 19 12 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 8 13 18 8 9 12 13 12 9 10 11 18 13 14 15\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 19 14 8 9 10 19 19 10 11 12 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 19 14 8 9 10 19 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 18 4 0 1 2 18 4 18 2 3 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 8 9 18 18 9 14 15 9 10 13 14 13 10 11 12\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 19 4 0 1 2 19 4 19 2 3 17 8 9 18 18 9 14 15 9 10 11 14 14 11 12 13\n" + "16 4 11 16 8 9 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 0 18 17 9 10 15 0 15 10 13 14 10 11 12 13\n" + "16 4 11 16 8 9 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 0 18 17 9 10 15 0 15 10 11 14 14 11 12 13\n" + "16 4 11 16 8 9 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 19 3 18 0 1 19 3 19 1 2 9 0 18 17 9 10 15 0 15 10 11 12 15 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 10 19 10 5 8 9 5 6 7 8 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 11 4 5 10 11 10 5 8 9 5 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 10 19 10 5 6 9 9 6 7 8 11 17 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 11 4 5 10 11 10 5 6 9 9 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 11 4 5 10 11 10 5 6 7 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 8 19 8 5 6 7 9 17 19 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 8 19 8 5 6 7 9 17 19 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 18 17 9 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 8 19 8 5 6 7 9 17 19 8 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 9 4 5 8 9 8 5 6 7 11 18 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 9 4 5 8 9 8 5 6 7 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 9 4 5 8 9 8 5 6 7 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 9 4 5 8 9 8 5 6 7 10 17 18 9 12 13 14 15\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 3 4 0 1 2 3 10 19 4 9 4 5 8 9 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 3 4 0 1 2 3 10 19 4 9 4 5 8 9 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 10 18 16 15 0 19 19 0 3 4 0 1 2 3 10 19 4 9 4 5 6 9 9 6 7 8 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 19 0 3 4 0 1 2 3 10 19 4 9 4 5 6 9 9 6 7 8 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 13 8 11 12 8 9 10 11\n" + "16 4 11 16 13 14 15 16 7 8 13 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 7 8 11 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 7 8 9 16 18 17 7 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 19 4 5 6 19 7 17 19 6 9 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 9 18 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 9 18 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 8 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 15 16 17 8 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 11 8 9 10 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 7 4 5 6 7 8 17 18 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 10 18 8 9 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 8 18 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 10 15 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 7 4 5 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 10 11 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 2 3 19 0 1 2 7 18 3 6 3 4 5 6 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 5 8 5 6 7 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 3 4 0 1 2 3 8 18 4 5 8 5 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 9 6 7 8 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 0 18 18 0 3 4 0 1 2 3 17 18 4 5 11 17 5 10 5 6 19 10 19 6 7 8 10 19 8 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 11 18 5 10 5 6 9 10 9 6 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 19 18 11 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 11 18 5 10 5 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 9 18 5 8 5 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 19 18 9 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 9 18 5 8 5 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 19 18 7 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 7 18 5 6 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 12 17 18 5 12 5 6 11 11 6 9 10 6 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 12 17 18 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 12 17 18 5 12 5 6 11 11 6 7 8 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 10 17 18 5 10 5 6 9 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 10 17 18 5 10 5 6 9 9 6 7 8 12 13 14 15\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 9 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 6 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 13 6 7 12 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 6 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 13 6 7 12 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 6 13 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 13 6 7 12 12 7 8 9 12 9 10 11\n" + "16 4 11 16 7 14 15 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 7 8 13 14 13 8 11 12 8 9 10 11\n" + "16 4 11 16 7 14 15 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 7 8 13 14 13 8 9 12 12 9 10 11\n" + "16 4 11 16 7 14 15 16 17 6 7 16 19 18 17 16 15 0 19 19 0 3 4 0 1 2 3 18 19 4 5 6 17 18 5 7 8 13 14 13 8 9 10 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 12 17 6 7 12 7 19 11 7 8 9 19 11 19 9 10\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 8 9 10 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 6 7 13 17 7 12 7 8 11 12 11 8 9 10\n" + "16 4 11 16 13 14 15 16 18 17 13 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 17 18 6 7 13 17 7 12 7 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 19 0 3 4 0 1 2 3 6 19 4 5 8 18 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 19 19 9 12 13 9 10 11 12 17 19 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 19 19 9 10 13 13 10 11 12 17 19 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 19 19 9 10 11 19 11 12 13 17 19 13 14\n" + "16 4 11 16 8 15 17 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 9 14 15 14 9 12 13 9 10 11 12 15 0 19 17\n" + "16 4 11 16 8 15 17 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 9 14 15 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 8 15 17 16 6 7 8 16 18 5 6 16 17 19 18 18 19 2 3 19 0 1 2 5 18 3 4 8 9 14 15 14 9 10 11 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 13 14 8 9 19 13 19 9 10 11 13 19 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 19 14 8 9 12 19 12 9 10 11 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 19 14 8 9 10 19 19 10 11 12 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 19 14 8 9 10 19 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 3 4 0 1 2 3 6 18 4 5 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 3 4 0 1 2 3 9 6 7 8 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 18 18 8 19 12 8 9 10 19 12 19 10 11 13 17 18 12\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 13 13 8 19 12 8 9 10 19 12 19 10 11 17 18 13 14\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 19 8 11 12 8 9 10 11 17 18 19 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 19 8 11 12 8 9 10 11 17 18 19 14 14 19 12 13\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 7 8 18 18 8 9 19 19 9 10 11 18 19 11 12 13 17 18 12\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 19 8 9 12 12 9 10 11 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 12 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 19 8 9 10 17 18 19 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 7 19 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 11 11 8 9 10 17 19 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 19 8 9 10 17 18 19 14 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 18 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 19 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 7 10 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 10 7 8 9 17 10 11 12 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 19 9 10 13 19 13 10 11 12 17 19 13 14\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 19 9 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 12 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 9 17 18 9 19 9 10 11 19 17 19 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 7 19 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 17 19 9 12 9 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 7 19 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 17 19 9 10 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 7 19 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 19 7 8 9 17 19 9 10 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 17 18 19 14 14 19 8 13 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 18 7 8 19 17 18 19 14 14 19 8 13 8 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 19 18 19 7 10 11 7 8 9 10 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 12 19 12 7 10 11 7 8 9 10 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 13 6 7 12 13 12 7 10 11 7 8 9 10 17 18 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 11 6 7 18 11 18 7 8 19 19 8 9 10 11 18 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 19 18 19 7 8 11 11 8 9 10 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 12 19 12 7 8 11 11 8 9 10 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 13 6 7 12 13 12 7 8 11 11 8 9 10 17 18 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 19 18 19 7 8 9 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 13 6 7 12 13 12 7 8 9 12 9 10 11 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 10 19 10 7 8 9 19 10 11 12 13 17 19 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 19 18 19 7 8 9 18 19 9 10 12 18 10 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 12 18 6 11 6 7 19 11 19 7 8 9 11 19 9 10 17 12 13 14\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 18 6 7 19 18 19 7 8 9 10 18 19 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 10 17 6 18 6 7 19 18 19 7 8 9 10 18 19 9 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 10 19 10 7 8 9 11 17 19 10 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 17 18 11 12 17 12 13 14\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 19 12 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 12 19 6 11 6 7 10 11 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 8 19 19 8 11 12 8 9 10 11 13 17 19 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 18 6 7 8 18 18 8 9 19 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 8 19 19 8 9 12 12 9 10 11 13 17 19 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 8 19 19 8 9 10 11 17 19 10 12 13 14 15\n" + "16 4 11 16 17 18 15 16 19 12 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 12 19 6 11 6 7 8 11 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 11 17 15 16 18 10 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 19 6 7 8 19 10 19 8 9 11 12 13 17 17 13 14 15\n" + "16 4 11 16 9 10 15 16 18 17 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 19 6 7 8 19 9 17 19 8 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 14 15 16 18 10 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 17 18 15 16 19 10 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 10 19 6 9 6 7 8 9 17 10 11 12 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 10 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 9 6 7 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 11 17 15 16 18 10 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 17 18 15 16 19 10 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 10 19 6 9 6 7 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 3 4 0 1 2 3 12 17 6 7 12 7 18 11 7 8 19 18 19 8 9 10 11 18 19 10\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 12 13 7 8 11 12 11 8 9 10 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 12 13 7 8 9 12 12 9 10 11 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 10 13 7 8 9 10 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 13 13 8 11 12 8 9 10 11 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 13 13 8 9 12 12 9 10 11 17 18 13 14\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 11 11 8 9 10 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 10 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 18 7 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 11 17 15 16 18 10 11 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 10 18 6 7 10 7 8 9 11 12 19 17 19 12 13 14 17 19 14 15\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 19 19 9 12 13 9 10 11 12 17 19 13 14\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 19 19 9 10 13 13 10 11 12 17 19 13 14\n" + "16 4 11 16 17 12 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 19 19 9 10 11 17 19 11 12 12 13 14 15\n" + "16 4 11 16 17 18 15 16 19 8 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 17 8 9 12 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 19 8 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 17 8 9 10 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 18 15 16 19 8 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 17 8 9 10 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 17 18 6 7 13 17 7 12 7 8 19 12 19 8 9 10 12 19 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 12 7 8 11 12 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 10 7 8 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 17 8 11 12 8 9 10 11 12 13 14 15\n" + "16 4 11 16 17 10 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 17 8 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 14 14 7 8 13 13 8 9 10 13 10 11 12\n" + "16 4 11 16 17 8 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 8 9 14 15 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 8 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 8 9 14 15 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 8 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 18 19 6 7 17 18 7 8 8 9 14 15 14 9 10 11 14 11 12 13\n" + "16 4 11 16 9 17 15 16 18 8 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 9 10 19 17 19 10 13 14 10 11 12 13 17 19 14 15\n" + "16 4 11 16 9 17 15 16 18 8 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 9 10 19 17 19 10 11 14 14 11 12 13 17 19 14 15\n" + "16 4 11 16 9 17 15 16 18 8 9 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 9 10 19 17 19 10 11 12 19 12 13 14 17 19 14 15\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 3 4 0 1 2 3 8 18 6 7 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 17 18 15 16 19 8 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 17 8 9 18 18 9 14 15 9 10 13 14 13 10 11 12\n" + "16 4 11 16 17 18 15 16 19 8 17 16 5 6 19 16 15 0 5 5 0 3 4 0 1 2 3 8 19 6 7 17 8 9 18 18 9 14 15 9 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 19 13 9 10 11 19 13 19 11 12 17 18 13 14\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 19 19 9 12 13 9 10 11 12 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 10 19 19 10 11 12 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 19 19 9 10 11 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 10 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 18 17 18 10 19 14 10 11 12 19 14 19 12 13 17 18 14 15\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 8 9 14 15 14 9 19 13 9 10 11 19 13 19 11 12 15 0 18 17\n" + "16 4 11 16 9 17 15 16 7 8 9 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 9 10 18 17 18 10 11 19 19 11 12 13 18 19 13 14 17 18 14 15\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 18 0 1 2 8 9 14 15 14 9 10 19 19 10 11 12 14 19 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 19 18 19 9 12 13 9 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 19 18 8 9 14 19 14 9 12 13 9 10 11 12 18 19 14 15\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 7 14 15 7 8 13 14 13 8 11 12 8 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 13 14 8 9 18 13 18 9 10 19 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 19 18 19 9 10 13 13 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 19 18 8 9 14 19 14 9 10 13 13 10 11 12 18 19 14 15\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 7 14 15 7 8 13 14 13 8 9 12 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 19 18 19 9 10 11 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 7 14 15 7 8 13 14 13 8 9 10 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 19 18 8 9 12 19 12 9 10 11 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 7 14 15 7 8 11 14 11 8 9 10 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 19 18 19 9 10 11 18 19 11 12 14 18 12 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 19 18 8 9 10 19 19 10 13 14 10 11 12 13 18 19 14 15\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 7 14 15 7 8 9 14 14 9 12 13 9 10 11 12 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 18 14 8 9 10 18 18 10 11 19 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 19 18 8 9 10 19 19 10 11 14 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 2 3 19 0 1 2 17 7 14 15 7 8 9 14 14 9 10 13 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 14 14 9 18 13 9 10 19 18 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 3 4 0 1 2 3 17 8 9 18 18 9 14 15 9 10 19 14 19 10 11 12 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 19 18 19 1 4 5 1 2 3 4 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 5 6 0 1 18 5 18 1 2 19 19 2 3 4 5 18 19 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 19 18 19 1 2 5 5 2 3 4 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 19 18 19 1 2 3 19 3 4 5 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 5 6 0 1 19 5 19 1 2 3 5 19 3 4 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 19 18 19 1 2 3 6 18 19 3 6 3 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 5 6 15 0 5 17 5 0 18 4 0 1 19 18 19 1 2 3 4 18 19 3 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 5 19 0 1 4 5 4 1 2 3 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 19 6 0 1 4 19 4 1 2 3 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 19 0 5 6 0 1 4 5 4 1 2 3 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 5 6 0 1 4 5 4 1 2 3 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 15 0 7 19 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 5 6 0 1 4 5 4 1 2 3 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 15 0 7 19 7 0 5 6 0 1 4 5 4 1 2 3 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 5 6 0 1 4 5 4 1 2 3 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 5 6 0 1 4 5 4 1 2 3 12 18 10 11 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 6 7 19 0 1 6 6 1 2 5 5 2 3 4 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 5 6 0 1 2 5 5 2 3 4 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 15 0 7 19 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 5 6 0 1 2 5 5 2 3 4 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 17 19 6 18 6 19 4 5 19 0 1 4 4 1 2 3 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 15 0 7 19 7 0 5 6 0 1 2 5 5 2 3 4 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 4 5 19 0 1 4 4 1 2 3 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 5 6 0 1 2 5 5 2 3 4 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 5 6 0 1 2 5 5 2 3 4 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 7 7 4 5 6 8 18 19 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 2 7 19 0 1 2 7 2 3 6 6 3 4 5 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 8 18 19 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 3 19 0 1 2 3 19 3 4 5 6 18 19 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 19 0 3 6 0 1 2 3 6 3 4 5 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 3 6 0 1 2 3 6 3 4 5 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 15 0 7 19 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 3 6 0 1 2 3 6 3 4 5 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 17 19 6 18 6 19 2 5 19 0 1 2 5 2 3 4 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 15 0 7 19 7 0 3 6 0 1 2 3 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 3 6 0 1 2 3 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 3 6 0 1 2 3 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 18 6 0 1 2 18 6 18 2 19 2 3 4 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 19 6 0 1 2 19 6 19 2 5 2 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 19 6 0 1 2 19 6 19 2 3 6 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 19 4 0 1 2 19 4 19 2 3 8 18 4 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 19 4 0 1 2 19 4 19 2 3 6 18 4 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 10 17 6 9 6 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 8 17 6 7 11 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 19 4 0 1 2 19 4 19 2 3 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 19 0 3 4 0 1 2 3 8 19 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 19 0 3 4 0 1 2 3 8 19 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 3 4 0 1 2 3 6 19 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 17 18 6 9 6 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 3 4 0 1 2 3 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 3 4 0 1 2 3 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 17 0 7 18 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 19 9 9 19 7 8 17 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 19 9 9 19 7 8 18 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 19 9 9 19 7 8 18 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 7 8 15 0 7 17 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 18 0 1 19 19 1 2 5 5 2 3 4 19 5 6 7 8 18 19 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 7 8 15 0 7 18 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 7 8 15 0 7 18 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 18 9 9 18 7 8 17 0 7 18 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 19 0 1 6 6 1 2 5 5 2 3 4 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 4 4 1 2 3 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 4 4 1 2 3 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 19 9 9 19 7 8 17 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 19 9 9 19 7 8 18 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 4 4 1 2 3 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 19 9 9 19 7 8 18 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 8 9 17 19 8 18 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 15 0 19 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 18 0 1 19 19 1 2 3 19 3 4 5 6 18 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 7 8 15 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 2 5 2 3 4 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 2 5 2 3 4 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 19 9 9 19 7 8 15 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 19 9 9 19 7 8 17 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 19 9 9 19 7 8 18 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 6 7 17 19 6 18 6 19 0 5 5 0 1 2 5 2 3 4 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 19 9 9 19 7 8 18 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 9 6 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 10 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 18 0 1 19 19 1 2 3 4 18 19 3 10 7 8 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 19 0 1 4 4 1 2 3 6 19 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 17 18 6 9 6 7 8 9 11 17 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 10 18 6 9 6 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 18 17 11 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 17 18 6 7 11 17 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 17 18 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 17 18 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 8 18 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 8 11 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 8 11 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 17 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 19 7 7 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 13 17 18 16 9 12 13 16 7 8 9 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 9 12 17 16 7 8 9 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 19 7 7 19 5 6 17 0 5 19 5 0 1 4 4 1 2 3 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 19 7 7 19 5 6 17 0 5 19 5 0 1 4 4 1 2 3 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 14 17 16 18 10 11 16 7 8 18 16 17 19 7 7 19 5 6 17 0 5 19 5 0 1 4 4 1 2 3 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 19 7 7 19 5 6 15 0 5 19 5 0 1 4 4 1 2 3 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 11 17 18 16 9 10 11 16 7 8 9 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 4 5 17 19 4 18 4 19 0 3 3 0 1 2 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 5 6 15 0 5 18 5 0 1 4 4 1 2 3 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 18 19 7 7 19 5 6 18 0 5 19 5 0 1 4 4 1 2 3 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 6 11 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 17 7 8 11 11 8 9 10 13 17 11 12\n" + "16 4 11 16 17 14 15 16 7 12 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 19 0 1 2 4 19 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 10 18 4 9 4 5 8 9 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 10 18 4 9 4 5 8 9 8 5 6 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 7 4 5 6 7 9 17 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 18 17 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 7 4 5 6 7 9 17 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 18 8 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 8 18 4 7 4 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 6 11 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 9 6 7 8 17 10 11 14 14 11 12 13\n" +; + +const char* data_dqrgl_block23 = + "16 4 11 16 13 14 15 16 9 10 13 16 18 17 9 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 9 17 5 8 5 6 7 8 13 10 11 12\n" + "16 4 11 16 13 14 15 16 7 8 13 16 18 17 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 7 17 5 6 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 7 8 9 16 18 17 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 17 18 4 5 7 17 5 6 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 14 15 16 17 8 9 16 18 6 17 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 3 4 15 0 3 19 3 0 1 2 6 18 4 5 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 14 15 17 16 12 13 14 16 4 5 12 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 12 5 6 11 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 4 5 12 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 12 5 6 11 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 4 5 12 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 12 5 6 11 11 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 5 6 11 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 11 6 7 10 10 7 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 4 5 10 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 10 5 6 9 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 11 12 17 16 5 6 11 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 11 6 7 10 10 7 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 10 15 17 16 8 9 10 16 4 5 8 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 5 6 7 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 9 6 7 8 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 7 8 19 19 8 11 12 8 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 7 8 13 13 8 11 12 8 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 6 13 14 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 13 6 7 12 12 7 10 11 7 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 7 17 13 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 7 8 19 19 8 9 12 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 7 8 13 13 8 9 12 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 6 13 14 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 13 6 7 12 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 6 13 14 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 13 6 7 12 12 7 8 9 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 17 18 16 7 12 13 16 5 6 7 16 18 19 5 5 19 3 4 18 0 3 19 3 0 1 2 12 7 8 11 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 6 11 12 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 11 6 7 10 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 10 15 17 16 6 9 10 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 9 6 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 11 6 7 19 11 19 7 8 9 11 19 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 19 6 7 10 19 10 7 8 9 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 17 18 6 11 6 7 10 11 10 7 8 9 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 12 18 6 11 6 7 10 11 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 12 18 6 11 6 7 10 11 10 7 8 9 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 12 18 6 11 6 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 12 18 6 11 6 7 8 11 11 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 12 18 6 9 6 7 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 19 6 7 8 19 12 19 8 11 8 9 10 11\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 10 17 6 19 6 7 8 19 10 19 8 9 11 12 13 14\n" + "16 4 11 16 11 14 17 16 18 10 11 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 10 18 6 9 6 7 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 10 18 6 9 6 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 12 17 6 7 12 7 19 11 7 8 9 19 11 19 9 10\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 12 18 6 7 12 7 10 11 7 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 12 18 6 7 12 7 8 11 11 8 9 10 14 15 0 17\n" + "16 4 11 16 11 14 17 16 18 10 11 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 10 18 6 7 10 7 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 17 18 6 7 13 17 7 12 7 8 11 12 11 8 9 10\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 17 18 6 7 13 17 7 12 7 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 17 16 18 8 9 16 5 6 18 16 17 19 5 5 19 3 4 17 0 3 19 3 0 1 2 8 18 6 7 9 10 13 14 13 10 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 8 18 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 19 5 5 19 3 4 15 0 3 19 3 0 1 2 8 18 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 9 14 15 14 9 12 13 9 10 11 12 15 0 19 17\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 9 14 15 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 8 15 17 16 6 7 8 16 4 5 6 16 17 18 4 4 18 2 3 17 19 2 18 2 19 0 1 8 9 14 15 14 9 10 11 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 13 14 8 9 19 13 19 9 10 11 13 19 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 19 14 8 9 12 19 12 9 10 11 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 19 14 8 9 10 19 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 3 4 15 0 3 18 3 0 1 2 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 19 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 4 5 1 2 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 4 5 1 2 3 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 4 5 1 2 3 4 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 19 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 2 5 5 2 3 4 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 2 5 5 2 3 4 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 2 5 5 2 3 4 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 2 3 6 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 2 3 6 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 6 7 6 1 2 3 6 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 19 0 1 4 19 4 1 2 3 19 4 5 6 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 15 0 19 18 8 19 0 7 0 1 4 7 4 1 2 3 7 4 5 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 4 7 4 1 2 3 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 4 7 4 1 2 3 7 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 5 0 1 4 5 4 1 2 3 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 5 0 1 4 5 4 1 2 3 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 17 7 7 17 18 6 15 0 18 17 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 11 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 8 17 6 7 11 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 4 5 4 1 2 3 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 7 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 17 9 9 17 18 8 15 0 18 17 8 18 0 19 0 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 15 0 19 18 8 19 0 7 0 1 2 7 7 2 5 6 2 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 2 7 7 2 5 6 2 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 2 7 7 2 5 6 2 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 19 8 15 0 19 18 8 19 0 7 0 1 2 7 7 2 3 6 6 3 4 5 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 2 7 7 2 3 6 6 3 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 18 9 9 18 19 8 15 0 19 18 8 19 0 7 0 1 2 7 7 2 3 6 6 3 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 8 17 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 8 17 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 18 17 17 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 8 17 6 7 11 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 5 0 1 2 5 5 2 3 4 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 9 17 13 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 17 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 18 7 7 18 19 6 15 0 19 18 6 19 0 3 0 1 2 3 6 3 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 5 6 11 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 19 0 1 2 19 4 19 2 3 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 19 0 1 2 19 4 19 2 3 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 5 6 9 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 19 0 1 2 19 4 19 2 3 9 6 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 12 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 19 0 1 2 19 4 19 2 3 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 7 10 13 16 5 6 7 16 15 17 5 5 17 18 4 15 0 18 17 4 18 0 19 0 1 2 19 4 19 2 3 10 7 8 9 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 6 7 16 15 18 17 17 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 6 17 4 5 9 10 13 14 13 10 11 12\n" + "16 4 11 16 17 14 15 16 11 12 17 16 5 6 11 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 12 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 12 7 8 11 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 10 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 10 7 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 12 17 6 11 6 7 10 11 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 12 17 6 11 6 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 12 17 6 9 6 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 10 17 6 9 6 7 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 10 17 6 9 6 7 8 9 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 10 17 6 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 13 14 15 16 17 8 13 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 8 17 6 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 17 8 9 16 5 6 17 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 8 17 6 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 18 5 5 18 19 4 15 0 19 18 4 19 0 3 0 1 2 3 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 11 4 5 10 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 11 4 5 10 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 11 4 5 10 10 5 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 4 9 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 9 4 5 8 8 5 6 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 4 9 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 9 4 5 8 8 5 6 7 11 12 13 14\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 4 7 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 4 5 6 13 8 9 12 12 9 10 11\n" + "16 4 11 16 9 14 15 16 7 8 9 16 17 4 7 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 4 5 6 9 10 13 14 13 10 11 12\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 13 6 7 12 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 13 6 7 12 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 13 6 7 12 12 7 8 9 12 9 10 11\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 8 13 14 13 8 11 12 8 9 10 11\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 8 13 14 13 8 9 12 12 9 10 11\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 19 2 15 0 19 18 2 19 0 1 4 17 2 3 7 8 13 14 13 8 9 10 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 11 4 5 10 10 5 19 9 5 6 7 19 9 19 7 8\n" + "16 4 11 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 11 4 5 10 10 5 8 9 5 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 11 4 5 10 10 5 6 19 19 6 7 8 10 19 8 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 11 4 5 10 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 11 4 5 10 10 5 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 3 4 9 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 9 4 5 8 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 3 4 9 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 9 4 5 8 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 7 4 5 6 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 7 4 5 6 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 7 4 5 6 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 7 4 5 6 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 7 4 5 6 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 12 5 6 11 11 6 19 10 6 7 8 19 10 19 8 9\n" + "16 4 11 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 5 6 11 11 6 9 10 6 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 18 2 15 0 18 17 2 18 0 1 12 5 6 11 11 6 7 19 19 7 8 9 11 19 9 10\n" + "16 4 11 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 5 6 11 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 5 6 11 11 6 7 8 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 5 10 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 10 5 6 9 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 5 8 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 8 5 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 5 8 17 16 3 4 5 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 8 5 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 11 4 5 10 11 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 11 4 5 10 11 10 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 11 4 5 10 11 10 5 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 11 4 5 8 11 8 5 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 9 4 5 8 9 8 5 6 7 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 11 4 5 6 11 11 6 9 10 6 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 11 4 5 6 11 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 7 4 5 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 5 12 5 10 11 5 6 9 10 9 6 7 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 5 12 5 10 11 5 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 5 12 5 8 11 5 6 7 8 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 5 12 5 6 11 11 6 9 10 6 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 19 2 15 0 19 18 2 19 0 1 12 17 4 5 12 5 6 11 11 6 7 8 11 8 9 10\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 1 2 15 0 1 18 10 17 2 9 2 3 8 9 8 3 19 7 3 4 5 19 7 19 5 6\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 1 2 15 0 1 19 10 18 2 9 2 3 8 9 8 3 6 7 3 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 1 2 15 0 1 19 10 18 2 9 2 3 8 9 8 3 6 7 3 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 18 17 17 18 1 2 15 0 1 18 10 17 2 9 2 3 8 9 8 3 4 19 19 4 5 6 8 19 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 1 2 15 0 1 19 10 18 2 9 2 3 8 9 8 3 4 7 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 1 2 15 0 1 19 10 18 2 9 2 3 8 9 8 3 4 7 7 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 19 18 18 19 1 2 15 0 1 19 10 18 2 9 2 3 8 9 8 3 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 19 18 18 19 1 2 15 0 1 19 10 18 2 9 2 3 8 9 8 3 4 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 11 14 15 16 17 10 11 16 18 8 17 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 19 18 18 19 1 2 15 0 1 19 8 18 2 7 2 3 6 7 6 3 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 6 11 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 19 18 18 19 1 2 15 0 1 19 6 18 2 5 2 3 4 5 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 11 4 5 10 10 5 19 9 5 6 7 19 9 19 7 8\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 4 11 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 11 4 5 10 10 5 8 9 5 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 4 11 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 11 4 5 10 10 5 6 19 19 6 7 8 10 19 8 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 4 11 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 11 4 5 10 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 4 11 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 11 4 5 10 10 5 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 4 9 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 9 4 5 8 8 5 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 4 9 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 9 4 5 8 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 4 7 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 7 4 5 6 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 5 6 13 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 13 6 7 12 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 5 6 13 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 13 6 7 12 12 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 5 6 13 16 18 17 5 16 15 19 18 18 19 1 2 15 0 1 19 17 18 2 3 5 17 3 4 13 6 7 12 12 7 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 13 6 7 12 12 7 19 11 7 8 9 19 11 19 9 10\n" + "16 4 11 16 13 14 15 16 5 6 13 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 13 6 7 12 12 7 8 19 19 8 9 10 12 19 10 11\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 8 13 14 13 8 19 12 8 9 10 19 12 19 10 11\n" + "16 4 11 16 7 14 15 16 5 6 7 16 17 4 5 16 15 18 17 17 18 1 2 15 0 1 18 4 17 2 3 7 8 13 14 13 8 9 19 19 9 10 11 13 19 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 13 14 6 7 12 13 12 7 10 11 7 8 9 10\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 13 14 6 7 12 13 12 7 8 11 11 8 9 10\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 13 14 6 7 12 13 12 7 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 13 14 6 7 10 13 10 7 8 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 11 14 6 7 10 11 10 7 8 9 14 11 12 13\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 13 14 6 7 8 13 13 8 11 12 8 9 10 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 13 14 6 7 8 13 13 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 9 14 6 7 8 9 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 14 14 7 12 13 7 8 11 12 11 8 9 10\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 14 14 7 12 13 7 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 14 14 7 10 13 7 8 9 10 13 10 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 18 4 5 16 15 19 18 18 19 1 2 15 0 1 19 4 18 2 3 17 6 7 14 14 7 8 13 13 8 9 10 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 18 9 5 6 19 18 19 6 7 8 9 18 19 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 19 18 5 6 7 19 18 19 7 8 10 18 8 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 1 2 15 0 1 18 11 4 5 10 10 5 19 9 5 6 7 19 9 19 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 3 4 11 16 15 17 3 3 17 1 2 15 0 1 17 11 4 5 10 10 5 6 18 18 6 7 19 19 7 8 9 10 18 19 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 3 4 11 16 15 18 3 3 18 1 2 15 0 1 18 11 4 5 10 10 5 6 19 19 6 7 8 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 3 4 9 16 15 18 3 3 18 1 2 15 0 1 18 9 4 5 8 8 5 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 13 14 8 9 19 13 19 9 10 11 13 19 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 19 14 8 9 12 19 12 9 10 11 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 19 14 8 9 10 19 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 18 3 3 18 1 2 15 0 1 18 7 4 5 6 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 18 10 6 7 19 18 19 7 8 9 10 18 19 9\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 13 13 6 11 12 6 7 10 11 10 7 8 9 17 18 13 14\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 13 13 6 11 12 6 7 8 11 11 8 9 10 17 18 13 14\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 13 13 6 9 12 6 7 8 9 12 9 10 11 17 18 13 14\n" + "16 4 11 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 19 18 6 7 8 19 18 19 8 9 11 18 9 10\n" + "16 4 11 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 12 5 6 11 11 6 19 10 6 7 8 19 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 13 13 6 7 12 12 7 10 11 7 8 9 10 17 18 13 14\n" + "16 4 11 16 13 14 15 16 5 12 13 16 3 4 5 16 15 17 3 3 17 1 2 15 0 1 17 12 5 6 11 11 6 7 18 18 7 8 19 19 8 9 10 11 18 19 10\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 13 13 6 7 12 12 7 8 11 11 8 9 10 17 18 13 14\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 13 13 6 7 12 12 7 8 9 12 9 10 11 17 18 13 14\n" + "16 4 11 16 17 14 15 16 5 12 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 12 5 6 11 11 6 7 19 19 7 8 9 11 19 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 7 17 18 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 7 17 18 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 19 3 3 19 1 2 15 0 1 19 18 5 6 7 17 18 7 14 14 7 8 13 13 8 9 10 13 10 11 12\n" + "16 4 11 16 17 14 15 16 5 8 17 16 3 4 5 16 15 18 3 3 18 1 2 15 0 1 18 8 5 6 7 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 10 11 10 5 19 9 5 6 7 19 9 19 7 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 19 11 19 5 8 9 5 6 7 8 11 19 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 19 4 5 10 19 10 5 8 9 5 6 7 8 12 19 10 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 12 18 4 11 4 5 10 11 10 5 8 9 5 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 10 11 10 5 6 19 19 6 7 8 10 19 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 19 11 19 5 6 9 9 6 7 8 11 19 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 19 4 5 10 19 10 5 6 9 9 6 7 8 12 19 10 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 12 18 4 11 4 5 10 11 10 5 6 9 9 6 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 12 18 4 11 4 5 10 11 10 5 6 7 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 12 18 4 11 4 5 8 11 8 5 6 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 19 11 19 5 6 7 11 19 7 10 7 8 9 10\n" + "16 4 11 16 17 14 15 16 18 10 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 10 18 4 9 4 5 8 9 8 5 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 11 4 5 6 11 11 6 19 10 6 7 8 19 10 19 8 9\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 12 18 4 11 4 5 6 11 11 6 9 10 6 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 12 18 4 11 4 5 6 11 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 3 4 18 16 15 19 3 3 19 1 2 15 0 1 19 10 18 4 9 4 5 6 9 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 19 4 5 6 19 12 19 6 11 6 7 10 11 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 19 4 5 6 19 12 19 6 11 6 7 8 11 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 10 11 5 6 19 10 19 6 7 8 10 19 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 19 11 5 6 9 19 9 6 7 8 11 19 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 19 11 5 6 7 19 11 19 7 10 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 19 11 5 6 7 19 11 19 7 8 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 6 11 11 6 19 10 6 7 8 19 10 19 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 18 3 3 18 1 2 15 0 1 18 12 17 4 5 12 5 6 11 11 6 7 19 19 7 8 9 11 19 9 10\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 17 6 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 19 6 2 3 4 19 6 19 4 5 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 7 8 7 2 19 6 2 3 4 19 6 19 4 5 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 19 8 19 2 5 6 2 3 4 5 8 19 6 7 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 5 19 2 3 4 5 7 17 18 19 7 19 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 19 18 19 2 5 6 2 3 4 5 17 18 19 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 5 6 2 3 4 5 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 5 6 2 3 4 5 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 5 6 2 3 4 5 7 18 19 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 19 9 1 2 7 19 7 2 5 6 2 3 4 5 9 19 7 8 10 17 18 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 19 19 3 4 5 18 19 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 7 8 7 2 3 19 19 3 4 5 7 19 5 6 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 19 19 3 4 5 17 18 19 5 7 17 5 6\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 6 7 1 2 18 6 18 2 3 19 19 3 4 5 6 18 19 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 18 6 18 2 3 19 19 3 4 5 6 18 19 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 6 7 1 2 18 6 18 2 3 19 19 3 4 5 6 18 19 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 19 8 19 2 3 6 6 3 4 5 8 19 6 7 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 19 19 3 4 5 7 17 18 19 7 19 5 6\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 6 6 3 4 5 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 6 6 3 4 5 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 6 6 3 4 5 7 18 19 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 19 9 1 2 7 19 7 2 3 6 6 3 4 5 9 19 7 8 10 17 18 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 4 18 4 5 19 7 17 18 19 7 19 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 19 18 19 2 3 4 19 4 5 6 17 18 19 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 19 4 5 6 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 19 4 5 6 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 19 4 5 6 7 18 19 6 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 4 17 18 4 19 4 5 6 19 7 17 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 19 8 19 2 3 4 8 19 4 7 4 5 6 7 10 17 18 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 19 18 19 2 3 4 18 19 4 5 17 18 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 18 19 4 5 7 18 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 18 19 4 5 7 18 5 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 18 19 4 5 7 18 5 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 1 18 18 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 8 9 16 13 0 17 17 0 1 18 18 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 8 17 18 7 13 14 15 0\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 17 4 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 7 18 19 4 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 7 18 19 4 7 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 19 18 19 2 3 4 7 18 19 4 7 4 5 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 18 17 18 2 3 19 7 17 18 19 7 19 3 6 3 4 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 19 5 17 18 19 5 19 3 4 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 19 5 17 18 19 5 19 3 4 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 19 5 17 18 19 5 19 3 4 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 19 5 17 18 19 5 19 3 4 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 19 5 17 18 19 5 19 3 4 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 17 5 1 2 18 17 18 2 3 19 5 17 18 19 5 19 3 4 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 8 5 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 6 17 4 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 6 17 4 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 6 17 4 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 6 17 4 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 6 17 4 5 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 18 17 1 2 19 18 19 2 3 4 17 18 19 4 6 17 4 5 13 14 15 0\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 11 8 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 10 17 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 10 17 8 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 12 13 14 17 17 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 19 18 1 2 5 19 5 2 3 4 18 19 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 18 1 2 5 19 5 2 3 4 18 19 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 19 18 1 2 5 19 5 2 3 4 18 19 5 6 8 18 6 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 8 11 16 15 0 17 17 0 1 18 18 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 8 17 18 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 8 9 16 15 0 17 17 0 1 18 18 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 8 17 18 7 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 8 9 16 15 0 17 17 0 1 18 18 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 8 17 18 7 11 12 13 14\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 8 9 16 13 0 17 17 0 1 18 18 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 8 17 18 7 13 14 15 0\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 13 16 9 10 17 16 18 8 9 16 13 0 18 18 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 8 18 19 7 17 10 11 12 13 14 15 0\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 17 3 19 18 3 4 5 19 18 19 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 8 9 1 2 3 8 8 3 19 7 3 4 5 19 7 19 5 6 10 17 18 9\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 17 3 4 18 18 4 5 19 7 17 18 19 7 19 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 18 3 4 19 19 4 5 6 17 18 19 6 8 17 6 7\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 3 18 18 3 4 19 19 4 5 6 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 3 18 18 3 4 19 19 4 5 6 7 18 19 6 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 18 3 4 5 17 18 5 19 5 6 7 19 8 17 19 7\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 19 18 1 2 3 19 19 3 4 5 18 19 5 6 8 18 6 7 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 13 16 9 10 17 16 18 8 9 16 13 0 18 18 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 8 18 19 7 17 10 11 12 13 14 15 0\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 4 18 1 2 3 4 18 4 5 19 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 18 1 2 3 4 18 4 5 19 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 4 18 1 2 3 4 18 4 5 19 19 5 6 7 8 18 19 7 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 17 12 13 14 14 15 0 18\n" +; + +const char* data_dqrgl_block24 = + "16 4 11 16 17 14 15 16 11 12 17 16 18 8 11 16 15 0 18 18 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 11 8 9 10 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 17 10 11 12 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 18 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 8 18 19 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 17 7 1 2 3 17 7 17 3 18 3 4 19 18 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 17 18 3 19 3 4 7 19 7 4 5 6 8 17 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 19 5 6 7 8 17 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 17 19 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 19 3 4 5 19 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 19 3 4 5 19 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 18 7 1 2 3 18 7 18 3 19 3 4 5 19 7 19 5 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 6 17 19 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 6 17 19 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 6 17 19 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 6 17 19 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 6 17 19 5 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 18 17 1 2 3 18 17 18 3 19 3 4 5 19 6 17 19 5 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 6 3 4 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 6 3 4 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 6 3 4 5 6 8 18 6 7 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 18 17 1 2 3 18 17 18 3 4 17 4 5 19 19 5 6 7 8 17 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 4 18 4 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 4 18 4 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 4 18 4 5 6 8 18 6 7 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 12 18 10 11 14 15 0 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 4 8 18 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 4 8 18 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 19 18 1 2 3 19 18 19 3 4 8 18 4 7 4 5 6 7 14 15 0 17\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 11 8 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 10 17 8 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 17 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 12 13 14 17 17 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 12 15 0 17 12 13 14 15\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 6 11 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 9 10 13 16 17 6 9 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 9 6 7 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 17 6 9 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 13 16 9 10 11 16 17 6 9 16 13 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 9 6 7 8 13 14 15 0\n" + "16 4 11 16 13 14 15 16 7 8 13 16 17 6 7 16 15 0 17 17 0 1 18 18 1 19 5 1 2 3 19 5 19 3 4 6 17 18 5 13 8 9 12 12 9 10 11\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 8 11 16 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 8 11 16 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 9 12 13 16 7 8 9 16 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 12 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 10 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 18 8 9 11 17 9 10 13 14 15 0\n" + "16 4 11 16 11 14 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 18 10 17 16 7 8 18 16 13 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 12 13 14 17 17 14 15 0\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 17 10 11 19 19 11 12 13 17 19 13 14\n" + "16 4 11 16 11 17 18 16 9 10 11 16 7 8 9 16 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 18 5 1 2 3 18 5 18 3 4 12 13 19 17 19 13 14 15 17 19 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 4 5 1 2 3 4 10 5 8 9 5 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 4 5 1 2 3 4 10 5 8 9 5 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 4 5 1 2 3 4 10 5 6 9 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 4 5 1 2 3 4 10 5 6 9 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 6 11 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 11 6 7 10 10 7 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 9 6 7 8 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 6 9 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 9 6 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 13 16 9 10 17 16 18 6 9 16 13 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 9 6 7 8 17 10 11 12 13 14 15 0\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 8 9 12 12 9 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 8 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 12 13 16 7 8 17 16 18 6 7 16 13 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 8 9 12 12 9 10 11 13 14 15 0\n" + "16 4 11 16 17 10 11 16 7 8 17 16 18 6 7 16 11 0 18 18 0 1 19 19 1 4 5 1 2 3 4 6 18 19 5 17 8 9 10 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 18 19 16 13 14 17 16 7 8 13 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 8 9 12 12 9 10 11 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 9 10 19 19 10 11 12 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 14 18 16 9 19 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 19 9 10 13 13 10 11 12 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 9 14 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 14 9 10 13 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 9 10 19 17 18 19 14 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 9 10 19 17 18 19 12 12 19 10 11 13 14 15 0\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 17 8 18 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 19 8 9 12 19 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 13 8 9 12 13 12 9 10 11 17 18 13 14\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 19 8 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 18 8 19 8 9 10 19 12 19 10 11 14 15 0 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 19 8 9 10 19 11 17 19 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 18 8 19 8 9 10 19 11 17 19 10 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 11 8 9 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 19 18 13 16 7 8 19 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 11 8 9 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 11 8 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 11 8 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 7 8 19 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 19 8 11 8 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 19 8 11 8 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 7 8 19 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 19 8 11 8 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 7 8 19 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 19 8 9 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 12 9 10 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 19 18 13 16 7 8 19 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 13 18 9 12 9 10 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 10 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 10 17 10 11 12 12 13 14 15\n" + "16 4 11 16 11 12 17 16 19 18 11 16 7 8 19 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 11 18 9 10 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 12 12 9 10 11 13 14 15 0\n" + "16 4 11 16 17 10 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 10 11 16 19 18 17 16 7 8 19 16 11 0 7 7 0 1 6 6 1 4 5 1 2 3 4 18 19 8 9 17 18 9 10 11 12 15 0 15 12 13 14\n" + "16 4 11 16 11 17 18 16 19 10 11 16 7 8 19 16 18 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 19 8 9 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 19 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 10 18 8 9 12 13 19 17 19 13 14 15 17 19 15 0\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 14 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 12 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 15 18 10 11 14 15 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 13 18 10 11 12 13 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 13 18 10 11 12 13 18 13 14 19 19 14 15 0\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 18 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 18 18 11 14 19 11 12 13 14 19 14 15 0\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 10 11 18 18 11 12 19 19 12 15 0 12 13 14 15\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 17 6 2 3 18 17 18 3 4 19 6 17 18 19 6 19 4 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 18 17 2 3 19 18 19 3 4 5 17 18 19 5 7 17 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 19 18 2 3 6 19 6 3 4 5 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 6 7 1 2 5 6 5 2 3 4 9 19 7 8 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 19 18 2 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 6 7 1 2 3 6 6 3 4 5 9 19 7 8 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 5 19 2 3 4 5 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 5 19 2 3 4 5 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 5 19 2 3 4 5 19 5 6 7 8 18 19 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 4 7 1 2 3 4 7 4 5 6 9 19 7 8 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 18 17 2 3 4 18 17 18 4 19 4 5 6 19 7 17 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 19 18 2 3 4 19 18 19 4 7 4 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 18 5 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 17 18 5 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 19 18 2 3 4 19 18 19 4 5 7 18 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 19 18 2 3 4 19 18 19 4 5 7 18 5 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 19 18 2 3 4 19 18 19 4 5 7 18 5 6 14 15 0 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 11 8 9 10\n" + "16 4 11 16 13 14 15 16 9 12 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 12 9 10 11\n" + "16 4 11 16 13 14 15 16 9 10 13 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 13 10 11 12\n" + "16 4 11 16 11 14 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 11 12 13 14\n" + "16 4 11 16 11 12 15 16 9 10 11 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 12 13 14 15\n" + "16 4 11 16 11 12 13 16 9 10 11 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 17 17 2 19 18 2 3 4 19 18 19 4 5 6 17 18 5 13 14 15 0\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 9 6 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 19 6 2 3 4 19 6 19 4 5 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 19 6 2 3 4 19 6 19 4 5 8 18 6 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 19 6 2 3 4 19 6 19 4 5 8 18 6 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 14 11 12 13 15 0 18 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 19 5 1 2 3 19 5 19 3 4 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 5 6 2 3 4 5 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 5 6 2 3 4 5 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 7 7 2 5 6 2 3 4 5 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 6 6 1 4 5 1 2 3 4 9 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 7 7 2 5 6 2 3 4 5 10 7 8 9 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 6 6 1 4 5 1 2 3 4 9 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 4 5 1 2 3 4 9 19 5 8 5 6 7 8 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 14 11 12 13 15 0 18 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 4 5 1 2 3 4 7 19 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 17 18 11 12 17 12 13 14\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 13 14 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 6 6 1 4 5 1 2 3 4 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 17 17 3 19 18 3 4 5 19 18 19 5 6 7 17 18 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 19 7 3 4 5 19 7 19 5 6 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 6 7 3 4 5 6 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 6 7 3 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 6 7 3 4 5 6 8 18 19 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 2 7 7 2 5 6 2 3 4 5 9 19 7 8 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 9 19 1 8 8 1 2 7 7 2 5 6 2 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 4 19 19 4 5 6 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 4 19 19 4 5 6 17 18 19 6 8 17 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 8 8 1 2 7 7 2 3 18 18 3 4 19 19 4 5 6 7 18 19 6 10 17 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 18 18 3 4 19 19 4 5 6 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 18 18 3 4 19 19 4 5 6 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 18 18 3 4 19 19 4 5 6 7 18 19 6 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 7 7 4 5 6 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 7 7 4 5 6 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 7 7 4 5 6 8 18 19 7 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 2 7 7 2 3 6 6 3 4 5 9 19 7 8 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 10 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 9 19 1 8 8 1 2 7 7 2 3 6 6 3 4 5 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 5 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 5 19 5 6 7 8 18 19 7 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 5 19 5 6 7 8 18 19 7 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 10 10 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 17 0 1 18 18 1 2 19 19 2 3 6 6 3 4 5 19 6 7 8 18 19 8 9 10 17 18 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 10 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 18 18 3 4 5 17 18 5 19 5 6 7 19 8 17 19 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 5 18 19 5 6 8 18 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 19 19 3 4 5 18 19 5 6 8 18 6 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 10 18 8 9 17 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 14 11 12 13 15 0 18 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 11 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 7 8 11 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 11 8 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 12 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 9 12 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 12 17 8 11 8 9 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 10 17 8 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 10 17 8 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 10 17 8 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 7 8 17 16 13 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 10 17 8 9 13 14 15 0\n" + "16 4 11 16 13 14 17 16 9 10 13 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 10 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 9 10 11 16 7 8 9 16 17 0 7 7 0 1 6 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 18 0 1 19 19 1 2 7 7 2 3 6 6 3 4 5 19 7 8 9 10 18 19 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 6 6 1 2 5 5 2 3 4 9 6 7 8 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 6 6 1 2 5 5 2 3 4 9 6 7 8 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 9 19 1 6 6 1 2 5 5 2 3 4 9 6 7 8 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 14 11 12 13 15 0 18 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 5 5 2 3 4 7 19 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 13 0 19 19 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 8 9 10 17 18 9 13 14 15 0\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 7 19 1 6 6 1 2 5 5 2 3 4 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 6 6 1 2 5 5 2 3 4 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 6 6 1 2 5 5 2 3 4 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 17 17 2 3 4 17 4 19 18 4 5 6 19 18 19 6 7 8 17 18 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 10 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 18 18 2 3 4 18 4 5 19 19 5 6 7 8 18 19 7 12 17 10 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 10 10 1 2 9 9 2 3 4 9 4 5 8 8 5 6 7 18 19 10 11 12 17 18 11\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 11 12 16 17 19 18 18 19 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 11 18 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 9 9 2 3 4 9 4 5 8 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 9 9 2 3 4 9 4 5 8 8 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 9 12 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 9 18 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 8 9 12 17 18 9 12 9 10 11\n" + "16 4 11 16 13 14 15 16 17 10 13 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 8 9 10 17 18 9 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 8 9 10 17 18 9 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 13 0 19 19 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 8 9 10 17 18 9 13 14 15 0\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 9 10 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 9 18 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 9 10 16 17 19 18 18 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 9 18 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 12 19 10 11 17 12 13 14 14 15 0 18\n" +; + +const char* data_dqrgl_block25 = + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 4 4 1 2 3 9 4 5 8 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 4 4 1 2 3 9 4 5 8 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 9 19 1 4 4 1 2 3 9 4 5 8 8 5 6 7 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 7 19 1 4 4 1 2 3 7 4 5 6 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 4 4 1 2 3 7 4 5 6 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 4 4 1 2 3 7 4 5 6 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 4 4 1 2 3 7 4 5 6 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 2 3 9 19 3 8 3 4 7 8 7 4 5 6 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 19 19 1 2 3 9 19 3 8 3 4 5 8 8 5 6 7 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 3 7 19 3 6 3 4 5 6 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 3 7 19 3 6 3 4 5 6 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 3 7 19 3 6 3 4 5 6 14 11 12 13 15 0 18 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 19 19 1 2 3 7 19 3 6 3 4 5 6 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 12 7 8 11 11 8 9 10 15 0 18 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 10 7 8 9 14 11 12 13 15 0 18 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 7 8 11 16 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 6 7 10 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 10 7 8 9 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 7 8 11 16 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 8 13 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 13 8 9 12 12 9 10 11 15 0 18 17\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 11 8 9 10 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 9 12 13 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 8 11 12 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 11 8 9 10 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 9 12 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 12 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 12 17 8 19 8 9 10 19 12 19 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 18 8 11 8 9 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 18 8 11 8 9 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 18 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 12 18 8 9 12 9 10 11 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 10 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 13 10 11 12 14 15 0 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 18 8 9 13 17 9 12 9 10 11 12\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 18 8 9 11 17 9 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 18 8 9 11 17 9 10 13 14 15 0\n" + "16 4 11 16 11 14 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 18 10 17 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 17 10 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 18 10 17 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 10 18 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 14 9 10 13 13 10 11 12 15 0 18 17\n" + "16 4 11 16 11 17 18 16 9 10 11 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 10 15 17 16 8 9 10 16 6 7 8 16 17 18 6 6 18 0 5 5 0 1 19 19 1 2 3 5 19 3 4 10 11 14 15 14 11 12 13 15 0 18 17\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 18 18 2 3 4 6 18 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 10 13 18 10 11 12 13 18 13 14 15\n" + "16 4 11 16 17 14 18 16 9 10 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 10 13 14 10 11 12 13 14 15 0 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 19 19 2 3 4 6 19 4 5 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 18 7 12 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 7 10 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 7 10 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 12 17 18 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 13 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 10 17 18 7 10 7 8 9 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 8 13 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 13 8 9 12 12 9 10 11\n" + "16 4 11 16 11 12 13 16 17 8 11 16 19 18 17 16 13 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 8 9 10 13 14 15 0\n" + "16 4 11 16 9 14 15 16 17 8 9 16 19 18 17 16 15 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 9 10 13 14 13 10 11 12\n" + "16 4 11 16 9 12 13 16 17 8 9 16 19 18 17 16 13 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 9 10 11 12 13 14 15 0\n" + "16 4 11 16 9 10 11 16 17 8 9 16 19 18 17 16 11 0 19 19 0 1 6 6 1 2 5 5 2 3 4 18 19 6 7 8 17 18 7 11 12 15 0 15 12 13 14\n" + "16 4 11 16 10 15 17 16 8 9 10 16 18 7 8 16 17 19 18 18 19 0 5 5 0 1 4 4 1 2 3 7 18 5 6 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 7 8 13 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 8 9 12 12 9 10 11 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 7 12 16 18 19 6 6 19 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 12 7 8 11 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 10 7 8 9 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 18 19 6 6 19 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 17 14 18 16 9 19 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 19 9 10 13 13 10 11 12 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 9 14 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 14 9 10 13 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 8 13 17 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 4 4 1 2 3 13 8 9 12 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 9 10 19 17 18 19 14 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 9 10 19 17 18 19 12 12 19 10 11 13 14 15 0\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 17 12 13 18 18 13 14 19 19 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 17 8 18 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 19 8 9 12 19 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 13 8 9 12 13 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 13 18 7 12 7 8 11 12 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 19 8 9 10 19 19 10 11 12 13 17 19 12\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 13 18 7 12 7 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 13 18 7 10 7 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 18 8 19 8 9 10 19 12 19 10 11 14 15 0 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 19 8 9 10 19 11 17 19 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 18 8 19 8 9 10 19 11 17 19 10 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 11 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 11 18 7 10 7 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 7 8 19 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 11 8 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 19 8 11 8 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 11 18 7 10 7 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 19 8 11 8 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 19 8 11 8 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 13 18 7 8 13 8 11 12 8 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 13 18 7 8 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 19 8 9 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 11 18 7 8 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 9 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 9 18 7 8 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 7 8 19 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 13 18 9 12 9 10 11 12 14 15 0 17\n" + "16 4 11 16 11 12 17 16 19 18 11 16 7 8 19 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 11 18 9 10 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 17 18 9 12 12 9 10 11 13 14 15 0\n" + "16 4 11 16 17 10 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 10 11 16 19 18 17 16 7 8 19 16 11 0 7 7 0 1 6 6 1 2 5 5 2 3 4 18 19 8 9 17 18 9 10 11 12 15 0 15 12 13 14\n" + "16 4 11 16 11 17 18 16 19 10 11 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 19 8 9 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 10 15 17 16 18 9 10 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 4 4 1 2 3 9 18 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 19 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 11 12 17 16 18 10 11 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 10 18 8 9 12 13 19 17 19 13 14 15 17 19 15 0\n" + "16 4 11 16 14 15 17 16 8 9 14 16 6 7 8 16 17 18 6 6 18 19 5 5 19 1 4 4 1 2 3 14 9 10 13 13 10 11 12 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 15 18 10 11 14 15 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 4 4 1 2 3 17 9 14 15 9 10 13 14 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 4 4 1 2 3 17 9 14 15 9 10 11 14 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 13 18 10 11 12 13 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 13 18 10 11 12 13 18 13 14 19 19 14 15 0\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 5 5 2 3 4 17 10 11 18 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 7 8 2 3 19 7 19 3 4 5 7 19 5 6 15 0 18 17\n" + "16 4 11 16 13 14 15 16 11 12 13 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 17 7 3 4 18 17 18 4 5 19 7 17 18 19 7 19 5 6\n" + "16 4 11 16 13 14 15 16 17 12 13 16 9 10 17 16 15 0 9 9 0 1 8 8 1 2 3 8 3 18 7 3 4 19 18 19 4 5 6 7 18 19 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 18 7 3 4 19 18 19 4 5 6 7 18 19 6 17 12 13 14\n" + "16 4 11 16 13 14 17 16 11 12 13 16 9 10 11 16 17 0 9 9 0 1 8 8 1 2 3 8 3 18 7 3 4 19 18 19 4 5 6 7 18 19 6 14 15 0 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 19 8 2 3 6 19 6 3 4 5 8 19 6 7 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 2 9 2 7 8 2 3 6 7 6 3 4 5 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 2 9 2 7 8 2 3 6 7 6 3 4 5 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 2 9 2 7 8 2 3 4 7 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 2 9 2 7 8 2 3 4 7 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 2 9 2 5 8 2 3 4 5 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 2 9 2 5 8 2 3 4 5 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 19 8 2 3 4 19 8 19 4 7 4 5 6 7 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 19 8 2 3 4 19 8 19 4 5 8 5 6 7 15 0 18 17\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 0 7 7 0 1 2 7 2 19 6 2 3 4 19 6 19 4 5 12 9 10 11 15 0 18 17\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 10 13 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 19 6 2 3 4 19 6 19 4 5 13 10 11 12 15 0 18 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 17 18 10 11 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 9 10 18 16 17 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 12 18 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 19 6 2 3 4 19 6 19 4 5 14 11 12 13 15 0 18 17\n" + "16 4 11 16 13 17 18 16 11 12 13 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 10 11 12 16 8 9 10 16 17 18 8 8 18 0 7 7 0 1 2 7 2 19 6 2 3 4 19 6 19 4 5 12 13 14 15 15 0 18 17\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 12 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 2 7 2 5 6 2 3 4 5 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 3 8 8 3 19 7 3 4 5 19 7 19 5 6 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 2 9 2 3 8 8 3 6 7 3 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 0 9 9 0 1 2 9 2 3 8 8 3 4 19 19 4 5 6 8 19 6 7 15 0 18 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 5 8 8 5 6 7 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 5 8 8 5 6 7 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 2 9 2 3 8 8 3 4 7 7 4 5 6 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 11 12 19 16 15 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 5 6 9 6 7 8 18 19 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 10 11 18 16 17 19 10 10 19 0 9 9 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 13 18 11 12 15 0 19 17\n" + "16 4 11 16 17 18 19 16 13 14 17 16 11 12 13 16 19 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 5 6 9 6 7 8 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 10 11 12 16 18 19 10 10 19 0 9 9 0 1 2 9 2 3 8 8 3 4 5 8 5 6 7 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 9 19 1 2 9 2 3 8 8 3 4 5 8 5 6 7 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 19 16 13 14 17 16 9 10 13 16 19 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 8 9 12 16 18 19 8 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 7 19 1 2 7 2 3 6 6 3 4 5 12 9 10 11 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 14 15 16 11 18 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 11 12 19 17 18 19 14 14 19 12 13\n" + "16 4 11 16 17 18 15 16 11 19 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 19 11 12 13 17 19 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 11 19 17 16 9 10 11 16 18 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 19 11 12 13 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 11 14 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 14 11 12 13 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 13 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 13 10 11 12 17 13 14 15 15 0 19 18\n" + "16 4 11 16 13 14 15 16 18 17 13 16 9 10 18 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 18 10 19 10 11 12 19 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 19 10 13 10 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 13 18 9 12 9 10 11 12 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 13 18 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 11 18 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 9 10 19 16 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 9 10 19 16 13 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 18 19 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 12 19 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 8 9 18 16 17 19 8 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 11 18 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 9 10 19 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 12 19 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 9 10 19 16 18 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 12 19 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 10 11 14 16 8 9 10 16 17 18 8 8 18 19 7 7 19 1 2 7 2 3 6 6 3 4 5 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 9 10 11 16 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 8 9 10 16 18 19 8 8 19 0 7 7 0 1 2 7 2 3 6 6 3 4 5 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 9 10 11 16 19 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 9 19 3 4 9 4 5 8 8 5 6 7 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 18 19 16 13 14 17 16 7 8 13 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 8 9 12 12 9 10 11 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 12 13 17 16 6 7 12 16 18 19 6 6 19 0 5 5 0 1 2 5 2 3 4 12 7 8 11 11 8 9 10 17 13 14 15 15 0 19 18\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 19 5 5 19 1 2 5 2 3 4 12 7 8 11 11 8 9 10 15 19 18 17 15 0 1 19\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 19 5 5 19 1 2 5 2 3 4 10 7 8 9 14 11 12 13 15 19 18 17 15 0 1 19\n" + "16 4 11 16 17 18 15 16 11 12 17 16 7 8 11 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 6 7 10 16 18 19 6 6 19 0 5 5 0 1 2 5 2 3 4 10 7 8 9 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 7 8 11 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 7 19 3 4 7 4 5 6 12 9 10 11 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 14 18 16 9 19 17 16 7 8 9 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 19 9 10 13 13 10 11 12 17 19 13 14 14 15 0 18\n" + "16 4 11 16 17 18 19 16 9 14 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 14 9 10 13 13 10 11 12 17 14 15 18 18 15 0 19\n" + "16 4 11 16 17 15 18 16 8 13 17 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 2 5 2 3 4 13 8 9 12 12 9 10 11 17 13 14 15 15 0 19 18\n" + "16 4 11 16 17 14 15 16 9 18 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 9 10 19 17 18 19 14 14 19 10 13 10 11 12 13\n" + "16 4 11 16 17 12 13 16 9 18 17 16 7 8 9 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 9 10 19 17 18 19 12 12 19 10 11 13 14 15 0\n" + "16 4 11 16 17 18 19 16 9 12 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 7 8 17 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 17 8 18 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 19 8 9 12 19 12 9 10 11 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 13 8 9 12 13 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 13 18 7 12 7 8 11 12 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 13 18 7 12 7 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 13 18 7 10 7 8 9 10 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 7 8 18 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 18 8 19 8 9 10 19 12 19 10 11 14 15 0 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 7 8 18 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 19 8 9 10 19 11 17 19 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 18 17 11 16 7 8 18 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 18 8 19 8 9 10 19 11 17 19 10 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 11 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 11 18 7 10 7 8 9 10 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 7 8 19 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 11 8 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 19 8 11 8 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 11 18 7 10 7 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 19 8 11 8 9 10 11 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 19 8 11 8 9 10 11 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 18 9 12 13 9 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 13 18 7 8 13 8 11 12 8 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 13 18 7 8 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 19 8 9 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 11 18 7 8 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 9 14 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 9 18 7 8 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 7 8 19 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 13 18 9 12 9 10 11 12 14 15 0 17\n" + "16 4 11 16 11 12 17 16 19 18 11 16 7 8 19 16 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 11 18 9 10 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 14 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 12 13 16 19 18 17 16 7 8 19 16 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 17 18 9 12 12 9 10 11 13 14 15 0\n" + "16 4 11 16 17 10 15 16 19 18 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 10 11 14 15 14 11 12 13\n" + "16 4 11 16 17 10 11 16 19 18 17 16 7 8 19 16 11 0 7 7 0 1 6 6 1 2 3 6 3 4 5 18 19 8 9 17 18 9 10 11 12 15 0 15 12 13 14\n" + "16 4 11 16 11 17 18 16 19 10 11 16 7 8 19 16 18 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 19 8 9 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 10 15 17 16 18 9 10 16 6 7 18 16 17 19 6 6 19 0 5 5 0 1 2 5 2 3 4 9 18 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 10 17 16 7 8 19 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 10 19 8 9 17 10 11 18 18 11 14 15 11 12 13 14\n" + "16 4 11 16 17 14 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 15 18 10 11 14 15 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 2 5 2 3 4 17 9 14 15 9 10 13 14 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 15 16 9 10 17 16 7 8 9 16 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 19 18 10 11 12 19 19 12 13 14 18 19 14 15\n" + "16 4 11 16 17 15 18 16 8 9 17 16 6 7 8 16 18 19 6 6 19 0 5 5 0 1 2 5 2 3 4 17 9 14 15 9 10 11 14 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 13 18 10 11 12 13 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 7 8 9 16 19 0 7 7 0 1 6 6 1 2 3 6 3 4 5 17 10 11 18 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 9 19 5 6 9 6 7 8 15 19 18 17 15 0 5 19 5 0 1 4 4 1 2 3\n" + "16 4 11 16 17 12 13 16 9 10 17 16 18 4 9 16 13 0 18 18 0 1 19 19 1 2 3 4 18 19 3 9 4 5 8 8 5 6 7 17 10 11 12 13 14 15 0\n" + "16 4 11 16 14 15 17 16 10 11 14 16 18 5 10 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 10 5 6 9 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 12 15 17 16 10 11 12 16 18 5 10 16 17 19 18 18 19 0 3 3 0 1 2 5 18 3 4 10 5 6 9 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 12 17 18 5 12 5 6 11 11 6 9 10 6 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 12 17 18 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 12 17 18 5 12 5 6 11 11 6 7 8 11 8 9 10\n" + "16 4 11 16 11 14 15 16 17 10 11 16 19 18 17 16 15 0 19 19 0 1 4 4 1 2 3 18 19 4 5 10 17 18 5 10 5 6 9 9 6 7 8 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 19 18 17 16 13 0 19 19 0 1 4 4 1 2 3 18 19 4 5 10 17 18 5 10 5 6 9 9 6 7 8 13 14 15 0\n" + "16 4 11 16 9 12 13 16 17 8 9 16 19 18 17 16 13 0 19 19 0 1 4 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 9 10 11 12 13 14 15 0\n" + "16 4 11 16 9 10 11 16 17 8 9 16 19 18 17 16 11 0 19 19 0 1 4 4 1 2 3 18 19 4 5 8 17 18 5 8 5 6 7 11 12 15 0 15 12 13 14\n" + "16 4 11 16 7 10 11 16 17 6 7 16 19 18 17 16 11 0 19 19 0 1 4 4 1 2 3 18 19 4 5 6 17 18 5 7 8 9 10 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 18 15 16 11 12 17 16 5 6 11 16 15 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 17 12 19 18 12 13 14 19 18 19 14 15\n" + "16 4 11 16 17 18 19 16 11 12 17 16 5 6 11 16 19 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 17 12 15 18 12 13 14 15 18 15 0 19\n" + "16 4 11 16 17 15 18 16 10 11 17 16 4 5 10 16 18 19 4 4 19 0 3 3 0 1 2 10 5 6 9 9 6 7 8 17 11 14 15 11 12 13 14 15 0 19 18\n" + "16 4 11 16 17 18 19 16 11 12 17 16 5 6 11 16 19 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 14 15 17 16 12 13 14 16 6 7 12 16 17 18 6 6 18 19 5 5 19 3 4 12 7 8 11 11 8 9 10 15 19 18 17 15 0 3 19 3 0 1 2\n" + "16 4 11 16 17 14 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 15 16 9 10 17 16 5 6 9 16 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 19 18 10 11 14 19 14 11 12 13 18 19 14 15\n" + "16 4 11 16 17 18 19 16 9 10 17 16 5 6 9 16 19 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 15 18 10 11 14 15 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 15 18 16 8 9 17 16 4 5 8 16 18 19 4 4 19 0 3 3 0 1 2 8 5 6 7 17 9 14 15 9 10 13 14 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 15 18 16 8 9 17 16 4 5 8 16 18 19 4 4 19 0 3 3 0 1 2 8 5 6 7 17 9 14 15 9 10 11 14 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 18 19 16 9 10 17 16 5 6 9 16 19 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 13 18 10 11 12 13 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 5 6 9 16 19 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 9 10 17 16 5 6 9 16 19 0 5 5 0 1 4 4 1 2 3 9 6 7 8 17 10 11 18 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 12 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 17 12 13 18 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 7 8 19 17 18 19 14 14 19 8 13 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 18 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 18 7 8 19 17 18 19 14 14 19 8 13 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 12 13 16 7 18 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 18 7 8 19 17 18 19 12 12 19 8 11 8 9 10 11 13 14 15 0\n" + "16 4 11 16 17 10 11 16 7 18 17 16 5 6 7 16 11 0 5 5 0 1 4 4 1 2 3 18 7 8 19 17 18 19 10 10 19 8 9 11 12 15 0 15 12 13 14\n" + "16 4 11 16 17 18 19 16 7 10 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 10 11 18 18 11 14 15 11 12 13 14 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 10 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 10 7 8 9 17 10 11 18 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 18 6 7 19 18 19 7 10 11 7 8 9 10 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 17 18 6 19 6 7 12 19 12 7 10 11 7 8 9 10 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 13 6 7 12 13 12 7 10 11 7 8 9 10 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 12 5 6 11 12 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 11 6 7 18 11 18 7 8 19 19 8 9 10 11 18 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 18 6 7 19 18 19 7 8 11 11 8 9 10 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 17 18 6 19 6 7 12 19 12 7 8 11 11 8 9 10 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 13 6 7 12 13 12 7 8 11 11 8 9 10 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 12 5 6 11 12 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 18 6 7 19 18 19 7 8 9 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 13 6 7 12 13 12 7 8 9 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 12 5 6 11 12 11 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 12 5 6 9 12 9 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 18 12 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 12 18 6 11 6 7 19 11 19 7 8 9 11 19 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 11 6 7 19 11 19 7 8 9 11 19 9 10 14 15 0 17\n" + "16 4 11 16 11 14 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 18 6 7 19 18 19 7 8 9 10 18 19 9 11 12 13 14\n" + "16 4 11 16 11 12 15 16 17 10 11 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 10 17 6 18 6 7 19 18 19 7 8 9 10 18 19 9 12 13 14 15\n" + "16 4 11 16 11 12 13 16 17 10 11 16 5 6 17 16 13 0 5 5 0 1 4 4 1 2 3 10 17 6 18 6 7 19 18 19 7 8 9 10 18 19 9 13 14 15 0\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 18 11 12 13 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 10 5 6 9 10 9 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 19 6 7 10 19 10 7 8 9 12 19 10 11 14 15 0 17\n" + "16 4 11 16 11 12 15 16 18 17 11 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 17 18 6 19 6 7 10 19 10 7 8 9 11 17 19 10 12 13 14 15\n" + "16 4 11 16 11 12 13 16 18 17 11 16 5 6 18 16 13 0 5 5 0 1 4 4 1 2 3 17 18 6 19 6 7 10 19 10 7 8 9 11 17 19 10 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 11 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 11 18 5 10 5 6 9 10 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 11 6 7 10 11 10 7 8 9 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 12 19 6 11 6 7 10 11 10 7 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 11 18 5 10 5 6 9 10 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 12 19 6 11 6 7 10 11 10 7 8 9 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 12 19 6 11 6 7 10 11 10 7 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 12 5 6 7 12 12 7 10 11 7 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 12 5 6 7 12 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 11 18 5 10 5 6 7 10 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 19 12 13 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 12 19 6 11 6 7 8 11 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 11 18 5 10 5 6 7 10 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 18 15 16 19 12 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 12 19 6 11 6 7 8 11 11 8 9 10 17 12 13 18 18 13 14 15\n" + "16 4 11 16 17 14 18 16 19 12 17 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 12 19 6 11 6 7 8 11 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 18 9 10 13 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 8 5 6 7 8 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 18 9 10 11 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 12 19 6 9 6 7 8 9 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 11 18 5 8 5 6 7 8 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 19 6 7 8 19 12 19 8 11 8 9 10 11 14 15 0 17\n" + "16 4 11 16 11 14 17 16 18 10 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 10 18 6 19 6 7 8 19 10 19 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 11 12 17 16 18 10 11 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 10 18 6 19 6 7 8 19 10 19 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 14 15 17 16 18 9 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 9 18 5 8 5 6 7 8 14 9 10 13 13 10 11 12 15 0 19 17\n" + "16 4 11 16 11 12 17 16 19 18 11 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 11 18 9 10 12 15 0 17 12 13 14 15\n" + "16 4 11 16 17 10 11 16 19 18 17 16 5 6 19 16 11 0 5 5 0 1 4 4 1 2 3 18 19 6 9 6 7 8 9 17 18 9 10 11 12 15 0 15 12 13 14\n" + "16 4 11 16 11 17 18 16 19 10 11 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 10 19 6 9 6 7 8 9 11 12 15 17 15 12 13 14 17 15 0 18\n" + "16 4 11 16 10 15 17 16 18 9 10 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 9 18 5 8 5 6 7 8 10 11 14 15 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 5 6 17 16 15 0 5 5 0 1 4 4 1 2 3 12 17 6 7 12 7 18 11 7 8 19 18 19 8 9 10 11 18 19 10\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 12 13 7 8 11 12 11 8 9 10 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 6 13 6 11 12 6 7 10 11 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 6 13 6 11 12 6 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 10 13 7 8 9 10 13 10 11 12 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 6 13 6 9 12 6 7 8 9 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 12 18 6 7 12 7 19 11 7 8 9 19 11 19 9 10 14 15 0 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 17 18 11 14 14 11 12 13\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 10 11 7 8 9 10 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 12 19 6 7 12 7 10 11 7 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 11 18 5 6 11 6 9 10 6 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 6 13 6 7 12 12 7 10 11 7 8 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 13 13 8 9 12 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 6 13 6 7 12 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 13 18 5 6 13 6 7 12 12 7 8 9 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 12 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 11 11 8 9 10 17 18 11 12 12 13 14 15\n" + "16 4 11 16 17 12 13 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 11 11 8 9 10 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 5 6 19 16 18 0 5 5 0 1 4 4 1 2 3 12 19 6 7 12 7 8 11 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 4 5 18 16 17 19 4 4 19 0 3 3 0 1 2 11 18 5 6 11 6 7 10 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 17 18 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 12 13 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 17 18 9 12 12 9 10 11 13 14 15 0\n" + "16 4 11 16 17 10 11 16 19 18 17 16 5 6 19 16 11 0 5 5 0 1 4 4 1 2 3 18 19 6 7 18 7 8 9 17 18 9 10 11 12 15 0 15 12 13 14\n" + "16 4 11 16 9 10 17 16 19 18 9 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 18 19 6 7 9 18 7 8 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 4 11 16 9 10 17 16 19 18 9 16 5 6 19 16 17 0 5 5 0 1 4 4 1 2 3 18 19 6 7 9 18 7 8 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 5 6 19 16 15 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 14 14 7 8 13 13 8 9 10 13 10 11 12\n" + "16 4 11 16 17 12 13 16 19 18 17 16 5 6 19 16 13 0 5 5 0 1 4 4 1 2 3 18 19 6 7 17 18 7 12 12 7 8 11 11 8 9 10 13 14 15 0\n" + "16 4 11 16 17 14 15 16 18 8 17 16 5 6 18 16 15 0 5 5 0 1 4 4 1 2 3 8 18 6 7 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 9 10 17 16 18 8 9 16 5 6 18 16 17 0 5 5 0 1 4 4 1 2 3 8 18 6 7 10 15 0 17 10 11 19 15 19 11 12 13 15 19 13 14\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 18 14 8 9 19 18 19 9 12 13 9 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 19 18 8 9 14 19 14 9 12 13 9 10 11 12 18 19 14 15\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 8 15 18 8 9 14 15 14 9 12 13 9 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 17 7 14 15 7 8 13 14 13 8 11 12 8 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 13 14 8 9 18 13 18 9 10 19 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 18 14 8 9 19 18 19 9 10 13 13 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 19 18 8 9 14 19 14 9 10 13 13 10 11 12 18 19 14 15\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 8 15 18 8 9 14 15 14 9 10 13 13 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 17 7 14 15 7 8 13 14 13 8 9 12 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 18 14 8 9 19 18 19 9 10 11 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 8 15 18 8 9 14 15 14 9 10 11 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 17 7 14 15 7 8 13 14 13 8 9 10 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 17 7 14 15 7 8 11 14 11 8 9 10 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 14 18 16 7 8 17 16 5 6 7 16 18 0 5 5 0 1 4 4 1 2 3 17 8 13 14 8 9 19 13 19 9 10 11 13 19 11 12 14 15 0 18\n" + "16 4 11 16 17 12 13 16 7 8 17 16 5 6 7 16 13 0 5 5 0 1 4 4 1 2 3 17 8 18 12 8 9 19 18 19 9 10 11 12 18 19 11 13 14 15 0\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 8 13 18 8 9 12 13 12 9 10 11 18 13 14 15 18 15 0 19\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 8 13 18 8 9 12 13 12 9 10 11 18 13 14 19 19 14 15 0\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 17 7 14 15 7 8 9 14 14 9 12 13 9 10 11 12 15 0 19 18\n" + "16 4 11 16 17 15 18 16 6 7 17 16 4 5 6 16 18 19 4 4 19 0 3 3 0 1 2 17 7 14 15 7 8 9 14 14 9 10 13 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 8 11 18 8 9 10 11 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 17 14 15 16 7 8 17 16 5 6 7 16 15 0 5 5 0 1 4 4 1 2 3 17 8 9 14 14 9 18 13 9 10 19 18 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 18 19 16 7 8 17 16 5 6 7 16 19 0 5 5 0 1 4 4 1 2 3 17 8 9 18 18 9 12 15 9 10 11 12 15 12 13 14 18 15 0 19\n" + "16 4 11 16 9 10 17 16 7 8 9 16 5 6 7 16 17 0 5 5 0 1 4 4 1 2 3 10 15 0 17 10 11 18 15 18 11 12 19 19 12 13 14 15 18 19 14\n" + "16 4 11 16 8 9 17 16 6 7 8 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 9 0 19 17 9 10 15 0 15 10 13 14 10 11 12 13\n" + "16 4 11 16 8 9 17 16 6 7 8 16 18 3 6 16 17 19 18 18 19 0 1 3 18 1 2 6 3 4 5 9 0 19 17 9 10 15 0 15 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 12 17 18 3 12 3 4 11 11 4 9 10 4 5 8 9 8 5 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 12 17 18 3 12 3 4 11 11 4 9 10 4 5 6 9 9 6 7 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 12 17 18 3 12 3 4 11 11 4 7 10 4 5 6 7 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 12 17 18 3 12 3 4 11 11 4 7 8 4 5 6 7 11 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 12 17 18 3 12 3 4 11 11 4 5 10 10 5 8 9 5 6 7 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 19 0 1 2 18 19 2 3 12 17 18 3 12 3 4 11 11 4 5 10 10 5 6 9 9 6 7 8\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 19 5 10 7 8 9 14 11 12 13 15 19 18 17 15 0 5 19 5 0 3 4 0 1 2 3\n" + "16 4 11 16 14 15 17 16 10 11 14 16 6 7 10 16 17 18 6 6 18 19 5 10 7 8 9 14 11 12 13 15 19 18 17 15 0 5 19 5 0 1 4 4 1 2 3\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 18 14 8 9 19 18 19 9 12 13 9 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 19 16 7 8 17 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 8 15 18 8 9 14 15 14 9 12 13 9 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 6 7 17 16 2 3 6 16 18 19 2 2 19 0 1 6 3 4 5 17 7 14 15 7 8 13 14 13 8 11 12 8 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 13 14 8 9 18 13 18 9 10 19 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 18 14 8 9 19 18 19 9 10 13 13 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 19 16 7 8 17 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 8 15 18 8 9 14 15 14 9 10 13 13 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 6 7 17 16 2 3 6 16 18 19 2 2 19 0 1 6 3 4 5 17 7 14 15 7 8 13 14 13 8 9 12 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 18 14 8 9 19 18 19 9 10 11 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 19 16 7 8 17 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 8 15 18 8 9 14 15 14 9 10 11 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 15 18 16 6 7 17 16 2 3 6 16 18 19 2 2 19 0 1 6 3 4 5 17 7 14 15 7 8 13 14 13 8 9 10 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 15 18 16 6 7 17 16 2 3 6 16 18 19 2 2 19 0 1 6 3 4 5 17 7 14 15 7 8 11 14 11 8 9 10 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 14 18 16 7 8 17 16 3 4 7 16 18 0 3 3 0 1 2 7 4 5 6 17 8 13 14 8 9 19 13 19 9 10 11 13 19 11 12 14 15 0 18\n" + "16 4 11 16 17 12 13 16 7 8 17 16 3 4 7 16 13 0 3 3 0 1 2 7 4 5 6 17 8 18 12 8 9 19 18 19 9 10 11 12 18 19 11 13 14 15 0\n" + "16 4 11 16 17 15 18 16 6 7 17 16 2 3 6 16 18 19 2 2 19 0 1 6 3 4 5 17 7 14 15 7 8 9 14 14 9 12 13 9 10 11 12 15 0 19 18\n" + "16 4 11 16 17 15 18 16 6 7 17 16 2 3 6 16 18 19 2 2 19 0 1 6 3 4 5 17 7 14 15 7 8 9 14 14 9 10 13 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 18 19 16 7 8 17 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 8 11 18 8 9 10 11 18 11 12 15 15 12 13 14 18 15 0 19\n" + "16 4 11 16 17 14 15 16 7 8 17 16 3 4 7 16 15 0 3 3 0 1 2 7 4 5 6 17 8 9 14 14 9 18 13 9 10 19 18 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 18 19 16 7 8 17 16 3 4 7 16 19 0 3 3 0 1 2 7 4 5 6 17 8 9 18 18 9 12 15 9 10 11 12 15 12 13 14 18 15 0 19\n" + "16 4 11 16 9 10 17 16 7 8 9 16 3 4 7 16 17 0 3 3 0 1 2 7 4 5 6 10 15 0 17 10 11 18 15 18 11 12 19 19 12 13 14 15 18 19 14\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 12 9 10 11 15 19 18 17 15 0 7 19 7 0 5 6 0 1 4 5 4 1 2 3\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 12 9 10 11 15 19 18 17 15 0 7 19 7 0 5 6 0 1 2 5 5 2 3 4\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 12 9 10 11 15 19 18 17 15 0 7 19 7 0 3 6 0 1 2 3 6 3 4 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 12 9 10 11 15 19 18 17 15 0 7 19 7 0 1 6 6 1 4 5 1 2 3 4\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 12 9 10 11 15 19 18 17 15 0 7 19 7 0 1 6 6 1 2 5 5 2 3 4\n" + "16 4 11 16 14 15 17 16 12 13 14 16 8 9 12 16 17 18 8 8 18 19 7 12 9 10 11 15 19 18 17 15 0 7 19 7 0 1 6 6 1 2 3 6 3 4 5\n" + "16 4 11 16 8 9 17 16 6 7 8 16 2 3 6 16 17 18 2 2 18 0 1 6 3 4 5 9 0 18 17 9 10 15 0 15 10 19 14 10 11 12 19 14 19 12 13\n" +; + +const char* data_dqrgl_block26 = + "16 4 11 16 8 9 17 16 6 7 8 16 2 3 6 16 17 18 2 2 18 0 1 6 3 4 5 9 0 18 17 9 10 15 0 15 10 11 19 19 11 12 13 15 19 13 14\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 17 18 6 6 18 19 5 11 8 9 10 14 11 12 13 15 19 18 17 15 0 5 19 5 0 3 4 0 1 2 3\n" + "16 4 11 16 14 15 17 16 8 11 14 16 6 7 8 16 17 18 6 6 18 19 5 11 8 9 10 14 11 12 13 15 19 18 17 15 0 5 19 5 0 1 4 4 1 2 3\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 7 17 18 7 14 14 7 8 13 13 8 19 12 8 9 10 19 12 19 10 11\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 7 17 18 7 14 14 7 8 13 13 8 9 19 19 9 10 11 13 19 11 12\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 19 17 18 19 14 14 19 6 13 6 7 12 13 12 7 10 11 7 8 9 10\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 19 17 18 19 14 14 19 6 13 6 7 12 13 12 7 8 11 11 8 9 10\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 19 17 18 19 14 14 19 6 13 6 7 12 13 12 7 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 19 17 18 19 14 14 19 6 13 6 7 10 13 10 7 8 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 19 17 18 19 14 14 19 6 13 6 7 8 13 13 8 11 12 8 9 10 11\n" + "16 4 11 16 17 14 15 16 5 18 17 16 3 4 5 16 15 0 3 3 0 1 2 18 5 6 19 17 18 19 14 14 19 6 13 6 7 8 13 13 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 5 8 17 16 3 4 5 16 15 0 3 3 0 1 2 8 5 6 7 17 8 9 14 14 9 18 13 9 10 19 18 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 18 19 16 5 8 17 16 3 4 5 16 19 0 3 3 0 1 2 8 5 6 7 17 8 9 18 18 9 12 15 9 10 11 12 15 12 13 14 18 15 0 19\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 18 9 5 6 19 18 19 6 7 8 9 18 19 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 10 11 5 6 9 10 9 6 7 8 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 19 4 5 12 19 12 5 10 11 5 6 9 10 9 6 7 8 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 10 11 5 6 9 10 9 6 7 8 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 9 10 4 5 8 9 8 5 6 7 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 10 11 5 6 7 10 10 7 8 9 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 19 4 5 12 19 12 5 10 11 5 6 7 10 10 7 8 9 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 10 11 5 6 7 10 10 7 8 9 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 9 10 4 5 6 9 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 8 19 5 6 7 8 19 8 9 10 11 18 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 8 11 5 6 7 8 11 8 9 10 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 19 4 5 12 19 12 5 8 11 5 6 7 8 11 8 9 10 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 8 11 5 6 7 8 11 8 9 10 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 7 10 4 5 6 7 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 19 18 5 6 7 19 18 19 7 8 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 19 9 5 6 7 19 9 19 7 8 11 18 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 10 18 10 5 19 9 5 6 7 19 9 19 7 8 12 18 10 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 11 4 5 10 11 10 5 19 9 5 6 7 19 9 19 7 8 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 19 9 5 6 7 19 9 19 7 8 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 19 9 5 6 7 19 9 19 7 8 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 8 9 5 6 7 8 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 8 9 5 6 7 8 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 7 8 4 5 6 7 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 9 12 9 4 7 8 4 5 6 7 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 19 11 19 5 8 9 5 6 7 8 11 19 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 19 11 19 5 8 9 5 6 7 8 11 19 9 10 14 15 0 17\n" + "16 4 11 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 18 4 5 19 18 19 5 8 9 5 6 7 8 10 18 19 9 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 18 4 5 19 18 19 5 8 9 5 6 7 8 10 18 19 9 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 10 3 4 9 10 9 4 7 8 4 5 6 7 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 19 4 5 10 19 10 5 8 9 5 6 7 8 12 19 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 7 8 4 5 6 7 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 3 4 19 16 17 0 3 3 0 1 2 18 19 4 11 4 5 10 11 10 5 8 9 5 6 7 8 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 12 13 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 11 4 5 10 11 10 5 8 9 5 6 7 8 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 10 11 10 5 8 9 5 6 7 8 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 7 8 4 5 6 7 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 19 12 17 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 10 11 10 5 8 9 5 6 7 8 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 7 8 4 5 6 7 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 6 19 19 6 9 10 6 7 8 9 11 18 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 6 11 11 6 9 10 6 7 8 9 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 19 4 5 12 19 12 5 6 11 11 6 9 10 6 7 8 9 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 6 11 11 6 9 10 6 7 8 9 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 5 10 10 5 8 9 5 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 10 11 10 5 6 18 18 6 7 19 19 7 8 9 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 6 19 19 6 7 10 10 7 8 9 11 18 19 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 6 11 11 6 7 10 10 7 8 9 12 18 19 11\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 19 4 5 12 19 12 5 6 11 11 6 7 10 10 7 8 9 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 6 11 11 6 7 10 10 7 8 9 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 5 10 10 5 6 9 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 18 11 18 5 6 19 19 6 7 8 19 8 9 10 11 18 19 10\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 19 4 5 12 19 12 5 6 11 11 6 7 8 11 8 9 10 13 17 19 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 6 11 11 6 7 8 11 8 9 10 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 5 10 10 5 6 7 10 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 6 9 9 6 7 8 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 6 9 9 6 7 8 12 9 10 11 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 5 8 8 5 6 7 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 18 17 13 16 3 4 18 16 15 0 3 3 0 1 2 17 18 4 11 4 5 10 11 10 5 6 19 19 6 7 8 10 19 8 9 13 17 11 12\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 6 19 19 6 7 8 10 19 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 10 11 10 5 6 19 19 6 7 8 10 19 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 10 13 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 18 9 18 5 6 19 19 6 7 8 9 18 19 8 13 10 11 12\n" + "16 4 11 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 9 4 5 18 9 18 5 6 19 19 6 7 8 9 18 19 8 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 9 4 5 18 9 18 5 6 19 19 6 7 8 9 18 19 8 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 9 12 9 4 5 8 8 5 6 7 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 19 11 19 5 6 9 9 6 7 8 11 19 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 19 11 19 5 6 9 9 6 7 8 11 19 9 10 14 15 0 17\n" + "16 4 11 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 18 4 5 19 18 19 5 6 9 9 6 7 8 10 18 19 9 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 10 3 4 9 10 9 4 5 8 8 5 6 7 13 10 11 12 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 19 4 5 10 19 10 5 6 9 9 6 7 8 12 19 10 11 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 5 8 8 5 6 7 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 3 4 19 16 17 0 3 3 0 1 2 18 19 4 11 4 5 10 11 10 5 6 9 9 6 7 8 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 12 13 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 11 4 5 10 11 10 5 6 9 9 6 7 8 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 10 11 10 5 6 9 9 6 7 8 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 5 8 8 5 6 7 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 19 12 17 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 10 11 10 5 6 9 9 6 7 8 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 5 8 8 5 6 7 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 6 7 19 7 10 11 7 8 9 10 12 18 19 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 6 7 12 7 10 11 7 8 9 10 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 5 6 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 19 18 19 5 6 7 19 7 8 11 11 8 9 10 12 18 19 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 13 4 5 12 13 12 5 6 7 12 7 8 11 11 8 9 10 17 18 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 11 12 11 4 5 6 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 11 14 15 16 17 10 11 16 3 4 17 16 15 0 3 3 0 1 2 10 17 4 18 4 5 19 18 19 5 6 7 19 7 8 9 10 18 19 9 11 12 13 14\n" + "16 4 11 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 18 4 5 19 18 19 5 6 7 19 7 8 9 10 18 19 9 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 10 3 4 9 10 9 4 5 6 9 6 7 8 13 10 11 12 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 5 6 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 14 17 16 19 18 13 16 3 4 19 16 17 0 3 3 0 1 2 18 19 4 11 4 5 10 11 10 5 6 7 10 7 8 9 13 18 11 12 14 15 0 17\n" + "16 4 11 16 17 12 13 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 11 4 5 10 11 10 5 6 7 10 7 8 9 17 18 11 12 13 14 15 0\n" + "16 4 11 16 13 17 18 16 19 12 13 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 10 11 10 5 6 7 10 7 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 5 6 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 19 12 17 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 10 11 10 5 6 7 10 7 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 9 10 9 4 5 6 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 7 12 7 4 5 6 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 7 10 7 4 5 6 10 7 8 9 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 19 12 13 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 8 11 8 5 6 7 11 8 9 10 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 7 10 7 4 5 6 10 7 8 9 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 19 12 17 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 8 11 8 5 6 7 11 8 9 10 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 7 10 7 4 5 6 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 19 11 19 5 6 7 11 19 7 10 7 8 9 10 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 19 11 19 5 6 7 11 19 7 10 7 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 10 13 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 19 9 19 5 6 7 9 19 7 8 13 10 11 12 14 15 0 17\n" + "16 4 11 16 11 14 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 19 9 19 5 6 7 9 19 7 8 11 12 13 14 14 15 0 17\n" + "16 4 11 16 17 14 15 16 18 10 17 16 3 4 18 16 15 0 3 3 0 1 2 10 18 4 9 4 5 19 9 19 5 6 7 9 19 7 8 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 12 13 16 18 10 17 16 3 4 18 16 13 0 3 3 0 1 2 10 18 4 9 4 5 19 9 19 5 6 7 9 19 7 8 17 10 11 12 13 14 15 0\n" + "16 4 11 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 9 4 5 19 9 19 5 6 7 9 19 7 8 12 15 0 17 12 13 14 15\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 8 3 4 7 8 7 4 5 6 13 8 9 12 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 17 18 16 19 12 13 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 9 4 5 8 9 8 5 6 7 12 9 10 11 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 8 3 4 7 8 7 4 5 6 11 8 9 10 12 13 14 15 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 8 3 4 7 8 7 4 5 6 11 8 9 10 13 0 19 17 13 14 15 0\n" + "16 4 11 16 11 14 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 19 4 5 8 19 8 5 6 7 10 19 8 9 11 12 13 14 14 15 0 17\n" + "16 4 11 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 19 4 5 8 19 8 5 6 7 10 19 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 12 13 17 16 18 9 12 16 2 3 18 16 17 19 2 2 19 0 1 9 18 3 8 3 4 7 8 7 4 5 6 12 9 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 11 12 17 16 19 18 11 16 3 4 19 16 17 0 3 3 0 1 2 18 19 4 9 4 5 8 9 8 5 6 7 11 18 9 10 12 15 0 17 12 13 14 15\n" + "16 4 11 16 10 11 17 16 18 9 10 16 2 3 18 16 17 19 2 2 19 0 1 9 18 3 8 3 4 7 8 7 4 5 6 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 11 4 5 6 11 11 6 18 10 6 7 19 18 19 7 8 9 10 18 19 9\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 5 12 12 5 10 11 5 6 9 10 9 6 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 5 12 12 5 10 11 5 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 5 12 12 5 8 11 5 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 17 14 15 16 18 12 17 16 3 4 18 16 15 0 3 3 0 1 2 12 18 4 11 4 5 6 11 11 6 19 10 6 7 8 19 10 19 8 9 17 12 13 14\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 11 4 5 6 11 11 6 19 10 6 7 8 19 10 19 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 5 10 10 5 8 9 5 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 19 12 13 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 6 11 11 6 9 10 6 7 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 5 10 10 5 8 9 5 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 19 12 17 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 6 11 11 6 9 10 6 7 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 5 10 10 5 8 9 5 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 5 12 12 5 6 11 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 5 12 12 5 6 11 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 12 3 4 5 12 12 5 6 11 11 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 11 14 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 5 10 10 5 6 9 9 6 7 8 14 11 12 13 15 0 19 17\n" + "16 4 11 16 13 17 18 16 19 12 13 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 6 11 11 6 7 10 10 7 8 9 13 14 15 17 17 15 0 18\n" + "16 4 11 16 12 15 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 5 10 10 5 6 9 9 6 7 8 12 13 14 15 15 0 19 17\n" + "16 4 11 16 17 14 18 16 19 12 17 16 3 4 19 16 18 0 3 3 0 1 2 12 19 4 11 4 5 6 11 11 6 7 10 10 7 8 9 17 12 13 14 14 15 0 18\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 10 3 4 5 10 10 5 6 9 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 12 13 17 16 18 9 12 16 2 3 18 16 17 19 2 2 19 0 1 9 18 3 8 3 4 5 8 8 5 6 7 12 9 10 11 13 0 19 17 13 14 15 0\n" + "16 4 11 16 10 11 17 16 18 9 10 16 2 3 18 16 17 19 2 2 19 0 1 9 18 3 8 3 4 5 8 8 5 6 7 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 6 3 4 5 6 13 6 7 12 12 7 10 11 7 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 6 3 4 5 6 13 6 7 12 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 6 3 4 5 6 13 6 7 12 12 7 8 9 12 9 10 11 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 6 3 4 5 6 11 6 7 10 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 10 11 17 16 18 9 10 16 2 3 18 16 17 19 2 2 19 0 1 9 18 3 6 3 4 5 6 9 6 7 8 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 18 4 5 6 18 12 18 6 11 6 7 19 11 19 7 8 9 11 19 9 10\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 19 4 5 6 19 12 19 6 11 6 7 10 11 10 7 8 9 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 19 4 5 6 19 12 19 6 11 6 7 8 11 11 8 9 10 14 15 0 17\n" + "16 4 11 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 19 4 5 6 19 10 19 6 9 6 7 8 9 12 15 0 17 12 13 14 15\n" + "16 4 11 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 19 4 5 6 19 8 19 6 7 10 15 0 17 10 11 14 15 14 11 12 13\n" + "16 4 11 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 19 4 5 6 19 8 19 6 7 10 15 0 17 10 11 12 15 15 12 13 14\n" + "16 4 11 16 17 14 15 16 18 8 17 16 3 4 18 16 15 0 3 3 0 1 2 8 18 4 7 4 5 6 7 17 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 7 4 5 6 7 10 15 0 17 10 11 19 15 19 11 12 13 15 19 13 14\n" + "16 4 11 16 8 9 17 16 18 7 8 16 2 3 18 16 17 19 2 2 19 0 1 7 18 3 6 3 4 5 6 9 0 19 17 9 10 15 0 15 10 13 14 10 11 12 13\n" + "16 4 11 16 8 9 17 16 18 7 8 16 2 3 18 16 17 19 2 2 19 0 1 7 18 3 6 3 4 5 6 9 0 19 17 9 10 15 0 15 10 11 14 14 11 12 13\n" + "16 4 11 16 8 9 17 16 18 7 8 16 2 3 18 16 17 19 2 2 19 0 1 7 18 3 6 3 4 5 6 9 0 19 17 9 10 15 0 15 10 11 12 15 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 19 18 19 6 9 10 6 7 8 9 11 18 19 10\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 11 12 4 5 10 11 10 5 8 9 5 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 10 11 5 6 18 10 18 6 7 19 19 7 8 9 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 19 18 19 6 7 10 10 7 8 9 11 18 19 10\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 11 12 4 5 10 11 10 5 6 9 9 6 7 8 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 19 18 19 6 7 8 19 8 9 10 11 18 19 10\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 11 12 4 5 10 11 10 5 6 7 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 11 12 4 5 8 11 8 5 6 7 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 10 11 5 6 19 10 19 6 7 8 10 19 8 9 14 15 0 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 19 18 19 6 7 8 11 18 19 8 11 8 9 10\n" + "16 4 11 16 11 12 13 16 17 10 11 16 3 4 17 16 13 0 3 3 0 1 2 10 17 4 5 10 5 18 9 5 6 19 18 19 6 7 8 9 18 19 8 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 9 12 4 5 8 9 8 5 6 7 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 19 11 5 6 9 19 9 6 7 8 11 19 9 10 14 15 0 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 4 11 4 9 10 4 5 8 9 8 5 6 7 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 11 12 4 5 6 11 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 11 12 4 5 6 11 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 4 11 4 9 10 4 5 6 9 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 7 12 4 5 6 7 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 7 12 4 5 6 7 12 7 8 9 12 9 10 11 15 0 19 17\n" + "16 4 11 16 17 12 13 16 19 18 17 16 3 4 19 16 13 0 3 3 0 1 2 18 19 4 5 18 5 8 11 5 6 7 8 11 8 9 10 17 18 11 12 13 14 15 0\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 4 11 4 7 10 4 5 6 7 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 18 11 5 6 7 18 11 18 7 19 7 8 9 19 11 19 9 10\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 19 11 5 6 7 19 11 19 7 10 7 8 9 10 14 15 0 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 19 11 5 6 7 19 11 19 7 8 11 8 9 10 14 15 0 17\n" + "16 4 11 16 11 12 17 16 18 10 11 16 3 4 18 16 17 0 3 3 0 1 2 10 18 4 5 10 5 19 9 5 6 7 19 9 19 7 8 12 15 0 17 12 13 14 15\n" + "16 4 11 16 10 11 17 16 18 9 10 16 2 3 18 16 17 19 2 2 19 0 1 9 18 3 4 9 4 7 8 4 5 6 7 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 18 10 6 7 19 18 19 7 8 9 10 18 19 9\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 10 11 5 6 9 10 9 6 7 8 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 10 11 5 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 8 11 5 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 19 18 6 7 8 19 18 19 8 9 11 18 9 10\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 6 11 11 6 19 10 6 7 8 19 10 19 8 9 14 15 0 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 8 9 5 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 4 11 4 5 10 10 5 8 9 5 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 6 11 11 6 9 10 6 7 8 9 15 0 19 17\n" + "16 4 11 16 13 14 15 16 17 12 13 16 3 4 17 16 15 0 3 3 0 1 2 12 17 4 5 12 5 6 11 11 6 7 18 18 7 8 19 19 8 9 10 11 18 19 10\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 6 11 11 6 7 10 10 7 8 9 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 6 11 11 6 7 8 11 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 6 9 9 6 7 8 12 9 10 11 15 0 19 17\n" + "16 4 11 16 13 14 17 16 18 12 13 16 3 4 18 16 17 0 3 3 0 1 2 12 18 4 5 12 5 6 11 11 6 7 19 19 7 8 9 11 19 9 10 14 15 0 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 4 11 4 5 10 10 5 6 9 9 6 7 8 13 0 19 17 13 14 15 0\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 6 7 12 7 10 11 7 8 9 10 15 0 19 17\n" + "16 4 11 16 14 15 17 16 18 13 14 16 2 3 18 16 17 19 2 2 19 0 1 13 18 3 4 13 4 5 12 12 5 6 7 12 7 8 11 11 8 9 10 15 0 19 17\n" + "16 4 11 16 12 13 17 16 18 11 12 16 2 3 18 16 17 19 2 2 19 0 1 11 18 3 4 11 4 5 10 10 5 6 7 10 7 8 9 13 0 19 17 13 14 15 0\n" + "16 4 11 16 10 11 17 16 18 9 10 16 2 3 18 16 17 19 2 2 19 0 1 9 18 3 4 9 4 5 8 8 5 6 7 11 0 19 17 11 12 15 0 15 12 13 14\n" + "16 4 11 16 9 10 17 16 18 8 9 16 3 4 18 16 17 0 3 3 0 1 2 8 18 4 5 8 5 6 7 10 15 0 17 10 11 19 15 19 11 12 13 15 19 13 14\n" + "16 4 11 16 8 9 17 16 18 7 8 16 2 3 18 16 17 19 2 2 19 0 1 7 18 3 4 7 4 5 6 9 0 19 17 9 10 15 0 15 10 13 14 10 11 12 13\n" + "16 4 11 16 8 9 17 16 18 7 8 16 2 3 18 16 17 19 2 2 19 0 1 7 18 3 4 7 4 5 6 9 0 19 17 9 10 15 0 15 10 11 14 14 11 12 13\n" + "16 4 11 16 8 9 17 16 18 7 8 16 2 3 18 16 17 19 2 2 19 0 1 7 18 3 4 7 4 5 6 9 0 19 17 9 10 15 0 15 10 11 12 15 12 13 14\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 11 12 6 7 10 11 10 7 8 9\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 11 12 6 7 8 11 11 8 9 10\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 9 12 6 7 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 9 10 6 7 8 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 7 12 12 7 10 11 7 8 9 10\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 7 12 12 7 8 11 11 8 9 10\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 7 12 12 7 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 7 10 10 7 8 9 13 10 11 12\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 7 8 13 8 11 12 8 9 10 11\n" + "16 4 11 16 17 14 15 16 19 18 17 16 3 4 19 16 15 0 3 3 0 1 2 18 19 4 5 17 18 5 14 14 5 6 13 13 6 7 8 13 8 9 12 12 9 10 11\n" + "16 4 11 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 12 13 7 8 19 12 19 8 9 10 12 19 10 11\n" + "16 4 11 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 19 13 7 8 11 19 11 8 9 10 13 19 11 12\n" + "16 4 11 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 19 13 7 8 9 19 13 19 9 12 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 19 13 7 8 9 19 13 19 9 10 13 10 11 12\n" + "16 4 11 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 8 13 13 8 19 12 8 9 10 19 12 19 10 11\n" + "16 4 11 16 17 14 15 16 18 6 17 16 3 4 18 16 15 0 3 3 0 1 2 6 18 4 5 17 6 7 14 14 7 8 13 13 8 9 19 19 9 10 11 13 19 11 12\n" + "16 4 11 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 14 15 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 19 15 19 9 12 13 9 10 11 12 15 19 13 14\n" + "16 4 11 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 14 15 14 9 10 19 19 10 11 12 14 19 12 13\n" + "16 4 11 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 19 15 19 9 10 13 13 10 11 12 15 19 13 14\n" + "16 4 11 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 19 15 19 9 10 11 15 19 11 14 11 12 13 14\n" + "16 4 11 16 7 8 17 16 18 6 7 16 3 4 18 16 17 0 3 3 0 1 2 6 18 4 5 8 15 0 17 8 9 10 15 15 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 11 12 8 9 10 11 15 12 13 14\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 9 14 14 9 10 11 14 11 12 13\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 9 12 12 9 10 11 15 12 13 14\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 9 10 15 10 13 14 10 11 12 13\n" + "16 4 11 16 6 7 17 16 18 5 6 16 2 3 18 16 17 19 2 2 19 0 1 5 18 3 4 7 0 19 17 7 8 15 0 15 8 9 10 15 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 18 11 7 8 19 18 19 8 9 10 11 18 19 10\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 19 18 19 7 12 13 7 8 11 12 11 8 9 10 14 18 19 13\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 12 13 7 8 11 12 11 8 9 10 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 11 12 6 7 10 11 10 7 8 9 15 0 19 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 19 18 19 7 12 13 7 8 9 12 12 9 10 11 14 18 19 13\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 12 13 7 8 9 12 12 9 10 11 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 11 12 6 7 8 11 11 8 9 10 15 0 19 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 10 19 7 8 9 10 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 19 18 19 7 10 13 7 8 9 10 13 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 10 13 7 8 9 10 13 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 9 12 6 7 8 9 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 19 18 7 8 9 19 18 19 9 10 12 18 10 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 19 11 7 8 9 19 11 19 9 10 13 18 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 12 18 12 7 19 11 7 8 9 19 11 19 9 10 14 18 12 13\n" + "16 4 11 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 19 11 7 8 9 19 11 19 9 10 14 15 0 18\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 10 11 7 8 9 10 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 9 10 6 7 8 9 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 11 14 11 6 9 10 6 7 8 9 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 19 13 19 7 10 11 7 8 9 10 13 19 11 12 14 15 0 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 8 19 19 8 11 12 8 9 10 11 13 18 19 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 19 18 19 7 8 13 13 8 11 12 8 9 10 11 14 18 19 13\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 8 13 13 8 11 12 8 9 10 11 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 7 12 12 7 10 11 7 8 9 10 15 0 19 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 8 18 18 8 9 19 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 8 19 19 8 9 12 12 9 10 11 13 18 19 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 19 18 19 7 8 13 13 8 9 12 12 9 10 11 14 18 19 13\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 8 13 13 8 9 12 12 9 10 11 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 7 12 12 7 8 11 11 8 9 10 15 0 19 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 18 13 18 7 8 19 19 8 9 10 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 8 13 13 8 9 10 13 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 7 12 12 7 8 9 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 19 18 19 7 8 11 11 8 9 10 19 11 12 13 14 18 19 13\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 8 11 11 8 9 10 14 11 12 13 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 7 10 10 7 8 9 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 12 13 12 7 8 19 19 8 9 10 12 19 10 11 14 15 0 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 11 14 11 6 7 10 10 7 8 9 14 11 12 13 15 0 19 18\n" + "16 4 11 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 19 13 19 7 8 11 11 8 9 10 13 19 11 12 14 15 0 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 19 18 19 7 8 9 19 9 12 13 9 10 11 12 14 18 19 13\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 8 9 14 9 12 13 9 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 7 8 13 8 11 12 8 9 10 11 15 0 19 18\n" + "16 4 11 16 17 18 19 16 5 6 17 16 3 4 5 16 19 0 3 3 0 1 2 17 6 15 18 6 7 14 15 14 7 8 9 14 9 10 13 13 10 11 12 18 15 0 19\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 13 14 13 6 7 8 13 8 9 12 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 9 14 9 6 7 8 14 9 10 13 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 19 13 19 7 8 9 13 19 9 12 9 10 11 12 14 15 0 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 13 14 6 7 8 13 13 8 18 12 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 7 14 14 7 12 13 7 8 11 12 11 8 9 10 15 0 19 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 7 14 14 7 12 13 7 8 9 12 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 7 14 14 7 10 13 7 8 9 10 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 14 18 16 5 6 17 16 3 4 5 16 18 0 3 3 0 1 2 17 6 13 14 6 7 8 13 13 8 19 12 8 9 10 19 12 19 10 11 14 15 0 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 7 14 14 7 8 13 13 8 11 12 8 9 10 11 15 0 19 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 7 14 14 7 8 13 13 8 9 12 12 9 10 11 15 0 19 18\n" + "16 4 11 16 17 15 18 16 4 5 17 16 2 3 4 16 18 19 2 2 19 0 1 17 5 14 15 5 6 7 14 14 7 8 13 13 8 9 10 13 10 11 12 15 0 19 18\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 18 14 6 7 8 18 14 18 8 13 8 9 19 13 19 9 10 11 13 19 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 19 18 19 8 11 12 8 9 10 11 13 18 19 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 12 13 7 8 18 12 18 8 9 19 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 19 18 19 8 9 12 12 9 10 11 13 18 19 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 19 18 19 8 9 10 19 10 11 12 13 18 19 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 19 18 19 8 9 10 13 18 19 10 13 10 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 18 13 7 8 9 18 13 18 9 19 9 10 11 19 13 19 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 18 12 8 9 19 18 19 9 10 11 12 18 19 11\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 19 18 8 9 10 19 18 19 10 11 13 18 11 12\n" + "16 4 11 16 17 14 15 16 5 6 17 16 3 4 5 16 15 0 3 3 0 1 2 17 6 7 14 14 7 8 13 13 8 9 18 18 9 10 19 19 10 11 12 13 18 19 12\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 18 13 9 10 19 18 19 10 11 12 13 18 19 12\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 12 19 9 10 11 12 19 12 13 14 15 18 19 14\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 19 18 9 10 11 19 18 19 11 12 14 18 12 13\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 19 13 9 10 11 19 13 19 11 12 15 18 13 14\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 10 19 19 10 13 14 10 11 12 13 15 18 19 14\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 14 15 14 9 10 18 18 10 11 19 19 11 12 13 14 18 19 13\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 10 19 19 10 11 14 14 11 12 13 15 18 19 14\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 18 15 18 9 10 19 19 10 11 12 19 12 13 14 15 18 19 14\n" + "16 4 11 16 7 8 17 16 5 6 7 16 3 4 5 16 17 0 3 3 0 1 2 8 15 0 17 8 9 10 15 15 10 18 14 10 11 19 18 19 11 12 13 14 18 19 13\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6\n" + "16 4 11 16 14 15 17 16 12 13 14 16 10 11 12 16 17 18 10 10 18 19 9 15 19 18 17 15 0 9 19 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 13 14 8 9 19 13 19 9 10 11 13 19 11 12\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 19 14 8 9 12 19 12 9 10 11 14 19 12 13\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 11 19 8 9 10 11 19 11 12 13 15 19 13 14\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 19 14 8 9 10 19 14 19 10 13 10 11 12 13\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 19 14 8 9 10 19 14 19 10 11 14 11 12 13\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 19 12 8 9 10 19 12 19 10 11 15 12 13 14\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 14 14 9 19 13 9 10 11 19 13 19 11 12\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 19 19 9 12 13 9 10 11 12 15 19 13 14\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 14 14 9 10 19 19 10 11 12 14 19 12 13\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 19 19 9 10 13 13 10 11 12 15 19 13 14\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 19 19 9 10 11 15 19 11 14 11 12 13 14\n" + "16 4 11 16 6 7 17 16 4 5 6 16 2 3 4 16 17 18 2 2 18 0 1 7 0 18 17 7 8 15 0 15 8 9 10 15 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 19 18 19 2 5 6 2 3 4 5 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 19 18 19 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 19 19 3 4 5 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 19 18 19 2 3 6 6 3 4 5 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 19 18 19 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 19 18 19 2 3 4 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 19 18 19 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 19 18 19 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 9 18 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 6 7 1 2 19 6 19 2 3 4 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 19 18 19 2 3 4 7 18 19 4 7 4 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 8 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 6 9 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 9 6 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 18 5 1 2 19 18 19 2 3 4 5 18 19 4 10 7 8 9\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 6 19 1 2 5 6 5 2 3 4 19 6 7 8 9 18 19 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 19 18 19 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 19 18 1 2 5 19 5 2 3 4 18 19 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 9 18 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 7 1 2 5 19 5 2 3 4 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 6 7 1 2 5 6 5 2 3 4 9 19 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 6 7 1 2 5 6 5 2 3 4 9 19 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 19 0 1 8 19 8 1 6 7 1 2 5 6 5 2 3 4 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 19 18 19 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 19 18 19 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 10 18 19 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 6 7 1 2 3 6 6 3 4 5 9 19 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 6 7 1 2 3 6 6 3 4 5 9 19 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 19 0 1 8 19 8 1 6 7 1 2 3 6 6 3 4 5 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 4 18 1 2 3 4 18 4 5 19 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 4 19 1 2 3 4 19 4 5 8 8 5 6 7 9 18 19 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 4 19 1 2 3 4 19 4 5 6 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 4 7 1 2 3 4 7 4 5 6 9 19 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 4 7 1 2 3 4 7 4 5 6 9 19 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 19 0 1 8 19 8 1 4 7 1 2 3 4 7 4 5 6 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 18 7 1 2 3 18 7 18 3 19 3 4 5 19 7 19 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 19 18 1 2 3 19 18 19 3 6 3 4 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 9 18 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 7 1 2 3 19 7 19 3 6 3 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 7 1 2 3 19 7 19 3 4 7 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 19 5 1 2 3 19 5 19 3 4 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 19 18 1 2 3 19 18 19 3 4 8 18 4 7 4 5 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 19 18 1 2 3 19 18 19 3 4 6 18 4 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 6 9 6 1 19 5 1 2 3 19 5 19 3 4 9 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 6 9 6 1 19 5 1 2 3 19 5 19 3 4 9 6 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 7 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 19 5 1 2 3 19 5 19 3 4 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 4 5 1 2 3 4 10 5 8 9 5 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 4 5 1 2 3 4 10 5 6 9 9 6 7 8 12 17 18 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 4 5 1 2 3 4 9 19 5 8 5 6 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 4 5 1 2 3 4 9 19 5 8 5 6 7 8 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 4 5 1 2 3 4 7 19 5 6 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 19 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 19 0 1 6 19 6 1 4 5 1 2 3 4 8 19 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 8 19 0 7 0 1 6 7 6 1 4 5 1 2 3 4 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 4 5 1 2 3 4 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 18 6 2 3 19 18 19 3 4 5 6 18 19 5\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 19 19 2 7 8 2 3 6 7 6 3 4 5 9 18 19 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 19 19 2 7 8 2 3 4 7 7 4 5 6 9 18 19 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 5 19 2 3 4 5 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 19 19 2 5 8 2 3 4 5 8 5 6 7 9 18 19 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 19 18 2 3 4 19 18 19 4 5 7 18 5 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 19 6 2 3 4 19 6 19 4 5 8 18 6 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 9 18 7 8\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 5 6 2 3 4 5 9 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 7 7 2 5 6 2 3 4 5 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 19 19 2 5 6 2 3 4 5 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 7 7 2 5 6 2 3 4 5 9 19 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 7 7 2 5 6 2 3 4 5 9 19 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 19 0 1 8 19 8 1 2 7 7 2 5 6 2 3 4 5 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 3 19 19 3 6 7 3 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 19 19 2 3 8 8 3 6 7 3 4 5 6 9 18 19 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 7 7 2 3 18 18 3 4 19 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 3 19 19 3 4 7 7 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 19 19 2 3 8 8 3 4 7 7 4 5 6 9 18 19 8\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 18 18 2 3 19 19 3 4 5 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 18 0 1 8 18 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 10 18 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 7 7 2 3 19 19 3 4 5 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 7 0 1 6 7 6 1 2 18 18 2 3 19 19 3 4 5 6 18 19 5 10 7 8 9\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 19 19 2 3 6 6 3 4 5 8 19 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 7 7 2 3 6 6 3 4 5 9 19 7 8 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 7 7 2 3 6 6 3 4 5 9 19 7 8 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 19 0 1 8 19 8 1 2 7 7 2 3 6 6 3 4 5 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 9 9 2 3 4 9 4 5 8 8 5 6 7 12 17 18 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 19 0 1 8 19 8 1 2 7 7 2 3 4 7 4 5 6 10 19 8 9 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 12 17 18 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 19 19 2 3 4 8 19 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 7 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 10 7 8 9 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 19 19 2 3 4 6 19 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 5 5 2 3 4 7 19 5 6 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 19 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 19 0 1 6 19 6 1 2 5 5 2 3 4 8 19 6 7 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 8 19 0 7 0 1 6 7 6 1 2 5 5 2 3 4 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 5 5 2 3 4 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 8 9 8 1 2 3 8 3 18 7 3 4 19 18 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 8 9 8 1 2 3 8 3 19 7 3 4 5 19 7 19 5 6 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 12 18 10 11 17 12 13 14\n" +; + +const char* data_dqrgl_block27 = + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 3 10 3 4 9 9 4 5 8 8 5 6 7 12 17 18 11\n" + "16 4 11 16 13 14 15 16 17 12 13 16 19 18 17 16 15 0 19 18 19 0 11 0 1 10 11 10 1 2 3 10 3 4 9 9 4 5 6 9 6 7 8 12 17 18 11\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 8 19 0 7 0 1 6 7 6 1 2 3 6 3 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 6 7 6 1 2 3 6 3 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 8 19 0 7 0 1 4 7 4 1 2 3 7 4 5 6 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 4 7 4 1 2 3 7 4 5 6 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 18 9 18 1 2 3 9 18 3 8 3 4 19 8 19 4 5 6 8 19 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 3 9 19 3 8 3 4 7 8 7 4 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 3 9 19 3 8 3 4 7 8 7 4 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 3 9 19 3 8 3 4 5 8 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 19 9 19 1 2 3 9 19 3 8 3 4 5 8 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 19 7 19 1 2 3 7 19 3 6 3 4 5 6 17 10 11 14 14 11 12 13\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 12 17 6 7 12 7 10 11 7 8 9 10\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 6 17 16 15 0 18 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 12 17 6 7 12 7 8 11 11 8 9 10\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 5 0 1 19 5 19 1 2 3 5 19 3 4 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 5 0 1 4 5 4 1 2 3 8 5 6 7 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 17 8 13 14 8 9 12 13 12 9 10 11\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 17 8 13 14 8 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 17 8 11 14 8 9 10 11 14 11 12 13\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 7 8 17 16 18 6 7 16 15 0 18 6 18 0 19 0 1 4 19 4 1 2 3 6 19 4 5 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 6 19 0 5 0 1 4 5 4 1 2 3 8 18 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 6 19 0 5 0 1 4 5 4 1 2 3 8 18 6 7 17 8 9 14 14 9 10 13 13 10 11 12\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 19 18 19 3 6 7 3 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 7 8 2 3 18 7 18 3 4 19 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 19 18 19 3 4 7 7 4 5 6 8 18 19 7\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 19 18 19 3 4 5 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 7 8 2 3 19 7 19 3 4 5 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 7 8 2 3 19 7 19 3 4 5 7 19 5 6 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 19 18 19 3 4 5 8 18 19 5 8 5 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 19 8 2 3 6 19 6 3 4 5 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 19 8 2 3 6 19 6 3 4 5 8 19 6 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 18 8 2 3 4 18 8 18 4 19 4 5 6 19 8 19 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 19 8 2 3 4 19 8 19 4 7 4 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 19 8 2 3 4 19 8 19 4 7 4 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 19 8 2 3 4 19 8 19 4 5 8 5 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 19 8 2 3 4 19 8 19 4 5 8 5 6 7 17 12 13 14\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 8 17 16 15 0 18 8 18 0 7 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 12 17 8 9 12 9 10 11\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 10 13 14 10 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 19 6 2 3 4 19 6 19 4 5 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 8 19 0 7 0 1 2 7 7 2 5 6 2 3 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 5 6 2 3 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 18 7 3 4 19 18 19 4 5 6 7 18 19 6\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 19 18 3 4 5 19 18 19 5 6 8 18 6 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 19 7 3 4 5 19 7 19 5 6 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 19 7 3 4 5 19 7 19 5 6 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 13 14 15 16 11 12 13 16 17 10 11 16 15 0 17 10 17 0 9 0 1 2 9 9 2 3 8 8 3 4 18 18 4 5 19 19 5 6 7 8 18 19 7\n" + "16 4 11 16 13 14 15 16 17 12 13 16 18 10 17 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 4 19 19 4 5 6 8 19 6 7 12 17 10 11\n" + "16 4 11 16 17 14 15 16 11 12 17 16 18 10 11 16 15 0 18 10 18 0 9 0 1 2 9 9 2 3 8 8 3 4 19 19 4 5 6 8 19 6 7 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 12 17 16 19 10 18 16 15 0 19 10 19 0 9 0 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7 12 18 10 11 17 12 13 14\n" + "16 4 11 16 17 14 15 16 18 10 17 16 19 8 18 16 15 0 19 8 19 0 7 0 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 17 10 11 14 14 11 12 13\n" + "16 4 11 16 17 14 15 16 9 10 17 16 18 8 9 16 15 0 18 8 18 0 7 0 1 2 7 7 2 3 6 6 3 4 5 17 10 19 14 10 11 12 19 14 19 12 13\n" + "16 4 11 16 17 14 15 16 18 8 17 16 19 6 18 16 15 0 19 6 19 0 5 0 1 2 5 5 2 3 4 8 18 6 7 17 8 9 14 14 9 12 13 9 10 11 12\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 7 10 7 2 5 6 2 3 4 5 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 5 6 2 3 4 5 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 10 11 7 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 8 11 11 8 9 10\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 8 13 8 1 6 7 1 2 5 6 5 2 3 4 13 8 9 12 12 9 10 11\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 14 15 16 17\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 9 10 13 13 10 11 12\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 9 10 11 14 11 12 13\n" + "18 0 8 0 15 16 17 0 9 12 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11 15 12 13 14\n" + "18 0 8 0 13 16 17 0 9 12 13 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11 13 14 15 16\n" + "18 0 8 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 15 10 13 14 10 11 12 13\n" + "18 0 8 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 15 10 11 14 14 11 12 13\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 15 16 15 12 13 14\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 13 16 16 13 14 15\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 14 15 16\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 6 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 13 14 15 16\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 10 11 7 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 13 14 15 16\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 8 13 8 1 6 7 1 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10 13 14 15 16\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 14 9 10 11 14 11 12 13\n" + "18 0 8 0 15 16 17 0 9 12 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 12 9 10 11 15 12 13 14\n" + "18 0 8 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 15 10 13 14 10 11 12 13\n" + "18 0 8 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 15 10 11 14 14 11 12 13\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 8 9 5 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 8 8 5 6 7 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 15 12 13 14\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 9 10 6 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 7 10 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 15 12 13 14\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 7 1 2 3 4 7 4 5 6 12 7 8 11 11 8 9 10\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 15 12 13 14\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 8 13 8 1 4 7 1 2 3 4 7 4 5 6 13 8 9 12 12 9 10 11\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 8 11 8 1 4 7 1 2 3 4 7 4 5 6 11 8 9 10 15 12 13 14\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 14 9 10 13 13 10 11 12\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 14 9 10 11 14 11 12 13\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 10 11 5 6 9 10 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 10 11 5 6 7 10 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 8 11 5 6 7 8 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 6 11 11 6 9 10 6 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 6 11 11 6 7 10 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 6 13 6 1 4 5 1 2 3 4 13 6 7 12 12 7 8 11 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 8 2 3 6 7 6 3 4 5 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 8 2 3 4 7 7 4 5 6 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 13 14 15 16\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 7 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 8 2 3 4 5 8 5 6 7 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 15 12 13 14\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 6 2 3 4 5 11 6 9 10 6 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 6 2 3 4 5 11 6 7 10 10 7 8 9\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 5 6 2 3 4 5 9 6 7 8 14 11 12 13\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 7 7 2 5 6 2 3 4 5 12 7 8 11 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 6 7 3 4 5 6 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 8 8 3 6 7 3 4 5 6 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 6 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 7 7 4 5 6 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 8 8 3 4 7 7 4 5 6 11 8 9 10\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12\n" + "18 0 8 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 14 11 12 13\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 5 10 5 8 9 5 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 5 10 5 6 9 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 6 6 3 4 5 11 6 7 10 10 7 8 9\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 7 7 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 8 13 8 1 2 7 7 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 14 15 16 17\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12\n" + "18 0 8 0 15 16 17 0 9 14 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 9 10 11 14 11 12 13\n" + "18 0 8 0 15 16 17 0 9 12 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 9 10 11 15 12 13 14\n" + "18 0 8 0 15 16 17 0 9 10 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 15 10 11 14 14 11 12 13\n" + "18 0 8 0 13 14 17 0 9 10 13 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 13 10 11 12 14 15 16 17\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 15 16 15 12 13 14\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 16 16 13 14 15\n" + "18 0 8 0 11 14 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 14 14 15 16 17\n" + "18 0 8 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 15 16 17 12 13 14 15\n" + "18 0 8 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 13 16 17 16 13 14 15\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 9 10 4 5 8 9 8 5 6 7\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 9 10 4 5 6 9 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 7 10 4 5 6 7 10 7 8 9\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 5 10 10 5 8 9 5 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 5 8 8 5 6 7 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 5 5 2 3 4 12 5 6 11 11 6 7 10 10 7 8 9\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 14 15 16 17\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 15 16 15 12 13 14\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 16 16 13 14 15\n" + "18 0 8 0 11 14 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 14 14 15 16 17\n" + "18 0 8 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 15 16 17 12 13 14 15\n" + "18 0 8 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 13 16 17 16 13 14 15\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 6 13 6 1 2 5 5 2 3 4 13 6 7 12 12 7 8 11 11 8 9 10\n" + "18 0 8 0 15 16 17 0 11 12 15 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 15 12 13 14\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 14 15 16 17\n" + "18 0 8 0 15 16 17 0 9 10 15 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 15 10 11 14 14 11 12 13\n" + "18 0 8 0 13 14 17 0 9 10 13 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 13 10 11 12 14 15 16 17\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 15 16 15 12 13 14\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 16 16 13 14 15\n" + "18 0 8 0 11 14 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 14 14 15 16 17\n" + "18 0 8 0 11 12 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 12 15 16 17 12 13 14 15\n" + "18 0 8 0 11 12 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 12 13 16 17 16 13 14 15\n" + "18 0 8 0 15 16 17 0 7 14 15 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 13 13 8 9 12 12 9 10 11\n" + "18 0 8 0 15 16 17 0 7 14 15 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 11 11 8 9 10 14 11 12 13\n" + "18 0 8 0 15 16 17 0 7 12 15 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 11 11 8 9 10 15 12 13 14\n" + "18 0 8 0 13 14 17 0 7 12 13 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 11 11 8 9 10 14 15 16 17\n" + "18 0 8 0 15 16 17 0 7 14 15 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 9 14 9 12 13 9 10 11 12\n" + "18 0 8 0 15 16 17 0 7 14 15 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 9 14 9 10 13 13 10 11 12\n" + "18 0 8 0 15 16 17 0 7 10 15 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9 15 10 11 14 14 11 12 13\n" + "18 0 8 0 15 16 17 0 7 8 15 0 1 6 7 6 1 2 5 5 2 3 4 15 8 9 14 14 9 10 13 13 10 11 12\n" + "18 0 8 0 13 14 17 0 7 8 13 0 1 6 7 6 1 2 5 5 2 3 4 13 8 9 12 12 9 10 11 14 15 16 17\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 15 16 15 10 11 14 14 11 12 13\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 15 16 15 10 11 12 15 12 13 14\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 13 16 13 10 11 12 16 13 14 15\n" + "18 0 8 0 9 14 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 13 14 13 10 11 12 14 15 16 17\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 16 16 11 14 15 11 12 13 14\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 16 16 11 12 15 15 12 13 14\n" + "18 0 8 0 9 10 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 15 16 17 10 11 14 15 14 11 12 13\n" + "18 0 8 0 9 10 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 15 16 17 10 11 12 15 15 12 13 14\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 9 10 9 4 5 6 9 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 7 10 7 4 5 6 10 7 8 9\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 8 11 3 4 7 8 7 4 5 6 11 8 9 10\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 14 15 16 17\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 5 10 10 5 8 9 5 6 7 8\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 5 10 10 5 6 9 9 6 7 8\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 14 15 16 17\n" + "18 0 8 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 13 14 15 16\n" + "18 0 8 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 14 15 16 17\n" + "18 0 8 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 12 15 16 17 12 13 14 15\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 4 11 11 4 9 10 4 5 8 9 8 5 6 7\n" + "18 0 8 0 13 14 17 0 9 10 13 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 13 10 11 12 14 15 16 17\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 15 16 15 12 13 14\n" + "18 0 8 0 11 16 17 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 13 16 16 13 14 15\n" + "18 0 8 0 11 14 17 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 13 14 14 15 16 17\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 13 16 13 10 11 12 16 13 14 15\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 16 16 11 14 15 11 12 13 14\n" + "18 0 8 0 9 16 17 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 16 16 11 12 15 15 12 13 14\n" + "18 0 8 0 15 16 17 0 5 10 15 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 15 10 11 14 14 11 12 13\n" + "18 0 8 0 7 16 17 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 16 16 9 14 15 9 10 13 14 13 10 11 12\n" + "18 0 8 0 7 16 17 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 16 16 9 14 15 9 10 11 14 14 11 12 13\n" + "18 0 8 0 15 16 17 0 13 14 15 0 1 2 13 13 2 11 12 2 3 4 11 11 4 9 10 4 5 6 9 9 6 7 8\n" + "18 0 8 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 5 10 10 5 6 9 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 7 8 11 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 12 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 7 8 11 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 12 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 7 8 11 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 12 13 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 12 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 7 8 11 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 12 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 7 8 9 12 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 10 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 7 10 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 10 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 10 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 10 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 13 8 11 12 8 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 11 8 9 10 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 14 9 10 11 14 11 12 13\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 9 10 11 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 13 10 11 12 14 15 16 17\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 11 12 13 16 16 13 14 15\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 13 16 17 16 13 14 15\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 7 8 9 18 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 5 6 11 18 17 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 5 6 9 18 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 12 13 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 10 13 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 7 10 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 10 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 10 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 10 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 7 10 11 18 5 6 7 18 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 11 8 9 10 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 7 8 11 18 5 6 7 18 15 0 5 5 0 1 4 4 1 2 3 11 8 9 10 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 12 9 10 11 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 12 13 18 7 8 9 18 5 6 7 18 15 0 5 5 0 1 4 4 1 2 3 12 9 10 11 15 16 17 0\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 13 10 11 12 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 10 13 18 7 8 9 18 5 6 7 18 15 0 5 5 0 1 4 4 1 2 3 13 10 11 12 15 16 17 0\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 14 15 18 9 10 11 18 7 8 9 18 5 6 7 18 15 0 5 5 0 1 4 4 1 2 3 11 12 13 14 15 16 17 0\n" + "18 1 9 18 11 12 13 18 9 10 11 18 7 8 9 18 5 6 7 18 13 0 5 5 0 1 4 4 1 2 3 13 14 17 0 17 14 15 16\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 3 4 7 18 17 0 3 3 0 1 2 7 4 5 6 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 3 4 7 18 17 0 3 3 0 1 2 7 4 5 6 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 15 18 11 12 13 18 7 8 11 18 3 4 7 18 15 0 3 3 0 1 2 7 4 5 6 11 8 9 10 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 3 4 7 18 17 0 3 3 0 1 2 7 4 5 6 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 3 4 7 18 17 0 3 3 0 1 2 7 4 5 6 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 15 18 9 12 13 18 7 8 9 18 3 4 7 18 15 0 3 3 0 1 2 7 4 5 6 12 9 10 11 15 16 17 0\n" + "18 1 9 18 13 14 15 18 9 10 13 18 7 8 9 18 3 4 7 18 15 0 3 3 0 1 2 7 4 5 6 13 10 11 12 15 16 17 0\n" + "18 1 9 18 11 14 15 18 9 10 11 18 7 8 9 18 3 4 7 18 15 0 3 3 0 1 2 7 4 5 6 11 12 13 14 15 16 17 0\n" + "18 1 9 18 13 16 17 18 11 12 13 18 5 8 11 18 3 4 5 18 17 0 3 3 0 1 2 8 5 6 7 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 15 18 11 12 13 18 5 8 11 18 3 4 5 18 15 0 3 3 0 1 2 8 5 6 7 11 8 9 10 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 4 5 1 2 3 4 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 6 9 6 1 4 5 1 2 3 4 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 7 10 0 1 6 7 6 1 4 5 1 2 3 4 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 4 5 1 2 3 4 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 2 7 7 2 5 6 2 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 2 7 7 2 3 4 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 7 10 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 5 5 2 3 4 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 8 9 8 1 2 3 8 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 7 10 0 1 6 7 6 1 2 3 6 3 4 5 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 6 7 6 1 2 3 6 3 4 5 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 4 7 4 1 2 3 7 4 5 6 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 5 10 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 5 10 0 1 4 5 4 1 2 3 10 5 6 7 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 5 8 0 1 4 5 4 1 2 3 8 5 6 7 14 15 16 17\n" +; + +const char* data_dqrgl_block28 = + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 13 8 11 12 8 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 8 9 10 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 14 9 10 11 14 11 12 13\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 9 10 11 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 10 13 14 10 11 12 13\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 13 10 11 12 14 15 16 17\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 12 13 16 16 13 14 15\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 15 16 17 12 13 14 15\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 4 5 4 1 2 3 12 13 16 17 16 13 14 15\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 5 6 2 3 4 5 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 9 10 0 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 7 8 0 1 2 7 7 2 3 6 6 3 4 5 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 13 8 11 12 8 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 8 9 10 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 14 9 10 11 14 11 12 13\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 9 10 11 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 10 13 14 10 11 12 13\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 13 10 11 12 14 15 16 17\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 12 13 16 16 13 14 15\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 15 16 17 12 13 14 15\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 5 6 0 1 2 5 5 2 3 4 12 13 16 17 16 13 14 15\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 3 10 0 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 3 10 0 1 2 3 10 3 4 9 9 4 5 8 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 3 10 0 1 2 3 10 3 4 9 9 4 5 6 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 3 10 0 1 2 3 10 3 4 7 7 4 5 6 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 7 7 4 5 6 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 3 10 0 1 2 3 10 3 4 5 10 5 8 9 5 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 3 10 0 1 2 3 10 3 4 5 10 5 6 9 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 3 8 0 1 2 3 8 3 4 5 8 5 6 7 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 13 8 11 12 8 9 10 11\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 8 9 10 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 14 9 10 11 14 11 12 13\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 9 10 11 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 10 13 14 10 11 12 13\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 13 10 11 12 14 15 16 17\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 12 13 16 16 13 14 15\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 15 16 17 12 13 14 15\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 3 6 0 1 2 3 6 3 4 5 12 13 16 17 16 13 14 15\n" + "18 1 9 18 15 16 17 18 11 12 15 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 9 10 6 7 8 9 14 15 16 17\n" + "18 1 9 18 15 16 17 18 13 14 15 18 5 6 13 18 17 0 5 5 0 3 4 0 1 2 3 13 6 7 12 12 7 10 11 7 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 5 6 13 18 17 0 5 5 0 3 4 0 1 2 3 13 6 7 12 12 7 8 11 11 8 9 10\n" + "18 1 9 18 15 16 17 18 13 14 15 18 5 6 13 18 17 0 5 5 0 3 4 0 1 2 3 13 6 7 12 12 7 8 9 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 5 6 11 18 17 0 5 5 0 3 4 0 1 2 3 11 6 7 10 10 7 8 9 14 15 16 17\n" + "18 1 9 18 15 16 17 18 9 10 15 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 15 10 13 14 10 11 12 13\n" + "18 1 9 18 15 16 17 18 9 10 15 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 13 10 11 12 14 15 16 17\n" + "18 1 9 18 11 16 17 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 16 17 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 11 12 13 16 16 13 14 15\n" + "18 1 9 18 11 14 17 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 12 17 18 9 10 11 18 5 6 9 18 17 0 5 5 0 3 4 0 1 2 3 9 6 7 8 12 13 16 17 16 13 14 15\n" + "18 1 9 18 15 16 17 18 7 14 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 14 7 8 13 13 8 11 12 8 9 10 11\n" + "18 1 9 18 15 16 17 18 7 14 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 14 7 8 13 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 7 14 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 14 7 8 13 13 8 9 10 13 10 11 12\n" + "18 1 9 18 15 16 17 18 7 12 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 7 8 11 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 7 12 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 7 8 11 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 7 12 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 7 8 11 11 8 9 10 14 15 16 17\n" + "18 1 9 18 13 16 17 18 7 12 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 12 7 8 9 12 9 10 11 13 14 15 16\n" + "18 1 9 18 15 16 17 18 7 10 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 7 10 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 13 10 11 12 14 15 16 17\n" + "18 1 9 18 11 16 17 18 7 10 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 14 17 18 7 10 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 12 17 18 7 10 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 7 8 9 12 13 16 17 16 13 14 15\n" + "18 1 9 18 15 16 17 18 7 8 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 15 8 9 14 14 9 12 13 9 10 11 12\n" + "18 1 9 18 15 16 17 18 7 8 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 15 8 9 14 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 7 8 15 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 15 8 9 14 14 9 10 11 14 11 12 13\n" + "18 1 9 18 13 14 17 18 7 8 13 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 13 8 9 12 12 9 10 11 14 15 16 17\n" + "18 1 9 18 11 12 17 18 7 8 11 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 11 8 9 10 12 13 16 17 16 13 14 15\n" + "18 1 9 18 9 16 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 9 10 15 16 15 10 13 14 10 11 12 13\n" + "18 1 9 18 9 16 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 9 10 15 16 15 10 11 14 14 11 12 13\n" + "18 1 9 18 9 16 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 9 10 15 16 15 10 11 12 15 12 13 14\n" + "18 1 9 18 9 14 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 9 10 13 14 13 10 11 12 14 15 16 17\n" + "18 1 9 18 9 12 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 9 10 11 12 12 13 16 17 16 13 14 15\n" + "18 1 9 18 9 10 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 11 16 17 16 11 14 15 11 12 13 14\n" + "18 1 9 18 9 10 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 11 16 17 16 11 12 15 15 12 13 14\n" + "18 1 9 18 9 10 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 3 4 0 1 2 3 10 11 16 17 16 11 12 13 16 13 14 15\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 5 6 2 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 6 7 1 2 5 6 5 2 3 4 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 6 7 1 2 3 6 6 3 4 5 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 4 7 1 2 3 4 7 4 5 6 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 4 5 1 2 3 4 10 5 8 9 5 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 4 5 1 2 3 4 10 5 6 9 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 4 5 1 2 3 4 8 5 6 7 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 7 8 11 18 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 8 9 10 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 12 13 18 7 8 9 18 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 9 10 11 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 10 13 18 7 8 9 18 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 10 11 12 15 16 17 0\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 14 15 18 9 10 11 18 7 8 9 18 15 0 7 7 0 1 6 6 1 4 5 1 2 3 4 11 12 13 14 15 16 17 0\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 4 5 1 2 3 4 12 13 16 17 16 13 14 15\n" + "18 1 9 18 11 12 13 18 9 10 11 18 7 8 9 18 13 0 7 7 0 1 6 6 1 4 5 1 2 3 4 13 14 17 0 17 14 15 16\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 5 6 2 3 4 5 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 7 7 2 5 6 2 3 4 5 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 2 7 7 2 5 6 2 3 4 5 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 3 8 8 3 4 5 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 2 7 7 2 3 6 6 3 4 5 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 9 9 2 3 4 9 4 5 8 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 2 7 7 2 3 4 7 4 5 6 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 2 5 5 2 3 4 8 5 6 7 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 7 8 11 18 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 8 9 10 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 12 13 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 9 10 11 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 10 13 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 10 11 12 15 16 17 0\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 14 15 18 9 10 11 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 5 5 2 3 4 11 12 13 14 15 16 17 0\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 5 5 2 3 4 12 13 16 17 16 13 14 15\n" + "18 1 9 18 11 12 13 18 9 10 11 18 7 8 9 18 13 0 7 7 0 1 6 6 1 2 5 5 2 3 4 13 14 17 0 17 14 15 16\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 2 3 8 3 6 7 3 4 5 6 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 7 8 4 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 5 8 8 5 6 7\n" + "18 1 9 18 15 16 17 18 13 14 15 18 11 12 13 18 17 0 11 11 0 1 10 10 1 2 3 10 3 4 9 9 4 5 6 9 6 7 8\n" + "18 1 9 18 15 16 17 18 13 14 15 18 9 10 13 18 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 13 10 11 12\n" + "18 1 9 18 15 16 17 18 11 14 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 14 11 12 13\n" + "18 1 9 18 15 16 17 18 11 12 15 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 9 10 11 18 17 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 9 10 11 18 15 0 9 9 0 1 8 8 1 2 3 8 3 4 7 7 4 5 6 15 16 17 0\n" + "18 1 9 18 15 16 17 18 13 14 15 18 7 8 13 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 8 9 12 12 9 10 11\n" + "18 1 9 18 15 16 17 18 11 12 15 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 7 8 11 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 7 8 11 18 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 8 9 10 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 14 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 14 9 10 13 13 10 11 12\n" + "18 1 9 18 15 16 17 18 9 12 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 15 12 13 14\n" + "18 1 9 18 13 16 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 13 14 15 16\n" + "18 1 9 18 13 14 17 18 9 12 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 12 13 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 9 10 11 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 10 15 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 12 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 10 13 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 10 11 12 15 16 17 0\n" + "18 1 9 18 11 16 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 14 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 14 15 18 9 10 11 18 7 8 9 18 15 0 7 7 0 1 6 6 1 2 3 6 3 4 5 11 12 13 14 15 16 17 0\n" + "18 1 9 18 11 12 17 18 9 10 11 18 7 8 9 18 17 0 7 7 0 1 6 6 1 2 3 6 3 4 5 12 13 16 17 16 13 14 15\n" + "18 1 9 18 11 12 13 18 9 10 11 18 7 8 9 18 13 0 7 7 0 1 6 6 1 2 3 6 3 4 5 13 14 17 0 17 14 15 16\n" + "18 1 9 18 15 16 17 18 11 12 15 18 5 6 11 18 17 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 15 12 13 14\n" + "18 1 9 18 13 16 17 18 11 12 13 18 5 6 11 18 17 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 13 14 15 16\n" + "18 1 9 18 13 14 17 18 11 12 13 18 5 6 11 18 17 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 14 15 16 17\n" + "18 1 9 18 13 14 15 18 11 12 13 18 5 6 11 18 15 0 5 5 0 1 4 4 1 2 3 11 6 7 10 10 7 8 9 15 16 17 0\n" + "18 1 9 18 15 16 17 18 9 10 15 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 9 10 13 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 10 11 12 14 15 16 17\n" + "18 1 9 18 13 14 15 18 9 10 13 18 5 6 9 18 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 10 11 12 15 16 17 0\n" + "18 1 9 18 11 16 17 18 9 10 11 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 11 12 15 16 15 12 13 14\n" + "18 1 9 18 11 14 17 18 9 10 11 18 5 6 9 18 17 0 5 5 0 1 4 4 1 2 3 9 6 7 8 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 14 15 18 9 10 11 18 5 6 9 18 15 0 5 5 0 1 4 4 1 2 3 9 6 7 8 11 12 13 14 15 16 17 0\n" + "18 1 9 18 11 12 13 18 9 10 11 18 5 6 9 18 13 0 5 5 0 1 4 4 1 2 3 9 6 7 8 13 14 17 0 17 14 15 16\n" + "18 1 9 18 15 16 17 18 7 12 15 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 15 12 13 14\n" + "18 1 9 18 13 16 17 18 7 12 13 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 12 7 8 11 11 8 9 10 13 14 15 16\n" + "18 1 9 18 15 16 17 18 7 10 15 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 15 10 11 14 14 11 12 13\n" + "18 1 9 18 13 14 17 18 7 10 13 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 10 11 12 14 15 16 17\n" + "18 1 9 18 13 14 15 18 7 10 13 18 5 6 7 18 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 10 11 12 15 16 17 0\n" + "18 1 9 18 11 14 17 18 7 10 11 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 10 7 8 9 11 12 13 14 14 15 16 17\n" + "18 1 9 18 11 14 15 18 7 10 11 18 5 6 7 18 15 0 5 5 0 1 4 4 1 2 3 10 7 8 9 11 12 13 14 15 16 17 0\n" + "18 1 9 18 11 12 13 18 7 10 11 18 5 6 7 18 13 0 5 5 0 1 4 4 1 2 3 10 7 8 9 13 14 17 0 17 14 15 16\n" + "18 1 9 18 9 14 17 18 7 8 9 18 5 6 7 18 17 0 5 5 0 1 4 4 1 2 3 9 10 13 14 13 10 11 12 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 7 8 2 3 6 7 6 3 4 5 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 9 18 9 2 7 8 2 3 6 7 6 3 4 5 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 7 8 2 3 4 7 7 4 5 6 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 9 18 9 2 7 8 2 3 4 7 7 4 5 6 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 5 18 2 3 4 5 18 5 6 7 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 5 8 2 3 4 5 8 5 6 7 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 9 18 9 2 5 8 2 3 4 5 8 5 6 7 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 18 8 2 3 4 18 8 18 4 7 4 5 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 18 8 2 3 4 18 8 18 4 5 8 5 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 18 6 2 3 4 18 6 18 4 5 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 7 10 7 2 18 6 2 3 4 18 6 18 4 5 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 18 6 2 3 4 18 6 18 4 5 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 18 6 2 3 4 18 6 18 4 5 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 18 6 2 3 4 18 6 18 4 5 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 18 6 2 3 4 18 6 18 4 5 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8 14 18 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 7 10 7 2 5 6 2 3 4 5 10 7 8 9 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 7 10 7 2 5 6 2 3 4 5 10 7 8 9 14 18 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 5 6 2 3 4 5 10 18 6 9 6 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 18 8 18 2 5 6 2 3 4 5 8 18 6 7 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 18 1 2 7 8 7 2 5 6 2 3 4 5 18 8 9 10 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 8 11 1 2 7 8 7 2 5 6 2 3 4 5 11 8 9 10 13 18 11 12\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 7 18 7 2 5 6 2 3 4 5 11 18 7 8 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 18 18 3 6 7 3 4 5 6 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 3 8 8 3 6 7 3 4 5 6 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 9 18 9 2 3 8 8 3 6 7 3 4 5 6 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 18 18 4 5 6 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 18 18 3 4 7 7 4 5 6 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 3 8 8 3 4 7 7 4 5 6 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 9 18 9 2 3 8 8 3 4 7 7 4 5 6 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 9 18 9 2 3 8 8 3 4 5 8 5 6 7 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 18 18 3 4 5 9 18 5 8 5 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 18 18 3 4 5 7 18 5 6 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 18 18 3 4 5 7 18 5 6 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 18 18 3 4 5 7 18 5 6 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 18 18 3 4 5 7 18 5 6 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 18 18 3 4 5 7 18 5 6 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 18 18 3 4 5 7 18 5 6 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 18 18 3 4 5 7 18 5 6 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 18 8 18 2 3 6 6 3 4 5 8 18 6 7 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 18 8 18 2 3 6 6 3 4 5 8 18 6 7 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 6 6 3 4 5 8 18 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 6 6 3 4 5 8 18 6 7 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 6 6 3 4 5 8 18 6 7 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 6 6 3 4 5 8 18 6 7 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 18 1 2 7 8 7 2 3 6 6 3 4 5 18 8 9 10 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 7 18 7 2 3 6 6 3 4 5 11 18 7 8 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 9 1 2 7 18 7 2 3 6 6 3 4 5 9 18 7 8 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 18 9 1 2 7 18 7 2 3 6 6 3 4 5 9 18 7 8 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 9 1 2 7 18 7 2 3 6 6 3 4 5 9 18 7 8 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 18 9 1 2 7 18 7 2 3 6 6 3 4 5 9 18 7 8 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 18 9 1 2 7 18 7 2 3 6 6 3 4 5 9 18 7 8 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 18 9 1 2 7 18 7 2 3 6 6 3 4 5 9 18 7 8 14 15 16 17\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 18 9 12 9 10 11 12\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 11 18 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 11 18 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 18 10 11 13 14 15 16\n" + "18 1 9 0 13 14 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 18 10 11 14 15 16 17\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 18 12 13 14 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 18 8 4 5 6 18 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 18 1 2 7 8 7 2 3 4 7 4 5 6 18 8 9 10 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 18 9 12 9 10 11 12\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 11 18 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 11 18 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 18 10 11 13 14 15 16\n" + "18 1 9 0 13 14 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 18 10 11 14 15 16 17\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 18 12 13 14 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 18 9 12 9 10 11 12\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 11 18 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 11 18 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 18 10 11 13 14 15 16\n" + "18 1 9 0 13 14 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 18 10 11 14 15 16 17\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 18 12 13 14 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 3 4 10 18 4 9 4 5 8 9 8 5 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 18 10 18 2 3 4 10 18 4 9 4 5 6 9 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 18 8 18 2 3 4 8 18 4 7 4 5 6 7 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 18 8 18 2 3 4 8 18 4 7 4 5 6 7 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 4 8 18 4 7 4 5 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 4 8 18 4 7 4 5 6 7 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 4 8 18 4 7 4 5 6 7 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 18 8 18 2 3 4 8 18 4 7 4 5 6 7 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 12 7 10 11 7 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 12 7 8 11 11 8 9 10\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 10 7 8 9 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 10 7 8 9 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 10 7 8 9 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 10 7 8 9 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 8 13 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 13 8 9 12 12 9 10 11\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 8 11 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 11 8 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 8 11 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 11 8 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 8 11 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 11 8 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 14 9 10 13 13 10 11 12\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 14 9 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 9 12 15 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 12 9 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 9 12 13 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 12 9 10 11 13 14 15 16\n" + "18 1 9 0 13 14 17 0 9 12 13 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 12 9 10 11 14 15 16 17\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 15 10 13 14 10 11 12 13\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 15 10 11 14 14 11 12 13\n" + "18 1 9 0 13 14 17 0 9 10 13 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 13 10 11 12 14 15 16 17\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 6 7 1 2 18 6 18 2 3 4 6 18 4 5 11 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 18 18 7 8 9 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 18 1 2 5 6 5 2 3 4 18 6 7 10 10 7 8 9 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 9 10 11 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 18 1 2 5 6 5 2 3 4 18 6 7 8 12 18 8 11 8 9 10 11\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 6 18 1 2 5 6 5 2 3 4 18 6 7 8 10 18 8 9 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 6 18 1 2 5 6 5 2 3 4 18 6 7 8 10 18 8 9 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 6 18 1 2 5 6 5 2 3 4 18 6 7 8 10 18 8 9 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 6 18 1 2 5 6 5 2 3 4 18 6 7 8 10 18 8 9 14 15 16 17\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 11 18 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 18 11 18 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 11 18 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 18 10 11 13 14 15 16\n" + "18 1 9 0 13 14 17 0 18 12 13 0 1 10 18 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 18 10 11 14 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 18 12 13 14 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 5 18 5 2 3 4 11 18 5 6 11 6 9 10 6 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 5 18 5 2 3 4 11 18 5 6 11 6 7 10 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 18 9 1 2 5 18 5 2 3 4 9 18 5 6 9 6 7 8 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 9 1 2 5 18 5 2 3 4 9 18 5 6 9 6 7 8 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 18 9 1 2 5 18 5 2 3 4 9 18 5 6 9 6 7 8 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 18 9 1 2 5 18 5 2 3 4 9 18 5 6 9 6 7 8 13 14 15 16\n" +; + +const char* data_dqrgl_block29 = + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 18 9 1 2 5 18 5 2 3 4 9 18 5 6 9 6 7 8 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 12 7 8 11 11 8 9 10\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 10 7 8 9 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 10 7 8 9 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 10 7 8 9 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 10 7 8 9 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 8 13 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 13 8 9 12 12 9 10 11\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 8 11 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 11 8 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 8 11 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 11 8 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 8 11 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 11 8 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 14 9 10 13 13 10 11 12\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 14 9 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 9 12 15 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 12 9 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 9 12 13 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 12 9 10 11 13 14 15 16\n" + "18 1 9 0 13 14 17 0 9 12 13 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 12 9 10 11 14 15 16 17\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 15 10 13 14 10 11 12 13\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 15 10 11 14 14 11 12 13\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 18 7 1 2 5 18 5 2 3 4 7 18 5 6 11 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 18 11 7 8 9 18 11 18 9 10\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 10 11 7 8 9 10 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 8 11 11 8 9 10 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 14 11 12 13 18 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 8 13 8 1 6 7 1 2 5 6 5 2 3 4 13 8 9 12 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 6 7 1 2 5 6 5 2 3 4 13 18 7 12 7 8 11 12 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 6 7 1 2 5 6 5 2 3 4 13 18 7 12 7 8 9 12 12 9 10 11\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 6 7 1 2 5 6 5 2 3 4 11 18 7 10 7 8 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 6 7 1 2 5 6 5 2 3 4 11 18 7 10 7 8 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 18 11 18 1 6 7 1 2 5 6 5 2 3 4 11 18 7 10 7 8 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 18 9 18 1 6 7 1 2 5 6 5 2 3 4 9 18 7 8 15 10 13 14 10 11 12 13\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 18 9 18 1 6 7 1 2 5 6 5 2 3 4 9 18 7 8 15 10 11 14 14 11 12 13\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 18 9 18 1 6 7 1 2 5 6 5 2 3 4 9 18 7 8 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 18 9 18 1 6 7 1 2 5 6 5 2 3 4 9 18 7 8 11 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 9 10 18 18 10 11 12 14 18 12 13\n" + "18 1 9 0 15 16 17 0 9 18 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 9 10 13 13 10 11 12 15 18 13 14\n" + "18 1 9 0 18 16 17 0 9 14 18 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 9 10 13 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 9 18 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 9 10 11 15 18 11 14 11 12 13 14\n" + "18 1 9 0 18 16 17 0 9 12 18 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 8 18 8 1 6 7 1 2 5 6 5 2 3 4 14 18 8 9 14 9 12 13 9 10 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 8 18 8 1 6 7 1 2 5 6 5 2 3 4 14 18 8 9 14 9 10 13 13 10 11 12\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 8 18 8 1 6 7 1 2 5 6 5 2 3 4 12 18 8 9 12 9 10 11 13 14 15 16\n" + "18 1 9 0 15 16 17 0 18 10 15 0 1 8 18 8 1 6 7 1 2 5 6 5 2 3 4 10 18 8 9 15 10 11 14 14 11 12 13\n" + "18 1 9 0 11 16 17 0 18 10 11 0 1 8 18 8 1 6 7 1 2 5 6 5 2 3 4 10 18 8 9 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 18 10 11 0 1 8 18 8 1 6 7 1 2 5 6 5 2 3 4 10 18 8 9 11 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 15 10 18 14 10 11 12 18 14 18 12 13\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 18 16 18 12 13 14 16 18 14 15\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 10 15 16 10 11 14 15 14 11 12 13\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 10 15 16 10 11 12 15 15 12 13 14\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 10 13 16 10 11 12 13 16 13 14 15\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 10 11 16 16 11 14 15 11 12 13 14\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 18 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 18 8 18 4 5 6 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 18 9 3 4 7 18 7 4 5 6 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 18 9 3 4 5 18 9 18 5 8 5 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 18 9 3 4 5 18 9 18 5 6 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 8 9 1 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 8 9 1 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 13 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 18 9 12 9 10 11 12\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 11 18 9 10 13 14 15 16\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 18 10 11 13 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 18 8 4 5 6 18 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 18 18 5 6 7 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 11 18 9 10 13 14 15 16\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 18 10 11 13 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 18 11 7 8 9 18 11 18 9 10\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 10 11 7 8 9 10 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 14 11 12 13 18 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 8 13 8 1 6 7 1 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 6 7 1 2 3 6 6 3 4 5 13 18 7 12 7 8 9 12 12 9 10 11\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 6 7 1 2 3 6 6 3 4 5 11 18 7 10 7 8 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 6 7 1 2 3 6 6 3 4 5 11 18 7 10 7 8 9 10 13 14 15 16\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 18 9 18 1 6 7 1 2 3 6 6 3 4 5 9 18 7 8 15 10 13 14 10 11 12 13\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 18 9 18 1 6 7 1 2 3 6 6 3 4 5 9 18 7 8 15 10 11 14 14 11 12 13\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 14 9 10 18 18 10 11 12 14 18 12 13\n" + "18 1 9 0 15 16 17 0 9 18 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 9 10 13 13 10 11 12 15 18 13 14\n" + "18 1 9 0 18 16 17 0 9 14 18 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 9 18 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 9 10 11 15 18 11 14 11 12 13 14\n" + "18 1 9 0 18 16 17 0 9 12 18 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 12 9 10 11 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 8 18 8 1 6 7 1 2 3 6 6 3 4 5 14 18 8 9 14 9 10 13 13 10 11 12\n" + "18 1 9 0 15 16 17 0 18 10 15 0 1 8 18 8 1 6 7 1 2 3 6 6 3 4 5 10 18 8 9 15 10 11 14 14 11 12 13\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 15 10 18 14 10 11 12 18 14 18 12 13\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 10 15 16 10 11 14 15 14 11 12 13\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 10 15 16 10 11 12 15 15 12 13 14\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 10 13 16 10 11 12 13 16 13 14 15\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 10 11 16 16 11 14 15 11 12 13 14\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 18 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 18 9 5 6 7 18 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 18 18 5 8 9 5 6 7 8 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 18 1 2 3 4 18 4 5 10 10 5 8 9 5 6 7 8 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 18 18 6 7 8 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 18 18 5 6 9 9 6 7 8 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 18 1 2 3 4 18 4 5 10 10 5 6 9 9 6 7 8 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 4 11 1 2 3 4 11 4 5 8 8 5 6 7 11 8 9 10 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 8 8 5 6 7 11 8 9 10 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 18 18 5 6 7 11 18 7 10 7 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 4 9 1 2 3 4 9 4 5 18 18 5 6 7 9 18 7 8 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 18 18 5 6 7 9 18 7 8 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 18 18 5 6 7 9 18 7 8 15 12 13 14\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 9 10 11 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 4 18 1 2 3 4 18 4 5 8 8 5 6 7 10 18 8 9 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 4 18 1 2 3 4 18 4 5 8 8 5 6 7 10 18 8 9 15 12 13 14\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 11 18 9 10 15 12 13 14\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 18 10 11 15 12 13 14\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 18 10 6 7 8 18 10 18 8 9\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 9 10 6 7 8 9 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 7 10 10 7 8 9 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 12 18 10 11 15 12 13 14\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 4 7 1 2 3 4 7 4 5 6 12 7 8 11 11 8 9 10 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 18 1 2 3 4 18 4 5 6 12 18 6 11 6 7 10 11 10 7 8 9\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 4 18 1 2 3 4 18 4 5 6 10 18 6 9 6 7 8 9 15 12 13 14\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 8 13 8 1 4 7 1 2 3 4 7 4 5 6 13 8 9 12 12 9 10 11 18 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 8 11 8 1 4 7 1 2 3 4 7 4 5 6 11 8 9 10 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 14 9 10 18 18 10 11 12 14 18 12 13\n" + "18 1 9 0 18 16 17 0 9 14 18 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 14 9 10 13 13 10 11 12 18 14 15 16\n" + "18 1 9 0 18 16 17 0 9 12 18 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 12 9 10 11 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 8 18 8 1 4 7 1 2 3 4 7 4 5 6 14 18 8 9 14 9 10 13 13 10 11 12\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 18 10 15 16 10 11 14 15 14 11 12 13\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 18 10 15 16 10 11 12 15 15 12 13 14\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 18 10 13 16 10 11 12 13 16 13 14 15\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 18 10 11 16 16 11 14 15 11 12 13 14\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 18 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 10 3 4 9 10 9 4 7 8 4 5 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 10 3 4 9 10 9 4 5 8 8 5 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 10 3 4 9 10 9 4 5 6 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 10 3 4 7 10 7 4 5 6 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 8 3 4 7 8 7 4 5 6 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 9 1 2 3 18 9 18 3 8 3 4 7 8 7 4 5 6 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 18 9 1 2 3 18 9 18 3 8 3 4 7 8 7 4 5 6 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 9 1 2 3 18 9 18 3 8 3 4 7 8 7 4 5 6 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 10 3 4 5 10 10 5 8 9 5 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 10 3 4 5 10 10 5 6 9 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 18 9 1 2 3 18 9 18 3 8 3 4 5 8 8 5 6 7 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 9 1 2 3 18 9 18 3 8 3 4 5 8 8 5 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 6 3 4 5 6 11 6 7 10 10 7 8 9\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 9 1 2 3 18 9 18 3 6 3 4 5 6 9 6 7 8 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6 12 7 8 11 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 8 13 8 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6 13 8 9 12 12 9 10 11\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6 14 9 10 13 13 10 11 12\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 18 7 1 2 3 18 7 18 3 6 3 4 5 6 14 9 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 4 11 4 9 10 4 5 8 9 8 5 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 4 11 4 9 10 4 5 6 9 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 4 11 4 7 10 4 5 6 7 10 7 8 9\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 9 1 2 3 18 9 18 3 4 9 4 7 8 4 5 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 4 11 4 5 10 10 5 8 9 5 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 11 1 2 3 18 11 18 3 4 11 4 5 10 10 5 6 9 9 6 7 8\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 18 9 1 2 3 18 9 18 3 4 9 4 5 8 8 5 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 18 7 1 2 3 18 7 18 3 4 7 4 5 6 14 9 10 13 13 10 11 12\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 18 7 1 2 3 18 7 18 3 4 7 4 5 6 14 9 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 5 1 2 3 18 5 18 3 4 12 5 6 11 11 6 9 10 6 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 18 5 1 2 3 18 5 18 3 4 12 5 6 11 11 6 7 10 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 6 13 6 1 18 5 1 2 3 18 5 18 3 4 13 6 7 12 12 7 8 11 11 8 9 10\n" + "18 1 9 0 15 16 17 0 7 14 15 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 14 7 8 13 13 8 9 12 12 9 10 11\n" + "18 1 9 0 15 16 17 0 7 14 15 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 14 7 8 13 13 8 9 10 13 10 11 12\n" + "18 1 9 0 15 16 17 0 7 14 15 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 14 7 8 11 11 8 9 10 14 11 12 13\n" + "18 1 9 0 15 16 17 0 7 14 15 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 14 7 8 9 14 9 12 13 9 10 11 12\n" + "18 1 9 0 15 16 17 0 7 14 15 0 1 6 7 6 1 18 5 1 2 3 18 5 18 3 4 14 7 8 9 14 9 10 13 13 10 11 12\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 10 11 5 6 18 10 18 6 7 8 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 18 11 5 6 9 18 9 6 7 8 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 18 11 5 6 7 18 11 18 7 10 7 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 4 5 1 2 3 4 12 5 6 11 11 6 18 10 6 7 8 18 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 4 5 1 2 3 4 13 18 5 12 5 6 11 12 11 6 7 10 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 4 5 1 2 3 4 13 18 5 12 5 6 11 12 11 6 7 8 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 18 18 4 5 6 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 18 9 18 3 4 7 7 4 5 6 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 10 2 3 8 18 8 3 4 7 7 4 5 6 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 18 9 18 3 4 5 9 18 5 8 5 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 18 7 18 3 4 5 7 18 5 6 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 18 2 3 6 7 6 3 4 5 18 7 8 9 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 10 2 3 6 18 6 3 4 5 10 18 6 7 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 18 8 2 3 6 18 6 3 4 5 8 18 6 7 14 15 16 17\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 7 8 2 3 6 7 6 3 4 5 11 8 9 10 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 9 10 11 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 7 8 2 3 6 7 6 3 4 5 12 18 8 11 8 9 10 11\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 18 18 2 7 8 2 3 6 7 6 3 4 5 10 18 8 9 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 18 18 2 7 8 2 3 6 7 6 3 4 5 10 18 8 9 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 18 18 2 7 8 2 3 6 7 6 3 4 5 10 18 8 9 14 15 16 17\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 11 18 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 18 11 18 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 11 18 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 18 10 11 13 14 15 16\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 18 8 4 5 6 18 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 7 8 2 3 4 7 7 4 5 6 11 8 9 10 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 9 10 11 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 18 18 2 7 8 2 3 4 7 7 4 5 6 10 18 8 9 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 18 18 2 7 8 2 3 4 7 7 4 5 6 10 18 8 9 13 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 11 18 9 10 13 14 15 16\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 18 11 12 13 15 18 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 18 10 11 15 12 13 14\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 18 18 6 7 8 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 18 2 3 4 5 18 5 6 9 9 6 7 8 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 7 10 7 8 9 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 7 10 7 8 9 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 5 8 2 3 4 5 8 5 6 7 11 8 9 10 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 18 2 3 4 5 18 5 6 7 11 18 7 10 7 8 9 10\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 5 18 2 3 4 5 18 5 6 7 9 18 7 8 14 11 12 13\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 5 18 2 3 4 5 18 5 6 7 9 18 7 8 15 12 13 14\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 9 10 11 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 18 18 2 5 8 2 3 4 5 8 5 6 7 10 18 8 9 15 12 13 14\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 11 18 9 10 15 12 13 14\n" + "18 1 9 0 18 16 17 0 11 14 18 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 14 11 12 13 18 14 15 16\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 14 18 10 11 14 11 12 13\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 18 12 15 16 12 13 14 15\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 10 2 3 4 18 10 18 4 9 4 5 8 9 8 5 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 10 2 3 4 18 10 18 4 9 4 5 6 9 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 10 2 3 4 18 10 18 4 7 4 5 6 7 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 8 2 3 4 18 8 18 4 7 4 5 6 7 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 18 8 2 3 4 18 8 18 4 7 4 5 6 7 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 18 8 2 3 4 18 8 18 4 7 4 5 6 7 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 18 8 2 3 4 18 8 18 4 7 4 5 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 10 2 3 4 18 10 18 4 5 10 5 8 9 5 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 10 2 3 4 18 10 18 4 5 10 5 6 9 9 6 7 8\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 18 8 2 3 4 18 8 18 4 5 8 5 6 7 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 18 6 2 3 4 18 6 18 4 5 11 6 7 10 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 12 7 8 11 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 8 13 8 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 13 8 9 12 12 9 10 11\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 14 9 10 13 13 10 11 12\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 2 7 7 2 18 6 2 3 4 18 6 18 4 5 14 9 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 5 6 2 3 4 5 11 6 18 10 6 7 8 18 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 5 6 2 3 4 5 12 18 6 11 6 7 10 11 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 18 8 18 4 5 6 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 18 9 3 4 7 18 7 4 5 6 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 18 18 3 8 9 3 4 7 8 7 4 5 6 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 18 18 3 8 9 3 4 5 8 8 5 6 7 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 6 18 3 4 5 6 18 6 7 8 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 18 18 3 6 9 3 4 5 6 9 6 7 8 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 18 9 3 4 5 18 9 18 5 8 5 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 18 9 3 4 5 18 9 18 5 6 9 6 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 18 7 3 4 5 18 7 18 5 6 10 7 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 11 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 9 9 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 12 9 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 10 13 10 1 2 9 9 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 13 10 11 12\n" + "18 1 9 0 15 16 17 0 11 14 15 0 1 10 11 10 1 2 9 9 2 3 8 8 3 18 7 3 4 5 18 7 18 5 6 14 11 12 13\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 18 18 3 6 7 3 4 5 6 11 18 7 10 7 8 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 18 8 4 5 6 18 8 18 6 7\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 18 18 4 7 8 4 5 6 7 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 18 18 3 4 9 9 4 7 8 4 5 6 7 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 18 18 5 6 7 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 18 18 4 5 8 8 5 6 7 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 18 18 3 4 9 9 4 5 8 8 5 6 7 11 18 9 10\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 18 18 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 12 18 10 11\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 18 13 18 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 13 18 11 12\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 12 18 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 14 18 12 13\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 18 14 15 16\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 7 7 4 5 6 10 7 8 9 18 14 15 16\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 18 18 4 5 6 10 18 6 9 6 7 8 9\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 18 18 4 5 6 8 18 6 7 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 18 18 4 5 6 8 18 6 7 14 15 16 17\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 3 8 8 3 4 7 7 4 5 6 11 8 9 10 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 9 9 2 3 18 18 3 4 7 7 4 5 6 9 18 7 8 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 18 18 3 4 7 7 4 5 6 9 18 7 8 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 18 18 3 4 7 7 4 5 6 9 18 7 8 14 15 16 17\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 10 11 10 1 2 18 18 2 3 8 8 3 4 7 7 4 5 6 10 18 8 9 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 18 18 2 3 8 8 3 4 7 7 4 5 6 10 18 8 9 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 18 18 2 3 8 8 3 4 7 7 4 5 6 10 18 8 9 14 15 16 17\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 10 13 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 11 12 15 0 1 18 11 18 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 11 18 9 10 15 12 13 14\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 18 11 18 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 11 18 9 10 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 18 11 18 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 11 18 9 10 14 15 16 17\n" + "18 1 9 0 15 16 17 0 11 18 15 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 18 11 12 13 15 18 13 14\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 10 18 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 14 18 10 11 14 11 12 13\n" + "18 1 9 0 15 16 17 0 18 12 15 0 1 10 18 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 18 10 11 15 12 13 14\n" + "18 1 9 0 13 16 17 0 18 12 13 0 1 10 18 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 18 10 11 13 14 15 16\n" + "18 1 9 0 13 14 17 0 18 12 13 0 1 10 18 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 18 10 11 14 15 16 17\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 18 12 13 14 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 5 10 5 18 9 5 6 7 18 9 18 7 8\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 11 11 2 3 6 6 3 4 5 11 6 7 10 10 7 8 9 18 14 15 16\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 18 12 13 14 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 18 18 3 4 5 11 18 5 10 5 6 9 10 9 6 7 8\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 18 18 3 4 5 9 18 5 8 5 6 7 8 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 18 18 3 4 5 9 18 5 8 5 6 7 8 14 15 16 17\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 11 12 13 16 16 13 14 15\n" + "18 1 9 0 11 14 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 11 12 13 14 14 15 16 17\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 12 15 16 17 12 13 14 15\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 18 18 3 4 5 7 18 5 6 12 13 16 17 16 13 14 15\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 7 7 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10 18 14 15 16\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 18 12 13 14 14 15 16 17\n" + "18 1 9 0 13 14 17 0 9 10 13 0 1 8 9 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 13 10 11 12 14 15 16 17\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 11 12 13 16 16 13 14 15\n" + "18 1 9 0 11 14 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 11 12 13 14 14 15 16 17\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 12 15 16 17 12 13 14 15\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 6 6 3 4 5 8 18 6 7 12 13 16 17 16 13 14 15\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 8 13 8 1 2 7 7 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11 18 14 15 16\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 18 12 13 14 14 15 16 17\n" + "18 1 9 0 15 16 17 0 9 10 15 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8 15 10 11 14 14 11 12 13\n" + "18 1 9 0 13 14 17 0 9 10 13 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8 13 10 11 12 14 15 16 17\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8 11 12 13 16 16 13 14 15\n" + "18 1 9 0 11 14 17 0 9 10 11 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8 11 12 13 14 14 15 16 17\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8 12 15 16 17 12 13 14 15\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 18 9 18 1 2 7 7 2 3 6 6 3 4 5 9 18 7 8 12 13 16 17 16 13 14 15\n" + "18 1 9 0 15 16 17 0 9 14 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 9 10 18 18 10 11 12 14 18 12 13\n" + "18 1 9 0 15 16 17 0 9 18 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 18 9 10 13 13 10 11 12 15 18 13 14\n" + "18 1 9 0 18 16 17 0 9 14 18 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12 18 14 15 16\n" + "18 1 9 0 15 16 17 0 9 18 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 18 9 10 11 15 18 11 14 11 12 13 14\n" + "18 1 9 0 15 16 17 0 18 14 15 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 14 18 8 9 14 9 10 13 13 10 11 12\n" + "18 1 9 0 13 14 17 0 18 12 13 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 12 18 8 9 12 9 10 11 14 15 16 17\n" + "18 1 9 0 15 16 17 0 18 10 15 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 15 10 11 14 14 11 12 13\n" + "18 1 9 0 13 14 17 0 18 10 13 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 13 10 11 12 14 15 16 17\n" + "18 1 9 0 11 16 17 0 18 10 11 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 18 10 11 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 11 12 13 16 16 13 14 15\n" + "18 1 9 0 11 14 17 0 18 10 11 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 11 12 13 14 14 15 16 17\n" + "18 1 9 0 11 12 17 0 18 10 11 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 12 15 16 17 12 13 14 15\n" + "18 1 9 0 11 12 17 0 18 10 11 0 1 8 18 8 1 2 7 7 2 3 6 6 3 4 5 10 18 8 9 12 13 16 17 16 13 14 15\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 18 16 18 12 13 14 16 18 14 15\n" + "18 1 9 0 11 18 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 15 18 15 12 13 14 18 15 16 17\n" + "18 1 9 0 11 18 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 18 18 13 16 17 13 14 15 16\n" + "18 1 9 0 18 16 17 0 9 10 18 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 18 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 18 12 17 0 9 10 18 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 18 10 11 12 12 13 16 17 16 13 14 15\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 18 16 17 12 13 14 18 16 18 14 15\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 9 10 4 5 18 9 18 5 6 7 9 18 7 8\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 18 10 4 5 8 18 8 5 6 7 10 18 8 9\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 18 10 4 5 6 18 10 18 6 9 6 7 8 9\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 18 8 4 5 6 18 8 18 6 7 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 18 8 4 5 6 18 8 18 6 7 14 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 5 10 10 5 18 9 5 6 7 18 9 18 7 8\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 12 13 12 1 2 5 5 2 3 4 12 5 6 11 11 6 7 10 10 7 8 9 18 14 15 16\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 18 12 13 14 14 15 16 17\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 18 16 18 12 13 14 16 18 14 15\n" + "18 1 9 0 11 18 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 15 18 15 12 13 14 18 15 16 17\n" + "18 1 9 0 11 18 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 18 18 13 16 17 13 14 15 16\n" + "18 1 9 0 18 12 17 0 9 10 18 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 18 10 11 12 12 13 16 17 16 13 14 15\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 18 16 17 12 13 14 18 16 18 14 15\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 18 18 2 3 4 10 18 4 9 4 5 8 9 8 5 6 7 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 18 18 2 3 4 10 18 4 9 4 5 8 9 8 5 6 7 14 15 16 17\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 11 12 15 16 15 12 13 14\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 11 12 13 16 16 13 14 15\n" + "18 1 9 0 11 14 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 11 12 13 14 14 15 16 17\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 12 15 16 17 12 13 14 15\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 18 18 2 3 4 8 18 4 7 4 5 6 7 12 13 16 17 16 13 14 15\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 9 10 15 16 15 10 11 14 14 11 12 13\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 9 10 15 16 15 10 11 12 15 12 13 14\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 9 10 13 16 13 10 11 12 16 13 14 15\n" + "18 1 9 0 9 14 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 9 10 13 14 13 10 11 12 14 15 16 17\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 9 10 11 16 16 11 14 15 11 12 13 14\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 9 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 9 12 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 9 10 11 12 12 13 16 17 16 13 14 15\n" + "18 1 9 0 9 10 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 10 15 16 17 10 11 14 15 14 11 12 13\n" + "18 1 9 0 9 10 17 0 7 8 9 0 1 6 7 6 1 2 18 18 2 3 4 6 18 4 5 10 15 16 17 10 11 12 15 15 12 13 14\n" + "18 1 9 0 18 16 17 0 13 14 18 0 1 6 13 6 1 2 5 5 2 3 4 13 6 7 12 12 7 8 11 11 8 9 10 18 14 15 16\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 13 14 15 18 18 15 16 17\n" + "18 1 9 0 18 16 17 0 11 12 18 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 18 12 13 16 16 13 14 15\n" + "18 1 9 0 18 14 17 0 11 12 18 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 18 12 13 14 14 15 16 17\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 18 16 18 12 13 14 16 18 14 15\n" + "18 1 9 0 11 18 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 15 18 15 12 13 14 18 15 16 17\n" + "18 1 9 0 11 18 17 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 18 18 13 16 17 13 14 15 16\n" + "18 1 9 0 18 12 17 0 9 10 18 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 18 10 11 12 12 13 16 17 16 13 14 15\n" + "18 1 9 0 11 12 17 0 7 8 11 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 11 8 9 10 12 13 16 17 16 13 14 15\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 9 10 15 16 15 10 11 14 14 11 12 13\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 9 10 15 16 15 10 11 12 15 12 13 14\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 9 10 13 16 13 10 11 12 16 13 14 15\n" + "18 1 9 0 9 14 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 9 10 13 14 13 10 11 12 14 15 16 17\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 9 10 11 16 16 11 14 15 11 12 13 14\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 9 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 9 10 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 10 15 16 17 10 11 14 15 14 11 12 13\n" + "18 1 9 0 9 10 17 0 7 8 9 0 1 18 7 18 1 2 5 5 2 3 4 7 18 5 6 10 15 16 17 10 11 12 15 15 12 13 14\n" +; + +const char* data_dqrgl_block30 = + "18 1 9 0 15 16 17 0 7 18 15 0 1 6 7 6 1 2 5 5 2 3 4 18 7 8 13 13 8 9 12 12 9 10 11 15 18 13 14\n" + "18 1 9 0 18 16 17 0 7 14 18 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 13 13 8 9 12 12 9 10 11 18 14 15 16\n" + "18 1 9 0 15 16 17 0 7 14 15 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 18 18 8 9 10 14 18 10 13 10 11 12 13\n" + "18 1 9 0 13 14 17 0 7 18 13 0 1 6 7 6 1 2 5 5 2 3 4 18 7 8 11 11 8 9 10 13 18 11 12 14 15 16 17\n" + "18 1 9 0 18 16 17 0 7 12 18 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 11 11 8 9 10 18 12 13 16 16 13 14 15\n" + "18 1 9 0 15 16 17 0 7 14 15 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 9 14 9 18 13 9 10 11 18 13 18 11 12\n" + "18 1 9 0 15 16 17 0 7 18 15 0 1 6 7 6 1 2 5 5 2 3 4 18 7 8 9 15 18 9 14 9 10 13 14 13 10 11 12\n" + "18 1 9 0 13 14 17 0 18 12 13 0 1 6 18 6 1 2 5 5 2 3 4 12 18 6 7 12 7 8 11 11 8 9 10 14 15 16 17\n" + "18 1 9 0 13 14 17 0 18 8 13 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 13 8 9 12 12 9 10 11 14 15 16 17\n" + "18 1 9 0 9 16 17 0 18 8 9 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 9 10 15 16 15 10 11 14 14 11 12 13\n" + "18 1 9 0 9 16 17 0 18 8 9 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 9 10 15 16 15 10 11 12 15 12 13 14\n" + "18 1 9 0 9 16 17 0 18 8 9 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 9 10 13 16 13 10 11 12 16 13 14 15\n" + "18 1 9 0 9 14 17 0 18 8 9 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 9 10 13 14 13 10 11 12 14 15 16 17\n" + "18 1 9 0 9 16 17 0 18 8 9 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 9 10 11 16 16 11 14 15 11 12 13 14\n" + "18 1 9 0 9 16 17 0 18 8 9 0 1 6 18 6 1 2 5 5 2 3 4 8 18 6 7 9 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 18 16 18 10 11 12 16 18 12 15 12 13 14 15\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 16 16 11 18 15 11 12 13 18 15 18 13 14\n" + "18 1 9 0 18 16 17 0 7 8 18 0 1 6 7 6 1 2 5 5 2 3 4 18 8 9 16 16 9 10 15 15 10 11 14 14 11 12 13\n" + "18 1 9 0 9 10 17 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 15 16 17 10 11 18 15 18 11 12 13 15 18 13 14\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 18 10 18 4 5 6 10 18 6 9 6 7 8 9\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 18 8 18 4 5 6 8 18 6 7 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 18 8 18 4 5 6 8 18 6 7 14 15 16 17\n" + "18 1 9 0 13 16 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 18 9 3 4 7 18 7 4 5 6 9 18 7 8 13 14 15 16\n" + "18 1 9 0 13 14 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 18 9 3 4 7 18 7 4 5 6 9 18 7 8 14 15 16 17\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 13 14 15 18 18 15 16 17\n" + "18 1 9 0 15 16 17 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 5 10 10 5 18 9 5 6 7 18 9 18 7 8\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 13 14 15 18 18 15 16 17\n" + "18 1 9 0 13 18 17 0 11 12 13 0 1 10 11 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 13 14 15 18 18 15 16 17\n" + "18 1 9 0 11 12 17 0 9 10 11 0 1 8 9 8 1 2 3 8 3 18 7 3 4 5 18 7 18 5 6 12 15 16 17 12 13 14 15\n" + "18 1 9 0 11 16 17 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 18 16 18 12 13 14 16 18 14 15\n" + "18 1 9 0 11 18 17 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 15 18 15 12 13 14 18 15 16 17\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 18 16 18 10 11 12 16 18 12 15 12 13 14 15\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 16 16 11 18 15 11 12 13 18 15 18 13 14\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 18 7 18 1 2 3 7 18 3 6 3 4 5 6 9 10 11 16 16 11 14 15 11 12 13 14\n" + "18 1 9 0 9 16 17 0 7 8 9 0 1 18 7 18 1 2 3 7 18 3 6 3 4 5 6 9 10 11 16 16 11 12 15 15 12 13 14\n" + "18 1 9 0 7 16 17 0 5 6 7 0 1 18 5 18 1 2 3 5 18 3 4 7 8 9 16 16 9 14 15 9 10 13 14 13 10 11 12\n" + "18 1 9 0 7 16 17 0 5 6 7 0 1 18 5 18 1 2 3 5 18 3 4 7 8 9 16 16 9 14 15 9 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 9 10 2 3 8 9 8 3 6 7 3 4 5 6\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 7 8 2 3 6 7 6 3 4 5 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 9 12 9 2 7 8 2 3 6 7 6 3 4 5 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 6 7 6 3 4 5 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 7 8 2 3 4 7 7 4 5 6 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 9 12 9 2 7 8 2 3 4 7 7 4 5 6 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 7 8 2 3 4 7 7 4 5 6 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 5 10 2 3 4 5 10 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 5 8 2 3 4 5 8 5 6 7 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 9 12 9 2 5 8 2 3 4 5 8 5 6 7 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 5 8 2 3 4 5 8 5 6 7 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 5 6 2 3 4 5 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 5 6 2 3 4 5 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 5 6 2 3 4 5 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 7 12 7 2 5 6 2 3 4 5 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 7 10 7 2 5 6 2 3 4 5 10 7 8 9 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 7 10 7 2 5 6 2 3 4 5 10 7 8 9 15 12 13 14\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 13 1 2 7 8 7 2 5 6 2 3 4 5 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 13 1 2 7 8 7 2 5 6 2 3 4 5 13 8 9 10 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 11 1 2 7 8 7 2 5 6 2 3 4 5 11 8 9 10 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 6 7 3 4 5 6 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 8 8 3 6 7 3 4 5 6 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 9 12 9 2 3 8 8 3 6 7 3 4 5 6 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 6 7 3 4 5 6 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 4 9 9 4 5 6 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 4 7 7 4 5 6 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 8 8 3 4 7 7 4 5 6 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 9 12 9 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 7 7 4 5 6 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 4 5 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 10 10 3 4 5 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 9 12 9 2 3 8 8 3 4 5 8 5 6 7 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 8 8 3 4 5 8 5 6 7 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 6 6 3 4 5 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 6 6 3 4 5 9 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 7 12 7 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 7 10 7 2 3 6 6 3 4 5 10 7 8 9 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 13 1 2 7 8 7 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 13 1 2 7 8 7 2 3 6 6 3 4 5 13 8 9 10 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 6 6 3 4 5 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 9 12 13 9 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 9 10 11 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 10 11 12 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 10 11 12 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 11 12 13 15 16 17 18\n" + "20 0 9 0 15 16 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 11 12 13 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 6 6 3 4 5 14 15 18 19 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 4 11 4 9 10 4 5 8 9 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 4 11 4 9 10 4 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 4 11 4 7 10 4 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 7 8 4 5 6 7 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 4 11 4 5 10 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 11 12 11 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 13 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 9 10 9 2 3 4 9 4 5 8 8 5 6 7 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 13 1 2 7 8 7 2 3 4 7 4 5 6 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 13 1 2 7 8 7 2 3 4 7 4 5 6 13 8 9 10 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 8 11 1 2 7 8 7 2 3 4 7 4 5 6 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 9 12 13 9 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 9 10 11 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 10 11 12 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 10 11 12 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 11 12 13 15 16 17 18\n" + "20 0 9 0 15 16 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 11 12 13 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 7 8 7 2 3 4 7 4 5 6 14 17 18 19 14 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 5 12 5 2 3 4 12 5 6 11 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 5 12 5 2 3 4 12 5 6 11 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 5 12 5 2 3 4 12 5 6 11 11 6 7 8 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 5 10 5 2 3 4 10 5 6 9 9 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 9 12 13 9 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 9 10 11 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 10 11 12 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 10 11 12 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 11 12 13 15 16 17 18\n" + "20 0 9 0 15 16 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 14 11 12 13 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 5 8 5 2 3 4 8 5 6 7 13 14 15 16 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 13 1 2 5 6 5 2 3 4 13 6 7 12 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 13 1 2 5 6 5 2 3 4 13 6 7 12 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 13 1 2 5 6 5 2 3 4 13 6 7 12 12 7 8 9 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 13 1 2 5 6 5 2 3 4 13 6 7 10 10 7 8 9 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 10 10 7 8 9 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 13 1 2 5 6 5 2 3 4 13 6 7 8 13 8 11 12 8 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 13 1 2 5 6 5 2 3 4 13 6 7 8 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 6 11 1 2 5 6 5 2 3 4 11 6 7 8 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 9 10 11 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 10 11 12 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 10 13 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 10 11 12 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 11 12 13 15 16 17 18\n" + "20 0 9 0 15 16 19 0 11 14 15 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 14 11 12 13 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 6 9 1 2 5 6 5 2 3 4 9 6 7 8 13 14 15 18 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 5 6 5 2 3 4 14 7 12 13 7 8 11 12 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 5 6 5 2 3 4 14 7 12 13 7 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 5 6 5 2 3 4 14 7 10 13 7 8 9 10 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 10 11 7 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 10 11 7 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 10 11 7 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 10 11 7 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 5 6 5 2 3 4 14 7 8 13 13 8 11 12 8 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 5 6 5 2 3 4 14 7 8 13 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 8 11 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 8 11 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 8 11 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 6 7 1 2 5 6 5 2 3 4 12 7 8 11 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 14 11 12 13 15 16 17 18\n" + "20 0 9 0 15 16 19 0 11 14 15 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 14 11 12 13 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 17 12 13 16 16 13 14 15\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 6 7 1 2 5 6 5 2 3 4 10 7 8 9 13 14 15 18 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 8 15 8 1 6 7 1 2 5 6 5 2 3 4 15 8 9 14 14 9 12 13 9 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 8 15 8 1 6 7 1 2 5 6 5 2 3 4 15 8 9 14 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 8 15 8 1 6 7 1 2 5 6 5 2 3 4 15 8 9 14 14 9 10 11 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 8 13 8 1 6 7 1 2 5 6 5 2 3 4 13 8 9 12 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 8 13 8 1 6 7 1 2 5 6 5 2 3 4 13 8 9 12 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 8 13 8 1 6 7 1 2 5 6 5 2 3 4 13 8 9 12 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 17 12 13 16 16 13 14 15\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 8 11 8 1 6 7 1 2 5 6 5 2 3 4 11 8 9 10 13 14 15 18 18 15 16 17\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 9 10 15 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 9 10 15 15 10 11 12 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 9 10 13 13 10 11 12 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 14 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 9 10 13 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 9 14 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 9 10 13 13 10 11 12 15 16 17 18\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 9 10 11 16 11 14 15 11 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 16 9 10 11 16 11 12 15 15 12 13 14\n" + "20 0 9 0 15 18 19 0 9 14 15 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 14 9 10 11 14 11 12 13 15 16 17 18\n" + "20 0 9 0 17 18 19 0 9 12 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11 17 12 13 16 16 13 14 15\n" + "20 0 9 0 13 18 19 0 9 12 13 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 9 12 13 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 12 9 10 11 13 14 15 18 18 15 16 17\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 10 15 16 10 11 14 15 14 11 12 13\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 10 15 16 10 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 10 13 16 10 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 10 11 16 16 11 14 15 11 12 13 14\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 10 11 16 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 17 10 11 16 16 11 12 13 16 13 14 15\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 17 18 17 12 15 16 12 13 14 15\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 17 18 17 12 13 16 16 13 14 15\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 17 18 17 12 13 14 17 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 15 18 15 12 13 14 18 15 16 17\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 13 18 18 13 16 17 13 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 6 7 1 2 5 6 5 2 3 4 11 12 13 18 18 13 14 17 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 10 11 3 4 9 10 9 4 7 8 4 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 10 11 3 4 9 10 9 4 5 8 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 10 11 3 4 9 10 9 4 5 6 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 10 11 3 4 7 10 7 4 5 6 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 8 11 3 4 7 8 7 4 5 6 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 10 11 3 4 5 10 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 10 11 3 4 5 10 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 6 11 3 4 5 6 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 6 11 3 4 5 6 11 6 7 8 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 14 9 12 13 9 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 9 10 11 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 12 9 10 11 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 10 11 12 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 14 11 12 13 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 17 12 13 16 16 13 14 15\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 6 7 3 4 5 6 13 14 15 18 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 9 10 4 5 8 9 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 9 10 4 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 7 10 4 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 7 8 4 5 6 7 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 5 10 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 5 10 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 5 10 10 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 5 8 8 5 6 7 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 10 11 1 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 12 13 1 2 3 12 12 3 4 11 11 4 5 6 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 14 11 12 13 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 17 12 13 16 16 13 14 15\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 8 9 1 2 3 8 8 3 4 7 7 4 5 6 13 14 17 18 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 3 6 6 3 4 5 14 7 12 13 7 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 3 6 6 3 4 5 14 7 10 13 7 8 9 10 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 10 11 7 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 10 11 7 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 10 11 7 8 9 10 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 3 6 6 3 4 5 14 7 8 13 13 8 11 12 8 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 6 7 1 2 3 6 6 3 4 5 14 7 8 13 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 6 7 1 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 14 11 12 13 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 6 7 1 2 3 6 6 3 4 5 10 7 8 9 17 12 13 16 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 8 15 8 1 6 7 1 2 3 6 6 3 4 5 15 8 9 14 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 8 13 8 1 6 7 1 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 8 13 8 1 6 7 1 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 8 11 8 1 6 7 1 2 3 6 6 3 4 5 11 8 9 10 17 12 13 16 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 9 10 15 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 9 10 15 15 10 11 12 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 9 10 13 13 10 11 12 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 14 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12 17 14 15 16\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 9 10 11 16 11 14 15 11 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 16 9 10 11 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 12 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 12 9 10 11 17 12 13 16 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 10 15 16 10 11 14 15 14 11 12 13\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 10 15 16 10 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 10 13 16 10 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 10 11 16 16 11 14 15 11 12 13 14\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 10 11 16 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 6 7 1 2 3 6 6 3 4 5 17 10 11 16 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 8 11 5 6 7 8 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 8 9 5 6 7 8 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 10 10 5 8 9 5 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 11 1 2 3 4 11 4 5 10 10 5 8 9 5 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 6 11 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 6 11 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 6 11 11 6 7 8 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 6 9 9 6 7 8 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 10 10 5 6 9 9 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 6 7 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 12 12 5 6 7 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 10 10 5 6 7 10 7 8 9 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 8 8 5 6 7 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 4 11 1 2 3 4 11 4 5 8 8 5 6 7 11 8 9 10 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 8 8 5 6 7 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 8 8 5 6 7 11 8 9 10 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 9 10 11 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 12 9 10 11 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 13 10 11 12 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 14 11 12 13 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 8 8 5 6 7 17 12 13 16 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 6 13 6 11 12 6 7 10 11 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 6 13 6 11 12 6 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 6 13 6 9 12 6 7 8 9 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 9 10 6 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 9 10 6 7 8 9 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 6 13 6 7 12 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 13 1 2 3 4 13 4 5 6 13 6 7 12 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 7 10 10 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 4 11 1 2 3 4 11 4 5 6 11 6 7 10 10 7 8 9 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 14 11 12 13 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 4 9 1 2 3 4 9 4 5 6 9 6 7 8 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 7 1 2 3 4 7 4 5 6 14 7 8 13 13 8 11 12 8 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 7 1 2 3 4 7 4 5 6 14 7 8 13 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 4 7 1 2 3 4 7 4 5 6 12 7 8 11 11 8 9 10 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 4 7 1 2 3 4 7 4 5 6 10 7 8 9 14 11 12 13 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 8 15 8 1 4 7 1 2 3 4 7 4 5 6 15 8 9 14 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 8 13 8 1 4 7 1 2 3 4 7 4 5 6 13 8 9 12 12 9 10 11 17 14 15 16\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 9 10 15 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 9 10 15 15 10 11 12 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 9 10 13 13 10 11 12 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 9 10 11 16 11 14 15 11 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 4 7 1 2 3 4 7 4 5 6 16 9 10 11 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 12 13 5 6 11 12 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 12 13 5 6 11 12 11 6 7 8 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 12 13 5 6 9 12 9 6 7 8 12 9 10 11\n" +; + +const char* data_dqrgl_block31 = + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 10 13 5 6 9 10 9 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 12 13 5 6 7 12 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 12 13 5 6 7 12 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 8 13 5 6 7 8 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 6 13 13 6 11 12 6 7 10 11 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 6 13 13 6 11 12 6 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 6 13 13 6 9 12 6 7 8 9 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 6 13 13 6 7 12 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 6 13 13 6 7 12 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 4 5 1 2 3 4 14 5 6 13 13 6 7 12 12 7 8 9 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 6 15 6 1 4 5 1 2 3 4 15 6 7 14 14 7 8 13 13 8 11 12 8 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 6 15 6 1 4 5 1 2 3 4 15 6 7 14 14 7 8 13 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 10 11 10 3 4 9 9 4 7 8 4 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 10 11 10 3 4 9 9 4 5 8 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 10 11 10 3 4 9 9 4 5 6 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 10 11 10 3 4 7 7 4 5 6 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 8 11 8 3 4 7 7 4 5 6 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 9 12 2 3 8 9 8 3 4 7 7 4 5 6 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 7 7 4 5 6 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 10 11 10 3 4 5 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 10 11 10 3 4 5 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 8 9 8 3 4 5 8 5 6 7 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 6 11 6 3 4 5 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 6 9 6 3 4 5 9 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 7 12 2 3 6 7 6 3 4 5 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 7 12 2 3 6 7 6 3 4 5 12 7 8 9 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 10 2 3 6 7 6 3 4 5 10 7 8 9 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 7 8 2 3 6 7 6 3 4 5 13 8 11 12 8 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 7 8 2 3 6 7 6 3 4 5 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 7 8 2 3 6 7 6 3 4 5 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 7 8 2 3 6 7 6 3 4 5 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 8 2 3 6 7 6 3 4 5 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 8 2 3 6 7 6 3 4 5 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 13 10 11 12 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 14 11 12 13 17 14 15 16\n" + "20 0 9 0 15 18 19 0 11 14 15 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 14 11 12 13 15 16 17 18\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 17 12 13 16 16 13 14 15\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 7 8 2 3 6 7 6 3 4 5 13 14 15 18 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 4 11 11 4 9 10 4 5 8 9 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 4 11 11 4 9 10 4 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 4 11 11 4 7 10 4 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 7 8 4 5 6 7 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 4 11 11 4 5 10 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 11 12 2 3 4 11 11 4 5 10 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 9 10 2 3 4 9 9 4 5 8 8 5 6 7 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 7 8 2 3 4 7 7 4 5 6 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 7 8 2 3 4 7 7 4 5 6 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 7 8 2 3 4 7 7 4 5 6 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 7 8 2 3 4 7 7 4 5 6 11 8 9 10 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 12 9 10 11 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 13 10 11 12 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 14 11 12 13 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 17 12 15 16 12 13 14 15\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 2 9 9 2 7 8 2 3 4 7 7 4 5 6 17 12 13 16 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 12 2 3 4 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 12 2 3 4 5 12 5 6 11 11 6 7 8 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 12 2 3 4 5 12 5 6 9 9 6 7 8 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 9 9 6 7 8 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 12 2 3 4 5 12 5 6 7 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 12 2 3 4 5 12 5 6 7 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 7 10 7 8 9 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 7 10 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 5 10 2 3 4 5 10 5 6 7 10 7 8 9 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 8 2 3 4 5 8 5 6 7 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 5 8 2 3 4 5 8 5 6 7 11 8 9 10 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 5 8 2 3 4 5 8 5 6 7 11 8 9 10 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 12 9 10 11 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 5 8 2 3 4 5 8 5 6 7 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 6 2 3 4 5 13 6 11 12 6 7 10 11 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 6 2 3 4 5 13 6 11 12 6 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 6 2 3 4 5 13 6 9 12 6 7 8 9 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 6 2 3 4 5 13 6 7 12 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 5 6 2 3 4 5 13 6 7 12 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 7 7 2 5 6 2 3 4 5 14 7 8 13 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 10 11 3 4 9 10 9 4 5 8 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 10 11 3 4 9 10 9 4 5 6 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 10 11 3 4 7 10 7 4 5 6 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 8 11 3 4 7 8 7 4 5 6 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 8 9 3 4 7 8 7 4 5 6 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 7 8 7 4 5 6 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 10 11 3 4 5 10 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 10 11 3 4 5 10 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 8 9 3 4 5 8 8 5 6 7 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 8 9 3 4 5 8 8 5 6 7 15 16 17 18\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 6 11 3 4 5 6 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 6 11 3 4 5 6 11 6 7 8 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 6 9 3 4 5 6 9 6 7 8 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 6 9 3 4 5 6 9 6 7 8 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 6 7 3 4 5 6 12 7 10 11 7 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 6 7 3 4 5 6 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 6 7 3 4 5 6 10 7 8 9 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 8 8 3 6 7 3 4 5 6 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 9 9 2 3 8 8 3 6 7 3 4 5 6 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 9 10 4 5 8 9 8 5 6 7\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 9 10 4 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 7 10 4 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 7 8 4 5 6 7 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 9 9 4 7 8 4 5 6 7 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 10 10 3 4 9 9 4 7 8 4 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 5 10 10 5 8 9 5 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 5 10 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 5 10 10 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 5 8 8 5 6 7 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 9 9 4 5 8 8 5 6 7 12 9 10 11\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 13 10 11 12\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 14 11 12 13\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 12 15 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 15 12 13 14\n" + "20 0 9 0 17 18 19 0 13 16 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 16 13 14 15\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 9 9 4 5 8 8 5 6 7 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 5 6 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 11 11 4 5 6 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 7 7 4 5 6 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 7 7 4 5 6 10 7 8 9 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 7 7 4 5 6 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 7 7 4 5 6 10 7 8 9 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 8 8 3 4 7 7 4 5 6 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 3 8 8 3 4 7 7 4 5 6 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 8 8 3 4 7 7 4 5 6 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 8 8 3 4 7 7 4 5 6 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 10 15 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 10 13 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 10 13 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 10 13 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 10 11 12 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 11 16 17 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 16 11 12 13 16 13 14 15\n" + "20 0 9 0 17 18 19 0 11 14 17 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 14 11 12 13 17 14 15 16\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 8 8 3 4 7 7 4 5 6 14 15 18 19 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 5 12 5 10 11 5 6 9 10 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 5 12 5 10 11 5 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 5 12 5 8 11 5 6 7 8 11 8 9 10\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 5 10 5 8 9 5 6 7 8 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 5 10 5 8 9 5 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 5 12 5 6 11 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 12 12 3 4 5 12 5 6 11 11 6 7 10 10 7 8 9\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 10 10 3 4 5 10 5 6 9 9 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 6 6 3 4 5 13 6 7 12 12 7 8 11 11 8 9 10\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 11 11 2 3 6 6 3 4 5 11 6 7 10 10 7 8 9 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 6 6 3 4 5 11 6 7 10 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 6 6 3 4 5 11 6 7 10 10 7 8 9 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 6 6 3 4 5 9 6 7 8 14 15 18 19 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 7 7 2 3 6 6 3 4 5 14 7 8 13 13 8 9 12 12 9 10 11\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 7 7 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 7 7 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 7 7 2 3 6 6 3 4 5 12 7 8 11 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 7 7 2 3 6 6 3 4 5 10 7 8 9 14 15 18 19 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 8 15 8 1 2 7 7 2 3 6 6 3 4 5 15 8 9 14 14 9 10 13 13 10 11 12\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 8 13 8 1 2 7 7 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 8 13 8 1 2 7 7 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 8 13 8 1 2 7 7 2 3 6 6 3 4 5 13 8 9 12 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 8 11 8 1 2 7 7 2 3 6 6 3 4 5 11 8 9 10 14 15 18 19 18 15 16 17\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 9 10 15 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 9 10 15 15 10 11 12 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 9 10 13 13 10 11 12 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 14 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12 17 14 15 16\n" + "20 0 9 0 15 18 19 0 9 14 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12 15 16 17 18\n" + "20 0 9 0 15 16 19 0 9 14 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 14 9 10 13 13 10 11 12 16 17 18 19\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 9 10 11 16 11 14 15 11 12 13 14\n" + "20 0 9 0 17 18 19 0 9 16 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 16 9 10 11 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 9 12 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 9 10 11 17 12 13 16 16 13 14 15\n" + "20 0 9 0 17 18 19 0 9 10 17 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 17 10 11 16 16 11 12 15 15 12 13 14\n" + "20 0 9 0 15 16 19 0 9 10 15 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 15 10 11 14 14 11 12 13 16 17 18 19\n" + "20 0 9 0 13 14 19 0 9 10 13 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 13 10 11 12 14 15 18 19 18 15 16 17\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 17 18 17 12 13 16 16 13 14 15\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 17 18 17 12 13 14 17 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 15 18 15 12 13 14 18 15 16 17\n" + "20 0 9 0 11 16 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 15 16 15 12 13 14 16 17 18 19\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 18 18 13 16 17 13 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 18 18 13 14 17 17 14 15 16\n" + "20 0 9 0 11 14 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 11 12 13 14 14 15 18 19 18 15 16 17\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 17 18 19 12 13 16 17 16 13 14 15\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 17 18 19 12 13 14 17 17 14 15 16\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 15 18 19 12 13 14 15 18 15 16 17\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 13 18 19 18 13 16 17 13 14 15 16\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 7 7 2 3 6 6 3 4 5 12 13 18 19 18 13 14 17 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 11 12 4 5 10 11 10 5 6 9 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 11 12 4 5 10 11 10 5 6 7 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 11 12 4 5 8 11 8 5 6 7 11 8 9 10\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 9 12 4 5 8 9 8 5 6 7 12 9 10 11\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 9 10 4 5 8 9 8 5 6 7 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 9 10 4 5 8 9 8 5 6 7 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 11 12 4 5 6 11 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 11 12 4 5 6 11 11 6 7 10 10 7 8 9\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 9 10 4 5 6 9 9 6 7 8 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 9 10 4 5 6 9 9 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 7 12 4 5 6 7 12 7 8 11 11 8 9 10\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 7 10 4 5 6 7 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 7 10 4 5 6 7 10 7 8 9 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 9 9 2 3 4 9 4 7 8 4 5 6 7 14 15 18 19 18 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 5 12 12 5 10 11 5 6 9 10 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 5 12 12 5 10 11 5 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 5 12 12 5 8 11 5 6 7 8 11 8 9 10\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 5 10 10 5 8 9 5 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 13 13 2 3 4 13 4 5 12 12 5 6 11 11 6 9 10 6 7 8 9\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 11 11 2 3 4 11 4 5 10 10 5 6 9 9 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 12 13 12 1 2 5 5 2 3 4 12 5 6 11 11 6 7 10 10 7 8 9 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 5 5 2 3 4 12 5 6 11 11 6 7 10 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 5 5 2 3 4 12 5 6 11 11 6 7 10 10 7 8 9 16 17 18 19\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 5 5 2 3 4 10 5 6 9 9 6 7 8 14 15 18 19 18 15 16 17\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 17 18 17 12 13 16 16 13 14 15\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 17 18 17 12 13 14 17 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 15 18 15 12 13 14 18 15 16 17\n" + "20 0 9 0 11 16 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 15 16 15 12 13 14 16 17 18 19\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 18 18 13 16 17 13 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 18 18 13 14 17 17 14 15 16\n" + "20 0 9 0 11 14 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 11 12 13 14 14 15 18 19 18 15 16 17\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 17 18 19 12 13 16 17 16 13 14 15\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 17 18 19 12 13 14 17 17 14 15 16\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 5 5 2 3 4 8 5 6 7 12 15 18 19 12 13 14 15 18 15 16 17\n" + "20 0 9 0 17 18 19 0 13 14 17 0 1 6 13 6 1 2 5 5 2 3 4 13 6 7 12 12 7 8 11 11 8 9 10 17 14 15 16\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 6 13 6 1 2 5 5 2 3 4 13 6 7 12 12 7 8 11 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 6 13 6 1 2 5 5 2 3 4 13 6 7 12 12 7 8 11 11 8 9 10 16 17 18 19\n" + "20 0 9 0 17 18 19 0 11 12 17 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 11 12 15 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 15 12 13 14 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 6 11 6 1 2 5 5 2 3 4 11 6 7 10 10 7 8 9 14 15 18 19 18 15 16 17\n" + "20 0 9 0 13 14 19 0 9 10 13 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 13 10 11 12 14 15 18 19 18 15 16 17\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 17 18 17 12 13 16 16 13 14 15\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 17 18 17 12 13 14 17 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 15 18 15 12 13 14 18 15 16 17\n" + "20 0 9 0 11 16 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 15 16 15 12 13 14 16 17 18 19\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 18 18 13 16 17 13 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 18 18 13 14 17 17 14 15 16\n" + "20 0 9 0 11 14 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 11 12 13 14 14 15 18 19 18 15 16 17\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 12 17 18 19 12 13 16 17 16 13 14 15\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 6 9 6 1 2 5 5 2 3 4 9 6 7 8 12 17 18 19 12 13 14 17 17 14 15 16\n" + "20 0 9 0 17 18 19 0 7 14 17 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 13 13 8 9 12 12 9 10 11 17 14 15 16\n" + "20 0 9 0 15 16 19 0 7 14 15 0 1 6 7 6 1 2 5 5 2 3 4 14 7 8 13 13 8 9 12 12 9 10 11 16 17 18 19\n" + "20 0 9 0 17 18 19 0 7 16 17 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 11 11 8 9 10 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 7 12 17 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 11 11 8 9 10 17 12 13 16 16 13 14 15\n" + "20 0 9 0 15 16 19 0 7 12 15 0 1 6 7 6 1 2 5 5 2 3 4 12 7 8 11 11 8 9 10 15 12 13 14 16 17 18 19\n" + "20 0 9 0 17 18 19 0 7 16 17 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 9 16 9 14 15 9 10 13 14 13 10 11 12\n" + "20 0 9 0 17 18 19 0 7 16 17 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 9 16 9 14 15 9 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 7 16 17 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 9 16 9 12 15 9 10 11 12 15 12 13 14\n" + "20 0 9 0 17 18 19 0 7 16 17 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 9 16 9 10 15 15 10 13 14 10 11 12 13\n" + "20 0 9 0 17 18 19 0 7 16 17 0 1 6 7 6 1 2 5 5 2 3 4 16 7 8 9 16 9 10 15 15 10 11 14 14 11 12 13\n" + "20 0 9 0 17 18 19 0 7 10 17 0 1 6 7 6 1 2 5 5 2 3 4 10 7 8 9 17 10 11 16 16 11 12 15 15 12 13 14\n" + "20 0 9 0 15 16 19 0 7 8 15 0 1 6 7 6 1 2 5 5 2 3 4 15 8 9 14 14 9 10 13 13 10 11 12 16 17 18 19\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 17 18 17 10 11 12 17 12 15 16 12 13 14 15\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 17 18 17 10 11 12 17 12 13 16 16 13 14 15\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 13 18 13 10 11 12 18 13 14 17 17 14 15 16\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 18 18 11 16 17 11 12 15 16 15 12 13 14\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 18 18 11 16 17 11 12 13 16 16 13 14 15\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 18 18 11 14 17 11 12 13 14 17 14 15 16\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 18 18 11 12 17 17 12 15 16 12 13 14 15\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 9 10 11 18 18 11 12 17 17 12 13 16 16 13 14 15\n" + "20 0 9 0 9 10 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 17 18 19 10 11 16 17 16 11 12 15 15 12 13 14\n" + "20 0 9 0 9 10 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 17 18 19 10 11 16 17 16 11 12 13 16 13 14 15\n" + "20 0 9 0 9 10 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 17 18 19 10 11 14 17 14 11 12 13 17 14 15 16\n" + "20 0 9 0 9 10 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 17 18 19 10 11 12 17 17 12 15 16 12 13 14 15\n" + "20 0 9 0 9 10 19 0 7 8 9 0 1 6 7 6 1 2 5 5 2 3 4 10 17 18 19 10 11 12 17 17 12 13 16 16 13 14 15\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 12 13 3 4 11 12 11 4 5 6 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 12 13 3 4 11 12 11 4 5 6 11 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 12 13 3 4 7 12 7 4 5 6 12 7 8 11 11 8 9 10\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 7 10 7 4 5 6 10 7 8 9 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 7 10 7 4 5 6 10 7 8 9 16 17 18 19\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 8 11 3 4 7 8 7 4 5 6 11 8 9 10 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 8 11 3 4 7 8 7 4 5 6 11 8 9 10 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 13 14 17 18 17 14 15 16\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 7 8 7 4 5 6 14 17 18 19 14 15 16 17\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 12 13 3 4 5 12 12 5 10 11 5 6 9 10 9 6 7 8\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 12 13 3 4 5 12 12 5 10 11 5 6 7 10 10 7 8 9\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 12 13 3 4 5 12 12 5 8 11 5 6 7 8 11 8 9 10\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 5 10 10 5 8 9 5 6 7 8 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 5 10 10 5 8 9 5 6 7 8 16 17 18 19\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 12 13 3 4 5 12 12 5 6 11 11 6 9 10 6 7 8 9\n" + "20 0 9 0 15 18 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 5 10 10 5 6 9 9 6 7 8 15 16 17 18\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 10 11 3 4 5 10 10 5 6 9 9 6 7 8 16 17 18 19\n" + "20 0 9 0 13 18 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 13 14 15 18 18 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 8 9 3 4 5 8 8 5 6 7 14 17 18 19 14 15 16 17\n" + "20 0 9 0 13 16 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 13 14 15 16 16 17 18 19\n" + "20 0 9 0 13 14 19 0 11 12 13 0 1 10 11 10 1 2 3 10 3 6 9 3 4 5 6 9 6 7 8 14 17 18 19 14 15 16 17\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 12 17 18 19 12 13 16 17 16 13 14 15\n" + "20 0 9 0 11 12 19 0 9 10 11 0 1 8 9 8 1 2 3 8 3 6 7 3 4 5 6 12 17 18 19 12 13 14 17 17 14 15 16\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 14 15 14 1 2 3 14 3 4 13 13 4 11 12 4 5 10 11 10 5 6 7 10 7 8 9\n" + "20 0 9 0 15 16 19 0 13 14 15 0 1 12 13 12 1 2 3 12 3 4 11 11 4 9 10 4 5 8 9 8 5 6 7 16 17 18 19\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 15 18 15 12 13 14 18 15 16 17\n" + "20 0 9 0 11 16 19 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 15 16 15 12 13 14 16 17 18 19\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 13 18 18 13 16 17 13 14 15 16\n" + "20 0 9 0 11 18 19 0 9 10 11 0 1 4 9 4 1 2 3 9 4 5 8 8 5 6 7 11 12 13 18 18 13 14 17 17 14 15 16\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 18 18 11 16 17 11 12 15 16 15 12 13 14\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 18 18 11 16 17 11 12 13 16 16 13 14 15\n" + "20 0 9 0 9 18 19 0 7 8 9 0 1 4 7 4 1 2 3 7 4 5 6 9 10 11 18 18 11 14 17 11 12 13 14 17 14 15 16\n" + "20 0 9 0 15 16 19 0 5 10 15 0 1 4 5 4 1 2 3 10 5 6 9 9 6 7 8 15 10 11 14 14 11 12 13 16 17 18 19\n" + "20 0 9 0 7 18 19 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 18 18 9 16 17 9 10 11 16 16 11 14 15 11 12 13 14\n" + "20 0 9 0 7 18 19 0 5 6 7 0 1 4 5 4 1 2 3 7 8 9 18 18 9 16 17 9 10 11 16 16 11 12 15 15 12 13 14\n" + "20 0 9 0 17 18 19 0 15 16 17 0 1 2 15 15 2 13 14 2 3 4 13 13 4 11 12 4 5 6 11 11 6 9 10 6 7 8 9\n" + "20 0 9 0 17 18 19 0 1 16 17 16 1 2 15 15 2 3 14 14 3 4 13 13 4 5 12 12 5 6 11 11 6 7 10 10 7 8 9\n" +; + +void diskQuadrangulationConcat(std::string& data) { + data = data + std::string(data_dqrgl_block0) + std::string(data_dqrgl_block1) + + std::string(data_dqrgl_block2) + std::string(data_dqrgl_block3) + + std::string(data_dqrgl_block4) + std::string(data_dqrgl_block5) + + std::string(data_dqrgl_block6) + std::string(data_dqrgl_block7) + + std::string(data_dqrgl_block8) + std::string(data_dqrgl_block9) + + std::string(data_dqrgl_block10) + std::string(data_dqrgl_block11) + + std::string(data_dqrgl_block12) + std::string(data_dqrgl_block13) + + std::string(data_dqrgl_block14) + std::string(data_dqrgl_block15) + + std::string(data_dqrgl_block16) + std::string(data_dqrgl_block17) + + std::string(data_dqrgl_block18) + std::string(data_dqrgl_block19) + + std::string(data_dqrgl_block20) + std::string(data_dqrgl_block21) + + std::string(data_dqrgl_block22) + std::string(data_dqrgl_block23) + + std::string(data_dqrgl_block24) + std::string(data_dqrgl_block25) + + std::string(data_dqrgl_block26) + std::string(data_dqrgl_block27) + + std::string(data_dqrgl_block28) + std::string(data_dqrgl_block29) + + std::string(data_dqrgl_block30) + std::string(data_dqrgl_block31) ; +}; + diff --git a/contrib/QuadMeshingTools/geolog.cpp b/contrib/QuadMeshingTools/geolog.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ab3b77b62926366da11f270502f4e11459940b9c --- /dev/null +++ b/contrib/QuadMeshingTools/geolog.cpp @@ -0,0 +1,353 @@ +#include "geolog.h" +#include <iostream> +#include <fstream> +#include <unordered_map> + +#define GMSH_LINKED +#if defined(GMSH_LINKED) + #include "gmsh.h" + #include "Context.h" + #include "MVertex.h" + #include "MElement.h" + #include "MTriangle.h" + #include "MQuadrangle.h" +#endif + + + +namespace GeoLog { + std::vector<View> views; /* global variable instanciation */ + + vec3 geolog_points_center(const std::vector<vec3>& pts) { + if (pts.size() == 0) return {0.,0.,0.}; + vec3 center = {0.,0.,0.}; + for (size_t i = 0; i < pts.size(); ++i) { + for (size_t d = 0; d < 3; ++d) { + center[d] = center[d] + pts[i][d]; + } + } + for (size_t d = 0; d < 3; ++d) { + center[d] = 1./double(pts.size()) * center[d]; + } + return center; + } + + View& get_global_view(const std::string& name) { + bool found = false; + for (size_t i = 0; i < views.size() && !found; ++i) { + if (views[i].name == name) { + return views[i]; + } + } + View nv; + nv.name = name; + views.push_back(nv); + return views.back(); + } + + bool add(const std::vector<vec3>& pts, const std::vector<double>& values, const std::string& view, bool isCell) { + if (pts.size() == 0) return false; + GObj obj; + obj.pts.resize(pts.size()); + obj.values.resize(pts.size()); + obj.isVector = false; + obj.isCell = isCell; + for (size_t i = 0; i < pts.size(); ++i) { + obj.pts[i] = pts[i]; + if (values.size() == 0) { + obj.values[i] = 0.; + } else if (values.size() == pts.size()) { + obj.values[i] = values[i]; + } else { + obj.values[i] = values[0]; + } + } + View& V = get_global_view(view); + V.objs.push_back(obj); + return true; + } + + bool add(vec3 p, double value, const std::string& view) { + return add(std::vector<vec3>{p},std::vector<double>{value}, view, false); + } + + bool add(const std::vector<vec3>& pts, double value, const std::string& view, bool isCell) { + return add(pts,std::vector<double>{value}, view, isCell); + } + + double geolog_norm(vec3 a) { + return std::sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]); + } + + bool add(vec3 p, vec3 n, const std::string& view) { + GObj obj; + obj.isVector = true; + obj.isCell = false; + obj.pts.resize(1); + obj.values.resize(3); + obj.pts[0] = p; + obj.values[0] = n[0]; + obj.values[1] = n[1]; + obj.values[2] = n[2]; + View& V = get_global_view(view); + V.objs.push_back(obj); + return true; + } + + bool add(const std::vector<vec3>& pts, vec3 n, const std::string& view) { + if (pts.size() == 0) return false; + vec3 center = geolog_points_center(pts); + return add(center, n, view); + } + + + bool add(vec3 p, const std::string& text, const std::string& view) { + GObj obj; + obj.isVector = false; + obj.isCell = false; + obj.pts.resize(1); + obj.pts[0] = p; + obj.text = text; + View& V = get_global_view(view); + V.objs.push_back(obj); + return true; + } + + bool add(const std::vector<vec3>& pts, const std::string& text, const std::string& view) { + if (pts.size() == 0) return false; + vec3 center = geolog_points_center(pts); + return add(center, text, view); + } + + bool add(const std::vector<MElement*>& elements, const std::string& view) { +#if defined(GMSH_LINKED) + View& V = get_global_view(view); + size_t e0 = V.objs.size(); + V.objs.resize(V.objs.size()+elements.size()); + for (size_t i = 0; i < elements.size(); ++i) { + MElement* elt = elements[i]; + if (elt == nullptr) continue; + size_t nv = elt->getNumVertices(); + V.objs[e0+i].isVector = false; + V.objs[e0+i].isCell = false; + if (elt->getDim() == 3) { + V.objs[e0+i].isCell = true; + } + V.objs[e0+i].pts.resize(nv); + V.objs[e0+i].values.resize(nv,0.); + for (size_t lv = 0; lv < nv; ++lv) { + MVertex* v = elt->getVertex(lv); + V.objs[e0+i].pts[lv][0] = v->x(); + V.objs[e0+i].pts[lv][1] = v->y(); + V.objs[e0+i].pts[lv][2] = v->z(); + } + } + + return true; +#endif + return false; + } + + bool add(const std::vector<MElement*>& elements, const std::unordered_map<MVertex*,double>& field, const std::string& view) { +#if defined(GMSH_LINKED) + View& V = get_global_view(view); + size_t e0 = V.objs.size(); + V.objs.resize(V.objs.size()+elements.size()); + for (size_t i = 0; i < elements.size(); ++i) { + MElement* elt = elements[i]; + if (elt == nullptr) continue; + size_t nv = elt->getNumVertices(); + V.objs[e0+i].isVector = false; + V.objs[e0+i].isCell = false; + if (elt->getDim() == 3) { + V.objs[e0+i].isCell = true; + } + V.objs[e0+i].pts.resize(nv); + V.objs[e0+i].values.resize(nv,0.); + for (size_t lv = 0; lv < nv; ++lv) { + MVertex* v = elt->getVertex(lv); + V.objs[e0+i].pts[lv][0] = v->x(); + V.objs[e0+i].pts[lv][1] = v->y(); + V.objs[e0+i].pts[lv][2] = v->z(); + auto it = field.find(v); + if (it != field.end()) { + V.objs[e0+i].values[lv] = it->second; + } + } + } + + return true; +#endif + return false; + } + + bool add(const std::vector<MElement*>& elements, const std::vector<std::vector<double> >& field, const std::string& view) { +#if defined(GMSH_LINKED) + if (elements.size() != field.size()) return false; + View& V = get_global_view(view); + size_t e0 = V.objs.size(); + V.objs.resize(V.objs.size()+elements.size()); + for (size_t i = 0; i < elements.size(); ++i) { + MElement* elt = elements[i]; + if (elt == nullptr) continue; + size_t nv = elt->getNumVertices(); + if (field[i].size() != nv) return false; + V.objs[e0+i].isVector = false; + V.objs[e0+i].isCell = false; + if (elt->getDim() == 3) { + V.objs[e0+i].isCell = true; + } + V.objs[e0+i].pts.resize(nv); + V.objs[e0+i].values.resize(nv,0.); + for (size_t lv = 0; lv < nv; ++lv) { + MVertex* v = elt->getVertex(lv); + V.objs[e0+i].pts[lv][0] = v->x(); + V.objs[e0+i].pts[lv][1] = v->y(); + V.objs[e0+i].pts[lv][2] = v->z(); + V.objs[e0+i].values[lv] = field[i][lv]; + } + } + + return true; +#endif + return false; + + } + + std::string gobj_type(const GObj& obj) { + if (obj.pts.size() == 1 && obj.isVector) { + return "VP"; + } else if (obj.pts.size() == 1 && obj.text.size() > 0) { + return "text"; + } else if (obj.pts.size() == 1 && obj.values.size() == 1) { + return "SP"; + } else if (obj.pts.size() == 2) { + return "SL"; + } else if (obj.pts.size() == 3) { + return "ST"; + } else if (obj.pts.size() == 4 && !obj.isCell) { + return "SQ"; + } else if (obj.pts.size() == 4 && obj.isCell) { + return "SS"; + } else if (obj.pts.size() == 5 && !obj.isCell) { + return "ST"; /* triangulation of polygon */ + } else if (obj.pts.size() == 5 && obj.isCell) { + return "SY"; + } else if (obj.pts.size() == 6 && !obj.isCell) { + return "ST"; /* triangulation of polygon */ + } else if (obj.pts.size() == 6 && obj.isCell) { + return "SI"; + } else if (obj.pts.size() == 7 && !obj.isCell) { + return "ST"; /* triangulation of polygon */ + } else if (obj.pts.size() == 8 && !obj.isCell) { + return "ST"; /* triangulation of polygon */ + } else if (obj.pts.size() == 8 && obj.isCell) { + return "SH"; + } else if (obj.pts.size() > 8 && !obj.isCell) { + return "ST"; /* triangulation of polygon */ + } + return ""; + } + + bool prepare_data(const GObj& obj, const std::string& ty, std::vector<double>& data, int& numElem) { + size_t N = obj.pts.size(); + if (ty == "ST" && N > 3) { /* Require triangulation of polygon */ + vec3 center = geolog_points_center(obj.pts); + for (size_t i = 0; i < obj.pts.size(); ++i) { + vec3 p1 = obj.pts[i]; + vec3 p2 = obj.pts[(i+1)%obj.pts.size()]; + double vmid = 0.5*(obj.values[i]+obj.values[(i+1)%obj.pts.size()]); + std::vector<vec3> tri_pts = {p1,p2,center}; + std::vector<double> tri_values = {obj.values[i],obj.values[(i+1)%obj.pts.size()],vmid}; + for (size_t d = 0; d < 3; ++d) { + for (size_t lv = 0; lv < 3; ++lv) { + data.push_back(tri_pts[lv][d]); + } + } + for (size_t lv = 0; lv < 3; ++lv) { + data.push_back(tri_values[lv]); + } + numElem += 1; + } + } else { + for (size_t d = 0; d < 3; ++d) { + for (size_t lv = 0; lv < N; ++lv) { + data.push_back(obj.pts[lv][d]); + } + } + for (size_t lv = 0; lv < N; ++lv) { + data.push_back(obj.values[lv]); + } + numElem += 1; + } + return true; + } + + bool export_to_gmsh() { +#if defined(GMSH_LINKED) + for (size_t v = 0; v < views.size(); ++v) { + if (views[v].objs.size() == 0) continue; + std::unordered_map<std::string,std::vector<double>> data_TYPE; + std::unordered_map<std::string,int> numElem_TYPE; + std::vector<std::string> data_string; + for (size_t i = 0; i < views[v].objs.size(); ++i) { + const GObj& obj = views[v].objs[i]; + if (obj.text.size() > 0 && obj.pts.size() == 1) { + for (size_t d = 0; d < 3; ++d) { + data_TYPE["text"].push_back(obj.pts[0][d]); + } + data_string.push_back(obj.text); + numElem_TYPE["text"] += 1; + } else if (obj.isVector && obj.pts.size() == 1 && obj.values.size() == 3) { + std::vector<double>& data = data_TYPE["VP"]; + for (size_t d = 0; d < 3; ++d) { + data.push_back(obj.pts[0][d]); + } + for (size_t d = 0; d < 3; ++d) { + data.push_back(obj.values[d]); + } + numElem_TYPE["VP"] += 1; + } else if (obj.pts.size() > 0 && obj.values.size() == obj.pts.size()) { + std::string ty = gobj_type(obj); + if (ty == "") { + std::cerr << "in GeoLog::export_to_gmsh(), GObj content not supported" << std::endl; + return false; + } + std::vector<double>& data = data_TYPE[ty]; + int& numElem = numElem_TYPE[ty]; + prepare_data(obj, ty, data, numElem); /* will triangulate polygons */ + } else { + std::cerr << "in GeoLog::export_to_gmsh(), GObj content not supported" << std::endl; + return false; + } + } + + + /* gmsh API calls */ + int aboe = CTX::instance()->abortOnError; + gmsh::initialize(); /* changes abortOnError !! */ + CTX::instance()->abortOnError = aboe; + int view = gmsh::view::add(views[v].name); + for (const auto& kv: data_TYPE) { + if (kv.first != "" && kv.first != "text") { + if (kv.second.size() > 0) gmsh::view::addListData(view, kv.first, numElem_TYPE[kv.first], kv.second); + } + } + if (data_string.size() > 0) { + gmsh::view::addListDataString(view, data_TYPE["text"], data_string); + } + } + + return true; +#else + return false; +#endif + } + + bool flush() { + export_to_gmsh(); + views.clear(); + return true; + } + +} diff --git a/contrib/QuadMeshingTools/geolog.h b/contrib/QuadMeshingTools/geolog.h new file mode 100644 index 0000000000000000000000000000000000000000..43e5cf830e18ee9dcd08a85a21f855019de09fe3 --- /dev/null +++ b/contrib/QuadMeshingTools/geolog.h @@ -0,0 +1,59 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include <vector> +#include <unordered_map> +#include <array> +#include <string> + +class MElement; +class MVertex; + +namespace GeoLog { + using vec3 = std::array<double,3>; + + struct GObj { + std::vector<vec3> pts; + std::vector<double> values; + bool isCell = false; + bool isVector = false; + std::string text = ""; + }; + + struct View { + std::string name; + std::vector<GObj> objs; + std::vector<std::pair<std::string,double>> optionsSetNumber; + }; + + /* Global variable */ + extern std::vector<View> views; + + /* Global functions (fill the global views) */ + /* - scalar values */ + bool add(vec3 p, double value, const std::string& view); + bool add(const std::vector<vec3>& pts, double value, const std::string& view, bool isCell = false); + bool add(const std::vector<vec3>& pts, const std::vector<double>& values, const std::string& view, bool isCell = false); + /* - vector value (vector at center if multiple points) */ + bool add(vec3 p, vec3 n, const std::string& view); + bool add(const std::vector<vec3>& pts, vec3 n, const std::string& view); + /* - text value (text at center if multiple points) */ + bool add(vec3 p, const std::string& text, const std::string& view); + bool add(const std::vector<vec3>& pts, const std::string& text, const std::string& view); + + /* - interface for gmsh types */ + bool add(const std::vector<MElement*>& elements, const std::string& view); + bool add(const std::vector<MElement*>& elements, const std::unordered_map<MVertex*,double>& field, const std::string& view); + bool add(const std::vector<MElement*>& elements, const std::vector<std::vector<double> >& field, const std::string& view); + + View& get_global_view(const std::string& name); + + /* Send the views to gmsh (deleting them in the process) */ + bool flush(); +} diff --git a/contrib/QuadMeshingTools/qmtCrossField.cpp b/contrib/QuadMeshingTools/qmtCrossField.cpp new file mode 100644 index 0000000000000000000000000000000000000000..df75ca9bd52bb4e0f0f832095b7540164a18724c --- /dev/null +++ b/contrib/QuadMeshingTools/qmtCrossField.cpp @@ -0,0 +1,1729 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "qmtCrossField.h" + +/* System includes */ +#include <vector> +#include <array> +#include <unordered_map> +#include <cstdint> +#include <cmath> +#include <algorithm> + +/* Gmsh includes */ +#include "GmshMessage.h" +#include "OS.h" +#include "MVertex.h" +#include "MLine.h" +#include "MTriangle.h" +#include "gmsh.h" + +/* Linear algebra solver */ +#if defined(HAVE_EIGEN) + #include<Eigen/IterativeLinearSolvers> + #include<Eigen/SparseCholesky> + #include<Eigen/SparseLU> +#endif +#if defined(HAVE_SOLVER) + #include "dofManager.h" + #include "laplaceTerm.h" + #include "linearSystemGmm.h" + #include "linearSystemCSR.h" + #include "linearSystemFull.h" + #include "linearSystemPETSc.h" + #include "linearSystemMUMPS.h" + #include "linearSystemEigen.h" +#endif + +/* QuadMeshingTools includes */ +#include "arrayGeometry.h" +#include "cppUtils.h" +#include "qmtMeshUtils.h" +#include "geolog.h" + + +/* TODO list: + * - Cross field smoother with a single Laplacian solve + * - Cross field smoother with a single factorization + * - MUMPS support + */ + +using namespace ArrayGeometry; +using namespace CppUtils; + +using std::vector; +using std::unordered_map; +using std::array; +using std::pair; + +namespace QMT { + + constexpr double EPS = 1.e-14; + + using id = uint32_t; + using sid = int64_t; + using id2 = std::array<id,2>; + using id3 = std::array<id,3>; + using sid3 = std::array<sid,3>; + constexpr id NO_ID = (id) -1; + constexpr sid NO_SID = (sid) NO_ID; + + struct IJV { + id2 ij; + double val; + bool operator<(const IJV& b) const { return ij[0] < b.ij[0] || (ij[0] == b.ij[0] && ij[1] < b.ij[1]); } + }; + + struct IV { + id i; + double val; + bool operator<(const IV& b) const { return i < b.i; } + }; + + + class CrossFieldLinearSystem { + protected: + size_t N = 0; +#if defined(HAVE_EIGEN) + Eigen::VectorXd x, b; + Eigen::SparseMatrix<double> A; + Eigen::SparseLU<Eigen::SparseMatrix<double> > solver; +#endif + + public: + CrossFieldLinearSystem(size_t N_):N(N_) { +#if defined(HAVE_EIGEN) + Msg::Debug("Eigen call: initialize sparse matrix, vectors and solver"); + x.resize(N); + x.fill(0.); + b.resize(N); + b.fill(0.); + A.resize(N,N); +#else + Msg::Error("Linear solver Eigen required"); +#endif + } + + bool add_sparse_coefficients( + const std::vector<std::vector<size_t>>& columns, + const std::vector<std::vector<double>>& values, + bool firstTime = false) { +#if defined(HAVE_EIGEN) + // Msg::Debug("Eigen call: add coefficients"); + std::vector<Eigen::Triplet<double,size_t> > triplets; + triplets.reserve(values.size()); + if (firstTime) { + for (size_t i = 0; i < columns.size(); ++i) { + for (size_t k = 0; k < columns[i].size(); ++k) { + size_t j = columns[i][k]; + double val = values[i][k]; + triplets.push_back({i,j,val}); + } + } + A.setFromTriplets(triplets.begin(),triplets.end()); + } else { + for (size_t i = 0; i < columns.size(); ++i) { + for (size_t k = 0; k < columns[i].size(); ++k) { + size_t j = columns[i][k]; + double val = values[i][k]; + A.coeffRef(i,j) += val; /* entry (i,j) should already exists */ + } + } + } + return true; +#else + Msg::Error("Linear solver Eigen required"); + return false; +#endif + } + + bool set_rhs_values(const std::vector<double>& rhs) { +#if defined(HAVE_EIGEN) + // Msg::Debug("Eigen call: add rhs values"); + for (size_t i = 0; i < rhs.size(); ++i) if (rhs[i] != 0.) { + b[i] = rhs[i]; + } + return true; +#else + Msg::Error("Linear solver Eigen required"); + return false; +#endif + } + + bool preprocess_sparsity_pattern() { +#if defined(HAVE_EIGEN) + Msg::Debug("Eigen call: analyse sparse matrix sparsity pattern"); + solver.analyzePattern(A); + return true; +#else + Msg::Error("Linear solver Eigen required"); + return false; +#endif + } + + bool factorize() { +#if defined(HAVE_EIGEN) + Msg::Debug("Eigen call: factorize sparse matrix"); + solver.factorize(A); + return true; +#else + Msg::Error("Linear solver Eigen required"); + return false; +#endif + } + + bool solve(std::vector<double>& slt) { +#if defined(HAVE_EIGEN) + Msg::Debug("Eigen call: solve linear system"); + x = solver.solve(b); + if (solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("Eigen: failed to solve linear system with SparseLU (%li variables)", N); + return false; + } + slt.resize(x.size()); + for (size_t i = 0; i < N; ++i) slt[i] = x[i]; + return true; +#else + Msg::Error("Linear solver Eigen required"); + return false; +#endif + } + + }; + + + bool compute_triangle_adjacencies( + const vector<id3>& triangles, + vector<sid3>& triangle_neighbors, + vector<vector<id>>& nm_triangle_neighbors, + vector<id2>& uIEdges, + vector<id>& old2IEdge, + vector<vector<id>>& uIEdgeToOld + ) { + triangle_neighbors.clear(); + triangle_neighbors.resize(triangles.size(),{NO_ID,NO_ID,NO_ID}); + nm_triangle_neighbors.clear(); + + constexpr size_t NBF = 3; + + /* Store element 'faces', with duplicates for further 'equality test' */ + std::vector<id2> faces; + for (size_t i = 0; i < triangles.size(); ++i) { + for (size_t lf = 0; lf < NBF; ++lf) { + id2 face = {triangles[i][lf],triangles[i][(lf+1)%NBF]}; + std::sort(face.begin(),face.end()); + faces.push_back(face); + } + } + + /* Reduce 'duplicated faces' to 'unique faces', keeping the 'old2new' mapping */ + size_t nbUniques = sort_unique_with_perm(faces, uIEdges, old2IEdge); + + /* Build the 'unique face to elements' mapping */ + uIEdgeToOld.resize(nbUniques); + for (size_t i = 0; i < triangles.size(); ++i) { + for (size_t lf = 0; lf < NBF; ++lf) { + id facePos = NBF*i+lf; + uIEdgeToOld[old2IEdge[facePos]].push_back(facePos); + } + } + + /* Loop over 'unique face to elements' and set the element adjacencies */ + constexpr id2 NO_FACE = {NO_ID,NO_ID}; + for (size_t i = 0; i < nbUniques; ++i) { + if (uIEdges[i] == NO_FACE) continue; + if(uIEdges[i][0] == NO_ID) return false; + if(uIEdges[i][1] == NO_ID) return false; + if (uIEdgeToOld[i].size() == 1) { /* boundary */ + id eltId = uIEdgeToOld[i][0] / NBF; + id lf = uIEdgeToOld[i][0] % NBF; + triangle_neighbors[eltId][lf] = NO_ID; + } else if (uIEdgeToOld[i].size() == 2) { /* regular face */ + id e1 = uIEdgeToOld[i][0] / NBF; + id lf1 = uIEdgeToOld[i][0] % NBF; + id e2 = uIEdgeToOld[i][1] / NBF; + id lf2 = uIEdgeToOld[i][1] % NBF; + triangle_neighbors[e1][lf1] = NBF*e2+lf2; + triangle_neighbors[e2][lf2] = NBF*e1+lf1; + } else if (uIEdgeToOld[i].size() > 2) { /* non manifold face */ + for (size_t j = 0; j < uIEdgeToOld[i].size(); ++j) { + id e = uIEdgeToOld[i][j] / NBF; + id lf = uIEdgeToOld[i][j] % NBF; + std::vector<id> neighs; + for (size_t k = 0; k < uIEdgeToOld[i].size(); ++k) { + if (uIEdgeToOld[i][k] != uIEdgeToOld[i][j]) { + neighs.push_back(uIEdgeToOld[i][k]); + } + } + neighs.shrink_to_fit(); + id pos = nm_triangle_neighbors.size(); + nm_triangle_neighbors.push_back(neighs); + triangle_neighbors[e][lf] = -((sid) pos + 1); + } + } + } + + /* Reduce memory consumption */ + triangle_neighbors.shrink_to_fit(); + nm_triangle_neighbors.shrink_to_fit(); + + return true; + } + + /* two unknowns (x_2i, x_2i+1) for each edge */ + bool stiffness_coefficient( + int N, + const std::vector<std::array<double,3> >& points, + const std::vector<std::array<id,3> >& triangles, + id e, + const vector<id2>& uIEdges, + const vector<id>& old2IEdge, + const vector<vector<id>>& uIEdgeToOld, + vector<IV>& iv, + vector<IJV>& ijv) { + if (uIEdgeToOld[e].size() != 2) { + Msg::Error("assembly, edge %li: uIEdgeToOld[e].size() = %li", e, uIEdgeToOld[e].size()); + return false; + } + /* edge vertices */ + id v1 = uIEdges[e][0]; + id v2 = uIEdges[e][1]; + vec3 e_x = points[v2] - points[v1]; + double lenr = length(e_x); + if (lenr < EPS) { + Msg::Error("edge too small: v1=%li, v2=%li, length = %e", v1, v2, lenr); + return false; + } + e_x = (1./lenr) * e_x; + /* four neighbor edges */ + id bvars[4] = {NO_ID,NO_ID,NO_ID,NO_ID}; + double alpha[4] = {0.,0.,0.,0.}; + double CR_weight[4] = {-1./4,-1./4,-1./4,-1./4}; + vec3 prevN; + for (size_t s = 0; s < 2; ++s) { /* two triangles */ + id oe = uIEdgeToOld[e][s]; + id t = oe / 3; + id le = oe % 3; + vec3 N = triangleNormal(points[triangles[t][0]],points[triangles[t][1]],points[triangles[t][2]]); + if (s == 1 && dot(prevN,N) < 0.) N = -1. * N; + prevN = N; + // N = {0,0,1}; + vec3 e_y = cross(N,e_x); + if (maxAbs(e_y) == 0.) { + Msg::Error("length(e_y) = {}", length(e_y)); + return false; + } + normalize(e_y); + + for (size_t k = 0; k < 2; ++k) { /* two other edges in triangle t */ + id aoe = 3*t+(le+1+k)%3; + id ae = old2IEdge[aoe]; + id2 aedge = uIEdges[ae]; + + bvars[2*s+k] = ae; + vec3 edg = points[aedge[1]]-points[aedge[0]]; + double len = length(edg); + if (len < EPS) { + Msg::Error("edge too small: t=%li, k = %li, edge=%li, length = %e", t, k, aedge, len); + return false; + } + edg = (1./len) * edg; + + /* 360deg angle (used for the angle rotation) */ + double cx = dot(edg,e_x); + double cy = dot(edg,e_y); + alpha[2*s+k] = atan2(cy,cx); + if (alpha[2*s+k] < 0.) alpha[2*s+k] += 2.*M_PI; + + /* 180deg edge-edge angle (used for the Crouzeix Raviart) */ + double agl = 0.; + if (aedge[0] == v1) { + agl = angleVectorsAlreadyNormalized(edg,e_x); + } else if (aedge[1] == v1) { + agl = angleVectorsAlreadyNormalized(edg, -1. * e_x); + } else if (aedge[0] == v2) { + agl = angleVectorsAlreadyNormalized(-1. * edg, e_x); + } else if (aedge[1] == v2) { + agl = angleVectorsAlreadyNormalized(-1. * edg, -1. * e_x); + } else { + Msg::Error("should not happen"); + return false; + } + CR_weight[2*s+k] = -2. / tan(agl); + } + } + /* compute coefficients */ + double isum = -1. * (CR_weight[0] + CR_weight[1] + CR_weight[2] + CR_weight[3]); + for (size_t k = 0; k < 4; ++k) + CR_weight[k] = CR_weight[k] / isum; + + iv.clear(); + ijv.clear(); + id x_i = 2*e; + id y_i = 2*e+1; + iv.push_back({x_i,1.}); + iv.push_back({y_i,1.}); + double Nd = double(N); + for (size_t j = 0; j < 4; ++j) { + id x_j = 2*bvars[j]; + id y_j = 2*bvars[j]+1; + ijv.push_back({{x_i,x_j},CR_weight[j] *cos(Nd*alpha[j])}); + ijv.push_back({{x_i,y_j},CR_weight[j]*-1.*sin(Nd*alpha[j])}); + ijv.push_back({{y_i,x_j},CR_weight[j] *sin(Nd*alpha[j])}); + ijv.push_back({{y_i,y_j},CR_weight[j] *cos(Nd*alpha[j])}); + } + + return true; + } + + bool prepare_system( + const vector<IV>& K_diag, + const vector<IJV>& K_coefs, + vector<vector<size_t>>& columns, + vector<vector<double>>& values) { + vector<IJV> coefs = K_coefs; + coefs.resize(coefs.size()+K_diag.size()); + for (size_t i = 0; i < K_diag.size(); ++i) { + coefs[K_coefs.size()+i] = {{id(K_diag[i].i),id(K_diag[i].i)},K_diag[i].val}; + } + std::sort(coefs.begin(),coefs.end()); + + size_t cur_i = coefs[0].ij[0]; + size_t cur_j = coefs[0].ij[1]; + double acc_val = coefs[0].val; + for (size_t k = 1; k < coefs.size(); ++k) { + id i = coefs[k].ij[0]; + id j = coefs[k].ij[1]; + double v = coefs[k].val; + if (i != cur_i) { + if (std::abs(acc_val) > EPS) { + columns[cur_i].push_back(cur_j); + values[cur_i].push_back(acc_val); + } + cur_i = i; + acc_val = v; + cur_j = j; + } else if (j != cur_j) { + if (std::abs(acc_val) > EPS) { + columns[cur_i].push_back(cur_j); + values[cur_i].push_back(acc_val); + } + cur_i = i; + acc_val = v; + cur_j = j; + } else { + acc_val += v; + } + } + if (std::abs(acc_val) > EPS) { + columns[cur_i].push_back(cur_j); + values[cur_i].push_back(acc_val); + } + + return true; + } + + + bool expand_dirichlet_boundary_conditions( + int N, + const std::vector<std::array<double,3> >& points, + const std::vector<std::array<id,3> >& triangles, + const vector<id2>& uIEdges, + const vector<id>& old2IEdge, + const vector<vector<id>>& uIEdgeToOld, + size_t nb_layers, + vector<bool>& dirichletEdge, + vector<vec2>& dirichletValue, + int verbosity) { + /* Look for expanded BC edges */ + vector<bool> extDirichletEdge = dirichletEdge; + vector<id> new_edges; + for (size_t layer = 0; layer < nb_layers; ++layer) { + for (size_t e = 0; e < uIEdges.size(); ++e) if (extDirichletEdge[e]) { + for (size_t i = 0; i < uIEdgeToOld[e].size(); ++i) { + id t = uIEdgeToOld[e][i] / 3; + for (size_t le = 0; le < 3; ++le) { + id oe2 = 3*t+le; + id e2 = old2IEdge[oe2]; + if (!extDirichletEdge[e2]) { + new_edges.push_back(e2); + } + } + } + } + sort_unique(new_edges); + for (size_t i = 0; i < new_edges.size(); ++i) { + extDirichletEdge[new_edges[i]] = true; + } + } + if (new_edges.size() == 0) { + if (verbosity >= 2) + Msg::Warning("no new edges to expand dirichlet boundary conditions"); + return false; + } + + if (verbosity >= 2) + Msg::Info("Dirichlet B.C. expansion: added %li edges (for %li layers)", new_edges.size(), nb_layers); + + /* Small system for BC expansion */ + vector<IJV> K_coefs; + for (size_t k = 0; k < new_edges.size(); ++k) { + id e = new_edges[k]; + vector<IV> iv; + vector<IJV> ijv; + bool oks = stiffness_coefficient(N, points, triangles, e, uIEdges, old2IEdge, uIEdgeToOld, iv, ijv); + if (!oks || iv.size() != 2 || iv[0].i != 2*e || iv[1].i != 2*e+1) { + Msg::Error("failed to get stiffness coefficients for edge e = %li", e); + return false; + } + /* Add coefficients for interaction i-j of edges in extDirichletEdge */ + for (size_t l = 0; l < ijv.size(); ++l) if (extDirichletEdge[ijv[l].ij[1]/2]) { + K_coefs.push_back(ijv[l]); + } + } + vector<IV> K_diag; + vector<vector<size_t>> A_col(2*uIEdges.size()); + vector<vector<double>> A_coef(2*uIEdges.size()); + bool okp = prepare_system(K_diag, K_coefs, A_col, A_coef); + if (!okp) { + Msg::Error("failed to prepare system"); + return false; + } + + /* Explicit solver (local smoothing) */ + for (size_t e = 0; e < uIEdges.size(); ++e) if (extDirichletEdge[e] && !dirichletEdge[e]) { + dirichletValue[e] = {0.,0.}; + } + for (size_t iter = 0; iter < 10*nb_layers; ++iter) { + for (size_t e = 0; e < uIEdges.size(); ++e) if (extDirichletEdge[e] && !dirichletEdge[e]) { + for (size_t d = 0; d < 2; ++d) { + id i = 2*e+d; + dirichletValue[e][d] = 0.; + for (size_t l = 0; l < A_col[i].size(); ++l) { + id j = A_col[i][l]; + if (!extDirichletEdge[j/2]) continue; + double w = A_coef[i][l]; + dirichletValue[e][d] += -1. * w * dirichletValue[j/2][j%2]; + } + } + double n2 = length(dirichletValue[e]); + if (n2 < EPS) { + continue; + } + dirichletValue[e][0] /= n2; + dirichletValue[e][1] /= n2; + } + } + + /* Set expanded edges as Dirichlet edges */ + for (size_t e = 0; e < uIEdges.size(); ++e) if (extDirichletEdge[e] + && !dirichletEdge[e] && length(dirichletValue[e]) > EPS) { + dirichletEdge[e] = true; + } + + return true; + } + + bool compute_cross_field_with_multilevel_diffusion( + int N, + const std::vector<std::array<double,3> >& points, + const std::vector<std::array<id,2> >& lines, + const std::vector<std::array<id,3> >& triangles, + std::vector<std::array<double,3> >& triEdgeTheta, + int nbDiffusionLevels, + double thresholdNormConvergence, + int nbBoundaryExtensionLayer, + int verbosity) { + if (N != 4 && N != 6) return false; + + /* Build unique edges and association with adjacent triangles, + * including the non-manifold cases */ + vector<id2> uIEdges; + vector<id> old2IEdge; + vector<vector<id>> uIEdgeToOld; + std::vector<sid3> triangle_neighbors; + std::vector<std::vector<id>> nm_triangle_neighbors; + bool oka = compute_triangle_adjacencies(triangles, triangle_neighbors, nm_triangle_neighbors, uIEdges, old2IEdge, uIEdgeToOld); + if (!oka) { + Msg::Error("failed to compute mesh adjacencies"); + return false; + } + + /* Bbox diagonal is used later to specify the diffusion length */ + double diag = bboxDiag(points); + if (verbosity > 0) + Msg::Info("Heat-based cross field computation, input: %li points, %li lines, %li triangles, %li internal edges, bbox diag = %li", points.size(),lines.size(),triangles.size(),uIEdges.size(), diag); + + if (uIEdges.size() == 0) { + Msg::Error("no internal edges"); + return false; + } + + /* System unknowns: cos(Nt),sin(Nt) for each edge */ + vector<double> x(2*uIEdges.size(),0.); + + /* Initial Dirichlet boundary conditions + * alignement of crosses with edges (relative angle = 0) + * theta_e = 0 => (cos4t/sin4t) = (1,0) */ + size_t nbc = 0; + vector<bool> dirichletEdge(uIEdges.size(),false); + vector<vec2> dirichletValue(uIEdges.size(),{1.,0.}); + for (size_t e = 0; e < uIEdges.size(); ++e) if (uIEdgeToOld[e].size() != 2) { + dirichletEdge[e] = true; + dirichletValue[e] = {1.,0.}; + nbc += 1; + } + for (size_t l = 0; l < lines.size(); ++l) { + /* mark the lines as boundary conditions */ + id2 edge = sorted(lines[l][0],lines[l][1]); + auto it = std::find(uIEdges.begin(),uIEdges.end(),edge); + if (it != uIEdges.end()) { + id e = id(it - uIEdges.begin()); + dirichletEdge[e] = true; + dirichletValue[e] = {1.,0.}; + nbc += 1; + } + } + if (verbosity >= 2) + Msg::Info("- boundary conditions: %li crosses fixed on edges", nbc); + + if (nbBoundaryExtensionLayer > 0) { + bool oke = expand_dirichlet_boundary_conditions(N, points, triangles, uIEdges, old2IEdge, uIEdgeToOld, nbBoundaryExtensionLayer, dirichletEdge, dirichletValue, verbosity); + if (!oke) { + Msg::Warning("failed to expand dirichlet boundary conditions"); + } + for (size_t e = 0; e < uIEdges.size(); ++e) { + x[2*e+0] = dirichletValue[e][0]; + x[2*e+1] = dirichletValue[e][1]; + } + } + + if (verbosity >= 2) + Msg::Info("- compute stiffness matrix coefficients (Crouzeix-Raviart) ..."); + + vector<IV> K_diag; + vector<IJV> K_coefs; + vector<double> rhs(2*uIEdges.size(),0.); + vector<double> Mass(2*uIEdges.size(),1.); /* diagonal for Crouzeix-Raviart */ + for (size_t e = 0; e < uIEdges.size(); ++e) { + if (!dirichletEdge[e]) { + vector<IV> iv; + vector<IJV> ijv; + bool oks = stiffness_coefficient(N, points, triangles, e, uIEdges, old2IEdge, uIEdgeToOld, iv, ijv); + if (!oks) { + Msg::Error("failed to compute stiffness matrix coefficients for e = %li", e); + return false; + } + for (size_t i = 0; i < iv.size(); ++i) + K_diag.push_back(iv[i]); + for (size_t i = 0; i < ijv.size(); ++i) + K_coefs.push_back(ijv[i]); + id t1 = uIEdgeToOld[e][0]/3; + id t2 = uIEdgeToOld[e][1]/3; + double area1 = triangleArea(points[triangles[t1][0]],points[triangles[t1][1]],points[triangles[t1][2]]); + double area2 = triangleArea(points[triangles[t2][0]],points[triangles[t2][1]],points[triangles[t2][2]]); + Mass[2*e+0] = 1./3 * (area1 + area2); + Mass[2*e+1] = 1./3 * (area1 + area2); + } else { /* Dirichlet BC */ + K_diag.push_back({id(2*e+0),1.}); + rhs[2*e+0] = dirichletValue[e][0]; + K_diag.push_back({id(2*e+1),1.}); + rhs[2*e+1] = dirichletValue[e][1]; + } + } + + double eavg = 0.; + double emin = DBL_MAX; + double emax = -DBL_MAX; + for (size_t e = 0; e < uIEdges.size(); ++e) { + double len = length(points[uIEdges[e][1]]-points[uIEdges[e][0]]); + eavg += len; + emin = std::min(len,emin); + emax = std::max(len,emax); + } + eavg /= uIEdges.size(); + + if (verbosity >= 2) + Msg::Info("- edge size: min=%.3f, avg=%.3f, max=%.3f | bbox diag: %.3f",emin,eavg,emax,diag); + + + /* prepare system */ + vector<vector<size_t>> K_columns(2*uIEdges.size()); + vector<vector<double>> K_values(2*uIEdges.size()); + { + bool okp = prepare_system(K_diag, K_coefs, K_columns, K_values); + if (!okp) { + Msg::Error("failed to prepare system"); + return false; + } + } + + double dtInitial = (0.1*diag)*(0.1*diag); + double dtFinal = (3.*emin)*(3.*emin); + + if (verbosity >= 1) + Msg::Info("- diffusion and projection loop (%li levels, %li unknowns, dt = %.3f .. %.3f) ...", nbDiffusionLevels, 2*uIEdges.size(),dtInitial, dtFinal); + + double wti = TimeOfDay(); + for (size_t e = 0; e < uIEdges.size(); ++e) { + x[2*e+0] = dirichletValue[e][0]; + x[2*e+1] = dirichletValue[e][1]; + } + + vector<double> steps; + if (nbDiffusionLevels > 1) { + for (size_t i = 0; i < nbDiffusionLevels; ++i) {/* resolution transition */ + double dt = dtInitial + (dtFinal-dtInitial) * double(i)/double(nbDiffusionLevels-1); + steps.push_back(dt); + } + } else { + steps.push_back(dtFinal); + } + + { + /* Initialize system (I/dt + M^-1 * L) x_(i+1) = 1/dt * x_i (Ax = B) */ + vector<vector<size_t>> Acol = K_columns; + vector<vector<double>> Aval_add = K_values; /* to get sparsity pattern */ + for (size_t i = 0; i < Aval_add.size(); ++i) + std::fill(Aval_add[i].begin(),Aval_add[i].end(),0.); + vector<double> B = x; + vector<double> norms(uIEdges.size(),0.); + vector<double> prevNorms = norms; + + CrossFieldLinearSystem solver(2*uIEdges.size()); + + vector<double> diag_sum(2*uIEdges.size(), 0.); + for (size_t i = 0; i < Acol.size(); ++i) { + if (!dirichletEdge[i/2]) { + for (size_t j = 0; j < Acol[i].size(); ++j) { + Aval_add[i][j] = 1. / Mass[i] * K_values[i][j]; + } + } else { + Aval_add[i] = {1.}; + } + } + solver.add_sparse_coefficients(Acol, Aval_add, true); + for (size_t i = 0; i < Aval_add.size(); ++i) Aval_add[i].clear(); + for (size_t i = 0; i < Acol.size(); ++i) Acol[i].clear(); + bool okp = solver.preprocess_sparsity_pattern(); + if (!okp) { + Msg::Error("linear solver analysis failed"); + return false; + } + + /* Loop over the changing timesteps */ + double prev_dt = DBL_MAX; + for (int iter = 0; iter < steps.size(); ++iter) { + if (iter > 0 && steps[iter] > prev_dt) continue; + double dt = steps[iter]; + prev_dt = dt; + + if (verbosity >= 1) + Msg::Info(" - step %li/%li | dt = %.3f, linear system loop ...", iter+1, steps.size(), dt); + + /* Update LHS matrix with the new timestep */ + for (size_t i = 0; i < Acol.size(); ++i) { + if (!dirichletEdge[i/2]) { + Acol[i] = {i}; + Aval_add[i] = {-diag_sum[i] + 1./dt}; + diag_sum[i] = 1./dt; + } + } + bool oku = solver.add_sparse_coefficients(Acol, Aval_add, false); + if (!oku) { + Msg::Error("failed to update linear system"); + return false; + } + solver.factorize(); + + /* Loop at fixed time step */ + constexpr size_t subiter_max = 25; + for (size_t subiter = 0; subiter < subiter_max; ++subiter) { + prevNorms = norms; + + /* Update RHS */ + B = x; + for (size_t i = 0; i < B.size(); ++i) if (!dirichletEdge[i/2]) + B[i] /= dt; + solver.set_rhs_values(B); + + bool oks = solver.solve(x); + if (!oks) { + Msg::Error("failed to solve linear system"); + return false; + } + + + /* Normalize cross field and gather norm stats */ + double nmi = DBL_MAX; + double nma = -DBL_MAX; + for (size_t e = 0; e < uIEdges.size(); ++e) { + norms[e] = std::sqrt(x[2*e]*x[2*e]+x[2*e+1]*x[2*e+1]); + nmi = std::min(nmi,norms[e]); + nma = std::max(nma,norms[e]); + if (!dirichletEdge[e] && norms[e] > EPS) { + x[2*e+0] /= norms[e]; + x[2*e+1] /= norms[e]; + } + } + // Msg::Info(" | norm, min = {}, max = {}", nmi, nma); + const double EPS_NORM = 1.e-1; + if (nma > 1. + EPS_NORM) { + steps[iter] /= 10; + dt = steps[iter]; + iter -= 1; + if (verbosity >= 2) + Msg::Warning(" | max(norm)=%.3f (should be 1.), solve failed, new time step: dt = %.3f", nma, dt); + break; + } + if (subiter > 0 || iter > 0) { + double linf = 0.; + for (size_t i = 0; i < norms.size(); ++i) if (!dirichletEdge[i]) { + linf = std::max(linf,norms[i]-prevNorms[i]); + } + if (verbosity >= 3) + Msg::Info(" | system solved, norm diff max: %.3f, norm range: %.3f - %.3f", linf, nmi, nma); + if (linf < 1.e-3) break; + } else { + if (verbosity >= 3) + Msg::Info(" | system solved"); + } + } + } + } + double et = TimeOfDay() - wti; + if (verbosity >= 2) + Msg::Info("- cross field elapsed time: %.3f", et); + + + { /* Export solution */ + triEdgeTheta.resize(triangles.size()); + for (size_t t = 0; t < triangles.size(); ++t) { + for (size_t le = 0; le < 3; ++le) { + id e = old2IEdge[3*t+le]; + double len = std::sqrt(x[2*e]*x[2*e]+x[2*e+1]*x[2*e+1]); + double theta = (len > EPS) ? 1./double(N)*atan2(x[2*e+1]/len,x[2*e]/len) : 0.; + triEdgeTheta[t][le] = theta; + } + } + } + + return true; + } + + + inline SVector3 tri_normal(MTriangle* t) { + SVector3 v10(t->getVertex(1)->x() - t->getVertex(0)->x(), + t->getVertex(1)->y() - t->getVertex(0)->y(), + t->getVertex(1)->z() - t->getVertex(0)->z()); + SVector3 v20(t->getVertex(2)->x() - t->getVertex(0)->x(), + t->getVertex(2)->y() - t->getVertex(0)->y(), + t->getVertex(2)->z() - t->getVertex(0)->z()); + SVector3 normal_to_triangle = crossprod(v20, v10); + normal_to_triangle.normalize(); + return normal_to_triangle; + } + + inline SVector3 crouzeix_raviart_interpolation(SVector3 lambda, SVector3 edge_values[3]) { + double x = lambda[1]; + double y = lambda[2]; + SVector3 shape = {1.0 - 2.0 * y, -1.0 + 2.0 * (x + y), 1.0 - 2.0 * x}; + return shape[0] * edge_values[0] + shape[1] * edge_values[1] + shape[2] * edge_values[2]; + } + + int local_frame(const MVertex* v, const std::vector<MTriangle*>& tris, + SVector3& e_x, SVector3& e_y, SVector3& e_z) { + e_x = SVector3(DBL_MAX,DBL_MAX,DBL_MAX); + SVector3 avg(0.,0.,0.); + for (MTriangle* t: tris) { + avg += tri_normal(t); + if (e_x.x() == DBL_MAX) { + for (size_t le = 0; le < 3; ++le) { + MVertex* v1 = t->getVertex(le); + MVertex* v2 = t->getVertex((le+1)%3); + if (v1 == v) { + e_x = v2->point() - v1->point(); + break; + } else if (v2 == v) { + e_x = v1->point() - v2->point(); + break; + } + } + } + } + if (avg.norm() < 1.e-16) { + Msg::Error("local frame for %li triangles: avg normal = %.2f, %.2f, %.2f", + tris.size(), avg.x(), avg.y(), avg.z()); + return -1; + } + if (e_x.norm() < 1.e-16) { + Msg::Error("local frame for %li triangles: e_x = %.2f, %.2f, %.2f", + tris.size(), e_x.x(), e_x.y(), e_x.z()); + return -1; + } + e_x.normalize(); + avg.normalize(); + e_z = avg; + e_y = crossprod(e_z,e_x); + if (e_y.norm() < 1.e-16) { + Msg::Error("local frame for %li triangles: e_y = %.2f, %.2f, %.2f", + tris.size(), e_y.x(), e_y.y(), e_y.z()); + return -1; + } + e_y.normalize(); + + return 0; + } + + int ordered_fan_around_vertex(const MVertex* v, const std::vector<MTriangle*>& tris, + std::vector<std::array<MVertex*,2> >& vPairs) { + vPairs.clear(); + if (tris.size() < 3) return -1; + + std::unordered_set<MTriangle*> done; + { /* Init */ + MTriangle* t = tris[0]; + for (size_t le = 0; le < 3; ++le) { + MVertex* v1 = t->getVertex(le); + MVertex* v2 = t->getVertex((le+1)%3); + if (v1 != v && v2 != v) { + vPairs.push_back({v1,v2}); + done.insert(t); + break; + } + } + } + + while (vPairs.back().back() != vPairs[0][0]) { + MVertex* last = vPairs.back().back(); + /* Look for next edge connected to last */ + bool found = false; + for (MTriangle* t: tris) { + if (done.find(t) != done.end()) continue; + for (size_t le = 0; le < 3; ++le) { + MVertex* v1 = t->getVertex(le); + MVertex* v2 = t->getVertex((le+1)%3); + if (v1 != v && v2 != v) { + if (v1 == last) { + vPairs.push_back({v1,v2}); + done.insert(t); + found = true; + break; + } else if (v2 == last) { + vPairs.push_back({v2,v1}); + done.insert(t); + found = true; + break; + } + } + } + if (found) break; + } + if (!found) { + Msg::Error("failed to order fan vertex pairs"); + return -1; + } + } + + return 0; + } +} + + +int computeCrossFieldWithHeatEquation( + int N, + const std::vector<MTriangle*>& triangles, + const std::vector<MLine*>& lines, + std::vector<std::array<double,3> >& triEdgeTheta, + int nbDiffusionLevels, + double thresholdNormConvergence, + int nbBoundaryExtensionLayer, + int verbosity) { + + /* Build discrete mesh without reference to gmsh structures */ + std::vector<std::array<double,3> > dpoints; + std::vector<std::array<QMT::id,2> > dlines; + std::vector<std::array<QMT::id,3> > dtriangles; + std::vector<QMT::id> old2new; + { + old2new.reserve(3*triangles.size()); + dpoints.reserve(3*triangles.size()); + dlines.reserve(lines.size()); + dtriangles.reserve(triangles.size()); + + constexpr QMT::id X = std::numeric_limits<QMT::id>::max(); + + for (MLine* l: lines) { + std::array<QMT::id,2> line; + for (size_t lv = 0; lv < 2; ++lv) { + MVertex* v = l->getVertex(lv); + size_t num = v->getNum(); + if (num >= old2new.size()) { + old2new.resize(num+1,X); + } + if (old2new[num] == X) { + old2new[num] = dpoints.size(); + std::array<double,3> pt = {v->x(), v->y(), v->z()}; + dpoints.push_back(pt); + } + line[lv] = old2new[num]; + } + std::sort(line.begin(),line.end()); + dlines.push_back(line); + } + for (MTriangle* t: triangles) { + std::array<QMT::id,3> tri; + for (size_t lv = 0; lv < 3; ++lv) { + MVertex* v = t->getVertex(lv); + size_t num = v->getNum(); + if (num >= old2new.size()) { + old2new.resize(num+1,X); + } + if (old2new[num] == X) { + old2new[num] = dpoints.size(); + std::array<double,3> pt = {v->x(), v->y(), v->z()}; + dpoints.push_back(pt); + } + tri[lv] = old2new[num]; + } + dtriangles.push_back(tri); + } + } + + + bool ok = QMT::compute_cross_field_with_multilevel_diffusion(N, + dpoints, dlines, dtriangles, triEdgeTheta, + nbDiffusionLevels, thresholdNormConvergence,nbBoundaryExtensionLayer, + verbosity); + return ok ? 0 : -1; +} + +// inline double compat_orientation_extrinsic( +// int Ns, +// const SVector3 &o0, +// const SVector3 &n0, +// const SVector3 &o1, +// const SVector3 &n1, +// SVector3 &a1, SVector3 &b1) +// { +// SVector3 t0 = crossprod(n0, o0); +// SVector3 t1 = crossprod(n1, o1); +// t0.normalize(); +// t1.normalize(); +// std::vector<SVector3> A(Ns); +// std::vector<SVector3> B(Ns); +// for (int i = 0; i < Ns; ++i) { +// double agl = double(i)/double(Ns) * 2. * M_PI; +// A[i] = o0 * cos(agl) + t0 * sin(agl); +// B[i] = o1 * cos(agl) + t1 * sin(agl); +// } +// double maxx = -1; +// size_t is = 0; +// size_t js = 0; +// for (int i = 0; i < Ns; ++i) { +// for (int j = 0; j < Ns; ++j) { +// const double xx = dot(A[i], B[j]); +// if(xx > maxx) { +// is = i; +// js = j; +// maxx = xx; +// } +// } +// } +// a1 = A[is]; +// b1 = B[js]; +// return maxx; +// } +// +// inline void cross_normalize(int Ns, double &a) +// { +// double D = 2. * M_PI / double(Ns); +// if(a < 0) +// while(a < 0) a += D; +// if(a >= D) +// while(a >= D) a -= D; +// } +// +// inline double cross_lifting(int Ns, double _a, double a) +// { +// double D = 2. * M_PI / double(Ns); +// if(fabs(_a - a) < fabs(_a - (a + D)) && fabs(_a - a) < fabs(_a - (a - D))) { +// return a; +// } +// else if(fabs(_a - (a + D)) < fabs(_a - a) && +// fabs(_a - (a + D)) < fabs(_a - (a - D))) { +// return a + D; +// } +// else { +// return a - D; +// } +// return DBL_MAX; +// } + + +inline double compat_orientation_extrinsic(int Ns, + const SVector3 &o0, + const SVector3 &n0, + const SVector3 &o1, + const SVector3 &n1, + SVector3 &a1, SVector3 &b1) +{ + if (Ns != 4) return DBL_MAX; + + SVector3 t0 = crossprod(n0, o0); + SVector3 t1 = crossprod(n1, o1); + + const size_t permuts[8][2] = {{0, 0}, {1, 0}, {2, 0}, {3, 0}, + {0, 1}, {1, 1}, {2, 1}, {3, 1}}; + SVector3 A[4]{o0, t0, -o0, -t0}; + SVector3 B[2]{o1, t1}; + + double maxx = -1; + int index = 0; + for(size_t i = 0; i < 8; i++) { + const double xx = dot(A[permuts[i][0]], B[permuts[i][1]]); + if(xx > maxx) { + index = i; + maxx = xx; + } + } + a1 = A[permuts[index][0]]; + b1 = B[permuts[index][1]]; + return maxx; +} + +inline void cross_normalize(int Ns, double &a) +{ + if (Ns != 4) { + a = DBL_MAX; + return ; + } + double D = M_PI * .5; + if(a < 0) + while(a < 0) a += D; + if(a >= D) + while(a >= D) a -= D; +} + +inline double cross_lifting(int Ns, double _a, double a) +{ + if (Ns != 4) return DBL_MAX; + double D = M_PI * .5; + if(fabs(_a - a) < fabs(_a - (a + D)) && fabs(_a - a) < fabs(_a - (a - D))) { + return a; + } + else if(fabs(_a - (a + D)) < fabs(_a - a) && + fabs(_a - (a + D)) < fabs(_a - (a - D))) { + return a + D; + } + else { + return a - D; + } + return DBL_MAX; +} + + +int computeCrossFieldConformalScaling( + int Ns, + const std::vector<MTriangle*>& triangles, + const std::vector<std::array<double,3> >& triEdgeTheta, + std::unordered_map<MVertex*,double>& scaling) +{ +#if defined(HAVE_SOLVER) + Msg::Debug("compute cross field scaling (N=%i, %li triangles) ...", Ns, triangles.size()); + if (triangles.size() != triEdgeTheta.size()) { + Msg::Error("conformal scaling: incoherent number of elements in inputs"); + return -1; + } + +#if defined(HAVE_PETSC) + Msg::Debug("- with PETSc solver"); + linearSystemPETSc<double> *_lsys = new linearSystemPETSc<double>; +#elif defined(HAVE_MUMPS) + Msg::Debug("- with MUMPS solver"); + linearSystemMUMPS<double> *_lsys = new linearSystemMUMPS<double>; +#elif defined(HAVE_EIGEN) + Msg::Debug("- with EIGEN solver"); + linearSystemEigen<double> *_lsys = new linearSystemEigen<double>; +#else + Msg::Debug("- with dense solver (slow, should not be used)"); + linearSystemFull<double> *_lsys = new linearSystemFull<double>; +#endif + dofManager<double> *myAssembler = new dofManager<double>(_lsys); + + /* Vertex unknowns */ + std::set<MVertex *, MVertexPtrLessThan> vs; + for (MTriangle* t: triangles) { + for(size_t k = 0; k < 3; k++) { vs.insert(t->getVertex(k)); } + } + for (MVertex* v: vs) myAssembler->numberVertex(v,0,1); + + simpleFunction<double> ONE(1.0); + laplaceTerm l(0, 1, &ONE); + + /* Collect gradient of theta (cross field directions) */ + std::map<MTriangle *, SVector3> gradients_of_theta; + for (size_t i = 0; i < triangles.size(); ++i) { + MTriangle* t = triangles[i]; + + SVector3 v10(t->getVertex(1)->x() - t->getVertex(0)->x(), + t->getVertex(1)->y() - t->getVertex(0)->y(), + t->getVertex(1)->z() - t->getVertex(0)->z()); + SVector3 v20(t->getVertex(2)->x() - t->getVertex(0)->x(), + t->getVertex(2)->y() - t->getVertex(0)->y(), + t->getVertex(2)->z() - t->getVertex(0)->z()); + SVector3 normal_to_triangle = crossprod(v20, v10); + normal_to_triangle.normalize(); + + SElement se(t); + l.addToMatrix(*myAssembler, &se); + + SVector3 t_i, o_i, o_1, o_2, tgt0; + for (size_t le = 0; le < 3; ++ le) { + /* Edge ordered lower index to largest */ + std::array<MVertex*,2> edge = {t->getVertex(le),t->getVertex((le+1)%3)}; + if (edge[0]->getNum() > edge[1]->getNum()) std::reverse(edge.begin(),edge.end()); + + /* Edge tangent */ + SVector3 tgt = edge[1]->point() - edge[0]->point(); + if (tgt.norm() < 1.e-16) { + Msg::Warning("Edge (tri=%i,le=%i), length = %.e", t->getNum(), le, tgt.norm()); + if (tgt.norm() == 0.) {return -1;} + } + tgt.normalize(); + SVector3 tgt2 = crossprod(normal_to_triangle,tgt); + tgt2.normalize(); + + /* Cross angle (from Crouzeix-Raviart cross field) */ + double A = triEdgeTheta[i][le]; + + SVector3 o = tgt * cos(A) + tgt2 * sin(A); + o.normalize(); + o -= normal_to_triangle * dot(normal_to_triangle, o_i); + o.normalize(); + + if (le == 0) { + t_i = crossprod(normal_to_triangle, tgt); + t_i -= normal_to_triangle * dot(normal_to_triangle, t_i); + t_i.normalize(); + o_i = o; + tgt0 = tgt; + } else if (le == 1) { + o_1 = o; + } else if (le == 2) { + o_2 = o; + } + } + + SVector3 x0, x1, x2, x3; + compat_orientation_extrinsic(Ns, o_i, normal_to_triangle, o_1, normal_to_triangle, x0, x1); + compat_orientation_extrinsic(Ns, o_i, normal_to_triangle, o_2, normal_to_triangle, x2, x3); + + double a0 = atan2(dot(t_i, o_i), dot(tgt0, o_i)); + + x0 -= normal_to_triangle * dot(normal_to_triangle, x0); + x0.normalize(); + x1 -= normal_to_triangle * dot(normal_to_triangle, x1); + x1.normalize(); + x2 -= normal_to_triangle * dot(normal_to_triangle, x2); + x2.normalize(); + x3 -= normal_to_triangle * dot(normal_to_triangle, x3); + x3.normalize(); + + cross_normalize(Ns,a0); + double A1 = atan2(dot(t_i, x1), dot(tgt0, x1)); + double A2 = atan2(dot(t_i, x3), dot(tgt0, x3)); + cross_normalize(Ns,A1); + double a1 = cross_lifting(Ns,a0,A1); + cross_normalize(Ns,A2); + double a2 = cross_lifting(Ns,a0,A2); + + double a[3] = {a0 + a2 - a1, a0 + a1 - a2, a1 + a2 - a0}; + double g[3] = {0, 0, 0}; + t->interpolateGrad(a, 0, 0, 0, g); + gradients_of_theta[t] = SVector3(g[0], g[1], g[2]); + SPoint3 pp = t->barycenter(); + + SVector3 G(g[0], g[1], g[2]); + SVector3 GT = crossprod(G, normal_to_triangle); + + double g1[3]; + a[0] = 1; + a[1] = 0; + a[2] = 0; + t->interpolateGrad(a, 0, 0, 0, g1); + double RHS1 = g1[0] * GT.x() + g1[1] * GT.y() + g1[2] * GT.z(); + a[0] = 0; + a[1] = 1; + a[2] = 0; + t->interpolateGrad(a, 0, 0, 0, g1); + double RHS2 = g1[0] * GT.x() + g1[1] * GT.y() + g1[2] * GT.z(); + a[0] = 0; + a[1] = 0; + a[2] = 1; + t->interpolateGrad(a, 0, 0, 0, g1); + double RHS3 = g1[0] * GT.x() + g1[1] * GT.y() + g1[2] * GT.z(); + int num1 = myAssembler->getDofNumber(l.getLocalDofR(&se, 0)); + int num2 = myAssembler->getDofNumber(l.getLocalDofR(&se, 1)); + int num3 = myAssembler->getDofNumber(l.getLocalDofR(&se, 2)); + double V = -t->getVolume(); + _lsys->addToRightHandSide(num1, RHS1 * V); + _lsys->addToRightHandSide(num2, RHS2 * V); + _lsys->addToRightHandSide(num3, RHS3 * V); + } + + int status = _lsys->systemSolve(); + + if (status == -1) { /* failed to solve */ + Msg::Warning("conformal scaling (%li triangles, %li variables), failed to solve linear system, use uniform scaling", + triangles.size(), vs.size()); + for (MVertex* v: vs) { + scaling[v] = 1.; + } + delete _lsys; + return 0; + } + + /* Extract solution */ + double sMin = DBL_MAX; + double sMax = -DBL_MAX; + size_t i = 0; + for (MVertex* v: vs) { + double h; + myAssembler->getDofValue(v, 0, 1, h); + double cs = exp(-h); + scaling[v] = cs; + sMin = std::min(sMin,cs); + sMax = std::max(sMax,cs); + i += 1; + } + if (sMin == DBL_MAX || sMax == -DBL_MAX || sMin == 0.) { + Msg::Error("Conformal scaling computed (%d unknowns, %li triangles -> min=%.3f, max=%.3f), wrong", + myAssembler->sizeOfR(), triangles.size(), sMin, sMax); + } else { + Msg::Debug("Conformal scaling computed (%d unknowns, %li triangles -> min=%.3f, max=%.3f, width=%.3f)", + myAssembler->sizeOfR(), triangles.size(), sMin, sMax, sMax - sMin); + } + + delete _lsys; + + if (false) { + std::vector<MElement*> elts = dynamic_cast_vector<MTriangle*,MElement*>(triangles); + GeoLog::add(elts, scaling, "h=exp(-H)"); + GeoLog::flush(); + } + +#else + Msg::Error("Computing cross field scaling requires the SOLVER module"); + return -1; +#endif + + return 0; +} + +int computeQuadSizeMapFromCrossFieldConformalFactor( + const std::vector<MTriangle*>& triangles, + std::size_t targetNumberOfQuads, + std::unordered_map<MVertex*,double>& scaling) { + + Msg::Debug("Offset quad size map from cross field conformal factor to target %li quads ...", targetNumberOfQuads); + + if (targetNumberOfQuads == 0) { + Msg::Error("targetNumberOfQuads: %i should be positive", targetNumberOfQuads); + return -1; + } + + double csMin = DBL_MAX; + double csMax = -DBL_MAX; + double Hmin = DBL_MAX; + double Hmax = -DBL_MAX; + size_t nWoCorner = 0; + for (MTriangle* t: triangles) { + for (size_t lv = 0; lv < 3; ++lv) { + MVertex* v = t->getVertex(lv); + auto it = scaling.find(v); + if (it == scaling.end()) { + Msg::Error("scaling not found for vertex %i", v->getNum()); + return -1; + } + GVertex* gv = v->onWhat()->cast2Vertex(); + if (gv != nullptr) continue; /* Remove corner values from range */ + csMin = std::min(csMin, it->second); + csMax = std::max(csMax, it->second); + nWoCorner += 1; + } + } + + if (nWoCorner > 0 && (csMin == DBL_MAX || csMax == -DBL_MAX)) { + Msg::Warning("conformal scaling is wrong, %li values, min=DBL_MAX or max=-DBL_MAX, filling with unit values", scaling.size(), csMin, csMax); + for (MTriangle* t: triangles) { + for (size_t lv = 0; lv < 3; ++lv) { + MVertex* v = t->getVertex(lv); + scaling[v] = 1.; + } + } + } + + /* Compute integral of current size map */ + double integral = 0.; + double smin = DBL_MAX; + double smax = -DBL_MAX; + std::vector<MVertex*> vertices; + vertices.reserve(3*triangles.size()); + for (MTriangle* t: triangles) { + double values[3] = {0,0,0}; + for (size_t lv = 0; lv < 3; ++lv) { + MVertex* v = t->getVertex(lv); + auto it = scaling.find(v); + if (it == scaling.end()) { + Msg::Error("scaling value not found for v=%li",v->getNum()); + return -1; + } + /* Clamp with range without corners */ + if (nWoCorner > 0 && (it->second < csMin || it->second > csMax)) { + it->second = clamp(it->second,csMin,csMax); + } + values[lv] = it->second; + smin = std::min(smin,values[lv]); + smax = std::max(smax,values[lv]); + vertices.push_back(v); + } + double a = std::abs(t->getVolume()); + double avg = 1./3. * (values[0] + values[1] + values[2]); + if (avg == 0.) continue; + integral += a * 1. / std::pow(avg,2); + } + + if (integral == 0.) { + Msg::Warning("Size map from conformal scaling: total integral is 0 ... (%li triangles, smin=%.3e, smax=%.3e)", + triangles.size(), smin, smax); + return -1; + } + Msg::Debug("- %li triangles, conformal scaling: min=%.3e, max=%.3e, #=%.3e", + triangles.size(), smin, smax, integral); + std::sort(vertices.begin(), vertices.end()); + vertices.erase(std::unique(vertices.begin(), vertices.end() ), vertices.end()); + + /* Apply the scaling */ + double target = double(targetNumberOfQuads); + double FAC = double(target) / integral; + double sf = 1./std::sqrt(FAC); + smin = DBL_MAX; + smax = -DBL_MAX; + for (size_t j = 0; j < vertices.size(); ++j) { + MVertex* v = vertices[j]; + auto it = scaling.find(v); + it->second = sf * it->second; + smin = std::min(smin,it->second); + smax = std::max(smax,it->second); + } + Msg::Debug("- %li triangles, sizemap range: [%.3e, %.3e] (factor applied: %3f)", triangles.size(), smin, smax, FAC); + + return 0; +} + +int convertToPerTriangleCrossFieldDirections( + int Ns, + const std::vector<MTriangle*>& triangles, + const std::vector<std::array<double,3> >& triEdgeTheta, + std::vector<std::array<double,9> >& triangleDirections) { + + triangleDirections.resize(triangles.size()); + + for (size_t f = 0; f < triangles.size(); ++f) { + MTriangle* t = triangles[f]; + + SVector3 N = QMT::tri_normal(t); + + /* Compute one branch at triangle vertices */ + SVector3 refCross = {0.,0.,0.}; + SVector3 avgCross = {0.,0.,0.}; + SVector3 lifted_dirs[3]; + for (size_t le = 0; le < 3; ++le) { + /* Get cross angle */ + std::array<MVertex*,2> edge = {t->getVertex(le),t->getVertex((le+1)%3)}; + if (edge[0]->getNum() > edge[1]->getNum()) std::reverse(edge.begin(),edge.end()); + + double A = triEdgeTheta[f][le]; + + /* Local reference frame */ + SVector3 tgt = edge[1]->point() - edge[0]->point(); + if (tgt.norm() < 1.e-16) { + Msg::Warning("Edge (tri=%i,le=%i), length = %.e", t->getNum(), le, tgt.norm()); + if (tgt.norm() == 0.) {return -1;} + } + tgt.normalize(); + SVector3 tgt2 = crossprod(N,tgt); + tgt2.normalize(); + + SVector3 cross1 = tgt * cos(A) + tgt2 * sin(A); + cross1.normalize(); + + SVector3 cross2 = crossprod(N,cross1); + cross2.normalize(); + + if (le == 0) { + refCross = cross1; + avgCross = avgCross + cross1; + lifted_dirs[le] = refCross; + } else { + SVector3 closest = {0.,0.,0.}; + double dotmax = -DBL_MAX; + for (int k = 0; k < Ns; ++k) { + double agl = A + double(k)/double(Ns) * 2. * M_PI; + SVector3 candidate = tgt * cos(agl) + tgt2 * sin(agl); + candidate.normalize(); + if (dot(candidate,refCross) > dotmax) { + closest = candidate; + dotmax = dot(candidate,refCross); + } + } + // SVector3 candidates[4] = {cross1,-1.*cross1,cross2,-1.*cross2}; + // SVector3 closest = {0.,0.,0.}; + // double dotmax = -DBL_MAX; + // for (size_t k = 0; k < 4; ++k) { + // if (dot(candidates[k],refCross) > dotmax) { + // closest = candidates[k]; + // dotmax = dot(candidates[k],refCross); + // } + // } + lifted_dirs[le] = closest; + avgCross = avgCross + closest; + } + } + SVector3 vertex_dirs[3]; + std::array<double,9> tDirs; + for (size_t lv = 0; lv < 3; ++lv) { + SVector3 lambda = {0.,0.,0.}; + lambda[lv] = 1.; + SVector3 dir = QMT::crouzeix_raviart_interpolation(lambda,lifted_dirs); + if (length2(dir) != 0.) dir.normalize(); + for (size_t d = 0; d < 3; ++d) { + tDirs[3*lv+d] = dir.data()[d]; + } + } + triangleDirections[f] = tDirs; + } + + return 0; +} + +inline double angle2PI(const SVector3& u, const SVector3& v, const SVector3& n) { + const double dp = dot(u,v); + const double tp = dot(n,crossprod(u,v)); + double angle = atan2(tp,dp); + if (angle < 0) angle += 2. * M_PI; + return angle; +} + +int detectCrossFieldSingularities( + int Ns, + const std::vector<MTriangle*>& triangles, + const std::vector<std::array<double,3> >& triEdgeTheta, + bool addSingularitiesAtAcuteCorners, + double thresholdInDeg, + std::vector<std::pair<SPoint3,int> >& singularities) { + singularities.clear(); + if (triangles.size() != triEdgeTheta.size()) { + Msg::Error("detect cross field singularities: wrong inputs"); + return -1; + } + + /* Get interior vertices and adjacent triangles */ + unordered_map<MVertex*,vector<MTriangle*> > v2t; + + /* put edge angles here, maybe a bit slow ... */ + unordered_map<MEdge,double,MEdgeHash,MEdgeEqual> edgeTheta; + + for (size_t i = 0; i < triangles.size(); ++i) { + MTriangle* t = triangles[i]; + for (size_t le = 0; le < 3; ++le) { + MVertex* v1 = t->getVertex(le); + MVertex* v2 = t->getVertex((le+1)%3); + + MEdge edg(v1,v2); + edgeTheta[edg] = triEdgeTheta[i][le]; + + GFace* gf = dynamic_cast<GFace*>(v1->onWhat()); + if (gf == nullptr) continue; + v2t[v1].push_back(t); + } + } + + /* Compute index at each vertex (looking on the one rings) */ + unordered_map<MVertex*,int> vertexIndex; + for (auto& kv: v2t) { + MVertex* v = kv.first; + const vector<MTriangle*>& tris = kv.second; + + SVector3 e_x, e_y, N; + int st = QMT::local_frame(v, tris, e_x, e_y, N); + if (st != 0) { + Msg::Error("no local frame for v=%li", v->getNum()); + continue; + } + + std::vector<std::array<MVertex*,2> > vPairs; + int st2 = QMT::ordered_fan_around_vertex(v, tris, vPairs); + if (st2 != 0) { + Msg::Error("no ordered fan around v=%li", v->getNum()); + continue; + } + + double angle_deficit = 2.*M_PI; + std::vector<SVector3> rep_vectors(vPairs.size()); /* cross field representation vector in local frame (+e_x,+e_y) */ + for (size_t j = 0; j < vPairs.size(); ++j) { + MVertex* v1 = vPairs[j][0]; + MVertex* v2 = vPairs[j][1]; + angle_deficit -= angle3Vertices(v1, v, v2); /* gaussian curvature */ + + SVector3 tgt; + if (v1->getNum() < v2->getNum()) { + tgt = v2->point() - v1->point(); + } else { + tgt = v1->point() - v2->point(); + } + tgt.normalize(); + SVector3 tgt2 = crossprod(N,tgt); + tgt2.normalize(); + std::array<size_t,2> vPair = {v1->getNum(),v2->getNum()}; + if (vPair[1] < vPair[0]) vPair = {v2->getNum(),v1->getNum()}; + MEdge query(v1,v2); + auto it = edgeTheta.find(query); + if (it == edgeTheta.end()) { + Msg::Error("Edge (%li,%li) not found in edgeTheta",vPair[0],vPair[1]); + return -1; + } + double A = it->second; + + SVector3 branchInQuadrant; + bool found = false; + double dpmax = -DBL_MAX; size_t kmax = (size_t) -1; + for (size_t k = 0; k < Ns; ++k) { /* Loop over branches */ + double agl = A + double(k)/double(Ns) * 2. * M_PI; + SVector3 branch = tgt * cos(agl) + tgt2 * sin(agl); + if (dot(branch,e_x) >= 0. && dot(branch,e_y) >= 0.) { + branchInQuadrant = branch; + found = true; + break; + } + double dp = dot(branch,SVector3(std::sqrt(2),std::sqrt(2),0.)); + if (dp > dpmax) {dpmax = dp; kmax = k;} + } + if (!found && kmax != (size_t)-1 ) { /* if numerical errors */ + double agl = A + double(kmax)/double(Ns) * 2. * M_PI; + branchInQuadrant = tgt * cos(agl) + tgt2 * sin(agl); + } + + double theta = acos(dot(branchInQuadrant,e_x)); + rep_vectors[j] = {cos(double(Ns)*theta),sin(double(Ns)*theta),0.}; + } + double sum_diff = 0.; + for (size_t j = 0; j < vPairs.size(); ++j) { + SVector3 vertical(0.,0.,1.); + const SVector3 r1 = rep_vectors[j]; + const SVector3 r2 = rep_vectors[(j+1)%rep_vectors.size()]; + double diff_angle = angle2PI(r1,r2,vertical); + if (diff_angle > M_PI) diff_angle -= 2.*M_PI; + sum_diff += diff_angle; + } + if (std::abs(sum_diff-2*M_PI) < 0.05*M_PI) { + vertexIndex[v] = -1; + } else if (std::abs(sum_diff+2*M_PI) < 0.05*M_PI) { + vertexIndex[v] = 1; + } else if (std::abs(sum_diff) > 0.05 * M_PI) { + Msg::Debug("singularity detection, v=%i, sum of diff is %.3f deg, ignored", v->getNum(), sum_diff); + } + } + + /* Three types of singularities with Crouzeix-Raviart interpolation: + * - on vertex + * - on edge + * - on triangle */ + + /* triangle singularities */ + for (MTriangle* t: triangles) { + MVertex* v1 = t->getVertex(0); + MVertex* v2 = t->getVertex(1); + MVertex* v3 = t->getVertex(2); + for (double index: {-1.,1.}) { + if (vertexIndex[v1] == index + && vertexIndex[v2] == index + && vertexIndex[v3] == index) { + SPoint3 p = (v1->point()+v2->point()+v3->point()) * double(1./3.); + singularities.push_back({p,index}); + /* remove from list of available singularities */ + vertexIndex[v1] = 0.; + vertexIndex[v2] = 0.; + vertexIndex[v3] = 0.; + } + } + } + /* edge singularities */ + for (MTriangle* t: triangles) { + for (size_t le = 0; le < 3; ++le) { + MVertex* v1 = t->getVertex(le); + MVertex* v2 = t->getVertex((le+1)%3); + for (double index: {-1.,1.}) { + if (vertexIndex[v1] == index + && vertexIndex[v2] == index) { + SPoint3 p = (v1->point()+v2->point()) * 0.5; + singularities.push_back({p,index}); + /* remove from list of available singularities */ + vertexIndex[v1] = 0.; + vertexIndex[v2] = 0.; + } + } + } + } + /* vertex singularities */ + for (auto& kv: vertexIndex) if (kv.second != 0) { + singularities.push_back({kv.first->point(),kv.second}); + } + + Msg::Debug("detect cross field singularities: found %li singularities (%li triangles)", + singularities.size(), triangles.size()); + + if (addSingularitiesAtAcuteCorners) { + size_t nb = singularities.size(); + unordered_map<MVertex*, double> cornerAngle; + unordered_map<MVertex*, std::vector<MTriangle*> > cornerToTris; + for (MTriangle* t: triangles) { + for (size_t le = 0; le < 3; ++le) { + MVertex* v2 = t->getVertex((le+1)%3); + if (v2->onWhat()->cast2Vertex() != NULL) { + MVertex* v1 = t->getVertex(le); + MVertex* v3 = t->getVertex((le+2)%3); + double agl = std::abs(angle3Vertices(v1,v2,v3)); + cornerAngle[v2] += agl; + cornerToTris[v2].push_back(t); + } + } + } + for (const auto& kv: cornerAngle) { + MVertex* v = kv.first; + double agl = kv.second; + if (agl * 180. / M_PI < thresholdInDeg) { + std::vector<MTriangle*>& tris = cornerToTris[v]; + if (tris.size() == 0) continue; + SPoint3 p(0.,0.,0.); + for (MTriangle* t: tris) { + p += t->barycenter(); + } + p = p * double(1./double(tris.size())); + singularities.push_back({p,1}); + } + } + if (singularities.size() > nb) { + Msg::Debug("detect cross field singularities: added %li artificial singularities at acute corners", + singularities.size()-nb); + } + } + + return 0; +} diff --git a/contrib/QuadMeshingTools/qmtCrossField.h b/contrib/QuadMeshingTools/qmtCrossField.h new file mode 100644 index 0000000000000000000000000000000000000000..70aac6a0a73a6e6711be02802a9ae2e0e7c5dfd4 --- /dev/null +++ b/contrib/QuadMeshingTools/qmtCrossField.h @@ -0,0 +1,133 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include <vector> +#include <array> +#include <unordered_map> +#include <utility> +#include "SPoint3.h" + +class MVertex; +class MTriangle; +class MLine; +class GFace; + +/** + * @brief Compute a smooth boundary-aligned cross field by alternating + * heat diffusion and projection (also called the MBO method). + * The crosses are aligned with the lines. + * The crosses are sampled on the mesh edges (Crouzeix-Raviart) + * and are represented by the angle of one of the branch with the + * edge. Returned values are copied on the triangle for ease of + * use in other methods. + * + * @param[in] N symmetry invariance, N=4 for crosses, N=6 for asterisks + * @param[in] triangles Triangulation used for the Crouzeix-Raviart computation, must be connected + * @param[in] lines Boundary conditions (cross aligned, theta angle is 0), must be non-empty + * @param[out] triEdgeTheta The cross field, one angle (in radians) per triangle edge. + * It is the relative angle between the edge and one branch of the cross. + * i.e.: branch = cos(theta)*edge_tangent+sin(theta)*edge_ortho + * @param[in] nbDiffusionLevels Number of diffusion levels in the MBO algo. + * @param[in] thresholdNormConvergence Converence criteria inside each level + * @param[in] nbBoundaryExtensionLayer Extend the Dirichlet BCs inside (on X layers) + * to push singularities inside the faces. + * @param[in] verbosity 0: no log (except errors), 1: two lines, 2: one per level, 3+: details + * + * @return 0 if success + */ +int computeCrossFieldWithHeatEquation( + int N, + const std::vector<MTriangle*>& triangles, + const std::vector<MLine*>& lines, + std::vector<std::array<double,3> >& triEdgeTheta, + int nbDiffusionLevels = 5, + double thresholdNormConvergence = 1.e-3, + int nbBoundaryExtensionLayer = 1, + int verbosity = 1); + +/** + * @brief Compute the cross field conformal scaling by canceling the Lie bracket, + * in a least square sense (singularities are not used). + * The scaling defines the "intrinsic" cross field size map (up to a constant). + * + * @param[in] N symmetry invariance, N=4 for crosses, N=6 for asterisks + * @param[in] triangles Triangulation used to compute the cross field, and use to compute the scaling + * @param[in] triEdgeTheta The cross field, one angle per triangle edge, relative to the edge direction + * should be compatible with the result of computeCrossFieldWithHeatEquation() + * @param[out] scaling The conformal scaling, scalar field with one value per vertex (P1 FEM) + * + * @return 0 if success + */ +int computeCrossFieldConformalScaling( + int N, + const std::vector<MTriangle*>& triangles, + const std::vector<std::array<double,3> >& triEdgeTheta, + std::unordered_map<MVertex*,double>& scaling); + + +/** + * @brief Compute a size map from the conformal scaling by adding an offset + * to get targetNumberOfQuads in the end (when integrating the sizemap). + * + * @param triangles Triangulation used to compute the conformal scaling + * @param targetNumberOfQuads The number of quads used to offset the scaling + * @param[in,out] scaling The size map to update with the offset + * + * @return 0 if success + */ +int computeQuadSizeMapFromCrossFieldConformalFactor( + const std::vector<MTriangle*>& triangles, + std::size_t targetNumberOfQuads, + std::unordered_map<MVertex*,double>& scaling); + + +/** + * @brief Convert the edge-sampled cross field to a triangle-sampled cross field, + * by using Crouzeix-Raviart interpolation. + * Each triangle has 3 unit directions at its corner. This cross field is (slighly) + * dicontinuous at triangle interfaces. + * + * @param[in] N symmetry invariance, N=4 for crosses, N=6 for asterisks + * @param[in] triangles Triangulation used to compute cross field and size map + * @param[in] triEdgeTheta The cross field, one angle per triangle edge, relative to the edge direction + * should be compatible with the result of computeCrossFieldWithHeatEquation() + * @param[out] triangleDirections The cross field sampled at triangle corners, three vectors + * per triangle (one per corner). component ordering: [v1x,v1y,v1z,.., v3x,v3y,v3z] + * + * @return 0 if success + */ +int convertToPerTriangleCrossFieldDirections( + int N, + const std::vector<MTriangle*>& triangles, + const std::vector<std::array<double,3> >& triEdgeTheta, + std::vector<std::array<double,9> >& triangleDirections); + +/** + * @brief Detect the singularities in a cross field by adding angle differences around + * vertex one-rings + * + * @param[in] N symmetry invariance, N=4 for crosses, N=6 for asterisks + * @param[in] triangles Triangulation used to compute cross field and size map + * @param[in] triEdgeTheta The cross field, one angle per triangle edge, relative to the edge direction + * should be compatible with the result of computeCrossFieldWithHeatEquation() + * @param[in] addSingularitiesAtAcuteCorners If true, at singularity at corners whose angle is small + * @param[in] thresholdInDeg Corners are considered acute if inferior to this threshold, e.g. 30 (degrees) + * @param[out] singularities Cross field singularities, position and index (-1 for valence 5, + * +1 for valence 3) + * + * @return 0 if success + */ +int detectCrossFieldSingularities( + int N, + const std::vector<MTriangle*>& triangles, + const std::vector<std::array<double,3> >& triEdgeTheta, + bool addSingularitiesAtAcuteCorners, + double thresholdInDeg, + std::vector<std::pair<SPoint3,int> >& singularities); + diff --git a/contrib/QuadMeshingTools/qmtCurveQuantization.cpp b/contrib/QuadMeshingTools/qmtCurveQuantization.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3357c83336c23e0eb0b92917eaa7eccf11430c69 --- /dev/null +++ b/contrib/QuadMeshingTools/qmtCurveQuantization.cpp @@ -0,0 +1,493 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "qmtSizeMap.h" + +/* System includes */ +#include <vector> +#include <array> +#include <unordered_map> +#include <cstdint> +#include <cmath> +#include <queue> +#include <algorithm> + +/* Gmsh includes */ +#include "Context.h" +#include "GmshMessage.h" +#include "OS.h" +#include "GVertex.h" +#include "GEdge.h" +#include "GFace.h" +#include "GModel.h" +#include "MVertex.h" +#include "MLine.h" +#include "MTriangle.h" +#include "meshGEdge.h" +#include "BackgroundMesh.h" +#include "gmsh.h" // debug + +/* QuadMeshingTools includes */ +#include "cppUtils.h" +#include "qmtMeshUtils.h" +#include "arrayGeometry.h" +#include "geolog.h" + +using namespace CppUtils; +using namespace ArrayGeometry; + +using std::vector; +using std::pair; +using std::unordered_map; + +namespace QMT { + constexpr int UNASSIGNED = -1; + constexpr int START = -2; + + + vec3 gedgeCenter(GEdge* ge) { + double t = 0.5*(ge->parBounds(0).low() + ge->parBounds(0).high()); + GPoint p = ge->point(t); + return {p.x(),p.y(),p.z()}; + } + + /* See Campen et al. 2015 */ + inline double quantization_weigth(const int node, const vector<double>& x_ideal, const vector<int>& n) { + const size_t Ne = n.size(); + double current = (n[node] == UNASSIGNED) ? 0. : double(n[node]); + const double dp = x_ideal[node] - current; + if (1. <= dp) { + return 1./ (dp+1.); + } else if (0. <= dp && dp < 1.) { + return Ne / (dp+1.); + } else if (dp < 0.) { + return Ne*Ne / (1.-dp); + } + return DBL_MAX; + } + + bool DBGPRINT = false; + + bool tchordPropagation( + const vector<vector<vector<int> > >& node2side2nodes, + int nodeInit, + const vector<int>& n, + const vector<double>& x_ideal, + vector<int>& tchord) { + + + std::vector<int> parent(node2side2nodes.size(),UNASSIGNED); + std::vector<int> initialSide(node2side2nodes.size(),UNASSIGNED); + + std::priority_queue<std::pair<double,int>, std::vector<std::pair<double,int> > > Q; + parent[nodeInit] = START; + Q.push({DBL_MAX,nodeInit}); + + std::vector<int> initialSideEnding(node2side2nodes[nodeInit].size(),UNASSIGNED); + if (initialSideEnding.size() == 0 || initialSideEnding.size() > 2) { + Msg::Error("wrong number of initial sides: %li", initialSideEnding.size()); + return false; + } + + while (Q.size() > 0) { + int node = Q.top().second; + Q.pop(); + int parentNode = parent[node]; + if (parentNode == UNASSIGNED) { + Msg::Error("parent not defined for node, should not happen"); + return false; + } + + int currentInitialSide = initialSide[node]; + if (currentInitialSide != UNASSIGNED && initialSideEnding[currentInitialSide] != UNASSIGNED) { + if (DBGPRINT) { + DBG(nodeInit, node, parentNode, currentInitialSide, "side finished, continue"); + } + continue; + } + if (DBGPRINT) { + DBG(nodeInit, node, parentNode, currentInitialSide); + } + + + /* Propagate on side which is not the origin (i.e. contains the parent) */ + bool prop = false; + for (size_t s = 0; s < node2side2nodes[node].size(); ++s) { + if (node == nodeInit) currentInitialSide = s; /* first time */ + + auto& sideNodes = node2side2nodes[node][s]; + + if (DBGPRINT) { + DBG(nodeInit, node, parentNode, currentInitialSide, s, sideNodes); + } + + if (inVector(parentNode, sideNodes)) continue; + + for (auto& node2: sideNodes) { + if (DBGPRINT) { + DBG(" ", node2, parent[node2]); + } + if (parent[node2] != UNASSIGNED) continue; /* already visited */ + double w = quantization_weigth(node2, x_ideal, n); + parent[node2] = node; + initialSide[node2] = currentInitialSide; + Q.push({w,node2}); + prop = true; + if (DBGPRINT) { + DBG(" +", node2, w); + } + } + + } + if (!prop && currentInitialSide != UNASSIGNED + && initialSideEnding[currentInitialSide] == UNASSIGNED) { + initialSideEnding[currentInitialSide] = node; + if (DBGPRINT) { + DBG(currentInitialSide, "end on", node); + } + } + } + + /* Check endings of propagation */ + if (DBGPRINT) { + DBG(initialSideEnding); + } + for (int& ending: initialSideEnding) if (ending == UNASSIGNED) { + if (DBGPRINT) { + DBG("return false"); + } + return false; + } + + /* Unroll sides */ + tchord.clear(); + for (int& ending: initialSideEnding) { + int node = ending; + while (node != START) { + tchord.push_back(node); + node = parent[node]; + } + } + sort_unique(tchord); + + return true; + } + + bool solveQuantizationWithGreedyApproach( + const vector<pair<vector<GEdge*>,vector<GEdge*> > >& oppositeSides, + const unordered_map<GEdge*,double>& x_ideal, + unordered_map<GEdge*,int>& x) { + + vector<pair<vector<int>,vector<int> > > oppositeSideTags(oppositeSides.size());; + for (size_t i = 0; i < oppositeSides.size(); ++i) { + for (size_t j = 0; j < oppositeSides[i].first.size(); ++j) { + oppositeSideTags[i].first.push_back(oppositeSides[i].first[j]->tag()); + } + for (size_t j = 0; j < oppositeSides[i].second.size(); ++j) { + oppositeSideTags[i].second.push_back(oppositeSides[i].second[j]->tag()); + } + } + + int count = 0; + unordered_map<GEdge*,int> old2new; + vector<GEdge*> new2old; + for (auto& kv: oppositeSides) { + for (GEdge* ge: merge(kv.first,kv.second)) { + auto it = old2new.find(ge); + if (it == old2new.end()) { + old2new[ge] = count; + new2old.push_back(ge); + count += 1; + } + } + } + + /* Build continuous data */ + vector<double> c_x_ideal(count,0.); + for (auto& kv: x_ideal) { + c_x_ideal[old2new[kv.first]] = kv.second; + } + + /* In the dual graph, + * - a GEdge is a node + * - the opposite GEdge in a GFace are edges */ + vector<vector<vector<int> > > node2side2nodes(count); + for (auto& kv: oppositeSides) { + /* Create a new side for each node */ + for (GEdge* ge: merge(kv.first,kv.second)) { + int node = old2new[ge]; + node2side2nodes[node].resize(node2side2nodes[node].size()+1); + } + + /* Fill the side with the opposite nodes */ + for (GEdge* ge1: kv.first) { + int node1 = old2new[ge1]; + for (GEdge* ge2: kv.second) { + int node2 = old2new[ge2]; + + node2side2nodes[node1].back().push_back(node2); + node2side2nodes[node2].back().push_back(node1); + } + } + } + + /* Greedy assignement in the graph */ + vector<int> n(count, UNASSIGNED); + vector<int> tchord; + int EXISTING_TRANSFINITE = 0; + int OTHERS = 1; + for (int pass: {EXISTING_TRANSFINITE,OTHERS}) { + /* Order the unassigned edges, shorter ideal length first */ + std::priority_queue<std::pair<double,int>, std::vector<std::pair<double,int> >, std::greater<std::pair<double,int> > > Q; + if (pass == EXISTING_TRANSFINITE) { + for (int e0 = 0; e0 < count; ++e0) if (n[e0] == UNASSIGNED ) { + if (new2old[e0]->meshAttributes.method == MESH_TRANSFINITE) { + Q.push({c_x_ideal[e0],e0}); + } + } + } else { + for (int e0 = 0; e0 < count; ++e0) if (n[e0] == UNASSIGNED ) { + Q.push({c_x_ideal[e0],e0}); + } + } + + while (Q.size() > 0) { + int e0 = Q.top().second; + Q.pop(); + if (n[e0] != UNASSIGNED) continue; + tchord.clear(); + bool ok = tchordPropagation(node2side2nodes, e0, n, c_x_ideal, tchord); + if (!ok || tchord.size() == 0) continue; + + vector<int> nLinesImposedFromTransfinite; + double avgDiff = 0.; + double minDiff = DBL_MAX; + double maxDiff = 0.; + for (int e: tchord) { + double current = (n[e] == UNASSIGNED) ? 0. : double(n[e]); + avgDiff += (c_x_ideal[e]-current); + minDiff = std::min(minDiff,c_x_ideal[e]-current); + maxDiff = std::max(maxDiff,c_x_ideal[e]-current); + if (new2old[e]->meshAttributes.method == MESH_TRANSFINITE) { + nLinesImposedFromTransfinite.push_back(new2old[e]->meshAttributes.nbPointsTransfinite-1); + } + } + avgDiff /= double(tchord.size()); + int increment = 0; + sort_unique(nLinesImposedFromTransfinite); + if (nLinesImposedFromTransfinite.size() == 1) { + increment = nLinesImposedFromTransfinite[0]; + } else if (nLinesImposedFromTransfinite.size() > 1) { + Msg::Error("curve quantization: incoherent imposed transfinite constraints"); + continue; + } else { + increment = int(std::round(minDiff)); + if (increment <= 0.) increment = 1; + } + DBG(tchord, increment); + for (int e: tchord) { + if (n[e] == UNASSIGNED) { + n[e] = increment; + } else { + n[e] += increment; + } + } + + // int e0tag = new2old[e0]->tag(); + // vector<int> tchordTags; + // for (int a: tchord) tchordTags.push_back(new2old[a]->tag()); + // DBG(e0tag, ok, tchordTags, avgDiff, increment); + // { + // for (int a: tchord) { + // vec3 pt = gedgeCenter(new2old[a]); + // GeoLog::add({pt},0.,"chord_"+std::to_string(e0tag)); + // } + // } + } + } + + GeoLog::flush(); + + DBG(c_x_ideal); + DBG(n); + + for (size_t i = 0; i < n.size(); ++i) if (n[i] > 0){ + x[new2old[i]] = n[i]; + } + + return true; + } +} + + +const std::string BMESH_NAME = "bmesh_quadqs"; + +int initialCurveQuantization(GModel* gm, double maxDiffNbLines, + std::unordered_map<GFace*,vector<GVertex*> >& faceCorners + ) { + std::vector<GFace*> faces = model_faces(gm); + std::vector<GEdge*> edges = model_edges(gm); + + Msg::Debug("initial curve quantization (%li curves) ...", edges.size()); + + + /* Collect opposite sides in the CAD */ + vector<pair<vector<GEdge*>,vector<GEdge*> > > oppositeSides; + std::unordered_map<GEdge*,double> x_ideal; + + for (GFace* gf: faces) { + if (CTX::instance()->mesh.meshOnlyVisible && !gf->getVisibility()) continue; + if (CTX::instance()->debugSurface > 0 && gf->tag() != CTX::instance()->debugSurface) continue; + + GFaceInfo info; + bool okf = fillGFaceInfo(gf, info); + if (!okf) { + Msg::Debug("initial curve quantization: no triangles available"); + return -1; + } + + std::vector<std::vector<std::vector<std::pair<GEdge*,bool> > > > loopSideEdgesAndInv; + bool oksl = faceOrderedSideLoops(gf, info, loopSideEdgesAndInv); + if (!oksl) { + Msg::Debug("initial curve quantization: failed to get face ordered side loops for face %i", gf->tag()); + continue; + } + + DBG(isTopologicalDisk(info),haveConcaveCorners(info),info.bdrValVertices[1].size()); + + /* Rectangular face with 4 convex corners */ + if (isTopologicalDisk(info) && !haveConcaveCorners(info) + && info.bdrValVertices[1].size() == 4) { + vector<pair<vector<GEdge*>,vector<GEdge*> > > GFoppositeSides; + size_t NS = 0; + for (size_t k = 0; k < 2; ++k) { /* direction */ + double len_a = 0.; + double len_b = 0.; + int nl_a = 0; + int nl_b = 0; + size_t Na = 0; + size_t Nb = 0; + vector<GEdge*> side_a; + vector<GEdge*> side_b; + for (auto& kv: loopSideEdgesAndInv[0][k]) { + GEdge* ge = kv.first; + len_a += ge->length(); + int npts = meshGEdgeTargetNumberOfPoints(ge); + if (npts >= 2) { + nl_a += (npts-1); + auto it = x_ideal.find(ge); + if (it == x_ideal.end()) x_ideal[ge] = double(nl_a); + } + Na += 1; + side_a.push_back(ge); + } + for (auto& kv: loopSideEdgesAndInv[0][k+2]) { + GEdge* ge = kv.first; + len_b += ge->length(); + int npts = meshGEdgeTargetNumberOfPoints(ge); + if (npts >= 2) { + nl_b += (npts-1); + auto it = x_ideal.find(ge); + if (it == x_ideal.end()) x_ideal[ge] = double(nl_b); + } + Nb += 1; + side_b.push_back(ge); + } + + if (len_a == 0 || len_b == 0) continue; + + /* Check the difference in terms of number of lines */ + double nl_diff_rel = std::abs(double(nl_a-nl_b)) / (double(std::max(nl_a,nl_b))); + double len_diff_rel = std::abs(double(len_a-len_b)) / (double(std::max(len_a,len_b))); + if (nl_diff_rel <= maxDiffNbLines) { + /* Want equality on opposite sides */ + GFoppositeSides.push_back({side_a,side_b}); + NS += 1; + } + } + + if (NS == 2) { /* transfinite face, both direction equal */ + std::vector<GVertex*> corners; + for (size_t k = 0; k < 4; ++k) { + for (auto& kv: loopSideEdgesAndInv[0][k]) { + GEdge* ge = kv.first; + bool inv = kv.second; + GVertex* gv1 = inv ? ge->vertices()[1] : ge->vertices()[0]; + bool isCorner1 = std::find( info.bdrValVertices[1].begin(), info.bdrValVertices[1].end(), gv1) != + info.bdrValVertices[1].end(); + if (isCorner1) { + corners.push_back(gv1); + } + } + } + if (corners.size() != 4) { + Msg::Debug("curve quantization: face %i, wrong number of corners", gf->tag()); + continue; + } + append(oppositeSides,GFoppositeSides); + faceCorners[gf] = corners; + } + } + } + + if (oppositeSides.size() == 0) return 0; + + unordered_map<GEdge*,int> n; + bool okq = QMT::solveQuantizationWithGreedyApproach(oppositeSides, x_ideal, n); + if (!okq) { + Msg::Error("failed to solve quantization with greedy approach"); + return -1; + } + + /* Transfinite constraints on curve */ + for (auto& kv: n) { + if (kv.second > 0) { + GEdge* ge = kv.first; + int nLines = kv.second; + if (ge->meshAttributes.method != MESH_TRANSFINITE) { + ge->meshAttributes.method = MESH_TRANSFINITE; + ge->meshAttributes.typeTransfinite = 4; /* use size map for positions */ + ge->meshAttributes.nbPointsTransfinite = nLines + 1; + Msg::Debug("- set transfinite on curve %i (%i points)", ge->tag(), nLines+1); + } + } + } + + return 0; +} + + + +int setQuadqsTransfiniteConstraints(GModel* gm, double maxDiffNbLines) { + Msg::Debug("set quadqs transfinite constraints ..."); + + std::unordered_map<GFace*,vector<GVertex*> > faceCorners; + + int si = initialCurveQuantization(gm, maxDiffNbLines, faceCorners); + if (si != 0) return si; + + for (GFace* gf: gm->getFaces()) { + bool allTransfi = true; + for (GEdge* ge: gf->edges()) { + if (ge->meshAttributes.method != MESH_TRANSFINITE) allTransfi = false; + } + if (allTransfi) { + gf->meshAttributes.method = MESH_TRANSFINITE; + gf->meshAttributes.transfiniteArrangement = 1; /* Right */ + gf->meshAttributes.recombine = 1; + gf->meshAttributes.recombineAngle = 45.; + auto it = faceCorners.find(gf); + if (it != faceCorners.end()) { + std::vector<GVertex*> corners = it->second; + gf->meshAttributes.corners = corners; /* warning: must be ordered ! */ + } + Msg::Debug("- set transfinite on surface %i", gf->tag()); + } + } + + return 0; +} diff --git a/contrib/QuadMeshingTools/qmtCurveQuantization.h b/contrib/QuadMeshingTools/qmtCurveQuantization.h new file mode 100644 index 0000000000000000000000000000000000000000..3640d28f0deb4c033ed0be1060af0cd57ad7ac35 --- /dev/null +++ b/contrib/QuadMeshingTools/qmtCurveQuantization.h @@ -0,0 +1,34 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +class GModel; + +/** + * + * WARNING: work in progress, NOT READY for generic usage + * + * + * @brief Determine the number of points on each GEdge + * for quad meshing. Try to match the opposite + * sides to get regular meshes. + * The GEdge meshing properties are changed and + * some GEdge are set to transfinite. + * The GFace whose boundary curves are all transfinite + * are set to transfinite. + * Requires a mesh. Use the existing GFace meshes + * or a background mesh if available. + * + * @param gm The model containing the curves + * @param maxDiffNbLines Two opposite sides are constrained to the + * same number of lines if their relative difference + * is inferior to this threshold. + * + * @return 0 if success + */ +int setQuadqsTransfiniteConstraints(GModel* gm, double maxDiffNbLines = 0.25); diff --git a/contrib/QuadMeshingTools/qmtDiskQuadrangulationRemeshing.cpp b/contrib/QuadMeshingTools/qmtDiskQuadrangulationRemeshing.cpp new file mode 100644 index 0000000000000000000000000000000000000000..50017e4d440b51dcec1e8eb83f8ee39c5365c2fd --- /dev/null +++ b/contrib/QuadMeshingTools/qmtDiskQuadrangulationRemeshing.cpp @@ -0,0 +1,488 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "qmtDiskQuadrangulationRemeshing.h" + +/* System includes */ +// #include <vector> +// #include <array> +// #include <unordered_map> +// #include <cstdint> +// #include <cmath> +// #include <queue> +// #include <algorithm> + +/* Gmsh includes */ +#include "GmshMessage.h" +#include "OS.h" +#include "GVertex.h" +#include "GEdge.h" +#include "GFace.h" +#include "GModel.h" +#include "MVertex.h" +#include "MLine.h" +#include "MElement.h" +#include "MTriangle.h" +#include "MQuadrangle.h" +#include "BackgroundMesh.h" +#include "StringUtils.h" + +/* QuadMeshingTools includes */ +#include "cppUtils.h" +#include "qmtMeshUtils.h" +#include "qmtMeshGeometryOptimization.h" +#include "dataDiskQuadrangulationsSplit.hpp" // list of disk quadrangulations as many strings + +using namespace CppUtils; + +constexpr bool PARANO_QUALITY = false; + +namespace QMT { + using id = uint32_t; + using id4 = std::array<id,4>; + + struct vidHash { + size_t operator()(const std::vector<id>& p) const noexcept { + uint32_t hash = 0; + for (size_t i = 0; i < p.size(); ++i) { + hash += p[i]; + hash += hash << 10; + hash ^= hash >> 6; + } + hash += hash << 3; + hash ^= hash >> 11; + hash += hash << 15; + return hash; + } + }; + + using std::vector; + using std::unordered_map; /* robin_hood unordered_map much faster */ + using Quadrangulation = std::vector< std::array<id,4> >; + + vector<vector<Quadrangulation> > B_disk_quadrangulations; + vector<unordered_map<vector<id>, vector<id>, vidHash > > B_BVL_ids; + + bool load_disk_quadrangulations_from_raw_data() { + if (B_disk_quadrangulations.size() != 0) return false; + + Msg::Info("loading disk quadrangulations ..."); + B_disk_quadrangulations.reserve(20); + B_BVL_ids.reserve(20); + // std::string data(disk_quadrangulations); + std::string data; + diskQuadrangulationConcat(data); + vector<std::string> lines = SplitString(data,'\n'); + Quadrangulation qdrl; + vector<std::string> numbers; + vector<id> bdrValLoop; + for (size_t i = 0; i < lines.size(); ++i) { + numbers = SplitString(lines[i],' '); + if (numbers.size() < 7) continue; + size_t B = std::stoi(numbers[0]); + size_t I = std::stoi(numbers[1]); + size_t Q = std::stoi(numbers[2]); + if (numbers.size() != 3 + 4 * Q) { + Msg::Warning("load_disk_quadrangulations | wrong sizes: B=%li, I=%li, Q=%li and numbers.size = %li", + B, I, Q, numbers.size()); + continue; + } + qdrl.resize(Q); + for (size_t j = 0; j < Q; ++j) { + for (size_t lv = 0; lv < 4; ++lv) { + qdrl[j][lv] = std::stoi(numbers[3 + 4 * j + lv]); + } + } + + if (B >= B_disk_quadrangulations.size()) { + B_disk_quadrangulations.resize(B+1); + B_disk_quadrangulations[B].reserve(1000); + B_BVL_ids.resize(B+1); + } + + id qId = B_disk_quadrangulations[B].size(); + B_disk_quadrangulations[B].push_back(qdrl); + + /* Assumes: + * - first B vertices are on the boundary + * - canonical valence ordering according to boundary valence loop + * (should be compatible with the generator) */ + bdrValLoop.clear(); + bdrValLoop.resize(B,0); + for (size_t j = 0; j < Q; ++j) for (size_t lv = 0; lv < 4; ++lv){ + id v = qdrl[j][lv]; + if (v < B) bdrValLoop[v] += 1; + } + B_BVL_ids[B][bdrValLoop].push_back(qId); + } + Msg::Info("%li disk quadrangulations loaded", lines.size()); + return true; + } + + bool computeQuadMeshValences(const vector<id4>& quads, vector<int>& valence) { + valence.clear(); + valence.reserve(quads.size()*4); + for (size_t f = 0; f < quads.size(); ++f) for (size_t lv = 0; lv < 4; ++lv) { + size_t v = quads[f][lv]; + if (v >= valence.size()) valence.resize(v+1,0); + valence[v] += 1; + } + return true; + } + + double computeIrregularity( + const vector<id4>& quads, + const vector<int>& valence, + const std::vector<int>& bndIdealValence, + const std::vector<std::pair<int,int> >& bndAllowedValenceRange) + { + double irregularity = 0.; + /* Boundary vertices */ + for (size_t bv = 0; bv < bndIdealValence.size(); ++bv) { + if (valence[bv] < bndAllowedValenceRange[bv].first) return DBL_MAX; + if (valence[bv] > bndAllowedValenceRange[bv].second) return DBL_MAX; + if (bndIdealValence[bv] <= 1 && valence[bv] >= 2) { /* probably making a 6+ ... */ + irregularity += 1000; + } else { + irregularity += 10*std::pow(bndIdealValence[bv]-valence[bv],2); + } + } + /* Interior vertices */ + for (size_t iv = bndIdealValence.size(); iv < valence.size(); ++iv) { + irregularity += std::pow(4-valence[iv],2); + } + return irregularity; + } + + + bool computeBestMatchingConfiguration( + const vector<id4>& quads, + const vector<int>& valence, + const vector<int>& bndIdealValence, + const vector<std::pair<int,int> >& bndAllowedValenceRange, + int& rotation, + double& irregularity) + { + double best = DBL_MAX; + int rot = 0; + vector<int> biv = bndIdealValence; + vector<std::pair<int,int>> bav = bndAllowedValenceRange; + + /* Initial config */ + { + double irreg = computeIrregularity(quads, valence, biv, bav); + if (irreg < best) { + best = irreg; + rotation = rot; + } + } + + /* Forward rotation */ + for (size_t r = 1; r < biv.size(); ++r) { + rot += 1; + std::rotate(biv.begin(),biv.begin()+1,biv.end()); + std::rotate(bav.begin(),bav.begin()+1,bav.end()); + double irreg = computeIrregularity(quads, valence, biv, bav); + if (irreg < best) { + best = irreg; + rotation = rot; + } + } + + /* Try in reverse order */ + rot = 0; + biv = bndIdealValence; + bav = bndAllowedValenceRange; + std::reverse(biv.begin(),biv.end()); + std::reverse(bav.begin(),bav.end()); + for (size_t r = 1; r < biv.size(); ++r) { + rot -= 1; + std::rotate(biv.begin(),biv.begin()+1,biv.end()); + std::rotate(bav.begin(),bav.begin()+1,bav.end()); + double irreg = computeIrregularity(quads, valence, biv, bav); + if (irreg < best) { + best = irreg; + rotation = rot; + } + } + + irregularity = best; + return (best != DBL_MAX); + } + + /* WARNING: GFace is not modified, just the "floating" MVertex + * and MQuadrangle are created, they must be inserted in the GFace + * later is the pattern is kept. + * The vertex positions are random ! Need geometric smoothing after */ + bool getDiskQuadrangulationRemeshing( + GFace* gf, + const std::vector<MVertex*>& bnd, + int rotation, /* rotation to apply to input */ + const std::vector<id4>& quads, /* pattern */ + std::vector<MVertex*> & newVertices, /* new vertices inside the cavity */ + std::vector<MElement*> & newElements /* new quads inside the cavity */ + ) { + if (bnd.size() < 4) return false; + + const double EPS_RANDOM = 1.e-16; + + std::vector<MVertex*> bndr = bnd; + if (rotation > 0) { + std::rotate(bndr.begin(),bndr.begin()+(size_t)rotation,bndr.end()); + } else if (rotation < 0) { + std::reverse(bndr.begin(),bndr.end()); + std::rotate(bndr.begin(),bndr.begin()+(size_t) std::abs(rotation),bndr.end()); + } + + /* Default position/uv for new vertices */ + SPoint3 defaultPoint; + SPoint2 defaultParam; + size_t num = (size_t) -1; + for (MVertex* v: bnd) { + if (v->onWhat() == gf && v->getNum() < num) { + defaultPoint = v->point(); + v->getParameter(0,defaultParam[0]); + v->getParameter(1,defaultParam[1]); + num = v->getNum(); + } + } + if (num == (size_t) -1) { /* No bdr vertex inside face */ + defaultPoint = bndr[0]->point(); + reparamMeshVertexOnFace(bndr[0], gf, defaultParam); + } + + size_t count = 1; + unordered_map<id,MVertex*> pv2mv; + for (size_t f = 0; f < quads.size(); ++f) { + std::array<MVertex*,4> vert; + for (size_t lv = 0; lv < 4; ++lv) { + size_t pv = quads[f][lv]; + if (pv < bndr.size()) { + vert[lv] = bndr[pv]; + } else { + auto it = pv2mv.find(pv); + if (it == pv2mv.end()) { + SVector3 p = defaultPoint; + p.data()[0] += count * EPS_RANDOM; + p.data()[1] += count * EPS_RANDOM; + p.data()[2] += count * EPS_RANDOM; + double uv[2] = {defaultParam.x(),defaultParam.y()}; + uv[0] = uv[0] + count * EPS_RANDOM; + uv[1] = uv[1] + count * EPS_RANDOM; + MVertex *mv = new MFaceVertex(p.x(),p.y(),p.z(),gf,uv[0],uv[1]); + pv2mv[pv] = mv; + vert[lv] = mv; + newVertices.push_back(mv); + count += 1; + } else { + vert[lv] = it->second; + } + } + } + if (rotation < 0) { /* revert quad to keep coherent orientation */ + std::reverse(vert.begin(),vert.end()); + } + MQuadrangle *q = new MQuadrangle (vert[0],vert[1],vert[2],vert[3]); + newElements.push_back(q); + } + + /* Ensure coherent orientation between the new mesh and the boundary */ + bool oko = orientElementsAccordingToBoundarySegment(bnd[0],bnd[1], newElements); + if (!oko) { + Msg::Error("getDiskQuadrangulationRemeshing: bdr quad edge not found, weird"); + return false; + } + + return true; + } + + bool smallCavitySmoothing(GFaceMeshPatch& patch, + SurfaceProjector* sp, bool invertNormalsForQuality, + GeomOptimStats& stats) { + if (patch.intVertices.size() == 0) { + computeSICN(patch.elements, stats.sicnMinBefore, stats.sicnAvgBefore); + computeSICN(patch.elements, stats.sicnMinAfter, stats.sicnAvgAfter); + return true; + } + + + bool cadInitOk = false; + if (haveNiceParametrization(patch.gf)) { + PatchGeometryBackup backup(patch); + /* Try pure UV smoothing in parameter space */ + int s0 = patchOptimizeGeometryGlobal(patch, stats); + if (stats.sicnMinAfter > 0.) { + cadInitOk = true; + } else { + backup.restore(); + } + } + + /* Kernel smoothing (in parameter space or in 3D space with proj.) */ + GeomOptimOptions opt; + opt.invertCADNormals = invertNormalsForQuality; + opt.localLocking = true; + opt.dxLocalMax = 1.e-5; + opt.outerLoopIterMax = 100; + opt.timeMax = 0.25 * double(patch.intVertices.size()); + if (cadInitOk) { + opt.force3DwithProjection = false; + opt.useDmoIfSICNbelow = 0.5; + } else { + opt.sp = sp; + opt.force3DwithProjection = true; + } + + bool okk = patchOptimizeGeometryWithKernel(patch, opt, stats); + return okk; + } + +} + +using namespace QMT; + +int initDiskQuadrangulations() { + bool ok = load_disk_quadrangulations_from_raw_data(); + if (!ok) return -1; + return 0; +} + +int remeshLocalWithDiskQuadrangulation( + GFace* gf, + const std::vector<MElement*>& elements, + const std::vector<MVertex*>& intVertices, + const std::vector<MVertex*>& bdrVertices, + const std::vector<int>& bndIdealValence, + const std::vector<std::pair<int,int> >& bndAllowedValenceRange, + const std::vector<MElement*>& neighborsForGeometry, + double minSICNrequired, + bool invertNormalsForQuality, + SurfaceProjector* sp, + GFaceMeshDiff& diff) { + if (QMT::B_disk_quadrangulations.size() == 0) { + Msg::Error("Missing disk quadrangulation database, call initDiskQuadrangulations() before"); + return -1; + } + if (bdrVertices.size() == 0) { + Msg::Error("disk quadrangulation remeshing: no boundary vertices", bdrVertices.size()); + return -1; + } + + + /* Get disk quadrangulations with the same boundary size */ + const vector<vector<id4> >* small_patterns = NULL; + if (bdrVertices.size() < B_disk_quadrangulations.size() && B_disk_quadrangulations[bdrVertices.size()].size() > 0) { + small_patterns = &(B_disk_quadrangulations[bdrVertices.size()]); + } else { + // TODO: a simple remeshing by using parallel quads ? + Msg::Warning("disk quadrangulation remeshing: no pattern for input boundary loop size (%li bdr vertices)", + bdrVertices.size()); + return -1; + } + const vector<vector<id4> >& qmeshes = *small_patterns; + + + /* For each disk quadrangulation, compute vertex valence and + * check matching with input patch, considering all rotations. + * Store the compatible matchings with their irregularity score. */ + vector<int> valence; + std::vector<std::pair<double,std::pair<size_t,int> > > irregularity_pattern_rotation; + for (size_t i = 0; i < qmeshes.size(); ++i) { + const vector<id4>& quads = qmeshes[i]; + computeQuadMeshValences(quads, valence); + double irregularity = DBL_MAX; + int rotation = 0; + bool found = computeBestMatchingConfiguration(quads, valence, bndIdealValence, bndAllowedValenceRange, rotation, irregularity); + if (found) { + irregularity_pattern_rotation.push_back({irregularity,{i,rotation}}); + } + } + if (irregularity_pattern_rotation.size() == 0) { + Msg::Debug("disk quadrangulation remeshing: no pattern matching input allowed valence range (%li bdr vertices)", + bdrVertices.size()); + return -1; /* no pattern matching allowed valence range */ + } + std::sort(irregularity_pattern_rotation.begin(),irregularity_pattern_rotation.end()); + + /* Keep the best pattern for which it is possible to find a + * untangled and sufficient quality geometry */ + size_t N = 5; /* maximum number of pattern tested */ + if (irregularity_pattern_rotation.size() < N) N = irregularity_pattern_rotation.size(); + + bool geometryOk = false; + for (size_t i = 0; i < N; ++i) { + size_t no = irregularity_pattern_rotation[i].second.first; + int rotation = irregularity_pattern_rotation[i].second.second; + const vector<id4>& quads = qmeshes[no]; + + /* New GFace mesh patch */ + GFaceMeshPatch patch; + patch.gf = gf; + patch.bdrVertices = {bdrVertices}; + + bool ok = getDiskQuadrangulationRemeshing(gf, bdrVertices, + rotation, quads, patch.intVertices, patch.elements); + if (!ok) { + Msg::Debug("disk quandrangulation remeshing: failed to remesh small cavity"); + continue; + } + Msg::Debug("disk quadrangulation remeshing: try %li/%li, dq=[%li,%i], %li bdr, %i->%i int vertices, %i->%i quads", + i, N, no, rotation, patch.bdrVertices.front().size(), intVertices.size(), patch.intVertices.size(), elements.size(), patch.elements.size()); + + /* Try to only move the interior vertices (in general, it is not enough) */ + { + GeomOptimStats stats; + bool oks = smallCavitySmoothing(patch, sp, invertNormalsForQuality, stats); + if (oks && stats.sicnMinAfter > minSICNrequired) { + geometryOk = true; + diff.after = patch; /* set the diff output ! */ + break; + } + } + + /* Try to move the interior and bdr vertices (which are not on CAD curve/corner) */ + { + std::vector<MElement*> largerElements = patch.elements; + append(largerElements, neighborsForGeometry); + GFaceMeshPatch largerPatch; + bool okp = patchFromElements(gf, largerElements, largerPatch); + if (!okp || largerPatch.intVertices.size() == 0) continue; + + PatchGeometryBackup bdrBackup(largerPatch); + + Msg::Debug("try smoothing the extended cavity (%li -> %li free vertices)", + patch.intVertices.size(), largerPatch.intVertices.size()); + + GeomOptimStats stats; + bool oks = smallCavitySmoothing(largerPatch, sp, invertNormalsForQuality, stats); + if (oks && stats.sicnMinAfter > minSICNrequired) { + geometryOk = true; + diff.after = patch; /* set the diff output (the patch, not the largerPatch) ! */ + break; + } else { + /* restore boundary positions */ + bdrBackup.restore(); + } + } + } + + if (!geometryOk) { + Msg::Debug("disk quadrangulation remeshing: failed to find valid geometry (%li bdr vertices)", + bdrVertices.size()); + return -1; + } + + /* set the diff input */ + diff.gf = gf; + diff.before.gf = gf; + diff.before.elements = elements; + diff.before.intVertices = intVertices; + diff.before.bdrVertices = {bdrVertices}; + + + return 0; +} diff --git a/contrib/QuadMeshingTools/qmtDiskQuadrangulationRemeshing.h b/contrib/QuadMeshingTools/qmtDiskQuadrangulationRemeshing.h new file mode 100644 index 0000000000000000000000000000000000000000..6094b862d99bbee760c677940ac9c4fbe548c55d --- /dev/null +++ b/contrib/QuadMeshingTools/qmtDiskQuadrangulationRemeshing.h @@ -0,0 +1,58 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include "qmtMeshUtils.h" + + +class SurfaceProjector; + +/** + * @brief Parse the disk quadrangulation list at runtime. + * Must be called one-time before using remeshLocalWithDiskQuadrangulation() + * + * @return 0 if success + */ +int initDiskQuadrangulations(); + +/** + * @brief Look for the best topological disk quadrangulation remeshing + * which match the allowed valence ranges. + * Requires that the disk quadrangulation data is initialized, see initDiskQuadrangulations() + * The GFace mesh is not changed, the changes are stored in the diff + * which can executed by the caller. + * + * @param[in] gf CAD face containing the elements + * @param[in] elements Elements (triangles or quads) in the input patch. May be empty + * @param[in] intVertices Interior vertices in the input patch. May be empty + * @param[in] bdrVertices Patch ordered boundary vertex loop, minimum 4 vertices + * @param[in] bndIdealValence The ideal inside quad valence for the boundary corners + * @param[in] bndAllowedValenceRange The allowed range of inside quad valence + * @param[in] neighborsForGeometry Adjacent elements that may be used for geometry untangling + * @param[in] minSICNafer Minimum SICN quality required in the remeshed patch. + * Compared after geometry untangling/smoothing. + * @param[in] invertNormalsForQuality The CAD normals are used to compute signed quality. + * This flag invert invert the CAD normals in the measure. + * @param[in] sp If not nullptr, the surface projector is used instead of the CAD parametrization + * in the smoothing. Required if there is no surface parametrization. + * @param[out] diff The mesh diff (to the GFace) containing the remeshing candidate + * + * @return 0 if a valid remeshing has been found + */ +int remeshLocalWithDiskQuadrangulation( + GFace* gf, + const std::vector<MElement*>& elements, + const std::vector<MVertex*>& intVertices, + const std::vector<MVertex*>& bdrVertices, + const std::vector<int>& bndIdealValence, + const std::vector<std::pair<int,int> >& bndAllowedValenceRange, + const std::vector<MElement*>& neighborsForGeometry, + double minSICNafer, + bool invertNormalsForQuality, + SurfaceProjector* sp, + GFaceMeshDiff& diff); diff --git a/contrib/QuadMeshingTools/qmtMeshGeometryOptimization.cpp b/contrib/QuadMeshingTools/qmtMeshGeometryOptimization.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2414658d913f36cc232f0a49351c87fecbb5ffae --- /dev/null +++ b/contrib/QuadMeshingTools/qmtMeshGeometryOptimization.cpp @@ -0,0 +1,1581 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "qmtMeshGeometryOptimization.h" + +/* System includes */ +// #include <vector> +// #include <array> +// #include <unordered_map> +// #include <cstdint> +// #include <cmath> +// #include <queue> +// #include <algorithm> + +/* Gmsh includes */ +#include "GmshMessage.h" +#include "OS.h" +#include "GVertex.h" +#include "GEdge.h" +#include "GFace.h" +#include "GModel.h" +#include "MVertex.h" +#include "MLine.h" +#include "MElement.h" +#include "MTriangle.h" +#include "MQuadrangle.h" +#include "robin_hood.h" +#include "meshOctreeLibOL.h" +#include "Context.h" +#include "gmsh.h" // api + +/* QuadMeshingTools includes */ +#include "cppUtils.h" +#include "qmtMeshUtils.h" +#include "arrayGeometry.h" +#include "geolog.h" + +#if defined(HAVE_EIGEN) +#include<Eigen/SparseLU> +#include<Eigen/IterativeLinearSolvers> +#endif + +constexpr bool DBG_VIZU_K = false; +constexpr bool DBG_VIZU_G = false; + +using namespace CppUtils; +using namespace ArrayGeometry; + +using std::vector; +using vec4 = std::array<double,4>; +using vec5 = std::array<double,5>; + +template <typename Key, typename T, typename Hash = robin_hood::hash<Key>, + typename KeyEqual = std::equal_to<Key>, size_t MaxLoadFactor100 = 80> + using unordered_map = robin_hood::detail::Table<true, MaxLoadFactor100, Key, T, Hash, KeyEqual>; + +template <typename Key, typename Hash = robin_hood::hash<Key>, typename KeyEqual = std::equal_to<Key>, + size_t MaxLoadFactor100 = 80> + using unordered_set = robin_hood::detail::Table<true, MaxLoadFactor100, Key, void, Hash, KeyEqual>; + +namespace QMT { + constexpr size_t NO_SIZE_T = (size_t) -1; + + bool SHOW_QUALITY = false; /* Debug only */ + + inline bool kernelWinslowSpecialStencil(const vec3 ptsStencil[8], vec3& newPos) { + /* Stencil: + * 6---1---4 + * | | | + * 2--- ---0 + * | | | + * 7---3---5 + */ + /* warning: 2D stencil but 3D coordinates */ + const double hx = 1.; + const double hy = 1.; + + /* 1. Compute the winslow coefficients (alpha_i, beta_i in the Karman paper) */ + /* a. Compute first order derivatives of the position */ + vec3 r_i[2]; + r_i[0] = 1./hx * (ptsStencil[0] - ptsStencil[2]); + r_i[1] = 1./hy * (ptsStencil[1] - ptsStencil[3]); + /* b. Compute the alpha_i coefficients */ + const double alpha_0 = dot(r_i[1],r_i[1]); + const double alpha_1 = dot(r_i[0],r_i[0]); + /* c. Compute the beta coefficient */ + const double beta = dot(r_i[0],r_i[1]); + + /* cross derivative */ + const vec3 u_xy = 1./(4.*hx*hy) * (ptsStencil[4]+ptsStencil[7]-ptsStencil[6]-ptsStencil[5]); + + /* 2. Compute the "winslow new position" */ + const double denom = 2. * alpha_0 / (hx*hx) + 2. * alpha_1 / (hy*hy); + if (std::abs(denom) < 1.e-18) return false; + newPos = 1. / denom * ( + alpha_0/(hx*hx) * (ptsStencil[0] + ptsStencil[2]) + + alpha_1/(hy*hy) * (ptsStencil[1] + ptsStencil[3]) + - 2. * beta * u_xy + ); + return true; + } + + inline bool kernelWinslow(const std::array<vec3,8>& stencil, vec3& newPos) { + /* Continuous ordering in input stencil */ + const std::array<uint32_t,8> o2n = {0, 2, 4, 6, 1, 7, 3, 5}; + const std::array<vec3,8> winStencil = { + stencil[o2n[0]], stencil[o2n[1]], stencil[o2n[2]], stencil[o2n[3]], + stencil[o2n[4]], stencil[o2n[5]], stencil[o2n[6]], stencil[o2n[7]]}; + return kernelWinslowSpecialStencil(winStencil.data(), newPos); + } + + bool kernelLaplacian(const std::vector<vec3>& points, vec3& newPos) { + const size_t N = points.size(); + if (N == 0) return false; + newPos = {0.,0.,0.}; + for (size_t i = 0; i < N; ++i) { + newPos = newPos + points[i]; + } + newPos = 1./double(N) * newPos; + return true; + } + + bool kernelAngleBased(const vec3& center, const std::vector<vec3>& points, vec3& newPos) { + const size_t N = points.size(); + std::vector<vec3> rotated(N); + std::vector<double> angles(N); + double sum_angle = 0.; + for (size_t i = 0; i < N; ++i) { + const vec3& prev = points[(N+i-1)%N]; + const vec3& cur = points[i]; + const vec3& next = points[(i+1)%N]; + vec3 oldDir = (center - cur); + double len = length(oldDir); + if (len == 0.) return false; + vec3 d1 = prev-cur; + if (length2(d1) == 0.) return false; + vec3 d2 = next-cur; + if (length2(d2) == 0.) return false; + normalize(d1); + normalize(d2); + vec3 newDir = d1+d2; + if (length2(newDir) == 0.) return false; + normalize(newDir); + if (dot(newDir,oldDir) < 0.) { + newDir = -1. * newDir; + } + rotated[i] = cur + len * newDir; + normalize(oldDir); + double agl = angleVectorsAlreadyNormalized(newDir,oldDir); + angles[i] = agl; + sum_angle += agl; + } + if (sum_angle == 0.) return false; + newPos.data()[0] = 0.; + newPos.data()[1] = 0.; + newPos.data()[2] = 0.; + for (size_t i = 0; i < N; ++i) { + double w = angles[i] / sum_angle; + // double w = 1./double(N); + newPos = newPos + w * rotated[i]; + } + return true; + } + + std::array<vec3,8> fillStencilRegular( + size_t v, + const std::vector<vec3>& points, + const std::vector<size_t>& one_ring_first, + const std::vector<uint32_t>& one_ring_values) { + return std::array<vec3,8>{ + points[one_ring_values[one_ring_first[v]+0]], + points[one_ring_values[one_ring_first[v]+1]], + points[one_ring_values[one_ring_first[v]+2]], + points[one_ring_values[one_ring_first[v]+3]], + points[one_ring_values[one_ring_first[v]+4]], + points[one_ring_values[one_ring_first[v]+5]], + points[one_ring_values[one_ring_first[v]+6]], + points[one_ring_values[one_ring_first[v]+7]] + }; + } + + void fillStencilIrregular( + size_t v, + const std::vector<vec3>& points, + const std::vector<size_t>& one_ring_first, + const std::vector<uint32_t>& one_ring_values, + std::vector<vec3>& stencil, + bool oneOverTwo = false) { + if (oneOverTwo) { + size_t n = (one_ring_first[v+1]-one_ring_first[v])/2; + stencil.resize(n); + for (size_t i = 0; i < stencil.size(); ++i) { + stencil[i] = points[one_ring_values[one_ring_first[v]+2*i]]; + } + } else { + stencil.resize(one_ring_first[v+1]-one_ring_first[v]); + for (size_t i = 0; i < stencil.size(); ++i) { + stencil[i] = points[one_ring_values[one_ring_first[v]+i]]; + } + } + } + + double stencilAverageLength(const std::array<vec3,8>& stencil) { + double avg = 0.; + const uint32_t N = stencil.size(); + for (uint32_t i = 0; i < N; ++i) { + const vec3& p0 = stencil[i]; + const vec3& p1 = stencil[(i+1)%N]; + avg += length(p1-p0); + } + avg /= double(N); + return avg; + } + + double stencilAverageLength(const std::vector<vec3>& stencil) { + double avg = 0.; + const uint32_t N = stencil.size(); + for (uint32_t i = 0; i < N; ++i) { + const vec3& p0 = stencil[i]; + const vec3& p1 = stencil[(i+1)%N]; + avg += length(p1-p0); + } + avg /= double(N); + return avg; + } + + /* p0, p1, p2, p3: the four (ordered and oriented) corners + * Quad normal reference computed from the corners. Element should not + * be inverted or too tangled */ + inline double quad_shape_ln(const vec3& p0, const vec3& p1, const vec3& p2, const vec3& p3) { + /* Based on Sandia Verdict document */ + constexpr double EPS = 1.e-16; + constexpr double EPS2 = EPS*EPS; + const vec3 L0 = p1 - p0; + const vec3 L1 = p2 - p1; + const vec3 L2 = p3 - p2; + const vec3 L3 = p0 - p3; + const vec3 X1 = L0 - L2; + const vec3 X2 = L1 - L3; + vec3 Nc = cross(X1,X2); + const double lenNc_sq = length2(Nc); + if (lenNc_sq < EPS2) return -1.; + normalize(Nc); + const double len0_sq = length2(L0); + const double len1_sq = length2(L1); + const double len2_sq = length2(L2); + const double len3_sq = length2(L3); + if (len0_sq < EPS2 || len1_sq < EPS2 || len2_sq < EPS2 || len3_sq < EPS2) return 0.; + const vec3 N0 = cross(L3,L0); + const vec3 N1 = cross(L0,L1); + const vec3 N2 = cross(L1,L2); + const vec3 N3 = cross(L2,L3); + const double a0 = dot(Nc,N0); /* bad if non planar quad ? */ + const double a1 = dot(Nc,N1); + const double a2 = dot(Nc,N2); + const double a3 = dot(Nc,N3); + const double q0 = a0/(len3_sq+len0_sq); + const double q1 = a1/(len0_sq+len1_sq); + const double q2 = a2/(len1_sq+len2_sq); + const double q3 = a3/(len2_sq+len3_sq); + if (SHOW_QUALITY && (q0 < 0 || q1 < 0 || q2 < 0 || q3 < 0)) { + vec3 mid = (p0+p1+p2+p3)*0.25; + DBG(q0,q1,q2,q3); + GeoLog::add(mid,Nc,"Nc"); + GeoLog::add(p0,N0,"Ni"); + GeoLog::add(p1,N1,"Ni"); + GeoLog::add(p2,N2,"Ni"); + GeoLog::add(p3,N3,"Ni"); + GeoLog::add({p0,p1,p2,p3},0.,"quad"); + GeoLog::flush(); + gmsh::fltk::run(); + abort(); + } + return 2.*std::min(std::min(q0,q1),std::min(q2,q3)); + } + + + inline double stencilQualitySICNmin( + const vec3& center, + const std::array<vec3,8>& stencil, + double breakIfBelowThreshold = -DBL_MAX) { + double qmin = DBL_MAX; + constexpr uint32_t N = 4; + for (uint32_t i = 0; i < N; ++i) { + const vec3& p0 = stencil[2*i+0]; + const vec3& p1 = stencil[2*i+1]; + const size_t i2 = (2*i+2)%(2*N); + const vec3& p2 = stencil[i2]; + const double q = quad_shape_ln(p0,p1,p2,center); + qmin = std::min(q,qmin); + if (qmin < breakIfBelowThreshold) return qmin; + } + return qmin; + } + + inline double stencilQualitySICNmin( + const vec3& center, + const std::vector<vec3>& stencil, + double breakIfBelowThreshold = -DBL_MAX) { + if (stencil.size() % 2 != 0) return -DBL_MAX; + double qmin = DBL_MAX; + const uint32_t N = stencil.size() / 2; + for (uint32_t i = 0; i < N; ++i) { + const vec3& p0 = stencil[2*i+0]; + const vec3& p1 = stencil[2*i+1]; + const size_t i2 = (2*i+2)%(2*N); + const vec3& p2 = stencil[i2]; + const double q = quad_shape_ln(p0,p1,p2,center); + qmin = std::min(q,qmin); + if (qmin < breakIfBelowThreshold) return qmin; + } + return qmin; + } + + struct OneRing { + vec5* p_uv = NULL; + uint32_t n = 0; + vec2 jump = {{0.,0.}}; + vec3 range = {{0.,0.,0.}}; + }; + + + bool buildCondensedStructure( + const std::vector<MVertex*>& freeVertices, + const std::vector<MElement*>& elements, + unordered_map<MVertex*,size_t>& old2new, + std::vector<vector<size_t> >& v2v) { + /* Build the old2new mapping */ + size_t vcount = 0; + for (MVertex* v: freeVertices) { + old2new[v] = vcount; + vcount += 1; + } + size_t nInterior = vcount; + if (nInterior == 0) return true; /* nothing to smooth */ + v2v.resize(nInterior); + for (MElement* f: elements) { + for (size_t le = 0; le < 4; ++le) { + MVertex* vs[2] = { + f->getVertex(le), + f->getVertex((le+1)%4) + }; + size_t nvs[2]; + for (size_t lv = 0; lv < 2; ++lv) { + MVertex* v = vs[lv]; + size_t nv = NO_SIZE_T; + auto it = old2new.find(v); + if (it == old2new.end()) { + old2new[v] = vcount; + nv = vcount; + vcount += 1; + } else { + nv = it->second; + } + nvs[lv] = nv; + } + if (nvs[0] < nInterior) v2v[old2new[vs[0]]].push_back(old2new[vs[1]]); + if (nvs[1] < nInterior) v2v[old2new[vs[1]]].push_back(old2new[vs[0]]); + } + constexpr bool addDiags = false; + if (addDiags) { + for (size_t d = 0; d < 2; ++d) { + MVertex* vs[2] = { + f->getVertex(d), + f->getVertex((d+2)%4) + }; + size_t nvs[2] = {old2new[vs[0]],old2new[vs[1]]}; + if (nvs[0] < nInterior) v2v[old2new[vs[0]]].push_back(old2new[vs[1]]); + if (nvs[1] < nInterior) v2v[old2new[vs[1]]].push_back(old2new[vs[0]]); + } + } + } + return true; + } + + bool buildCondensedStructure( + const std::vector<MElement*>& elements, + const std::vector<MVertex*>& freeVertices, + unordered_map<MVertex*,uint32_t>& old2new, + std::vector<MVertex*>& new2old, + std::vector<std::array<uint32_t,4> >& quads, + std::vector<std::vector<uint32_t> >& v2q, + std::vector<std::vector<uint32_t> >& oneRings, + std::vector<std::array<double,3> >& points + ) { + new2old.reserve(2*freeVertices.size()); + v2q.reserve(2*freeVertices.size()); + points.reserve(2*freeVertices.size()); + + size_t vcount = 0; + for (MVertex* v: freeVertices) { + old2new[v] = vcount; + vec3 pt = SVector3(v->point()); + points.push_back(pt); + new2old.push_back(v); + vcount += 1; + } + + v2q.resize(vcount); + quads.resize(elements.size()); + for (size_t f = 0; f < elements.size(); ++f) { + MElement* q = elements[f]; + if (q->getNumVertices() != 4) { + Msg::Error("buildCondensedStructure: element is not a quad"); + return false; + } + for (size_t lv = 0; lv < 4; ++lv) { + MVertex* v = q->getVertex(lv); + auto it = old2new.find(v); + size_t nv; + if (it == old2new.end()) { + old2new[v] = vcount; + new2old.push_back(v); + nv = vcount; + vcount += 1; + vec3 pt = SVector3(v->point()); + points.push_back(pt); + if (nv >= v2q.size()) { + v2q.resize(nv+1); + } + } else { + nv = it->second; + } + quads[f][lv] = nv; + v2q[nv].push_back(f); + } + } + points.shrink_to_fit(); + quads.shrink_to_fit(); + new2old.shrink_to_fit(); + v2q.shrink_to_fit(); + + /* Build the one rings for the free vertices */ + oneRings.resize(freeVertices.size()); + vector<MElement*> adjQuads; + for (size_t v = 0; v < freeVertices.size(); ++v) { + adjQuads.resize(v2q[v].size()); + for (size_t lq = 0; lq < v2q[v].size(); ++lq) { + adjQuads[lq] = elements[v2q[v][lq]]; + } + std::vector<MVertex*> bnd; + bool okb = buildBoundary(adjQuads, bnd); + if (!okb) { + Msg::Error("buildCondensedStructure: failed to build boundary for stencil"); + return false; + } + if (bnd.back() == bnd.front()) bnd.pop_back(); + + /* Be sure the first vertex on the boundary is edge-connected to v */ + /* Start of the stencil */ + MVertex* vp = freeVertices[v]; + MVertex* v0 = NULL; + for (MElement* e: adjQuads) { + size_t N = e->getNumVertices(); + for (size_t j = 0; j < N; ++j) { + MVertex* a = e->getVertex(j); + MVertex* b = e->getVertex((j+1)%N); + if (a == vp) { + v0 = b; + break; + } else if (b == vp) { + v0 = a; + break; + } + } + if (v0 != NULL) break; + } + if (v0 == NULL) { + Msg::Warning("buildCondensedStructure: failed to found v0"); + return false; + } + for (size_t j = 0; j < bnd.size(); ++j) { + if (bnd[j] == v0 && j > 0) { + std::rotate(bnd.begin(),bnd.begin()+j,bnd.end()); + } + } + if (bnd.front() != v0) { + Msg::Warning("buildCondensedStructure: wrong start"); + return false; + } + if (bnd.size() < 6 || bnd.size() % 2 != 0) { + Msg::Warning("buildCondensedStructure: wrong boundary, size %li", bnd.size()); + return false; + } + + oneRings[v].resize(bnd.size()); + for (size_t j = 0; j < bnd.size(); ++j) { + auto it = old2new.find(bnd[j]); + if (it != old2new.end()) { + oneRings[v][j] = it->second; + } else { + Msg::Error("buildCondensedStructure: vertex not found in old2new"); + return false; + } + } + } + + return true; + } + + bool buildUVSmoothingDataStructures( + GFace* gf, + const std::vector<MElement*>& elements, + const std::vector<MVertex*>& freeVertices, + std::vector<vec5>& point_uv, + std::vector<size_t>& one_ring_first, + std::vector<uint32_t>& one_ring_values, + std::vector<MVertex*>& new2old) { + + unordered_map<MVertex*,uint32_t> old2new; + std::vector<std::array<uint32_t,4> > quads; + std::vector<std::vector<uint32_t> > v2q; + std::vector<std::vector<uint32_t> > oneRings; + std::vector<std::array<double,3> > points; + bool okc = buildCondensedStructure(elements,freeVertices,old2new,new2old, + quads,v2q,oneRings,points); + if (!okc) { + Msg::Warning("buildCondensedStructure: failed to build condensed representation"); + return false; + } + + /* Get associated uv in GFace */ + std::vector<std::array<double,2> > uvs(old2new.size(),{DBL_MAX,DBL_MAX}); + for (size_t i = 0; i < elements.size(); ++i) { + std::vector<SPoint2> quad_uvs = paramOnElement(gf, elements[i]); + for (size_t lv = 0; lv < 4; ++lv) { + size_t v = quads[i][lv]; + if (uvs[v][0] == DBL_MAX) { + uvs[v][0] = quad_uvs[lv][0]; + uvs[v][1] = quad_uvs[lv][1]; + } + } + } + + /* Compact 3D + uv */ + point_uv.resize(points.size()); + for (size_t i = 0; i < points.size(); ++i) { + point_uv[i][0] = points[i][0]; + point_uv[i][1] = points[i][1]; + point_uv[i][2] = points[i][2]; + point_uv[i][3] = uvs[i][0]; + point_uv[i][4] = uvs[i][1]; + } + + /* One ring adjacencies in contiguous memory */ + compress(oneRings, one_ring_first, one_ring_values); + + return true; + } + + bool getContinuousUVOnLoop( + GFace* gf, + const std::vector<MVertex*>& bndOrdered, + std::vector<SPoint2>& bndUvs) { + if (bndOrdered.size() < 3) return false; + + /* If periodic parametrization, get periods */ + double Ts[2] = {0.,0.}; + if (gf->periodic(0)) Ts[0] = gf->period(0); + if (gf->periodic(1)) Ts[1] = gf->period(1); + + /* Get start point on the loop, inside GFace if possible */ + size_t i0 = 0; + for (size_t i = 0; i < bndOrdered.size(); ++i) { + MVertex* v = bndOrdered[i]; + if (v->onWhat() == gf) { + i0 = i; + break; + } + } + + /* Get all the parameters on the loop */ + bndUvs.resize(bndOrdered.size()); + reparamMeshVertexOnFace(bndOrdered[i0],gf,bndUvs[i0],true); + SPoint2 prevUV = bndUvs[i0]; + + double gapMax[2] = {0.,0.}; + const size_t N = bndOrdered.size(); + for (size_t k = 1; k < N; ++k) { + size_t i = (i0+k)%N; + MVertex* v = bndOrdered[i]; + bool okr = reparamMeshVertexOnFaceWithRef(gf, v, prevUV, bndUvs[i]); + if (!okr) return false; + + gapMax[0] = std::max(gapMax[0],std::abs(bndUvs[i].data()[0] - prevUV.data()[0])); + gapMax[1] = std::max(gapMax[1],std::abs(bndUvs[i].data()[1] - prevUV.data()[1])); + prevUV = bndUvs[i]; + } + gapMax[0] = std::max(gapMax[0],std::abs(bndUvs.front().data()[0] - bndUvs.back().data()[0])); + gapMax[1] = std::max(gapMax[1],std::abs(bndUvs.front().data()[1] - bndUvs.back().data()[1])); + + if (Ts[0] > 0 && gapMax[0] > 0.5 * Ts[0]) { + Msg::Debug("getContinuousUVOnLoop: reject because gap on boundary: %f (period %f)", gapMax[0], Ts[0]); + return false; + } + if (Ts[1] > 0 && gapMax[1] > 0.5 * Ts[1]) { + Msg::Debug("getContinuousUVOnLoop: reject because gap on boundary: %f (period %f)", gapMax[1], Ts[1]); + return false; + } + + return true; + } + + bool solveLaplaceLinearSystem( + size_t nInterior, + const vector<vector<size_t> >& v2v, vector<SPoint2>& uvs) { + if (nInterior > 100) { + Msg::Debug("... solve laplace linear system (%li unknowns) ...", nInterior); + } + +#if defined(HAVE_EIGEN) + size_t N = uvs.size(); + Eigen::VectorXd x_u(N), x_v(N), b_u(N), b_v(N); + Eigen::SparseMatrix<double> A(N,N); + b_u.fill(0.); + b_v.fill(0.); + double PENALTY = 1.e8; + + std::vector<Eigen::Triplet<double, size_t> > triplets; + for (size_t v = 0; v < uvs.size(); ++v) { + if (v < nInterior) { + triplets.push_back({v,v,1.}); + if (v2v[v].size() == 0) continue; + double sum = double(v2v[v].size()); + for (size_t v2: v2v[v]) { + triplets.push_back({v,v2,-1./sum}); + } + } else { /* fixed value */ + triplets.push_back({v,v,PENALTY}); + b_u[v] = PENALTY * uvs[v][0]; + b_v[v] = PENALTY * uvs[v][1]; + } + } + A.setFromTriplets(triplets.begin(),triplets.end()); + + bool solveOk = true; + { /* Try SparseLU */ + Eigen::SparseLU<Eigen::SparseMatrix<double> > solver; + solver.analyzePattern(A); + solver.factorize(A); + x_u = solver.solve(b_u); + if (solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("failed to solve linear system with SparseLU (%li variables)", N); + solveOk = false; + } + x_v = solver.solve(b_v); + if (solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("failed to solve linear system with SparseLU (%li variables)", N); + solveOk = false; + } + } + if (!solveOk) { /* Try least square */ + solveOk = true; + Eigen::LeastSquaresConjugateGradient<Eigen::SparseMatrix<double> > solver; + solver.compute(A); + x_u = solver.solve(b_u); + if (solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("failed to solve linear system with least-square (%li variables)", N); + solveOk = false; + } + x_v = solver.solve(b_v); + if (solver.info() != Eigen::ComputationInfo::Success) { + Msg::Warning("failed to solve linear system with least-square (%li variables)", N); + solveOk = false; + } + } + + for (size_t v = 0; v < nInterior; ++v) { + uvs[v][0] = x_u[v]; + uvs[v][1] = x_v[v]; + } + if (!solveOk) { + Msg::Error("failed to solve linear system to solve uv"); + return false; + } + +#else + Msg::Error("solveLaplaceLinearSystem requires the EIGEN module"); + return -1; +#endif + return true; + } + + + /* p0, p1, p2, p3: the four (ordered and oriented) corners + * N: reference normal (normalized) */ + inline double quad_shape(const vec3& p0, const vec3& p1, const vec3& p2, const vec3& p3, const vec3& N) { + /* Based on Sandia Verdict document */ + constexpr double EPS = 1.e-16; + constexpr double EPS2 = EPS*EPS; + const vec3 L0 = p1 - p0; + const vec3 L1 = p2 - p1; + const vec3 L2 = p3 - p2; + const vec3 L3 = p0 - p3; + const double len0_sq = length2(L0); + const double len1_sq = length2(L1); + const double len2_sq = length2(L2); + const double len3_sq = length2(L3); + if (len0_sq < EPS2 || len1_sq < EPS2 || len2_sq < EPS2 || len3_sq < EPS2) return -1.; + const vec3 N0 = cross(L3,L0); + const vec3 N1 = cross(L0,L1); + const vec3 N2 = cross(L1,L2); + const vec3 N3 = cross(L2,L3); + const double a0 = dot(N,N0); /* bad if non planar quad ? */ + const double a1 = dot(N,N1); + const double a2 = dot(N,N2); + const double a3 = dot(N,N3); + const double q0 = a0/(len3_sq+len0_sq); + const double q1 = a1/(len0_sq+len1_sq); + const double q2 = a2/(len1_sq+len2_sq); + const double q3 = a3/(len2_sq+len3_sq); + if (SHOW_QUALITY && (q0 < 0 || q1 < 0 || q2 < 0 || q3 < 0)) { + DBG("------"); + DBG(len0_sq, len1_sq, len2_sq, len3_sq); + DBG(N); + DBG(N0,N1,N2,N3); + DBG(q0,q1,q2,q3); + vec3 mid = (p0+p1+p2+p3)*0.25; + GeoLog::add(mid,N,"Ni"); + GeoLog::add(p0,N0,"Ni"); + GeoLog::add(p1,N1,"Ni"); + GeoLog::add(p2,N2,"Ni"); + GeoLog::add(p3,N3,"Ni"); + GeoLog::add({p0,p1,p2,p3},0.,"quad"); + GeoLog::flush(); + gmsh::fltk::run(); + abort(); + } + return 2.*std::min(std::min(q0,q1),std::min(q2,q3)); + } + + inline double computeQualityQuadOneRing(const vec5& v, const OneRing& ring, const vec3& normal, + double breakIfBelowThreshold = -DBL_MAX) { + if (ring.n % 2 != 0) return -DBL_MAX; + double qmin = DBL_MAX; + const vec3 p = {v[0],v[1],v[2]}; + for (uint32_t i = 0; i < ring.n / 2; ++i) { + const vec3 p0 = { ring.p_uv[2*i+0][0], ring.p_uv[2*i+0][1], ring.p_uv[2*i+0][2] }; + const vec3 p1 = { ring.p_uv[2*i+1][0], ring.p_uv[2*i+1][1], ring.p_uv[2*i+1][2] }; + const size_t i2 = (2*i+2)%ring.n; + const vec3 p2 = { ring.p_uv[i2][0], ring.p_uv[i2][1], ring.p_uv[i2][2] }; + const double q = quad_shape(p0,p1,p2,p,normal); + qmin = std::min(q,qmin); + if (qmin < breakIfBelowThreshold) return qmin; + } + return qmin; + } + + inline double dist_abs(double a, double b) { + return std::abs(a-b); + } + + inline vec2 uv_adjust_jump(vec2 uv, const vec2& uv_ref, const vec2& jump) { + for (uint32_t d = 0; d < 2; ++d) if (jump[d] != 0.) { + if (uv[d] < uv_ref[d]) { + double cand = uv[d] + jump[d]; + while (dist_abs(cand,uv_ref[d]) < dist_abs(uv[d], uv_ref[d])) { + uv[d] = cand; + cand = uv[d] + jump[d]; + } + } else { + double cand = uv[d] - jump[d]; + while (dist_abs(cand,uv_ref[d]) < dist_abs(uv[d], uv_ref[d])) { + uv[d] = cand; + cand = uv[d] - jump[d]; + } + } + } + return uv; + } + + inline double abs_diff_wperiod(double a, double b, double T) { + if (T == 0.) return std::abs(a-b); + return std::abs(fmod(a-b,T)); + } + + inline vec2 getDeltaUV(const vec5& v, const OneRing& ring) { + constexpr bool useBboxUV = false; + bool periodic = (ring.jump[0] != 0. || ring.jump[1] != 0.); + if (useBboxUV) { + const vec2 uv_0 = {v[3],v[4]}; + double u_range[2] = {DBL_MAX,-DBL_MAX}; + double v_range[2] = {DBL_MAX,-DBL_MAX}; + for (uint32_t i = 0; i < ring.n; ++i) { + vec2 uv_i = {ring.p_uv[i][3],ring.p_uv[i][4]}; + if (periodic) uv_i = uv_adjust_jump(uv_i, uv_0, ring.jump); + u_range[0] = std::min(u_range[0],uv_i[0]); + u_range[1] = std::max(u_range[1],uv_i[0]); + v_range[0] = std::min(v_range[0],uv_i[1]); + v_range[1] = std::max(v_range[1],uv_i[1]); + } + const double du = u_range[1] - u_range[0]; + const double dv = v_range[1] - v_range[0]; + return {du,dv}; + } else { + bool periodic = (ring.jump[0] != 0. || ring.jump[1] != 0.); + const vec2 uv_0 = {v[3],v[4]}; + double du = 0.; + double dv = 0.; + // DBG(uv_0, ring.jump); + for (uint32_t i = 0; i < ring.n; ++i) { + double duc = abs_diff_wperiod(ring.p_uv[i][3],ring.p_uv[(i+1)%ring.n][3], ring.jump[0]); + double dvc = abs_diff_wperiod(ring.p_uv[i][4],ring.p_uv[(i+1)%ring.n][4], ring.jump[1]); + if (ring.jump[0] > 0. && duc > 0.5 * ring.jump[0]) duc = 0.; + if (ring.jump[1] > 0. && dvc > 0.5 * ring.jump[1]) dvc = 0.; + du = std::max(du,duc); + dv = std::max(dv,dvc); + } + return {2.*du,2.*dv}; + } + } + + inline double getRingDispMax(const vec5& v, const OneRing& ring) { + double dMax2 = 0.; + for (uint32_t i = 0; i < ring.n; ++i) { + vec3 p_i = {ring.p_uv[i][0], ring.p_uv[i][1], ring.p_uv[i][2]}; + vec3 p_n = {ring.p_uv[(i+1)%ring.n][0], ring.p_uv[(i+1)%ring.n][1], ring.p_uv[(i+1)%ring.n][2]}; + dMax2 = std::max(dMax2, length2(p_i-p_n)); + } + return std::sqrt(dMax2); + } + + inline vec4 getGrid(const vec5& v, vec2 deltaUV, size_t n, double w) { + const vec2 uv_0 = {v[3],v[4]}; + const vec4 grid = { + uv_0[0] - w * deltaUV[0], /* grid_u_min */ + uv_0[1] - w * deltaUV[1], /* grid_v_min */ + uv_0[0] + w * deltaUV[0], /* grid_u_max */ + uv_0[1] + w * deltaUV[1] /* grid_v_max */ + }; + return grid; + } + + vec5 dmoOptimizeVertexPosition(GFace* gf, vec5 v, const OneRing& ring, size_t n, size_t nIter, + vec3 normal, double& qmax) { + double w = 0.5; + if (qmax == DBL_MAX || qmax == -DBL_MAX) { + /* Only compute input quality if not given */ + qmax = computeQualityQuadOneRing(v, ring, normal); + } + vec5 vmax = v; + vec2 deltaUV = getDeltaUV(v, ring); + + /* Sanity check on the UV variation */ + if (ring.jump[0] > 0. && deltaUV[0] > 0.5*ring.jump[0]) return v; + if (ring.jump[1] > 0. && deltaUV[1] > 0.5*ring.jump[1]) return v; + if (deltaUV[0] > 0.05 * ring.range[0]) return v; + if (deltaUV[1] > 0.05 * ring.range[1]) return v; + + const bool checkDisplacement = ring.jump[0] != 0. || ring.jump[1] != 0.; + const double dispMax = checkDisplacement ? getRingDispMax(v, ring) : 0.; + + for (size_t iter = 0; iter < nIter; ++iter) { + vec4 grid = getGrid(v, deltaUV, n, w); + SPoint2 uv; + for (size_t i = 0; i < n; ++i) { + uv.data()[0] = double(i)/double(n-1)*grid[0] + double(n-1-i)/double(n-1)*grid[2]; + for (size_t j = 0; j < n; ++j) { + uv.data()[1] = double(j)/double(n-1)*grid[1] + double(n-1-j)/double(n-1)*grid[3]; + GPoint newPos = gf->point(uv); + if (!newPos.succeeded()) continue; + if (checkDisplacement) { + double disp = length(vec3{newPos.x(),newPos.y(),newPos.z()} - vec3{v[0],v[1],v[2]}); + // if (disp > 1 || dispMax > 1) { + // // DBG(disp, dispMax, v, deltaUV, uv, ring.jump); + // // abort(); + // //gmsh::fltk::run(); + // //abort(); + // } + if (disp > dispMax) continue; + } + const vec5 v2 = {newPos.x(),newPos.y(),newPos.z(),uv.data()[0],uv.data()[1]}; + double q2 = computeQualityQuadOneRing(v2, ring, normal, qmax); + if (q2 > qmax) { + vmax = v2; + qmax = q2; + } + } + } + w = w * 2./double(n-1); + } + + return vmax; + } +} +using namespace QMT; + + +void computeSICN(const std::vector<MElement*>& elements, double& sicnMin, double& sicnAvg) { + sicnMin = DBL_MAX; + sicnAvg = 0.; + for (size_t i = 0; i < elements.size(); ++i) { + double q = elements[i]->minSICNShapeMeasure(); + if (std::isnan(q)) { + q = -1.; + } + sicnMin = std::min(sicnMin, q); + sicnAvg += q; + } + if (elements.size() > 0) sicnAvg /= double(elements.size()); +} + +int patchOptimizeGeometryGlobal( + GFaceMeshPatch& patch, + GeomOptimStats& stats) { + GFace* gf = patch.gf; + if (gf == NULL) return -1; + if (!gf->haveParametrization()) { + Msg::Debug("optimize geometry global: face %i have no parametrization", gf->tag()); + return -2; + } + if (patch.bdrVertices.size() != 1) { + Msg::Debug("optimize geometry global: patch has multiple boundary loops (%li)", patch.bdrVertices.size()); + return -1; + } + if (patch.intVertices.size() == 0) { + Msg::Debug("optimize geometry global: no interior vertices (%li bdr vertices, %li elements)", + patch.bdrVertices.front().size(), patch.elements.size()); + return -1; + } + + bool debugCreateViews = DBG_VIZU_G; + if (Msg::GetVerbosity() >= 999 + && CTX::instance()->debugSurface == patch.gf->tag()) { + debugCreateViews = true; + } + const int rdi = (int)(((double)rand()/RAND_MAX)*1e4); /* only to get a random name for debugging */ + + double t1 = Cpu(); + + unordered_map<MVertex*,size_t> old2new; + std::vector<vector<size_t> > v2v; + bool oks = buildCondensedStructure(patch.intVertices, patch.elements, old2new, v2v); + if (!oks) { + Msg::Debug("optimize geometry global: failed to build edge graph"); + return -1; + } + + + /* uvs/v2v: first all the free vertices, then the bdr vertices */ + vector<SPoint2> uvs(old2new.size(),SPoint2(DBL_MAX,DBL_MAX)); + /* Interior vertices initialized to (0,0) */ + size_t nInterior = patch.intVertices.size(); + for (size_t v = 0; v < nInterior; ++v) { + sort_unique(v2v[v]); + uvs[v] = SPoint2(0.,0.); + } + + /* Boundary vertices */ + for (size_t loop = 0; loop < patch.bdrVertices.size(); ++loop) { + vector<SPoint2> bndUvs; + bool okl = getContinuousUVOnLoop(gf, patch.bdrVertices[loop], bndUvs); + if (!okl) { + Msg::Debug("optimize geometry global: failed to get continuous UV on boundary loop"); + return -2; + } + for (size_t i = 0; i < patch.bdrVertices[loop].size(); ++i){ + MVertex* v = patch.bdrVertices[loop][i]; + auto it = old2new.find(v); + if (it == old2new.end()) { + Msg::Error("optimize geometry global: bdr vertex not found in old2new"); + return -1; + } + size_t idx = it->second; + if (uvs[idx].x() != DBL_MAX) continue; + uvs[idx] = bndUvs[i]; + double dist = std::pow(bndUvs[(i+1)%bndUvs.size()].x() - bndUvs[i].x(),2) + + std::pow(bndUvs[(i+1)%bndUvs.size()].y() - bndUvs[i].y(),2); + dist = std::sqrt(dist); + } + } + + computeSICN(patch.elements, stats.sicnMinBefore, stats.sicnAvgBefore); + + /* Laplacian smoothing via linear system */ + bool ok = solveLaplaceLinearSystem(nInterior, v2v, uvs); + if (!ok) { + Msg::Warning("optimize geometry global: failed to solve linear system"); + return -1; + } + + if (debugCreateViews) { + GeoLog::add(patch.elements, "optim_Duv_IN_"+std::to_string(rdi) + "_" + std::to_string(stats.sicnAvgBefore)); + } + + /* Apply CAD mapping */ + for (MVertex* v: patch.intVertices) { + size_t idx = old2new[v]; + SPoint2 uv = uvs[idx]; + v->setParameter(0,uv[0]); + v->setParameter(1,uv[1]); + GPoint p = gf->point(uv); + if (p.succeeded()) { + v->setXYZ(p.x(),p.y(),p.z()); + } else { + Msg::Error("optimize geometry global: CAD evaluation failed on face %i at uv=(%f,%f)",gf->tag(),uv[0],uv[1]); + } + } + + computeSICN(patch.elements, stats.sicnMinAfter, stats.sicnAvgAfter); + + if (debugCreateViews) { + GeoLog::add(patch.elements, "optim_Duv_OUT_"+std::to_string(rdi) + "_" + std::to_string(stats.sicnAvgAfter)); + } + + double t2 = Cpu(); + stats.timeCpu = t2 - t1; + stats.nFree = patch.intVertices.size(); + stats.nLock = patch.bdrVertices.front().size(); + + Msg::Debug("optimize geometry global (UV Laplacian): %li/%li free vertices, %li elements, SICN min: %.3f -> %.3f, SICN avg: %.3f -> %.3f, time: %.3fsec", + patch.intVertices.size(), patch.intVertices.size()+patch.bdrVertices.front().size(), patch.elements.size(), + stats.sicnMinBefore, stats.sicnMinAfter, stats.sicnAvgBefore, stats.sicnAvgAfter, stats.timeCpu); + + + return 0; +} + +bool kernelLoopWithParametrization( + GFaceMeshPatch& patch, + const GeomOptimOptions& opt, + GeomOptimStats& stats) { + + GFace* gf = patch.gf; + if (!gf->haveParametrization()) { + Msg::Error("optimize geometry kernel: face %i have no parametrization", gf->tag()); + return false; + } + + /* Data for smoothing */ + std::vector<vec5> point_uv; + std::vector<size_t> one_ring_first; + std::vector<uint32_t> one_ring_values; + std::vector<MVertex*> new2old; + bool okb = buildUVSmoothingDataStructures(gf, patch.elements, patch.intVertices, point_uv, + one_ring_first, one_ring_values, new2old); + if (!okb) { + Msg::Error("optimize geometry kernel: failed to build adjacency datastructures"); + return -1; + } + OneRing ring; + std::vector<vec5> ringGeometric(10); + if (gf->periodic(0)) ring.jump[0] = gf->period(0); + if (gf->periodic(1)) ring.jump[1] = gf->period(1); + ring.range[0] = gf->parBounds(0).high()-gf->parBounds(0).low(); + ring.range[1] = gf->parBounds(1).high()-gf->parBounds(1).low(); + ring.p_uv = ringGeometric.data(); + const double sign = opt.invertCADNormals ? -1. : 1.; + + size_t dmo_grid_width = 8; + size_t dmo_grid_depth = 3; + if (!haveNiceParametrization(gf)) { + dmo_grid_width = 12; + dmo_grid_depth = 4; + } + + /* Initialization: all vertices unlocked */ + std::vector<bool> locked(patch.intVertices.size(),false); + if (opt.qualityRangeTechnique) { + std::fill(locked.begin(),locked.end(),true); + } + + /* Explicit smoothing loop */ + const size_t nFree = patch.intVertices.size(); + for (size_t iter = 0; iter < opt.outerLoopIterMax; ++iter) { + size_t nMoved = 0; + double iterQmin = 1.; + + /* Loop over interior vertices */ + for (size_t v = 0; v < nFree; ++v) { + + /* Fill the OneRing geometric information */ + ring.n = one_ring_first[v+1]-one_ring_first[v]; + if (ring.n >= ringGeometric.size()) { + ringGeometric.resize(ring.n); + ring.p_uv = ringGeometric.data(); + } + for (size_t lv = 0; lv < ring.n; ++lv) { + ring.p_uv[lv] = point_uv[one_ring_values[one_ring_first[v]+lv]]; + } + + + /* Current position, normal and quality */ + vec5 pos = point_uv[v]; + vec3 normal = sign * gf->normal(SPoint2(pos[3],pos[4])); + if (length2(normal) == 0.) { + Msg::Warning("optimize geometry kernel: CAD normal length is 0 !"); + continue; + } + normalize(normal); + double quality = computeQualityQuadOneRing(pos, ring, normal); + + if (opt.qualityRangeTechnique && iter == 0) { + /* First iteration: unlocked low quality vertices */ + if (quality < opt.qualityRangeMin) { + locked[v] = false; + } else { + continue; + } + } + if (opt.qualityRangeTechnique && quality > opt.qualityRangeMax) { + locked[v] = true; + continue; + } + + /* Optimize vertex position with DMO (adaptive grid sampling) */ + if (opt.qualityRangeTechnique || quality < opt.useDmoIfSICNbelow) { + vec5 newPos = dmoOptimizeVertexPosition(gf, pos, ring, dmo_grid_width, dmo_grid_depth, normal, quality); + point_uv[v] = newPos; + iterQmin = std::min(iterQmin,quality); + nMoved += 1; + } + + if (opt.qualityRangeTechnique) { + if (quality > opt.qualityRangeTechnique) { + locked[v] = true; + continue; + } else { /* Unlock neighbors ! */ + for (size_t lv = 0; lv < ring.n; ++lv) { + uint32_t v2 = one_ring_values[one_ring_first[v]+lv]; + if (v2 < nFree) locked[v2] = false; + } + } + } else { + // TODO: lock vertex is local dx reduction + } + } + // DBG(iter, nMoved, iterQmin); + } + + /* Update the positions */ + for (size_t i = 0; i < patch.intVertices.size(); ++i) { + new2old[i]->setParameter(0,point_uv[i][3]); + new2old[i]->setParameter(1,point_uv[i][4]); + new2old[i]->setXYZ(point_uv[i][0],point_uv[i][1],point_uv[i][2]); + } + + return true; +} + +bool movePointWithKernelAndProjection( + uint32_t v, + const std::vector<std::array<double,3> >& points, + const std::vector<size_t>& one_ring_first, + const std::vector<uint32_t>& one_ring_values, + bool project, + SurfaceProjector* sp, + vec3& newPos, + vec2& newUv) +{ + if (project && sp == nullptr) { + Msg::Error("cannot project with surface projector"); + return false; + } + + size_t n = one_ring_first[v+1] - one_ring_first[v]; + GPoint proj; + double stDx = 0.; + if (n == 8) { /* regular vertex */ + /* Extract geometric stencil */ + std::array<vec3,8> stencil = fillStencilRegular(v, points, one_ring_first, one_ring_values); + + /* Smoothing (in 3D, not on surface) */ + bool ok = kernelWinslow(stencil, newPos); + if (!ok) return false; + + if (project) { /* Projection on surface */ + proj = sp->closestPoint(newPos.data(), false, false); + if (!proj.succeeded()) { + Msg::Debug("kernel smoothing: projection failed"); + return false; + } + newPos = {proj.x(),proj.y(),proj.z()}; + newUv = {proj.u(),proj.v()}; + } + } else { /* irregular vertex */ + std::vector<vec3> stencilIrreg(8); + + /* Extract geometric stencil */ + constexpr bool oneOverTwo = true; /* angle-based does not use diagonals */ + fillStencilIrregular(v, points, one_ring_first, one_ring_values, stencilIrreg, oneOverTwo); + + /* Smoothing (in 3D, not on surface) */ + bool ok = kernelAngleBased(points[v], stencilIrreg, newPos); + if (!ok) return false; + + if (project) { /* Projection on surface */ + proj = sp->closestPoint(newPos.data(), false, false); + if (!proj.succeeded()) { + Msg::Debug("kernel smoothing: projection failed"); + return false; + } + newPos = {proj.x(),proj.y(),proj.z()}; + newUv = {proj.u(),proj.v()}; + } + } + return true; +} + +bool kernelLoopWithProjection( + GFaceMeshPatch& patch, + const GeomOptimOptions& opt, + GeomOptimStats& stats) { + GFace* gf = patch.gf; + if (opt.sp == nullptr) { + Msg::Error("kernel loop with projection: no surface projector"); + return false; + } + + /* Data for smoothing */ + std::vector<size_t> one_ring_first; + std::vector<uint32_t> one_ring_values; + std::vector<MVertex*> new2old; + unordered_map<MVertex*,uint32_t> old2new; + std::vector<std::array<double,3> > points; + { + std::vector<std::array<uint32_t,4> > quads; + std::vector<std::vector<uint32_t> > v2q; + std::vector<std::vector<uint32_t> > oneRings; + bool okc = buildCondensedStructure(patch.elements,patch.intVertices, + old2new,new2old, quads,v2q,oneRings,points); + if (!okc) { + Msg::Error("buildCondensedStructure: failed to build condensed representation"); + return false; + } + compress(oneRings, one_ring_first, one_ring_values); + } + const size_t nFree = patch.intVertices.size(); + + std::vector<std::array<double,2> > point_uvs; + if (gf->haveParametrization()) { + point_uvs.resize(points.size()); + for (size_t v = 0; v < nFree; ++v) { + new2old[v]->getParameter(0,point_uvs[v][0]); + new2old[v]->getParameter(1,point_uvs[v][1]); + } + } + + /* Local sizes */ + vector<double> localAvgSize(nFree,0.); + for (size_t v = 0; v < nFree; ++v) { + size_t n = one_ring_first[v+1] - one_ring_first[v]; + if (n == 0) continue; + for (size_t lv = 0; lv < n; ++lv) { + uint32_t v2 = one_ring_values[one_ring_first[v]+lv]; + localAvgSize[v] += length(points[v]-points[v2]); + } + localAvgSize[v] /= double(n); + } + + bool project = true; + if (gf->geomType() == GFace::GeomType::Plane) project = false; + + /* Initialization: all vertices unlocked */ + std::vector<bool> locked(patch.intVertices.size(),false); + + /* Explicit smoothing loop */ + double t0 = Cpu(); + double sum_dx0 = 0; + std::vector<vec3> stencilIrreg(10); + for (size_t iter = 0; iter < opt.outerLoopIterMax; ++iter) { + size_t nMoved = 0; + + double sum_dx = 0.; + /* Loop over interior vertices */ + for (size_t v = 0; v < nFree; ++v) { + if (locked[v]) continue; + + vec3 newPos = points[v]; + vec2 newUv; + if (point_uvs.size()) { newUv = point_uvs[v]; } + + bool ok = movePointWithKernelAndProjection(v, points, one_ring_first, one_ring_values, + project, opt.sp, newPos, newUv); + if (ok) { + double dx = length(newPos - points[v]); + sum_dx += dx; + /* Modify the coordinates */ + points[v] = newPos; + point_uvs[v] = newUv; + if (opt.localLocking && dx < opt.dxLocalMax*localAvgSize[v]) { + locked[v] = true; + } else { + nMoved += 1; + } + } else { + locked[v] = true; + } + } + + if (iter == 0) { + sum_dx0 = sum_dx; + } else { + if (sum_dx < opt.dxGlobalMax * sum_dx0) break; + if (nMoved == 0) break; + } + + if (Cpu() - t0 > opt.timeMax) break; + } + + /* Update the positions */ + for (size_t i = 0; i < patch.intVertices.size(); ++i) { + MVertex* v = new2old[i]; + v->setXYZ(points[i][0],points[i][1],points[i][2]); + if (point_uvs.size()) { + v->setParameter(0,point_uvs[i][0]); + v->setParameter(1,point_uvs[i][1]); + + SPoint3 query = v->point(); + GPoint proj = gf->closestPoint(query, point_uvs[i].data()); + if (proj.succeeded()) { + v->setXYZ(proj.x(),proj.y(),proj.z()); + v->setParameter(0,proj.u()); + v->setParameter(1,proj.v()); + } + } + } + + return true; +} + + +size_t nbVerticesOnBoundary(const GFaceMeshPatch& patch) { + size_t n = 0; + for (size_t i = 0; i < patch.bdrVertices.size(); ++i) + n += patch.bdrVertices[i].size(); + return n; +} + +bool patchOptimizeGeometryWithKernel( + GFaceMeshPatch& patch, + const GeomOptimOptions& opt, + GeomOptimStats& stats) { + + /* Debug visualization */ + bool debugCreateViews = DBG_VIZU_K; + if (Msg::GetVerbosity() >= 999 + && CTX::instance()->debugSurface == patch.gf->tag()) { + debugCreateViews = true; + } + const int rdi = (int)(((double)rand()/RAND_MAX)*1e4); /* only to get a random name for debugging */ + + + GFace* gf = patch.gf; + if (gf == NULL || patch.elements.size() == 0) return false; + if (patch.intVertices.size() == 0) return false; + + stats.sicnMinBefore = -1.; /* if no element */ + stats.sicnAvgBefore = -1.; + double t1 = Cpu(); + computeSICN(patch.elements, stats.sicnMinBefore, stats.sicnAvgBefore); + + if (patch.intVertices.size() == 0) { + Msg::Debug("optimize geometry kernel: no interior vertices (%li elements)", + patch.elements.size()); + stats.sicnMinAfter = stats.sicnMinBefore; + stats.sicnAvgAfter = stats.sicnAvgBefore; + return true; + } + + PatchGeometryBackup* backup = nullptr; + if (opt.withBackup) { + backup = new PatchGeometryBackup(patch); + } + + bool useParam = gf->haveParametrization(); + if (opt.sp != nullptr) useParam = false; + if (opt.force3DwithProjection) useParam = false; + + if (debugCreateViews) { + std::string method = "K" + (useParam ? std::string("uv") : std::string("3d+p")); + GeoLog::add(patch.elements, "optim_"+method+"_IN_"+std::to_string(rdi) + "_" + std::to_string(stats.sicnAvgBefore)); + } + + if (useParam) { + bool okl = kernelLoopWithParametrization(patch, opt, stats); + if (!okl) { + Msg::Warning("optimize geometry kernel: the loop with param. failed (%li elements)", + patch.elements.size()); + return -1; + } + } else { + bool okl = kernelLoopWithProjection(patch, opt, stats); + if (!okl) { + Msg::Warning("optimize geometry kernel: the loop with projection failed (%li elements)", + patch.elements.size()); + return -1; + } + } + + /* Statistics */ + computeSICN(patch.elements, stats.sicnMinAfter, stats.sicnAvgAfter); + + bool cancel = false; + + if (opt.withBackup && backup && stats.sicnMinAfter < stats.sicnMinBefore) { + Msg::Debug("optimize geometry kernel: restore patch geometry with backup", patch.elements.size()); + backup->restore(); + stats.sicnMinAfter = stats.sicnMinBefore; + stats.sicnAvgAfter = stats.sicnAvgBefore; + cancel = true; + } + + /* Debug visualization */ + if (debugCreateViews) { + std::string method = "K" + (useParam ? std::string("uv") : std::string("3d+p")); + GeoLog::add(patch.elements, "optim_"+method+"_OUT_"+std::to_string(rdi) + "_" + std::to_string(stats.sicnAvgAfter)); + GeoLog::flush(); + } + + double t2 = Cpu(); + stats.timeCpu = t2 - t1; + stats.nFree = patch.intVertices.size(); + stats.nLock = nbVerticesOnBoundary(patch); + + if (backup) delete backup; + + if (cancel) return true; + + if (useParam) { + Msg::Debug("optimize geometry kernel (using CAD param): %li/%li free vertices, %li elements, SICN min: %.3f -> %.3f, SICN avg: %.3f -> %.3f, time: %.3fsec", + patch.intVertices.size(), stats.nFree + stats.nLock, patch.elements.size(), + stats.sicnMinBefore, stats.sicnMinAfter, stats.sicnAvgBefore, stats.sicnAvgAfter, stats.timeCpu); + } else { + Msg::Debug("optimize geometry kernel (using triangulation): %li/%li free vertices, %li elements, SICN min: %.3f -> %.3f, SICN avg: %.3f -> %.3f, time: %.3fsec", + patch.intVertices.size(), stats.nFree + stats.nLock, patch.elements.size(), + stats.sicnMinBefore, stats.sicnMinAfter, stats.sicnAvgBefore, stats.sicnAvgAfter, stats.timeCpu); + } + + return true; +} + +bool patchProjectOnSurface(GFaceMeshPatch& patch, SurfaceProjector* sp) { + Msg::Debug("patch surface projection (%i vertices) ...", patch.intVertices.size()); + bool useParam = patch.gf->haveParametrization(); + for (MVertex* v: patch.intVertices) { + GPoint proj; + if (sp != nullptr) { + /* Triangulation projection */ + proj = sp->closestPoint(v->point().data(),false,false); + if (proj.succeeded()) { + v->setXYZ(proj.x(),proj.y(),proj.z()); + } + if (useParam) { + /* CAD projection */ + double uv[2] = {proj.u(),proj.v()}; + GPoint proj2 = patch.gf->closestPoint(v->point(),uv); + if (proj2.succeeded()) { + v->setXYZ(proj2.x(),proj2.y(),proj2.z()); + v->setParameter(0,proj2.u()); + v->setParameter(1,proj2.v()); + } + } + } else if (useParam) { + double uv[2]; + v->getParameter(0,uv[0]); + v->getParameter(1,uv[1]); + /* CAD projection */ + GPoint proj2 = patch.gf->closestPoint(v->point(),uv); + if (proj2.succeeded()) { + v->setXYZ(proj2.x(),proj2.y(),proj2.z()); + v->setParameter(0,proj2.u()); + v->setParameter(1,proj2.v()); + } + } else { + Msg::Error("patch projection: no parametrization and no surface projector"); + return false; + } + } + return true; +} + +bool optimizeGeometryQuadMesh(GFace* gf, SurfaceProjector* sp, double timeMax) +{ + if (!gf->haveParametrization() && sp == nullptr) { + Msg::Error("optimize geometry: face %i, no CAD and no surface projector", gf->tag()); + return false; + } + + if (gf->quadrangles.size() == 0) { + Msg::Error("optimize geometry: face %i, no quads", gf->tag()); + return false; + } + + bool forceEvenIfBadBoundary = true; + GFaceMeshPatch patch; + bool okp = patchFromQuads(gf, gf->quadrangles, patch, forceEvenIfBadBoundary); + if (!okp) { + Msg::Warning("optimize geometry: face %i, failed to build patch", gf->tag()); + return false; + } + + bool debugCreateViews = DBG_VIZU_G; + if (Msg::GetVerbosity() >= 999 + && CTX::instance()->debugSurface == patch.gf->tag()) { + debugCreateViews = true; + } + const int rdi = (int)(((double)rand()/RAND_MAX)*1e4); /* only to get a random name for debugging */ + + int countMax = 3; + bool running = true; + size_t niter = 50; + int count = 0; + if (gf->geomType() == GEntity::Plane) { + /* Much faster projection, we can smooth */ + niter = 100; + } + + double t0 = Cpu(); + + while (running && count < countMax) { + running = false; + count += 1; + if (Cpu() - t0 > timeMax) { + Msg::Debug("optimize geometry: face %i, reached time limit", gf->tag()); + break; + } + + PatchGeometryBackup backup(patch); + + double minSICNb = DBL_MAX; + double avgSICNb = 0.; + computeSICN(patch.elements, minSICNb, avgSICNb); + + if (debugCreateViews) { + std::string method = "GFace_K"; + GeoLog::add(patch.elements, "optim_"+method+"_IN_"+std::to_string(rdi) + "_" + std::to_string(minSICNb)); + } + + GeomOptimStats stats; + GeomOptimOptions opt; + opt.sp = sp; + opt.outerLoopIterMax = niter; + opt.timeMax = timeMax; + opt.localLocking = true; + opt.dxGlobalMax = 1.e-3; + opt.dxLocalMax = 1.e-5; + opt.force3DwithProjection = true; + opt.withBackup = false; + double t1 = Cpu(); + bool okk = kernelLoopWithProjection(patch, opt, stats); + if (!okk) { + return false; + } + double etime = Cpu() - t1; + + double minSICNa = DBL_MAX; + double avgSICNa = 0.; + computeSICN(patch.elements, minSICNa, avgSICNa); + + bool keep = true; + if (minSICNa < minSICNb && avgSICNa < avgSICNb) keep = false; + if (minSICNa < 0.1 && minSICNa < minSICNb) keep = false; + if (minSICNa < 0.75 * minSICNb) keep = false; + + if (debugCreateViews) { + std::string method = "GFace_K"; + GeoLog::add(patch.elements, "optim_"+method+"_OUT_"+std::to_string(rdi) + "_" + std::to_string(minSICNa) + "_keep=" + std::to_string(keep)); + } + + if (keep) { + Msg::Debug("- Face %i: kernel smoothing (Mix Winslow/Angle, explicit with projections, %li vertices, %li iter max, %.3f sec), SICN min: %f -> %f, avg: %f -> %f", + gf->tag(),gf->mesh_vertices.size(), niter,etime,minSICNb,minSICNa,avgSICNb,avgSICNa); + if (minSICNa >= minSICNb && 0.99*avgSICNa > avgSICNb && etime < 1) { + niter *= 1.5; + running = true; + } + } else { + Msg::Debug("- Face %i: worst quality after global smoothing (Mix Winslow/Angle, explicit, %li iter max), roll back (SICN min: %f -> %f, avg: %f -> %f)", + gf->tag(),niter,minSICNb,minSICNa,avgSICNb,avgSICNa); + backup.restore(); + break; + } + } + + return true; +} diff --git a/contrib/QuadMeshingTools/qmtMeshGeometryOptimization.h b/contrib/QuadMeshingTools/qmtMeshGeometryOptimization.h new file mode 100644 index 0000000000000000000000000000000000000000..cdebf5df510fc1ab732dd18bcda4dca0ef29b07f --- /dev/null +++ b/contrib/QuadMeshingTools/qmtMeshGeometryOptimization.h @@ -0,0 +1,122 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include <float.h> +#include "qmtMeshUtils.h" + +class SurfaceProjector; + +/** + * @brief Mesh optimization statistics + */ +struct GeomOptimStats { + size_t nFree = 0; + size_t nLock = 0; + double timeCpu = 0.; + size_t outerLoopIter = 0; + double sicnMinBefore = 0.; + double sicnMinAfter = 0.; + double sicnAvgBefore = 0.; + double sicnAvgAfter = 0.; + void print(); +}; + +/** + * @brief Optimize the vertex position inside a patch by + * smoothing the CAD parametric coordinates with + * a Laplacian solver: Du=0, Dv=0 + * The patch boundary is fixed. + * Use direct solver and arithmetric average to ensure + * maximum principle. + * Not always applicable: if no param, if the patch contains a CAD uv singularity + * + * @param[in,out] patch The mesh patch to smooth. The new positions and uv are directly updated + * in the MVertex instances. + * @param[out] stats Some statistics on the smoothing + * + * @return 0 if success + */ +int patchOptimizeGeometryGlobal( + GFaceMeshPatch& patch, + GeomOptimStats& stats); + +/** + * @brief Options for the kernel-based explicit untangling/smoothing. + * Kernels: + * - DMO (brute-force uv sampling) if low quality + * - Winslow if regular vertex + * - Angle-based smoothing is irregular vertex + */ +struct GeomOptimOptions { + double useDmoIfSICNbelow = 0.1; /* use the DMO kernel if SICN quality below threshold */ + size_t outerLoopIterMax = 100; /* maximum number of loops over all vertices */ + double timeMax = DBL_MAX; /* stop smoothing is timeMax elapsed */ + bool invertCADNormals = false; /* invert the CAD normals for the quality computation */ + SurfaceProjector* sp = nullptr; /* if present, surface projection is used instead of CAD */ + double smartMinThreshold = -DBL_MAX; /* do not displace if inducing min(SICN) < smartMinThreshold */ + bool qualityRangeTechnique = false; + bool localLocking = false; /* Lock if small displacement, unlocked neighbors else */ + double dxLocalMax = 1.e-5; /* lock a vertex if dx < dxLocalMax * local_size */ + double dxGlobalMax = 1.e-5; /* stop if sum(dx) < dxGlobalMax * sum(dx_0) */ + double qualityRangeMin = 0.5; + double qualityRangeMax = 0.8; + bool withBackup = true; /* save the geometry before, restore if quality decreased */ + bool force3DwithProjection = false; +}; + +/** + * @brief Optimize the mesh by iteratively moving the vertices (explicit approach). + * The patch boundary is fixed. + * Require a parametrization on the face. + * + * @param[in,out] patch The mesh patch to smooth. The new positions and uv are directly updated + * in the MVertex instances. + * @param[in] opt The optimization parameters + * @param[out] stats Some statistics on the smoothing + * + * @return true if success + */ +bool patchOptimizeGeometryWithKernel( + GFaceMeshPatch& patch, + const GeomOptimOptions& opt, + GeomOptimStats& stats); + +/** + * @brief Compute minimum and average SICN quality of elements + * + * @param[in] elements The elements on which to measure the quality + * @param[out] sicnMin Minimum element SICN quality + * @param[out] sicnAvg Average element SICN quality + */ +void computeSICN(const std::vector<MElement*>& elements, double& sicnMin, double& sicnAvg); + + +/** + * @brief Project the patch interior vertices on the surface. + * If no parametrization, only the SurfaceProjector is used. + * If param, the SurfaceProjector is used as a initial guess. + * + * @param patch The patch containing the vertices + * @param sp If not nullptr, use it to project + * + * @return true if success + */ +bool patchProjectOnSurface(GFaceMeshPatch& patch, SurfaceProjector* sp = nullptr); + +/** + * @brief High-level function which try to make good parameter choices + * automatically. + * + * @param gf The face containing the quad mesh to smooth + * @param sp Surface projector (faster than CAD projection) + * @param timeMax Time budget for the smoothing + * + * @return true if success + */ +bool optimizeGeometryQuadMesh(GFace* gf, SurfaceProjector* sp = nullptr, double timeMax = DBL_MAX); diff --git a/contrib/QuadMeshingTools/qmtMeshUtils.cpp b/contrib/QuadMeshingTools/qmtMeshUtils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..079b85e53e14a1bef3e8fc570f1af696de1c8154 --- /dev/null +++ b/contrib/QuadMeshingTools/qmtMeshUtils.cpp @@ -0,0 +1,1419 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "qmtMeshUtils.h" + +/* System includes */ +#include <vector> +#include <array> +#include <unordered_map> +#include <unordered_set> +#include <cstdint> +#include <cmath> +#include <algorithm> +#include <queue> + +/* Gmsh includes */ +#include "GmshMessage.h" +#include "OS.h" +#include "GVertex.h" +#include "GEdge.h" +#include "GFace.h" +#include "GModel.h" +#include "MVertex.h" +#include "MLine.h" +#include "MTriangle.h" +#include "MQuadrangle.h" +#include "robin_hood.h" +#include "meshOctreeLibOL.h" +#include "BackgroundMesh.h" + +// /* QuadMeshingTools includes */ +#include "cppUtils.h" +#include "arrayGeometry.h" +#include "geolog.h" +#include "gmsh.h" +#include "row_echelon_integer.hpp" + +using namespace CppUtils; +using std::unordered_map; +using std::unordered_set; +using std::vector; + +std::vector<GFace*> model_faces(const GModel* gm) { + std::vector<GFace*> faces; + for(GModel::fiter it = gm->firstFace(); it != gm->lastFace(); ++it) { + faces.push_back(*it); + } + return faces; +} + +std::vector<GEdge*> face_edges(const GFace* gf) { + std::vector<GEdge*> edges; + for (GEdge* ge: gf->edges()) { + edges.push_back(ge); + } + GFace* gfc = const_cast<GFace*>(gf); + for (GEdge* ge: gfc->embeddedEdges()) { + edges.push_back(ge); + } + sort_unique(edges); + return edges; +} + +std::vector<GEdge*> model_edges(const GModel* gm) { + std::vector<GEdge*> edges; + std::vector<GFace*> faces = model_faces(gm); + for (GFace* gf: faces) append(edges,face_edges(gf)); + sort_unique(edges); + return edges; +} + +bool haveNiceParametrization(GFace* gf) { + if (!gf->haveParametrization()) return false; + if (gf->geomType() == GFace::GeomType::Sphere) return false; + + // if (gf->periodic(0) || gf->periodic(1)) return false; + + return true; +} + +bool buildVertexToVertexMap( + const std::vector<MTriangle*>& triangles, + std::unordered_map<MVertex*,std::vector<MVertex*> >& v2v) { + v2v.clear(); + v2v.rehash(3*triangles.size()); + + size_t N = 3; + for (MTriangle* f: triangles) { + for (size_t le = 0; le < N; ++le) { + MVertex* v1 = f->getVertex(le); + MVertex* v2 = f->getVertex((le+1)%N); + v2v[v1].push_back(v2); + v2v[v2].push_back(v1); + } + } + for (auto& kv: v2v) { + sort_unique(kv.second); + } + + return true; +} + +bool buildBoundary (const std::vector<MElement*>& elements, std::vector<MVertex*>& bnd){ + std::vector<MEdge> eds,veds; + + for (MElement* e: elements) { + for (size_t j=0;j<(size_t)e->getNumEdges();j++){ + eds.push_back(e->getEdge(j)); + } + } + + MEdgeLessThan melt; + std::sort(eds.begin(),eds.end(), melt); + for(size_t i=0;i<eds.size();i++){ + if (i != eds.size()-1 && eds[i] == eds[i+1])i++; + else veds.push_back(eds[i]); + } + + std::vector<std::vector<MVertex *> > vsorted; + bool oks = SortEdgeConsecutive(veds, vsorted); + if (!oks) { + return false; + } + if (vsorted.empty()){ + return false; + } + else if (vsorted.size() > 1){ + Msg::Debug("buildBoundary(): %li loops instead of one\n",vsorted.size()); + return false; + } + + /* Reverse vertices if necessary, to keep coherent with elements orientation */ + { + MEdge e = veds[0]; + MVertex* v1 = e.getVertex(0); + MVertex* v2 = e.getVertex(1); + auto it = std::find(vsorted[0].begin(),vsorted[0].end(),v1); + if (it == vsorted[0].end()) { + Msg::Error("buildBoundary(): vertex not found in sorted vertices, weird"); + return false; + } + size_t i = it - vsorted[0].begin(); + size_t i_next = (i+1)%vsorted[0].size(); + size_t i_prev = (i-1+vsorted[0].size())%vsorted[0].size(); + if (vsorted[0][i_next] == v2) { + // good ordering + } else if (vsorted[0][i_prev] == v2) { // apply reverse + std::reverse(vsorted[0].begin(),vsorted[0].end()); + } else { + Msg::Error("buildBoundary(): second vertex not found in adjacent sorted vertices, weird"); + return false; + } + } + bnd = vsorted[0]; + return true; +} + +bool buildBoundaries(const std::vector<MElement*>& elements, std::vector<std::vector<MVertex*> >& loops) { + loops.clear(); + std::vector<MEdge> eds,veds; + + for (MElement* e: elements) { + for (size_t j=0;j<(size_t)e->getNumEdges();j++){ + eds.push_back(e->getEdge(j)); + } + } + + MEdgeLessThan melt; + std::sort(eds.begin(),eds.end(), melt); + for(size_t i=0;i<eds.size();i++){ + if (i != eds.size()-1 && eds[i] == eds[i+1])i++; + else veds.push_back(eds[i]); + } + + if (veds.size() == 0) return true; /* No boundary, e.g. sphere */ + + std::vector<std::vector<MVertex *> > vsorted; + bool oks = SortEdgeConsecutive(veds, vsorted); + if (!oks || vsorted.empty()) { + return false; + } + + /* Reverse vertices if necessary, to keep coherent with elements orientation */ + for (size_t l = 0; l < vsorted.size(); ++l) { + std::vector<MVertex*>& loop = vsorted[l]; + /* Find a MEdge on the loop */ + MVertex* a = nullptr; + MVertex* b = nullptr; + for (MEdge e: veds) { + MVertex* v1 = e.getVertex(0); + MVertex* v2 = e.getVertex(1); + auto it = std::find(loop.begin(),loop.end(),v1); + if (it != loop.end()) { + /* v1 from the MEdge found on the loop */ + a = v1; + b = v2; + break; + } + } + if (a == nullptr || b == nullptr) { + Msg::Error("buildBoundaries(): vertex not found in sorted vertices, weird"); + return false; + } + + auto it = std::find(loop.begin(),loop.end(),a); + size_t i = it - loop.begin(); + size_t i_next = (i+1)%loop.size(); + size_t i_prev = (i-1+loop.size())%loop.size(); + if (loop[i_next] == b) { + // good ordering + } else if (loop[i_prev] == b) { // apply reverse + std::reverse(loop.begin(),loop.end()); + } else { + Msg::Error("buildBoundaries(): second vertex not found in adjacent sorted vertices, weird"); + return false; + } + } + + loops = vsorted; + return true; +} + +bool getConnectedComponents(const std::vector<MElement*>& elements, + std::vector<std::vector<MElement*> >& components) { + components.clear(); + + unordered_map<MVertex *, std::vector<MElement *> > v2q; + for (MElement* e: elements) { + for (size_t lv = 0; lv < e->getNumVertices(); ++lv) { + v2q[e->getVertex(lv)].push_back(e); + } + } + + unordered_map<MElement*,int> color; + int no = 0; + for (MElement* e0: elements) { + auto it = color.find(e0); + if (it != color.end()) continue; + no += 1; + + std::vector<MElement*> current; + std::queue<MElement*> Q; + color[e0] = no; + Q.push(e0); + current.push_back(e0); + + while (Q.size() > 0) { + MElement* e = Q.front(); + Q.pop(); + for (size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex* v = e->getVertex(lv); + auto it = v2q.find(v); + if (it == v2q.end()) continue; + for (MElement* e2: it->second) if (e2 != e) { + auto it2 = color.find(e2); + if (it2 == color.end()) { + color[e2] = no; + Q.push(e2); + current.push_back(e2); + } + } + } + } + + sort_unique(current); + components.push_back(current); + } + + return true; +} + +bool patchFromElements(GFace* gf, const std::vector<MElement*>& elements, GFaceMeshPatch& patch, bool forceEvenIfBadBoundary) { + patch.gf = gf; + bool okb = buildBoundaries(elements, patch.bdrVertices); + if (!okb) { + if (forceEvenIfBadBoundary) { + /* Boundaries are not manifold, put all vertices in a unordered loop */ + patch.bdrVertices.resize(1); + patch.bdrVertices[0].clear(); + for (MElement* e: elements) { + for (size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex* v = e->getVertex(lv); + if (v->onWhat() != gf) { + patch.bdrVertices[0].push_back(v); + } + } + } + sort_unique(patch.bdrVertices[0]); + } else { + return false; + } + } + + /* Ensure no repetition in the boundary loops */ + for (std::vector<MVertex*>& loop: patch.bdrVertices) { + if (loop.back() == loop.front()) loop.pop_back(); + } + + patch.intVertices.reserve(4*elements.size()); + for (MElement* e: elements) { + if (e == nullptr) { + Msg::Error("patchFromElements: given MElement* is nullptr"); + return false; + } + for (size_t lv = 0; lv < e->getNumVertices(); ++lv) { + patch.intVertices.push_back(e->getVertex(lv)); + } + } + std::vector<MVertex*> bdr; + for (size_t i = 0; i < patch.bdrVertices.size(); ++i) append(bdr, patch.bdrVertices[i]); + patch.intVertices = difference(patch.intVertices, bdr); + + /* Vertices associated to embedded GVertex/GEdge in GFace */ + patch.embVertices.clear(); + for (MVertex* v: patch.intVertices) { + if (v->onWhat()->cast2Face() == nullptr) { /* MVertex assigned to GVertex or GEdge */ + patch.embVertices.push_back(v); + } + } + if (patch.embVertices.size() > 0) { + patch.intVertices = difference(patch.intVertices, patch.embVertices); + } + + patch.elements = elements; + + return true; +} + +bool patchFromQuads(GFace* gf, const std::vector<MQuadrangle*>& quads, GFaceMeshPatch& patch, bool forceEvenIfBadBoundary) { + std::vector<MElement*> elts = dynamic_cast_vector<MQuadrangle*,MElement*>(quads); + return patchFromElements(gf, elts, patch, forceEvenIfBadBoundary); +} + +struct as2Hash { + size_t operator()(std::array<size_t,2> p) const noexcept { + return size_t(p[0]) << 32 | p[1]; + } +}; + +bool patchIsTopologicallyValid(const GFaceMeshPatch& patch) { + std::unordered_map<std::array<size_t,2>, size_t, as2Hash> edgeVal; + for (MElement* f: patch.elements) { + size_t n = f->getNumVertices(); + for (size_t lv = 0; lv < n; ++lv) { + MVertex* v = f->getVertex(lv); + MVertex* v2 = f->getVertex((lv+1)%n); + if (v->getNum() < v2->getNum()) { + std::array<size_t,2> vpair = {v->getNum(),v2->getNum()}; + edgeVal[vpair] += 1; + } else { + std::array<size_t,2> vpair = {v2->getNum(),v->getNum()}; + edgeVal[vpair] += 1; + } + } + } + + for (auto& kv: edgeVal) { + if (kv.second > 2) { + Msg::Debug("patchIsTopologicallyValid | edge (%i,%i) non manifold, valence = %i", kv.first[0],kv.first[1], kv.second); + return false; + } + } + + return true; +} + +bool GFaceMeshDiff::execute(bool verifyPatchTopology) { + if (gf != before.gf || gf != after.gf) return false; + if (after.elements.size() == 0) return false; + if (done) return false; + if (verifyPatchTopology) { + bool ok = patchIsTopologicallyValid(after); + if (!ok) return false; + } + if (before.bdrVertices.size() != after.bdrVertices.size()) { + Msg::Error("GFaceMeshDiff::execute(): different boundary size before/after, should not happen"); + return false; + } + + /* Replace the interior vertices */ + while (before.intVertices.size() > 0) { + MVertex* ov = before.intVertices.back(); + before.intVertices.pop_back(); + auto it = std::find(gf->mesh_vertices.begin(),gf->mesh_vertices.end(), ov); + if (it == gf->mesh_vertices.end()) { + Msg::Error("GFaceMeshDiff::execute(): vertex %li (entity dim=%i) not found in gf->mesh_vertices (size %li), should NEVER happen, memory corrupted", + ov->getNum(), ov->onWhat()->dim(), gf->mesh_vertices.size()); + if (Msg::GetVerbosity() >= 99) { + gmsh::initialize(); + GeoLog::add(ov->point(),0.,"bad_property_v" + std::to_string(ov->getNum())); + GeoLog::flush(); + gmsh::fltk::run(); + } + abort(); + } + if (after.intVertices.size() > 0) { + /* Replace old vertex by new one, in place */ + MVertex* nv = after.intVertices.back(); + after.intVertices.pop_back(); + *it = nv; + } else { + it = gf->mesh_vertices.erase(it); + } + delete ov; + } + /* Append remaining vertices */ + while (after.intVertices.size() > 0) { + MVertex* nv = after.intVertices.back(); + after.intVertices.pop_back(); + gf->addMeshVertex(nv); + } + + /* Replace the elements */ + while (before.elements.size() > 0) { + MElement* oe = before.elements.back(); + before.elements.pop_back(); + MQuadrangle* oq = dynamic_cast<MQuadrangle*>(oe); + MTriangle* ot = dynamic_cast<MTriangle*>(oe); + if (oq != nullptr) { + auto it = std::find(gf->quadrangles.begin(),gf->quadrangles.end(), oq); + if (it == gf->quadrangles.end()) { + Msg::Error("GFaceMeshDiff::execute(): quad not found in gf->quadrangles, should NEVER happen, memory corrupted"); + abort(); + } + if (after.elements.size() > 0) { + /* Replace old quad by new one, in place */ + MQuadrangle* nq = dynamic_cast<MQuadrangle*>(after.elements.back()); + if (nq != nullptr) { + after.elements.pop_back(); + *it = nq; + } else { + it = gf->quadrangles.erase(it); + } + } else { + it = gf->quadrangles.erase(it); + } + delete oq; + } else if (ot != nullptr) { + auto it = std::find(gf->triangles.begin(),gf->triangles.end(), ot); + if (it == gf->triangles.end()) { + Msg::Error("GFaceMeshDiff::execute(): quad not found in gf->triangles, should NEVER happen, memory corrupted"); + abort(); + } + if (after.elements.size() > 0) { + /* Replace old triangle by new one, in place */ + MTriangle* nt = dynamic_cast<MTriangle*>(after.elements.back()); + if (nt != nullptr) { + after.elements.pop_back(); + *it = nt; + } else { + it = gf->triangles.erase(it); + } + } else { + it = gf->triangles.erase(it); + } + delete ot; + } else { + Msg::Error("GFaceMeshDiff::execute(): element is not MQuadrangle and not MTriangle, should NEVER happen, memory corrupted"); + abort(); + } + } + /* Append remaining elements */ + while (after.elements.size() > 0) { + MElement* ne = after.elements.back(); + after.elements.pop_back(); + gf->addElement(ne->getType(), ne); + } + + done = true; + return true; +} + +GFaceMeshDiff::~GFaceMeshDiff() { + if (done) { + /* execute() should have already cleared these vectors, just doing by security */ + for (MVertex* v: before.intVertices) if (v != nullptr) { + delete v; + v = nullptr; + } + for (MElement* e: before.elements) if (e != nullptr) { + delete e; + e = nullptr; + } + } else { + for (MVertex* v: after.intVertices) if (v != nullptr) { + delete v; + v = nullptr; + } + for (MElement* e: after.elements) if (e != nullptr) { + delete e; + e = nullptr; + } + } +} + +PatchGeometryBackup::PatchGeometryBackup(GFaceMeshPatch& p, bool includeBoundary) { + for (MVertex* v: p.intVertices) { + SPoint2 uv(DBL_MAX,DBL_MAX); + GFace* gf = dynamic_cast<GFace*>(v->onWhat()); + if (gf != nullptr) { + MFaceVertex* mfv = dynamic_cast<MFaceVertex*>(v); + if (mfv != nullptr) { + mfv->getParameter(0,uv.data()[0]); + mfv->getParameter(1,uv.data()[1]); + } + } + old[v] = {uv,v->point()}; + } + if (includeBoundary) { + for (std::vector<MVertex*>& bdr : p.bdrVertices) { + for (MVertex* v: bdr) { + SPoint2 uv(DBL_MAX,DBL_MAX); + GFace* gf = dynamic_cast<GFace*>(v->onWhat()); + if (gf != nullptr) { + MFaceVertex* mfv = dynamic_cast<MFaceVertex*>(v); + if (mfv != nullptr) { + mfv->getParameter(0,uv.data()[0]); + mfv->getParameter(1,uv.data()[1]); + } + } + old[v] = {uv,v->point()}; + } + } + } +} + +bool PatchGeometryBackup::restore() { + for (auto& kv: old) { + MVertex* v = kv.first; + SPoint2 uv = kv.second.first; + SPoint3 pt = kv.second.second; + if (uv.x() != DBL_MAX) { + v->setParameter(0,uv.x()); + v->setParameter(1,uv.y()); + } + v->setXYZ(pt.x(),pt.y(),pt.z()); + } + return true; +} + +MVertex* centerOfElements(const std::vector<MElement*>& elements) { + if (elements.size() == 0) return NULL; + + std::map<std::array<MVertex*,2>,size_t> vPairCount; + unordered_map<MVertex*, unordered_set<MVertex*> > v2v; + for (MElement* f: elements) { + size_t N = f->getNumEdges(); + for (size_t le = 0; le < N; ++le) { + MVertex* v1 = f->getVertex(le); + MVertex* v2 = f->getVertex((le+1)%N); + v2v[v1].insert(v2); + v2v[v2].insert(v1); + std::array<MVertex*,2> vPair = {v1,v2}; + if (v2 < v1) { + vPair = {v2,v1}; + } + vPairCount[vPair] += 1; + } + } + + /* Init from boundary */ + unordered_map<MVertex*,double> dist; + std::priority_queue<std::pair<double,MVertex*>, std::vector<std::pair<double,MVertex*> >, std::greater<std::pair<double,MVertex*> > > Q; + for (const auto& kv: vPairCount) if (kv.second == 1) { + dist[kv.first[0]] = 0.; + dist[kv.first[1]] = 0.; + Q.push({0.,kv.first[0]}); + Q.push({0.,kv.first[1]}); + } + + /* Dijkstra propagation */ + while (Q.size() > 0) { + MVertex* v = Q.top().second; + double cdist = Q.top().first; + Q.pop(); + for (MVertex* v2: v2v[v]) { + double w_ij = v->distance(v2); + auto it = dist.find(v2); + if (it == dist.end() || cdist + w_ij < it->second) { + double new_dist = cdist + w_ij; + dist[v2] = cdist + w_ij; + Q.push({new_dist,v2}); + } + } + } + + double dmax = 0.; + MVertex* center = NULL; + for (const auto& kv: dist) { + if (kv.second > dmax) { + dmax = kv.second; + center = kv.first; + } + } + return center; +} + +bool setVertexGFaceUV(GFace* gf, MVertex* v, double uv[2]) { + bool onGf = (dynamic_cast<GFace*>(v->onWhat()) == gf); + if (onGf) { + v->getParameter(0,uv[0]); + v->getParameter(1,uv[1]); + return true; + } else { + GEdge* ge = dynamic_cast<GEdge*>(v->onWhat()); + if (ge != NULL) { + double t; + v->getParameter(0,t); + SPoint2 uvp = ge->reparamOnFace(gf, t, -1); + uv[0] = uvp.x(); + uv[1] = uvp.y(); + return true; + } else { + GVertex* gv = dynamic_cast<GVertex*>(v->onWhat()); + if (gv != NULL) { + SPoint2 uvp = gv->reparamOnFace(gf,0); + uv[0] = uvp.x(); + uv[1] = uvp.y(); + return true; + } + } + } + uv[0] = 0.; + uv[1] = 0.; + return false; +} + +bool orientElementsAccordingToBoundarySegment(MVertex* a, MVertex* b, std::vector<MElement*>& elements) { + int reorient = 0; + for (MElement* e: elements) { + size_t n = e->getNumVertices(); + for (size_t lv = 0; lv < n; ++lv) { + MVertex* v0 = e->getVertex(lv); + MVertex* v1 = e->getVertex((lv+1)%n); + if (v0 == a && v1 == b) { + reorient = -1; + break; + } else if (v0 == b && v1 == a) { + reorient = 1; + break; + } + } + if (reorient != 0) break; + } + if (reorient == 1) { + for (MElement* e: elements) { + e->reverse(); + } + } else if (reorient == 0) { + Msg::Error("orientElementsAccordingToBoundarySegment: bdr quad edge not found, weird"); + return false; + } + return true; +} + +void getAllParametersWithPeriodJump(MVertex *v, GFace *gf, std::vector<SPoint2> ¶ms) +{ + params.clear(); + + if(gf->geomType() == GEntity::DiscreteSurface) { + params.push_back(gf->parFromPoint(SPoint3(v->x(), v->y(), v->z()))); + return; + } + + if(v->onWhat()->dim() == 0) { + GVertex *gv = (GVertex *)v->onWhat(); + std::vector<GEdge *> const &ed = gv->edges(); + bool seam = false; + for(auto it = ed.begin(); it != ed.end(); it++) { + if((*it)->isSeam(gf)) { + Range<double> range = (*it)->parBounds(0); + if(gv == (*it)->getBeginVertex()) { + params.push_back((*it)->reparamOnFace(gf, range.low(), -1)); + params.push_back((*it)->reparamOnFace(gf, range.low(), 1)); + } + if(gv == (*it)->getEndVertex()) { + params.push_back((*it)->reparamOnFace(gf, range.high(), -1)); + params.push_back((*it)->reparamOnFace(gf, range.high(), 1)); + } + if(gv != (*it)->getBeginVertex() && gv != (*it)->getEndVertex()) { + Msg::Warning("Strange!"); + } + seam = true; + } + } + if(!seam) params.push_back(gv->reparamOnFace(gf, 1)); + } + else if(v->onWhat()->dim() == 1) { + GEdge *ge = (GEdge *)v->onWhat(); + if(!ge->haveParametrization()) return; + double UU; + v->getParameter(0, UU); + if(UU == 0.0) UU = ge->parFromPoint(v->point()); + params.push_back(ge->reparamOnFace(gf, UU, 1)); + if(ge->isSeam(gf)) params.push_back(ge->reparamOnFace(gf, UU, -1)); + } + else { + double UU, VV; + if(v->onWhat() == gf && v->getParameter(0, UU) && v->getParameter(1, VV)) { + params.push_back(SPoint2(UU, VV)); + if (gf->periodic(0) && gf->periodic(1)) { + double Tu = gf->period(0); + double Tv = gf->period(1); + params.push_back(SPoint2(UU+Tu, VV+Tv)); + params.push_back(SPoint2(UU+Tu, VV-Tv)); + params.push_back(SPoint2(UU-Tu, VV+Tv)); + params.push_back(SPoint2(UU-Tu, VV-Tv)); + } else if (gf->periodic(0)) { + double Tu = gf->period(0); + params.push_back(SPoint2(UU+Tu, VV)); + params.push_back(SPoint2(UU-Tu, VV)); + } else if (gf->periodic(1)) { + double Tv = gf->period(1); + params.push_back(SPoint2(UU, VV+Tv)); + params.push_back(SPoint2(UU, VV-Tv)); + } + } + } +} + +bool reparamMeshVertexOnFaceWithRef(GFace* gf, MVertex* v, const SPoint2& ref, SPoint2& param) { + std::vector<SPoint2> p1s; + getAllParametersWithPeriodJump(v, gf, p1s); + if (p1s.size() == 0) { + return false; + } else if (p1s.size() == 0) { + param = p1s[0]; + return true; + } + + double dmin2 = DBL_MAX; + for (size_t i = 0; i < p1s.size(); ++i) { + const SPoint2& uv = p1s[i]; + double d2 = std::pow(uv.x()-ref.x(),2)+ std::pow(uv.y()-ref.y(),2); + if (d2 < dmin2) { + dmin2 = d2; + param = uv; + } + } + return true; +} + +std::vector<SPoint2> paramOnElement(GFace* gf, MElement* t) { + if (t == nullptr) return {}; + const size_t n = t->getNumVertices(); + std::vector<SPoint2> uvs(n,SPoint2(0.,0.)); + + bool reparam = false; + for (size_t lv = 0; lv < n; ++lv) { + MVertex* v = t->getVertex(lv); + bool onGf = (dynamic_cast<GFace*>(v->onWhat()) == gf); + if (onGf) { + v->getParameter(0,uvs[lv][0]); + v->getParameter(1,uvs[lv][1]); + } else { + reparam = true; + } + } + + if (reparam) { + bool found = false; + for (size_t lv = 0; lv < n; ++lv) { + MVertex* v = t->getVertex(lv); + bool onGf = (dynamic_cast<GFace*>(v->onWhat()) == gf); + if (onGf) { + v->getParameter(0,uvs[lv][0]); + v->getParameter(1,uvs[lv][1]); + for (size_t k = 1; k < n; ++k) { + MVertex* v2 = t->getVertex((lv+k)%n); + reparamMeshVertexOnFaceWithRef(gf, v2, uvs[lv], uvs[(lv+k)%n]); + } + found = true; + break; + } + } + if (!found) { + /* Element with no vertex inside the GFace, difficult to get + * good UV parametrization, we use center projection to get + * a initial guess */ + SPoint3 center = t->barycenter(); + double initialGuess[2] = {0.,0.}; + GPoint proj = gf->closestPoint(center,initialGuess); + if (proj.succeeded()) { + SPoint2 ref(proj.u(),proj.v()); + for (size_t k = 0; k < n; ++k) { + MVertex* v = t->getVertex(k); + reparamMeshVertexOnFaceWithRef(gf, v, ref, uvs[k]); + } + } else { + Msg::Error("parametrization not found for element"); + } + } + } + return uvs; +} + +std::vector<MTriangle*> trianglesFromQuads(const std::vector<MQuadrangle*>& quads) { + std::vector<MTriangle*> tris; + tris.reserve(2*quads.size()); + for (MQuadrangle* q: quads) { + MTriangle *t11 = new MTriangle(q->getVertex(0), q->getVertex(1), q->getVertex(2)); + MTriangle *t12 = new MTriangle(q->getVertex(0), q->getVertex(2), q->getVertex(3)); + tris.push_back(t11); + tris.push_back(t12); + } + return tris; +} + +bool getGFaceTriangles(GFace* gf, std::vector<MTriangle*>& triangles, bool& requireDelete) { + triangles.clear(); + requireDelete = false; + + /* Existing pure tri or pure quad mesh on the GFace */ + if (gf->triangles.size() > 0 && gf->quadrangles.size() == 0) { + triangles = gf->triangles; + requireDelete = false; + return true; + } else if (gf->triangles.size() == 0 && gf->quadrangles.size() > 0) { + triangles = trianglesFromQuads(gf->quadrangles); + requireDelete = true; + return true; + } + + /* Check if there is the quadqs background mesh */ + const std::string BMESH_NAME = "bmesh_quadqs"; + if (backgroudMeshExists(BMESH_NAME)) { + GlobalBackgroundMesh& bmesh = getBackgroundMesh(BMESH_NAME); + auto it = bmesh.faceBackgroundMeshes.find(gf); + if (it != bmesh.faceBackgroundMeshes.end() && it->second.triangles.size() > 0) { + /* Get pointers to triangles in the background mesh */ + triangles.resize(it->second.triangles.size()); + for (size_t i = 0; i < it->second.triangles.size(); ++i) { + triangles[i] = &(it->second.triangles[i]); + } + requireDelete = false; + return true; + } + } + + /* Check if there is another background mesh */ + for (auto& bmesh: global_bmeshes) { + auto it = bmesh->faceBackgroundMeshes.find(gf); + if (it != bmesh->faceBackgroundMeshes.end() && it->second.triangles.size() > 0) { + /* Get pointers to triangles in the background mesh */ + triangles.resize(it->second.triangles.size()); + for (size_t i = 0; i < it->second.triangles.size(); ++i) { + triangles[i] = &(it->second.triangles[i]); + } + requireDelete = false; + return true; + } + } + + return false; +} + +bool fillSurfaceProjector(GFace* gf, SurfaceProjector* sp) { + if (sp == nullptr) { + Msg::Error("fillSurfaceProjector: given SurfaceProjector* is null !"); + abort(); + } + + if (gf->geomType() == GFace::GeomType::Sphere) { + bool oka = sp->setAnalyticalProjection(gf); + return oka; + } + + bool deleteTheTris = false; + std::vector<MTriangle*> triangles; + bool okgt = getGFaceTriangles(gf, triangles, deleteTheTris); + if (!okgt) { + Msg::Error("fillSurfaceProjector: case not supported, no triangles"); + return false; + } + + bool oki = sp->initialize(gf, triangles); + if (!oki) { + Msg::Error("failed to initialize the surface projector"); + } + + if (deleteTheTris) { + for (MTriangle* t: triangles) delete t; + } + + return true; +} + +int surfaceEulerCharacteristicDiscrete(const std::vector<MTriangle*>& triangles) { + if (triangles.size() == 0) { + Msg::Error("no triangulation for face, cannot compute discrete Euler characteristic"); + return std::numeric_limits<int>::max(); + } + std::vector<size_t> vertices; + std::vector<std::array<size_t,2> > edges; + vertices.reserve(3*triangles.size()); + edges.reserve(3*triangles.size()); + for (MTriangle* t: triangles) { + for (size_t lv = 0; lv < 3; ++lv) { + size_t v1 = t->getVertex(lv)->getNum(); + size_t v2 = t->getVertex((lv+1)%3)->getNum(); + std::array<size_t,2> vPair = {v1,v2}; + if (v1 > v2) vPair = {v2,v1}; + edges.push_back(vPair); + vertices.push_back(v1); + } + } + sort_unique(vertices); + sort_unique(edges); + int S = triangles.size(); + int E = edges.size(); + int V = vertices.size(); + return V - E + S; +} + +inline void normalize_accurate(SVector3& a) { + double amp = std::abs(a.data()[0]); + amp = std::max(amp,std::abs(a.data()[1])); + amp = std::max(amp,std::abs(a.data()[2])); + if (amp == 0.) { + return; + } + a = amp * a; + a.normalize(); +} + +inline double angleVectors(SVector3 a, SVector3 b) { + if (a.normSq() == 0. || b.normSq() == 0.) return DBL_MAX; + normalize_accurate(a); + normalize_accurate(b); + return acos(ArrayGeometry::clamp(dot(a,b),-1.,1.)); +} + +bool fillGFaceInfo(GFace* gf, GFaceInfo& info, const std::vector<MTriangle*>& triangles) { + info.gf = gf; + info.chi = 0; + info.cornerIsNonManifold.clear(); + for (auto& a: info.bdrValVertices) a.clear(); + info.intSumVal3mVal5 = 0; + + /* Compute geometric info */ + robin_hood::unordered_map<GVertex*,std::vector<MElement*> > corner2tris; + robin_hood::unordered_map<GVertex*,double> corner2angle; + for (MTriangle* t: triangles) { + for (size_t lv = 0; lv < 3; ++lv) { + MVertex* v = t->getVertex(lv); + GVertex* gv = v->onWhat()->cast2Vertex(); + if (gv != nullptr) { + MVertex* vPrev = t->getVertex((3+lv-1)%3); + MVertex* vNext = t->getVertex((lv+1)%3); + SVector3 pNext = vNext->point(); + SVector3 pPrev = vPrev->point(); + SVector3 pCurr = v->point(); + double agl = angleVectors(pNext-pCurr,pPrev-pCurr); + corner2tris[gv].push_back(t); + corner2angle[gv] += agl; + } + } + } + robin_hood::unordered_set<GVertex*> boundaryCADcorners; + for (GEdge* ge: gf->edges()) for (GVertex* gv: ge->vertices()) { + boundaryCADcorners.insert(gv); + } + + for (const auto& kv: corner2tris) { + GVertex* gv = kv.first; + /* Check if corner is manifold */ + { + auto it = boundaryCADcorners.find(gv); + if (it == boundaryCADcorners.end()) continue; /* ignore interior GVertex */ + } + std::vector<MElement*> elts = kv.second; + std::vector<MVertex*> bnd; + bool okb = buildBoundary(elts, bnd); + if (!okb) { + info.cornerIsNonManifold.insert(gv); + continue; + } + double angle = corner2angle[gv]; + double angle_deg = 180. / M_PI * angle; + if (angle_deg < 90. + 45.) { + info.bdrValVertices[1].insert(gv); + } else if (angle_deg < 180. + 45.) { + info.bdrValVertices[2].insert(gv); + } else if (angle_deg < 270. + 45.) { + info.bdrValVertices[3].insert(gv); + } else if (angle_deg < 360.) { + info.bdrValVertices[4].insert(gv); + } else { + Msg::Warning("CAD vertex (surf=%i,node=%i) has angle = %f deg (interior node ?)", gf->tag(), gv->tag(), angle_deg); + continue; + } + } + info.chi = surfaceEulerCharacteristicDiscrete(triangles); + + /* discrete topological relations between irregular vertices: + * sum3m5 = n_val3 - n_val5 = 4 \chi + m_val3 - m_val1 + 2 m_val4 */ + info.intSumVal3mVal5 = 4*info.chi + int(info.bdrValVertices[3].size()) + - int(info.bdrValVertices[1].size()) + 2 * int(info.bdrValVertices[4].size()); + + return true; + +} + +bool fillGFaceInfo(GFace* gf, GFaceInfo& info) { + info.gf = gf; + info.chi = 0; + info.cornerIsNonManifold.clear(); + for (auto& a: info.bdrValVertices) a.clear(); + info.intSumVal3mVal5 = 0; + + + bool deleteTheTris = false; + std::vector<MTriangle*> triangles; + bool okgt = getGFaceTriangles(gf, triangles, deleteTheTris); + if (!okgt) { + Msg::Error("fillSurfaceProjector: case not supported, no triangles"); + return false; + } + + bool okr = fillGFaceInfo(gf, info, triangles); + + if (deleteTheTris) { + for (MTriangle* t: triangles) delete t; + } + + return okr; +} + +bool isTopologicalDisk(const GFaceInfo& info) { + return info.chi == 1; +} + +bool haveConcaveCorners(const GFaceInfo& info) { + if (info.bdrValVertices[3].size() > 0 || info.bdrValVertices[4].size() > 0) { + return true; + } + return false; +} + +bool faceOrderedSideLoops(GFace* gf, const GFaceInfo& info, + std::vector<std::vector<std::vector<std::pair<GEdge*,bool> > > >& loopSideEdgesAndInv) { + if (info.gf != gf) return false; + loopSideEdgesAndInv.clear(); + + std::unordered_set<GVertex*> isCorner; + for (GVertex* gv: info.bdrValVertices[1]) isCorner.insert(gv); + for (GVertex* gv: info.bdrValVertices[3]) isCorner.insert(gv); + for (GVertex* gv: info.bdrValVertices[4]) isCorner.insert(gv); + + const std::vector<GEdge *>& edges = gf->edges(); + std::unordered_map<GVertex*, std::vector<GEdge*> > v2e; + for (GEdge* ge: edges) { + for (GVertex* gv: ge->vertices()) v2e[gv].push_back(ge); + } + for (auto& kv: v2e) sort_unique(kv.second); + + + std::unordered_set<GEdge*> visited; + + int withCorner = 0; + int withoutCorner = 1; + for (int pass: {withCorner, withoutCorner}) { + for (GEdge* e0: edges) { + bool already = (visited.find(e0) != visited.end()); + if (already) continue; + + if (e0->periodic(0)) { + /* New loop with a single periodic GEdge */ + loopSideEdgesAndInv.resize(loopSideEdgesAndInv.size()+1); + loopSideEdgesAndInv.back() = { { {e0,false} } }; + visited.insert(e0); + continue; + } + + GVertex* v1 = e0->vertices()[0]; + GVertex* v2 = e0->vertices()[1]; + if (pass == withCorner) { + bool v1IsCorner = (isCorner.find(v1) != isCorner.end()); + if (!v1IsCorner) continue; + } + + /* New loop */ + loopSideEdgesAndInv.resize(loopSideEdgesAndInv.size()+1); + + + if (pass == withoutCorner) { /* New side from no corner */ + loopSideEdgesAndInv.back().resize(loopSideEdgesAndInv.back().size()+1); + } + + size_t infLoop = 0; + GVertex* v = v1; + GEdge* e = e0; + bool inv = false; + do { + infLoop += 1; + if (infLoop > 1e6) { + Msg::Warning("infinite loop in edges of face %i, cancel simple quad mesh", gf->tag()); + return -1; + } + bool vIsCorner = (isCorner.find(v) != isCorner.end()); + if (vIsCorner) { /* new side in current loop */ + loopSideEdgesAndInv.back().resize(loopSideEdgesAndInv.back().size()+1); + } + v1 = e->vertices()[0]; + v2 = e->vertices()[1]; + + inv = (v == v2); + + loopSideEdgesAndInv.back().back().push_back({e,inv}); + + visited.insert(e); + + GVertex* v_next = NULL; + if (v2 != v) { + v_next = v2; + } else { + v_next = v1; + } + GEdge* e_next = NULL; + if (v2e[v_next].size() == 2) { + e_next = (v2e[v_next][0] != e) ? v2e[v_next][0] : v2e[v_next][1]; + } else { + Msg::Warning("non manifold edge loop around face %li, cancel simple quad mesh", gf->tag()); + return -1; + } + + e = e_next; + v = v_next; + } while (e != e0); + } + } + + // Msg::Warning("- Face %i: %li loops", gf->tag(), loopSideEdgesAndInv.size()); + // for (size_t i = 0; i < loopSideEdgesAndInv.size(); ++i) { + // Msg::Warning("- loop %li: %li sides", i, loopSideEdgesAndInv[i].size()); + // for (size_t j = 0; j < loopSideEdgesAndInv[i].size(); ++j) { + // Msg::Warning("- side %li: %li edges ", j, loopSideEdgesAndInv[i][j].size()); + // } + // } + + return true; +} + +bool appendCADStatistics(GModel* gm, std::unordered_map<std::string,double>& stats, const std::string& prefix) { + stats[prefix+"n_corners"] = double(gm->getVertices().size()); + stats[prefix+"n_curves"] = double(model_edges(gm).size()); + stats[prefix+"n_faces"] = double(model_faces(gm).size()); + stats[prefix+"n_volumes"] = double(gm->getRegions().size()); + return true; +} + +bool appendQuadMeshStatistics(GModel* gm, std::unordered_map<std::string,double>& stats, const std::string& prefix) { + Msg::Debug("compute quad mesh statistics ..."); + /* Stats on regularity of vertices */ + std::vector<MQuadrangle*> all_quads; + { + std::vector<int> nValFace(10,0); + std::vector<int> nValCurve(10,0); + std::vector<int> nValCorner(10,0); + double nVert = 0.; /* repetition on shared GVertex / GEdge */ + double nQuad = 0.; + for (GFace* gf: model_faces(gm)) { + append(all_quads,gf->quadrangles); + unordered_map<MVertex *, std::vector<MElement *> > adj; + for (MQuadrangle* f: gf->quadrangles) { + nQuad += 1.; + for (size_t lv = 0; lv < 4; ++lv) { + MVertex* v = f->getVertex(lv); + adj[v].push_back(f); + } + } + for (auto& kv: adj) { + nVert += 1.; + MVertex* v = kv.first; + GEntity* ent = v->onWhat(); + bool onCorner = (dynamic_cast<GVertex*>(ent) != NULL); + bool onCurve = (dynamic_cast<GEdge*>(ent) != NULL); + bool onFace = (dynamic_cast<GFace*>(ent) != NULL); + int val = (int) kv.second.size(); + if (onCorner) { + if ((size_t)val >= nValCorner.size()) nValCorner.resize(val+1); + nValCorner[val] += 1; + } else if (onCurve) { + if ((size_t)val >= nValCurve.size()) nValCurve.resize(val+1); + nValCurve[val] += 1; + } else if (onFace) { + if ((size_t)val >= nValFace.size()) nValFace.resize(val+1); + nValFace[val] += 1; + } + } + } + double regular = 0.; + double irregular = 0.; + double very_irregular = 0.; + double val3 = 0.; + double val5 = 0.; + for (size_t val = 0; val < nValCurve.size(); ++val) { + if (val == 2) { + regular += double(nValCurve[val]); + } else if (val == 1 || val == 3){ + irregular += double(nValCurve[val]); + } else { + very_irregular += double(nValCurve[val]); + } + } + for (size_t val = 0; val < nValFace.size(); ++val) { + if (val == 4) { + regular += double(nValFace[val]); + } else if (val == 3) { + irregular += double(nValFace[val]); + val3 += double(nValFace[val]); + } else if (val == 5) { + irregular += double(nValFace[val]); + val5 += double(nValFace[val]); + } else { + very_irregular += double(nValFace[val]); + } + } + stats[prefix+"n_quads"] = nQuad; + stats[prefix+"n_vertices"] = nVert; + stats[prefix+"n_regular"] = regular; + stats[prefix+"n_irregular"] = irregular; + stats[prefix+"n_very_irregular"] = very_irregular; + stats[prefix+"n_val3"] = val3; + stats[prefix+"n_val5"] = val5; + } + + /* Quality stats */ + if (all_quads.size() > 0){ + std::vector<double> quality(all_quads.size()); + std::vector<double> edgeLen(4*all_quads.size()); + double edge_len_min = DBL_MAX; + double edge_len_avg = 0.; + double edge_len_max = 0.; + double edge_n = 0.; + double avg = 0.; + for (size_t f = 0; f < all_quads.size(); ++f) { + quality[f] = all_quads[f]->minSICNShapeMeasure(); + avg += quality[f]; + for (size_t le = 0; le < 4; ++le) { + SPoint3 p1 = all_quads[f]->getVertex(le)->point(); + SPoint3 p2 = all_quads[f]->getVertex((le+1)%4)->point(); + double len = p1.distance(p2); + edgeLen[4*f+le] = len; + edge_len_min = std::min(edge_len_min, len); + edge_len_max = std::max(edge_len_max, len); + edge_len_avg += len; + edge_n += 1.; + } + } + avg /= quality.size(); + edge_len_avg /= edge_n; + std::sort(quality.begin(),quality.end()); + std::sort(edgeLen.begin(),edgeLen.end()); + stats[prefix+"SICN_min"] = quality[0]; + stats[prefix+"SICN_avg"] = avg; + stats[prefix+"SICN_max"] = quality.back(); + stats[prefix+"SICN_med"] = quality[size_t(0.50*double(quality.size()))]; + // stats[prefix+"SICN_01% <"] = quality[size_t(0.01*double(quality.size()))]; + // stats[prefix+"SICN_10% <"] = quality[size_t(0.10*double(quality.size()))]; + // stats[prefix+"SICN_25% <"] = quality[size_t(0.25*double(quality.size()))]; + // stats[prefix+"SICN_50% <"] = quality[size_t(0.50*double(quality.size()))]; + // stats[prefix+"SICN_75% <"] = quality[size_t(0.75*double(quality.size()))]; + // stats[prefix+"SICN_90% <"] = quality[size_t(0.90*double(quality.size()))]; + // stats[prefix+"SICN_99% <"] = quality[size_t(0.99*double(quality.size()))]; + + stats[prefix+"edge_min"] = edgeLen.front(); + stats[prefix+"edge_avg"] = edge_len_avg; + stats[prefix+"edge_med"] = edgeLen[size_t(0.5*double(edgeLen.size()))]; + stats[prefix+"edge_max"] = edgeLen.back(); + } + + + return true; +} + +void printStatistics(const unordered_map<std::string,double>& stats, const std::string& title) { + std::vector<std::string> keys; + for (auto& kv: stats) keys.push_back(kv.first); + std::sort(keys.begin(),keys.end()); + Msg::Info("%s", title.c_str());; + for (std::string key: keys) { + double val = stats.at(key); + if (std::trunc(val) == val) { + Msg::Info("- %s: %i", key.c_str(),int(val)); + } else { + Msg::Info("- %s: %f", key.c_str(),val); + } + } +} + +void writeStatistics(const unordered_map<std::string,double>& stats, const std::string& path) { + std::vector<std::string> keys; + for (auto& kv: stats) keys.push_back(kv.first); + std::sort(keys.begin(),keys.end()); + + std::ofstream out(path); + out << "{\n"; + for (size_t i = 0; i < keys.size(); ++i) { + std::string key = keys[i]; + double val = stats.at(key); + if (std::trunc(val) == val) { + out << "\"" << key << "\"" << ": " << int(val); + } else { + out << "\"" << key << "\"" << ": " << val; + } + if ((int)i < (int)keys.size()-1) { + out << ",\n"; + } else { + out << "\n"; + } + } + out << "}\n"; + out.close(); +} + +void errorAndAbortIfNegativeElement(GFace* gf, const std::vector<MElement*>& elts, const std::string& msg) { + Msg::Debug("errorAndAbortIfNegativeElement ... (! SLOW !)"); + double vmin = DBL_MAX; + for (MElement* e: elts) { + double q = e->minSICNShapeMeasure(); + vmin = std::min(vmin,q); + } + if (vmin < 0.) { + Msg::Error("Face %i, negative element (in %li tested): SICN min = %.3f. %s", gf->tag(), elts.size(), vmin, msg.c_str()); + abort(); + } +} + +void errorAndAbortIfInvalidVertex(MVertex* v, const std::string& msg) { + size_t numMax = GModel::current()->getMaxVertexNumber(); + if (v == nullptr) { + Msg::Error("Invalid vertex: v = %p | %s", + v, msg.c_str()); + abort(); + } + if (v->getNum() > numMax) { + Msg::Error("Invalid vertex: v = %p, num = %li > numMax=%li | %s", + v, v->getNum(), numMax, msg.c_str()); + abort(); + } + GEntity* ge = v->onWhat(); + if (ge == nullptr) { + Msg::Error("Invalid vertex: v = %p, num = %li has no entity | %s", + v, v->getNum(), msg.c_str()); + abort(); + } + auto it = std::find(ge->mesh_vertices.begin(),ge->mesh_vertices.end(),v); + if (it == ge->mesh_vertices.end()) { + Msg::Error("Invalid vertex: v = %p, num = %li, not found in its entity mesh_vertices (dim %i, tag %i) | %s", + v, v->getNum(), ge->dim(), ge->tag(), msg.c_str()); + abort(); + } +} + +void errorAndAbortIfInvalidVertexInElements(const std::vector<MElement*>& elts, const std::string& msg) { + Msg::Debug("errorAndAbortIfInvalidVertexInElements ... (! SLOW !)"); + size_t numMax = GModel::current()->getMaxVertexNumber(); + for (MElement* e: elts) { + if (e == nullptr) continue; + for (size_t lv = 0; lv < e->getNumVertices(); ++lv) { + MVertex* v = e->getVertex(lv); + if (v == nullptr) { + Msg::Error("Element %li (dim %i), invalid vertex: lv = %li: v = %p | %s", + e->getNum(), e->getDim(), lv, v, msg.c_str()); + abort(); + } + if (v->getNum() > numMax) { + Msg::Error("Element %li (dim %i), invalid vertex: lv = %li: v = %p, num = %li > numMax=%li | %s", + e->getNum(), e->getDim(), lv, v, v->getNum(), numMax, msg.c_str()); + abort(); + } + GEntity* ge = v->onWhat(); + if (ge == nullptr) { + Msg::Error("Element %li (dim %i), invalid vertex: lv = %li: v = %p, num = %li has no entity | %s", + e->getNum(), e->getDim(), lv, v, v->getNum(), msg.c_str()); + abort(); + } + auto it = std::find(ge->mesh_vertices.begin(),ge->mesh_vertices.end(),v); + if (it == ge->mesh_vertices.end()) { + Msg::Error("Element %li (dim %i), invalid vertex: lv = %li: v = %p, num = %li, not found in its entity mesh_vertices (dim %i, tag %i) | %s", + e->getNum(), e->getDim(), lv, v, v->getNum(), ge->dim(), ge->tag(), msg.c_str()); + abort(); + } + + // // this ones require to rebuild vertex cache + // MVertex* v2 = GModel::current()->getMeshVertexByTag(v->getNum()); + // if (v2 != v) { + // Msg::Error("Element %li (dim %i), invalid vertex: lv = %li: v = %p, num = %li -> getMeshVertexByTag -> v = %p | %s", + // e->getNum(), e->getDim(), lv, v, v->getNum(), v2, msg.c_str()); + // abort(); + // } + } + } +} + +void errorAndAbortIfInvalidVertexInModel(GModel* gm, const std::string& msg) { + Msg::Debug("errorAndAbortIfInvalidVertexInModel ... (! SLOW !)"); + for (GVertex* gv: gm->getVertices()) { + for (MVertex* v: gv->mesh_vertices) { + errorAndAbortIfInvalidVertex(v, msg); + } + } + for (GEdge* ge: model_edges(gm)) { + errorAndAbortIfInvalidVertexInElements(dynamic_cast_vector<MLine*,MElement*>(ge->lines), msg); + } + for (GFace* gf: model_faces(gm)) { + errorAndAbortIfInvalidVertexInElements(dynamic_cast_vector<MTriangle*,MElement*>(gf->triangles), msg); + errorAndAbortIfInvalidVertexInElements(dynamic_cast_vector<MQuadrangle*,MElement*>(gf->quadrangles), msg); + } +} + +std::string randomIdentifier() { + return std::to_string(rand()); +} diff --git a/contrib/QuadMeshingTools/qmtMeshUtils.h b/contrib/QuadMeshingTools/qmtMeshUtils.h new file mode 100644 index 0000000000000000000000000000000000000000..ebdde427dd480b8a01580ed70ac19164a4d11119 --- /dev/null +++ b/contrib/QuadMeshingTools/qmtMeshUtils.h @@ -0,0 +1,151 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include <set> +#include <vector> +#include <string> +#include <unordered_map> +#include "SPoint2.h" +#include "SPoint3.h" + + +class GModel; +class GVertex; +class GFace; +class GEdge; +class MTriangle; +class MQuadrangle; +class MVertex; +class MElement; +class SurfaceProjector; + +std::vector<GFace*> model_faces(const GModel* gm); +std::vector<GEdge*> face_edges(const GFace* gf); +std::vector<GEdge*> model_edges(const GModel* gm); + +bool haveNiceParametrization(GFace* gf); + +bool buildVertexToVertexMap( + const std::vector<MTriangle*>& triangles, + std::unordered_map<MVertex*,std::vector<MVertex*> >& v2v); + + +struct GFaceMeshPatch { + /* Warning: simple container for pointers, memory not managed by this struct. + * The GFaceMeshDiff wrapper is doing some memory management for the content. */ + GFace* gf = nullptr; + /* bdrVertices are the ordered boundary loops, there is only one + * if patch is a topological disk */ + std::vector<std::vector<MVertex*> > bdrVertices; + std::vector<MVertex*> intVertices; /* interior free vertices */ + std::vector<MVertex*> embVertices; /* fixed vertices inside patch */ + std::vector<MElement*> elements; +}; + + +bool buildBoundary (const std::vector<MElement*>& elements, std::vector<MVertex*>& bnd); +bool buildBoundaries(const std::vector<MElement*>& elements, std::vector<std::vector<MVertex*> >& loops); +bool patchFromElements(GFace* gf, const std::vector<MElement*>& elements, GFaceMeshPatch& patch, bool forceEvenIfBadBoundary = false); +bool patchFromQuads(GFace* gf, const std::vector<MQuadrangle*>& quads, GFaceMeshPatch& patch, bool forceEvenIfBadBoundary = false); + + +void sicnQuality(const GFaceMeshPatch& patch, double& sicnMin, double& sicnAvg); + +bool patchIsTopologicallyValid(const GFaceMeshPatch& patch); + +bool getConnectedComponents(const std::vector<MElement*>& elements, + std::vector<std::vector<MElement*> >& components); + +bool setVertexGFaceUV(GFace* gf, MVertex* v, double uv[2]); + +MVertex* centerOfElements(const std::vector<MElement*>& elements); + +bool orientElementsAccordingToBoundarySegment(MVertex* a, MVertex* b, std::vector<MElement*>& elements); + +bool reparamMeshVertexOnFaceWithRef(GFace* gf, MVertex* v, const SPoint2& ref, SPoint2& param); + +std::vector<SPoint2> paramOnElement(GFace* gf, MElement* e); + +/* warning: triangles are allocated, should be delete by the caller */ +std::vector<MTriangle*> trianglesFromQuads(const std::vector<MQuadrangle*>& quads); + +bool getGFaceTriangles(GFace* gf, std::vector<MTriangle*>& triangles, bool& requireDelete); + + +bool fillSurfaceProjector(GFace* gf, SurfaceProjector* sp); + +int surfaceEulerCharacteristicDiscrete(const std::vector<MTriangle*>& triangles); + +struct GFaceInfo { + GFace* gf = NULL; + int chi = 0; + std::set<GVertex*> cornerIsNonManifold; + std::array<std::set<GVertex*>,5> bdrValVertices; + int intSumVal3mVal5 = 0; +}; + +bool fillGFaceInfo(GFace* gf, GFaceInfo& info, const std::vector<MTriangle*>& triangles); +bool fillGFaceInfo(GFace* gf, GFaceInfo& info); + +bool isTopologicalDisk(const GFaceInfo& info); +bool haveConcaveCorners(const GFaceInfo& info); + +bool faceOrderedSideLoops(GFace* gf, const GFaceInfo& info, + std::vector<std::vector<std::vector<std::pair<GEdge*,bool> > > >& loopSideEdgesAndInv); + +bool appendCADStatistics(GModel* gm, std::unordered_map<std::string,double>& stats, const std::string& prefix = "CAD_"); +bool appendQuadMeshStatistics(GModel* gm, std::unordered_map<std::string,double>& stats, const std::string& prefix = "Mesh_"); +void printStatistics(const std::unordered_map<std::string,double>& stats, const std::string& title = "Statistics:"); +void writeStatistics(const std::unordered_map<std::string,double>& stats, const std::string& path); /* json format */ + +void errorAndAbortIfNegativeElement(GFace* gf, const std::vector<MElement*>& elts, const std::string& msg = ""); +void errorAndAbortIfInvalidVertexInElements(const std::vector<MElement*>& elts, const std::string& msg = ""); +void errorAndAbortIfInvalidVertexInModel(GModel* gm, const std::string& msg = ""); + +std::string randomIdentifier(); + +struct GFaceMeshDiff { + GFace* gf = nullptr; + GFaceMeshPatch before; + GFaceMeshPatch after; + bool done = false; + + /** + * @brief Update the GFace with the new vertices/elements + * and remove/delete the old ones. + * + * @param[in] verifyPatchTopology Check if the patch after is manifold + * + * @return true if success + */ + bool execute(bool verifyPatchTopology = false); + + /** + * @brief Destructor, delete/remove the new or old components + * depending on the value of the variable done. + */ + ~GFaceMeshDiff(); +}; + + +/** + * @brief Store the geometry (uv + 3D) of a GFaceMeshPatch. + * Useful to restore the initial geometry after trying + * various smoothing operations that were not successful. + */ +struct PatchGeometryBackup { + std::vector<MVertex*> vertices; + std::vector<SPoint2> UVs; + std::vector<SPoint3> positions; + std::unordered_map<MVertex*,std::pair<SPoint2,SPoint3> > old; + + PatchGeometryBackup(GFaceMeshPatch& p, bool includeBoundary = false); + bool restore(); +}; + diff --git a/contrib/QuadMeshingTools/qmtQuadCavityRemeshing.cpp b/contrib/QuadMeshingTools/qmtQuadCavityRemeshing.cpp new file mode 100644 index 0000000000000000000000000000000000000000..055ecb3d3aa0ea07577bbca1567e9836c492f52b --- /dev/null +++ b/contrib/QuadMeshingTools/qmtQuadCavityRemeshing.cpp @@ -0,0 +1,2968 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "qmtQuadCavityRemeshing.h" + +/* System includes */ +// #include <vector> +// #include <array> +// #include <unordered_map> +// #include <cstdint> +// #include <cmath> +#include <queue> +#include <unordered_set> +// #include <algorithm> + +/* Gmsh includes */ +#include "GmshMessage.h" +#include "OS.h" +#include "GVertex.h" +#include "GEdge.h" +#include "GFace.h" +#include "GModel.h" +#include "MVertex.h" +#include "MLine.h" +#include "MElement.h" +#include "MTriangle.h" +#include "MQuadrangle.h" +#include "BackgroundMesh.h" +#include "StringUtils.h" +#include "meshOctreeLibOL.h" +#include "gmsh.h" // api + +/* QuadMeshingTools includes */ +#include "cppUtils.h" +#include "qmtMeshUtils.h" +#include "qmtMeshGeometryOptimization.h" +#include "row_echelon_integer.hpp" +#include "geolog.h" +#include "robin_hood.h" // fast unordered_set and unordered_map + +using namespace CppUtils; + +const size_t PATTERN_QUAD_REGULAR = 0; +const size_t PATTERN_TRIANGLE = 1; +const size_t PATTERN_PENTAGON = 2; +const size_t PATTERN_QUAD_DIAG35 = 3; +const size_t PATTERN_QUAD_ALIGNED35 = 4; +const size_t PATTERN_QUAD_CHORD_UTURN = 5; +const size_t PATTERN_2CORNERS = 6; +const size_t PATTERN_1CORNER = 7; +const size_t PATTERN_DISK = 8; + +size_t patternNumberOfCorners(size_t pId) { + switch (pId) { + case PATTERN_QUAD_REGULAR: + return 4; + case PATTERN_TRIANGLE: + return 3; + case PATTERN_PENTAGON: + return 5; + case PATTERN_QUAD_DIAG35: + return 4; + case PATTERN_QUAD_ALIGNED35: + return 4; + case PATTERN_QUAD_CHORD_UTURN: + return 4; + case PATTERN_2CORNERS: + return 2; + case PATTERN_1CORNER: + return 1; + case PATTERN_DISK: + return 0; + default: + Msg::Error("patternNumberOfCorners: pattern not supported"); + }; + return 0; +} + + +namespace QMT { + using std::vector; + using std::array; + + + /* robin_hood hash sets and maps are much faster than the STL version */ + // using std::unordered_map; + // using std::unordered_set; + + template <typename Key, typename T, typename Hash = robin_hood::hash<Key>, + typename KeyEqual = std::equal_to<Key>, size_t MaxLoadFactor100 = 80> + using unordered_map = robin_hood::detail::Table<true, MaxLoadFactor100, Key, T, Hash, KeyEqual>; + + template <typename Key, typename Hash = robin_hood::hash<Key>, typename KeyEqual = std::equal_to<Key>, + size_t MaxLoadFactor100 = 80> + using unordered_set = robin_hood::detail::Table<true, MaxLoadFactor100, Key, void, Hash, KeyEqual>; + + /* hash_combine from boost */ + template <class T> + inline void hash_combine(std::size_t& seed, const T& v) + { + std::hash<T> hasher; + seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2); + } + + + using id = uint32_t; + using id2 = std::array<id,2>; + using id4 = std::array<id,4>; + + constexpr bool DBG_VERBOSE = false; + + /* Quad meshes of patterns, known at compile time + * These patterns must be CONVEX + * WARNING: orientation of quads must be coherent ! */ + const std::vector<std::pair<size_t,std::vector<id4> > > quad_meshes = { + /* regular quad patch */ + {PATTERN_QUAD_REGULAR,{{0,1,2,3}}}, + + /* triangular patch with one val3 singularity */ + {PATTERN_TRIANGLE,{{0,1,6,5},{1,2,3,6},{3,4,5,6}}}, + + /* pentagonal patch with one val5 singularity */ + {PATTERN_PENTAGON,{{0, 1, 2, 3}, {0, 5, 4, 1}, {0, 7, 6, 5}, {0, 9, 8, 7}, {0, 3, 10, 9}}}, + + /* quad patch with one val3 and one val5 singularities (on diagonal) */ + {PATTERN_QUAD_DIAG35,{{0, 1, 2, 3}, {0, 5, 4, 1}, {0, 7, 6, 5}, {0, 9, 8, 7}, {0, 3, 10, 9}, {8, 9, 10, 11}}}, + + /* quad patch with one val3, one val5 singularities and two regular inside (3-5 pair for size transition) */ + {PATTERN_QUAD_ALIGNED35,{{0, 1, 2, 3}, {0, 5, 4, 1}, {0, 7, 6, 5}, {0, 9, 8, 7}, {0, 3, 10, 9}, {9, 10, 12, 11}, {3, 13, 12, 10}, {8, 9, 11, 14}, {2, 15, 13, 3}}}, + + /* quad patch with two val3, two val5 inside, size transition by having a chord making a U-turn */ + {PATTERN_QUAD_CHORD_UTURN,{{0, 1, 2, 3}, {0, 5, 4, 1}, {0, 7, 6, 5}, {0, 9, 8, 7}, {0, 3, 10, 9}, {9, 10, 12, 11}, {9, 11, 14, 13}, {8, 9, 13, 15}, {6, 7, 8, 15}}}, + + /* patch with two corners, two val3 singularities inside (good for eye shape) */ + {PATTERN_2CORNERS,{{0, 1, 2, 3}, {0, 5, 4, 1}, {0, 3, 6, 5}, {4, 5, 6, 7}}}, + + /* patch with one corner, three val3 singularities inside and one regular vertiex */ + {PATTERN_1CORNER,{{0,1,6,5},{1,2,7,6},{2,3,8,7},{3,4,9,8},{4,5,6,9},{6,7,8,9}}}, + + /* disk pattern (no corners) */ + {PATTERN_DISK,{{0,1,6,5},{1,2,7,6},{2,3,4,7},{0,5,4,3},{4,5,6,7}}}, + }; + + constexpr id NO_ID = (id) -1; + inline id2 sorted(id v1, id v2) { if (v1 < v2) { return {v1,v2}; } else { return {v2,v1}; } } + inline id2 sorted(id2 e) { if (e[0] < e[1]) { return {e[0],e[1]}; } else { return {e[1],e[0]}; } } + + struct id2hash { + size_t operator()(const id2 &pr) const noexcept { + size_t seed = 0; + hash_combine(seed, robin_hood::hash_bytes(&(pr[0]), sizeof(id))); + hash_combine(seed, robin_hood::hash_bytes(&(pr[1]), sizeof(id))); + return seed; + } + }; + + struct vidHash { + size_t operator()(const std::vector<id>& p) const noexcept { + size_t seed = 0; + for (size_t i = 0; i < p.size(); ++i) { + hash_combine(seed, robin_hood::hash_bytes(&(p[i]), sizeof(id))); + } + return seed; + } + }; + + bool build_quad_chord(const vector<id4>& quadEdges, const vector<vector<id> >& e2f, id eStart, std::vector<id>& chordEdges) { + chordEdges.size(); + + vector<bool> visited(e2f.size(),false); + + /* Init */ + visited[eStart] = true; + std::queue<id> qq; + qq.push(eStart); + + /* Propagation */ + while (qq.size() > 0) { + id e = qq.front(); + qq.pop(); + chordEdges.push_back(e); + + for (size_t lf = 0; lf < e2f[e].size(); ++lf) { + id f = e2f[e][lf]; + id oe = NO_ID; + for (size_t le = 0; le < 4; ++le) { + if (quadEdges[f][le] == e) { + oe = quadEdges[f][(le+2)%4]; + break; + } + } + if (oe == NO_ID) return false; + if (visited[oe]) continue; + visited[oe] = true; + qq.push(oe); + } + } + + sort_unique(chordEdges); + + return true; + } + + double sum_sqrt(const vector<int>& values) { + double s = 0.; + for (const auto& v: values) s += sqrt(v); + return s; + } + + bool all_strictly_positive(const vector<int>& values) { + for (const auto& v: values) if (v <= 0) return false; + return true; + } + + /* Struct to interface with row_echelon_integer.hpp */ + struct IMatrix { + /* Data */ + int m; + int n; + std::vector<int> a; + + /* Methods */ + IMatrix(int m_, int n_): m(m_), n(n_) { + a.resize(m*n,0); + } + + void set(int i, int j, int value) { a[i+j*m] = value; } + int get(int i, int j) const {return a[i+j*m]; } + + int tansform_to_row_reduced_echelon() { + return i4mat_ref(m,n,a.data()); + } + + void print(const std::string& title = "IMatrix") { + i4mat_print(m, n, a.data(), title); + } + + double solution_score(const std::vector<int>& x) { + if (x.size() != (size_t) n-1) return 0.; + for (int j = 0; j < n-1; ++j) { + if (x[j] == 0) return 0.; + } + + /* Verify x is solution */ + for (int i = 0; i < m; ++i) { + int sum = 0; + for (int j = 0; j < n-1; ++j) { + sum += x[j] * get(i,j); + } + sum += get(i,n-1); + if (sum != 0) { /* Not a solution */ + return 0.; + } + } + + return sum_sqrt(x); + } + + double get_positive_solution_DFS(std::vector<int>& x, int& count, int count_limit, const std::vector<double>& x_ideal, int& ncalls) { + if (x.size() == 0) { + x.resize(n-1,0); + /* Check if a unknown is uncontrained. Happen with purely internal chords */ + int sum_rhs = 0; + vector<bool> touched(x.size(),false); + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n-1; ++j) { + int acoef = get(i,j); + if (acoef != 0) { + touched[j] = true; + } + } + sum_rhs += std::abs(get(i,n-1)); + } + for (int j = 0; j < n-1; ++j) if (!touched[j]) { + x[j] = sum_rhs / (n-1); + if (x[j] < 0) x[j] = 1; + } + } + + ncalls += 1; + if (ncalls > 1e7) { + Msg::Debug("get_positive_solution_DFS: infinite loop ? %i calls in recursion", ncalls); + return 0.; + } + if (all_strictly_positive(x)) count += 1; + if (count > count_limit) return 0.; + + /* Stop condition: x is solution and has positive score */ + double current_score = solution_score(x); + if (current_score > 0.) return current_score; + + + double best_score = 0.; + vector<int> best_x; + std::vector<int> undetermined; + /* Loop from last line to first line */ + for (int i = m-1; i >= 0; --i) { + undetermined.clear(); + /* Check line */ + int total = -1 * get(i,n-1); + for (int j = 0; j < n-1; ++j) { + int w = get(i,j); + if (w != 0) { + if (x[j] == 0) { + undetermined.push_back(j); + } else { + total -= w * x[j]; + } + } + } + if (undetermined.size() == 0) { + if (total == 0) { + continue; + } else { + return 0.; + } + } + + /* Fix one value and make recursive call */ + if (undetermined.size() == 1) { + int j = undetermined[0]; + int w = get(i,j); + if (total % w == 0) { + int candidate = total / w; + if (candidate < 1) return 0.; + vector<int> x2 = x; + x2[j] = candidate; + double sub_score = get_positive_solution_DFS(x2, count, count_limit, x_ideal, ncalls); + if (sub_score > 0.) { /* Found a solution ! Return this one */ + x = x2; + return sub_score; + } + } + } else { + double sum = 0.; + for (size_t k = 0; k < undetermined.size(); ++k) { + int j = undetermined[k]; + int w = get(i,j); + sum += std::abs(w); + } + for (size_t k = 0; k < undetermined.size(); ++k) { + int j = undetermined[k]; + int w = get(i,j); + double ideal_repartition = 1./sum * double(total); + int xmin = 1; + int xmax = int(double(total) / double(w)); + if (xmax < xmin) return 0.; + if ((size_t)j < x_ideal.size()) { + ideal_repartition = x_ideal[j]; + } + + vector<std::pair<double,int> > prio_candidate; + if (xmax == xmin) { + prio_candidate.push_back({0.,xmin}); + } else { + for (int candidate = xmin; candidate < xmax+1; ++candidate) { + double dist = std::pow(ideal_repartition-candidate,2); + prio_candidate.push_back({dist,candidate}); + } + } + + // TODO: better priority, see 2 corner cases + std::sort(prio_candidate.begin(),prio_candidate.end()); + vector<int> x2; + for (size_t l = 0; l < prio_candidate.size(); ++l) { + int candidate = prio_candidate[l].second; + x2 = x; + x2[j] = candidate; + double sub_score = get_positive_solution_DFS(x2, count, count_limit, x_ideal, ncalls); + if (sub_score > 0.) { /* Found a solution ! Return this one */ + x = x2; + return sub_score; + } + } + } + } + } + if (best_score > 0.) { + x = best_x; + return best_score; + } + return 0.; + } + + + }; + + + + struct QuadMeshPattern { + size_t patternId; + id n = 0; + vector<id2> edges; + vector<id4> quads; /* contains edge id's, not vertex ! */ + vector<id4> qvertices; + vector<bool> vOnBdr; + vector<id> eChordId; + vector<vector<id> > v2e; + vector<vector<id> > e2f; + vector<vector<id> > chords; + vector<vector<id> > sides; + id ncorners; + + bool load(size_t pId, const std::vector<id4>& quadVertices) { + patternId = pId; + ncorners = 0; + edges.reserve(2*quadVertices.size()); + quads.reserve(quadVertices.size()); + unordered_map<id2,id,id2hash> vpair2e; + n = 0; + for (size_t f = 0; f < quadVertices.size(); ++f) { + id4 quad; + for (size_t le = 0; le < 4; ++le) { + id v1 = quadVertices[f][le]; + id v2 = quadVertices[f][(le+1)%4]; + n = std::max(n,v1+1); + id2 oedge = {v1,v2}; + id2 vpair = sorted(v1,v2); + auto it = vpair2e.find(vpair); + id e = 0; + if (it == vpair2e.end()) { + e = edges.size(); + edges.push_back(oedge); + vpair2e[vpair] = e; + } else { + e = it->second; + } + quad[le] = e; + } + quads.push_back(quad); + qvertices.push_back(quadVertices[f]); + } + v2e.resize(n); + for (size_t e = 0; e < edges.size(); ++e) { + v2e[edges[e][0]].push_back(e); + v2e[edges[e][1]].push_back(e); + } + e2f.resize(edges.size()); + for (size_t f = 0; f < quads.size(); ++f) { + for (size_t le = 0; le < 4; ++le) { + e2f[quads[f][le]].push_back(f); + } + } + vOnBdr.resize(n,false); + for (size_t e = 0; e < e2f.size(); ++e) if (e2f[e].size() == 1) { + vOnBdr[edges[e][0]] = true; + vOnBdr[edges[e][1]] = true; + } + + { /* Build chords of the quad mesh */ + chords.clear(); + eChordId.resize(edges.size(),NO_ID); + vector<id> chordEdges; + for (size_t e = 0; e < edges.size(); ++e) if (eChordId[e] == NO_ID) { + chordEdges.clear(); + bool ok = build_quad_chord(quads, e2f, e, chordEdges); + if (!ok) return false; + for (id e: chordEdges) { + eChordId[e] = chords.size(); + } + chords.push_back(chordEdges); + } + } + + { /* Build the boundary sides (seperated by convex corners) */ + sides.clear(); + vector<id>* cur_side = NULL; + for (id v0 = 0; v0 < n; ++v0) if (vOnBdr[v0] && v2e[v0].size() == 2) { + id v = v0; + id e = NO_ID; + do { + if (v2e[v].size() == 2) { /* concave corner */ + sides.resize(sides.size()+1); + cur_side = &sides.back(); + ncorners += 1; + } + for (id ee: v2e[v]) if (ee != e && e2f[ee].size() == 1) { + if (edges[ee][0] == v) { /* assume edges are ordered on bdr */ + e = ee; break; + } + } + if (e == NO_ID) { + Msg::Error("load, edge not found !"); + return false; + } + cur_side->push_back(e); + id v2 = (edges[e][0] != v) ? edges[e][0] : edges[e][1]; + v = v2; + } while (v != v0); + break; + } + if (cur_side == NULL) { /* No convex corner, should be disk disk */ + sides.resize(sides.size()+1); + cur_side = &sides.back(); + for (id v0 = 0; v0 < n; ++v0) if (vOnBdr[v0] && v2e[v0].size() == 3) { + id v = v0; + id e = NO_ID; + do { + for (id ee: v2e[v]) if (ee != e && e2f[ee].size() == 1) { + if (edges[ee][0] == v) { /* assume edges are ordered on bdr */ + e = ee; break; + } + } + if (e == NO_ID) { + Msg::Error("load, edge not found !"); + return false; + } + cur_side->push_back(e); + id v2 = (edges[e][0] != v) ? edges[e][0] : edges[e][1]; + v = v2; + } while (v != v0); + break; + } + } + if (cur_side == NULL) return false; + } + + return true; + } + }; + + double patternIrregularity(const QuadMeshPattern& M) { + double irreg = 0.; + for (size_t i = 0; i < M.n; ++i) if (!M.vOnBdr[i]) { + irreg += std::pow(double(M.v2e[i].size())-4.,2); + } + return irreg; + } + + double checkPatternMatching(const QuadMeshPattern& P, const std::vector<size_t>& sideSizes, vector<int>& slt) { + slt.clear(); + size_t N = sideSizes.size(); + bool possible = true; + for (size_t s = 0; s < N; ++s) { + if (sideSizes[s] < P.sides[s].size() + 1) { + /* on given side, less edges in the cavity than edges in the pattern */ + possible = false; break; + } + } + if (!possible) return 0.; + + int nvars = 0; + for (id v: P.eChordId) nvars = std::max(nvars,(int)v+1); + IMatrix mat(N,nvars+1); + for (size_t s = 0; s < N; ++s) { + for (size_t j = 0; j < P.sides[s].size(); ++j) { + id e = P.sides[s][j]; + id var = P.eChordId[e]; + mat.set(s,var,mat.get(s,var)+1); + } + mat.set(s,nvars,-1. * (sideSizes[s]-1)); + } + mat.tansform_to_row_reduced_echelon(); + + // TODO IDEA + // - give ideal_repartition to the get_positive_solution_DFS() fct ? + // to control a bit the quantization + // - other idea: use row echelon to compute null space [x_kernel, ...] and find + // solution x0 + lambda * x_kernel that maximize an objective + // function ? + vector<double> ideal_repartition; + if (P.patternId == PATTERN_2CORNERS) { + ideal_repartition.resize(P.chords.size(),0); + size_t navg = (sideSizes[0] + sideSizes[1] - 2)/2; + for (size_t j = 0; j < P.chords.size(); ++j) { + if (P.chords[j].size() == 3) { + ideal_repartition[j] = 0.95 * navg; + } else if (P.chords[j].size() == 4) { + ideal_repartition[j] = 0.05 * navg; + } else { + Msg::Error("setting ideal_repartition for PATTERN_2CORNERS, should not happen"); + } + } + } else if (P.patternId == PATTERN_DISK) { + // TODO: detect circular chord and use a smaller ideal_repartition on it + } + double score = 0.; + slt.clear(); + int count = 0; + int count_limit = 100; /* limit on the number of solution tried in the DFS */ + int ncalls = 0; + score = mat.get_positive_solution_DFS(slt, count, count_limit, ideal_repartition, ncalls); + + return score; + } + + + double checkPatternMatchingWithRotations(const QuadMeshPattern& P, const std::vector<size_t>& sideSizes, int& rotation) { + size_t N = sideSizes.size(); + if (P.sides.size() != N) return 0.; + + vector<size_t> ssr = sideSizes; + vector<int> slt; + + double best = 0.; + int rot = 0; + + /* Initial config */ + { + double match = checkPatternMatching(P, ssr, slt); + if (match > best) { + best = match; + rotation = rot; + } + } + + /* Forward rotation */ + for (size_t r = 1; r < ssr.size(); ++r) { + rot += 1; + std::rotate(ssr.begin(),ssr.begin()+1,ssr.end()); + double match = checkPatternMatching(P, ssr, slt); + if (match > best) { + best = match; + rotation = rot; + } + } + + /* Try in reverse order */ + rot = 0; + ssr = sideSizes; + std::reverse(ssr.begin(),ssr.end()); + for (size_t r = 1; r < ssr.size(); ++r) { + rot -= 1; + std::rotate(ssr.begin(),ssr.begin()+1,ssr.end()); + double match = checkPatternMatching(P, ssr, slt); + if (match > best) { + best = match; + rotation = rot; + } + } + + + return best; + } + + std::vector<MVertex*> createVertices (GFace* gf, MVertex *v1, MVertex *v2, int n, + std::vector<MVertex*>& newVertices){ + bool haveParam = gf->haveParametrization(); + std::vector<MVertex*> r; + r.push_back(v1); + double uv1[2] = {0.,0.}; + double uv2[2] = {0.,0.}; + if (haveParam) { + setVertexGFaceUV(gf, v1, uv1); + setVertexGFaceUV(gf, v2, uv2); + } + for (int i=1;i<n;i++){ + double xi = (double)i/n; + SPoint3 p ((1.-xi)*v1->x()+xi*v2->x(),(1.-xi)*v1->y()+xi*v2->y(),(1.-xi)*v1->z()+xi*v2->z()); + double uv[2] = {0.,0.}; + if (haveParam) { + uv[0] = (1.-xi)*uv1[0]+xi*uv2[0]; + uv[1] = (1.-xi)*uv1[1]+xi*uv2[1]; + } + MVertex *vNew = new MFaceVertex(p.x(),p.y(),p.z(),gf,uv[0],uv[1]); + newVertices.push_back(vNew); + r.push_back(vNew); + } + r.push_back(v2); + return r; + } + + std::vector<MVertex*> reverseVector (const std::vector<MVertex*> &v){ + std::vector<MVertex*> r; + for (size_t i=0;i<v.size();i++)r.push_back(v[v.size() - 1 - i]); + return r; + } + + void createQuadPatch (GFace* gf, + const std::vector<MVertex*> &s1, + const std::vector<MVertex*> &s2, + const std::vector<MVertex*> &s3, + const std::vector<MVertex*> &s4, + std::vector<MElement*>& newQuads, + std::vector<MVertex*>& newVertices){ + + bool haveParam = gf->haveParametrization(); + + std::vector<MVertex*> s3r = reverseVector(s3); + std::vector<MVertex*> s4r = reverseVector(s4); + std::vector< std::vector<MVertex*> > grid(s1.size()); + for (size_t i = 0; i < grid.size(); ++i) grid[i].resize(s2.size(),NULL); + grid.front() = s4r; + grid.back() = s2; + + /* Fill the interior with transfinite interpolation */ + if (s1.size() > 2) { + SVector3 c00 = s1[0]->point(); + SVector3 c10 = s2[0]->point(); + SVector3 c11 = s3[0]->point(); + SVector3 c01 = s4[0]->point(); + for (size_t i=1; i < s1.size()-1; i++){ + grid[i][0] = s1[i]; + grid[i].back() = s3r[i]; + + if (s2.size() <= 2) continue; + + double u = double(i) / double(s1.size()-1.); + SVector3 s1u = s1[i]->point(); + SVector3 s3u = s3r[i]->point(); + + for (size_t j=1; j < s2.size()-1; j++){ + double v = double(j) / double(s2.size()-1.); + SVector3 s2v = s2[j]->point(); + SVector3 s4v = s4r[j]->point(); + + SVector3 p = (1.-v) * s1u + v * s3u + (1.-u) * s4v + u * s2v + - ((1.-u)*(1.-v)*c00 + u*v*c11 + u * (1.-v) * c10 + (1.-u)*v*c01); + double uv[2] = {0.,0.}; + MVertex *vNew = new MFaceVertex(p.x(),p.y(),p.z(),gf,uv[0],uv[1]); + newVertices.push_back(vNew); + grid[i][j] = vNew; + } + } + } + + for (size_t i=0;i<grid.size()-1;i++){ + for (size_t j=0;j<grid[i].size()-1;j++){ + MQuadrangle *q = new MQuadrangle (grid[i][j],grid[i+1][j],grid[i+1][j+1],grid[i][j+1]); + newQuads.push_back(q); + } + } + } + + + bool addQuadsAccordingToPattern( + const QuadMeshPattern& P, + const std::vector<int>& quantization, + GFace* gf, + const std::vector<std::vector<MVertex*> >& sides, /* vertices on the boundary, not changed */ + std::vector<MVertex*>& newVertices, /* new vertices inside the cavity */ + std::vector<MElement*>& newElements, /* new quads inside the cavity */ + MVertex* oldCenter = NULL /* initial guess for new positions */ + ) { + constexpr bool DBG_VIZU = false; + if (P.sides.size() != sides.size()) { + Msg::Error("wrong input sizes ... pattern: %li sides, input: %li sides", P.sides.size(),sides.size()); + return false; + } + + unordered_map<id2, std::vector<MVertex*>,id2hash> vpair2vertices; + std::vector<MVertex*> v2mv(P.n,NULL); + std::vector<MVertex*> vert; + + /* Associate exising vertices to pattern sides */ + SVector3 center(0.,0.,0.); + if (oldCenter) { + center = oldCenter->point(); + } else { + double csum = 0.; + for (size_t s = 0; s < sides.size(); ++s) { + for (size_t k = 0; k < sides[s].size(); ++k) { + center += sides[s][k]->point(); + csum += 1.; + } + } + if (csum == 0.) return false; + center = 1./csum * center; + } + + for (size_t s = 0; s < P.sides.size(); ++s) { + size_t pos = 0; + size_t sp = 0; + for (size_t j = 0; j < P.sides[s].size(); ++j) { + sp += quantization[P.eChordId[P.sides[s][j]]]; + } + if (sp + 1 != sides[s].size()) { + return false; + } + for (size_t j = 0; j < P.sides[s].size(); ++j) { + id e = P.sides[s][j]; + int n_e = quantization[P.eChordId[e]]; + vert.resize(n_e+1); + for (size_t k = 0; k < (size_t) n_e+1; ++k) { + if (pos+k>=sides[s].size()) { + Msg::Error("issue, pos=%li + k=%li = %li >= sides[s].size()=%li", pos, k, pos+k, sides[s].size()); + return false; + } + vert[k] = sides[s][pos+k]; + } + pos += n_e; + id v1 = P.edges[e][0]; + id v2 = P.edges[e][1]; + if (v2mv[v1] == NULL) v2mv[v1] = vert.front(); + if (v2mv[v2] == NULL) v2mv[v2] = vert.back(); + + id2 vpair = sorted(v1,v2); + if (v1 < v2) { + vpair2vertices[vpair] = vert; + } else { + std::reverse(vert.begin(),vert.end()); + vpair2vertices[vpair] = vert; + } + } + } + + /* Create vertices on internal points */ + for (size_t v = 0; v < P.n; ++v) if (!P.vOnBdr[v]) { + GPoint pp; + if (oldCenter) { + double uv[2]; + oldCenter->getParameter(0,uv[0]); + oldCenter->getParameter(1,uv[1]); + pp = GPoint(center.x(),center.y(),center.z(),gf,uv[0],uv[1]); + } else { + pp = GPoint(center.x(),center.y(),center.z(),gf,0,0); + } + + bool moveTowardBdr = true; + if (moveTowardBdr) { + double vsum = 10.; /* weight on center */ + SVector3 avg(vsum*pp.x(),vsum*pp.y(),vsum*pp.z()); + for (size_t e: P.v2e[v]) { + size_t v2 = (P.edges[e][0] != v) ? P.edges[e][0] : P.edges[e][1]; + if (P.vOnBdr[v2]) { + SVector3 p2 = v2mv[v2]->point(); + avg += p2; + vsum += 1; + } + } + if (vsum > 1) { + pp.x() = avg.x() / vsum; + pp.y() = avg.y() / vsum; + pp.z() = avg.z() / vsum; + } + } + + double uv[2] = {0.,0.}; + MVertex *sing = new MFaceVertex(pp.x(),pp.y(),pp.z(),gf,pp.u(),pp.v()); + GPoint proj = gf->closestPoint(sing->point(),uv); + if (proj.succeeded()) { + sing->x() = proj.x(); + sing->y() = proj.y(); + sing->z() = proj.z(); + sing->setParameter(0,proj.u()); + sing->setParameter(1,proj.v()); + } + + newVertices.push_back(sing); + bool irregular = (P.v2e[v].size() != 4); + v2mv[v] = sing; + } + + /* Create vertices on internal curves */ + for (size_t e = 0; e < P.edges.size(); ++e) if (P.e2f[e].size() == 2) { + id v1 = P.edges[e][0]; + id v2 = P.edges[e][1]; + MVertex* mv1 = v2mv[v1]; + MVertex* mv2 = v2mv[v2]; + if (mv1 == NULL || mv2 == NULL) { + Msg::Error("MVertex* not found ?"); + return false; + } + int n_e = quantization[P.eChordId[e]]; + id2 vpair = sorted(v1,v2); + if (v1 < v2) { + vpair2vertices[vpair] = createVertices (gf, mv1, mv2, n_e, newVertices); + } else { + vpair2vertices[vpair] = createVertices (gf, mv2, mv1, n_e, newVertices); + } + } + + /* Create vertices inside the quad patches */ + for (size_t f = 0; f < P.quads.size(); ++f) { + std::vector<std::vector<MVertex*> > quadCurves(4); + for (size_t le = 0; le < 4; ++le) { + id v0 = P.qvertices[f][le]; + id v1 = P.qvertices[f][(le+1)%4]; + id2 vpair = sorted(v0,v1); + auto it = vpair2vertices.find(vpair); + if (it == vpair2vertices.end()) { + Msg::Error("MVertex* vector not found for vertex pair (edge in pattern)"); + return false; + } + quadCurves[le] = it->second; + if (v1 < v0) { + std::reverse(quadCurves[le].begin(),quadCurves[le].end()); + } + } + createQuadPatch(gf, quadCurves[0], quadCurves[1], quadCurves[2], quadCurves[3], newElements, newVertices); + } + + return true; + } + + void clearStuff(std::vector<MVertex*>& newVertices, + std::vector<MElement*>& newElements) { + for (MVertex*& v: newVertices) if (v != NULL) { + delete v; + v = NULL; + } + newVertices.clear(); + for (MElement*& e: newElements) if (e != NULL) { + delete e; + e = NULL; + } + newElements.clear(); + } + + template<class T> + void remove_element_if_inside(const T& value, std::vector<T>& vec) { + auto it = std::find(vec.begin(),vec.end(),value); + if (it != vec.end()) { + vec.erase(it); + } + } + + struct QuadqsContext { + bool optimizeTopology = true; + bool optimizeGeometry = true; + unordered_map<std::string,double> stats; + double timeoutQuadqsPerGFace = DBL_MAX; + double timeoutQuadqsPerGFaceCavity = DBL_MAX; + double timeoutGeomOptimPerGFace = DBL_MAX; + }; + + struct QuadqsGFaceContext { + /* Options (all timings in seconds) */ + double timeoutQuadqsPerGFace = DBL_MAX; + double timeoutQuadqsPerGFaceCavity = DBL_MAX; + double timeoutGeomOptimPerGFace = DBL_MAX; + bool invertNormalsForQuality = false; + size_t nTryMaxPerVertex = 2; + size_t nTryCloseReset = 5; + SurfaceProjector* sp = nullptr; + /* Stats on execution */ + double t0 = 0.; + size_t nSingCavityRemesh = 0; + size_t nQuadCavityRemesh = 0; + bool finished = false; + + /* Functions */ + QuadqsGFaceContext(const QuadqsContext& qqs) { + timeoutQuadqsPerGFace = qqs.timeoutQuadqsPerGFace; + timeoutQuadqsPerGFaceCavity = qqs.timeoutQuadqsPerGFaceCavity; + timeoutGeomOptimPerGFace = qqs.timeoutGeomOptimPerGFace; + t0 = Cpu(); + } + + double elapsedCpuTime() const { + return Cpu() - t0; + } + }; + + enum GrowthPolicy { + GROW_MINIMAL, + GROW_MAXIMAL, + }; + + const uint32_t NO_U32 = (uint32_t) -1; + + struct RemeshableCavity { + std::vector<MElement*> elements; + std::vector<std::vector<MVertex*> > sides; + std::vector<MVertex*> intVertices; + double irregularityMeasure = 0; + uint32_t nIrregular = 0; // # irregular vertices outside allowed ones + std::pair<size_t,int> patternNoAndRot = {(size_t)-1,0}; + }; + + struct GrowingCavity { + std::vector<bool> quadIsInside; /* fixed size: farmer.quads.size() */ + std::vector<uint32_t> quadEdgeIsBdr; /* fixed size: 4*farmer.quads.size() */ + unordered_set<uint32_t> verticesInt; /* growing with cavity */ + unordered_set<uint32_t> verticesBdr; /* growing with cavity */ + unordered_set<uint32_t> elements; /* growing with cavity */ + /* nb of irregular vertices strictly inside cavity (include singularities) */ + uint32_t nIrregInterior = 0; + + void clear() { + quadIsInside.clear(); + quadEdgeIsBdr.clear(); + verticesInt.clear(); + verticesBdr.clear(); + elements.clear(); + nIrregInterior = 0; + } + }; + + struct CavityFarmer { /* the guy who grows cavities */ + public: + GFace* gf = nullptr; + + /* contiguous representation of the GFace quad mesh */ + std::vector<MVertex*> vertices; + unordered_map<MVertex*,uint32_t> vertexLocal; + std::vector<MQuadrangle*> quadrangles; + unordered_map<MQuadrangle*,uint32_t> quadLocal; + std::vector<std::array<uint32_t,4> > quads; + + /* quad adjacency information */ + std::vector<uint32_t> adjacent; /* adjacent[4*q1+le1] = 4*q2+le2 */ + std::vector<uint32_t> v2q_first; /* vertex to quads */ + std::vector<uint32_t> v2q_values; /* vertex to quads */ + + GrowingCavity cav; /* current cavity */ + GrowingCavity cavBackup; /* potential extension */ + + /* growth constraints */ + std::vector<bool> vertexForbidden; + std::vector<bool> quadEdgeForbidden; + + public: + CavityFarmer(GFace* gf_):gf(gf_) {}; + + void clear() { + vertices.clear(); + vertexLocal.clear(); + quadrangles.clear(); + quadLocal.clear(); + quads.clear(); + adjacent.clear(); + v2q_first.clear(); + v2q_values.clear(); + vertexForbidden.clear(); + quadEdgeForbidden.clear(); + cav.clear(); + cavBackup.clear(); + } + + void debug_show_cavity(const std::string& name, bool light = true) { + std::vector<MElement*> elts; + for (uint32_t f: cav.elements) { + elts.push_back(quadrangles[f]); + } + if (light) { + GeoLog::add(elts,name); + return; + } + GeoLog::add(elts,name+"_cav.elements"); + std::vector<array<double,3> > interior; + std::vector<array<double,3> > bdr; + for (uint32_t v: cav.verticesInt) { + interior.push_back(vertices[v]->point()); + } + for (uint32_t v: cav.verticesBdr) { + bdr.push_back(vertices[v]->point()); + } + GeoLog::add(interior,0.,name+"_cav.verticesInt"); + GeoLog::add(bdr,1.,name+"_cav.verticesBdr"); + + std::vector<MElement*> elts2; + for (size_t f = 0; f < quadrangles.size(); ++f) if (cav.quadIsInside[f]) { + elts2.push_back(quadrangles[f]); + } + GeoLog::add(elts2,name+"_cav.quadIsInside"); + for (size_t f = 0; f < quadrangles.size(); ++f) { + for (size_t le = 0; le < 4; ++le) { + if (cav.quadEdgeIsBdr[4*f+le]) { + uint32_t v1 = quads[f][le]; + uint32_t v2 = quads[f][(le+1)%4]; + std::vector<array<double,3> > bdrEdges = {vertices[v1]->point(), vertices[v2]->point()}; + GeoLog::add(bdrEdges,0.,name+"_cav.quadEdgeIsBdr"); + } + } + } + GeoLog::flush(); + } + + bool updateFarmer(GFace* gf) { + /* assume coherent orientation of quads in GFace */ + clear(); + std::vector<uint32_t> valence; + vertices.reserve(2*gf->mesh_vertices.size()); + valence.reserve(2*gf->mesh_vertices.size()); + quads.reserve(gf->quadrangles.size()); + quadrangles = gf->quadrangles; + for (size_t f = 0; f < quadrangles.size(); ++f) { + MQuadrangle* q = quadrangles[f]; + quadLocal[q] = f; + array<uint32_t,4> quad; + for (size_t lv = 0; lv < 4; ++lv) { + MVertex* v = q->getVertex(lv); + auto it = vertexLocal.find(v); + if (it != vertexLocal.end()) { + uint32_t nv = it->second; + quad[lv] = nv; + valence[nv] += 1; + } else { + uint32_t nv = vertices.size(); + vertices.push_back(v); + valence.push_back(1); + vertexLocal[v] = nv; + quad[lv] = nv; + } + } + quads.push_back(quad); + } + + /* Build the vertex to quads adjacencies */ + v2q_first.resize(vertices.size()+1,0); + for (uint32_t v = 0; v < vertices.size(); ++v) { + v2q_first[v+1] = v2q_first[v] + valence[v]; + } + v2q_values.resize(v2q_first.back(), NO_U32); + for (uint32_t f = 0; f < quads.size(); ++f) { + for (uint32_t lv = 0; lv < 4; ++lv) { + const uint32_t v = quads[f][lv]; + const uint32_t begin = v2q_first[v]; + const uint32_t end = v2q_first[v+1]; + bool foundSlot = false; + for (uint32_t pos = begin; pos < end; ++pos) { + if (v2q_values[pos] == NO_U32) { + v2q_values[pos] = f; + foundSlot = true; + break; + } + } + if (!foundSlot) { + Msg::Error("cavity farmer: no slot found !"); + return false; + } + } + } + + /* Build the quad to quads adjacencies */ + adjacent.resize(4*quads.size(),NO_U32); + for (uint32_t f = 0; f < quads.size(); ++f) { + for (uint32_t le = 0; le < 4; ++le) { + if (adjacent[4*f+le] != NO_U32) continue; + const uint32_t v1 = quads[f][le]; + const uint32_t v2 = quads[f][(le+1)%4]; + const uint32_t begin = v2q_first[v1]; + const uint32_t end = v2q_first[v1+1]; + for (uint32_t pos = begin; pos < end; ++pos) { + const uint32_t f2 = v2q_values[pos]; + for (uint32_t le2 = 0; le2 < 4; ++le2) { + const uint32_t av1 = quads[f2][le2]; + const uint32_t av2 = quads[f2][(le2+1)%4]; + if (av1 == v2 && av2 == v1) { + adjacent[4*f+le] = 4*f2+le2; + adjacent[4*f2+le2] = 4*f+le; + break; + } + } + if (adjacent[4*f+le] != NO_U32) break; + } + } + } + + /* Embedded edges in faces */ + for (GEdge* ge: gf->embeddedEdges()) { + unordered_set<id2,id2hash> embLines; + for (MLine* line: ge->lines) { + MVertex* v1 = line->getVertex(0); + MVertex* v2 = line->getVertex(1); + auto it1 = vertexLocal.find(v1); + auto it2 = vertexLocal.find(v2); + if (it1 == vertexLocal.end() || it2 == vertexLocal.end()) { + Msg::Debug("cavity farmer update: vertex of embedded line not found, weird"); + continue; + } + id2 vpair = sorted(it1->second,it2->second); + embLines.insert(vpair); + } + if (embLines.size() == 0) continue; + if (quadEdgeForbidden.size() == 0) { + quadEdgeForbidden.resize(4*quads.size(),false); + for (uint32_t f = 0; f < quads.size(); ++f) { + for (uint32_t le = 0; le < 4; ++le) { + const uint32_t v1 = quads[f][le]; + const uint32_t v2 = quads[f][(le+1)%4]; + id2 vpair = sorted(v1,v2); + auto it = embLines.find(vpair); + if (it != embLines.end()) { + quadEdgeForbidden[4*f+le] = true; + } + } + } + } + } + + return true; + } + + bool vertexValence(uint32_t v, uint32_t& valIn, uint32_t& valOut, uint32_t* qOut = nullptr) { + valIn = 0; + valOut = 0; + if (v >= v2q_first.size()) { + Msg::Error("vertexValence: incoherent state"); + return false; + } + const uint32_t begin = v2q_first[v]; + const uint32_t end = v2q_first[v+1]; + for (uint32_t pos = begin; pos < end; ++pos) { + const uint32_t f = v2q_values[pos]; + if (f == NO_U32) continue; + if (cav.quadIsInside[f]) { + valIn += 1; + } else { + valOut += 1; + if (qOut != nullptr) { + *qOut = f; + } + } + } + return true; + } + + /* slow, do not call often */ + bool vertexAdjacentQuads(MVertex* vp, std::vector<MQuadrangle*>& adjQuads) { + auto it = vertexLocal.find(vp); + if (it == vertexLocal.end()) { + return false; + } + const uint32_t v = it->second; + const uint32_t begin = v2q_first[v]; + const uint32_t end = v2q_first[v+1]; + const uint32_t n = end-begin; + adjQuads.resize(n); + for (uint32_t i = 0; i < n; ++i) { + const uint32_t f = v2q_values[begin+i]; + adjQuads[i] = quadrangles[f]; + } + return adjQuads.size() > 0; + } + + /* warning: when false is returned, the current cavity + * is no longer valid and it should be discarded + * or repaired by a external backup */ + bool addQuads(const std::vector<uint32_t>& toAdd, bool checkForbidden = true) { + vector<uint32_t> touched; + touched.reserve(4*toAdd.size()); + for (uint32_t f: toAdd) { + if (cav.quadIsInside[f] == false) { + cav.quadIsInside[f] = true; + cav.elements.insert(f); + } else { + Msg::Error("cavity farmer: quad already in cavity, should not happen"); + return false; + } + for (size_t le = 0; le < 4; ++le) { + touched.push_back(quads[f][le]); + uint32_t opp = adjacent[4*f+le]; + if (cav.quadEdgeIsBdr[4*f+le]) { + Msg::Error("cavity farmer: quad edge already cavity bdr, should not happen"); + return false; + } else if (opp != NO_U32 && cav.quadEdgeIsBdr[opp]) { + /* adjacent quad was in cavity and boundary */ + + if (checkForbidden && quadEdgeForbidden.size() > 0) { + /* check if adding the quad would include a forbidden quad edge */ + if (quadEdgeForbidden[4*f+le]) return false; + } + + /* adjacent quad was in cavity and boundary => no longer boundary */ + cav.quadEdgeIsBdr[opp] = false; + } else { + /* adjacent quad edge was not cavity bdr, this one becomes one */ + cav.quadEdgeIsBdr[4*f+le] = true; + } + } + } + sort_unique(touched); + + for (uint32_t v: touched) { + uint32_t valIn, valOut; + vertexValence(v, valIn, valOut); + if (valOut > 0) { + cav.verticesBdr.insert(v); + } else if (valOut == 0 && valIn > 0) { + MVertex* pv = vertices[v]; + GFace* pgf = pv->onWhat()->cast2Face(); + if (pgf != nullptr) { /* vertex inside GFace */ + auto it = cav.verticesInt.find(v); + if (it == cav.verticesInt.end()) { /* New interior */ + if (checkForbidden && vertexForbidden[v]) { + return false; + } + cav.verticesInt.insert(v); + + if (valIn != 4) { + cav.nIrregInterior += 1; + } + + /* remove from boundary*/ + auto itb = cav.verticesBdr.find(v); + if (itb != cav.verticesBdr.end()) { + cav.verticesBdr.erase(itb); + } + } + } else { /* vertex on GFace boundary */ + cav.verticesBdr.insert(v); + } + } else { + Msg::Error("cavity farmer: incoherent vertex state in addQuads"); + return false; + } + } + + return true; + } + + + double cavityIrregularity(uint32_t& nIrregular, uint32_t& nConvexCorners) { + nIrregular = 0; + nConvexCorners = 0; + double ir = 0.; + for (uint32_t v: cav.verticesInt) { + uint32_t valIn, valOut; + vertexValence(v, valIn, valOut); + if (valOut) { + Msg::Error("weird: cavity interior vertex has valence-out=%i",valOut); + } + if (valIn != 4) { + ir += std::pow(valIn-4.,2); + nIrregular += 1; + } + } + for (uint32_t v: cav.verticesBdr) { + uint32_t valIn, valOut; + vertexValence(v, valIn, valOut); + if (valIn == 1) { + nConvexCorners += 1; + } else if (valIn > 2) { + /* inside-valence 3+ on cavity boundary will be eliminated + * inside-valence 1 is a cavity corner, does not count as irregular here*/ + nIrregular += 1; + ir += std::pow(valIn-2.,2); + } + } + return ir; + } + + bool isValidConvexCavity() { + for (uint32_t v: cav.verticesBdr) { + uint32_t valIn, valOut; + vertexValence(v, valIn, valOut); + if (valOut == 1) { + MVertex* vp = vertices[v]; + GFace* gf = vp->onWhat()->cast2Face(); + if (gf != nullptr) { + /* Concave cavity corner, inside the surface mesh */ + return false; + } + } else if (valOut >= 3) { + MVertex* vp = vertices[v]; + GVertex* gv = vp->onWhat()->cast2Vertex(); + if (gv != nullptr) { + /* CAD corner, valence is superior or equal to three, should not be absorbed in cavity */ + return false; + } + } else if (valIn == 3 && valOut == 2 && vertexForbidden[v]) { + /* Would change a valence 5 singularity into a regular vertex */ + return false; + } + } + + return true; + } + + bool convexify(bool checkForbidden = true) { + bool running = true; + while (running) { + running = false; + std::vector<uint32_t> quadsAtConcavities; + for (uint32_t v: cav.verticesBdr) { + uint32_t valIn, valOut; + uint32_t qOut = NO_U32; + vertexValence(v, valIn, valOut, &qOut); + /* Add exterior quad if cavity bdr vertex out-valence is one + * and cavity bdr vertex is inside the GFace */ + if (valOut == 1) { + GFace* pgf = vertices[v]->onWhat()->cast2Face(); + if (pgf == nullptr) continue; + quadsAtConcavities.push_back(qOut); + } + } + if (quadsAtConcavities.size() > 0) { + sort_unique(quadsAtConcavities); + bool oka = addQuads(quadsAtConcavities, checkForbidden); + if (!oka) return false; + running = true; + } + } + return isValidConvexCavity(); + } + + bool getCavitySides(uint32_t& Ncorners, + std::vector<std::vector<uint32_t> >& sides) { + + /* Prepare the cavity boundary edges to make + * a continuous loop on them */ + vector<uint32_t> pos2vertex; + vector<uint32_t> vertex2pos(vertices.size(),NO_U32); /* allocation outside ? */ + vector<uint32_t> pos2nextVertex; + vector<bool> isCorner; + pos2vertex.reserve(cav.verticesBdr.size()); + pos2vertex.reserve(cav.verticesBdr.size()); + isCorner.reserve(cav.verticesBdr.size()); + uint32_t v0 = NO_U32; + + for (uint32_t v: cav.verticesBdr) { + uint32_t n = v2q_first[v+1]-v2q_first[v]; + int edgeFound = 0; + for (uint32_t lq = 0; lq < n; ++lq) { + uint32_t q = v2q_values[v2q_first[v]+lq]; + if (!cav.quadIsInside[q]) continue; + for (uint32_t le = 0; le < 4; ++le) { + if (quads[q][le] == v && cav.quadEdgeIsBdr[4*q+le]) { + edgeFound += 1; + if (edgeFound == 1) { /* edgeFound >= 2 means non manifold */ + uint32_t v2 = quads[q][(le+1)%4]; + if (vertex2pos[v] != NO_U32) { + Msg::Debug("cavity farmer: get sides, vertex already assigned, not manifold bdr loop"); + return false; + } + vertex2pos[v] = pos2vertex.size(); + pos2vertex.push_back(v); + pos2nextVertex.push_back(v2); + uint32_t valIn, valOut; + vertexValence(v, valIn, valOut); + if (valIn == 1) { + isCorner.push_back(true); + Ncorners += 1; + if (v0 == NO_U32) { + v0 = v; + } else { + /* deterministic choice of the start */ + size_t num0 = vertices[v0]->getNum(); + size_t num = vertices[v]->getNum(); + if (num < num0) { + v0 = v; + } + } + } else { + isCorner.push_back(false); + } + } + } + } + } + if (edgeFound == 0) { + Msg::Error("cavity sides: cavity bdr edge not found around vertex %i, shoud NOT happen", v); + return false; + } else if (edgeFound >= 2) { + Msg::Debug("cavity sides: found %i cavity bdr edge, bdr loop is not manifold", edgeFound); + return false; + } + } + if (pos2vertex.size() == 0) { + return false; + } + + if (v0 == NO_U32) { + /* No corner, the cavity is a disk */ + v0 = pos2vertex[0]; + sides.resize(1); + sides[0].push_back(v0); + } + + /* Propagation along the boundary */ + uint32_t nCornerVisited = 0; + uint32_t nVertexVisited = 0; + uint32_t v = v0; + uint32_t iter = 0; + while (true) { + iter += 1; + if (iter > 2 * cav.verticesBdr.size()) { + Msg::Warning("cavity farmer, get sides: infinite loop ? iter = %i but #bdr=%li, may happen if loop not manifold", + iter, cav.verticesBdr.size()); + return false; + // debug_show_cavity("infinite_loop",false); + // gmsh::initialize(); + // GeoLog::flush(); + // gmsh::fltk::run(); + // abort(); + } + + uint32_t pos = vertex2pos[v]; + if (isCorner[pos]) { + nCornerVisited += 1; + sides.resize(sides.size()+1); + sides.back().push_back(v); + } + + uint32_t v2 = pos2nextVertex[pos]; + sides.back().push_back(v2); + v = v2; + nVertexVisited += 1; + + if (v2 == v0) { /* closed the loop */ + break; + } + } + + if (nCornerVisited != Ncorners || nVertexVisited != cav.verticesBdr.size()) { + Msg::Debug("getCavitySides: not all cavity bdr corners/vertices were visited, bdr has multiple loops (i.e. not a topo. disk)"); + + // debug_show_cavity("bad_cav_" + std::to_string(nVertexVisited) + "!=" + std::to_string(cav.verticesBdr.size())); + // GeoLog::flush(); + + return false; + } + + return true; + } + + bool growCavityStep() { + std::vector<std::vector<uint32_t> > sides; + uint32_t Ncorners = 0; + bool oks = getCavitySides(Ncorners, sides); + if (!oks) { + if (DBG_VERBOSE) {Msg::Debug("cavity farmer: grow one side, failed to build cavity boundary");} + return false; + } + + // For isotropic growth, we choose try the largest sides first, + // and we add the getNum of the first vertex for reproductibility. */ + vector<std::pair<size_t,size_t> > sizeAndSide(sides.size()); + for (size_t i = 0; i < sides.size(); ++i) { + size_t num = vertices[sides[i].front()]->getNum(); + sizeAndSide[i] = {size_t(1e7*sides[i].size()+num),i}; + } + std::sort(sizeAndSide.begin(),sizeAndSide.end()); + std::reverse(sizeAndSide.begin(),sizeAndSide.end()); + + cavBackup = cav; /* to be able to restore if candidate is not good */ + + for (size_t k = 0; k < sizeAndSide.size(); ++k) { + size_t i = sizeAndSide[k].second; + if (sides[i].size() < 2) continue; + bool candidate = true; + /* Look at side interior vertices */ + for (size_t j = 1; j < sides[i].size()-1; ++j) { + uint32_t v = sides[i][j]; + /* Check if side is touching a growth limit */ + if (vertexForbidden[v]) { + candidate = false; + break; + } + /* Check if touching a CAD corner */ + MVertex* pv = vertices[v]; + GVertex* gv = dynamic_cast<GVertex*>(pv->onWhat()); + if (gv != nullptr) { /* side touching CAD corner */ + candidate = false; + break; + } + } + + if (candidate) { + /* Build the new convex cavity by expanding on the side + * and check if it is a valid */ + + /* Add the new quads */ + size_t nAdded = 0; + std::vector<uint32_t> cQuads; + cQuads.reserve(4*sides[i].size()); + if (sides[i].size() == 2) { /* Side is one edge */ + uint32_t v1 = sides[i][0]; + uint32_t v2 = sides[i][1]; + const uint32_t begin = v2q_first[v1]; + const uint32_t end = v2q_first[v1+1]; + for (uint32_t pos = begin; pos < end; ++pos) { + const uint32_t f = v2q_values[pos]; + if (!cav.quadIsInside[f]) { + for (size_t le = 0; le < 4; ++le) { + uint32_t qv1 = quads[f][le]; + uint32_t qv2 = quads[f][(le+1)%4]; + if ((qv1 == v1 && qv2 == v2) || (qv1 == v2 && qv2 == v1)) { + cQuads.push_back(f); + break; + } + } + } + if (cQuads.size() > 0) break; + } + } else { /* Take quads adjacent to interior side vertices */ + for (size_t j = 1; j < sides[i].size()-1; ++j) { + uint32_t v = sides[i][j]; + + const uint32_t begin = v2q_first[v]; + const uint32_t end = v2q_first[v+1]; + for (uint32_t pos = begin; pos < end; ++pos) { + const uint32_t f = v2q_values[pos]; + if (!cav.quadIsInside[f]) { + cQuads.push_back(f); + } + } + } + } + if (cQuads.size() == 0) continue; + sort_unique(cQuads); + bool oka = addQuads(cQuads); + if (!oka) { /* try next side */ + if (DBG_VERBOSE) { + Msg::Debug("cavity grow one side: %li quads, side %i, FAILED to add %li quads", + cav.elements.size(), k, cQuads.size());} + cav = cavBackup; + continue; + } + + /* Convexify the cavity */ + bool okc = convexify(); + if (!okc) { /* try next side */ + if (DBG_VERBOSE) { + Msg::Debug("cavity grow one side: %li quads, side %i, FAILED to convexify after adding %li quads", + cav.elements.size(), k, cQuads.size());} + cav = cavBackup; + continue; + } + + /* Extended cavity is good, keep it */ + cavBackup.clear(); + + if (DBG_VERBOSE) { + Msg::Debug("cavity grow one side: %li quads, side %i, OK convexify (after adding %li quads)", + cav.elements.size(), k, cQuads.size());} + + return true; + } + } + if (DBG_VERBOSE) { + Msg::Debug("cavity grow one side: %li quads, tried all sides, no extension possible", + cav.elements.size());} + cav = cavBackup; + return false; + } + + + bool growCavity( + const std::vector<MQuadrangle*>& quadsInit, + GrowthPolicy policy, + const std::vector<size_t>& patternsToCheck, + const unordered_map<size_t,size_t>& patternSizeLimits, + const unordered_set<MVertex*>& allowedIrregularVertices, + const unordered_set<MVertex*>& forbiddenIrregularVertices, + RemeshableCavity& rcav){ + + /* clear current cavity */ + cav.clear(); + cavBackup.clear(); + cav.quadIsInside.resize(quads.size(),false); + cav.quadEdgeIsBdr.resize(4*quads.size(),false); + + /* constrain the growth */ + vertexForbidden.clear(); + vertexForbidden.resize(vertices.size(),false); + for (MVertex* v: forbiddenIrregularVertices) { + if (allowedIrregularVertices.find(v) != allowedIrregularVertices.end()) { + continue; + } + auto it = vertexLocal.find(v); + if (it != vertexLocal.end()) vertexForbidden[it->second] = true; + } + + /* initialize the cavity with given quads */ + vector<uint32_t> lquads; + for (MQuadrangle* q: quadsInit) { + auto it = quadLocal.find(q); + if (it == quadLocal.end()) { + Msg::Error("cavity farmer: quad not found in farmer mesh"); + return false; + } + lquads.push_back(it->second); + } + sort_unique(lquads); + + bool oka = addQuads(lquads); + if (!oka) { + // Initialization may be rejected if it includes forbidden vertices or quad edges + // (e.g. around the vertex of an embedded line) + Msg::Debug("cavity remeshing: failed to initialize (%li quads)", lquads.size()); + return false; + } + + uint32_t lastNbIrregular = 0; + bool running = true; + uint32_t iter = 0; + while (running) { + iter += 1; + /* Grow the cavity on one of its sides */ + bool okg = growCavityStep(); + // if (false) { + // std::string name = "cav" + std::to_string(ccc) + "_it" + std::to_string(iter) + "_" + std::to_string(okg); + // debug_show_cavity(name, true); + // GeoLog::flush(); + // } + if (!okg) { + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li vertices, failed to grow cavity", + iter, cav.verticesInt.size() + cav.verticesBdr.size());} + break; + } + + /* nb of irregular vertices in cavity, counting interior and boundary, and singularities */ + uint32_t curCavityNirreg = 0; + uint32_t curNcorners = 0; + double curCavityIrregularity = cavityIrregularity(curCavityNirreg, curNcorners); + /* If no new irregular vertices, continue the growth */ + if (curCavityNirreg <= lastNbIrregular) continue; + + /* Check if the cavity is topologicaly remeshable with patterns */ + std::vector<std::vector<uint32_t> > sides; /* same for the different pattern checks */ + uint32_t Ncorners = 0; + double bestIrreg = DBL_MAX; + for (size_t pId: patternsToCheck) { + /* Check pattern size limit if any */ + auto it = patternSizeLimits.find(pId); + if (it != patternSizeLimits.end() && cav.elements.size() > it->second) + continue; + + if (patternNumberOfCorners(pId) != curNcorners) { + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li quads, not right number of corners (%i)", + iter, cav.elements.size(), curNcorners);} + continue; + } + + if (pId == PATTERN_QUAD_DIAG35 || pId == PATTERN_QUAD_ALIGNED35 + || pId == PATTERN_QUAD_CHORD_UTURN) { + /* these patterns have two irregular vertices inside, no need to check + * if there are only two irregular vertices in current cavity */ + if (curCavityNirreg <= 2) continue; + } + + /* Get the sides to check if remeshable */ + if (sides.size() == 0) { /* first time, same for the next pattern checks */ + bool oks = getCavitySides(Ncorners, sides); + if (!oks) { + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li quads, failed to build cavity boundary", + iter, cav.elements.size());} + break; + } + } + + /* Number of vertices on each side, including extremities */ + std::vector<size_t> sideSizes(sides.size()); + for (size_t i = 0; i < sideSizes.size(); ++i) sideSizes[i] = sides[i].size(); + + if (pId == PATTERN_QUAD_REGULAR) { + /* two opposite sides must have same number of vertices, no need to check else */ + if (sideSizes.size() != 4) continue; + if (sideSizes[0] != sideSizes[2] || sideSizes[1] != sideSizes[3]) continue; + } + + /* Check if remeshable with pattern pId */ + double irregAfterRemeshing = 0.; /* to ensure irregularity decrease with remeshing */ + std::pair<size_t,int> par; + bool meshable = patchIsRemeshableWithQuadPattern({pId}, Ncorners, sideSizes, par, irregAfterRemeshing); + + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li quads, #sides=%li, #irregular=%i, cavityIrregularity=%f | CHECK pId %li: remeshability: %i, irregAfterRemeshing=%e (best was %e)", + iter, cav.elements.size(), sides.size(), curCavityNirreg, curCavityIrregularity, pId, meshable, irregAfterRemeshing, bestIrreg);} + + if (!meshable) continue; + if (irregAfterRemeshing >= bestIrreg) { + if (DBG_VERBOSE) {Msg::Debug("------- discard because irregAfterRemeshing=%f >= bestIrreg=%f", + irregAfterRemeshing, bestIrreg);} + continue; + } + if (irregAfterRemeshing >= curCavityIrregularity) { + if (DBG_VERBOSE) {Msg::Debug("------- discard because irregAfterRemeshing=%f >= curCavityIrregularity=%f", + irregAfterRemeshing, curCavityIrregularity);} + continue; + } + + { /* set last remeshable cavity */ + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li quads, set new remeshable cavity (irregAfterRemeshing=%f)", + iter, cav.elements.size(), irregAfterRemeshing);} + bestIrreg = irregAfterRemeshing; + lastNbIrregular = curCavityNirreg; + + /* set last remeshable cavity */ + rcav.irregularityMeasure = irregAfterRemeshing; + rcav.nIrregular = curCavityNirreg; + rcav.patternNoAndRot = par; + /* - convert local indices to gmsh elements */ + rcav.elements.clear(); + rcav.elements.reserve(cav.elements.size()); + for (uint32_t f: cav.elements) { + rcav.elements.push_back(quadrangles[f]); + } + rcav.intVertices.clear(); + rcav.intVertices.reserve(cav.verticesInt.size()); + for (uint32_t v: cav.verticesInt) { + rcav.intVertices.push_back(vertices[v]); + } + rcav.sides.resize(sides.size()); + for (size_t i = 0; i < sides.size(); ++i) { + rcav.sides[i].resize(sides[i].size()); + for (size_t j = 0; j < sides[i].size(); ++j) { + rcav.sides[i][j] = vertices[sides[i][j]]; + } + } + + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li quads, SET LAST remeshable cavity (#irreg = %li)", + iter, rcav.elements.size(), curCavityNirreg);} + } + } + if (policy == GROW_MINIMAL && bestIrreg != DBL_MAX && lastNbIrregular > 0) { + /* Found a remeshable cavity, return */ + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li quads, policy is MINIMAL growth, RETURN cavity", + iter, rcav.elements.size());} + return true; + } + } + + if (lastNbIrregular > 0) { + if (DBG_VERBOSE) {Msg::Debug("------ grow cavity: iter %li, %li quads, MAXIMAL growth, RETURN cavity", + iter, rcav.elements.size());} + } + + return lastNbIrregular > 0; + } + + bool getCavityNeighbors(RemeshableCavity& rcav, std::vector<MElement*>& neighbors) { + neighbors.clear(); + std::vector<uint32_t> bdr; + for (auto& side: rcav.sides) for (MVertex* v: side) { + auto it = vertexLocal.find(v); + if (it != vertexLocal.end()) { + bdr.push_back(it->second); + } + } + sort_unique(bdr); + for (uint32_t v: bdr) { + const uint32_t begin = v2q_first[v]; + const uint32_t end = v2q_first[v+1]; + for (uint32_t pos = begin; pos < end; ++pos) { + const uint32_t f = v2q_values[pos]; + MElement* elt = quadrangles[f]; + neighbors.push_back(elt); + } + } + neighbors = difference(neighbors,rcav.elements); + return true; + } + }; + + bool quadMeshIsMinimal(const CavityFarmer& farmer, const std::vector<std::pair<SPoint3,int> >& singularities) { + if (farmer.vertices.size() == 0) { + Msg::Error("quadMeshIsMinimal: farmer not initialized"); + return false; + } + size_t nIrregInt = 0; + size_t nIrregBdr = 0; + for (uint32_t i = 0; i < farmer.vertices.size(); ++i) { + uint32_t val = farmer.v2q_first[i+1]-farmer.v2q_first[i]; + MVertex* v = farmer.vertices[i]; + if (v->onWhat()->cast2Face() != nullptr && val != 4) { + nIrregInt += 1; + } else if (v->onWhat()->cast2Edge() != nullptr && val != 2) { + nIrregBdr += 1; + } + } + if (nIrregBdr == 0 && nIrregInt == singularities.size()) return true; + return false; + } + + + bool remeshCavity(GFace* gf, RemeshableCavity& cav, QuadqsGFaceContext& ctx, + const std::vector<MElement*>& cavityNeighborsForSmoothing) { + /* Collect current patch components */ + bool SHOW_REMESH_CAV = false; + static size_t ccount = 0; + if (SHOW_REMESH_CAV) { + ccount += 1; + std::string name = "cav" + std::to_string(ccount); + GeoLog::add(cav.elements,name+"_try"); + } + + /* Call the remeshing code */ + const double minSICNafer = 0.1; + GFaceMeshDiff diff; + int st = remeshPatchWithQuadPattern(gf, cav.patternNoAndRot, cav.sides, cav.elements, + cav.intVertices, minSICNafer, ctx.invertNormalsForQuality, ctx.sp, diff); + if (st != 0) { + if (DBG_VERBOSE) {Msg::Debug("remesh cavity: %li quads, failed to remesh path with quad pattern", + cav.elements.size());} + return false; + } + + /* Check the geometry quality before / after*/ + double sicnMin, sicnAvg; + computeSICN(diff.before.elements, sicnMin, sicnAvg); + double sicnMinAfter, sicnAvgAfter; + computeSICN(diff.after.elements, sicnMinAfter, sicnAvgAfter); + if ((sicnMin > 0.3 && sicnAvg > 0.5) || sicnMinAfter > sicnMin) { + constexpr bool verifyTopology = true; + size_t neb = diff.before.elements.size(); + size_t nea = diff.after.elements.size(); + size_t nvb = diff.before.intVertices.size(); + size_t nva = diff.after.intVertices.size(); + + if (SHOW_REMESH_CAV) { + std::string name = "cav" + std::to_string(ccount); + GeoLog::add(diff.after.elements,name+"_OK"); + } + + /* To smooth the interface between remeshed cavity and rest of the mesh, + * we collect the boundary (interior to the mesh) and its adjacent quads */ + vector<MVertex*> toSmooth; + vector<MElement*> neighbors = cavityNeighborsForSmoothing; + { + /* Cavity boundary vertices, inside the surface, not changed by diff.execute() */ + toSmooth.reserve(diff.after.bdrVertices.front().size()); + for (MVertex* v: diff.after.bdrVertices.front()) { + GFace* gf = dynamic_cast<GFace*>(v->onWhat()); + if (gf != nullptr) toSmooth.push_back(v); + } + + /* New quads inside cavity, touching boundary, still present after execute() */ + for (MElement* e: diff.after.elements) for (size_t lv = 0; lv < 4; ++lv) { + MVertex* v = e->getVertex(lv); + auto it = std::find(toSmooth.begin(),toSmooth.end(),v); + if (it != toSmooth.end()) { + neighbors.push_back(e); + break; + } + } + sort_unique(neighbors); + } + + /* Modify the GFace mesh ! (and empty the diff content) */ + bool oke = diff.execute(verifyTopology); + if (!oke) { + Msg::Error("remesh cavity: diff execute() failed, should not happen"); + return false; + } + + Msg::Debug("----V remeshed a cavity, %li -> %li quads, %li -> %li int. vertices, SICN min: %.3f -> %.3f", + neb, nea, nvb, nva, sicnMin, sicnMinAfter); + + /* Boundary vertex smoothing, to get a smooth transition with the + * rest of the mesh after cavity remeshing */ + { + GFaceMeshPatch patchBdr; + bool okp = patchFromElements(gf, neighbors, patchBdr); + if (okp) { + Msg::Debug("----P smooth cavity boundary (%li vertices, %li quads)", + patchBdr.intVertices.size(),patchBdr.elements.size()); + GeomOptimStats stats; + GeomOptimOptions opt; + opt.sp = ctx.sp; + opt.outerLoopIterMax = 20.; + opt.timeMax = 10.; + opt.withBackup = true; + opt.invertCADNormals = ctx.invertNormalsForQuality; + opt.smartMinThreshold = 0.1; + opt.localLocking = true; + opt.dxLocalMax = 1.e-4; + patchOptimizeGeometryWithKernel(patchBdr, opt, stats); + } + } + Msg::Debug("---->"); + return true; + } else { + Msg::Debug("----X reject cavity new geometry, SICN min: %.3f -> %.3f, avg: %.3f -> %.3f", + sicnMin, sicnMinAfter, sicnAvg, sicnAvgAfter); + if (SHOW_REMESH_CAV) { + std::string name = "cav" + std::to_string(ccount); + GeoLog::add(diff.after.elements,name+"_REJQ"); + } + } + + return false; + } + + void assignSingularitiesToIrregularVertices( + GFace* gf, + const CavityFarmer& farmer, + const std::vector<std::pair<SPoint3,int> >& singularities, + std::vector<MVertex*>& irregularVertices) { + irregularVertices.clear(); + + /* Extract irregular vertices in face */ + vector<MVertex*> nodeVal3; + vector<MVertex*> nodeVal5; + + for (uint32_t i = 0; i < farmer.vertices.size(); ++i) { + uint32_t val = farmer.v2q_first[i+1]-farmer.v2q_first[i]; + MVertex* v = farmer.vertices[i]; + if (v->onWhat() != gf) continue; + if (val != 4) { + if (val == 3) { + nodeVal3.push_back(v); + } else if (val == 5) { + nodeVal5.push_back(v); + } + } + } + + /* Assign singular vertices */ + for (size_t i = 0; i < singularities.size(); ++i) { + int index = singularities[i].second; + vector<MVertex*>* verticesp; + if (index == 1) { + verticesp = &nodeVal3; + } else if (index == -1) { + verticesp = &nodeVal5; + } else { + Msg::Warning("cavity remeshing: face %i, singularity of index %i not supported", gf->tag(),index); + continue; + } + SPoint3 p = singularities[i].first; + vector<MVertex*>& vertices = *verticesp; + double dmin = DBL_MAX; + MVertex* best = nullptr; + for (size_t j = 0; j < vertices.size(); ++j) { + SVector3 p2 = vertices[j]->point(); + double dist = vertices[j]->point().distance(p); + if (dist < dmin) { + dmin = dist; + best = vertices[j]; + } + } + if (best != nullptr) { + irregularVertices.push_back(best); + } else { + Msg::Warning("- Face %i, singular node %i, failed to assign to irregular vertex", gf->tag(), i); + } + } + } + + struct CavityStart { + std::vector<MQuadrangle*> quads; + SPoint3 center; + + CavityStart(const std::vector<MQuadrangle*>& _qs) { + quads = _qs; + sort_unique(quads); + center = SPoint3(0.,0.,0.); + for (MQuadrangle* e: quads) { + center = center + e->barycenter(); + } + if (quads.size() > 0) { + center = center * double(1./double(quads.size())); + } + } + + bool operator==(CavityStart const& b) const { + return b.quads == quads; + } + }; + + struct CavityStartHash { + size_t operator()(const CavityStart& start) const noexcept { + size_t seed = 0; + for (MQuadrangle* a: start.quads) { + hash_combine(seed, robin_hood::hash_bytes(&a, sizeof(MQuadrangle*))); + } + return seed; + } + }; + + struct StartStats { + int nTry = 0; + int nTryMax = 0; + }; + + struct CavityRegulator { + unordered_map<CavityStart, StartStats, CavityStartHash> starts; + + bool authorized(const CavityStart& start) { + auto it = starts.find(start); + if (it == starts.end()) { + return true; + } else { + if (it->second.nTry < it->second.nTryMax) return true; + } + return false; + } + + void declare(const CavityStart& start, int nTryMaxIfFirstTime = 3) { + auto it = starts.find(start); + if (it != starts.end()) { + it->second.nTry += 1; + } else { /* new start */ + StartStats st; + st.nTry = 1; + st.nTryMax = nTryMaxIfFirstTime; + starts[start] = st; + } + } + + void decreaseCounterCloseStarts(const CavityFarmer& farmer, + const SPoint3& pos, size_t Nclose = 4) { + std::vector<std::pair<double,StartStats*> > dist_stats; + for (auto& kv: starts) { + bool stillExists = true; + for (MQuadrangle* q: kv.first.quads) { + if (farmer.quadLocal.find(q) == farmer.quadLocal.end()) { + stillExists = false; + break; + } + } + if (!stillExists) continue; + double dist = pos.distance(kv.first.center); + if (dist > 1.e-22) { + dist_stats.push_back({dist,&(kv.second)}); + } + } + std::sort(dist_stats.begin(),dist_stats.end()); + for (size_t i = 0; i < std::min(Nclose,dist_stats.size()); ++i) { + dist_stats[i].second->nTry -= 1; + } + } + + }; + + bool remeshQuadrilateralCavities(GFace* gf, + const std::vector<std::pair<SPoint3,int> >& singularities, + const std::vector<size_t>& patternsToCheck, + const unordered_map<size_t,size_t>& patternSizeLimits, + CavityRegulator& regulator, + QuadqsGFaceContext& ctx) + { + if (ctx.finished) return true; + + Msg::Debug("-- remeshing quadrilateral cavities (%i quads, %i patterns to check) ...", + gf->quadrangles.size(), patternsToCheck.size()); + unordered_set<MVertex*> allowedIrregularVertices; + unordered_set<MVertex*> forbiddenIrregularVertices; + std::vector<MVertex*> singularVertices; /* to be preserved */ + std::vector<SPoint3> repulsion; /* to distribute the cavities, add repulsion after remeshing */ + + size_t nbCavityRemeshed = 0; + + /* for PASS_ALONG_GEDGES + * The queue contains the curves which are not loop */ + std::queue<GEdge*> gedges; + for (GEdge* ge: gf->edges()) { + /* Ignore periodic curves */ + if (ge->vertices().size() != 2) continue; + if (ge->periodic(0)) continue; + if (ge->vertices().front() == ge->vertices().back()) continue; + gedges.push(ge); + } + + /* for PASS_FROM_CORNERS + * The queue contains the CAD corners which are not concave */ + std::queue<GVertex*> gcorners; + for (GVertex* gv: gf->vertices()) { + gcorners.push(gv); + } + + /* for PASS_FROM_IRREGULAR + * The priority queue contains the irregular vertices not associated + * to cross field singularity and a priority based on repulsion. + * Higher values appear first when doing Q.top() */ + std::priority_queue<std::pair<double,MVertex*>, std::vector<std::pair<double,MVertex*> > > Qirreg; + + CavityFarmer farmer(gf); + + const size_t PASS_FROM_CORNERS = 1; + const size_t PASS_ALONG_GEDGES = 2; + const size_t PASS_FROM_IRREGULAR = 3; + for (size_t pass : {PASS_FROM_CORNERS, PASS_ALONG_GEDGES, PASS_FROM_IRREGULAR}) { + bool updateRequired = true; + bool inProgress = true; + while (inProgress + || (pass == PASS_FROM_CORNERS && gcorners.size() > 0) + || (pass == PASS_ALONG_GEDGES && gedges.size() > 0) + || (pass == PASS_FROM_IRREGULAR && Qirreg.size() > 0)) { + inProgress = false; + + if (updateRequired) { + farmer.updateFarmer(gf); + + if (quadMeshIsMinimal(farmer, singularities)) { + ctx.finished = true; + break; + } + + /* Get vertices to preserve from cross field singularities */ + assignSingularitiesToIrregularVertices(gf, farmer, singularities, singularVertices); + forbiddenIrregularVertices.clear(); + for (MVertex* v: singularVertices) forbiddenIrregularVertices.insert(v); + + if (pass == PASS_FROM_IRREGULAR) { + /* Update the queue */ + while (!Qirreg.empty()) { /* empty the queue */ + Qirreg.pop(); + } + for (uint32_t i = 0; i < farmer.vertices.size(); ++i) { + uint32_t val = farmer.v2q_first[i+1]-farmer.v2q_first[i]; + MVertex* v = farmer.vertices[i]; + if (v->onWhat() != gf) continue; + if (val == 4) continue; + if (forbiddenIrregularVertices.find(v) != forbiddenIrregularVertices.end()) continue; + + SPoint3 pt = v->point(); + double prio = 0.; + for (const SPoint3& r: repulsion) { + prio += pt.distance(r); + } + /* deterministic offset for reproductibility */ + double offsetR = 1.e-16*double(v->getNum()); + Qirreg.push({prio+offsetR,v}); + } + } + + updateRequired = false; + } + + /* Initialize a remeshing cavity */ + std::vector<MQuadrangle*> quadsInit; + size_t nTryMax = 3; + GrowthPolicy policy; + MVertex* vIrreg = nullptr; /* only used with PASS_FROM_IRREGULAR */ + if (pass == PASS_FROM_CORNERS) { + if (gcorners.empty()) continue; + policy = GROW_MAXIMAL; + nTryMax = 1; + allowedIrregularVertices.clear(); + GVertex* gv = gcorners.front(); + gcorners.pop(); + for (MVertex* v: gv->mesh_vertices) { + std::vector<MQuadrangle*> adjQuads; + bool oka = farmer.vertexAdjacentQuads(v, adjQuads); + if (oka) { + append(quadsInit,adjQuads); + } + } + sort_unique(quadsInit); + if (quadsInit.size() == 0 || quadsInit.size() >= 3) continue; /* do not start from concave corners */ + } else if (pass == PASS_ALONG_GEDGES) { + if (gedges.empty()) continue; + policy = GROW_MAXIMAL; + nTryMax = 1; + allowedIrregularVertices.clear(); + /* Get adjacent to a GEdge not yet processed */ + GEdge* ge = gedges.front(); + gedges.pop(); + for (MVertex* v: ge->mesh_vertices) { + std::vector<MQuadrangle*> adjQuads; + bool oka = farmer.vertexAdjacentQuads(v, adjQuads); + if (oka) { + append(quadsInit,adjQuads); + } + } + sort_unique(quadsInit); + } else if (pass == PASS_FROM_IRREGULAR) { + if (Qirreg.empty()) continue; + policy = GROW_MINIMAL; + nTryMax = 3; + vIrreg = Qirreg.top().second; + Qirreg.pop(); + std::vector<MQuadrangle*> adjQuads; + bool oka = farmer.vertexAdjacentQuads(vIrreg, adjQuads); + if (oka) { + append(quadsInit,adjQuads); + } else { + Msg::Error("remesh quad cavity: vertex not found in adjacency map, should NEVER happen"); + return false; + } + } + if (quadsInit.size() == 0) continue; + + + /* Check if not too many try already done */ + CavityStart start(quadsInit); + if (!regulator.authorized(start)) { + continue; + } + regulator.declare(start,nTryMax); + + Msg::Debug("---< start cavity with %i quads", quadsInit.size()); + + /* Grow a convex cavity containg irregular vertices to remove */ + RemeshableCavity cav; + bool okg = farmer.growCavity(quadsInit, policy, patternsToCheck, patternSizeLimits, + allowedIrregularVertices, forbiddenIrregularVertices, cav); + if (!okg) { + continue; + } + + Msg::Debug("---- found a topological cavity with %i quads, try geometrical remeshing", cav.elements.size()); + + std::vector<MElement*> neighbors; + farmer.getCavityNeighbors(cav, neighbors); + + bool okr = remeshCavity(gf, cav, ctx, neighbors); + if (okr) { + /* GFace mesh has changed, need to update adjacency info (v2q is no longer usable) */ + updateRequired = true; + inProgress = true; + nbCavityRemeshed += 1; + repulsion.push_back(start.center); + size_t NcloseUnlock = 4; + regulator.decreaseCounterCloseStarts(farmer,start.center, NcloseUnlock); + } + } + + if (ctx.finished) break; + } + + Msg::Debug("-- remeshed %i quadrilateral cavities", nbCavityRemeshed); + + ctx.nQuadCavityRemesh += nbCavityRemeshed; + + return true; + } + + bool remeshSingularityCavities(GFace* gf, + const std::vector<std::pair<SPoint3,int> >& singularities, + const std::vector<size_t>& patternsToCheck, + const unordered_map<size_t,size_t>& patternSizeLimits, + CavityRegulator& regulator, + QuadqsGFaceContext& ctx) + { + if (ctx.finished) return true; + + Msg::Debug("-- remeshing singularity cavities (face %i, %i quads, %i patterns to check) ...", + gf->tag(), gf->quadrangles.size(), patternsToCheck.size()); + unordered_set<MVertex*> allowedIrregularVertices; + unordered_set<MVertex*> forbiddenIrregularVertices; + std::vector<MVertex*> singularVertices; /* to preserve */ + std::vector<SPoint3> repulsion; /* to distribute the cavities, add repulsion after remeshing */ + + size_t nbCavityRemeshed = 0; + + /* The priority queue contains the irregular vertices associated to + * cross field singularity and a priority based on repulsion. + * Higher values appear first when doing Q.top() */ + std::priority_queue<std::pair<double,MVertex*>, std::vector<std::pair<double,MVertex*> > > Q; + + CavityFarmer farmer(gf); + + bool updateRequired = true; + bool inProgress = true; + while (inProgress || Q.size() > 0) { + inProgress = false; + + if (updateRequired) { + farmer.updateFarmer(gf); + + if (quadMeshIsMinimal(farmer, singularities)) { + ctx.finished = true; + break; + } + + /* Get vertices to preserve from cross field singularities */ + assignSingularitiesToIrregularVertices(gf, farmer, singularities, singularVertices); + forbiddenIrregularVertices.clear(); + for (MVertex* v: singularVertices) forbiddenIrregularVertices.insert(v); + + /* Update the queue */ + while (!Q.empty()) { /* empty the queue */ + Q.pop(); + } + for (MVertex* v: singularVertices) { + SPoint3 pt = v->point(); + double prio = 0.; + for (const SPoint3& r: repulsion) { + prio += pt.distance(r); + } + /* deterministic offset for reproductibility */ + double offsetR = 1.e-16*double(v->getNum()); + Q.push({prio+offsetR,v}); + } + + updateRequired = false; + } + + /* Initialize a remeshing cavity */ + if (Q.empty()) continue; + GrowthPolicy policy = GROW_MINIMAL; + if (singularities.size() == 1) policy = GROW_MAXIMAL; + MVertex* vSing = Q.top().second; + Q.pop(); + std::vector<MQuadrangle*> quadsInit; + bool oka = farmer.vertexAdjacentQuads(vSing, quadsInit); + if (!oka) { + Msg::Error("remesh singularity cavity: vertex not found in adjacency map, should NEVER happen"); + return false; + } + allowedIrregularVertices.clear(); + allowedIrregularVertices.insert(vSing); + + /* Check if not too many try already done */ + CavityStart start(quadsInit); + if (!regulator.authorized(start)) { + continue; + } + int nTryMax = 3; + regulator.declare(start,nTryMax); + + Msg::Debug("---< start cavity with %i quads adjacent to singularity vertex %li", + quadsInit.size(), vSing->getNum()); + + /* Grow a convex cavity containg irregular vertices to remove */ + RemeshableCavity cav; + bool okg = farmer.growCavity(quadsInit, policy, patternsToCheck, patternSizeLimits, + allowedIrregularVertices, forbiddenIrregularVertices, cav); + if (!okg) { + continue; + } + + Msg::Debug("---- found a topological cavity with %i quads, try geometrical remeshing", cav.elements.size()); + + std::vector<MElement*> neighbors; + farmer.getCavityNeighbors(cav, neighbors); + + bool okr = remeshCavity(gf, cav, ctx, neighbors); + + if (okr) { + /* GFace mesh has changed, need to update adjacency info (v2q is no longer usable) */ + updateRequired = true; + inProgress = true; + nbCavityRemeshed += 1; + repulsion.push_back(start.center); + size_t NcloseUnlock = 4; + regulator.decreaseCounterCloseStarts(farmer,start.center, NcloseUnlock); + } + } + + ctx.nSingCavityRemesh += nbCavityRemeshed; + + Msg::Debug("-- remeshed %i singularity cavities", nbCavityRemeshed); + + return true; + } + + + /* Global storage. Patterns are initialized at runtime, by the call to initQuadPatterns() */ + std::vector<QuadMeshPattern> patterns; +} + +using namespace QMT; + +int initQuadPatterns() { + if (patterns.size() != 0) return false; + { + Msg::Info("loading %li quad patterns", quad_meshes.size()); + patterns.resize(quad_meshes.size()); + for (size_t i = 0; i < quad_meshes.size(); ++i) { + bool ok = patterns[i].load(quad_meshes[i].first, quad_meshes[i].second); + if (!ok) { + Msg::Error("mesh quad patterns, failed to init pattern no %i", i); + } + } + } + return true; +} + +std::vector<size_t> getAllLoadedPatterns() { + std::vector<size_t> pIds; + for (size_t i = 0; i < patterns.size(); ++i) { + pIds.push_back(patterns[i].patternId); + } + return pIds; +} + +bool patchIsRemeshableWithQuadPattern( + const std::vector<size_t>& patternsToCheck, + size_t Ncorners, + const std::vector<size_t>& sideSizes, + std::pair<size_t,int>& patternNoAndRot, + double& irregularityMeasure) { + irregularityMeasure = DBL_MAX; + if (patterns.size() == 0) { + Msg::Error("Quad patterns are not loaded, please call initQuadPatterns() before"); + return false; + } + + vector<bool> check(patterns.size(),false); + for (size_t pId: patternsToCheck) check[pId] = true; + + double irreg_min = DBL_MAX; + for (size_t i = 0; i < patterns.size(); ++i) if (check[i]) { + const QuadMeshPattern& P = patterns[i]; + // DBG(" ", i, P.ncorners, P.sides.size());; + if (Ncorners != P.ncorners) continue; + if (sideSizes.size() != P.sides.size()) continue; + + int rot = 0; + double score = checkPatternMatchingWithRotations(P, sideSizes, rot); + if (score > 0.) { + double irreg = patternIrregularity(P); + if (irreg < irreg_min) { + patternNoAndRot.first = i; + patternNoAndRot.second = rot; + irreg_min = irreg; + } + } + } + + irregularityMeasure = irreg_min; + return (irreg_min != DBL_MAX); +} + +int remeshPatchWithQuadPattern( + GFace* gf, + const std::pair<size_t,int>& patternNoAndRot, + const std::vector<std::vector<MVertex*> > & sides, + const std::vector<MElement*> & elements, + const std::vector<MVertex*>& intVertices, + double minSICNrequired, + bool invertNormalsForQuality, + SurfaceProjector* sp, + GFaceMeshDiff& diff) { + if (patterns.size() == 0) { + Msg::Error("Quad patterns are not loaded, please call initQuadPatterns() before"); + return false; + } + + size_t N = sides.size(); + const QuadMeshPattern& P = patterns[patternNoAndRot.first]; + int rot = patternNoAndRot.second; + if (P.sides.size() != N) { + Msg::Error("remesh patch with patterns: sides not matching, shoud not happen (pattern has %li sides, but %li sides in input) ...", P.sides.size(), N); + return -1; + } + + /* Apply the rotation */ + std::vector<std::vector<MVertex*> > sidesr = sides; + if (rot > 0) { + std::rotate(sidesr.begin(),sidesr.begin()+(size_t)rot,sidesr.end()); + } else if (rot < 0) { + std::reverse(sidesr.begin(),sidesr.end()); + std::rotate(sidesr.begin(),sidesr.begin()+(size_t) std::abs(rot),sidesr.end()); + for (size_t i = 0; i <sidesr.size(); ++i) { + std::reverse(sidesr[i].begin(),sidesr[i].end()); + } + } + + /* Verify the given pattern and given sides are coherent */ + vector<size_t> ssr(sidesr.size()); + for (size_t i = 0; i < sidesr.size(); ++i) ssr[i] = sidesr[i].size(); + vector<int> slt; + double match = checkPatternMatching(P, ssr, slt); + if (match <= 0.) { + Msg::Error("remesh patch with patterns: given pattern not matching given sides"); + return -1; + } + + /* Add the new vertices and quads in the GFace */ + MVertex* oldCenter = centerOfElements(elements); + + /* Generate new interior MVertex and MElement instances */ + diff.gf = gf; + diff.after.gf = gf; + bool oka = addQuadsAccordingToPattern(P, slt, gf, sidesr, diff.after.intVertices, diff.after.elements, oldCenter); + if (!oka) { + Msg::Error("failed to add quads according to pattern, weird"); + clearStuff(diff.after.intVertices, diff.after.elements); + return -1; + } + + /* Ensure coherent orientation between the new mesh and the boundary. + * The reference orientation (a,b) is from the sides before applying + * rotation. */ + MVertex* a = sides[0][0]; + MVertex* b = sides[0][1]; + bool oko = orientElementsAccordingToBoundarySegment(a, b, diff.after.elements); + if (!oko) { + Msg::Error("remesh quad with patterns: bdr quad edge not found, weird"); + return false; + } + + /* Build the old patch in the diff */ + diff.before.gf = gf; + diff.before.intVertices = intVertices; + diff.before.elements = elements; + /* - build a continuous bdr loop from the sides */ + diff.before.bdrVertices = {{sides.front().front()}}; + for (auto& side: sides) for (MVertex* v: side) { + if (v != diff.before.bdrVertices.front().back()) { + diff.before.bdrVertices.front().push_back(v); + } + } + if (diff.before.bdrVertices.front().back() == diff.before.bdrVertices.front().front()) { + diff.before.bdrVertices.front().pop_back(); + } + diff.after.bdrVertices = diff.before.bdrVertices; /* the new patch has the same bdr */ + + /* Determine the new patch geometry by smoothing on the surface */ + GeomOptimStats stats; + int stGeoGlobal = -1; + if (gf->haveParametrization()) { + stGeoGlobal = patchOptimizeGeometryGlobal(diff.after, stats); + if (stGeoGlobal != 0) { + Msg::Debug("failed to optimize geometry with global UV smoothing"); + } + } + + if (!gf->haveParametrization() || stGeoGlobal != 0 || stats.sicnMinAfter < minSICNrequired) { + /* Project */ + bool okp = patchProjectOnSurface(diff.after, sp); + if (!okp) { + Msg::Debug("failed to project geometry"); + return -1; + } + + /* Smooth with kernel */ + GeomOptimOptions opt; + opt.sp = sp; + opt.invertCADNormals = invertNormalsForQuality; + opt.outerLoopIterMax = 100; + opt.timeMax = 0.5; + opt.localLocking = true; + opt.dxGlobalMax = 1.e-3; + opt.dxLocalMax = 1.e-5; + opt.withBackup = false; + patchOptimizeGeometryWithKernel(diff.after, opt, stats); + } + + if (stats.sicnMinAfter < minSICNrequired) { + Msg::Debug("remesh patch with quad pattern: rejected because SICN min is %.3f", stats.sicnMinAfter); + return -1; + } + + return 0; +} + + +int improveQuadMeshTopologyWithCavityRemeshing(GFace* gf, + const std::vector<std::pair<SPoint3,int> >& singularities, + bool invertNormalsForQuality) { + + Msg::Info("- Face %i: optimize quad mesh topology (%i elements, %i cross field singularities) with cavity remeshing ...", + gf->tag(), gf->quadrangles.size(), singularities.size()); + size_t nqb = gf->quadrangles.size(); + size_t nvb = gf->mesh_vertices.size(); + + + QuadqsContext qqs; + QuadqsGFaceContext ctx(qqs); + ctx.invertNormalsForQuality = invertNormalsForQuality; + + bool alwaysBuildSurfaceProjector = true; + if (alwaysBuildSurfaceProjector || !haveNiceParametrization(gf)) { + ctx.sp = new SurfaceProjector(); + bool okf = fillSurfaceProjector(gf, ctx.sp); + if (!okf) { + return false; + } + } + + + unordered_map<size_t,size_t> patternSizeLimits; + patternSizeLimits[PATTERN_QUAD_DIAG35] = 100; + patternSizeLimits[PATTERN_QUAD_ALIGNED35] = 200; + patternSizeLimits[PATTERN_QUAD_CHORD_UTURN] = 100; + vector<size_t> patternsToCheck; + + /* For a given cavity start, we count the number of cavities + * that have been tried + * The count is reset when an another close cavity is remeshed. + * When a cavity is remeshed, its interior vertices are changed, + * so the count is automatically reset. + * (the content may be invalid, so it shoud not be used without checking existence) */ + CavityRegulator regulator; + + bool running = true; + while (running) { + running = false; + size_t ncrb = ctx.nQuadCavityRemesh + ctx.nSingCavityRemesh; + + Msg::Debug("<< start cavity remeshing iteration"); + + /* 1st pass: check regular quad patch remeshing only */ + patternsToCheck = {PATTERN_QUAD_REGULAR}; + bool ok1 = remeshQuadrilateralCavities(gf, singularities, patternsToCheck, patternSizeLimits, regulator, ctx); + if (!ok1) { + Msg::Error("- Face %i: failed to remesh quadrilateral cavities", gf->tag()); + return false; + } + + /* 2d pass: remesh around cross field singularities */ + patternsToCheck = {PATTERN_TRIANGLE,PATTERN_PENTAGON}; + bool ok2 = remeshSingularityCavities(gf, singularities, patternsToCheck, patternSizeLimits, regulator,ctx); + if (!ok2) { + Msg::Error("- Face %i: failed to remesh singularity cavities", gf->tag()); + return false; + } + + /* 3d pass: check regular quad patches again (if unlocked by singularity remeshing) */ + patternsToCheck = {PATTERN_QUAD_REGULAR}; + bool ok3 = remeshQuadrilateralCavities(gf, singularities, patternsToCheck, patternSizeLimits, regulator, ctx); + if (!ok3) { + Msg::Error("- Face %i: failed to remesh quadrilateral cavities", gf->tag()); + return false; + } + + /* 4d pass: size transition patterns */ + patternsToCheck = {PATTERN_QUAD_REGULAR, PATTERN_QUAD_DIAG35, PATTERN_QUAD_ALIGNED35, PATTERN_QUAD_CHORD_UTURN}; + bool ok4 = remeshQuadrilateralCavities(gf, singularities, patternsToCheck, patternSizeLimits, regulator, ctx); + if (!ok4) { + Msg::Error("- Face %i: failed to remesh quadrilateral cavities", gf->tag()); + return false; + } + + size_t ncra = ctx.nQuadCavityRemesh + ctx.nSingCavityRemesh; + if (ncra > ncrb) { /* The mesh changed */ + /* Smooth geometry (quick) */ + double timeMax = 1.; + optimizeGeometryQuadMesh(gf, ctx.sp, timeMax); + + /* Decrease the try counter, to enable a new try everywhere */ + for (auto& kv: regulator.starts) if (kv.second.nTry > 0) { + kv.second.nTry -= 1; + } + } + + /* Restart a full iteration if some cavities have been remeshed */ + if (ncra > ncrb) running = true; + Msg::Debug(">> end of cavity remeshing iteration"); + + if (ctx.finished) { + Msg::Debug("quad mesh remeshing is finised (minimal number of irregular vertices)"); + break; + } + } + + if (ctx.sp) { + delete ctx.sp; + ctx.sp = nullptr; + } + + Msg::Info("- Face %i: remeshed %i singular and %i quadrilateral cavities, %i -> %i quads, %i -> %i vertices", + gf->tag(), ctx.nSingCavityRemesh, ctx.nQuadCavityRemesh, nqb, gf->quadrangles.size(), nvb, gf->mesh_vertices.size()); + + return 0; +} + +int meshFaceWithGlobalPattern(GFace* gf, bool invertNormalsForQuality, double minimumQualityRequired) { + GFaceInfo info; + bool okf = fillGFaceInfo(gf, info); + if (!okf) return -1; + + /* Check if convex topological disk */ + bool convexTopologicalDisk = isTopologicalDisk(info) && !haveConcaveCorners(info); + if (!convexTopologicalDisk) { + return -1; + } + + Msg::Debug("- Face %i: is topological disk, try quad pattern meshing", gf->tag()); + + double t0 = Cpu(); + + /* Build the ordered sides */ + const vector<GEdge *>& edges = gf->edges(); + unordered_map<GVertex*,vector<GEdge*> > v2e; + for (GEdge* ge: edges) { + if (ge->periodic(0)) continue; + for (GVertex* gv: ge->vertices()) v2e[gv].push_back(ge); + } + for (auto& kv: v2e) { sort_unique(kv.second); } + std::set<GVertex*> corners = info.bdrValVertices[1]; + bool disk = (corners.size() == 0 && info.bdrValVertices[2].size() > 0); + + /* Sort CAD edges in sides */ + vector<vector<GEdge*> > sides; + vector<vector<bool> > sidesInv; + for (GEdge* e0: edges) if (!e0->periodic(0)) { + GVertex* v1 = e0->vertices()[0]; + GVertex* v2 = e0->vertices()[1]; + bool v1IsCorner = (corners.find(v1) != corners.end()); + if (!disk && !v1IsCorner) continue; + if (disk) { + sides.resize(1); + sidesInv.resize(1); + } + + size_t infLoop = 0; + GVertex* v = v1; + GEdge* e = e0; + bool inv = false; + do { + infLoop += 1; + if (infLoop > 1e6) { + Msg::Warning("infinite loop in edges of face %i, cancel simple quad mesh", gf->tag()); + return -1; + } + bool vIsCorner = (corners.find(v) != corners.end()); + if (vIsCorner) { + sides.resize(sides.size()+1); + sidesInv.resize(sidesInv.size()+1); + } + v1 = e->vertices()[0]; + v2 = e->vertices()[1]; + + inv = (v == v2); + + sides.back().push_back(e); + sidesInv.back().push_back(inv); + + GVertex* v_next = NULL; + if (v2 != v) { + v_next = v2; + } else { + v_next = v1; + } + GEdge* e_next = NULL; + if (v2e[v_next].size() == 2) { + e_next = (v2e[v_next][0] != e) ? v2e[v_next][0] : v2e[v_next][1]; + } else { + Msg::Warning("non manifold edge loop around face %li, cancel simple quad mesh", gf->tag()); + return -1; + } + + e = e_next; + v = v_next; + } while (e != e0); + break; + } + + if (disk && gf->edges().size() == 1 && gf->edges()[0]->periodic(0)) { + sides = {gf->edges()}; + sidesInv = {{false}}; + } + + if (sides.size() == 0) { + Msg::Debug("face %i (%li edges), failed to build sides",gf->tag(),edges.size()); + DBG(disk); + return -1; + } + + /* Collect mesh vertices */ + vector<vector<MVertex*> > sideVertices(sides.size()); + for (size_t i = 0; i < sides.size(); ++i) { + for (size_t j = 0; j < sides[i].size(); ++j) { + GEdge* ge = sides[i][j]; + bool inv = sidesInv[i][j]; + GVertex* v1 = ge->vertices()[0]; + GVertex* v2 = ge->vertices()[1]; + + /* Vertices from v1 to v2 */ + vector<MVertex*> ge_vert; + { + std::vector<MEdge> medges(ge->lines.size()); + for (size_t k = 0; k < ge->lines.size(); ++k) { + medges[k] = MEdge(ge->lines[k]->getVertex(0),ge->lines[k]->getVertex(1)); + } + std::vector<std::vector<MVertex* > > gevs; + bool oks = SortEdgeConsecutive(medges, gevs); + if (!oks || gevs.size() != 1) return -1; + if (gevs[0].front() == v1->mesh_vertices[0] + && gevs[0].back() == v2->mesh_vertices[0]) { + ge_vert = gevs[0]; + } else if (gevs[0].front() == v2->mesh_vertices[0] + && gevs[0].back() == v1->mesh_vertices[0]) { + ge_vert = gevs[0]; + std::reverse(ge_vert.begin(),ge_vert.end()); + } else { + Msg::Error("corner and edge vertices not matching"); + return -1; + } + } + + if (inv) { + std::reverse(ge_vert.begin(),ge_vert.end()); + } + if (sideVertices[i].size() == 0) { + append(sideVertices[i], ge_vert); + } else { + if (sideVertices[i].back() == ge_vert[0]) { + sideVertices[i].pop_back(); + } + append(sideVertices[i], ge_vert); + } + } + } + + /* When there is just one side, two possible cases: + * - disk (all bdr vertices are quad-valence 2) + * - face with only one convex corner + */ + if (sides.size() == 1) { + if (sides[0].size() < 1) { + Msg::Warning("not enough vertices on face loop for quad meshing (%li vert)", sides[0].size()); + return -1; + } + if (disk) { + if (sides[0].front() == sides[0].back()) { + sides[0].pop_back(); + } + } else { + if (sides[0].front() == sides[0].back()) { + sides[0].pop_back(); + } + } + } + + + /* Pure topological check with side sizes */ + std::vector<size_t> patternsToCheck = getAllLoadedPatterns(); + std::vector<size_t> sideSizes(sideVertices.size()); + for (size_t i = 0; i < sideSizes.size(); ++i) sideSizes[i] = sideVertices[i].size(); + + std::pair<size_t,int> patternNoAndRot; + size_t Ncorners = disk ? 0 : sideSizes.size(); + double irreg; + bool meshable = patchIsRemeshableWithQuadPattern(patternsToCheck, Ncorners, sideSizes, patternNoAndRot, irreg); + if (!meshable) return -1; + + + /* Build the mesh, smooth and check the geometry quality */ + std::vector<MElement*> oldElements; + oldElements.reserve(gf->quadrangles.size()+gf->triangles.size()); + for (MElement* f: gf->triangles) oldElements.push_back(f); + for (MElement* f: gf->quadrangles) oldElements.push_back(f); + std::vector<MVertex*> oldVertices = gf->mesh_vertices; + + /* SurfaceProjector, useful for smoothing */ + SurfaceProjector* sp = new SurfaceProjector(); + bool oksp = fillSurfaceProjector(gf, sp); + if (!oksp) { + delete sp; + sp = nullptr; + } + + const double minSICNafer = -DBL_MAX; /* do not filter based on quality */ + GFaceMeshDiff diff; + int st = remeshPatchWithQuadPattern(gf, patternNoAndRot, sideVertices, oldElements, + oldVertices, minSICNafer, invertNormalsForQuality, sp, diff); + if (st != 0) { + if (DBG_VERBOSE) {Msg::Debug("remesh cavity: %li quads, failed to remesh path with quad pattern", + oldElements.size());} + if (sp) delete sp; + return -1; + } + + bool good = false; + double sicnMin, sicnAvg; + double sicnMinAfter, sicnAvgAfter; + size_t neb = diff.before.elements.size(); + size_t nea = diff.after.elements.size(); + size_t nvb = diff.before.intVertices.size(); + size_t nva = diff.after.intVertices.size(); + { + + GeomOptimStats stats; + GeomOptimOptions opt; + opt.sp = sp; + opt.outerLoopIterMax = 100; + opt.timeMax = 3.; + opt.localLocking = true; + opt.dxGlobalMax = 1.e-3; + opt.dxLocalMax = 1.e-5; + opt.force3DwithProjection = true; + opt.withBackup = false; + bool oko = patchOptimizeGeometryWithKernel(diff.after, opt, stats); + if (!oko) { + if (sp) delete sp; + return -1; + } + + computeSICN(diff.before.elements, sicnMin, sicnAvg); + computeSICN(diff.after.elements, sicnMinAfter, sicnAvgAfter); + if (sicnMinAfter > minimumQualityRequired) { + constexpr bool verifyTopology = true; + bool oke = diff.execute(verifyTopology); + if (oke) { + good = true; + } else { + Msg::Error("remesh cavity: diff execute() failed, should not happen"); + } + } else { + Msg::Debug("- Face %i: pattern-based quad mesh REJECTED because SICN min %.3f < %.3f", + gf->tag(), sicnMinAfter, minimumQualityRequired); + } + } + + if (good) { + Msg::Info("- Face %i: remeshed with a global pattern, %li -> %li quads, %i -> %i int. vertices, SICN min: %.3f -> %.3f, SICN avg: %.3f -> %.3f, time: %.3fs", + gf->tag(), neb, nea, nvb, nva, sicnMin, sicnMinAfter, sicnAvg, sicnAvgAfter, Cpu()-t0); + gf->meshStatistics.status = GFace::DONE; + } + + if (sp) delete sp; + + return good; +} diff --git a/contrib/QuadMeshingTools/qmtQuadCavityRemeshing.h b/contrib/QuadMeshingTools/qmtQuadCavityRemeshing.h new file mode 100644 index 0000000000000000000000000000000000000000..fb3b417572784249853d2b09c2678f1107b5f48e --- /dev/null +++ b/contrib/QuadMeshingTools/qmtQuadCavityRemeshing.h @@ -0,0 +1,132 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include "qmtMeshUtils.h" + +class SurfaceProjector; + + +/** + * @brief Apply iterative cavity remeshing to the face mesh + * to reduce the number of irregular vertices which + * are not matching cross field singularities. + * The quad patterns must be loaded before (see initQuadPatterns()). + * + * @param[in,out] gf The face containing the quad mesh to improve + * @param[in] singularities Floating list of cross field singularities, specified by + * their position and their index (-1 for valence 5, +1 for valence 3) + * @param[in] invertNormalsForQuality The CAD normals are used to compute signed quality. + * This flag invert invert the CAD normals in the measure. + * + * @return 0 if success + */ +int improveQuadMeshTopologyWithCavityRemeshing(GFace* gf, + const std::vector<std::pair<SPoint3,int> >& singularities, + bool invertNormalsForQuality); + +/** + * @brief Consider the current face mesh as a global single cavity + * and try to mesh it with the exising patterns. + * The quad patterns must be loaded before (see initQuadPatterns()). + * + * @param[in,out] gf The face containing the quad mesh to improve + * @param[in] invertNormalsForQuality The CAD normals are used to compute signed quality. + * This flag invert invert the CAD normals in the measure. + * @param[in] minimumQualityRequired Minimum quality (SICN) required to accept a new quad mesh + * + * @return 0 if success + */ +int meshFaceWithGlobalPattern(GFace* gf, bool invertNormalsForQuality, double minimumQualityRequired); + + +/* List of patterns */ +extern const size_t PATTERN_QUAD_REGULAR; +extern const size_t PATTERN_TRIANGLE; +extern const size_t PATTERN_PENTAGON; +extern const size_t PATTERN_QUAD_DIAG35; +extern const size_t PATTERN_QUAD_ALIGNED35; +extern const size_t PATTERN_QUAD_CHORD_UTURN; +extern const size_t PATTERN_2CORNERS; +extern const size_t PATTERN_1CORNER; +extern const size_t PATTERN_DISK; + +/** + * @return the number of corners in the input pattern + */ +size_t patternNumberOfCorners(size_t pId); + +/** + * @brief Initialize the pattern datastructures from raw meshes. + * Must be called one-time before using remeshPatchWithQuadPattern() + * + * @return 0 if success + */ +int initQuadPatterns(); + +/** + * @brief Get a vector with all the patterns. + * + * @return the pattern identifiers (see the list of patterns) + */ +std::vector<size_t> getAllLoadedPatterns(); + +/** + * @brief Check if there is a topological quad mesh matching + * a given boundary, in the specified patterns. + * Mesh geometry is totally ignored in this function. + * + * @param[in] patternsToCheck The list of patterns to try + * @param[in] Ncorners The number of corners in the patch + * @param[in] sideSizes The number of edges on each side + * @param[out] patternNoAndRot If found, the pattern identifier and its associated rotation + * @param[out] irregularityMeasure If round, the topological irregularity measure of the pattern + * + * @return true if a matching is found + */ +bool patchIsRemeshableWithQuadPattern( + const std::vector<size_t>& patternsToCheck, + size_t Ncorners, + const std::vector<size_t>& sideSizes, + std::pair<size_t,int>& patternNoAndRot, + double& irregularityMeasure); + + +/** + * @brief Look for the best topological disk quadrangulation remeshing + * which match the allowed valence ranges. + * Requires that the disk quadrangulation data is initialized, see initDiskQuadrangulations() + * The GFace mesh is not changed, the changes are stored in the diff + * which can executed by the caller. + * + * @param[in] gf CAD face containing the elements + * @param[in] patternNoAndRot If found, the pattern identifier and its associated rotation + * @param[in] sides The vertices on each side. Must be compatible with the output of + * patchIsRemeshableWithQuadPattern() + * @param[in] elements The old elements in the patch, may be empty + * @param[in] intVertices The old interior vertices in the patch, may empty + * @param[in] minSICNrequired Minimum SICN quality required in the remeshed patch. + * Compared after geometry untangling/smoothing. + * @param[in] invertNormalsForQuality The CAD normals are used to compute signed quality. + * This flag invert invert the CAD normals in the measure. + * @param[in] sp If not nullptr, the surface projector is used instead of the CAD parametrization + * in the smoothing. Required if there is no surface parametrization. + * @param[out] diff The mesh diff (to the GFace) containing the remeshing candidate + * + * @return 0 if success + */ +int remeshPatchWithQuadPattern( + GFace* gf, + const std::pair<size_t,int>& patternNoAndRot, + const std::vector<std::vector<MVertex*> > & sides, + const std::vector<MElement*> & elements, + const std::vector<MVertex*>& intVertices, + double minSICNrequired, + bool invertNormalsForQuality, + SurfaceProjector* sp, + GFaceMeshDiff& diff); diff --git a/contrib/QuadMeshingTools/qmtSizeMap.cpp b/contrib/QuadMeshingTools/qmtSizeMap.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f7f427de478e4b9929fe5774278186bf16b08893 --- /dev/null +++ b/contrib/QuadMeshingTools/qmtSizeMap.cpp @@ -0,0 +1,243 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#include "qmtSizeMap.h" + +/* System includes */ +#include <vector> +#include <array> +#include <unordered_map> +#include <cstdint> +#include <cmath> +#include <queue> +#include <algorithm> + +/* Gmsh includes */ +#include "GmshMessage.h" +#include "OS.h" +#include "GVertex.h" +#include "GEdge.h" +#include "GFace.h" +#include "GModel.h" +#include "MVertex.h" +#include "Context.h" +#include "MLine.h" +#include "MTriangle.h" +#include "BackgroundMesh.h" +#include "gmsh.h" // debug + +/* QuadMeshingTools includes */ +#include "cppUtils.h" +#include "qmtMeshUtils.h" + +using namespace CppUtils; + +namespace QMT { + + void setMinimum(MVertex* v, std::unordered_map<MVertex*,double>& minSize, + double value) { + auto it = minSize.find(v); + if (it == minSize.end()) { + minSize[v] = value; + } else if (value < it->second) { + it->second = value; + } + } + + inline double distance2(const SPoint3& a, const SPoint3& b) { + const double dx = a.x() - b.x(); + const double dy = a.y() - b.y(); + const double dz = a.z() - b.z(); + return dx*dx+dy*dy+dz*dz; + } + + inline double distance_point_segment_squared(const SPoint3& query, const SPoint3& a, const SPoint3& b) { + const double l2 = distance2(a,b); + const double t = dot(query-a,b-a); + if (t <= 0. || l2 == 0.) { + return distance2(query,a); + } else if (t > l2) { + return distance2(query,b); + } + const double lambda = 1. - t / l2; + SPoint3 proj(lambda * a + (1. - lambda) * b); + return distance2(query,proj); + } + + double distanceToLines(const SPoint3& query, const std::vector<MLine>& lines) { + // warning: not very efficient ... + double mdist2 = DBL_MAX; + for (const MLine& l: lines) { + const MVertex* v1 = l.getVertex(0); + const MVertex* v2 = l.getVertex(1); + mdist2 = std::min(mdist2,distance_point_segment_squared(query,v1->point(),v2->point())); + } + return std::sqrt(mdist2); + } + + double distanceToGEdgeBackgroundMesh(const SPoint3& query, GlobalBackgroundMesh& gbm, GEdge* ge) { + auto it = gbm.edgeBackgroundMeshes.find(ge); + if (it == gbm.edgeBackgroundMeshes.end()) { + Msg::Error("curve %i not found in background mesh, cannot compute distance to it", ge->tag()); + return DBL_MAX; + } + return distanceToLines(query,it->second.lines); + } +} + +using namespace QMT; + +int computeMinimalSizeOnCurves( + GlobalBackgroundMesh& gbm, + std::unordered_map<MVertex*,double>& minSize) { + Msg::Debug("compute minimal size on curves (using background mesh) ..."); + /* Important information: all mesh elements are queried in the GlobalBackgroundMesh, + * not in the current GModel ! */ + + GModel* gm = gbm.gm; + if (gm == NULL) return -1; + + /* Initialize minimal size on vertex associated to GVertex + * prescribed size */ + for (MVertex* v: gbm.mesh_vertices) { + GVertex* gv = dynamic_cast<GVertex*>(v->onWhat()); + if (gv == NULL) continue; + /* Mesh size */ + double size = gv->prescribedMeshSizeAtVertex(); + if (size > 0 && size < 1.e22) setMinimum(v, minSize, size); + } + + std::unordered_map<GVertex*,std::vector<GEdge*> > gv2ge; + for (GEdge* ge: model_edges(gm)) for (GVertex* gv: ge->vertices()) { + gv2ge[gv].push_back(ge); + } + for (auto& kv: gv2ge) sort_unique(kv.second); + + /* On curve vertices, minimum size is minimum of: + * - existing size + * - curve length + * - distance of projection to non adjacent curves */ + for (GFace* gf: model_faces(gm)) { + for (GEdge* ge: face_edges(gf)) { + auto it = gbm.edgeBackgroundMeshes.find(ge); + if (it == gbm.edgeBackgroundMeshes.end()) { + Msg::Error("curve %i not found in background mesh", ge->tag()); + continue; + } + + /* Collect curve vertices, including extremities */ + std::vector<MVertex*> curve_vertices; + for (MLine& e: it->second.lines) for (size_t lv: {0,1}) { + MVertex* v = e.getVertex(lv); + curve_vertices.push_back(v); + } + sort_unique(curve_vertices); + + /* Collect non-adjacent curves */ + std::vector<GEdge*> curvesAjacent; + for (GVertex* gv: ge->vertices()) { + for (GEdge* ge2: gv2ge[gv]) if (ge2 != ge) { + curvesAjacent.push_back(ge2); + + if (ge2->length() <= CTX::instance()->geom.tolerance) { /* yes CAD is annoying ... */ + for (GVertex* gv2: ge2->vertices()) { + for (GEdge* ge3: gv2ge[gv2]) if (ge3 != ge) { + curvesAjacent.push_back(ge3); + } + } + } + } + } + sort_unique(curvesAjacent); + + std::vector<GEdge*> curvesNotAdjacent; + for (GFace* gf: ge->faces()) for (GEdge* ge2: gf->edges()) if (ge2 != ge) { + curvesNotAdjacent.push_back(ge2); + } + curvesNotAdjacent = difference(curvesNotAdjacent,curvesAjacent); + sort_unique(curvesNotAdjacent); + + double len = ge->length(); + for (MVertex* v: curve_vertices) { + double vMin = len; /* curve length */ + + /* Size: minimum of projection to non-adj curves */ + for (GEdge* ge2: curvesNotAdjacent) { + /* Warning: testing all MLine, slow, should have kdtree acceleration */ + double dist = distanceToGEdgeBackgroundMesh(v->point(), gbm, ge2); + if (vMin > 0) vMin = std::min(vMin, dist); + } + + if (vMin > 0 && vMin < 1.e22) setMinimum(v, minSize, vMin); + } + } + } + + return 0; +} + +int sizeMapOneWaySmoothing( + const std::vector<MTriangle*>& triangles, + std::unordered_map<MVertex*,double>& values, + double gradientMax) { + Msg::Debug("one way smoothing of scalar field (%li triangles, %li values) ...", + triangles.size(), values.size()); + if (triangles.size() == 0) return -1; + if (gradientMax <= 0.) return -1; + + std::unordered_map<MVertex*, std::vector<MVertex*> > v2v; + buildVertexToVertexMap(triangles, v2v); + + std::priority_queue<std::pair<double,MVertex*>, std::vector<std::pair<double,MVertex*> >, std::greater<std::pair<double,MVertex*> > > Q; + for (const auto& kv: values) { + Q.push({kv.second,kv.first}); + } + + /* Dijkstra propagation */ + while (Q.size() > 0) { + MVertex* v = Q.top().second; + double cdist = Q.top().first; + Q.pop(); + for (MVertex* v2: v2v[v]) { + double w_ij = v->distance(v2) * (gradientMax-1.); + auto it = values.find(v2); + if (it == values.end() || cdist + w_ij < it->second) { + double new_value = cdist + w_ij; + auto it2 = values.find(v2); + if (it2 != values.end() && new_value > it2->second) { + /* No need to propagate in regions where sizemap is + * already sufficiently fine */ + continue; + } + values[v2] = new_value; + Q.push({new_value,v2}); + } + } + } + + return 0; +} + +void quantileFiltering(std::unordered_map<MVertex*,double>& scaling, double critera) { + std::vector<double> values(scaling.size()); + size_t count = 0; + for (auto& kv: scaling) { + values[count] = kv.second; + count += 1; + } + std::sort(values.begin(),values.end()); + size_t n = values.size(); + double clamp_min = values[size_t(critera*double(n))]; + double clamp_max = values[size_t((1.-critera)*double(n))]; + for (auto& kv: scaling) { + if (kv.second < clamp_min) { + kv.second = clamp_min; + } else if (kv.second > clamp_max) { + kv.second = clamp_max; + } + } +} diff --git a/contrib/QuadMeshingTools/qmtSizeMap.h b/contrib/QuadMeshingTools/qmtSizeMap.h new file mode 100644 index 0000000000000000000000000000000000000000..115d377bb5f8d363aa25035b679a31a7484176b7 --- /dev/null +++ b/contrib/QuadMeshingTools/qmtSizeMap.h @@ -0,0 +1,64 @@ +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle +// +// See the LICENSE.txt file for license information. Please report all +// issues on https://gitlab.onelab.info/gmsh/gmsh/issues. +// +// Author: Maxence Reberol + +#pragma once + +#include <vector> +#include <array> +#include <unordered_map> +#include <string> + +class MVertex; +class MTriangle; +class GModel; +class GlobalBackgroundMesh; + +/** + * @brief Compute minimal size values on curve vertices. This the minimum of: + * - the current curve length + * - the distance to other non-adjacent curves + * - the prescribed mesh size + * + * @param[in] gbm Background mesh on which to compute the minimal sizes + * @param[out] minSize the minimal distance, for each MVertex of GVertex / GEdge + * + * @return 0 if success + */ +int computeMinimalSizeOnCurves( + GlobalBackgroundMesh& gbm, + std::unordered_map<MVertex*,double>& minSize); + + + +/** + * @brief One way smoothing to get a smooth scalar field where + * the gradient is inferior to gradientMax, the output + * verify: + * v2 = min(v2, v1 + gradientMax * d(x1,v2)) + * for all edge v1-v2 in the triangles. The propagation is + * computed with a Dijkstra-like algorithm. + * + * @param triangles The triangulation on which to extract the edges for Dijkstra + * @param values The scalar field to smooth + * @param gradientMax The maximum gradient in the ouput, typical range is [1, 1.4] + * for meshing + * + * @return 0 if success + */ +int sizeMapOneWaySmoothing( + const std::vector<MTriangle*>& triangles, + std::unordered_map<MVertex*,double>& values, + double gradientMax = 1.2); + + +/** + * @brief Remove extremities in the histogram + * + * @param scaling the values on which to apply the filtering + * @param critera keep values which are in [critera,1-critera] in the histogram + */ +void quantileFiltering(std::unordered_map<MVertex*,double>& scaling, double critera); diff --git a/contrib/QuadMeshingTools/row_echelon_integer.cpp b/contrib/QuadMeshingTools/row_echelon_integer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..41614965ca010214c13a75f555c91bc9bc919815 --- /dev/null +++ b/contrib/QuadMeshingTools/row_echelon_integer.cpp @@ -0,0 +1,1734 @@ +/* Author: John Burkardt + * Link: https://people.sc.fsu.edu/~jburkardt/cpp_src/row_echelon_integer/row_echelon_integer.html + * License: The computer code and data files made available on this web page are distributed under the GNU LGPL license. + * https://www.gnu.org/licenses/lgpl-3.0.en.html */ + +# include <cmath> +# include <cstdlib> +# include <cstring> +# include <ctime> +# include <iomanip> +# include <iostream> + +using namespace std; + +# include "row_echelon_integer.hpp" + +//****************************************************************************80 + +int i4_gcd ( int i, int j ) + +//****************************************************************************80 +// +// Purpose: +// +// I4_GCD finds the greatest common divisor of two I4's. +// +// Discussion: +// +// Note that only the absolute values of I and J are +// considered, so that the result is always nonnegative. +// +// If I or J is 0, I4_GCD is returned as max ( 1, abs ( I ), abs ( J ) ). +// +// If I and J have no common factor, I4_GCD is returned as 1. +// +// Otherwise, using the Euclidean algorithm, I4_GCD is the +// greatest common divisor of I and J. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 25 March 2004 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int I, J, two numbers whose GCD is desired. +// +// Output, int I4_GCD, the greatest common divisor of I and J. +// +{ + int p; + int q; + int r; +// +// Return immediately if either I or J is zero. +// + if ( i == 0 ) + { + q = i4_max ( 1, abs ( j ) ); + return q; + } + else if ( j == 0 ) + { + q = i4_max ( 1, abs ( i ) ); + return q; + } +// +// Set IP to the larger of I and J, IQ to the smaller. +// This way, we can alter IP and IQ as we go. +// + p = i4_max ( abs ( i ), abs ( j ) ); + q = i4_min ( abs ( i ), abs ( j ) ); +// +// Carry out the Euclidean algorithm. +// + for ( ; ; ) + { + r = p % q; + + if ( r == 0 ) + { + break; + } + p = q; + q = r; + } + + return q; +} +//****************************************************************************80 + +int i4_max ( int i1, int i2 ) + +//****************************************************************************80 +// +// Purpose: +// +// I4_MAX returns the maximum of two I4's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 13 October 1998 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int I1, I2, are two integers to be compared. +// +// Output, int I4_MAX, the larger of I1 and I2. +// +{ + int value; + + if ( i2 < i1 ) + { + value = i1; + } + else + { + value = i2; + } + return value; +} +//****************************************************************************80 + +int i4_min ( int i1, int i2 ) + +//****************************************************************************80 +// +// Purpose: +// +// I4_MIN returns the minimum of two I4's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 13 October 1998 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int I1, I2, two integers to be compared. +// +// Output, int I4_MIN, the smaller of I1 and I2. +// +{ + int value; + + if ( i1 < i2 ) + { + value = i1; + } + else + { + value = i2; + } + return value; +} +//****************************************************************************80 + +void i4mat_print ( int m, int n, int a[], string title ) + +//****************************************************************************80 +// +// Purpose: +// +// I4MAT_PRINT prints an I4MAT. +// +// Discussion: +// +// An I4MAT is an MxN array of I4's, stored by (I,J) -> [I+J*M]. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 10 September 2009 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int M, the number of rows in A. +// +// Input, int N, the number of columns in A. +// +// Input, int A[M*N], the M by N matrix. +// +// Input, string TITLE, a title. +// +{ + i4mat_print_some ( m, n, a, 1, 1, m, n, title ); + + return; +} +//****************************************************************************80 + +void i4mat_print_some ( int m, int n, int a[], int ilo, int jlo, int ihi, + int jhi, string title ) + +//****************************************************************************80 +// +// Purpose: +// +// I4MAT_PRINT_SOME prints some of an I4MAT. +// +// Discussion: +// +// An I4MAT is an MxN array of I4's, stored by (I,J) -> [I+J*M]. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 20 August 2010 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int M, the number of rows of the matrix. +// M must be positive. +// +// Input, int N, the number of columns of the matrix. +// N must be positive. +// +// Input, int A[M*N], the matrix. +// +// Input, int ILO, JLO, IHI, JHI, designate the first row and +// column, and the last row and column to be printed. +// +// Input, string TITLE, a title. +// +{ +# define INCX 10 + + int i; + int i2hi; + int i2lo; + int j; + int j2hi; + int j2lo; + + cout << "\n"; + cout << title << "\n"; + + if ( m <= 0 || n <= 0 ) + { + cout << "\n"; + cout << " (None)\n"; + return; + } +// +// Print the columns of the matrix, in strips of INCX. +// + for ( j2lo = jlo; j2lo <= jhi; j2lo = j2lo + INCX ) + { + j2hi = j2lo + INCX - 1; + if ( n < j2hi ) + { + j2hi = n; + } + if ( jhi < j2hi ) + { + j2hi = jhi; + } + + cout << "\n"; +// +// For each column J in the current range... +// +// Write the header. +// + cout << " Col:"; + for ( j = j2lo; j <= j2hi; j++ ) + { + cout << " " << setw(6) << j - 1; + } + cout << "\n"; + cout << " Row\n"; + cout << "\n"; +// +// Determine the range of the rows in this strip. +// + if ( 1 < ilo ) + { + i2lo = ilo; + } + else + { + i2lo = 1; + } + if ( ihi < m ) + { + i2hi = ihi; + } + else + { + i2hi = m; + } + + + for ( i = i2lo; i <= i2hi; i++ ) + { +// +// Print out (up to INCX) entries in row I, that lie in the current strip. +// + cout << setw(5) << i - 1 << ":"; + for ( j = j2lo; j <= j2hi; j++ ) + { + cout << " " << setw(6) << a[i-1+(j-1)*m]; + } + cout << "\n"; + } + } + + return; +# undef INCX +} +//****************************************************************************80 + +int i4mat_ref ( int m, int n, int a[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4MAT_REF computes the integer row echelon form (IREF) of an I4MAT. +// +// Discussion: +// +// If a matrix A contains only integer entries, then when it is reduced +// to row echelon form, it is likely that many entries will no longer +// be integers, due to the elimination process. +// +// In some cases, tiny arithmetic errors in this elimination process can +// result in spurious, tiny nonzero values which can invalidate the +// calculation, particular if the elimination is being done in an effort +// to determine the rank of the matrix. These serious errors can easily +// occur in very small matrices, such as of size 7x10. +// +// If we, instead, insist on using only integer operations on an integer +// matrix, we can guarantee that tiny roundoff errors will not cause +// such problems. On the other hand, as the elimination process proceeds, +// we may instead calculate integer matrix entries of increasingly +// large, and then ultimately meaningless magnitude. I imagine this is +// likely to happen for moderate size matrices of order 50x50, say, but +// this is a huge improvement over the unreliability of the real +// arithmetic case. +// +// +// Thus, we define "integer row echelon form" (IREF). +// +// +// A matrix is in integer row echelon form if: +// +// * The leading nonzero in each row is positive. +// +// * Each row has no common factor greater than 1. +// +// * The leading nonzero in each row occurs in a column to +// the right of the leading nonzero in the previous row. +// +// * Rows which are entirely zero occur last. +// +// Example: +// +// Input matrix: +// +// 1 3 0 2 6 3 1 +// -2 -6 0 -2 -8 3 1 +// 3 9 0 0 6 6 2 +// -1 -3 0 1 0 9 3 +// +// Output matrix: +// +// 1 3 0 2 6 3 1 +// 0 0 0 2 4 9 3 +// 0 0 0 0 0 3 1 +// 0 0 0 0 0 0 0 +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 26 August 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int M, N, the number of rows and columns of +// the matrix A. +// +// Input/output, int A[M*N]. On input, the matrix to be +// analyzed. On output, the IREF form of the matrix. +// +// Output, int I4MAT_REF, the pseudo-determinant. +// +{ + int det; + int i; + int j; + int lead; + int r; + int *row; + int t; + + det = 1; + lead = 0; + + row = new int[n]; + + for ( r = 0; r < m; r++ ) + { + if ( n - 1 < lead ) + { + break; + } +// +// Start I at row R, and search for nonzero pivot entry A(I,LEAD). +// + i = r; + + while ( a[i+lead*m] == 0 ) + { + i = i + 1; +// +// If reach last row, reset I to R, and increment LEAD. +// + if ( m - 1 < i ) + { + i = r; + lead = lead + 1; +// +// If reach last column, we can find no more pivots. +// + if ( n - 1 < lead ) + { + lead = -1; + break; + } + } + } + + if ( lead < 0 ) + { + break; + } +// +// Move pivot I into row R. +// + if ( i != r ) + { + for ( j = 0; j < n; j++ ) + { + t = a[i+j*m]; + a[i+j*m] = a[r+j*m]; + a[r+j*m] = t; + } + } +// +// Ensure pivot is positive. +// + if ( a[r+lead*m] < 0 ) + { + for ( j = 0; j < n; j++ ) + { + a[r+j*m] = - a[r+j*m]; + } + det = - det; + } +// +// Update the pseudo-determinant. +// + det = det * a[r+lead*m]; +// +// Remove any common factor from row R. +// + for ( j = 0; j < n; j++ ) + { + row[j] = a[r+j*m]; + } + i4vec_red ( n, row ); + for ( j = 0; j < n; j++ ) + { + a[r+j*m] = row[j]; + } +// +// Use a multiple of A(R,LEAD) to eliminate A(R+1:M,LEAD). +// + for ( i = r + 1; i < m; i++ ) + { + t = a[i+lead*m]; + for ( j = 0; j < n; j++ ) + { + a[i+j*m] = a[r+lead*m] * a[i+j*m] - t * a[r+j*m]; + } + + for ( j = 0; j < n; j++ ) + { + row[j] = a[i+j*m]; + } + i4vec_red ( n, row ); + for ( j = 0; j < n; j++ ) + { + a[i+j*m] = row[j]; + } + } + lead = lead + 1; + } + + delete [] row; + + return det; +} +//****************************************************************************80 + +void i4mat_row_reduce ( int m, int n, int i, int a[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4MAT_ROW_REDUCE divides out common factors in row I of an I4MAT. +// +// Discussion: +// +// An I4MAT is an MxN array of I4's, stored by (I,J) -> [I+J*M]. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 27 August 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int M, the number of rows in the matrix. +// +// Input, int N, the number of columns in the matrix. +// +// Input, int I, the row to be reduced. 0 <= I < M. +// +// Input/output, int A[M*N], on input, the matrix whose +// row is to be reduced. On output, row I of the matrix has been reduced. +// +{ + int j; + int *row; +// +// Remove factors common to a row. +// + row = new int[n]; + + for ( j = 0; j < n; j++ ) + { + row[j] = a[i+j*m]; + } + + i4vec_red ( n, row ); + + for ( j = 0; j < n; j++ ) + { + a[i+j*m] = row[j]; + } + + delete [] row; + + return; +} +//****************************************************************************80 + +void i4mat_row_swap ( int m, int n, int a[], int i1, int i2 ) + +//****************************************************************************80 +// +// Purpose: +// +// I4MAT_ROW_SWAP swaps rows in an I4MAT. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 09 September 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int M, N, the number of rows and columns. +// +// Input/output, int A[M*N]. +// On input, the matrix to be modified. +// On output, two rows have been swapped. +// +// Input, int I1, I2, the indices of the rows. +// 0 <= I1, I2 < M. +// +{ + int j; + int t; + + if ( i1 == i2 ) + { + return; + } + + if ( i1 < 0 || m <= i1 ) + { + cout << "\n"; + cout << "I4MAT_ROW_SWAP - Fatal error!\n"; + cout <<" Row index 0 <= I1 < M required.\n"; + exit ( 1 ); + } + + if ( i2 < 0 || m <= i2 ) + { + cout << "\n"; + cout << "I4MAT_ROW_SWAP - Fatal error!\n"; + cout << " Row index 0 <= I2 < M required.\n"; + exit ( 1 ); + } + + for ( j = 0; j < n; j++ ) + { + t = a[i1+j*m]; + a[i1+j*m] = a[i2+j*m]; + a[i2+j*m] = t; + } + + return; +} +//****************************************************************************80 + +int i4mat_rref ( int m, int n, int a[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4MAT_RREF: the integer row reduced echelon form (IRREF) of an I4MAT. +// +// Discussion: +// +// If a matrix A contains only integer entries, then when it is reduced +// to row echelon form, it is likely that many entries will no longer +// be integers, due to the elimination process. +// +// In some cases, tiny arithmetic errors in this elimination process can +// result in spurious, tiny nonzero values which can invalidate the +// calculation, particular if the elimination is being done in an effort +// to determine the rank of the matrix. These serious errors can easily +// occur in very small matrices, such as of size 7x10. +// +// If we, instead, insist on using only integer operations on an integer +// matrix, we can guarantee that tiny roundoff errors will not cause +// such problems. On the other hand, as the elimination process proceeds, +// we may instead calculate integer matrix entries of increasingly +// large, and then ultimately meaningless magnitude. I imagine this is +// likely to happen for moderate size matrices of order 50x50, say, but +// this is a huge improvement over the unreliability of the real +// arithmetic case. +// +// +// Thus, we define "integer row reduced echelon form" (IRREF). +// +// +// A matrix is in integer row reduced echelon form if: +// +// * The leading nonzero in each row is positive. +// +// * Each row has no common factor greater than 1. +// +// * The leading nonzero in each row occurs in a column to +// the right of the leading nonzero in the previous row. +// +// * Rows which are entirely zero occur last. +// +// * When a row contains a leading nonzero in column J, then column J +// is otherwise entirely zero. +// +// Example: +// +// Input matrix: +// +// 1 3 0 2 6 3 1 +// -2 -6 0 -2 -8 3 1 +// 3 9 0 0 6 6 2 +// -1 -3 0 1 0 9 3 +// +// Output matrix: +// +// 1 3 0 0 2 0 0 +// 0 0 0 1 2 0 0 +// 0 0 0 0 0 3 1 +// 0 0 0 0 0 0 0 +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 19 September 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int M, N, the number of rows and columns of +// the matrix A. +// +// Input/output, int A[M*N]. On input, the matrix to be +// analyzed. On output, the IRREF form of the matrix. +// +// Output, int I4MAT_RREF, the pseudo-determinant. +// +{ + int det; + int i; + int j; + int lead; + int r; + int *row; + int t; + + det = 1; + lead = 0; + + row = new int[n]; + + for ( r = 0; r < m; r++ ) + { + if ( n - 1 < lead ) + { + break; + } +// +// Start I at row R, and search for nonzero pivot entry A(I,LEAD). +// + i = r; + + while ( a[i+lead*m] == 0 ) + { + i = i + 1; +// +// If reach last row, reset I to R, and increment LEAD. +// + if ( m - 1 < i ) + { + i = r; + lead = lead + 1; +// +// If reach last column, we can find no more pivots. +// + if ( n - 1 < lead ) + { + lead = -1; + break; + } + } + } + + if ( lead < 0 ) + { + break; + } +// +// Move pivot I into row R. +// + if ( i != r ) + { + for ( j = 0; j < n; j++ ) + { + t = a[i+j*m]; + a[i+j*m] = a[r+j*m]; + a[r+j*m] = t; + } + } +// +// Ensure pivot is positive. +// + if ( a[r+lead*m] < 0 ) + { + for ( j = 0; j < n; j++ ) + { + a[r+j*m] = - a[r+j*m]; + } + det = - det; + } +// +// Update the pseudo-determinant. +// + det = det * a[r+lead*m]; +// +// Remove any common factor from row R. +// + for ( j = 0; j < n; j++ ) + { + row[j] = a[r+j*m]; + } + i4vec_red ( n, row ); + for ( j = 0; j < n; j++ ) + { + a[r+j*m] = row[j]; + } +// +// Use a multiple of A(R,LEAD) to eliminate A(1:M,LEAD). +// + for ( i = 0; i < m; i++ ) + { + if ( i != r ) + { + t = a[i+lead*m]; + for ( j = 0; j < n; j++ ) + { + a[i+j*m] = a[r+lead*m] * a[i+j*m] - t * a[r+j*m]; + } + + for ( j = 0; j < n; j++ ) + { + row[j] = a[i+j*m]; + } + i4vec_red ( n, row ); + for ( j = 0; j < n; j++ ) + { + a[i+j*m] = row[j]; + } + } + } + lead = lead + 1; + } + + delete [] row; + + return det; +} +//****************************************************************************80 + +double *i4mat_u_solve ( int n, int a[], int b[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4MAT_U_SOLVE solves an upper triangular linear system. +// +// Discussion: +// +// An I4MAT is an MxN array of I4's, stored by (I,J) -> [I+J*M]. +// +// Note that the solution is returned as a real vector. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 26 August 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of rows and columns of +// the matrix A. +// +// Input, int A[N*N], the N by N upper triangular matrix. +// +// Input, int B[N], the right hand side of the linear system. +// +// Output, double I4MAT_U_SOLVE[N], the solution of the linear system. +// +{ + int i; + int j; + double *x; +// +// Solve U * x = b. +// + x = new double[n]; + + for ( i = n - 1; 0 <= i; i-- ) + { + x[i] = ( double ) b[i]; + for ( j = i + 1; j < n; j++ ) + { + x[i] = x[i] - ( double ) a[i+j*n] * x[j]; + } + x[i] = x[i] / ( double ) a[i+i*n]; + } + + return x; +} +//****************************************************************************80 + +void i4vec_binary_next ( int n, int bvec[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4VEC_BINARY_NEXT generates the next binary vector. +// +// Discussion: +// +// The vectors have the order +// +// (0,0,...,0), +// (0,0,...,1), +// ... +// (1,1,...,1) +// +// and the "next" vector after (1,1,...,1) is (0,0,...,0). That is, +// we allow wrap around. +// +// Example: +// +// N = 3 +// +// Input Output +// ----- ------ +// 0 0 0 => 0 0 1 +// 0 0 1 => 0 1 0 +// 0 1 0 => 0 1 1 +// 0 1 1 => 1 0 0 +// 1 0 0 => 1 0 1 +// 1 0 1 => 1 1 0 +// 1 1 0 => 1 1 1 +// 1 1 1 => 0 0 0 +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 31 March 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the dimension of the vectors. +// +// Input, int BVEC[N], the vector whose successor is desired. +// +// Output, int BVEC[N], the successor to the input vector. +// +{ + int i; + + for ( i = n - 1; 0 <= i; i-- ) + { + if ( bvec[i] == 0 ) + { + bvec[i] = 1; + return; + } + bvec[i] = 0; + } + + return; +} +//****************************************************************************80 + +bool i4vec_is_binary ( int n, int x[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4VEC_IS_BINARY is true if the entries in an I4VEC are all 0 or 1. +// +// Discussion: +// +// An I4VEC is a vector of I4's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 31 March 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of entries in the vector. +// +// Input, int X[N], the vector to be checked. +// +// Output, bool I4VEC_IS_BINARY is true if all N elements of X +// are 0 or 1. +// +{ + int i; + bool value; + + value = true; + + for ( i = 0; i < n; i++ ) + { + if ( x[i] != 0 && x[i] != 1 ) + { + value = false; + break; + } + } + + return value; +} +//****************************************************************************80 + +bool i4vec_is_one ( int n, int x[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4VEC_IS_ONE is true if the entries in an I4VEC are all 1. +// +// Discussion: +// +// An I4VEC is a vector of I4's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 31 March 2018 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of entries in the vector. +// +// Input, int X[N], the vector to be checked. +// +// Output, bool I4VEC_IS_ONE is true if all N elements of X +// are 1. +// +{ + int i; + bool value; + + value = true; + + for ( i = 0; i < n; i++ ) + { + if ( x[i] != 1 ) + { + value = false; + break; + } + } + + return value; +} +//****************************************************************************80 + +void i4vec_print ( int n, int a[], string title ) + +//****************************************************************************80 +// +// Purpose: +// +// I4VEC_PRINT prints an I4VEC. +// +// Discussion: +// +// An I4VEC is a vector of I4's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 14 November 2003 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of components of the vector. +// +// Input, int A[N], the vector to be printed. +// +// Input, string TITLE, a title. +// +{ + int i; + + cout << "\n"; + cout << title << "\n"; + cout << "\n"; + for ( i = 0; i < n; i++ ) + { + cout << " " << setw(8) << i + << ": " << setw(8) << a[i] << "\n"; + } + return; +} +//****************************************************************************80 + +int i4vec_red ( int n, int a[] ) + +//****************************************************************************80 +// +// Purpose: +// +// I4VEC_RED divides out common factors in an I4VEC. +// +// Discussion: +// +// An I4VEC is a vector of I4's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 25 September 2005 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of entries in the vector. +// +// Input/output, int A[N], the vector to be reduced. +// On output, the entries have no common factor +// greater than 1. +// +// Output, int I4VEC_RED, the common factor that was divided out. +// +{ + int factor; + int i; +// +// Find the smallest nonzero value. +// + factor = 0; + + for ( i = 0; i < n; i++ ) + { + if ( a[i] != 0 ) + { + if ( factor == 0 ) + { + factor = abs ( a[i] ); + } + else if ( abs ( a[i] ) < factor ) + { + factor = abs ( a[i] ); + } + } + } + + if ( factor == 0 ) + { + return factor; + } +// +// Find the greatest common factor of the entire vector. +// + for ( i = 0; i < n; i++ ) + { + factor = i4_gcd ( a[i], factor ); + } + + if ( factor == 1 ) + { + return factor; + } +// +// Divide out the common factor. +// + for ( i = 0; i < n; i++ ) + { + a[i] = a[i] / factor; + } + + return factor; +} +//****************************************************************************80 + +void i4vec_transpose_print ( int n, int a[], string title ) + +//****************************************************************************80 +// +// Purpose: +// +// I4VEC_TRANSPOSE_PRINT prints an I4VEC "transposed". +// +// Discussion: +// +// An I4VEC is a vector of I4's. +// +// Example: +// +// A = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } +// TITLE = "My vector: " +// +// My vector: 1 2 3 4 5 +// 6 7 8 9 10 +// 11 +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 03 July 2004 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of components of the vector. +// +// Input, int A[N], the vector to be printed. +// +// Input, string TITLE, a title. +// +{ + int i; + int ihi; + int ilo; + int title_len; + + title_len = title.length ( ); + + if ( 0 < title_len ) + { + cout << "\n"; + cout << title << "\n"; + } + + if ( 0 < n ) + { + for ( ilo = 1; ilo <= n; ilo = ilo + 5 ) + { + ihi = ilo + 5 - 1; + if ( n < ihi ) + { + ihi = n; + } + for ( i = ilo; i <= ihi; i++ ) + { + cout << setw(12) << a[i-1]; + } + cout << "\n"; + } + } + else + { + cout << " (empty vector)\n"; + } + + return; +} +//****************************************************************************80 + +void ksub_next4 ( int n, int k, int a[], bool &done ) + +//****************************************************************************80 +// +// Purpose: +// +// KSUB_NEXT4 generates the subsets of size K from a set of size N. +// +// Discussion: +// +// The subsets are generated one at a time. +// +// The routine should be used by setting DONE to TRUE, and then calling +// repeatedly. Each call returns with DONE equal to FALSE, the array +// A contains information defining a new subset. When DONE returns +// equal to TRUE, there are no more subsets. +// +// There are ( N*(N-1)*...*(N+K-1)) / ( K*(K-1)*...*2*1) such subsets. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 23 August 2018 +// +// Author: +// +// Original FORTRAN77 version by Albert Nijenhuis, Herbert Wilf. +// C++ version by John Burkardt. +// +// Reference: +// +// Albert Nijenhuis, Herbert Wilf, +// Combinatorial Algorithms for Computers and Calculators, +// Second Edition, +// Academic Press, 1978, +// ISBN: 0-12-519260-6, +// LC: QA164.N54. +// +// Parameters: +// +// Input, int N, the size of the entire set. +// +// Input, int K, the size of the desired subset. K must be +// between 0 and N. +// +// Input/output, int A[K], contains information about +// the subsets. On the first call with DONE = TRUE, the input contents +// of A don't matter. Thereafter, the input value of A +// should be the same as the output value of the previous call. +// In other words, leave the array alone! +// On output, as long as DONE is returned FALSE, A contains +// information defining a subset of K elements of a set of N elements. +// In other words, A will contain K distinct numbers (in order) +// between 1 and N. +// +// Input/output, bool &DONE. +// On the first call, DONE is an input quantity with a value +// of TRUE which tells the program to initialize data and +// return the first subset. +// On return, DONE is an output quantity that is TRUE as long as +// the routine is returning another subset, and FALSE when +// there are no more. +// +{ + int j; + int jsave; + + if ( k < 0 ) + { + cerr << "\n"; + cerr << "KSUB_NEXT4 - Fatal error!\n"; + cerr << " K = " << k << "\n"; + cerr << " but 0 <= K is required!\n"; + exit ( 1 ); + } + + if ( n < k ) + { + cerr << "\n"; + cerr << "KSUB_NEXT4 - Fatal error!\n"; + cerr << " N = " << n << "\n"; + cerr << " K = " << k << "\n"; + cerr << " but K <= N is required!\n"; + exit ( 1 ); + } + +// +// First call: +// + if ( done ) + { + for ( j = 0; j < k; j++ ) + { + a[j] = j + 1; + } + done = false; + } +// +// Empty set returned on previous call. +// + else if ( n == 0 || k == 0 ) + { + done = true; + } +// +// Next call. +// + else if ( a[0] < n - k + 1 ) + { + jsave = k - 1; + + for ( j = 0; j < k - 1; j++ ) + { + if ( a[j] + 1 < a[j+1] ) + { + jsave = j; + break; + } + } + for ( j = 0; j < jsave; j++ ) + { + a[j] = j + 1; + } + a[jsave] = a[jsave] + 1; + done = false; + } + else + { + done = true; + } + return; +} +//****************************************************************************80 + +bool r8vec_is_integer ( int n, double a[] ) + +//****************************************************************************80 +// +// Purpose: +// +// R8VEC_IS_INTEGER is TRUE if an R8VEC is integral. +// +// Discussion: +// +// An R8VEC is a vector of R8's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 03 October 2005 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of entries in A. +// +// Input, double A[N], the vector +// +// Output, bool R8VEC_IS_INTEGER, is TRUE if every entry is an integer. +// +{ + int i; + bool value; + + value = true; + + for ( i = 0; i < n; i++ ) + { + if ( a[i] != ( double ) ( int ) a[i] ) + { + value = false; + break; + } + } + return value; +} +//****************************************************************************80 + +void r8vec_print ( int n, double a[], string title ) + +//****************************************************************************80 +// +// Purpose: +// +// R8VEC_PRINT prints an R8VEC. +// +// Discussion: +// +// An R8VEC is a vector of R8's. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 16 August 2004 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of components of the vector. +// +// Input, double A[N], the vector to be printed. +// +// Input, string TITLE, a title. +// +{ + int i; + + cout << "\n"; + cout << title << "\n"; + cout << "\n"; + for ( i = 0; i < n; i++ ) + { + cout << " " << setw(8) << i + << ": " << setw(14) << a[i] << "\n"; + } + + return; +} +//****************************************************************************80 + +void r8vec_transpose_print ( int n, double a[], string title ) + +//****************************************************************************80 +// +// Purpose: +// +// R8VEC_TRANSPOSE_PRINT prints an R8VEC "transposed". +// +// Discussion: +// +// An R8VEC is a vector of R8's. +// +// Example: +// +// A = (/ 1.0, 2.1, 3.2, 4.3, 5.4, 6.5, 7.6, 8.7, 9.8, 10.9, 11.0 /) +// TITLE = 'My vector: ' +// +// My vector: 1.0 2.1 3.2 4.3 5.4 +// 6.5 7.6 8.7 9.8 10.9 +// 11.0 +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 11 May 2014 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, int N, the number of components of the vector. +// +// Input, double A[N], the vector to be printed. +// +// Input, string TITLE, a title. +// +{ + int i; + int ihi; + int ilo; + int title_length; + + title_length = s_len_trim ( title ); + + for ( ilo = 0; ilo < n; ilo = ilo + 5 ) + { + if ( ilo == 0 ) + { + cout << title; + } + else + { + for ( i = 0; i < title_length; i++ ) + { + cout << " "; + } + } + cout << " "; + ihi = i4_min ( ilo + 5, n ); + for ( i = ilo; i < ihi; i++ ) + { + cout << " " << setw(12) << a[i]; + } + cout << "\n"; + } + + return; +} +//****************************************************************************80 + +int s_len_trim ( string s ) + +//****************************************************************************80 +// +// Purpose: +// +// S_LEN_TRIM returns the length of a string to the last nonblank. +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 05 July 2009 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// Input, string S, a string. +// +// Output, int S_LEN_TRIM, the length of the string to the last nonblank. +// If S_LEN_TRIM is 0, then the string is entirely blank. +// +{ + int n; + + n = s.length ( ); + + while ( 0 < n ) + { + if ( s[n-1] != ' ' ) + { + return n; + } + n = n - 1; + } + + return n; +} +//****************************************************************************80 + +void timestamp ( ) + +//****************************************************************************80 +// +// Purpose: +// +// TIMESTAMP prints the current YMDHMS date as a time stamp. +// +// Example: +// +// 31 May 2001 09:45:54 AM +// +// Licensing: +// +// This code is distributed under the GNU LGPL license. +// +// Modified: +// +// 08 July 2009 +// +// Author: +// +// John Burkardt +// +// Parameters: +// +// None +// +{ +# define TIME_SIZE 40 + + static char time_buffer[TIME_SIZE]; + const struct std::tm *tm_ptr; + std::time_t now; + + now = std::time ( NULL ); + tm_ptr = std::localtime ( &now ); + + std::strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm_ptr ); + + std::cout << time_buffer << "\n"; + + return; +# undef TIME_SIZE +} + diff --git a/contrib/QuadMeshingTools/row_echelon_integer.hpp b/contrib/QuadMeshingTools/row_echelon_integer.hpp new file mode 100644 index 0000000000000000000000000000000000000000..3de8630c2a94134c0a58fb449004c36d41b92738 --- /dev/null +++ b/contrib/QuadMeshingTools/row_echelon_integer.hpp @@ -0,0 +1,31 @@ +/* Author: John Burkardt + * Link: https://people.sc.fsu.edu/~jburkardt/cpp_src/row_echelon_integer/row_echelon_integer.html + * License: The computer code and data files made available on this web page are distributed under the GNU LGPL license. + * https://www.gnu.org/licenses/lgpl-3.0.en.html */ + +#include <string> + +int i4_gcd ( int i, int j ); +int i4_max ( int i1, int i2 ); +int i4_min ( int i1, int i2 ); +void i4mat_print ( int m, int n, int a[], std::string title ); +void i4mat_print_some ( int m, int n, int a[], int ilo, int jlo, int ihi, + int jhi, std::string title ); +int i4mat_ref ( int m, int n, int a[] ); +void i4mat_row_reduce ( int m, int n, int i, int a[] ); +void i4mat_row_swap ( int m, int n, int a[], int i, int r ); +int i4mat_rref ( int m, int n, int a[] ); +double *i4mat_u_solve ( int n, int a[], int b[] ); +void i4vec_binary_next ( int n, int bvec[] ); +bool i4vec_is_binary ( int n, int x[] ); +bool i4vec_is_one ( int n, int x[] ); +void i4vec_print ( int n, int a[], std::string title ); +int i4vec_red ( int n, int a[] ); +void i4vec_transpose_print ( int n, int a[], std::string title ); +void ksub_next4 ( int n, int k, int a[], bool &done ); +bool r8vec_is_integer ( int n, double a[] ); +void r8vec_print ( int n, double a[], std::string title ); +void r8vec_transpose_print ( int n, double a[], std::string title ); +int s_len_trim ( std::string s ); +void timestamp ( ); + diff --git a/contrib/domhex/BGMBase.cpp b/contrib/domhex/BGMBase.cpp index ebf8d7b58037a5f4f45bdb606dd3e4030fea9192..ab1fe842a851ddab58861b647069ee0e2d43a99b 100644 --- a/contrib/domhex/BGMBase.cpp +++ b/contrib/domhex/BGMBase.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -31,7 +31,7 @@ void BGMBase::export_scalar(const std::string &filename, elem = getElement(i); nvertex = elem->getNumVertices(); type = elem->getType(); - const char *s = nullptr; + const char *s = 0; switch(type) { case TYPE_PNT: s = "SP"; break; case TYPE_LIN: s = "SL"; break; @@ -89,7 +89,7 @@ void BGMBase::export_vector(const std::string &filename, elem = getElement(i); nvertex = elem->getNumVertices(); type = elem->getType(); - const char *s = nullptr; + const char *s = 0; switch(type) { case TYPE_PNT: s = "VP"; break; case TYPE_LIN: s = "VL"; break; @@ -141,7 +141,7 @@ void BGMBase::export_tensor_as_vectors( fprintf(f, "View \"Background Mesh\"{\n"); - auto it = _whatToPrint.begin(); + TensorStorageType::const_iterator it = _whatToPrint.begin(); const char *s = "VP"; for(; it != _whatToPrint.end(); it++) { // for all vertices @@ -158,7 +158,7 @@ void BGMBase::export_tensor_as_vectors( } BGMBase::BGMBase(int dim, GEntity *_gf) - : octree(nullptr), gf(_gf), DIM(dim), order(1) + : octree(NULL), gf(_gf), DIM(dim), order(1) { } @@ -166,7 +166,7 @@ BGMBase::~BGMBase() {} bool BGMBase::inDomain(double u, double v, double w) { - return (findElement(u, v, w) != nullptr); + return (findElement(u, v, w) != NULL); } const MElement *BGMBase::findElement(double u, double v, double w, bool strict) @@ -224,7 +224,7 @@ double BGMBase::size(const MVertex *v) { return get_nodal_value(v, sizeField); } std::vector<double> BGMBase::get_nodal_value(const MVertex *v, const VectorStorageType &data) const { - auto itfind = data.find(v); + VectorStorageType::const_iterator itfind = data.find(v); if(itfind == data.end()) { Msg::Error("Unknown vertex %d in BGMBase::get_nodal_value", v->getNum()); return std::vector<double>(3, 0.); @@ -235,7 +235,7 @@ BGMBase::get_nodal_value(const MVertex *v, const VectorStorageType &data) const double BGMBase::get_nodal_value(const MVertex *v, const DoubleStorageType &data) const { - auto itfind = data.find(v); + DoubleStorageType::const_iterator itfind = data.find(v); if(itfind == data.end()) { Msg::Error("Unknown vertex %d in BGMBase::get_nodal_value", v->getNum()); return 0.; @@ -250,7 +250,8 @@ BGMBase::get_nodal_values(const MElement *e, std::vector<std::vector<double> > res(e->getNumVertices()); for(std::size_t i = 0; i < e->getNumVertices(); i++) { - auto itfind = data.find(const_cast<MVertex *>(e->getVertex(i))); + VectorStorageType::const_iterator itfind = + data.find(const_cast<MVertex *>(e->getVertex(i))); for(int j = 0; j < 3; j++) res[i].push_back((itfind->second)[j]); } return res; diff --git a/contrib/domhex/BackgroundMesh2D.cpp b/contrib/domhex/BackgroundMesh2D.cpp index 84999c89e7f2789c797ef74dc76464ae0d2d51f1..b9933e6a11b5d8359ab3e417f19ea3badad4198d 100644 --- a/contrib/domhex/BackgroundMesh2D.cpp +++ b/contrib/domhex/BackgroundMesh2D.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -111,9 +111,13 @@ void backgroundMesh2D::reset(bool erase_2D3D) create_face_mesh(); // computes the mesh sizes at nodes - if(CTX::instance()->mesh.lcFromPoints) { computeSizeField(); } + if(CTX::instance()->mesh.lcFromPoints) { + computeSizeField(); + } else - for(auto itv2 = _2Dto3D.begin(); itv2 != _2Dto3D.end(); ++itv2) + for(std::map<MVertex const *const, MVertex *>::iterator itv2 = + _2Dto3D.begin(); + itv2 != _2Dto3D.end(); ++itv2) sizeField[itv2->first] = CTX::instance()->mesh.lcMax; // ensure that other criteria are fullfilled @@ -130,7 +134,7 @@ void backgroundMesh2D::unset() for(unsigned int i = 0; i < vertices.size(); i++) delete vertices[i]; for(unsigned int i = 0; i < getNumMeshElements(); i++) delete elements[i]; if(octree) delete octree; - octree = nullptr; + octree = NULL; } void backgroundMesh2D::create_mesh_copy() @@ -147,8 +151,8 @@ void backgroundMesh2D::create_mesh_copy() MVertex *news[3]; for(int j = 0; j < 3; j++) { MVertex *v = e->getVertex(j); - auto it = _3Dto2D.find(v); - MVertex *newv = nullptr; + std::map<MVertex const *const, MVertex *>::iterator it = _3Dto2D.find(v); + MVertex *newv = 0; if(it == _3Dto2D.end()) { SPoint2 p; reparamMeshVertexOnFace(v, face, p); @@ -207,13 +211,14 @@ void backgroundMesh2D::propagateValues(DoubleStorageType &dirichlet, linearSystemCSRGmm<double> *_lsys = new linearSystemCSRGmm<double>; _lsys->setGmres(1); #else - linearSystemFull<double> *_lsys = new linearSystemFull<double>; + linearSystemFull<double> *_lsys = new linearSystemFull<double>; #endif dofManager<double> myAssembler(_lsys); // fix boundary conditions - for(auto itv = dirichlet.begin(); itv != dirichlet.end(); ++itv) { + for(DoubleStorageType::iterator itv = dirichlet.begin(); + itv != dirichlet.end(); ++itv) { myAssembler.fixVertex(itv->first, 0, 1, itv->second); } @@ -232,7 +237,7 @@ void backgroundMesh2D::propagateValues(DoubleStorageType &dirichlet, std::map<MVertex *, SPoint3> theMap; if(in_parametric_plane) { - for(auto it = vs.begin(); it != vs.end(); ++it) { + for(std::set<MVertex *>::iterator it = vs.begin(); it != vs.end(); ++it) { SPoint2 p; reparamMeshVertexOnFace(*it, face, p); theMap[*it] = SPoint3((*it)->x(), (*it)->y(), (*it)->z()); @@ -240,11 +245,11 @@ void backgroundMesh2D::propagateValues(DoubleStorageType &dirichlet, } } - for(auto it = vs.begin(); it != vs.end(); ++it) + for(std::set<MVertex *>::iterator it = vs.begin(); it != vs.end(); ++it) myAssembler.numberVertex(*it, 0, 1); // Assemble - laplaceTerm l(nullptr, 1, &eval_diffusivity); + laplaceTerm l(0, 1, &eval_diffusivity); for(unsigned int k = 0; k < face->triangles.size(); k++) { MTriangle *t = face->triangles[k]; SElement se(t); @@ -252,15 +257,17 @@ void backgroundMesh2D::propagateValues(DoubleStorageType &dirichlet, } // Solve - if(myAssembler.sizeOfR()) { _lsys->systemSolve(); } + if(myAssembler.sizeOfR()) { + _lsys->systemSolve(); + } // save solution - for(auto it = vs.begin(); it != vs.end(); ++it) { + for(std::set<MVertex *>::iterator it = vs.begin(); it != vs.end(); ++it) { myAssembler.getDofValue(*it, 0, 1, dirichlet[*it]); } if(in_parametric_plane) { - for(auto it = vs.begin(); it != vs.end(); ++it) { + for(std::set<MVertex *>::iterator it = vs.begin(); it != vs.end(); ++it) { SPoint3 p = theMap[(*it)]; (*it)->setXYZ(p.x(), p.y(), p.z()); } @@ -278,7 +285,7 @@ void backgroundMesh2D::computeSizeField() } std::vector<GEdge *> const &e = face->edges(); - auto it = e.begin(); + std::vector<GEdge *>::const_iterator it = e.begin(); DoubleStorageType sizes; for(; it != e.end(); ++it) { @@ -292,7 +299,7 @@ void backgroundMesh2D::computeSizeField() (v1->z() - v2->z()) * (v1->z() - v2->z())); for(int k = 0; k < 2; k++) { MVertex *v = (*it)->lines[i]->getVertex(k); - auto itv = sizes.find(v); + DoubleStorageType::iterator itv = sizes.find(v); if(itv == sizes.end()) sizes[v] = std::log(d); else @@ -306,7 +313,7 @@ void backgroundMesh2D::computeSizeField() simpleFunction<double> ONE(1.0); propagateValues(sizes, ONE); - auto itv2 = _2Dto3D.begin(); + std::map<MVertex const *const, MVertex *>::iterator itv2 = _2Dto3D.begin(); for(; itv2 != _2Dto3D.end(); ++itv2) { MVertex const *const v_2D = itv2->first; MVertex *v_3D = itv2->second; @@ -323,7 +330,7 @@ inline double myAngle(const SVector3 &a, const SVector3 &b, const SVector3 &d) void backgroundMesh2D::updateSizes() { - auto itv = sizeField.begin(); + DoubleStorageType::iterator itv = sizeField.begin(); for(; itv != sizeField.end(); ++itv) { SPoint2 p; MVertex const *const v = _2Dto3D[itv->first]; @@ -364,14 +371,14 @@ void backgroundMesh2D::updateSizes() } const double _beta = 1.3; for(int i = 0; i < 0; i++) { - auto it = edges.begin(); + std::set<MEdge, MEdgeLessThan>::iterator it = edges.begin(); for(; it != edges.end(); ++it) { MVertex *v0 = it->getVertex(0); MVertex *v1 = it->getVertex(1); MVertex *V0 = _2Dto3D[v0]; MVertex *V1 = _2Dto3D[v1]; - auto s0 = sizeField.find(V0); - auto s1 = sizeField.find(V1); + DoubleStorageType::iterator s0 = sizeField.find(V0); + DoubleStorageType::iterator s1 = sizeField.find(V1); if(s0->second < s1->second) s1->second = std::min(s1->second, _beta * s0->second); else @@ -473,7 +480,7 @@ void frameFieldBackgroundMesh2D::computeCrossField( return; } std::vector<GEdge *> const &e = face->edges(); - auto it = e.begin(); + std::vector<GEdge *>::const_iterator it = e.begin(); for(; it != e.end(); ++it) { if(!(*it)->isSeam(face)) { @@ -495,8 +502,8 @@ void frameFieldBackgroundMesh2D::computeCrossField( double _angle = myAngle(t1, d1, n); normalizeAngle(_angle); for(int i = 0; i < 2; i++) { - auto itc = _cosines4.find(v[i]); - auto its = _sines4.find(v[i]); + DoubleStorageType::iterator itc = _cosines4.find(v[i]); + DoubleStorageType::iterator its = _sines4.find(v[i]); if(itc != _cosines4.end()) { itc->second = 0.5 * (itc->second + std::cos(4 * _angle)); its->second = 0.5 * (its->second + std::sin(4 * _angle)); @@ -513,7 +520,7 @@ void frameFieldBackgroundMesh2D::computeCrossField( propagateValues(_cosines4, eval_diffusivity, false); propagateValues(_sines4, eval_diffusivity, false); - auto itv2 = _2Dto3D.begin(); + std::map<MVertex const *const, MVertex *>::iterator itv2 = _2Dto3D.begin(); for(; itv2 != _2Dto3D.end(); ++itv2) { MVertex const *const v_2D = itv2->first; MVertex *v_3D = itv2->second; @@ -574,7 +581,8 @@ void frameFieldBackgroundMesh2D::computeSmoothness() // build vertex -> neighbors table std::multimap<MVertex *, MVertex *> vertex2vertex; - for(auto it = beginelements(); it != endelements(); it++) { + for(std::vector<MElement *>::iterator it = beginelements(); + it != endelements(); it++) { MElement *e = *it; for(std::size_t i = 0; i < e->getNumVertices(); i++) { MVertex *current = e->getVertex(i); @@ -587,7 +595,8 @@ void frameFieldBackgroundMesh2D::computeSmoothness() } // compute smoothness - for(auto it = beginvertices(); it != endvertices(); it++) { + for(std::vector<MVertex *>::iterator it = beginvertices(); + it != endvertices(); it++) { MVertex *v = *it; double angle_current = angle(v); // compare to all neighbors... @@ -596,8 +605,8 @@ void frameFieldBackgroundMesh2D::computeSmoothness() range = vertex2vertex.equal_range(v); double minangle, totalangle = 0.; int N = 0; - for(auto itneighbor = range.first; itneighbor != range.second; - itneighbor++) { + for(std::multimap<MVertex *, MVertex *>::iterator itneighbor = range.first; + itneighbor != range.second; itneighbor++) { N++; minangle = M_PI / 2; MVertex *v_nb = itneighbor->second; @@ -627,7 +636,8 @@ void frameFieldBackgroundMesh2D::exportCrossField(const std::string &filename) deltas[0] = 0.; deltas[1] = M_PI; - for(auto it = beginvertices(); it != endvertices(); it++) { + for(std::vector<MVertex *>::iterator it = beginvertices(); + it != endvertices(); it++) { MVertex *v = *it; double angle_current = angle(v); GPoint p = get_GPoint_from_MVertex(v); @@ -725,7 +735,9 @@ bool frameFieldBackgroundMesh2D::compute_RK_infos(double u, double v, double x, FieldManager *fields = gf->model()->getFields(); if(fields->getBackgroundField() > 0) { Field *f = fields->get(fields->getBackgroundField()); - if(!f->isotropic()) { (*f)(x, y, z, infos.metricField, gf); } + if(!f->isotropic()) { + (*f)(x, y, z, infos.metricField, gf); + } else { L = (*f)(x, y, z, gf); infos.metricField = SMetric3(1. / (L * L)); diff --git a/contrib/domhex/BackgroundMesh2D.h b/contrib/domhex/BackgroundMesh2D.h index be68e1706775e3c6984d4454a9c52362053d5b67..db26ec1a49f76928863f7e00f2da7c901801e220 100644 --- a/contrib/domhex/BackgroundMesh2D.h +++ b/contrib/domhex/BackgroundMesh2D.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/BackgroundMesh3D.cpp b/contrib/domhex/BackgroundMesh3D.cpp index b1be0546a065e5574ebd1a27707ae70132273e1b..a26fe88b4b6e62031f56242229fbeadd792443c1 100644 --- a/contrib/domhex/BackgroundMesh3D.cpp +++ b/contrib/domhex/BackgroundMesh3D.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -69,7 +69,8 @@ void backgroundMesh3D::computeSizeField() MVertex *v; MElement *e; - for(auto it = faces.begin(); it != faces.end(); it++) { // for all GFace + for(std::vector<GFace *>::iterator it = faces.begin(); it != faces.end(); + it++) { // for all GFace GFace *face = *it; frameFieldBackgroundMesh2D *bgm2d = dynamic_cast<frameFieldBackgroundMesh2D *>(BGMManager::get(face)); @@ -117,7 +118,7 @@ void backgroundMesh3D::propagateValues(DoubleStorageType &dirichlet, linearSystemCSRGmm<double> *lsys = new linearSystemCSRGmm<double>; lsys->setGmres(1); #else - linearSystemFull<double> *lsys = new linearSystemFull<double>; + linearSystemFull<double> *lsys = new linearSystemFull<double>; #endif size_t i; @@ -148,7 +149,9 @@ void backgroundMesh3D::propagateValues(DoubleStorageType &dirichlet, for(it = interior.begin(); it != interior.end(); it++) { it2 = dirichlet.find(*it); - if(it2 == dirichlet.end()) { assembler.numberVertex(*it, 0, 1); } + if(it2 == dirichlet.end()) { + assembler.numberVertex(*it, 0, 1); + } } for(i = 0; i < gr->tetrahedra.size(); i++) { @@ -157,7 +160,7 @@ void backgroundMesh3D::propagateValues(DoubleStorageType &dirichlet, count2 = 0; volume = 0.0; - laplaceTerm term(nullptr, 1, &eval_diffusivity); + laplaceTerm term(0, 1, &eval_diffusivity); for(i = 0; i < gr->tetrahedra.size(); i++) { SElement se(gr->tetrahedra[i]); term.addToMatrix(assembler, &se); @@ -167,7 +170,9 @@ void backgroundMesh3D::propagateValues(DoubleStorageType &dirichlet, // printf("number of tetrahedra = %d\n",count2); // printf("volume = %f\n",volume); - if(assembler.sizeOfR()) { lsys->systemSolve(); } + if(assembler.sizeOfR()) { + lsys->systemSolve(); + } for(it = interior.begin(); it != interior.end(); it++) { assembler.getDofValue(*it, 0, 1, val); @@ -214,7 +219,7 @@ MElementOctree *backgroundMesh3D::getOctree() GRegion *gr = dynamic_cast<GRegion *>(gf); if(!gr) { Msg::Error("Entity is not a region in background mesh"); - return nullptr; + return 0; } Msg::Debug("Rebuilding BackgroundMesh element octree"); std::vector<MElement *> copy(gr->tetrahedra.begin(), gr->tetrahedra.end()); @@ -229,7 +234,7 @@ MVertex *backgroundMesh3D::get_nearest_neighbor(const double *xyz, // using the octree instead of ANN, faster. MElement *elem = const_cast<MElement *>(findElement(xyz[0], xyz[1], xyz[2])); - if(!elem) return nullptr; + if(!elem) return NULL; std::vector<MVertex *> candidates(elem->getNumVertices()); std::vector<double> distances(elem->getNumVertices()); @@ -239,7 +244,8 @@ MVertex *backgroundMesh3D::get_nearest_neighbor(const double *xyz, candidates[i] = v; distances[i] = p.distance(v->point()); } - auto itmax = std::max_element(distances.begin(), distances.end()); + std::vector<double>::iterator itmax = + std::max_element(distances.begin(), distances.end()); return candidates[std::distance(distances.begin(), itmax)]; // map<double,MVertex*> distances; @@ -283,7 +289,9 @@ frameFieldBackgroundMesh3D::frameFieldBackgroundMesh3D(GRegion *_gr) initiate_ANN_research(); initiate_crossfield(); - if(smooth_the_crossfield) { computeCrossField(); } + if(smooth_the_crossfield) { + computeCrossField(); + } else { computeSmoothnessOnlyFromBoundaries(); } @@ -305,8 +313,8 @@ void frameFieldBackgroundMesh3D::initiate_ANN_research() dataPtsBnd = annAllocPts(maxPts, 3); int i = 0; MVertex *v; - for(auto it = listOfBndVertices.begin(); it != listOfBndVertices.end(); - it++) { + for(std::set<MVertex *>::iterator it = listOfBndVertices.begin(); + it != listOfBndVertices.end(); it++) { v = *it; for(int k = 0; k < 3; ++k) dataPtsBnd[i][k] = (v->point())[k]; ++i; @@ -329,22 +337,23 @@ void frameFieldBackgroundMesh3D::computeSmoothnessOnlyFromBoundaries() double mean_angle = 0.; std::vector<double> vectorial_smoothness(3); - for(auto it_vertex = vert2elem.begin(); it_vertex != vert2elem.end(); - it_vertex++) { // for all vertices + for(vert2elemtype::iterator it_vertex = vert2elem.begin(); + it_vertex != vert2elem.end(); it_vertex++) { // for all vertices themap.clear(); neighbors.clear(); MVertex const *current = it_vertex->first; std::pair<graphtype::const_iterator, graphtype::iterator> range = graph.equal_range(current); - auto itgraph = range.first; + graphtype::const_iterator itgraph = range.first; for(; itgraph != range.second; itgraph++) { // for all neighbors neighbors.insert(itgraph->second.second); } - for(auto it = neighbors.begin(); it != neighbors.end(); it++) { + for(std::set<MVertex const *>::iterator it = neighbors.begin(); + it != neighbors.end(); it++) { themap.insert(std::make_pair(1., *it)); } - auto itcurrent = crossField.find(current); + TensorStorageType::iterator itcurrent = crossField.find(current); STensor3 &ref = itcurrent->second; crossFieldSmoothness[current] = @@ -377,8 +386,8 @@ void frameFieldBackgroundMesh3D::computeCrossField() std::map<MVertex const *const, bool> vertex_is_still; std::map<MVertex const *const, double> vertex_movement; - for(auto it_vertex = vert2elem.begin(); it_vertex != vert2elem.end(); - it_vertex++) { + for(vert2elemtype::iterator it_vertex = vert2elem.begin(); + it_vertex != vert2elem.end(); it_vertex++) { MVertex const *const current = it_vertex->first; vertex_is_still[current] = current->onWhat()->dim() <= 2; @@ -388,8 +397,8 @@ void frameFieldBackgroundMesh3D::computeCrossField() // OLD - NEW COMPARISON std::map<MVertex const *, double> vertex_to_rank; - for(auto it_vertex = vert2elem.begin(); it_vertex != vert2elem.end(); - it_vertex++) { // for all vertices + for(vert2elemtype::iterator it_vertex = vert2elem.begin(); + it_vertex != vert2elem.end(); it_vertex++) { // for all vertices // vertex_to_rank[it_vertex->first] = 0.; vertex_to_rank[it_vertex->first] = 1.; rank.insert(std::make_pair(0., it_vertex->first)); @@ -434,7 +443,7 @@ void frameFieldBackgroundMesh3D::computeCrossField() continue; } - auto itcurrent = crossField.find(current); + TensorStorageType::iterator itcurrent = crossField.find(current); STensor3 &ref = itcurrent->second; if(verbose) std::cout << "-------------------- working on point " @@ -445,7 +454,7 @@ void frameFieldBackgroundMesh3D::computeCrossField() std::pair<graphtype::iterator, graphtype::iterator> range = graph.equal_range(current); - auto itgraph = range.first; + graphtype::iterator itgraph = range.first; bool all_neighbors_still = true; // if nothing has changed since previous // iteration: nothing to do ! for(; itgraph != range.second; itgraph++) { // for all neighbors @@ -494,7 +503,8 @@ void frameFieldBackgroundMesh3D::computeCrossField() // iterations, convergence of the local cavity... for(; Nlocaliter < 20; Nlocaliter++) { - auto it_neighbors_to_trust = neighbors_to_trust.begin(); + std::multimap<double, MVertex const *>::iterator it_neighbors_to_trust = + neighbors_to_trust.begin(); crossFieldSmoothness[current] = compare_to_neighbors(current->point(), ref, it_neighbors_to_trust, neighbors_to_trust.end(), mean_axis, mean_angle, @@ -567,15 +577,15 @@ void frameFieldBackgroundMesh3D::computeCrossField() } // end Niter iterations // also computes smoothness for boundary points - for(auto it_vertex = vert2elem.begin(); it_vertex != vert2elem.end(); - it_vertex++) { + for(vert2elemtype::iterator it_vertex = vert2elem.begin(); + it_vertex != vert2elem.end(); it_vertex++) { MVertex const *const current = it_vertex->first; if(current->onWhat()->dim() <= 2) { - auto itcurrent = crossField.find(current); + TensorStorageType::iterator itcurrent = crossField.find(current); STensor3 &ref = itcurrent->second; std::pair<graphtype::iterator, graphtype::iterator> range = graph.equal_range(current); - auto itgraph = range.first; + graphtype::iterator itgraph = range.first; std::multimap<double, MVertex const *> neighbors_to_trust; itgraph = range.first; @@ -622,7 +632,8 @@ void frameFieldBackgroundMesh3D::initiate_crossfield() std::vector<GFace *> faces = gr->faces(); // here, not using the gm2D since we are interested by the new 2D vertices, // not the old (now erased) ones... alternative would be to reset the 2DBGM... - for(auto it = faces.begin(); it != faces.end(); it++) { // for all GFace + for(std::vector<GFace *>::iterator it = faces.begin(); it != faces.end(); + it++) { // for all GFace GFace *face = *it; frameFieldBackgroundMesh2D *bgm2d = dynamic_cast<frameFieldBackgroundMesh2D *>(BGMManager::get(face)); @@ -640,7 +651,7 @@ void frameFieldBackgroundMesh3D::initiate_crossfield() v = e->getVertex(iv); // if already done: continue - auto itfind = crossField.find(v); + TensorStorageType::iterator itfind = crossField.find(v); if(itfind != crossField.end()) continue; STensor3 cf; @@ -662,7 +673,7 @@ void frameFieldBackgroundMesh3D::initiate_crossfield() // if not in volume: continue if(v->onWhat()->dim() <= 2) continue; // if already done: continue - auto itfind = crossField.find(v); + TensorStorageType::iterator itfind = crossField.find(v); if(itfind != crossField.end()) continue; MVertex *closer_on_bnd = get_nearest_neighbor_on_boundary(v); crossField[v] = @@ -694,7 +705,7 @@ frameFieldBackgroundMesh3D::get_nearest_neighbor_on_boundary(MVertex *v, delete[] dists; annDeallocPt(q); - auto it = listOfBndVertices.begin(); + std::set<MVertex *>::iterator it = listOfBndVertices.begin(); std::advance(it, i); return (*it); #else @@ -811,7 +822,7 @@ const MElement *backgroundMesh3D::getElement(unsigned int i) const GRegion *gr = dynamic_cast<GRegion *>(gf); if(!gr) { Msg::Error("Entity is not a region in background mesh"); - return nullptr; + return 0; } return gr->getMeshElement(i); } @@ -835,8 +846,8 @@ void frameFieldBackgroundMesh3D::build_neighbors(const int &max_recursion_level) std::multimap<int, MVertex const *> proximity; // int counter=0; - for(auto it_vertex = vert2elem.begin(); it_vertex != vert2elem.end(); - it_vertex++) { // for all vertices + for(vert2elemtype::iterator it_vertex = vert2elem.begin(); + it_vertex != vert2elem.end(); it_vertex++) { // for all vertices MVertex const *const current_vertex = it_vertex->first; visited.clear(); visited_elements.clear(); @@ -848,7 +859,8 @@ void frameFieldBackgroundMesh3D::build_neighbors(const int &max_recursion_level) get_recursive_neighbors(start, visited, visited_elements, proximity, max_recursion_level); - for(auto it1 = proximity.begin(); it1 != proximity.end(); it1++) { + for(std::multimap<int, MVertex const *>::iterator it1 = proximity.begin(); + it1 != proximity.end(); it1++) { graph.insert(std::make_pair(current_vertex, std::make_pair(it1->first, it1->second))); } @@ -887,16 +899,16 @@ void frameFieldBackgroundMesh3D::get_recursive_neighbors( std::set<MVertex const *> new_vertices; - for(auto it_start = start.begin(); it_start != start.end(); - it_start++) { // for all initial vertices + for(std::set<MVertex const *>::iterator it_start = start.begin(); + it_start != start.end(); it_start++) { // for all initial vertices MVertex const *current = *it_start; // std::cout << "get_recursive_neighbors : on vertex " << // current->getNum() // << " (" << current << ")" << std::endl; - auto itfind = vert2elem.find(current); + vert2elemtype::iterator itfind = vert2elem.find(current); if(itfind == vert2elem.end()) continue; - auto it_elem = itfind->second.begin(); + std::set<MElement *>::iterator it_elem = itfind->second.begin(); for(; it_elem != itfind->second.end(); it_elem++) { // for all connected elements @@ -931,7 +943,7 @@ double frameFieldBackgroundMesh3D::compare_to_neighbors( { for(int i = 0; i < 3; i++) mean_axis(i) = 0.; - auto it = itbegin; + std::multimap<double, MVertex const *>::iterator it = itbegin; SVector3 rotation_axis; double minimum_angle; @@ -1001,11 +1013,11 @@ double frameFieldBackgroundMesh3D::compare_to_neighbors( M_PI * 4.; // APPROXIMATELY between 0 (not smooth) and 1 (smooth), // (sometimes <0, always > 1). - auto itan = all_angle.begin(); - auto itpond = ponderations_vec.begin(); + std::vector<double>::iterator itan = all_angle.begin(); + std::vector<double>::iterator itpond = ponderations_vec.begin(); - for(auto ita = all_axis.begin(); ita != all_axis.end(); - ita++, itan++, itpond++) { + for(std::vector<SVector3>::iterator ita = all_axis.begin(); + ita != all_axis.end(); ita++, itan++, itpond++) { // mean_axis += ((*ita)*(*itan)); mean_axis += ((*ita) * (*itan)) * (*itpond); } @@ -1264,7 +1276,7 @@ void frameFieldBackgroundMesh3D::exportVectorialSmoothness( const MElement *e = getElement(ie); for(std::size_t iv = 0; iv < e->getNumVertices(); iv++) { const MVertex *v = e->getVertex(iv); - auto itfind = done.find(v); + std::set<const MVertex *>::iterator itfind = done.find(v); if(itfind != done.end()) continue; done.insert(v); STensor3 cf; diff --git a/contrib/domhex/BackgroundMesh3D.h b/contrib/domhex/BackgroundMesh3D.h index 8fbe6a64bf864a5671d268fb5156ea2eb0552e1f..d3b6a7f4f1094fb37ba703768662c3cc16346363 100644 --- a/contrib/domhex/BackgroundMesh3D.h +++ b/contrib/domhex/BackgroundMesh3D.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/BackgroundMeshManager.cpp b/contrib/domhex/BackgroundMeshManager.cpp index 485a74c9aff90b364f8ec339af97c4ef106a4b15..c59bae0dd911a4bc4ca6fa6c9c74e04669b54dd3 100644 --- a/contrib/domhex/BackgroundMeshManager.cpp +++ b/contrib/domhex/BackgroundMeshManager.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -13,7 +13,7 @@ std::map<GEntity *, BGMBase *> BGMManager::data = std::map<GEntity *, BGMBase *>(); -BGMBase *BGMManager::latest2Dbgm = nullptr; +BGMBase *BGMManager::latest2Dbgm = NULL; bool BGMManager::use_cross_field = true; void BGMManager::set_use_cross_field(bool b) @@ -26,8 +26,10 @@ void BGMManager::set_use_cross_field(bool b) BGMBase *BGMManager::get(GRegion *gf) { - auto itfind = data.find(gf); - if(itfind != data.end()) { return itfind->second; } + std::map<GEntity *, BGMBase *>::iterator itfind = data.find(gf); + if(itfind != data.end()) { + return itfind->second; + } BGMBase *bgm = use_cross_field ? new frameFieldBackgroundMesh3D(gf) : new backgroundMesh3D(gf); @@ -38,7 +40,7 @@ BGMBase *BGMManager::get(GRegion *gf) BGMBase *BGMManager::get(GFace *gf) { - auto itfind = data.find(gf); + std::map<GEntity *, BGMBase *>::iterator itfind = data.find(gf); if(itfind != data.end()) { latest2Dbgm = itfind->second; return itfind->second; diff --git a/contrib/domhex/BackgroundMeshManager.h b/contrib/domhex/BackgroundMeshManager.h index 6dcabb59c4e7aed72d58d093c32c90a7a7636d92..eb95ae3c1e9f8f4de3b85243cdf4cf2b7fd079d7 100644 --- a/contrib/domhex/BackgroundMeshManager.h +++ b/contrib/domhex/BackgroundMeshManager.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/CMakeLists.txt b/contrib/domhex/CMakeLists.txt index 611213c0cae367690afc834bd3db0c0b0e423cf9..958c2c932d8fd85d0c3ecd8fe8e1bd69d84d101f 100644 --- a/contrib/domhex/CMakeLists.txt +++ b/contrib/domhex/CMakeLists.txt @@ -1,4 +1,4 @@ -# Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +# Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle # # See the LICENSE.txt file for license information. Please report all # issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/ThinLayer.cpp b/contrib/domhex/ThinLayer.cpp index fd85ecfd4b1be23e4483e7fd5f3e2a970a3f8022..f578f44d1609175ede868847cfe1005b6a7c3336 100644 --- a/contrib/domhex/ThinLayer.cpp +++ b/contrib/domhex/ThinLayer.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -66,7 +66,9 @@ void ThinLayer::perform() void ThinLayer::checkOppositeTriangles() { // all endTriangle will be set to active or not - for(auto it1 = VertexToCorresp.begin(); it1 != VertexToCorresp.end(); it1++) { + for(std::map<MVertex *, std::vector<CorrespVertices *> >::iterator it1 = + VertexToCorresp.begin(); + it1 != VertexToCorresp.end(); it1++) { std::vector<CorrespVertices *> vecCorr = (*it1).second; for(unsigned int i = 0; i < vecCorr.size(); i++) { CorrespVertices *currentCorr = vecCorr[i]; @@ -74,9 +76,12 @@ void ThinLayer::checkOppositeTriangles() MVertex *endP0 = currentEndTri.v[0]; MVertex *endP1 = currentEndTri.v[1]; MVertex *endP2 = currentEndTri.v[2]; - auto it2 = VertexToCorresp.find(endP0); - auto it3 = VertexToCorresp.find(endP1); - auto it4 = VertexToCorresp.find(endP2); + std::map<MVertex *, std::vector<CorrespVertices *> >::iterator it2 = + VertexToCorresp.find(endP0); + std::map<MVertex *, std::vector<CorrespVertices *> >::iterator it3 = + VertexToCorresp.find(endP1); + std::map<MVertex *, std::vector<CorrespVertices *> >::iterator it4 = + VertexToCorresp.find(endP2); (*it1).second[i]->setEndTriangleActive(false); if(it2 != VertexToCorresp.end()) { if(it3 != VertexToCorresp.end()) { @@ -97,7 +102,9 @@ void ThinLayer::checkOppositeTriangles() void ThinLayer::fillvecOfThinSheets() { - for(auto it1 = VertexToCorresp.begin(); it1 != VertexToCorresp.end(); it1++) { + for(std::map<MVertex *, std::vector<CorrespVertices *> >::iterator it1 = + VertexToCorresp.begin(); + it1 != VertexToCorresp.end(); it1++) { std::vector<CorrespVertices *> vecCorr = (*it1).second; for(unsigned int i = 0; i < vecCorr.size(); i++) { CorrespVertices *currentCorr = vecCorr[i]; @@ -110,7 +117,8 @@ void ThinLayer::fillvecOfThinSheets() (*it1).second[i]->setTagMaster(-1); faceXtet faceEndSlave = (*it1).second[i]->getEndTriangle(); for(unsigned int j = 0; j < 3; j++) { - auto it2 = VertexToCorresp.find(faceEndSlave.v[j]); + std::map<MVertex *, std::vector<CorrespVertices *> >::iterator it2 = + VertexToCorresp.find(faceEndSlave.v[j]); if(it2 != VertexToCorresp.end()) { if(faceEndSlave.v[j]->onWhat()->dim() == 2) { (*it2).second[0]->setTagMaster( @@ -129,7 +137,8 @@ void ThinLayer::fillvecOfThinSheets() for(std::size_t k = 0; k < surroundingTet[j]->getNumVertices(); k++) { MVertex *ToInsertTmp = surroundingTet[j]->getVertex(k); - auto it2 = VertexToCorresp.find(ToInsertTmp); + std::map<MVertex *, std::vector<CorrespVertices *> >::iterator + it2 = VertexToCorresp.find(ToInsertTmp); if(ToInsertTmp->onWhat()->tag() == VToDo->onWhat()->tag()) { // TODO: OR that onwhat -> dim <, for edges if(it2 != VertexToCorresp.end()) { @@ -142,7 +151,9 @@ void ThinLayer::fillvecOfThinSheets() (*it2).second[0]->setTagMaster(-1); faceXtet faceEndSlave2 = (*it2).second[0]->getEndTriangle(); for(unsigned int j = 0; j < 3; j++) { - auto it3 = VertexToCorresp.find(faceEndSlave2.v[j]); + std::map<MVertex *, + std::vector<CorrespVertices *> >::iterator it3 = + VertexToCorresp.find(faceEndSlave2.v[j]); if(it3 != VertexToCorresp.end()) { if(faceEndSlave2.v[j]->onWhat()->dim() == 2) { (*it3).second[0]->setTagMaster( @@ -171,12 +182,12 @@ std::map<MVertex *, double> ThinLayer::computeAllDistToOppSide() // std::vector<MElement*> crackElements; std::set<MVertex *> BoundaryVertices; - for(auto itr = m->firstRegion(); itr != m->lastRegion(); itr++) { + for(GModel::riter itr = m->firstRegion(); itr != m->lastRegion(); itr++) { GRegion *rTmp = (*itr); for(unsigned int i = 0; i < rTmp->tetrahedra.size(); i++) { MTet4 *tet4Tmp = TetToTet4[rTmp->tetrahedra[i]]; for(unsigned int j = 0; j < 4; j++) { - if(tet4Tmp->getNeigh(j) == nullptr) { + if(tet4Tmp->getNeigh(j) == 0) { // find the 4th point,and fill the two vector of the boundary triangle faceXtet fxtTmp(tet4Tmp, j); for(int k = 0; k < 3; k++) { @@ -192,7 +203,8 @@ std::map<MVertex *, double> ThinLayer::computeAllDistToOppSide() } } } - for(auto it = BoundaryVertices.begin(); it != BoundaryVertices.end(); it++) { + for(std::set<MVertex *>::iterator it = BoundaryVertices.begin(); + it != BoundaryVertices.end(); it++) { MVertex *toCompute = (*it); double resultTmp = computeDistToOppSide(toCompute); AllDistToOppSide[toCompute] = resultTmp; @@ -213,14 +225,14 @@ double ThinLayer::computeDistToOppSide(MVertex *v) MTet4 *PastTet = FirstTet; SPoint3 CurrentPos = SPoint3(v->x(), v->y(), v->z()); SPoint3 LastPos = CurrentPos; - int *CurrentTri = nullptr; + int *CurrentTri = 0; CorrespVertices CVTemp; CVTemp.setStartPoint(v); CVTemp.setStartNormal(InteriorNormal); FindNewPoint((&CurrentPos), CurrentTri, CurrentTet, InteriorNormal); faceXtet fxtCV(CurrentTet, (*CurrentTri)); // while(CurrentTet->getNeigh((*CurrentTri)) != 0){ - while(CurrentTet != nullptr) { + while(CurrentTet != 0) { PastTet = CurrentTet; faceXtet fxtCVtmp(PastTet, (*CurrentTri)); FindNewPoint((&CurrentPos), CurrentTri, CurrentTet, InteriorNormal); @@ -267,7 +279,7 @@ SVector3 ThinLayer::computeInteriorNormal(MVertex *v) for(unsigned int i = 0; i < currentVecTet.size(); i++) { MTet4 *tet4Tmp = TetToTet4[currentVecTet[i]]; for(int j = 0; j < 4; j++) { - if(tet4Tmp->getNeigh(j) == nullptr) { + if(tet4Tmp->getNeigh(j) == 0) { // find the 4th point,and fill the two vector of the boundary triangle faceXtet fxtTmp(tet4Tmp, j); for(int k = 0; k < 4; k++) { @@ -376,7 +388,7 @@ SVector3 ThinLayer::computeInteriorNormal(MVertex *v) MTet4 *ThinLayer::getTetFromPoint(MVertex *v, const SVector3 &InteriorNormal) { - MTet4 *TetToGet = nullptr; + MTet4 *TetToGet = 0; std::vector<MTetrahedron *> currentVecTet = VertexToTets[v]; for(unsigned int i = 0; i < currentVecTet.size(); i++) { std::vector<SVector3> vecDir; @@ -407,7 +419,9 @@ MTet4 *ThinLayer::getTetFromPoint(MVertex *v, const SVector3 &InteriorNormal) ThinLayer::IsPositivOrientation(vecDir[2], vecDir[0], InteriorNormal); if(isPositiv1) { if(isPositiv2) { - if(isPositiv3) { TetToGet = TetToTet4[currentVecTet[i]]; } + if(isPositiv3) { + TetToGet = TetToTet4[currentVecTet[i]]; + } } } } @@ -422,7 +436,9 @@ bool ThinLayer::IsPositivOrientation(const SVector3 &a, const SVector3 &b, a.x() * b.y() - a.y() * b.x()); double ProdScal = ProdVec.x() * c.x() + ProdVec.y() * c.y() + ProdVec.z() * c.z(); - if(ProdScal >= 0.0) { result = true; } + if(ProdScal >= 0.0) { + result = true; + } return result; } @@ -531,7 +547,7 @@ void ThinLayer::FindNewPoint(SPoint3 *CurrentPoint, int *CurrentTri, void ThinLayer::fillVertexToTets() { GModel *m = GModel::current(); - for(auto itr = m->firstRegion(); itr != m->lastRegion(); itr++) { + for(GModel::riter itr = m->firstRegion(); itr != m->lastRegion(); itr++) { GRegion *rTmp = (*itr); for(unsigned int i = 0; i < rTmp->tetrahedra.size(); i++) { MTetrahedron *elem = rTmp->tetrahedra[i]; @@ -545,7 +561,7 @@ void ThinLayer::fillVertexToTets() } } } - for(auto itr = m->firstRegion(); itr != m->lastRegion(); itr++) { + for(GModel::riter itr = m->firstRegion(); itr != m->lastRegion(); itr++) { GRegion *rTmp = (*itr); for(unsigned int i = 0; i < rTmp->tetrahedra.size(); i++) { MTetrahedron *elem = rTmp->tetrahedra[i]; @@ -561,7 +577,7 @@ void ThinLayer::fillTetToTet4() GModel *m = GModel::current(); std::vector<MTet4 *> vecAllTet4; vecAllTet4.clear(); - for(auto itr = m->firstRegion(); itr != m->lastRegion(); itr++) { + for(GModel::riter itr = m->firstRegion(); itr != m->lastRegion(); itr++) { GRegion *rTmp = (*itr); for(unsigned int i = 0; i < rTmp->tetrahedra.size(); i++) { MTetrahedron *elem = rTmp->tetrahedra[i]; diff --git a/contrib/domhex/ThinLayer.h b/contrib/domhex/ThinLayer.h index 57bc60d363fe97517c684c4c7fd22d9b1e38f04f..487e6ef33b52ef4bc3b6a5ed6f71ef108699be32 100644 --- a/contrib/domhex/ThinLayer.h +++ b/contrib/domhex/ThinLayer.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -18,7 +18,7 @@ struct faceXtet { MVertex *v[3], *unsorted[3]; MTet4 *t1; int i1; - faceXtet(MTet4 *_t = nullptr, int iFac = 0) : t1(_t), i1(iFac) + faceXtet(MTet4 *_t = 0, int iFac = 0) : t1(_t), i1(iFac) { MVertex *v0 = t1->tet()->getVertex(faces[iFac][0]); MVertex *v1 = t1->tet()->getVertex(faces[iFac][1]); @@ -30,9 +30,8 @@ struct faceXtet { v[0] = std::min(std::min(v0, v1), v2); v[2] = std::max(std::max(v0, v1), v2); - v[1] = (v0 != v[0] && v0 != v[2]) ? v0 : - (v1 != v[0] && v1 != v[2]) ? v1 : - v2; + v[1] = + (v0 != v[0] && v0 != v[2]) ? v0 : (v1 != v[0] && v1 != v[2]) ? v1 : v2; // // std::sort(v, v + 3); } diff --git a/contrib/domhex/cross3D.h b/contrib/domhex/cross3D.h index 803b9ffa89daa97f5d467f20d9bea7b34eb158a1..a8efcd4459098bdad353e18320606fc6fe95ece9 100644 --- a/contrib/domhex/cross3D.h +++ b/contrib/domhex/cross3D.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -552,12 +552,16 @@ double computeSetSmoothness(std::vector<cross3D> S) } } // on a trouve le quat approprie - for(unsigned int j = 0; j < 4; j++) { qmean[j] += qTmp[j]; } + for(unsigned int j = 0; j < 4; j++) { + qmean[j] += qTmp[j]; + } } double normQt = sqrt(qmean[0] * qmean[0] + qmean[1] * qmean[1] + qmean[2] * qmean[2] + qmean[3] * qmean[3]); if(normQt != 0.0) { - for(unsigned int j = 0; j < 4; j++) { qmean[j] = qmean[j] / normQt; } + for(unsigned int j = 0; j < 4; j++) { + qmean[j] = qmean[j] / normQt; + } } for(it1 = S.begin(); it1 != S.end(); it1++) { // pour chaque element du set @@ -568,7 +572,9 @@ double computeSetSmoothness(std::vector<cross3D> S) // on trouve la cross appropriee Qtn qTmpi = cTmp.get(i).correspQuat(); double prodVeci = 0.0; - for(unsigned int j = 0; j < 4; j++) { prodVeci += qmean[j] * qTmpi.v[j]; } + for(unsigned int j = 0; j < 4; j++) { + prodVeci += qmean[j] * qTmpi.v[j]; + } if(prodVeci >= 0.0) { if(prodVeci > prodVecMin) { prodVecMin = prodVeci; @@ -585,7 +591,9 @@ double computeSetSmoothness(std::vector<cross3D> S) } } // on a trouve le quat approprie - if(prodVecMin < result) { result = prodVecMin; } + if(prodVecMin < result) { + result = prodVecMin; + } } return result; } diff --git a/contrib/domhex/directions3D.cpp b/contrib/domhex/directions3D.cpp index 35d403c4ea772010d9cb358d56f5457b9377a36e..df2de3a073579c408ed63e0eee73d17523627f2c 100644 --- a/contrib/domhex/directions3D.cpp +++ b/contrib/domhex/directions3D.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -116,7 +116,9 @@ STensor3 Frame_field::search(double x, double y, double z) ANNidxArray indices; ANNdistArray distances; - if(field.size() <= 1) { return STensor3(1.0); } + if(field.size() <= 1) { + return STensor3(1.0); + } query = annAllocPt(3); query[0] = x; @@ -139,7 +141,9 @@ STensor3 Frame_field::search(double x, double y, double z) #endif if(fabs(sqrt(distance2) - sqrt(distance1)) < e2) { - if(labels[index2] < labels[index1]) { return field[index2].second; } + if(labels[index2] < labels[index1]) { + return field[index2].second; + } else { return field[index1].second; } @@ -174,7 +178,9 @@ STensor3 Frame_field::combine(double x, double y, double z) val2 = fabs(dot(vec, vec2)); val3 = fabs(dot(vec, vec3)); - if(val1 <= val2 && val1 <= val3) { other = vec1; } + if(val1 <= val2 && val1 <= val3) { + other = vec1; + } else if(val2 <= val1 && val2 <= val3) { other = vec2; } @@ -340,7 +346,8 @@ int Frame_field::build_vertex_to_vertices(GEntity *gr, int onWhat, MVertex *pVertex = pElem->getVertex(j); if(onWhat > 0 && pVertex->onWhat()->dim() != onWhat) continue; - auto it = vertex_to_vertices.find(pVertex); + std::map<MVertex *, std::set<MVertex *> >::iterator it = + vertex_to_vertices.find(pVertex); if(it != vertex_to_vertices.end()) { for(unsigned int k = 1; k < n; k++) it->second.insert(pElem->getVertex((j + k) % n)); @@ -366,7 +373,8 @@ int Frame_field::build_vertex_to_elements(GEntity *gr, bool initialize) unsigned int n = pElem->getNumVertices(); for(unsigned int j = 0; j < n; j++) { MVertex *pVertex = pElem->getVertex(j); - auto it = vertex_to_elements.find(pVertex); + std::map<MVertex *, std::set<MElement *> >::iterator it = + vertex_to_elements.find(pVertex); if(it != vertex_to_elements.end()) it->second.insert(pElem); else { @@ -392,7 +400,8 @@ void Frame_field::build_listVertices(GEntity *gr, int dim, bool initialize) } if(initialize) listVertices.clear(); - for(auto it = list.begin(); it != list.end(); it++) { + for(std::set<MVertex *>::const_iterator it = list.begin(); it != list.end(); + it++) { listVertices.push_back(*it); } } @@ -421,7 +430,7 @@ void Frame_field::deleteAnnData() #if defined(HAVE_ANN) if(annTree && annTree->thePoints()) delete annTree->thePoints(); if(annTree) delete annTree; - annTree = nullptr; + annTree = NULL; #endif } @@ -455,7 +464,8 @@ void Frame_field::initFace(GFace *gf) it != vertex_to_elements.end(); it++) { std::set<MElement *> elements = it->second; SVector3 Area = SVector3(0, 0, 0); - for(auto iter = elements.begin(); iter != elements.end(); iter++) { + for(std::set<MElement *>::const_iterator iter = elements.begin(); + iter != elements.end(); iter++) { MElement *pElem = *iter; int n = pElem->getNumVertices(); int i; @@ -474,7 +484,7 @@ void Frame_field::initFace(GFace *gf) } Area.normalize(); // average normal over neighbour face elements STensor3 m = convert(cross3D(Area)); - auto iter = crossField.find(it->first); + std::map<MVertex *, STensor3>::iterator iter = crossField.find(it->first); if(iter == crossField.end()) crossField.insert(std::pair<MVertex *, STensor3>(it->first, m)); else @@ -487,7 +497,8 @@ void Frame_field::initFace(GFace *gf) // of gf std::vector<GEdge *> const &edges = gf->edges(); vertex_to_elements.clear(); - for(auto it = edges.begin(); it != edges.end(); it++) { + for(std::vector<GEdge *>::const_iterator it = edges.begin(); + it != edges.end(); it++) { build_vertex_to_elements(*it, false); } @@ -506,7 +517,7 @@ void Frame_field::initFace(GFace *gf) SVector3 tangent = edg1.scaledTangent() + edg2.scaledTangent(); tangent.normalize(); - auto iter = crossField.find(pVertex); + std::map<MVertex *, STensor3>::iterator iter = crossField.find(pVertex); if(iter == crossField.end()) { std::cout << "This should not happen: cross not found 1" << std::endl; exit(1); @@ -538,7 +549,7 @@ void Frame_field::initFace(GFace *gf) MVertex *pVertex0 = it->first; if(pVertex0->onWhat()->dim() != 2) continue; - auto iter = crossField.find(pVertex0); + std::map<MVertex *, STensor3>::iterator iter = crossField.find(pVertex0); cross3D y; if(iter == crossField.end()) { std::cout << "This should not happen: cross not found 2" << std::endl; @@ -628,7 +639,8 @@ double Frame_field::findBarycenter( SVector3 T = SVector3(0.), dT; double temp = 0.; energy = 0; - for(auto it = list.begin(); it != list.end(); ++it) { + for(std::set<MVertex *>::const_iterator it = list.begin(); it != list.end(); + ++it) { MVertex *pVertex = *it; if(pVertex->getNum() == pVertex0->getNum()) std::cout << "This should not happen!" << std::endl; @@ -701,18 +713,26 @@ void Frame_field::buildSmoothness() MVertex *v0 = entities[i]->mesh_vertices[j]; V1.insert(v0); std::vector<MVertex *> v0vec = Neighbours[v0]; - for(unsigned int k = 0; k < v0vec.size(); k++) { V1.insert(v0vec[k]); } - for(auto itSet = V1.begin(); itSet != V1.end(); itSet++) { + for(unsigned int k = 0; k < v0vec.size(); k++) { + V1.insert(v0vec[k]); + } + for(std::set<MVertex *>::iterator itSet = V1.begin(); itSet != V1.end(); + itSet++) { MVertex *vTmp = (*itSet); V2.insert(vTmp); v0vec = Neighbours[vTmp]; - for(unsigned int k = 0; k < v0vec.size(); k++) { V2.insert(v0vec[k]); } + for(unsigned int k = 0; k < v0vec.size(); k++) { + V2.insert(v0vec[k]); + } } - for(auto itSet = V2.begin(); itSet != V2.end(); itSet++) { + for(std::set<MVertex *>::iterator itSet = V2.begin(); itSet != V2.end(); + itSet++) { MVertex *vTmp = (*itSet); V3.insert(vTmp); v0vec = Neighbours[vTmp]; - for(unsigned int k = 0; k < v0vec.size(); k++) { V3.insert(v0vec[k]); } + for(unsigned int k = 0; k < v0vec.size(); k++) { + V3.insert(v0vec[k]); + } } // we have all three set here, time to compute the smoothnesses for each // one @@ -722,19 +742,22 @@ void Frame_field::buildSmoothness() double S1 = 0.0; double S2 = 0.0; double S3 = 0.0; - for(auto itSet = V1.begin(); itSet != V1.end(); itSet++) { + for(std::set<MVertex *>::iterator itSet = V1.begin(); itSet != V1.end(); + itSet++) { MVertex *vTmp = (*itSet); STensor3 tTmp = crossField[vTmp]; cross3D cTmp = cross3D(tTmp); C1.push_back(cTmp); } - for(auto itSet = V2.begin(); itSet != V2.end(); itSet++) { + for(std::set<MVertex *>::iterator itSet = V2.begin(); itSet != V2.end(); + itSet++) { MVertex *vTmp = (*itSet); STensor3 tTmp = crossField[vTmp]; cross3D cTmp = cross3D(tTmp); C2.push_back(cTmp); } - for(auto itSet = V3.begin(); itSet != V3.end(); itSet++) { + for(std::set<MVertex *>::iterator itSet = V3.begin(); itSet != V3.end(); + itSet++) { MVertex *vTmp = (*itSet); STensor3 tTmp = crossField[vTmp]; cross3D cTmp = cross3D(tTmp); @@ -785,7 +808,7 @@ double Frame_field::smooth() iter != vertex_to_vertices.end(); ++iter) { // MVertex* pVertex0 = iter->first; SVector3 T(0, 0, 0); - auto itA = crossField.find(iter->first); + std::map<MVertex *, STensor3>::iterator itA = crossField.find(iter->first); if(itA == crossField.end()) { std::cout << "This should not happen" << std::endl; exit(1); @@ -851,12 +874,13 @@ void Frame_field::recur_connect_vert(FILE *fi, int count, MVertex *v, count++; - for(auto it = v2v.lower_bound(v); it != v2v.upper_bound(v); ++it) { + for(std::multimap<MVertex *, MVertex *>::iterator it = v2v.lower_bound(v); + it != v2v.upper_bound(v); ++it) { MVertex *nextV = it->second; if(touched.find(nextV) == touched.end()) { // compute dot product (N0,R0,A0) dot (Ni,Ri,Ai)^T // where N,R,A are the 3 directions - auto iter = crossField.find(nextV); + std::map<MVertex *, STensor3>::iterator iter = crossField.find(nextV); STensor3 nextCross = iter->second; STensor3 nextCrossT = nextCross.transpose(); STensor3 prod = cross.operator*=(nextCrossT); @@ -888,7 +912,9 @@ void Frame_field::recur_connect_vert(FILE *fi, int count, MVertex *v, // create new cross fullMatrix<double> newmat(3, 3); for(int i = 0; i < 3; i++) { - for(int j = 0; j < 3; j++) { newmat(i, j) = nextCross(Id(i), j); } + for(int j = 0; j < 3; j++) { + newmat(i, j) = nextCross(Id(i), j); + } } STensor3 newcross(0.0); @@ -945,7 +971,8 @@ void Frame_field::continuousCrossField(GRegion *gr, GFace *gf) iter != vertex_to_vertices.end(); ++iter) { MVertex *v = iter->first; std::set<MVertex *> mySet = iter->second; - for(auto it = mySet.begin(); it != mySet.end(); ++it) { + for(std::set<MVertex *>::iterator it = mySet.begin(); it != mySet.end(); + ++it) { v2v.insert(std::make_pair(v, *it)); } } @@ -953,7 +980,7 @@ void Frame_field::continuousCrossField(GRegion *gr, GFace *gf) // recursive loop MVertex *beginV = gf->getMeshVertex(0); std::set<MVertex *> touched; - auto iter = crossField.find(beginV); + std::map<MVertex *, STensor3>::iterator iter = crossField.find(beginV); STensor3 bCross = iter->second; FILE *fi = Fopen("cross_recur.pos", "w"); @@ -1019,7 +1046,8 @@ void Frame_field::save_dist(const std::string &filename) std::ofstream file(filename.c_str()); file << "View \"Distance\" {\n"; - for(auto it = crossDist.begin(); it != crossDist.end(); it++) { + for(std::map<MEdge, double, MEdgeLessThan>::iterator it = crossDist.begin(); + it != crossDist.end(); it++) { MVertex *pVerta = it->first.getVertex(0); MVertex *pVertb = it->first.getVertex(1); double value = it->second * 180. / M_PI; @@ -1090,7 +1118,8 @@ void Frame_field::save_energy(GRegion *gr, const std::string &filename) matvec(inv, gsf[nod1], grd1); matvec(inv, gsf[nod2], grd2); SVector3 esf = sf[nod1] * SVector3(grd2) - sf[nod2] * SVector3(grd1); - auto it = crossDist.find(pTet->getEdge(k)); + std::map<MEdge, double, MEdgeLessThan>::iterator it = + crossDist.find(pTet->getEdge(k)); sum += it->second * esf; // sum += (pTet->getVertex(nod2)->z() - pTet->getVertex(nod1)->z()) * // esf; @@ -1225,7 +1254,9 @@ void Size_field::solve(GRegion *gr) for(it = interior.begin(); it != interior.end(); it++) { it2 = boundary.find(*it); - if(it2 == boundary.end()) { assembler.numberVertex(*it, 0, 1); } + if(it2 == boundary.end()) { + assembler.numberVertex(*it, 0, 1); + } } for(i = 0; i < gr->tetrahedra.size(); i++) { @@ -1235,7 +1266,7 @@ void Size_field::solve(GRegion *gr) count2 = 0; volume = 0.0; simpleFunction<double> ONE(1.0); - laplaceTerm term(nullptr, 1, &ONE); + laplaceTerm term(0, 1, &ONE); for(i = 0; i < gr->tetrahedra.size(); i++) { SElement se(gr->tetrahedra[i]); term.addToMatrix(assembler, &se); @@ -1245,7 +1276,9 @@ void Size_field::solve(GRegion *gr) // printf("number of tetrahedra = %d\n",count2); // printf("volume = %f\n",volume); - if(assembler.sizeOfR()) { system->systemSolve(); } + if(assembler.sizeOfR()) { + system->systemSolve(); + } for(it = interior.begin(); it != interior.end(); it++) { assembler.getDofValue(*it, 0, 1, val); @@ -1272,7 +1305,7 @@ double Size_field::search(double x, double y, double z) element = (MElement *)octree->find(x, y, z, 3, true); - if(element != nullptr) { + if(element != NULL) { temp1[0] = x; temp1[1] = y; temp1[2] = z; @@ -1321,9 +1354,13 @@ void Size_field::print_field(GRegion *gr) // y = (it->first)->y(); // z = (it->first)->z(); - if(it->second > max) { max = it->second; } + if(it->second > max) { + max = it->second; + } - if(it->second < min) { min = it->second; } + if(it->second < min) { + min = it->second; + } // printf("x = %f, y = %f, z = %f, mesh size = %f\n",x,y,z,it->second); } @@ -1512,7 +1549,7 @@ bool Nearest_point::search(double x, double y, double z, SVector3 &vec) delete[] indices; delete[] distances; - if(vicinity[index] != nullptr) { + if(vicinity[index] != NULL) { found = closest(vicinity[index], SPoint3(x, y, z)); } else { @@ -1643,7 +1680,9 @@ double Nearest_point::clamp(double x, double min, double max) val = x; - if(val < min) { val = min; } + if(val < min) { + val = min; + } else if(val > max) { val = max; } diff --git a/contrib/domhex/directions3D.h b/contrib/domhex/directions3D.h index 7ffdc4eac2f9960306248a0b4324cb95a4660236..3e692e17412ca5157be7b56560e10c792f2d732b 100644 --- a/contrib/domhex/directions3D.h +++ b/contrib/domhex/directions3D.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/meshGFaceQuadrilateralize.cpp b/contrib/domhex/meshGFaceQuadrilateralize.cpp index 809ff8dfdf3d94d5287f2166119ca362c38fb32e..ddd0928283f2e736b310f74633ac06d2b73b6698 100644 --- a/contrib/domhex/meshGFaceQuadrilateralize.cpp +++ b/contrib/domhex/meshGFaceQuadrilateralize.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -352,7 +352,9 @@ bool edgeFront::formQuad(BDS_Edge *e, BDS_Edge *left, BDS_Edge *right) BDS_Point *p = toUpdate[i]; for(std::list<BDS_Edge *>::iterator itp = p->edges.begin(); itp != p->edges.end(); ++itp) { - if(inFront(*itp)) { updateStatus(*itp); } + if(inFront(*itp)) { + updateStatus(*itp); + } } } return true; diff --git a/contrib/domhex/meshGFaceQuadrilateralize.h b/contrib/domhex/meshGFaceQuadrilateralize.h index 2d831af9da2892e3b24149a31f1a62df6dc30ee1..c00642d5dd4158378e4c651bf4f33a6af16e6643 100644 --- a/contrib/domhex/meshGFaceQuadrilateralize.h +++ b/contrib/domhex/meshGFaceQuadrilateralize.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/pointInsertion.cpp b/contrib/domhex/pointInsertion.cpp index 64b92cc86f4ef2ab4070973f97c33d408fd20a22..3103eb028b5455a5bb3bd8c4482ba7b5873d6414 100644 --- a/contrib/domhex/pointInsertion.cpp +++ b/contrib/domhex/pointInsertion.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -26,195 +26,6 @@ bool old_algo_hexa() { return true; } -template <typename T> -void print_nodal_info(const std::string &filename, - std::map<MVertex *, T> const &map) -{ - std::ofstream out(filename.c_str()); - - out << "View \"\"{" << std::endl; - for(auto it = map.begin(); it != map.end(); it++) { - MVertex *v = it->first; - out << "SP( " << v->x() << "," << v->y() << "," << v->z() << "){" - << it->second << "};" << std::endl; - } - out << "};" << std::endl; - - out.close(); -} - -bool shoot(const SPoint2 &start, const SPoint2 &dir, const double &h, - SPoint2 &res) -{ - const int RK = 1; - - if(RK == 1) { - res = start + (dir * h); - // std::cout << "(" << start[0] << "," <<start[1] << ") -> (" << res[0] - // << "," - // <<res[1] << ") " << std::endl; - return true; - } - - return false; -} - -bool computeFourNeighbors(frameFieldBackgroundMesh2D *bgm, - MVertex *v_center, // the vertex for which we want to - // generate 4 neighbors (real - // vertex (xyz), not parametric!) - SPoint2 &midpoint, - bool goNonLinear, // do we compute the position in - // the real surface which is - // nonlinear - SPoint2 newP[4][NUMDIR], // look into other directions - SMetric3 &metricField) // the mesh metric -{ - // we assume that v is on surface gf, and backgroundMesh2D has been created - // based on gf - - // get BGM and GFace - GFace *gf = dynamic_cast<GFace *>(bgm->getBackgroundGEntity()); - - // get the parametric coordinates of the point on the surface - reparamMeshVertexOnFace(v_center, gf, midpoint); - - // get RK info on midpoint (infos in two directions...) - RK_form infos; - bgm->compute_RK_infos(midpoint[0], midpoint[1], v_center->x(), v_center->y(), - v_center->z(), infos); - metricField = infos.metricField; - - // shoot in four directions - SPoint2 param_vec; - double h; - for(int i = 0; i < 4; i++) { // in four directions - switch(i) { - case 0: - param_vec = infos.paramt1; - h = infos.paramh.first; - break; - case 1: - param_vec = infos.paramt2; - h = infos.paramh.second; - break; - case 2: - param_vec = infos.paramt1 * -1.; - h = infos.paramh.first; - break; - case 3: - param_vec = infos.paramt2 * -1.; - h = infos.paramh.second; - break; - } - shoot(midpoint, param_vec, h, newP[i][0]); - // std::cout << "(" << midpoint[0] << "," <<midpoint[1] << ") -> (" << - // newP[i][0][0] << "," << newP[i][0][1] << ") " << std::endl; - } - - // the following comes from surfaceFiller.cpp... - const double EPS = 1.e-7; - for(int j = 0; j < 2; j++) { - for(int i = 0; i < 4; i++) { - newP[i][0][j] += (EPS * (double)rand() / RAND_MAX); - } - } - - // We could stop here. Yet, if the metric varies a lot, we can solve a - // nonlinear problem in order to find a better approximation in the real - // surface - if(1 && goNonLinear) { - double L = infos.localsize; - double newPoint[4][2]; - for(int j = 0; j < 2; j++) { - for(int i = 0; i < 4; i++) { newPoint[i][j] = newP[i][0][j]; } - } - double ERR[4]; - for(int i = 0; i < 4; i++) { // - // if (newPoint[i][0] < rangeU.low())newPoint[i][0] = rangeU.low(); - // if (newPoint[i][0] > rangeU.high())newPoint[i][0] = rangeU.high(); - // if (newPoint[i][1] < rangeV.low())newPoint[i][1] = rangeV.low(); - // if (newPoint[i][1] > rangeV.high())newPoint[i][1] = rangeV.high(); - GPoint pp = gf->point(newP[i][0]); - double D = sqrt((pp.x() - v_center->x()) * (pp.x() - v_center->x()) + - (pp.y() - v_center->y()) * (pp.y() - v_center->y()) + - (pp.z() - v_center->z()) * (pp.z() - v_center->z())); - ERR[i] = 100 * fabs(D - L) / (D + L); - // printf("L = %12.5E D = %12.5E ERR = - // %12.5E\n",L,D,100*fabs(D-L)/(D+L)); - } - - surfaceFunctorGFace ss(gf); - SVector3 dirs[4] = {infos.t1 * (-1.0), infos.t2 * (-1.0), infos.t1 * (1.0), - infos.t2 * (1.0)}; - for(int i = 0; i < 4; i++) { - if(ERR[i] > 12) { - double uvt[3] = {newPoint[i][0], newPoint[i][1], 0.0}; - // printf("Intersecting with circle N = %g %g %g dir = %g %g %g R - // = %g p = %g %g - // %g\n",n.x(),n.y(),n.z(),dirs[i].x(),dirs[i].y(),dirs[i].z(),L, - // v_center->x(),v_center->y(),v_center->z()); - curveFunctorCircle cf( - dirs[i], infos.normal, - SVector3(v_center->x(), v_center->y(), v_center->z()), L); - if(intersectCurveSurface(cf, ss, uvt, infos.paramh.first * 1.e-3)) { - GPoint pp = gf->point(SPoint2(uvt[0], uvt[1])); - double D = sqrt((pp.x() - v_center->x()) * (pp.x() - v_center->x()) + - (pp.y() - v_center->y()) * (pp.y() - v_center->y()) + - (pp.z() - v_center->z()) * (pp.z() - v_center->z())); - double DP = - sqrt((newPoint[i][0] - uvt[0]) * (newPoint[i][0] - uvt[0]) + - (newPoint[i][1] - uvt[1]) * (newPoint[i][1] - uvt[1])); - double newErr = 100 * fabs(D - L) / (D + L); - // if (v_center->onWhat() != gf && gf->tag() == 3){ - // crossField2d::normalizeAngle (uvt[2]); - // printf("INTERSECT angle = %g DP %g\n",uvt[2],DP); - // } - if(newErr < 1 && DP < .1) { - // printf("%12.5E vs %12.5E : %12.5E %12.5E vs %12.5E %12.5E - // \n",ERR[i],newErr,newPoint[i][0],newPoint[i][1],uvt[0],uvt[1]); - newPoint[i][0] = uvt[0]; - newPoint[i][1] = uvt[1]; - } - // printf("OK\n"); - } - else { - Msg::Debug("Cannot put a new point on Surface %d", gf->tag()); - // printf("NOT OK\n"); - } - } - } - - // return the four new vertices - for(int i = 0; i < 4; i++) { - newP[i][0] = SPoint2(newPoint[i][0], newPoint[i][1]); - } - } - - return true; -} - -void computeTwoNeighbors(frameFieldBackgroundMesh3D *bgm, MVertex *parent, - std::vector<MVertex *> &spawns, SVector3 dir, double h) -{ - // using approximate size, RK1... - double x = parent->x(); - double y = parent->y(); - double z = parent->z(); - double newx, newy, newz; - GRegion *gr = dynamic_cast<GRegion *>(bgm->getBackgroundGEntity()); - - newx = x + h * dir(0); - newy = y + h * dir(1); - newz = z + h * dir(2); - spawns[0] = new MVertex(newx, newy, newz, gr, 0); - - newx = x - h * dir(0); - newy = y - h * dir(1); - newz = z - h * dir(2); - spawns[1] = new MVertex(newx, newy, newz, gr, 0); -} - void computeSixNeighbors(frameFieldBackgroundMesh3D *bgm, MVertex *parent, std::vector<MVertex *> &spawns, STensor3 dir, double h) { @@ -245,199 +56,11 @@ Filler2D::Filler2D() {} Filler2D::~Filler2D() { - std::cout << "FILLER2D timing:" << std::endl; - std::cout << " ------- CUMULATIVE TIME2D bgm & smoothing : " - << time_bgm_and_smoothing << " s." << std::endl; - std::cout << " ------- CUMULATIVE TIME2D inserting points : " - << time_insertion << " s." << std::endl; - std::cout << " ------- TOTAL 2D TIME (new) : " - << time_bgm_and_smoothing + time_insertion << " s." << std::endl; } void Filler2D::pointInsertion2D(GFace *gf, std::vector<MVertex *> &packed, std::vector<SMetric3> &metrics) { - // NB/ do not use the mesh in GFace, use the one in backgroundMesh2D! - - // if(debug) std::cout << " ------------------ OLD -------------------" << - // std::endl; stringstream ssa; - //// ssa << "oldbgm_angles_" << gf->tag() << ".pos"; - //// backgroundMesh::current()->print(ssa.str(),gf,1); - // ssa << "oldbgm_sizes_" << gf->tag() << ".pos"; - // backgroundMesh::current()->print(ssa.str(),gf,0); - // - // - // - // - // if(debug) std::cout << " ------------------ NEW -------------------" << - // std::endl; backgroundMesh2D *bgm2 = - // dynamic_cast<backgroundMesh2D*>(BGMManager::get(gf)); stringstream ss2; - // ss2 << "basebg_sizefield_" << gf->tag() << ".pos"; - // bgm2->exportSizeField(ss2.str()); - // - // - // - // return; - // - - BGMManager::set_use_cross_field(true); - - const bool goNonLinear = true; - const bool debug = false; - const bool export_stuff = true; - - if(debug) std::cout << "ENTERING POINTINSERTION2D" << std::endl; - - double a; - - // acquire background mesh - if(debug) std::cout << "pointInsertion2D: recover BGM" << std::endl; - a = Cpu(); - frameFieldBackgroundMesh2D *bgm = - dynamic_cast<frameFieldBackgroundMesh2D *>(BGMManager::get(gf)); - time_bgm_and_smoothing += (Cpu() - a); - - if(!bgm) { - Msg::Error("BGM dynamic cast failed in filler2D::pointInsertion2D"); - return; - } - - // export BGM size field - if(export_stuff) { - std::cout << "pointInsertion2D: export size field " << std::endl; - std::stringstream ss; - ss << "bg2D_sizefield_" << gf->tag() << ".pos"; - bgm->exportSizeField(ss.str()); - - std::cout << "pointInsertion2D : export crossfield " << std::endl; - std::stringstream sscf; - sscf << "bg2D_crossfield_" << gf->tag() << ".pos"; - bgm->exportCrossField(sscf.str()); - - std::cout << "pointInsertion2D : export smoothness " << std::endl; - std::stringstream sss; - sss << "bg2D_smoothness_" << gf->tag() << ".pos"; - bgm->exportSmoothness(sss.str()); - } - - // point insertion algorithm: - a = Cpu(); - - // for debug check... - int priority_counter = 0; - std::map<MVertex *, int> vert_priority; - - // get all the boundary vertices - if(debug) std::cout << "pointInsertion2D : get bnd vertices " << std::endl; - std::set<MVertex *> bnd_vertices = bgm->get_vertices_of_maximum_dim(1); - - // put boundary vertices in a fifo queue - std::set<smoothness_point_pair, - compareSurfacePointWithExclusionRegionPtr_Smoothness> - fifo; - std::vector<surfacePointWithExclusionRegion *> vertices; - - // initiate the rtree - if(debug) std::cout << "pointInsertion2D : initiate RTree " << std::endl; - RTree<surfacePointWithExclusionRegion *, double, 2, double> rtree; - SMetric3 metricField(1.0); - SPoint2 newp[4][NUMDIR]; - auto it = bnd_vertices.begin(); - - for(; it != bnd_vertices.end(); ++it) { - SPoint2 midpoint; - computeFourNeighbors(bgm, *it, midpoint, goNonLinear, newp, metricField); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(*it, newp, midpoint, metricField); - - smoothness_point_pair mp; - mp.ptr = sp; - mp.rank = (1. - bgm->get_smoothness(midpoint[0], midpoint[1])); - fifo.insert(mp); - - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - } - - // ---------- main loop ----------------- - while(!fifo.empty()) { - if(debug) - std::cout << " -------- fifo.size() = " << fifo.size() << std::endl; - int count_nbaddedpt = 0; - - surfacePointWithExclusionRegion *parent = (*fifo.begin()).ptr; - fifo.erase(fifo.begin()); - - for(int dir = 0; dir < NUMDIR; dir++) { - for(int i = 0; i < 4; i++) { - if(!inExclusionZone(parent->_p[i][dir], rtree, vertices)) { - GPoint gp = gf->point(parent->_p[i][dir]); - MFaceVertex *v = - new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); - SPoint2 midpoint; - computeFourNeighbors(bgm, v, midpoint, goNonLinear, newp, - metricField); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(v, newp, midpoint, metricField, - parent); - smoothness_point_pair mp; - mp.ptr = sp; - mp.rank = (1. - bgm->get_smoothness(gp.u(), gp.v())); - - if(debug) vert_priority[v] = priority_counter++; - - fifo.insert(mp); - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - - if(debug) { - std::cout << " adding node (" << sp->_v->x() << "," << sp->_v->y() - << "," << sp->_v->z() << ")" << std::endl; - std::cout - << " ----------------------------- sub --- fifo.size() = " - << fifo.size() << std::endl; - } - count_nbaddedpt++; - } - } - } - if(debug) - std::cout << "////////// nbre of added point: " << count_nbaddedpt - << std::endl; - } - time_insertion += (Cpu() - a); - - if(debug) { - std::stringstream ss; - ss << "priority_" << gf->tag() << ".pos"; - print_nodal_info(ss.str().c_str(), vert_priority); - ss.clear(); - } - - // add the vertices as additional vertices in the - // surface mesh - char ccc[256]; - sprintf(ccc, "points%d.pos", gf->tag()); - FILE *f = Fopen(ccc, "w"); - if(f) { - fprintf(f, "View \"\"{\n"); - for(unsigned int i = 0; i < vertices.size(); i++) { - vertices[i]->print(f, i); - if(vertices[i]->_v->onWhat() == gf) { - packed.push_back(vertices[i]->_v); - metrics.push_back(vertices[i]->_meshMetric); - SPoint2 midpoint; - reparamMeshVertexOnFace(vertices[i]->_v, gf, midpoint); - } - delete vertices[i]; - } - fprintf(f, "};"); - fclose(f); - } } bool Filler3D::treat_region(GRegion *gr) @@ -533,7 +156,8 @@ bool Filler3D::treat_region(GRegion *gr) MElement *element; MVertex *vertex; std::vector<GFace *> faces = gr->faces(); - for(auto it = faces.begin(); it != faces.end(); it++) { + for(std::vector<GFace *>::iterator it = faces.begin(); it != faces.end(); + it++) { GFace *gf = *it; // int limit = code_kesskessai(gf->tag()); for(unsigned int i = 0; i < gf->getNumMeshElements(); i++) { @@ -548,7 +172,7 @@ bool Filler3D::treat_region(GRegion *gr) } int geodim; - for(auto it = temp.begin(); it != temp.end(); it++) { + for(std::set<MVertex *>::iterator it = temp.begin(); it != temp.end(); it++) { geodim = (*it)->onWhat()->dim(); if((geodim == 0) || (geodim == 1) || (geodim == 2)) boundary_vertices.push_back(*it); @@ -579,7 +203,9 @@ bool Filler3D::treat_region(GRegion *gr) bgm->eval_approximate_crossfield(closest, svp->cf); fifo->insert(svp); - if(debug) { smoothness_forplot[svp->v] = svp->rank; } + if(debug) { + smoothness_forplot[svp->v] = svp->rank; + } } else { STensor3 temp; @@ -621,16 +247,9 @@ bool Filler3D::treat_region(GRegion *gr) // } std::vector<MVertex *> spawns; - if(!use_vectorial_smoothness) { - spawns.resize(6); - computeSixNeighbors(bgm, parent, spawns, fifo->get_first_crossfield(), - fifo->get_first_size()); - } - else { - spawns.resize(2); - computeTwoNeighbors(bgm, parent, spawns, fifo->get_first_direction(), - fifo->get_first_size()); - } + spawns.resize(6); + computeSixNeighbors(bgm, parent, spawns, fifo->get_first_crossfield(), + fifo->get_first_size()); fifo->erase_first(); // std::cout << "while, fifo->size()=" << fifo->size() << " parent=(" << @@ -709,7 +328,9 @@ bool Filler3D::treat_region(GRegion *gr) } } } - if(!spawn_created) { delete individual; } + if(!spawn_created) { + delete individual; + } } // end loop on spawns } @@ -717,18 +338,6 @@ bool Filler3D::treat_region(GRegion *gr) time_insert_points += (Cpu() - a); - // --- output --- - if(debug) { - std::stringstream ss; - ss << "priority_3D_" << gr->tag() << ".pos"; - print_nodal_info(ss.str().c_str(), vert_priority); - ss.clear(); - - std::stringstream sss; - sss << "smoothness_3D_" << gr->tag() << ".pos"; - print_nodal_info(sss.str().c_str(), smoothness_forplot); - sss.clear(); - } // ------- meshing using new points std::cout << "tets in gr before= " << gr->tetrahedra.size() << std::endl; diff --git a/contrib/domhex/pointInsertion.h b/contrib/domhex/pointInsertion.h index 2b99ca620213c6389cde1c8a5152e2e2b1a47eb5..70a8b20f174e32a9c0fae3b487727da3189f6c0f 100644 --- a/contrib/domhex/pointInsertion.h +++ b/contrib/domhex/pointInsertion.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/pointInsertionRTreeTools.cpp b/contrib/domhex/pointInsertionRTreeTools.cpp index 3c62d1adf5f3a464aefc14bf76abc782f4fcdf3c..9dc1759a791358c413cdd11ad1fc2faf373a005b 100644 --- a/contrib/domhex/pointInsertionRTreeTools.cpp +++ b/contrib/domhex/pointInsertionRTreeTools.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -12,32 +12,34 @@ #include "GEntity.h" #include "fullMatrix.h" -surfacePointWithExclusionRegion::surfacePointWithExclusionRegion( - MVertex *v, SPoint2 p[4][NUMDIR], SPoint2 &_mp, SMetric3 &meshMetric, - surfacePointWithExclusionRegion *father) +surfacePointWithExclusionRegion::surfacePointWithExclusionRegion(MVertex *v, SPoint2 p[8], SPoint2 &_mp, SMetric3 &meshMetric, + surfacePointWithExclusionRegion *father) { _v = v; _meshMetric = meshMetric; _center = _mp; - for(int i = 0; i < 4; i++) - _q[i] = _center + (p[i][0] + p[(i + 1) % 4][0] - _center * 2) * FACTOR; - for(int i = 0; i < 4; i++) - for(int j = 0; j < NUMDIR; j++) _p[i][j] = p[i][j]; + for(int i = 0; i < 4; i++){ + _q[i] = _center + (p[i] + p[(i + 1) % 4] - _center * 2) * FACTOR; + // printf("%g %g vs %g %g\n",_q[i].x(),_q[i].y(),p[i+4].x(),p[i+4].y()); + // _q[i] = p[i+4]; + } + for(int i = 0; i < 4; i++)_p[i] = p[i]; if(!father) { - fullMatrix<double> V(3, 3); - fullVector<double> S(3); - meshMetric.eig(V, S); - double l = std::max(std::max(S(0), S(1)), S(2)); - _distanceSummed = sqrt(1 / (l * l)); + _father = NULL; } else { - _distanceSummed = father->_distanceSummed + distance(father->_v, _v); + _father = father->_v; } } -bool surfacePointWithExclusionRegion::inExclusionZone(const SPoint2 &p) +bool surfacePointWithExclusionRegion::inExclusionZone(const SPoint2 &p, MVertex *parent) { + if (_father == parent) { + // printf("parent = me\n"); + return false; + } + double mat[2][2]; double b[2], uv[2]; mat[0][0] = _q[1].x() - _q[0].x(); @@ -76,59 +78,40 @@ void surfacePointWithExclusionRegion::minmax(double _min[2], void surfacePointWithExclusionRegion::print(FILE *f, int i) { + // fprintf(f, "SP(%g,%g,%g){%d};\n", _v->x(), _v->y(), _v->z(), i); + // return; fprintf(f, "SP(%g,%g,%g){%d};\n", _center.x(), _center.y(), 0.0, i); fprintf(f, "SQ(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g){%d,%d,%d,%d};\n", _q[0].x(), _q[0].y(), 0.0, _q[1].x(), _q[1].y(), 0.0, _q[2].x(), _q[2].y(), 0.0, _q[3].x(), _q[3].y(), 0.0, i, i, i, i); + } -my_wrapper::my_wrapper(const SPoint2 &sp) : _tooclose(false), _p(sp) {} - bool rtree_callback(surfacePointWithExclusionRegion *neighbour, void *point) { my_wrapper *w = static_cast<my_wrapper *>(point); - if(neighbour->inExclusionZone(w->_p)) { + if(neighbour->inExclusionZone(w->_p, w->_parent)) { w->_tooclose = true; return false; } - return true; } bool inExclusionZone( + MVertex *parent, SPoint2 &p, - RTree<surfacePointWithExclusionRegion *, double, 2, double> &rtree, - std::vector<surfacePointWithExclusionRegion *> &all) + RTree<surfacePointWithExclusionRegion *, double, 2, double> &rtree) { - // should assert that the point is inside the domain - // OLD BGM - if(old_algo_hexa()) { - if(!backgroundMesh::current()->inDomain(p.x(), p.y(), 0)) return true; - } - else { - // NEW BGM - if(!BGMManager::current2D()->inDomain(p.x(), p.y(), 0)) return true; - } - - my_wrapper w(p); + my_wrapper w(p, parent); double _min[2] = {p.x() - 1.e-1, p.y() - 1.e-1}, _max[2] = {p.x() + 1.e-1, p.y() + 1.e-1}; rtree.Search(_min, _max, rtree_callback, &w); return w._tooclose; - - for(unsigned int i = 0; i < all.size(); ++i) { - if(all[i]->inExclusionZone(p)) { - // printf("%g %g is in exclusion zone of %g - // %g\n",p.x(),p.y(),all[i]._center.x(),all[i]._center.y()); - return true; - } - } - return false; } -frameFieldBackgroundMesh3D *Wrapper3D::bgmesh = nullptr; +frameFieldBackgroundMesh3D *Wrapper3D::bgmesh = NULL; double infinity_distance_3D(const MVertex *v1, const MVertex *v2, STensor3 &cf) { diff --git a/contrib/domhex/pointInsertionRTreeTools.h b/contrib/domhex/pointInsertionRTreeTools.h index 32498f9b963017867bd0dc26b89db0c4449529cd..39cead2d0e2174573da428e91e304e0165752322 100644 --- a/contrib/domhex/pointInsertionRTreeTools.h +++ b/contrib/domhex/pointInsertionRTreeTools.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -14,15 +14,16 @@ #include "STensor3.h" #include "BackgroundMesh3D.h" #include "GEntity.h" +#include "GFace.h" #include "rtree.h" static const double k1 = 0.61; // k1*h is the minimal distance between two nodes static const double k2 = 0.5; // k2*h is the minimal distance to the boundary static const double sqrt3 = 1.73205081; -static const double FACTOR = .71; +static const double FACTOR = .61; -static const int NUMDIR = 1; -static const double DIRS[NUMDIR] = {0.0}; +//static const int NUMDIR = 1; +//static const double DIRS[NUMDIR] = {0.0}; // static const int NUMDIR = 3; // static const double DIRS [NUMDIR] = {0.0, M_PI/20.,-M_PI/20.}; @@ -30,11 +31,11 @@ static const double DIRS[NUMDIR] = {0.0}; class surfacePointWithExclusionRegion { public: MVertex *_v; + MVertex *_father; SPoint2 _center; - SPoint2 _p[4][NUMDIR]; + SPoint2 _p[4]; SPoint2 _q[4]; SMetric3 _meshMetric; - double _distanceSummed; /* + p3 p4 | @@ -43,11 +44,11 @@ public: + p1 */ - surfacePointWithExclusionRegion( - MVertex *v, SPoint2 p[4][NUMDIR], SPoint2 &_mp, SMetric3 &meshMetric, - surfacePointWithExclusionRegion *father = nullptr); + surfacePointWithExclusionRegion(MVertex *v, SPoint2 p[8], + SPoint2 &_mp, SMetric3 &meshMetric, + surfacePointWithExclusionRegion *father = 0); - bool inExclusionZone(const SPoint2 &p); + bool inExclusionZone(const SPoint2 &p, MVertex *v); void minmax(double _min[2], double _max[2]) const; void print(FILE *f, int i); }; @@ -55,47 +56,18 @@ public: class my_wrapper { public: bool _tooclose; + MVertex *_parent; SPoint2 _p; - my_wrapper(const SPoint2 &sp); + my_wrapper(const SPoint2 &sp, MVertex *parent) : + _p(sp), _parent(parent), _tooclose(false){} }; -struct smoothness_point_pair { - double rank; - surfacePointWithExclusionRegion *ptr; -}; - -class compareSurfacePointWithExclusionRegionPtr_Smoothness { -public: - inline bool operator()(const smoothness_point_pair &a, - const smoothness_point_pair &b) const - { - if(a.rank == b.rank) { - if(a.ptr->_distanceSummed > b.ptr->_distanceSummed) return false; - if(a.ptr->_distanceSummed < b.ptr->_distanceSummed) return true; - return a.ptr < b.ptr; - } - return (a.rank < b.rank); - } -}; - -class compareSurfacePointWithExclusionRegionPtr { -public: - inline bool operator()(const surfacePointWithExclusionRegion *a, - const surfacePointWithExclusionRegion *b) const - { - if(a->_distanceSummed > b->_distanceSummed) return false; - if(a->_distanceSummed < b->_distanceSummed) return true; - return a < b; - } -}; + bool rtree_callback(surfacePointWithExclusionRegion *neighbour, + void *point); -extern bool rtree_callback(surfacePointWithExclusionRegion *neighbour, - void *point); - -extern bool inExclusionZone( - SPoint2 &p, - RTree<surfacePointWithExclusionRegion *, double, 2, double> &rtree, - std::vector<surfacePointWithExclusionRegion *> &all); +bool inExclusionZone(MVertex *parent, + SPoint2 &p, + RTree<surfacePointWithExclusionRegion *, double, 2, double> &rtree); class Wrapper3D { private: @@ -107,14 +79,9 @@ private: bool ok; public: - Wrapper3D() - : individual(nullptr), parent(nullptr), size(nullptr), cf(nullptr), - vec(nullptr), ok(true) - { - } + Wrapper3D() : individual(0), parent(0), size(0), cf(0), vec(0), ok(true) {} Wrapper3D(MVertex *_i, MVertex *_p) - : individual(_i), parent(_p), size(nullptr), cf(nullptr), vec(nullptr), - ok(true) + : individual(_i), parent(_p), size(0), cf(0), vec(0), ok(true) { } ~Wrapper3D() {} @@ -146,7 +113,7 @@ extern void fill_min_max(double x, double y, double z, double h, double *min, // listOfPoints AND in RTree: larger memory footprint but less CPU time... class smoothness_vertex_pair { public: - smoothness_vertex_pair() : rank(0.), size(0.), v(nullptr), dir(0), layer(0) {} + smoothness_vertex_pair() : rank(0.), size(0.), v(0), dir(0), layer(0) {} ~smoothness_vertex_pair() {} STensor3 cf; SVector3 direction; diff --git a/contrib/domhex/simple3D.cpp b/contrib/domhex/simple3D.cpp index 88770a91bbe64e05cbc21d8df6708a37ff36a71f..9161546102349c2d87e2a9d715b45a191752c156 100644 --- a/contrib/domhex/simple3D.cpp +++ b/contrib/domhex/simple3D.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -282,7 +282,9 @@ void Filler::treat_model() for(it = model->firstRegion(); it != model->lastRegion(); it++) { gr = *it; - if(gr->getNumMeshElements() > 0) { treat_region(gr); } + if(gr->getNumMeshElements() > 0) { + treat_region(gr); + } } } @@ -345,15 +347,21 @@ void Filler::treat_region(GRegion *gr) } for(it = temp.begin(); it != temp.end(); it++) { - if((*it)->onWhat()->dim() == 0) { boundary_vertices.push_back(*it); } + if((*it)->onWhat()->dim() == 0) { + boundary_vertices.push_back(*it); + } } for(it = temp.begin(); it != temp.end(); it++) { - if((*it)->onWhat()->dim() == 1) { boundary_vertices.push_back(*it); } + if((*it)->onWhat()->dim() == 1) { + boundary_vertices.push_back(*it); + } } for(it = temp.begin(); it != temp.end(); it++) { - if((*it)->onWhat()->dim() == 2) { boundary_vertices.push_back(*it); } + if((*it)->onWhat()->dim() == 2) { + boundary_vertices.push_back(*it); + } } std::queue<Node *> fifo; @@ -386,7 +394,9 @@ void Filler::treat_region(GRegion *gr) } std::vector<Node *> spawns(6); - for(int i = 0; i < 6; i++) { spawns[i] = new Node(); } + for(int i = 0; i < 6; i++) { + spawns[i] = new Node(); + } create_spawns(gr, octree, parent, spawns); @@ -423,7 +433,9 @@ void Filler::treat_region(GRegion *gr) if(!ok2) delete individual; } - if(count % 100 == 0) { printf("%d\n", count); } + if(count % 100 == 0) { + printf("%d\n", count); + } count++; } @@ -489,7 +501,9 @@ Metric Filler::get_metric(double x, double y, double z, GEntity *ge) manager = ge->model()->getFields(); if(manager->getBackgroundField() > 0) { field = manager->get(manager->getBackgroundField()); - if(field) { (*field)(x, y, z, temp, ge); } + if(field) { + (*field)(x, y, z, temp, ge); + } } m.set_m11(v1.x()); @@ -522,7 +536,9 @@ double Filler::get_size(double x, double y, double z, GEntity *ge) manager = ge->model()->getFields(); if(manager->getBackgroundField() > 0) { field = manager->get(manager->getBackgroundField()); - if(field) { h = (*field)(x, y, z, ge); } + if(field) { + h = (*field)(x, y, z, ge); + } } return h; @@ -532,7 +548,7 @@ bool Filler::inside_domain(MElementOctree *octree, double x, double y, double z) { MElement *element; element = (MElement *)octree->find(x, y, z, 3, true); - if(element != nullptr) + if(element != NULL) return 1; else return 0; @@ -558,8 +574,8 @@ bool Filler::far_from_boundary(MElementOctree *octree, Node *node) e5 = (MElement *)octree->find(x, y, z + k2 * h, 3, true); e6 = (MElement *)octree->find(x, y, z - k2 * h, 3, true); - if(e1 != nullptr && e2 != nullptr && e3 != nullptr && e4 != nullptr && - e5 != nullptr && e6 != nullptr) + if(e1 != NULL && e2 != NULL && e3 != NULL && e4 != NULL && e5 != NULL && + e6 != NULL) return 1; else return 0; @@ -668,14 +684,18 @@ double Filler::improvement(GEntity *ge, MElementOctree *octree, y = point.y() + h1 * direction.y(); z = point.z() + h1 * direction.z(); - if(inside_domain(octree, x, y, z)) { h2 = get_size(x, y, z); } + if(inside_domain(octree, x, y, z)) { + h2 = get_size(x, y, z); + } else h2 = h1; coeffA = 1.0; coeffB = 0.16; - if(h2 > h1) { average = coeffA * h1 + (1.0 - coeffA) * h2; } + if(h2 > h1) { + average = coeffA * h1 + (1.0 - coeffA) * h2; + } else { average = coeffB * h1 + (1.0 - coeffB) * h2; } diff --git a/contrib/domhex/simple3D.h b/contrib/domhex/simple3D.h index f5e703d88d33f38d0a52a9ac3613aa9f3ba43694..0e244e61ba5a3526445e186e91f502442d6a10e5 100644 --- a/contrib/domhex/simple3D.h +++ b/contrib/domhex/simple3D.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. diff --git a/contrib/domhex/surfaceFiller.cpp b/contrib/domhex/surfaceFiller.cpp index 003bb90d58065c0ed5829474407a46432a63c208..663ee8b8cb0346330ce190a0054c767cb3723b7d 100644 --- a/contrib/domhex/surfaceFiller.cpp +++ b/contrib/domhex/surfaceFiller.cpp @@ -16,6 +16,7 @@ #include "rtree.h" #include "MVertex.h" #include "MElement.h" +#include "MLine.h" #include "BackgroundMesh.h" #include "intersectCurveSurface.h" #include "pointInsertionRTreeTools.h" @@ -42,31 +43,26 @@ bool compute4neighbors( GFace *gf, // the surface MVertex *v_center, // the wertex for which we wnt to generate 4 neighbors SPoint2 &midpoint, - bool goNonLinear, // do we compute the position in the real surface which is - // nonlinear - SPoint2 newP[4][NUMDIR], // look into other directions - SMetric3 &metricField, FILE *crossf = nullptr) // the mesh metric + SPoint2 newP[8], // look into other directions + SMetric3 &metricField,// the mesh metric + Field *f, + double du, + double dv, + double mult) { // we assume that v is on surface gf // get the parameter of the point on the surface reparamMeshVertexOnFace(v_center, gf, midpoint); - - double L = - backgroundMesh::current()->operator()(midpoint[0], midpoint[1], 0.0); + + midpoint = SPoint2(midpoint.x() + du,midpoint.y() + dv); + + SVector3 t1; + (*f)(v_center->x(), v_center->y(), v_center->z(), t1, gf); + double L = t1.norm()*mult; + // printf("L = %12.5E\n",L); metricField = SMetric3(1. / (L * L)); - FieldManager *fields = gf->model()->getFields(); - if(fields->getBackgroundField() > 0) { - Field *f = fields->get(fields->getBackgroundField()); - if(!f->isotropic()) { - (*f)(v_center->x(), v_center->y(), v_center->z(), metricField, gf); - } - else { - L = (*f)(v_center->x(), v_center->y(), v_center->z(), gf); - metricField = SMetric3(1. / (L * L)); - } - } - + // get the unit normal at that point Pair<SVector3, SVector3> der = gf->firstDer(SPoint2(midpoint[0], midpoint[1])); @@ -74,691 +70,358 @@ bool compute4neighbors( SVector3 s2 = der.second(); SVector3 n = crossprod(s1, s2); n.normalize(); - - double M = dot(s1, s1); - double N = dot(s2, s2); - double E = dot(s1, s2); - - // compute the first fundamental form i.e. the metric tensor at the point - // M_{ij} = s_i \cdot s_j - double metric[2][2] = {{M, E}, {E, N}}; - - SVector3 basis_u = s1; - basis_u.normalize(); - SVector3 basis_v = crossprod(n, basis_u); - - for(int DIR = 0; DIR < NUMDIR; DIR++) { - double quadAngle = - backgroundMesh::current()->getAngle(midpoint[0], midpoint[1], 0) + - DIRS[DIR]; - - // normalize vector t1 that is tangent to gf at midpoint - SVector3 t1 = basis_u * cos(quadAngle) + basis_v * sin(quadAngle); - t1.normalize(); - - // compute the second direction t2 and normalize (t1,t2,n) is the tangent - // frame - SVector3 t2 = crossprod(n, t1); - t2.normalize(); - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), t1.x(), t1.y(), t1.z()); - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), t2.x(), t2.y(), t2.z()); - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), -t1.x(), -t1.y(), -t1.z()); - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), -t2.x(), -t2.y(), -t2.z()); - - double size_1 = sqrt(1. / dot(t1, metricField, t1)); - double size_2 = sqrt(1. / dot(t2, metricField, t2)); - - // compute covariant coordinates of t1 and t2 - // t1 = a s1 + b s2 --> - // t1 . s1 = a M + b E - // t1 . s2 = a E + b N --> solve the 2 x 2 system - // and get covariant coordinates a and b - double rhs1[2] = {dot(t1, s1), dot(t1, s2)}, covar1[2]; - bool singular = false; - if(!sys2x2(metric, rhs1, covar1)) { - Msg::Info("Argh surface %d %g %g %g -- %g %g %g -- %g %g", gf->tag(), - s1.x(), s1.y(), s1.z(), s2.x(), s2.y(), s2.z(), size_1, size_2); - covar1[1] = 1.0; - covar1[0] = 0.0; - singular = true; - } - double rhs2[2] = {dot(t2, s1), dot(t2, s2)}, covar2[2]; - if(!sys2x2(metric, rhs2, covar2)) { - Msg::Info("Argh surface %d %g %g %g -- %g %g %g", gf->tag(), s1.x(), - s1.y(), s1.z(), s2.x(), s2.y(), s2.z()); - covar2[0] = 1.0; - covar2[1] = 0.0; - singular = true; - } - - // transform the sizes with respect to the metric - // consider a vector v of size 1 in the parameter plane - // its length is sqrt (v^T M v) --> if I want a real size - // of size1 in direction v, it should be sqrt(v^T M v) * size1 - double l1 = sqrt(covar1[0] * covar1[0] + covar1[1] * covar1[1]); - double l2 = sqrt(covar2[0] * covar2[0] + covar2[1] * covar2[1]); - - covar1[0] /= l1; - covar1[1] /= l1; - covar2[0] /= l2; - covar2[1] /= l2; - - double size_param_1 = - size_1 / sqrt(M * covar1[0] * covar1[0] + 2 * E * covar1[1] * covar1[0] + - N * covar1[1] * covar1[1]); - double size_param_2 = - size_2 / sqrt(M * covar2[0] * covar2[0] + 2 * E * covar2[1] * covar2[0] + - N * covar2[1] * covar2[1]); - if(singular) { - size_param_1 = size_param_2 = std::min(size_param_1, size_param_2); - } - - const double EPS = 1.e-7; - double r1 = EPS * (double)rand() / RAND_MAX; - double r2 = EPS * (double)rand() / RAND_MAX; - double r3 = EPS * (double)rand() / RAND_MAX; - double r4 = EPS * (double)rand() / RAND_MAX; - double r5 = EPS * (double)rand() / RAND_MAX; - double r6 = EPS * (double)rand() / RAND_MAX; - double r7 = EPS * (double)rand() / RAND_MAX; - double r8 = EPS * (double)rand() / RAND_MAX; - double newPoint[4][2] = {{midpoint[0] - covar1[0] * size_param_1 + r1, - midpoint[1] - covar1[1] * size_param_1 + r2}, - {midpoint[0] - covar2[0] * size_param_2 + r3, - midpoint[1] - covar2[1] * size_param_2 + r4}, - {midpoint[0] + covar1[0] * size_param_1 + r5, - midpoint[1] + covar1[1] * size_param_1 + r6}, - {midpoint[0] + covar2[0] * size_param_2 + r7, - midpoint[1] + covar2[1] * size_param_2 + r8}}; - // We could stop here. Yet, if the metric varies a lot, we can solve - // a nonlinear problem in order to find a better approximation in the real - // surface - double ERR[4]; - for(int i = 0; i < 4; i++) { - GPoint pp = gf->point(SPoint2(newPoint[i][0], newPoint[i][1])); - double D = sqrt((pp.x() - v_center->x()) * (pp.x() - v_center->x()) + - (pp.y() - v_center->y()) * (pp.y() - v_center->y()) + - (pp.z() - v_center->z()) * (pp.z() - v_center->z())); - ERR[i] = 100 * fabs(D - L) / (D + L); - } - - if(1 && goNonLinear) { - surfaceFunctorGFace ss(gf); // - SVector3 dirs[4] = {t1 * (-1.0), t2 * (-1.0), t1 * (1.0), t2 * (1.0)}; // - for(int i = 0; i < 4; i++) { // - if(ERR[i] > 12) { - double uvt[3] = {newPoint[i][0], newPoint[i][1], 0.0}; // - curveFunctorCircle cf( - dirs[i], n, SVector3(v_center->x(), v_center->y(), v_center->z()), - L); - if(intersectCurveSurface(cf, ss, uvt, size_param_1 * 1.e-3)) { // - GPoint pp = gf->point(SPoint2(uvt[0], uvt[1])); - double D = - sqrt((pp.x() - v_center->x()) * (pp.x() - v_center->x()) + - (pp.y() - v_center->y()) * (pp.y() - v_center->y()) + - (pp.z() - v_center->z()) * (pp.z() - v_center->z())); - double DP = - sqrt((newPoint[i][0] - uvt[0]) * (newPoint[i][0] - uvt[0]) + - (newPoint[i][1] - uvt[1]) * (newPoint[i][1] - uvt[1])); - double newErr = 100 * fabs(D - L) / (D + L); - if(newErr < 1 && DP < .1) { - newPoint[i][0] = uvt[0]; - newPoint[i][1] = uvt[1]; - } - } - else { - Msg::Debug("Cannot put a new point on Surface %d", gf->tag()); - } - } - } - } - - // return the four new vertices - for(int i = 0; i < 4; i++) { - newP[i][DIR] = SPoint2(newPoint[i][0], newPoint[i][1]); - } - } - return true; -} - -// recover element around vertex v and interpolate smoothness on this element... -double get_smoothness(MVertex *v, GFace *gf, - const std::map<MVertex *, double> &vertices2smoothness) -{ - // recover element around MVertex v - SPoint3 sp3(v->x(), v->y(), v->z()); - SPoint2 param_point; - reparamMeshVertexOnFace(v, gf, param_point); - MElement *elem = backgroundMesh::current()->getMeshElementByCoord( - param_point[0], param_point[1], 0.); - if(!elem) { - elem = backgroundMesh::current()->getMeshElementByCoord( - param_point[0], param_point[1], 0., false); - if(!elem) - Msg::Warning("No element found for coordinate (%g, %g, %g)", sp3.x(), - sp3.y(), sp3.z()); - } - - // recover element's vertices: - std::vector<MVertex *> localvertices; - localvertices.reserve(elem->getNumVertices()); - - for(std::size_t ivert = 0; ivert < elem->getNumVertices(); ivert++) { - MVertex *temp = elem->getVertex(ivert); - localvertices.push_back(temp); - } - - // recover parametrisation uvw - double uvw[3], xyz[3]; - xyz[0] = param_point[0]; - xyz[1] = param_point[1]; - xyz[2] = 0.; - elem->xyz2uvw(xyz, uvw); - - // interpolate : - double val[3]; - int i = 0; - for(auto it = localvertices.begin(); it != localvertices.end(); it++) { - MVertex *localv = *it; - auto itfind = vertices2smoothness.find(localv); - if(itfind == vertices2smoothness.end()) { - Msg::Warning("Background vertex not found"); - return 0; - } - val[i++] = itfind->second; - } - double res = elem->interpolate(val, uvw[0], uvw[1], uvw[2]); - return res; -} - -void print_nodal_info_int(const std::string &filename, - std::map<MVertex *, int> &mapp) -{ - std::ofstream out(filename.c_str()); - - out << "View \"\"{" << std::endl; - for(auto it = mapp.begin(); it != mapp.end(); it++) { - MVertex *v = it->first; - out << "SP( " << v->x() << "," << v->y() << "," << v->z() << "){" - << it->second << "};" << std::endl; - ; - } - out << "};" << std::endl; - - out.close(); -} - -void print_nodal_info_double(const std::string &filename, - std::map<MVertex *, double> &mapp) -{ - std::ofstream out(filename.c_str()); - - out << "View \"\"{" << std::endl; - for(auto it = mapp.begin(); it != mapp.end(); it++) { - MVertex *v = it->first; - out << "SP( " << v->x() << "," << v->y() << "," << v->z() << "){" - << it->second << "};" << std::endl; - ; - } - out << "};" << std::endl; - - out.close(); -} - -void export_point(surfacePointWithExclusionRegion *sp, int DIR, FILE *crossf, - GFace *gf) -{ - // get the unit normal at that point - Pair<SVector3, SVector3> der = gf->firstDer(sp->_center); - SVector3 s1 = der.first(); - SVector3 s2 = der.second(); - SVector3 n = crossprod(s1, s2); - n.normalize(); - SVector3 basis_u = s1; - basis_u.normalize(); - SVector3 basis_v = crossprod(n, basis_u); - - double quadAngle = - backgroundMesh::current()->getAngle(sp->_center[0], sp->_center[1], 0) + - DIRS[DIR]; - - // normalize vector t1 that is tangent to gf at midpoint - SVector3 t1 = basis_u * cos(quadAngle) + basis_v * sin(quadAngle); + t1 -= n*dot(t1,n); t1.normalize(); - - // compute the second direction t2 and normalize (t1,t2,n) is the tangent - // frame - SVector3 t2 = crossprod(n, t1); - t2.normalize(); - - // double scale = DIR+1.; - SMetric3 metricField; - double L = - backgroundMesh::current()->operator()(sp->_center[0], sp->_center[1], 0.0); - metricField = SMetric3(1. / (L * L)); - FieldManager *fields = gf->model()->getFields(); - if(fields->getBackgroundField() > 0) { - Field *f = fields->get(fields->getBackgroundField()); - if(!f->isotropic()) { - (*f)(sp->_v->x(), sp->_v->y(), sp->_v->z(), metricField, gf); - } - else { - L = (*f)(sp->_v->x(), sp->_v->y(), sp->_v->z(), gf); - metricField = SMetric3(1. / (L * L)); - } - } - double size_1 = sqrt(1. / dot(t1, metricField, t1)); - double size_2 = sqrt(1. / dot(t2, metricField, t2)); - - if(crossf) { - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", sp->_v->x(), sp->_v->y(), - sp->_v->z(), t1.x() * size_1, t1.y() * size_1, t1.z() * size_1); - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", sp->_v->x(), sp->_v->y(), - sp->_v->z(), t2.x() * size_2, t2.y() * size_2, t2.z() * size_2); - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", sp->_v->x(), sp->_v->y(), - sp->_v->z(), -t1.x() * size_1, -t1.y() * size_1, -t1.z() * size_1); - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", sp->_v->x(), sp->_v->y(), - sp->_v->z(), -t2.x() * size_2, -t2.y() * size_2, -t2.z() * size_2); - } -} - -bool get_local_sizes_and_directions(const MVertex *v_center, - const SPoint2 &midpoint, const int DIR, - GFace *gf, double (&covar1)[2], - double (&covar2)[2], double &size_param_1, - double &size_param_2, double &L, - SVector3 &t1, SVector3 &t2, SVector3 &n, - FILE *crossf = nullptr) -{ - // bool get_RK_stuff(const MVertex *v_center, const SPoint2 &midpoint, const - // int DIR, GFace* gf, double (&covar1)[2], double (&covar2)[2], double - // &size_param_1, double &size_param_2, double &L, SVector3 &t1, SVector3 &t2, - // SVector3 &n, FILE *crossf, const SVector3 &previous_t1, const SVector3 - // &previous_t2, bool use_previous_basis=false, bool export_cross=true){ - - // !!!!!!!!!!!! check if point is in domain (for RK !!!) - if(!backgroundMesh::current()->inDomain(midpoint.x(), midpoint.y(), 0)) - return false; - - SMetric3 metricField; - L = backgroundMesh::current()->operator()(midpoint[0], midpoint[1], 0.0); - metricField = SMetric3(1. / (L * L)); - FieldManager *fields = gf->model()->getFields(); - if(fields->getBackgroundField() > 0) { - Field *f = fields->get(fields->getBackgroundField()); - if(!f->isotropic()) { - (*f)(v_center->x(), v_center->y(), v_center->z(), metricField, gf); - } - else { - L = (*f)(v_center->x(), v_center->y(), v_center->z(), gf); - metricField = SMetric3(1. / (L * L)); - } - } - - // get the unit normal at that point - Pair<SVector3, SVector3> der = - gf->firstDer(SPoint2(midpoint[0], midpoint[1])); - SVector3 s1 = der.first(); - SVector3 s2 = der.second(); - n = crossprod(s1, s2); - n.normalize(); - + double M = dot(s1, s1); double N = dot(s2, s2); double E = dot(s1, s2); - + // compute the first fundamental form i.e. the metric tensor at the point // M_{ij} = s_i \cdot s_j double metric[2][2] = {{M, E}, {E, N}}; - - SVector3 basis_u = s1; - basis_u.normalize(); - SVector3 basis_v = crossprod(n, basis_u); - - double quadAngle = - backgroundMesh::current()->getAngle(midpoint[0], midpoint[1], 0) + - DIRS[DIR]; - // double quadAngle = atan2(midpoint[0],midpoint[1]); - - // normalize vector t1 that is tangent to gf at midpoint - t1 = basis_u * cos(quadAngle) + basis_v * sin(quadAngle); - t1.normalize(); - + // compute the second direction t2 and normalize (t1,t2,n) is the tangent // frame - t2 = crossprod(n, t1); + SVector3 t2 = crossprod(n, t1); t2.normalize(); - - double size_1 = sqrt(1. / dot(t1, metricField, t1)); - double size_2 = sqrt(1. / dot(t2, metricField, t2)); - - if(crossf) { - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), t1.x() * size_1, t1.y() * size_1, - t1.z() * size_1); - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), t2.x() * size_2, t2.y() * size_2, - t2.z() * size_2); - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), -t1.x() * size_1, -t1.y() * size_1, - -t1.z() * size_1); - if(DIR == 0 && crossf) - fprintf(crossf, "VP(%g,%g,%g) {%g,%g,%g};\n", v_center->x(), - v_center->y(), v_center->z(), -t2.x() * size_2, -t2.y() * size_2, - -t2.z() * size_2); - } - + // compute covariant coordinates of t1 and t2 // t1 = a s1 + b s2 --> // t1 . s1 = a M + b E // t1 . s2 = a E + b N --> solve the 2 x 2 system // and get covariant coordinates a and b - double rhs1[2] = {dot(t1, s1), dot(t1, s2)}; + double rhs1[2] = {dot(t1, s1)*L, dot(t1, s2)*L}, covar1[2]; bool singular = false; if(!sys2x2(metric, rhs1, covar1)) { - Msg::Info("Argh surface %d %g %g %g -- %g %g %g -- %g %g", gf->tag(), - s1.x(), s1.y(), s1.z(), s2.x(), s2.y(), s2.z(), size_1, size_2); + Msg::Debug("surface filler: SINGULAR AT %g %g",midpoint.x(),midpoint.y()); + return false; covar1[1] = 1.0; covar1[0] = 0.0; singular = true; } - double rhs2[2] = {dot(t2, s1), dot(t2, s2)}; + double rhs2[2] = {dot(t2, s1)*L, dot(t2, s2)*L}, covar2[2]; if(!sys2x2(metric, rhs2, covar2)) { - Msg::Info("Argh surface %d %g %g %g -- %g %g %g", gf->tag(), s1.x(), s1.y(), - s1.z(), s2.x(), s2.y(), s2.z()); + Msg::Debug("surface filler: SINGULAR AT %g %g",midpoint.x(),midpoint.y()); + return false; covar2[0] = 1.0; covar2[1] = 0.0; singular = true; } - - // transform the sizes with respect to the metric - // consider a vector v of size 1 in the parameter plane - // its length is sqrt (v^T M v) --> if I want a real size - // of size1 in direction v, it should be sqrt(v^T M v) * size1 - double l1 = sqrt(covar1[0] * covar1[0] + covar1[1] * covar1[1]); - double l2 = sqrt(covar2[0] * covar2[0] + covar2[1] * covar2[1]); - - covar1[0] /= l1; - covar1[1] /= l1; - covar2[0] /= l2; - covar2[1] /= l2; - - size_param_1 = - size_1 / sqrt(M * covar1[0] * covar1[0] + 2 * E * covar1[1] * covar1[0] + - N * covar1[1] * covar1[1]); - size_param_2 = - size_2 / sqrt(M * covar2[0] * covar2[0] + 2 * E * covar2[1] * covar2[0] + - N * covar2[1] * covar2[1]); - if(singular) { - size_param_1 = size_param_2 = std::min(size_param_1, size_param_2); + + // compute the corners of the box as well + double LSQR = L ; + SVector3 b1 = t1+t2; + b1.normalize(); + SVector3 b2 = t1-t2; + b2.normalize(); + + double rhs3[2] = {dot(b1, s1)*LSQR, dot(b1, s2)*LSQR}, covar3[2]; + if(!sys2x2(metric, rhs3, covar3)) { + covar3[1] = 1.e22; + covar3[0] = 0.0; + singular = true; } - - return true; -} - -// using fifo based on smoothness criteria -void packingOfParallelogramsSmoothness(GFace *gf, - std::vector<MVertex *> &packed, - std::vector<SMetric3> &metrics) -{ - Msg::Info("Packing of parallelograms: new algorithm based on smoothness"); - const bool goNonLinear = true; - - const bool debug = (Msg::GetVerbosity() == 99); - - // build vertex -> neighbors table - std::multimap<MVertex *, MVertex *> vertex2vertex; - for(auto it = backgroundMesh::current()->begin_triangles(); - it != backgroundMesh::current()->end_triangles(); it++) { - MElement *e = *it; - for(std::size_t i = 0; i < e->getNumVertices(); i++) { - MVertex *current = e->getVertex(i); - for(std::size_t j = 0; j < e->getNumVertices(); j++) { - if(i == j) continue; - MVertex *neighbor = e->getVertex(j); - vertex2vertex.insert(std::make_pair(current, neighbor)); - } - } + double rhs4[2] = {dot(b2, s1)*LSQR, dot(b2, s2)*LSQR}, covar4[2]; + if(!sys2x2(metric, rhs4, covar4)) { + covar4[0] = 1.e22; + covar4[1] = 0.0; + singular = true; } - - // build table vertex->smoothness - std::map<MVertex *, double> vertices2smoothness; - std::map<MVertex *, double> smoothness_essai; - for(auto it = backgroundMesh::current()->begin_vertices(); - it != backgroundMesh::current()->end_vertices(); it++) { - MVertex *v = *it; - - SPoint2 param_point(v->x(), v->y()); - GPoint gpt = gf->point(param_point); - MVertex v_real(gpt.x(), gpt.y(), gpt.z()); - SVector3 t1, t2, n; - double covar1[2], covar2[2], L, size_param_1, size_param_2; - get_local_sizes_and_directions(&v_real, param_point, 0, gf, covar1, covar2, - size_param_1, size_param_2, L, t1, t2, n); - - // compare to all neighbors... - std::pair<std::multimap<MVertex *, MVertex *>::iterator, - std::multimap<MVertex *, MVertex *>::iterator> - range = vertex2vertex.equal_range(v); - SVector3 t1_nb, t2_nb, n_nb; - double covar1_nb[2], covar2_nb[2], L_nb, size_param_1_nb, size_param_2_nb; - double maxprod, angle = 0.; - int N = 0; - for(auto itneighbor = range.first; itneighbor != range.second; - itneighbor++) { - N++; - maxprod = 0.; - MVertex *v_nb = itneighbor->second; - SPoint2 param_point_nb(v_nb->x(), v_nb->y()); - GPoint gpt_nb = gf->point(param_point_nb); - MVertex v_real_nb(gpt_nb.x(), gpt_nb.y(), gpt_nb.z()); - get_local_sizes_and_directions(&v_real_nb, param_point_nb, 0, gf, - covar1_nb, covar2_nb, size_param_1_nb, - size_param_2_nb, L_nb, t1_nb, t2_nb, n_nb); - // angle comparison... - maxprod = std::max(maxprod, fabs(t1[0] * t1_nb[0] + t1[1] * t1_nb[1])); - maxprod = std::max(maxprod, fabs(t1[0] * t2_nb[0] + t1[1] * t2_nb[1])); - angle += fabs(acos(std::max(std::min(maxprod, 1.), -1.))); - } - angle /= N; - vertices2smoothness[v] = angle; + + + double size_1 = sqrt (covar1[0]*covar1[0]+covar1[1]*covar1[1]); + double size_2 = sqrt (covar2[0]*covar2[0]+covar2[1]*covar2[1]); + + // if (singular){ + // } + + + double newPoint[8][2] = {{midpoint[0] - covar1[0], + midpoint[1] - covar1[1]}, + {midpoint[0] - covar2[0], + midpoint[1] - covar2[1]}, + {midpoint[0] + covar1[0], + midpoint[1] + covar1[1]}, + {midpoint[0] + covar2[0], + midpoint[1] + covar2[1]}, + {midpoint[0] - covar3[0], + midpoint[1] - covar3[1]}, + {midpoint[0] - covar4[0], + midpoint[1] - covar4[1]}, + {midpoint[0] + covar3[0], + midpoint[1] + covar3[1]}, + {midpoint[0] + covar4[0], + midpoint[1] + covar4[1]}}; + + SVector3 dirs[8] = {t1 * (-1.0), t2 * (-1.0), t1 * (1.0), t2 * (1.0), + b1 * (-1.0), b2 * (-1.0), b1 * (1.0), b2 * (1.0) }; + SVector3 orthodirs[8] = {t2 * (-1.0), t1 * (-1.0), t2 * (1.0), t1 * (1.0), + b2 * (-1.0), b1 * (-1.0), b2 * (1.0), b1 * (1.0) }; + double LS[8] = {L,L,L,L,LSQR,LSQR,LSQR,LSQR}; + + SPoint3 ppx (v_center->x(),v_center->y(),v_center->z()); + surfaceFunctorGFace ss(gf); + for(int i = 0; i < 8; i++) { + newP[i] = SPoint2(newPoint[i][0], newPoint[i][1]); + GPoint pp = gf->point(newP[i]); + SPoint3 px (pp.x(),pp.y(),pp.z()); + SVector3 test = px - ppx; + double L2 = test.norm(); + double DIFF_ANG = fabs(dot(orthodirs[i],test)) / L2; + double DIFF_L = fabs(L2-LS[i]); + if (singular || DIFF_L > .1*LS[i] || DIFF_ANG > .1){ + curveFunctorCircle cf(dirs[i], n, SVector3(v_center->x(), v_center->y(), v_center->z()), LS[i]); + double uvt[3] = {newPoint[i][0], newPoint[i][1], 0.0}; // + if(intersectCurveSurface(cf, ss, uvt, size_1 * 1.e-6)) { + pp = gf->point(SPoint2(uvt[0], uvt[1])); + px = SPoint3 (pp.x(),pp.y(),pp.z()); + test = px - ppx; + L2 = test.norm(); + double DIFF_ANG2 = fabs(dot(orthodirs[i],test)) / L2; + double DIFF_L2 = fabs(L2-LS[i]); + newPoint[i][0]=uvt[0]; + newPoint[i][1]=uvt[1]; + if (DIFF_L2 <= DIFF_L && DIFF_ANG2 <= DIFF_ANG){ + } + else{ + Msg::Debug("Difficult to find a point %lu L %g vs %g (ps %12.5E) ",i,L,L2,DIFF_ANG2); } - - // --------------- export de smoothness comme elements.... - // ----------------------- - if(debug) { - std::stringstream ss; - ss << "backgroundmesh_element_smoothness_" << gf->tag() << ".pos"; - std::ofstream out(ss.str().c_str()); - out << "View \"directions\" {" << std::endl; - for(auto it = backgroundMesh::current()->begin_triangles(); - it != backgroundMesh::current()->end_triangles(); it++) { - MElement *e = *it; - std::vector<MVertex *> nodes; - std::vector<double> smoothtemp; - for(int i = 0; i < 3; i++) { - MVertex *v = e->getVertex(i); - nodes.push_back(v); - smoothtemp.push_back(vertices2smoothness[v]); - } - out << "ST("; - for(int i = 0; i < 3; i++) { - GPoint pp = gf->point(SPoint2(nodes[i]->x(), nodes[i]->y())); - out << pp.x() << "," << pp.y() << "," << pp.z(); - if(i != 2) out << ","; } - out << "){"; - for(int i = 0; i < 3; i++) { - out << (1. - (smoothtemp[i] / M_PI * 4.)); - if(i != 2) out << ","; + else{ + SPoint3 p_test (v_center->x() + dirs[i].x() * LS[i], + v_center->y() + dirs[i].y() * LS[i], + v_center->z() + dirs[i].z() * LS[i]); + pp = gf->closestPoint(p_test ,uvt); + if (pp.succeeded()){ + newPoint[i][0] = pp.u(); + newPoint[i][1] = pp.v(); + } + else + Msg::Debug("Impossible to intersect with a circle of radius %g",L); } - out << "};" << std::endl; - } - out << "};" << std::endl; - out.close(); + } } - // --------------- END ---------------- + + return true; +} - // for debug check... - int priority_counter = 0; - std::map<MVertex *, int> vert_priority; +// at crossfield singularities, directions are undefined +// we draw a circle around +// static void createSingularPatches (GFace *gf, std::map<MVertex *, int> &s, Field *f, std::vector<MVertex*> &toInsert){ + +// FILE *_f = fopen("patches.pos","w"); +// fprintf(_f,"View \"\"{\n"); +// for (std::map<MVertex *, int>::iterator it = s.begin();it != s.end() ; ++it){ +// SPoint2 midpoint; +// SPoint2 newP[8]; +// SMetric3 metricField; +// compute4neighbors(gf, it->first, midpoint, newP, metricField, f, 0, 0, it->second == 5 ? .25 : 1); +// //the 8 points (I know, it's strange ...) +// // 2 +// // 7 6 +// // 1 3 +// // 4 5 +// // 0 + +// // get the unit normal at that point +// Pair<SVector3, SVector3> der = +// gf->firstDer(SPoint2(midpoint[0], midpoint[1])); +// SVector3 s1 = der.first(); +// SVector3 s2 = der.second(); +// SVector3 n = crossprod(s1, s2); +// n.normalize(); + +// int loop [8] = {0,4,1,7,2,6,3,5}; +// SVector3 t0[8],t1[8]; +// GPoint p0[8]; +// std::vector<double> dots; +// std::vector<SPoint3> pts; +// for (int i=0;i<8;i++){ +// p0[i] = gf->point(newP[loop[i]]); +// (*f)(p0[i].x(), p0[i].y(),p0[i].z(),t0[i], gf); +// t0[i] -= n*dot(t0[i],n); +// t0[i].normalize(); +// t1[i] = crossprod(n, t0[i]); +// t1[i].normalize(); +// } +// int nSamples = 30; +// SPoint3 p(it->first->x(),it->first->y(),it->first->z()); +// for (int i=0;i<8;i++){ +// SVector3 t0i = t0[i]; +// SVector3 t1i = t1[i]; +// SVector3 t0n = t0[(i+1)%8]; +// SVector3 t1n = t1[(i+1)%8]; +// if (fabs(dot(t0i,t0n)) < fabs(dot(t0i,t1n))){ +// SVector3 temp_ = t0n; +// t0n = t1n; +// t1n = temp_; +// } +// if (dot(t0i,t0n) < 0)t0n = t0n * (-1.0); +// if (dot(t1i,t1n) < 0)t1n = t1n * (-1.0); + +// GPoint pi = p0[i]; +// GPoint pn = p0[(i+1)%8]; +// fprintf(_f,"SP(%g,%g,%g){%d};\n", +// pi.x(),pi.y(),pi.z(),i); +// for (int j=0;j<nSamples;j++){ +// double xi = (double)j/(nSamples); +// SPoint3 pij (pi.x()*(1-xi)+pn.x()*xi,pi.y()*(1-xi)+pn.y()*xi,pi.z()*(1-xi)+pn.z()*xi); +// SVector3 vij = p-pij; +// pts.push_back (pij); +// vij.normalize(); +// SVector3 v0 = t0i*(1-xi) + t0n*xi; +// SVector3 v1 = t1i*(1-xi) + t1n*xi; +// v0.normalize(); +// v1.normalize(); +// double dot0 = fabs(dot(v0,vij)); +// double dot1 = fabs(dot(v1,vij)); +// dots.push_back(std::max(dot0,dot1)); +// fprintf(_f,"VP(%g,%g,%g){%g,%g,%g};\n", +// pij.x(),pij.y(),pij.z(), +// dot0*v0.x(),dot0*v0.y(),dot0*v0.z()); +// fprintf(_f,"VP(%g,%g,%g){%g,%g,%g};\n", +// pij.x(),pij.y(),pij.z(), +// dot1*v1.x(),dot1*v1.y(),dot1*v1.z()); +// } +// } + +// int nbMax = 0; +// for (size_t i=0;i<pts.size();i++){ +// double V0 = dots[i]; +// double V1 = dots[(i+1)%pts.size()]; +// double V2 = dots[(i+2)%pts.size()]; +// if (V1 > V0 && V1 > V2){ +// double uvt[2] = {0,0}; +// GPoint pp = gf->closestPoint(pts[i] ,uvt); +// MFaceVertex *vv = new MFaceVertex (pp.x(),pp.y(),pp.z(),gf,pp.u(),pp.v()); +// toInsert.push_back(vv); +// nbMax++; +// } +// } +// if (nbMax == it-> second)printf("singularity %lu has a good set of %d sampling points\n",it->first->getNum(),nbMax); +// else { +// toInsert.resize(toInsert.size() - nbMax); +// printf("singularity %lu has a bad set of %d vs %d sampling points\n",it->first->getNum(),nbMax,it->second); +// } +// } + +// fprintf(_f,"};\n"); +// fclose(_f); + +// } + + + +static bool outBounds(SPoint2 p, double minu, double maxu, double minv, double maxv){ + if (p.x() > maxu || p.x() < minu || p.y() > maxv || p.y() < minv){ + // printf("OUT BOUND %g %g\n",p.x(),p.y()); + return true; + + } + return false; +} - // get all the boundary vertices - std::set<MVertex *> bnd_vertices; - for(unsigned int i = 0; i < gf->getNumMeshElements(); i++) { - MElement *element = gf->getMeshElement(i); - for(std::size_t j = 0; j < element->getNumVertices(); j++) { - MVertex *vertex = element->getVertex(j); - if(vertex->onWhat()->dim() < 2) bnd_vertices.insert(vertex); - } - } +static bool close2sing(std::vector<MVertex*> &s, GFace *gf, SPoint2 p, Field *f){ + + if (s.empty())return false; + GPoint gp = gf->point(p); + SVector3 t1; + (*f)(gp.x(), gp.y(), gp.z(), t1, gf); + double L = t1.norm(); + + for (size_t i=0;i<s.size();i++){ + MVertex *v = s[i]; + double d = sqrt ((v->x()-gp.x())*(v->x()-gp.x())+ + (v->y()-gp.y())*(v->y()-gp.y())+ + (v->z()-gp.z())*(v->z()-gp.z())); + if (d < FACTOR*L)return true; + } + return false; +} - // --------- put boundary vertices in a fifo queue --------------- - std::set<smoothness_point_pair, - compareSurfacePointWithExclusionRegionPtr_Smoothness> - fifo; - std::vector<surfacePointWithExclusionRegion *> vertices; - // put the RTREE - RTree<surfacePointWithExclusionRegion *, double, 2, double> rtree; - SMetric3 metricField(1.0); - SPoint2 newp[4][NUMDIR]; - auto it = bnd_vertices.begin(); - - char NAME[345]; - sprintf(NAME, "crossReal%d.pos", gf->tag()); - FILE *crossf = nullptr; - if(debug) { crossf = Fopen(NAME, "w"); } - if(crossf) fprintf(crossf, "View \"\"{\n"); - for(; it != bnd_vertices.end(); ++it) { - SPoint2 midpoint; - // compute4neighbors_RK2 (gf, *it, midpoint, goNonLinear, newp, - // metricField,crossf); - compute4neighbors(gf, *it, midpoint, goNonLinear, newp, metricField, - crossf); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(*it, newp, midpoint, metricField); - smoothness_point_pair mp; - mp.ptr = sp; - mp.rank = get_smoothness(*it, gf, vertices2smoothness); - fifo.insert(mp); - - if(debug) { smoothness_essai[*it] = mp.rank; } - - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - if(crossf) export_point(sp, 0, crossf, gf); - } - // ---------- main loop ----------------- - while(!fifo.empty()) { - surfacePointWithExclusionRegion *parent = (*fifo.begin()).ptr; - fifo.erase(fifo.begin()); - int count_nbaddedpt = 0; - for(int dir = 0; dir < NUMDIR; dir++) { - for(int i = 0; i < 4; i++) { - if(!inExclusionZone(parent->_p[i][dir], rtree, vertices)) { - GPoint gp = gf->point(parent->_p[i][dir]); - MFaceVertex *v = - new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); - SPoint2 midpoint; - // compute4neighbors_RK2 (gf, v, midpoint, goNonLinear, newp, - // metricField,crossf); - compute4neighbors(gf, v, midpoint, goNonLinear, newp, metricField, - crossf); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(v, newp, midpoint, metricField, - parent); - smoothness_point_pair mp; - mp.ptr = sp; - mp.rank = get_smoothness(v, gf, vertices2smoothness); - - if(debug) { - smoothness_essai[v] = mp.rank; - vert_priority[v] = priority_counter++; - } - fifo.insert(mp); - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - if(crossf) export_point(sp, dir, crossf, gf); - - count_nbaddedpt++; - } +static void findPhysicalGroupsForSingularities(GFace *gf, + std::map<MVertex *, int> &temp) +{ + + std::set<GVertex *, GEntityPtrLessThan> emb = gf->embeddedVertices(); + if (emb.empty())return; + + std::map<int, std::vector<GEntity *> > groups[4]; + gf->model()->getPhysicalGroups(groups); + for(std::map<int, std::vector<GEntity *> >::iterator it = groups[0].begin(); + it != groups[0].end(); ++it) { + std::string name = gf->model()->getPhysicalName(0, it->first); + if(name == "SINGULARITY_OF_INDEX_THREE") { + for(size_t j = 0; j < it->second.size(); j++) { + if (emb.find((GVertex*)it->second[j]) != emb.end()){ + if(!it->second[j]->mesh_vertices.empty()) + temp[it->second[j]->mesh_vertices[0]] = 3; + } } } - } - if(crossf) { - fprintf(crossf, "};\n"); - fclose(crossf); - } - - if(debug) { - std::stringstream ss; - ss << "priority_" << gf->tag() << ".pos"; - print_nodal_info_int(ss.str().c_str(), vert_priority); - ss.clear(); - ss << "smoothness_test_" << gf->tag() << ".pos"; - print_nodal_info_double(ss.str().c_str(), smoothness_essai); - } - - // add the vertices as additional vertices in the surface mesh - char ccc[256]; - sprintf(ccc, "points%d.pos", gf->tag()); - FILE *f = nullptr; - if(debug) { f = Fopen(ccc, "w"); } - if(f) fprintf(f, "View \"\"{\n"); - for(unsigned int i = 0; i < vertices.size(); i++) { - if(f) vertices[i]->print(f, i); - if(vertices[i]->_v->onWhat() == gf) { - packed.push_back(vertices[i]->_v); - metrics.push_back(vertices[i]->_meshMetric); - SPoint2 midpoint; - reparamMeshVertexOnFace(vertices[i]->_v, gf, midpoint); + else if(name == "SINGULARITY_OF_INDEX_FIVE") { + for(size_t j = 0; j < it->second.size(); j++) { + if (emb.find((GVertex*)it->second[j]) != emb.end()){ + if(!it->second[j]->mesh_vertices.empty()) + temp[it->second[j]->mesh_vertices[0]] = 5; + } + } + } + else if(name == "SINGULARITY_OF_INDEX_SIX") { + for(size_t j = 0; j < it->second.size(); j++) { + if (emb.find((GVertex*)it->second[j]) != emb.end()){ + if(!it->second[j]->mesh_vertices.empty()) + temp[it->second[j]->mesh_vertices[0]] = 6; + } + } } - delete vertices[i]; - } - if(f) { - fprintf(f, "};"); - fclose(f); } } -// fills a surface with points in order to build a nice quad mesh void packingOfParallelograms(GFace *gf, std::vector<MVertex *> &packed, std::vector<SMetric3> &metrics) { - // PE MODIF - // packingOfParallelogramsSmoothness(gf,packed,metrics); - // return; - // END PE MODIF - - const bool debug = (Msg::GetVerbosity() == 99); - - const bool goNonLinear = true; - if(debug) { - std::stringstream ssa; - ssa << "oldbgm_angles_" << gf->tag() << ".pos"; - backgroundMesh::current()->print(ssa.str(), gf, 1); + FILE *f = NULL; + FILE *f2 = NULL; + if(Msg::GetVerbosity() == 99) { + char ccc[256]; + sprintf(ccc, "points%d.pos", gf->tag()); + f = Fopen(ccc, "w"); + sprintf(ccc, "e_points%d.pos", gf->tag()); + f2 = Fopen(ccc, "w"); + if(f) fprintf(f, "View \"\"{\n"); + if(f2) fprintf(f2, "View \"\"{\n"); + } + + FieldManager *fields = gf->model()->getFields(); + Field *cross_field = NULL; + SVector3 t1; + double L; + if(fields->getBackgroundField() > 0) { + cross_field = fields->get(fields->getBackgroundField()); + if(cross_field->numComponents() != 3) {// we hae a true scaled cross fields !! + Msg::Error ("Packing of Parallelograms require a scaled cross field"); + Msg::Error ("Do first gmsh yourmeshname.msh -crossfield to create yourmeshname_scaled_crossfield.pos"); + Msg::Error ("Then do yourmeshname.geo -bgm yourmeshname_scaled_crossfield.pos"); + return; + } + } + else { + Msg::Error ("Packing of Parallelograms require a scaled cross field"); + Msg::Error ("Do first gmsh yourmeshname.msh -crossfield to create yourmeshname_scaled_crossfield.pos"); + Msg::Error ("Then do yourmeshname.geo -bgm yourmeshname_scaled_crossfield.pos"); + return; } + + const bool goNonLinear = true; + // get all the boundary vertices - std::set<MVertex *> bnd_vertices; + std::set<MVertex *, MVertexPtrLessThan> bnd_vertices; for(unsigned int i = 0; i < gf->getNumMeshElements(); i++) { MElement *element = gf->getMeshElement(i); for(std::size_t j = 0; j < element->getNumVertices(); j++) { @@ -767,77 +430,115 @@ void packingOfParallelograms(GFace *gf, std::vector<MVertex *> &packed, } } + // Renormalize size map taking into account quantization... + double globalMult = 1.0; + // put boundary vertices in a fifo queue - std::set<surfacePointWithExclusionRegion *, - compareSurfacePointWithExclusionRegionPtr> - fifo; + std::queue<surfacePointWithExclusionRegion *> fifo; std::vector<surfacePointWithExclusionRegion *> vertices; // put the RTREE RTree<surfacePointWithExclusionRegion *, double, 2, double> rtree; SMetric3 metricField(1.0); - SPoint2 newp[4][NUMDIR]; - auto it = bnd_vertices.begin(); - - char NAME[345]; - sprintf(NAME, "crossReal%d.pos", gf->tag()); - FILE *crossf = nullptr; - if(debug) { crossf = Fopen(NAME, "w"); } - if(crossf) fprintf(crossf, "View \"\"{\n"); + SPoint2 newp[8]; + std::set<MVertex *, MVertexPtrLessThan>::iterator it = bnd_vertices.begin(); + + double maxu = -1.e22,minu = 1.e22; + double maxv = -1.e22,minv = 1.e22; + + std::vector<MVertex*> singularities; for(; it != bnd_vertices.end(); ++it) { + + int NP = 1; SPoint2 midpoint; - compute4neighbors(gf, *it, midpoint, goNonLinear, newp, metricField, - crossf); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(*it, newp, midpoint, metricField); - fifo.insert(sp); - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); + double du[4] = {0,0,0,0}, dv[4]= {0,0,0,0}; + + for (int i=0;i<2;i++){ + if (gf->periodic(i)){ + reparamMeshVertexOnFace(*it, gf, midpoint); + Range<double> bnds = gf->parBounds(i); + // if (1 || midpoint[i] == bnds.low()){ + if (i == 0) + du[NP] = bnds.high() - bnds.low(); + else + dv[NP] = bnds.high() - bnds.low(); + NP++; + // } + // else if (midpoint[i] == bnds.high()){ + if (i == 0) + du[NP] = -(bnds.high() - bnds.low()); + else + dv[NP] = -(bnds.high() - bnds.low()); + NP++; + // } + } + } + for (int i=0;i<NP;i++){ + bool singular = !compute4neighbors(gf, *it, midpoint, newp, metricField, cross_field, du[i],dv[i],globalMult ); + if (!singular){ + surfacePointWithExclusionRegion *sp = + new surfacePointWithExclusionRegion(*it, newp, midpoint, metricField); + minu = std::min(midpoint.x(),minu); + maxu = std::max(midpoint.x(),maxu); + minv = std::min(midpoint.y(),minv); + maxv = std::max(midpoint.y(),maxv); + vertices.push_back(sp); + fifo.push(sp); + double _min[2], _max[2]; + sp->minmax(_min, _max); + rtree.Insert(_min, _max, sp); + } + else{ + singularities.push_back(*it); + break; + } + } } - // printf("initially : %d vertices in the domain\n",vertices.size()); - + // printf("bounds = %g %g %g %g \n",minu,maxu,minv,maxv); + while(!fifo.empty()) { - surfacePointWithExclusionRegion *parent = *fifo.begin(); - fifo.erase(fifo.begin()); - for(int dir = 0; dir < NUMDIR; dir++) { - int countOK = 0; - for(int i = 0; i < 4; i++) { - if(!inExclusionZone(parent->_p[i][dir], rtree, vertices)) { - countOK++; - GPoint gp = gf->point(parent->_p[i][dir]); - MFaceVertex *v = - new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); - SPoint2 midpoint; - compute4neighbors(gf, v, midpoint, goNonLinear, newp, metricField, - crossf); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(v, newp, midpoint, metricField, - parent); - fifo.insert(sp); - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - } + // printf("%d vertices in the domain\n",vertices.size()); + // if (vertices.size() > 5000)break; + surfacePointWithExclusionRegion *parent = fifo.front(); + fifo.pop(); + for(int i = 0; i < 4; i++) { + if(!close2sing (singularities,gf,parent->_p[i],cross_field) + && !inExclusionZone(parent->_v, parent->_p[i], rtree) && + !outBounds(parent->_p[i],minu,maxu,minv,maxv)&& + gf->containsParam(parent->_p[i])) + { + GPoint gp = gf->point(parent->_p[i]); + MFaceVertex *v = + new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); + SPoint2 midpoint; + compute4neighbors(gf, v, midpoint, newp, metricField, cross_field,0, 0, globalMult); + surfacePointWithExclusionRegion *sp = + new surfacePointWithExclusionRegion(v, newp, midpoint, metricField, parent); + fifo.push(sp); + vertices.push_back(sp); + double _min[2], _max[2]; + sp->minmax(_min, _max); + rtree.Insert(_min, _max, sp); + } + else{ + if(Msg::GetVerbosity() == 99) { + GPoint gp = gf->point(parent->_p[i]); + MFaceVertex *v = + new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); + SPoint2 midpoint; + compute4neighbors(gf, v, midpoint, newp, metricField, cross_field, 0, 0 , globalMult); + surfacePointWithExclusionRegion *sp = + new surfacePointWithExclusionRegion(v, newp, midpoint, metricField,parent); + if (!gf->containsParam(parent->_p[i])) + sp->print(f2, i); + // printf("AI\n"); + } } - if(countOK) break; } } - if(crossf) { - fprintf(crossf, "};\n"); - fclose(crossf); - } // add the vertices as additional vertices in the surface mesh - char ccc[256]; - sprintf(ccc, "points%d.pos", gf->tag()); - FILE *f = nullptr; - if(debug) { f = Fopen(ccc, "w"); } - if(f) fprintf(f, "View \"\"{\n"); for(unsigned int i = 0; i < vertices.size(); i++) { - // if(vertices[i]->_v->onWhat() != gf) - if(f) vertices[i]->print(f, i); + if (f)vertices[i]->print(f, i); if(vertices[i]->_v->onWhat() == gf) { packed.push_back(vertices[i]->_v); metrics.push_back(vertices[i]->_meshMetric); @@ -846,166 +547,85 @@ void packingOfParallelograms(GFace *gf, std::vector<MVertex *> &packed, } delete vertices[i]; } - if(f) { + if (f){ + fprintf(f2, "};"); + fclose(f2); fprintf(f, "};"); fclose(f); } } -// fills a surface with points in order to build a nice quad mesh -void packingOfParallelogramsConstrained( - GFace *gf, const std::set<MVertex *> &constr_vertices, - std::vector<MVertex *> &packed, std::vector<SMetric3> &metrics) -{ -// PE MODIF -// packingOfParallelogramsSmoothness(gf,packed,metrics); -// return; -// END PE MODIF -#if defined(HAVE_RTREE) - - std::cout << " inside packingOfParallelogramsConstrained" << std::endl; - const bool goNonLinear = true; - - // FILE *f = Fopen ("parallelograms.pos","w"); - - // get all the boundary vertices - std::set<MVertex *> bnd_vertices; - for(unsigned int i = 0; i < gf->getNumMeshElements(); i++) { - MElement *element = gf->getMeshElement(i); - for(int j = 0; j < element->getNumVertices(); j++) { - MVertex *vertex = element->getVertex(j); - if(vertex->onWhat()->dim() < 2) bnd_vertices.insert(vertex); +/* OLD STUFF + + double uvt[3] = {newPoint[0], newPoint[1], 0.0}; + curveFunctorCircle cc(n2, n1, middle, d); + surfaceFunctorGFace ss(gf); + + if(intersectCurveSurface(cc, ss, uvt, d * 1.e-8)) { + // if(gf->containsParam(SPoint2(uvt[0], uvt[1]))) { + newPoint[0] = uvt[0]; + newPoint[1] = uvt[1]; + return true; + // } + } + + + surfaceFunctorGFace ss(gf); // + SVector3 dirs[4] = {t1 * (-1.0), t2 * (-1.0), t1 * (1.0), t2 * (1.0)}; // + for(int i = 0; i < 4; i++) { // + double uvt[3] = {newPoint[i][0], newPoint[i][1], 0.0}; // + + curveFunctorCircle cf( + dirs[i], n, SVector3(v_center->x(), v_center->y(), v_center->z()), + L); + if(intersectCurveSurface(cf, ss, uvt, size_1 * 1.e-2)) { // + GPoint pp = gf->point(SPoint2(uvt[0], uvt[1])); + double D = + sqrt((pp.x() - v_center->x()) * (pp.x() - v_center->x()) + + (pp.y() - v_center->y()) * (pp.y() - v_center->y()) + + (pp.z() - v_center->z()) * (pp.z() - v_center->z())); + double DP = + sqrt((newPoint[i][0] - uvt[0]) * (newPoint[i][0] - uvt[0]) + + (newPoint[i][1] - uvt[1]) * (newPoint[i][1] - uvt[1])); + double newErr = 100 * fabs(D - L) / (D + L); + if(newErr < 1 && DP < .1) { + newPoint[i][0] = uvt[0]; + newPoint[i][1] = uvt[1]; + } + else { + SPoint3 test (v_center->x() + dirs[i].x() * L, + v_center->y() + dirs[i].y() * L, + v_center->z() + dirs[i].z() * L); + + + GPoint pp = gf->closestPoint(test,uvt); + if (pp.succeeded()){ + newPoint[i][0] = pp.u(); + newPoint[i][1] = pp.v(); + } + else return false; + } } - } - std::cout << " got all the boundary vertices" << std::endl; - - // put boundary vertices in a fifo queue - std::set<surfacePointWithExclusionRegion *, - compareSurfacePointWithExclusionRegionPtr> - fifo; - std::vector<surfacePointWithExclusionRegion *> vertices; - // put the RTREE - RTree<surfacePointWithExclusionRegion *, double, 2, double> rtree; - SMetric3 metricField(1.0); - SPoint2 newp[4][NUMDIR]; - std::set<MVertex *>::iterator it = bnd_vertices.begin(); - - char NAME[345]; - sprintf(NAME, "crossReal%d.pos", gf->tag()); - FILE *crossf = NULL; - if(debug) { crossf = Fopen(NAME, "w"); } - if(crossf) fprintf(crossf, "View \"\"{\n"); - std::cout << " entering first for" << std::endl; - for(; it != bnd_vertices.end(); ++it) { - SPoint2 midpoint; - compute4neighbors(gf, *it, midpoint, goNonLinear, newp, metricField, - crossf); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(*it, newp, midpoint, metricField); - fifo.insert(sp); - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - } - - std::set<MVertex *>::iterator it_constr = constr_vertices.begin(); - std::cout << " entering second for" << std::endl; - for(; it_constr != constr_vertices.end(); ++it_constr) { - SPoint2 midpoint; - std::cout << "going to test out parameterisation of the new point" - << std::endl; - double para0, para1; - (*it_constr)->getParameter(0, para0); - (*it_constr)->getParameter(1, para1); - std::cout << " point tested: para 1 " << para0 << " and para 2 " - << para1 << std::endl; - std::cout << " going to compute4neighbors" << std::endl; - compute4neighbors(gf, *it_constr, midpoint, goNonLinear, newp, metricField, - crossf); - std::cout << " going to surfacePointWithExclusionRegion" - << std::endl; - surfacePointWithExclusionRegion *sp = new surfacePointWithExclusionRegion( - *it_constr, newp, midpoint, metricField); - std::cout << " done surfacePointWithExclusionRegion" << std::endl; - fifo.insert(sp); - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - } - - // printf("initially : %d vertices in the domain\n",vertices.size()); - - std::cout << " entering while" << std::endl; - while(!fifo.empty()) { - surfacePointWithExclusionRegion *parent = *fifo.begin(); - fifo.erase(fifo.begin()); - for(int dir = 0; dir < NUMDIR; dir++) { - int countOK = 0; - for(int i = 0; i < 4; i++) { - if(!inExclusionZone(parent->_p[i][dir], rtree, vertices)) { - countOK++; - GPoint gp = gf->point(parent->_p[i][dir]); - MFaceVertex *v = - new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, gp.u(), gp.v()); - std::cout << "going to test out parameterisation of the new point" - << std::endl; - double para0, para1; - v->getParameter(0, para0); - v->getParameter(1, para1); - std::cout << " point tested: para 1 " << para0 - << " and para 2 " << para1 << std::endl; - SPoint2 midpoint; - compute4neighbors(gf, v, midpoint, goNonLinear, newp, metricField, - crossf); - surfacePointWithExclusionRegion *sp = - new surfacePointWithExclusionRegion(v, newp, midpoint, metricField, - parent); - fifo.insert(sp); - vertices.push_back(sp); - double _min[2], _max[2]; - sp->minmax(_min, _max); - rtree.Insert(_min, _max, sp); - } + else { + SPoint3 test (v_center->x() + dirs[i].x() * L, + v_center->y() + dirs[i].y() * L, + v_center->z() + dirs[i].z() * L); + + + GPoint pp = gf->closestPoint(test,uvt); + if (pp.succeeded()){ + newPoint[i][0] = pp.u(); + newPoint[i][1] = pp.v(); } - if(countOK) break; + else return false; } } - std::cout << " entering if" << std::endl; - if(crossf) { - fprintf(crossf, "};\n"); - fclose(crossf); - } - // add the vertices as additional vertices in the surface mesh - char ccc[256]; - sprintf(ccc, "points%d.pos", gf->tag()); - FILE *f = NULL; - if(debug) { f = Fopen(ccc, "w"); } - if(f) fprintf(f, "View \"\"{\n"); - std::cout << " entering another for" << std::endl; - for(unsigned int i = 0; i < vertices.size(); i++) { - if(f) vertices[i]->print(f, i); - if(vertices[i]->_v->onWhat() == gf) { - packed.push_back(vertices[i]->_v); - metrics.push_back(vertices[i]->_meshMetric); - SPoint2 midpoint; - reparamMeshVertexOnFace(vertices[i]->_v, gf, midpoint); - std::cout << "going to test out parameterisation of the REPARAM point" - << std::endl; - double para0, para1; - vertices[i]->_v->getParameter(0, para0); - vertices[i]->_v->getParameter(1, para1); - std::cout << " point tested: para 1 " << para0 - << " and para 2 " << para1 << std::endl; - } - delete vertices[i]; + + // return the four new vertices + for(int i = 0; i < 4; i++) { + newP[i] = SPoint2(newPoint[i][0], newPoint[i][1]); } - if(f) { - fprintf(f, "};"); - fclose(f); - } - // delete rtree; -#endif -} + return true; + + */ diff --git a/contrib/domhex/surfaceFiller.h b/contrib/domhex/surfaceFiller.h index 48e4ec7946ae8d9fb4e668023f3d1adcfb0c1deb..32e209f7b6e3ddd65b58da9f851d1c2d7313d222 100644 --- a/contrib/domhex/surfaceFiller.h +++ b/contrib/domhex/surfaceFiller.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -14,13 +14,7 @@ class GFace; class MVertex; -void packingOfParallelogramsSmoothness(GFace *gf, - std::vector<MVertex *> &packed, - std::vector<SMetric3> &metrics); void packingOfParallelograms(GFace *gf, std::vector<MVertex *> &packed, std::vector<SMetric3> &metrics); -void packingOfParallelogramsConstrained( - GFace *gf, const std::set<MVertex *> &constr_vertices, - std::vector<MVertex *> &packed, std::vector<SMetric3> &metrics); #endif diff --git a/contrib/domhex/yamakawa.cpp b/contrib/domhex/yamakawa.cpp index 6cfe3281f41a5d4097284230faa7750021af8c57..984700b7b14f85ec4dfda49b4b24ae6fb9f128ba 100644 --- a/contrib/domhex/yamakawa.cpp +++ b/contrib/domhex/yamakawa.cpp @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -93,7 +93,8 @@ namespace { bool inclusion(MVertex *v1, MVertex *v2, MVertex *v3, const std::set<MElement *> &tets) { - for(auto it = tets.begin(); it != tets.end(); it++) { + for(std::set<MElement *>::const_iterator it = tets.begin(); + it != tets.end(); it++) { if(tet_contains_vertex(*it, v1) && tet_contains_vertex(*it, v2) && tet_contains_vertex(*it, v3)) { return true; @@ -392,7 +393,8 @@ namespace { { TetMeshConnectivity::TetSet tets_around_v = tet_mesh.tets_around_vertex(vertex); - for(auto tet = tets_around_v.begin(); tet != tets_around_v.end(); ++tet) { + for(TetMeshConnectivity::TetSet::const_iterator tet = tets_around_v.begin(); + tet != tets_around_v.end(); ++tet) { if(hex_contains_tet(hex, *tet)) { result.insert(*tet); } } } @@ -411,7 +413,7 @@ namespace { MVertex *v = tet->getVertex(i); if(v != v1 && v != v2 && v != v3) { return v; } } - return nullptr; + return NULL; } // Among the input tetrahedra find the first tet that contains v1, v2, and v3 @@ -422,21 +424,22 @@ namespace { MVertex *find(MVertex *v1, MVertex *v2, MVertex *v3, MVertex *v4, const std::set<MElement *> &tets) { - for(auto it = tets.begin(); it != tets.end(); it++) { + for(std::set<MElement *>::const_iterator it = tets.begin(); + it != tets.end(); it++) { MElement *tet = *it; if(tet_contains_vertex(tet, v1) && tet_contains_vertex(tet, v2) && tet_contains_vertex(tet, v3) && !tet_contains_vertex(tet, v4)) { return last_tet_vertex(tet, v1, v2, v3); } } - return nullptr; + return NULL; } template <class T> bool find_value_in_multiset(const std::multiset<T> &set, const T &value, T &value_in_set) { - auto it = set.find(value); + typename std::multiset<T>::const_iterator it = set.find(value); for(; it != set.end() && it->get_hash() == value.get_hash(); ++it) { if(value.same_vertices(*it)) { value_in_set = *it; @@ -450,7 +453,7 @@ namespace { template <class T> bool find_value_in_multiset(const std::multiset<T> &set, const T &value) { - auto it = set.find(value); + typename std::multiset<T>::const_iterator it = set.find(value); for(; it != set.end() && it->get_hash() == value.get_hash(); ++it) { if(value.same_vertices(*it)) { return true; } } @@ -491,25 +494,29 @@ void export_gregion_mesh(GRegion *gr, const string &filename) map<MVertex *, int> vertices; int counterv = 1; - for(auto it = gr->tetrahedra.begin(); it != gr->tetrahedra.end(); it++) { + for(vector<MTetrahedron *>::iterator it = gr->tetrahedra.begin(); + it != gr->tetrahedra.end(); it++) { for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { vertices.insert(make_pair((*it)->getVertex(i), counterv)); counterv++; } } - for(auto it = gr->hexahedra.begin(); it != gr->hexahedra.end(); it++) { + for(vector<MHexahedron *>::iterator it = gr->hexahedra.begin(); + it != gr->hexahedra.end(); it++) { for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { vertices.insert(make_pair((*it)->getVertex(i), counterv)); counterv++; } } - for(auto it = gr->prisms.begin(); it != gr->prisms.end(); it++) { + for(vector<MPrism *>::iterator it = gr->prisms.begin(); + it != gr->prisms.end(); it++) { for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { vertices.insert(make_pair((*it)->getVertex(i), counterv)); counterv++; } } - for(auto it = gr->pyramids.begin(); it != gr->pyramids.end(); it++) { + for(vector<MPyramid *>::iterator it = gr->pyramids.begin(); + it != gr->pyramids.end(); it++) { for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { vertices.insert(make_pair((*it)->getVertex(i), counterv)); counterv++; @@ -524,7 +531,8 @@ void export_gregion_mesh(GRegion *gr, const string &filename) << "$Nodes" << endl << vertices.size() << endl; // write vertices - for(auto it = vertices.begin(); it != vertices.end(); it++) + for(map<MVertex *, int>::iterator it = vertices.begin(); it != vertices.end(); + it++) out << it->second << " " << it->first->x() << " " << it->first->y() << " " << it->first->z() << endl; out << "$EndNodes" << endl @@ -535,7 +543,8 @@ void export_gregion_mesh(GRegion *gr, const string &filename) // write elems int counter = 1; - for(auto it = gr->tetrahedra.begin(); it != gr->tetrahedra.end(); it++) { + for(vector<MTetrahedron *>::iterator it = gr->tetrahedra.begin(); + it != gr->tetrahedra.end(); it++) { out << counter << " 4 2 0 26"; for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { MVertex *v = (*it)->getVertex(i); @@ -544,7 +553,8 @@ void export_gregion_mesh(GRegion *gr, const string &filename) out << endl; counter++; } - for(auto it = gr->hexahedra.begin(); it != gr->hexahedra.end(); it++) { + for(vector<MHexahedron *>::iterator it = gr->hexahedra.begin(); + it != gr->hexahedra.end(); it++) { out << counter << " 5 2 0 26"; for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { MVertex *v = (*it)->getVertex(i); @@ -553,7 +563,8 @@ void export_gregion_mesh(GRegion *gr, const string &filename) out << endl; counter++; } - for(auto it = gr->prisms.begin(); it != gr->prisms.end(); it++) { + for(vector<MPrism *>::iterator it = gr->prisms.begin(); + it != gr->prisms.end(); it++) { out << counter << " 6 2 0 26"; for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { MVertex *v = (*it)->getVertex(i); @@ -562,7 +573,8 @@ void export_gregion_mesh(GRegion *gr, const string &filename) out << endl; counter++; } - for(auto it = gr->pyramids.begin(); it != gr->pyramids.end(); it++) { + for(vector<MPyramid *>::iterator it = gr->pyramids.begin(); + it != gr->pyramids.end(); it++) { out << counter << " 7 2 0 26"; for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { MVertex *v = (*it)->getVertex(i); @@ -593,7 +605,10 @@ bool compare_hex_ptr_by_quality(Hex *a, Hex *b) Recombinator::~Recombinator() { - for(auto it = potential.begin(); it != potential.end(); it++) { delete *it; } + for(std::vector<Hex *>::iterator it = potential.begin(); + it != potential.end(); it++) { + delete *it; + } } void Recombinator::execute() @@ -602,8 +617,8 @@ void Recombinator::execute() // Backup the current mesh model->writeMSH("beforeyamakawa.msh"); - for(auto region_itr = model->firstRegion(); region_itr != model->lastRegion(); - region_itr++) { + for(GModel::riter region_itr = model->firstRegion(); + region_itr != model->lastRegion(); region_itr++) { GRegion *region = *region_itr; if(region->getNumMeshElements() > 0) { execute(region); } @@ -632,7 +647,8 @@ void Recombinator::print_all_potential_hex() const std::cout << "__________________________ START POT HEX LISTING ____________________ " << endl; - for(auto it = potential.begin(); it != potential.end(); it++) { + for(std::vector<Hex *>::const_iterator it = potential.begin(); + it != potential.end(); it++) { cout << "--- Potential hex : " << *(*it) << " " << (*it)->get_quality() << endl; } @@ -706,13 +722,13 @@ void Recombinator::pattern1() remove_values_from_set(bin3, added); added.resize(7); - for(auto it1 = bin1.begin(); it1 != bin1.end(); it1++) { + for(vertex_set_itr it1 = bin1.begin(); it1 != bin1.end(); it1++) { MVertex *p = *it1; added[4] = p; - for(auto it2 = bin2.begin(); it2 != bin2.end(); it2++) { + for(vertex_set_itr it2 = bin2.begin(); it2 != bin2.end(); it2++) { MVertex *q = *it2; added[5] = q; - for(auto it3 = bin3.begin(); it3 != bin3.end(); it3++) { + for(vertex_set_itr it3 = bin3.begin(); it3 != bin3.end(); it3++) { MVertex *r = *it3; added[6] = r; if(p != q && p != r && q != r) { @@ -721,7 +737,8 @@ void Recombinator::pattern1() tet_mesh.vertices_around_vertices(p, q, r, bin4); remove_values_from_set(bin4, added); - for(auto it4 = bin4.begin(); it4 != bin4.end(); it4++) { + for(std::set<MVertex *>::iterator it4 = bin4.begin(); + it4 != bin4.end(); it4++) { MVertex *s = *it4; Hex *hex = new Hex(a, b, q, c, d, p, s, r); @@ -768,10 +785,10 @@ void Recombinator::pattern2() MVertex *s = find(a, b, d, c, verif); MVertex *p = find(b, c, d, a, verif); - if(s != nullptr && p != nullptr) { + if(s != NULL && p != NULL) { MVertex *r = find(s, b, d, a, verif); MVertex *q = find(p, b, d, c, verif); - if(r != nullptr && q != nullptr) { + if(r != 0 && q != 0) { // 2 possible hexes Hex *hex = new Hex(a, s, b, c, d, r, q, p); add_or_free_potential_hex(hex); @@ -815,12 +832,11 @@ void Recombinator::pattern3() MVertex *bA = find(a, c, b, d, verif2); MVertex *bB = find(a, c, d, b, verif2); - if(fA != nullptr && fB != nullptr && bA != nullptr && bB != nullptr && - fA != fB && bA != bB) { + if(fA != 0 && fB != 0 && bA != 0 && bB != 0 && fA != fB && bA != bB) { if(scalar(fA, fB, a, b) > scalar(fA, fB, b, c) && scalar(bA, bB, a, b) > scalar(bA, bB, b, c)) { - MVertex *p = nullptr; - MVertex *q = nullptr; + MVertex *p = NULL; + MVertex *q = NULL; if(distance(fA, b, c) < distance(fB, b, c)) { p = fA; q = fB; @@ -830,8 +846,8 @@ void Recombinator::pattern3() q = fA; } - MVertex *r = nullptr; - MVertex *s = nullptr; + MVertex *r = NULL; + MVertex *s = NULL; if(distance(bA, b, c) < distance(bB, b, c)) { r = bA; s = bB; @@ -860,8 +876,8 @@ void Recombinator::pattern3() } // copy paste alert else if(scalar(fA, fB, a, b) <= scalar(fA, fB, b, c) && scalar(bA, bB, a, b) <= scalar(bA, bB, b, c)) { - MVertex *p = nullptr; - MVertex *q = nullptr; + MVertex *p = NULL; + MVertex *q = NULL; if(distance(fA, a, b) < distance(fB, a, b)) { p = fA; q = fB; @@ -870,8 +886,8 @@ void Recombinator::pattern3() p = fB; q = fA; } - MVertex *r = nullptr; - MVertex *s = nullptr; + MVertex *r = NULL; + MVertex *s = NULL; if(distance(bA, a, b) < distance(bB, a, b)) { r = bA; s = bB; @@ -919,9 +935,10 @@ void add_hex_to_region(GRegion *region, const Hex &hex) bool Recombinator::are_all_tets_free(const std::set<MElement *> &tets) const { - for(auto it = tets.begin(); it != tets.end(); it++) { + for(std::set<MElement *>::const_iterator it = tets.begin(); it != tets.end(); + it++) { MElement *tet = *it; - auto it2 = markings.find(tet); + std::map<MElement *, bool>::const_iterator it2 = markings.find(tet); if(it2->second == true) { return false; } } return true; @@ -929,8 +946,9 @@ bool Recombinator::are_all_tets_free(const std::set<MElement *> &tets) const void Recombinator::mark_tets(const std::set<MElement *> &tets) { - for(auto it = tets.begin(); it != tets.end(); ++it) { - auto it2 = markings.find(*it); + for(std::set<MElement *>::const_iterator it = tets.begin(); it != tets.end(); + ++it) { + std::map<MElement *, bool>::iterator it2 = markings.find(*it); it2->second = true; } } @@ -938,7 +956,8 @@ void Recombinator::mark_tets(const std::set<MElement *> &tets) void remove_slivers(std::set<MElement *> &tets, const Hex &hex, std::set<MElement *> &slivers) { - for(auto it = tets.begin(); it != tets.end(); ++it) { + for(std::set<MElement *>::iterator it = tets.begin(); it != tets.end(); + ++it) { if(is_combinatorially_sliver(*it, hex)) { slivers.insert(*it); tets.erase(it); @@ -955,7 +974,7 @@ void Recombinator::delete_marked_tets_in_region() const current_region->tetrahedra.clear(); for(unsigned int i = 0; i < copy_tets.size(); i++) { MElement *element = (MElement *)(copy_tets[i]); - auto it2 = markings.find(element); + std::map<MElement *, bool>::const_iterator it2 = markings.find(element); if(it2->second == false) { current_region->tetrahedra.push_back(copy_tets[i]); } @@ -1058,7 +1077,8 @@ void Recombinator::build_tuples() std::vector<GFace *> faces = current_region->faces(); - for(auto it = faces.begin(); it != faces.end(); it++) { + for(std::vector<GFace *>::iterator it = faces.begin(); it != faces.end(); + it++) { GFace *gf = *it; for(unsigned int i = 0; i < gf->getNumMeshElements(); i++) { @@ -1104,7 +1124,8 @@ void Recombinator::create_quads_on_boundary() void Recombinator::delete_quad_triangles_in_boundary() const { std::vector<GFace *> faces = current_region->faces(); - for(auto it = faces.begin(); it != faces.end(); it++) { + for(std::vector<GFace *>::iterator it = faces.begin(); it != faces.end(); + it++) { GFace *gf = *it; std::vector<MElement *> triangles_to_keep; triangles_to_keep.reserve(gf->triangles.size()); @@ -1267,11 +1288,11 @@ bool Recombinator::faces_statuquo(MVertex *a, MVertex *b, MVertex *c, Tuple tuple1(a, b, c); Tuple tuple2(c, d, a); - auto it1 = tuples.find(tuple1); - auto it2 = tuples.find(tuple2); + std::multiset<Tuple>::iterator it1 = tuples.find(tuple1); + std::multiset<Tuple>::iterator it2 = tuples.find(tuple2); - GFace *gf1 = nullptr; - GFace *gf2 = nullptr; + GFace *gf1 = NULL; + GFace *gf2 = NULL; while(it1 != tuples.end() && it1->get_hash() == tuple1.get_hash()) { if(tuple1.same_vertices(*it1)) { gf1 = it1->get_gf(); } @@ -1286,7 +1307,7 @@ bool Recombinator::faces_statuquo(MVertex *a, MVertex *b, MVertex *c, assert((gf1 == NULL && gf2 == NULL) || (gf1 != NULL && gf2 != NULL)); - if(gf1 != nullptr && gf2 != nullptr) { + if(gf1 != NULL && gf2 != NULL) { if(gf1 != gf2) { return false; } else return true; @@ -1298,11 +1319,11 @@ bool Recombinator::faces_statuquo(MVertex *a, MVertex *b, MVertex *c, Tuple tuple1(a, b, d); Tuple tuple2(b, c, d); - auto it1 = tuples.find(tuple1); - auto it2 = tuples.find(tuple2); + std::multiset<Tuple>::iterator it1 = tuples.find(tuple1); + std::multiset<Tuple>::iterator it2 = tuples.find(tuple2); - GFace *gf1 = nullptr; - GFace *gf2 = nullptr; + GFace *gf1 = NULL; + GFace *gf2 = NULL; while(it1 != tuples.end() && it1->get_hash() == tuple1.get_hash()) { if(tuple1.same_vertices(*it1)) { gf1 = it1->get_gf(); } @@ -1314,7 +1335,7 @@ bool Recombinator::faces_statuquo(MVertex *a, MVertex *b, MVertex *c, it2++; } - if(gf1 != nullptr && gf2 != nullptr) { + if(gf1 != NULL && gf2 != NULL) { if(gf1 != gf2) { return false; } else return true; @@ -1960,7 +1981,7 @@ void Supplementary::create_quads_on_boundary(MVertex *a, MVertex *b, MVertex *c, std::multiset<Tuple>::iterator it1; std::multiset<Tuple>::iterator it2; - gf1 = nullptr; + gf1 = NULL; // gf2 = NULL; tuple1 = Tuple(a, b, c); @@ -2654,8 +2675,8 @@ bool Supplementary::faces_statuquo(MVertex *a, MVertex *b, MVertex *c, bool ok = 1; - gf1 = nullptr; - gf2 = nullptr; + gf1 = NULL; + gf2 = NULL; Tuple tuple1(a, b, c); Tuple tuple2(c, d, a); @@ -2744,7 +2765,7 @@ void Supplementary::build_vertex_to_vertices(GRegion *gr) MVertex *c = element->getVertex((j + 2) % 4); MVertex *d = element->getVertex((j + 3) % 4); - auto it = vertex_to_vertices.find(a); + Vertex2Vertices::iterator it = vertex_to_vertices.find(a); if(it != vertex_to_vertices.end()) { it->second.insert(b); it->second.insert(c); @@ -2774,7 +2795,7 @@ void Supplementary::build_vertex_to_tetrahedra(GRegion *gr) for(std::size_t j = 0; j < element->getNumVertices(); j++) { MVertex *getVertex = element->getVertex(j); - auto it = vertex_to_tetrahedra.find(getVertex); + Vertex2Elements::iterator it = vertex_to_tetrahedra.find(getVertex); if(it != vertex_to_tetrahedra.end()) { it->second.insert(element); } else { bin.clear(); @@ -3061,7 +3082,7 @@ void PostOp::executeNew(GRegion *gr) std::set<MElement *> potential; find_tetrahedra(f.get_a(), f.get_b(), f.get_c(), potential); - auto it = potential.begin(); + element_set_itr it = potential.begin(); while(it != potential.end()) { if(tetrahedra.find(*it) == tetrahedra.end()) potential.erase(it++); @@ -3226,7 +3247,7 @@ MVertex *PostOp::otherVertexQuadFace(MFace &f, MVertex *v1, MVertex *v2, MVertex *v3) { int n = 0; - MVertex *v = nullptr; + MVertex *v = 0; for(int i = 0; i < 4; ++i) { if(f.getVertex(i) != v1 && f.getVertex(i) != v2 && f.getVertex(i) != v3) { ++n; @@ -3234,7 +3255,7 @@ MVertex *PostOp::otherVertexQuadFace(MFace &f, MVertex *v1, MVertex *v2, } } if(n == 1) return v; - return nullptr; + return NULL; } void PostOp::matchQuadFace(MFace &f, MVertex *v1, MVertex *v2, MVertex *v3) @@ -3563,7 +3584,7 @@ void PostOp::split_pyramids(GRegion *gr) std::set<MElement *> otherPyr; find_pyramids_from_quad(a, b, c, d, otherPyr); if(otherPyr.size() == 2) { - auto myit = otherPyr.begin(); + element_set_itr myit = otherPyr.begin(); MElement *other = *myit; if(other == element) { other = *(++myit); } // TODO test also quality of tet after split of other pyr ? @@ -4094,7 +4115,7 @@ void PostOp::pyramids2(MVertex *a, MVertex *b, MVertex *c, MVertex *d, // y = (diagA->y() + diagB->y())/2.0; // z = (diagA->z() + diagB->z())/2.0; - mid = nullptr; + mid = 0; movables.clear(); if(tetrahedra.size() > 0 || pyramids.size() > 0) { @@ -4176,7 +4197,7 @@ void PostOp::pyramids2(MVertex *a, MVertex *b, MVertex *c, MVertex *d, MVertex *Nin = other(*it, diagA, diagB, Nout); // N1 = other(*it,diagA,diagB); - if(Nout != nullptr && Nin != nullptr) { + if(Nout != 0 && Nin != 0) { Ns.insert(N1); Ns.insert(N2); @@ -4221,7 +4242,7 @@ void PostOp::pyramids2(MVertex *a, MVertex *b, MVertex *c, MVertex *d, build_vertex_to_pyramids(temp2); MVertex *NoutDiag = findInTriFace(diagA, diagB, nDiagA, nDiagB, *it); - MVertex *NoutNDiag = nullptr; + MVertex *NoutNDiag = NULL; for(int iV = 0; iV < 5; iV++) { MVertex *v = (*it)->getVertex(iV); if(v != a && v != b && v != c && v != d && v != NoutDiag) { @@ -4485,7 +4506,7 @@ void PostOp::create_quads_on_boundary(MVertex *a, MVertex *b, MVertex *c, std::multiset<Tuple>::iterator it1; std::multiset<Tuple>::iterator it2; - gf1 = nullptr; + gf1 = NULL; // gf2 = NULL; tuple1 = Tuple(a, b, c); @@ -4661,7 +4682,7 @@ bool PostOp::different(MVertex *v1, MVertex *v2, MVertex *v3, MVertex *v4) MVertex *PostOp::other(MElement *element, MVertex *v1, MVertex *v2) { - MVertex *pointer = nullptr; + MVertex *pointer = NULL; for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); @@ -4676,7 +4697,7 @@ MVertex *PostOp::other(MElement *element, MVertex *v1, MVertex *v2) MVertex *PostOp::other(MElement *element, MVertex *v1, MVertex *v2, MVertex *v3) { - MVertex *pointer = nullptr; + MVertex *pointer = NULL; for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); @@ -4800,13 +4821,13 @@ MVertex *PostOp::findInTriFace(MVertex *in0, MVertex *in1, MVertex *out0, if(face.getVertex(iV) != in0 && face.getVertex(iV) != in1) return face.getVertex(iV); } - return nullptr; + return NULL; } MVertex *PostOp::find(MVertex *v1, MVertex *v2, MVertex *v3, MVertex *v4, MElement *element) { - MVertex *pointer = nullptr; + MVertex *pointer = NULL; for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); @@ -5033,7 +5054,7 @@ void PostOp::build_vertex_to_tetrahedra(MElement *element) for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); - auto it = vertex_to_tetrahedra.find(getVertex); + Vertex2Elements::iterator it = vertex_to_tetrahedra.find(getVertex); if(it != vertex_to_tetrahedra.end()) { it->second.insert(element); } else { bin.clear(); @@ -5049,7 +5070,7 @@ void PostOp::erase_vertex_to_tetrahedra(MElement *element) for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); - auto it = vertex_to_tetrahedra.find(getVertex); + Vertex2Elements::iterator it = vertex_to_tetrahedra.find(getVertex); if(it != vertex_to_tetrahedra.end()) { it->second.erase(element); } } } @@ -5071,7 +5092,7 @@ void PostOp::build_vertex_to_pyramids(MElement *element) for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); - auto it = vertex_to_pyramids.find(getVertex); + Vertex2Elements::iterator it = vertex_to_pyramids.find(getVertex); if(it != vertex_to_pyramids.end()) { it->second.insert(element); } else { bin.clear(); @@ -5087,7 +5108,7 @@ void PostOp::erase_vertex_to_pyramids(MElement *element) for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); - auto it = vertex_to_pyramids.find(getVertex); + Vertex2Elements::iterator it = vertex_to_pyramids.find(getVertex); if(it != vertex_to_pyramids.end()) { it->second.erase(element); } } } @@ -5109,7 +5130,7 @@ void PostOp::build_vertex_to_hexPrism(MElement *element) for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); - auto it = vertex_to_hexPrism.find(getVertex); + Vertex2Elements::iterator it = vertex_to_hexPrism.find(getVertex); if(it != vertex_to_hexPrism.end()) { it->second.insert(element); } else { bin.clear(); @@ -5125,7 +5146,7 @@ void PostOp::erase_vertex_to_hexPrism(MElement *element) for(std::size_t i = 0; i < element->getNumVertices(); i++) { MVertex *getVertex = element->getVertex(i); - auto it = vertex_to_hexPrism.find(getVertex); + Vertex2Elements::iterator it = vertex_to_hexPrism.find(getVertex); if(it != vertex_to_hexPrism.end()) { it->second.erase(element); } } } @@ -5176,19 +5197,20 @@ void export_the_clique_graphviz_format(cliques_compatibility_graph<T> &cl, { ofstream out(filename.c_str()); out << "Graph G {" << endl; - auto it_all = cl.allQ.rbegin(); + typename multimap<int, set<T> >::reverse_iterator it_all = cl.allQ.rbegin(); for(int i = 0; i < clique_number; i++) { it_all++; } // int clique_size = it_all->second.size(); - auto ithex = it_all->second.begin(); - auto ithexen = it_all->second.end(); + typename set<T>::iterator ithex = it_all->second.begin(); + typename set<T>::iterator ithexen = it_all->second.end(); int counter = 1; map<T, int> visited_hex; multimap<int, int> done; // export all hex - auto itgraph = cl.begin_graph(); + typename cliques_compatibility_graph<T>::graph::const_iterator itgraph = + cl.begin_graph(); typename cliques_compatibility_graph<T>::graph_data::const_iterator itgraphdata; @@ -5196,7 +5218,7 @@ void export_the_clique_graphviz_format(cliques_compatibility_graph<T> &cl, T firsthex = itgraph->second.first; // if (!post_check_validation(firsthex)) continue; - auto itfind = visited_hex.find(firsthex); + typename map<T, int>::iterator itfind = visited_hex.find(firsthex); int num1 = 0; if(itfind == visited_hex.end()) { num1 = counter; @@ -5222,7 +5244,8 @@ void export_the_clique_graphviz_format(cliques_compatibility_graph<T> &cl, bool found = false; pair<multimap<int, int>::iterator, multimap<int, int>::iterator> range = done.equal_range(num1); - for(auto it = range.first; it != range.second; it++) { + for(multimap<int, int>::iterator it = range.first; it != range.second; + it++) { if(it->second == num2) { found = true; break; @@ -5238,7 +5261,7 @@ void export_the_clique_graphviz_format(cliques_compatibility_graph<T> &cl, // export chosen hex with different color for(; ithex != ithexen; ithex++) { // brutal post-check: random pickup of hexahedra in clique - auto itfind = visited_hex.find(*ithex); + typename map<T, int>::iterator itfind = visited_hex.find(*ithex); if(itfind == visited_hex.end()) { cout << "graph export: should not happen ! " << endl; throw; @@ -5278,9 +5301,10 @@ void clique_stop_criteria<T>::export_corresponding_mesh( set<MElement *> hexs; map<MVertex *, int> vertices; int counterv = 1; - auto it = hex_to_tet.begin(); + typename map<T, std::set<MElement *> >::const_iterator it = + hex_to_tet.begin(); for(; it != hex_to_tet.end(); it++) { - auto itt = it->second.begin(); + std::set<MElement *>::const_iterator itt = it->second.begin(); for(; itt != it->second.end(); itt++) { tets.insert(*itt); for(int i = 0; i < 4; i++) { @@ -5291,8 +5315,10 @@ void clique_stop_criteria<T>::export_corresponding_mesh( } // create MHexahedron, remove included tets from set "tets" - for(auto it = clique.begin(); it != clique.end(); it++) { - auto itfind = hex_to_tet.find(*it); + for(typename graph_data_no_hash::const_iterator it = clique.begin(); + it != clique.end(); it++) { + typename map<T, std::set<MElement *> >::const_iterator itfind = + hex_to_tet.find(*it); if(itfind == hex_to_tet.end()) { cout << "clique_stop_criteria::void export_corresponding_mesh : not " "found !!!" @@ -5300,8 +5326,8 @@ void clique_stop_criteria<T>::export_corresponding_mesh( throw; } // remove tets - for(auto ittet = itfind->second.begin(); ittet != itfind->second.end(); - ittet++) { + for(set<MElement *>::const_iterator ittet = itfind->second.begin(); + ittet != itfind->second.end(); ittet++) { tets.erase(*ittet); } // create MHexahedron @@ -5331,7 +5357,8 @@ void clique_stop_criteria<T>::export_corresponding_mesh( << "$Nodes" << endl << vertices.size() << endl; // write vertices - for(auto it = vertices.begin(); it != vertices.end(); it++) { + for(map<MVertex *, int>::iterator it = vertices.begin(); it != vertices.end(); + it++) { out << it->second << " " << it->first->x() << " " << it->first->y() << " " << it->first->z() << endl; outtets << it->second << " " << it->first->x() << " " << it->first->y() @@ -5346,7 +5373,7 @@ void clique_stop_criteria<T>::export_corresponding_mesh( // write hexs int counter = 1; int countertets = 1; - for(auto it = hexs.begin(); it != hexs.end(); it++) { + for(set<MElement *>::iterator it = hexs.begin(); it != hexs.end(); it++) { out << counter << " 5 2 0 26"; for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { MVertex *v = (*it)->getVertex(i); @@ -5356,7 +5383,7 @@ void clique_stop_criteria<T>::export_corresponding_mesh( counter++; } // write tets - for(auto it = tets.begin(); it != tets.end(); it++) { + for(set<MElement *>::iterator it = tets.begin(); it != tets.end(); it++) { out << counter << " 4 2 0 26"; outtets << counter << " 4 2 0 26"; for(std::size_t i = 0; i < (*it)->getNumVertices(); i++) { @@ -5388,16 +5415,18 @@ bool clique_stop_criteria<T>::stop(const graph_data_no_hash &clique) const set<MElement *> thetets; // set<MElement*> slivers; - for(auto it = clique.begin(); it != clique.end(); it++) { - auto itfind = hex_to_tet.find(*it); + for(typename graph_data_no_hash::const_iterator it = clique.begin(); + it != clique.end(); it++) { + typename map<T, std::set<MElement *> >::const_iterator itfind = + hex_to_tet.find(*it); if(itfind == hex_to_tet.end()) { cout << "clique_stop_criteria::bool stop : not found !!!" << endl; throw; } // total += (itfind->second.size()); // cout << "volumes=" << endl; - for(auto ittet = itfind->second.begin(); ittet != itfind->second.end(); - ittet++) { + for(set<MElement *>::const_iterator ittet = itfind->second.begin(); + ittet != itfind->second.end(); ittet++) { // set<MElement*>::iterator itfindtet = thetets.find(*ittet); // if (itfindtet!=thetets.end()){ // cout << "Tet " << *ittet << " already done !!!" << endl; @@ -5410,14 +5439,16 @@ bool clique_stop_criteria<T>::stop(const graph_data_no_hash &clique) const // to be sure, adding volume criteria... vector<double> volumes; - for(auto it = thetets.begin(); it != thetets.end(); it++) { + for(set<MElement *>::iterator it = thetets.begin(); it != thetets.end(); + it++) { volumes.push_back((*it)->getVolume()); } int meanvolume = (std::accumulate(volumes.begin(), volumes.end(), 0)) / volumes.size(); int nb_slivers = 0; double threshold = 1.e-3 * meanvolume; - for(auto it = thetets.begin(); it != thetets.end(); it++) { + for(set<MElement *>::iterator it = thetets.begin(); it != thetets.end(); + it++) { if((*it)->getVolume() < threshold) { nb_slivers++; } } @@ -5455,7 +5486,7 @@ template <class T> void cliques_compatibility_graph<T>::find_cliques() { // init graph_data s; - for(auto it = G.begin(); it != G.end(); it++) { + for(typename graph::iterator it = G.begin(); it != G.end(); it++) { s.insert(make_pair(it->first, it->second.first)); } find_cliques(s, 0); @@ -5514,7 +5545,8 @@ template <class T> void cliques_compatibility_graph<T>::store_clique(int n) } } if(store_it) { - auto itstore = allQ.insert(make_pair(Q.size(), set<T>())); + typename multimap<int, set<T> >::iterator itstore = + allQ.insert(make_pair(Q.size(), set<T>())); itstore->second.insert(Q.begin(), Q.end()); // for (typename graph_data_no_hash::iterator it = Q.begin(); it != Q.end(); // it++) { @@ -5583,7 +5615,7 @@ void cliques_compatibility_graph<T>::find_cliques(graph_data &subgraph, int n) return; } if(subgraph.size() == 1) { - auto ittemp = subgraph.begin(); + typename graph_data::iterator ittemp = subgraph.begin(); T u = ittemp->second; Q.insert(u); store_clique(n); @@ -5622,7 +5654,7 @@ void cliques_compatibility_graph<T>::find_cliques(graph_data &subgraph, int n) black.clear(); if(white.size() > 0) { - auto ittemp = white.begin(); + typename graph_data::iterator ittemp = white.begin(); u = ittemp->second; u_key = ittemp->first; fill_black_set(u, u_key, subgraph, black); // building the black set only @@ -5637,7 +5669,7 @@ void cliques_compatibility_graph<T>::erase_entry(graph_data &subgraph, T &u, pair<typename graph_data::iterator, typename graph_data::iterator> range = subgraph.equal_range(key); - auto it = range.first; + typename graph_data::iterator it = range.first; for(; it != range.second; it++) { if(it->second == u) { subgraph.erase(it); @@ -5655,7 +5687,8 @@ void cliques_compatibility_graph<T>::choose_u(const graph_data &subgraph, T &u, hash_key &u_key) { double valuemax = -DBL_MAX; - for(auto it = subgraph.begin(); it != subgraph.end(); it++) { + for(typename graph_data::const_iterator it = subgraph.begin(); + it != subgraph.end(); it++) { double value = function_to_maximize_for_u(it->second, it->first, subgraph); if(value > valuemax) { valuemax = value; @@ -5674,7 +5707,7 @@ void cliques_compatibility_graph<T>::split_set_BW(const T &u, { // splitting set subgraph into white and black nodes white.insert(make_pair(u_key, u)); - auto it = subgraph.begin(); + typename graph_data::const_iterator it = subgraph.begin(); for(; it != subgraph.end(); it++) { if(u == (it->second)) continue; if(!compatibility(u, u_key, it->second, it->first)) @@ -5691,7 +5724,7 @@ void cliques_compatibility_graph<T>::fill_black_set(const T &u, graph_data &black) { // filling black set - auto it = subgraph.begin(); + typename graph_data::const_iterator it = subgraph.begin(); for(; it != subgraph.end(); it++) { if(u == (it->second)) continue; if(compatibility(u, u_key, it->second, it->first)) @@ -5707,7 +5740,8 @@ double cliques_compatibility_graph<T>::function_to_maximize_for_u( const T &u, const hash_key &u_key, const graph_data &subgraph) { int counter = 0; - for(auto it = subgraph.begin(); it != subgraph.end(); it++) { + for(typename graph_data::const_iterator it = subgraph.begin(); + it != subgraph.end(); it++) { if((it->second) == u) continue; if(compatibility(u, u_key, it->second, it->first)) counter++; } @@ -5724,15 +5758,15 @@ bool cliques_compatibility_graph<T>::compatibility(const T &u, // Find u data pair<typename graph::const_iterator, typename graph::const_iterator> range_ukey = G.equal_range(u_key); - auto itfind_u = range_ukey.first; + typename graph::const_iterator itfind_u = range_ukey.first; for(; itfind_u != range_ukey.second; itfind_u++) { if(itfind_u->second.first == u) break; } // Check if v is in u data pair<typename graph_data::const_iterator, typename graph_data::const_iterator> range_vkey = itfind_u->second.second.equal_range(v_key); - for(auto itfind_v = range_vkey.first; itfind_v != range_vkey.second; - itfind_v++) { + for(typename graph_data::const_iterator itfind_v = range_vkey.first; + itfind_v != range_vkey.second; itfind_v++) { if(itfind_v->second == v) { return true; } } return false; @@ -5796,7 +5830,8 @@ bool PEEntity::hasVertex(MVertex *v) const bool PEEntity::same_vertices(const PEEntity *t) const { - for(auto it = vertices.begin(); it != vertices.end(); it++) { + for(vector<MVertex *>::const_iterator it = vertices.begin(); + it != vertices.end(); it++) { if(!(t->hasVertex(*it))) return false; } return true; @@ -5903,7 +5938,7 @@ void Recombinator_Graph::fill_tet_to_hex_table(Hex *hex) // non, c'est pas toujours le cas !!! ??? set<MVertex *> vertices; - for(auto it = parts.begin(); it != parts.end(); it++) { + for(element_set_itr it = parts.begin(); it != parts.end(); it++) { element = *it; for(int i = 0; i < 4; i++) { vertices.insert(element->getVertex(i)); } } @@ -5932,7 +5967,8 @@ void Recombinator_Graph::fill_tet_to_hex_table(Hex *hex) // deviennent b c d a, on a une rotation et un hex tout pourri... mais qui a // même hash et mêmes noeuds ?!?! now, check if the hex already exists... if(!bypass) { - auto itfind = find_the_created_potential_hex(hex, created_potential_hex); + graph_data::const_iterator itfind = + find_the_created_potential_hex(hex, created_potential_hex); if(itfind != created_potential_hex.end()) { delete hex; if(very_verbose) @@ -5954,7 +5990,7 @@ void Recombinator_Graph::fill_tet_to_hex_table(Hex *hex) // counting the number of triangular external faces. If different from 12, // discard the hex ! if not, build the face/hex table std::multimap<unsigned long long, pair<PETriangle *, int> > faces_temp; - for(auto it_tet = parts.begin(); it_tet != parts.end(); + for(element_set_itr it_tet = parts.begin(); it_tet != parts.end(); it_tet++) { // for all tets for(int i = 0; i < 4; i++) { // for all faces MFace f = (*it_tet)->getFace(i); @@ -5963,8 +5999,10 @@ void Recombinator_Graph::fill_tet_to_hex_table(Hex *hex) } int count = 0; - auto it_face = faces_temp.begin(); - auto it_faceen = faces_temp.end(); + std::multimap<unsigned long long, pair<PETriangle *, int> >::iterator + it_face = faces_temp.begin(); + std::multimap<unsigned long long, pair<PETriangle *, int> >::iterator + it_faceen = faces_temp.end(); for(; it_face != it_faceen; it_face++) // counting if(it_face->second.second == 1) count++; @@ -5993,7 +6031,7 @@ void Recombinator_Graph::fill_tet_to_hex_table(Hex *hex) // might be a source of the above problem... but I am quite unsure. JP. created_potential_hex.insert(make_pair(hex->get_hash(), hex)); add_edges(hex); - for(auto it = parts.begin(); it != parts.end(); it++) { + for(element_set_itr it = parts.begin(); it != parts.end(); it++) { element = *it; tet_to_hex[element].insert(hex); hex_to_tet[hex].insert(element); @@ -6056,11 +6094,11 @@ void Recombinator_Graph::execute_blossom(unsigned int max_nb_cliques, Recombinator_Graph::~Recombinator_Graph() { - for(auto it = triangular_faces.begin(); it != triangular_faces.end(); it++) { + for(iter it = triangular_faces.begin(); it != triangular_faces.end(); it++) { delete it->second; } - for(auto it = edges_and_diagonals.begin(); it != edges_and_diagonals.end(); - it++) { + for(linemap::iterator it = edges_and_diagonals.begin(); + it != edges_and_diagonals.end(); it++) { delete it->second; } @@ -6097,10 +6135,11 @@ void Recombinator_Graph::createBlossomInfo(GRegion *gr) cout << "recover blossom info" << endl; - for(auto it = faces.begin(); it != faces.end(); it++) { + for(std::vector<GFace *>::iterator it = faces.begin(); it != faces.end(); + it++) { gf = *it; - auto it_quad = gf->quadrangles.begin(); + std::vector<MQuadrangle *>::iterator it_quad = gf->quadrangles.begin(); for(; it_quad != gf->quadrangles.end(); it_quad++) { element = *it_quad; @@ -6284,7 +6323,7 @@ PETriangle *Recombinator_Graph::get_triangle(MElement *element, int i, int j, v.push_back(element->getVertex(j)); v.push_back(element->getVertex(k)); t = new PETriangle(v); - auto itfind = find_the_triangle(t, triangular_faces); + citer itfind = find_the_triangle(t, triangular_faces); if(itfind == triangular_faces.end()) { itfind = triangular_faces.insert(make_pair(t->get_hash(), t)); } @@ -6401,8 +6440,8 @@ void Recombinator_Graph::merge_clique(GRegion *gr, cliques_losses_graph<Hex *> &cl, int clique_number) { - auto it_all = cl.allQ.rbegin(); - auto it_allen = cl.allQ.rend(); + multimap<int, set<Hex *> >::reverse_iterator it_all = cl.allQ.rbegin(); + multimap<int, set<Hex *> >::reverse_iterator it_allen = cl.allQ.rend(); int clique_counter = 0; std::set<MElement *> parts; // int clique_size = 0; @@ -6414,8 +6453,8 @@ void Recombinator_Graph::merge_clique(GRegion *gr, // cout << "--------------------- clique " << clique_counter << " made of "; // clique_size = it_all->second.size(); - auto ithex = it_all->second.begin(); - auto ithexen = it_all->second.end(); + set<Hex *>::iterator ithex = it_all->second.begin(); + set<Hex *>::iterator ithexen = it_all->second.end(); double quality = 0.; int count = 0; @@ -6441,7 +6480,7 @@ bool Recombinator_Graph::merge_hex(GRegion *gr, Hex *hex) MHexahedron *h = new MHexahedron(hex->vertices()); gr->addHexahedron(h); - auto it_tet_to_remove = hex_to_tet[hex].begin(); + std::set<MElement *>::iterator it_tet_to_remove = hex_to_tet[hex].begin(); std::vector<MTetrahedron *>::iterator itfind_tet_region; for(; it_tet_to_remove != hex_to_tet[hex].end(); it_tet_to_remove++) { itfind_tet_region = std::find(gr->tetrahedra.begin(), gr->tetrahedra.end(), @@ -6474,8 +6513,8 @@ void Recombinator_Graph::export_tets(set<MElement *> &tetset, Hex *hex, ofstream out(ss.str().c_str()); out << "View \"hex tets parts\" {" << endl; - auto it = tetset.begin(); - auto iten = tetset.end(); + element_set_itr it = tetset.begin(); + element_set_itr iten = tetset.end(); int count = 0; for(; it != iten; it++, count++) { out << "SS("; @@ -6505,8 +6544,8 @@ void Recombinator_Graph::export_single_hex_tet(Hex *hex, const string &s) ofstream out(ss.str().c_str()); out << "View \"hex tets\" {" << endl; - auto it = hex_to_tet[hex].begin(); - auto iten = hex_to_tet[hex].end(); + element_set_itr it = hex_to_tet[hex].begin(); + element_set_itr iten = hex_to_tet[hex].end(); int count = 0; for(; it != iten; it++, count++) { out << "SS("; @@ -6570,8 +6609,8 @@ void Recombinator_Graph::export_single_hex_faces(Hex *hex, const string &s) ofstream out(ss.str().c_str()); out << "View \"hex faces\" {" << endl; - auto it = hex_to_faces[hex].begin(); - auto iten = hex_to_faces[hex].end(); + std::set<PETriangle *>::iterator it = hex_to_faces[hex].begin(); + std::set<PETriangle *>::iterator iten = hex_to_faces[hex].end(); int count = 0; for(; it != iten; it++, count++) { out << "ST("; @@ -6600,7 +6639,7 @@ void Recombinator_Graph::export_hex_init_degree( ss << ".pos"; ofstream out(ss.str().c_str()); - auto it = chosen_hex.begin(); + std::vector<Hex *>::const_iterator it = chosen_hex.begin(); out << "View \"hex\" {" << endl; for(; it != chosen_hex.end(); it++) { out << "SH("; @@ -6609,7 +6648,7 @@ void Recombinator_Graph::export_hex_init_degree( out << v->x() << "," << v->y() << "," << v->z(); if(n != 7) out << ","; } - auto itfind = init_degree.find(*it); + map<Hex *, int>::const_iterator itfind = init_degree.find(*it); out << "){"; for(int n = 0; n < 8; n++) { out << itfind->second; @@ -6654,7 +6693,7 @@ void Recombinator_Graph::export_all_hex(int &file, GRegion *gr) ssinit << ".pos"; ofstream out(ss.str().c_str()); - auto it = gr->hexahedra.begin(); + std::vector<MHexahedron *>::iterator it = gr->hexahedra.begin(); int i = 1; out << "View \"hex\" {" << endl; for(; it != gr->hexahedra.end(); it++, i++) { @@ -6688,9 +6727,9 @@ bool Recombinator_Graph::is_not_good_enough(Hex *hex) // tetrahedra For the entry to be added the hex also have to be good_enough void Recombinator_Graph::create_indirect_neighbors_graph() { - auto it_tet = tet_to_hex.begin(); + std::map<MElement *, std::set<Hex *> >::iterator it_tet = tet_to_hex.begin(); for(; it_tet != tet_to_hex.end(); it_tet++) { - auto it_hex1 = it_tet->second.begin(); + std::set<Hex *>::iterator it_hex1 = it_tet->second.begin(); for(; it_hex1 != it_tet->second.end(); it_hex1++) { Hex *hex = *it_hex1; @@ -6700,7 +6739,7 @@ void Recombinator_Graph::create_indirect_neighbors_graph() continue; } if(is_not_good_enough(hex)) { continue; } - auto itfind_graph = find_hex_in_graph(hex); + graph::iterator itfind_graph = find_hex_in_graph(hex); if(itfind_graph == incompatibility_graph.end()) { // Add the hex to the graph itfind_graph = incompatibility_graph.insert( @@ -6709,7 +6748,7 @@ void Recombinator_Graph::create_indirect_neighbors_graph() } // Link the hex as incompatible to all the good enough hex // that share the current tet - for(auto it_hex2 = it_tet->second.begin(); + for(std::set<Hex *>::iterator it_hex2 = it_tet->second.begin(); it_hex2 != it_tet->second.end(); it_hex2++) { Hex *hex2 = *it_hex2; if(hex != hex2 && !is_not_good_enough(hex2)) { @@ -6727,7 +6766,7 @@ Recombinator_Graph::find_the_created_potential_hex( { std::pair<graph_data::const_iterator, graph_data::const_iterator> range = list.equal_range(hex->get_hash()); - for(auto it = range.first; it != range.second; it++) { + for(graph_data::const_iterator it = range.first; it != range.second; it++) { Hex *candidate = it->second; if(candidate->same_vertices(hex)) { return it; } } @@ -6743,7 +6782,9 @@ Recombinator_Graph::find_the_triangle( std::multimap<unsigned long long, pair<PETriangle *, int> >::iterator, std::multimap<unsigned long long, pair<PETriangle *, int> >::iterator> range = list.equal_range(t->get_hash()); - for(auto it = range.first; it != range.second; it++) { + for(std::multimap<unsigned long long, pair<PETriangle *, int> >::iterator it = + range.first; + it != range.second; it++) { PETriangle *candidate = it->second.first; if(candidate->same_vertices(t)) { it->second.second++; @@ -6757,7 +6798,7 @@ Recombinator_Graph::citer Recombinator_Graph::find_the_triangle(PETriangle *t, const trimap &list) { std::pair<citer, citer> range = list.equal_range(t->get_hash()); - for(auto it = range.first; it != range.second; it++) { + for(citer it = range.first; it != range.second; it++) { if(it->second->same_vertices(t)) return it; } return list.end(); @@ -6768,7 +6809,7 @@ Recombinator_Graph::find_the_line(PELine *t, const linemap &list) { std::pair<linemap::const_iterator, linemap::const_iterator> range = list.equal_range(t->get_hash()); - for(auto it = range.first; it != range.second; it++) { + for(linemap::const_iterator it = range.first; it != range.second; it++) { if(it->second->same_vertices(t)) return it; } return list.end(); @@ -6780,7 +6821,7 @@ void Recombinator_Graph::export_direct_neighbor_table(int max) ss << "neighbors_table"; ofstream out(ss.str().c_str()); - auto it = ndegree.begin(); + std::multimap<int, Hex *>::iterator it = ndegree.begin(); int counter = 0; out << " n neighbors_rank hex* quality" << endl; @@ -6818,7 +6859,8 @@ void Recombinator_Graph::export_direct_neighbor_table(int max) void print_stats_graph(const Recombinator_Graph::graph &in) { int total = 0; - for(auto it = in.begin(); it != in.end(); it++) { + for(Recombinator_Graph::graph::const_iterator it = in.begin(); it != in.end(); + it++) { total += it->second.second.size(); } size_t nb_entries = in.size(); @@ -6843,7 +6885,9 @@ void Recombinator_Graph::create_losses_graph(GRegion *gr) // common) but DO NOT pass the compatibility tests) void Recombinator_Graph::create_direct_neighbors_incompatibility_graph() { - for(auto it_hex = hex_to_tet.begin(); it_hex != hex_to_tet.end(); it_hex++) { + for(std::map<Hex *, std::set<MElement *> >::iterator it_hex = + hex_to_tet.begin(); + it_hex != hex_to_tet.end(); it_hex++) { Hex *hex = it_hex->first; if(is_not_good_enough(hex)) { // Why is it even there in the first place? JP @@ -6851,7 +6895,7 @@ void Recombinator_Graph::create_direct_neighbors_incompatibility_graph() } // Find or create the hex data in the incompatibility graph - auto itfind_graph = find_hex_in_graph(hex); + graph::iterator itfind_graph = find_hex_in_graph(hex); if(itfind_graph == incompatibility_graph.end()) { incompatibility_graph.insert( make_pair(hex->get_hash(), make_pair(hex, graph_data()))); @@ -6864,12 +6908,13 @@ void Recombinator_Graph::create_direct_neighbors_incompatibility_graph() std::vector<Hex *> visited_hex; // Check compatibility with the that share an facet with hex const std::set<PETriangle *> &hex_faces = hex_to_faces[hex]; - for(auto it_faces = hex_faces.begin(); it_faces != hex_faces.end(); - it_faces++) { + for(std::set<PETriangle *>::const_iterator it_faces = hex_faces.begin(); + it_faces != hex_faces.end(); it_faces++) { PETriangle *face = *it_faces; const std::set<Hex *> &hex_sharing_triangle = faces_to_hex[face]; - for(auto it_neighbors = hex_sharing_triangle.begin(); + for(std::set<Hex *>::const_iterator it_neighbors = + hex_sharing_triangle.begin(); it_neighbors != hex_sharing_triangle.end(); it_neighbors++) { Hex *other_hex = *it_neighbors; if(other_hex == hex) continue; @@ -6888,11 +6933,12 @@ void Recombinator_Graph::create_direct_neighbors_incompatibility_graph() // change following... const std::set<PELine *> &hex_edges = hex_to_edges[hex]; - for(auto it_line = hex_edges.begin(); it_line != hex_edges.end(); - it_line++) { + for(std::set<PELine *>::const_iterator it_line = hex_edges.begin(); + it_line != hex_edges.end(); it_line++) { PELine *line = *it_line; const std::set<Hex *> &hex_sharing_edge = edges_to_hex[line]; - for(auto it_neighbors = hex_sharing_edge.begin(); + for(std::set<Hex *>::const_iterator it_neighbors = + hex_sharing_edge.begin(); it_neighbors != hex_sharing_edge.end(); it_neighbors++) { Hex *other_hex = *it_neighbors; if(other_hex == hex) continue; @@ -6961,7 +7007,8 @@ void Recombinator_Graph::add_face( v.push_back(b); v.push_back(c); PETriangle *q = new PETriangle(v); - auto itfind = find_the_triangle(q, f); + std::multimap<unsigned long long, pair<PETriangle *, int> >::iterator itfind = + find_the_triangle(q, f); if(itfind == f.end()) { f.insert(make_pair(q->get_hash(), make_pair(q, 1))); } else { delete q; @@ -6975,7 +7022,7 @@ void Recombinator_Graph::add_face(MVertex *a, MVertex *b, MVertex *c, Hex *hex) v.push_back(b); v.push_back(c); PETriangle *q = new PETriangle(v); - auto itfind = find_the_triangle(q, triangular_faces); + citer itfind = find_the_triangle(q, triangular_faces); if(itfind == triangular_faces.end()) { itfind = triangular_faces.insert(make_pair(q->get_hash(), q)); } @@ -7012,7 +7059,7 @@ void Recombinator_Graph::fill_edges_table( // see if already exists or not... PELine *l = new PELine(edge); - auto itfind = find_the_line(l, edges_and_diagonals); + linemap::const_iterator itfind = find_the_line(l, edges_and_diagonals); if(itfind == edges_and_diagonals.end()) { itfind = edges_and_diagonals.insert(make_pair(l->get_hash(), l)); } @@ -7034,7 +7081,7 @@ Recombinator_Graph::find_hex_in_graph(Hex *hex) incompatibility_graph.equal_range(hex->get_hash()); if(range.first == range.second) return incompatibility_graph.end(); - auto it = range.first; + graph::iterator it = range.first; for(; it != range.second; it++) { if(it->second.first == hex) { return it; } } @@ -7048,7 +7095,7 @@ Recombinator_Graph::find_hex_in_graphrow(Hex *hex, graph_data &row) row.equal_range(hex->get_hash()); if(range.first == range.second) return row.end(); - auto it = range.first; + graph_data::iterator it = range.first; for(; it != range.second; it++) { if(it->second == hex) { return it; } } @@ -7057,17 +7104,17 @@ Recombinator_Graph::find_hex_in_graphrow(Hex *hex, graph_data &row) bool Recombinator_Graph::find_hex_couple_in_graph(Hex *hex, Hex *other_hex) { - auto it = find_hex_in_graph(hex); + graph::iterator it = find_hex_in_graph(hex); if(it == incompatibility_graph.end()) return false; - auto itt = find_hex_in_graphrow(other_hex, it->second.second); + graph_data::iterator itt = find_hex_in_graphrow(other_hex, it->second.second); if(itt == it->second.second.end()) return false; return true; } void Recombinator_Graph::add_graph_entry(Hex *hex, Hex *other_hex) { - auto itfind_graph = find_hex_in_graph(hex); + graph::iterator itfind_graph = find_hex_in_graph(hex); if(itfind_graph == incompatibility_graph.end()) { itfind_graph = incompatibility_graph.insert( @@ -7086,11 +7133,13 @@ void Recombinator_Graph::compute_hex_ranks() { create_faces_connectivity(); - for(auto it = hex_to_faces.begin(); it != hex_to_faces.end(); it++) { + for(std::map<Hex *, set<PETriangle *> >::iterator it = hex_to_faces.begin(); + it != hex_to_faces.end(); it++) { Hex *hex = it->first; // Count the number of facets on boundary for the hex int boundary_count = 0.; - for(auto itf = it->second.begin(); itf != it->second.end(); itf++) { + for(set<PETriangle *>::iterator itf = it->second.begin(); + itf != it->second.end(); itf++) { PETriangle *face = *itf; if(faces_connectivity[face] == 1) boundary_count += 1.; } @@ -7105,7 +7154,9 @@ void Recombinator_Graph::compute_hex_ranks() // Complex way to get the number of tets around a triangular facet void Recombinator_Graph::create_faces_connectivity() { - for(auto it_tet = tet_to_hex.begin(); it_tet != tet_to_hex.end(); it_tet++) { + for(std::map<MElement *, std::set<Hex *> >::iterator it_tet = + tet_to_hex.begin(); + it_tet != tet_to_hex.end(); it_tet++) { add_face_connectivity(it_tet->first, 0, 1, 2); add_face_connectivity(it_tet->first, 0, 1, 3); add_face_connectivity(it_tet->first, 0, 2, 3); @@ -7123,7 +7174,7 @@ void Recombinator_Graph::add_face_connectivity(MElement *tet, int i, int j, v.push_back(tet->getVertex(j)); v.push_back(tet->getVertex(k)); t = new PETriangle(v); - auto itfind = find_the_triangle(t, triangular_faces); + citer itfind = find_the_triangle(t, triangular_faces); if(itfind != triangular_faces.end()) { faces_connectivity[itfind->second]++; } delete t; } @@ -7132,13 +7183,15 @@ void Recombinator_Graph::compute_hex_ranks_blossom() { create_faces_connectivity(); - for(auto it = hex_to_faces.begin(); it != hex_to_faces.end(); it++) { + for(map<Hex *, set<PETriangle *> >::iterator it = hex_to_faces.begin(); + it != hex_to_faces.end(); it++) { Hex *hex = it->first; double nb_faces_on_boundary = 0.; - for(auto face = it->second.begin(); face != it->second.end(); face++) { + for(set<PETriangle *>::iterator face = it->second.begin(); + face != it->second.end(); face++) { if(faces_connectivity[*face] == 1) nb_faces_on_boundary += 1.; } - auto itfind = hex_ranks.find(hex); + map<Hex *, vector<double> >::iterator itfind = hex_ranks.find(hex); if(itfind == hex_ranks.end()) hex_ranks.insert(make_pair(hex, vector<double>(3))); hex_ranks[hex][0] = nb_faces_on_boundary; @@ -7179,14 +7232,14 @@ PETriangle *Recombinator_Graph::get_triangle(MVertex *a, MVertex *b, MVertex *c) v.push_back(b); v.push_back(c); PETriangle *t = new PETriangle(v); - auto it_find_tri = find_the_triangle(t, triangular_faces); + citer it_find_tri = find_the_triangle(t, triangular_faces); delete t; return (it_find_tri->second); } bool Recombinator_Graph::is_blossom_pair(PETriangle *t1, PETriangle *t2) { - auto itfind = blossom_info.find(t1); + tripair::iterator itfind = blossom_info.find(t1); if(itfind != blossom_info.end()) { if(t2 == itfind->second) return true; } diff --git a/contrib/domhex/yamakawa.h b/contrib/domhex/yamakawa.h index 1ffb80da657bebba55fc1842fcdbfd69a20cf83b..71be39101d39ae6a66d260b26e1f007f31d4277c 100644 --- a/contrib/domhex/yamakawa.h +++ b/contrib/domhex/yamakawa.h @@ -1,4 +1,4 @@ -// Gmsh - Copyright (C) 1997-2021 C. Geuzaine, J.-F. Remacle +// Gmsh - Copyright (C) 1997-2020 C. Geuzaine, J.-F. Remacle // // See the LICENSE.txt file for license information. Please report all // issues on https://gitlab.onelab.info/gmsh/gmsh/issues. @@ -75,7 +75,7 @@ public: else { cout << "Hex: unknown vertex number " << i << endl; throw; - return nullptr; + return NULL; } } const std::vector<MVertex *> &vertices() const { return vertices_; } @@ -104,7 +104,7 @@ public: bool contains(MVertex *v) const { return vertex_index(v) != -1; } unsigned long long get_hash() { - if(hash == 0. && vertices_[0] != nullptr) { set_hash(); } + if(hash == 0. && vertices_[0] != NULL) { set_hash(); } return hash; } bool operator<(const Hex &hex) const @@ -121,7 +121,7 @@ private: unsigned long long hash; public: - Facet() : a(nullptr), b(nullptr), c(nullptr), hash(0.) + Facet() : a(NULL), b(NULL), c(NULL), hash(0.) { num[0] = -1; num[1] = -1; @@ -176,7 +176,7 @@ private: void compute_hash() { hash = a->getNum() + b->getNum(); } public: - Diagonal() : a(nullptr), b(nullptr), hash(){}; + Diagonal() : a(NULL), b(NULL), hash(){}; Diagonal(MVertex *a2, MVertex *b2) : a(a2), b(b2) { compute_hash(); } ~Diagonal(){}; MVertex *get_a() const { return a; } @@ -206,15 +206,15 @@ private: public: Tuple() - : vertex1(nullptr), vertex2(nullptr), vertex3(nullptr), element(nullptr), - gf(nullptr), hash(0) + : vertex1(NULL), vertex2(NULL), vertex3(NULL), element(NULL), gf(NULL), + hash(0) { } Tuple(MVertex *const a, MVertex *const b, MVertex *const c, MElement *const element2, GFace *const gf2) - : vertex1(nullptr), vertex2(nullptr), vertex3(nullptr), element(element2), - gf(gf2), hash(a->getNum() + b->getNum() + c->getNum()) + : vertex1(NULL), vertex2(NULL), vertex3(NULL), element(element2), gf(gf2), + hash(a->getNum() + b->getNum() + c->getNum()) { MVertex *tmp[3] = {a, b, c}; std::sort(tmp, tmp + 3); @@ -224,8 +224,8 @@ public: } Tuple(MVertex *const a, MVertex *const b, MVertex *const c) - : vertex1(nullptr), vertex2(nullptr), vertex3(nullptr), element(nullptr), - gf(nullptr), hash(a->getNum() + b->getNum() + c->getNum()) + : vertex1(NULL), vertex2(NULL), vertex3(NULL), element(NULL), gf(NULL), + hash(a->getNum() + b->getNum() + c->getNum()) { MVertex *tmp[3] = {a, b, c}; std::sort(tmp, tmp + 3); @@ -331,7 +331,8 @@ private: MVertex *b = tet->getVertex((j + 1) % 4); MVertex *c = tet->getVertex((j + 2) % 4); MVertex *d = tet->getVertex((j + 3) % 4); - auto it = vertex_to_vertices_.find(a); + std::map<MVertex *, std::set<MVertex *> >::iterator it = + vertex_to_vertices_.find(a); if(it != vertex_to_vertices_.end()) { it->second.insert(b); it->second.insert(c); @@ -356,7 +357,8 @@ private: MElement *tet = region->getMeshElement(i); for(unsigned int j = 0; j < 4; j++) { MVertex *getVertex = tet->getVertex(j); - auto it = vertex_to_elements_.find(getVertex); + std::map<MVertex *, std::set<MElement *> >::iterator it = + vertex_to_elements_.find(getVertex); if(it != vertex_to_elements_.end()) { it->second.insert(tet); } else { std::set<MElement *> bin; @@ -381,7 +383,7 @@ public: typedef std::map<MVertex *, std::set<MVertex *> > Vertex2Vertices; typedef std::map<MVertex *, std::set<MElement *> > Vertex2Elements; - Recombinator() : current_region(nullptr), hex_threshold_quality(0.6){}; + Recombinator() : current_region(NULL), hex_threshold_quality(0.6){}; virtual ~Recombinator(); virtual void execute(); diff --git a/contrib/mobile/Android/app/build.gradle b/contrib/mobile/Android/app/build.gradle index fc4758b2ed363291895ba843945903cadb93bc1b..7c3bf89d9527be6ddcf3f66e18d602ead2e75962 100644 --- a/contrib/mobile/Android/app/build.gradle +++ b/contrib/mobile/Android/app/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "org.geuz.onelab" - minSdkVersion 16 + minSdkVersion 23 targetSdkVersion 29 ndk.abiFilters "arm64-v8a" } diff --git a/contrib/mobile/Android/app/src/main/AndroidManifest.xml b/contrib/mobile/Android/app/src/main/AndroidManifest.xml index 078345354dbe1608fe7688592d802a88597f8195..8af3a4e70df0c214c517dc96ca98bc117d8703a9 100644 --- a/contrib/mobile/Android/app/src/main/AndroidManifest.xml +++ b/contrib/mobile/Android/app/src/main/AndroidManifest.xml @@ -1,10 +1,10 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.geuz.onelab" android:versionName="2.3.4" - android:versionCode="53" + android:versionCode="58" android:installLocation="auto" > - <uses-sdk android:minSdkVersion="16" + <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.VIBRATE"/> diff --git a/contrib/mobile/Android/app/src/main/java/org/geuz/onelab/AboutActivity.java b/contrib/mobile/Android/app/src/main/java/org/geuz/onelab/AboutActivity.java index 44913c3a5b3d0e7c2f2e3104d460cddd8ef466c0..029db83b54e8098f74fb6d425482941af6e34cdd 100644 --- a/contrib/mobile/Android/app/src/main/java/org/geuz/onelab/AboutActivity.java +++ b/contrib/mobile/Android/app/src/main/java/org/geuz/onelab/AboutActivity.java @@ -59,7 +59,7 @@ public class AboutActivity extends Activity { _webview.loadDataWithBaseURL( "", "<html><head><style type=\"text/css\">" + css + - " h3 { text-align: center; } </style></head><h3>Onelab/Mobile</h3> <h4>Running an existing model</h4> <p> The list of available models appears when you launch the app. Selecting a model will load it. You can then press <b>Run</b> to launch a simulation with the default set of parameters. When available, additional information about a model can be obtained by long-pressing on the model description and selecting <b>Visit model website</b>.</p> <h4>Modifying a model</h4> <p>To run a model with different parameters, press <b>Parameters</b> and modify any of the presets. Then press <b>Run</b> again: all the simulation steps will be performed with the new parameter values. To restore the preset parameters values, press <b>Reset</b>. </p> <p> Advanced users can also directly edit the model input files: long-press on the model description and select <b>Edit model files</b>. </p> <p> To free up space, temporary model files (meshes, solution files) can be removed by long-pressing on the model description and selecting <b>Clear results</b>. </p> <p> To completey remove a model, long-press on the model description and select <b>Remove</b>. </p> <h4>Sharing a model</h4> <p> To share a model by email, long-press on the model description and select <b>Email model files</b>. </p> <h4>Installing a new model</h4> <p> To install a new model: <ol> <li>Put all the model files (.pro, .geo) in a directory, which should also contain a file named <code>infos.xml</code> with the model information: <pre>\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<models>\n <model>\n <title>Model title</title>\n <summary>Model summary</summary>\n <file type=\"pro\">main_pro_file.pro</file>\n <preview type=\"png\">128x128_pixel_screenshot.png</preview>\n <url>http://model_website.com</url>\n </model>\n</models>\n</pre><li>Zip the directory. <li>Open the .zip file on your device, e.g. by copying it on an SD card, through Google Drive or by emailing it to yourself and opening the attachment; or by putting it on a web server and downloading the file on the device with Chrome. <li>Refresh the list of models: the new model will be extracted alongside Onelab/Mobile\'s built-in models.</ol> <p style=\"padding-top: 2em;\">Visit <a href=\"http://onelab.info/\">http://onelab.info/</a> for more information.</p> </body></html>", + " h3 { text-align: center; } </style></head><h3>Onelab/Mobile</h3> <h4>Running an existing model</h4> <p> The list of available models appears when you launch the app. Selecting a model will load it. You can then press <b>Run</b> to launch a simulation with the default set of parameters. When available, additional information about a model can be obtained by long-pressing on the model description and selecting <b>Visit model website</b>.</p> <h4>Modifying a model</h4> <p>To run a model with different parameters, press <b>Parameters</b> and modify any of the presets. Then press <b>Run</b> again: all the simulation steps will be performed with the new parameter values. To restore the preset parameters values, press <b>Reset</b>. </p> <p> Advanced users can also directly edit the model input files: long-press on the model description and select <b>Edit model files</b>. </p> <p> To free up space, temporary model files (meshes, solution files) can be removed by long-pressing on the model description and selecting <b>Clear results</b>. </p> <p> To completey remove a model, long-press on the model description and select <b>Remove</b>. </p> <h4>Sharing a model</h4> <p> To share a model by email, long-press on the model description and select <b>Email model files</b>. </p> <h4>Installing a new model</h4> <p> To install a new model: <ol> <li>Put all the model files (.pro, .geo) in a directory, which should also contain a file named <code>infos.xml</code> with the model information: <pre>\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<models>\n <model>\n <title>Model title</title>\n <summary>Model summary</summary>\n <file type=\"pro\">main_pro_file.pro</file>\n <preview type=\"png\">128x128_pixel_screenshot.png</preview>\n <url>http://model_website.com</url>\n </model>\n</models>\n</pre><li>Zip the directory. <li>Open the .zip file on your device, e.g. by copying it on an SD card, through Google Drive or by emailing it to yourself and opening the attachment; or by putting it on a web server and downloading the file on the device with Chrome. <li>Refresh the list of models: the new model will be extracted alongside Onelab/Mobile\'s built-in models.</ol> <p style=\"padding-top: 2em;\">Visit <a href=\"https://onelab.info/\">https://onelab.info/</a> for more information.</p> </body></html>", "text/html", "UTF-8", ""); } else { @@ -105,7 +105,7 @@ public class AboutActivity extends Activity { "<p>Copyright (C) 2014-2021 Christophe Geuzaine and Maxime Graulich, "; aboutOnelab += "University of Liège</p>"; aboutOnelab += - "<p>Visit <a href=\"http://onelab.info/\">http://onelab.info/</a> "; + "<p>Visit <a href=\"https://onelab.info/\">https://onelab.info/</a> "; aboutOnelab += "for more information</p>"; aboutOnelab += "<p> </p><p>This version of Onelab/Mobile contains:</p></center>"; diff --git a/contrib/mobile/Android/build.gradle b/contrib/mobile/Android/build.gradle index 97f835e50c66183f5ff1927148ed88fad7e98afa..fc82e6802c828bd7928343f5c4552fe11c2a01ab 100644 --- a/contrib/mobile/Android/build.gradle +++ b/contrib/mobile/Android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:4.0.0' } } diff --git a/contrib/mobile/drawContext.cpp b/contrib/mobile/drawContext.cpp index 4fb577ea993acb5de162b5b5acf441a35a8b976e..961bc7f28f027f14ca8578fada738e31a7f23749 100644 --- a/contrib/mobile/drawContext.cpp +++ b/contrib/mobile/drawContext.cpp @@ -47,8 +47,8 @@ drawContext::drawContext(float fontFactor, bool retina) static void checkGlError(const char *op) { - // for (GLint error = glGetError(); error; error = glGetError()) - // Msg::Error("%s: glError (0x%x)",op,error); + for (GLint error = glGetError(); error; error = glGetError()) + printf("*** %s: glError (0x%x)\n", op, error); } void drawContext::load(std::string filename) @@ -1175,7 +1175,11 @@ int onelab_cb(std::string action) if(action == "reset") { onelab::server::instance()->clear(); - onelabUtils::runGmshClient(action, true); + try { + onelabUtils::runGmshClient(action, true); + } catch(...) { + printf("*** runGmshClient() exception\n"); + } action = "check"; } @@ -1189,7 +1193,11 @@ int onelab_cb(std::string action) do { // run Gmsh (only if necessary) - onelabUtils::runGmshClient(action, true); + try { + onelabUtils::runGmshClient(action, true); + } catch(...) { + printf("*** runGmshClient() exception\n"); + } // run GetDP (always -- to not confuse the user) onelab::string o("GetDP/Action", action); @@ -1225,11 +1233,12 @@ int onelab_cb(std::string action) try { getdp(args, onelab::server::instance()); } catch(...) { - Msg::Error("Calculation was aborted"); + printf("*** getdp() exception\n"); } } while(action == "compute" && !onelabStop && (onelabUtils::incrementLoop("3") || onelabUtils::incrementLoop("2") || onelabUtils::incrementLoop("1"))); + onelabStop = false; locked = false; return onelab::server::instance()->getChanged(); diff --git a/contrib/mobile/iOS/Onelab/AboutViewController.mm b/contrib/mobile/iOS/Onelab/AboutViewController.mm index aea6fba0fc6b57232664bc32548e12659f2bdf90..c28f35b787034c778345dfe113790248129bf13a 100644 --- a/contrib/mobile/iOS/Onelab/AboutViewController.mm +++ b/contrib/mobile/iOS/Onelab/AboutViewController.mm @@ -78,15 +78,15 @@ @"h3>Version %@<p>Copyright (C) 2014-2021 Christophe " @"Geuzaine and Maxime Graulich, University of " @"Liège</p><p>Visit <a " - @"href=\"http://onelab.info/\">http://onelab.info/</a> for " + @"href=\"https://onelab.info/\">https://onelab.info/</a> for " @"more information</p><p style=\"padding-top: 35px;\">This " @"version of Onelab/Mobile " @"contains:</p><h3>Gmsh</h3>Version %s (<i>Build date:</i> " @"%s)<p>Copyright (C) 1997-2021 Christophe Geuzaine and " @"Jean-François Remacle</p><p><a " - @"href=\"http://geuz.org/gmsh/CREDITS.txt\">Credits</" + @"href=\"https://gmsh.info/CREDITS.txt\">Credits</" @"a> and <a " - @"href=\"http://geuz.org/gmsh/LICENSE.txt\">licensing " + @"href=\"https://gmsh.info/LICENSE.txt\">licensing " @"information</a></p><p><i>Build options:</i> " @"%s</p><p>Visit <a " @"href=\"https://gmsh.info/\">https://gmsh.info</a> for more " @@ -94,9 +94,9 @@ @"date:</i> %s)<p>Copyright (C) 1997-2021 Patrick Dular " @"and Christophe Geuzaine, University of " @"Liège</p><p><a " - @"href=\"http://geuz.org/getdp/CREDITS.txt\">Credits</" + @"href=\"https://getdp.info/CREDITS.txt\">Credits</" @"a> and <a " - @"href=\"http://geuz.org/getdp/LICENSE.txt\">licensing " + @"href=\"https://getdp.info/LICENSE.txt\">licensing " @"information</a></p><p><i>Build options:</i> " @"%s</p><p>Visit <a " @"href=\"https://getdp.info\">https://getdp.info</a> for " @@ -160,7 +160,7 @@ @"Safari. <li>Refresh the list of models: the new model " @"will be extracted alongside Onelab/Mobile\'s built-in " @"models.</ol> <p style=\"padding-top: 2em;\">Visit <a " - @"href=\"http://onelab.info/\">http://onelab.info/</a> for " + @"href=\"https://onelab.info/\">https://onelab.info/</a> for " @"more information.</p> </body></html>", css] baseURL:[[NSBundle mainBundle] bundleURL]]; diff --git a/contrib/mobile/iOS/Onelab/Onelab-Info.plist b/contrib/mobile/iOS/Onelab/Onelab-Info.plist index 4caada0751170c69ee6c81054f98660fee4c2217..39d0b292eaf5b5f0077a057718c4cbfdd842f59b 100644 --- a/contrib/mobile/iOS/Onelab/Onelab-Info.plist +++ b/contrib/mobile/iOS/Onelab/Onelab-Info.plist @@ -30,7 +30,7 @@ <key>CFBundleName</key><string>${PRODUCT_NAME}</string> <key>CFBundlePackageType</key><string>APPL</string> <key>CFBundleShortVersionString</key><string>2.3.4</string> - <key>CFBundleVersion</key><string>53</string> + <key>CFBundleVersion</key><string>56</string> <key>CFBundleSignature</key><string>????</string> <key>LSRequiresIPhoneOS</key><true/> <key>UIFileSharingEnabled</key><true/> diff --git a/contrib/mobile/iOS/Onelab/OptionsViewController.mm b/contrib/mobile/iOS/Onelab/OptionsViewController.mm index 0d73bd302f4c4255f16a48f8afe7d3c6af955d91..2e8b4628067a6c20b9a8880e5ab34475ee1a2933 100644 --- a/contrib/mobile/iOS/Onelab/OptionsViewController.mm +++ b/contrib/mobile/iOS/Onelab/OptionsViewController.mm @@ -138,7 +138,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; + UITableViewCell *cell = + [tableView dequeueReusableCellWithIdentifier:@"postproCell"]; if(cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"postproCell"]; @@ -148,88 +149,79 @@ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"postproCell"]; } + + [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [cell setFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.x, tableView.frame.size.width, cell.frame.size.height)]; switch(indexPath.section) { case 0: { - [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; - UISwitch *showHideOptions = + UISwitch *showHide = [[UISwitch alloc] initWithFrame:CGRectMake(15, 6.5, 100, 30)]; - UILabel *lblOptions = [[UILabel alloc] - initWithFrame:CGRectMake(25 + (showHideOptions.frame.size.width), 8, + UILabel *label = [[UILabel alloc] + initWithFrame:CGRectMake(25 + (showHide.frame.size.width), 8, (tableView.frame.size.width - - (showHideOptions.frame.size.width) - 50), + (showHide.frame.size.width) - 50), 30)]; // set font size at 90% of default size - lblOptions.font = [lblOptions.font fontWithSize:(0.9 * lblOptions.font.pointSize)]; + label.font = + [label.font fontWithSize:(0.9 * label.font.pointSize)]; if(indexPath.row == 0) { - [lblOptions setText:@"Show geometry points"]; - [showHideOptions setOn:(CTX::instance()->geom.points)]; - [showHideOptions addTarget:self + [label setText:@"Show geometry points"]; + [showHide setOn:(CTX::instance()->geom.points)]; + [showHide addTarget:self action:@selector(setShowGeomPoints:) forControlEvents:UIControlEventValueChanged]; } else if(indexPath.row == 1) { - [lblOptions setText:@"Show geometry curves"]; - [showHideOptions setOn:(CTX::instance()->geom.curves)]; - [showHideOptions addTarget:self + [label setText:@"Show geometry curves"]; + [showHide setOn:(CTX::instance()->geom.curves)]; + [showHide addTarget:self action:@selector(setShowGeomCurves:) forControlEvents:UIControlEventValueChanged]; } else if(indexPath.row == 2) { - [lblOptions setText:@"Show mesh surface edges"]; - [showHideOptions setOn:(CTX::instance()->mesh.surfaceEdges)]; - [showHideOptions addTarget:self + [label setText:@"Show mesh surface edges"]; + [showHide setOn:(CTX::instance()->mesh.surfaceEdges)]; + [showHide addTarget:self action:@selector(setShowMeshSurfaceEdges:) forControlEvents:UIControlEventValueChanged]; } else if(indexPath.row == 3) { - [lblOptions setText:@"Show mesh volume edges"]; - [showHideOptions setOn:CTX::instance()->mesh.volumeEdges]; - [showHideOptions addTarget:self + [label setText:@"Show mesh volume edges"]; + [showHide setOn:CTX::instance()->mesh.volumeEdges]; + [showHide addTarget:self action:@selector(setShowMeshVolumeEdges:) forControlEvents:UIControlEventValueChanged]; } - [cell addSubview:showHideOptions]; - [cell addSubview:lblOptions]; + [cell.contentView addSubview:showHide]; + [cell.contentView addSubview:label]; } break; case 1: { - NSArray *rows = [tableView indexPathsForVisibleRows]; - for(NSIndexPath *mIndexpath in rows) - if(![mIndexpath isEqual:indexPath]) { - UITableViewCell *tmp = [tableView cellForRowAtIndexPath:indexPath]; - for(UIView *tmpv in tmp.subviews) - for(UIView *v in tmpv.subviews) - if([v isKindOfClass:[UISwitch class]]) - [(UISwitch *)v setOn:PView::list[v.tag]->getOptions()->visible]; - } - - [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; int i = (int)(PView::list.size() - 1 - indexPath.row); cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; UISwitch *showHide = [[UISwitch alloc] initWithFrame:CGRectMake(15, 6.5, 100, 30)]; - UILabel *lbl = [[UILabel alloc] + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25 + (showHide.frame.size.width), 8, (tableView.frame.size.width - showHide.frame.size.width - 50), 30)]; // set font size at 90% of default size - lbl.font = [lbl.font fontWithSize:(0.9 * lbl.font.pointSize)]; + label.font = [label.font fontWithSize:(0.9 * label.font.pointSize)]; [showHide setOn:(PView::list[i]->getOptions()->visible == 1)]; [showHide setTag:i]; [showHide addTarget:self action:@selector(PViewVisible:) forControlEvents:UIControlEventValueChanged]; - [lbl setBackgroundColor:[UIColor clearColor]]; - [lbl setText:[Utils getStringFromCString:PView::list[i] + [label setBackgroundColor:[UIColor clearColor]]; + [label setText:[Utils getStringFromCString:PView::list[i] ->getData() ->getName() .c_str()]]; - [cell addSubview:showHide]; - [cell addSubview:lbl]; + [cell.contentView addSubview:showHide]; + [cell.contentView addSubview:label]; } break; } return cell; diff --git a/contrib/mobile/iOS/Onelab/ParametersViewController.mm b/contrib/mobile/iOS/Onelab/ParametersViewController.mm index 5b181d414c2397e16e254a042c0b5631e04a13e9..14ac83284526a64f9d883ecb85b7c00abf4f3c90 100644 --- a/contrib/mobile/iOS/Onelab/ParametersViewController.mm +++ b/contrib/mobile/iOS/Onelab/ParametersViewController.mm @@ -411,25 +411,25 @@ NSInteger compareParameter(id p1, id p2, void *context) cellForRowAtIndexPath:(NSIndexPath *)indexPath { // get the param with his name - static NSString *CellIdentifier = @"parameterCell"; if(indexPath.section >= _sections.count) return [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:CellIdentifier]; + reuseIdentifier:@"parameterCell"]; NSMutableArray *sectionContent = [_sections objectAtIndex:[indexPath section]]; if(indexPath.row >= sectionContent.count) return [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:CellIdentifier]; + reuseIdentifier:@"parameterCell"]; Parameter *tmp = [sectionContent objectAtIndex:[indexPath row]]; - - UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; - if(cell == nil) + UITableViewCell *cell = + [tableView dequeueReusableCellWithIdentifier:@"parameterCell"]; + if(cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:CellIdentifier]; + reuseIdentifier:@"parameterCell"]; + } else { cell = nil; cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:CellIdentifier]; + reuseIdentifier:@"parameterCell"]; } float lm = 20.; // left margin @@ -437,39 +437,48 @@ NSInteger compareParameter(id p1, id p2, void *context) float h2 = cell.frame.size.height / 2.; [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; - [tmp setLabelFrame:CGRectMake(lm, 5, ww, h2)]; - [cell addSubview:[tmp getLabel]]; if([tmp isKindOfClass:[ParameterStringList class]]) { ParameterStringList *param = (ParameterStringList *)tmp; - [param setFrame:CGRectMake(lm, h2 + 10, ww, h2)]; - [cell addSubview:[param getUIView]]; + [param setLabelFrame:CGRectMake(lm, 5, ww, h2)]; + [param setFrame:CGRectMake(lm, h2 + 15, ww, h2)]; + [cell.contentView addSubview:[param getLabel]]; + [cell.contentView addSubview:[param getUIView]]; } else if([tmp isKindOfClass:[ParameterNumberList class]]) { ParameterNumberList *param = (ParameterNumberList *)tmp; - [param setFrame:CGRectMake(lm, h2 + 10, ww, h2)]; - [cell addSubview:[param getUIView]]; + [param setLabelFrame:CGRectMake(lm, 5, ww, h2)]; + [param setFrame:CGRectMake(lm, h2 + 15, ww, h2)]; + [cell.contentView addSubview:[param getLabel]]; + [cell.contentView addSubview:[param getUIView]]; } else if([tmp isKindOfClass:[ParameterNumberCheckbox class]]) { ParameterNumberCheckbox *param = (ParameterNumberCheckbox *)tmp; [param setLabelFrame:CGRectMake(85, 12, tableView.frame.size.width - 100, h2)]; - [param setFrame:CGRectMake(lm, 6.5, ww, cell.frame.size.height)]; - [cell addSubview:[param getCheckbox]]; + [param setFrame:CGRectMake(lm, 6.5, ww, cell.frame.size.height - 6.5)]; + [cell.contentView addSubview:[param getLabel]]; + [cell.contentView addSubview:[param getCheckbox]]; } else if([tmp isKindOfClass:[ParameterNumberStepper class]]) { ParameterNumberStepper *param = (ParameterNumberStepper *)tmp; + [param setLabelFrame:CGRectMake(lm, 5, ww, h2)]; [param setFrame:CGRectMake(lm, h2 + 10, ww, h2)]; - [cell addSubview:[param getStepper]]; + [cell.contentView addSubview:[param getLabel]]; + [cell.contentView addSubview:[param getStepper]]; } else if([tmp isKindOfClass:[ParameterNumberRange class]]) { ParameterNumberRange *param = (ParameterNumberRange *)tmp; - [param setFrame:CGRectMake(lm, h2 + 10, ww, h2)]; - [cell addSubview:[param getSlider]]; + [param setLabelFrame:CGRectMake(lm, 5, ww, h2)]; + [param setFrame:CGRectMake(lm, h2 + 15, ww, h2)]; + [cell.contentView addSubview:[param getLabel]]; + [cell.contentView addSubview:[param getSlider]]; } else if([tmp isKindOfClass:[ParameterNumberTextbox class]]) { ParameterNumberTextbox *param = (ParameterNumberTextbox *)tmp; + [param setLabelFrame:CGRectMake(lm, 5, ww, h2)]; [param setFrame:CGRectMake(lm, h2 + 10, ww, h2)]; - [cell addSubview:[param getTextbox]]; + [cell.contentView addSubview:[param getLabel]]; + [cell.contentView addSubview:[param getTextbox]]; } return cell; diff --git a/contrib/mobile/utils/android_build.sh b/contrib/mobile/utils/android_build.sh index c6070a9685e1516ef86503fced749d30891289a9..2fdcae4f59f737a56ee68cbc5c1cde56f41c493b 100755 --- a/contrib/mobile/utils/android_build.sh +++ b/contrib/mobile/utils/android_build.sh @@ -4,7 +4,7 @@ appname=Onelab enable_occ=1 enable_simulator=0 version=2.3.4 -build=53 # must be incremented for each submitted build +build=58 # must be incremented for each submitted build while [[ $# -gt 0 ]]; do key="$1" diff --git a/contrib/mobile/utils/ios_build.sh b/contrib/mobile/utils/ios_build.sh index d119a5705cd8c7e954712a610c73795cf93da4d1..82fcdf7d7ef3e94988550e1b268bffcd74dbccbc 100755 --- a/contrib/mobile/utils/ios_build.sh +++ b/contrib/mobile/utils/ios_build.sh @@ -6,7 +6,7 @@ enable_simulator=0 #buildtype=Debug buildtype=Release version=2.3.4 -build=53 # must be incremented for each submitted build +build=56 # must be incremented for each submitted build while [[ $# -gt 0 ]]; do key="$1" @@ -46,7 +46,7 @@ iphoneos_version_min="-target arm64-apple-ios9.0" # iOS 13 SDK if [ $enable_simulator != 0 ]; then ios=iossimulator iphoneos=iphonesimulator - iphoneos_version_min= + iphoneos_version_min="-target x86_64-apple-ios9.0" # iOS 14 SDK fi gmsh_git="${HOME}/src/gmsh/" @@ -126,6 +126,8 @@ if [ $enable_simulator != 0 ]; then # change blas/lapack for simulator sed -e "s|lastKnownFileType = archive.ar; name = libf2cblas.a; path = ${appname}/frameworks/petsc.framework/libf2cblas.a;|lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework;|" -i "" $gmsh_git/contrib/mobile/build_iossimulator_${appname}/${appname}/${appname}.xcodeproj/project.pbxproj; sed -e "s|lastKnownFileType = archive.ar; name = libf2clapack.a; path = ${appname}/frameworks/petsc.framework/libf2clapack.a;|lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework;|" -i "" $gmsh_git/contrib/mobile/build_iossimulator_${appname}/${appname}/${appname}.xcodeproj/project.pbxproj; + # change VALID_ARCHS + sed -e "s|VALID_ARCHS = arm64|VALID_ARCHS = x86_64|" -i "" $gmsh_git/contrib/mobile/build_iossimulator_${appname}/${appname}/${appname}.xcodeproj/project.pbxproj; fi # TODO: diff --git a/contrib/onelab/python/onelab.py b/contrib/onelab/python/onelab.py index fdf5c7d45d12753b79a4da8f700b23f441e3f4a0..026c3b2d05486838ae446ab62170459036b1c7ae 100755 --- a/contrib/onelab/python/onelab.py +++ b/contrib/onelab/python/onelab.py @@ -126,6 +126,8 @@ class client : _GMSH_PARSE_STRING = 21 _GMSH_PARAMETER = 23 _GMSH_PARAMETER_QUERY = 24 + _GMSH_PARAMETER_QUERY_ALL = 25 + _GMSH_PARAMETER_QUERY_END = 26 _GMSH_CONNECT = 27 _GMSH_OLPARSE = 28 _GMSH_PARAMETER_NOT_FOUND = 29 @@ -194,6 +196,16 @@ class client : elif t == self._GMSH_PARAMETER_NOT_FOUND and warn_if_not_found : print ('Unknown parameter %s' %(param.name)) + def _getAllParameters(self, type, lst) : + if not self.socket : + return + self._send(self._GMSH_PARAMETER_QUERY_ALL, + _parameter(type, name='dummy').tochar()) + (t, msg) = self._receive() + while t == self._GMSH_PARAMETER_QUERY_ALL: + lst.append(_parameter(type, name='dummy').fromchar(msg)) + (t, msg) = self._receive() + def defineNumber(self, name, **param): if 'value' in param : param["values"] = [param["value"]] @@ -289,6 +301,16 @@ class client : self._getParameter(param, warn_if_not_found) return param.values + def getAllParameters(self): + lst = [] + self._getAllParameters('number', lst) + self._getAllParameters('string', lst) + dic = {} + for p in lst: + dic[p.name] = {a[0]: getattr(p, a[0]) + for a in _parameter._members[p.type]} + return dic + def getNumberChoices(self, name, warn_if_not_found=True): param = _parameter('number', name=name) self._getParameter(param, warn_if_not_found) diff --git a/demos/api/custom_gui.cpp b/demos/api/custom_gui.cpp index 9d4824ad5e2ffc25e0f7f4eb8efeacaf43e24c42..762dcfc70aed2b2d872f85c15e5469c4d1b8134c 100644 --- a/demos/api/custom_gui.cpp +++ b/demos/api/custom_gui.cpp @@ -1,5 +1,6 @@ #include <cmath> #include <thread> +#include <set> #include "gmsh.h" // This example shows how to implement a custom user interface running @@ -45,6 +46,49 @@ void compute(const std::string &arg) gmsh::fltk::awake("update"); } +bool checkForEvent(const std::string ¶meters) +{ + std::vector<std::string> action; + gmsh::onelab::getString("ONELAB/Action", action); + if(action.empty()) { + } + else if(action[0] == "should compute") { + gmsh::onelab::setString("ONELAB/Action", {""}); + gmsh::onelab::setString("ONELAB/Button", {"Stop!", "should stop"}); + // force interface update (to show the new button label) + gmsh::fltk::update(); + // start computationally intensive calculations in their own threads + std::vector<double> v; + gmsh::onelab::getNumber("My App/Number of threads", v); + int n = v.size() ? static_cast<int>(v[0]) : 1; + for(unsigned int i = 0; i < n; i++) { + std::thread t(compute, "My App/Thread " + std::to_string(i + 1)); + t.detach(); + } + } + else if(action[0] == "should stop") { + stop_computation = true; + } + else if(action[0] == "done computing") { + // should not detach threads, and join them all here + gmsh::onelab::setString("ONELAB/Action", {""}); + gmsh::onelab::setString("ONELAB/Button", {"Do it!", "should compute"}); + gmsh::fltk::update(); + stop_computation = false; + } + else if(action[0] == "reset") { + // user clicked on "Reset database" + gmsh::onelab::setString("ONELAB/Action", {""}); + gmsh::onelab::set(parameters); + gmsh::fltk::update(); + } + else if(action[0] == "check") { + // could perform action here after each change in ONELAB parameters, + // e.g. rebuild a CAD model, update other parameters, ... + } + return true; +} + int main(int argc, char **argv) { gmsh::initialize(); @@ -69,55 +113,12 @@ int main(int argc, char **argv) gmsh::onelab::set(parameters); // create the graphical user interface - gmsh::fltk::initialize(); - - while(1) { - // check if GUI has been closed - if(!gmsh::fltk::isAvailable()) break; - - // wait for an event - gmsh::fltk::wait(); - - // check if the user clicked on the custom ONELAB button by examining the - // value of the "ONELAB/Action" parameter - std::vector<std::string> action; - gmsh::onelab::getString("ONELAB/Action", action); - if(action.empty()) { continue; } - else if(action[0] == "should compute") { - gmsh::onelab::setString("ONELAB/Action", {""}); - gmsh::onelab::setString("ONELAB/Button", {"Stop!", "should stop"}); - // force interface update (to show the new button label) - gmsh::fltk::update(); - // start computationally intensive calculations in their own threads - std::vector<double> v; - gmsh::onelab::getNumber("My App/Number of threads", v); - int n = v.size() ? static_cast<int>(v[0]) : 1; - for(unsigned int i = 0; i < n; i++) { - std::thread t(compute, "My App/Thread " + std::to_string(i + 1)); - t.detach(); - } - } - else if(action[0] == "should stop") { - stop_computation = true; - } - else if(action[0] == "done computing") { - // should not detach threads, and join them all here - gmsh::onelab::setString("ONELAB/Action", {""}); - gmsh::onelab::setString("ONELAB/Button", {"Do it!", "should compute"}); - gmsh::fltk::update(); - stop_computation = false; - } - else if(action[0] == "reset") { - // user clicked on "Reset database" - gmsh::onelab::setString("ONELAB/Action", {""}); - gmsh::onelab::set(parameters); - gmsh::fltk::update(); - } - else if(action[0] == "check") { - // could perform action here after each change in ONELAB parameters, - // e.g. rebuild a CAD model, update other parameters, ... - continue; - } + std::set<std::string> args(argv, argv + argc); + if(!args.count("-nopopup")) { + gmsh::fltk::initialize(); + // wait for events until the GUI is closed + while(gmsh::fltk::isAvailable() && checkForEvent(parameters)) + gmsh::fltk::wait(); } gmsh::finalize(); diff --git a/demos/api/custom_gui.py b/demos/api/custom_gui.py index df5232e8bdda0a0d548b6138bc7a7a2e6b2c13da..def58f26b4cb9413f0745e70bce18eacf668b818 100644 --- a/demos/api/custom_gui.py +++ b/demos/api/custom_gui.py @@ -70,23 +70,13 @@ def compute(arg): return -# create the graphical user interface -if '-nopopup' not in sys.argv: - gmsh.fltk.initialize() - -while 1: - # check if GUI has been closed - if gmsh.fltk.isAvailable() == 0: - break - - # wait for an event - gmsh.fltk.wait() - - # check if the user clicked on the custom ONELAB button by examining the - # value of the "ONELAB/Action" parameter +def checkForEvent(): + # check if an action is requested action = gmsh.onelab.getString("ONELAB/Action") + global stop_computation if len(action) < 1: - continue + # no action requested + pass elif action[0] == "should compute": gmsh.onelab.setString("ONELAB/Action", [""]) gmsh.onelab.setString("ONELAB/Button", ["Stop!", "should stop"]) @@ -113,6 +103,15 @@ while 1: elif action[0] == "check": # could perform action here after each change in ONELAB parameters, # e.g. rebuild a CAD model, update other parameters, ... - continue + pass + return 1 + + +# create the graphical user interface +if "-nopopup" not in sys.argv: + gmsh.fltk.initialize() + # wait for events until the GUI is closed + while gmsh.fltk.isAvailable() and checkForEvent(): + gmsh.fltk.wait() gmsh.finalize() diff --git a/demos/api/onelab_data.py b/demos/api/onelab_data.py deleted file mode 100644 index 4279a7fc70f2c819682b1d6b1adf2842c238b994..0000000000000000000000000000000000000000 --- a/demos/api/onelab_data.py +++ /dev/null @@ -1,18 +0,0 @@ -import gmsh -import sys - -if len(sys.argv) < 2: - print("Usage: " + sys.argv[0] + " file [options]") - exit(0) - -gmsh.initialize() - -gmsh.open(sys.argv[1]) - -# attempts to run a client selected when opening the file (e.g. a .pro file) -gmsh.onelab.run() - -json = gmsh.onelab.get() -print(json) - -gmsh.finalize() diff --git a/demos/api/onelab_run.py b/demos/api/onelab_run.py new file mode 100644 index 0000000000000000000000000000000000000000..75c0e1838e21a6a6512715142184230a879be6f6 --- /dev/null +++ b/demos/api/onelab_run.py @@ -0,0 +1,37 @@ +import gmsh +import threading +import sys + +# This shows how ONELAB clients that communicate with the ONELAB server through +# sockets can be executed using the Gmsh API, by explicitely specying the +# command to run the client + +# One such example is the GetDP finite element solver (https://getdp.info). + +# Provided that the getdp executable is in your path, running this example in +# the getdp/demos directory will launch two getdp clients concurrently, that +# will both exchange data with the ONELAB server + +gmsh.initialize() + +# set a parameter in the onelab database +gmsh.onelab.setNumber('Parameters/Materials/hc', [920000. / 2.]) + +# run the getdp client (which will connect through a socket), by forcing the +# value of murCore +def compute(name, value): + cmd = 'getdp magnet.pro -solve Magnetostatics_phi -setnumber murCore {}' + gmsh.onelab.run(name, cmd.format(value)) + return + +# run the two calculations in parallel +t1 = threading.Thread(target=compute, args=('my first getdp', 20)) +t1.start() +t2 = threading.Thread(target=compute, args=('my second getdp', 1000)) +t2.start() + +# wait for the 2 calculations to stop +t1.join() +t2.join() + +gmsh.finalize() diff --git a/demos/api/onelab_data.c b/demos/api/onelab_run_auto.c similarity index 91% rename from demos/api/onelab_data.c rename to demos/api/onelab_run_auto.c index 068108327837e108e72920f58371c548a29fc428..cb9123da9c8bd5a05e076712a1bf9b0be24bf94a 100644 --- a/demos/api/onelab_data.c +++ b/demos/api/onelab_run_auto.c @@ -25,8 +25,6 @@ int main(int argc, char **argv) gmshOpen(argv[1], &ierr); chk(ierr); - /* attempts to run a client selected when opening the file (e.g. a .pro - file) */ gmshOnelabRun("", "", &ierr); chk(ierr); gmshOnelabGet(&json, "json", "", &ierr); chk(ierr); diff --git a/demos/api/onelab_data.cpp b/demos/api/onelab_run_auto.cpp similarity index 81% rename from demos/api/onelab_data.cpp rename to demos/api/onelab_run_auto.cpp index 0bb41a9cc3a193fe469612d7cd7eda453400b405..9dc3006424817cd35f92fe71a51f22953eb3d7d1 100644 --- a/demos/api/onelab_data.cpp +++ b/demos/api/onelab_run_auto.cpp @@ -12,7 +12,6 @@ int main(int argc, char **argv) gmsh::open(argv[1]); - // attempts to run a client selected when opening the file (e.g. a .pro file) gmsh::onelab::run(); std::string json; diff --git a/demos/api/onelab_run_auto.py b/demos/api/onelab_run_auto.py new file mode 100644 index 0000000000000000000000000000000000000000..e933ebba4f1b6138721ea8668ec8e0596acb2300 --- /dev/null +++ b/demos/api/onelab_run_auto.py @@ -0,0 +1,31 @@ +import gmsh +import sys + +# This shows how ONELAB clients that communicate with the ONELAB server through +# sockets can be executed using the Gmsh API, using client information stored in +# the "Solver.Name?", "Solver.Extension?" and ""Solver.Executable?" Gmsh options + +# By default Gmsh defines Solver.Name0 = "GetDP" and Solver.Extension0 = ".pro". +# Provided that Solver.Executable0 points to the GetDP executable, if you open a +# file with the ".pro" extension with gmsh.open(), then call gmsh.onelab.run(), +# the getdp solver will be run. + +# If Solver.Executable0 is not set, you can set it using +# +# gmsh.option.setString('Solver.Executable0', '/path/to/getdp') + +if len(sys.argv) < 2: + print("Usage: " + sys.argv[0] + " file [options]") + exit(0) + +gmsh.initialize() + +gmsh.open(sys.argv[1]) + +# attempts to run a client selected when opening the file (e.g. a .pro file) +gmsh.onelab.run() + +json = gmsh.onelab.get() +print(json) + +gmsh.finalize() diff --git a/demos/api/prepro.py b/demos/api/prepro.py index 291d2ea76317322d66b20d6d3653972c090f8f8e..1236171ba7913853819234cda305ef3d5ef6a2f4 100644 --- a/demos/api/prepro.py +++ b/demos/api/prepro.py @@ -19,15 +19,15 @@ if len(sys.argv) > 1: # - "ONELAB Context/Surface Template/" # - "ONELAB Context/Volume Template/" # -# Double- (or right-) clicking on an entity in the GUI will then pop-up a -# context window where instances of these variables for the given entity can be -# edited. For example, if the "ONELAB Context/Curve Template/0Boundary -# condition" exists, double-clicking on curve 123 in the model (or in the -# visibility browser) will create "ONELAB Context/Curve 123/0Boundary condition" -# (or "ONELAB Context/Physical Curve 1000/0Boundary condition" depending on the -# choice in the context window, if curve 123 belongs to the physical curve -# 1000). The context window is also shown automatically when a new physical -# group is created in the GUI. +# Double-clicking on an entity in the GUI will then pop-up a context window +# where instances of these variables for the given entity can be edited. For +# example, if the "ONELAB Context/Curve Template/0Boundary condition" exists, +# double-clicking on curve 123 in the model (or in the visibility browser) will +# create "ONELAB Context/Curve 123/0Boundary condition" (or "ONELAB +# Context/Physical Curve 1000/0Boundary condition" depending on the choice in +# the context window, if curve 123 belongs to the physical curve 1000). The +# context window is also shown automatically when a new physical group is +# created in the GUI. # # As usual, every time the ONELAB database is changed the "ONELAB/Action" # parameter is set to "check", which gives the Python code the opportunity to diff --git a/demos/api/terrain_bspline.py b/demos/api/terrain_bspline.py index 0d879fa308b7121392ed99c48e6048d2f58833cc..b28cc20d59a51d3e5a28c8c6915b664beb67c7d5 100644 --- a/demos/api/terrain_bspline.py +++ b/demos/api/terrain_bspline.py @@ -36,7 +36,7 @@ gmsh.onelab.set("""[ ]""") def setMeshConstraint(): - if gmsh.onelab.getNumber('Parameters/Full-hex mesh?') == 1: + if gmsh.onelab.getNumber('Parameters/Full-hex mesh?')[0] == 1: NN = 30 for c in gmsh.model.getEntities(1): gmsh.model.mesh.setTransfiniteCurve(c[1], NN) @@ -58,6 +58,8 @@ def checkForEvent(): setMeshConstraint() return 1 +setMeshConstraint() + if "-nopopup" not in sys.argv: gmsh.fltk.initialize() while gmsh.fltk.isAvailable() and checkForEvent(): diff --git a/doc/gmsh.1 b/doc/gmsh.1 index 6abd478c6cf5075be1b98ae762dfac6a61567ff5..39e7919dc4035dcb4e8d0a28550100dbf4810ab0 100644 --- a/doc/gmsh.1 +++ b/doc/gmsh.1 @@ -1,4 +1,4 @@ -.TH Gmsh 1 "05 November 2020" "4.7" "Gmsh Manual Pages" +.TH Gmsh 1 "03 March 2021" "4.8" "Gmsh Manual Pages" .UC 4 .\" ******************************************************************** .SH NAME diff --git a/doc/gmsh.html b/doc/gmsh.html index 74f18dff9075f966df944fcf0b886993e7d3da61..4eb896fc6fcc0f3e5962580d8b973e904d039cd1 100644 --- a/doc/gmsh.html +++ b/doc/gmsh.html @@ -98,21 +98,21 @@ Public License (GPL)</a>: <ul> <li> <div class="highlight"> - Current stable release (version 4.7.1, 16 November 2020): + Current stable release (version 4.8.0, 2 March 2021): <ul> <li>Download Gmsh for - <a href="bin/Windows/gmsh-4.7.1-Windows64.zip">Windows 64-bit</a>, - <a href="bin/Windows/gmsh-4.7.1-Windows32.zip">Windows 32-bit</a>, - <a href="bin/Linux/gmsh-4.7.1-Linux64.tgz">Linux 64-bit</a>, - <a href="bin/Linux/gmsh-4.7.1-Linux32.tgz">Linux 32-bit</a> or - <a href="bin/MacOSX/gmsh-4.7.1-MacOSX.dmg">MacOS</a> - <li>Download the <a href="src/gmsh-4.7.1-source.tgz">source code</a> + <a href="bin/Windows/gmsh-4.8.0-Windows64.zip">Windows 64-bit</a>, + <a href="bin/Windows/gmsh-4.8.0-Windows32.zip">Windows 32-bit</a>, + <a href="bin/Linux/gmsh-4.8.0-Linux64.tgz">Linux 64-bit</a>, + <a href="bin/Linux/gmsh-4.8.0-Linux32.tgz">Linux 32-bit</a> or + <a href="bin/MacOSX/gmsh-4.8.0-MacOSX.dmg">MacOS</a> + <li>Download the <a href="src/gmsh-4.8.0-source.tgz">source code</a> <li>Download the Software Development Kit (SDK) for - <a href="bin/Windows/gmsh-4.7.1-Windows64-sdk.zip">Windows 64-bit</a>, - <a href="bin/Windows/gmsh-4.7.1-Windows32-sdk.zip">Windows 32-bit</a>, - <a href="bin/Linux/gmsh-4.7.1-Linux64-sdk.tgz">Linux 64-bit</a>, - <a href="bin/Linux/gmsh-4.7.1-Linux32-sdk.tgz">Linux 32-bit</a> or - <a href="bin/MacOSX/gmsh-4.7.1-MacOSX-sdk.tgz">MacOS</a> + <a href="bin/Windows/gmsh-4.8.0-Windows64-sdk.zip">Windows 64-bit</a>, + <a href="bin/Windows/gmsh-4.8.0-Windows32-sdk.zip">Windows 32-bit</a>, + <a href="bin/Linux/gmsh-4.8.0-Linux64-sdk.tgz">Linux 64-bit</a>, + <a href="bin/Linux/gmsh-4.8.0-Linux32-sdk.tgz">Linux 32-bit</a> or + <a href="bin/MacOSX/gmsh-4.8.0-MacOSX-sdk.tgz">MacOS</a> <li>Download both Gmsh and the SDK with pip: '<code>pip install --upgrade <a href="https://pypi.org/project/gmsh/">gmsh</a></code>' </ul> diff --git a/doc/texinfo/cmake_options.texi b/doc/texinfo/cmake_options.texi index 7c43067a059ba4df6345cde5b91a991681f5f841..c8a0c492ca706795e5d92bb59db4eeef3f3d87c0 100644 --- a/doc/texinfo/cmake_options.texi +++ b/doc/texinfo/cmake_options.texi @@ -114,6 +114,8 @@ Enable Poppler for displaying PDF documents (experimental) (default: OFF) Enable private API (default: OFF) @item ENABLE_PRO Enable PRO extensions (default: ON) +@item ENABLE_QUADMESHINGTOOLS +Enable QuadMeshingTools extensions (default: ON) @item ENABLE_QUADTRI Enable QuadTri structured meshing extensions (default: ON) @item ENABLE_REVOROPT diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi index d32c502ca5765d9bd316b19a31ed01b6d3b293b6..5367aa71ca9a396ea8c2d381880a4118a4bc95db 100644 --- a/doc/texinfo/gmsh.texi +++ b/doc/texinfo/gmsh.texi @@ -2093,12 +2093,15 @@ be defined separately). Likewise, a curve loop defining a hole should not have any curves in common with another curve loop defining a hole in the same surface (in which case the two curve loops should be combined). -@item Surface ( @var{expression} ) = @{ @var{expression-list} @} < In Sphere @{ @var{expression} @} >; +@item Surface ( @var{expression} ) = @{ @var{expression-list} @} < In Sphere @{ @var{expression} @}, Using Point @{ @var{expression-list} @} >; Creates a surface filling. With the built-in kernel, the first curve -loop should be composed of either three or four curves. With the -built-in kernel, the optional @code{In Sphere} argument forces the -surface to be a spherical patch (the extra parameter gives the tag of -the center of the sphere). +loop should be composed of either three or four curves, the surface is +constructed using transfinite interpolation, and the optional @code{In +Sphere} argument forces the surface to be a spherical patch (the extra +parameter gives the tag of the center of the sphere). With the +OpenCASCADE kernel, a BSpline surface is constructucted by optimization +to match the bounding curves, as well as the (optional) points provided +after @code{Using Point}. @item BSpline Surface ( @var{expression} ) = @{ @var{expression-list} @}; Creates a BSpline surface filling. Only a single curve loop made of 2, 3 @@ -6086,6 +6089,7 @@ problems. For example, on Linux you can use @code{valgrind --leak-check=full gmsh file.geo -3}. @c macOS: (gdb) set env DYLD_INSERT_LIBRARIES /usr/lib/libgmalloc.dylib @c export LD_PRELOAD=libnjamd.so kill -USR1 +@c macOS: (lldb) env DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib @end itemize @c ------------------------------------------------------------------------- diff --git a/doc/texinfo/opt_general.texi b/doc/texinfo/opt_general.texi index ee08683be93572f07c55fa5b074b9c27030f783d..4a468fcce607ed0c9322761057e01f6bbe434041 100644 --- a/doc/texinfo/opt_general.texi +++ b/doc/texinfo/opt_general.texi @@ -38,12 +38,12 @@ Saved in: @code{General.OptionsFileName} @item General.BuildInfo Gmsh build information (read-only)@* -Default value: @code{"Version: 4.8.0-git-e3eb5cdb2; License: GNU General Public License; Build OS: MacOSX-sdk; Build date: 20210218; Build host: MacBook-Pro-Christophe.local; Build options: 64Bit ALGLIB ANN Bamg Blas[petsc] Blossom Cairo Cgns DIntegration Dlopen DomHex Eigen Fltk GMP Gmm Hxt Jpeg Kbipack Lapack[petsc] MathEx Med Mesh Metis Mmg Mpeg Netgen ONELAB ONELABMetamodel OpenCASCADE OpenCASCADE-CAF OpenGL OpenMP[Homebrew] OptHom P4est PETSc Parasolid ParasolidSTEP Parser Plugins Png Post QuadTri Solver TetGen/BR TouchBar Voro++ Zlib; FLTK version: 1.4.0; PETSc version: 3.14.4 (complex arithmtic); OCC version: 7.6.0; MED version: 4.1.0; Packaged by: geuzaine; Web site: https://gmsh.info; Issue tracker: https://gitlab.onelab.info/gmsh/gmsh/issues"}@* +Default value: @code{"Version: 4.8.0-git-392ddd331; License: GNU General Public License; Build OS: MacOSX-sdk; Build date: 20210301; Build host: MBP-Christophe; Build options: 64Bit ALGLIB ANN Bamg Blossom Cairo Cgns DIntegration Dlopen DomHex Eigen Fltk GMP Gmm Hxt Jpeg Kbipack MathEx Med Mesh Metis Mmg Mpeg Netgen ONELAB ONELABMetamodel OpenCASCADE OpenCASCADE-CAF OpenGL OpenMP OptHom Parasolid ParasolidSTEP Parser Plugins Png Post QuadTri Solver TetGen/BR TouchBar Voro++ Zlib; FLTK version: 1.4.0; OCC version: 7.6.0; MED version: 4.1.0; Packaged by: geuzaine; Web site: https://gmsh.info; Issue tracker: https://gitlab.onelab.info/gmsh/gmsh/issues"}@* Saved in: @code{-} @item General.BuildOptions Gmsh build options (read-only)@* -Default value: @code{"64Bit ALGLIB ANN Bamg Blas[petsc] Blossom Cairo Cgns DIntegration Dlopen DomHex Eigen Fltk GMP Gmm Hxt Jpeg Kbipack Lapack[petsc] MathEx Med Mesh Metis Mmg Mpeg Netgen ONELAB ONELABMetamodel OpenCASCADE OpenCASCADE-CAF OpenGL OpenMP[Homebrew] OptHom P4est PETSc Parasolid ParasolidSTEP Parser Plugins Png Post QuadTri Solver TetGen/BR TouchBar Voro++ Zlib"}@* +Default value: @code{"64Bit ALGLIB ANN Bamg Blossom Cairo Cgns DIntegration Dlopen DomHex Eigen Fltk GMP Gmm Hxt Jpeg Kbipack MathEx Med Mesh Metis Mmg Mpeg Netgen ONELAB ONELABMetamodel OpenCASCADE OpenCASCADE-CAF OpenGL OpenMP OptHom Parasolid ParasolidSTEP Parser Plugins Png Post QuadTri Solver TetGen/BR TouchBar Voro++ Zlib"}@* Saved in: @code{-} @item General.DefaultFileName @@ -168,7 +168,7 @@ Saved in: @code{General.SessionFileName} @item General.Version Gmsh version (read-only)@* -Default value: @code{"4.8.0-git-e3eb5cdb2"}@* +Default value: @code{"4.8.0-git-392ddd331"}@* Saved in: @code{-} @item General.WatchFilePattern diff --git a/doc/texinfo/opt_mesh.texi b/doc/texinfo/opt_mesh.texi index 91e08e5f0085669618855d2b03d0cdf0f3187c76..3efc3587f74a043dad22138bebffb4390a28dc73 100644 --- a/doc/texinfo/opt_mesh.texi +++ b/doc/texinfo/opt_mesh.texi @@ -236,6 +236,16 @@ Maximum angle between edges/faces within layers of BL triangles/tets for the det Default value: @code{0.523599}@* Saved in: @code{General.OptionsFileName} +@item Mesh.IgnoreParametrization +Skip parametrization section when reading meshes in the MSH4 format.@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.IgnorePeriodicity +Skip periodic node section and skip periodic boundary alignement step when reading meshes in the MSH2 format.@* +Default value: @code{1}@* +Saved in: @code{General.OptionsFileName} + @item Mesh.LabelSampling Label sampling rate (display one label every `LabelSampling' elements)@* Default value: @code{1}@* @@ -421,86 +431,6 @@ Import MED meshes in the current model, even if several MED mesh names exist@* Default value: @code{0}@* Saved in: @code{General.OptionsFileName} -@item Mesh.PartitionHexWeight -Weight of hexahedral element for METIS load balancing (-1: automatic)@* -Default value: @code{-1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionLineWeight -Weight of line element for METIS load balancing (-1: automatic)@* -Default value: @code{-1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionPrismWeight -Weight of prismatic element (wedge) for METIS load balancing (-1: automatic)@* -Default value: @code{-1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionPyramidWeight -Weight of pyramidal element for METIS load balancing (-1: automatic)@* -Default value: @code{-1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionQuadWeight -Weight of quadrangle for METIS load balancing (-1: automatic)@* -Default value: @code{-1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionTrihedronWeight -Weight of trihedron element for METIS load balancing (-1: automatic)@* -Default value: @code{0}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionTetWeight -Weight of tetrahedral element for METIS load balancing (-1: automatic)@* -Default value: @code{-1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionTriWeight -Weight of triangle element for METIS load balancing (-1: automatic)@* -Default value: @code{-1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionCreateTopology -Create boundary representation of partitions@* -Default value: @code{1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionCreatePhysicals -Create physical groups for partitions, based on existing physical groups@* -Default value: @code{1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionCreateGhostCells -Create ghost cells, i.e. create for each partition a ghost entity containing elements connected to neighboring partitions by at least one node.@* -Default value: @code{0}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionSplitMeshFiles -Write one file for each mesh partition@* -Default value: @code{0}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionTopologyFile -Write a .pro file with the partition topology@* -Default value: @code{0}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionOldStyleMsh2 -Write partitioned meshes in MSH2 format using old style (i.e. by not referencing new partitioned entities, except on partition boundaries), for backward compatibility@* -Default value: @code{1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.PartitionConvertMsh2 -When reading partitioned meshes in MSH2 format, create new partition entities@* -Default value: @code{1}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.ReparamMaxTriangles -Maximum number of triangles in a single parametrization patch@* -Default value: @code{250000}@* -Saved in: @code{General.OptionsFileName} - @item Mesh.NbHexahedra Number of hexahedra in the current mesh (read-only)@* Default value: @code{0}@* @@ -596,6 +526,86 @@ Optimize the mesh using Netgen to improve the quality of tetrahedral elements@* Default value: @code{0}@* Saved in: @code{General.OptionsFileName} +@item Mesh.PartitionHexWeight +Weight of hexahedral element for METIS load balancing (-1: automatic)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionLineWeight +Weight of line element for METIS load balancing (-1: automatic)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionPrismWeight +Weight of prismatic element (wedge) for METIS load balancing (-1: automatic)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionPyramidWeight +Weight of pyramidal element for METIS load balancing (-1: automatic)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionQuadWeight +Weight of quadrangle for METIS load balancing (-1: automatic)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionTrihedronWeight +Weight of trihedron element for METIS load balancing (-1: automatic)@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionTetWeight +Weight of tetrahedral element for METIS load balancing (-1: automatic)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionTriWeight +Weight of triangle element for METIS load balancing (-1: automatic)@* +Default value: @code{-1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionCreateTopology +Create boundary representation of partitions@* +Default value: @code{1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionCreatePhysicals +Create physical groups for partitions, based on existing physical groups@* +Default value: @code{1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionCreateGhostCells +Create ghost cells, i.e. create for each partition a ghost entity containing elements connected to neighboring partitions by at least one node.@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionSplitMeshFiles +Write one file for each mesh partition@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionTopologyFile +Write a .pro file with the partition topology@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionOldStyleMsh2 +Write partitioned meshes in MSH2 format using old style (i.e. by not referencing new partitioned entities, except on partition boundaries), for backward compatibility@* +Default value: @code{1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PartitionConvertMsh2 +When reading partitioned meshes in MSH2 format, create new partition entities@* +Default value: @code{1}@* +Saved in: @code{General.OptionsFileName} + +@item Mesh.PreserveNumberingMsh2 +Preserve element numbering in MSH2 format (will break meshes with multiple physical groups for a single elementary entity)@* +Default value: @code{0}@* +Saved in: @code{General.OptionsFileName} + @item Mesh.Prisms Display mesh prisms?@* Default value: @code{1}@* @@ -656,18 +666,8 @@ Seed of pseudo-random number generator@* Default value: @code{1}@* Saved in: @code{General.OptionsFileName} -@item Mesh.PreserveNumberingMsh2 -Preserve element numbering in MSH2 format (will break meshes with multiple physical groups for a single elementary entity)@* -Default value: @code{0}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.IgnoreParametrization -Skip parametrization section when reading meshes in the MSH4 format.@* -Default value: @code{0}@* -Saved in: @code{General.OptionsFileName} - -@item Mesh.IgnorePeriodicity -Skip periodic node section and skip periodic boundary alignement step when reading meshes in the MSH2 format.@* +@item Mesh.ReadGroupsOfElements +Read groups of elements in UNV meshes (this will discard the elementary entity tags inferred from the element section)@* Default value: @code{1}@* Saved in: @code{General.OptionsFileName} @@ -711,6 +711,11 @@ Renumber nodes and elements in a continuous sequence after mesh generation@* Default value: @code{1}@* Saved in: @code{General.OptionsFileName} +@item Mesh.ReparamMaxTriangles +Maximum number of triangles in a single parametrization patch@* +Default value: @code{250000}@* +Saved in: @code{General.OptionsFileName} + @item Mesh.SaveAll Save all elements, even if they don't belong to physical groups (for some mesh formats, this removes physical groups altogether)@* Default value: @code{0}@* @@ -732,7 +737,7 @@ Default value: @code{0}@* Saved in: @code{General.OptionsFileName} @item Mesh.SaveGroupsOfElements -Save groups of elements for each physical group (for INP mesh format)@* +Save groups of elements for each physical group (for UNV and INP mesh format)@* Default value: @code{1}@* Saved in: @code{General.OptionsFileName} diff --git a/doc/texinfo/version.texi b/doc/texinfo/version.texi index 8ee7f59b92047c8d7c2bdad711f9d20329438fb1..0f54b62333de475377a6e1f544ed3911ec371cc5 100644 --- a/doc/texinfo/version.texi +++ b/doc/texinfo/version.texi @@ -1,4 +1,4 @@ @c This file was generated by cmake: do not edit manually! -@set GMSH-VERSION 4.8.0 (development version) +@set GMSH-VERSION 4.8.1 (development version) @set GITLAB-PREFIX https://gitlab.onelab.info/gmsh/gmsh/blob/master diff --git a/tutorial/c++/t1.cpp b/tutorial/c++/t1.cpp index 43a9e2c2124df6ced2a8c21f2cbaa4c109df18c9..1d5f1d61c336456fd0be1ac699e47b4f1e73971b 100644 --- a/tutorial/c++/t1.cpp +++ b/tutorial/c++/t1.cpp @@ -145,8 +145,8 @@ int main(int argc, char **argv) // `.msh4' extension. // To visualize the model we can run the graphical user interface with - // `gmsh::fltk::run()'. Here we run it only if the "-nopopup" is not provided - // in the command line arguments: + // `gmsh::fltk::run()'. Here we run it only if "-nopopup" is not provided in + // the command line arguments: std::set<std::string> args(argv, argv + argc); if(!args.count("-nopopup")) gmsh::fltk::run(); diff --git a/tutorial/c++/t10.cpp b/tutorial/c++/t10.cpp index ad3d3a9dc6615733d3617aa74c6a4e4c926984e7..fe5701cd55a3bb709668ca69fb550d3da550de88 100644 --- a/tutorial/c++/t10.cpp +++ b/tutorial/c++/t10.cpp @@ -95,13 +95,13 @@ int main(int argc, char **argv) gmsh::model::mesh::field::setNumber(6, "XMax", 0.6); gmsh::model::mesh::field::setNumber(6, "YMin", 0.3); gmsh::model::mesh::field::setNumber(6, "YMax", 0.6); + gmsh::model::mesh::field::setNumber(6, "Thickness", 0.3); // Many other types of fields are available: see the reference manual for a // complete list. You can also create fields directly in the graphical user // interface by selecting `Define->Size fields' in the `Mesh' module. - // Finally, let's use the minimum of all the fields as the background mesh - // field: + // Let's use the minimum of all the fields as the background mesh field: gmsh::model::mesh::field::add("Min", 7); gmsh::model::mesh::field::setNumbers(7, "FieldsList", {2, 3, 5, 6}); @@ -141,6 +141,14 @@ int main(int argc, char **argv) // This will prevent over-refinement due to small mesh sizes on the boundary. + // Finally, while the default "Frontal-Delaunay" 2D meshing algorithm + // (Mesh.Algorithm = 6) usually leads to the highest quality meshes, the + // "Delaunay" algorithm (Mesh.Algorithm = 5) will handle complex mesh size + // fields better - in particular size fields with large element size + // gradients: + + gmsh::option::setNumber("Mesh.Algorithm", 5); + gmsh::model::mesh::generate(2); gmsh::write("t10.msh"); diff --git a/tutorial/python/t1.py b/tutorial/python/t1.py index 50e42ef85a03dd528acbbc4412ec17f186adda81..3ea52a0a9a5c5f4bf7d905299bb37812964af7d0 100644 --- a/tutorial/python/t1.py +++ b/tutorial/python/t1.py @@ -144,8 +144,8 @@ gmsh.write("t1.msh") # extension. # To visualize the model we can run the graphical user interface with -# `gmsh.fltk.run()'. Here we run it only if the "-nopopup" is not provided in -# the command line arguments: +# `gmsh.fltk.run()'. Here we run it only if "-nopopup" is not provided in the +# command line arguments: if '-nopopup' not in sys.argv: gmsh.fltk.run() diff --git a/tutorial/python/t10.py b/tutorial/python/t10.py index d0702c8c6687116a4e319af496a4f2d14f5cf5be..de5808d79c81ebe1bd817058e1846c901d8dc0bf 100644 --- a/tutorial/python/t10.py +++ b/tutorial/python/t10.py @@ -89,12 +89,13 @@ gmsh.model.mesh.field.setNumber(6, "XMin", 0.3) gmsh.model.mesh.field.setNumber(6, "XMax", 0.6) gmsh.model.mesh.field.setNumber(6, "YMin", 0.3) gmsh.model.mesh.field.setNumber(6, "YMax", 0.6) +gmsh.model.mesh.field.setNumber(6, "Thickness", 0.3) # Many other types of fields are available: see the reference manual for a # complete list. You can also create fields directly in the graphical user # interface by selecting `Define->Size fields' in the `Mesh' module. -# Finally, let's use the minimum of all the fields as the background mesh field: +# Let's use the minimum of all the fields as the background mesh field: gmsh.model.mesh.field.add("Min", 7) gmsh.model.mesh.field.setNumbers(7, "FieldsList", [2, 3, 5, 6]) @@ -132,6 +133,13 @@ gmsh.option.setNumber("Mesh.MeshSizeFromCurvature", 0) # This will prevent over-refinement due to small mesh sizes on the boundary. +# Finally, while the default "Frontal-Delaunay" 2D meshing algorithm +# (Mesh.Algorithm = 6) usually leads to the highest quality meshes, the +# "Delaunay" algorithm (Mesh.Algorithm = 5) will handle complex mesh size fields +# better - in particular size fields with large element size gradients: + +gmsh.option.setNumber("Mesh.Algorithm", 5) + gmsh.model.mesh.generate(2) gmsh.write("t10.msh") diff --git a/tutorial/t10.geo b/tutorial/t10.geo index 4b14edafe56e8a05b16205bdaa3c9399078020cd..685245a75840d85fec97c5a708fd7626ac4b59e1 100644 --- a/tutorial/t10.geo +++ b/tutorial/t10.geo @@ -74,13 +74,13 @@ Field[6].XMin = 0.3; Field[6].XMax = 0.6; Field[6].YMin = 0.3; Field[6].YMax = 0.6; +Field[6].Thickness = 0.3; // Many other types of fields are available: see the reference manual for a // complete list. You can also create fields directly in the graphical user // interface by selecting `Define->Size fields' in the `Mesh' module. -// Finally, let's use the minimum of all the fields as the background mesh size -// field +// Let's use the minimum of all the fields as the background mesh size field Field[7] = Min; Field[7].FieldsList = {2, 3, 5, 6}; Background Field = 7; @@ -109,3 +109,10 @@ Mesh.MeshSizeFromPoints = 0; Mesh.MeshSizeFromCurvature = 0; // This will prevent over-refinement due to small mesh sizes on the boundary. + +// Finally, while the default "Frontal-Delaunay" 2D meshing algorithm +// (Mesh.Algorithm = 6) usually leads to the highest quality meshes, the +// "Delaunay" algorithm (Mesh.Algorithm = 5) will handle complex mesh size +// fields better - in particular size fields with large element size gradients: + +Mesh.Algorithm = 5; diff --git a/utils/docker/Dockerfile.ubuntu20.04 b/utils/docker/Dockerfile.ubuntu20.04 index 6d2ed143c8526a8a4386b98bb849c686f16d99ad..bf14c3c066c1c93f76bc0d8f72e7ca386694adb7 100644 --- a/utils/docker/Dockerfile.ubuntu20.04 +++ b/utils/docker/Dockerfile.ubuntu20.04 @@ -2,19 +2,21 @@ FROM ubuntu:20.04 ENV DEBIAN_FRONTEND noninteractive -RUN apt-get update && apt-get install -y apt-utils git curl cmake g++ gfortran python3 python3-numpy python3-scipy python3-pip swig clang-tidy emacs-nox valgrind texlive texlive-latex-recommended texinfo libreoffice fonts-cmu petsc-dev slepc-dev python3-dev libopenblas-dev libfltk1.3-dev libfreetype6-dev libgl1-mesa-dev libxi-dev libxmu-dev mesa-common-dev tcl-dev tk-dev libhdf5-dev libcgns-dev libxft-dev libxinerama-dev libxcursor-dev libxfixes-dev libocct-foundation-dev libocct-data-exchange-dev libocct-ocaf-dev libopenmpi-dev libboost-dev && apt-get clean +RUN apt-get update && apt-get install -y apt-utils git curl cmake g++ gfortran python3 python3-numpy python3-scipy python3-pip swig clang-tidy emacs-nox valgrind texlive texlive-latex-recommended texinfo libreoffice fonts-cmu petsc-dev slepc-dev python3-dev libopenblas-dev libfltk1.3-dev libfreetype6-dev libgl1-mesa-dev libxi-dev libxmu-dev mesa-common-dev tcl-dev tk-dev libhdf5-dev libcgns-dev libxft-dev libxinerama-dev libxcursor-dev libxfixes-dev libocct-foundation-dev libocct-data-exchange-dev libocct-ocaf-dev libopenmpi-dev libboost-dev cargo clang gcovr && apt-get clean RUN pip3 install twine # to convert a .fodt document, simply run # soffice --headless --convert-to pdf Tutorials.fodt -RUN apt-get update && apt-get install -y cargo && apt-get clean RUN cargo install --root /opt/cargo mdbook --version "^0.3.7" # mmg RUN git clone https://github.com/MmgTools/mmg.git && cd mmg && mkdir build && cd build && cmake -DBUILD_SHARED_LIBS=1 .. && make -j8 && make install && cd .. && rm -rf mmg +# libomp with ThreadSanitizer support (see https://gitlab.onelab.info/gmsh/gmsh/-/issues/1250) +RUN git clone https://github.com/llvm/llvm-project && cd llvm-project && mkdir build && cd build && cmake -DLIBOMP_TSAN_SUPPORT=1 ../openmp && cmake --build . --target install + # "docker build --build-arg REBUILD_GMSH=somethingnew" ARG REBUILD_GMSH=